From 498cd2e871672ec7af3f104f921e1f2027196ddf Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Tue, 11 Nov 2025 17:24:07 +0800 Subject: [PATCH 01/31] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multi_obj_track/collect_lidar_dataset.py | 200 ++++++++++++------ 1 file changed, 140 insertions(+), 60 deletions(-) diff --git a/waypoint_control/multi_obj_track/collect_lidar_dataset.py b/waypoint_control/multi_obj_track/collect_lidar_dataset.py index a1c10a3..cbb2a6d 100644 --- a/waypoint_control/multi_obj_track/collect_lidar_dataset.py +++ b/waypoint_control/multi_obj_track/collect_lidar_dataset.py @@ -43,7 +43,7 @@ def create_label_folder(): def recognize_vehicle_class(vehicle): blueprint = vehicle.type_id.lower() # 获取车辆的蓝图名称并转换为小写 # 定义需要识别为卡车的特定蓝图ID - truck_blueprints = [ + Truck_blueprints = [ 'vehicle.carlamotors.carlacola', 'vehicle.carlamotors.european_hgv', 'vehicle.tesla.cybertruck', @@ -51,10 +51,10 @@ def recognize_vehicle_class(vehicle): 'vehicle.mitsubishi.fusorosa' ] # 检查蓝图名称是否在卡车列表中 - if blueprint in truck_blueprints: - return 'truck' + if blueprint in Truck_blueprints: + return 'Truck' else: - return "car" + return "Car" def filter_vehicle_blueprinter(vehicle_blueprints): @@ -96,9 +96,9 @@ def dist(actor): # 按方向过滤车辆 # vehicle_list = filter_vehicle_by_direction(vehicle_list, lidar_yaw, location, angle_tolerance=15, distance_threshold=30) - car_labels = [] # car 标签列表 - truck_labels = [] # truck 标签列表 - pedestrian_labels = [] # 行人标签列表 + car_labels = [] # Car 标签列表 + truck_labels = [] # Truck 标签列表 + pedestrian_labels = [] # Pedestrian 标签列表 # 获取标签NX9 for vehicle in vehicle_list: @@ -128,6 +128,9 @@ def dist(actor): yaw_lidar, pitch_lidar, roll_lidar = euler_angles_lidar # 构造标签数据(Nx9 格式) + # 判断车辆的类别(Car, Truck) + category = recognize_vehicle_class(vehicle) + label = [ bounding_box_location_lidar[0], # x bounding_box_location_lidar[1], # y @@ -135,16 +138,17 @@ def dist(actor): length, width, height, - pitch_lidar, # pitch - roll_lidar, # roll - yaw_lidar # yaw + # pitch_lidar, # pitch + # roll_lidar, # roll + yaw_lidar, # yaw + category ] - # 判断车辆的类别(car, truck) - category = recognize_vehicle_class(vehicle) + # # 判断车辆的类别(Car, Truck) + # category = recognize_vehicle_class(vehicle) # 根据类别保存标签 - if category == "car": + if category == "Car": car_labels.append(label) - elif category == "truck": + elif category == "Truck": truck_labels.append(label) @@ -185,30 +189,81 @@ def dist(actor): length, width, height, - pitch_lidar, # pitch - roll_lidar, # roll - yaw_lidar # yaw + # pitch_lidar, # pitch + # roll_lidar, # roll + yaw_lidar, # yaw + 'Pedestrian' ] pedestrian_labels.append(label) # 行人标签直接保存,无需分类 - - # 将 car , truck 和 pedestrian 数据转换为 NumPy 数组 - car_labels = np.array(car_labels, dtype=object) - truck_labels = np.array(truck_labels, dtype=object) - pedestrian_labels = np.array(pedestrian_labels, dtype=object) - # 构造 MATLAB 格式的表格 - label_data = { - "Time": time_stamp, - "car": car_labels, # car 标签 - "truck": truck_labels, # truck 标签 - "pedestrian": pedestrian_labels # pedestrian 标签 - } - # label_folder = create_label_folder() - # file_name = os.path.join(label_folder, f"{current_frame}.mat") - # # 保存为 .mat 文件 - # scipy.io.savemat(file_name, {"LabelData": label_data}) - return label_data + # # 将 Car , Truck 和 Pedestrian 数据转换为 NumPy 数组 + # car_labels = np.array(car_labels, dtype=object) + # truck_labels = np.array(truck_labels, dtype=object) + # pedestrian_labels = np.array(pedestrian_labels, dtype=object) + # # 构造 MATLAB 格式的表格 + # label_data = { + # "Time": time_stamp, + # "Car": car_labels, # Car 标签 + # "Truck": truck_labels, # Truck 标签 + # "Pedestrian": pedestrian_labels # Pedestrian 标签 + # } + + # 将所有类别的标签合并到一个列表中 + all_labels = [] + + # 处理Car标签 + if len(car_labels) > 0: + for label in car_labels: + if len(label) >= 7: + # 格式化数值为两位小数 + formatted_label = [] + for i, value in enumerate(label): + if i < 7: # 前7个是数值 + formatted_label.append(f"{float(value):.2f}") # 格式化为两位小数 + else: # 第8个及以后是类别名称 + formatted_label.append(str(value)) + + # 如果只有7个字段,添加类别名 + if len(formatted_label) == 7: + formatted_label.append("Vehicle") + + all_labels.append(formatted_label) + + # 处理Truck标签 + if len(truck_labels) > 0: + for label in truck_labels: + if len(label) >= 7: + formatted_label = [] + for i, value in enumerate(label): + if i < 7: + formatted_label.append(f"{float(value):.2f}") + else: + formatted_label.append(str(value)) + + if len(formatted_label) == 7: + formatted_label.append("Truck") + + all_labels.append(formatted_label) + + # 处理Pedestrian标签 + if len(pedestrian_labels) > 0: + for label in pedestrian_labels: + if len(label) >= 7: + formatted_label = [] + for i, value in enumerate(label): + if i < 7: + formatted_label.append(f"{float(value):.2f}") + else: + formatted_label.append(str(value)) + + if len(formatted_label) == 7: + formatted_label.append("Pedestrian") + + all_labels.append(formatted_label) + + return all_labels + # return label_data # 定义回调函数来保存雷达点云数据 @@ -218,7 +273,8 @@ def save_radar_data(radar_data, world, location, lidar_to_world_inv, lidar_yaw, # 获取当前帧编号 current_frame = radar_data.frame # 保存车辆和行人标签 - label_data = save_point_label(world, location, lidar_to_world_inv, timestamp, current_frame, lidar_yaw) + # label_data = save_point_label(world, location, lidar_to_world_inv, timestamp, current_frame, lidar_yaw) + all_labels = save_point_label(world, location, lidar_to_world_inv, timestamp, current_frame, lidar_yaw) # 保存点云数据 # 获取雷达数据并将其转化为numpy数组 @@ -263,7 +319,7 @@ def save_radar_data(radar_data, world, location, lidar_to_world_inv, lidar_yaw, # 将点云数据保存为 .mat 文件 # 使用 scipy.io.savemat 保存数据,MATLAB 可以读取的格式 # scipy.io.savemat(file_name, {'datalog': datalog}) - sensor_queue.put((datalog, label_data)) + sensor_queue.put((datalog, all_labels)) def setup_sensors(world, addtion_param, transform, lidar_to_world_inv, data_struct_list): @@ -289,7 +345,7 @@ def setup_sensors(world, addtion_param, transform, lidar_to_world_inv, data_stru # 生成自动驾驶车辆 -def spawn_autonomous_vehicles(world, tm, num_vehicles=30, random_seed=42): +def spawn_autonomous_vehicles(world, tm, num_vehicles=50, random_seed=42): # 设置随机种子 random.seed(random_seed) np.random.seed(random_seed) @@ -322,7 +378,7 @@ def spawn_autonomous_vehicles(world, tm, num_vehicles=30, random_seed=42): # 生成随机运动行人 -def spawn_autonomous_pedestrians(world, num_pedestrians=200, random_seed=42): +def spawn_autonomous_pedestrians(world, num_pedestrians=150, random_seed=42): random.seed(random_seed) np.random.seed(random_seed) pedestrian_list = [] @@ -361,16 +417,6 @@ def spawn_autonomous_pedestrians(world, num_pedestrians=200, random_seed=42): pedestrian.destroy() continue - # # 绑定控制器 - # controller_bp = world.get_blueprint_library().find('controller.ai.walker') - # controller = world.spawn_actor(controller_bp, carla.Transform(), pedestrian) - # if controller: - # controller.start() - # controller.go_to_location(world.get_random_location_from_navigation()) - # pedestrian_list.append((pedestrian, controller)) - # else: - # pedestrian.destroy() - controller_bp = world.get_blueprint_library().find('controller.ai.walker') controller = world.spawn_actor(controller_bp, carla.Transform(), pedestrian) controller.start() # 启用自动行走 @@ -416,9 +462,9 @@ def main(): # 静止 ego_vehicle 的位置 ego_transform = carla.Transform(carla.Location(x=-46, y=21, z=1), carla.Rotation(pitch=0, yaw=90, roll=0)) # 先生成自动驾驶车辆 - vehicles = spawn_autonomous_vehicles(world, tm, num_vehicles=30, random_seed=random_seed) + vehicles = spawn_autonomous_vehicles(world, tm, num_vehicles=50, random_seed=random_seed) # 生成行人 - pedestrians = spawn_autonomous_pedestrians(world, num_pedestrians=200, random_seed=20) + pedestrians = spawn_autonomous_pedestrians(world, num_pedestrians=150, random_seed=20) #启动行人碰撞 for pedestrian in pedestrians: if "walker.pedestrian." in pedestrian.type_id: @@ -432,23 +478,57 @@ def main(): sensor_queue = Queue() # 启动雷达传感器 lidar = setup_sensors(world, addtion_param, lidar_transform, lidar_to_world_inv, sensor_queue) - folder_index = 1 + folder_index = 0 # 同步保存雷达数据 for _ in range(POINT_SAVE_TIME): world.tick() datalog, label = sensor_queue.get(True, 1.0) - # 开始保存 - # 创建存储数据的文件夹(每个雷达一个文件夹) - radar_folder = create_radar_folder() - file_name = os.path.join(radar_folder, f"{folder_index}.mat") - # 使用 scipy.io.savemat 保存数据,MATLAB 可以读取的格式 - scipy.io.savemat(file_name, {'datalog': datalog}) + # # 开始保存 + # # 创建存储数据的文件夹(每个雷达一个文件夹) + # radar_folder = create_radar_folder() + # file_name = os.path.join(radar_folder, f"{folder_index}.mat") + # # 使用 scipy.io.savemat 保存数据,MATLAB 可以读取的格式 + # scipy.io.savemat(file_name, {'datalog': datalog}) + # + # label_folder = create_label_folder() + # file_name = os.path.join(label_folder, f"{folder_index}.mat") + # # 保存为 .mat 文件 + # scipy.io.savemat(file_name, {"LabelData": label}) + # + # time.sleep(0.05) + # folder_index += 1 + + # 生成6位数字的文件名 + file_num = f"{folder_index:06d}" + # 1. 直接保存 datalog 为 .npy + radar_folder = create_radar_folder() + np.save(os.path.join(radar_folder, f"{file_num}.npy"), datalog) + # 2. 保存 label 为 .txt label_folder = create_label_folder() - file_name = os.path.join(label_folder, f"{folder_index}.mat") - # 保存为 .mat 文件 - scipy.io.savemat(file_name, {"LabelData": label}) + with open(os.path.join(label_folder, f"{file_num}.txt"), 'w') as f: + f.write("# format: [x y z dx dy dz heading_angle category_name\n") + + # 处理不同的数据结构 + if isinstance(label, list): + # 检查是否是嵌套列表(多个标签) + if label and isinstance(label[0], list): + # 多个标签:每行一个标签 + for label_item in label: + line = " ".join(str(item) for item in label_item) + f.write(line + "\n") + else: + # 单个标签:一行 + line = " ".join(str(item) for item in label) + f.write(line + "\n") + else: + # 其他类型(字符串、数字等) + f.write(str(label)) + + # 3. 每次保存 file_num 到 num.txt,并换行 + with open("num.txt", 'a') as f: # 'a' 表示追加模式 + f.write(str(file_num) + "\n") # 添加换行符 time.sleep(0.05) folder_index += 1 From 8e2c769fad93e3ec842c96d1004671a02eb2f54f Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Tue, 18 Nov 2025 17:59:10 +0800 Subject: [PATCH 02/31] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=A8=A1=E5=9E=8B=E8=AE=AD=E7=BB=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multi_obj_track/VoxelRCNNTrain.m | 203 ++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 waypoint_control/multi_obj_track/VoxelRCNNTrain.m diff --git a/waypoint_control/multi_obj_track/VoxelRCNNTrain.m b/waypoint_control/multi_obj_track/VoxelRCNNTrain.m new file mode 100644 index 0000000..9b98a7f --- /dev/null +++ b/waypoint_control/multi_obj_track/VoxelRCNNTrain.m @@ -0,0 +1,203 @@ +%% Step 1: +% Զ· +% · +dataPath = fileparts(mfilename('fullpath')); +lidarDataPath = fullfile(dataPath, 'Lidar'); % ״ļ +labelDataPath = fullfile(dataPath, 'Cuboids'); % ǩļ· + +% ص(һļݴ洢ڴĿ¼ļ) +lds = fileDatastore(lidarDataPath,"ReadFcn",@(x) pcread(x)); + +% ر߽ǩ +gtPath = fullfile(labelDataPath,'CarlaSetLidarGroundTruth.mat'); +bboxLabels = load(gtPath,'LabelData'); +bboxTable = bboxLabels.LabelData; +bboxTable = bboxTable(:,2:4); +% ʾȫͼ +figure +ptCld = preview(lds); +ax = pcshow(ptCld.Location); +set(ax,'XLim',[-50 50],'YLim',[-40 40]); +zoom(ax,2.5); +axis off; + +% ü + +xMin = -69.12; % X Сֵ +yMin = -40.0; % Y Сֵ +zMin = -5.0; % Z Сֵ +xMax = 69.12; % X ֵ +yMax = 40.0; % Y ֵ +zMax = 5.0; % Z ֵ + +pointCloudRange = [xMin xMax yMin yMax zMin zMax]; + +% üƲǩ +bboxTable = helperProcessGroundTruthData(bboxTable,pointCloudRange); + +% 3D߽Ϣ +bds = boxLabelDatastore(bboxTable); + +cds = combine(lds,bds); + +rng(8) +totalElements = numpartitions(cds); + +% һе +shuffledIndices = randperm(totalElements); + +% ֱָѵԪص +trainRatio = 0.8; +numTrainElements = round(totalElements*trainRatio); + +% ȷѵͲԼ +trainIndices = shuffledIndices(1:numTrainElements); +testIndices = shuffledIndices(numTrainElements+1:end); + +% ݼݴ洢Ӽ +trainDs = subset(cds,trainIndices); +testDs = subset(cds,testIndices); + +trainingSample = preview(trainDs); +[ptCld,bboxes,labels] = deal(trainingSample{1},trainingSample{2},trainingSample{3}); + +% Ŀ +classNames = {'Car','Truck','Pedestrian'}; + +% ΪÿɫԻƱ߽ +colors = {'green','magenta','yellow'}; + +helperShowPointCloudWith3DBoxes(ptCld,bboxes,labels,classNames,colors) + +%% ǿ +sampleLocation = fullfile(outputFolder,"GTsamples"); +writeFiles = true; +if writeFiles + [ldsSampled,bdsSampled] = sampleLidarData(trainDs,classNames,MinPoints=[20 20 10], ... + Verbose=false,WriteLocation=sampleLocation); + cdsSampled = combine(ldsSampled,bdsSampled); + save(fullfile(sampleLocation,"augmentedSample"),"cdsSampled") +else + load(fullfile(sampleLocation,"augmentedSample")) +end + +numObjects = 10; +cdsAugmented = transform(trainDs,@(x)pcBboxOversample(x,cdsSampled,classNames,numObjects)); + +cdsAugmented = transform(cdsAugmented,@(x)helperAugmentData(x)); + +augData = preview(cdsAugmented); +[ptCld,bboxes,labels] = deal(augData{1},augData{2},augData{3}); +helperShowPointCloudWith3DBoxes(ptCld,bboxes,labels,classNames,colors) + +%% Voxel R-CNN +anchorBoxes = helperEstimate3DAnchorBoxesForVoxelRCNN(trainDs,classNames); + +detector = voxelRCNNObjectDetector("kitti",classNames,anchorBoxes,PointCloudRange=pointCloudRange); + +%% ѵѡѵģ + +options = trainingOptions("adam", ... + InitialLearnRate=0.01, ... + MiniBatchSize=4, ... + MaxEpochs=10, ... + PreprocessingEnvironment="parallel", ... + VerboseFrequency=100, ... + CheckpointFrequency=10, ... + CheckpointPath=userpath, ... + Plots="training-progress", ... + Shuffle="every-epoch", ... + L2Regularization=0.01); + +[detector,info] = trainVoxelRCNNObjectDetector(cdsAugmented,detector,options); + +%% ģͲӻ +testData = preview(testDs); +ptCloud = testData{1}; +[bboxes,score,labels] = detect(detector,ptCloud); + +helperShowPointCloudWith3DBoxes(ptCloud,bboxes,labels,classNames,colors) + +%% ģ +dataPath = fileparts(mfilename('fullpath')); % ȡǰűڵļ· +save(fullfile(dataPath, 'trainedCustomVoxelRCNNDetector.mat'), 'detector'); % ļ dataPath Ŀ¼ +%% +function helperShowPointCloudWith3DBoxes(ptCld,bboxes,labels,classNames,colors) + % Validate the length of classNames and colors are the same. + assert(numel(classNames)==numel(colors),"ClassNames and Colors must have the same number of elements.") + + % Get unique categories from labels. + uniqueCategories = categories(labels); + + % Create a mapping from category to color. + colorMap = containers.Map(uniqueCategories,colors); + labelColor = cell(size(labels)); + + % Populate labelColor based on the mapping. + for i = 1:length(labels) + labelColor{i} = colorMap(char(labels(i))); + end + + figure + ax = pcshow(ptCld); + showShape("cuboid",bboxes,Parent=ax,Opacity=0.1, ... + Color=labelColor,LineWidth=0.5) + zoom(ax,5) + +end + + +function data = helperAugmentData(data) + pc = data{1}; + + % Define outputView based on the grid-size and XYZ limits. + outView = imref3d([32,32,32],[-100,100], ... + [-100,100],[-100,100]); + rotationAngle = [-45, 45]; + rotationNoise = (rotationAngle(2) - rotationAngle(1)).*rand() + rotationAngle(1); + tform = randomAffine3d(Rotation=@() deal([0,0,1],rotationNoise), ... + Scale=[0.95 1.05], ... + XTranslation=[0 0.2], ... + YTranslation=[0 0.2], ... + ZTranslation=[0 0.1]); + + ptCloud = pctransform(pc,tform); + % Apply the same transformation to the boxes. + bbox = data{2}; + [bbox,indices] = bboxwarp(bbox,tform,outView); + if ~isempty(indices) + data{1} = ptCloud; + data{2} = bbox; + data{3} = data{1,3}(indices,:); + end +end + + +function boxTable = helperProcessGroundTruthData(boxTable,pcRange) +for colIdx = 1:size(boxTable,2) + % Apply the operation to each cell in the current column. + boxTable{:,colIdx} = cellfun(@(x) helperGetBbox(x,pcRange),boxTable{:,colIdx},UniformOutput=false); +end +end + + +function data = helperGetBbox(data,pcRange) + bbox = data; + if ~isempty(bbox) + % Get index of bounding boxes that lie within pcRange. + idx = (bbox(:,1) > pcRange(1)) & ... + (bbox(:,1) < pcRange(2)) & ... + (bbox(:,2) > pcRange(3)) & ... + (bbox(:,2) < pcRange(4)); + data = bbox(idx,:); + end +end + + +function data = helperGetRotatedRectangle(data) +bbox = data{1}; +if ~isempty(bbox) + % Convert bounding box format to rotated rectangle. + data{1} = bbox(:,[1 2 4 5 9]); +end +end \ No newline at end of file From aacbc001da659046a63d70b6c76e8465d61efbfc Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Sun, 23 Nov 2025 19:13:45 +0800 Subject: [PATCH 03/31] =?UTF-8?q?=E5=9C=A8deepsort=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=B8=AD=E5=BE=97=E5=88=B0=E5=8D=95=E8=B7=AF=E5=8F=A3=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- waypoint_control/carla_DeepSORT/gt-person.py | 704 +++++++++++++++++++ 1 file changed, 704 insertions(+) create mode 100644 waypoint_control/carla_DeepSORT/gt-person.py diff --git a/waypoint_control/carla_DeepSORT/gt-person.py b/waypoint_control/carla_DeepSORT/gt-person.py new file mode 100644 index 0000000..86d4e6e --- /dev/null +++ b/waypoint_control/carla_DeepSORT/gt-person.py @@ -0,0 +1,704 @@ +import json +from typing import Any +import torch +import numpy as np +import cv2 +from time import perf_counter +import carla +import queue +import random + +from ultralytics import YOLO +from deep_sort.deep_sort import DeepSort +from deep_sort.utils.parser import get_config +from pascal_voc_writer import Writer + +import concurrent.futures +from functools import partial + +# Part 1 +# image size +image_w = 256 * 4 +image_h = 256 * 3 + +# yolo filtering - 添加行人类别 +class_id = [0, 1, 2] # 0: person, 1: vehicle, 2: car +class_name = {0: 'person', 1: 'vehicle', 2: 'car'} + +cfg = get_config() +cfg.merge_from_file('deep_sort/configs/deep_sort.yaml') +deepsort_weights = "deep_sort/deep/checkpoint/ckpt.t7" + +device = 'cuda' if torch.cuda.is_available() else 'cpu' + +# 为行人和车辆分别创建 DeepSort 跟踪器 +deepsort_person = DeepSort( + deepsort_weights, + max_age=70, + n_init=3) + +deepsort_vehicle = DeepSort( + deepsort_weights, + max_age=70, + n_init=3) + +# establising Carla connection +client = carla.Client('localhost', 2000) +world = client.get_world() + +# Set up the simulator in synchronous mode +settings = world.get_settings() +settings.synchronous_mode = True +settings.fixed_delta_seconds = 0.05 +world.apply_settings(settings) + +# Get the world spectator +spectator = world.get_spectator() + +# Get the map spawn points +spawn_points = world.get_map().get_spawn_points() + +# vehicle setup +vehicle_bp = world.get_blueprint_library().find('vehicle.lincoln.mkz_2020') +# vehicle_bp.set_attribute('role_name', 'ego') +# vehicle = world.try_spawn_actor(vehicle_bp, random.choice(spawn_points)) + +# camera setip +camera_bp = world.get_blueprint_library().find('sensor.camera.rgb') +camera_bp.set_attribute('image_size_x', f'{image_w}') +camera_bp.set_attribute('image_size_y', f'{image_h}') +camera_bp.set_attribute('fov', '110') +fov = 110 + +# attaching camera +# camera_init_trans = carla.Transform(carla.Location(z=2)) +# 路口 1 +# camera_init_trans = carla.Transform(carla.Location(x=-46, y=14, z=2.5),carla.Rotation(pitch=0, yaw=90, roll=0)) +# 路口 2 +# camera_init_trans = carla.Transform(carla.Location(x=104, y=14, z=2.5),carla.Rotation(pitch=0, yaw=90, roll=0)) +# 路口 3 +# camera_init_trans = carla.Transform(carla.Location(x=-106, y=14, z=2.5),carla.Rotation(pitch=0, yaw=90, roll=0)) +# 路口 4 +# camera_init_trans = carla.Transform(carla.Location(x=-46, y=-68, z=2.5),carla.Rotation(pitch=0, yaw=90, roll=0)) +# 路口 5 +camera_init_trans = carla.Transform(carla.Location(x=-50, y=128, z=2.5), + carla.Rotation(pitch=0, yaw=-0, roll=0)) + +# camera = world.spawn_actor(camera_bp, camera_init_trans, attach_to=vehicle) +camera = world.spawn_actor(camera_bp, camera_init_trans) +image_w = camera_bp.get_attribute('image_size_x').as_int() +image_h = camera_bp.get_attribute('image_size_y').as_int() + +# auto pilot for ego vehicle +# vehicle.set_autopilot(True) + +# Create a queue to store and retrieve the sensor data +image_queue = queue.Queue() +camera.listen(image_queue.put) + + +# Part 2 + +def build_projection_matrix(w, h, fov, is_behind_camera=False): + focal = w / (2.0 * np.tan(fov * np.pi / 360.0)) + K = np.identity(3) + + if is_behind_camera: + K[0, 0] = K[1, 1] = -focal + else: + K[0, 0] = K[1, 1] = focal + K[0, 2] = w / 2.0 + K[1, 2] = h / 2.0 + return K + + +def get_image_point(loc, K, w2c): + # Calculate 2D projection of 3D coordinate + + point = np.array([loc.x, loc.y, loc.z, 1]) + point_camera = np.dot(w2c, point) + point_camera = np.array([point_camera[1], -point_camera[2], point_camera[0]]).T + point_img = np.dot(K, point_camera) + point_img[0] /= point_img[2] + point_img[1] /= point_img[2] + + return point_img + + +# Remember the edge pairs +edges = [[0, 1], [1, 3], [3, 2], [2, 0], [0, 4], [4, 5], [5, 1], [5, 7], [7, 6], [6, 4], [6, 2], [7, 3]] + +# Get the world to camera matrix +world_2_camera = np.array(camera.get_transform().get_inverse_matrix()) + +# Calculate the camera projection matrix to project from 3D -> 2D +K = build_projection_matrix(image_w, image_h, fov) +K_b = build_projection_matrix(image_w, image_h, fov, is_behind_camera=True) + +# for i in range(30): +# vehicle_bp = world.get_blueprint_library().filter('vehicle') +# +# # Exclude bicycle +# car_bp = [bp for bp in vehicle_bp if int(bp.get_attribute('number_of_wheels')) == 4] +# npc = world.try_spawn_actor(random.choice(car_bp), random.choice(spawn_points)) +# +# if npc: +# npc.set_autopilot(True) + + +def filter_vehicle_blueprinter(vehicle_blueprints): + """ + :param vehicle_blueprints: 车辆蓝图 + :return: 过滤自行车后的车辆蓝图 + """ + filtered_vehicle_blueprints = [bp for bp in vehicle_blueprints if 'bike' not in bp.id and + 'omafiets' not in bp.id and + 'century' not in bp.id and + 'vespa' not in bp.id and + 'motorcycle' not in bp.id and + 'harley' not in bp.id and + 'yamaha' not in bp.id and + 'kawasaki' not in bp.id and + 'mini' not in bp.id] + return filtered_vehicle_blueprints + + +# def spawn_pedestrians(world, num_pedestrians=150, random_seed=20): +# """ +# 生成随机运动的行人 +# """ +# random.seed(random_seed) +# np.random.seed(random_seed) +# pedestrian_list = [] +# +# # 获取普通行人蓝图(排除特殊类型) +# walker_bps = [ +# bp for bp in world.get_blueprint_library().filter('walker.pedestrian*') +# if not bp.id.split('.')[-1] in {'child', 'skeleton'} +# ] +# +# print(f"Found {len(walker_bps)} pedestrian blueprints") +# +# spawned_count = 0 +# for _ in range(num_pedestrians): +# # 获取安全生成位置 +# spawn_point = None +# for _ in range(10): # 最多尝试10次 +# location = world.get_random_location_from_navigation() +# if location and 0 < location.z < 1.0: +# spawn_point = carla.Transform(location) +# break +# if not spawn_point: +# print("Failed to find valid spawn location") +# continue +# +# # 生成行人 +# bp = random.choice(walker_bps) +# pedestrian = world.try_spawn_actor(bp, spawn_point) +# if not pedestrian: +# print(f"Failed to spawn pedestrian at {spawn_point.location}") +# continue +# +# # 通过Actor接口启用物理 +# try: +# pedestrian.set_simulate_physics(True) +# # 在同步模式下,我们会在主循环中调用world.tick() +# except RuntimeError as e: +# print(f"Failed to set physics: {e}") +# pedestrian.destroy() +# continue +# +# # 设置AI控制器 +# try: +# controller_bp = world.get_blueprint_library().find('controller.ai.walker') +# if controller_bp: +# controller = world.spawn_actor(controller_bp, carla.Transform(), attach_to=pedestrian) +# controller.start() # 启用自动行走 +# +# # 设置随机目标点 +# target_location = world.get_random_location_from_navigation() +# if target_location: +# controller.go_to_location(target_location) +# +# # 只将行人添加到列表,控制器不保存 +# pedestrian_list.append(pedestrian) +# spawned_count += 1 +# print(f"Successfully spawned pedestrian {spawned_count} with AI controller") +# else: +# print("Failed to find AI controller blueprint") +# pedestrian.destroy() +# except Exception as e: +# print(f"Failed to setup AI controller: {e}") +# pedestrian.destroy() +# +# print(f"Spawned {spawned_count} pedestrians with AI controllers") +# return pedestrian_list + +# 生成随机运动行人 +def spawn_autonomous_pedestrians(world, num_pedestrians=150): + pedestrian_list = [] + + # 获取普通行人蓝图(排除特殊类型) + walker_bps = [ + bp for bp in world.get_blueprint_library().filter('walker.pedestrian*') + if not bp.id.split('.')[-1] in {'child', 'skeleton'} + ] + + + for _ in range(num_pedestrians): + # 获取安全生成位置 + spawn_point = None + for _ in range(3): # 最多尝试3次 + location = world.get_random_location_from_navigation() + if location and 0 < location.z < 1.0: + spawn_point = carla.Transform(location) + break + if not spawn_point: + continue + + # 生成行人 + bp = random.choice(walker_bps) + pedestrian = world.try_spawn_actor(bp, spawn_point) + if not pedestrian: + continue + + + # 通过Actor接口启用物理 + try: + pedestrian.set_simulate_physics(True) + world.tick() # 同步模式下必须tick + except RuntimeError as e: + print(f"设置物理失败: {e}") + pedestrian.destroy() + continue + + controller_bp = world.get_blueprint_library().find('controller.ai.walker') + controller = world.spawn_actor(controller_bp, carla.Transform(), pedestrian) + controller.start() # 启用自动行走 + controller.go_to_location(world.get_random_location_from_navigation()) # 设置目标点 + + # 只将行人添加到列表,控制器不保存 + pedestrian_list.append(pedestrian) + + return pedestrian_list + +# 添加自定义 JSON 编码器来处理 numpy 类型 +class NumpyEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, (np.integer, np.int64)): + return int(obj) + elif isinstance(obj, np.floating): + return float(obj) + elif isinstance(obj, np.ndarray): + return obj.tolist() + return super(NumpyEncoder, self).default(obj) + +tm = client.get_trafficmanager(8000) +tm.set_synchronous_mode(True) +random_seed = 20 +random.seed(random_seed) +np.random.seed(random_seed) +tm.set_random_device_seed(random_seed) +vehicle_list = [] +blueprint_library = world.get_blueprint_library() +vehicle_blueprints = blueprint_library.filter('vehicle.*') +filter_vehicle_blueprints = filter_vehicle_blueprinter(vehicle_blueprints) +# # 随机选择一个位置 +# spawn_points = world.get_map().get_spawn_points() + +# 如果蓝图不足,使用颜色来区分 +num_blueprints = len(filter_vehicle_blueprints) +num_colors = 12 +available_colors = ["255,0,0", "0,255,0", "0,0,255", "255,255,0", "0,255,255", "255,0,255", "128,128,0", + "128,0,128", "0,128,128", "255,165,0", "0,255,255", "255,192,203"] +# 生成车辆 +vehicle_index = 0 +for _ in range(50): + # 选择一个随机位置生成车辆 + transform = spawn_points[np.random.randint(len(spawn_points))] + # vehicle_bp = random.choice(filter_vehicle_blueprints) + # 选择蓝图,确保每个蓝图的车辆唯一 + if vehicle_index < num_blueprints: + vehicle_bp = filter_vehicle_blueprints[vehicle_index] + vehicle_index += 1 + else: + # 蓝图用完后,开始使用颜色来区分 + vehicle_bp = filter_vehicle_blueprints[vehicle_index % num_blueprints] + color = available_colors[vehicle_index % num_colors] + vehicle_bp.set_attribute('color', color) + vehicle_index += 1 + + vehicle = world.try_spawn_actor(vehicle_bp, transform) + if vehicle is None: + continue + # 配置自动驾驶 + vehicle.set_autopilot(True) # 启动自动驾驶模式 + # 不考虑交通灯 + tm.ignore_lights_percentage(vehicle, 100) + vehicle_list.append(vehicle) + # print(f"Spawned vehicle: {vehicle.id}") + +# 生成行人 +# pedestrian_list = spawn_pedestrians(world, 150) # 生成50个行人 +pedestrian_list = spawn_autonomous_pedestrians(world, 150) + + +# Retrieve all these type objects + +car_objects = world.get_environment_objects(carla.CityObjectLabel.Car) +truck_objects = world.get_environment_objects(carla.CityObjectLabel.Truck) +bus_objects = world.get_environment_objects(carla.CityObjectLabel.Bus) +env_object_ids = [] +for obj in (car_objects + truck_objects + bus_objects): + env_object_ids.append(obj.id) + +world.enable_environment_objects(env_object_ids, False) # Disable all static vehicles + +edges = [[0, 1], [1, 3], [3, 2], [2, 0], [0, 4], [4, 5], [5, 1], [5, 7], [7, 6], [6, 4], [6, 2], [7, 3]] + + +def point_in_canvas(pos, img_h, img_w): + """Return true if point is in canvas""" + if (pos[0] >= 0) and (pos[0] < img_w) and (pos[1] >= 0) and (pos[1] < img_h): + return True + return False + + +def get_vanishing_point(p1, p2, p3, p4): + k1 = (p4[1] - p3[1]) / (p4[0] - p3[0]) + k2 = (p2[1] - p1[1]) / (p2[0] - p1[0]) + + vp_x = (k1 * p3[0] - k2 * p1[0] + p1[1] - p3[1]) / (k1 - k2) + vp_y = k1 * (vp_x - p3[0]) + p3[1] + + return [vp_x, vp_y] + + +def clear(): + """destroy all the actors + """ + settings = world.get_settings() + settings.synchronous_mode = False # Disables synchronous mode + settings.fixed_delta_seconds = None + world.apply_settings(settings) + + camera.stop() + + # destroy all npc's + for npc in world.get_actors().filter('*vehicle*'): + if npc: + npc.destroy() + + # destroy all pedestrians + for pedestrian in world.get_actors().filter('*walker*'): + if pedestrian: + pedestrian.destroy() + + # destroy all controllers + for controller in world.get_actors().filter('*controller*'): + if controller: + controller.destroy() + + print("Vehicles and Pedestrians Destroyed.") + + +# vehicle.set_autopilot(True) +edges = [[0, 1], [1, 3], [3, 2], [2, 0], [0, 4], [4, 5], [5, 1], [5, 7], [7, 6], [6, 4], [6, 2], [7, 3]] + +# 轨迹保存数据结构 +vehicle_trajectories = {} +person_trajectories = {} + +frames_count = 0 +annotations = [] +sort_final = [] + +# 颜色映射 +color_map = { + 'person': (0, 255, 0), # 绿色 + 'vehicle': (0, 0, 255), # 红色 + 'car': (255, 0, 0) # 蓝色 +} + +with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor: + for tick in range(500): + try: + world.tick() + + # Move the spectator to the top of the vehicle + # transform = carla.Transform(vehicle.get_transform().transform(carla.Location(x=-4, z=50)), + # carla.Rotation(yaw=-180, pitch=-90)) + # transform = carla.Transform(carla.Location(x=-46, y=14, z=3.6),carla.Rotation(pitch=0, yaw=90, roll=0)) + spectator.set_transform(camera_init_trans) + + # Retrieve and reshape the image + image = image_queue.get() + img = np.reshape(np.copy(image.raw_data), (image.height, image.width, 4)) + img = img[:, :, :3] # 去除alpha通道 + img = np.ascontiguousarray(img, dtype=np.uint8) + timestamp_sec = image.timestamp + + # Get the camera matrix + world_2_camera = np.array(camera.get_transform().get_inverse_matrix()) + + # Get the image frame from the image queue + frame = np.copy(img) + frames_count += 1 + ground_truth_annotations = [] + DSort_nnotations = [] + + # Perform YOLO object detection + model = YOLO('weights/best.pt') + preds = model(frame) + + # 分别处理行人和车辆的检测结果 + person_bbox_xyxy = [] + person_conf_score = [] + person_cls_id = [] + + vehicle_bbox_xyxy = [] + vehicle_conf_score = [] + vehicle_cls_id = [] + + # Iterate through the detected objects and their bounding boxes + for box in preds: + for r in box.boxes.data.tolist(): + x_min, y_min, x_max, y_max, conf, class_ids = r + id = int(class_ids) + if id in class_id: + if id == 0: # person + person_bbox_xyxy.append([int(x_min), int(y_min), int(x_max), int(y_max)]) + person_conf_score.append(conf) + person_cls_id.append(int(id)) + else: # vehicle + vehicle_bbox_xyxy.append([int(x_min), int(y_min), int(x_max), int(y_max)]) + vehicle_conf_score.append(conf) + vehicle_cls_id.append(int(id)) + else: + continue + + # 分别使用不同的 DeepSort 跟踪器 + person_outputs = deepsort_person.update(person_bbox_xyxy, person_conf_score, frame) + vehicle_outputs = deepsort_vehicle.update(vehicle_bbox_xyxy, vehicle_conf_score, frame) + + # 处理行人跟踪结果 + for output in person_outputs: + x1, y1, x2, y2, track_id = output + DSort_nnotations.append({ + "height": int(y2 - y1), + "width": int(x2 - x1), + "id": "person", + "track_id": int(track_id), + "y": int(y1), + "x": int(x1) + }) + + # 更新行人轨迹 + if track_id not in person_trajectories: + person_trajectories[track_id] = [] + person_trajectories[track_id].append({ + "frame": frames_count, + "timestamp": timestamp_sec, + "x": int(x1), + "y": int(y1), + "width": int(x2 - x1), + "height": int(y2 - y1) + }) + + # 在图像上绘制行人边界框和ID + cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), color_map['person'], 2) + cv2.putText(img, f'Person {track_id}', (int(x1), int(y1) - 10), + cv2.FONT_HERSHEY_SIMPLEX, 0.5, color_map['person'], 2) + + # 处理车辆跟踪结果 + for output in vehicle_outputs: + x1, y1, x2, y2, track_id = output + DSort_nnotations.append({ + "height": int(y2 - y1), + "width": int(x2 - x1), + "id": "vehicle", + "track_id": int(track_id), + "y": int(y1), + "x": int(x1) + }) + + # 更新车辆轨迹 + if track_id not in vehicle_trajectories: + vehicle_trajectories[track_id] = [] + vehicle_trajectories[track_id].append({ + "frame": frames_count, + "timestamp": timestamp_sec, + "x": int(x1), + "y": int(y1), + "width": int(x2 - x1), + "height": int(y2 - y1) + }) + + # 在图像上绘制车辆边界框和ID + cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), color_map['vehicle'], 2) + cv2.putText(img, f'Vehicle {track_id}', (int(x1), int(y1) - 10), + cv2.FONT_HERSHEY_SIMPLEX, 0.5, color_map['vehicle'], 2) + + sort_final.append({ + "timestamp": timestamp_sec, + "num": image.frame, + "class": "frame", + "hypotheses": DSort_nnotations + }) + + hypo = [{ + "frames": sort_final, + "class": "video", + "filename": "hypo.json" + }] + + # 处理地面真实标注 - 包括行人和车辆 + vehicles = list(world.get_actors().filter('*vehicle*')) + walkers = list(world.get_actors().filter('*walker*')) + all_actors = vehicles + walkers + for actor in all_actors: + # 确定类别 + if 'walker' in actor.type_id: + obj_class = 'person' + else: + obj_class = 'vehicle' + + bb = actor.bounding_box + dist = actor.get_transform().location.distance(camera.get_transform().location) + + # Filter for the objects within 50m + if dist < 50: + forward_vec = camera.get_transform().get_forward_vector() + ray = actor.get_transform().location - camera.get_transform().location + if forward_vec.dot(ray) > 0: + verts = [v for v in bb.get_world_vertices(actor.get_transform())] + points_image = [] + + for vert in verts: + ray0 = vert - camera.get_transform().location + cam_forward_vec = camera.get_transform().get_forward_vector() + if (cam_forward_vec.dot(ray0) > 0): + p = get_image_point(vert, K, world_2_camera) + else: + p = get_image_point(vert, K_b, world_2_camera) + + points_image.append(p) + + x_min, x_max = 10000, -10000 + y_min, y_max = 10000, -10000 + + for edge in edges: + p1 = points_image[edge[0]] + p2 = points_image[edge[1]] + + p1_in_canvas = point_in_canvas(p1, image_h, image_w) + p2_in_canvas = point_in_canvas(p2, image_h, image_w) + + if not p1_in_canvas and not p2_in_canvas: + continue + + p1_temp, p2_temp = (p1.copy(), p2.copy()) + + if not (p1_in_canvas and p2_in_canvas): + p = [0, 0] + p_in_canvas, p_not_in_canvas = (p1, p2) if p1_in_canvas else (p2, p1) + k = (p_not_in_canvas[1] - p_in_canvas[1]) / (p_not_in_canvas[0] - p_in_canvas[0]) + + x = np.clip(p_not_in_canvas[0], 0, image.width) + y = k * (x - p_in_canvas[0]) + p_in_canvas[1] + + if y >= image.height: + p[0] = (image.height - p_in_canvas[1]) / k + p_in_canvas[0] + p[1] = image.height - 1 + elif y <= 0: + p[0] = (0 - p_in_canvas[1]) / k + p_in_canvas[0] + p[1] = 0 + else: + p[0] = image.width - 1 if x == image.width else 0 + p[1] = y + + p1_temp, p2_temp = (p, p_in_canvas) + + x_max = max(p1_temp[0], p2_temp[0], x_max) + x_min = min(p1_temp[0], p2_temp[0], x_min) + y_max = max(p1_temp[1], p2_temp[1], y_max) + y_min = min(p1_temp[1], p2_temp[1], y_min) + + # 调整过滤条件,对行人使用更小的阈值 + min_area = 50 if obj_class == 'person' else 100 + min_width = 10 if obj_class == 'person' else 20 + + if (y_max - y_min) * (x_max - x_min) > min_area and (x_max - x_min) > min_width: + if point_in_canvas((x_min, y_min), image_h, image_w) and point_in_canvas((x_max, y_max), + image_h, image_w): + # 绘制地面真实边界框 + color = color_map[obj_class] + # 确保坐标是整数 + x_min_int, y_min_int, x_max_int, y_max_int = int(x_min), int(y_min), int(x_max), int(y_max) + cv2.line(img, (int(x_min), int(y_min)), (int(x_max), int(y_min)), color, 1) + cv2.line(img, (int(x_min), int(y_max)), (int(x_max), int(y_max)), color, 1) + cv2.line(img, (int(x_min), int(y_min)), (int(x_min), int(y_max)), color, 1) + cv2.line(img, (int(x_max), int(y_min)), (int(x_max), int(y_max)), color, 1) + + ground_truth_annotations.append({ + "dco": True, + "height": int(y_max - y_min), + "width": int(x_max - x_min), + "id": obj_class, + "y": int(y_min), + "x": int(x_min) + }) + annotations.append({ + "timestamp": timestamp_sec, + "num": image.frame, + "class": "frame", + "annotations": ground_truth_annotations + }) + + gt_output = [{ + "frames": annotations, + "class": "video", + "filename": "groundtruth.json" + }] + + # 保存轨迹数据 - 使用自定义编码器 + trajectories_data = { + "vehicle_trajectories": {int(k): v for k, v in vehicle_trajectories.items()}, + "person_trajectories": {int(k): v for k, v in person_trajectories.items()}, + "total_frames": frames_count + } + + with open('groundtruth.json', 'w') as json_file: + json.dump(gt_output, json_file, cls=NumpyEncoder) + + with open('hypo.json', 'w') as json_file: + json.dump(hypo, json_file, cls=NumpyEncoder) + + with open('trajectories.json', 'w') as json_file: + json.dump(trajectories_data, json_file, indent=2, cls=NumpyEncoder) + + cv2.imshow('Multi-Object Tracking', img) + print(f"Frame: {frames_count}, Vehicles: {len(vehicle_trajectories)}, Persons: {len(person_trajectories)}") + + if cv2.waitKey(1) == ord('q'): + clear() + break + + except KeyboardInterrupt as e: + clear() + break + +camera.stop() +camera.destroy() +# vehicle.destroy() + +# 清理所有actor +for vehicle in vehicle_list: + if vehicle.is_alive: + vehicle.destroy() + +for pedestrian in pedestrian_list: + if pedestrian.is_alive: + pedestrian.destroy() + +cv2.destroyAllWindows() \ No newline at end of file From 1479574364aceda25da8b71127d65b8881cdb115 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Tue, 25 Nov 2025 20:05:19 +0800 Subject: [PATCH 04/31] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E6=95=B0=E6=8D=AE=E9=9B=86=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OpenPCDet/pcdet/datasets/custom/custom_dataset.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/waypoint_control/OpenPCDet/pcdet/datasets/custom/custom_dataset.py b/waypoint_control/OpenPCDet/pcdet/datasets/custom/custom_dataset.py index 3715210..b12306d 100644 --- a/waypoint_control/OpenPCDet/pcdet/datasets/custom/custom_dataset.py +++ b/waypoint_control/OpenPCDet/pcdet/datasets/custom/custom_dataset.py @@ -277,7 +277,7 @@ def create_custom_infos(dataset_cfg, class_names, data_path, save_path, workers= ROOT_DIR = (Path(__file__).resolve().parent / '../../../').resolve() create_custom_infos( dataset_cfg=dataset_cfg, - class_names=['Vehicle', 'Pedestrian', 'Cyclist'], + class_names=['Car', 'Truck', 'Pedestrian'], data_path=ROOT_DIR / 'data' / 'custom', save_path=ROOT_DIR / 'data' / 'custom', ) From 6d55799aafaed0dd6c74acd25410d738e986fc22 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Tue, 25 Nov 2025 20:18:43 +0800 Subject: [PATCH 05/31] =?UTF-8?q?=E6=B7=BB=E5=8A=A0.yaml=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- waypoint_control/OpenPCDet/.gitignore | 1 - .../argo2_models/cbgs_voxel01_voxelnext.yaml | 112 +++++++ .../tools/cfgs/custom_models/pv_rcnn.yaml | 227 +++++++++++++ .../tools/cfgs/custom_models/second.yaml | 121 +++++++ .../cfgs/dataset_configs/argo2_dataset.yaml | 55 +++ .../cfgs/dataset_configs/custom_dataset.yaml | 70 ++++ .../cfgs/dataset_configs/kitti_dataset.yaml | 70 ++++ .../cfgs/dataset_configs/lyft_dataset.yaml | 78 +++++ .../dataset_configs/nuscenes_dataset.yaml | 80 +++++ .../cfgs/dataset_configs/once_dataset.yaml | 67 ++++ .../dataset_configs/pandaset_dataset.yaml | 110 ++++++ .../cfgs/dataset_configs/waymo_dataset.yaml | 84 +++++ .../waymo_dataset_multiframe.yaml | 89 +++++ .../tools/cfgs/kitti_models/CaDDN.yaml | 177 ++++++++++ .../tools/cfgs/kitti_models/PartA2.yaml | 191 +++++++++++ .../tools/cfgs/kitti_models/PartA2_free.yaml | 135 ++++++++ .../tools/cfgs/kitti_models/pillarnet.yaml | 123 +++++++ .../tools/cfgs/kitti_models/pointpillar.yaml | 164 +++++++++ .../kitti_models/pointpillar_newaugs.yaml | 185 ++++++++++ .../kitti_models/pointpillar_pyramid_aug.yaml | 170 ++++++++++ .../tools/cfgs/kitti_models/pointrcnn.yaml | 160 +++++++++ .../cfgs/kitti_models/pointrcnn_iou.yaml | 160 +++++++++ .../tools/cfgs/kitti_models/pv_rcnn.yaml | 249 ++++++++++++++ ...rcnn_plusplus_reproduced_by_community.yaml | 301 +++++++++++++++++ .../tools/cfgs/kitti_models/second.yaml | 121 +++++++ .../tools/cfgs/kitti_models/second_iou.yaml | 171 ++++++++++ .../cfgs/kitti_models/second_multihead.yaml | 137 ++++++++ .../cfgs/kitti_models/voxel_rcnn_car.yaml | 202 +++++++++++ .../voxel_rcnn_car_focal_multimodal.yaml | 209 ++++++++++++ .../cbgs_second-nores_multihead.yaml | 215 ++++++++++++ .../lyft_models/cbgs_second_multihead.yaml | 215 ++++++++++++ .../tools/cfgs/nuscenes_models/bevfusion.yaml | 208 ++++++++++++ .../cbgs_dyn_pp_centerpoint.yaml | 117 +++++++ .../cbgs_pillar0075_res2d_centerpoint.yaml | 161 +++++++++ .../nuscenes_models/cbgs_pp_multihead.yaml | 246 ++++++++++++++ .../cbgs_second_multihead.yaml | 228 +++++++++++++ .../cbgs_voxel0075_res3d_centerpoint.yaml | 160 +++++++++ .../cbgs_voxel0075_voxelnext.yaml | 156 +++++++++ .../cbgs_voxel0075_voxelnext_doubleflip.yaml | 158 +++++++++ .../cbgs_voxel01_res3d_centerpoint.yaml | 104 ++++++ .../nuscenes_models/transfusion_lidar.yaml | 171 ++++++++++ .../tools/cfgs/once_models/centerpoint.yaml | 100 ++++++ .../tools/cfgs/once_models/pointpillar.yaml | 148 ++++++++ .../tools/cfgs/once_models/pointrcnn.yaml | 162 +++++++++ .../tools/cfgs/once_models/pv_rcnn.yaml | 243 ++++++++++++++ .../tools/cfgs/once_models/second.yaml | 141 ++++++++ .../tools/cfgs/waymo_models/PartA2.yaml | 194 +++++++++++ .../tools/cfgs/waymo_models/centerpoint.yaml | 96 ++++++ .../waymo_models/centerpoint_4frames.yaml | 102 ++++++ .../centerpoint_dyn_pillar_1x.yaml | 110 ++++++ .../waymo_models/centerpoint_pillar_1x.yaml | 116 +++++++ .../centerpoint_without_resnet.yaml | 96 ++++++ .../tools/cfgs/waymo_models/dsvt_pillar.yaml | 190 +++++++++++ .../tools/cfgs/waymo_models/dsvt_voxel.yaml | 192 +++++++++++ .../cfgs/waymo_models/mppnet_16frames.yaml | 162 +++++++++ .../cfgs/waymo_models/mppnet_4frames.yaml | 167 +++++++++ .../mppnet_e2e_memorybank_inference.yaml | 194 +++++++++++ .../tools/cfgs/waymo_models/pillarnet.yaml | 97 ++++++ .../cfgs/waymo_models/pointpillar_1x.yaml | 140 ++++++++ .../tools/cfgs/waymo_models/pv_rcnn.yaml | 228 +++++++++++++ .../cfgs/waymo_models/pv_rcnn_plusplus.yaml | 277 +++++++++++++++ .../waymo_models/pv_rcnn_plusplus_resnet.yaml | 277 +++++++++++++++ .../pv_rcnn_plusplus_resnet_2frames.yaml | 316 ++++++++++++++++++ .../pv_rcnn_with_centerhead_rpn.yaml | 215 ++++++++++++ .../tools/cfgs/waymo_models/second.yaml | 121 +++++++ .../voxel_rcnn_with_centerhead_dyn_voxel.yaml | 194 +++++++++++ .../waymo_models/voxelnext2d_ioubranch.yaml | 91 +++++ .../voxelnext_ioubranch_large.yaml | 89 +++++ 68 files changed, 10615 insertions(+), 1 deletion(-) create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/argo2_models/cbgs_voxel01_voxelnext.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/custom_models/pv_rcnn.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/custom_models/second.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/argo2_dataset.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/custom_dataset.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/kitti_dataset.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/lyft_dataset.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/nuscenes_dataset.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/once_dataset.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/pandaset_dataset.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/waymo_dataset.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/waymo_dataset_multiframe.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/CaDDN.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/PartA2.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/PartA2_free.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pillarnet.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointpillar.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointpillar_newaugs.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointpillar_pyramid_aug.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointrcnn.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointrcnn_iou.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pv_rcnn.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pv_rcnn_plusplus_reproduced_by_community.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/second.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/second_iou.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/second_multihead.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/voxel_rcnn_car.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/kitti_models/voxel_rcnn_car_focal_multimodal.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/lyft_models/cbgs_second-nores_multihead.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/lyft_models/cbgs_second_multihead.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/bevfusion.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_dyn_pp_centerpoint.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_pillar0075_res2d_centerpoint.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_pp_multihead.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_second_multihead.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel0075_res3d_centerpoint.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel0075_voxelnext.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel0075_voxelnext_doubleflip.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel01_res3d_centerpoint.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/transfusion_lidar.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/once_models/centerpoint.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/once_models/pointpillar.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/once_models/pointrcnn.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/once_models/pv_rcnn.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/once_models/second.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/PartA2.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_4frames.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_dyn_pillar_1x.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_pillar_1x.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_without_resnet.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/dsvt_pillar.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/dsvt_voxel.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/mppnet_16frames.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/mppnet_4frames.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/mppnet_e2e_memorybank_inference.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pillarnet.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pointpillar_1x.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_plusplus.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_plusplus_resnet.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_plusplus_resnet_2frames.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_with_centerhead_rpn.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/second.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/voxel_rcnn_with_centerhead_dyn_voxel.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/voxelnext2d_ioubranch.yaml create mode 100644 waypoint_control/OpenPCDet/tools/cfgs/waymo_models/voxelnext_ioubranch_large.yaml diff --git a/waypoint_control/OpenPCDet/.gitignore b/waypoint_control/OpenPCDet/.gitignore index 9fd7ec8..6ca0d2c 100644 --- a/waypoint_control/OpenPCDet/.gitignore +++ b/waypoint_control/OpenPCDet/.gitignore @@ -7,7 +7,6 @@ data/ venv/ *.idea/ *.so -*.yaml *.sh *.pth *.pkl diff --git a/waypoint_control/OpenPCDet/tools/cfgs/argo2_models/cbgs_voxel01_voxelnext.yaml b/waypoint_control/OpenPCDet/tools/cfgs/argo2_models/cbgs_voxel01_voxelnext.yaml new file mode 100644 index 0000000..c8748f4 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/argo2_models/cbgs_voxel01_voxelnext.yaml @@ -0,0 +1,112 @@ +CLASS_NAMES: ['Regular_vehicle', 'Pedestrian', 'Bicyclist', 'Motorcyclist', 'Wheeled_rider', + 'Bollard', 'Construction_cone', 'Sign', 'Construction_barrel', 'Stop_sign', 'Mobile_pedestrian_crossing_sign', + 'Large_vehicle', 'Bus', 'Box_truck', 'Truck', 'Vehicular_trailer', 'Truck_cab', 'School_bus', 'Articulated_bus', + 'Message_board_trailer', 'Bicycle', 'Motorcycle', 'Wheeled_device', 'Wheelchair', 'Stroller', 'Dog'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/argo2_dataset.yaml + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.1, 0.1, 0.2] + MAX_POINTS_PER_VOXEL: 20 + MAX_NUMBER_OF_VOXELS: { + 'train': 120000, + 'test': 160000 + } + +MODEL: + NAME: VoxelNeXt + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8xVoxelNeXt + + DENSE_HEAD: + NAME: VoxelNeXtHead + CLASS_AGNOSTIC: False + INPUT_FEATURES: 128 + + CLASS_NAMES_EACH_HEAD: [ + ['Regular_vehicle',], + ['Pedestrian', 'Bicyclist', 'Motorcyclist', 'Wheeled_rider'], + ['Bollard', 'Construction_cone', 'Sign', 'Construction_barrel', 'Stop_sign', 'Mobile_pedestrian_crossing_sign'], + ['Large_vehicle', 'Bus', 'Box_truck', 'Truck', 'Vehicular_trailer', 'Truck_cab', 'School_bus', 'Articulated_bus', 'Message_board_trailer'], + ['Bicycle', 'Motorcycle', 'Wheeled_device', 'Wheelchair', 'Stroller'], + ['Dog'], + ] + + KERNEL_SIZE_HEAD: 1 + SHARED_CONV_CHANNEL: 128 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 0.25, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-200, -200, -20, 200, 200, 20] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.2 + NMS_PRE_MAXSIZE: 1000 + NMS_POST_MAXSIZE: 83 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: kitti + + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 6 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/custom_models/pv_rcnn.yaml b/waypoint_control/OpenPCDet/tools/cfgs/custom_models/pv_rcnn.yaml new file mode 100644 index 0000000..eb483cd --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/custom_models/pv_rcnn.yaml @@ -0,0 +1,227 @@ +CLASS_NAMES: ['Car', 'Truck', 'Pedestrian'] + +DATA_CONFIG: + _BASE_CONFIG_: ../dataset_configs/custom_dataset.yaml + +MODEL: + NAME: PVRCNN + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[4.5, 1.9, 1.7]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': 'Truck', + 'anchor_sizes': [[5.3, 2.7, 2.5]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.5, 0.5, 1.91]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + PFE: + NAME: VoxelSetAbstraction + POINT_SOURCE: raw_points + NUM_KEYPOINTS: 4096 + NUM_OUTPUT_FEATURES: 128 + SAMPLE_METHOD: FPS + + FEATURES_SOURCE: ['bev', 'x_conv3', 'x_conv4', 'raw_points'] + SA_LAYER: + raw_points: + MLPS: [[16, 16], [16, 16]] + POOL_RADIUS: [0.4, 0.8] + NSAMPLE: [16, 16] + x_conv1: + DOWNSAMPLE_FACTOR: 1 + MLPS: [[16, 16], [16, 16]] + POOL_RADIUS: [0.4, 0.8] + NSAMPLE: [16, 16] + x_conv2: + DOWNSAMPLE_FACTOR: 2 + MLPS: [[32, 32], [32, 32]] + POOL_RADIUS: [0.8, 1.2] + NSAMPLE: [16, 32] + x_conv3: + DOWNSAMPLE_FACTOR: 4 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [1.2, 2.4] + NSAMPLE: [16, 32] + x_conv4: + DOWNSAMPLE_FACTOR: 8 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [2.4, 4.8] + NSAMPLE: [16, 32] + + POINT_HEAD: + NAME: PointHeadSimple + CLS_FC: [256, 256] + CLASS_AGNOSTIC: True + USE_POINT_FEATURES_BEFORE_FUSION: True + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + LOSS_CONFIG: + LOSS_REG: smooth-l1 + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + } + + ROI_HEAD: + NAME: PVRCNNHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False +# NMS_PRE_MAXSIZE: 1024 +# NMS_POST_MAXSIZE: 100 +# NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 300 + NMS_THRESH: 0.85 + + + ROI_GRID_POOL: + GRID_SIZE: 6 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [0.8, 1.6] + NSAMPLE: [16, 16] + POOL_METHOD: max_pool + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.1 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/custom_models/second.yaml b/waypoint_control/OpenPCDet/tools/cfgs/custom_models/second.yaml new file mode 100644 index 0000000..e7652fb --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/custom_models/second.yaml @@ -0,0 +1,121 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/custom_dataset.yaml + + +MODEL: + NAME: SECONDNet + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Vehicle', + 'anchor_sizes': [[3.9, 1.6, 1.56]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.8, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[1.76, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.85 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/argo2_dataset.yaml b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/argo2_dataset.yaml new file mode 100644 index 0000000..37232d6 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/argo2_dataset.yaml @@ -0,0 +1,55 @@ +DATASET: 'Argo2Dataset' +DATA_PATH: '../data/argo2' + +POINT_CLOUD_RANGE: [-200, -200, -20, 200, 200, 20] + +DATA_SPLIT: { + 'train': train, + 'test': val +} + +INFO_PATH: { + 'train': [argo2_infos_train.pkl], + 'test': [argo2_infos_val.pkl], +} + +GET_ITEM_LIST: ["points"] + +DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + + +POINT_FEATURE_ENCODING: { + encoding_type: absolute_coordinates_encoding, + used_feature_list: ['x', 'y', 'z', 'intensity'], + src_feature_list: ['x', 'y', 'z', 'intensity'], +} + + +DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': False + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.1, 0.1, 0.2] + MAX_POINTS_PER_VOXEL: 5 + MAX_NUMBER_OF_VOXELS: { + 'train': 160000, + 'test': 400000 + } diff --git a/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/custom_dataset.yaml b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/custom_dataset.yaml new file mode 100644 index 0000000..38b0203 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/custom_dataset.yaml @@ -0,0 +1,70 @@ +DATASET: 'CustomDataset' +DATA_PATH: '../data/custom' + +POINT_CLOUD_RANGE: [-75.2, -75.2, -2, 75.2, 75.2, 4] + +MAP_CLASS_TO_KITTI: { + 'Vehicle': 'Car', + 'Truck': 'Truck', + 'Pedestrian': 'Pedestrian', +} + +DATA_SPLIT: { + 'train': train, + 'test': val +} + +INFO_PATH: { + 'train': [custom_infos_train.pkl], + 'test': [custom_infos_val.pkl], +} + +POINT_FEATURE_ENCODING: { + encoding_type: absolute_coordinates_encoding, + used_feature_list: ['x', 'y', 'z', 'intensity', 'timestamp'], + src_feature_list: ['x', 'y', 'z', 'intensity', 'timestamp'], +} + +DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: False + DB_INFO_PATH: + - custom_dbinfos_train.pkl + PREPARE: { + filter_by_min_points: ['Car:5', 'Truck:5', 'Pedestrian:5'], + } + + SAMPLE_GROUPS: ['Car:10', 'Truck:10', 'Pedestrian:20'] + NUM_POINT_FEATURES: 4 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + +DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': False + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.1, 0.1, 0.15] + MAX_POINTS_PER_VOXEL: 5 + MAX_NUMBER_OF_VOXELS: { + 'train': 150000, + 'test': 150000 + } \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/kitti_dataset.yaml b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/kitti_dataset.yaml new file mode 100644 index 0000000..b1529aa --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/kitti_dataset.yaml @@ -0,0 +1,70 @@ +DATASET: 'KittiDataset' +DATA_PATH: '../data/kitti' + +POINT_CLOUD_RANGE: [0, -40, -3, 70.4, 40, 1] + +DATA_SPLIT: { + 'train': train, + 'test': val +} + +INFO_PATH: { + 'train': [kitti_infos_train.pkl], + 'test': [kitti_infos_val.pkl], +} + +GET_ITEM_LIST: ["points"] +FOV_POINTS_ONLY: True + +DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: True + DB_INFO_PATH: + - kitti_dbinfos_train.pkl + PREPARE: { + filter_by_min_points: ['Car:5', 'Pedestrian:5', 'Cyclist:5'], + filter_by_difficulty: [-1], + } + + SAMPLE_GROUPS: ['Car:20','Pedestrian:15', 'Cyclist:15'] + NUM_POINT_FEATURES: 4 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + + +POINT_FEATURE_ENCODING: { + encoding_type: absolute_coordinates_encoding, + used_feature_list: ['x', 'y', 'z', 'intensity'], + src_feature_list: ['x', 'y', 'z', 'intensity'], +} + + +DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': False + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.05, 0.05, 0.1] + MAX_POINTS_PER_VOXEL: 5 + MAX_NUMBER_OF_VOXELS: { + 'train': 16000, + 'test': 40000 + } diff --git a/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/lyft_dataset.yaml b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/lyft_dataset.yaml new file mode 100644 index 0000000..32da865 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/lyft_dataset.yaml @@ -0,0 +1,78 @@ +DATASET: 'LyftDataset' +DATA_PATH: '../data/lyft' + +VERSION: 'trainval' +SET_NAN_VELOCITY_TO_ZEROS: True +FILTER_MIN_POINTS_IN_GT: 1 +MAX_SWEEPS: 5 +EVAL_LYFT_IOU_LIST: [0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95] + +DATA_SPLIT: { + 'train': train, + 'test': val +} + +INFO_PATH: { + 'train': [lyft_infos_train.pkl], + 'test': [lyft_infos_val.pkl], +} + +POINT_CLOUD_RANGE: [-80.0, -80.0, -5.0, 80.0, 80.0, 3.0] + +DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + DB_INFO_PATH: + - lyft_dbinfos_10sweeps.pkl + PREPARE: { + filter_by_min_points: [ + 'car:5','pedestrian:5', 'motorcycle:5', 'bicycle:5', 'other_vehicle:5', + 'bus:5', 'truck:5', 'emergency_vehicle:5', 'animal:5' + ], + } + + SAMPLE_GROUPS: [ + 'car:3','pedestrian:3', 'motorcycle:6', 'bicycle:6', 'other_vehicle:4', + 'bus:4', 'truck:3', 'emergency_vehicle:7', 'animal:3' + ] + + NUM_POINT_FEATURES: 5 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.3925, 0.3925] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + + +POINT_FEATURE_ENCODING: { + encoding_type: absolute_coordinates_encoding, + used_feature_list: ['x', 'y', 'z', 'intensity', 'timestamp'], + src_feature_list: ['x', 'y', 'z', 'intensity', 'timestamp'], +} + + +DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.1, 0.1, 0.2] + MAX_POINTS_PER_VOXEL: 10 + MAX_NUMBER_OF_VOXELS: { + 'train': 80000, + 'test': 80000 + } \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/nuscenes_dataset.yaml b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/nuscenes_dataset.yaml new file mode 100644 index 0000000..5aa89d8 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/nuscenes_dataset.yaml @@ -0,0 +1,80 @@ +DATASET: 'NuScenesDataset' +DATA_PATH: '../data/nuscenes' + +VERSION: 'v1.0-trainval' +MAX_SWEEPS: 10 +PRED_VELOCITY: True +SET_NAN_VELOCITY_TO_ZEROS: True +FILTER_MIN_POINTS_IN_GT: 1 + +DATA_SPLIT: { + 'train': train, + 'test': val +} + +INFO_PATH: { + 'train': [nuscenes_infos_10sweeps_train.pkl], + 'test': [nuscenes_infos_10sweeps_val.pkl], +} + +POINT_CLOUD_RANGE: [-51.2, -51.2, -5.0, 51.2, 51.2, 3.0] + +BALANCED_RESAMPLING: True + +DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + DB_INFO_PATH: + - nuscenes_dbinfos_10sweeps_withvelo.pkl + PREPARE: { + filter_by_min_points: [ + 'car:5','truck:5', 'construction_vehicle:5', 'bus:5', 'trailer:5', + 'barrier:5', 'motorcycle:5', 'bicycle:5', 'pedestrian:5', 'traffic_cone:5' + ], + } + + SAMPLE_GROUPS: [ + 'car:2','truck:3', 'construction_vehicle:7', 'bus:4', 'trailer:6', + 'barrier:2', 'motorcycle:6', 'bicycle:6', 'pedestrian:2', 'traffic_cone:2' + ] + + NUM_POINT_FEATURES: 5 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.3925, 0.3925] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + + +POINT_FEATURE_ENCODING: { + encoding_type: absolute_coordinates_encoding, + used_feature_list: ['x', 'y', 'z', 'intensity', 'timestamp'], + src_feature_list: ['x', 'y', 'z', 'intensity', 'timestamp'], +} + + +DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.1, 0.1, 0.2] + MAX_POINTS_PER_VOXEL: 10 + MAX_NUMBER_OF_VOXELS: { + 'train': 60000, + 'test': 60000 + } diff --git a/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/once_dataset.yaml b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/once_dataset.yaml new file mode 100644 index 0000000..abff159 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/once_dataset.yaml @@ -0,0 +1,67 @@ +DATASET: 'ONCEDataset' +DATA_PATH: '../data/once' +CLOUD_DATA_PATH: '/cache/once' + +POINT_CLOUD_RANGE: [-75.2, -75.2, -5.0, 75.2, 75.2, 3.0] + +INFO_PATH: { + 'train': [once_infos_train.pkl], + 'val': [once_infos_val.pkl], + 'test': [once_infos_test.pkl], +} + +DATA_SPLIT: { + 'train': train, + 'test': val +} + +DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: False + DB_INFO_PATH: + - once_dbinfos_train.pkl + PREPARE: { + filter_by_min_points: ['Car:5', 'Bus:5', 'Truck:5', 'Pedestrian:5', 'Cyclist:5'], + } + + SAMPLE_GROUPS: ['Car:1', 'Bus:4', 'Truck:3', 'Pedestrian:2', 'Cyclist:2'] + NUM_POINT_FEATURES: 4 + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + + +POINT_FEATURE_ENCODING: { + encoding_type: absolute_coordinates_encoding, + used_feature_list: ['x', 'y', 'z', 'intensity'], + src_feature_list: ['x', 'y', 'z', 'intensity'], +} + + +DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': False + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.1, 0.1, 0.2] + MAX_POINTS_PER_VOXEL: 5 + MAX_NUMBER_OF_VOXELS: { + 'train': 60000, + 'test': 60000 + } \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/pandaset_dataset.yaml b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/pandaset_dataset.yaml new file mode 100644 index 0000000..d2d8d4e --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/pandaset_dataset.yaml @@ -0,0 +1,110 @@ +DATASET: 'PandasetDataset' +DATA_PATH: '../data/pandaset' + +POINT_CLOUD_RANGE: [-70, -40, -3, 70, 40, 1] # xmin, ymin, zmin, xmax, ymax, zmax + +DATA_SPLIT: { + 'train': train, + 'test': val +} + +SEQUENCES: { + 'train': ['014', '050', '079', '048', '093', '091', '063', '104', '100', '092', '012', '047', '018', '006', '099', '085', '035', '041', '052', '105', '030', '113', '002', '084', '028', '119', '044', '005', '102', '034', '077', '064', '067', '058', '019', '015', '037', '095', '120', '066', '023', '071', '117', '098', '139', '038', '116', '046', '088', '089', '040', '033', '016', '024', '122', '039', '158', '069', '124', '123', '106'], # ~60% of the sequences, randomly chosen + 'val': ['045', '059', '055', '051', '020', '097', '073', '043', '003', '101', '027', '056', '011', '078', '080', '109', '042', '021', '094', '057'], # ~20% of the sequences, randomly chosen + 'test': ['074', '004', '086', '062', '068', '008', '001', '110', '053', '115', '054', '065', '017', '103', '072', '013', '029', '090', '112', '149', '070', '032'] # ~20% of the sequences, randomly chosen +} + +# Acquisition device to consider when loading the data +# Pandaset contains data from: +# - a pandar64 spinning lidar +# - a pandarGT forward facing lidar +# To use data from: +# - the pandar64 lidar only (default), set LIDAR_DEVICE to 0, +# - the pandarGT lidar onlu, set it to 1 +# - both devices, set it to -1 +LIDAR_DEVICE: 0 + + +INFO_PATH: { + 'train': [pandaset_infos_train.pkl], + 'test': [pandaset_infos_val.pkl], +} + +TRAINING_CATEGORIES: { +# This maps raw dataset categories with the corresponding categories used in training +# This map can be incomplete. In case a category is not present, the category +# for training is the same as the raw dataset category + 'Car': 'Car', + 'Pickup Truck': 'Car', + 'Medium-sized Truck': 'Truck', + 'Semi-truck': 'Truck', + 'Towed Object': 'Other Vehicle', + 'Motorcycle': 'Motorcycle', + 'Other Vehicle - Construction Vehicle': 'Other Vehicle', + 'Other Vehicle - Uncommon': 'Other Vehicle', + 'Other Vehicle - Pedicab': 'Other Vehicle', + 'Emergency Vehicle': 'Other Vehicle', + 'Bus': 'Bus', + 'Bicycle': 'Bicycle', + 'Pedestrian': 'Pedestrian', + 'Pedestrian with Object': 'Pedestrian', + 'Animals - Other': 'Animal' +} + + +FOV_POINTS_ONLY: False + + +DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: +# gt sampling not working at the moment + - NAME: gt_sampling + USE_ROAD_PLANE: False + DB_INFO_PATH: + - pandaset_dbinfos_train.pkl + PREPARE: { + filter_by_min_points: ['Car:5', 'Pedestrian:5', 'Bicycle:5'], + filter_by_difficulty: [-1], + } + + SAMPLE_GROUPS: ['Car:20','Pedestrian:15', 'Bicycle:15'] + NUM_POINT_FEATURES: 4 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-3.14159265, 3.114159265] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + + +POINT_FEATURE_ENCODING: { + encoding_type: absolute_coordinates_encoding, + used_feature_list: ['x', 'y', 'z', 'intensity'], + src_feature_list: ['x', 'y', 'z', 'intensity'], +} + + +DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': False + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.05, 0.05, 0.1] + MAX_POINTS_PER_VOXEL: 5 + MAX_NUMBER_OF_VOXELS: { + 'train': 16000, + 'test': 40000 + } diff --git a/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/waymo_dataset.yaml b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/waymo_dataset.yaml new file mode 100644 index 0000000..ba836e8 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/waymo_dataset.yaml @@ -0,0 +1,84 @@ +DATASET: 'WaymoDataset' +DATA_PATH: '../data/waymo' +PROCESSED_DATA_TAG: 'waymo_processed_data_v0_5_0' + +POINT_CLOUD_RANGE: [-75.2, -75.2, -2, 75.2, 75.2, 4] + +DATA_SPLIT: { + 'train': train, + 'test': val +} + +SAMPLED_INTERVAL: { + 'train': 5, + 'test': 1 +} + +FILTER_EMPTY_BOXES_FOR_TRAIN: True +DISABLE_NLZ_FLAG_ON_POINTS: True + +USE_SHARED_MEMORY: False # it will load the data to shared memory to speed up (DO NOT USE IT IF YOU DO NOT FULLY UNDERSTAND WHAT WILL HAPPEN) +SHARED_MEMORY_FILE_LIMIT: 35000 # set it based on the size of your shared memory + +DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: False + DB_INFO_PATH: + - waymo_processed_data_v0_5_0_waymo_dbinfos_train_sampled_1.pkl + + USE_SHARED_MEMORY: False # set it to True to speed up (it costs about 15GB shared memory) + DB_DATA_PATH: + - waymo_processed_data_v0_5_0_gt_database_train_sampled_1_global.npy + + BACKUP_DB_INFO: + # if the above DB_INFO cannot be found, will use this backup one + DB_INFO_PATH: waymo_processed_data_v0_5_0_waymo_dbinfos_train_sampled_1_multiframe_-4_to_0.pkl + DB_DATA_PATH: waymo_processed_data_v0_5_0_gt_database_train_sampled_1_multiframe_-4_to_0_global.npy + NUM_POINT_FEATURES: 6 + + PREPARE: { + filter_by_min_points: ['Vehicle:5', 'Pedestrian:5', 'Cyclist:5'], + filter_by_difficulty: [-1], + } + + SAMPLE_GROUPS: ['Vehicle:15', 'Pedestrian:10', 'Cyclist:10'] + NUM_POINT_FEATURES: 5 + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + + +POINT_FEATURE_ENCODING: { + encoding_type: absolute_coordinates_encoding, + used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation'], + src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation'], +} + + +DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.1, 0.1, 0.15] + MAX_POINTS_PER_VOXEL: 5 + MAX_NUMBER_OF_VOXELS: { + 'train': 150000, + 'test': 150000 + } diff --git a/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/waymo_dataset_multiframe.yaml b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/waymo_dataset_multiframe.yaml new file mode 100644 index 0000000..cbea4ad --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/dataset_configs/waymo_dataset_multiframe.yaml @@ -0,0 +1,89 @@ +DATASET: 'WaymoDataset' +DATA_PATH: '../data/waymo' +PROCESSED_DATA_TAG: 'waymo_processed_data_v0_5_0' + +POINT_CLOUD_RANGE: [-75.2, -75.2, -2, 75.2, 75.2, 4] + +DATA_SPLIT: { + 'train': train, + 'test': val +} + +SAMPLED_INTERVAL: { + 'train': 5, + 'test': 1 +} + +FILTER_EMPTY_BOXES_FOR_TRAIN: True +DISABLE_NLZ_FLAG_ON_POINTS: True + +USE_SHARED_MEMORY: False # it will load the data to shared memory to speed up (DO NOT USE IT IF YOU DO NOT FULLY UNDERSTAND WHAT WILL HAPPEN) +SHARED_MEMORY_FILE_LIMIT: 35000 # set it based on the size of your shared memory + +SEQUENCE_CONFIG: + ENABLED: True + SAMPLE_OFFSET: [-3, 0] + +TRAIN_WITH_SPEED: True + + +DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: False + DB_INFO_PATH: + - waymo_processed_data_v0_5_0_waymo_dbinfos_train_sampled_1_multiframe_-4_to_0.pkl + + USE_SHARED_MEMORY: False # set it to True to speed up (it costs about 50GB? shared memory) + DB_DATA_PATH: + - waymo_processed_data_v0_5_0_gt_database_train_sampled_1_multiframe_-4_to_0_global.npy + + PREPARE: { + filter_by_min_points: ['Vehicle:5', 'Pedestrian:5', 'Cyclist:5'], + filter_by_difficulty: [-1], + } + + SAMPLE_GROUPS: ['Vehicle:15', 'Pedestrian:10', 'Cyclist:10'] + NUM_POINT_FEATURES: 6 + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + FILTER_OBJ_POINTS_BY_TIMESTAMP: True + TIME_RANGE: [0.3, 0.0] # 0.3s-0.0s indicates 4 frames + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + + +POINT_FEATURE_ENCODING: { + encoding_type: absolute_coordinates_encoding, + used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'timestamp'], + src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'timestamp'], +} + + +DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + USE_CENTER_TO_FILTER: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.1, 0.1, 0.15] + MAX_POINTS_PER_VOXEL: 5 + MAX_NUMBER_OF_VOXELS: { + 'train': 180000, + 'test': 400000 + } diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/CaDDN.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/CaDDN.yaml new file mode 100644 index 0000000..a43c9cb --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/CaDDN.yaml @@ -0,0 +1,177 @@ +CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + POINT_CLOUD_RANGE: [2, -30.08, -3.0, 46.8, 30.08, 1.0] + GET_ITEM_LIST: ["images", "depth_maps", "calib_matricies", "gt_boxes2d"] + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: calculate_grid_size + VOXEL_SIZE: [0.16, 0.16, 0.16] + + - NAME: downsample_depth_map + DOWNSAMPLE_FACTOR: 4 + + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: random_image_flip + ALONG_AXIS_LIST: ['horizontal'] + +MODEL: + NAME: CaDDN + + VFE: + NAME: ImageVFE + FFN: + NAME: DepthFFN + DDN: + NAME: DDNDeepLabV3 + BACKBONE_NAME: ResNet101 + ARGS: { + "feat_extract_layer": "layer1", + "pretrained_path": "../checkpoints/deeplabv3_resnet101_coco-586e9e4e.pth" + } + CHANNEL_REDUCE: { + "in_channels": 256, + "out_channels": 64, + "kernel_size": 1, + "stride": 1, + "bias": False + } + DISCRETIZE: { + "mode": LID, + "num_bins": 80, + "depth_min": 2.0, + "depth_max": 46.8 + } + LOSS: + NAME: DDNLoss + ARGS: { + 'weight': 3.0, + 'alpha': 0.25, + 'gamma': 2.0, + 'fg_weight': 13, + 'bg_weight': 1 + } + F2V: + NAME: FrustumToVoxel + SAMPLER: { + "mode": "bilinear", + "padding_mode": "zeros" + } + + + MAP_TO_BEV: + NAME: Conv2DCollapse + NUM_BEV_FEATURES: 64 + ARGS: { + "kernel_size": 1, + "stride": 1, + "bias": False + } + + BACKBONE_2D: + NAME: BaseBEVBackbone + LAYER_NUMS: [10, 10, 10] + LAYER_STRIDES: [2, 2, 2] + NUM_FILTERS: [64, 128, 256] + UPSAMPLE_STRIDES: [1, 2, 4] + NUM_UPSAMPLE_FILTERS: [128, 128, 128] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[3.9, 1.6, 1.56]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.78], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.8, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[1.76, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.01 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.001 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/PartA2.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/PartA2.yaml new file mode 100644 index 0000000..45f3957 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/PartA2.yaml @@ -0,0 +1,191 @@ +CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + + +MODEL: + NAME: PartA2Net + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: UNetV2 + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[3.9, 1.6, 1.56]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.78], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.8, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.78], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[1.76, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.78], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POINT_HEAD: + NAME: PointIntraPartOffsetHead + CLS_FC: [] + PART_FC: [] + CLASS_AGNOSTIC: True + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + LOSS_CONFIG: + LOSS_REG: smooth-l1 + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + 'point_part_weight': 1.0 + } + + ROI_HEAD: + NAME: PartA2FCHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + + SEG_MASK_SCORE_THRESH: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 1024 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.7 + + ROI_AWARE_POOL: + POOL_SIZE: 12 + NUM_FEATURES: 128 + MAX_POINTS_PER_VOXEL: 128 + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.65 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.1 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/PartA2_free.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/PartA2_free.yaml new file mode 100644 index 0000000..38940db --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/PartA2_free.yaml @@ -0,0 +1,135 @@ +CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + + +MODEL: + NAME: PointRCNN + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: UNetV2 + RETURN_ENCODED_TENSOR: False + + POINT_HEAD: + NAME: PointIntraPartOffsetHead + CLS_FC: [128, 128] + PART_FC: [128, 128] + REG_FC: [128, 128] + CLASS_AGNOSTIC: False + USE_POINT_FEATURES_BEFORE_FUSION: False + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + BOX_CODER: PointResidualCoder + BOX_CODER_CONFIG: { + 'use_mean_size': True, + 'mean_size': [ + [3.9, 1.6, 1.56], + [0.8, 0.6, 1.73], + [1.76, 0.6, 1.73] + ] + } + + LOSS_CONFIG: + LOSS_REG: WeightedSmoothL1Loss + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + 'point_box_weight': 1.0, + 'point_part_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + ROI_HEAD: + NAME: PartA2FCHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + DISABLE_PART: True + SEG_MASK_SCORE_THRESH: 0.0 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.85 + + ROI_AWARE_POOL: + POOL_SIZE: 12 + NUM_FEATURES: 128 + MAX_POINTS_PER_VOXEL: 128 + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.65 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.1 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pillarnet.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pillarnet.yaml new file mode 100644 index 0000000..07ca6bf --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pillarnet.yaml @@ -0,0 +1,123 @@ +CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + + +MODEL: + NAME: PillarNet + + VFE: + NAME: DynamicPillarVFESimple2D + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_CLUSTER_XYZ: False + USE_NORM: True + NUM_FILTERS: [32] + + BACKBONE_3D: + NAME: PillarBackBone8x + + + BACKBONE_2D: + NAME: BaseBEVBackboneV1 + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [256, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [128, 128] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[3.9, 1.6, 1.56]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.78], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.8, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[1.76, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.01 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointpillar.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointpillar.yaml new file mode 100644 index 0000000..96fda96 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointpillar.yaml @@ -0,0 +1,164 @@ +CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + POINT_CLOUD_RANGE: [0, -39.68, -3, 69.12, 39.68, 1] + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': False + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.16, 0.16, 4] + MAX_POINTS_PER_VOXEL: 32 + MAX_NUMBER_OF_VOXELS: { + 'train': 16000, + 'test': 40000 + } + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: True + DB_INFO_PATH: + - kitti_dbinfos_train.pkl + PREPARE: { + filter_by_min_points: ['Car:5', 'Pedestrian:5', 'Cyclist:5'], + filter_by_difficulty: [-1], + } + + SAMPLE_GROUPS: ['Car:15','Pedestrian:15', 'Cyclist:15'] + NUM_POINT_FEATURES: 4 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: False + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + +MODEL: + NAME: PointPillar + + VFE: + NAME: PillarVFE + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_NORM: True + NUM_FILTERS: [64] + + MAP_TO_BEV: + NAME: PointPillarScatter + NUM_BEV_FEATURES: 64 + + BACKBONE_2D: + NAME: BaseBEVBackbone + LAYER_NUMS: [3, 5, 5] + LAYER_STRIDES: [2, 2, 2] + NUM_FILTERS: [64, 128, 256] + UPSAMPLE_STRIDES: [1, 2, 4] + NUM_UPSAMPLE_FILTERS: [128, 128, 128] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[3.9, 1.6, 1.56]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.78], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.8, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[1.76, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.01 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointpillar_newaugs.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointpillar_newaugs.yaml new file mode 100644 index 0000000..a2a6827 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointpillar_newaugs.yaml @@ -0,0 +1,185 @@ +CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + POINT_CLOUD_RANGE: [0, -39.68, -3, 69.12, 39.68, 1] + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': False + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.16, 0.16, 4] + MAX_POINTS_PER_VOXEL: 32 + MAX_NUMBER_OF_VOXELS: { + 'train': 16000, + 'test': 40000 + } + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['random_world_frustum_dropout', 'random_local_frustum_dropout', 'random_local_translation'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: False + DB_INFO_PATH: + - kitti_dbinfos_train.pkl + PREPARE: { + filter_by_min_points: ['Car:5', 'Pedestrian:5', 'Cyclist:5'], + filter_by_difficulty: [-1, 2], + } + + SAMPLE_GROUPS: ['Car:15','Pedestrian:15', 'Cyclist:15'] + NUM_POINT_FEATURES: 4 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: False + + - NAME: random_local_rotation + LOCAL_ROT_ANGLE: [-0.15707963267, 0.15707963267] + + - NAME: random_local_scaling + LOCAL_SCALE_RANGE: [0.95, 1.05] + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + + - NAME: random_world_translation + NOISE_TRANSLATE_STD: [0.5, 0.5, 0.5] + + - NAME: random_local_translation + LOCAL_TRANSLATION_RANGE: [0.95, 1.05] + ALONG_AXIS_LIST: ['x', 'y', 'z'] + + - NAME: random_world_frustum_dropout + INTENSITY_RANGE: [ 0, 0.2 ] + DIRECTION: ['top'] + + - NAME: random_local_frustum_dropout + INTENSITY_RANGE: [ 0, 0.2 ] + DIRECTION: ['top'] + +MODEL: + NAME: PointPillar + + VFE: + NAME: PillarVFE + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_NORM: True + NUM_FILTERS: [64] + + MAP_TO_BEV: + NAME: PointPillarScatter + NUM_BEV_FEATURES: 64 + + BACKBONE_2D: + NAME: BaseBEVBackbone + LAYER_NUMS: [3, 5, 5] + LAYER_STRIDES: [2, 2, 2] + NUM_FILTERS: [64, 128, 256] + UPSAMPLE_STRIDES: [1, 2, 4] + NUM_UPSAMPLE_FILTERS: [128, 128, 128] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[3.9, 1.6, 1.56]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.78], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.8, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[1.76, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.01 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointpillar_pyramid_aug.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointpillar_pyramid_aug.yaml new file mode 100644 index 0000000..bc6b2dc --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointpillar_pyramid_aug.yaml @@ -0,0 +1,170 @@ +CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + POINT_CLOUD_RANGE: [0, -39.68, -3, 69.12, 39.68, 1] + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': False + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.16, 0.16, 4] + MAX_POINTS_PER_VOXEL: 32 + MAX_NUMBER_OF_VOXELS: { + 'train': 16000, + 'test': 40000 + } + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: True + DB_INFO_PATH: + - kitti_dbinfos_train.pkl + PREPARE: { + filter_by_min_points: ['Car:5', 'Pedestrian:5', 'Cyclist:5'], + filter_by_difficulty: [-1], + } + + SAMPLE_GROUPS: ['Car:15','Pedestrian:15', 'Cyclist:15'] + NUM_POINT_FEATURES: 4 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: False + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + + - NAME: random_local_pyramid_aug + DROP_PROB: 0.25 + SPARSIFY_PROB: 0.05 + SPARSIFY_MAX_NUM: 50 + SWAP_PROB: 0.1 + SWAP_MAX_NUM: 50 +MODEL: + NAME: PointPillar + + VFE: + NAME: PillarVFE + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_NORM: True + NUM_FILTERS: [64] + + MAP_TO_BEV: + NAME: PointPillarScatter + NUM_BEV_FEATURES: 64 + + BACKBONE_2D: + NAME: BaseBEVBackbone + LAYER_NUMS: [3, 5, 5] + LAYER_STRIDES: [2, 2, 2] + NUM_FILTERS: [64, 128, 256] + UPSAMPLE_STRIDES: [1, 2, 4] + NUM_UPSAMPLE_FILTERS: [128, 128, 128] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[3.9, 1.6, 1.56]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.78], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.8, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[1.76, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.01 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointrcnn.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointrcnn.yaml new file mode 100644 index 0000000..c020915 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointrcnn.yaml @@ -0,0 +1,160 @@ +CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: sample_points + NUM_POINTS: { + 'train': 16384, + 'test': 16384 + } + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': False + } + +MODEL: + NAME: PointRCNN + + BACKBONE_3D: + NAME: PointNet2MSG + SA_CONFIG: + NPOINTS: [4096, 1024, 256, 64] + RADIUS: [[0.1, 0.5], [0.5, 1.0], [1.0, 2.0], [2.0, 4.0]] + NSAMPLE: [[16, 32], [16, 32], [16, 32], [16, 32]] + MLPS: [[[16, 16, 32], [32, 32, 64]], + [[64, 64, 128], [64, 96, 128]], + [[128, 196, 256], [128, 196, 256]], + [[256, 256, 512], [256, 384, 512]]] + FP_MLPS: [[128, 128], [256, 256], [512, 512], [512, 512]] + + POINT_HEAD: + NAME: PointHeadBox + CLS_FC: [256, 256] + REG_FC: [256, 256] + CLASS_AGNOSTIC: False + USE_POINT_FEATURES_BEFORE_FUSION: False + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + BOX_CODER: PointResidualCoder + BOX_CODER_CONFIG: { + 'use_mean_size': True, + 'mean_size': [ + [3.9, 1.6, 1.56], + [0.8, 0.6, 1.73], + [1.76, 0.6, 1.73] + ] + } + + LOSS_CONFIG: + LOSS_REG: WeightedSmoothL1Loss + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + 'point_box_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + ROI_HEAD: + NAME: PointRCNNHead + CLASS_AGNOSTIC: True + + ROI_POINT_POOL: + POOL_EXTRA_WIDTH: [0.0, 0.0, 0.0] + NUM_SAMPLED_POINTS: 512 + DEPTH_NORMALIZER: 70.0 + + XYZ_UP_LAYER: [128, 128] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.0 + USE_BN: False + + SA_CONFIG: + NPOINTS: [128, 32, -1] + RADIUS: [0.2, 0.4, 100] + NSAMPLE: [16, 16, 16] + MLPS: [[128, 128, 128], + [128, 128, 256], + [256, 256, 512]] + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.85 + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: cls + + CLS_FG_THRESH: 0.6 + CLS_BG_THRESH: 0.45 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.1 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointrcnn_iou.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointrcnn_iou.yaml new file mode 100644 index 0000000..8f04d3c --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pointrcnn_iou.yaml @@ -0,0 +1,160 @@ +CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: sample_points + NUM_POINTS: { + 'train': 16384, + 'test': 16384 + } + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': False + } + +MODEL: + NAME: PointRCNN + + BACKBONE_3D: + NAME: PointNet2MSG + SA_CONFIG: + NPOINTS: [4096, 1024, 256, 64] + RADIUS: [[0.1, 0.5], [0.5, 1.0], [1.0, 2.0], [2.0, 4.0]] + NSAMPLE: [[16, 32], [16, 32], [16, 32], [16, 32]] + MLPS: [[[16, 16, 32], [32, 32, 64]], + [[64, 64, 128], [64, 96, 128]], + [[128, 196, 256], [128, 196, 256]], + [[256, 256, 512], [256, 384, 512]]] + FP_MLPS: [[128, 128], [256, 256], [512, 512], [512, 512]] + + POINT_HEAD: + NAME: PointHeadBox + CLS_FC: [256, 256] + REG_FC: [256, 256] + CLASS_AGNOSTIC: False + USE_POINT_FEATURES_BEFORE_FUSION: False + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + BOX_CODER: PointResidualCoder + BOX_CODER_CONFIG: { + 'use_mean_size': True, + 'mean_size': [ + [3.9, 1.6, 1.56], + [0.8, 0.6, 1.73], + [1.76, 0.6, 1.73] + ] + } + + LOSS_CONFIG: + LOSS_REG: WeightedSmoothL1Loss + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + 'point_box_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + ROI_HEAD: + NAME: PointRCNNHead + CLASS_AGNOSTIC: True + + ROI_POINT_POOL: + POOL_EXTRA_WIDTH: [0.0, 0.0, 0.0] + NUM_SAMPLED_POINTS: 512 + DEPTH_NORMALIZER: 70.0 + + XYZ_UP_LAYER: [128, 128] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.0 + USE_BN: False + + SA_CONFIG: + NPOINTS: [128, 32, -1] + RADIUS: [0.2, 0.4, 100] + NSAMPLE: [16, 16, 16] + MLPS: [[128, 128, 128], + [128, 128, 256], + [256, 256, 512]] + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.85 + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.7 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.1 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 3 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pv_rcnn.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pv_rcnn.yaml new file mode 100644 index 0000000..8f52f3b --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pv_rcnn.yaml @@ -0,0 +1,249 @@ +CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: True + DB_INFO_PATH: + - kitti_dbinfos_train.pkl + PREPARE: { + filter_by_min_points: ['Car:5', 'Pedestrian:5', 'Cyclist:5'], + filter_by_difficulty: [-1], + } + + SAMPLE_GROUPS: ['Car:15','Pedestrian:10', 'Cyclist:10'] + NUM_POINT_FEATURES: 4 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: False + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + +MODEL: + NAME: PVRCNN + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[3.9, 1.6, 1.56]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.78], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.8, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[1.76, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + PFE: + NAME: VoxelSetAbstraction + POINT_SOURCE: raw_points + NUM_KEYPOINTS: 2048 + NUM_OUTPUT_FEATURES: 128 + SAMPLE_METHOD: FPS + + FEATURES_SOURCE: ['bev', 'x_conv1', 'x_conv2', 'x_conv3', 'x_conv4', 'raw_points'] + SA_LAYER: + raw_points: + MLPS: [[16, 16], [16, 16]] + POOL_RADIUS: [0.4, 0.8] + NSAMPLE: [16, 16] + x_conv1: + DOWNSAMPLE_FACTOR: 1 + MLPS: [[16, 16], [16, 16]] + POOL_RADIUS: [0.4, 0.8] + NSAMPLE: [16, 16] + x_conv2: + DOWNSAMPLE_FACTOR: 2 + MLPS: [[32, 32], [32, 32]] + POOL_RADIUS: [0.8, 1.2] + NSAMPLE: [16, 32] + x_conv3: + DOWNSAMPLE_FACTOR: 4 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [1.2, 2.4] + NSAMPLE: [16, 32] + x_conv4: + DOWNSAMPLE_FACTOR: 8 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [2.4, 4.8] + NSAMPLE: [16, 32] + + POINT_HEAD: + NAME: PointHeadSimple + CLS_FC: [256, 256] + CLASS_AGNOSTIC: True + USE_POINT_FEATURES_BEFORE_FUSION: True + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + LOSS_CONFIG: + LOSS_REG: smooth-l1 + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + } + + ROI_HEAD: + NAME: PVRCNNHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 1024 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.7 + + ROI_GRID_POOL: + GRID_SIZE: 6 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [0.8, 1.6] + NSAMPLE: [16, 16] + POOL_METHOD: max_pool + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.1 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pv_rcnn_plusplus_reproduced_by_community.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pv_rcnn_plusplus_reproduced_by_community.yaml new file mode 100644 index 0000000..c1b5509 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/pv_rcnn_plusplus_reproduced_by_community.yaml @@ -0,0 +1,301 @@ +CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: True + DB_INFO_PATH: + - kitti_dbinfos_train.pkl + PREPARE: { + filter_by_min_points: ['Car:5', 'Pedestrian:5', 'Cyclist:5'], + filter_by_difficulty: [-1], + } + + SAMPLE_GROUPS: ['Car:15','Pedestrian:10', 'Cyclist:10'] + NUM_POINT_FEATURES: 4 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: False + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + +MODEL: + NAME: PVRCNNPlusPlus + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + [ 'Car', 'Pedestrian', 'Cyclist' ] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: [ 'center', 'center_z', 'dim', 'rot' ] + HEAD_DICT: { + 'center': { 'out_channels': 2, 'num_conv': 2 }, + 'center_z': { 'out_channels': 1, 'num_conv': 2 }, + 'dim': { 'out_channels': 3, 'num_conv': 2 }, + 'rot': { 'out_channels': 2, 'num_conv': 2 }, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] + } + + POST_PROCESSING: + SCORE_THRESH: 0.01 + POST_CENTER_LIMIT_RANGE: [ -75.2, -75.2, -2, 75.2, 75.2, 4 ] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + PFE: + NAME: VoxelSetAbstraction + POINT_SOURCE: raw_points + NUM_KEYPOINTS: 4096 + NUM_OUTPUT_FEATURES: 90 + SAMPLE_METHOD: SPC + SPC_SAMPLING: + NUM_SECTORS: 6 + SAMPLE_RADIUS_WITH_ROI: 1.6 + + FEATURES_SOURCE: ['bev', 'x_conv3', 'x_conv4', 'raw_points'] + SA_LAYER: + raw_points: + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: local_interpolation + NUM_REDUCED_CHANNELS: 1 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [ 32 ] + FILTER_NEIGHBOR_WITH_ROI: True + RADIUS_OF_NEIGHBOR_WITH_ROI: 2.4 + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [ 2, 2, 2 ] + MAX_NEIGHBOR_DISTANCE: 0.2 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 32, 32 ] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 0.4 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 32, 32 ] + + x_conv3: + DOWNSAMPLE_FACTOR: 4 + INPUT_CHANNELS: 64 + + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: local_interpolation + NUM_REDUCED_CHANNELS: 32 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [128] + FILTER_NEIGHBOR_WITH_ROI: True + RADIUS_OF_NEIGHBOR_WITH_ROI: 4.0 + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [3, 3, 3] + MAX_NEIGHBOR_DISTANCE: 1.2 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [64, 64] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 2.4 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 64, 64 ] + + x_conv4: + DOWNSAMPLE_FACTOR: 8 + INPUT_CHANNELS: 64 + + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: local_interpolation + NUM_REDUCED_CHANNELS: 32 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [ 128 ] + FILTER_NEIGHBOR_WITH_ROI: True + RADIUS_OF_NEIGHBOR_WITH_ROI: 6.4 + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 2.4 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 64, 64 ] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 4.8 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 64, 64 ] + + + POINT_HEAD: + NAME: PointHeadSimple + CLS_FC: [256, 256] + CLASS_AGNOSTIC: True + USE_POINT_FEATURES_BEFORE_FUSION: True + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + LOSS_CONFIG: + LOSS_REG: smooth-l1 + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + } + + ROI_HEAD: + NAME: PVRCNNHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 1024 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.7 + SCORE_THRESH: 0.1 + +# NMS_PRE_MAXSIZE: 4096 +# NMS_POST_MAXSIZE: 500 +# NMS_THRESH: 0.85 + + + ROI_GRID_POOL: + GRID_SIZE: 6 + + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: voxel_random_choice + NUM_REDUCED_CHANNELS: 30 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [ 128 ] + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 0.8 + NEIGHBOR_NSAMPLE: 32 + POST_MLPS: [ 64, 64 ] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 1.6 + NEIGHBOR_NSAMPLE: 32 + POST_MLPS: [ 64, 64 ] + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 140 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.001 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/second.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/second.yaml new file mode 100644 index 0000000..54dce2c --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/second.yaml @@ -0,0 +1,121 @@ +CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + + +MODEL: + NAME: SECONDNet + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[3.9, 1.6, 1.56]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.78], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.8, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[1.76, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.01 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/second_iou.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/second_iou.yaml new file mode 100644 index 0000000..dec8377 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/second_iou.yaml @@ -0,0 +1,171 @@ +CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + + +MODEL: + NAME: SECONDNetIoU + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[3.9, 1.6, 1.56]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.78], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.8, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[1.76, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + ROI_HEAD: + NAME: SECONDHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256] + IOU_FC: [256, 256] + DP_RATIO: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 1024 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.7 + + ROI_GRID_POOL: + GRID_SIZE: 7 + IN_CHANNEL: 512 + DOWNSAMPLE_RATIO: 8 + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + IOU_LOSS: BinaryCrossEntropy + LOSS_WEIGHTS: { + 'rcnn_iou_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.01 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/second_multihead.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/second_multihead.yaml new file mode 100644 index 0000000..93d27f9 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/second_multihead.yaml @@ -0,0 +1,137 @@ +CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + + +MODEL: + NAME: SECONDNet + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadMulti + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + USE_MULTIHEAD: True + SEPARATE_MULTIHEAD: True + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[3.9, 1.6, 1.56]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.6], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.8, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.6], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[1.76, 0.6, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.6], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + SHARED_CONV_NUM_FILTER: 64 + + RPN_HEAD_CFGS: [ + { + 'HEAD_CLS_NAME': ['Car'], + }, + { + 'HEAD_CLS_NAME': ['Pedestrian'], + }, + { + 'HEAD_CLS_NAME': ['Cyclist'], + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + MULTI_CLASSES_NMS: True + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: True + NMS_TYPE: nms_gpu + NMS_THRESH: 0.1 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/voxel_rcnn_car.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/voxel_rcnn_car.yaml new file mode 100644 index 0000000..a44436e --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/voxel_rcnn_car.yaml @@ -0,0 +1,202 @@ +CLASS_NAMES: ['Car'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: True + DB_INFO_PATH: + - kitti_dbinfos_train.pkl + PREPARE: { + filter_by_min_points: ['Car:5'], + filter_by_difficulty: [-1], + } + + SAMPLE_GROUPS: ['Car:15'] + NUM_POINT_FEATURES: 4 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: False + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + +MODEL: + NAME: VoxelRCNN + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [64, 128] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [128, 128] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[3.9, 1.6, 1.56]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.78], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + ROI_HEAD: + NAME: VoxelRCNNHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + USE_FAST_NMS: False + SCORE_THRESH: 0.0 + NMS_PRE_MAXSIZE: 2048 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.7 + + ROI_GRID_POOL: + FEATURES_SOURCE: ['x_conv2', 'x_conv3', 'x_conv4'] + PRE_MLP: True + GRID_SIZE: 6 + POOL_LAYERS: + x_conv2: + MLPS: [[32, 32]] + QUERY_RANGES: [[4, 4, 4]] + POOL_RADIUS: [0.4] + NSAMPLE: [16] + POOL_METHOD: max_pool + x_conv3: + MLPS: [[32, 32]] + QUERY_RANGES: [[4, 4, 4]] + POOL_RADIUS: [0.8] + NSAMPLE: [16] + POOL_METHOD: max_pool + x_conv4: + MLPS: [[32, 32]] + QUERY_RANGES: [[4, 4, 4]] + POOL_RADIUS: [1.6] + NSAMPLE: [16] + POOL_METHOD: max_pool + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + GRID_3D_IOU_LOSS: False + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'rcnn_iou3d_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.3 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.1 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/voxel_rcnn_car_focal_multimodal.yaml b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/voxel_rcnn_car_focal_multimodal.yaml new file mode 100644 index 0000000..1917852 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/kitti_models/voxel_rcnn_car_focal_multimodal.yaml @@ -0,0 +1,209 @@ +CLASS_NAMES: ['Car'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/kitti_dataset.yaml + GET_ITEM_LIST: ["images", "points", "calib_matricies", "gt_boxes2d"] + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + + # AUG_WITH_IMAGE: True # use PC-Image Aug + IMG_AUG_TYPE: kitti + + USE_ROAD_PLANE: True + DB_INFO_PATH: + - kitti_dbinfos_train.pkl + PREPARE: { + filter_by_min_points: ['Car:5'], + filter_by_difficulty: [-1], + } + + SAMPLE_GROUPS: ['Car:15'] + NUM_POINT_FEATURES: 4 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: False + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + +MODEL: + NAME: VoxelRCNN + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8xFocal + USE_IMG: True + IMG_PRETRAIN: "../checkpoints/deeplabv3_resnet50_coco-cd0a2569.pth" + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [64, 128] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [128, 128] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[3.9, 1.6, 1.56]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.78], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + ROI_HEAD: + NAME: VoxelRCNNHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + USE_FAST_NMS: False + SCORE_THRESH: 0.0 + NMS_PRE_MAXSIZE: 2048 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.7 + + ROI_GRID_POOL: + FEATURES_SOURCE: ['x_conv2', 'x_conv3', 'x_conv4'] + PRE_MLP: True + GRID_SIZE: 6 + POOL_LAYERS: + x_conv2: + MLPS: [[32, 32]] + QUERY_RANGES: [[4, 4, 4]] + POOL_RADIUS: [0.4] + NSAMPLE: [16] + POOL_METHOD: max_pool + x_conv3: + MLPS: [[32, 32]] + QUERY_RANGES: [[4, 4, 4]] + POOL_RADIUS: [0.8] + NSAMPLE: [16] + POOL_METHOD: max_pool + x_conv4: + MLPS: [[32, 32]] + QUERY_RANGES: [[4, 4, 4]] + POOL_RADIUS: [1.6] + NSAMPLE: [16] + POOL_METHOD: max_pool + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + GRID_3D_IOU_LOSS: False + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'rcnn_iou3d_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.3 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.1 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/lyft_models/cbgs_second-nores_multihead.yaml b/waypoint_control/OpenPCDet/tools/cfgs/lyft_models/cbgs_second-nores_multihead.yaml new file mode 100644 index 0000000..ec51906 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/lyft_models/cbgs_second-nores_multihead.yaml @@ -0,0 +1,215 @@ +CLASS_NAMES: ['car','truck', 'bus', 'emergency_vehicle', 'other_vehicle', + 'motorcycle', 'bicycle', 'pedestrian', 'animal'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/lyft_dataset.yaml + + +MODEL: + NAME: SECONDNet + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadMulti + CLASS_AGNOSTIC: False + + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + USE_MULTIHEAD: True + SEPARATE_MULTIHEAD: True + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': car, + 'anchor_sizes': [[4.75, 1.92, 1.71]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.07], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': truck, + 'anchor_sizes': [[10.24, 2.84, 3.44]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.30], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': bus, + 'anchor_sizes': [[12.70, 2.92, 3.42]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.35], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': emergency_vehicle, + 'anchor_sizes': [[6.52, 2.42, 2.34]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.89], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': other_vehicle, + 'anchor_sizes': [[8.17, 2.75, 3.20]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.63], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': motorcycle, + 'anchor_sizes': [[2.35, 0.96, 1.59]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.32], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.3 + }, + { + 'class_name': bicycle, + 'anchor_sizes': [[1.76, 0.63, 1.44]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.07], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': pedestrian, + 'anchor_sizes': [[0.80, 0.76, 1.76]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.91], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': animal, + 'anchor_sizes': [[0.73, 0.35, 0.5]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.80], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.45, + 'unmatched_threshold': 0.3 + }, + ] + + SHARED_CONV_NUM_FILTER: 64 + RPN_HEAD_CFGS: [ + { + 'HEAD_CLS_NAME': ['car'], + }, + { + 'HEAD_CLS_NAME': ['truck', 'bus'], + }, + { + 'HEAD_CLS_NAME': ['emergency_vehicle', 'other_vehicle'], + }, + { + 'HEAD_CLS_NAME': ['motorcycle', 'bicycle'], + }, + { + 'HEAD_CLS_NAME': ['pedestrian', 'animal'], + }, + ] + + SEPARATE_REG_CONFIG: + NUM_MIDDLE_CONV: 1 + NUM_MIDDLE_FILTER: 64 + REG_LIST: ['reg:2', 'height:1', 'size:3', 'angle:2'] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + BOX_CODER_CONFIG: { + 'code_size': 7, + 'encode_angle_by_sincos': True + } + + + LOSS_CONFIG: + REG_LOSS_TYPE: WeightedL1Loss + LOSS_WEIGHTS: { + 'pos_cls_weight': 1.0, + 'neg_cls_weight': 2.0, + 'cls_weight': 1.0, + 'loc_weight': 0.25, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: lyft + + NMS_CONFIG: + MULTI_CLASSES_NMS: True + NMS_TYPE: nms_gpu + NMS_THRESH: 0.2 + NMS_PRE_MAXSIZE: 1000 + NMS_POST_MAXSIZE: 83 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 3 + NUM_EPOCHS: 50 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/lyft_models/cbgs_second_multihead.yaml b/waypoint_control/OpenPCDet/tools/cfgs/lyft_models/cbgs_second_multihead.yaml new file mode 100644 index 0000000..f7a1c7a --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/lyft_models/cbgs_second_multihead.yaml @@ -0,0 +1,215 @@ +CLASS_NAMES: ['car','truck', 'bus', 'emergency_vehicle', 'other_vehicle', + 'motorcycle', 'bicycle', 'pedestrian', 'animal'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/lyft_dataset.yaml + + +MODEL: + NAME: SECONDNet + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadMulti + CLASS_AGNOSTIC: False + + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + USE_MULTIHEAD: True + SEPARATE_MULTIHEAD: True + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': car, + 'anchor_sizes': [[4.75, 1.92, 1.71]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.07], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': truck, + 'anchor_sizes': [[10.24, 2.84, 3.44]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.30], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': bus, + 'anchor_sizes': [[12.70, 2.92, 3.42]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.35], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': emergency_vehicle, + 'anchor_sizes': [[6.52, 2.42, 2.34]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.89], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': other_vehicle, + 'anchor_sizes': [[8.17, 2.75, 3.20]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.63], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': motorcycle, + 'anchor_sizes': [[2.35, 0.96, 1.59]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.32], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.3 + }, + { + 'class_name': bicycle, + 'anchor_sizes': [[1.76, 0.63, 1.44]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.07], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': pedestrian, + 'anchor_sizes': [[0.80, 0.76, 1.76]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.91], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': animal, + 'anchor_sizes': [[0.73, 0.35, 0.5]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.80], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.45, + 'unmatched_threshold': 0.3 + }, + ] + + SHARED_CONV_NUM_FILTER: 64 + RPN_HEAD_CFGS: [ + { + 'HEAD_CLS_NAME': ['car'], + }, + { + 'HEAD_CLS_NAME': ['truck', 'bus'], + }, + { + 'HEAD_CLS_NAME': ['emergency_vehicle', 'other_vehicle'], + }, + { + 'HEAD_CLS_NAME': ['motorcycle', 'bicycle'], + }, + { + 'HEAD_CLS_NAME': ['pedestrian', 'animal'], + }, + ] + + SEPARATE_REG_CONFIG: + NUM_MIDDLE_CONV: 1 + NUM_MIDDLE_FILTER: 64 + REG_LIST: ['reg:2', 'height:1', 'size:3', 'angle:2'] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + BOX_CODER_CONFIG: { + 'code_size': 7, + 'encode_angle_by_sincos': True + } + + + LOSS_CONFIG: + REG_LOSS_TYPE: WeightedL1Loss + LOSS_WEIGHTS: { + 'pos_cls_weight': 1.0, + 'neg_cls_weight': 2.0, + 'cls_weight': 1.0, + 'loc_weight': 0.25, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: lyft + + NMS_CONFIG: + MULTI_CLASSES_NMS: True + NMS_TYPE: nms_gpu + NMS_THRESH: 0.2 + NMS_PRE_MAXSIZE: 1000 + NMS_POST_MAXSIZE: 83 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 3 + NUM_EPOCHS: 50 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/bevfusion.yaml b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/bevfusion.yaml new file mode 100644 index 0000000..b84cfd9 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/bevfusion.yaml @@ -0,0 +1,208 @@ +CLASS_NAMES: ['car','truck', 'construction_vehicle', 'bus', 'trailer', + 'barrier', 'motorcycle', 'bicycle', 'pedestrian', 'traffic_cone'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/nuscenes_dataset.yaml + POINT_CLOUD_RANGE: [-54.0, -54.0, -5.0, 54.0, 54.0, 3.0] + CAMERA_CONFIG: + USE_CAMERA: True + IMAGE: + FINAL_DIM: [256,704] + RESIZE_LIM_TRAIN: [0.38, 0.55] + RESIZE_LIM_TEST: [0.48, 0.48] + + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.9, 1.1] + + - NAME: random_world_translation + NOISE_TRANSLATE_STD: [0.5, 0.5, 0.5] + + - NAME: imgaug + ROT_LIM: [-5.4, 5.4] + RAND_FLIP: True + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.075, 0.075, 0.2] + MAX_POINTS_PER_VOXEL: 10 + MAX_NUMBER_OF_VOXELS: { + 'train': 120000, + 'test': 160000 + } + + - NAME: image_calibrate + + - NAME: image_normalize + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + + +MODEL: + NAME: BevFusion + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8x + USE_BIAS: False + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + IMAGE_BACKBONE: + NAME: SwinTransformer + EMBED_DIMS: 96 + DEPTHS: [2, 2, 6, 2] + NUM_HEADS: [3, 6, 12, 24] + WINDOW_SIZE: 7 + MLP_RATIO: 4 + DROP_RATE: 0. + ATTN_DROP_RATE: 0. + DROP_PATH_RATE: 0.2 + PATCH_NORM: True + OUT_INDICES: [1, 2, 3] + WITH_CP: False + CONVERT_WEIGHTS: True + INIT_CFG: + type: Pretrained + checkpoint: swint-nuimages-pretrained.pth + + NECK: + NAME: GeneralizedLSSFPN + IN_CHANNELS: [192, 384, 768] + OUT_CHANNELS: 256 + START_LEVEL: 0 + END_LEVEL: -1 + NUM_OUTS: 3 + + VTRANSFORM: + NAME: DepthLSSTransform + IMAGE_SIZE: [256, 704] + IN_CHANNEL: 256 + OUT_CHANNEL: 80 + FEATURE_SIZE: [32, 88] + XBOUND: [-54.0, 54.0, 0.3] + YBOUND: [-54.0, 54.0, 0.3] + ZBOUND: [-10.0, 10.0, 20.0] + DBOUND: [1.0, 60.0, 0.5] + DOWNSAMPLE: 2 + + FUSER: + NAME: ConvFuser + IN_CHANNEL: 336 + OUT_CHANNEL: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + USE_CONV_FOR_NO_STRIDE: True + + + DENSE_HEAD: + CLASS_AGNOSTIC: False + NAME: TransFusionHead + + USE_BIAS_BEFORE_NORM: False + + NUM_PROPOSALS: 200 + HIDDEN_CHANNEL: 128 + NUM_CLASSES: 10 + NUM_HEADS: 8 + NMS_KERNEL_SIZE: 3 + FFN_CHANNEL: 256 + DROPOUT: 0.1 + BN_MOMENTUM: 0.1 + ACTIVATION: relu + + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'height', 'dim', 'rot', 'vel'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'height': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'vel': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + DATASET: nuScenes + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + HUNGARIAN_ASSIGNER: + cls_cost: {'gamma': 2.0, 'alpha': 0.25, 'weight': 0.15} + reg_cost: {'weight': 0.25} + iou_cost: {'weight': 0.25} + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'bbox_weight': 0.25, + 'hm_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2] + } + LOSS_CLS: + use_sigmoid: True + gamma: 2.0 + alpha: 0.25 + + POST_PROCESSING: + SCORE_THRESH: 0.0 + POST_CENTER_RANGE: [-61.2, -61.2, -10.0, 61.2, 61.2, 10.0] + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 3 + NUM_EPOCHS: 6 + + OPTIMIZER: adam_cosineanneal + LR: 0.0001 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + BETAS: [0.9, 0.999] + + MOMS: [0.9, 0.8052631] + PCT_START: 0.4 + WARMUP_ITER: 500 + + DECAY_STEP_LIST: [35, 45] + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 35 + + LOSS_SCALE_FP16: 32 + \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_dyn_pp_centerpoint.yaml b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_dyn_pp_centerpoint.yaml new file mode 100644 index 0000000..51d6c7b --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_dyn_pp_centerpoint.yaml @@ -0,0 +1,117 @@ +CLASS_NAMES: ['car','truck', 'construction_vehicle', 'bus', 'trailer', + 'barrier', 'motorcycle', 'bicycle', 'pedestrian', 'traffic_cone'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/nuscenes_dataset.yaml + + POINT_CLOUD_RANGE: [-51.2, -51.2, -5.0, 51.2, 51.2, 3.0] + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels_placeholder + VOXEL_SIZE: [0.2, 0.2, 8.0] + +MODEL: + NAME: CenterPoint + + VFE: + NAME: DynPillarVFE + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_NORM: True + NUM_FILTERS: [ 64, 64 ] + + MAP_TO_BEV: + NAME: PointPillarScatter + NUM_BEV_FEATURES: 64 + + BACKBONE_2D: + NAME: BaseBEVBackbone + LAYER_NUMS: [3, 5, 5] + LAYER_STRIDES: [2, 2, 2] + NUM_FILTERS: [64, 128, 256] + UPSAMPLE_STRIDES: [0.5, 1, 2] + NUM_UPSAMPLE_FILTERS: [128, 128, 128] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['car'], + ['truck', 'construction_vehicle'], + ['bus', 'trailer'], + ['barrier'], + ['motorcycle', 'bicycle'], + ['pedestrian', 'traffic_cone'], + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot', 'vel'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'vel': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 4 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 0.25, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-61.2, -61.2, -10.0, 61.2, 61.2, 10.0] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.2 + NMS_PRE_MAXSIZE: 1000 + NMS_POST_MAXSIZE: 83 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: kitti + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 20 + + OPTIMIZER: adam_onecycle + LR: 0.001 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_pillar0075_res2d_centerpoint.yaml b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_pillar0075_res2d_centerpoint.yaml new file mode 100644 index 0000000..f2ee824 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_pillar0075_res2d_centerpoint.yaml @@ -0,0 +1,161 @@ +CLASS_NAMES: ['car','truck', 'construction_vehicle', 'bus', 'trailer', + 'barrier', 'motorcycle', 'bicycle', 'pedestrian', 'traffic_cone'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/nuscenes_dataset.yaml + POINT_CLOUD_RANGE: [-54.0, -54.0, -5.0, 54.0, 54.0, 3.0] + + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + DB_INFO_PATH: + - nuscenes_dbinfos_10sweeps_withvelo.pkl + PREPARE: { + filter_by_min_points: [ + 'car:5','truck:5', 'construction_vehicle:5', 'bus:5', 'trailer:5', + 'barrier:5', 'motorcycle:5', 'bicycle:5', 'pedestrian:5', 'traffic_cone:5' + ], + } + + SAMPLE_GROUPS: [ + 'car:2','truck:3', 'construction_vehicle:7', 'bus:4', 'trailer:6', + 'barrier:2', 'motorcycle:6', 'bicycle:6', 'pedestrian:2', 'traffic_cone:2' + ] + + NUM_POINT_FEATURES: 5 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.9, 1.1] + + - NAME: random_world_translation + NOISE_TRANSLATE_STD: [0.5, 0.5, 0.5] + + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.075, 0.075, 0.2] + MAX_POINTS_PER_VOXEL: 10 + MAX_NUMBER_OF_VOXELS: { + 'train': 120000, + 'test': 160000 + } + + +MODEL: + NAME: PillarNet + + VFE: + NAME: DynamicPillarVFESimple2D + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_CLUSTER_XYZ: False + USE_NORM: True + NUM_FILTERS: [ 32 ] + + BACKBONE_3D: + NAME: PillarRes18BackBone8x + + BACKBONE_2D: + NAME: BaseBEVBackboneV1 + + LAYER_NUMS: [ 5, 5 ] + LAYER_STRIDES: [ 1, 2 ] + NUM_FILTERS: [ 256, 256 ] + UPSAMPLE_STRIDES: [ 1, 2 ] + NUM_UPSAMPLE_FILTERS: [ 128, 128 ] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['car'], + ['truck', 'construction_vehicle'], + ['bus', 'trailer'], + ['barrier'], + ['motorcycle', 'bicycle'], + ['pedestrian', 'traffic_cone'], + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot', 'vel'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'vel': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 0.25, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-61.2, -61.2, -10.0, 61.2, 61.2, 10.0] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.2 + NMS_PRE_MAXSIZE: 1000 + NMS_POST_MAXSIZE: 83 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: kitti + + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 20 + + OPTIMIZER: adam_onecycle + LR: 0.001 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_pp_multihead.yaml b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_pp_multihead.yaml new file mode 100644 index 0000000..60e782d --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_pp_multihead.yaml @@ -0,0 +1,246 @@ +CLASS_NAMES: ['car','truck', 'construction_vehicle', 'bus', 'trailer', + 'barrier', 'motorcycle', 'bicycle', 'pedestrian', 'traffic_cone'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/nuscenes_dataset.yaml + + POINT_CLOUD_RANGE: [-51.2, -51.2, -5.0, 51.2, 51.2, 3.0] + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.2, 0.2, 8.0] + MAX_POINTS_PER_VOXEL: 20 + MAX_NUMBER_OF_VOXELS: { + 'train': 30000, + 'test': 30000 + } + +MODEL: + NAME: PointPillar + + VFE: + NAME: PillarVFE + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_NORM: True + NUM_FILTERS: [64] + + MAP_TO_BEV: + NAME: PointPillarScatter + NUM_BEV_FEATURES: 64 + + BACKBONE_2D: + NAME: BaseBEVBackbone + LAYER_NUMS: [3, 5, 5] + LAYER_STRIDES: [2, 2, 2] + NUM_FILTERS: [64, 128, 256] + UPSAMPLE_STRIDES: [0.5, 1, 2] + NUM_UPSAMPLE_FILTERS: [128, 128, 128] + + DENSE_HEAD: + NAME: AnchorHeadMulti + CLASS_AGNOSTIC: False + + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + USE_MULTIHEAD: True + SEPARATE_MULTIHEAD: True + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': car, + 'anchor_sizes': [[4.63, 1.97, 1.74]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.95], + 'align_center': False, + 'feature_map_stride': 4, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': truck, + 'anchor_sizes': [[6.93, 2.51, 2.84]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 4, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': construction_vehicle, + 'anchor_sizes': [[6.37, 2.85, 3.19]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.225], + 'align_center': False, + 'feature_map_stride': 4, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': bus, + 'anchor_sizes': [[10.5, 2.94, 3.47]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.085], + 'align_center': False, + 'feature_map_stride': 4, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': trailer, + 'anchor_sizes': [[12.29, 2.90, 3.87]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0.115], + 'align_center': False, + 'feature_map_stride': 4, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': barrier, + 'anchor_sizes': [[0.50, 2.53, 0.98]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.33], + 'align_center': False, + 'feature_map_stride': 4, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': motorcycle, + 'anchor_sizes': [[2.11, 0.77, 1.47]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.085], + 'align_center': False, + 'feature_map_stride': 4, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.3 + }, + { + 'class_name': bicycle, + 'anchor_sizes': [[1.70, 0.60, 1.28]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.18], + 'align_center': False, + 'feature_map_stride': 4, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': pedestrian, + 'anchor_sizes': [[0.73, 0.67, 1.77]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.935], + 'align_center': False, + 'feature_map_stride': 4, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': traffic_cone, + 'anchor_sizes': [[0.41, 0.41, 1.07]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.285], + 'align_center': False, + 'feature_map_stride': 4, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.4 + }, + ] + + SHARED_CONV_NUM_FILTER: 64 + + RPN_HEAD_CFGS: [ + { + 'HEAD_CLS_NAME': ['car'], + }, + { + 'HEAD_CLS_NAME': ['truck', 'construction_vehicle'], + }, + { + 'HEAD_CLS_NAME': ['bus', 'trailer'], + }, + { + 'HEAD_CLS_NAME': ['barrier'], + }, + { + 'HEAD_CLS_NAME': ['motorcycle', 'bicycle'], + }, + { + 'HEAD_CLS_NAME': ['pedestrian', 'traffic_cone'], + }, + ] + SEPARATE_REG_CONFIG: + NUM_MIDDLE_CONV: 1 + NUM_MIDDLE_FILTER: 64 + REG_LIST: ['reg:2', 'height:1', 'size:3', 'angle:2', 'velo:2'] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + BOX_CODER_CONFIG: { + 'code_size': 9, + 'encode_angle_by_sincos': True + } + + + LOSS_CONFIG: + REG_LOSS_TYPE: WeightedL1Loss + LOSS_WEIGHTS: { + 'pos_cls_weight': 1.0, + 'neg_cls_weight': 2.0, + 'cls_weight': 1.0, + 'loc_weight': 0.25, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: True + NMS_TYPE: nms_gpu + NMS_THRESH: 0.2 + NMS_PRE_MAXSIZE: 1000 + NMS_POST_MAXSIZE: 83 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 20 + + OPTIMIZER: adam_onecycle + LR: 0.001 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_second_multihead.yaml b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_second_multihead.yaml new file mode 100644 index 0000000..19eb118 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_second_multihead.yaml @@ -0,0 +1,228 @@ +CLASS_NAMES: ['car','truck', 'construction_vehicle', 'bus', 'trailer', + 'barrier', 'motorcycle', 'bicycle', 'pedestrian', 'traffic_cone'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/nuscenes_dataset.yaml + + +MODEL: + NAME: SECONDNet + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadMulti + CLASS_AGNOSTIC: False + + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + USE_MULTIHEAD: True + SEPARATE_MULTIHEAD: True + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': car, + 'anchor_sizes': [[4.63, 1.97, 1.74]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.95], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': truck, + 'anchor_sizes': [[6.93, 2.51, 2.84]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.6], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': construction_vehicle, + 'anchor_sizes': [[6.37, 2.85, 3.19]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.225], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': bus, + 'anchor_sizes': [[10.5, 2.94, 3.47]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.085], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': trailer, + 'anchor_sizes': [[12.29, 2.90, 3.87]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0.115], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': barrier, + 'anchor_sizes': [[0.50, 2.53, 0.98]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.33], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': motorcycle, + 'anchor_sizes': [[2.11, 0.77, 1.47]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.085], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.3 + }, + { + 'class_name': bicycle, + 'anchor_sizes': [[1.70, 0.60, 1.28]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.18], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': pedestrian, + 'anchor_sizes': [[0.73, 0.67, 1.77]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-0.935], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': traffic_cone, + 'anchor_sizes': [[0.41, 0.41, 1.07]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.285], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.4 + }, + ] + + SHARED_CONV_NUM_FILTER: 64 + RPN_HEAD_CFGS: [ + { + 'HEAD_CLS_NAME': ['car'], + }, + { + 'HEAD_CLS_NAME': ['truck', 'construction_vehicle'], + }, + { + 'HEAD_CLS_NAME': ['bus', 'trailer'], + }, + { + 'HEAD_CLS_NAME': ['barrier'], + }, + { + 'HEAD_CLS_NAME': ['motorcycle', 'bicycle'], + }, + { + 'HEAD_CLS_NAME': ['pedestrian', 'traffic_cone'], + }, + ] + + SEPARATE_REG_CONFIG: + NUM_MIDDLE_CONV: 1 + NUM_MIDDLE_FILTER: 64 + REG_LIST: ['reg:2', 'height:1', 'size:3', 'angle:2', 'velo:2'] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + BOX_CODER_CONFIG: { + 'code_size': 9, + 'encode_angle_by_sincos': True + } + + + LOSS_CONFIG: + REG_LOSS_TYPE: WeightedL1Loss + LOSS_WEIGHTS: { + 'pos_cls_weight': 1.0, + 'neg_cls_weight': 2.0, + 'cls_weight': 1.0, + 'loc_weight': 0.25, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: kitti + + NMS_CONFIG: + MULTI_CLASSES_NMS: True + NMS_TYPE: nms_gpu + NMS_THRESH: 0.2 + NMS_PRE_MAXSIZE: 1000 + NMS_POST_MAXSIZE: 83 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 20 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel0075_res3d_centerpoint.yaml b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel0075_res3d_centerpoint.yaml new file mode 100644 index 0000000..73450bf --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel0075_res3d_centerpoint.yaml @@ -0,0 +1,160 @@ +CLASS_NAMES: ['car','truck', 'construction_vehicle', 'bus', 'trailer', + 'barrier', 'motorcycle', 'bicycle', 'pedestrian', 'traffic_cone'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/nuscenes_dataset.yaml + POINT_CLOUD_RANGE: [-54.0, -54.0, -5.0, 54.0, 54.0, 3.0] + + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + DB_INFO_PATH: + - nuscenes_dbinfos_10sweeps_withvelo.pkl + PREPARE: { + filter_by_min_points: [ + 'car:5','truck:5', 'construction_vehicle:5', 'bus:5', 'trailer:5', + 'barrier:5', 'motorcycle:5', 'bicycle:5', 'pedestrian:5', 'traffic_cone:5' + ], + } + + SAMPLE_GROUPS: [ + 'car:2','truck:3', 'construction_vehicle:7', 'bus:4', 'trailer:6', + 'barrier:2', 'motorcycle:6', 'bicycle:6', 'pedestrian:2', 'traffic_cone:2' + ] + + NUM_POINT_FEATURES: 5 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.9, 1.1] + + - NAME: random_world_translation + NOISE_TRANSLATE_STD: [0.5, 0.5, 0.5] + + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.075, 0.075, 0.2] + MAX_POINTS_PER_VOXEL: 10 + MAX_NUMBER_OF_VOXELS: { + 'train': 120000, + 'test': 160000 + } + + +MODEL: + NAME: CenterPoint + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['car'], + ['truck', 'construction_vehicle'], + ['bus', 'trailer'], + ['barrier'], + ['motorcycle', 'bicycle'], + ['pedestrian', 'traffic_cone'], + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot', 'vel'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'vel': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 0.25, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-61.2, -61.2, -10.0, 61.2, 61.2, 10.0] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.2 + NMS_PRE_MAXSIZE: 1000 + NMS_POST_MAXSIZE: 83 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: kitti + + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 20 + + OPTIMIZER: adam_onecycle + LR: 0.001 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel0075_voxelnext.yaml b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel0075_voxelnext.yaml new file mode 100644 index 0000000..ce1129b --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel0075_voxelnext.yaml @@ -0,0 +1,156 @@ +CLASS_NAMES: ['car','truck', 'construction_vehicle', 'bus', 'trailer', + 'barrier', 'motorcycle', 'bicycle', 'pedestrian', 'traffic_cone'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/nuscenes_dataset.yaml + POINT_CLOUD_RANGE: [-54.0, -54.0, -5.0, 54.0, 54.0, 3.0] + INFO_PATH: { + 'train': [nuscenes_infos_10sweeps_train.pkl], + 'test': [nuscenes_infos_10sweeps_val.pkl], + } + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + DB_INFO_PATH: + - nuscenes_dbinfos_10sweeps_withvelo.pkl + USE_SHARED_MEMORY: False #True # set it to True to speed up (it costs about 15GB shared memory) + DB_DATA_PATH: + - nuscenes_dbinfos_10sweeps_withvelo_global.pkl.npy + PREPARE: { + filter_by_min_points: [ + 'car:5','truck:5', 'construction_vehicle:5', 'bus:5', 'trailer:5', + 'barrier:5', 'motorcycle:5', 'bicycle:5', 'pedestrian:5', 'traffic_cone:5' + ], + } + + SAMPLE_GROUPS: [ + 'car:2','truck:2', 'construction_vehicle:2', 'bus:2', 'trailer:2', + 'barrier:2', 'motorcycle:2', 'bicycle:2', 'pedestrian:2', 'traffic_cone:2' + ] + + NUM_POINT_FEATURES: 5 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.9, 1.1] + + - NAME: random_world_translation + NOISE_TRANSLATE_STD: [0.5, 0.5, 0.5] + + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.075, 0.075, 0.2] + MAX_POINTS_PER_VOXEL: 10 + MAX_NUMBER_OF_VOXELS: { + 'train': 120000, + 'test': 160000 + } + + +MODEL: + NAME: VoxelNeXt + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8xVoxelNeXt + + DENSE_HEAD: + NAME: VoxelNeXtHead + CLASS_AGNOSTIC: False + INPUT_FEATURES: 128 + + CLASS_NAMES_EACH_HEAD: [ + ['car'], + ['truck', 'construction_vehicle'], + ['bus', 'trailer'], + ['barrier'], + ['motorcycle', 'bicycle'], + ['pedestrian', 'traffic_cone'], + ] + + SHARED_CONV_CHANNEL: 128 + KERNEL_SIZE_HEAD: 1 + + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot', 'vel'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'vel': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 0.25, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-61.2, -61.2, -10.0, 61.2, 61.2, 10.0] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.2 + NMS_PRE_MAXSIZE: 1000 + NMS_POST_MAXSIZE: 83 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: kitti + + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 20 + + OPTIMIZER: adam_onecycle + LR: 0.001 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel0075_voxelnext_doubleflip.yaml b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel0075_voxelnext_doubleflip.yaml new file mode 100644 index 0000000..26a2ebe --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel0075_voxelnext_doubleflip.yaml @@ -0,0 +1,158 @@ +CLASS_NAMES: ['car','truck', 'construction_vehicle', 'bus', 'trailer', + 'barrier', 'motorcycle', 'bicycle', 'pedestrian', 'traffic_cone'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/nuscenes_dataset.yaml + POINT_CLOUD_RANGE: [-54.0, -54.0, -5.0, 54.0, 54.0, 3.0] + INFO_PATH: { + 'train': [nuscenes_infos_10sweeps_train.pkl], + 'test': [nuscenes_infos_10sweeps_val.pkl], + } + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + DB_INFO_PATH: + - nuscenes_dbinfos_10sweeps_withvelo.pkl + USE_SHARED_MEMORY: True #True # set it to True to speed up (it costs about 15GB shared memory) + DB_DATA_PATH: + - nuscenes_dbinfos_10sweeps_withvelo_global.pkl.npy + PREPARE: { + filter_by_min_points: [ + 'car:5','truck:5', 'construction_vehicle:5', 'bus:5', 'trailer:5', + 'barrier:5', 'motorcycle:5', 'bicycle:5', 'pedestrian:5', 'traffic_cone:5' + ], + } + + SAMPLE_GROUPS: [ + 'car:2','truck:2', 'construction_vehicle:2', 'bus:2', 'trailer:2', + 'barrier:2', 'motorcycle:2', 'bicycle:2', 'pedestrian:2', 'traffic_cone:2' + ] + + NUM_POINT_FEATURES: 5 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.9, 1.1] + + - NAME: random_world_translation + NOISE_TRANSLATE_STD: [0.5, 0.5, 0.5] + + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.075, 0.075, 0.2] + MAX_POINTS_PER_VOXEL: 10 + MAX_NUMBER_OF_VOXELS: { + 'train': 120000, + 'test': 160000 + } + DOUBLE_FLIP: True + + +MODEL: + NAME: VoxelNeXt + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8xVoxelNeXt + + DENSE_HEAD: + NAME: VoxelNeXtHead + CLASS_AGNOSTIC: False + INPUT_FEATURES: 128 + DOUBLE_FLIP: True + + CLASS_NAMES_EACH_HEAD: [ + ['car'], + ['truck', 'construction_vehicle'], + ['bus', 'trailer'], + ['barrier'], + ['motorcycle', 'bicycle'], + ['pedestrian', 'traffic_cone'], + ] + + SHARED_CONV_CHANNEL: 128 + KERNEL_SIZE_HEAD: 1 + + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot', 'vel'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'vel': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 0.25, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-61.2, -61.2, -10.0, 61.2, 61.2, 10.0] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.2 + NMS_PRE_MAXSIZE: 1000 + NMS_POST_MAXSIZE: 83 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: kitti + + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 1 #4 + NUM_EPOCHS: 20 + + OPTIMIZER: adam_onecycle + LR: 0.001 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel01_res3d_centerpoint.yaml b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel01_res3d_centerpoint.yaml new file mode 100644 index 0000000..153a5d2 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_voxel01_res3d_centerpoint.yaml @@ -0,0 +1,104 @@ +CLASS_NAMES: ['car','truck', 'construction_vehicle', 'bus', 'trailer', + 'barrier', 'motorcycle', 'bicycle', 'pedestrian', 'traffic_cone'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/nuscenes_dataset.yaml + +MODEL: + NAME: CenterPoint + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['car'], + ['truck', 'construction_vehicle'], + ['bus', 'trailer'], + ['barrier'], + ['motorcycle', 'bicycle'], + ['pedestrian', 'traffic_cone'], + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot', 'vel'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'vel': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 0.25, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-61.2, -61.2, -10.0, 61.2, 61.2, 10.0] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.2 + NMS_PRE_MAXSIZE: 1000 + NMS_POST_MAXSIZE: 83 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: kitti + + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 30 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/transfusion_lidar.yaml b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/transfusion_lidar.yaml new file mode 100644 index 0000000..bc5c91d --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/nuscenes_models/transfusion_lidar.yaml @@ -0,0 +1,171 @@ +CLASS_NAMES: ['car','truck', 'construction_vehicle', 'bus', 'trailer', + 'barrier', 'motorcycle', 'bicycle', 'pedestrian', 'traffic_cone'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/nuscenes_dataset.yaml + POINT_CLOUD_RANGE: [-54.0, -54.0, -5.0, 54.0, 54.0, 3.0] + + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + DB_INFO_PATH: + - nuscenes_dbinfos_10sweeps_withvelo.pkl + PREPARE: { + filter_by_min_points: [ + 'car:5','truck:5', 'construction_vehicle:5', 'bus:5', 'trailer:5', + 'barrier:5', 'motorcycle:5', 'bicycle:5', 'pedestrian:5', 'traffic_cone:5' + ], + } + + SAMPLE_GROUPS: [ + 'car:2','truck:3', 'construction_vehicle:7', 'bus:4', 'trailer:6', + 'barrier:2', 'motorcycle:6', 'bicycle:6', 'pedestrian:2', 'traffic_cone:2' + ] + + NUM_POINT_FEATURES: 5 + DATABASE_WITH_FAKELIDAR: False + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.9, 1.1] + + - NAME: random_world_translation + NOISE_TRANSLATE_STD: [0.5, 0.5, 0.5] + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.075, 0.075, 0.2] + MAX_POINTS_PER_VOXEL: 10 + MAX_NUMBER_OF_VOXELS: { + 'train': 120000, + 'test': 160000 + } + +MODEL: + NAME: TransFusion + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8x + USE_BIAS: False + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + USE_CONV_FOR_NO_STRIDE: True + + + DENSE_HEAD: + CLASS_AGNOSTIC: False + NAME: TransFusionHead + + USE_BIAS_BEFORE_NORM: False + + NUM_PROPOSALS: 200 + HIDDEN_CHANNEL: 128 + NUM_CLASSES: 10 + NUM_HEADS: 8 + NMS_KERNEL_SIZE: 3 + FFN_CHANNEL: 256 + DROPOUT: 0.1 + BN_MOMENTUM: 0.1 + ACTIVATION: relu + + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'height', 'dim', 'rot', 'vel'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'height': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'vel': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + DATASET: nuScenes + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + HUNGARIAN_ASSIGNER: + cls_cost: {'gamma': 2.0, 'alpha': 0.25, 'weight': 0.15} + reg_cost: {'weight': 0.25} + iou_cost: {'weight': 0.25} + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'bbox_weight': 0.25, + 'hm_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2] + } + LOSS_CLS: + use_sigmoid: True + gamma: 2.0 + alpha: 0.25 + + POST_PROCESSING: + SCORE_THRESH: 0.0 + POST_CENTER_RANGE: [-61.2, -61.2, -10.0, 61.2, 61.2, 10.0] + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + EVAL_METRIC: kitti + + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 20 + + OPTIMIZER: adam_onecycle + LR: 0.001 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + BETAS: [0.9, 0.999] + + MOMS: [0.9, 0.8052631] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 35 + +HOOK: + DisableAugmentationHook: + DISABLE_AUG_LIST: ['gt_sampling'] + NUM_LAST_EPOCHS: 5 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/once_models/centerpoint.yaml b/waypoint_control/OpenPCDet/tools/cfgs/once_models/centerpoint.yaml new file mode 100644 index 0000000..57e89dc --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/once_models/centerpoint.yaml @@ -0,0 +1,100 @@ +CLASS_NAMES: ['Car', 'Bus', 'Truck', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/once_dataset.yaml + +MODEL: + NAME: CenterPoint + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['Car', 'Bus', 'Truck', 'Pedestrian', 'Cyclist'] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True # TODO + NUM_HM_CONV: 2 # TODO + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + DENSE_REG: 1 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-75.2, -75.2, -5.0, 75.2, 75.2, 3.0] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.01 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: once + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 35 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/once_models/pointpillar.yaml b/waypoint_control/OpenPCDet/tools/cfgs/once_models/pointpillar.yaml new file mode 100644 index 0000000..775ae64 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/once_models/pointpillar.yaml @@ -0,0 +1,148 @@ +CLASS_NAMES: ['Car', 'Bus', 'Truck', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/once_dataset.yaml + DATA_PROCESSOR: + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.2, 0.2, 8] + MAX_POINTS_PER_VOXEL: 16 + MAX_NUMBER_OF_VOXELS: { + 'train': 60000, + 'test': 60000 + } + +MODEL: + NAME: PointPillar + + VFE: + NAME: PillarVFE + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_NORM: True + NUM_FILTERS: [64] + + MAP_TO_BEV: + NAME: PointPillarScatter + NUM_BEV_FEATURES: 64 + + BACKBONE_2D: + NAME: BaseBEVBackbone + LAYER_NUMS: [3, 5, 5] + LAYER_STRIDES: [2, 2, 2] + NUM_FILTERS: [64, 128, 256] + UPSAMPLE_STRIDES: [1, 2, 4] + NUM_UPSAMPLE_FILTERS: [128, 128, 128] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[4.38, 1.87, 1.59]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.71], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': 'Bus', + 'anchor_sizes': [[11.11, 2.88, 3.41]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.74], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': 'Truck', + 'anchor_sizes': [[7.52, 2.50, 2.62]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.55], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.75, 0.76, 1.69]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.62], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.3, + 'unmatched_threshold': 0.15 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[2.18, 0.79, 1.43]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.65], + 'align_center': False, + 'feature_map_stride': 2, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: once + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.01 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/once_models/pointrcnn.yaml b/waypoint_control/OpenPCDet/tools/cfgs/once_models/pointrcnn.yaml new file mode 100644 index 0000000..28f8650 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/once_models/pointrcnn.yaml @@ -0,0 +1,162 @@ +CLASS_NAMES: ['Car', 'Bus', 'Truck', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/once_dataset.yaml + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: sample_points + NUM_POINTS: { + 'train': 60000, + 'test': 60000 + } + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': False + } + +MODEL: + NAME: PointRCNN + + BACKBONE_3D: + NAME: PointNet2MSG + SA_CONFIG: + NPOINTS: [32000, 4000, 500, 256] + RADIUS: [[0.2, 1.0], [1.0, 2.0], [2.0, 4.0], [4.0, 8.0]] + NSAMPLE: [[16, 32], [16, 32], [16, 32], [16, 32]] + MLPS: [[[16, 16, 32], [32, 32, 64]], + [[64, 64, 128], [64, 96, 128]], + [[128, 196, 256], [128, 196, 256]], + [[256, 256, 512], [256, 384, 512]]] + FP_MLPS: [[128, 128], [256, 256], [512, 512], [512, 512]] + + POINT_HEAD: + NAME: PointHeadBox + CLS_FC: [256, 256] + REG_FC: [256, 256] + CLASS_AGNOSTIC: False + USE_POINT_FEATURES_BEFORE_FUSION: False + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + BOX_CODER: PointResidualCoder + BOX_CODER_CONFIG: { + 'use_mean_size': True, + 'mean_size': [ + [4.38, 1.87, 1.59], + [11.11, 2.88, 3.41], + [7.52, 2.50, 2.62], + [0.70, 0.66, 1.69], + [2.18, 0.79, 1.43] + ] + } + + LOSS_CONFIG: + LOSS_REG: WeightedSmoothL1Loss + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + 'point_box_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + ROI_HEAD: + NAME: PointRCNNHead + CLASS_AGNOSTIC: True + + ROI_POINT_POOL: + POOL_EXTRA_WIDTH: [0.0, 0.0, 0.0] + NUM_SAMPLED_POINTS: 512 + DEPTH_NORMALIZER: 150.4 + + XYZ_UP_LAYER: [128, 128] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.0 + USE_BN: False + + SA_CONFIG: + NPOINTS: [128, 32, -1] + RADIUS: [0.2, 0.4, 100] + NSAMPLE: [16, 16, 16] + MLPS: [[128, 128, 128], + [128, 128, 256], + [256, 256, 512]] + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.85 + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: cls + + CLS_FG_THRESH: 0.6 + CLS_BG_THRESH: 0.45 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: once + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.01 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/once_models/pv_rcnn.yaml b/waypoint_control/OpenPCDet/tools/cfgs/once_models/pv_rcnn.yaml new file mode 100644 index 0000000..5af94b6 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/once_models/pv_rcnn.yaml @@ -0,0 +1,243 @@ +CLASS_NAMES: ['Car', 'Bus', 'Truck', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/once_dataset.yaml + +MODEL: + NAME: PVRCNN + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[4.38, 1.87, 1.59]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.71], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': 'Bus', + 'anchor_sizes': [[11.11, 2.88, 3.41]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.74], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': 'Truck', + 'anchor_sizes': [[7.52, 2.50, 2.62]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.55], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.75, 0.76, 1.69]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.62], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.3, + 'unmatched_threshold': 0.15 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[2.18, 0.79, 1.43]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.65], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + PFE: + NAME: VoxelSetAbstraction + POINT_SOURCE: raw_points + NUM_KEYPOINTS: 4096 + NUM_OUTPUT_FEATURES: 128 + SAMPLE_METHOD: FPS + + FEATURES_SOURCE: ['bev', 'x_conv3', 'x_conv4', 'raw_points'] + SA_LAYER: + raw_points: + MLPS: [[16, 16], [16, 16]] + POOL_RADIUS: [0.4, 0.8] + NSAMPLE: [16, 16] + x_conv1: + DOWNSAMPLE_FACTOR: 1 + MLPS: [[16, 16], [16, 16]] + POOL_RADIUS: [0.4, 0.8] + NSAMPLE: [16, 16] + x_conv2: + DOWNSAMPLE_FACTOR: 2 + MLPS: [[32, 32], [32, 32]] + POOL_RADIUS: [0.8, 1.2] + NSAMPLE: [16, 32] + x_conv3: + DOWNSAMPLE_FACTOR: 4 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [1.2, 2.4] + NSAMPLE: [16, 32] + x_conv4: + DOWNSAMPLE_FACTOR: 8 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [2.4, 4.8] + NSAMPLE: [16, 32] + + POINT_HEAD: + NAME: PointHeadSimple + CLS_FC: [256, 256] + CLASS_AGNOSTIC: True + USE_POINT_FEATURES_BEFORE_FUSION: True + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + LOSS_CONFIG: + LOSS_REG: smooth-l1 + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + } + + ROI_HEAD: + NAME: PVRCNNHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 1024 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.7 + + ROI_GRID_POOL: + GRID_SIZE: 6 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [0.8, 1.6] + NSAMPLE: [16, 16] + POOL_METHOD: max_pool + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: once + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.01 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/once_models/second.yaml b/waypoint_control/OpenPCDet/tools/cfgs/once_models/second.yaml new file mode 100644 index 0000000..b2a17cb --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/once_models/second.yaml @@ -0,0 +1,141 @@ +CLASS_NAMES: ['Car', 'Bus', 'Truck', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/once_dataset.yaml + + +MODEL: + NAME: SECONDNet + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Car', + 'anchor_sizes': [[4.38, 1.87, 1.59]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.71], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.6, + 'unmatched_threshold': 0.45 + }, + { + 'class_name': 'Bus', + 'anchor_sizes': [[11.11, 2.88, 3.41]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.74], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': 'Truck', + 'anchor_sizes': [[7.52, 2.50, 2.62]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.55], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.75, 0.76, 1.69]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.62], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.3, + 'unmatched_threshold': 0.15 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[2.18, 0.79, 1.43]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [-1.65], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: once + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.01 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 80 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/PartA2.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/PartA2.yaml new file mode 100644 index 0000000..f24331d --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/PartA2.yaml @@ -0,0 +1,194 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + + +MODEL: + NAME: PartA2Net + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: UNetV2 + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Vehicle', + 'anchor_sizes': [[4.7, 2.1, 1.7]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.91, 0.86, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[1.78, 0.84, 1.78]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POINT_HEAD: + NAME: PointIntraPartOffsetHead + CLS_FC: [] + PART_FC: [] + CLASS_AGNOSTIC: True + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + LOSS_CONFIG: + LOSS_REG: smooth-l1 + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + 'point_part_weight': 1.0 + } + + ROI_HEAD: + NAME: PartA2FCHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + + SEG_MASK_SCORE_THRESH: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False +# NMS_PRE_MAXSIZE: 1024 +# NMS_POST_MAXSIZE: 100 +# NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 300 + NMS_THRESH: 0.85 + + ROI_AWARE_POOL: + POOL_SIZE: 10 + NUM_FEATURES: 128 + MAX_POINTS_PER_VOXEL: 128 + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.65 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: waymo + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 30 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint.yaml new file mode 100644 index 0000000..23850f2 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint.yaml @@ -0,0 +1,96 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + +MODEL: + NAME: CenterPoint + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['Vehicle', 'Pedestrian', 'Cyclist'] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-75.2, -75.2, -2, 75.2, 75.2, 4] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: waymo + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 30 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_4frames.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_4frames.yaml new file mode 100644 index 0000000..412161a --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_4frames.yaml @@ -0,0 +1,102 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset_multiframe.yaml + + SAMPLED_INTERVAL: { + 'train': 1, + 'test': 1 + } + +MODEL: + NAME: CenterPoint + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['Vehicle', 'Pedestrian', 'Cyclist'] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot', 'vel'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'vel': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-75.2, -75.2, -2, 75.2, 75.2, 4] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: waymo + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 36 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_dyn_pillar_1x.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_dyn_pillar_1x.yaml new file mode 100644 index 0000000..5744c12 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_dyn_pillar_1x.yaml @@ -0,0 +1,110 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + + POINT_CLOUD_RANGE: [-74.88, -74.88, -2, 74.88, 74.88, 4.0] + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels_placeholder + VOXEL_SIZE: [ 0.32, 0.32, 6.0 ] + +MODEL: + NAME: CenterPoint + + VFE: + NAME: DynPillarVFE + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_NORM: True + NUM_FILTERS: [ 64, 64 ] + + MAP_TO_BEV: + NAME: PointPillarScatter + NUM_BEV_FEATURES: 64 + + BACKBONE_2D: + NAME: BaseBEVBackbone + LAYER_NUMS: [ 3, 5, 5 ] + LAYER_STRIDES: [ 1, 2, 2 ] + NUM_FILTERS: [ 64, 128, 256 ] + UPSAMPLE_STRIDES: [ 1, 2, 4 ] + NUM_UPSAMPLE_FILTERS: [ 128, 128, 128 ] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['Vehicle', 'Pedestrian', 'Cyclist'] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 1 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-80, -80, -10.0, 80, 80, 10.0] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: waymo + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 30 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_pillar_1x.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_pillar_1x.yaml new file mode 100644 index 0000000..8a2e049 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_pillar_1x.yaml @@ -0,0 +1,116 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + + POINT_CLOUD_RANGE: [-74.88, -74.88, -2, 74.88, 74.88, 4.0] + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [ 0.32, 0.32, 6.0 ] + MAX_POINTS_PER_VOXEL: 20 + MAX_NUMBER_OF_VOXELS: { + 'train': 150000, + 'test': 150000 + } + + +MODEL: + NAME: CenterPoint + + VFE: + NAME: PillarVFE + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_NORM: True + NUM_FILTERS: [ 64, 64 ] + + MAP_TO_BEV: + NAME: PointPillarScatter + NUM_BEV_FEATURES: 64 + + BACKBONE_2D: + NAME: BaseBEVBackbone + LAYER_NUMS: [ 3, 5, 5 ] + LAYER_STRIDES: [ 1, 2, 2 ] + NUM_FILTERS: [ 64, 128, 256 ] + UPSAMPLE_STRIDES: [ 1, 2, 4 ] + NUM_UPSAMPLE_FILTERS: [ 128, 128, 128 ] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['Vehicle', 'Pedestrian', 'Cyclist'] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 1 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-80, -80, -10.0, 80, 80, 10.0] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: waymo + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 6 + NUM_EPOCHS: 30 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_without_resnet.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_without_resnet.yaml new file mode 100644 index 0000000..bb68379 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/centerpoint_without_resnet.yaml @@ -0,0 +1,96 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + +MODEL: + NAME: CenterPoint + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['Vehicle', 'Pedestrian', 'Cyclist'] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-75.2, -75.2, -2, 75.2, 75.2, 4] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: waymo + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 30 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/dsvt_pillar.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/dsvt_pillar.yaml new file mode 100644 index 0000000..242675e --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/dsvt_pillar.yaml @@ -0,0 +1,190 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + SAMPLED_INTERVAL: {'train': 1, 'test': 1} + POINT_CLOUD_RANGE: [-74.88, -74.88, -2, 74.88, 74.88, 4.0] + POINTS_TANH_DIM: [3, 4] + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: False + DB_INFO_PATH: + - waymo_processed_data_v0_5_0_waymo_dbinfos_train_sampled_1.pkl + + USE_SHARED_MEMORY: True # set it to True to speed up (it costs about 15GB shared memory) + DB_DATA_PATH: + - waymo_processed_data_v0_5_0_gt_database_train_sampled_1_global.npy + + BACKUP_DB_INFO: + # if the above DB_INFO cannot be found, will use this backup one + DB_INFO_PATH: waymo_processed_data_v0_5_0_waymo_dbinfos_train_sampled_1_multiframe_-4_to_0.pkl + DB_DATA_PATH: waymo_processed_data_v0_5_0_gt_database_train_sampled_1_multiframe_-4_to_0_global.npy + NUM_POINT_FEATURES: 6 + + PREPARE: { + filter_by_min_points: ['Vehicle:5', 'Pedestrian:10', 'Cyclist:10'], + filter_by_difficulty: [-1], + } + + SAMPLE_GROUPS: ['Vehicle:15', 'Pedestrian:10', 'Cyclist:10'] + NUM_POINT_FEATURES: 5 + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + + - NAME: random_world_translation + NOISE_TRANSLATE_STD: [0.5, 0.5, 0.5] + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels_placeholder + VOXEL_SIZE: [ 0.32, 0.32, 6] + +MODEL: + NAME: CenterPoint + + VFE: + NAME: DynamicVoxelVFE + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_NORM: True + NUM_FILTERS: [ 192, 192 ] + + BACKBONE_3D: + NAME: DSVT + INPUT_LAYER: + sparse_shape: [468, 468, 1] + downsample_stride: [] + d_model: [192] + set_info: [[36, 4]] + window_shape: [[12, 12, 1]] + hybrid_factor: [2, 2, 1] # x, y, z + shifts_list: [[[0, 0, 0], [6, 6, 0]]] + normalize_pos: False + + block_name: ['DSVTBlock'] + set_info: [[36, 4]] + d_model: [192] + nhead: [8] + dim_feedforward: [384] + dropout: 0.0 + activation: gelu + output_shape: [468, 468] + conv_out_channel: 192 + # You can enable torch.utils.checkpoint to save GPU memory + USE_CHECKPOINT: True + + MAP_TO_BEV: + NAME: PointPillarScatter3d + INPUT_SHAPE: [468, 468, 1] + NUM_BEV_FEATURES: 192 + + BACKBONE_2D: + NAME: BaseBEVResBackbone + LAYER_NUMS: [ 1, 2, 2 ] + LAYER_STRIDES: [ 1, 2, 2 ] + NUM_FILTERS: [ 128, 128, 256 ] + UPSAMPLE_STRIDES: [ 1, 2, 4 ] + NUM_UPSAMPLE_FILTERS: [ 128, 128, 128 ] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['Vehicle', 'Pedestrian', 'Cyclist'] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: False + NUM_HM_CONV: 2 + + BN_EPS: 0.001 + BN_MOM: 0.01 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'iou': {'out_channels': 1, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 1 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + IOU_REG_LOSS: True + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-80, -80, -10.0, 80, 80, 10.0] + MAX_OBJ_PER_SAMPLE: 500 + USE_IOU_TO_RECTIFY_SCORE: True + IOU_RECTIFIER: [0.68, 0.71, 0.65] + + NMS_CONFIG: + NMS_TYPE: class_specific_nms + NMS_THRESH: [0.75, 0.6, 0.55] + NMS_PRE_MAXSIZE: [4096, 4096, 4096] + NMS_POST_MAXSIZE: [500, 500, 500] + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + EVAL_METRIC: waymo + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 3 + NUM_EPOCHS: 24 + + OPTIMIZER: adam_onecycle + LR: 0.003 # + WEIGHT_DECAY: 0.05 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.1 + DIV_FACTOR: 100 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 + LOSS_SCALE_FP16: 32.0 + +HOOK: + DisableAugmentationHook: + DISABLE_AUG_LIST: ['gt_sampling','random_world_flip','random_world_rotation','random_world_scaling', 'random_world_translation'] + NUM_LAST_EPOCHS: 1 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/dsvt_voxel.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/dsvt_voxel.yaml new file mode 100644 index 0000000..57b6b93 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/dsvt_voxel.yaml @@ -0,0 +1,192 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + SAMPLED_INTERVAL: {'train': 1, 'test': 1} + POINT_CLOUD_RANGE: [-74.88, -74.88, -2, 74.88, 74.88, 4.0] + POINTS_TANH_DIM: [3, 4] + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: False + DB_INFO_PATH: + - waymo_processed_data_v0_5_0_waymo_dbinfos_train_sampled_1.pkl + + USE_SHARED_MEMORY: True # set it to True to speed up (it costs about 15GB shared memory) + DB_DATA_PATH: + - waymo_processed_data_v0_5_0_gt_database_train_sampled_1_global.npy + + BACKUP_DB_INFO: + # if the above DB_INFO cannot be found, will use this backup one + DB_INFO_PATH: waymo_processed_data_v0_5_0_waymo_dbinfos_train_sampled_1_multiframe_-4_to_0.pkl + DB_DATA_PATH: waymo_processed_data_v0_5_0_gt_database_train_sampled_1_multiframe_-4_to_0_global.npy + NUM_POINT_FEATURES: 6 + + PREPARE: { + filter_by_min_points: ['Vehicle:5', 'Pedestrian:10', 'Cyclist:10'], + filter_by_difficulty: [-1], + } + + SAMPLE_GROUPS: ['Vehicle:15', 'Pedestrian:10', 'Cyclist:10'] + NUM_POINT_FEATURES: 5 + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + + - NAME: random_world_translation + NOISE_TRANSLATE_STD: [0.5, 0.5, 0.5] + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels_placeholder + VOXEL_SIZE: [ 0.32, 0.32, 0.1875] + +MODEL: + NAME: CenterPoint + + VFE: + NAME: DynamicVoxelVFE + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_NORM: True + NUM_FILTERS: [ 192, 192 ] + + BACKBONE_3D: + NAME: DSVT + INPUT_LAYER: + sparse_shape: [468, 468, 32] + downsample_stride: [[1, 1, 4], [1, 1, 4], [1, 1, 2]] + d_model: [192, 192, 192, 192] + set_info: [[48, 1], [48, 1], [48, 1], [48, 1]] + window_shape: [[12, 12, 32], [12, 12, 8], [12, 12, 2], [12, 12, 1]] + hybrid_factor: [2, 2, 1] # x, y, z + shifts_list: [[[0, 0, 0], [6, 6, 0]], [[0, 0, 0], [6, 6, 0]], [[0, 0, 0], [6, 6, 0]], [[0, 0, 0], [6, 6, 0]]] + normalize_pos: False + + block_name: ['DSVTBlock','DSVTBlock','DSVTBlock','DSVTBlock'] + set_info: [[48, 1], [48, 1], [48, 1], [48, 1]] + d_model: [192, 192, 192, 192] + nhead: [8, 8, 8, 8] + dim_feedforward: [384, 384, 384, 384] + dropout: 0.0 + activation: gelu + reduction_type: 'attention' + output_shape: [468, 468] + conv_out_channel: 192 + # You can enable torch.utils.checkpoint to save GPU memory + # USE_CHECKPOINT: True + + MAP_TO_BEV: + NAME: PointPillarScatter3d + INPUT_SHAPE: [468, 468, 1] + NUM_BEV_FEATURES: 192 + + BACKBONE_2D: + NAME: BaseBEVResBackbone + LAYER_NUMS: [ 1, 2, 2 ] + LAYER_STRIDES: [ 1, 2, 2 ] + NUM_FILTERS: [ 128, 128, 256 ] + UPSAMPLE_STRIDES: [ 1, 2, 4 ] + NUM_UPSAMPLE_FILTERS: [ 128, 128, 128 ] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['Vehicle', 'Pedestrian', 'Cyclist'] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: False + NUM_HM_CONV: 2 + + BN_EPS: 0.001 + BN_MOM: 0.01 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'iou': {'out_channels': 1, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 1 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + IOU_REG_LOSS: True + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-80, -80, -10.0, 80, 80, 10.0] + MAX_OBJ_PER_SAMPLE: 500 + + USE_IOU_TO_RECTIFY_SCORE: True + IOU_RECTIFIER: [0.68, 0.71, 0.65] + + NMS_CONFIG: + NMS_TYPE: class_specific_nms + NMS_THRESH: [0.75, 0.6, 0.55] + NMS_PRE_MAXSIZE: [4096, 4096, 4096] + NMS_POST_MAXSIZE: [500, 500, 500] + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + EVAL_METRIC: waymo + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 3 + NUM_EPOCHS: 24 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.05 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.1 + DIV_FACTOR: 100 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 + LOSS_SCALE_FP16: 32.0 + +HOOK: + DisableAugmentationHook: + DISABLE_AUG_LIST: ['gt_sampling','random_world_flip','random_world_rotation','random_world_scaling', 'random_world_translation'] + NUM_LAST_EPOCHS: 1 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/mppnet_16frames.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/mppnet_16frames.yaml new file mode 100644 index 0000000..d36848b --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/mppnet_16frames.yaml @@ -0,0 +1,162 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + PROCESSED_DATA_TAG: 'waymo_processed_data_v0_5_0' + + SAMPLED_INTERVAL: { + 'train': 1, + 'test': 1 + } + FILTER_EMPTY_BOXES_FOR_TRAIN: True + DISABLE_NLZ_FLAG_ON_POINTS: True + + SEQUENCE_CONFIG: + ENABLED: True + SAMPLE_OFFSET: [-15,0] + + USE_PREDBOX: True + ROI_BOXES_PATH: { + 'train': '../output/xxxxx/train/result.pkl', # example: predicted boxes of RPN in training set + 'test': '../output/xxxxx/val/result.pkl', # example: predicted boxes of RPN in evalulation set + } + + DATA_AUGMENTOR: + DISABLE_AUG_LIST: [ 'placeholder' ] + AUG_CONFIG_LIST: + - NAME: random_world_flip + ALONG_AXIS_LIST: [ 'x', 'y' ] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [ -0.78539816, 0.78539816 ] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [ 0.95, 1.05 ] + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + + POINT_FEATURE_ENCODING: { + encoding_type: absolute_coordinates_encoding, + used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'time'], + src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'time'], + } + + +MODEL: + NAME: MPPNet + + ROI_HEAD: + NAME: MPPNetHead + TRANS_INPUT: 64 + CLASS_AGNOSTIC: True + USE_BOX_ENCODING: + ENABLED: True + AVG_STAGE1_SCORE: True + USE_TRAJ_EMPTY_MASK: True + USE_AUX_LOSS: True + IOU_WEIGHT: [0.5,0.4] + + ROI_GRID_POOL: + GRID_SIZE: 4 + MLPS: [[64,64]] + POOL_RADIUS: [0.8] + NSAMPLE: [16] + POOL_METHOD: max_pool + + Transformer: + num_lidar_points: 128 + num_proxy_points: 64 # GRID_SIZE*GRID_SIZE*GRID_SIZE + pos_hidden_dim: 64 + enc_layers: 3 + dim_feedforward: 512 + hidden_dim: 64 #equal to ROI_HEAD.TRANS_INPUT + dropout: 0.1 + nheads: 4 + pre_norm: False + num_frames: 16 + num_groups: 4 + sequence_stride: 4 + use_grid_pos: + enabled: True + init_type: index + use_mlp_mixer: + enabled: True + hidden_dim: 16 + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 96 + FG_RATIO: 0.5 + REG_AUG_METHOD: single + ROI_FG_AUG_TIMES: 10 + RATIO: 0.2 + USE_ROI_AUG: True + USE_TRAJ_AUG: + ENABLED: True + THRESHOD: 0.8 + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 2.0, + 'traj_reg_weight': [2.0, 2.0, 2.0], + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + SAVE_BBOX: False + EVAL_METRIC: waymo + NOT_APPLY_NMS_FOR_VEL: True + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 6 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/mppnet_4frames.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/mppnet_4frames.yaml new file mode 100644 index 0000000..db5593e --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/mppnet_4frames.yaml @@ -0,0 +1,167 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + PROCESSED_DATA_TAG: 'waymo_processed_data_v0_5_0' + + SAMPLED_INTERVAL: { + 'train': 1, + 'test': 1 + } + FILTER_EMPTY_BOXES_FOR_TRAIN: True + DISABLE_NLZ_FLAG_ON_POINTS: True + + SEQUENCE_CONFIG: + ENABLED: True + SAMPLE_OFFSET: [-3,0] + + USE_PREDBOX: True + ROI_BOXES_PATH: { + 'train': '../output/xxxxx/train/result.pkl', # example: predicted boxes of RPN in training set + 'test': '../output/xxxxx/val/result.pkl', # example: predicted boxes of RPN in evalulation set + } + + DATA_AUGMENTOR: + DISABLE_AUG_LIST: [ 'placeholder' ] + AUG_CONFIG_LIST: + + - NAME: random_world_flip + ALONG_AXIS_LIST: [ 'x', 'y' ] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [ -0.78539816, 0.78539816 ] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [ 0.95, 1.05 ] + + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + POINT_FEATURE_ENCODING: { + encoding_type: absolute_coordinates_encoding, + used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation','time'], + src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation','time'], + } + + +MODEL: + NAME: MPPNet + + ROI_HEAD: + NAME: MPPNetHead + TRANS_INPUT: 256 + CLASS_AGNOSTIC: True + USE_BOX_ENCODING: + ENABLED: True + AVG_STAGE1_SCORE: True + USE_TRAJ_EMPTY_MASK: True + USE_AUX_LOSS: True + IOU_WEIGHT: [0.5,0.4] + + + + ROI_GRID_POOL: + GRID_SIZE: 4 + MLPS: [[128,128], [128,128]] + POOL_RADIUS: [0.8, 1.6] + NSAMPLE: [16, 16] + POOL_METHOD: max_pool + + + Transformer: + num_lidar_points: 128 + num_proxy_points: 64 # GRID_SIZE*GRID_SIZE*GRID_SIZE + pos_hidden_dim: 64 + enc_layers: 3 + dim_feedforward: 512 + hidden_dim: 256 #equal to ROI_HEAD.TRANS_INPUT + dropout: 0.1 + nheads: 4 + pre_norm: False + num_frames: 4 + num_groups: 4 + use_grid_pos: + enabled: True + init_type: index + + use_mlp_mixer: + enabled: True + hidden_dim: 16 + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 96 + FG_RATIO: 0.5 + REG_AUG_METHOD: single + ROI_FG_AUG_TIMES: 10 + RATIO: 0.2 + USE_ROI_AUG: True + USE_TRAJ_AUG: + ENABLED: True + THRESHOD: 0.8 + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 2.0, + 'traj_reg_weight': [2.0, 2.0, 2.0], + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + SAVE_BBOX: False + EVAL_METRIC: waymo + NOT_APPLY_NMS_FOR_VEL: True + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 6 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 + diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/mppnet_e2e_memorybank_inference.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/mppnet_e2e_memorybank_inference.yaml new file mode 100644 index 0000000..5857473 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/mppnet_e2e_memorybank_inference.yaml @@ -0,0 +1,194 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset_multiframe.yaml + PROCESSED_DATA_TAG: 'waymo_processed_data_v0_5_0' + + SEQUENCE_CONFIG: + ENABLED: True + SAMPLE_OFFSET: [-3, 0] #16frame using [-15,0] + + POINT_FEATURE_ENCODING: { + encoding_type: absolute_coordinates_encoding, + used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation','time'], + src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation','time'], + } + + +MODEL: + NAME: MPPNetE2E + + VFE: + NAME: DynMeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + NUM_FRAME: 2 + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['Vehicle', 'Pedestrian', 'Cyclist'] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot','vel'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'vel': {'out_channels': 2, 'num_conv': 2}, + + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-75.2, -75.2, -2, 75.2, 75.2, 4] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + ROI_HEAD: + NAME: MPPNetHeadE2E + TRANS_INPUT: 256 + CLASS_AGNOSTIC: True + USE_BOX_ENCODING: + ENABLED: True + NORM_T0: True + ALL_YAW_T0: True + AVG_STAGE1_SCORE: True + USE_TRAJ_EMPTY_MASK: True + USE_AUX_LOSS: True + IOU_WEIGHT: [0.5,0.4] + + ROI_GRID_POOL: #if using 16frame, change to the corresponding setting + GRID_SIZE: 4 + MLPS: [[128,128], [128,128]] + POOL_RADIUS: [0.8, 1.6] + NSAMPLE: [16, 16] + POOL_METHOD: max_pool + + Transformer: + num_lidar_points: 128 + num_proxy_points: 64 + pos_hidden_dim: 64 + enc_layers: 3 + dim_feedforward: 512 + hidden_dim: 256 + dropout: 0.1 + nheads: 4 + pre_norm: False + num_frames: 4 #16frame using 16 + num_groups: 4 + sequence_stride: 1 #16frame using 4 + use_grid_pos: + enabled: True + init_type: index + use_mlp_mixer: + enabled: True + hidden_dim: 16 + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 96 + FG_RATIO: 0.5 + REG_AUG_METHOD: single + ROI_FG_AUG_TIMES: 10 + RATIO: 0.2 + USE_ROI_AUG: True + USE_TRAJ_AUG: + ENABLED: True + THRESHOD: 0.8 + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 2.0, + 'traj_reg_weight': [2.0, 2.0, 2.0], + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + SAVE_BBOX: False + EVAL_METRIC: waymo + NOT_APPLY_NMS_FOR_VEL: True + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 6 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pillarnet.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pillarnet.yaml new file mode 100644 index 0000000..6f9ad79 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pillarnet.yaml @@ -0,0 +1,97 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + +MODEL: + NAME: PillarNet + + VFE: + NAME: DynamicPillarVFESimple2D + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_CLUSTER_XYZ: False + USE_NORM: True + NUM_FILTERS: [32] + + BACKBONE_3D: + NAME: PillarRes18BackBone8x + + BACKBONE_2D: + NAME: BaseBEVBackboneV1 + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [256, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [128, 128] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['Vehicle', 'Pedestrian', 'Cyclist'] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-75.2, -75.2, -2, 75.2, 75.2, 4] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: waymo + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 30 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pointpillar_1x.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pointpillar_1x.yaml new file mode 100644 index 0000000..520aeb7 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pointpillar_1x.yaml @@ -0,0 +1,140 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + + POINT_CLOUD_RANGE: [-74.88, -74.88, -2, 74.88, 74.88, 4.0] + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [ 0.32, 0.32, 6.0 ] + MAX_POINTS_PER_VOXEL: 20 + MAX_NUMBER_OF_VOXELS: { + 'train': 150000, + 'test': 150000 + } + + +MODEL: + NAME: PointPillar + + VFE: + NAME: PillarVFE + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_NORM: True + NUM_FILTERS: [ 64, 64 ] + + MAP_TO_BEV: + NAME: PointPillarScatter + NUM_BEV_FEATURES: 64 + + BACKBONE_2D: + NAME: BaseBEVBackbone + LAYER_NUMS: [ 3, 5, 5 ] + LAYER_STRIDES: [ 1, 2, 2 ] + NUM_FILTERS: [ 64, 128, 256 ] + UPSAMPLE_STRIDES: [ 1, 2, 4 ] + NUM_UPSAMPLE_FILTERS: [ 128, 128, 128 ] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Vehicle', + 'anchor_sizes': [ [ 4.7, 2.1, 1.7 ] ], + 'anchor_rotations': [ 0, 1.57 ], + 'anchor_bottom_heights': [ 0 ], + 'align_center': False, + 'feature_map_stride': 1, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [ [ 0.91, 0.86, 1.73 ] ], + 'anchor_rotations': [ 0, 1.57 ], + 'anchor_bottom_heights': [ 0 ], + 'align_center': False, + 'feature_map_stride': 1, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [ [ 1.78, 0.84, 1.78 ] ], + 'anchor_rotations': [ 0, 1.57 ], + 'anchor_bottom_heights': [ 0 ], + 'align_center': False, + 'feature_map_stride': 1, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [ 0.3, 0.5, 0.7 ] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: waymo + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 30 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn.yaml new file mode 100644 index 0000000..b1423ed --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn.yaml @@ -0,0 +1,228 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + + +MODEL: + NAME: PVRCNN + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Vehicle', + 'anchor_sizes': [[4.7, 2.1, 1.7]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.91, 0.86, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[1.78, 0.84, 1.78]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + PFE: + NAME: VoxelSetAbstraction + POINT_SOURCE: raw_points + NUM_KEYPOINTS: 4096 + NUM_OUTPUT_FEATURES: 128 + SAMPLE_METHOD: FPS + + FEATURES_SOURCE: ['bev', 'x_conv3', 'x_conv4', 'raw_points'] + SA_LAYER: + raw_points: + MLPS: [[16, 16], [16, 16]] + POOL_RADIUS: [0.4, 0.8] + NSAMPLE: [16, 16] + x_conv1: + DOWNSAMPLE_FACTOR: 1 + MLPS: [[16, 16], [16, 16]] + POOL_RADIUS: [0.4, 0.8] + NSAMPLE: [16, 16] + x_conv2: + DOWNSAMPLE_FACTOR: 2 + MLPS: [[32, 32], [32, 32]] + POOL_RADIUS: [0.8, 1.2] + NSAMPLE: [16, 32] + x_conv3: + DOWNSAMPLE_FACTOR: 4 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [1.2, 2.4] + NSAMPLE: [16, 32] + x_conv4: + DOWNSAMPLE_FACTOR: 8 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [2.4, 4.8] + NSAMPLE: [16, 32] + + POINT_HEAD: + NAME: PointHeadSimple + CLS_FC: [256, 256] + CLASS_AGNOSTIC: True + USE_POINT_FEATURES_BEFORE_FUSION: True + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + LOSS_CONFIG: + LOSS_REG: smooth-l1 + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + } + + ROI_HEAD: + NAME: PVRCNNHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False +# NMS_PRE_MAXSIZE: 1024 +# NMS_POST_MAXSIZE: 100 +# NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 300 + NMS_THRESH: 0.85 + + + ROI_GRID_POOL: + GRID_SIZE: 6 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [0.8, 1.6] + NSAMPLE: [16, 16] + POOL_METHOD: max_pool + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: waymo + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 30 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.001 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_plusplus.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_plusplus.yaml new file mode 100644 index 0000000..b16b863 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_plusplus.yaml @@ -0,0 +1,277 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + + +MODEL: + NAME: PVRCNNPlusPlus + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + [ 'Vehicle', 'Pedestrian', 'Cyclist' ] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: [ 'center', 'center_z', 'dim', 'rot' ] + HEAD_DICT: { + 'center': { 'out_channels': 2, 'num_conv': 2 }, + 'center_z': { 'out_channels': 1, 'num_conv': 2 }, + 'dim': { 'out_channels': 3, 'num_conv': 2 }, + 'rot': { 'out_channels': 2, 'num_conv': 2 }, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [ -75.2, -75.2, -2, 75.2, 75.2, 4 ] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + PFE: + NAME: VoxelSetAbstraction + POINT_SOURCE: raw_points + NUM_KEYPOINTS: 4096 + NUM_OUTPUT_FEATURES: 90 + SAMPLE_METHOD: SPC + SPC_SAMPLING: + NUM_SECTORS: 6 + SAMPLE_RADIUS_WITH_ROI: 1.6 + + FEATURES_SOURCE: ['bev', 'x_conv3', 'x_conv4', 'raw_points'] + SA_LAYER: + raw_points: + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: local_interpolation + NUM_REDUCED_CHANNELS: 2 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [ 32 ] + FILTER_NEIGHBOR_WITH_ROI: True + RADIUS_OF_NEIGHBOR_WITH_ROI: 2.4 + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [ 2, 2, 2 ] + MAX_NEIGHBOR_DISTANCE: 0.2 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 32, 32 ] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 0.4 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 32, 32 ] + + x_conv3: + DOWNSAMPLE_FACTOR: 4 + INPUT_CHANNELS: 64 + + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: local_interpolation + NUM_REDUCED_CHANNELS: 32 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [128] + FILTER_NEIGHBOR_WITH_ROI: True + RADIUS_OF_NEIGHBOR_WITH_ROI: 4.0 + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [3, 3, 3] + MAX_NEIGHBOR_DISTANCE: 1.2 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [64, 64] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 2.4 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 64, 64 ] + + x_conv4: + DOWNSAMPLE_FACTOR: 8 + INPUT_CHANNELS: 64 + + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: local_interpolation + NUM_REDUCED_CHANNELS: 32 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [ 128 ] + FILTER_NEIGHBOR_WITH_ROI: True + RADIUS_OF_NEIGHBOR_WITH_ROI: 6.4 + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 2.4 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 64, 64 ] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 4.8 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 64, 64 ] + + + POINT_HEAD: + NAME: PointHeadSimple + CLS_FC: [256, 256] + CLASS_AGNOSTIC: True + USE_POINT_FEATURES_BEFORE_FUSION: True + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + LOSS_CONFIG: + LOSS_REG: smooth-l1 + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + } + + ROI_HEAD: + NAME: PVRCNNHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 1024 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.7 + SCORE_THRESH: 0.1 + +# NMS_PRE_MAXSIZE: 4096 +# NMS_POST_MAXSIZE: 500 +# NMS_THRESH: 0.85 + + + ROI_GRID_POOL: + GRID_SIZE: 6 + + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: voxel_random_choice + NUM_REDUCED_CHANNELS: 30 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [ 128 ] + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 0.8 + NEIGHBOR_NSAMPLE: 32 + POST_MLPS: [ 64, 64 ] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 1.6 + NEIGHBOR_NSAMPLE: 32 + POST_MLPS: [ 64, 64 ] + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: waymo + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 30 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.001 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_plusplus_resnet.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_plusplus_resnet.yaml new file mode 100644 index 0000000..b515101 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_plusplus_resnet.yaml @@ -0,0 +1,277 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + + +MODEL: + NAME: PVRCNNPlusPlus + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + [ 'Vehicle', 'Pedestrian', 'Cyclist' ] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: [ 'center', 'center_z', 'dim', 'rot' ] + HEAD_DICT: { + 'center': { 'out_channels': 2, 'num_conv': 2 }, + 'center_z': { 'out_channels': 1, 'num_conv': 2 }, + 'dim': { 'out_channels': 3, 'num_conv': 2 }, + 'rot': { 'out_channels': 2, 'num_conv': 2 }, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [ -75.2, -75.2, -2, 75.2, 75.2, 4 ] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + PFE: + NAME: VoxelSetAbstraction + POINT_SOURCE: raw_points + NUM_KEYPOINTS: 4096 + NUM_OUTPUT_FEATURES: 90 + SAMPLE_METHOD: SPC + SPC_SAMPLING: + NUM_SECTORS: 6 + SAMPLE_RADIUS_WITH_ROI: 1.6 + + FEATURES_SOURCE: ['bev', 'x_conv3', 'x_conv4', 'raw_points'] + SA_LAYER: + raw_points: + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: local_interpolation + NUM_REDUCED_CHANNELS: 2 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [ 32 ] + FILTER_NEIGHBOR_WITH_ROI: True + RADIUS_OF_NEIGHBOR_WITH_ROI: 2.4 + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [ 2, 2, 2 ] + MAX_NEIGHBOR_DISTANCE: 0.2 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 32, 32 ] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 0.4 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 32, 32 ] + + x_conv3: + DOWNSAMPLE_FACTOR: 4 + INPUT_CHANNELS: 64 + + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: local_interpolation + NUM_REDUCED_CHANNELS: 32 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [128] + FILTER_NEIGHBOR_WITH_ROI: True + RADIUS_OF_NEIGHBOR_WITH_ROI: 4.0 + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [3, 3, 3] + MAX_NEIGHBOR_DISTANCE: 1.2 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [64, 64] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 2.4 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 64, 64 ] + + x_conv4: + DOWNSAMPLE_FACTOR: 8 + INPUT_CHANNELS: 64 + + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: local_interpolation + NUM_REDUCED_CHANNELS: 32 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [ 128 ] + FILTER_NEIGHBOR_WITH_ROI: True + RADIUS_OF_NEIGHBOR_WITH_ROI: 6.4 + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 2.4 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 64, 64 ] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 4.8 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 64, 64 ] + + + POINT_HEAD: + NAME: PointHeadSimple + CLS_FC: [256, 256] + CLASS_AGNOSTIC: True + USE_POINT_FEATURES_BEFORE_FUSION: True + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + LOSS_CONFIG: + LOSS_REG: smooth-l1 + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + } + + ROI_HEAD: + NAME: PVRCNNHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 1024 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.7 + SCORE_THRESH: 0.1 + +# NMS_PRE_MAXSIZE: 4096 +# NMS_POST_MAXSIZE: 500 +# NMS_THRESH: 0.85 + + + ROI_GRID_POOL: + GRID_SIZE: 6 + + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: voxel_random_choice + NUM_REDUCED_CHANNELS: 30 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [ 128 ] + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 0.8 + NEIGHBOR_NSAMPLE: 32 + POST_MLPS: [ 64, 64 ] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 1.6 + NEIGHBOR_NSAMPLE: 32 + POST_MLPS: [ 64, 64 ] + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: waymo + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 30 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.001 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_plusplus_resnet_2frames.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_plusplus_resnet_2frames.yaml new file mode 100644 index 0000000..955a647 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_plusplus_resnet_2frames.yaml @@ -0,0 +1,316 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset_multiframe.yaml + + SEQUENCE_CONFIG: + ENABLED: True + SAMPLE_OFFSET: [-1, 0] + + TRAIN_WITH_SPEED: False + + DATA_AUGMENTOR: + DISABLE_AUG_LIST: ['placeholder'] + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: False + DB_INFO_PATH: + - waymo_processed_data_v0_5_0_waymo_dbinfos_train_sampled_1_multiframe_-4_to_0.pkl + + USE_SHARED_MEMORY: False # set it to True to speed up (it costs about 50GB? shared memory) + DB_DATA_PATH: + - waymo_processed_data_v0_5_0_gt_database_train_sampled_1_multiframe_-4_to_0_global.npy + + PREPARE: { + filter_by_min_points: ['Vehicle:5', 'Pedestrian:5', 'Cyclist:5'], + filter_by_difficulty: [-1], + } + + SAMPLE_GROUPS: ['Vehicle:15', 'Pedestrian:10', 'Cyclist:10'] + NUM_POINT_FEATURES: 6 + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + FILTER_OBJ_POINTS_BY_TIMESTAMP: True + TIME_RANGE: [0.1, 0.0] # 0.1s-0.0s indicates 2 frames + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + +MODEL: + NAME: PVRCNNPlusPlus + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + [ 'Vehicle', 'Pedestrian', 'Cyclist' ] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: [ 'center', 'center_z', 'dim', 'rot' ] + HEAD_DICT: { + 'center': { 'out_channels': 2, 'num_conv': 2 }, + 'center_z': { 'out_channels': 1, 'num_conv': 2 }, + 'dim': { 'out_channels': 3, 'num_conv': 2 }, + 'rot': { 'out_channels': 2, 'num_conv': 2 }, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [ -75.2, -75.2, -2, 75.2, 75.2, 4 ] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + PFE: + NAME: VoxelSetAbstraction + POINT_SOURCE: raw_points + NUM_KEYPOINTS: 4096 + NUM_OUTPUT_FEATURES: 90 + SAMPLE_METHOD: SPC + SPC_SAMPLING: + NUM_SECTORS: 6 + SAMPLE_RADIUS_WITH_ROI: 1.6 + + FEATURES_SOURCE: ['bev', 'x_conv3', 'x_conv4', 'raw_points'] + SA_LAYER: + raw_points: + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: local_interpolation + NUM_REDUCED_CHANNELS: 3 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [ 32 ] + FILTER_NEIGHBOR_WITH_ROI: True + RADIUS_OF_NEIGHBOR_WITH_ROI: 2.4 + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [ 2, 2, 2 ] + MAX_NEIGHBOR_DISTANCE: 0.2 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 32, 32 ] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 0.4 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 32, 32 ] + + x_conv3: + DOWNSAMPLE_FACTOR: 4 + INPUT_CHANNELS: 64 + + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: local_interpolation + NUM_REDUCED_CHANNELS: 32 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [128] + FILTER_NEIGHBOR_WITH_ROI: True + RADIUS_OF_NEIGHBOR_WITH_ROI: 4.0 + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [3, 3, 3] + MAX_NEIGHBOR_DISTANCE: 1.2 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [64, 64] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 2.4 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 64, 64 ] + + x_conv4: + DOWNSAMPLE_FACTOR: 8 + INPUT_CHANNELS: 64 + + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: local_interpolation + NUM_REDUCED_CHANNELS: 32 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [ 128 ] + FILTER_NEIGHBOR_WITH_ROI: True + RADIUS_OF_NEIGHBOR_WITH_ROI: 6.4 + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 2.4 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 64, 64 ] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 4.8 + NEIGHBOR_NSAMPLE: -1 + POST_MLPS: [ 64, 64 ] + + + POINT_HEAD: + NAME: PointHeadSimple + CLS_FC: [256, 256] + CLASS_AGNOSTIC: True + USE_POINT_FEATURES_BEFORE_FUSION: True + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + LOSS_CONFIG: + LOSS_REG: smooth-l1 + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + } + + ROI_HEAD: + NAME: PVRCNNHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 1024 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.7 + SCORE_THRESH: 0.1 + +# NMS_PRE_MAXSIZE: 4096 +# NMS_POST_MAXSIZE: 500 +# NMS_THRESH: 0.85 + + + ROI_GRID_POOL: + GRID_SIZE: 6 + + NAME: VectorPoolAggregationModuleMSG + NUM_GROUPS: 2 + LOCAL_AGGREGATION_TYPE: voxel_random_choice + NUM_REDUCED_CHANNELS: 30 + NUM_CHANNELS_OF_LOCAL_AGGREGATION: 32 + MSG_POST_MLPS: [ 128 ] + + GROUP_CFG_0: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 0.8 + NEIGHBOR_NSAMPLE: 32 + POST_MLPS: [ 64, 64 ] + GROUP_CFG_1: + NUM_LOCAL_VOXEL: [ 3, 3, 3 ] + MAX_NEIGHBOR_DISTANCE: 1.6 + NEIGHBOR_NSAMPLE: 32 + POST_MLPS: [ 64, 64 ] + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: waymo + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 36 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.001 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_with_centerhead_rpn.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_with_centerhead_rpn.yaml new file mode 100644 index 0000000..6015f65 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/pv_rcnn_with_centerhead_rpn.yaml @@ -0,0 +1,215 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + + +MODEL: + NAME: PVRCNN + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + [ 'Vehicle', 'Pedestrian', 'Cyclist' ] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: [ 'center', 'center_z', 'dim', 'rot' ] + HEAD_DICT: { + 'center': { 'out_channels': 2, 'num_conv': 2 }, + 'center_z': { 'out_channels': 1, 'num_conv': 2 }, + 'dim': { 'out_channels': 3, 'num_conv': 2 }, + 'rot': { 'out_channels': 2, 'num_conv': 2 }, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [ -75.2, -75.2, -2, 75.2, 75.2, 4 ] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + PFE: + NAME: VoxelSetAbstraction + POINT_SOURCE: raw_points + NUM_KEYPOINTS: 4096 + NUM_OUTPUT_FEATURES: 90 + SAMPLE_METHOD: FPS + + FEATURES_SOURCE: ['bev', 'x_conv3', 'x_conv4', 'raw_points'] + SA_LAYER: + raw_points: + MLPS: [[16, 16], [16, 16]] + POOL_RADIUS: [0.4, 0.8] + NSAMPLE: [16, 16] + x_conv1: + DOWNSAMPLE_FACTOR: 1 + MLPS: [[16, 16], [16, 16]] + POOL_RADIUS: [0.4, 0.8] + NSAMPLE: [16, 16] + x_conv2: + DOWNSAMPLE_FACTOR: 2 + MLPS: [[32, 32], [32, 32]] + POOL_RADIUS: [0.8, 1.2] + NSAMPLE: [16, 32] + x_conv3: + DOWNSAMPLE_FACTOR: 4 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [1.2, 2.4] + NSAMPLE: [16, 32] + x_conv4: + DOWNSAMPLE_FACTOR: 8 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [2.4, 4.8] + NSAMPLE: [16, 32] + + POINT_HEAD: + NAME: PointHeadSimple + CLS_FC: [256, 256] + CLASS_AGNOSTIC: True + USE_POINT_FEATURES_BEFORE_FUSION: True + TARGET_CONFIG: + GT_EXTRA_WIDTH: [0.2, 0.2, 0.2] + LOSS_CONFIG: + LOSS_REG: smooth-l1 + LOSS_WEIGHTS: { + 'point_cls_weight': 1.0, + } + + ROI_HEAD: + NAME: PVRCNNHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 1024 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.7 + SCORE_THRESH: 0.1 + +# NMS_PRE_MAXSIZE: 4096 +# NMS_POST_MAXSIZE: 500 +# NMS_THRESH: 0.85 + + + ROI_GRID_POOL: + GRID_SIZE: 6 + MLPS: [[64, 64], [64, 64]] + POOL_RADIUS: [0.8, 1.6] + NSAMPLE: [16, 16] + POOL_METHOD: max_pool + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: waymo + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 2 + NUM_EPOCHS: 30 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.001 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/second.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/second.yaml new file mode 100644 index 0000000..ca769a7 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/second.yaml @@ -0,0 +1,121 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + + +MODEL: + NAME: SECONDNet + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: AnchorHeadSingle + CLASS_AGNOSTIC: False + + USE_DIRECTION_CLASSIFIER: True + DIR_OFFSET: 0.78539 + DIR_LIMIT_OFFSET: 0.0 + NUM_DIR_BINS: 2 + + ANCHOR_GENERATOR_CONFIG: [ + { + 'class_name': 'Vehicle', + 'anchor_sizes': [[4.7, 2.1, 1.7]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.55, + 'unmatched_threshold': 0.4 + }, + { + 'class_name': 'Pedestrian', + 'anchor_sizes': [[0.91, 0.86, 1.73]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + }, + { + 'class_name': 'Cyclist', + 'anchor_sizes': [[1.78, 0.84, 1.78]], + 'anchor_rotations': [0, 1.57], + 'anchor_bottom_heights': [0], + 'align_center': False, + 'feature_map_stride': 8, + 'matched_threshold': 0.5, + 'unmatched_threshold': 0.35 + } + ] + + TARGET_ASSIGNER_CONFIG: + NAME: AxisAlignedTargetAssigner + POS_FRACTION: -1.0 + SAMPLE_SIZE: 512 + NORM_BY_NUM_EXAMPLES: False + MATCH_HEIGHT: False + BOX_CODER: ResidualCoder + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'dir_weight': 0.2, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: waymo + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 30 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/voxel_rcnn_with_centerhead_dyn_voxel.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/voxel_rcnn_with_centerhead_dyn_voxel.yaml new file mode 100644 index 0000000..763758b --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/voxel_rcnn_with_centerhead_dyn_voxel.yaml @@ -0,0 +1,194 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + STRICT_MASK: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels_placeholder + VOXEL_SIZE: [ 0.10, 0.10, 0.15 ] + +MODEL: + NAME: VoxelRCNN + + VFE: + NAME: DynMeanVFE + + BACKBONE_3D: + NAME: VoxelBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + [ 'Vehicle', 'Pedestrian', 'Cyclist' ] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: [ 'center', 'center_z', 'dim', 'rot' ] + HEAD_DICT: { + 'center': { 'out_channels': 2, 'num_conv': 2 }, + 'center_z': { 'out_channels': 1, 'num_conv': 2 }, + 'dim': { 'out_channels': 3, 'num_conv': 2 }, + 'rot': { 'out_channels': 2, 'num_conv': 2 }, + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [ -75.2, -75.2, -2, 75.2, 75.2, 4 ] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + ROI_HEAD: + NAME: VoxelRCNNHead + CLASS_AGNOSTIC: True + + SHARED_FC: [256, 256] + CLS_FC: [256, 256] + REG_FC: [256, 256] + DP_RATIO: 0.3 + + NMS_CONFIG: + TRAIN: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 9000 + NMS_POST_MAXSIZE: 512 + NMS_THRESH: 0.8 + TEST: + NMS_TYPE: nms_gpu + MULTI_CLASSES_NMS: False + NMS_PRE_MAXSIZE: 1024 + NMS_POST_MAXSIZE: 100 + NMS_THRESH: 0.7 + # NMS_PRE_MAXSIZE: 4096 + # NMS_POST_MAXSIZE: 300 + # NMS_THRESH: 0.85 + + ROI_GRID_POOL: + FEATURES_SOURCE: ['x_conv2', 'x_conv3', 'x_conv4'] + PRE_MLP: True + GRID_SIZE: 6 + POOL_LAYERS: + x_conv2: + MLPS: [ [ 64, 64 ] ] + QUERY_RANGES: [ [ 3, 3, 2 ] ] + POOL_RADIUS: [ 0.4 ] + NSAMPLE: [ 16 ] + POOL_METHOD: max_pool + x_conv3: + MLPS: [ [ 64, 64 ] ] + QUERY_RANGES: [ [ 3, 3, 2 ] ] + POOL_RADIUS: [ 0.8 ] + NSAMPLE: [ 16 ] + POOL_METHOD: max_pool + x_conv4: + MLPS: [ [ 64, 64 ] ] + QUERY_RANGES: [ [ 3, 3, 2 ] ] + POOL_RADIUS: [ 1.6 ] + NSAMPLE: [ 16 ] + POOL_METHOD: max_pool + + TARGET_CONFIG: + BOX_CODER: ResidualCoder + ROI_PER_IMAGE: 128 + FG_RATIO: 0.5 + + SAMPLE_ROI_BY_EACH_CLASS: True + CLS_SCORE_TYPE: roi_iou + + CLS_FG_THRESH: 0.75 + CLS_BG_THRESH: 0.25 + CLS_BG_THRESH_LO: 0.1 + HARD_BG_RATIO: 0.8 + + REG_FG_THRESH: 0.55 + + LOSS_CONFIG: + CLS_LOSS: BinaryCrossEntropy + REG_LOSS: smooth-l1 + CORNER_LOSS_REGULARIZATION: True + LOSS_WEIGHTS: { + 'rcnn_cls_weight': 1.0, + 'rcnn_reg_weight': 1.0, + 'rcnn_corner_weight': 1.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + SCORE_THRESH: 0.1 + OUTPUT_RAW_SCORE: False + + EVAL_METRIC: waymo + + NMS_CONFIG: + MULTI_CLASSES_NMS: False + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 30 + + OPTIMIZER: adam_onecycle + LR: 0.01 + WEIGHT_DECAY: 0.001 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 \ No newline at end of file diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/voxelnext2d_ioubranch.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/voxelnext2d_ioubranch.yaml new file mode 100644 index 0000000..ce14893 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/voxelnext2d_ioubranch.yaml @@ -0,0 +1,91 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + +MODEL: + NAME: VoxelNeXt + + VFE: + NAME: DynamicPillarVFESimple2D + WITH_DISTANCE: False + USE_ABSLOTE_XYZ: True + USE_CLUSTER_XYZ: False + USE_NORM: True + NUM_FILTERS: [32] + + BACKBONE_3D: + NAME: VoxelResBackBone8xVoxelNeXt2D + + DENSE_HEAD: + NAME: VoxelNeXtHead + IOU_BRANCH: True + CLASS_AGNOSTIC: False + INPUT_FEATURES: 256 + + CLASS_NAMES_EACH_HEAD: [ + ['Vehicle', 'Pedestrian', 'Cyclist'], + ] + + SHARED_CONV_CHANNEL: 256 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'iou': {'out_channels': 1, 'num_conv': 2}, + } + RECTIFIER: [0.68, 0.71, 0.65] + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-75.2, -75.2, -2, 75.2, 75.2, 4] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: [0.8, 0.55, 0.55] #0.7 + NMS_PRE_MAXSIZE: [2048, 1024, 1024] #[4096] + NMS_POST_MAXSIZE: [200, 150, 150] #500 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: waymo + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 12 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 diff --git a/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/voxelnext_ioubranch_large.yaml b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/voxelnext_ioubranch_large.yaml new file mode 100644 index 0000000..0fe2144 --- /dev/null +++ b/waypoint_control/OpenPCDet/tools/cfgs/waymo_models/voxelnext_ioubranch_large.yaml @@ -0,0 +1,89 @@ +CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] + +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml + +MODEL: + NAME: VoxelNeXt + + VFE: + NAME: MeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8xVoxelNeXt + SPCONV_KERNEL_SIZES: [5, 5, 3, 3] + OUT_CHANNEL: 256 + CHANNELS: [32, 64, 128, 256, 256] + + DENSE_HEAD: + NAME: VoxelNeXtHead + IOU_BRANCH: True + CLASS_AGNOSTIC: False + INPUT_FEATURES: 256 + + CLASS_NAMES_EACH_HEAD: [ + ['Vehicle', 'Pedestrian', 'Cyclist'] + ] + + SHARED_CONV_CHANNEL: 256 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'iou': {'out_channels': 1, 'num_conv': 2}, + } + RECTIFIER: [0.68, 0.71, 0.65] + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-75.2, -75.2, -2, 75.2, 75.2, 4] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: [0.8, 0.55, 0.55] #0.7 + NMS_PRE_MAXSIZE: [2048, 1024, 1024] #[4096] + NMS_POST_MAXSIZE: [200, 150, 150] #500 + + POST_PROCESSING: + RECALL_THRESH_LIST: [0.3, 0.5, 0.7] + + EVAL_METRIC: waymo + + +OPTIMIZATION: + BATCH_SIZE_PER_GPU: 4 + NUM_EPOCHS: 12 + + OPTIMIZER: adam_onecycle + LR: 0.003 + WEIGHT_DECAY: 0.01 + MOMENTUM: 0.9 + + MOMS: [0.95, 0.85] + PCT_START: 0.4 + DIV_FACTOR: 10 + DECAY_STEP_LIST: [35, 45] + LR_DECAY: 0.1 + LR_CLIP: 0.0000001 + + LR_WARMUP: False + WARMUP_EPOCH: 1 + + GRAD_NORM_CLIP: 10 From b0d8577ee3cc455eea9f94ddbbbad639ab08dde0 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Tue, 9 Dec 2025 17:52:15 +0800 Subject: [PATCH 06/31] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../collect_intersection_camera_lidar.py | 210 +++++++++++++++--- 1 file changed, 185 insertions(+), 25 deletions(-) diff --git a/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py b/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py index 422a01b..377cdbe 100644 --- a/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py +++ b/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py @@ -65,7 +65,6 @@ def create_radar_folder(junc, town_folder): print(f"Created folder: {folder_name}") return folder_name - # 创建保存相机数据的文件夹 def create_camera_folder(camera_id, junc, town_folder): folder_name = f"{town_folder}/{junc}/camera/{camera_id}" @@ -106,6 +105,9 @@ def dist(actor): pedestrian_list = list(filter(lambda actor: dist(actor) < FUSION_DETECTION_ACTUAL_DIS, pedestrian_list)) vehicle_labels = [] # 车辆标签列表 pedestrian_labels = [] # 行人标签列表 + car_labels = [] # Car 标签列表 + truck_labels = [] # Truck 标签列表 + pedestrian_labelspy = [] # Pedestrian 标签列表 # 获取标签NX9 for vehicle in vehicle_list: bounding_box = vehicle.bounding_box @@ -145,6 +147,26 @@ def dist(actor): # roll_lidar, # roll # yaw_lidar # yaw ] + + # 判断车辆的类别(Car, Truck) + category = recognize_vehicle_class(vehicle) + + labelpy = [ + bounding_box_location_lidar[0], # x + bounding_box_location_lidar[1], # y + bounding_box_location_lidar[2] + 0.3, # z ,需要把z替换成bounding_box.z + length, + width, + height, + yaw_lidar, # yaw + category + ] + # 根据类别保存标签 + if category == "Car": + car_labels.append(labelpy) + elif category == "Truck": + truck_labels.append(labelpy) + vehicle_id = vehicle.id vehicle_labels.append((time_stamp, vehicle_id, label)) all_vehicle_labels.append(vehicle_labels) @@ -190,13 +212,82 @@ def dist(actor): # roll_lidar, # roll # yaw_lidar # yaw ] + + # 构造标签数据(Nx9 格式) + labelpy = [ + bounding_box_location_lidar[0], # x + bounding_box_location_lidar[1], # y + bounding_box_location_lidar[2] + height / 2, # z ,需要把z替换成bounding_box.z + length, + width, + height, + yaw_lidar, # yaw + 'Pedestrian' + ] + pedestrian_labelspy.append(labelpy) # 行人标签直接保存,无需分类 + pedestrian_id = pedestrian.id pedestrian_labels.append((time_stamp, pedestrian_id, label)) all_pedestrian_labels.append(pedestrian_labels) + # 将所有类别的标签合并到一个列表中 + all_labels = [] + + # 处理Car标签 + if len(car_labels) > 0: + for label in car_labels: + if len(label) >= 7: + # 格式化数值为两位小数 + formatted_label = [] + for i, value in enumerate(label): + if i < 7: # 前7个是数值 + formatted_label.append(f"{float(value):.2f}") # 格式化为两位小数 + else: # 第8个及以后是类别名称 + formatted_label.append(str(value)) + + # 如果只有7个字段,添加类别名 + if len(formatted_label) == 7: + formatted_label.append("Vehicle") + + all_labels.append(formatted_label) + + # 处理Truck标签 + if len(truck_labels) > 0: + for label in truck_labels: + if len(label) >= 7: + formatted_label = [] + for i, value in enumerate(label): + if i < 7: + formatted_label.append(f"{float(value):.2f}") + else: + formatted_label.append(str(value)) + + if len(formatted_label) == 7: + formatted_label.append("Truck") + + all_labels.append(formatted_label) + + # 处理Pedestrian标签 + if len(pedestrian_labels) > 0: + for label in pedestrian_labels: + if len(label) >= 7: + formatted_label = [] + for i, value in enumerate(label): + if i < 7: + formatted_label.append(f"{float(value):.2f}") + else: + formatted_label.append(str(value)) + + if len(formatted_label) == 7: + formatted_label.append("Pedestrian") + + all_labels.append(formatted_label) + + return all_labels + # 定义函数来保存雷达点云数据 -def save_radar_data(radar_data, world, ego_vehicle_transform, actual_vehicle_num, actual_pedestrian_num,lidar_to_world_inv, all_vehicle_labels, all_pedestrian_labels, junc, town_folder): +def save_radar_data(radar_data, world, ego_vehicle_transform, actual_vehicle_num, actual_pedestrian_num,lidar_to_world_inv, all_vehicle_labels, all_pedestrian_labels, junc, town_folder, file_num): global global_time # 获取当前帧编号 current_frame = radar_data.frame @@ -205,7 +296,7 @@ def save_radar_data(radar_data, world, ego_vehicle_transform, actual_vehicle_num timestamp = global_time global_time = timestamp + 0.05 location = ego_vehicle_transform.location - save_point_label(world, location, lidar_to_world_inv, timestamp, all_vehicle_labels, all_pedestrian_labels) + all_labels = save_point_label(world, location, lidar_to_world_inv, timestamp, all_vehicle_labels, all_pedestrian_labels) # 获取雷达数据并将其转化为numpy数组 points = np.frombuffer(radar_data.raw_data, dtype=np.dtype('f4')) @@ -296,17 +387,55 @@ def dist(actor): actual_vehicle_num.append((timestamp, vehicle_count)) actual_pedestrian_num.append((timestamp, pedestrian_count)) - # def dist(actor): - # return actor.get_location().distance(location) - # # 筛选出距离小于 LIDAR_RANGE 的车辆 - # vehicle_list = list(filter(lambda actor: dist(actor) < FUSION_DETECTION_ACTUAL_DIS, vehicle_list)) - # pedestrian_list = list(filter(lambda actor: dist(actor) < FUSION_DETECTION_ACTUAL_DIS, pedestrian_list)) # 将点云数据保存为 .mat 文件 # 使用 scipy.io.savemat 保存数据,MATLAB 可以读取的格式 scipy.io.savemat(file_name, {'datalog': datalog}) + # 提取 points 的前四列 + locationpy = points[:, :4] + # 将 locationpy 转换为 float64(即 double 类型) + locationpy = locationpy.astype(np.float32) + # 如果 timestamp 是单个值,创建重复的数组 + if np.isscalar(timestamp): + timestamp_array = np.full((locationpy.shape[0], 1), timestamp, dtype=np.float32) + else: + # 如果 timestamp 已经是数组,确保形状正确 + timestamp_array = timestamp.reshape(-1, 1) + + # 水平拼接 location 前四列和 timestamp + datalogpy = np.column_stack([locationpy, timestamp_array]) + + # 1. 直接保存 datalogpy 为 .npy + radar_folder = create_radar_folder_py() + np.save(os.path.join(radar_folder, f"{file_num}.npy"), datalogpy) + # 2. 保存 label 为 .txt + label_folder = create_label_folder() + with open(os.path.join(label_folder, f"{file_num}.txt"), 'w') as f: + + # 处理不同的数据结构 + if isinstance(all_labels, list): + # 检查是否是嵌套列表(多个标签) + if all_labels and isinstance(all_labels[0], list): + # 多个标签:每行一个标签 + for label_item in all_labels: + line = " ".join(str(item) for item in label_item) + f.write(line + "\n") + else: + # 单个标签:一行 + line = " ".join(str(item) for item in all_labels) + f.write(line + "\n") + else: + # 其他类型(字符串、数字等) + f.write(str(all_labels)) + + # 3. 每次保存 file_num 到 num.txt,并换行 + with open("num.txt", 'a') as f: # 'a' 表示追加模式 + f.write(str(file_num) + "\n") # 添加换行符 + + + # 定义函数来保存相机图像数据 def save_camera_data(image_data, camera_id, junc, town_folder): current_frame = image_data.frame @@ -516,6 +645,41 @@ def destroy_actor(lidar, camera_dict, vehicles, sensor_queue, pedestrians): del sensor_queue +# python用法 +# 创建保存雷达数据的文件夹 +def create_radar_folder_py(): + folder_name = f"train_data" + # 检查文件夹是否已存在,若不存在则创建 + if not os.path.exists(folder_name): + os.makedirs(folder_name) + print(f"Created folder: {folder_name}") + return folder_name + +# 创建保存标签数据的文件夹 +def create_label_folder(): + folder_name = f"train_data/label" + if not os.path.exists(folder_name): + os.makedirs(folder_name) + print(f"Created folder: {folder_name}") + return folder_name + +def recognize_vehicle_class(vehicle): + blueprint = vehicle.type_id.lower() # 获取车辆的蓝图名称并转换为小写 + # 定义需要识别为卡车的特定蓝图ID + Truck_blueprints = [ + 'vehicle.carlamotors.carlacola', + 'vehicle.carlamotors.european_hgv', + 'vehicle.tesla.cybertruck', + 'vehicle.carlamotors.firetruck', + 'vehicle.mitsubishi.fusorosa' + ] + # 检查蓝图名称是否在卡车列表中 + if blueprint in Truck_blueprints: + return 'Truck' + else: + return "Car" + + # 主函数 def main(): argparser = argparse.ArgumentParser( @@ -552,7 +716,7 @@ def main(): argparser.add_argument( '-i', '--intersection', metavar='INTERSECTION', - default='road_intersection_1', # 默认路口 + default='road_intersection_5', # 默认路口 help='Name of the intersection within the town (default: road_intersection_1)' ) args = argparser.parse_args() @@ -640,10 +804,11 @@ def main(): all_pedestrian_labels = [] vehicles_traj = {} pedestrians_traj = {} + folder_index = 0 for _ in range(DATA_MUN): world.tick() - actor_list = world.get_actors().filter('vehicle.*') - for actor in actor_list: + actor_list_vehicle = world.get_actors().filter('vehicle.*') + for actor in actor_list_vehicle: vehicle_id = actor.id location = actor.get_location() x = location.x, @@ -654,35 +819,30 @@ def main(): vehicles_traj[vehicle_id] = [[x, y, z]] else: vehicles_traj[vehicle_id].append([x, y, z]) - # 同步保存多传感器数据 - for _ in range(1 + len(camera_dict)): - data, sensor_name = sensor_queue.get(True, 1.0) - if "lidar" in sensor_name: # lidar数据 - save_radar_data(data, world, ego_transform, actual_vehicle_num, actual_pedestrian_num, lidar_to_world_inv, all_vehicle_labels, all_pedestrian_labels, junc, town_folder) - else: - save_camera_data(data, sensor_name, junc, town_folder) - # time.sleep(0.05) - for _ in range(DATA_MUN): - world.tick() - actor_list = world.get_actors().filter('walker.*') - for actor in actor_list: + + actor_list_walker = world.get_actors().filter('walker.*') + for actor in actor_list_walker: pedestrian_id = actor.id location = actor.get_location() x = location.x, y = location.y, z = location.z, - # 如果该车辆ID不存在于字典中,则初始化一个空列表 + # 如果该行人ID不存在于字典中,则初始化一个空列表 if pedestrian_id not in pedestrians_traj: pedestrians_traj[pedestrian_id] = [[x, y, z]] else: pedestrians_traj[pedestrian_id].append([x, y, z]) # 同步保存多传感器数据 + file_num = f"{folder_index:06d}" for _ in range(1 + len(camera_dict)): data, sensor_name = sensor_queue.get(True, 1.0) if "lidar" in sensor_name: # lidar数据 - save_radar_data(data, world, ego_transform, actual_vehicle_num, actual_pedestrian_num, lidar_to_world_inv, all_vehicle_labels, all_pedestrian_labels, junc, town_folder) + save_radar_data(data, world, ego_transform, actual_vehicle_num, actual_pedestrian_num, lidar_to_world_inv, all_vehicle_labels, all_pedestrian_labels, junc, town_folder, file_num) else: save_camera_data(data, sensor_name, junc, town_folder) + # time.sleep(0.05) + folder_index += 1 + # 保存车辆数据 folder_name = f"{town_folder}/{junc}/vehicle_data" From 630a606e3938cac5d000cce7cfaa3bff71a42854 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Wed, 10 Dec 2025 17:33:39 +0800 Subject: [PATCH 07/31] =?UTF-8?q?=E5=B0=863D=E6=A3=80=E6=B5=8B=E6=A1=86?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E5=88=B0JPDA=E8=B7=9F=E8=B8=AA=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OpenPCDet/transformation_pkl.py | 183 ++++++++++++++++++ .../collect_intersection_camera_lidar.py | 12 +- .../multi_obj_track/detect3DBoundingBox.m | 76 ++++++-- 3 files changed, 251 insertions(+), 20 deletions(-) create mode 100644 waypoint_control/OpenPCDet/transformation_pkl.py diff --git a/waypoint_control/OpenPCDet/transformation_pkl.py b/waypoint_control/OpenPCDet/transformation_pkl.py new file mode 100644 index 0000000..f90f7f0 --- /dev/null +++ b/waypoint_control/OpenPCDet/transformation_pkl.py @@ -0,0 +1,183 @@ +import pickle +import numpy as np +import os +from scipy.io import savemat + + +def save_frames_to_mat(pkl_file, output_dir="mat_results", score_threshold=0.6): + """ + 将每一帧的检测结果保存为.mat文件 + 按照car, truck, pedestrian的顺序保存为[x, y, z, l, w, h, 0, 0, theta]格式 + 只保存score>threshold的数据 + + 参数: + pkl_file: 输入的.pkl文件路径 + output_dir: 输出.mat文件的目录 + score_threshold: 置信度阈值 + """ + # 创建输出目录 + os.makedirs(output_dir, exist_ok=True) + + # 加载pkl文件 + with open(pkl_file, 'rb') as f: + results = pickle.load(f) + + print(f"总帧数: {len(results)}") + print(f"置信度阈值: {score_threshold}") + print(f"输出目录: {output_dir}") + + # 定义类别顺序 + category_order = ['Car', 'Truck', 'Pedestrian'] + + for frame_idx, frame_result in enumerate(results): + # 获取当前帧的数据 + frame_id = frame_result.get('frame_id', f'{frame_idx:06d}') + boxes_lidar = frame_result.get('boxes_lidar', []) + scores = frame_result.get('score', []) + names = frame_result.get('name', []) + + # 如果没有检测对象,跳过 + if len(boxes_lidar) == 0: + continue + + # 初始化存储所有符合条件对象的列表 + all_detections = [] + + # 按照类别顺序处理 + for category in category_order: + # 找到当前类别的所有检测对象 + for i in range(len(boxes_lidar)): + # 检查类别是否匹配(忽略大小写) + if i >= len(names): + continue + + current_name = names[i] + current_score = scores[i] if i < len(scores) else 0.0 + + # 检查类别和置信度 + if (current_name.lower() == category.lower() and + current_score > score_threshold): + box = boxes_lidar[i] + # 转换为目标格式: [x, y, z, l, w, h, 0, 0, theta] + detection = [ + float(box[0]), # x + float(box[1]), # y + float(box[2]), # z + float(box[3]), # l (长度) + float(box[4]), # w (宽度) + float(box[5]), # h (高度) + 0.0, # 占位符1 + 0.0, # 占位符2 + float(box[6]) # yaw (旋转角) + ] + all_detections.append(detection) + + # 转换为numpy数组 + if all_detections: + detections_array = np.array(all_detections, dtype=np.float32) + else: + # 如果没有符合条件的检测对象,创建一个空数组 + detections_array = np.zeros((0, 9), dtype=np.float32) + + # 构建输出数据字典(MATLAB兼容格式) + mat_data = { + 'datapy': { + 'detections': detections_array, # 主要数据 + 'frame_id': frame_id, # 帧ID + 'num_detections': len(detections_array), # 检测数量 + 'score_threshold': score_threshold # 使用的阈值 + } + } + + # 生成输出文件名 + # 使用帧ID作为文件名,如果没有帧ID则使用序号 + if frame_id.isdigit(): + filename = f"{int(frame_id):06d}.mat" + else: + filename = f"{frame_id}.mat" + + output_path = os.path.join(output_dir, filename) + + # 保存为.mat文件 + savemat(output_path, mat_data) + + # 每处理100帧打印一次进度 + if (frame_idx + 1) % 100 == 0 or frame_idx == len(results) - 1: + print(f"已处理 {frame_idx + 1}/{len(results)} 帧") + + print(f"\n处理完成!所有.mat文件已保存到: {output_dir}") + + # 统计信息 + print(f"共处理了 {len(results)} 帧数据") + print(f"生成的.mat文件保存在: {os.path.abspath(output_dir)}") + + +def check_mat_files(output_dir="mat_results", max_files=5): + """ + 检查生成的.mat文件内容 + """ + import glob + from scipy.io import loadmat + + mat_files = sorted(glob.glob(os.path.join(output_dir, "*.mat"))) + + if not mat_files: + print(f"在 {output_dir} 中没有找到.mat文件") + return + + print(f"\n找到 {len(mat_files)} 个.mat文件") + print("检查前几个文件的内容:") + + for i, mat_file in enumerate(mat_files[:max_files]): + print(f"\n{'=' * 60}") + print(f"文件 {i + 1}: {os.path.basename(mat_file)}") + + data = loadmat(mat_file) + + # 显示基本信息 + frame_id = data.get('frame_id', ['Unknown'])[0] + num_detections = data.get('num_detections', [0])[0, 0] + + print(f"帧ID: {frame_id}") + print(f"检测对象数量: {num_detections}") + + # 显示检测对象详情 + detections = data.get('detections', np.zeros((0, 9))) + + if len(detections) > 0: + print(f"检测对象格式 (shape): {detections.shape}") + print("前几个检测对象:") + + for j in range(min(3, len(detections))): + det = detections[j] + print(f" 对象 {j}: [{det[0]:.3f}, {det[1]:.3f}, {det[2]:.3f}, " + f"{det[3]:.3f}, {det[4]:.3f}, {det[5]:.3f}, " + f"{det[6]:.0f}, {det[7]:.0f}, {det[8]:.3f}]") + + +# 主程序 +if __name__ == "__main__": + pkl_file_path = "result.pkl" # 请替换为你的.pkl文件路径 + output_directory = "matdata" # 输出目录 + + try: + # 1. 将每一帧保存为.mat文件 + save_frames_to_mat( + pkl_file_path, + output_dir=output_directory, + score_threshold=0.6 # 置信度阈值,60% = 0.6 + ) + + # 2. 检查生成的.mat文件 + # check_mat_files(output_dir=output_directory, max_files=3) + + except FileNotFoundError: + print(f"错误: 找不到文件 {pkl_file_path}") + except ImportError as e: + print(f"错误: 缺少必要的库,请安装scipy: pip install scipy") + print(f"详细错误: {e}") + except Exception as e: + print(f"处理文件时出错: {e}") + import traceback + + traceback.print_exc() \ No newline at end of file diff --git a/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py b/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py index 377cdbe..5fb8e5e 100644 --- a/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py +++ b/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py @@ -25,7 +25,7 @@ from config import IntersectionConfig, town_configurations DATA_MUN = 500 DROP_BUFFER_TIME = 50 # 车辆落地前的缓冲时间,防止车辆还没落地就开始保存图片 -FUSION_DETECTION_ACTUAL_DIS = 25 # 多目标跟踪的实际检测距离 +FUSION_DETECTION_ACTUAL_DIS = 50 # 多目标跟踪的实际检测距离 WAITE_NEXT_INTERSECTION_TIME = 300 # 等待一定时间后第二路口相机雷达开始记录数据 # 定义全局变量 global_time = 0.0 @@ -173,7 +173,7 @@ def dist(actor): # 获取行人标签 step = 2 # 每隔1个元素遍历(步长为2) - for pedestrian in pedestrian_list[::step]: + for pedestrian in pedestrian_list[1::step]: # for pedestrian in pedestrian_list: bounding_box = pedestrian.bounding_box bbox_z = bounding_box.location.z @@ -268,8 +268,8 @@ def dist(actor): all_labels.append(formatted_label) # 处理Pedestrian标签 - if len(pedestrian_labels) > 0: - for label in pedestrian_labels: + if len(pedestrian_labelspy) > 0: + for label in pedestrian_labelspy: if len(label) >= 7: formatted_label = [] for i, value in enumerate(label): @@ -876,7 +876,7 @@ def main(): scipy.io.savemat(file_path, {'truths': truths}) # 保存全部车辆ground_truth - ground_truth_file_path = os.path.join(town_folder, "ground_truth.mat") + ground_truth_file_path = os.path.join(town_folder, "vehicle_ground_truth.mat") # 转换为MATLAB兼容格式 # 转换为目标结构 mat_data = [] @@ -943,7 +943,7 @@ def main(): scipy.io.savemat(file_path, {'truths': truths}) # 保存全部行人ground_truth - ground_truth_file_path = os.path.join(town_folder, "ground_truth.mat") + ground_truth_file_path = os.path.join(town_folder, "pedestrian_ground_truth.mat") # 转换为MATLAB兼容格式 # 转换为目标结构 mat_data = [] diff --git a/waypoint_control/multi_obj_track/detect3DBoundingBox.m b/waypoint_control/multi_obj_track/detect3DBoundingBox.m index f1f347f..a02cfe5 100644 --- a/waypoint_control/multi_obj_track/detect3DBoundingBox.m +++ b/waypoint_control/multi_obj_track/detect3DBoundingBox.m @@ -1,15 +1,24 @@ function detect3DBoundingBox(junc) % 数据路径 currentPath = fileparts(mfilename('fullpath')); - detectModel = fullfile(currentPath,'trainedCustomPointPillarsDetector.mat'); - pretrainedDetector = load(detectModel,'detector'); - detector = pretrainedDetector.detector; + % detectModel = fullfile(currentPath,'trainedCustomPointPillarsDetector.mat'); + % pretrainedDetector = load(detectModel,'detector'); + % detector = pretrainedDetector.detector; dataPath = fullfile(currentPath, junc); + + folder_path = 'matdata/junc5'; + file_pattern = fullfile(folder_path, '*.mat'); + file_list = dir(file_pattern); + file_count = length(file_list); + + + classNames = {'car','truck','pedestrian'}; + colors = {'green','magenta','blue'}; % 获取目录下的所有 .mat 文件 matFiles = dir(fullfile(dataPath, "*.mat")); - + index = 1; % 遍历每个 .mat 文件 for fileIdx = 1:length(matFiles) % 加载当前 .mat 文件 @@ -48,20 +57,59 @@ function detect3DBoundingBox(junc) % 增加检测的置信度阈值(路口1使用的0.5) 0.33 0.4 0.8 - [bboxes, scores, labels] = detect(detector, ptCloudOrg, 'Threshold',0.5); - disp('Bounding Boxes:'); - disp(bboxes); - - disp('Scores:'); - disp(scores); - - disp('Labels:'); - disp(labels); - datalog.LidarData.Detections = bboxes; + % [bboxes, scores, labels] = detect(detector, ptCloudOrg, 'Threshold',0.2); + % disp('Bounding Boxes:'); + % disp(bboxes); + % + % disp('Scores:'); + % disp(scores); + % + % disp('Labels:'); + % disp(labels); + % datalog.LidarData.Detections = bboxes; + + % 读取文件 + full_path = fullfile(folder_path, file_list(index).name); + load(full_path); + + % 处理数据 + fprintf('处理第 %d 个文件: %s\n', index, file_list(index).name); + + % 更新索引 + index = index + 1; + + datalog.LidarData.Detections = datapy.detections; + + % helperShowPointCloudWith3DBoxes(ptCloud,datapy.detections,datapy.detections,classNames,colors) + % 保存更新后的数据到文件 save(fileName, 'datalog', '-v7.3'); else warning('文件 %s 中不存在有效的点云数据,跳过此文件。\n', fileName); end end +end + + +function helperShowPointCloudWith3DBoxes(ptCld,bboxes,labels,classNames,colors) + % Validate the length of classNames and colors are the same + assert(numel(classNames) == numel(colors), 'ClassNames and Colors must have the same number of elements.'); + + % Get unique categories from labels + uniqueCategories = categories(labels); + disp(uniqueCategories) + % Create a mapping from category to color + colorMap = containers.Map(uniqueCategories, colors); + labelColor = cell(size(labels)); + + % Populate labelColor based on the mapping + for i = 1:length(labels) + labelColor{i} = colorMap(char(labels(i))); + end + + figure; + ax = pcshow(ptCld); + showShape('cuboid', bboxes, 'Parent', ax, 'Opacity', 0.1, ... + 'Color', labelColor, 'LineWidth', 0.5); + zoom(ax,1.5); end \ No newline at end of file From 33083505e50e3190d26d9578f0bd681b6526e82f Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Fri, 12 Dec 2025 16:58:22 +0800 Subject: [PATCH 08/31] =?UTF-8?q?=E5=85=B3=E9=97=AD=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E9=9B=86=E6=95=B0=E6=8D=AE=E5=A2=9E=E5=BC=BA=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=95=B0=E6=8D=AE=E8=B7=AF=E5=BE=84=E5=B9=B6=E7=94=9F?= =?UTF-8?q?=E6=88=90=E4=BA=BA=E8=BD=A6=E8=BD=A8=E8=BF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pcdet/datasets/custom/custom_dataset.py | 4 +- .../multi_obj_track/VoxelRCNNTrain.m | 203 ------------------ .../collect_intersection_camera_lidar.py | 23 +- waypoint_control/multi_obj_track/demo.m | 28 +-- .../multi_obj_track/detect3DBoundingBox.m | 6 +- waypoint_control/multi_obj_track/rcnn_test.m | 183 ---------------- 6 files changed, 35 insertions(+), 412 deletions(-) delete mode 100644 waypoint_control/multi_obj_track/VoxelRCNNTrain.m delete mode 100644 waypoint_control/multi_obj_track/rcnn_test.m diff --git a/waypoint_control/OpenPCDet/pcdet/datasets/custom/custom_dataset.py b/waypoint_control/OpenPCDet/pcdet/datasets/custom/custom_dataset.py index b12306d..05ab0d3 100644 --- a/waypoint_control/OpenPCDet/pcdet/datasets/custom/custom_dataset.py +++ b/waypoint_control/OpenPCDet/pcdet/datasets/custom/custom_dataset.py @@ -260,8 +260,8 @@ def create_custom_infos(dataset_cfg, class_names, data_path, save_path, workers= print('Custom info train file is saved to %s' % val_filename) print('------------------------Start create groundtruth database for data augmentation------------------------') - dataset.set_split(train_split) - dataset.create_groundtruth_database(train_filename, split=train_split) + # dataset.set_split(train_split) + # dataset.create_groundtruth_database(train_filename, split=train_split) print('------------------------Data preparation done------------------------') diff --git a/waypoint_control/multi_obj_track/VoxelRCNNTrain.m b/waypoint_control/multi_obj_track/VoxelRCNNTrain.m deleted file mode 100644 index 9b98a7f..0000000 --- a/waypoint_control/multi_obj_track/VoxelRCNNTrain.m +++ /dev/null @@ -1,203 +0,0 @@ -%% Step 1: -% Զ· -% · -dataPath = fileparts(mfilename('fullpath')); -lidarDataPath = fullfile(dataPath, 'Lidar'); % ״ļ -labelDataPath = fullfile(dataPath, 'Cuboids'); % ǩļ· - -% ص(һļݴ洢ڴĿ¼ļ) -lds = fileDatastore(lidarDataPath,"ReadFcn",@(x) pcread(x)); - -% ر߽ǩ -gtPath = fullfile(labelDataPath,'CarlaSetLidarGroundTruth.mat'); -bboxLabels = load(gtPath,'LabelData'); -bboxTable = bboxLabels.LabelData; -bboxTable = bboxTable(:,2:4); -% ʾȫͼ -figure -ptCld = preview(lds); -ax = pcshow(ptCld.Location); -set(ax,'XLim',[-50 50],'YLim',[-40 40]); -zoom(ax,2.5); -axis off; - -% ü - -xMin = -69.12; % X Сֵ -yMin = -40.0; % Y Сֵ -zMin = -5.0; % Z Сֵ -xMax = 69.12; % X ֵ -yMax = 40.0; % Y ֵ -zMax = 5.0; % Z ֵ - -pointCloudRange = [xMin xMax yMin yMax zMin zMax]; - -% üƲǩ -bboxTable = helperProcessGroundTruthData(bboxTable,pointCloudRange); - -% 3D߽Ϣ -bds = boxLabelDatastore(bboxTable); - -cds = combine(lds,bds); - -rng(8) -totalElements = numpartitions(cds); - -% һе -shuffledIndices = randperm(totalElements); - -% ֱָѵԪص -trainRatio = 0.8; -numTrainElements = round(totalElements*trainRatio); - -% ȷѵͲԼ -trainIndices = shuffledIndices(1:numTrainElements); -testIndices = shuffledIndices(numTrainElements+1:end); - -% ݼݴ洢Ӽ -trainDs = subset(cds,trainIndices); -testDs = subset(cds,testIndices); - -trainingSample = preview(trainDs); -[ptCld,bboxes,labels] = deal(trainingSample{1},trainingSample{2},trainingSample{3}); - -% Ŀ -classNames = {'Car','Truck','Pedestrian'}; - -% ΪÿɫԻƱ߽ -colors = {'green','magenta','yellow'}; - -helperShowPointCloudWith3DBoxes(ptCld,bboxes,labels,classNames,colors) - -%% ǿ -sampleLocation = fullfile(outputFolder,"GTsamples"); -writeFiles = true; -if writeFiles - [ldsSampled,bdsSampled] = sampleLidarData(trainDs,classNames,MinPoints=[20 20 10], ... - Verbose=false,WriteLocation=sampleLocation); - cdsSampled = combine(ldsSampled,bdsSampled); - save(fullfile(sampleLocation,"augmentedSample"),"cdsSampled") -else - load(fullfile(sampleLocation,"augmentedSample")) -end - -numObjects = 10; -cdsAugmented = transform(trainDs,@(x)pcBboxOversample(x,cdsSampled,classNames,numObjects)); - -cdsAugmented = transform(cdsAugmented,@(x)helperAugmentData(x)); - -augData = preview(cdsAugmented); -[ptCld,bboxes,labels] = deal(augData{1},augData{2},augData{3}); -helperShowPointCloudWith3DBoxes(ptCld,bboxes,labels,classNames,colors) - -%% Voxel R-CNN -anchorBoxes = helperEstimate3DAnchorBoxesForVoxelRCNN(trainDs,classNames); - -detector = voxelRCNNObjectDetector("kitti",classNames,anchorBoxes,PointCloudRange=pointCloudRange); - -%% ѵѡѵģ - -options = trainingOptions("adam", ... - InitialLearnRate=0.01, ... - MiniBatchSize=4, ... - MaxEpochs=10, ... - PreprocessingEnvironment="parallel", ... - VerboseFrequency=100, ... - CheckpointFrequency=10, ... - CheckpointPath=userpath, ... - Plots="training-progress", ... - Shuffle="every-epoch", ... - L2Regularization=0.01); - -[detector,info] = trainVoxelRCNNObjectDetector(cdsAugmented,detector,options); - -%% ģͲӻ -testData = preview(testDs); -ptCloud = testData{1}; -[bboxes,score,labels] = detect(detector,ptCloud); - -helperShowPointCloudWith3DBoxes(ptCloud,bboxes,labels,classNames,colors) - -%% ģ -dataPath = fileparts(mfilename('fullpath')); % ȡǰűڵļ· -save(fullfile(dataPath, 'trainedCustomVoxelRCNNDetector.mat'), 'detector'); % ļ dataPath Ŀ¼ -%% -function helperShowPointCloudWith3DBoxes(ptCld,bboxes,labels,classNames,colors) - % Validate the length of classNames and colors are the same. - assert(numel(classNames)==numel(colors),"ClassNames and Colors must have the same number of elements.") - - % Get unique categories from labels. - uniqueCategories = categories(labels); - - % Create a mapping from category to color. - colorMap = containers.Map(uniqueCategories,colors); - labelColor = cell(size(labels)); - - % Populate labelColor based on the mapping. - for i = 1:length(labels) - labelColor{i} = colorMap(char(labels(i))); - end - - figure - ax = pcshow(ptCld); - showShape("cuboid",bboxes,Parent=ax,Opacity=0.1, ... - Color=labelColor,LineWidth=0.5) - zoom(ax,5) - -end - - -function data = helperAugmentData(data) - pc = data{1}; - - % Define outputView based on the grid-size and XYZ limits. - outView = imref3d([32,32,32],[-100,100], ... - [-100,100],[-100,100]); - rotationAngle = [-45, 45]; - rotationNoise = (rotationAngle(2) - rotationAngle(1)).*rand() + rotationAngle(1); - tform = randomAffine3d(Rotation=@() deal([0,0,1],rotationNoise), ... - Scale=[0.95 1.05], ... - XTranslation=[0 0.2], ... - YTranslation=[0 0.2], ... - ZTranslation=[0 0.1]); - - ptCloud = pctransform(pc,tform); - % Apply the same transformation to the boxes. - bbox = data{2}; - [bbox,indices] = bboxwarp(bbox,tform,outView); - if ~isempty(indices) - data{1} = ptCloud; - data{2} = bbox; - data{3} = data{1,3}(indices,:); - end -end - - -function boxTable = helperProcessGroundTruthData(boxTable,pcRange) -for colIdx = 1:size(boxTable,2) - % Apply the operation to each cell in the current column. - boxTable{:,colIdx} = cellfun(@(x) helperGetBbox(x,pcRange),boxTable{:,colIdx},UniformOutput=false); -end -end - - -function data = helperGetBbox(data,pcRange) - bbox = data; - if ~isempty(bbox) - % Get index of bounding boxes that lie within pcRange. - idx = (bbox(:,1) > pcRange(1)) & ... - (bbox(:,1) < pcRange(2)) & ... - (bbox(:,2) > pcRange(3)) & ... - (bbox(:,2) < pcRange(4)); - data = bbox(idx,:); - end -end - - -function data = helperGetRotatedRectangle(data) -bbox = data{1}; -if ~isempty(bbox) - % Convert bounding box format to rotated rectangle. - data{1} = bbox(:,[1 2 4 5 9]); -end -end \ No newline at end of file diff --git a/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py b/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py index 5fb8e5e..fd80ef0 100644 --- a/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py +++ b/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py @@ -25,7 +25,7 @@ from config import IntersectionConfig, town_configurations DATA_MUN = 500 DROP_BUFFER_TIME = 50 # 车辆落地前的缓冲时间,防止车辆还没落地就开始保存图片 -FUSION_DETECTION_ACTUAL_DIS = 50 # 多目标跟踪的实际检测距离 +FUSION_DETECTION_ACTUAL_DIS = 25 # 多目标跟踪的实际检测距离 WAITE_NEXT_INTERSECTION_TIME = 300 # 等待一定时间后第二路口相机雷达开始记录数据 # 定义全局变量 global_time = 0.0 @@ -408,10 +408,10 @@ def dist(actor): datalogpy = np.column_stack([locationpy, timestamp_array]) # 1. 直接保存 datalogpy 为 .npy - radar_folder = create_radar_folder_py() + radar_folder = create_radar_folder_py(town_folder, junc) np.save(os.path.join(radar_folder, f"{file_num}.npy"), datalogpy) # 2. 保存 label 为 .txt - label_folder = create_label_folder() + label_folder = create_label_folder(town_folder, junc) with open(os.path.join(label_folder, f"{file_num}.txt"), 'w') as f: # 处理不同的数据结构 @@ -647,17 +647,24 @@ def destroy_actor(lidar, camera_dict, vehicles, sensor_queue, pedestrians): # python用法 # 创建保存雷达数据的文件夹 -def create_radar_folder_py(): - folder_name = f"train_data" +def create_radar_folder_py(town_folder, junc): + folder_name = os.path.join("train_data", town_folder, junc, "point") # 检查文件夹是否已存在,若不存在则创建 if not os.path.exists(folder_name): os.makedirs(folder_name) print(f"Created folder: {folder_name}") return folder_name +# def create_radar_folder(junc, town_folder): +# folder_name = f"{town_folder}/{junc}" +# # 检查文件夹是否已存在,若不存在则创建 +# if not os.path.exists(folder_name): +# os.makedirs(folder_name) +# print(f"Created folder: {folder_name}") +# return folder_name # 创建保存标签数据的文件夹 -def create_label_folder(): - folder_name = f"train_data/label" +def create_label_folder(town_folder, junc): + folder_name = os.path.join("train_data", town_folder, junc, "label") if not os.path.exists(folder_name): os.makedirs(folder_name) print(f"Created folder: {folder_name}") @@ -716,7 +723,7 @@ def main(): argparser.add_argument( '-i', '--intersection', metavar='INTERSECTION', - default='road_intersection_5', # 默认路口 + default='road_intersection_1', # 默认路口 help='Name of the intersection within the town (default: road_intersection_1)' ) args = argparser.parse_args() diff --git a/waypoint_control/multi_obj_track/demo.m b/waypoint_control/multi_obj_track/demo.m index 3515615..3db14c8 100644 --- a/waypoint_control/multi_obj_track/demo.m +++ b/waypoint_control/multi_obj_track/demo.m @@ -3,8 +3,8 @@ config; % 用户输入地图名和路口编号 -townName = 'Town10'; % 例如 Town01,Town10,ZhongDian -juncNum = 1; % 请输入路口编号(1,2,3,4,5) +townName = 'Town10'; % 例如 Town01 或 Town10) +juncNum = 1; % 请输入路口编号(1 或 2) % 根据输入选择配置 if isfield(dataset, townName) @@ -20,10 +20,10 @@ transMatrix = juncConfig.TransformationMatrix; % 转换矩阵 %% 获取2D检测框 - detect2DBoundingBox(junc); + % detect2DBoundingBox(junc); %% 获取点云3D检测框 - detect3DBoundingBox(junc); + % detect3DBoundingBox(junc, juncNum); %% 在指定路口做多目标跟踪 % 多目标跟踪生成轨迹并保存 @@ -33,17 +33,17 @@ convertTrackToCarlaCoordinate(junc, transMatrix); %% 计算单个路口跟踪指标并保存 - currentPath = fileparts(mfilename('fullpath')); - folderPath = fullfile(currentPath, 'Evaluation'); + %currentPath = fileparts(mfilename('fullpath')); + %folderPath = fullfile(currentPath, 'Evaluation'); % 将文件夹添加到路径 - addpath(folderPath); - demoSingleJuncEvaluation(junc, juncConfig.juncNum); - if strcmp(townName, 'Town10') - townPath = [townName 'HD_Opt_Metric']; - else - townPath = [townName '_Metric']; - end - demoMultiSensorEvaluation(townPath); + %addpath(folderPath); + %demoSingleJuncEvaluation(junc, juncConfig.juncNum); + %if strcmp(townName, 'Town10') + % townPath = [townName 'HD_Opt_Metric']; + %else + % townPath = [townName '_Metric']; + %end + %MCTPResults = demoMultiSensorEvaluation(townPath); else error('路口编号不存在!'); end diff --git a/waypoint_control/multi_obj_track/detect3DBoundingBox.m b/waypoint_control/multi_obj_track/detect3DBoundingBox.m index a02cfe5..629139d 100644 --- a/waypoint_control/multi_obj_track/detect3DBoundingBox.m +++ b/waypoint_control/multi_obj_track/detect3DBoundingBox.m @@ -1,4 +1,4 @@ -function detect3DBoundingBox(junc) +function detect3DBoundingBox(junc, juncNum) % 数据路径 currentPath = fileparts(mfilename('fullpath')); % detectModel = fullfile(currentPath,'trainedCustomPointPillarsDetector.mat'); @@ -7,7 +7,9 @@ function detect3DBoundingBox(junc) dataPath = fullfile(currentPath, junc); - folder_path = 'matdata/junc5'; + junc = "junc"; + junc = junc + juncNum; + folder_path = fullfile('matdata', junc); file_pattern = fullfile(folder_path, '*.mat'); file_list = dir(file_pattern); file_count = length(file_list); diff --git a/waypoint_control/multi_obj_track/rcnn_test.m b/waypoint_control/multi_obj_track/rcnn_test.m deleted file mode 100644 index bef615d..0000000 --- a/waypoint_control/multi_obj_track/rcnn_test.m +++ /dev/null @@ -1,183 +0,0 @@ -%% ݼ -zipFile = matlab.internal.examples.downloadSupportFile("lidar","data/PandasetLidarData.zip"); -saveFolder = fileparts(zipFile); -unzip(zipFile,saveFolder) -outputFolder = fullfile(saveFolder,"PandasetLidarData"); - -%% -path = fullfile(outputFolder,"PointCloud"); -lds = fileDatastore(path,"ReadFcn",@(x) pcread(x)); - -gtPath = fullfile(outputFolder,"Cuboid","PandaSetLidarGroundTruth.mat"); -bboxLabels = load(gtPath,"lidarGtLabels"); -bboxTable = bboxLabels.lidarGtLabels; - -pointCloudRange = [0 70.4 -40 40 -3 1]; - -bboxTable = helperProcessGroundTruthData(bboxTable,pointCloudRange); - -bds = boxLabelDatastore(bboxTable); - -cds = combine(lds,bds); - -rng(8) -totalElements = numpartitions(cds); - -% һе -shuffledIndices = randperm(totalElements); - -% ֱָѵԪص -trainRatio = 0.8; -numTrainElements = round(totalElements*trainRatio); - -% ȷѵͲԼ -trainIndices = shuffledIndices(1:numTrainElements); -testIndices = shuffledIndices(numTrainElements+1:end); - -% ݼݴ洢Ӽ -trainDs = subset(cds,trainIndices); -testDs = subset(cds,testIndices); - -trainingSample = preview(trainDs); -[ptCld,bboxes,labels] = deal(trainingSample{1},trainingSample{2},trainingSample{3}); - -% Ŀ -classNames = {'Car','Truck','Pedestrian'}; - -% ΪÿɫԻƱ߽ -colors = {'green','magenta','yellow'}; - -helperShowPointCloudWith3DBoxes(ptCld,bboxes,labels,classNames,colors) - -%% ǿ -sampleLocation = fullfile(outputFolder,"GTsamples"); -writeFiles = true; -if writeFiles - [ldsSampled,bdsSampled] = sampleLidarData(trainDs,classNames,MinPoints=[20 20 10], ... - Verbose=false,WriteLocation=sampleLocation); - cdsSampled = combine(ldsSampled,bdsSampled); - save(fullfile(sampleLocation,"augmentedSample"),"cdsSampled") -else - load(fullfile(sampleLocation,"augmentedSample")) -end - -numObjects = 10; -cdsAugmented = transform(trainDs,@(x)pcBboxOversample(x,cdsSampled,classNames,numObjects)); - -cdsAugmented = transform(cdsAugmented,@(x)helperAugmentData(x)); - -augData = preview(cdsAugmented); -[ptCld,bboxes,labels] = deal(augData{1},augData{2},augData{3}); -helperShowPointCloudWith3DBoxes(ptCld,bboxes,labels,classNames,colors) - -%% Voxel R-CNN -anchorBoxes = helperEstimate3DAnchorBoxesForVoxelRCNN(trainDs,classNames); - -detector = voxelRCNNObjectDetector("kitti",classNames,anchorBoxes,PointCloudRange=pointCloudRange); - -%% ѵѡѵģ - -options = trainingOptions("adam", ... - InitialLearnRate=0.01, ... - MiniBatchSize=4, ... - MaxEpochs=10, ... - PreprocessingEnvironment="parallel", ... - VerboseFrequency=100, ... - CheckpointFrequency=10, ... - CheckpointPath=userpath, ... - Plots="training-progress", ... - Shuffle="every-epoch", ... - L2Regularization=0.01); - -[detector,info] = trainVoxelRCNNObjectDetector(cdsAugmented,detector,options); - -%% ģͲӻ -testData = preview(testDs); -ptCloud = testData{1}; -[bboxes,score,labels] = detect(detector,ptCloud); - -helperShowPointCloudWith3DBoxes(ptCloud,bboxes,labels,classNames,colors) - -%% ģ -dataPath = fileparts(mfilename('fullpath')); % ȡǰűڵļ· -save(fullfile(dataPath, 'trainedCustomVoxelRCNNDetector.mat'), 'detector'); % ļ dataPath Ŀ¼ -%% -function helperShowPointCloudWith3DBoxes(ptCld,bboxes,labels,classNames,colors) - % Validate the length of classNames and colors are the same. - assert(numel(classNames)==numel(colors),"ClassNames and Colors must have the same number of elements.") - - % Get unique categories from labels. - uniqueCategories = categories(labels); - - % Create a mapping from category to color. - colorMap = containers.Map(uniqueCategories,colors); - labelColor = cell(size(labels)); - - % Populate labelColor based on the mapping. - for i = 1:length(labels) - labelColor{i} = colorMap(char(labels(i))); - end - - figure - ax = pcshow(ptCld); - showShape("cuboid",bboxes,Parent=ax,Opacity=0.1, ... - Color=labelColor,LineWidth=0.5) - zoom(ax,5) - -end - - -function data = helperAugmentData(data) - pc = data{1}; - - % Define outputView based on the grid-size and XYZ limits. - outView = imref3d([32,32,32],[-100,100], ... - [-100,100],[-100,100]); - rotationAngle = [-45, 45]; - rotationNoise = (rotationAngle(2) - rotationAngle(1)).*rand() + rotationAngle(1); - tform = randomAffine3d(Rotation=@() deal([0,0,1],rotationNoise), ... - Scale=[0.95 1.05], ... - XTranslation=[0 0.2], ... - YTranslation=[0 0.2], ... - ZTranslation=[0 0.1]); - - ptCloud = pctransform(pc,tform); - % Apply the same transformation to the boxes. - bbox = data{2}; - [bbox,indices] = bboxwarp(bbox,tform,outView); - if ~isempty(indices) - data{1} = ptCloud; - data{2} = bbox; - data{3} = data{1,3}(indices,:); - end -end - - -function boxTable = helperProcessGroundTruthData(boxTable,pcRange) -for colIdx = 1:size(boxTable,2) - % Apply the operation to each cell in the current column. - boxTable{:,colIdx} = cellfun(@(x) helperGetBbox(x,pcRange),boxTable{:,colIdx},UniformOutput=false); -end -end - - -function data = helperGetBbox(data,pcRange) - bbox = data; - if ~isempty(bbox) - % Get index of bounding boxes that lie within pcRange. - idx = (bbox(:,1) > pcRange(1)) & ... - (bbox(:,1) < pcRange(2)) & ... - (bbox(:,2) > pcRange(3)) & ... - (bbox(:,2) < pcRange(4)); - data = bbox(idx,:); - end -end - - -function data = helperGetRotatedRectangle(data) -bbox = data{1}; -if ~isempty(bbox) - % Convert bounding box format to rotated rectangle. - data{1} = bbox(:,[1 2 4 5 9]); -end -end \ No newline at end of file From 07519909db34bc2e14f55ba5e47928561568ee78 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Wed, 24 Dec 2025 21:25:11 +0800 Subject: [PATCH 09/31] =?UTF-8?q?=E4=B8=BA=E8=BD=A8=E8=BF=B9=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=B1=BB=E5=88=AB=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multi_obj_track/detect2DBoundingBox.m | 9 +++++++++ .../reID/Utils/misc/extractTrackVehiclePicture.m | 6 ++++-- .../reID/Utils/misc/saveTrackVehiclePicture.m | 7 +------ .../multi_obj_track/tf/helperExtractCameraData.m | 13 +++++++++++++ .../tf/helperLidarCameraFusionDisplay.m | 9 ++++++++- 5 files changed, 35 insertions(+), 9 deletions(-) create mode 100755 waypoint_control/multi_obj_track/tf/helperExtractCameraData.m diff --git a/waypoint_control/multi_obj_track/detect2DBoundingBox.m b/waypoint_control/multi_obj_track/detect2DBoundingBox.m index b28dac2..2721f0c 100644 --- a/waypoint_control/multi_obj_track/detect2DBoundingBox.m +++ b/waypoint_control/multi_obj_track/detect2DBoundingBox.m @@ -9,6 +9,10 @@ function detect2DBoundingBox(junc) % 初始化 YOLOv4 检测器 name = "tiny-yolov4-coco"; detector = yolov4ObjectDetector(name); + + % 初始化 YOLOv8 检测器 + % name = 'yolov8s'; + % detector = yolov8ObjectDetector(name); % 遍历每个 .mat 文件 for fileIdx = 1:length(matFiles) @@ -61,6 +65,11 @@ function detect2DBoundingBox(junc) cameraData(i).Detections = filteredBboxes; end end + + % 将labels作为标签数据保存到datalog中 + validIndices = ~strcmp(labels, 'traffic light'); + filteredLabels = labels(validIndices); + cameraData(i).Category = filteredLabels; % 可选:在图片上绘制检测框并显示 % detectedImg = insertObjectAnnotation(img, "Rectangle", bboxes, labels); diff --git a/waypoint_control/multi_obj_track/reID/Utils/misc/extractTrackVehiclePicture.m b/waypoint_control/multi_obj_track/reID/Utils/misc/extractTrackVehiclePicture.m index cbe5f00..7194476 100644 --- a/waypoint_control/multi_obj_track/reID/Utils/misc/extractTrackVehiclePicture.m +++ b/waypoint_control/multi_obj_track/reID/Utils/misc/extractTrackVehiclePicture.m @@ -1,5 +1,5 @@ % 将当前视角的相机2D框和融合框作匹配,保存2D框,轨迹ID,图片 -function trkIDimg2DBox = extractTrackVehiclePicture(cameraBoxData, trkBox, trkIDs) +function trkIDimg2DBox = extractTrackVehiclePicture(cameraBoxData, trkBox, trkIDs, categoryData) numBoxes = size(trkBox, 3); % 获取数组的尺寸 trkIDimg2DBox = {}; for k = 1:numBoxes @@ -14,6 +14,7 @@ % 初始化变量来保存最小距离和对应的检测框 minDistance = inf; % 初始化为无穷大 closestBox = []; + category = []; numBoxes = size(cameraBoxData, 1); % 遍历yolo检测框 for i = 1:numBoxes @@ -27,10 +28,11 @@ if distance < minDistance minDistance = distance; closestBox = currentRow; + category = categoryData(i, :); end end % 将轨迹ID和对应的最匹配检测框保存 - trkIDimg2DBox{k} = struct('trkID', trkIDs(k), 'Box', closestBox); + trkIDimg2DBox{k} = struct('trkID', trkIDs(k), 'Box', closestBox, 'Category', category); end end diff --git a/waypoint_control/multi_obj_track/reID/Utils/misc/saveTrackVehiclePicture.m b/waypoint_control/multi_obj_track/reID/Utils/misc/saveTrackVehiclePicture.m index 98b4514..fe24c52 100644 --- a/waypoint_control/multi_obj_track/reID/Utils/misc/saveTrackVehiclePicture.m +++ b/waypoint_control/multi_obj_track/reID/Utils/misc/saveTrackVehiclePicture.m @@ -6,12 +6,7 @@ function saveTrackVehiclePicture(trkIDimg2DBox, savedImg, junc) if ~exist(imgPath, 'dir') mkdir(imgPath); end - if ispc - dirParts = strsplit(junc, '\'); - else - dirParts = strsplit(junc, '/'); - end - %dirParts = strsplit(junc, '/'); + dirParts = strsplit(junc, filesep); townPath = fullfile(imgPath, dirParts{1}); if ~exist(townPath, 'dir') mkdir(townPath); diff --git a/waypoint_control/multi_obj_track/tf/helperExtractCameraData.m b/waypoint_control/multi_obj_track/tf/helperExtractCameraData.m new file mode 100755 index 0000000..6648dd4 --- /dev/null +++ b/waypoint_control/multi_obj_track/tf/helperExtractCameraData.m @@ -0,0 +1,13 @@ +function [category, img, cameraBBoxes, pose, time] = helperExtractCameraData(dataLog, dataFolder, idx) +% This is a helper function and may be removed in a future release. + +% Copyright 2022 The MathWorks, Inc. + +imPath = fullfile(dataFolder,dataLog.CameraData(idx).ImagePath); +img = imread(imPath); +pose = dataLog.CameraData(idx).Pose; +time = dataLog.CameraData(idx).Timestamp; +cameraBBoxes = dataLog.CameraData(idx).Detections; +category = dataLog.CameraData(idx).Category; + +end \ No newline at end of file diff --git a/waypoint_control/multi_obj_track/tf/helperLidarCameraFusionDisplay.m b/waypoint_control/multi_obj_track/tf/helperLidarCameraFusionDisplay.m index 66e8319..6d6b2d6 100755 --- a/waypoint_control/multi_obj_track/tf/helperLidarCameraFusionDisplay.m +++ b/waypoint_control/multi_obj_track/tf/helperLidarCameraFusionDisplay.m @@ -132,6 +132,11 @@ function stepImpl(obj,dataFolder, dataLog, egoPose, lidarDetections, cameraDetec cameraBox = zeros(4,0); sensorIdx =0; end + category = {}; + for i = 1:6 + category1 = dataLog.CameraData(i).Category; + category = [category ; category1]; + end % 初始化目标跟踪数据 if ~isempty(tracks) states = horzcat(tracks.State); @@ -174,6 +179,8 @@ function stepImpl(obj,dataFolder, dataLog, egoPose, lidarDetections, cameraDetec if isempty(cameraBoxData) cameraBoxData = zeros(0, 4); % 保证维度为 [0, 4] end + % 获取当前相机类别数据 + categoryData = category(sensorIdx == idx(i) + 1, :); % 在图像上插入检测框注释 img = insertObjectAnnotation(img,'rectangle',cameraBoxData,'C','Color','blue','LineWidth',2); @@ -202,7 +209,7 @@ function stepImpl(obj,dataFolder, dataLog, egoPose, lidarDetections, cameraDetec trkIds(isValid):当前视角对应3D融合检测框的ID 1xN uint32 %} if ~isempty(trkBox) && any(isValid) && ~isempty(cameraBoxData) && sum(isValid) == size(cameraBoxData, 1) - trkIDimg2DBox = extractTrackVehiclePicture(cameraBoxData, trkBox(:,:,isValid), trkIds(isValid)); + trkIDimg2DBox = extractTrackVehiclePicture(cameraBoxData, trkBox(:,:,isValid), trkIds(isValid), categoryData); saveTrackVehiclePicture(trkIDimg2DBox, savedImg, junc) end From 111d2c5bdc2829923e918f301dbea45d5c454318 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Fri, 26 Dec 2025 17:30:50 +0800 Subject: [PATCH 10/31] =?UTF-8?q?=E6=BC=8F=E6=B4=9E=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multi_obj_track/reID/Utils/linkIdentities.m | 6 ++++-- .../multi_obj_track/reID/Utils/loadAllTraj.m | 10 ++++++++-- .../reID/Utils/misc/saveTrackVehiclePicture.m | 6 +++++- .../multi_obj_track/reID/Utils/processSingleJuncTraj.m | 4 +++- .../multi_obj_track/tf/helperExtractCameraData.m | 3 +-- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/waypoint_control/multi_obj_track/reID/Utils/linkIdentities.m b/waypoint_control/multi_obj_track/reID/Utils/linkIdentities.m index 0a9a5a9..884f900 100644 --- a/waypoint_control/multi_obj_track/reID/Utils/linkIdentities.m +++ b/waypoint_control/multi_obj_track/reID/Utils/linkIdentities.m @@ -38,7 +38,8 @@ 'trackID', current_traj.trackID, ... % 轨迹 ID 'wrl_pos', current_traj.wrl_pos, ... % 位置数据 'mean_hsv', current_traj.mean_hsv, ... % 特征数据 - 'timestamp', current_traj.timestamp ... % 轨迹时间 + 'timestamp', current_traj.timestamp, ... % 轨迹时间 + 'category', current_traj.category ... % 轨迹类型 ); matched_traj{end+1} = track; matched_trajectories(key{1}) = matched_traj; @@ -57,7 +58,8 @@ 'trackID', current_traj.trackID, ... % 轨迹 ID 'wrl_pos', current_traj.wrl_pos, ... % 位置数据 'mean_hsv', current_traj.mean_hsv, ... % 特征数据 - 'timestamp', current_traj.timestamp ... % 轨迹时间 + 'timestamp', current_traj.timestamp, ... % 轨迹时间 + 'category', current_traj.category ... % 轨迹类型 ); matched_trajectories(unique_id) = {track}; end diff --git a/waypoint_control/multi_obj_track/reID/Utils/loadAllTraj.m b/waypoint_control/multi_obj_track/reID/Utils/loadAllTraj.m index c1cc0b3..0cb83bb 100644 --- a/waypoint_control/multi_obj_track/reID/Utils/loadAllTraj.m +++ b/waypoint_control/multi_obj_track/reID/Utils/loadAllTraj.m @@ -23,6 +23,7 @@ function loadAllTraj(junc, transMatrix) % 获取目录下所有文件 imageFiles = dir(fullfile(tracksVehiclePicturePath, '*.jpeg')); % 或者 '*.jpeg', '*.png' 根据你的图片格式调整 + categoryFiles = dir(fullfile(tracksVehiclePicturePath, '*.mat')); numImages = numel(imageFiles); traj_data = cell(1, numImages); @@ -31,6 +32,7 @@ function loadAllTraj(junc, transMatrix) % 将数据保存到结构体中 trackerOutput.traj = traj_data; trackerOutput.traj_f = traj_f_data; + % 遍历每张图片 for k = 1:length(imageFiles) % 获取当前图片的完整路径 @@ -61,17 +63,21 @@ function loadAllTraj(junc, transMatrix) % 将特征重塑为 1x2048 的形式 features = reshape(features, 1, 2048); timestamp = loadedData.allTracks(index).Timestamps; + matFilePath = fullfile(tracksVehiclePicturePath, sprintf('%d.mat', trackID)); + load(matFilePath); + category = trajcategory.Category; trackerOutput.traj{k} = struct( ... 'trackID', trackID, ... % 轨迹 ID 'wrl_pos', worldPositions, ... % 位置数据 'mean_hsv', features, ... % 特征数据 - 'timestamp', timestamp ... % 轨迹时间 + 'timestamp', timestamp, ... % 轨迹时间 + 'category', category ... % 轨迹类型 ); trackerOutput.traj_f(k,:) = [timestamp(1), timestamp(end)]; end juncVehicleTraj = processSingleJuncTraj(trackerOutput); baseName = 'traj'; - dirParts = strsplit(junc, '\'); + dirParts = strsplit(junc, filesep); fileName = [dirParts{2}, '_', baseName, '.mat']; juncTracksFolderPath = fullfile(currentPath, dirParts{1}); if ~exist(juncTracksFolderPath, 'dir') diff --git a/waypoint_control/multi_obj_track/reID/Utils/misc/saveTrackVehiclePicture.m b/waypoint_control/multi_obj_track/reID/Utils/misc/saveTrackVehiclePicture.m index fe24c52..cc452c9 100644 --- a/waypoint_control/multi_obj_track/reID/Utils/misc/saveTrackVehiclePicture.m +++ b/waypoint_control/multi_obj_track/reID/Utils/misc/saveTrackVehiclePicture.m @@ -19,7 +19,9 @@ function saveTrackVehiclePicture(trkIDimg2DBox, savedImg, junc) for k = 1:numel(trkIDimg2DBox) % 遍历 trkIDimg2DBox 中的每个元素 trkID = trkIDimg2DBox{k}.trkID; % 获取当前元素的轨迹ID closestBox = trkIDimg2DBox{k}.Box; % 获取当前元素的检测框(Box) + category = trkIDimg2DBox{k}.Category; % 获取当前元素的类别 outputImgPath = fullfile(dataPath, sprintf('%d.jpeg', trkID)); % 使用图片索引命名 + outputCategoryPath = fullfile(dataPath, sprintf('%d.mat', trkID)); % 使用图片索引命名 % 检查该文件是否已经存在 if exist(outputImgPath, 'file') continue; % 如果文件存在,跳过当前迭代 @@ -29,8 +31,10 @@ function saveTrackVehiclePicture(trkIDimg2DBox, savedImg, junc) % 缩放到指定大小 224x224 resizedImg = imresize(croppedImg, [224, 224]); % 保存裁剪后的图像 - imwrite(resizedImg, outputImgPath); + % 保存轨迹标签信息 + trajcategory = struct('trkID', trkID, 'Category', category); + save(outputCategoryPath, 'trajcategory', '-v7.3'); end diff --git a/waypoint_control/multi_obj_track/reID/Utils/processSingleJuncTraj.m b/waypoint_control/multi_obj_track/reID/Utils/processSingleJuncTraj.m index 292215f..9939280 100644 --- a/waypoint_control/multi_obj_track/reID/Utils/processSingleJuncTraj.m +++ b/waypoint_control/multi_obj_track/reID/Utils/processSingleJuncTraj.m @@ -59,11 +59,13 @@ positions = tra{cellElement}.wrl_pos; features = tra{cellElement}.mean_hsv; timeStamp = tra{cellElement}.timestamp; + Category = tra{cellElement}.category; juncVehicleTraj.traj{i} = struct( ... 'trackID', trackID, ... % 轨迹 ID 'wrl_pos', positions, ... % 位置数据 'mean_hsv', features, ... % 特征数据 - 'timestamp', timeStamp ... % 轨迹时间 + 'timestamp', timeStamp, ... % 轨迹时间 + 'category', Category ... % 轨迹类别 ); juncVehicleTraj.traj_f(i,:) = [timeStamp(1), timeStamp(end)]; end diff --git a/waypoint_control/multi_obj_track/tf/helperExtractCameraData.m b/waypoint_control/multi_obj_track/tf/helperExtractCameraData.m index 6648dd4..e852d1c 100755 --- a/waypoint_control/multi_obj_track/tf/helperExtractCameraData.m +++ b/waypoint_control/multi_obj_track/tf/helperExtractCameraData.m @@ -1,4 +1,4 @@ -function [category, img, cameraBBoxes, pose, time] = helperExtractCameraData(dataLog, dataFolder, idx) +function [img, cameraBBoxes, pose, time] = helperExtractCameraData(dataLog, dataFolder, idx) % This is a helper function and may be removed in a future release. % Copyright 2022 The MathWorks, Inc. @@ -8,6 +8,5 @@ pose = dataLog.CameraData(idx).Pose; time = dataLog.CameraData(idx).Timestamp; cameraBBoxes = dataLog.CameraData(idx).Detections; -category = dataLog.CameraData(idx).Category; end \ No newline at end of file From 3c7737e253924e3ee8fa580e5b281383e1683fb2 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Tue, 30 Dec 2025 17:36:09 +0800 Subject: [PATCH 11/31] =?UTF-8?q?=E5=BE=97=E5=88=B0=E5=AD=AA=E7=94=9F?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- waypoint_control/multi_obj_track/mergetraj.m | 9 + .../navigation/agents/__init__.py | 0 .../navigation/agents/navigation/__init__.py | 0 .../agents/navigation/controller.py | 256 +++++++++++++ .../agents/navigation/local_planner.py | 354 ++++++++++++++++++ .../navigation/agents/tools/__init__.py | 0 .../navigation/agents/tools/misc.py | 174 +++++++++ .../multi_obj_track/navigation/config.py | 185 +++++++++ 8 files changed, 978 insertions(+) create mode 100644 waypoint_control/multi_obj_track/mergetraj.m create mode 100644 waypoint_control/multi_obj_track/navigation/agents/__init__.py create mode 100644 waypoint_control/multi_obj_track/navigation/agents/navigation/__init__.py create mode 100644 waypoint_control/multi_obj_track/navigation/agents/navigation/controller.py create mode 100644 waypoint_control/multi_obj_track/navigation/agents/navigation/local_planner.py create mode 100644 waypoint_control/multi_obj_track/navigation/agents/tools/__init__.py create mode 100644 waypoint_control/multi_obj_track/navigation/agents/tools/misc.py create mode 100644 waypoint_control/multi_obj_track/navigation/config.py diff --git a/waypoint_control/multi_obj_track/mergetraj.m b/waypoint_control/multi_obj_track/mergetraj.m new file mode 100644 index 0000000..5704cb4 --- /dev/null +++ b/waypoint_control/multi_obj_track/mergetraj.m @@ -0,0 +1,9 @@ +% 加载两个 .mat 文件 +data1 = load('Town10HD_Opt/pedestrian_ground_truth.mat'); +data2 = load('Town10HD_Opt/vehicle_ground_truth.mat'); + +% 横向合并(水平连接) +truth_data = [data1.pedestrian_cells, data2.vehicle_cells]; + +% 保存合并后的数据到新文件 +save('ground_truth.mat', 'truth_data'); \ No newline at end of file diff --git a/waypoint_control/multi_obj_track/navigation/agents/__init__.py b/waypoint_control/multi_obj_track/navigation/agents/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/waypoint_control/multi_obj_track/navigation/agents/navigation/__init__.py b/waypoint_control/multi_obj_track/navigation/agents/navigation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/waypoint_control/multi_obj_track/navigation/agents/navigation/controller.py b/waypoint_control/multi_obj_track/navigation/agents/navigation/controller.py new file mode 100644 index 0000000..e40acbd --- /dev/null +++ b/waypoint_control/multi_obj_track/navigation/agents/navigation/controller.py @@ -0,0 +1,256 @@ +# Copyright (c) # Copyright (c) 2018-2020 CVC. +# +# This work is licensed under the terms of the MIT license. +# For a copy, see . + +""" This module contains PID controllers to perform lateral and longitudinal control. """ + +from collections import deque +import math +import numpy as np +import carla +from agents.tools.misc import get_speed + + +class VehiclePIDController(): + """ + VehiclePIDController is the combination of two PID controllers + (lateral and longitudinal) to perform the + low level control a vehicle from client side + """ + + def __init__(self, vehicle, args_lateral, args_longitudinal, offset=0, max_throttle=0.75, max_brake=0.3, + max_steering=0.8): + """ + Constructor method. + + :param vehicle: actor to apply to local planner logic onto + :param args_lateral: dictionary of arguments to set the lateral PID controller + using the following semantics: + K_P -- Proportional term + K_D -- Differential term + K_I -- Integral term + :param args_longitudinal: dictionary of arguments to set the longitudinal + PID controller using the following semantics: + K_P -- Proportional term + K_D -- Differential term + K_I -- Integral term + :param offset: If different than zero, the vehicle will drive displaced from the center line. + Positive values imply a right offset while negative ones mean a left one. Numbers high enough + to cause the vehicle to drive through other lanes might break the controller. + """ + + self.max_brake = max_brake + self.max_throt = max_throttle + self.max_steer = max_steering + + self._vehicle = vehicle + self._world = self._vehicle.get_world() + self.past_steering = self._vehicle.get_control().steer + self._lon_controller = PIDLongitudinalController(self._vehicle, **args_longitudinal) + self._lat_controller = PIDLateralController(self._vehicle, offset, **args_lateral) + + def run_step(self, target_speed, waypoint): + """ + Execute one step of control invoking both lateral and longitudinal + PID controllers to reach a target waypoint + at a given target_speed. + + :param target_speed: desired vehicle speed + :param waypoint: target location encoded as a waypoint + :return: distance (in meters) to the waypoint + """ + + acceleration = self._lon_controller.run_step(target_speed) + current_steering = self._lat_controller.run_step(waypoint) + control = carla.VehicleControl() + if acceleration >= 0.0: + control.throttle = min(acceleration, self.max_throt) + control.brake = 0.0 + else: + control.throttle = 0.0 + control.brake = min(abs(acceleration), self.max_brake) + + # Steering regulation: changes cannot happen abruptly, can't steer too much. + + if current_steering > self.past_steering + 0.1: + current_steering = self.past_steering + 0.1 + elif current_steering < self.past_steering - 0.1: + current_steering = self.past_steering - 0.1 + + if current_steering >= 0: + steering = min(self.max_steer, current_steering) + else: + steering = max(-self.max_steer, current_steering) + + control.steer = steering + control.hand_brake = False + control.manual_gear_shift = False + self.past_steering = steering + + return control + + def change_longitudinal_PID(self, args_longitudinal): + """Changes the parameters of the PIDLongitudinalController""" + self._lon_controller.change_parameters(**args_longitudinal) + + def change_lateral_PID(self, args_lateral): + """Changes the parameters of the PIDLongitudinalController""" + self._lon_controller.change_parameters(**args_lateral) + + +class PIDLongitudinalController(): + """ + PIDLongitudinalController implements longitudinal control using a PID. + """ + + def __init__(self, vehicle, K_P=1.0, K_I=0.0, K_D=0.0, dt=0.03): + """ + Constructor method. + + :param vehicle: actor to apply to local planner logic onto + :param K_P: Proportional term + :param K_D: Differential term + :param K_I: Integral term + :param dt: time differential in seconds + """ + self._vehicle = vehicle + self._k_p = K_P + self._k_i = K_I + self._k_d = K_D + self._dt = dt + self._error_buffer = deque(maxlen=10) + + def run_step(self, target_speed, debug=False): + """ + Execute one step of longitudinal control to reach a given target speed. + + :param target_speed: target speed in Km/h + :param debug: boolean for debugging + :return: throttle control + """ + current_speed = get_speed(self._vehicle) + + if debug: + print('Current speed = {}'.format(current_speed)) + + return self._pid_control(target_speed, current_speed) + + def _pid_control(self, target_speed, current_speed): + """ + Estimate the throttle/brake of the vehicle based on the PID equations + + :param target_speed: target speed in Km/h + :param current_speed: current speed of the vehicle in Km/h + :return: throttle/brake control + """ + + error = target_speed - current_speed + self._error_buffer.append(error) + + if len(self._error_buffer) >= 2: + _de = (self._error_buffer[-1] - self._error_buffer[-2]) / self._dt + _ie = sum(self._error_buffer) * self._dt + else: + _de = 0.0 + _ie = 0.0 + + return np.clip((self._k_p * error) + (self._k_d * _de) + (self._k_i * _ie), -1.0, 1.0) + + def change_parameters(self, K_P, K_I, K_D, dt): + """Changes the PID parameters""" + self._k_p = K_P + self._k_i = K_I + self._k_d = K_D + self._dt = dt + + +class PIDLateralController(): + """ + PIDLateralController implements lateral control using a PID. + """ + + def __init__(self, vehicle, offset=0, K_P=1.0, K_I=0.0, K_D=0.0, dt=0.03): + """ + Constructor method. + + :param vehicle: actor to apply to local planner logic onto + :param offset: distance to the center line. If might cause issues if the value + is large enough to make the vehicle invade other lanes. + :param K_P: Proportional term + :param K_D: Differential term + :param K_I: Integral term + :param dt: time differential in seconds + """ + self._vehicle = vehicle + self._k_p = K_P + self._k_i = K_I + self._k_d = K_D + self._dt = dt + self._offset = offset + self._e_buffer = deque(maxlen=10) + + def run_step(self, waypoint): + """ + Execute one step of lateral control to steer + the vehicle towards a certain waypoin. + + :param waypoint: target waypoint + :return: steering control in the range [-1, 1] where: + -1 maximum steering to left + +1 maximum steering to right + """ + return self._pid_control(waypoint, self._vehicle.get_transform()) + + def _pid_control(self, waypoint, vehicle_transform): + """ + Estimate the steering angle of the vehicle based on the PID equations + + :param waypoint: target waypoint + :param vehicle_transform: current transform of the vehicle + :return: steering control in the range [-1, 1] + """ + # Get the ego's location and forward vector + ego_loc = vehicle_transform.location + v_vec = vehicle_transform.get_forward_vector() + v_vec = np.array([v_vec.x, v_vec.y, 0.0]) + + # Get the vector vehicle-target_wp + if self._offset != 0: + # Displace the wp to the side + w_tran = waypoint.transform + r_vec = w_tran.get_right_vector() + w_loc = w_tran.location + carla.Location(x=self._offset * r_vec.x, + y=self._offset * r_vec.y) + else: + w_loc = waypoint.transform.location + + w_vec = np.array([w_loc.x - ego_loc.x, + w_loc.y - ego_loc.y, + 0.0]) + + wv_linalg = np.linalg.norm(w_vec) * np.linalg.norm(v_vec) + if wv_linalg == 0: + _dot = 1 + else: + _dot = math.acos(np.clip(np.dot(w_vec, v_vec) / (wv_linalg), -1.0, 1.0)) + _cross = np.cross(v_vec, w_vec) + if _cross[2] < 0: + _dot *= -1.0 + + self._e_buffer.append(_dot) + if len(self._e_buffer) >= 2: + _de = (self._e_buffer[-1] - self._e_buffer[-2]) / self._dt + _ie = sum(self._e_buffer) * self._dt + else: + _de = 0.0 + _ie = 0.0 + + return np.clip((self._k_p * _dot) + (self._k_d * _de) + (self._k_i * _ie), -1.0, 1.0) + + def change_parameters(self, K_P, K_I, K_D, dt): + """Changes the PID parameters""" + self._k_p = K_P + self._k_i = K_I + self._k_d = K_D + self._dt = dt diff --git a/waypoint_control/multi_obj_track/navigation/agents/navigation/local_planner.py b/waypoint_control/multi_obj_track/navigation/agents/navigation/local_planner.py new file mode 100644 index 0000000..2ecaffc --- /dev/null +++ b/waypoint_control/multi_obj_track/navigation/agents/navigation/local_planner.py @@ -0,0 +1,354 @@ +# Copyright (c) # Copyright (c) 2018-2020 CVC. +# +# This work is licensed under the terms of the MIT license. +# For a copy, see . + +""" This module contains a local planner to perform low-level waypoint following based on PID controllers. """ + +from enum import IntEnum +from collections import deque +import random + +import carla +from agents.navigation.controller import VehiclePIDController +from agents.tools.misc import draw_waypoints, get_speed + + +class RoadOption(IntEnum): + """ + RoadOption represents the possible topological configurations when moving from a segment of lane to other. + + """ + VOID = -1 + LEFT = 1 + RIGHT = 2 + STRAIGHT = 3 + LANEFOLLOW = 4 + CHANGELANELEFT = 5 + CHANGELANERIGHT = 6 + + +class LocalPlanner(object): + """ + LocalPlanner implements the basic behavior of following a + trajectory of waypoints that is generated on-the-fly. + + The low-level motion of the vehicle is computed by using two PID controllers, + one is used for the lateral control and the other for the longitudinal control (cruise speed). + + When multiple paths are available (intersections) this local planner makes a random choice, + unless a given global plan has already been specified. + """ + + def __init__(self, vehicle, opt_dict={}, map_inst=None): + """ + :param vehicle: actor to apply to local planner logic onto + :param opt_dict: dictionary of arguments with different parameters: + dt: time between simulation steps + target_speed: desired cruise speed in Km/h + sampling_radius: distance between the waypoints part of the plan + lateral_control_dict: values of the lateral PID controller + longitudinal_control_dict: values of the longitudinal PID controller + max_throttle: maximum throttle applied to the vehicle + max_brake: maximum brake applied to the vehicle + max_steering: maximum steering applied to the vehicle + offset: distance between the route waypoints and the center of the lane + :param map_inst: carla.Map instance to avoid the expensive call of getting it. + """ + self._vehicle = vehicle + self._world = self._vehicle.get_world() + if map_inst: + if isinstance(map_inst, carla.Map): + self._map = map_inst + else: + print("Warning: Ignoring the given map as it is not a 'carla.Map'") + self._map = self._world.get_map() + else: + self._map = self._world.get_map() + + self._vehicle_controller = None + self.target_waypoint = None + self.target_road_option = None + + self._waypoints_queue = deque(maxlen=10000) + self._min_waypoint_queue_length = 100 + self._stop_waypoint_creation = False + + # Base parameters + self._dt = 1.0 / 20.0 + self._target_speed = 20.0 # Km/h + self._sampling_radius = 2.0 + self._args_lateral_dict = {'K_P': 1.95, 'K_I': 0.05, 'K_D': 0.2, 'dt': self._dt} + self._args_longitudinal_dict = {'K_P': 1.0, 'K_I': 0.05, 'K_D': 0, 'dt': self._dt} + self._max_throt = 0.75 + self._max_brake = 0.3 + self._max_steer = 0.8 + self._offset = 0 + self._base_min_distance = 3.0 + self._distance_ratio = 0.5 + self._follow_speed_limits = False + + # Overload parameters + if opt_dict: + if 'dt' in opt_dict: + self._dt = opt_dict['dt'] + if 'target_speed' in opt_dict: + self._target_speed = opt_dict['target_speed'] + if 'sampling_radius' in opt_dict: + self._sampling_radius = opt_dict['sampling_radius'] + if 'lateral_control_dict' in opt_dict: + self._args_lateral_dict = opt_dict['lateral_control_dict'] + if 'longitudinal_control_dict' in opt_dict: + self._args_longitudinal_dict = opt_dict['longitudinal_control_dict'] + if 'max_throttle' in opt_dict: + self._max_throt = opt_dict['max_throttle'] + if 'max_brake' in opt_dict: + self._max_brake = opt_dict['max_brake'] + if 'max_steering' in opt_dict: + self._max_steer = opt_dict['max_steering'] + if 'offset' in opt_dict: + self._offset = opt_dict['offset'] + if 'base_min_distance' in opt_dict: + self._base_min_distance = opt_dict['base_min_distance'] + if 'distance_ratio' in opt_dict: + self._distance_ratio = opt_dict['distance_ratio'] + if 'follow_speed_limits' in opt_dict: + self._follow_speed_limits = opt_dict['follow_speed_limits'] + + # initializing controller + self._init_controller() + + def reset_vehicle(self): + """Reset the ego-vehicle""" + self._vehicle = None + + def _init_controller(self): + """Controller initialization""" + self._vehicle_controller = VehiclePIDController(self._vehicle, + args_lateral=self._args_lateral_dict, + args_longitudinal=self._args_longitudinal_dict, + offset=self._offset, + max_throttle=self._max_throt, + max_brake=self._max_brake, + max_steering=self._max_steer) + + # Compute the current vehicle waypoint + current_waypoint = self._map.get_waypoint(self._vehicle.get_location()) + self.target_waypoint, self.target_road_option = (current_waypoint, RoadOption.LANEFOLLOW) + self._waypoints_queue.append((self.target_waypoint, self.target_road_option)) + + def set_speed(self, speed): + """ + Changes the target speed + + :param speed: new target speed in Km/h + :return: + """ + if self._follow_speed_limits: + print("WARNING: The max speed is currently set to follow the speed limits. " + "Use 'follow_speed_limits' to deactivate this") + self._target_speed = speed + + def follow_speed_limits(self, value=True): + """ + Activates a flag that makes the max speed dynamically vary according to the spped limits + + :param value: bool + :return: + """ + self._follow_speed_limits = value + + def _compute_next_waypoints(self, k=1): + """ + Add new waypoints to the trajectory queue. + + :param k: how many waypoints to compute + :return: + """ + # check we do not overflow the queue + available_entries = self._waypoints_queue.maxlen - len(self._waypoints_queue) + k = min(available_entries, k) + + for _ in range(k): + last_waypoint = self._waypoints_queue[-1][0] + next_waypoints = list(last_waypoint.next(self._sampling_radius)) + + if len(next_waypoints) == 0: + break + elif len(next_waypoints) == 1: + # only one option available ==> lanefollowing + next_waypoint = next_waypoints[0] + road_option = RoadOption.LANEFOLLOW + else: + # random choice between the possible options + road_options_list = _retrieve_options( + next_waypoints, last_waypoint) + road_option = random.choice(road_options_list) + next_waypoint = next_waypoints[road_options_list.index( + road_option)] + + self._waypoints_queue.append((next_waypoint, road_option)) + + def set_global_plan(self, current_plan, stop_waypoint_creation=True, clean_queue=True): + """ + Adds a new plan to the local planner. A plan must be a list of [carla.Waypoint, RoadOption] pairs + The 'clean_queue` parameter erases the previous plan if True, otherwise, it adds it to the old one + The 'stop_waypoint_creation' flag stops the automatic creation of random waypoints + + :param current_plan: list of (carla.Waypoint, RoadOption) + :param stop_waypoint_creation: bool + :param clean_queue: bool + :return: + """ + if clean_queue: + # self._waypoints_queue 是一个 deque(双端队列),用于存储局部规划中的航点。 + self._waypoints_queue.clear() + + # Remake the waypoints queue if the new plan has a higher length than the queue + new_plan_length = len(current_plan) + len(self._waypoints_queue) + # 如果新计划的长度超过了 waypoints_queue 的最大长度 maxlen,则需要扩展队列的大小, + # 重新创建一个长度更大的双端队列(deque) + if new_plan_length > self._waypoints_queue.maxlen: + new_waypoint_queue = deque(maxlen=new_plan_length) + for wp in self._waypoints_queue: + new_waypoint_queue.append(wp) + self._waypoints_queue = new_waypoint_queue + # 将每一个 (carla.Waypoint, RoadOption) 对应的航点和路选信息添加到 waypoints_queue 中。 + for elem in current_plan: + self._waypoints_queue.append(elem) + + self._stop_waypoint_creation = stop_waypoint_creation + + def run_step(self, debug=False): + """ + Execute one step of local planning which involves running the longitudinal and lateral PID controllers to + follow the waypoints trajectory. + + :param debug: boolean flag to activate waypoints debugging + :return: control to be applied + """ + # 如果启用了速度限制(_follow_speed_limits 为真),则将目标速度设置为车辆当前的速度限制 + if self._follow_speed_limits: + self._target_speed = self._vehicle.get_speed_limit() + + # Add more waypoints too few in the horizon + if not self._stop_waypoint_creation and len(self._waypoints_queue) < self._min_waypoint_queue_length: + self._compute_next_waypoints(k=self._min_waypoint_queue_length) + + # 清除过时的航点 + veh_location = self._vehicle.get_location() + vehicle_speed = get_speed(self._vehicle) / 3.6 + self._min_distance = self._base_min_distance + self._distance_ratio * vehicle_speed + + num_waypoint_removed = 0 + for waypoint, _ in self._waypoints_queue: + + if len(self._waypoints_queue) - num_waypoint_removed == 1: + min_distance = 1 # Don't remove the last waypoint until very close by + else: + min_distance = self._min_distance + + if veh_location.distance(waypoint.transform.location) < min_distance: + num_waypoint_removed += 1 + else: + break + + # 从局部规划器的航点队列中移除已经过时的航点 + if num_waypoint_removed > 0: + for _ in range(num_waypoint_removed): + self._waypoints_queue.popleft() + + # 获取目标航点并执行控制 Stop if no target waypoint + if len(self._waypoints_queue) == 0: + control = carla.VehicleControl() + control.steer = 0.0 + control.throttle = 0.0 + control.brake = 1.0 + control.hand_brake = False + control.manual_gear_shift = False + else: + self.target_waypoint, self.target_road_option = self._waypoints_queue[0] + control = self._vehicle_controller.run_step(self._target_speed, self.target_waypoint) + + # if debug: + # draw_waypoints(self._vehicle.get_world(), [self.target_waypoint], 1.0) + + return control + + def get_incoming_waypoint_and_direction(self, steps=3): + """ + Returns direction and waypoint at a distance ahead defined by the user. + + :param steps: number of steps to get the incoming waypoint. + """ + # print(steps) + if len(self._waypoints_queue) > steps: + return self._waypoints_queue[steps] + + else: + try: + wpt, direction = self._waypoints_queue[-1] + return wpt, direction + except IndexError as i: + return None, RoadOption.VOID + + def get_plan(self): + """Returns the current plan of the local planner""" + return self._waypoints_queue + + def done(self): + """ + Returns whether or not the planner has finished + + :return: boolean + """ + return len(self._waypoints_queue) == 0 + + +def _retrieve_options(list_waypoints, current_waypoint): + """ + Compute the type of connection between the current active waypoint and the multiple waypoints present in + list_waypoints. The result is encoded as a list of RoadOption enums. + + :param list_waypoints: list with the possible target waypoints in case of multiple options + :param current_waypoint: current active waypoint + :return: list of RoadOption enums representing the type of connection from the active waypoint to each + candidate in list_waypoints + """ + options = [] + for next_waypoint in list_waypoints: + # this is needed because something we are linking to + # the beggining of an intersection, therefore the + # variation in angle is small + next_next_waypoint = next_waypoint.next(3.0)[0] + link = _compute_connection(current_waypoint, next_next_waypoint) + options.append(link) + + return options + + +def _compute_connection(current_waypoint, next_waypoint, threshold=35): + """ + Compute the type of topological connection between an active waypoint (current_waypoint) and a target waypoint + (next_waypoint). + + :param current_waypoint: active waypoint + :param next_waypoint: target waypoint + :return: the type of topological connection encoded as a RoadOption enum: + RoadOption.STRAIGHT + RoadOption.LEFT + RoadOption.RIGHT + """ + n = next_waypoint.transform.rotation.yaw + n = n % 360.0 + + c = current_waypoint.transform.rotation.yaw + c = c % 360.0 + + diff_angle = (n - c) % 180.0 + if diff_angle < threshold or diff_angle > (180 - threshold): + return RoadOption.STRAIGHT + elif diff_angle > 90.0: + return RoadOption.LEFT + else: + return RoadOption.RIGHT diff --git a/waypoint_control/multi_obj_track/navigation/agents/tools/__init__.py b/waypoint_control/multi_obj_track/navigation/agents/tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/waypoint_control/multi_obj_track/navigation/agents/tools/misc.py b/waypoint_control/multi_obj_track/navigation/agents/tools/misc.py new file mode 100644 index 0000000..4ac7411 --- /dev/null +++ b/waypoint_control/multi_obj_track/navigation/agents/tools/misc.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 Intel Labs. +# authors: German Ros (german.ros@intel.com) +# +# This work is licensed under the terms of the MIT license. +# For a copy, see . + +""" Module with auxiliary functions. """ + +import math +import numpy as np +import carla + + +def draw_waypoints(world, waypoints, z=0.5): + """ + Draw a list of waypoints at a certain height given in z. + + :param world: carla.world object + :param waypoints: list or iterable container with the waypoints to draw + :param z: height in meters + """ + for wpt in waypoints: + wpt_t = wpt.transform + begin = wpt_t.location + carla.Location(z=z) + angle = math.radians(wpt_t.rotation.yaw) + end = begin + carla.Location(x=math.cos(angle), y=math.sin(angle)) + world.debug.draw_arrow(begin, end, arrow_size=0.3, life_time=1.0) + + +def get_speed(vehicle): + """ + Compute speed of a vehicle in Km/h. + + :param vehicle: the vehicle for which speed is calculated + :return: speed as a float in Km/h + """ + vel = vehicle.get_velocity() + + return 3.6 * math.sqrt(vel.x ** 2 + vel.y ** 2 + vel.z ** 2) + + +def get_trafficlight_trigger_location(traffic_light): + """ + Calculates the yaw of the waypoint that represents the trigger volume of the traffic light + """ + + def rotate_point(point, radians): + """ + rotate a given point by a given angle + """ + rotated_x = math.cos(radians) * point.x - math.sin(radians) * point.y + rotated_y = math.sin(radians) * point.x - math.cos(radians) * point.y + + return carla.Vector3D(rotated_x, rotated_y, point.z) + + base_transform = traffic_light.get_transform() + base_rot = base_transform.rotation.yaw + area_loc = base_transform.transform(traffic_light.trigger_volume.location) + area_ext = traffic_light.trigger_volume.extent + + point = rotate_point(carla.Vector3D(0, 0, area_ext.z), math.radians(base_rot)) + point_location = area_loc + carla.Location(x=point.x, y=point.y) + + return carla.Location(point_location.x, point_location.y, point_location.z) + + +def is_within_distance(target_transform, reference_transform, max_distance, angle_interval=None): + """ + Check if a location is both within a certain distance from a reference object. + By using 'angle_interval', the angle between the location and reference transform + will also be tkaen into account, being 0 a location in front and 180, one behind. + + :param target_transform: location of the target object + :param reference_transform: location of the reference object + :param max_distance: maximum allowed distance + :param angle_interval: only locations between [min, max] angles will be considered. This isn't checked by default. + :return: boolean + """ + target_vector = np.array([ + target_transform.location.x - reference_transform.location.x, + target_transform.location.y - reference_transform.location.y + ]) + norm_target = np.linalg.norm(target_vector) + + # If the vector is too short, we can simply stop here + if norm_target < 0.001: + return True + + # Further than the max distance + if norm_target > max_distance: + return False + + # We don't care about the angle, nothing else to check + if not angle_interval: + return True + + min_angle = angle_interval[0] + max_angle = angle_interval[1] + + fwd = reference_transform.get_forward_vector() + forward_vector = np.array([fwd.x, fwd.y]) + angle = math.degrees(math.acos(np.clip(np.dot(forward_vector, target_vector) / norm_target, -1., 1.))) + + return min_angle < angle < max_angle + + +def compute_magnitude_angle(target_location, current_location, orientation): + """ + Compute relative angle and distance between a target_location and a current_location + + :param target_location: location of the target object + :param current_location: location of the reference object + :param orientation: orientation of the reference object + :return: a tuple composed by the distance to the object and the angle between both objects + """ + target_vector = np.array([target_location.x - current_location.x, target_location.y - current_location.y]) + norm_target = np.linalg.norm(target_vector) + + forward_vector = np.array([math.cos(math.radians(orientation)), math.sin(math.radians(orientation))]) + d_angle = math.degrees(math.acos(np.clip(np.dot(forward_vector, target_vector) / norm_target, -1., 1.))) + + return (norm_target, d_angle) + + +def distance_vehicle(waypoint, vehicle_transform): + """ + Returns the 2D distance from a waypoint to a vehicle + + :param waypoint: actual waypoint + :param vehicle_transform: transform of the target vehicle + """ + loc = vehicle_transform.location + x = waypoint.transform.location.x - loc.x + y = waypoint.transform.location.y - loc.y + + return math.sqrt(x * x + y * y) + + +def vector(location_1, location_2): + """ + Returns the unit vector from location_1 to location_2 + + :param location_1, location_2: carla.Location objects + """ + x = location_2.x - location_1.x + y = location_2.y - location_1.y + z = location_2.z - location_1.z + norm = np.linalg.norm([x, y, z]) + np.finfo(float).eps + + return [x / norm, y / norm, z / norm] + + +def compute_distance(location_1, location_2): + """ + Euclidean distance between 3D points + + :param location_1, location_2: 3D points + """ + x = location_2.x - location_1.x + y = location_2.y - location_1.y + z = location_2.z - location_1.z + norm = np.linalg.norm([x, y, z]) + np.finfo(float).eps + return norm + + +def positive(num): + """ + Return the given number if positive, else 0 + + :param num: value to check + """ + return num if num > 0.0 else 0.0 diff --git a/waypoint_control/multi_obj_track/navigation/config.py b/waypoint_control/multi_obj_track/navigation/config.py new file mode 100644 index 0000000..d2e9c26 --- /dev/null +++ b/waypoint_control/multi_obj_track/navigation/config.py @@ -0,0 +1,185 @@ +import carla + + +class IntersectionConfig: + def __init__(self, ego_vehicle_position, camera_positions): + self.ego_vehicle_position = ego_vehicle_position + self.camera_positions = camera_positions + + +town_configurations = { + "Town01": { + "road_intersection_1": IntersectionConfig( + carla.Transform(carla.Location(x=90, y=59, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), + { + "back_camera": carla.Transform(carla.Location(x=90, y=52, z=3.6), + carla.Rotation(pitch=0, yaw=-90, roll=0)), + "front_camera": carla.Transform(carla.Location(x=90, y=66, z=3.6), + carla.Rotation(pitch=0, yaw=90, roll=0)), + "right_camera": carla.Transform(carla.Location(x=86, y=52, z=3.6), + carla.Rotation(pitch=0, yaw=-180, roll=0)), + "front_right_camera": carla.Transform(carla.Location(x=86, y=66, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "left_camera": carla.Transform(carla.Location(x=94, y=52, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)), + "front_left_camera": carla.Transform(carla.Location(x=94, y=66, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)) + } + ), + "road_intersection_2": IntersectionConfig( + carla.Transform(carla.Location(x=336, y=197, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), + { + "back_camera": carla.Transform(carla.Location(x=336, y=190, z=3.6), + carla.Rotation(pitch=0, yaw=-90, roll=0)), + "front_camera": carla.Transform(carla.Location(x=336, y=204, z=3.6), + carla.Rotation(pitch=0, yaw=90, roll=0)), + "right_camera": carla.Transform(carla.Location(x=332, y=190, z=3.6), + carla.Rotation(pitch=0, yaw=-180, roll=0)), + "front_right_camera": carla.Transform(carla.Location(x=332, y=204, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "left_camera": carla.Transform(carla.Location(x=340, y=190, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)), + "front_left_camera": carla.Transform(carla.Location(x=340, y=204, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)) + } + ), + "road_intersection_3": IntersectionConfig( + carla.Transform(carla.Location(x=336, y=328, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), + { + "back_camera": carla.Transform(carla.Location(x=336, y=321, z=3.6), + carla.Rotation(pitch=0, yaw=-90, roll=0)), + "front_camera": carla.Transform(carla.Location(x=336, y=335, z=3.6), + carla.Rotation(pitch=0, yaw=90, roll=0)), + "right_camera": carla.Transform(carla.Location(x=332, y=321, z=3.6), + carla.Rotation(pitch=0, yaw=-180, roll=0)), + "front_right_camera": carla.Transform(carla.Location(x=332, y=335, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "left_camera": carla.Transform(carla.Location(x=340, y=321, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)), + "front_left_camera": carla.Transform(carla.Location(x=340, y=335, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)) + } + ), + "road_intersection_4": IntersectionConfig( + carla.Transform(carla.Location(x=336, y=59, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), + { + "back_camera": carla.Transform(carla.Location(x=336, y=52, z=3.6), + carla.Rotation(pitch=0, yaw=-90, roll=0)), + "front_camera": carla.Transform(carla.Location(x=336, y=66, z=3.6), + carla.Rotation(pitch=0, yaw=90, roll=0)), + "right_camera": carla.Transform(carla.Location(x=332, y=52, z=3.6), + carla.Rotation(pitch=0, yaw=-180, roll=0)), + "front_right_camera": carla.Transform(carla.Location(x=332, y=66, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "left_camera": carla.Transform(carla.Location(x=340, y=52, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)), + "front_left_camera": carla.Transform(carla.Location(x=340, y=66, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)) + } + ), + "road_intersection_5": IntersectionConfig( + carla.Transform(carla.Location(x=90, y=197, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), + { + "back_camera": carla.Transform(carla.Location(x=90, y=190, z=3.6), + carla.Rotation(pitch=0, yaw=-90, roll=0)), + "front_camera": carla.Transform(carla.Location(x=90, y=204, z=3.6), + carla.Rotation(pitch=0, yaw=90, roll=0)), + "right_camera": carla.Transform(carla.Location(x=86, y=190, z=3.6), + carla.Rotation(pitch=0, yaw=-180, roll=0)), + "front_right_camera": carla.Transform(carla.Location(x=86, y=204, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "left_camera": carla.Transform(carla.Location(x=94, y=190, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)), + "front_left_camera": carla.Transform(carla.Location(x=94, y=204, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)) + } + ) + }, + "Town10HD_Opt": { + "road_intersection_1": IntersectionConfig( + carla.Transform(carla.Location(x=-46, y=21, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), + { + "back_camera": carla.Transform(carla.Location(x=-46, y=14, z=3.6), + carla.Rotation(pitch=0, yaw=-90, roll=0)), + "front_camera": carla.Transform(carla.Location(x=-46, y=28, z=3.6), + carla.Rotation(pitch=0, yaw=90, roll=0)), + "right_camera": carla.Transform(carla.Location(x=-50, y=14, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "front_right_camera": carla.Transform(carla.Location(x=-50, y=28, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "left_camera": carla.Transform(carla.Location(x=-42, y=14, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)), + "front_left_camera": carla.Transform(carla.Location(x=-42, y=28, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)) + } + ), + "road_intersection_2": IntersectionConfig( + carla.Transform(carla.Location(x=104, y=21, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), + { + "back_camera": carla.Transform(carla.Location(x=104, y=14, z=3.6), + carla.Rotation(pitch=0, yaw=-90, roll=0)), + "front_camera": carla.Transform(carla.Location(x=104, y=28, z=3.6), + carla.Rotation(pitch=0, yaw=90, roll=0)), + "right_camera": carla.Transform(carla.Location(x=100, y=14, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "front_right_camera": carla.Transform(carla.Location(x=100, y=28, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "left_camera": carla.Transform(carla.Location(x=108, y=14, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)), + "front_left_camera": carla.Transform(carla.Location(x=108, y=28, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)) + } + ), + "road_intersection_3": IntersectionConfig( + carla.Transform(carla.Location(x=-106, y=21, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), + { + "back_camera": carla.Transform(carla.Location(x=-106, y=14, z=3.6), + carla.Rotation(pitch=0, yaw=-90, roll=0)), + "front_camera": carla.Transform(carla.Location(x=-106, y=28, z=3.6), + carla.Rotation(pitch=0, yaw=90, roll=0)), + "right_camera": carla.Transform(carla.Location(x=-110, y=14, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "front_right_camera": carla.Transform(carla.Location(x=-110, y=28, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "left_camera": carla.Transform(carla.Location(x=-102, y=14, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)), + "front_left_camera": carla.Transform(carla.Location(x=-102, y=28, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)) + } + ), + "road_intersection_4": IntersectionConfig( + carla.Transform(carla.Location(x=-46, y=-61, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), + { + "back_camera": carla.Transform(carla.Location(x=-46, y=-68, z=3.6), + carla.Rotation(pitch=0, yaw=-90, roll=0)), + "front_camera": carla.Transform(carla.Location(x=-46, y=-54, z=3.6), + carla.Rotation(pitch=0, yaw=90, roll=0)), + "right_camera": carla.Transform(carla.Location(x=-50, y=-68, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "front_right_camera": carla.Transform(carla.Location(x=-50, y=-54, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "left_camera": carla.Transform(carla.Location(x=-42, y=-68, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)), + "front_left_camera": carla.Transform(carla.Location(x=-42, y=-54, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)) + } + ), + "road_intersection_5": IntersectionConfig( + carla.Transform(carla.Location(x=-46, y=135, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), + { + "back_camera": carla.Transform(carla.Location(x=-46, y=128, z=3.6), + carla.Rotation(pitch=0, yaw=-90, roll=0)), + "front_camera": carla.Transform(carla.Location(x=-46, y=142, z=3.6), + carla.Rotation(pitch=0, yaw=90, roll=0)), + "right_camera": carla.Transform(carla.Location(x=-50, y=128, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "front_right_camera": carla.Transform(carla.Location(x=-50, y=142, z=3.6), + carla.Rotation(pitch=0, yaw=-178, roll=0)), + "left_camera": carla.Transform(carla.Location(x=-42, y=128, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)), + "front_left_camera": carla.Transform(carla.Location(x=-42, y=142, z=3.6), + carla.Rotation(pitch=0, yaw=-0, roll=0)) + } + ) + } +} \ No newline at end of file From cf69317c2af8602fe2fee2ecc360efe0e7366354 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Tue, 30 Dec 2025 17:39:43 +0800 Subject: [PATCH 12/31] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=A4=8D=E7=8E=B0?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multi_obj_track/navigation/generate_trajectories.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/waypoint_control/multi_obj_track/navigation/generate_trajectories.py b/waypoint_control/multi_obj_track/navigation/generate_trajectories.py index ebb1fd4..1eedc2a 100644 --- a/waypoint_control/multi_obj_track/navigation/generate_trajectories.py +++ b/waypoint_control/multi_obj_track/navigation/generate_trajectories.py @@ -270,14 +270,16 @@ def main(): # 读取groundtruth data_truth = scipy.io.loadmat('ground_truth.mat') - traj_truth = data_truth['vehicle_cells'] + traj_truth = data_truth['truth_data'] all_ground_truth = [] # 保存所有的车辆轨迹 for i in range(len(traj_truth[0])): struct = traj_truth[0][i] # 获取第 i 个 struct positions = struct[0][0][1] # 获取单个的轨迹 array_3d = np.array(positions) # 形状为(N,3,1) - converted_data = array_3d.squeeze(axis=2).tolist() # 移除最后一个维度 - all_ground_truth.append(converted_data) + # print(array_3d) + # converted_data = array_3d.squeeze(axis=2).tolist() # 移除最后一个维度 + # all_ground_truth.append(converted_data) + all_ground_truth.append(array_3d) # 评估真实轨迹与跟踪轨迹 # 保存对齐后的真实轨迹 # 初始化累加器 From 5f35836c7a5b1e640010aaff5edb54a470746f8e Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Tue, 30 Dec 2025 17:49:57 +0800 Subject: [PATCH 13/31] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multi_obj_track/navigation/config.py | 185 ------------------ 1 file changed, 185 deletions(-) delete mode 100644 waypoint_control/multi_obj_track/navigation/config.py diff --git a/waypoint_control/multi_obj_track/navigation/config.py b/waypoint_control/multi_obj_track/navigation/config.py deleted file mode 100644 index d2e9c26..0000000 --- a/waypoint_control/multi_obj_track/navigation/config.py +++ /dev/null @@ -1,185 +0,0 @@ -import carla - - -class IntersectionConfig: - def __init__(self, ego_vehicle_position, camera_positions): - self.ego_vehicle_position = ego_vehicle_position - self.camera_positions = camera_positions - - -town_configurations = { - "Town01": { - "road_intersection_1": IntersectionConfig( - carla.Transform(carla.Location(x=90, y=59, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), - { - "back_camera": carla.Transform(carla.Location(x=90, y=52, z=3.6), - carla.Rotation(pitch=0, yaw=-90, roll=0)), - "front_camera": carla.Transform(carla.Location(x=90, y=66, z=3.6), - carla.Rotation(pitch=0, yaw=90, roll=0)), - "right_camera": carla.Transform(carla.Location(x=86, y=52, z=3.6), - carla.Rotation(pitch=0, yaw=-180, roll=0)), - "front_right_camera": carla.Transform(carla.Location(x=86, y=66, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "left_camera": carla.Transform(carla.Location(x=94, y=52, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)), - "front_left_camera": carla.Transform(carla.Location(x=94, y=66, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)) - } - ), - "road_intersection_2": IntersectionConfig( - carla.Transform(carla.Location(x=336, y=197, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), - { - "back_camera": carla.Transform(carla.Location(x=336, y=190, z=3.6), - carla.Rotation(pitch=0, yaw=-90, roll=0)), - "front_camera": carla.Transform(carla.Location(x=336, y=204, z=3.6), - carla.Rotation(pitch=0, yaw=90, roll=0)), - "right_camera": carla.Transform(carla.Location(x=332, y=190, z=3.6), - carla.Rotation(pitch=0, yaw=-180, roll=0)), - "front_right_camera": carla.Transform(carla.Location(x=332, y=204, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "left_camera": carla.Transform(carla.Location(x=340, y=190, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)), - "front_left_camera": carla.Transform(carla.Location(x=340, y=204, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)) - } - ), - "road_intersection_3": IntersectionConfig( - carla.Transform(carla.Location(x=336, y=328, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), - { - "back_camera": carla.Transform(carla.Location(x=336, y=321, z=3.6), - carla.Rotation(pitch=0, yaw=-90, roll=0)), - "front_camera": carla.Transform(carla.Location(x=336, y=335, z=3.6), - carla.Rotation(pitch=0, yaw=90, roll=0)), - "right_camera": carla.Transform(carla.Location(x=332, y=321, z=3.6), - carla.Rotation(pitch=0, yaw=-180, roll=0)), - "front_right_camera": carla.Transform(carla.Location(x=332, y=335, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "left_camera": carla.Transform(carla.Location(x=340, y=321, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)), - "front_left_camera": carla.Transform(carla.Location(x=340, y=335, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)) - } - ), - "road_intersection_4": IntersectionConfig( - carla.Transform(carla.Location(x=336, y=59, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), - { - "back_camera": carla.Transform(carla.Location(x=336, y=52, z=3.6), - carla.Rotation(pitch=0, yaw=-90, roll=0)), - "front_camera": carla.Transform(carla.Location(x=336, y=66, z=3.6), - carla.Rotation(pitch=0, yaw=90, roll=0)), - "right_camera": carla.Transform(carla.Location(x=332, y=52, z=3.6), - carla.Rotation(pitch=0, yaw=-180, roll=0)), - "front_right_camera": carla.Transform(carla.Location(x=332, y=66, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "left_camera": carla.Transform(carla.Location(x=340, y=52, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)), - "front_left_camera": carla.Transform(carla.Location(x=340, y=66, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)) - } - ), - "road_intersection_5": IntersectionConfig( - carla.Transform(carla.Location(x=90, y=197, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), - { - "back_camera": carla.Transform(carla.Location(x=90, y=190, z=3.6), - carla.Rotation(pitch=0, yaw=-90, roll=0)), - "front_camera": carla.Transform(carla.Location(x=90, y=204, z=3.6), - carla.Rotation(pitch=0, yaw=90, roll=0)), - "right_camera": carla.Transform(carla.Location(x=86, y=190, z=3.6), - carla.Rotation(pitch=0, yaw=-180, roll=0)), - "front_right_camera": carla.Transform(carla.Location(x=86, y=204, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "left_camera": carla.Transform(carla.Location(x=94, y=190, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)), - "front_left_camera": carla.Transform(carla.Location(x=94, y=204, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)) - } - ) - }, - "Town10HD_Opt": { - "road_intersection_1": IntersectionConfig( - carla.Transform(carla.Location(x=-46, y=21, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), - { - "back_camera": carla.Transform(carla.Location(x=-46, y=14, z=3.6), - carla.Rotation(pitch=0, yaw=-90, roll=0)), - "front_camera": carla.Transform(carla.Location(x=-46, y=28, z=3.6), - carla.Rotation(pitch=0, yaw=90, roll=0)), - "right_camera": carla.Transform(carla.Location(x=-50, y=14, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "front_right_camera": carla.Transform(carla.Location(x=-50, y=28, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "left_camera": carla.Transform(carla.Location(x=-42, y=14, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)), - "front_left_camera": carla.Transform(carla.Location(x=-42, y=28, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)) - } - ), - "road_intersection_2": IntersectionConfig( - carla.Transform(carla.Location(x=104, y=21, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), - { - "back_camera": carla.Transform(carla.Location(x=104, y=14, z=3.6), - carla.Rotation(pitch=0, yaw=-90, roll=0)), - "front_camera": carla.Transform(carla.Location(x=104, y=28, z=3.6), - carla.Rotation(pitch=0, yaw=90, roll=0)), - "right_camera": carla.Transform(carla.Location(x=100, y=14, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "front_right_camera": carla.Transform(carla.Location(x=100, y=28, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "left_camera": carla.Transform(carla.Location(x=108, y=14, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)), - "front_left_camera": carla.Transform(carla.Location(x=108, y=28, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)) - } - ), - "road_intersection_3": IntersectionConfig( - carla.Transform(carla.Location(x=-106, y=21, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), - { - "back_camera": carla.Transform(carla.Location(x=-106, y=14, z=3.6), - carla.Rotation(pitch=0, yaw=-90, roll=0)), - "front_camera": carla.Transform(carla.Location(x=-106, y=28, z=3.6), - carla.Rotation(pitch=0, yaw=90, roll=0)), - "right_camera": carla.Transform(carla.Location(x=-110, y=14, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "front_right_camera": carla.Transform(carla.Location(x=-110, y=28, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "left_camera": carla.Transform(carla.Location(x=-102, y=14, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)), - "front_left_camera": carla.Transform(carla.Location(x=-102, y=28, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)) - } - ), - "road_intersection_4": IntersectionConfig( - carla.Transform(carla.Location(x=-46, y=-61, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), - { - "back_camera": carla.Transform(carla.Location(x=-46, y=-68, z=3.6), - carla.Rotation(pitch=0, yaw=-90, roll=0)), - "front_camera": carla.Transform(carla.Location(x=-46, y=-54, z=3.6), - carla.Rotation(pitch=0, yaw=90, roll=0)), - "right_camera": carla.Transform(carla.Location(x=-50, y=-68, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "front_right_camera": carla.Transform(carla.Location(x=-50, y=-54, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "left_camera": carla.Transform(carla.Location(x=-42, y=-68, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)), - "front_left_camera": carla.Transform(carla.Location(x=-42, y=-54, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)) - } - ), - "road_intersection_5": IntersectionConfig( - carla.Transform(carla.Location(x=-46, y=135, z=0.98), carla.Rotation(pitch=0, yaw=90, roll=0)), - { - "back_camera": carla.Transform(carla.Location(x=-46, y=128, z=3.6), - carla.Rotation(pitch=0, yaw=-90, roll=0)), - "front_camera": carla.Transform(carla.Location(x=-46, y=142, z=3.6), - carla.Rotation(pitch=0, yaw=90, roll=0)), - "right_camera": carla.Transform(carla.Location(x=-50, y=128, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "front_right_camera": carla.Transform(carla.Location(x=-50, y=142, z=3.6), - carla.Rotation(pitch=0, yaw=-178, roll=0)), - "left_camera": carla.Transform(carla.Location(x=-42, y=128, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)), - "front_left_camera": carla.Transform(carla.Location(x=-42, y=142, z=3.6), - carla.Rotation(pitch=0, yaw=-0, roll=0)) - } - ) - } -} \ No newline at end of file From 76d061673cdd1204a194ea2cb93ed69591d0c67c Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Tue, 6 Jan 2026 17:10:05 +0800 Subject: [PATCH 14/31] =?UTF-8?q?=E5=88=86=E5=88=AB=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E4=BA=BA=E8=BD=A6=E5=AD=AA=E7=94=9F=E8=BD=A8=E8=BF=B9=E5=B9=B6?= =?UTF-8?q?=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multi_obj_track/detect2DBoundingBox.m | 7 +- .../navigation/generate_trajectories.py | 448 ++++++++++++------ 2 files changed, 312 insertions(+), 143 deletions(-) diff --git a/waypoint_control/multi_obj_track/detect2DBoundingBox.m b/waypoint_control/multi_obj_track/detect2DBoundingBox.m index 2721f0c..b8e15dd 100644 --- a/waypoint_control/multi_obj_track/detect2DBoundingBox.m +++ b/waypoint_control/multi_obj_track/detect2DBoundingBox.m @@ -53,8 +53,9 @@ function detect2DBoundingBox(junc) if isempty(labels) cameraData(i).Detections = zeros(0, 4); % 如果无检测结果,保存空矩阵 else - % 过滤掉 labels 为 "traffic light" 的检测结果 - validIndices = ~strcmp(labels, 'traffic light'); + % 过滤掉 labels 不为 'person', 'car', 'truck' 的检测结果 + % validIndices = ~strcmp(labels, 'traffic light'); + validIndices = ismember(labels, {'person', 'car', 'truck'}); disp(validIndices) filteredBboxes = bboxes(validIndices, :); @@ -67,7 +68,7 @@ function detect2DBoundingBox(junc) end % 将labels作为标签数据保存到datalog中 - validIndices = ~strcmp(labels, 'traffic light'); + validIndices = ismember(labels, {'person', 'car', 'truck'}); filteredLabels = labels(validIndices); cameraData(i).Category = filteredLabels; diff --git a/waypoint_control/multi_obj_track/navigation/generate_trajectories.py b/waypoint_control/multi_obj_track/navigation/generate_trajectories.py index 1eedc2a..e2d15ac 100644 --- a/waypoint_control/multi_obj_track/navigation/generate_trajectories.py +++ b/waypoint_control/multi_obj_track/navigation/generate_trajectories.py @@ -1,3 +1,5 @@ +from unicodedata import category + import carla import argparse import scipy.io @@ -70,7 +72,7 @@ def interpolate_trajectory(trajectory, target_length, i, k): return trajectory -def single_trajectory(vehicle_path, _map, final_vehicle_path, final_timestamp_list, timestamp_list, all_vehicle_traj): +def single_trajectory(vehicle_path, _map, final_vehicle_path, final_timestamp_list, timestamp_list, all_traj): # 添加轨迹 unique_trajectory = vehicle_path[0] final_vehicle_path.append(unique_trajectory) @@ -87,7 +89,7 @@ def single_trajectory(vehicle_path, _map, final_vehicle_path, final_timestamp_li # 将时间和坐标组合成一个新的列表,并添加到结果列表中 combine = [tra[0], tra[1], tra[2], t] result.append(combine) - all_vehicle_traj.append(result) + all_traj.append(result) def main(): @@ -132,154 +134,286 @@ def main(): # 读取所有路口的轨迹文件 data = scipy.io.loadmat('traj.mat') traj = data['traj'] - all_vehicle_traj = [] # 保存所有的车辆轨迹 + vehicle_traj = [] # 保存车辆轨迹 + person_traj = [] # 保存行人轨迹 # 遍历外层的 traj cell 数组 # traj_cell 是一个 1xN 的 cell 数组 for i in range(len(traj[0])): # 遍历外层的 1xN cell 数组 inner_cell = traj[0][i][0] # 获取第 i 个 cell vehicle_paths = [] timestamp_list = [] + person_paths = [] + person_timestamp_list = [] for j in range(len(inner_cell)): # 遍历内层的 cell 数组 struct = inner_cell[j] # 获取第 j 个结构体 - positions = struct[0][0][2] # 获取单个的轨迹 - timestamp = struct[0][0][4] # 获取对应轨迹中航点的时间戳 - _timestamp = [round(item[0], 2) for item in timestamp] - vehicle_paths.append(positions) - timestamp_list.append(_timestamp) + category = struct[0][0][5] + print(category) + if category == 'person': + positions = struct[0][0][2] # 获取单个的轨迹 + timestamp = struct[0][0][4] # 获取对应轨迹中航点的时间戳0 + _timestamp = [round(item[0], 2) for item in timestamp] + person_paths.append(positions) + person_timestamp_list.append(_timestamp) + else: + positions = struct[0][0][2] # 获取单个的轨迹 + timestamp = struct[0][0][4] # 获取对应轨迹中航点的时间戳0 + _timestamp = [round(item[0], 2) for item in timestamp] + vehicle_paths.append(positions) + timestamp_list.append(_timestamp) + # positions = struct[0][0][2] # 获取单个的轨迹 + # timestamp = struct[0][0][4] # 获取对应轨迹中航点的时间戳0 + # _timestamp = [round(item[0], 2) for item in timestamp] + # vehicle_paths.append(positions) + # timestamp_list.append(_timestamp) # 排除非车辆轨迹,多目标跟踪和再识别的误差导致轨迹可能是非道路上的点 - dis_trajectory = vehicle_paths[0][0] - dis_location = carla.Location(x=dis_trajectory[0], y=dis_trajectory[1], z=dis_trajectory[2]) - nearest_waypoint = _map.get_waypoint(dis_location) - distance = dis_location.distance(nearest_waypoint.transform.location) + # dis_trajectory = vehicle_paths[0][0] + # dis_location = carla.Location(x=dis_trajectory[0], y=dis_trajectory[1], z=dis_trajectory[2]) + # nearest_waypoint = _map.get_waypoint(dis_location) + # distance = dis_location.distance(nearest_waypoint.transform.location) # 计算 location 与最近的 waypoint 的距离,如果大于一定的阈值,则判断该轨迹是错误的 - if distance >= 5: - continue - - # 存储最终的轨迹和时间 - final_vehicle_path = [] - final_timestamp_list = [] - - length = len(vehicle_paths) - # 处理只有一个路口出现该车辆的情况 - # 在这辆车的轨迹的末尾插值 - if length < 2: - single_trajectory(vehicle_paths, _map, final_vehicle_path, final_timestamp_list, timestamp_list, all_vehicle_traj) - continue - vehicle_path = [] - for vehicle_p in vehicle_paths: - if len(vehicle_p) > 40: - trimmed_traj = vehicle_p[20:-20] - vehicle_path.append(trimmed_traj) - else: - vehicle_path.append(vehicle_p) - - is_exception = False - # 同一车辆在多个路口出现,遍历 vehicle_path,处理每一对相邻的轨迹 - for k in range(len(vehicle_path) - 1): - # 获取当前轨迹和下一段轨迹 - current_trajectory = vehicle_path[k] - next_trajectory = vehicle_path[k + 1] - - # 获取当前轨迹的末尾位置 - start_loc = current_trajectory[-1] - start_location = carla.Location(x=start_loc[0], y=start_loc[1], z=start_loc[2]) - # 获取下一段轨迹的开头位置 - end_loc = next_trajectory[0] - end_location = carla.Location(x=end_loc[0], y=end_loc[1], z=end_loc[2]) - # 使用导航算法生成新轨迹 - # 处理无法到达的轨迹 - end_waypoint = _map.get_waypoint(end_location) - start_waypoint = _map.get_waypoint(start_location) - try: - interval_trajectory = set_destination(start_waypoint.transform.location, end_waypoint.transform.location, _map, global_router) - except Exception as e: - is_exception = True - if k > 0: - # 添加下一段轨迹和时间 - final_vehicle_path.append(vehicle_path[k]) - final_timestamp_list.append(timestamp_list[k]) + # if distance >= 5: + # continue + + if not vehicle_paths: + # 存储行人最终的轨迹和时间 + final_person_path = [] + final_person_timestamp_list = [] + + length = len(person_paths) + # 处理只有一个路口出现该行人的情况 + # 在这个人的轨迹的末尾插值 + if length < 2: + single_trajectory(person_paths, _map, final_person_path, final_person_timestamp_list, person_timestamp_list, + person_traj) + continue + person_path = [] + for vehicle_p in person_paths: + if len(vehicle_p) > 40: + trimmed_traj = vehicle_p[20:-20] + person_path.append(trimmed_traj) else: - # 生成第一段轨迹的时候,无法到达,那么就当成只有一段轨迹处理,转换成 length < 2 的情况 - single_trajectory(vehicle_path, _map, final_vehicle_path, final_timestamp_list, timestamp_list, all_vehicle_traj) - break - # 将 waypoint list 转换成[[x, y, z], [x, y, z], ...] - trajectory = [] - for waypoint in interval_trajectory: - # 获取 waypoint 的位置 - location = waypoint.transform.location - # 提取 x, y, z 值 - x = location.x - y = location.y - z = location.z - # 添加到轨迹列表中 - trajectory.append([x, y, z]) - - # 生成新轨迹对应的时间戳 - # 当前轨迹的最后一个时间戳 - current_end_time = timestamp_list[k][-1] - # 下一段轨迹的第一个时间戳 - next_start_time = timestamp_list[k + 1][0] - # 生成新轨迹的时间戳,间隔为 0.05 - _new_times = np.arange(round(current_end_time, 2) + 0.05, round(next_start_time, 2), 0.05) - new_times = np.around(_new_times, decimals=2) - # 如果轨迹数 > 时间数,删除两个点之间的点,从前往后,直到长度等于new_times的长度 - # 如果轨迹数 < 时间数, 则在两个点之间插值,从前往后,直到长度等于new_times的长度 - # 如果轨迹数 = 时间数,则不处理 - # 获取 new_times 的长度 - target_length = len(new_times) - trajectory_len = len(trajectory) - # 处理轨迹长度 == 1的时候 - if trajectory_len == 1: - _traj = trajectory[0] - loc = carla.Location(x=_traj[0], y=_traj[1], z=_traj[2]) - waypoint = _map.get_waypoint(loc) - road_path = waypoint.next(0.2) - way_p = road_path[0] - location = way_p.transform.location - # 提取 x, y, z 值 - x = location.x - y = location.y - z = location.z - # 添加到轨迹列表中 - trajectory.append([x, y, z]) - - # 如果 trajectory 的长度小于 new_times,进行插值 - in_value_trajectory = interpolate_trajectory(trajectory, target_length, i, k) - - # 将当前轨迹和新生成的轨迹添加到 final_vehicle_path - final_vehicle_path.append(current_trajectory) - final_vehicle_path.append(in_value_trajectory) - - # 将当前时间戳和新生成的时间戳添加到 final_timestamp_list - final_timestamp_list.append(timestamp_list[k]) - final_timestamp_list.append(new_times) - - if not is_exception: - # 添加最后一段轨迹和时间戳 - final_vehicle_path.append(vehicle_path[-1]) - final_timestamp_list.append(timestamp_list[-1]) - result = [] - # 遍历轨迹和时间列表 - for t_sublist, traj_sublist in zip(final_timestamp_list, final_vehicle_path): - for t, tra in zip(t_sublist, traj_sublist): - # 将时间和坐标组合成一个新的列表,并添加到结果列表中 - combine = [tra[0], tra[1], tra[2], t] - result.append(combine) - all_vehicle_traj.append(result) + person_path.append(vehicle_p) + + is_exception = False + # 同一行人在多个路口出现,遍历 person_path,处理每一对相邻的轨迹 + for k in range(len(person_path) - 1): + # 获取当前轨迹和下一段轨迹 + current_trajectory = person_path[k] + next_trajectory = person_path[k + 1] + + # 获取当前轨迹的末尾位置 + start_loc = current_trajectory[-1] + start_location = carla.Location(x=start_loc[0], y=start_loc[1], z=start_loc[2]) + # 获取下一段轨迹的开头位置 + end_loc = next_trajectory[0] + end_location = carla.Location(x=end_loc[0], y=end_loc[1], z=end_loc[2]) + # 使用导航算法生成新轨迹 + # 处理无法到达的轨迹 + end_waypoint = _map.get_waypoint(end_location) + start_waypoint = _map.get_waypoint(start_location) + try: + interval_trajectory = set_destination(start_waypoint.transform.location, + end_waypoint.transform.location, _map, global_router) + except Exception as e: + is_exception = True + if k > 0: + # 添加下一段轨迹和时间 + final_person_path.append(person_path[k]) + final_person_timestamp_list.append(person_timestamp_list[k]) + else: + # 生成第一段轨迹的时候,无法到达,那么就当成只有一段轨迹处理,转换成 length < 2 的情况 + single_trajectory(person_path, _map, final_person_path, final_person_timestamp_list, person_timestamp_list, + person_traj) + break + # 将 waypoint list 转换成[[x, y, z], [x, y, z], ...] + trajectory = [] + for waypoint in interval_trajectory: + # 获取 waypoint 的位置 + location = waypoint.transform.location + # 提取 x, y, z 值 + x = location.x + y = location.y + z = location.z + # 添加到轨迹列表中 + trajectory.append([x, y, z]) + + # 生成新轨迹对应的时间戳 + # 当前轨迹的最后一个时间戳 + current_end_time = person_timestamp_list[k][-1] + # 下一段轨迹的第一个时间戳 + next_start_time = person_timestamp_list[k + 1][0] + # 生成新轨迹的时间戳,间隔为 0.05 + _new_times = np.arange(round(current_end_time, 2) + 0.05, round(next_start_time, 2), 0.05) + new_times = np.around(_new_times, decimals=2) + # 如果轨迹数 > 时间数,删除两个点之间的点,从前往后,直到长度等于new_times的长度 + # 如果轨迹数 < 时间数, 则在两个点之间插值,从前往后,直到长度等于new_times的长度 + # 如果轨迹数 = 时间数,则不处理 + # 获取 new_times 的长度 + target_length = len(new_times) + trajectory_len = len(trajectory) + # 处理轨迹长度 == 1的时候 + if trajectory_len == 1: + _traj = trajectory[0] + loc = carla.Location(x=_traj[0], y=_traj[1], z=_traj[2]) + waypoint = _map.get_waypoint(loc) + road_path = waypoint.next(0.2) + way_p = road_path[0] + location = way_p.transform.location + # 提取 x, y, z 值 + x = location.x + y = location.y + z = location.z + # 添加到轨迹列表中 + trajectory.append([x, y, z]) + + # 如果 trajectory 的长度小于 new_times,进行插值 + in_value_trajectory = interpolate_trajectory(trajectory, target_length, i, k) + + # 将当前轨迹和新生成的轨迹添加到 final_person_path + final_person_path.append(current_trajectory) + final_person_path.append(in_value_trajectory) + + # 将当前时间戳和新生成的时间戳添加到 final_person_timestamp_list + final_person_timestamp_list.append(person_timestamp_list[k]) + final_person_timestamp_list.append(new_times) + + if not is_exception: + # 添加最后一段轨迹和时间戳 + final_person_path.append(person_path[-1]) + final_person_timestamp_list.append(person_timestamp_list[-1]) + result = [] + # 遍历轨迹和时间列表 + for t_sublist, traj_sublist in zip(final_person_timestamp_list, final_person_path): + for t, tra in zip(t_sublist, traj_sublist): + # 将时间和坐标组合成一个新的列表,并添加到结果列表中 + combine = [tra[0], tra[1], tra[2], t] + result.append(combine) + person_traj.append(result) + else: + # 存储车辆最终的轨迹和时间 + final_vehicle_path = [] + final_timestamp_list = [] + + length = len(vehicle_paths) + # 处理只有一个路口出现该车辆的情况 + # 在这辆车的轨迹的末尾插值 + if length < 2: + single_trajectory(vehicle_paths, _map, final_vehicle_path, final_timestamp_list, timestamp_list, vehicle_traj) + continue + vehicle_path = [] + for vehicle_p in vehicle_paths: + if len(vehicle_p) > 40: + trimmed_traj = vehicle_p[20:-20] + vehicle_path.append(trimmed_traj) + else: + vehicle_path.append(vehicle_p) + + is_exception = False + # 同一车辆在多个路口出现,遍历 vehicle_path,处理每一对相邻的轨迹 + for k in range(len(vehicle_path) - 1): + # 获取当前轨迹和下一段轨迹 + current_trajectory = vehicle_path[k] + next_trajectory = vehicle_path[k + 1] + + # 获取当前轨迹的末尾位置 + start_loc = current_trajectory[-1] + start_location = carla.Location(x=start_loc[0], y=start_loc[1], z=start_loc[2]) + # 获取下一段轨迹的开头位置 + end_loc = next_trajectory[0] + end_location = carla.Location(x=end_loc[0], y=end_loc[1], z=end_loc[2]) + # 使用导航算法生成新轨迹 + # 处理无法到达的轨迹 + end_waypoint = _map.get_waypoint(end_location) + start_waypoint = _map.get_waypoint(start_location) + try: + interval_trajectory = set_destination(start_waypoint.transform.location, end_waypoint.transform.location, _map, global_router) + except Exception as e: + is_exception = True + if k > 0: + # 添加下一段轨迹和时间 + final_vehicle_path.append(vehicle_path[k]) + final_timestamp_list.append(timestamp_list[k]) + else: + # 生成第一段轨迹的时候,无法到达,那么就当成只有一段轨迹处理,转换成 length < 2 的情况 + single_trajectory(vehicle_path, _map, final_vehicle_path, final_timestamp_list, timestamp_list, vehicle_traj) + break + # 将 waypoint list 转换成[[x, y, z], [x, y, z], ...] + trajectory = [] + for waypoint in interval_trajectory: + # 获取 waypoint 的位置 + location = waypoint.transform.location + # 提取 x, y, z 值 + x = location.x + y = location.y + z = location.z + # 添加到轨迹列表中 + trajectory.append([x, y, z]) + + # 生成新轨迹对应的时间戳 + # 当前轨迹的最后一个时间戳 + current_end_time = timestamp_list[k][-1] + # 下一段轨迹的第一个时间戳 + next_start_time = timestamp_list[k + 1][0] + # 生成新轨迹的时间戳,间隔为 0.05 + _new_times = np.arange(round(current_end_time, 2) + 0.05, round(next_start_time, 2), 0.05) + new_times = np.around(_new_times, decimals=2) + # 如果轨迹数 > 时间数,删除两个点之间的点,从前往后,直到长度等于new_times的长度 + # 如果轨迹数 < 时间数, 则在两个点之间插值,从前往后,直到长度等于new_times的长度 + # 如果轨迹数 = 时间数,则不处理 + # 获取 new_times 的长度 + target_length = len(new_times) + trajectory_len = len(trajectory) + # 处理轨迹长度 == 1的时候 + if trajectory_len == 1: + _traj = trajectory[0] + loc = carla.Location(x=_traj[0], y=_traj[1], z=_traj[2]) + waypoint = _map.get_waypoint(loc) + road_path = waypoint.next(0.2) + way_p = road_path[0] + location = way_p.transform.location + # 提取 x, y, z 值 + x = location.x + y = location.y + z = location.z + # 添加到轨迹列表中 + trajectory.append([x, y, z]) + + # 如果 trajectory 的长度小于 new_times,进行插值 + in_value_trajectory = interpolate_trajectory(trajectory, target_length, i, k) + + # 将当前轨迹和新生成的轨迹添加到 final_vehicle_path + final_vehicle_path.append(current_trajectory) + final_vehicle_path.append(in_value_trajectory) + + # 将当前时间戳和新生成的时间戳添加到 final_timestamp_list + final_timestamp_list.append(timestamp_list[k]) + final_timestamp_list.append(new_times) + + if not is_exception: + # 添加最后一段轨迹和时间戳 + final_vehicle_path.append(vehicle_path[-1]) + final_timestamp_list.append(timestamp_list[-1]) + result = [] + # 遍历轨迹和时间列表 + for t_sublist, traj_sublist in zip(final_timestamp_list, final_vehicle_path): + for t, tra in zip(t_sublist, traj_sublist): + # 将时间和坐标组合成一个新的列表,并添加到结果列表中 + combine = [tra[0], tra[1], tra[2], t] + result.append(combine) + vehicle_traj.append(result) # 读取groundtruth - data_truth = scipy.io.loadmat('ground_truth.mat') - traj_truth = data_truth['truth_data'] + data_truth = scipy.io.loadmat('vehicle_ground_truth.mat') + traj_truth = data_truth['vehicle_cells'] all_ground_truth = [] # 保存所有的车辆轨迹 for i in range(len(traj_truth[0])): struct = traj_truth[0][i] # 获取第 i 个 struct positions = struct[0][0][1] # 获取单个的轨迹 array_3d = np.array(positions) # 形状为(N,3,1) - # print(array_3d) - # converted_data = array_3d.squeeze(axis=2).tolist() # 移除最后一个维度 - # all_ground_truth.append(converted_data) - all_ground_truth.append(array_3d) + converted_data = array_3d.squeeze(axis=2).tolist() # 移除最后一个维度 + all_ground_truth.append(converted_data) + # all_ground_truth.append(array_3d) # 评估真实轨迹与跟踪轨迹 # 保存对齐后的真实轨迹 # 初始化累加器 @@ -289,7 +423,8 @@ def main(): total_overlap = 0.0 valid_trajectories = 0 # 有效轨迹计数 - for ge_traj in all_vehicle_traj: + for ge_traj in vehicle_traj: + # for ge_traj in person_traj: max_overlap = -1 best_truth_traj = None track_points = np.array([[point[0], point[1]] for point in ge_traj]) @@ -339,35 +474,68 @@ def main(): else: print("警告: 没有有效的轨迹匹配") - # 保存全部车辆轨迹到waypoint.txt - with open('Waypoints.txt', 'w') as file: + + # 保存全部行人轨迹到personwaypoint.txt + with open('personWaypoints.txt', 'w') as file: + + # 遍历每个人的轨迹 + for person_index, tr in enumerate(person_traj): + # 遍历轨迹中的每个数据点 + for point_index, (x, y, z, t) in enumerate(tr): + # 使用数据点在轨迹内部的索引作为下标(但这里z值被省略了,如果您需要它,请添加) + output_string = f"{person_index} {x} {y} {t}" + # 写入文件,但不是在最后一个数据点后写入换行符 + if point_index != len(tr) - 1 or person_index != len(person_traj) - 1: + file.write(output_string + '\n') + else: + file.write(output_string) # 最后一个数据点,不添加换行符 + if os.path.exists('personWaypoints.txt'): + print("✅ 文件已生成!路径:", os.path.abspath('personWaypoints.txt')) + else: + print("❌ 文件未生成!可能原因:写入失败或路径错误") + + # 将保存的轨迹按时间排序 + # 读取文件 + with open('personWaypoints.txt', 'r') as file: + lines = file.readlines() + + sorted_lines = sorted(lines, key=lambda x: float(x.strip().split()[-1])) + # 如果需要将排序后的结果写入新文件 + with open('personWaypoints.txt', 'w') as file: + for line in sorted_lines: + file.write(line) + + + + # 保存全部车辆轨迹到vehiclewaypoint.txt + with open('vehicleWaypoints.txt', 'w') as file: # 遍历每辆车的轨迹 - for vehicle_index, tr in enumerate(all_vehicle_traj): + for vehicle_index, tr in enumerate(vehicle_traj): # 遍历轨迹中的每个数据点 for point_index, (x, y, z, t) in enumerate(tr): # 使用数据点在轨迹内部的索引作为下标(但这里z值被省略了,如果您需要它,请添加) output_string = f"{vehicle_index} {x} {y} {t}" # 写入文件,但不是在最后一个数据点后写入换行符 - if point_index != len(tr) - 1 or vehicle_index != len(all_vehicle_traj) - 1: + if point_index != len(tr) - 1 or vehicle_index != len(vehicle_traj) - 1: file.write(output_string + '\n') else: file.write(output_string) # 最后一个数据点,不添加换行符 - if os.path.exists('Waypoints.txt'): - print("✅ 文件已生成!路径:", os.path.abspath('Waypoints.txt')) + if os.path.exists('vehicleWaypoints.txt'): + print("✅ 文件已生成!路径:", os.path.abspath('vehicleWaypoints.txt')) else: print("❌ 文件未生成!可能原因:写入失败或路径错误") # 将保存的轨迹按时间排序 # 读取文件 - with open('Waypoints.txt', 'r') as file: + with open('vehicleWaypoints.txt', 'r') as file: lines = file.readlines() # 将每一行拆分为列表,并提取最后一列时间作为排序依据 # 使用 lambda 函数对每一行的最后一列(索引为 -1)进行排序 sorted_lines = sorted(lines, key=lambda x: float(x.strip().split()[-1])) # 如果需要将排序后的结果写入新文件 - with open('Waypoints.txt', 'w') as file: + with open('vehicleWaypoints.txt', 'w') as file: for line in sorted_lines: file.write(line) From c66c396d20352e1724693fc93621df04c14408f2 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Thu, 8 Jan 2026 17:49:27 +0800 Subject: [PATCH 15/31] =?UTF-8?q?=E6=8E=92=E9=99=A4=E4=B8=8D=E5=90=88?= =?UTF-8?q?=E7=90=86=E7=9A=84=E4=BA=BA=E8=BD=A6=E8=BD=A8=E8=BF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../navigation/generate_trajectories.py | 84 ++++++++++++++++++- 1 file changed, 80 insertions(+), 4 deletions(-) diff --git a/waypoint_control/multi_obj_track/navigation/generate_trajectories.py b/waypoint_control/multi_obj_track/navigation/generate_trajectories.py index e2d15ac..9ebbf4c 100644 --- a/waypoint_control/multi_obj_track/navigation/generate_trajectories.py +++ b/waypoint_control/multi_obj_track/navigation/generate_trajectories.py @@ -92,6 +92,61 @@ def single_trajectory(vehicle_path, _map, final_vehicle_path, final_timestamp_li all_traj.append(result) +# def check_pedestrian_valid_area(location, _map): +# """ +# 检查行人是否在合理的活动区域 +# """ +# waypoint = _map.get_waypoint(location) +# +# # 1. 检查是否在人行道上 +# if waypoint.lane_type == carla.LaneType.Sidewalk: +# return True +# +# # 2. 检查是否在十字路口(行人过马路) +# if waypoint.is_junction: +# junction_location = waypoint.get_junction() +# distance_to_junction = location.distance(junction_location.bounding_box.location) +# if distance_to_junction < 10: # 在十字路口20米范围内 +# return True +# +# return False + + +def is_valid_pedestrian_location(location, _map, max_distance=2.0): + """ + 验证位置是否适合行人 + """ + # 尝试获取人行道航点 + sidewalk_wp = _map.get_waypoint( + location, + lane_type=carla.LaneType.Sidewalk, + project_to_road=False # 不投影到道路 + ) + + if sidewalk_wp: + # 计算与人行道航点的距离 + distance = location.distance(sidewalk_wp.transform.location) + if distance <= max_distance: + return True, distance, "sidewalk" + + # 如果不是人行道,检查是否在十字路口附近(行人过马路) + road_wp = _map.get_waypoint(location) + if road_wp and road_wp.is_junction: + # 检查是否在十字路口范围内 + junction = road_wp.get_junction() + if junction: + distance_to_junction = location.distance(junction.bounding_box.location) + junction_radius = max(junction.bounding_box.extent.x, + junction.bounding_box.extent.y) + + if distance_to_junction <= junction_radius + 5.0: # 留出5米缓冲区 + return True, distance_to_junction, "junction_crossing" + + # 检查是否在建筑物入口、广场等区域 + # 这里可能需要额外的地图标记信息 + + return False, None, "invalid" + def main(): argparser = argparse.ArgumentParser( description=__doc__) @@ -149,12 +204,14 @@ def main(): category = struct[0][0][5] print(category) if category == 'person': + print(1) positions = struct[0][0][2] # 获取单个的轨迹 timestamp = struct[0][0][4] # 获取对应轨迹中航点的时间戳0 _timestamp = [round(item[0], 2) for item in timestamp] person_paths.append(positions) person_timestamp_list.append(_timestamp) else: + print(2) positions = struct[0][0][2] # 获取单个的轨迹 timestamp = struct[0][0][4] # 获取对应轨迹中航点的时间戳0 _timestamp = [round(item[0], 2) for item in timestamp] @@ -176,6 +233,16 @@ def main(): # continue if not vehicle_paths: + # 排除非行人轨迹, + dis_trajectory = person_paths[0][0] + dis_location = carla.Location(x=dis_trajectory[0], y=dis_trajectory[1], z=dis_trajectory[2]) + nearest_waypoint = _map.get_waypoint(dis_location) + distance = dis_location.distance(nearest_waypoint.transform.location) + # 计算 location 与最近的 waypoint 的距离,如果小于一定的阈值,则判断该轨迹是错误的 + is_valid, adistance, location_type = is_valid_pedestrian_location(dis_location, _map, 2.0) + if distance < 5 and is_valid : + continue + # 存储行人最终的轨迹和时间 final_person_path = [] final_person_timestamp_list = [] @@ -291,6 +358,15 @@ def main(): result.append(combine) person_traj.append(result) else: + # 排除非车辆轨迹,多目标跟踪和再识别的误差导致轨迹可能是非道路上的点 + dis_trajectory = vehicle_paths[0][0] + dis_location = carla.Location(x=dis_trajectory[0], y=dis_trajectory[1], z=dis_trajectory[2]) + nearest_waypoint = _map.get_waypoint(dis_location) + distance = dis_location.distance(nearest_waypoint.transform.location) + # 计算 location 与最近的 waypoint 的距离,如果大于一定的阈值,则判断该轨迹是错误的 + if distance >= 5: + continue + # 存储车辆最终的轨迹和时间 final_vehicle_path = [] final_timestamp_list = [] @@ -404,8 +480,8 @@ def main(): vehicle_traj.append(result) # 读取groundtruth - data_truth = scipy.io.loadmat('vehicle_ground_truth.mat') - traj_truth = data_truth['vehicle_cells'] + data_truth = scipy.io.loadmat('pedestrian_ground_truth.mat') + traj_truth = data_truth['pedestrian_cells'] all_ground_truth = [] # 保存所有的车辆轨迹 for i in range(len(traj_truth[0])): struct = traj_truth[0][i] # 获取第 i 个 struct @@ -423,8 +499,8 @@ def main(): total_overlap = 0.0 valid_trajectories = 0 # 有效轨迹计数 - for ge_traj in vehicle_traj: - # for ge_traj in person_traj: + # for ge_traj in vehicle_traj: + for ge_traj in person_traj: max_overlap = -1 best_truth_traj = None track_points = np.array([[point[0], point[1]] for point in ge_traj]) From cb6600d5eddcd4e8a626fcdcbb230b24fd396e50 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Thu, 8 Jan 2026 18:46:44 +0800 Subject: [PATCH 16/31] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=87=A0=E7=A7=8D?= =?UTF-8?q?=E8=A1=8C=E4=BA=BA=E4=BD=8D=E7=BD=AE=E5=88=A4=E6=96=AD=E7=B1=BB?= =?UTF-8?q?=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../navigation/generate_trajectories.py | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/waypoint_control/multi_obj_track/navigation/generate_trajectories.py b/waypoint_control/multi_obj_track/navigation/generate_trajectories.py index 9ebbf4c..6f88d38 100644 --- a/waypoint_control/multi_obj_track/navigation/generate_trajectories.py +++ b/waypoint_control/multi_obj_track/navigation/generate_trajectories.py @@ -120,16 +120,36 @@ def is_valid_pedestrian_location(location, _map, max_distance=2.0): sidewalk_wp = _map.get_waypoint( location, lane_type=carla.LaneType.Sidewalk, - project_to_road=False # 不投影到道路 + project_to_road=False # 不投影到道路 ) if sidewalk_wp: - # 计算与人行道航点的距离 distance = location.distance(sidewalk_wp.transform.location) if distance <= max_distance: return True, distance, "sidewalk" - # 如果不是人行道,检查是否在十字路口附近(行人过马路) + # 检查是否是行人可以行走的特殊区域类型 + terrain_wp = _map.get_waypoint( + location, + lane_type=carla.LaneType.Any, # 使用Any获取任何类型的航点 + project_to_road=False + ) + + # 检查是否是适合行人的地面类型 + if terrain_wp: + distance = location.distance(terrain_wp.transform.location) + + # 检查是否属于行人可通行的区域类型 + if terrain_wp.lane_type in [ + carla.LaneType.Sidewalk, # 人行道 + carla.LaneType.Parking, # 停车场 + carla.LaneType.Border, # 道路边缘 + carla.LaneType.Shoulder # 路肩 + ]: + if distance <= max_distance: + return True, distance + + # 检查是否在十字路口范围内(行人过马路) road_wp = _map.get_waypoint(location) if road_wp and road_wp.is_junction: # 检查是否在十字路口范围内 @@ -139,14 +159,13 @@ def is_valid_pedestrian_location(location, _map, max_distance=2.0): junction_radius = max(junction.bounding_box.extent.x, junction.bounding_box.extent.y) - if distance_to_junction <= junction_radius + 5.0: # 留出5米缓冲区 + # 十字路口加上适当缓冲区作为行人过街区域 + if distance_to_junction <= junction_radius + 5.0: # 留出5米缓冲区 return True, distance_to_junction, "junction_crossing" - # 检查是否在建筑物入口、广场等区域 - # 这里可能需要额外的地图标记信息 - return False, None, "invalid" + def main(): argparser = argparse.ArgumentParser( description=__doc__) @@ -204,14 +223,12 @@ def main(): category = struct[0][0][5] print(category) if category == 'person': - print(1) positions = struct[0][0][2] # 获取单个的轨迹 timestamp = struct[0][0][4] # 获取对应轨迹中航点的时间戳0 _timestamp = [round(item[0], 2) for item in timestamp] person_paths.append(positions) person_timestamp_list.append(_timestamp) else: - print(2) positions = struct[0][0][2] # 获取单个的轨迹 timestamp = struct[0][0][4] # 获取对应轨迹中航点的时间戳0 _timestamp = [round(item[0], 2) for item in timestamp] From 27871fc4be98eddf65924a5f18cc428a0f864440 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Wed, 14 Jan 2026 17:44:04 +0800 Subject: [PATCH 17/31] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A1=8C=E4=BA=BA?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multi_obj_track/navigation/walkermove.py | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 waypoint_control/multi_obj_track/navigation/walkermove.py diff --git a/waypoint_control/multi_obj_track/navigation/walkermove.py b/waypoint_control/multi_obj_track/navigation/walkermove.py new file mode 100644 index 0000000..c0a3828 --- /dev/null +++ b/waypoint_control/multi_obj_track/navigation/walkermove.py @@ -0,0 +1,81 @@ +import carla +import random +import time + + +def create_pedestrian(start_location, end_location, world): + """创建并控制行人从起点走到终点""" + + # 选择行人蓝图 + walker_bp = random.choice( + world.get_blueprint_library().filter('walker.pedestrian.*') + ) + + # 设置行人属性 + walker_bp.set_attribute('is_invincible', 'false') + + # 生成行人 + transform = carla.Transform(start_location, carla.Rotation()) + walker = world.try_spawn_actor(walker_bp, transform) + + if walker is None: + print("无法生成行人") + return None + else: + print("行人生成成功") + + # 创建AI控制器 + controller_bp = world.get_blueprint_library().find('controller.ai.walker') + controller = world.spawn_actor(controller_bp, carla.Transform(), attach_to=walker) + + # 开始移动 + controller.start() + controller.go_to_location(end_location) + controller.set_max_speed(5) # 设置速度 + + return walker, controller + + +def main(): + client = carla.Client('localhost', 2000) + client.set_timeout(10.0) + world = client.get_world() + + # 设置起点和终点 + start_location = carla.Location(x=-74.2372235552250, y=34.0550152124566, z=1) + end_location = carla.Location(x=-64.5043248693601, y=34.0973325433420, z=1) + # end_location = carla.Location(x=-54.2372235552250, y=37.0550152124566, z=1) + # start_location = carla.Location(x=-38.5043248693601, y=46.0973325433420, z=1) + + # 创建行人 + walker, controller = create_pedestrian(start_location, end_location, world) + print("行人创建成功") + + if walker: + try: + # 等待行人到达目的地 + while True: + world.tick() + current_location = walker.get_location() + distance = current_location.distance(end_location) + + print(f"当前距离目标: {distance:.2f} 米") + + if distance < 2.0: # 当距离小于2米时认为到达 + print("行人已到达目的地!") + controller.stop() + break + + time.sleep(0.5) + + except KeyboardInterrupt: + pass + finally: + # 清理 + controller.stop() + walker.destroy() + controller.destroy() + + +if __name__ == "__main__": + main() \ No newline at end of file From 688fc0703e34cb4b3048866fc525d9e4d8b3fd58 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Wed, 14 Jan 2026 18:03:34 +0800 Subject: [PATCH 18/31] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A1=8C=E4=BA=BA?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../navigation/generate_trajectories.py | 73 ++++++++++++++--- .../multi_obj_track/navigation/walkermove.py | 81 ------------------- 2 files changed, 64 insertions(+), 90 deletions(-) delete mode 100644 waypoint_control/multi_obj_track/navigation/walkermove.py diff --git a/waypoint_control/multi_obj_track/navigation/generate_trajectories.py b/waypoint_control/multi_obj_track/navigation/generate_trajectories.py index 6f88d38..2ecc425 100644 --- a/waypoint_control/multi_obj_track/navigation/generate_trajectories.py +++ b/waypoint_control/multi_obj_track/navigation/generate_trajectories.py @@ -7,6 +7,7 @@ import numpy as np import os import random +import time from fastdtw import fastdtw from config import IntersectionConfig, town_configurations from global_route_planner import GlobalRoutePlanner @@ -165,6 +166,60 @@ def is_valid_pedestrian_location(location, _map, max_distance=2.0): return False, None, "invalid" +def create_pedestrian_move(start_location, end_location, world): + """创建并控制行人从起点走到终点""" + + # 选择行人蓝图 + walker_bp = random.choice( + world.get_blueprint_library().filter('walker.pedestrian.*') + ) + + # 设置行人属性 + walker_bp.set_attribute('is_invincible', 'false') + + # 生成行人 + transform = carla.Transform(start_location, carla.Rotation()) + walker = world.try_spawn_actor(walker_bp, transform) + + if walker is None: + print("无法生成行人") + return None + else: + print("行人生成成功") + + # 创建AI控制器 + controller_bp = world.get_blueprint_library().find('controller.ai.walker') + controller = world.spawn_actor(controller_bp, carla.Transform(), attach_to=walker) + + # 开始移动 + controller.start() + controller.go_to_location(end_location) + controller.set_max_speed(5) # 设置速度 + + try: + # 等待行人到达目的地 + while True: + world.tick() + current_location = walker.get_location() + distance = current_location.distance(end_location) + + print(f"当前距离目标: {distance:.2f} 米") + + if distance < 2.0: # 当距离小于2米时认为到达 + print("行人已到达目的地!") + controller.stop() + break + + time.sleep(0.5) + + except KeyboardInterrupt: + pass + finally: + # 清理 + controller.stop() + walker.destroy() + controller.destroy() + def main(): argparser = argparse.ArgumentParser( @@ -257,7 +312,7 @@ def main(): distance = dis_location.distance(nearest_waypoint.transform.location) # 计算 location 与最近的 waypoint 的距离,如果小于一定的阈值,则判断该轨迹是错误的 is_valid, adistance, location_type = is_valid_pedestrian_location(dis_location, _map, 2.0) - if distance < 5 and is_valid : + if distance < 4 and is_valid : continue # 存储行人最终的轨迹和时间 @@ -375,14 +430,14 @@ def main(): result.append(combine) person_traj.append(result) else: - # 排除非车辆轨迹,多目标跟踪和再识别的误差导致轨迹可能是非道路上的点 - dis_trajectory = vehicle_paths[0][0] - dis_location = carla.Location(x=dis_trajectory[0], y=dis_trajectory[1], z=dis_trajectory[2]) - nearest_waypoint = _map.get_waypoint(dis_location) - distance = dis_location.distance(nearest_waypoint.transform.location) - # 计算 location 与最近的 waypoint 的距离,如果大于一定的阈值,则判断该轨迹是错误的 - if distance >= 5: - continue + # # 排除非车辆轨迹,多目标跟踪和再识别的误差导致轨迹可能是非道路上的点 + # dis_trajectory = vehicle_paths[0][0] + # dis_location = carla.Location(x=dis_trajectory[0], y=dis_trajectory[1], z=dis_trajectory[2]) + # nearest_waypoint = _map.get_waypoint(dis_location) + # distance = dis_location.distance(nearest_waypoint.transform.location) + # # 计算 location 与最近的 waypoint 的距离,如果大于一定的阈值,则判断该轨迹是错误的 + # if distance >= 4: + # continue # 存储车辆最终的轨迹和时间 final_vehicle_path = [] diff --git a/waypoint_control/multi_obj_track/navigation/walkermove.py b/waypoint_control/multi_obj_track/navigation/walkermove.py deleted file mode 100644 index c0a3828..0000000 --- a/waypoint_control/multi_obj_track/navigation/walkermove.py +++ /dev/null @@ -1,81 +0,0 @@ -import carla -import random -import time - - -def create_pedestrian(start_location, end_location, world): - """创建并控制行人从起点走到终点""" - - # 选择行人蓝图 - walker_bp = random.choice( - world.get_blueprint_library().filter('walker.pedestrian.*') - ) - - # 设置行人属性 - walker_bp.set_attribute('is_invincible', 'false') - - # 生成行人 - transform = carla.Transform(start_location, carla.Rotation()) - walker = world.try_spawn_actor(walker_bp, transform) - - if walker is None: - print("无法生成行人") - return None - else: - print("行人生成成功") - - # 创建AI控制器 - controller_bp = world.get_blueprint_library().find('controller.ai.walker') - controller = world.spawn_actor(controller_bp, carla.Transform(), attach_to=walker) - - # 开始移动 - controller.start() - controller.go_to_location(end_location) - controller.set_max_speed(5) # 设置速度 - - return walker, controller - - -def main(): - client = carla.Client('localhost', 2000) - client.set_timeout(10.0) - world = client.get_world() - - # 设置起点和终点 - start_location = carla.Location(x=-74.2372235552250, y=34.0550152124566, z=1) - end_location = carla.Location(x=-64.5043248693601, y=34.0973325433420, z=1) - # end_location = carla.Location(x=-54.2372235552250, y=37.0550152124566, z=1) - # start_location = carla.Location(x=-38.5043248693601, y=46.0973325433420, z=1) - - # 创建行人 - walker, controller = create_pedestrian(start_location, end_location, world) - print("行人创建成功") - - if walker: - try: - # 等待行人到达目的地 - while True: - world.tick() - current_location = walker.get_location() - distance = current_location.distance(end_location) - - print(f"当前距离目标: {distance:.2f} 米") - - if distance < 2.0: # 当距离小于2米时认为到达 - print("行人已到达目的地!") - controller.stop() - break - - time.sleep(0.5) - - except KeyboardInterrupt: - pass - finally: - # 清理 - controller.stop() - walker.destroy() - controller.destroy() - - -if __name__ == "__main__": - main() \ No newline at end of file From b4a17e3b8d0569a7330d4682258d8837abad1589 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Thu, 15 Jan 2026 17:08:30 +0800 Subject: [PATCH 19/31] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E7=82=B9=E5=B9=B6=E8=AE=BE=E7=BD=AE=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../navigation/generate_trajectories.py | 55 +++++++++++++++++-- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/waypoint_control/multi_obj_track/navigation/generate_trajectories.py b/waypoint_control/multi_obj_track/navigation/generate_trajectories.py index 2ecc425..33fe1a9 100644 --- a/waypoint_control/multi_obj_track/navigation/generate_trajectories.py +++ b/waypoint_control/multi_obj_track/navigation/generate_trajectories.py @@ -166,7 +166,7 @@ def is_valid_pedestrian_location(location, _map, max_distance=2.0): return False, None, "invalid" -def create_pedestrian_move(start_location, end_location, world): +def create_pedestrian_move(start_location, end_location, world, totaltime): """创建并控制行人从起点走到终点""" # 选择行人蓝图 @@ -191,10 +191,29 @@ def create_pedestrian_move(start_location, end_location, world): controller_bp = world.get_blueprint_library().find('controller.ai.walker') controller = world.spawn_actor(controller_bp, carla.Transform(), attach_to=walker) + # 判断速度是否合理 + position_history = [] + current_location = walker.get_location() + distance = current_location.distance(end_location) + init_distance = distance + print("总距离为:", distance) + speed = distance / totaltime + if speed > 6: + print("速度不合理,其值为: ", speed) + return position_history + else: + print("速度合理,其值为", speed) + # 开始移动 controller.start() controller.go_to_location(end_location) - controller.set_max_speed(5) # 设置速度 + controller.set_max_speed(speed) # 设置速度 + + original_settings = world.get_settings() + settings = world.get_settings() + settings.synchronous_mode = True # 开启同步模式 + settings.fixed_delta_seconds = 0.05 # 固定时间步长 0.05 秒 + world.apply_settings(settings) try: # 等待行人到达目的地 @@ -203,14 +222,36 @@ def create_pedestrian_move(start_location, end_location, world): current_location = walker.get_location() distance = current_location.distance(end_location) - print(f"当前距离目标: {distance:.2f} 米") + # 每0.05秒记录一次位置 + position_record = { + # 'timestamp': time.time(), + # 'z': current_location.z, + # 'distance': distance, + 'x': current_location.x, + 'y': current_location.y + } + position_history.append(position_record) + + print(f"位置: ({position_record['x']:.2f}, {position_record['y']:.2f})", f"当前距离目标: {distance:.2f} 米") - if distance < 2.0: # 当距离小于2米时认为到达 + if distance < 1: # 当距离小于1米时认为到达 print("行人已到达目的地!") + # 打印统计信息 + # print(f"\n总共记录了 {len(position_history)} 个位置点") + # if position_history: + # print(f"起始时间: {position_history[0]['timestamp']:.3f}") + # print(f"结束时间: {position_history[-1]['timestamp']:.3f}") + # print(f"总耗时: {position_history[-1]['timestamp'] - position_history[0]['timestamp']:.3f} 秒") controller.stop() break - time.sleep(0.5) + if distance > (init_distance + 3): # 当距离越来越远时认为路径错误 + print("路径错误") + controller.stop() + position_history.clear() + break + + # time.sleep(0.05) except KeyboardInterrupt: pass @@ -219,6 +260,10 @@ def create_pedestrian_move(start_location, end_location, world): controller.stop() walker.destroy() controller.destroy() + # 恢复原始设置 + world.apply_settings(original_settings) + + return position_history def main(): From 9c6c7b0420b2bfe9fd0b0b84e6651d7709e64b6f Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Tue, 20 Jan 2026 16:35:05 +0800 Subject: [PATCH 20/31] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E5=A4=8D=E7=8E=B0=E8=BD=A8=E8=BF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../navigation/generate_trajectories.py | 35 ++++++------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/waypoint_control/multi_obj_track/navigation/generate_trajectories.py b/waypoint_control/multi_obj_track/navigation/generate_trajectories.py index 33fe1a9..f3d5692 100644 --- a/waypoint_control/multi_obj_track/navigation/generate_trajectories.py +++ b/waypoint_control/multi_obj_track/navigation/generate_trajectories.py @@ -196,7 +196,7 @@ def create_pedestrian_move(start_location, end_location, world, totaltime): current_location = walker.get_location() distance = current_location.distance(end_location) init_distance = distance - print("总距离为:", distance) + # print("总距离为:", distance) speed = distance / totaltime if speed > 6: print("速度不合理,其值为: ", speed) @@ -219,29 +219,14 @@ def create_pedestrian_move(start_location, end_location, world, totaltime): # 等待行人到达目的地 while True: world.tick() - current_location = walker.get_location() - distance = current_location.distance(end_location) # 每0.05秒记录一次位置 - position_record = { - # 'timestamp': time.time(), - # 'z': current_location.z, - # 'distance': distance, - 'x': current_location.x, - 'y': current_location.y - } - position_history.append(position_record) - - print(f"位置: ({position_record['x']:.2f}, {position_record['y']:.2f})", f"当前距离目标: {distance:.2f} 米") + current_location = walker.get_location() + distance = current_location.distance(end_location) + position_history.append(current_location) if distance < 1: # 当距离小于1米时认为到达 print("行人已到达目的地!") - # 打印统计信息 - # print(f"\n总共记录了 {len(position_history)} 个位置点") - # if position_history: - # print(f"起始时间: {position_history[0]['timestamp']:.3f}") - # print(f"结束时间: {position_history[-1]['timestamp']:.3f}") - # print(f"总耗时: {position_history[-1]['timestamp'] - position_history[0]['timestamp']:.3f} 秒") controller.stop() break @@ -394,11 +379,11 @@ def main(): end_location = carla.Location(x=end_loc[0], y=end_loc[1], z=end_loc[2]) # 使用导航算法生成新轨迹 # 处理无法到达的轨迹 - end_waypoint = _map.get_waypoint(end_location) - start_waypoint = _map.get_waypoint(start_location) + # end_waypoint = _map.get_waypoint(end_location) + # start_waypoint = _map.get_waypoint(start_location) + totaltime = person_timestamp_list[k + 1][0]-person_timestamp_list[k][-1] try: - interval_trajectory = set_destination(start_waypoint.transform.location, - end_waypoint.transform.location, _map, global_router) + position = create_pedestrian_move(start_location, end_location, totaltime) except Exception as e: is_exception = True if k > 0: @@ -412,9 +397,9 @@ def main(): break # 将 waypoint list 转换成[[x, y, z], [x, y, z], ...] trajectory = [] - for waypoint in interval_trajectory: + for waypoint in position: # 获取 waypoint 的位置 - location = waypoint.transform.location + location = waypoint # 提取 x, y, z 值 x = location.x y = location.y From 76a2f6739a043ce4d4f499792a326def2db99174 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Fri, 23 Jan 2026 18:11:57 +0800 Subject: [PATCH 21/31] =?UTF-8?q?=E6=8E=A7=E5=88=B6=E8=A1=8C=E4=BA=BA?= =?UTF-8?q?=E5=A4=8D=E7=8E=B0=E8=BD=A8=E8=BF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- waypoint_control/finalControl.py | 978 +++++++++++++++++++++++++++++++ 1 file changed, 978 insertions(+) create mode 100644 waypoint_control/finalControl.py diff --git a/waypoint_control/finalControl.py b/waypoint_control/finalControl.py new file mode 100644 index 0000000..1fc3d73 --- /dev/null +++ b/waypoint_control/finalControl.py @@ -0,0 +1,978 @@ +#!/usr/bin/env python3 + +from __future__ import print_function +from __future__ import division + +import random +# System level imports +import sys +import os +import argparse +import logging +import time +import math +import numpy as np +import csv +import matplotlib + +matplotlib.use('agg') +import warnings +from collections import defaultdict +from dataclasses import dataclass +from typing import List, Dict, Tuple, Optional, Any +import queue +import threading + +warnings.filterwarnings("ignore") + +# Local level imports +import Controller + +# Script level imports +sys.path.append(os.path.abspath(sys.path[0] + '/..')) +import carla + +""" +Configurable Parameters +""" +ITER_FOR_SIM_TIMESTEP = 10 # no. iterations to compute approx sim timestep +WAIT_TIME_BEFORE_START = 2.00 # simulator seconds (time before controller start) +TOTAL_RUN_TIME = 200.00 # simulator seconds (total runtime before sim end) +TOTAL_FRAME_BUFFER = 300 # number of frames to buffer after total runtime +NUM_PEDESTRIANS = 0 # total number of pedestrians to spawn +NUM_VEHICLES = 3 # total number of vehicles to spawn +SEED_PEDESTRIANS = 0 # seed for pedestrian spawn randomizer +SEED_VEHICLES = 0 # seed for vehicle spawn randomizer +MAX_SIMULATION_FRAMES = 700 # maximum number of simulation frames + +WEATHERID = { + "DEFAULT": 0, + "CLEARNOON": 1, + "CLOUDYNOON": 2, + "WETNOON": 3, + "WETCLOUDYNOON": 4, + "MIDRAINYNOON": 5, + "HARDRAINNOON": 6, + "SOFTRAINNOON": 7, + "CLEARSUNSET": 8, + "CLOUDYSUNSET": 9, + "WETSUNSET": 10, + "WETCLOUDYSUNSET": 11, + "MIDRAINSUNSET": 12, + "HARDRAINSUNSET": 13, + "SOFTRAINSUNSET": 14, +} +SIMWEATHER = WEATHERID["CLEARNOON"] # set simulation weather + +PLAYER_START_INDEX = 1 # spawn index for player (keep to 1) +FIGSIZE_X_INCHES = 6 # x figure size of feedback in inches +FIGSIZE_Y_INCHES = 8 # y figure size of feedback in inches +PLOT_LEFT = 0.1 # in fractions of figure width and height +PLOT_BOT = 0.1 +PLOT_WIDTH = 0.8 +PLOT_HEIGHT = 0.8 + +WAYPOINTS_FILENAME = 'vehicleWaypoints.txt' # waypoint file to load +PEDESTRIAN_WAYPOINTS_FILENAME = 'personWaypoints.txt' # 行人轨迹文件 +DIST_THRESHOLD_TO_LAST_WAYPOINT = 2.0 # some distance from last position before simulation ends + +# Path interpolation parameters +INTERP_MAX_POINTS_PLOT = 10 # number of points used for displaying +INTERP_LOOKAHEAD_DISTANCE = 20 # lookahead in meters +INTERP_DISTANCE_RES = 0.01 # distance between interpolated points + +# Controller output directory +CONTROLLER_OUTPUT_FOLDER = os.path.dirname(os.path.realpath(__file__)) + '/Results/' + + +@dataclass +class VehicleData: + """车辆数据类""" + id: int + actor: carla.Vehicle + controller: Any + waypoints: List[Tuple[float, float, float]] + x_history: List[float] + y_history: List[float] + yaw_history: List[float] + time_history: List[float] + speed_history: List[float] + cte_history: List[float] + he_history: List[float] + latency_history: List[float] + reached_end: bool = False + closest_index: int = 0 + last_location: Tuple[float, float, float] = (0.0, 0.0, 0.0) + + +@dataclass +class PedestrianData: + """行人数据类""" + id: int + actor: carla.Walker + controller: carla.WalkerAIController + trajectory: List[Dict[str, float]] + current_waypoint_idx: int = 0 + completed: bool = False + spawn_time: float = 0.0 + + +class SimulationManager: + """仿真管理器""" + + def __init__(self, args): + self.args = args + self.client = None + self.world = None + self.map = None + self.original_settings = None + + # 数据存储 + self.vehicles: Dict[int, VehicleData] = {} + self.pedestrians: Dict[int, PedestrianData] = {} + + # 轨迹数据 + self.vehicle_waypoints: Dict[int, List[Tuple[float, float, float]]] = {} + self.pedestrian_trajectories: Dict[int, List[Dict[str, float]]] = {} + + # 状态 + self.sim_running = False + self.sim_start_time = 0.0 + self.frame_count = 0 + + def connect_to_carla(self) -> bool: + """连接到Carla服务器""" + try: + print(f"Connecting to CARLA server at {self.args.host}:{self.args.port}...") + self.client = carla.Client(self.args.host, self.args.port) + self.client.set_timeout(30.0) + self.world = self.client.get_world() + + # 保存原始设置 + self.original_settings = self.world.get_settings() + + print(f"Connected to CARLA server. Map: {self.world.get_map().name}") + return True + + except Exception as e: + print(f"Failed to connect to CARLA: {e}") + return False + + def setup_simulation(self) -> bool: + """设置仿真环境""" + try: + # 设置天气 + weather = carla.WeatherParameters.ClearNoon + if SIMWEATHER == WEATHERID["CLEARNOON"]: + weather = carla.WeatherParameters.ClearNoon + elif SIMWEATHER == WEATHERID["CLOUDYNOON"]: + weather = carla.WeatherParameters.CloudyNoon + + self.world.set_weather(weather) + self.map = self.world.get_map() + + # 设置同步模式 + settings = self.world.get_settings() + settings.synchronous_mode = True + settings.fixed_delta_seconds = 0.05 # 20 FPS + settings.no_rendering_mode = False + + self.world.apply_settings(settings) + + # 设置交通管理器 + traffic_manager = self.client.get_trafficmanager() + traffic_manager.set_synchronous_mode(True) + traffic_manager.set_random_device_seed(0) + + print("Simulation setup completed") + return True + + except Exception as e: + print(f"Failed to setup simulation: {e}") + return False + + def load_vehicle_waypoints(self) -> bool: + """加载车辆轨迹点""" + try: + print(f"Loading vehicle waypoints from {WAYPOINTS_FILENAME}...") + + if not os.path.exists(WAYPOINTS_FILENAME): + print(f"Error: Waypoints file not found: {WAYPOINTS_FILENAME}") + return False + + with open(WAYPOINTS_FILENAME, 'r') as f: + reader = csv.reader(f, delimiter=' ', quoting=csv.QUOTE_NONNUMERIC) + for row in reader: + if len(row) < 4: + continue + + vehicle_id = int(row[0]) + x = float(row[1]) + y = float(row[2]) + t = float(row[3]) + + if vehicle_id not in self.vehicle_waypoints: + self.vehicle_waypoints[vehicle_id] = [] + + self.vehicle_waypoints[vehicle_id].append((x, y, t)) + + # 按时间排序 + for vehicle_id in self.vehicle_waypoints: + self.vehicle_waypoints[vehicle_id].sort(key=lambda wp: wp[2]) + + print(f"Loaded waypoints for {len(self.vehicle_waypoints)} vehicles") + return True + + except Exception as e: + print(f"Failed to load vehicle waypoints: {e}") + return False + + def load_pedestrian_trajectories(self) -> bool: + """加载行人轨迹""" + try: + print(f"Loading pedestrian trajectories from {PEDESTRIAN_WAYPOINTS_FILENAME}...") + + if not os.path.exists(PEDESTRIAN_WAYPOINTS_FILENAME): + print(f"Warning: Pedestrian trajectories file not found: {PEDESTRIAN_WAYPOINTS_FILENAME}") + return False # 没有行人轨迹程序中断 + + with open(PEDESTRIAN_WAYPOINTS_FILENAME, 'r') as f: + for line_num, line in enumerate(f, 1): + line = line.strip() + if not line: + continue + + parts = line.split() + if len(parts) < 4: + continue + + try: + person_id = int(parts[0]) + x = float(parts[1]) + y = float(parts[2]) + timestamp = float(parts[3]) + + if person_id not in self.pedestrian_trajectories: + self.pedestrian_trajectories[person_id] = [] + + self.pedestrian_trajectories[person_id].append({ + 'x': x, + 'y': y, + 'timestamp': timestamp + }) + except ValueError: + continue + + # 按时间排序 + for person_id in self.pedestrian_trajectories: + self.pedestrian_trajectories[person_id].sort(key=lambda wp: wp['timestamp']) + + print(f"Loaded trajectories for {len(self.pedestrian_trajectories)} pedestrians") + return True + + except Exception as e: + print(f"Failed to load pedestrian trajectories: {e}") + return False + + def get_ground_height(self, x: float, y: float) -> float: + """获取地面高度""" + try: + # 创建raycast查询 + start_location = carla.Location(x=x, y=y, z=1000.0) + end_location = carla.Location(x=x, y=y, z=-1000.0) + + # 执行raycast + hit = self.world.cast_ray(start_location, end_location) + + if hit: + return hit.location.z + 0.5 # 稍微抬高一点 + + # 如果没有命中,尝试使用waypoint + waypoint = self.map.get_waypoint(carla.Location(x=x, y=y, z=0)) + if waypoint: + return waypoint.transform.location.z + 0.5 + + # 默认高度 + return 1.0 + + except Exception as e: + print(f"Error getting ground height at ({x}, {y}): {e}") + return 1.0 + + def spawn_vehicle(self, vehicle_id: int, waypoints: List[Tuple[float, float, float]]) -> Optional[VehicleData]: + """生成车辆""" + try: + # 获取车辆蓝图 + blueprint_library = self.world.get_blueprint_library() + + # 过滤车辆蓝图 + vehicle_bps = [ + bp for bp in blueprint_library.filter('vehicle.*') + if not any(excluded in bp.id for excluded in [ + 'vehicle.micro.microlino', 'vehicle.mini.cooper_s_2021', + 'vehicle.nissan.patrol_2021', 'vehicle.carlamotors.carlacola', + 'vehicle.carlamotors.european_hgv', 'vehicle.carlamotors.firetruck', + 'vehicle.tesla.cybertruck', 'vehicle.ford.ambulance', + 'vehicle.mercedes.sprinter', 'vehicle.volkswagen.t2', + 'vehicle.volkswagen.t2_2021', 'vehicle.mitsubishi.fusorosa', + 'vehicle.harley-davidson.low_rider', 'vehicle.kawasaki.ninja', + 'vehicle.vespa.zx125', 'vehicle.yamaha.yzf', + 'vehicle.bh.crossbike', 'vehicle.diamondback.century', + 'vehicle.gazelle.omafiets' + ]) + ] + + if not vehicle_bps: + print(f"Error: No valid vehicle blueprints found") + return None + + # 选择随机车辆类型 + vehicle_bp = random.choice(vehicle_bps) + + # 设置生成位置为第一个轨迹点 + x, y, t = waypoints[0] + z = self.get_ground_height(x, y) + + # 获取最近的waypoint以获得正确的朝向 + location = carla.Location(x=x, y=y, z=z) + carla_waypoint = self.map.get_waypoint(location) + + if carla_waypoint: + yaw = carla_waypoint.transform.rotation.yaw + else: + yaw = 0.0 + + # 创建transform + transform = carla.Transform( + carla.Location(x=x, y=y, z=z), + carla.Rotation(yaw=yaw) + ) + + # 生成车辆 + print(f"Spawning vehicle {vehicle_id} at ({x:.2f}, {y:.2f}, {z:.2f})") + vehicle = self.world.try_spawn_actor(vehicle_bp, transform) + + if vehicle is None: + print(f"Failed to spawn vehicle {vehicle_id}") + return None + + # 创建控制器 + controller = Controller.Controller( + waypoints, + self.args.lateral_controller, + self.args.longitudinal_controller + ) + + # 设置车辆属性 + vehicle.set_autopilot(False) + + # 创建车辆数据对象 + vehicle_data = VehicleData( + id=vehicle_id, + actor=vehicle, + controller=controller, + waypoints=waypoints, + x_history=[], + y_history=[], + yaw_history=[], + time_history=[], + speed_history=[], + cte_history=[], + he_history=[], + latency_history=[] + ) + + print(f"Vehicle {vehicle_id} spawned successfully") + return vehicle_data + + except Exception as e: + print(f"Error spawning vehicle {vehicle_id}: {e}") + return None + + def spawn_pedestrian(self, person_id: int, trajectory: List[Dict[str, float]]) -> Optional[PedestrianData]: + """生成行人""" + try: + # 获取行人蓝图 + blueprint_library = self.world.get_blueprint_library() + walker_bps = blueprint_library.filter('walker.pedestrian.*') + + if not walker_bps: + print(f"Error: No pedestrian blueprints found") + return None + + # 根据ID选择确定的行人类型 + bp_index = person_id % len(walker_bps) + walker_bp = walker_bps[bp_index] + + # 设置生成位置 + start_waypoint = trajectory[0] + x, y = start_waypoint['x'], start_waypoint['y'] + z = self.get_ground_height(x, y) + + # 创建transform + transform = carla.Transform( + carla.Location(x=x, y=y, z=z), + carla.Rotation(yaw=0.0) + ) + + # 生成行人 + print(f"Spawning pedestrian {person_id} at ({x:.2f}, {y:.2f}, {z:.2f})") + walker = self.world.try_spawn_actor(walker_bp, transform) + + if walker is None: + print(f"Failed to spawn pedestrian {person_id}") + return None + + # 创建AI控制器 + controller_bp = blueprint_library.find('controller.ai.walker') + controller = self.world.spawn_actor(controller_bp, carla.Transform(), attach_to=walker) + + # 设置行人属性 + walker.set_simulate_physics(True) + + # 创建行人数据对象 + pedestrian_data = PedestrianData( + id=person_id, + actor=walker, + controller=controller, + trajectory=trajectory + ) + + print(f"Pedestrian {person_id} spawned successfully") + return pedestrian_data + + except Exception as e: + print(f"Error spawning pedestrian {person_id}: {e}") + return None + + def update_vehicle(self, vehicle_data: VehicleData, current_time: float) -> bool: + """更新车辆状态""" + try: + if vehicle_data.reached_end: + return True + + vehicle = vehicle_data.actor + + # 获取车辆当前位置 + transform = vehicle.get_transform() + x = transform.location.x + y = transform.location.y + z = transform.location.z + yaw = math.radians(transform.rotation.yaw) + + # 获取车辆速度 + velocity = vehicle.get_velocity() + speed = math.sqrt(velocity.x ** 2 + velocity.y ** 2 + velocity.z ** 2) + + # 更新历史数据 + vehicle_data.x_history.append(x) + vehicle_data.y_history.append(y) + vehicle_data.yaw_history.append(yaw) + vehicle_data.time_history.append(current_time) + vehicle_data.speed_history.append(speed) + + # 在控制器启动前等待 + if current_time < WAIT_TIME_BEFORE_START: + control = carla.VehicleControl() + control.throttle = 0.0 + control.steer = 0.0 + control.brake = 1.0 + vehicle.apply_control(control) + return False + + # 调整控制器时间 + controller_time = current_time - WAIT_TIME_BEFORE_START + + # 找到最近的路径点 + waypoints = vehicle_data.waypoints + closest_index = vehicle_data.closest_index + + # 向前搜索最近的路径点 + min_dist = float('inf') + search_range = min(10, len(waypoints) - closest_index) + + for i in range(closest_index, min(closest_index + search_range, len(waypoints))): + wx, wy, wt = waypoints[i] + dist = math.sqrt((wx - x) ** 2 + (wy - y) ** 2) + if dist < min_dist: + min_dist = dist + vehicle_data.closest_index = i + + # 向后搜索最近的路径点 + for i in range(max(0, vehicle_data.closest_index - 5), vehicle_data.closest_index): + wx, wy, wt = waypoints[i] + dist = math.sqrt((wx - x) ** 2 + (wy - y) ** 2) + if dist < min_dist: + min_dist = dist + vehicle_data.closest_index = i + + # 更新控制器 + controller = vehicle_data.controller + + # 设置lookahead路径点 + lookahead_start = max(0, vehicle_data.closest_index - 1) + lookahead_end = min(len(waypoints), vehicle_data.closest_index + 20) + + if lookahead_end > lookahead_start: + lookahead_waypoints = waypoints[lookahead_start:lookahead_end] + controller.update_waypoints(lookahead_waypoints) + + # 更新控制器状态 + controller.update_values(x, y, yaw, speed, controller_time, 1, min_dist) + + # 计算控制命令 + controller.update_controls() + throttle, steer, brake = controller.get_commands() + + # 记录误差 + vehicle_data.cte_history.append(controller.get_crosstrack_error(x, y, waypoints)) + vehicle_data.he_history.append(controller.get_heading_error(waypoints, yaw)) + vehicle_data.latency_history.append(controller._latency if hasattr(controller, '_latency') else 0.0) + + # 应用控制 + control = carla.VehicleControl() + control.throttle = max(0.0, min(1.0, throttle)) + control.steer = max(-1.0, min(1.0, steer)) + control.brake = max(0.0, min(1.0, brake)) + + vehicle.apply_control(control) + + # 检查是否到达终点 + last_wp = waypoints[-1] + dist_to_end = math.sqrt((last_wp[0] - x) ** 2 + (last_wp[1] - y) ** 2) + + if dist_to_end < DIST_THRESHOLD_TO_LAST_WAYPOINT: + print(f"Vehicle {vehicle_data.id} reached destination") + vehicle_data.reached_end = True + return True + + return False + + except Exception as e: + print(f"Error updating vehicle {vehicle_data.id}: {e}") + return False + + def update_pedestrian(self, ped_data: PedestrianData, current_time: float) -> bool: + """更新行人状态""" + try: + if ped_data.completed: + return True + + trajectory = ped_data.trajectory + + # 如果轨迹为空或当前时间早于第一个轨迹点 + if not trajectory or current_time < trajectory[0]['timestamp']: + return False + + # 如果当前时间晚于最后一个轨迹点 + if current_time >= trajectory[-1]['timestamp']: + ped_data.completed = True + return True + + # 找到当前时间对应的轨迹点 + idx = ped_data.current_waypoint_idx + + # 如果当前索引已经超出范围 + if idx >= len(trajectory): + ped_data.completed = True + return True + + # 找到包含当前时间的轨迹点区间 + for i in range(idx, len(trajectory) - 1): + t1 = trajectory[i]['timestamp'] + t2 = trajectory[i + 1]['timestamp'] + + if t1 <= current_time <= t2: + # 线性插值 + alpha = (current_time - t1) / (t2 - t1) if t2 > t1 else 0.0 + x1, y1 = trajectory[i]['x'], trajectory[i]['y'] + x2, y2 = trajectory[i + 1]['x'], trajectory[i + 1]['y'] + + target_x = x1 + (x2 - x1) * alpha + target_y = y1 + (y2 - y1) * alpha + target_z = self.get_ground_height(target_x, target_y) + + # 计算朝向 + dx = target_x - x1 + dy = target_y - y1 + yaw = math.degrees(math.atan2(dy, dx)) if dx != 0 or dy != 0 else 0.0 + + # 设置目标位置 + target_location = carla.Location(x=target_x, y=target_y, z=target_z) + + # 使用控制器移动到目标位置 + ped_data.controller.start() + ped_data.controller.go_to_location(target_location) + + # 更新朝向 + transform = ped_data.actor.get_transform() + transform.location = target_location + transform.rotation.yaw = yaw + ped_data.actor.set_transform(transform) + + ped_data.current_waypoint_idx = i + break + + return False + + except Exception as e: + print(f"Error updating pedestrian {ped_data.id}: {e}") + return False + + def interpolate_waypoints(self, waypoints: List[Tuple[float, float, float]]) -> List[Tuple[float, float, float]]: + """对路径点进行插值""" + if not waypoints or len(waypoints) < 2: + return waypoints + + interpolated = [] + + for i in range(len(waypoints) - 1): + x1, y1, t1 = waypoints[i] + x2, y2, t2 = waypoints[i + 1] + + # 添加原始点 + interpolated.append((x1, y1, t1)) + + # 计算距离 + dist = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2) + + # 如果需要插值 + if dist > INTERP_DISTANCE_RES: + num_points = int(dist / INTERP_DISTANCE_RES) + + for j in range(1, num_points): + alpha = j / num_points + x = x1 + (x2 - x1) * alpha + y = y1 + (y2 - y1) * alpha + t = t1 + (t2 - t1) * alpha + interpolated.append((x, y, t)) + + # 添加最后一个点 + interpolated.append(waypoints[-1]) + + return interpolated + + def run_simulation(self): + """运行仿真""" + print("\n" + "=" * 60) + print("Starting simulation with vehicle and pedestrian control") + print("=" * 60) + + try: + # 设置仿真开始时间 + self.sim_start_time = time.time() + self.sim_running = True + + # 初始化统计 + completed_vehicles = 0 + completed_pedestrians = 0 + + # 主仿真循环 + for frame in range(MAX_SIMULATION_FRAMES): + if not self.sim_running: + break + + # 计算当前仿真时间 + current_time = frame * 0.05 # 假设20 FPS,每帧0.05秒 + + # 1. 生成车辆(根据时间) + for vehicle_id, waypoints in list(self.vehicle_waypoints.items()): + if vehicle_id not in self.vehicles and waypoints: + spawn_time = waypoints[0][2] + + if current_time >= spawn_time: + # 对路径点进行插值 + interpolated_waypoints = self.interpolate_waypoints(waypoints) + + # 生成车辆 + vehicle_data = self.spawn_vehicle(vehicle_id, interpolated_waypoints) + + if vehicle_data: + self.vehicles[vehicle_id] = vehicle_data + print(f"Spawned vehicle {vehicle_id} at time {current_time:.2f}s") + + # 2. 生成行人(根据时间) + for person_id, trajectory in list(self.pedestrian_trajectories.items()): + if person_id not in self.pedestrians and trajectory: + spawn_time = trajectory[0]['timestamp'] + + if current_time >= spawn_time: + # 生成行人 + ped_data = self.spawn_pedestrian(person_id, trajectory) + + if ped_data: + self.pedestrians[person_id] = ped_data + ped_data.spawn_time = current_time + print(f"Spawned pedestrian {person_id} at time {current_time:.2f}s") + + # 3. 更新所有车辆 + for vehicle_id, vehicle_data in list(self.vehicles.items()): + if not vehicle_data.reached_end: + completed = self.update_vehicle(vehicle_data, current_time) + if completed: + completed_vehicles += 1 + + # 4. 更新所有行人 + for person_id, ped_data in list(self.pedestrians.items()): + if not ped_data.completed: + completed = self.update_pedestrian(ped_data, current_time) + if completed: + completed_pedestrians += 1 + + # 5. 执行world tick + self.world.tick() + self.frame_count += 1 + + # 6. 打印进度 + if frame % 100 == 0: + total_vehicles = len(self.vehicle_waypoints) + total_pedestrians = len(self.pedestrian_trajectories) + + print(f"\nFrame {frame}, Time: {current_time:.2f}s") + print(f"Vehicles: {completed_vehicles}/{total_vehicles} completed") + print(f"Pedestrians: {completed_pedestrians}/{total_pedestrians} completed") + + # 7. 检查是否所有车辆和行人都已完成 + if (completed_vehicles >= len(self.vehicle_waypoints) and + completed_pedestrians >= len(self.pedestrian_trajectories)): + print("\nAll vehicles and pedestrians have completed their trajectories!") + break + + # 小延迟,避免过快的循环 + time.sleep(0.001) + + # 仿真结束 + self.sim_running = False + + # 打印最终统计 + print("\n" + "=" * 60) + print("Simulation Completed") + print("=" * 60) + print(f"Total frames: {self.frame_count}") + print(f"Total simulation time: {self.frame_count * 0.05:.2f}s") + print(f"Vehicles spawned: {len(self.vehicles)}") + print(f"Pedestrians spawned: {len(self.pedestrians)}") + + # 计算性能指标 + self.calculate_metrics() + + except KeyboardInterrupt: + print("\nSimulation interrupted by user") + except Exception as e: + print(f"\nError during simulation: {e}") + import traceback + traceback.print_exc() + finally: + self.cleanup() + + def calculate_metrics(self): + """计算性能指标""" + try: + print("\n计算性能指标...") + + # 计算车辆跟踪误差 + total_cte = 0.0 + total_he = 0.0 + count = 0 + + for vehicle_data in self.vehicles.values(): + if vehicle_data.cte_history: + total_cte += sum(vehicle_data.cte_history) / len(vehicle_data.cte_history) + total_he += sum(vehicle_data.he_history) / len(vehicle_data.he_history) + count += 1 + + if count > 0: + avg_cte = total_cte / count + avg_he = total_he / count + print(f"\n车辆追踪指标:") + print(f" 平均横穿航迹误差: {avg_cte:.4f} m") + print(f" 平均航向误差: {avg_he:.4f} rad") + + # 计算行人完成率 + if self.pedestrian_trajectories: + completed = sum(1 for p in self.pedestrians.values() if p.completed) + total = len(self.pedestrian_trajectories) + completion_rate = completed / total * 100 if total > 0 else 0 + + print(f"\n行人指标:") + print(f" 完成率: {completion_rate:.1f}% ({completed}/{total})") + + print("\n指标计算完成") + + except Exception as e: + print(f"指标计算错误: {e}") + + def cleanup(self): + """清理资源""" + print("\nCleaning up resources...") + + # 停止仿真 + self.sim_running = False + + # 销毁行人 + for person_id, ped_data in list(self.pedestrians.items()): + try: + if ped_data.controller: + ped_data.controller.stop() + ped_data.controller.destroy() + + if ped_data.actor: + ped_data.actor.destroy() + + print(f" Destroyed pedestrian {person_id}") + except Exception as e: + print(f" Error destroying pedestrian {person_id}: {e}") + + # 销毁车辆 + for vehicle_id, vehicle_data in list(self.vehicles.items()): + try: + if vehicle_data.actor: + vehicle_data.actor.destroy() + + print(f" Destroyed vehicle {vehicle_id}") + except Exception as e: + print(f" Error destroying vehicle {vehicle_id}: {e}") + + # 恢复原始设置 + try: + if self.original_settings and self.world: + self.world.apply_settings(self.original_settings) + + # 禁用交通管理器同步模式 + traffic_manager = self.client.get_trafficmanager() + traffic_manager.set_synchronous_mode(False) + + print("Restored original CARLA settings") + except Exception as e: + print(f"Error restoring settings: {e}") + + print("Cleanup completed") + + +def main(): + """主函数""" + global WAYPOINTS_FILENAME, PEDESTRIAN_WAYPOINTS_FILENAME, SIMWEATHER + parser = argparse.ArgumentParser(description='CARLA Vehicle and Pedestrian Control Simulation') + + parser.add_argument( + '--host', + default='localhost', + help='IP of the host server (default: localhost)' + ) + parser.add_argument( + '-p', '--port', + type=int, + default=2000, + help='TCP port to listen to (default: 2000)' + ) + parser.add_argument( + '-lat_ctrl', '--lateral-controller', + choices=['BangBang', 'PID', 'PurePursuit', 'Stanley', 'POP'], + default='PID', + help='Lateral controller type' + ) + parser.add_argument( + '-lon_ctrl', '--longitudinal-controller', + choices=['PID', 'ALC'], + default='ALC', + help='Longitudinal controller type' + ) + parser.add_argument( + '--vehicle-file', + default=WAYPOINTS_FILENAME, + help='Vehicle waypoints file' + ) + parser.add_argument( + '--pedestrian-file', + default=PEDESTRIAN_WAYPOINTS_FILENAME, + help='Pedestrian trajectories file' + ) + parser.add_argument( + '--map', + help='CARLA map name (e.g., Town01, Town02)' + ) + parser.add_argument( + '--weather', + choices=list(WEATHERID.keys()), + default='CLEARNOON', + help='Weather condition' + ) + parser.add_argument( + '-v', '--verbose', + action='store_true', + help='Enable verbose logging' + ) + + args = parser.parse_args() + + # 设置日志级别 + log_level = logging.DEBUG if args.verbose else logging.INFO + logging.basicConfig( + format='%(asctime)s - %(levelname)s - %(message)s', + level=log_level + ) + + # 设置全局参数 + + WAYPOINTS_FILENAME = args.vehicle_file + PEDESTRIAN_WAYPOINTS_FILENAME = args.pedestrian_file + + if args.weather in WEATHERID: + SIMWEATHER = WEATHERID[args.weather] + + print("=" * 60) + print("CARLA Vehicle and Pedestrian Control Simulation") + print("=" * 60) + print(f"Host: {args.host}:{args.port}") + print(f"Lateral Controller: {args.lateral_controller}") + print(f"Longitudinal Controller: {args.longitudinal_controller}") + print(f"Vehicle File: {WAYPOINTS_FILENAME}") + print(f"Pedestrian File: {PEDESTRIAN_WAYPOINTS_FILENAME}") + print(f"Weather: {args.weather}") + print("=" * 60) + + try: + # 创建仿真管理器 + sim_manager = SimulationManager(args) + + # 1. 连接到CARLA + if not sim_manager.connect_to_carla(): + print("Failed to connect to CARLA. Exiting.") + return + + # 2. 加载指定地图 + if args.map: + print(f"Loading map: {args.map}") + sim_manager.world = sim_manager.client.load_world(args.map) + + # 3. 设置仿真环境 + if not sim_manager.setup_simulation(): + print("Failed to setup simulation. Exiting.") + return + + # 4. 加载轨迹数据 + if not sim_manager.load_vehicle_waypoints(): + print("Failed to load vehicle waypoints. Exiting.") + return + + if not sim_manager.load_pedestrian_trajectories(): + print("Failed to load pedestrian trajectories. Exiting.") + return + + # 5. 运行仿真 + sim_manager.run_simulation() + + print("\nSimulation finished successfully!") + + except KeyboardInterrupt: + print("\n\nSimulation interrupted by user.") + except Exception as e: + print(f"\n\nUnexpected error: {e}") + import traceback + traceback.print_exc() + finally: + print("\nProgram terminated.") + + +if __name__ == '__main__': + main() \ No newline at end of file From 3ad00b505cd1bab872755ed6a2866b212092b419 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Thu, 29 Jan 2026 19:11:34 +0800 Subject: [PATCH 22/31] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=A4=9A=E8=B7=AF?= =?UTF-8?q?=E5=8F=A3=E8=BD=A8=E8=BF=B9=E5=8C=B9=E9=85=8D=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reID/Utils/linkIdentities.m | 272 +++++++++++++++--- 1 file changed, 240 insertions(+), 32 deletions(-) diff --git a/waypoint_control/multi_obj_track/reID/Utils/linkIdentities.m b/waypoint_control/multi_obj_track/reID/Utils/linkIdentities.m index 884f900..f1bc576 100644 --- a/waypoint_control/multi_obj_track/reID/Utils/linkIdentities.m +++ b/waypoint_control/multi_obj_track/reID/Utils/linkIdentities.m @@ -3,6 +3,11 @@ % 现需将5个路口的轨迹根据时间串联起来,形成完整的车辆轨迹 threshold = matchThreshold; num_roads = length(juncTrajCell); + % 创建中间容器 + for road_idx = 1:num_roads + road_trajectories{road_idx} = containers.Map('KeyType', 'char', 'ValueType', 'any'); + end + % 用于存储匹配结果的容器 matched_trajectories = containers.Map('KeyType', 'char', 'ValueType', 'any'); @@ -10,61 +15,264 @@ if isempty(idCounter) idCounter = 0; % 首次使用时,将计数器初始化为0 end + + % 将路口轨迹保存至中间容器中 % 遍历每个路口的数据 for road_idx = 1:num_roads road_data = juncTrajCell{road_idx}; traj_list = road_data.traj; - - % 遍历当前路口的每个车辆轨迹 + % 遍历当前路口的每个轨迹 for traj_idx = 1:length(traj_list) current_traj = traj_list{traj_idx}; - current_features = current_traj.mean_hsv; % 提取外观特征 - - % 尝试在当前结果集中找到匹配项 - is_matched = false; - if road_idx > 1 - for key = keys(matched_trajectories) - matched_traj = matched_trajectories(key{1}); + idCounter = idCounter + 1; + currentTimeStamp = matlab_posixtime; + unique_id = sprintf('ID_%s_%06d', currentTimeStamp, idCounter); + track = struct( ... + 'roadID', road_idx, ... % 道路ID + 'trackID', current_traj.trackID, ... % 轨迹 ID + 'wrl_pos', current_traj.wrl_pos, ... % 位置数据 + 'mean_hsv', current_traj.mean_hsv, ... % 特征数据 + 'timestamp', current_traj.timestamp, ... % 轨迹时间 + 'category', current_traj.category ... % 轨迹类型 + ); + road_trajectories{road_idx}(unique_id) = {track}; + end + + end + + % 遍历每个路口的数据 + for road_idx = 1:num_roads + if road_idx == 1 + for key = keys(road_trajectories{road_idx}) + road_data = road_trajectories{road_idx}(key{1}); + data_struct = road_data{1}; + data_features = data_struct.mean_hsv; % 提取外观特征 + + % 尝试在相邻路口中找到匹配项 + is_matched = false; + for key2 = keys(road_trajectories{2}) + matched_traj = road_trajectories{2}(key2{1}); + traj_struct = matched_traj{1}; + % 这里需要一个函数来计算两个轨迹之间的相似度 + % 基于外观特征的余弦相似度 + similarity_score = 1 - pdist2(data_features, traj_struct.mean_hsv, 'cosine'); + % 设定一个阈值来决定是否匹配 + if similarity_score > threshold + % 更新匹配轨迹 + track = struct( ... + 'roadID', road_idx, ... % 道路ID + 'trackID', data_struct.trackID, ... % 轨迹 ID + 'wrl_pos', data_struct.wrl_pos, ... % 位置数据 + 'mean_hsv', data_struct.mean_hsv, ... % 特征数据 + 'timestamp', data_struct.timestamp, ... % 轨迹时间 + 'category', data_struct.category ... % 轨迹类型 + ); + matched_traj{end+1} = track; + road_trajectories{2}(key2{1}) = matched_traj; + is_matched = true; + break; + end + end + for key3 = keys(road_trajectories{3}) + matched_traj = road_trajectories{3}(key3{1}); + traj_struct = matched_traj{1}; + % 这里需要一个函数来计算两个轨迹之间的相似度 + % 基于外观特征的余弦相似度 + similarity_score = 1 - pdist2(data_features, traj_struct.mean_hsv, 'cosine'); + % 设定一个阈值来决定是否匹配 + if similarity_score > threshold + % 更新匹配轨迹 + track = struct( ... + 'roadID', road_idx, ... % 道路ID + 'trackID', data_struct.trackID, ... % 轨迹 ID + 'wrl_pos', data_struct.wrl_pos, ... % 位置数据 + 'mean_hsv', data_struct.mean_hsv, ... % 特征数据 + 'timestamp', data_struct.timestamp, ... % 轨迹时间 + 'category', data_struct.category ... % 轨迹类型 + ); + matched_traj{end+1} = track; + road_trajectories{3}(key3{1}) = matched_traj; + is_matched = true; + break; + end + end + for key4 = keys(road_trajectories{4}) + matched_traj = road_trajectories{4}(key4{1}); traj_struct = matched_traj{1}; % 这里需要一个函数来计算两个轨迹之间的相似度 % 基于外观特征的余弦相似度 - similarity_score = 1 - pdist2(current_features, traj_struct.mean_hsv, 'cosine'); - - % 设定一个阈值来决定是否匹配 + similarity_score = 1 - pdist2(data_features, traj_struct.mean_hsv, 'cosine'); + % 设定一个阈值来决定是否匹配 if similarity_score > threshold % 更新匹配轨迹 track = struct( ... 'roadID', road_idx, ... % 道路ID - 'trackID', current_traj.trackID, ... % 轨迹 ID - 'wrl_pos', current_traj.wrl_pos, ... % 位置数据 - 'mean_hsv', current_traj.mean_hsv, ... % 特征数据 - 'timestamp', current_traj.timestamp, ... % 轨迹时间 - 'category', current_traj.category ... % 轨迹类型 + 'trackID', data_struct.trackID, ... % 轨迹 ID + 'wrl_pos', data_struct.wrl_pos, ... % 位置数据 + 'mean_hsv', data_struct.mean_hsv, ... % 特征数据 + 'timestamp', data_struct.timestamp, ... % 轨迹时间 + 'category', data_struct.category ... % 轨迹类型 ); matched_traj{end+1} = track; - matched_trajectories(key{1}) = matched_traj; + road_trajectories{4}(key4{1}) = matched_traj; is_matched = true; break; end end + for key5 = keys(road_trajectories{5}) + matched_traj = road_trajectories{5}(key5{1}); + traj_struct = matched_traj{1}; + % 这里需要一个函数来计算两个轨迹之间的相似度 + % 基于外观特征的余弦相似度 + similarity_score = 1 - pdist2(data_features, traj_struct.mean_hsv, 'cosine'); + % 设定一个阈值来决定是否匹配 + if similarity_score > threshold + % 更新匹配轨迹 + track = struct( ... + 'roadID', road_idx, ... % 道路ID + 'trackID', data_struct.trackID, ... % 轨迹 ID + 'wrl_pos', data_struct.wrl_pos, ... % 位置数据 + 'mean_hsv', data_struct.mean_hsv, ... % 特征数据 + 'timestamp', data_struct.timestamp, ... % 轨迹时间 + 'category', data_struct.category ... % 轨迹类型 + ); + matched_traj{end+1} = track; + road_trajectories{5}(key5{1}) = matched_traj; + is_matched = true; + break; + end + end + + if ~is_matched + remove(road_trajectories{road_idx}, key{1}); + end end - % 如果没有找到匹配项,则作为新轨迹加入结果集 - if ~is_matched - idCounter = idCounter + 1; - currentTimeStamp = matlab_posixtime; - unique_id = sprintf('ID_%s_%06d', currentTimeStamp, idCounter); - track = struct( ... - 'roadID', road_idx, ... % 道路ID - 'trackID', current_traj.trackID, ... % 轨迹 ID - 'wrl_pos', current_traj.wrl_pos, ... % 位置数据 - 'mean_hsv', current_traj.mean_hsv, ... % 特征数据 - 'timestamp', current_traj.timestamp, ... % 轨迹时间 - 'category', current_traj.category ... % 轨迹类型 - ); - matched_trajectories(unique_id) = {track}; + end + + if road_idx == 2 || 3 + for key = keys(road_trajectories{road_idx}) + road_data = road_trajectories{road_idx}(key{1}); + data_struct = road_data{1}; + data_features = data_struct.mean_hsv; % 提取外观特征 + + % 尝试在相邻路口中找到匹配项 + is_matched = false; + for key4 = keys(road_trajectories{4}) + matched_traj = road_trajectories{4}(key4{1}); + traj_struct = matched_traj{1}; + % 这里需要一个函数来计算两个轨迹之间的相似度 + % 基于外观特征的余弦相似度 + similarity_score = 1 - pdist2(data_features, traj_struct.mean_hsv, 'cosine'); + % 设定一个阈值来决定是否匹配 + if similarity_score > threshold + % 更新匹配轨迹 + track = struct( ... + 'roadID', road_idx, ... % 道路ID + 'trackID', data_struct.trackID, ... % 轨迹 ID + 'wrl_pos', data_struct.wrl_pos, ... % 位置数据 + 'mean_hsv', data_struct.mean_hsv, ... % 特征数据 + 'timestamp', data_struct.timestamp, ... % 轨迹时间 + 'category', data_struct.category ... % 轨迹类型 + ); + matched_traj{end+1} = track; + road_trajectories{4}(key4{1}) = matched_traj; + is_matched = true; + break; + end + end + for key5 = keys(road_trajectories{5}) + matched_traj = road_trajectories{5}(key5{1}); + traj_struct = matched_traj{1}; + % 这里需要一个函数来计算两个轨迹之间的相似度 + % 基于外观特征的余弦相似度 + similarity_score = 1 - pdist2(data_features, traj_struct.mean_hsv, 'cosine'); + % 设定一个阈值来决定是否匹配 + if similarity_score > threshold + % 更新匹配轨迹 + track = struct( ... + 'roadID', road_idx, ... % 道路ID + 'trackID', data_struct.trackID, ... % 轨迹 ID + 'wrl_pos', data_struct.wrl_pos, ... % 位置数据 + 'mean_hsv', data_struct.mean_hsv, ... % 特征数据 + 'timestamp', data_struct.timestamp, ... % 轨迹时间 + 'category', data_struct.category ... % 轨迹类型 + ); + matched_traj{end+1} = track; + road_trajectories{5}(key5{1}) = matched_traj; + is_matched = true; + break; + end + end + + if ~is_matched + remove(road_trajectories{road_idx}, key{1}); + end end end end + + % % 遍历每个路口的数据 + % for road_idx = 1:num_roads + % road_data = juncTrajCell{road_idx}; + % traj_list = road_data.traj; + % + % % 遍历当前路口的每个轨迹 + % for traj_idx = 1:length(traj_list) + % current_traj = traj_list{traj_idx}; + % current_features = current_traj.mean_hsv; % 提取外观特征 + % + % % 尝试在当前结果集中找到匹配项 + % is_matched = false; + % if road_idx > 1 + % for key = keys(matched_trajectories) + % matched_traj = matched_trajectories(key{1}); + % traj_struct = matched_traj{1}; + % % 这里需要一个函数来计算两个轨迹之间的相似度 + % % 基于外观特征的余弦相似度 + % similarity_score = 1 - pdist2(current_features, traj_struct.mean_hsv, 'cosine'); + % + % % 设定一个阈值来决定是否匹配 + % if similarity_score > threshold + % % 更新匹配轨迹 + % track = struct( ... + % 'roadID', road_idx, ... % 道路ID + % 'trackID', current_traj.trackID, ... % 轨迹 ID + % 'wrl_pos', current_traj.wrl_pos, ... % 位置数据 + % 'mean_hsv', current_traj.mean_hsv, ... % 特征数据 + % 'timestamp', current_traj.timestamp, ... % 轨迹时间 + % 'category', current_traj.category ... % 轨迹类型 + % ); + % matched_traj{end+1} = track; + % matched_trajectories(key{1}) = matched_traj; + % is_matched = true; + % break; + % end + % end + % end + % + % % 如果没有找到匹配项,则作为新轨迹加入结果集 + % if ~is_matched + % idCounter = idCounter + 1; + % currentTimeStamp = matlab_posixtime; + % unique_id = sprintf('ID_%s_%06d', currentTimeStamp, idCounter); + % track = struct( ... + % 'roadID', road_idx, ... % 道路ID + % 'trackID', current_traj.trackID, ... % 轨迹 ID + % 'wrl_pos', current_traj.wrl_pos, ... % 位置数据 + % 'mean_hsv', current_traj.mean_hsv, ... % 特征数据 + % 'timestamp', current_traj.timestamp, ... % 轨迹时间 + % 'category', current_traj.category ... % 轨迹类型 + % ); + % matched_trajectories(unique_id) = {track}; + % end + % end + % end + for road_idx = 1:num_roads + for key1 = keys(road_trajectories{road_idx}) + final_traj = road_trajectories{road_idx}(key1{1}); + matched_trajectories(key1{1}) = final_traj; + end + end % 遍历集合 keysList = keys(matched_trajectories); From f615c43eb44f8b0d5441ddcb13b20cbc2a6d664d Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Wed, 4 Feb 2026 19:43:09 +0800 Subject: [PATCH 23/31] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AE=BA=E6=96=87?= =?UTF-8?q?=E6=8F=90=E7=BA=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../twin_paper/Human-Vehicle Twin.tex | 197 + waypoint_control/twin_paper/empty.eps | 80 + waypoint_control/twin_paper/fig.eps | 1456 ++++++++ .../twin_paper/sn-bibliography.bib | 164 + waypoint_control/twin_paper/sn-jnl.cls | 1 + .../twin_paper/sn-mathphys-num.bst | 3211 +++++++++++++++++ 6 files changed, 5109 insertions(+) create mode 100644 waypoint_control/twin_paper/Human-Vehicle Twin.tex create mode 100644 waypoint_control/twin_paper/empty.eps create mode 100644 waypoint_control/twin_paper/fig.eps create mode 100644 waypoint_control/twin_paper/sn-bibliography.bib create mode 100644 waypoint_control/twin_paper/sn-jnl.cls create mode 100644 waypoint_control/twin_paper/sn-mathphys-num.bst diff --git a/waypoint_control/twin_paper/Human-Vehicle Twin.tex b/waypoint_control/twin_paper/Human-Vehicle Twin.tex new file mode 100644 index 0000000..041e102 --- /dev/null +++ b/waypoint_control/twin_paper/Human-Vehicle Twin.tex @@ -0,0 +1,197 @@ +%Version 3.1 December 2024 +% See section 11 of the User Manual for version history +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% %% +%% Please do not use \input{...} to include other tex files. %% +%% Submit your LaTeX manuscript as one .tex document. %% +%% %% +%% All additional figures and files should be attached %% +%% separately and not embedded in the \TeX\ document itself. %% +%% %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%\documentclass[referee,sn-basic]{sn-jnl}% referee option is meant for double line spacing + +%%=======================================================%% +%% to print line numbers in the margin use lineno option %% +%%=======================================================%% + +%%\documentclass[lineno,pdflatex,sn-basic]{sn-jnl}% Basic Springer Nature Reference Style/Chemistry Reference Style + +%%=========================================================================================%% +%% the documentclass is set to pdflatex as default. You can delete it if not appropriate. %% +%%=========================================================================================%% + +%%\documentclass[sn-basic]{sn-jnl}% Basic Springer Nature Reference Style/Chemistry Reference Style + +%%Note: the following reference styles support Namedate and Numbered referencing. By default the style follows the most common style. To switch between the options you can add or remove Numbered in the optional parenthesis. +%%The option is available for: sn-basic.bst, sn-chicago.bst% + +%%\documentclass[pdflatex,sn-nature]{sn-jnl}% Style for submissions to Nature Portfolio journals +%%\documentclass[pdflatex,sn-basic]{sn-jnl}% Basic Springer Nature Reference Style/Chemistry Reference Style +\documentclass[pdflatex,sn-mathphys-num]{sn-jnl}% Math and Physical Sciences Numbered Reference Style +%%\documentclass[pdflatex,sn-mathphys-ay]{sn-jnl}% Math and Physical Sciences Author Year Reference Style +%%\documentclass[pdflatex,sn-aps]{sn-jnl}% American Physical Society (APS) Reference Style +%%\documentclass[pdflatex,sn-vancouver-num]{sn-jnl}% Vancouver Numbered Reference Style +%%\documentclass[pdflatex,sn-vancouver-ay]{sn-jnl}% Vancouver Author Year Reference Style +%%\documentclass[pdflatex,sn-apa]{sn-jnl}% APA Reference Style +%%\documentclass[pdflatex,sn-chicago]{sn-jnl}% Chicago-based Humanities Reference Style + +%%%% Standard Packages +%% + +\usepackage{graphicx}% +\usepackage{multirow}% +\usepackage{amsmath,amssymb,amsfonts}% +\usepackage{amsthm}% +\usepackage{mathrsfs}% +\usepackage[title]{appendix}% +\usepackage{xcolor}% +\usepackage{textcomp}% +\usepackage{manyfoot}% +\usepackage{booktabs}% +\usepackage{algorithm}% +\usepackage{algorithmicx}% +\usepackage{algpseudocode}% +\usepackage{listings}% +%%%% + +%%%%%=============================================================================%%%% +%%%% Remarks: This template is provided to aid authors with the preparation +%%%% of original research articles intended for submission to journals published +%%%% by Springer Nature. The guidance has been prepared in partnership with +%%%% production teams to conform to Springer Nature technical requirements. +%%%% Editorial and presentation requirements differ among journal portfolios and +%%%% research disciplines. You may find sections in this template are irrelevant +%%%% to your work and are empowered to omit any such section if allowed by the +%%%% journal you intend to submit to. The submission guidelines and policies +%%%% of the journal take precedence. A detailed User Manual is available in the +%%%% template package for technical guidance. +%%%%%=============================================================================%%%% + +%% as per the requirement new theorem styles can be included as shown below +\theoremstyle{thmstyleone}% +\newtheorem{theorem}{Theorem}% meant for continuous numbers +%%\newtheorem{theorem}{Theorem}[section]% meant for sectionwise numbers +%% optional argument [theorem] produces theorem numbering sequence instead of independent numbers for Proposition +\newtheorem{proposition}[theorem]{Proposition}% +%%\newtheorem{proposition}{Proposition}% to get separate numbers for theorem and proposition etc. + +\theoremstyle{thmstyletwo}% +\newtheorem{example}{Example}% +\newtheorem{remark}{Remark}% + +\theoremstyle{thmstylethree}% +\newtheorem{definition}{Definition}% + +\raggedbottom +%%\unnumbered% uncomment this for unnumbered level heads + +\begin{document} + +\title[Article Title]{Article Title} + +%%=============================================================%% +%% GivenName -> \fnm{Joergen W.} +%% Particle -> \spfx{van der} -> surname prefix +%% FamilyName -> \sur{Ploeg} +%% Suffix -> \sfx{IV} +%% \author*[1,2]{\fnm{Joergen W.} \spfx{van der} \sur{Ploeg} +%% \sfx{IV}}\email{iauthor@gmail.com} +%%=============================================================%% + +\author*[1,2]{\fnm{First} \sur{Author}}\email{iauthor@gmail.com} + +\author[2,3]{\fnm{Second} \sur{Author}}\email{iiauthor@gmail.com} +\equalcont{These authors contributed equally to this work.} + +\author[1,2]{\fnm{Third} \sur{Author}}\email{iiiauthor@gmail.com} +\equalcont{These authors contributed equally to this work.} + +\affil*[1]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{100190}, \state{State}, \country{Country}}} + +\affil[2]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{10587}, \state{State}, \country{Country}}} + +\affil[3]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{610101}, \state{State}, \country{Country}}} + +%%==================================%% +%% Sample for unstructured abstract %% +%%==================================%% + +\abstract{The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. Authors are advised to check the author instructions for the journal they are submitting to for word limits and if structural elements like subheadings, citations, or equations are permitted.} + +%%================================%% +%% Sample for structured abstract %% +%%================================%% + +% \abstract{\textbf{Purpose:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. +% +% \textbf{Methods:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. +% +% \textbf{Results:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. +% +% \textbf{Conclusion:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to.} + +\keywords{keyword1, Keyword2, Keyword3, Keyword4} + +%%\pacs[JEL Classification]{D8, H51} + +%%\pacs[MSC Classification]{35A01, 65L10, 65L12, 65L20, 65L70} + +\maketitle + +\section{Introduction}\label{sec1} + +The Introduction section, of referenced text \cite{bib1} expands on the background of the work (some overlap with the Abstract is acceptable). The introduction should not include subheadings. + +Springer Nature does not impose a strict layout as standard however authors are advised to check the individual requirements for the journal they are planning to submit to as there may be journal-level preferences. When preparing your text please also be aware that some stylistic choices are not supported in full text XML (publication version), including coloured font. These will not be replicated in the typeset article if it is accepted. + +\section{Results}\label{sec2} + +\subsection{Twin system architecture} +% ?????????????????????? + +\subsection{End-to-end data transmission} +% ??????????????????????????????????????? + +\subsection{Face different targets} + +\subsubsection{Pedestrian twin} +% ???????? + +\subsubsection{Vehicle twin} +% ???????? + +\subsubsection{Pedestrian-Vehicle twin} +% ????????? + +\subsection{Twins in different scenarios} + +\subsubsection{Town01 scene twinning effect} +% ???town01?????????? + +\subsubsection{Town10 scene twinning effect} +% ???town10?????????? + +\subsection{Critical-State Twin} +% ????????(???????)????????????????????(??????????????????)?????? + +\section{Discussion}\label{sec12} + +Discussions should be brief and focused. In some disciplines use of Discussion or `Conclusion' is interchangeable. It is not mandatory to use both. Some journals prefer a section `Results and Discussion' followed by a section `Conclusion'. Please refer to Journal-level guidance for any specific requirements. + + + +%%===========================================================================================%% +%% If you are submitting to one of the Nature Portfolio journals, using the eJP submission %% +%% system, please include the references within the manuscript file itself. You may do this %% +%% by copying the reference list from your .bbl file, paste it into the main manuscript .tex %% +%% file, and delete the associated \verb+\bibliography+ commands. %% +%%===========================================================================================%% + +\bibliography{sn-bibliography}% common bib file +%% if required, the content of .bbl file can be included here once bbl is generated +%%\input sn-article.bbl + +\end{document} diff --git a/waypoint_control/twin_paper/empty.eps b/waypoint_control/twin_paper/empty.eps new file mode 100644 index 0000000..d216d5b --- /dev/null +++ b/waypoint_control/twin_paper/empty.eps @@ -0,0 +1,80 @@ +%!PS-Adobe-3.0 +%%Pages: (atend) +%%BoundingBox: 0 0 115 87 +%%HiResBoundingBox: 0.563794 0.527295 114.418213 86.036206 +%........................................... +%%Creator: GNU Ghostscript 653 (pswrite) +%%CreationDate: 2002/07/10 13:09:14 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%EndComments +%%BeginProlog +% This copyright applies to everything between here and the %%EndProlog: +% Copyright (C) 2002 artofcode LLC, Benicia, CA. All rights reserved. +%%BeginResource: procset GS_pswrite_2_0_1001 +/GS_pswrite_2_0_1001 80 dict dup begin +/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch +4 index eq and{ pop pop pop}{ PageSize dup 1 +5 -1 roll put 0 4 -1 roll put dup where{ exch get exec} +{ pop/setpagedevice where +{ pop 1 dict dup /PageSize PageSize put setpagedevice} +{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat +setpage}if}ifelse}ifelse}ifelse} bind def +/!{bind def}bind def/#{load def}!/N/counttomark # +/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! +/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! +/w/setlinewidth #/J/setlinecap # +/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # +/m/moveto #/l/lineto #/c/rcurveto # +/p{N 2 idiv{N -2 roll rlineto}repeat}! +/P{N 0 gt{N -2 roll moveto p}if}! +/h{p closepath}!/H{P closepath}! +/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! +/re{4 -2 roll m exch dup lx exch ly neg lx h}! +/^{3 index neg 3 index neg}! +/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! +/q/gsave #/Q/grestore #/rf{re fill}! +/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! +/|={pop exch 4 1 roll 3 array astore cvx exch 1 index def exec}! +/|{exch string readstring |=}! +/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! +/@/currentfile #/${+ @ |}! +/B{{2 copy string{readstring pop}aload pop 4 array astore cvx +3 1 roll}repeat pop pop true}! +/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! +/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! +/Ic{exch Ix false 3 colorimage}! +/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> +/CCITTFaxDecode filter}!/FX{< Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesClass{sn-jnl} [2019/11/18 v0.1: An authoring template for Springer Journal articles] \newif\if@restonecol \newif\if@titlepage \@titlepagefalse \newif\if@cropmarkson \@cropmarksonfalse \newif\ifDoublecol \Doublecolfalse% \newif\ifpagebody\global\pagebodyfalse% \newif\if@iicol\global\@iicolfalse% \newif\if@bibcomment\global\@bibcommentfalse% \newif\if@referee\global\@refereefalse% \newif\if@vrulerlinenumberon\global\@vrulerlinenumberonfalse% \newif\if@pdflatex\global\@pdflatexfalse% \newif\if@remarkboxon\global\@remarkboxonfalse% \newif\if@Numbered@refstyle\global\@Numbered@refstylefalse% Namedate \newif\if@Spr@basic@refstyle\global\@Spr@basic@refstylefalse% 1.Basic Springer Nature Reference Style/Chemistry Reference Style -> sn-basic.bst \newif\if@Mathphys@numrefstyle\global\@Mathphys@numrefstylefalse% 2.Math and Physical Sciences Reference Style -> sn-mathphys.bst \newif\if@Mathphys@ayrefstyle\global\@Mathphys@ayrefstylefalse% 2.Math and Physical Sciences Reference Style -> sn-mathphys.bst \newif\if@APS@refstyle\global\@APS@refstylefalse% 3.American Physical Society (APS) Reference Style -> sn-APS.bst \newif\if@Vancouver@numrefstyle\global\@Vancouver@numrefstylefalse% 4.Vancouver Reference Style -> sn-vancouver.bst \newif\if@Vancouver@ayrefstyle\global\@Vancouver@ayrefstylefalse% 4.Vancouver Reference Style -> sn-vancouver.bst \newif\if@APA@refstyle\global\@APA@refstylefalse% 5.APA-based Social Sciences/Psychology Reference Style -> sn-apacite.bst \newif\if@Chicago@refstyle\global\@Chicago@refstylefalse% 6.Chicago-based Humanities Reference Style -> sn-chicago.bst \newif\if@Standard@Nature@refstyle\global\@Standard@Nature@refstylefalse% 7.Standard Nature Research Style -> sn-nature.bst %% Template Options \DeclareOption{a4paper}{\PassOptionsToPackage{a4}{crop}} \DeclareOption{a3paper}{\PassOptionsToClass{a3paper}{article}\PassOptionsToPackage{a3}{crop}} \DeclareOption{centre}{\PassOptionsToPackage{center}{crop}} \DeclareOption{crop}{\PassOptionsToPackage{frame}{crop}\global\@cropmarksontrue} \DeclareOption{nocrop}{\PassOptionsToPackage{off}{crop}\global\@cropmarksontrue} \DeclareOption{info}{\PassOptionsToPackage{info}{crop}} \DeclareOption{noinfo}{\PassOptionsToPackage{noinfo}{crop}} %% Classfile Options \DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse} \DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} \DeclareOption{draft}{\setlength\overfullrule{5pt}} \DeclareOption{titlepage}{\@titlepagetrue} \DeclareOption{notitlepage}{\@titlepagefalse} \DeclareOption{onecolumn}{\@twocolumnfalse} \DeclareOption{twocolumn}{\@twocolumntrue} \DeclareOption{openbib}{\let\if@openbib\iftrue} \DeclareOption{pagegrid}{\global\pagebodytrue}% \DeclareOption{iicol}{\global\@iicoltrue}% \DeclareOption{bibcomment}{\global\@bibcommenttrue}% \DeclareOption{referee}{\global\@refereetrue}% \DeclareOption{lineno}{\global\@vrulerlinenumberontrue}% \DeclareOption{pdflatex}{\global\@pdflatextrue}% \DeclareOption{remarkboxoff}{\global\@remarkboxonfalse}% \DeclareOption{sn-basic}{\global\@Spr@basic@refstyletrue}% \DeclareOption{sn-mathphys-num}{\global\@Mathphys@numrefstyletrue}% \DeclareOption{sn-mathphys-ay}{\global\@Mathphys@ayrefstyletrue}% \DeclareOption{sn-aps}{\global\@APS@refstyletrue}% \DeclareOption{sn-vancouver-num}{\global\@Vancouver@numrefstyletrue}% \DeclareOption{sn-vancouver-ay}{\global\@Vancouver@ayrefstyletrue}% \DeclareOption{sn-apa}{\global\@APA@refstyletrue}% \DeclareOption{sn-chicago}{\global\@Chicago@refstyletrue}% \DeclareOption{sn-nature}{\global\@Standard@Nature@refstyletrue}% \DeclareOption{Numbered}{\global\@Numbered@refstyletrue}% %\DeclareOption{NameDate}{\global\@Numbered@refstylefalse}% %%\ExecuteOptions{twosidecrop,crop,centre,info,croppage} \ProcessOptions \LoadClass[twoside,fleqn]{article} \gdef\refereedefns{% \if@referee% \usepackage{setspace}% \doublespacing% \fi}% \refereedefns% %% General Packages Used % %\AtBeginDocument{% %%\newcommand*\ExtraParaSkip{12pt}% %\SetFootnoteHook{\hspace*{-8pt}}% %\DeclareNewFootnote{A}[gobble]% %\setlength{\skip\footinsA}{0pt} %}% % %%%%%%%%%%%%%%%%%%%%%%%%%%%% Fonts & Sizes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %% Fonts Used %%\RequirePackage[T1]{fontenc}% % \DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}% \DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}% \DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}% \DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}% \DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}% \DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}% \DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}% \DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal}% \DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal}% % \renewcommand\normalsize{% \@setfontsize\normalsize{10bp}{12bp}% \abovedisplayskip 12\p@ \@plus2\p@ \@minus1\p@ \abovedisplayshortskip \z@ \@plus3\p@% \belowdisplayshortskip 3\p@ \@plus3\p@ \@minus3\p@% \belowdisplayskip \abovedisplayskip% \let\@listi\@listI}% \normalsize% % \newcommand\medsize{% \@setfontsize\small\@xipt{13}% \abovedisplayskip 5\p@ \@plus3\p@ \@minus4\p@ \abovedisplayshortskip \z@ \@plus2\p@ \belowdisplayshortskip 3\p@ \@plus2\p@ \@minus2\p@ \def\@listi{\leftmargin\leftmargini \topsep 4\p@ \@plus2\p@ \@minus2\p@ \parsep 2\p@ \@plus\p@ \@minus\p@ \itemsep \parsep}% \belowdisplayskip \abovedisplayskip}% % \renewcommand\small{% \@setfontsize\small\@ixpt{11}% \abovedisplayskip 5\p@ \@plus3\p@ \@minus4\p@ \abovedisplayshortskip \z@ \@plus2\p@ \belowdisplayshortskip 3\p@ \@plus2\p@ \@minus2\p@ \def\@listi{\leftmargin\leftmargini \topsep 4\p@ \@plus2\p@ \@minus2\p@ \parsep 2\p@ \@plus\p@ \@minus\p@ \itemsep \parsep}% \belowdisplayskip \abovedisplayskip}% % \renewcommand\footnotesize{% \@setfontsize\footnotesize{7}{8}% \abovedisplayskip 5\p@ \@plus2\p@ \@minus4\p@ \abovedisplayshortskip \z@ \@plus\p@ \belowdisplayshortskip 3\p@ \@plus\p@ \@minus2\p@ \def\@listi{\leftmargin\leftmargini \topsep 3\p@ \@plus\p@ \@minus\p@ \parsep 2\p@ \@plus\p@ \@minus\p@ \itemsep \parsep}% \belowdisplayskip \abovedisplayskip} % \renewcommand\scriptsize{\@setfontsize\scriptsize\@ixpt\@ixpt}% \newcommand\scrisize{\@setfontsize\scrisize{9.3}{9}}% \renewcommand\tiny{\@setfontsize\tiny\@vpt\@vipt}% \renewcommand\large{\@setfontsize\large{12}{14}}% \newcommand\larg{\@setfontsize\larg{11}{13}}% \renewcommand\Large{\@setfontsize\Large{16}{18}}% \renewcommand\LARGE{\@setfontsize\LARGE\@xviipt{22}}% \renewcommand\huge{\@setfontsize\huge\@xxpt{25}}% \renewcommand\Huge{\@setfontsize\Huge\@xxvpt{30}}% % \DeclareMathSizes{\@ixpt}{\@ixpt}{7}{5}% \DeclareMathSizes{\@xpt}{\@xpt}{7}{5}% \DeclareMathSizes{\@xipt}{\@xipt}{7}{5}% % \DeclareRobustCommand*\textsubscript[1]{% \@textsubscript{\selectfont#1}}% % \def\@textsubscript#1{% {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}}% % %%%%%%%%%%%%%%%%%%%%%%%%%%%% Layout Settings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%\RequirePackage{geometry}% % \newlength\columnhsize% % %% Regular Pages (for Opening page - redefined) % \if@iicol% % %% for double column used sn-medium design trim and page size %% % \setlength\headheight{12pt}% \setlength\headsep{5.15mm}% % \setlength\columnsep{8mm}% \setlength\columnhsize{76mm}% % \setlength\maxdepth{0pt}% \setlength\footnotesep{7\p@}% \setlength{\skip\footins}{18\p@ \@plus 6\p@ \@minus 3\p@}% % \RequirePackage[% reversemp, paperwidth=210mm, paperheight=297mm, top={26mm}, headheight={12pt}, headsep={5.15mm}, text={160mm,216mm}, marginparsep=5mm, marginparwidth=12mm, bindingoffset=6mm, footskip=10.13mm,twocolumn]{geometry}% % \renewcommand\footnoterule{% \kern3\p@% \hrule \@height.2mm \@width\columnwidth% \kern5.5\p@}% % \else% %% For single column used smallcond design trim and page size %% \RequirePackage[% reversemp, paperwidth=210mm, paperheight=297mm, top={26mm}, headheight={5.5pt}, headsep={5.6mm}, text={31pc,194.25mm}, marginparsep=5mm, marginparwidth=12mm, bindingoffset=6mm, footskip=10mm]{geometry} % \setlength\maxdepth{0pt}% \setlength\columnsep{5mm}% \setlength{\marginparsep}{5mm}% \setlength{\marginparwidth}{12mm}% \setlength\footnotesep{5.75\p@}% \setlength{\skip\footins}{8\p@ \@plus 4\p@ \@minus 0\p@}% % \renewcommand\footnoterule{% \kern3\p@% \ifodd\c@page% \hrule \@height.2mm \@width\textwidth% \else% \hrule \@height.2mm \@width37mm \fi% \kern5.5\p@}% % \fi% % % \setlength\parindent{1.5em}% % \def\StepUpCounter#1{\global\advance#1by 1\relax}% \def\StepDownCounter#1{\global\advance#1by -1\relax}% % %%%%%%%%%%%%%%%%%%%%%%%%%%%% Pagination Settings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Line spacing \setlength\lineskip{1\p@}% \setlength\normallineskip{1\p@}% %%\renewcommand\baselinestretch{1.5}% \parskip=0pt% % % Page break penalties % \@lowpenalty 51 \@medpenalty 151 \@highpenalty 301 % % Disallow widows and orphans % \clubpenalty 10000 \widowpenalty 10000 % % Disable page breaks before equations, allow pagebreaks after % equations and discourage widow lines before equations. % \displaywidowpenalty 100 \predisplaypenalty 10000 \postdisplaypenalty 0 % % Set these global demerits % \doublehyphendemerits 1000000 % corresponds to badness 800 \finalhyphendemerits 1000000 % corresponds to badness 1000 % % Allow loose lines rather than overfull lines % \vbadness=9999 \tolerance=9999 % % Allow breaking the page in the middle of a paragraph % \interlinepenalty 0 % % Disallow breaking the page after a hyphenated line \brokenpenalty 10000 % % Hyphenation; don't split words into less than three characters \lefthyphenmin=3 \righthyphenmin=3 % % Float placement parameters % % The total number of floats that can be allowed on a page. \setcounter{totalnumber}{3} % % The maximum number of floats at the top and bottom of a page. \setcounter{topnumber}{5} \setcounter{bottomnumber}{5} % % The maximum part of the top or bottom of a text page that can be % occupied by floats. This is set so that at least four lines of text % fit on the page. \renewcommand\topfraction{.921} \renewcommand\bottomfraction{.921} % The minimum amount of a text page that must be occupied by text. % This should accomodate four lines of text. \renewcommand\textfraction{.13} % The minimum amount of a float page that must be occupied by floats. \renewcommand\floatpagefraction{.887} % The same parameters repeated for double column output \renewcommand\dbltopfraction{.88} \renewcommand\dblfloatpagefraction{.88} % Space between floats \setlength\floatsep{18\p@ \@plus 4\p@ \@minus 2\p@} % Space between floats and text \setlength\textfloatsep{15\p@ \@plus 4\p@ \@minus 2\p@} % Space above and below an inline figure \setlength\intextsep {18\p@ \@plus 4\p@ \@minus 2\p@} % For double column floats \setlength\dblfloatsep {20\p@ \@plus 4\p@ \@minus 2\p@} \setlength\dbltextfloatsep{15\p@ \@plus 4\p@ \@minus 2\p@} \hyphenation{Figure Figures Table Tables Equation Equations Section Sections Appendix Theorem Lemma} % %%%%%%%%%%%%%%%%%%%%%%%%%%% Math Settings %%%%%%%%%%%%%%%%%%%%%%%%%%% % %%%%%%%%%%%%%%%%%%%%%%%%%%%% For above/below spacing \def\eqnarray{% \stepcounter{equation}% \def\@currentlabel{\p@equation\theequation}% \global\@eqnswtrue \m@th \global\@eqcnt\z@ \tabskip\@centering \let\\\@eqncr $$\everycr{}\halign to\displaywidth\bgroup \hskip\@centering$\displaystyle\tabskip\z@skip{##}$\@eqnsel &\global\@eqcnt\@ne\hskip \tw@\arraycolsep \hfil${##}$\hfil &\global\@eqcnt\tw@ \hskip \tw@\arraycolsep $\displaystyle{##}$\hfil\tabskip\@centering &\global\@eqcnt\thr@@ \hb@xt@\z@\bgroup\hss##\egroup \tabskip\z@skip \cr } \def\endeqnarray{% \@@eqncr \egroup \global\advance\c@equation\m@ne $$\@ignoretrue } % %%%%%%%%%%%%%%%%%%%%%%%%%%% Titles %%%%%%%%%%%%%%%%%%%%%%%%%%% % \renewcommand\refname{References}% \renewcommand\figurename{Fig.}% defined as per springer style \renewcommand\tablename{Table}% \renewcommand\appendixname{Appendix}% \renewcommand\abstractname{Abstract}% % %%%%%%%%%%%%%%%%%%%%%%%%%%% Article Front Matter %%%%%%%%%%%%%%%%%%%%%%%%%%% % \def\raggedleft{\leftskip0pt plus 1fil\parfillskip=0pt\relax}% \def\raggedright{\rightskip0pt plus 1fil\parfillskip=0pt\relax}% \def\raggedcenter{\leftskip=0pt plus 0.5fil\rightskip=0pt plus 0.5fil% \parfillskip=0pt\let\hb=\break}% \def\titraggedcenter{\leftskip=12pt plus 0.5fil\rightskip=12pt plus 0.5fil% \parfillskip=0pt\let\hb=\break}% \def\absraggedcenter{\leftskip=24pt plus 0.5fil\rightskip=24pt plus 0.5fil% \parfillskip=0pt\let\hb=\break}% % %%% Font Def \def\Artcatfont{\reset@font\fontsize{8bp}{10bp}\selectfont}% \def\Titlefont{\reset@font\fontsize{17bp}{22.5bp}\selectfont\titraggedcenter}% \def\SubTitlefont{\reset@font\fontsize{14bp}{16.5bp}\selectfont\titraggedcenter}% \def\Authorfont{\reset@font\fontsize{12bp}{14.5bp}\selectfont\boldmath\titraggedcenter}% \def\addressfont{\reset@font\fontsize{11bp}{13.5bp}\selectfont\titraggedcenter}% \def\abstractheadfont{\reset@font\fontsize{9bp}{11bp}\bfseries\selectfont\titraggedcenter}% \def\abstractsubheadfont{\reset@font\fontsize{9bp}{11bp}\bfseries\selectfont}% \def\abstractfont{\reset@font\fontsize{9bp}{11bp}\selectfont\leftskip=24pt\rightskip=24pt\parfillskip=0pt plus 1fil}% \def\keywordfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont\leftskip=24pt\rightskip=24pt plus0.5fill}% \def\historyfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont\leftskip=24pt\rightskip=24pt plus0.5fill}% %% Article Type \newbox\artcatbox% \def\articletype#1{\if!#1!\else\setbox\artcatbox\hbox{\Artcatfont\hskip1mm#1\hskip1mm}\fi% \gdef\ArtType{\fboxsep=0pt{\vbox to 4mm{\vfil% {\raggedright\box\artcatbox}\vfil}}}% \gdef\@ArtType{#1}}% %%\articletype{RESEARCH ARTICLE}% \articletype{}% %% Article Title \renewcommand{\title}[2][]{% \gdef\@checktitle{#1}\ifx\@checktitle\empty\gdef\@title{#2}% \gdef\s@title{#2}\else\gdef\@title{#2}\gdef\s@title{#1}\fi% \markboth{\textit{\s@title}}{\textit{\s@title}}}% \def\subtitle#1{\gdef\@subtitle{#1}}\subtitle{}% %% Cross Link for Author & Address \def\jmkLabel#1{\@bsphack\protected@write\@auxout{}{\string\Newlabel{#1}{\@currentlabel}}\@esphack}% \def\Newlabel#1#2{\expandafter\xdef\csname X@#1\endcsname{#2}}% \def\jmkRef#1{\@ifundefined{X@#1}{0}{\csname X@#1\endcsname}}% %% Article Author(s) \let\sep\@empty% \let\authorsep\@empty% \newcount\aucount% \newcount\corraucount% \newcount\punctcount% % \def\artauthors{}% \newif\if@auemail% \newif\if@corauemail% % \def\au@and{\ifnum\punctcount=2\ and\else\unskip, \advance\punctcount by -1 \fi}% % \def\author{\advance\aucount by 1\@ifstar\@@corrauthor\@@author}% % \newcommand{\@@author}[2][]{\def\@authfrstarg{#1}\@corauemailfalse% \g@addto@macro\artauthors{% \ifnum\aucount=1% \global\@auemailtrue% \else% \global\@auemailfalse% \fi% \Authorfont% \def\baselinestretch{1}% \authorsep{#2}\unskip\ifx\@authfrstarg\empty\else\textsuperscript{\smash{{% \@for\@@affmark:=#1\do{\edef\affnum{\@ifundefined{X@\@@affmark}{\@@affmark}{\jmkRef{\@@affmark}}}% \unskip\sep\affnum\let\sep=,}}}}\fi% \def\authorsep{{\au@and} }%%% \global\let\sep\@empty\global\let\@corref\@empty% }}% % \newcommand{\@@corrauthor}[2][]{\def\@authfrstarg{#1}\@corauemailtrue\advance\corraucount by 1% \g@addto@macro\artauthors{% \global\@auemailtrue% \Authorfont% \def\baselinestretch{1}% \authorsep{#2}\unskip\ifx\@authfrstarg\empty\else\textsuperscript{\smash{{% \@for\@@affmark:=#1\do{\edef\affnum{\@ifundefined{X@\@@affmark}{\@@affmark}{\jmkRef{\@@affmark}}}% \unskip\sep\affnum\let\sep=,}}}{*}\hskip-1pt}\fi\unskip% \def\authorsep{\au@and~}%%% \global\let\sep\@empty\global\let\@corref\@empty% }}% %% %% Miscellaneous macros %% %% \def\fnm#1{\leavevmode\hbox{#1}}% \def\sur#1{\unskip~\nobreak\leavevmode\hbox{#1}}% \def\spfx#1{#1}% \def\pfx#1{#1}% \def\sfx#1{#1}% \def\tanm#1{#1}% \def\dgr#1{#1}% % %% Author Email % \let\nomail\relax% \def\corrauthemail{}% \def\authemail{}% \newcount\emailcnt% \def\email#1{\global\advance\emailcnt by 1\relax% \if@corauemail% \g@addto@macro\corrauthemail{% \setcounter{footnote}{0}% \textcolor{blue}{#1};\ % }% \else% \g@addto@macro\authemail{% \setcounter{footnote}{0}% \textcolor{blue}{#1};\ % }% \fi} %% Corrseponding Address \def\@copycorthanks{}% \def\auaddress{}% \def\@auaddress{}% \newcounter{affn}% \newcount\addcount% To check the count of address \renewcommand\theaffn{\arabic{affn}}% \def\affil{\advance\addcount by 1\@ifstar\@@coraddress\@@address}% \newcommand{\@@coraddress}[2][]{%\advance\addcount by 1 \g@addto@macro\auaddress{% \stepcounter{affn}% \xdef\@currentlabel{\theaffn}% \jmkLabel{\theaffn}% {\textsuperscript{#1*}#2.\par} } } %% Macros for present address \newif\ifpresentaddress% \def\@presentaddresstxt{}% \def\presentaddresstxt#1{\gdef\@presentaddresstxt{#1:}}\presentaddresstxt{Present Address}% \newcommand{\presentaddress}[1]{\gdef\@presentaddresstext{\@presentaddresstxt\par#1}\global\presentaddresstrue}% %% Macros for equally contributed \newif\ifequalcont% %\def\@equalconttxt{}% %\def\equalcontxt#1{\gdef\@equalconttxt{#1}}\equalcontxt{These authors contributed equally to this work.}% %\newcommand{\equalcont}[1][\@equalconttxt]{\gdef\@equalconttext{#1}\g@addto@macro\artauthors{$^{\dagger}$}\global\equalconttrue}% \def\@equalconttxt{}% \def\equalcontxt#1{\gdef\@equalconttxt{#1}}\equalcontxt{}% \newcommand{\equalcont}[1]{\gdef\@equalconttext{#1}\g@addto@macro\artauthors{$^{\dagger}$}\global\equalconttrue}% %% Author Address \newcommand{\@@address}[2][]{%%\advance\addcount by 1 \g@addto@macro\auaddress{% \stepcounter{affn}% \xdef\@currentlabel{\theaffn}% \jmkLabel{\theaffn}% {\textsuperscript{#1}#2.\par} }%\theaffn } %% Address tagging \newcommand{\orgdiv}[1]{#1}% \newcommand{\orgname}[1]{#1}% \newcommand{\orgaddress}[1]{#1}% \newcommand{\street}[1]{#1}% \newcommand{\postcode}[1]{#1}% \newcommand{\city}[1]{#1}% \newcommand{\state}[1]{#1}% \newcommand{\country}[1]{#1}% %% Article notes \def\@artnote{}% \def\artnote#1{\gdef\@artnote{#1}}% %% Miscellaneous notes \def\@miscnote{}% \def\miscnote#1{\gdef\@miscnote{\par\addvspace{3pt}#1}}% %% Motto \def\mottofont{\reset@font\fontfamily{\rmdefault}\fontsize{8.5bp}{10bp}\fontshape{it}\selectfont\raggedright} % \let\@motto\@empty \def\mottoraggedright{\rightskip0mm\leftskip=42mm plus 1fil\parfillskip=0pt\relax}% \newcommand{\motto}[2][]{\gdef\@headcheck{#1}\gdef\@motto{\@headcheck\ifx\@headcheck\@empty\vskip12pt\else\fi{\mottofont\mottoraggedright#2\par}}} %% Article Abstract \newcommand\abstracthead{\@startsection {section}{1}{\z@}{-22pt \@plus0ex \@minus0ex}{3pt}{\abstractheadfont}} \newcommand\subabstracthead{\@startsection{subsection}{2}{\z@}{3pt \@plus0ex \@minus0ex}{-.5em}{\abstractsubheadfont}} \def\@abstract{}% \long\def\abstract#1{\def\@abstract{% \let\paragraph\subabstracthead% \abstractfont% \abstracthead*{\abstractname}% #1\par}}% \def\printabstract{\ifx\@abstract\empty\else\@abstract\fi\par}% \def\printkeywords{\ifx\@keywords\empty\else\@keywords\fi\par}% % %% Keywords \def\keywordname{Keywords}% \def\keywords#1{\ifx#1\empty\else\def\@keywords{\par\addvspace{10pt}{\keywordfont{\bfseries\keywordname:} #1\par}}\fi}% \def\@keywords{}% %% PACs \def\pacsbullet{\hbox{\hskip2.5pt,\hskip2.5pt}}% \def\change@commas#1,#2{% \ifx#2\@empty% #1% \else% #1\nobreak\hbox{\pacsbullet}\allowbreak\expandafter\change@commas% \fi% #2}% \newcommand\keywordhead[1]{\par\addvspace{10pt}% {{\keywordfont\bfseries#1:\ }}}% \newcommand{\pacs}[1]{\keywordhead{\pacsname}#1}% % \newcount\PacsCount% \PacsCount=0% % \newcount\PacsTmpCnt% \PacsTmpCnt=1% % \gdef\StorePacsText#1#2{% \edef\GetRoman{\romannumeral#1}% \expandafter\gdef\csname\GetRoman StorePacsTxt\endcsname{#2}% }% % \let\oldpacs\pacs% \renewcommand\pacs[2][PAC Codes]{\gdef\pacsname{{\bfseries#1}}\gdef\@pacs{\keywordfont\raggedright\oldpacs\change@commas#2,\@empty\par} \StepUpCounter{\PacsCount}% \StorePacsText{\the\PacsCount}{\gdef\pacsname{{\bfseries#1}}\keywordfont\raggedright\oldpacs\change@commas#2,\@empty}% }% \def\@pacs{}% %% Glossary \def\gloshead{Glossary}% \newenvironment{glos}[1][\gloshead]{\begingroup\parindent=0pt% \section*{#1} \def\item[##1]{##1,\ }}{% \endgroup}% % %% Article History \def\received#1{\g@addto@macro\@history{{Received #1}}}% \def\revised#1{\g@addto@macro\@history{{; revised #1}}}% \def\accepted#1{\g@addto@macro\@history{{; accepted #1}}}% %% Remark on Front page %% \newdimen\FMremarkdim% \newcommand{\FMremark}{\begingroup\parindent=0pt\parskip=0pt% \if@referee\singlespacing\fi% \fboxsep=6pt\fboxrule=0.5pt% \FMremarkdim=\textwidth%%\paperwidth% \advance\FMremarkdim-\fboxsep% \advance\FMremarkdim-2\fboxrule% \if@referee\vskip-21pt\fi% %%\fbox{\vbox{\hsize=\FMremarkdim\small% \unvbox\fmremarkbox %%}}% \endgroup} \newbox\fmremarkbox% \newenvironment{fmremark}{\begingroup\parindent=0pt% \fboxsep=6pt\fboxrule=0.5pt% \FMremarkdim=\textwidth%%\paperwidth% \advance\FMremarkdim-\fboxsep% \advance\FMremarkdim-2\fboxrule% \global\setbox\fmremarkbox\vbox\bgroup\small% }{\egroup\endgroup} %% Article Header Definition \renewcommand{\@maketitle}{\newpage\null% \if@remarkboxon\vbox to 0pt{\vspace*{-78pt}\hspace*{-18pt}\FMremark}\else\vskip21pt\fi%%\par% \hsize\textwidth\parindent0pt%%%\vskip7pt% %% Aritle Type {\hbox to \textwidth{{\Artcatfont\ArtType\hfill}\par}} %% Aritle Title \ifx\@title\empty\else% \removelastskip\vskip20pt\nointerlineskip% {\Titlefont\@title\par} %\addcontentsline{toc}{chapter}{\@title}% for bookmarks \fi% %% Aritle SubTitle \ifx\@subtitle\empty\else% \vskip9pt% {{\SubTitlefont\@subtitle\par}} \fi% %% Aritle Authors, Address and Correspondings \ifnum\aucount>0 \global\punctcount\aucount% \vskip20pt% \artauthors\par%% authors and emails {\vskip7pt\addressfont\auaddress\par%% corresponding adress \removelastskip\vskip24pt% \ifnum\emailcnt>0\relax% \ifx\corrauthemail\@empty\else{\ifnum\aucount>1*\fi}% Corresponding author(s). E-mail(s): \corrauthemail\par\fi% \ifx\authemail\@empty\else Contributing authors:\ \authemail\fi% \fi% \ifequalcont{\par$^{\dagger}$\@equalconttext\par}\fi% \removelastskip\vskip24pt% \ifpresentaddress{\par\@presentaddresstext\par}\fi% } \fi% {\printabstract\par}% {\printkeywords\par}% \ifx\@pacs\empty\else% \loop\ifnum\PacsCount>0% \csname\romannumeral\PacsTmpCnt StorePacsTxt\endcsname\par% \StepDownCounter{\PacsCount}% \StepUpCounter{\PacsTmpCnt}% \repeat% \fi% %%{\printhistory\par}% %%{\ifx\@motto\empty\else\@motto\fi}% \removelastskip\vskip36pt\vskip0pt}% \usepackage{cuted}% \@ifpackageloaded{cuted}{\gdef\@setmarks{}}{}% %% Printing Article Header \newdimen\firstpagehtcheck \renewcommand\maketitle{\par \@afterindentfalse% \begingroup \gdef\UrlFont{\rmfamily}% \renewcommand\thefootnote{\@fnsymbol\c@footnote}% \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\smash{\@thefnmark}}}}% \long\def\@makefntext##1{\parindent 1em\noindent\small\selectfont \hbox{\@textsuperscript{\normalfont\@thefnmark}}##1}% \if@twocolumn \ifnum \col@number=\@ne% \setbox0=\vbox{\@maketitle} \firstpagehtcheck=\ht0% \advance\firstpagehtcheck by \dp0% \ifdim\firstpagehtcheck>\textheight% \setbox1=\vsplit0to2\textheight% \setbox1=\vbox{\unvbox1}% \setbox2=\vbox{\unvbox0}% \unvbox1% \stripsep=0pt% \begin{strip} \unvbox2% \end{strip} \else \twocolumn[\@maketitle]% \fi \else \@maketitle \fi% \else% \newpage% \global\@topnum\z@% Prevents figures from going at top of page. \@maketitle% \fi% \endgroup% \ifx\@artnote\@empty\else\footnoteA{\@artnote}\fi% \ifx\@miscnote\@empty\else\footnoteA{\@miscnote\par}\fi% \setcounter{footnote}{0}% \global\let\thanks\relax% \global\let\artnote\relax% \global\let\maketitle\relax% \global\let\@maketitle\relax% \global\let\@thanks\@empty% \global\let\@author\@empty% \global\let\@date\@empty% \global\let\title\relax% \global\let\author\relax% \global\let\date\relax% \global\let\and\relax% \pagestyle{headings}% %%%print continuous abstract on next page \@afterheading% %%\vskip-18pt% this is included to avoid vertical space at the beginning of left column on article opening pages }% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Page Styles %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \def\opheaderfont{\reset@font\fontsize{10bp}{0bp}\selectfont}% \def\headerfont{\reset@font\fontsize{10bp}{0bp}\selectfont}% \def\footerfont{\reset@font\fontsize{10bp}{0bp}\selectfont}% %% Regular Page Style \def\ps@headings{% \def\@oddfoot{\hfill\thepage\hfill}% \let\@evenfoot\@oddfoot% \def\@evenhead{% \vbox to 0pt{\vspace*{-48pt}% \hbox to \hsize{\hfill \relax\hfill}}\par%% \hspace*{-\textwidth}\hbox to \hsize{\hfill}}% \def\@oddhead{% \vbox to 0pt{\vspace*{-48pt}% \hbox to \hsize{\hfill \relax\hfill}}\par%% \hspace*{-\textwidth}\hbox to \hsize{\hfill}}% \let\@mkboth\markboth% }% %% Opening Page Style \def\ps@titlepage{% %%\def\@oddhead{\vbox{\vskip-36pt\hbox to \textwidth{\hfill\includegraphics{springer-nature-logo}\hspace*{-1pt}}}}% %%\let\@oddhead\@empty\let\@evenhead\@empty% \def\@oddhead{% \vbox to 0pt{\vspace*{-38pt}% \hbox to \hsize{\hfill \hfill}}}%% \let\@evenhead\@oddhead% \def\@oddfoot{\vbox to 18pt{\vfill\reset@font\rmfamily\hfil\thepage\hfil}}%% \def\@evenfoot{}}% \def\ps@plain{\let\@mkboth\@gobbletwo% \let\@oddhead\@empty\let\@evenhead\@empty% \def\@oddfoot{\vbox to 18pt{\vfill\reset@font\rmfamily\hfil ddd\thepage\hfil}}% \let\@evenfoot\@oddfoot}% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Sections %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \def\numbered{\setcounter{secnumdepth}{3}}% \def\unnumbered{\setcounter{secnumdepth}{0}}% \numbered%% default is numbered Sections \renewcommand\thesection {\@arabic\c@section}% \renewcommand\thesubsection {\thesection.\@arabic\c@subsection}% \renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection}% \renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph}% \renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph}% %% \def\@seccntformat#1{\csname the#1\endcsname\hskip.5em}% \def\@sect#1#2#3#4#5#6[#7]#8{% \ifnum #2>\c@secnumdepth \let\@svsec\@empty \else \refstepcounter{#1}% \protected@edef\@svsec{\@seccntformat{#1}\relax}% \fi \@tempskipa #5\relax \ifdim \@tempskipa>\z@ \begingroup #6{% \@hangfrom{\hskip #3\relax\@svsec}% \interlinepenalty \@M #8\@@par}% \endgroup \csname #1mark\endcsname{#7}% \addcontentsline{toc}{#1}{% \ifnum #2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}% \fi #7}% \else \def\@svsechd{% #6{\hskip #3\relax \@svsec #8.}% \csname #1mark\endcsname{#7}% \addcontentsline{toc}{#1}{% \ifnum #2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}% \fi #7}}% \fi \@xsect{#5}} % \def\sectionfont{\reset@font\fontfamily{\rmdefault}\fontsize{14bp}{16bp}\bfseries\selectfont\raggedright\boldmath}% \def\subsectionfont{\reset@font\fontfamily{\rmdefault}\fontsize{12bp}{14bp}\bfseries\selectfont\raggedright\boldmath}% \def\subsubsectionfont{\reset@font\fontsize{11bp}{13bp}\bfseries\selectfont\raggedright\boldmath}% \def\paragraphfont{\reset@font\fontsize{10bp}{12bp}\bfseries\itshape\selectfont\raggedright}% % \def\subparagraphfont{\itshape}% \def\bmheadfont{\reset@font\fontfamily{\rmdefault}\fontsize{10bp}{12bp}\bfseries\selectfont\raggedright\boldmath}% % \renewcommand\section{\@startsection{section}{1}{\z@}% {-12pt \@plus -4pt \@minus -2pt}% {9pt}% {\sectionfont}} \renewcommand\subsection{\@startsection{subsection}{2}{\z@}% {-12pt \@plus -4pt \@minus -2pt}% {6pt}% {\subsectionfont}} \renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% {-12pt \@plus -4pt \@minus -2pt}% {6pt}% {\subsubsectionfont}} \renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}% {-12pt \@plus -4pt \@minus-2pt}% {3pt}% {\paragraphfont}} \renewcommand\subparagraph{\@startsection{subparagraph}{5}{\z@}% {6pt \@plus1ex \@minus.2ex}% {-1em}% {\subparagraphfont}} \newcommand\bmhead{\@startsection{subparagraph}{5}{\z@}% {6pt \@plus1ex \@minus .2ex}% {-1em}% {\bmheadfont}} % \def\@startsection#1#2#3#4#5#6{% \if@noskipsec \leavevmode \fi \par \@tempskipa #4\relax \@afterindenttrue \ifdim \@tempskipa <\z@ \@tempskipa -\@tempskipa \@afterindentfalse \fi \if@nobreak \everypar{}% \else \addpenalty\@secpenalty\addvspace\@tempskipa \fi \@ifstar {\@ssect{#3}{#4}{#5}{#6}}% {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Lists %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \newdimen\labelwidthi% \newdimen\labelwidthii% \newdimen\labelwidthiii% \newdimen\labelwidthiv% \def\normal@labelsep{0.5em}% \labelsep\normal@labelsep% \settowidth{\labelwidthi}{(iii)}% \settowidth{\labelwidthii}{(d)}% \settowidth{\labelwidthiii}{(iii)}% \settowidth{\labelwidthiv}{(M)}% \leftmargini\labelwidthi \advance\leftmargini\labelsep \leftmarginii\labelwidthii \advance\leftmarginii\labelsep \leftmarginiii\labelwidthiii \advance\leftmarginiii\labelsep \leftmarginiv\labelwidthiv \advance\leftmarginiv\labelsep \def\setleftmargin#1#2{\settowidth{\@tempdima}{#2}\labelsep\normal@labelsep \csname labelwidth#1\endcsname\@tempdima \@tempdimb\@tempdima \advance\@tempdimb\labelsep \csname leftmargin#1\endcsname\@tempdimb} \def\@listI{\leftmargin\leftmargini \labelwidth\labelwidthi \labelsep\normal@labelsep % \topsep \z@ \topsep\baselineskip %%updated \partopsep\z@ \parsep\z@ \itemsep\z@ \listparindent 1em} \def\@listii{\leftmargin\leftmarginii \labelwidth\labelwidthii \labelsep\normal@labelsep \topsep\z@ \partopsep\z@ \parsep\z@ \itemsep\z@ \listparindent 1em} \def\@listiii{\leftmargin\leftmarginiii \labelwidth\labelwidthiii \labelsep\normal@labelsep \topsep\z@ \partopsep\z@ \parsep\z@ \itemsep\z@ \listparindent 1em} \def\@listiv{\leftmargin\leftmarginiv \labelwidth\labelwidthiv \labelsep\normal@labelsep \topsep\z@ \partopsep\z@ \parsep\z@ \itemsep\z@ \listparindent 1em} \let\@listi\@listI \@listi % \setlength \labelsep {.5em} \setlength \labelwidth{\leftmargini} \addtolength\labelwidth{-\labelsep} \@beginparpenalty -\@lowpenalty \@endparpenalty -\@lowpenalty \@itempenalty -\@lowpenalty \def\labelitemi{$\bullet$} \def\labelitemii{$\cdot$} \def\labelenumi{\theenumi.} \def\theenumi{\arabic{enumi}} \def\labelenumii{(\alph{enumii})} \def\theenumii{\alph{enumii}} \def\labelenumiii{(\roman{enumiii})}\def\theenumiii{\roman{enumiii}} \def\labelenumiv{(\Alph{enumiv})} \def\theenumiv{\Alph{enumiv}} % %%%%%%%%%%%%%%%%%%%%%%%%%%% Ordered & Unordered List %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \def\listfont{\normalsize}% % \def\enumargs{% \listfont% \leftmargini0pt% \leftmarginii0pt% \leftmarginiii0pt% \ifnum\@enumdepth=3\topsep0pt\else\ifnum\@enumdepth=2\topsep0pt\else\topsep 6pt\fi\fi% \partopsep \z@% \itemsep \z@% \parsep \z@% \labelsep 0.5em% \rightmargin \z@% \raggedright% \listparindent \parindent% \itemindent \z@}% \def\enumerate{% \@ifnextchar[{\@numerate}{\@numerate[0.]}} \def\@numerate[#1]{\par% \ifnum \@enumdepth >3 \@toodeep\else \advance\@enumdepth \@ne \edef\@enumctr{enum\romannumeral\the\@enumdepth} \list{\csname label\@enumctr\endcsname}{% \enumargs% \setlength{\leftmargin}{\csname leftmargin\romannumeral\the\@enumdepth\endcsname} \usecounter{\@enumctr} \settowidth\labelwidth{#1} \addtolength{\leftmargin}{\labelwidth} \addtolength{\leftmargin}{\labelsep} \def\makelabel##1{\hss\llap{##1}}}% \fi } \let\endenumerate\endlist %%Unnumbered list%% \def\unenumargs{% \listfont% \leftmargini\parindent% \topsep6pt% \partopsep \z@% \itemsep \z@% \parsep \z@% \labelsep 0\p@% \rightmargin \z@% \raggedright% \listparindent \parindent% \itemindent -12pt}% \def\unenumerate{% \@ifnextchar[{\@unenumerate}{\@unenumerate[0.]}} \def\@unenumerate[#1]{\par% \ifnum \@enumdepth >3 \@toodeep\else \advance\@enumdepth \@ne \edef\@enumctr{enum\romannumeral\the\@enumdepth} \list{}{% \unenumargs \setlength{\leftmargin}{\csname leftmargin\romannumeral\the\@enumdepth\endcsname} \usecounter{\@enumctr} \settowidth\labelwidth{#1} \addtolength{\leftmargin}{0pt} \addtolength{\leftmargin}{0pt} \def\makelabel##1{\hss\llap{##1}}}% \fi } \let\endunenumerate\endlist% %% bulleted list \def\itemargs{% \listfont% \leftmargini0pt% \leftmarginii0pt% \ifnum\@enumdepth=3\topsep0pt\else\ifnum\@enumdepth=2\topsep0pt\else\topsep 6pt\fi\fi% \partopsep \z@% \itemsep \z@% \parsep \z@% \labelsep 0.5em% \rightmargin \z@% \raggedright% \listparindent \z@% \itemindent \z@}% \renewcommand\labelitemi{\raise1pt\hbox{\textbullet}}% \renewcommand\labelitemii{\textendash}% \def\itemize{% \@ifnextchar[{\@itemize}{\@itemize[$\bullet$]}} \def\@itemize[#1]{\par% \ifnum \@itemdepth >3 \@toodeep\else \advance\@itemdepth \@ne \edef\@itemctr{item\romannumeral\the\@itemdepth} \list{\csname label\@itemctr\endcsname}{% \itemargs \setlength{\leftmargin}{\csname leftmargin\romannumeral\the\@itemdepth\endcsname} \settowidth\labelwidth{#1} \addtolength{\leftmargin}{\labelwidth} \addtolength{\leftmargin}{\labelsep} \def\makelabel##1{\hss \llap{##1}}}% \fi } \let\enditemize\endlist % \def\quote{\list{}{\itemindent\z@ \leftmargin 1em \rightmargin \z@}% \item[]} \let\endquote\endlist % \def\descriptionlabel#1{\hspace\labelsep \itshape #1} \def\description{\list{}{\labelwidth\z@ \leftmargin \z@ \topsep6pt\itemindent \z@ %-\leftmargin \let\makelabel\descriptionlabel}} \let\enddescription\endlist % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Float %%%%%%%%%%%%%%%%%%%%%%%%%%%% \setlength\abovecaptionskip{2.25\p@}% \setlength\belowcaptionskip{6\p@}% \setlength\arraycolsep{2\p@}% \setlength\tabcolsep{6\p@}% \setlength\arrayrulewidth{.4\p@}% \setlength\doublerulesep{2\p@}% \setlength\tabbingsep{\labelsep}% \def\fnum@figure{{\bfseries\figurename\space\thefigure}}% \def\fnum@table{{\bfseries\tablename\space\thetable}}% \def\FigName{figure}% \long\def\@makecaption#1#2{% \ifx\FigName\@captype \vskip\abovecaptionskip \@figurecaption{#1}{#2} \else \@tablecaption{#1}{#2} \vskip\belowcaptionskip \fi% } %% Figure \def\figurecaptionfont{\reset@font\fontfamily{\rmdefault}\fontsize{8}{9.5}\selectfont}% \newdimen\figwidth% \newdimen\figheight% \newdimen\sidecapwidth \newdimen\wrapcapline% \newdimen\totalwrapline% \newdimen\wraptotline% %% Figures macro \newbox\figurebox% \newbox\wrapfigcapbox \def\FIG#1#2{% \setbox\figurebox\hbox{#1}% %% Figure dimensions \figwidth\wd\figurebox% \figheight\ht\figurebox% {\parbox{\hsize}{% \centerline{\box\figurebox}% %% Caption #2}}} %% Figures caption \newbox\figcapbox \newbox\capbox \long\def\@figurecaption#1#2{{\figurecaptionfont{\bfseries#1}\hskip.7em#2\par}}% \newenvironment{unnumfigure}{\begingroup\setlength{\topsep}{12pt}% \begin{center}}{\end{center}\endgroup} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \@ifpackageloaded{booktabs}{\cmidrulewidth=.15pt}{}% % \def\tablecaptionfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont}% \def\tablebodyfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont}% \def\tablecolheadfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont\bfseries\boldmath}% \def\tablefootnotefont{\reset@font\fontsize{8bp}{9.5bp}\selectfont}% %% Table Macro \newskip\headwidthskip% \def\tabraggedcenter{\leftskip=0pt plus 0.5fil\rightskip=0pt plus 0.5fil\parfillskip=0pt}% \newenvironment{@processtable}[4]{% \setbox4=\hbox to \hsize{\hss% \begin{minipage}[t]{#4}% \tabraggedcenter% \caption{#1}\par% {\tablebodyfont\noindent\ignorespaces#2\par}\par\vglue6pt% {\if!#3!\else{\tablefootnotefont#3}\fi}% \end{minipage}% \hss}% \box4\par}% \newcommand\TBL[3]{\begingroup% % \if!#1!\let\caption\relax\fi% % \global\setbox\temptbox=\hbox{\bgroup{\tablebodyfont#2}\egroup}% \global\tempdime\wd\temptbox% \@processtable{#1}{\global\headwidthskip=\tempdime% \vbox{#2}}{#3}{\tempdime}% \endgroup}% %% Table Caption \newbox\tabcapbox% \newbox\temptbox% \newdimen\tempdime% \newdimen\tabhtdime% \long\def\@tablecaption#1#2{% \setbox\tabcapbox\vbox{\tablecaptionfont\raggedright% {\bfseries #1}{\hskip2mm}#2\vphantom{y}\par}% \box\tabcapbox% } %% Table Column Heads \def\TCH#1{{\tablecolheadfont #1}} %% Table Footnotes \newenvironment{tablenotes}{\list{}{\setlength{\labelsep}{0pt}% \setlength{\labelwidth}{0pt}% \setlength{\leftmargin}{0pt}% \setlength{\rightmargin}{0pt}% \setlength{\topsep}{-6pt}% \setlength{\itemsep}{2pt}% \setlength{\partopsep}{0pt}% \setlength{\listparindent}{0em}% \setlength{\parsep}{0pt}}% \item\relax% }{\endlist}% \def\tnote#1{$^{#1}$}%% %% Table Rules \def\toprule{%\noalign{\vskip3pt} \noalign{\ifnum0=`}\fi \hrule \@height 0\p@ \@width 0pt \hrule \@height 0.75\p@ % <- rule height \hrule \@height 5pt \@width 0pt \futurelet\@tempa\@xhline} % Middle rule \def\midrule{\noalign{\ifnum0=`}\fi% \hrule \@height 3pt \@width 0pt \hrule \@height .5pt % <- rule height \hrule \@height 5pt \@width 0pt \futurelet \@tempa\@xhline} % Bottom rule \def\botrule{\noalign{\ifnum0=`}\fi \hrule \@height 3pt \@width 0pt \hrule \@height 0.75\p@ % <- rule height \hrule \@height 3pt \@width 0pt \futurelet\@tempa\@xhline} % \def\@@@cmidrule[#1-#2]#3#4{\global\@cmidla#1\relax \global\advance\@cmidla\m@ne \ifnum\@cmidla>0\global\let\@gtempa\@cmidrulea\else \global\let\@gtempa\@cmidruleb\fi \global\@cmidlb#2\relax \global\advance\@cmidlb-\@cmidla \global\@thisrulewidth=#3 \@setrulekerning{#4} \ifnum\@lastruleclass=\z@\vskip 3\p@\fi \ifnum0=`{\fi}\@gtempa \noalign{\ifnum0=`}\fi\futurenonspacelet\@tempa\@xcmidrule} \def\@xcmidrule{% \ifx\@tempa\cmidrule \vskip-\@thisrulewidth \global\@lastruleclass=\@ne \else \ifx\@tempa\morecmidrules \vskip \cmidrulesep \global\@lastruleclass=\@ne\else \vskip 5\p@ \global\@lastruleclass=\z@ \fi\fi \ifnum0=`{\fi}} \let\cline\cmidrule \usepackage[figuresright]{rotating}% \usepackage{threeparttable} \let\tableorg\table% \let\endtableorg\endtable% \let\sidewaystableorg\sidewaystable% \let\endsidewaystableorg\endsidewaystable% \renewenvironment{table}[1][]% {\begin{tableorg}[#1]% \begin{center} \begin{threeparttable} \tablebodyfont% \renewcommand\footnotetext[2][]{{\removelastskip\vskip3pt% \let\tablebodyfont\tablefootnotefont% \hskip0pt\if!##1!\else{\smash{$^{##1}$}}\fi##2\par}}% }{\end{threeparttable}\end{center}\end{tableorg}} \renewenvironment{sidewaystable}[1][]% {\begin{sidewaystableorg}[#1]% \begin{center} \begin{threeparttable} \tablebodyfont% \renewcommand\footnotetext[2][]{{\removelastskip\vskip3pt% \let\tablebodyfont\tablefootnotefont% \hskip0pt\if!##1!\else{\smash{$^{##1}$}}\fi##2\par}}% }{\end{threeparttable}\end{center}\end{sidewaystableorg}} %%%%%%%%%%%%%%%%%%%%%%%%%%%% Other Env. %%%%%%%%%%%%%%%%%%%%%%%%% \def\quotefont{\reset@font\fontfamily{\rmdefault}\fontsize{9}{11}\selectfont}% \renewenvironment{quote} {\list{}{\topsep=0pt\topsep6pt\leftmargin=1em\raggedright\quotefont}% \item\relax} {\endlist} % %%%%%%%%%%%%%%%%%%%%%%%%%%%% Appendix %%%%%%%%%%%%%%%%%%%%%%%%% % \newif\ifbackmatter% \newcommand{\backmatter}{\global\backmattertrue}% \usepackage[title]{appendix}% \@ifpackageloaded{appendix}{% % \renewenvironment{appendices}{% \@resets@pp \if@dotoc@pp \if@dopage@pp % both page and toc \if@chapter@pp % chapters \clear@ppage \fi \appendixpage \else % toc only \if@chapter@pp % chapters \clear@ppage \fi \addappheadtotoc \fi \else \if@dopage@pp % page only \appendixpage \fi \fi \if@chapter@pp \if@dotitletoc@pp \@redotocentry@pp{chapter} \fi \else \if@dotitletoc@pp \@redotocentry@pp{section} \fi \if@dohead@pp \def\sectionmark##1{% \if@twoside \markboth{\@formatsecmark@pp{##1}}{} \else \markright{\@formatsecmark@pp{##1}}{} \fi} \fi \if@dotitle@pp \def\sectionname{\appendixname} \def\@seccntformat##1{\@ifundefined{##1name}{}{\csname ##1name\endcsname\ }% \csname the##1\endcsname\quad} \fi \fi }{% \@ppsaveapp\@pprestoresec} %% \AtBeginDocument{% % \let\oldappendices\appendices% \let\oldendappendices\endappendices% %% \renewenvironment{appendices}{% \setcounter{figure}{0}% \setcounter{table}{0}% \setcounter{equation}{0}% %% \begin{oldappendices}% \gdef\thefigure{\@Alph\c@section\arabic{figure}}% \gdef\thetable{\@Alph\c@section\arabic{table}}% \gdef\theequation{\@Alph\c@section\arabic{equation}}% }{\end{oldappendices}} } %% }{} % %%%%%%%%%%%%%%%%%%%%%%%%%%% Article History %%%%%%%%%%%%%%%%%%%% % \def\@history{} \def\printhistory{{\par\addvspace{8pt}% \historyfont\noindent% \ifx\@history\empty\gdef\@history{Received xx xxx xxxx}\fi\@history\par}}% % %%%%%%%%%%%%%%%%%%%%%%% Footnotes %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \renewcommand\@makefntext[1]{% \hskip8pt{\smash{\@makefnmark}}#1} % \RequirePackage{hyperref}% %%\RequirePackage{hypcap}% \gdef\breakurldefns{% \if@pdflatex\else% \RequirePackage[hyphenbreaks]{breakurl}% % \let\href\burlalt% \fi}% \breakurldefns% % \bgroup % \catcode`\&=12\relax % \hyper@normalise\burl@addtocharlistbefore{%} % \hyper@normalise\burl@addtocharlistafter{:/.?#&_,;!=+~}%% for extra breaks in url % \egroup % \burl@defifstructure % \hypersetup{% colorlinks, breaklinks=true, plainpages=false,% citecolor=blue, linkcolor=blue, urlcolor=blue, bookmarksopen=true,% bookmarksnumbered=false,% bookmarksdepth=5% } % \AtBeginDocument{\renewcommand\UrlFont{\rmfamily}}% % \AtBeginDocument{% \@ifpackageloaded{natbib}{% \renewcommand\bibsection{% \section*{\refname}% }% }{}% }% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \pagestyle{headings}% \pagenumbering{arabic}% \sloppy% \frenchspacing% \flushbottom% %%% special parameters for TeX \adjdemerits=100 \linepenalty=100 % %%%%%%%%%%%%%%% Biography % \RequirePackage{wrapfig}% % % % \begin{wrapfigure}[12]{r}[34pt]{5cm}
\end{wrapfigure} % -- - ---- --- % [number of narrow lines] {placement} [overhang] {width of figure} \newcount\wraplines% %%\wraplines=5% % \newbox\@authorfigbox% \newskip\@authorfigboxdim% % \newskip\biofigadjskip% \biofigadjskip=0pt% % \def\authbiotextfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont}% % \newenvironment{biography}[2]{\par\addvspace{11.5pt plus3.375pt minus1.6875pt}%\lineno@off% \def\author##1{{\bfseries##1}}% \if!#1!\def\@authorfig{}\else\def\@authorfig{{#1}}\fi% \setbox\@authorfigbox=\hbox{#1}% \@authorfigboxdim=\wd\@authorfigbox% \if@iicol\advance\@authorfigboxdim by -10pt\else\advance\@authorfigboxdim by -2pt\fi% \wraplines=9\fboxrule=1pt\fboxsep=6pt% \noindent{% \ifx\@authorfig\@empty\else\unskip% \begin{wrapfigure}[\wraplines]{l}[0pt]{\@authorfigboxdim}%{38.25mm}% \vskip-19pt\addvspace{\biofigadjskip}% \@authorfig% \end{wrapfigure}% \fi% {\authbiotextfont#2\par}% \par% }}{\par\addvspace{10.5pt plus3.375pt minus1.6875pt}} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Theorem %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \usepackage{amsthm} \usepackage{fix-cm} \@ifpackageloaded{amsthm}{% % %\let\proof\relax% %\let\endproof\relax% \def\@begintheorem#1#2[#3]{% \deferred@thm@head{\the\thm@headfont \thm@indent \@ifempty{#1}{\let\thmname\@gobble}{\let\thmname\@iden}% \@ifempty{#2}{\let\thmnumber\@gobble}{\let\thmnumber\@iden}% \@ifempty{#3}{\let\thmnote\@gobble}{\let\thmnote\@iden}% \thm@swap\swappedhead\thmhead{#1}{#2}{#3}% \the\thm@headpunct \thmheadnl % possibly a newline. \hskip\thm@headsep }% \ignorespaces } \def\@endtheorem{\endtrivlist\@endpefalse} \AtBeginDocument{% % \DeclareRobustCommand{\S}{\ifmmode\mathsection\else\textsection\fi} \DeclareSymbolFont{AMSa}{U}{msa}{m}{n}% \DeclareMathSymbol{\opensquare}{\mathord}{AMSa}{"03}% \def\qedsymbol{\ensuremath{\opensquare}}% % \newenvironment{spiproof}[1][\proofname]{\par\removelastskip%\vspace*{2pt}% \pushQED{\qed}% \small\normalfont \topsep7.5\p@\@plus7.5\p@\relax% \trivlist% \item[\hskip\labelsep% \itshape% #1\@addpunct{}]\ignorespaces% }{% \popQED\endtrivlist\@endpefalse% }% % \let\proof\spiproof\let\endproof\endspiproof% % }% % \def\thm@space@setup{% \thm@preskip=12pt% \thm@postskip=12pt} % %%%%%%%%%%%%%%%%%% StyleOne % \newtheoremstyle{thmstyleone}% Numbered {18pt plus2pt minus1pt}% Space above {18pt plus2pt minus1pt}% Space below {\small\itshape}% Body font {0pt}% Indent amount {\small\bfseries}% Theorem head font {}% Punctuation after theorem head {.5em}% Space after theorem headi {\thmname{#1}\thmnumber{\@ifnotempty{#1}{ }\@upn{#2}}% \thmnote{ {\the\thm@notefont(#3)}}}% Theorem head spec (can be left empty, meaning `normal') % \newtheoremstyle{thmstyletwo}% Numbered {18pt plus2pt minus1pt}% Space above {18pt plus2pt minus1pt}% Space below {\small\normalfont}% Body font {0pt}% Indent amount {\small\itshape}% Theorem head font {}% Punctuation after theorem head {.5em}% Space after theorem headi {\thmname{#1}\thmnumber{\@ifnotempty{#1}{ }{#2}}% \thmnote{ {\the\thm@notefont(#3)}}}% Theorem head spec (can be left empty, meaning `normal') % \newtheoremstyle{thmstylethree}% Definition {18pt plus2pt minus1pt}% Space above {18pt plus2pt minus1pt}% Space below {\small\normalfont}% Body font {0pt}% Indent amount {\small\bfseries}% Theorem head font {}% Punctuation after theorem head {.5em}% Space after theorem headi {\thmname{#1}\thmnumber{\@ifnotempty{#1}{ }\@upn{#2}}% \thmnote{ {\the\thm@notefont(#3)}}}% Theorem head spec (can be left empty, meaning `normal') % \newtheoremstyle{thmstylefour}% Proof {18pt plus2pt minus1pt}% Space above {18pt plus2pt minus1pt}% Space below {\small\normalfont}% Body font {0pt}% Indent amount {\small\itshape}% Theorem head font {}% Punctuation after theorem head {.5em}% Space after theorem headi {\global\proofthmtrue\thmname{#1} \thmnote{#3}}% Theorem head spec (can be left empty, meaning `normal') % }{} %% Macros for bibliographystyles %% % \def\bibcommenthead{\if@bibcomment\begingroup\parindent=0pt\parskip=0pt% % \removelastskip\vskip13pt\nointerlineskip% % % \vbox{\bibfont If you are submitting to one of the Nature Research journals, using the eJP % submission system, please include the references within the manuscript file itself. You may % do this by copying the reference list from your .bbl file, and pasting it into the bibliography % environment of the main manuscript .tex file.}\par% % \removelastskip\nobreak\vskip13pt\nobreak% % \endgroup\fi}% \def\bibcommenthead{}% \if@Spr@basic@refstyle% \if@Numbered@refstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \else% \usepackage[authoryear]{natbib}% \setcitestyle{aysep={}} \gdef\NumBib{NO}% \fi% \bibliographystyle{sn-basic}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \if@Mathphys@numrefstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \bibliographystyle{sn-mathphys-num}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \else% \if@Mathphys@ayrefstyle% \usepackage[authoryear]{natbib}% \gdef\NumBib{NO}% \setcitestyle{aysep={}} \bibliographystyle{sn-mathphys-ay}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi\fi% \if@APS@refstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \bibliographystyle{sn-APS}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \if@Vancouver@numrefstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \bibliographystyle{sn-vancouver-num}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \else% \if@Vancouver@ayrefstyle% \usepackage[authoryear]{natbib}% \gdef\NumBib{NO}% \setcitestyle{aysep={}} \bibliographystyle{sn-vancouver-ay}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi\fi% \if@APA@refstyle% \if@Numbered@refstyle% \usepackage[natbibapa]{apacite}% \gdef\NumBib{YES}% \else% \usepackage[natbibapa]{apacite}% \gdef\NumBib{NO}% \fi% \bibliographystyle{sn-apacite}% \def\refdoi#1{\urlstyle{rm}\url{#1}}% \renewcommand{\doiprefix}{}% \AtBeginDocument{% \renewcommand{\BPBI}{.}% Period between initials - command from apacite.sty }% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \if@Chicago@refstyle% \if@Numbered@refstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \else% \usepackage[authoryear]{natbib}% \gdef\NumBib{NO}% \setcitestyle{aysep={}} \fi% \bibliographystyle{sn-chicago}% \hypersetup{urlcolor=black,colorlinks=false,pdfborder={0 0 0}}\urlstyle{same}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \if@Standard@Nature@refstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \bibliographystyle{sn-nature}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \AtBeginDocument{\allowdisplaybreaks}% \def\eqnheadfont{\reset@font\fontfamily{\rmdefault}\fontsize{16}{18}\bfseries\selectfont}% \newcommand{\eqnhead}[1]{\begingroup% \begin{center} {\eqnheadfont #1}\par% \end{center} \removelastskip\vskip24pt% \thispagestyle{titlepage}%% %%\thispagestyle{empty}% \endgroup} %% Macros for border matrix %% \newif\if@borderstar \def\bordermatrix{\@ifnextchar*{% \@borderstartrue\@bordermatrix@i}{\@borderstarfalse\@bordermatrix@i*}% } \def\@bordermatrix@i*{\@ifnextchar[{\@bordermatrix@ii}{\@bordermatrix@ii[()]}} \def\@bordermatrix@ii[#1]#2{% \begingroup \m@th\@tempdima8.75\p@\setbox\z@\vbox{% \def\cr{\crcr\noalign{\kern 2\p@\global\let\cr\endline }}% \ialign {$##$\hfil\kern 2\p@\kern\@tempdima & \thinspace % \hfil $##$\hfil && \quad\hfil $##$\hfil\crcr\omit\strut % \hfil\crcr\noalign{\kern -\baselineskip}#2\crcr\omit % \strut\cr}}% \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}% \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}% \setbox\tw@\hbox{% $\kern\wd\@ne\kern -\@tempdima\left\@firstoftwo#1% \if@borderstar\kern2pt\else\kern -\wd\@ne\fi% \global\setbox\@ne\vbox{\box\@ne\if@borderstar\else\kern 2\p@\fi}% \vcenter{\if@borderstar\else\kern -\ht\@ne\fi% \unvbox\z@\kern-\if@borderstar2\fi\baselineskip}% \if@borderstar\kern-2\@tempdima\kern2\p@\else\,\fi\right\@secondoftwo#1 $% }\null \;\vbox{\kern\ht\@ne\box\tw@}% \endgroup } %% Macros for line numbers %% \if@vrulerlinenumberon% % \usepackage{vruler}% % %%\setvruler[][][][][][][][][] \def\linenoon{%%\definecolor{blue}{gray}{0}% \def\tiny{\normalsize\color{black}}% \setvruler[12bp][1][1][3][1][1.18\textwidth][26pt][-7pt][0.99\textheight]% for even pages: left side; for odd pages: right side; %%\linkbluecolor }% \linenoon% \def\lineno@off{\unsetvruler}% \fi% %% url macros %% \gdef\orcidlogo{% \includegraphics{Orcidlogo.eps}% }% \gdef\orcid#1{\href{#1}{\orcidlogo}}% \endinput \ No newline at end of file diff --git a/waypoint_control/twin_paper/sn-mathphys-num.bst b/waypoint_control/twin_paper/sn-mathphys-num.bst new file mode 100644 index 0000000..e4d1e42 --- /dev/null +++ b/waypoint_control/twin_paper/sn-mathphys-num.bst @@ -0,0 +1,3211 @@ +%% This is file `sn-mathphys-num.bst' +%% Compatible with bibtex version 0.99d. +%% +%% Note: Per default sorting entries is done in the order of citation. +%% If the journal requires alphabetical order of references, select the alpha option +%% +%% You are free to use this style file as you see fit, provided +%% that you do not make changes to the file. +%% +%% It may be distributed under the terms of the LaTeX Project Public +%% License, as described in lppl.txt in the base LaTeX distribution. +%% Either version 1.0 or, at your option, any later version. +%% +%% LIMITATIONS: +%% If you are getting error like +%% "Sorry---you've exceeded BibTeX's number of string global-variables" +%% that means you are using to old bibtex version. You should download latest version 0.99d. +%% (One of the binaries location is minimals.contextgarden.net/current/bin/common/) + +FUNCTION {identify.mathphys.version} +{ % Put identifying string in the .blg file + "sn-mathphys-num.bst" + " [2024/07/19 v1.1 bibliography style]" + * top$ +} + +ENTRY + { address + author + booktitle + bnumber + chapter + doi + edition + editor + howpublished + institution + isbn + journal + key + keywords + month + note + number + organization + pages + publisher + school + series + title + type + volume + year + url + info + options + urldate + eprint + archive + archivePrefix + primaryClass + eid + adsurl + adsnote + version + } + {} + { label extra.label sort.label short.list} + +INTEGERS { output.state before.all mid.sentence after.sentence + after.block after.authors between.elements bother + Nisbn Nmonth slen set.settings tmp month.printed} + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := + #4 'after.authors := + #5 'between.elements := +} + +STRINGS { s t element} +STRINGS { longest.label last.label list.string default.list} +STRINGS { v l f j b temp.str} + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { " " * write$ newline$} + { output.state after.block = + { add.period$ write$ + newline$ + } + { + output.state after.authors = + { ": " * write$ + newline$ + } + { output.state between.elements = + { ", " * write$ newline$} + { output.state before.all = + 'write$ + { add.period$ " " * write$ newline$} + if$ + } + if$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} +FUNCTION {fin.entry} +{ write$ newline$ } + +FUNCTION {stupid.colon} +{ after.authors 'output.state := } + + +FUNCTION {insert.comma} +{ output.state before.all = + 'skip$ + { between.elements 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {sort.format.month} +{ 't := + t #1 #2 substring$ "01" = + t #1 #1 substring$ "1" = + t #2 #2 substring$ "" = + and or + { "January" } + { t #1 #2 substring$ "02" = + t #1 #1 substring$ "2" = + t #2 #2 substring$ "" = + and or + { "February" } + { t #1 #2 substring$ "03" = + t #1 #1 substring$ "3" = + t #2 #2 substring$ "" = + and or + { "March" } + { t #1 #2 substring$ "04" = + t #1 #1 substring$ "4" = + or + { "April" } + { t #1 #2 substring$ "05" = + t #1 #1 substring$ "5" = + or + { "May" } + { t #1 #2 substring$ "06" = + t #1 #1 substring$ "6" = + or + { "June" } + { t #1 #2 substring$ "07" = + t #1 #1 substring$ "7" = + or + { "July" } + { t #1 #2 substring$ "08" = + t #1 #1 substring$ "8" = + or + { "August" } + { t #1 #2 substring$ "09" = + t #1 #1 substring$ "9" = + or + { "September" } + { t #1 #2 substring$ "10" = + { "October" } + { t #1 #2 substring$ "11" = + { "November" } + { t #1 #2 substring$ "12" = + { "December" } + { t } % No match + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + +} + +INTEGERS {sk} +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +FUNCTION {make.tag} +{ 't := + duplicate$ empty$ + { pop$ "" } + { bother #0 = + { + t "volume" = + {"\textbf{" swap$ * "}" * } + 'skip$ + if$ + } + { "\b" t * "{" * swap$ * "}" * } + if$ + } + if$ +} + + + +FUNCTION {springer.publisher} +{publisher #1 #8 substring$ "Springer" = + { "Springer" } + { publisher } + if$ +} + +FUNCTION {format.adsurl} +{ + adsurl empty$ + { "" } + {" \href{" adsurl "}" *} + if$ +} + +FUNCTION {format.adsnote} +{ + adsnote empty$ + { "" } + { ". " * adsnote *} + if$ +} + + +FUNCTION {format.soft.title} +{ + title empty$ + { "" } + { title "," *} + if$ +} + +FUNCTION {format.softmisctitle} +{ title empty$ + { ""} + { version empty$ + { title ", " *} + { title ", " * version " " *} + if$ + } + if$ +} + +FUNCTION {format.softmisc.archive} +{ + archivePrefix empty$ + { "" } + { "" } + if$ +} + +FUNCTION {format.archive} +{ + archivePrefix empty$ + { "" } + { archivePrefix ":" *} + if$ +} + +FUNCTION {format.primaryClass} +{ + primaryClass empty$ + { "" } + { "{[" primaryClass * "]}" *} + if$ +} + +FUNCTION {format.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.softmisc.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.pub.address} +{ publisher empty$ + howpublished empty$ + and + { + address empty$ + 'skip$ + { volume empty$ + 'insert.comma + 'new.sentence + if$ + address + type$ "inproceedings" = + {"conflocation"} + {"location"} + if$ + make.tag output + } + if$ + } + { + address empty$ + { publisher empty$ + {howpublished} + {springer.publisher} + if$ + "publisher" make.tag + #1 bother = + {", \blocation{???}" * } + 'skip$ + if$ + output + } + { + publisher empty$ + {howpublished } + {springer.publisher } + if$ + "publisher" make.tag output + insert.comma + address "location" make.tag output + } + if$ + } + if$ +} + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {mk.tag} +{ 'temp.str := + duplicate$ empty$ + { pop$ "" } + { + b "nothing" = + 'skip$ + { "\b" temp.str * "{" * swap$ * "}" * } + if$ + } + if$ +} + +FUNCTION {space.after.dot} +{'j := + t 'f := + j 't := + s 'j := + "" 'l := + "" 's := + { t empty$ not } + { + t #1 #3 substring$ "{-}" = + { l " {q}. " * 'l := + t #4 global.max$ substring$ 't := + } + 'skip$ + if$ + + t #1 #1 substring$ 's := + l s * 'l := + s "." = + { + t #2 #1 substring$ " " = + 'skip$ + { + l " " * 'l := + t #2 #4 substring$ "{\,}" = + { t #5 global.max$ substring$ 't := } + 'skip$ + if$ + } + if$ + } + 'skip$ + if$ + t #2 global.max$ substring$ 't := + } + while$ + f 't := + j 's := + l +} + +FUNCTION {fix.inits}{ + 't := + "" 'element := + { t empty$ not } + { + t #1 #3 substring$ ".q." = + { element ".-" * 'element := + t #3 global.max$ substring$ 't := + } + {element t #1 #1 substring$ * 'element :=} + if$ + + t #2 global.max$ substring$ 't := + } + while$ + element +} + +FUNCTION {fix.snm}{ + 't := + "" 'element := + { t empty$ not } + { + t #1 #3 substring$ "{-}" = + {element "-" * 'element := + t #3 global.max$ substring$ 't := + } + {element t #1 #1 substring$ * 'element :=} + if$ + + t #2 global.max$ substring$ 't := + } + while$ + element +} + +FUNCTION {enbrace.dash}{ + 't := + "" 'element := + { t empty$ not } + { + t #1 #1 substring$ "-" = + {element "{-}" * 'element :=} + {element t #1 #1 substring$ * 'element :=} + if$ + t #2 global.max$ substring$ 't := + } + while$ + element +} + +FUNCTION {fix.name}{ + + enbrace.dash 's := + "" 'l := + "" 't := + + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { + s nameptr "{vv~}{ll}{, jj}" format.name$ + s nameptr "{, ff}" format.name$ space.after.dot * 'l := + #1 nameptr = + {l 't :=} + {t " and " * l * 't := } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + t +} + +FUNCTION {name.separator}{ + namesleft #1 > + {", " * } + 'skip$ + if$ +} + +FUNCTION {format.author.editor} +{ 'b := + + bother #1 = + b "nothing" = + or + 'skip$ + {"b" b * 'b :=} + if$ + + b "editor" = + b "beditor" = + b "nothing" = + or or + {editor 's :=} + {author 's :=} + if$ + + %% modifying name + s fix.name 's := + + "" 't := + + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + + s numnames "{ll}" format.name$ 'l := + l "others" = + l "{others}" = + l "et al." = + l "{et al.}" = + or or or + {#1 'tmp :=} + {#0 'tmp :=} + if$ + + { namesleft #0 > } + { s nameptr "{vv}" format.name$ "particle" mk.tag 'v := + s nameptr "{ll}" format.name$ fix.snm "snm" mk.tag 'l := + s nameptr "{f{.}.}" format.name$ fix.inits "inits" mk.tag 'f := + s nameptr "{jj}" format.name$ "suffix" mk.tag 'j := + + + namesleft #1 = + tmp #1 = + and + { b "bauthor" = + b "beditor" = + or + {"et al."} + {"\betal"} + if$ + #1 'tmp := + } + { + b "bauthor" = + b "beditor" = + or + {"\oauthor{"} + { + b "nothing" = + {""} + {"\b" b * "{" *} + if$ + } +%% if$ +%% +%% v empty$ +%% 'skip$ +%% {v * " " *} + if$ + + l empty$ + 'skip$ + { l *} + if$ + + f empty$ + 'skip$ + {", " * f *} + if$ + + j empty$ + 'skip$ + {" " * j *} + if$ + + b "nothing" = + {""} + {"}"} + if$ + + * "" 't := + } + if$ + + name.separator + write$ + + namesleft #1 > + b "nothing" = not + and + { namesleft #2 = + tmp #1 = + and + 'skip$ + 'newline$ + if$ + } + 'skip$ + if$ + + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.editors} +{ editor empty$ + 'skip$ + { + bother #0 = + { author empty$ + {"editor"} + {"nothing"} + if$ + } + {"editor"} + if$ + format.author.editor + editor num.names$ #1 > + { " (eds.)" } + { " (ed.)" } + if$ + write$ + } + if$ +} + +FUNCTION {format.authors} +{ author empty$ + 'skip$ + {"author" format.author.editor} + if$ +} + +FUNCTION {cite.author.editor} +{ 's := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ " et~al." * } + { #2 = + { s #2 "{vv~}{ll}{ jj}{ f}" format.name$ "others" = + { " et~al." * } + { " and " * s #2 "{vv~}{ll}" format.name$ * } + if$ + } + 'skip$ + if$ + } + if$ +} + +FUNCTION {check.auth.edit.org} +{author empty$ + { + editor empty$ + { + organization empty$ + {""} + {organization} + if$ + } + {editor cite.author.editor} + if$ + } + {author cite.author.editor} + if$ +} + +FUNCTION {check.year} +{ year empty$ + {""} + {year extra.label *} + if$ +} + +INTEGERS { multiresult char.num k int} +INTEGERS {str.length count return save.num1 save.num2} +FUNCTION {is.in.list}{ + 'f := + %%%% saveing "s" and "t" + s 'j := + f 's := + t 'f := + list.string text.length$ 'str.length := + list.string 't := +% s text.length$ 'slen := + int 'save.num1 := + count 'save.num2 := + #1 'int := + #1 'count := + #0 'return := + + { count str.length = not + #0 str.length = not + and + } + { + count #1 + 'count := + t int #1 substring$ "," = + { + t #1 int substring$ s "," * = + { + #1 'return := + str.length 'count := + } + 'skip$ + if$ + + int #1 + 'int := + t int global.max$ substring$ 't := + #0 'int := + } + 'skip$ + if$ + int #1 + 'int := + } + while$ + + save.num1 'int := + save.num2 'count := + + #0 return = + { s t = + {#1 'return :=} + 'skip$ + if$ + } + 'skip$ + if$ + %%%% returning original "s" and "t" + j 's := + f 't := + + return +} + +INTEGERS {bibitem.count} + +FUNCTION {print.count} +{ bibitem.count #1 + 'bibitem.count := + newline$ + "%%% " + bibitem.count int.to.str$ * write$ +} + + +FUNCTION {output.bibitem} +{ print.count + newline$ + "\bibitem[\protect\citeauthoryear{" write$ + check.auth.edit.org write$ + "}{" write$ + check.year write$ + "}]{" write$ + cite$ write$ + "}" write$ + newline$ + "" before.all 'output.state := +} + + + + +FUNCTION {string.to.integer} +{ 't := + t text.length$ 'k := + #1 'char.num := + { t char.num #1 substring$ 's := + s is.num + s "." = + or + char.num k = not + and + } + { char.num #1 + 'char.num := } + while$ + char.num #1 - 'char.num := + t #1 char.num substring$ +} + + +FUNCTION {find.integer} +{ 't := + #0 'int := + { int not + t empty$ not + and + } + { t #1 #1 substring$ 's := + s is.num + {#1 'int :=} + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + int +} + +function{title.lowerwords}{ +"a,an,and,of,the,for,in,to,over,from,on,or,so,than,that,this,as,but,with,by,at,down,up,upon,al,ale,aus,aux,d'Analyse,d'Analystes,d'Architecture,d'Etudes,d'Histoire,da,dans,de,degli,dei,del," +"dell',dell'Accademia,dell'Istituto,dell'Universita,della,delle,dem,der,des,detta,di,die,din,dlia,do,du,e,eXpress,ed,ego,el,em,en,et,fur,i,iz,l'Academie,l'Age,l'Antiquite," * +"l'Approximation,l'Ecole,l'Histoire,l'I.S.U.P.,l'INSA,l'IREM,l'Indirizzo,l'Institut,l'Institute,l'UFR,l'Union,l'Universite,la,las,les,na,nella,per,po,si,sue,sur,ta,tes,und,van,voor,zu,zum,zur" * +} + +FUNCTION {upercase.first.letters}{ + 't := + "" 's := + #1 'int := + #1 'count := + list.string 'v := + "" 'b := + title.lowerwords 'list.string := + + t text.length$ 'slen := + + {count slen = not } + {t int #1 substring$ " " = + { + int #1 - 'int := + t #1 int substring$ 'b := + + % if word not in title.lowerwords - uppercase first letter + b is.in.list not + { b "l" change.case$ b = + { b "u" change.case$ "t" change.case$ 'b := } + 'skip$ + if$ + } + 'skip$ + if$ + + int #1 + 'int := + + s b " " * * 's := + int #1 + 'int := + t int global.max$ substring$ 't := + #0 'int := + } + 'skip$ + if$ + int #1 + 'int := + count #1 + 'count := +% "count=" count int.to.str$ * " slen=" * slen int.to.str$ * top$ + } + while$ + v 'list.string := + % last word is "t" and need to check it too + s t + t "l" change.case$ t = + { "u" change.case$ "t" change.case$ } + 'skip$ + if$ + * +} + + +FUNCTION {format.title} +{ title empty$ + { "" } + { title + "article" type$ = + type$ "techreport" = + type$ "inbook" = + type$ "inproceedings" = + type$ "incollection" = + type$ "phdthesis" = + type$ "mastersthesis" = + or or or or or or + {"t" change.case$} + { type$ "unpublished" = + type$ "misc" = + or + 'skip$ + 'upercase.first.letters + if$ + } + if$ + } + if$ +} + + +FUNCTION {note.presented} +{ note #1 #9 substring$ "presented" = + note #1 #9 substring$ "Presented" = + or +} + +FUNCTION {n.filter} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "," = + t #1 #1 substring$ "\" = + t #1 #1 substring$ "~" = + or or + { "" * + t #2 global.max$ substring$ 't := + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {byear} +{ duplicate$ empty$ + { pop$ "" } + { 't := + t text.length$ 'sk := + #5 sk = + { t #1 #4 substring$ 's := + t #5 #1 substring$ 'longest.label := + longest.label is.num not + {s "year" make.tag + "nameyear" is.in.list + {longest.label * } + 'skip$ + if$ + } + {t "year" make.tag } + if$ + } + { t "year" make.tag + "nameyear" is.in.list + {extra.label *} + 'skip$ + if$ + } + if$ + } + if$ +} + +FUNCTION {format.date} +{ year empty$ + { "" } + { year byear } + if$ +} + +FUNCTION {parens} +{ "(" swap$ * ")" * } + +FUNCTION {format.date.parens} +{ year empty$ + { "" } + { year byear parens } + if$ +} + +FUNCTION {noparens} +{ " " swap$ * "" * } + +FUNCTION {format.softmiscdate} +{ year empty$ + { "" } + { year byear parens } + if$ +} + +FUNCTION {format.month}{ + month empty$ + {""} + {month sort.format.month "confdate" make.tag} + if$ +} + +FUNCTION {formatpatent.date} +{ year empty$ + 'skip$ + { month empty$ + { year } + {format.month " " * year *} + if$ + } + if$ +} + +FUNCTION {month.year.date} +{ year empty$ + {""} + { month empty$ + {year byear} + { format.month " " * year byear * } + if$ + type$ "inproceedings" = + 'skip$ + {"(" swap$ * ")" * } + if$ + } + if$ +} + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} +FUNCTION {format.volume} +{ volume empty$ + { "book" type$ = + {number empty$ + {""} + {"vol. " number "seriesno" make.tag *} + if$ + } + {""} + if$ + } + {"vol. " volume "seriesno" make.tag *} + if$ +} +FUNCTION {format.volume2} +{ volume empty$ + {""} + {"vol. " volume "seriesno" make.tag *} + if$ +} + +FUNCTION {format.art.vol} +{ + volume empty$ + {""} + {volume n.filter "volume" make.tag} + if$ + number empty$ + 'skip$ + { "(" number "issue" make.tag * ")" * * } + if$ +} + +FUNCTION {format.series} +{ series empty$ + 'skip$ + {series "sertitle" make.tag} + if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { "" 'v := + "" 'l := + "" 'f := + edition "l" change.case$ 's := + "1" s = + "first" s = + or + { + "1" 'v := + "st" 'l := + } + { + "2" s = + "second" s = + or + { + "2" 'v := + "nd" 'l := + } + { + "3" s = + "third" s = + or + { + "3" 'v := + "rd" 'l := + } + { + "4" s = + "fourth" s = + or + { + "4" 'v := + "th" 'l := + } + { + "5" s = + "fifth" s = + or + { + "5" 'v := + "th" 'l := + } + { + "6" s = + "sixth" s = + or + { + "6" 'v := + "th" 'l := + } + { + "7" s = + "seventh" s = + or + { + "7" 'v := + "th" 'l := + } + { + "8" s = + "eighth" s = + or + { + "8" 'v := + "th" 'l := + } + { + "9" s = + "nineth" s = + or + { + "9" 'v := + "th" 'l := + } + { + edition "t" change.case$ 'f := + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + #0 bother = + { f "" = + { v l * 'f :=} + 'skip$ + if$ + } + { f "" = + { "\bedition{" v * "}" * l * 'f :=} + { "\bedition{" f * "}" * 'f :=} + if$ + } + if$ + f " edn." * + } + if$ +} +FUNCTION {format.isbn} +{ isbn empty$ + { "" } + { isbn "isbn" make.tag} + if$ +} + +INTEGERS {default.info} + + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + "" 'l := + + {t empty$ not} + { t #1 #1 substring$ 's := + + s is.num not + { "" l = not + {t find.integer + {#1 'multiresult := } + {#0 'multiresult := } + if$ + "" 't := + } + { + t #2 global.max$ substring$ 't := + } + if$ + } + { l s * 'l := + t #2 global.max$ substring$ 't := + } + if$ + } + while$ + multiresult +} +FUNCTION {clearpage} +{ 't := + "" 's := + "" 'l := + + { t empty$ not } + { + t #1 #1 substring$ 's := + s is.num not + 'skip$ + { l s * 'l := } + if$ + t #2 global.max$ substring$ 't := + } + while$ + l + +} +FUNCTION {do.pages} +{'t := + "" 'j := + "" 'v := + {t empty$ not} + { t #1 #1 substring$ 's := + s is.num not + s "," = not + and + { "" j = + { + t #2 global.max$ substring$ 't := + } + {t find.integer + { t clearpage 'v := } + 'skip$ + if$ + "" 't := + } + if$ + } + { j s * 'j := + t #2 global.max$ substring$ 't := + } + if$ + } + while$ + j clearpage 'j := + j "fpage" make.tag + "cnd" is.in.list + 'skip$ + {"--" * v "lpage" make.tag *} + if$ +} + + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages multi.page.check + {type$ "article" = + {""} + {"cnd" is.in.list + {"p. "} + {"pp. "} + if$ + } + if$ + pages do.pages * + } + {type$ "article" = + {""} + {"p. "} + if$ + pages clearpage "fpage" make.tag * + } + + if$ + } + if$ +} + +FUNCTION {replace.tilde} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "~" = + { { t #1 #1 substring$ "~" = } + { "\texttildelow " * + t #2 global.max$ substring$ 't := + } + while$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + + +FUNCTION {format.url} +{ url empty$ + 'skip$ + { type$ "article" = + 'skip$ + { #0 bother = + { "\url{" } + { "\burl{" } + if$ + url replace.tilde * "}" * + output + } + if$ + + urldate empty$ + 'skip$ + { "Accessed " urldate * output } + if$ + } + if$ +} + + +FUNCTION {publisher.month.pages}{ + publisher empty$ series empty$ and + { address empty$ + 'skip$ + 'new.sentence + if$ + format.pub.address + + pages empty$ + 'skip$ + {insert.comma} + if$ + format.pages output + + } + { + pages empty$ + 'skip$ + {insert.comma} + if$ + format.pages output + publisher empty$ + 'skip$ + {new.sentence} + if$ + format.pub.address + } + if$ +} + +function{process.doi}{ + doi 't := + "" 'b := + #1 'int := +% "doi =" t * top$ + + t text.length$ 'slen := + + {int slen = not } + {t int #3 substring$ "10." = + { + t int #1 - #1 substring$ 'b := + b "" = + {"a" 'b :=} % if b is empty need to set a letter + 'skip$ + if$ + + b is.num not + { + t int slen int - #1 + substring$ 't := + slen #1 - 'int := + } + 'skip$ + if$ + + } + 'skip$ + if$ + int #1 + 'int := + } + while$ + t +} + +FUNCTION {format.doi} +{ doi empty$ + {""} + { + "nodoi" is.in.list + {""} + %%{"doi:\doiurl{" process.doi * "}" * } + {"\doiurl{" process.doi * "} " * } + if$ + } + if$ +} + +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + {#1 bother = + "cnd" is.in.list not + and + { editor empty$ + 'skip$ + { "In: " output write$ format.editors } + if$ + } + 'skip$ + if$ + } + { editor empty$ + { "In: " booktitle upercase.first.letters "btitle" make.tag * output} + { "In: " output write$ format.editors "" %%% pushing empty string to the empty stack + booktitle upercase.first.letters "btitle" make.tag output + } + if$ + } + + if$ +} + +FUNCTION {format.in.ed} +{ title empty$ + 'skip$ + { editor empty$ + { title "btitle" make.tag output} + { author empty$ + { format.editors + stupid.colon + %format.date output + title "btitle" make.tag output + } + { "In: " output write$ format.editors "" %%% pushing empty string to the empty stack + title "btitle" make.tag output + } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { "Technical Report" } + 'type + if$ + number empty$ + { "t" change.case$ } + { number tie.or.space.connect } + if$ +} + +FUNCTION {patent.number} +{ number empty$ + 'skip$ + { number } + if$ +} +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + +FUNCTION {format.inpres} +{ "l" change.case$ 't := + "in press: " #10 + "in press. " #10 + "in press " #9 t chop.word + chop.word + chop.word + #1 global.max$ substring$ +} + +FUNCTION {bcomment.note} +{ note empty$ + 'skip$ + {note format.inpres "comment" make.tag output} + if$ +} + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.chapter.and.note} +{ note empty$ chapter empty$ organization empty$ and and + 'skip$ + { chapter empty$ + "notnumber" last.label = + or + {organization empty$ + { note "comment" make.tag output } + { note empty$ + { organization "comment" make.tag output } + { organization ". " * note * "comment" make.tag output } + if$ + } + if$ + } + { note empty$ + { "Chap. " chapter * "comment" make.tag output} + { type empty$ + { "Chap. " } + { type "t" change.case$ "Section" = + { "Sect. " } + { "Chap. " } + if$ + } + if$ + chapter * ". " * note * "comment" make.tag output + } + if$ + } + if$ + } + if$ +} + +FUNCTION {item.end} +{ chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + { new.sentence + format.doi output + } + 'skip$ + if$ + + type$ "unpublished" = + type$ "misc" = + or + { note empty$ + 'skip$ + {note.presented + 'skip$ + {new.sentence note output} + if$ + } + if$ + format.date.parens output + } + { new.sentence + type$ "proceedings" = + { author empty$ editor empty$ and + 'bcomment.note + 'format.chapter.and.note + if$ + } + 'format.chapter.and.note + if$ + } + if$ + list.string 'v := + default.list 'list.string := + + type$ ".isbn" * is.in.list + "cnd" is.in.list + or + { + new.sentence +% format.isbn output + } + 'skip$ + if$ + new.sentence + %% commented by SPi as we are using format.eprint %% + %% and also to avoide eprint being printed twice - Start %% + %%eprint empty$ + %% 'skip$ + %% {"\arxivurl{" eprint * "}" * output} + %%if$ + %% End %% + chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + 'skip$ + { new.sentence + format.doi output + } + if$ + new.sentence + format.url + v 'list.string := + fin.entry +} + +FUNCTION {article.item.end} +{ chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + { new.sentence +% format.doi output + } + 'skip$ + if$ + + type$ "unpublished" = + type$ "misc" = + or + { note empty$ + 'skip$ + {note.presented + 'skip$ + {new.sentence note output} + if$ + } + if$ + format.date.parens output + } + { new.sentence + type$ "proceedings" = + { author empty$ editor empty$ and + 'bcomment.note + 'format.chapter.and.note + if$ + } + 'format.chapter.and.note + if$ + } + if$ + list.string 'v := + default.list 'list.string := + + type$ ".isbn" * is.in.list + "cnd" is.in.list + or + { + new.sentence +% format.isbn output + } + 'skip$ + if$ + new.sentence + %% commented by SPi as we are using format.eprint %% + %% and also to avoide eprint being printed twice - Start %% + %%eprint empty$ + %% 'skip$ + %% {"\arxivurl{" eprint * "}" * output} + %%if$ + %% End %% + chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + 'skip$ + { new.sentence +%% format.doi output + } + if$ + new.sentence + format.url + v 'list.string := + fin.entry +} + + +FUNCTION {insert.element} +{ #0 bother = + { element "{botherref}" * write$ newline$} + { + type$ "article" = + {element "{barticle}" * write$ newline$} + 'skip$ + if$ + type$ "book" = + type$ "proceedings" = + type$ "manual" = + type$ "booklet" = + or or or + {element "{bbook}" * write$ newline$} + 'skip$ + if$ + + type$ "inbook" = + { "notnumber" last.label = + {element "{bchapter}" * write$ newline$} + {element "{bbook}" * write$ newline$} + if$ + } + 'skip$ + if$ + + type$ "incollection" = + type$ "inproceedings" = + type$ "conference" = + or or + {element "{bchapter}" * write$ newline$} + 'skip$ + if$ + } + if$ +} + +FUNCTION {end.element} +{ "\end" 'element := + item.end + insert.element + "\endbibitem" write$ newline$ +} + +FUNCTION {article.end.element} +{ "\end" 'element := + article.item.end + insert.element + "\endbibitem" write$ newline$ +} + + +FUNCTION {begin.element} +{ "\begin" 'element := + insert.element +} +function {set.options}{ + options empty$ + 'skip$ + {options 'list.string :=} + if$ +} + +FUNCTION {settings} +{} + +FUNCTION {article} +{ output.bibitem + author empty$ + institution empty$ + editor empty$ + and and + journal empty$ + or + year empty$ + or + % above tagging rule means: + % nead: (volume & (pages or number) ) or (doi [without volume, pages and number]) + volume empty$ not + pages empty$ not bnumber empty$ not or + and + + volume empty$ pages empty$ bnumber empty$ and and + doi empty$ not and + or + not + or + {#0 'bother :=} + {#1 'bother :=} + if$ + begin.element + author empty$ + { editor empty$ + 'skip$ + {format.editors stupid.colon} + if$ + } + { format.authors stupid.colon} + if$ + "cnd" is.in.list + { + journal empty$ + {format.title "atitle" make.tag "title" output.check} + {journal "jtitle" make.tag output} + if$ + } + { + format.title "atitle" make.tag "title" output.check + journal empty$ + 'skip$ + {new.sentence journal "jtitle" make.tag output} + if$ + } + if$ + format.art.vol output + pages empty$ + 'skip$ + {insert.comma} + if$ + format.pages output + format.date.parens output + format.doi output + format.eprint output + format.primaryClass output + article.end.element +} + + +FUNCTION {patent} +{ output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + add.period$ + patent.number output + insert.comma + formatpatent.date output + end.element +} + +FUNCTION { other } { patent } + +FUNCTION {book} +{ output.bibitem + author empty$ + institution empty$ + organization empty$ + editor empty$ + and and and + title empty$ + year empty$ + or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + begin.element + author empty$ + { editor empty$ + 'skip$ + {format.editors stupid.colon} + if$ + } + { format.authors stupid.colon} + if$ + format.title "btitle" make.tag "title" output.check + series empty$ + { + format.volume output + insert.comma + format.edition output + } + { edition empty$ + 'skip$ + 'insert.comma + if$ + format.edition output + new.sentence + format.series output + insert.comma + format.volume output + } + if$ + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {booklet} +{output.bibitem + author empty$ + title empty$ + year empty$ + howpublished empty$ + or or or + {#0 'bother :=} + {#1 'bother :=} + if$ + + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "btitle" make.tag "title" output.check + address empty$ publisher empty$ howpublished empty$ and and + 'skip$ + 'new.sentence + if$ + format.pub.address + format.date.parens output + end.element +} + +FUNCTION {misc} +{output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "btitle" make.tag "title" output.check + address empty$ publisher empty$ howpublished empty$ and and + 'skip$ + 'new.sentence + if$ + format.pub.address + end.element +} + +FUNCTION {softmisc} +{output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors} + if$ + stupid.colon + format.title "btitle" make.tag "title" output.check + insert.comma + version output + insert.comma + %%address empty$ publisher empty$ howpublished empty$ and and + %%'skip$ + %% 'new.sentence + %%if$ + format.pub.address + format.softmiscdate output + insert.comma + format.softmisc.eprint output + end.element +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + institution empty$ + organization empty$ + editor empty$ + and and and + title empty$ + year empty$ + or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + + chapter empty$ + { "" 'last.label :=} + { chapter string.to.integer empty$ author empty$ not and + { "notnumber" 'last.label :=} + { "" 'last.label :=} + if$ + } + if$ + + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + "notnumber" last.label = + { chapter "ctitle" make.tag output + add.period$ + } + 'skip$ + if$ + format.in.ed + series empty$ + { + insert.comma + format.volume output + insert.comma + format.edition output + new.sentence + } + { + insert.comma + format.edition output + new.sentence + format.series output + volume empty$ + 'skip$ + 'insert.comma + if$ + format.volume output + } + if$ + publisher.month.pages + publisher empty$ address empty$ edition empty$ series empty$ pages empty$ volume empty$ and and and and and + 'insert.comma + 'skip$ + if$ + format.date.parens output + end.element +} +FUNCTION {incollection} +{ output.bibitem + author empty$ + institution empty$ + and + booktitle empty$ + title empty$ + year empty$ + or or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + + "cnd" is.in.list + { + booktitle empty$ title empty$ not and + { + format.title "ctitle" make.tag "title" output.check + new.sentence + } + 'skip$ + if$ + } + { + format.title "ctitle" make.tag "title" output.check + title empty$ + 'skip$ + {new.sentence} + if$ + } + if$ + format.in.ed.booktitle + series empty$ + { + format.volume output + insert.comma + format.edition output + } + { + edition empty$ + 'skip$ + { insert.comma + format.edition output + } + if$ + new.sentence + format.series output + insert.comma + format.volume output + } + if$ + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {inproceedings} +{ output.bibitem + author empty$ + institution empty$ + and + title empty$ + year empty$ + or or + {#0 'bother :=} + {#1 'bother :=} + if$ + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + + "cnd" is.in.list + { + booktitle empty$ title empty$ not and + { + format.title "ctitle" make.tag "title" output.check + new.sentence + } + 'skip$ + if$ + } + { + format.title "ctitle" make.tag "title" output.check + title empty$ booktitle empty$ not and + 'skip$ + {new.sentence} + if$ + } + if$ + + format.in.ed.booktitle + series empty$ + 'skip$ + {new.sentence format.series output} + if$ + volume empty$ address empty$ publisher empty$ and and + 'skip$ + 'insert.comma + if$ + format.volume output + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ output.bibitem + author empty$ + organization empty$ + title empty$ + year empty$ + address empty$ + or or or or + {#0 'bother :=} + {#1 'bother :=} + if$ + begin.element + + author empty$ + { organization empty$ + 'skip$ + { organization "publisher" make.tag output.nonnull + stupid.colon% add.period$ + } + if$ + } + { format.authors stupid.colon} + if$ + title empty$ + 'skip$ + {format.title "btitle" make.tag output} + if$ + edition empty$ + {new.sentence} + {insert.comma} + if$ + format.edition output + edition empty$ + 'skip$ + {new.sentence} + if$ + author empty$ organization empty$ + or + 'skip$ + { organization "publisher" make.tag output.nonnull + insert.comma + } + if$ + address empty$ + 'skip$ + {address "location" make.tag output} + if$ + format.date.parens output + end.element +} + + +FUNCTION {phdthesis} +{output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + new.sentence + type$ "mastersthesis" = + {"Master's thesis" format.thesis.type output.nonnull} + {"PhD thesis" format.thesis.type output.nonnull} + if$ + school empty$ + 'skip$ + 'insert.comma + if$ + school "school" output.check + address empty$ + 'skip$ + 'insert.comma + if$ + address output + month.year.date output + end.element +} +FUNCTION {mastersthesis}{phdthesis} + + +FUNCTION {proceedings} +{ output.bibitem + author empty$ + institution empty$ + organization empty$ + editor empty$ + and and and + title empty$ + year empty$ + or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + + begin.element + author empty$ + { editor empty$ + {organization "institutionaled" make.tag "organization" output.check } + { format.editors } + if$ + } + { format.authors } + if$ + stupid.colon + format.title "btitle" make.tag output + series empty$ + 'skip$ + {new.sentence format.series output} + if$ + volume empty$ + 'skip$ + 'insert.comma + if$ + format.volume output + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {techreport} +{ output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + new.sentence + format.tr.number output.nonnull + institution empty$ + 'skip$ + 'insert.comma + if$ + institution "institution" output.check + address empty$ + 'skip$ + 'insert.comma + if$ + address output + month.year.date output + end.element +} + +FUNCTION {unpublished} +{ output.bibitem + #0 'bother := + + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + note empty$ + 'skip$ + { note.presented + {note output} + 'skip$ + if$ + } + if$ + end.element +} + +FUNCTION {default.type} { unpublished } + +MACRO {jan} {"January"} +MACRO {feb} {"February"} +MACRO {mar} {"March"} +MACRO {apr} {"April"} +MACRO {may} {"May"} +MACRO {jun} {"June"} +MACRO {jul} {"July"} +MACRO {aug} {"August"} +MACRO {sep} {"September"} +MACRO {oct} {"October"} +MACRO {nov} {"November"} +MACRO {dec} {"December"} + +READ + +EXECUTE {identify.mathphys.version} + +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} + +INTEGERS { et.al.char.used } + +FUNCTION {initialize.et.al.char.used} +{ #0 'et.al.char.used := +} + +%%%%% setting default options +FUNCTION {set.default.opt} +{"unsort" 'list.string :=} +%%{"alpha" 'list.string :=} + +EXECUTE {set.default.opt} + +FUNCTION {assign.opt}{ + % First need to set options + "settings" type$ = + { options empty$ + 'skip$ + {options 'list.string :=} + if$ + } + 'skip$ + if$ +} + +ITERATE {assign.opt} +EXECUTE {initialize.et.al.char.used} + +FUNCTION {alpha.format.lab.names} +{ 's := + s num.names$ 'numnames := + numnames #1 > + { numnames #4 > + { #3 'namesleft := } + { numnames 'namesleft := } + if$ + #1 'nameptr := + "" + { namesleft #0 > } + { nameptr numnames = + { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { "+" * + #1 'et.al.char.used := + } + { s nameptr "{v{}}{l{}}" format.name$ * } + if$ + } + { s nameptr "{v{}}{l{}}" format.name$ * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + numnames #4 > + { "+" * + #1 'et.al.char.used := + } + 'skip$ + if$ + } + { s #1 "{v{}}{l{}}" format.name$ + duplicate$ text.length$ #2 < + { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ } + 'skip$ + if$ + } + if$ +} + +FUNCTION {standard.format.lab.names} +{ 's := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ " et~al." * } + { #2 < + 'skip$ + { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { " et~al." * } + { " and " * s #2 "{vv~}{ll}" format.name$ * } + if$ + } + if$ + } + if$ +} +FUNCTION {format.lab.names}{ + "alpha" is.in.list + 'alpha.format.lab.names + 'standard.format.lab.names + if$ +} + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + { key #3 text.prefix$ } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { "zzz" } + { key #3 text.prefix$ } + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.key.organization.label} +{ author empty$ + { key empty$ + { organization empty$ + { "zzz" } + { "The " #4 organization chop.word #3 text.prefix$ } + if$ + } + { key #3 text.prefix$ } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.organization.label} +{ editor empty$ + { key empty$ + { organization empty$ + { "zzz" } + { "The " #4 organization chop.word #3 text.prefix$ } + if$ + } + { key #3 text.prefix$ } + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.short.authors} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.organization.label + { type$ "manual" = + 'author.key.organization.label + 'author.key.label + if$ + } + if$ + } + if$ + 'short.list := +} + +FUNCTION {calc.label} +{ calc.short.authors + short.list + + "alpha" is.in.list + { + duplicate$ + year field.or.null purify$ #-1 #2 substring$ + * + 'label := + year field.or.null purify$ #-1 #4 substring$ + * + sortify 'sort.label := + } + { + "(" + * + year duplicate$ empty$ + short.list key field.or.null = or + { pop$ "" } + 'skip$ + if$ + * + 'label := + label 'sort.label := + } + if$ +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { nameptr #1 > + { " " * + "alpha" is.in.list + 'skip$ + {numnames int.to.str$ * " " *} + if$ + } + 'skip$ + if$ + s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := + nameptr numnames = + t "others" = + and + { "et al" * } + { t sortify * } + if$ + #3 numnames < + "alpha" is.in.list not + and + {#0 'namesleft := + " zzz " * + } + { + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + if$ + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "zzz" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "z" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "z" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "z" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION {presort} +{ calc.label + sort.label sortify + " " + * + type$ "book" = + type$ "inbook" = + or + {author empty$ + 'editor.organization.sort + 'author.organization.sort + if$ + } + { type$ "proceedings" = + type$ "incollection" = + or + {author empty$ + 'editor.organization.sort + 'author.organization.sort + if$ + } + { type$ "manual" = + 'author.organization.sort + 'author.sort + if$ + } + if$ + } + if$ + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ 'sort.label := + sort.label * + #1 entry.max$ substring$ 'sort.key$ := + + "settings" type$ = + {"aaa"} + {"unsort" is.in.list + {"bb"} + {"alpha" is.in.list + {sort.key$} + {sort.label} + if$ + } + if$ + } + if$ + 'sort.key$ := +} + + +ITERATE {presort} + +SORT + +INTEGERS { longest.label.width last.extra.num number.label } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #0 int.to.chr$ 'last.label := + "" 'j := + #0 'longest.label.width := + #0 'last.extra.num := + #0 'number.label := +} + +FUNCTION {forward.pass} +{ last.label label = + { last.extra.num #1 + 'last.extra.num := + last.extra.num int.to.chr$ 'extra.label := + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + label 'last.label := + } + if$ + number.label #1 + 'number.label := +} + +FUNCTION {reverse.pass} +{ j "b" = + { "a" 'extra.label := } + 'skip$ + if$ + extra.label 'j := + label extra.label * 'label := +} + +EXECUTE {initialize.longest.label} + +ITERATE {forward.pass} + +REVERSE {reverse.pass} + +FUNCTION {write.preambule} +{ "%% BioMed_Central_Bib_Style_v1.01" write$ newline$ newline$ + "\begin{thebibliography}{" number.label int.to.str$ * "}" * write$ newline$ + "% BibTex style file: bmc-mathphys.bst (version 2.1), 2014-07-24" write$ newline$ + "\ifx \bisbn \undefined \def \bisbn #1{ISBN #1}\fi" write$ newline$ + "\ifx \binits \undefined \def \binits#1{#1}\fi" write$ newline$ + "\ifx \bauthor \undefined \def \bauthor#1{#1}\fi" write$ newline$ + "\ifx \batitle \undefined \def \batitle#1{#1}\fi" write$ newline$ + "\ifx \bjtitle \undefined \def \bjtitle#1{#1}\fi" write$ newline$ + "\ifx \bvolume \undefined \def \bvolume#1{\textbf{#1}}\fi" write$ newline$ + "\ifx \byear \undefined \def \byear#1{#1}\fi" write$ newline$ + "\ifx \bissue \undefined \def \bissue#1{#1}\fi" write$ newline$ + "\ifx \bfpage \undefined \def \bfpage#1{#1}\fi" write$ newline$ + "\ifx \blpage \undefined \def \blpage #1{#1}\fi" write$ newline$ + "\ifx \burl \undefined \def \burl#1{\textsf{#1}}\fi" write$ newline$ + %%"\ifx \doiurl \undefined \def \doiurl#1{\textsf{#1}}\fi" write$ newline$ + "\ifx \doiurl \undefined \def \doiurl#1{\url{https://doi.org/#1}}\fi" write$ newline$ + "\ifx \betal \undefined \def \betal{\textit{et al.}}\fi" write$ newline$ + "\ifx \binstitute \undefined \def \binstitute#1{#1}\fi" write$ newline$ + "\ifx \binstitutionaled \undefined \def \binstitutionaled#1{#1}\fi" write$ newline$ + "\ifx \bctitle \undefined \def \bctitle#1{#1}\fi" write$ newline$ + "\ifx \beditor \undefined \def \beditor#1{#1}\fi" write$ newline$ + "\ifx \bpublisher \undefined \def \bpublisher#1{#1}\fi" write$ newline$ + "\ifx \bbtitle \undefined \def \bbtitle#1{#1}\fi" write$ newline$ + "\ifx \bedition \undefined \def \bedition#1{#1}\fi" write$ newline$ + "\ifx \bseriesno \undefined \def \bseriesno#1{#1}\fi" write$ newline$ + "\ifx \blocation \undefined \def \blocation#1{#1}\fi" write$ newline$ + "\ifx \bsertitle \undefined \def \bsertitle#1{#1}\fi" write$ newline$ + "\ifx \bsnm \undefined \def \bsnm#1{#1}\fi" write$ newline$ + "\ifx \bsuffix \undefined \def \bsuffix#1{#1}\fi" write$ newline$ + "\ifx \bparticle \undefined \def \bparticle#1{#1}\fi" write$ newline$ + "\ifx \barticle \undefined \def \barticle#1{#1}\fi" write$ newline$ + "\bibcommenthead" write$ newline$ +} + + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + write.preambule + "\ifx \bconfdate \undefined \def \bconfdate #1{#1}\fi" write$ newline$ + "\ifx \botherref \undefined \def \botherref #1{#1}\fi" write$ newline$ + "\ifx \url \undefined \def \url#1{\textsf{#1}}\fi" write$ newline$ + "\ifx \bchapter \undefined \def \bchapter#1{#1}\fi" write$ newline$ + "\ifx \bbook \undefined \def \bbook#1{#1}\fi" write$ newline$ + "\ifx \bcomment \undefined \def \bcomment#1{#1}\fi" write$ newline$ + "\ifx \oauthor \undefined \def \oauthor#1{#1}\fi" write$ newline$ + "\ifx \citeauthoryear \undefined \def \citeauthoryear#1{#1}\fi" write$ newline$ + "\ifx \endbibitem \undefined \def \endbibitem {}\fi" write$ newline$ + "\ifx \bconflocation \undefined \def \bconflocation#1{#1}\fi" write$ newline$ + "\ifx \arxivurl \undefined \def \arxivurl#1{\textsf{#1}}\fi" write$ newline$ + "\csname PreBibitemsHook\endcsname" write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} + + +%% XML output - done for each entry referenced in the BibTeX database +INTEGERS {i ll li j.int global.counter} +STRINGS {lr lp lt ls } + +FUNCTION {replace} +{ + 'lr := % replace string + 'lp := % pattern + 'lt := % text to search + "" 'ls := % result string + lp text.length$ 'll := % length of the search pattern + { lt empty$ not } + { lt #1 ll substring$ lp = + { ls lr * 'ls := + lt ll #1 + global.max$ substring$ 'lt := } + { ls lt #1 #1 substring$ * 'ls := + lt #2 global.max$ substring$ 'lt := } + if$ + } + while$ + ls +} + +FUNCTION {strip.letters} +{ + "" 's := + duplicate$ missing$ + 'pop$ + { + 't := + { t "" = not } + { % ascii '0' = 48, '9' = 57 + t #1 #1 substring$ chr.to.int$ 'i := + i #47 > i #58 < and + { s t #1 #1 substring$ * 's := } + 'skip$ + if$ + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + s +} +FUNCTION {output.xml} +{ duplicate$ "" = + 'pop$ + { " " swap$ * write$ newline$ } + if$ +} + +%% + % markup.xml + % + % Takes 2 args text & tag {"the text " "tag"} + % Returns 1 string {"the text <\tag>"} +%% +FUNCTION {markup.xml} +{ + "" 'v := % result + 't := % tag + duplicate$ missing$ + 'pop$ + { 'v := } + if$ + v "" = + 'skip$ + { "<" t * ">" * v * "" * 'v := } + if$ + v +} + +%% Takes 2 args - tag, string +FUNCTION{markup.xml.title} +{ pop$ % tag + duplicate$ missing$ + 'pop$ + { + 's := % string + s "\&" "&" replace 's := + s "p" markup.xml 's := + s "title" markup.xml output.xml + } + if$ +} + + +%% + % markup.xml.pages + % + % Takes 1 arg (pages string) + % seperates into and if + % there is a - seperator. else no lpage. + % + % need to remove others +%% +FUNCTION{markup.xml.pages} +{ + "" 'v := % fpage + "" 's := % lpage + duplicate$ missing$ + 'pop$ + { + 't := + t " " "" replace 't := % remove all spaces. pgs must be - seperated + { t empty$ not } + { + t #1 #1 substring$ "-" = + { + t #2 global.max$ substring$ 's := + "" 't := % break while loop + }{ + v t #1 #1 substring$ * 'v := + t #2 global.max$ substring$ 't := + } + if$ + } + while$ + } + if$ + v "fpage" markup.xml output.xml + s "lpage" markup.xml output.xml +} + + +%% + % markup.xml.names + % + % Takes 2 args + % tag, namefield (eg. author "au") + % splits fields into and + % writes info + % returns nothing +%% +FUNCTION {markup.xml.names} +{ + 't := % tag + "" 'v := + "" 's := + duplicate$ empty$ + { pop$ + organization missing$ + { institution "cnm" markup.xml + "au" markup.xml "aug" markup.xml output.xml } + { organization "cnm" markup.xml + "au" markup.xml "aug" markup.xml output.xml } + if$ } + { + " " write$ newline$ + 'temp.str := % names string + temp.str num.names$ 'j.int := % num of names + #1 'i := % init counter + { i #1 j.int + < } % while (i <= j.int) + { + " " write$ + + % Initial first names + % if first name all in capitals + % - assume is initial list of first names. + temp.str i "{ff{ }}" format.name$ + duplicate$ "u" change.case$ = + { temp.str i "{ff{ }}" format.name$ } + { temp.str i "{f{}}" format.name$ } + if$ + + % if last name but no first name use cnm; else snm + duplicate$ "" = + { temp.str i "{ll{ }}" format.name$ % last names space seperated. + "cnm" markup.xml write$ } + { temp.str i "{ll{ }}" format.name$ % last names space seperated. + "snm" markup.xml write$ } + if$ + + "fnm" markup.xml write$ + + "" write$ newline$ + i #1 + 'i := + } + while$ + " " write$ newline$ + } + if$ +} + + +%% + % markup.xml.pub + % + % Takes 4 args (school address publisher tag) + % prints concatenation + % returns nothing +%% +FUNCTION {markup.xml.pub} +{ + 't := % Tag + "" 'v := % Publisher + "" 'l := % Address + "" 'f := % School + "" 's := % Answer + duplicate$ missing$ 'pop$ { 'v := } if$ + duplicate$ missing$ 'pop$ { 'l := } if$ + duplicate$ missing$ 'pop$ { 'f := } if$ + "" f = not % school not empty + { f 's := } % return school as publisher + { % else + "" v = "" l = and % address and pub empty + 'skip$ + { + "" l = + { v 's := } % return pub + { "" v = + { l 's := } % return add + { l ": " * v * 's := } % return add : pub + if$ + } + if$ + } + if$ + } + if$ + s t markup.xml output.xml +} + +%% + % xml.phd + % + % Takes nothing + % Returns type (phd/msc) of empty string +%% +FUNCTION {xml.phd} +{ + "phdthesis" type$ = + "mastersthesis" type$ = or + { "phdthesis" type$ = + { "PhD thesis" } + { "Master's thesis" } + if$ + } + { type } % usually empty + if$ +} + +% markup.xml.edition +% +% edition is a numeric value. ie "2" +% if format 2nd 1st etc.. strip letters. +% +FUNCTION {markup.xml.edition} +{ pop$ pop$ %clear stack + edition strip.letters duplicate$ "" = + { pop$ edition } + 'skip$ + if$ + "edition" markup.xml output.xml +} + + +FUNCTION{begin.bmcxmlcomment}{ + newline$ + "\newcommand{\BMCxmlcomment}[1]{}" write$ newline$ + newline$ + "\BMCxmlcomment{" write$ newline$ + newline$ "" write$ newline$ +} + +FUNCTION{end.bmcxmlcomment}{ + newline$ + "" write$ newline$ + "} % end of \BMCxmlcomment" write$ newline$ +} + +FUNCTION {export.xml}{ + newline$ + global.counter #1 + 'global.counter := + "" * + write$ newline$ +% title "\&" "&" replace "title" markup.xml.title + title "title" markup.xml.title + author "aug" markup.xml.names % org. and inst. here + howpublished missing$ + { booktitle missing$ + { journal missing$ + { xml.phd } % Phd/Msc + {journal} + if$ + } {booktitle} + if$ + } { howpublished } + if$ "source" markup.xml output.xml + school + address + publisher "publisher" markup.xml.pub + editor "editor" markup.xml output.xml + edition "edition" markup.xml.edition + series "p" markup.xml + "title" markup.xml + "series" markup.xml output.xml + chapter "p" markup.xml + "title" markup.xml + "section" markup.xml output.xml + % month % ignore + year "pubdate" markup.xml output.xml + + note missing$ + { volume "volume" markup.xml output.xml + number "issue" markup.xml output.xml + pages markup.xml.pages + url "url" markup.xml output.xml } + { note "l" change.case$ "in press" = + { " " write$ newline$ } + { volume "volume" markup.xml output.xml + number "issue" markup.xml output.xml + pages markup.xml.pages + url "url" markup.xml output.xml + note "note" markup.xml output.xml + } + if$ + } + if$ + "" write$ newline$ +} + +%%EXECUTE {begin.bmcxmlcomment} +%%ITERATE {export.xml} +%%EXECUTE {end.bmcxmlcomment} + +%% End of file `sn-mathphys-num.bst'. + + + + From b17798ba9b4b5c8017284c1c0a57d909b978bded Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Wed, 4 Feb 2026 20:04:50 +0800 Subject: [PATCH 24/31] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sn-article-template/bst/sn-apacite.bst | 5332 +++++++++++++++++ .../sn-article-template/bst/sn-aps.bst | 1531 +++++ .../sn-article-template/bst/sn-basic.bst | 1818 ++++++ .../sn-article-template/bst/sn-chicago.bst | 1683 ++++++ .../bst/sn-mathphys-ay.bst | 3208 ++++++++++ .../bst/sn-mathphys-num.bst | 3211 ++++++++++ .../sn-article-template/bst/sn-nature.bst | 1724 ++++++ .../bst/sn-vancouver-ay.bst | 2085 +++++++ .../bst/sn-vancouver-num.bst | 2021 +++++++ .../sn-article-template/empty.eps | 80 + waypoint_control/sn-article-template/fig.eps | 1456 +++++ .../sn-article-template/sn-article.aux | 39 + .../sn-article-template/sn-article.bbl | 59 + .../sn-article-template/sn-article.blg | 69 + .../sn-article-template/sn-article.log | 734 +++ .../sn-article-template/sn-article.out | 13 + .../sn-article-template/sn-article.pdf | Bin 0 -> 140574 bytes .../sn-article-template/sn-article.synctex.gz | Bin 0 -> 8486 bytes .../sn-article.tex} | 0 .../sn-article-template/sn-bibliography.bib | 164 + .../sn-article-template/sn-jnl.cls | 1 + .../sn-article-template/sn-mathphys-num.bst | 3211 ++++++++++ .../sn-article-template/user-manual.pdf | Bin 0 -> 418495 bytes waypoint_control/twin_paper/main.tex | 197 + waypoint_control/twin_paper/sn-article.tex | 197 + 25 files changed, 28833 insertions(+) create mode 100644 waypoint_control/sn-article-template/bst/sn-apacite.bst create mode 100644 waypoint_control/sn-article-template/bst/sn-aps.bst create mode 100644 waypoint_control/sn-article-template/bst/sn-basic.bst create mode 100644 waypoint_control/sn-article-template/bst/sn-chicago.bst create mode 100644 waypoint_control/sn-article-template/bst/sn-mathphys-ay.bst create mode 100644 waypoint_control/sn-article-template/bst/sn-mathphys-num.bst create mode 100644 waypoint_control/sn-article-template/bst/sn-nature.bst create mode 100644 waypoint_control/sn-article-template/bst/sn-vancouver-ay.bst create mode 100644 waypoint_control/sn-article-template/bst/sn-vancouver-num.bst create mode 100644 waypoint_control/sn-article-template/empty.eps create mode 100644 waypoint_control/sn-article-template/fig.eps create mode 100644 waypoint_control/sn-article-template/sn-article.aux create mode 100644 waypoint_control/sn-article-template/sn-article.bbl create mode 100644 waypoint_control/sn-article-template/sn-article.blg create mode 100644 waypoint_control/sn-article-template/sn-article.log create mode 100644 waypoint_control/sn-article-template/sn-article.out create mode 100644 waypoint_control/sn-article-template/sn-article.pdf create mode 100644 waypoint_control/sn-article-template/sn-article.synctex.gz rename waypoint_control/{twin_paper/Human-Vehicle Twin.tex => sn-article-template/sn-article.tex} (100%) create mode 100644 waypoint_control/sn-article-template/sn-bibliography.bib create mode 100644 waypoint_control/sn-article-template/sn-jnl.cls create mode 100644 waypoint_control/sn-article-template/sn-mathphys-num.bst create mode 100644 waypoint_control/sn-article-template/user-manual.pdf create mode 100644 waypoint_control/twin_paper/main.tex create mode 100644 waypoint_control/twin_paper/sn-article.tex diff --git a/waypoint_control/sn-article-template/bst/sn-apacite.bst b/waypoint_control/sn-article-template/bst/sn-apacite.bst new file mode 100644 index 0000000..f5e1335 --- /dev/null +++ b/waypoint_control/sn-article-template/bst/sn-apacite.bst @@ -0,0 +1,5332 @@ +%% +%% This is file `sn-apacite.bst', +%% generated with the docstrip utility. +%% +%% The original source files were: apacite.dtx +%% +%% This file may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3 of this license or (at your option) any later +%% version. The latest version of this license is in: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% and version 1.3 or later is part of all distributions of +%% LaTeX version 2005/12/01 or later. + +FUNCTION {identify.apacite.version} +{ % Put identifying string in the .blg file + "sn-apacite.bst" + " [2024/07/19 v1.1 APA bibliography style]" + * top$ +} + +ENTRY + { address + annote + annotate + author + booktitle + chair + chapter + day + doi + edition + editor + englishtitle + firstkey + howpublished + institution + journal + key + keywords + lastchecked + month + nihms + note + number + organization + originaladdress + originalbooktitle + originaledition + originaleditor + originaljournal + originalnumber + originalpages + originalpublisher + originalvolume + originalyear + pages + pmcid + publisher + school + series + symposium + text + title + translator + type + url + urldate + volume + year + eprint + archive + archivePrefix + primaryClass + eid + adsurl + adsnote + version + } + { cite.order %% order of first citation + title.number %% for sorting titles + cite.initials %% dummy (0-1) indicating whether or not + %% initials of the 1st author must + %% be used for citing + cite.num.names.full %% number of names to be cited for full and + cite.num.names.short %% short cite + add.to.year %% For a, b, c, etc. after year + %% in multiple citations with same author-year + } + { year.label %% For sorting entries by year + author.year.sort.label %% For sorting entries and checking whether + %% initials should be added, how many authors + %% should be cited and whether a, b, etc. + %% after year is necessary + title.sort.label %% for sorting titles + citeorder.sort.label %% for sorting by citation order + type.2 %% Replacement for type with misc entries and + %% entries that revert to misc. + } +INTEGERS { len pos name.max old.number numnames numnames.old + nameptr lastname format.num.names cite.initials.old + cite.num.names.old add.to.year.old forward + multiresult dot brace.level + } + +STRINGS { s t u old.label field + aut1f aut1s aut1f.old aut1s.old + aut2 aut2.old + aut3 aut3.old + aut4 aut4.old + aut5 aut5.old + aut6 aut6.old + year.label.old + } +FUNCTION {test} { #0 } +FUNCTION {dump.stack} +{ "---- STACK {" cite$ * "} ----" * top$ + stack$ + "---- END STACK {" cite$ * "} ----" * top$ +} +FUNCTION {make.index} { #0 } +FUNCTION {unsorted} { #0 } +MACRO {jan} {"{\APACmonth{01}}"} +MACRO {feb} {"{\APACmonth{02}}"} +MACRO {mar} {"{\APACmonth{03}}"} +MACRO {apr} {"{\APACmonth{04}}"} +MACRO {may} {"{\APACmonth{05}}"} +MACRO {jun} {"{\APACmonth{06}}"} +MACRO {jul} {"{\APACmonth{07}}"} +MACRO {aug} {"{\APACmonth{08}}"} +MACRO {sep} {"{\APACmonth{09}}"} +MACRO {oct} {"{\APACmonth{10}}"} +MACRO {nov} {"{\APACmonth{11}}"} +MACRO {dec} {"{\APACmonth{12}}"} +MACRO {winter} {"{\APACmonth{13}}"} +MACRO {spring} {"{\APACmonth{14}}"} +MACRO {summer} {"{\APACmonth{15}}"} +MACRO {fall} {"{\APACmonth{16}}"} +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % issues warning if field is empty + % call with + % "field" field warning.if.empty + % Note that the first field must be between quotes + % because it is the fieldname for use in the warning message. + % +FUNCTION {warning.if.empty} +{ empty$ + { "No " swap$ * " in " * cite$ * warning$ } + { pop$ } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % issues warning if title, type, and howpublished are empty + % +FUNCTION {check.relevant.fields} +{ title empty$ + type empty$ and + howpublished empty$ and + { "No title, type, and howpublished in " cite$ * warning$ } + 'skip$ + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % delivers 1 if (both editor and translator + % not empty and not equal to each other) + % 0 if (editor or translator empty) or + % (editor = translator) + % +FUNCTION {editor.ne.trans} +{ translator empty$ + { #0 } + { editor empty$ + { #0 } + { translator editor = + { #0 } + { #1 } + if$ + } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {conv.int.to.str} +{ duplicate$ #10 < + { "0000" swap$ int.to.str$ * } + { duplicate$ #100 < + { "000" swap$ int.to.str$ * } + { duplicate$ #1000 < + { "00" swap$ int.to.str$ * } + { duplicate$ #10000 < + { "0" swap$ int.to.str$ * } + { int.to.str$ } + if$ + } + if$ + } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {ref.type} +{ type$ "article" = + type$ "magazine" = + type$ "newspaper" = + type$ "book" = + type$ "techreport" = + type$ "unpublished" = + type$ "misc" = + type$ "booklet" = + type$ "manual" = + type$ "proceedings" = + or + or + or + or + or + or + or + or + or + { #1 } + { type$ "incollection" = + type$ "phdthesis" = + type$ "mastersthesis" = + type$ "lecture" = + type$ "inbook" = + type$ "inproceedings" = + type$ "conference" = + type$ "intechreport" = + or + or + or + or + or + or + or + { #2 } + { type$ "literal" = + { #3 } + { #0 } + if$ + } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {is.atype} +{ type$ "article" = + type$ "magazine" = + type$ "newspaper" = + type$ "incollection" = + type$ "inbook" = + type$ "inproceedings" = + type$ "conference" = + type$ "intechreport" = + type$ "manual" = + or + or + or + or + or + or + or + or + { #1 } + { journal empty$ not + % + type$ "phdthesis" = + type$ "mastersthesis" = + or + % + and + { #1 } + { type$ "misc" = + type empty$ not and + { type "\bibmessage" = + type "\bibcomputerprogram" = + type "\bibcomputerprogrammanual" = + type "\bibcomputerprogramandmanual" = + type "\bibcomputersoftware" = + type "\bibcomputersoftwaremanual" = + type "\bibcomputersoftwareandmanual" = + type "\bibprogramminglanguage" = + or + or + or + or + or + or + or + { #1 } + { #0 } + if$ + } + { #0 } + if$ + } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % connects two strings with connect string + % if one of them empty, then connect string + % is left out + % + % call with S1 S2 connectstring connect.check + % +FUNCTION {connect.check} +{ 'u := + % + % if S2 = "" + % + duplicate$ empty$ + % + % then remove S2 + % + { pop$ + % + % S1 is on top of stack. + % if it is empty, it is replaced by the empty string "" + % + duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ + } + % + % else swap S1 and S2 so that S1 can be checked + % + { swap$ + % + % if S1 is empty, remove S1 so that S2 is left on the + % stack and is the result is given + % + duplicate$ empty$ + { pop$ } + % + % now the real work starts: + % push the connect string "C" + % so that top of stack is "C" "S1" "S2" + % concatenate, so that top of stack is + % "S1+C" "S2" + % + { u * + % + % swap and concatenate + % + swap$ * + } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % connects two strings with space ("\ ") + % if length of second is 4 or larger, + % connects them with non-breaking space ("tie", "~") + % if length of second smaller than 4 + % + % call with S1 S2 tie.or.space.connect + % result: "S1\ S2" or "S1~S2" + % +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #4 < + { "~" } + { "\ " } + if$ + swap$ * * +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % connects two strings with comma (", ") + % if one of them is empty, the comma is left out + % + % call with S1 S2 connect.with.comma.check + % result: "S1, S2" + % +FUNCTION {connect.with.comma.check} +{ ", " connect.check } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % connects two strings with semicolon ("; ") + % if one of them is empty, semicolon is left out + % + % call with S1 S2 connect.with.semicolon.check + % result: "S1; S2" + % +FUNCTION {connect.with.semicolon.check} +{ "; " connect.check } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % connects two strings with colon (": ") + % if one of them is empty, colon is left out + % + % call with S1 S2 connect.with.colon.check + % result: "S1: S2" + % +FUNCTION {connect.with.colon.check} +{ ": " connect.check } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % connects two strings with space ("\ ") + % + % call with S1 S2 connect.with.space.check + % result: "S1\ S2" + % +FUNCTION {connect.with.space.check} +{ "\ " connect.check } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % encloses string in pre- and postfix string + % call with + % prefix postfix S enclose.check + % delivers empty string if S empty + % +FUNCTION {enclose.check} +{ duplicate$ empty$ + { pop$ pop$ pop$ + "" + } + { swap$ * * } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % emphasizes top of stack + % call with + % "string" emphasize.check + % +FUNCTION {emphasize.check} +{ "\Bem{" swap$ + "}" swap$ + enclose.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % brackets top of stack + % call with + % "string" bracket + % +FUNCTION {bracket.check} +{ "[" swap$ + "]" swap$ + enclose.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % parenthesizes top of stack + % call with + % "string" parenthesize + % +FUNCTION {parenthesize.check} +{ "(" swap$ + ")" swap$ + enclose.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % checks whether argument is "multiresult": + % whether it contains '-', '+', or ',' characters + % used with pages to check whether pp. or p. must be used + % +FUNCTION {multi.result.check} +{ 't := + #0 'multiresult := + % + % while (not multiresult) and (length(t) > 1) do + % + { multiresult not + t text.length$ #1 > + and + } + % + % if t(1-2) = "--" or t(1) = "+" or "," + % then multiresult = 1 + % else t = t(2-last) + % + { t #1 #2 substring$ 's := + "--" s = + { #1 'multiresult := } + { t #1 #1 substring$ 's := + "+" s = + "," s = + or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + if$ + } + while$ + multiresult +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Checks whether an author is a corporate author, i.e., + % whether the field starts with "{\bibcorporate". + % Call with + % field is.bibcorporate + % +FUNCTION {is.bibcorporate} +{ #1 #14 substring$ "{\bibcorporate" = } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {remove.spaces} +{ % Remove spaces from string. + % Works best if string only contains alphanumeric characters and spaces. + 's := % The original string + s text.length$ 'len := % Its length (no. of characters) + "" 't := % Initialize the transformed string + #0 'pos := + % + % while (pos < len) do + % + { pos len < } + { pos #1 + 'pos := + s pos #1 substring$ 'u := + % + % u is the pos-th character in s + % If it is a space, move to next character, + % else copy character to output. + % + u " " = + 'skip$ + { t u * 't := } + if$ + } + while$ + % + % Now push the result back on the stack + t +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % end block by writing what's left on the stack and + % starting a new line + % +FUNCTION {output.end.block} +{ write$ + newline$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % end block by adding a period and writing what's left + % on the stack and starting a new line + % +FUNCTION {output.dot.end.block} +{ add.period$ + output.end.block +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % starting new block by writing what's left on the stack, + % starting a new line and adding some extra space or + % whatever is more defined in \newblock + % +FUNCTION {output.new.block} +{ output.end.block + "\newblock" write$ newline$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % starting new block by writing what's left on the stack, + % starting a new line and adding some extra space or + % whatever is more defined in \newblock + % +FUNCTION {output.dot.new.block} +{ add.period$ + output.new.block +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {start.new.block} +{ "\unskip\ " write$ newline$ + "\newblock " write$ newline$ +} + +FUNCTION {sort.name.format.classic} { "{ll{}}{ f{}}{ vv{}}{ jj{}}" } + +FUNCTION {cite.name.format.classic} { "{ll}" } + +FUNCTION {author.name.format.classic} { "{ll}{, f{.}.}{ vv}{, jj}" } + +FUNCTION {index.name.format.classic} { "{ll}{, f{.}.}{ vv}{, jj}" } + +FUNCTION {sort.name.format} { "{vv{}}{ll{}}{ f{}}{ jj{}}" } + +FUNCTION {cite.name.format} { "{vv }{ll}" } + +FUNCTION {cite.initials.name.format} { "{f{.}.~~}{vv }{ll}{ jj}" } + +FUNCTION {author.name.format} { "{vv }{ll}{, f{.}.}{, jj}" } + +FUNCTION {editor.name.format} { "{f{.}.~~}{vv }{ll}{ jj}" } + +FUNCTION {index.name.format} { "{vv }{ll}{, f{.}.}{, jj}" } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {init.initials} +{ "yyyyy" 'aut1f.old := + "yyyyy" 'aut1s.old := + #0 'cite.initials.old := +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {update.no.initials} +{ 'field := + field 'aut1f.old := + field 'aut1s.old := + #0 'cite.initials.old := +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {check.add.initials.aut} +{ % + % If last name is equal to previous last name + % but initials are different, then initials should + % be cited. If initials are also the same, initials + % should be cited if that is the case for the previous + % author . + % + aut1s aut1s.old = + { aut1f aut1f.old = + { cite.initials.old 'cite.initials := } + { #1 'cite.initials := + aut1f 'aut1f.old := + aut1s 'aut1s.old := + cite.initials 'cite.initials.old := + } + if$ + } + { % + % Different last name. + aut1f 'aut1f.old := + aut1s 'aut1s.old := + cite.initials 'cite.initials.old := + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {check.add.initials.field} +{ 'field := + field #1 cite.initials.name.format format.name$ 'aut1f := + field #1 cite.name.format format.name$ 'aut1s := + % + % Now do the actual work + % + check.add.initials.aut +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {check.add.initials} +{ % + % Check whether author or editor or other field acts as author. + % Initials are only relevant with author or editor. + % + firstkey empty$ not + { key empty$ not + { % + % Both key and firstkey are nonempty. + % Then, key is treated as last name of first author, + % and firstkey is treated as last name + initials of + % first author . + % + firstkey sortify remove.spaces 'aut1f := + key sortify remove.spaces 'aut1s := + check.add.initials.aut + } + { firstkey sortify remove.spaces update.no.initials } + if$ + } + { key empty$ not + { key sortify remove.spaces update.no.initials } + { % + % No key or firstkey, so find out which field + % to use as author. + % + % Check reference type: + % if result is 1 then possibly editor acts as author + % 2 then editor does not act as author + % 3 then key should have been used + % 0 then unknown reference type + ref.type #2 = + { % + % Format first author with and without initials + author empty$ + { title.sort.label update.no.initials } + { author check.add.initials.field } + if$ + } + { % + % Format first author with and without initials + author empty$ + { editor empty$ + { title.sort.label update.no.initials } + { editor check.add.initials.field } + if$ + } + { author check.add.initials.field } + if$ + } + if$ + } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {tentative.cite.num.names.field} +{ 'field := + field num.names$ 'numnames := + numnames #3 < + { % + % 1 or 2 names: always cite all of them. + numnames 'cite.num.names.full := + numnames 'cite.num.names.short := + } + { numnames #6 < + { % + % 3-5 names: cite all of them the first time, + % only the first name later times + numnames 'cite.num.names.full := + #1 'cite.num.names.short := + } + { % + % 6 or more names: cite only the first name + #1 'cite.num.names.full := + #1 'cite.num.names.short := + } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {tentative.cite.num.names} +{ % + % Check whether author or editor or other field acts as author. + % Number of names is only relevant with author or editor. + % + firstkey empty$ not + { + #1 'cite.num.names.full := + #1 'cite.num.names.short := + } + { key empty$ not + { + #1 'cite.num.names.full := + #1 'cite.num.names.short := + } + { % + % No key or firstkey, so find out which field + % to use as author. + % + % Check reference type: + % if result is 1 then possibly editor acts as author + % 2 then editor does not act as author + % 3 then key should have been used + % 0 then unknown reference type + ref.type #2 = + { % + % Format first author with and without initials + author empty$ + { + #1 'cite.num.names.full := + #1 'cite.num.names.short := + } + { author tentative.cite.num.names.field } + if$ + } + { % + % Format first author with and without initials + author empty$ + { editor empty$ + { + #1 'cite.num.names.full := + #1 'cite.num.names.short := + } + { editor tentative.cite.num.names.field } + if$ + } + { author tentative.cite.num.names.field } + if$ + } + if$ + } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {init.cite.num.names} +{ #0 'cite.num.names.old := + #0 'numnames.old := + "yyyy" 'year.label.old := + #0 'add.to.year.old := + "" 'aut1f.old := + "" 'aut2.old := + "" 'aut3.old := + "" 'aut4.old := + "" 'aut5.old := + "" 'aut6.old := +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {update.cite.num.names} +{ cite.num.names.short 'cite.num.names.old := + numnames 'numnames.old := + year.label 'year.label.old := + add.to.year 'add.to.year.old := + aut1f 'aut1f.old := + aut2 'aut2.old := + aut3 'aut3.old := + aut4 'aut4.old := + aut5 'aut5.old := + aut6 'aut6.old := +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {format.6.authors} +{ % + % First author: with initials. + % + field #1 cite.initials.name.format format.name$ 'aut1f := + % + % Second and later authors: without initials. + % + numnames #1 > + name.max #1 > + and + { % + % 2nd author + field #2 cite.name.format format.name$ 'aut2 := + % + numnames #2 > + name.max #2 > + and + { % + % 3nd author + field #3 cite.name.format format.name$ 'aut3 := + % + numnames #3 > + name.max #3 > + and + { % + % 4th author + field #4 cite.name.format format.name$ 'aut4 := + % + numnames #4 > + name.max #4 > + and + { % + % 5th author + field #5 cite.name.format format.name$ 'aut5 := + % + numnames #5 > + name.max #5 > + and + { % + % 6th author + field #6 cite.name.format format.name$ 'aut6 := + } + { % + % 5 authors: 6 is empty + % + "" 'aut6 := + } + if$ + } + { % + % 4 authors: 5-6 are empty + % + "" 'aut5 := + "" 'aut6 := + } + if$ + } + { % + % 3 authors: 4-6 are empty + % + "" 'aut4 := + "" 'aut5 := + "" 'aut6 := + } + if$ + } + { % + % 2 authors: 3-6 are empty + % + "" 'aut3 := + "" 'aut4 := + "" 'aut5 := + "" 'aut6 := + } + if$ + } + { % + % Only 1 author: 2-6 are empty + % + "" 'aut2 := + "" 'aut3 := + "" 'aut4 := + "" 'aut5 := + "" 'aut6 := + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {change.add.to.year} +{ + forward #1 = + { % + % Moving forward: this add.to.year number must be 1 higher than + % previous. + % + add.to.year.old #0 > + { add.to.year.old #1 + 'add.to.year := } + { #2 'add.to.year := } + if$ + } + { % + % Moving backward: this add.to.year number must be 1 lower than + % previous. + % + add.to.year.old #1 - 'add.to.year := + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {definitive.cite.num.names.1.or.2} +{ % + numnames numnames.old = + { % + % Same number of names: ambiguity could arise. Check whether current + % and previous have the same author(s). + % + aut1f aut1f.old = + { % + % Same first author: if the second author is also the same or if + % there is only one author, a's and b's should be added. + % + aut2 aut2.old = + numnames #2 = + and + % + numnames #1 = + or + { % + % Same author(s): add to year. + % + change.add.to.year + } + { % + % Different second author: no ambiguity possible. + % + skip$ + } + if$ + } + { % + % Different first author: no ambiguity possible. + % + skip$ + } + if$ + } + { % + % Different number of names: no ambiguity possible. + % + skip$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {definitive.cite.num.names.3.or.more} +{ % + % Check whether current and previous have the same first author. + % + aut1f aut1f.old = + { % + % Same first author: check second author + % + aut2 aut2.old = + { % + % Same 1st & 2nd author: check 3rd. + % + aut3 aut3.old = + { % + % Same 1st-3rd authors: check 4th. + % + numnames.old #3 = + { numnames #3 = + { % + % Both current and previous have 3 authors, which are + % the same, so both have identical author-year + % combinations, so ambiguity should be resolved by + % a's and b's. Check whether more authors were + % necessary for previous one. + % + change.add.to.year + cite.num.names.short cite.num.names.old < + { cite.num.names.old + 'cite.num.names.short := + } + 'skip$ + if$ + } + { % + % Previous has 3 authors, current has more, with same + % first 3, so at least 4 must be used for current to + % make a difference. + % + cite.num.names.short #4 < + { #4 'cite.num.names.short := } + 'skip$ + if$ + } + if$ + } + { numnames #3 = + { % + % Current has 3 authors, previous has more, with same + % first 3, so all 3 of current must be used. + % + numnames 'cite.num.names.short := + } + { % + % Same 1st-3rd author and both current and previous + % have at least 4 authors: check 4th. + % + aut4 aut4.old = + { % + % Same 1st-4th authors: check 5th. + % + numnames.old #4 = + { numnames #4 = + { % + % Both current and previous have 4 authors, + % which are the same, so both have + % identical author-year combinations, so + % ambiguity should be resolved by a's and + % b's. Check whether more authors were + % necessary for previous one. + % + change.add.to.year + cite.num.names.short cite.num.names.old < + { cite.num.names.old + 'cite.num.names.short := + } + 'skip$ + if$ + } + { % + % Previous has 4 authors, current has more, + % with same first 4, so at least 5 must be + % used for current to make a difference. + % + cite.num.names.short #5 < + { #5 'cite.num.names.short := } + 'skip$ + if$ + } + if$ + } + { numnames #4 = + { % + % Current has 4 authors, previous has more, + % with same first 4, so all 4 of current + % must be used. + % + numnames 'cite.num.names.short := + } + { % + % Same 1st-4th author and both current and + % previous have at least 5 authors: check + % 5th. + % + aut5 aut5.old = + { % + % Same 1st-5th authors: check 6th. + % + numnames.old #5 = + { numnames #5 = + { % + % Both current and previous + % have 5 authors, which are the + % same, so both have identical + % author-year combinations, so + % ambiguity should be resolved + % by a's and b's. Check whether + % more authors were necessary + % for previous one. + % + change.add.to.year + cite.num.names.short + cite.num.names.old < + { cite.num.names.old + 'cite.num.names.short := + } + 'skip$ + if$ + } + { % + % Previous has 5 authors, + % current has more, with same + % first 5, so at least 6 must + % be used for current to make + % a difference. + % + cite.num.names.short #6 < + { #6 'cite.num.names.short := } + 'skip$ + if$ + } + if$ + } + { numnames #5 = + { % + % Current has 5 authors, + % previous has more, with same + % first 5, so all 5 of current + % must be used. + % + numnames 'cite.num.names.short := + } + { % + % Same 1st-5th author and both + % current and previous have at + % least 6 authors. If one has + % 6 authors and the other has + % more or the 6th is different, + % 6 should be used (which is + % the maximum). + % + numnames #6 > + numnames.old #6 = + and + % + numnames #6 = + numnames.old #6 > + and + % + or + % + aut6 aut6.old = + not + % + or + { #6 cite.num.names.short < + { #6 + 'cite.num.names.short + := + } + 'skip$ + if$ + } + { % + % The first 6 authors are + % the same and either both + % have 6 or both have more. + % So for all practical + % purposes they have + % identical author-year + % combination, so ambiguity + % should be resolved by a's + % and b's. Check whether + % more authors were + % necessary for previous + % one. + % + change.add.to.year + cite.num.names.short + cite.num.names.old + < + { cite.num.names.old + 'cite.num.names.short + := + } + 'skip$ + if$ + } + if$ + } + if$ + } + if$ + } + { % + % Different 5th author: citing 5 authors is + % sufficient for this comparison. + % + cite.num.names.short #5 < + { #5 'cite.num.names.short := } + 'skip$ + if$ + } + if$ + } + if$ + } + if$ + } + { % + % Different 4th author: citing 4 authors is + % sufficient for this comparison. + % + cite.num.names.short #4 < + { #4 'cite.num.names.short := } + 'skip$ + if$ + } + if$ + } + if$ + } + if$ + } + { % + % Different 3rd author: citing 3 authors is sufficient for this + % comparison. + % + cite.num.names.short #3 < + { #3 'cite.num.names.short := } + 'skip$ + if$ + } + if$ + } + { % + % Different 2nd author: citing 2 authors is sufficient for this + % comparison. + % + cite.num.names.short #2 < + { #2 'cite.num.names.short := } + 'skip$ + if$ + } + if$ + } + { % + % Different first author: no ambiguity, move to next entry. + % + skip$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {definitive.cite.num.names.field} +{ 'field := + field num.names$ 'numnames := + % + % Format authors + % + format.6.authors + % + % Now compare authors with authors of previous entry. + % + cite.num.names.short numnames.old > + { % + % The previous entry has less authors than already defined + % necessary to be cited. No ambiguity is possible and we're ready. + % + skip$ + } + { % + % Both previous and current entry have at least one author . + % + year.label year.label.old = + { % + % Same year label: possibly ambiguous citation. + % + % First check: current and/or previous have 1 or + % 2 authors. + % + numnames #3 < + numnames.old #3 < + or + % + { definitive.cite.num.names.1.or.2 } + { definitive.cite.num.names.3.or.more } + if$ + } + { % + % Different year label: everything's fine, + % move to next entry. + % + skip$ + } + if$ + } + if$ + % + % If during the previous process the name maximum is exceeded + % (which was not checked), correct this. NOTE: If the name + % maximum is smaller than 6, this could lead to ambiguous + % citations if, e.g., the year and the first 5 authors are + % the same, but the 6th author is different. + % + cite.num.names.short name.max > + { name.max 'cite.num.names.short := } + 'skip$ + if$ + % + % For a "full" cite, the number of names should always be at least + % as large as for a "short" cite. + % + cite.num.names.full cite.num.names.short < + { cite.num.names.short 'cite.num.names.full := } + 'skip$ + if$ + % + % Update "old" variables for next entry. + % + update.cite.num.names +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {definitive.cite.no.names} +{ % + % The formatted field that acts as author is on top + % of the stack. + 'aut1f := + "" 'aut2 := + "" 'aut3 := + "" 'aut4 := + "" 'aut5 := + "" 'aut6 := + #1 'numnames := + % + year.label year.label.old = + { % + % Same year label: possibly ambiguous citation. + % + definitive.cite.num.names.1.or.2 + } + { % + % Different year label: everything's fine, + % move to next entry. + % + skip$ + } + if$ + % + % Update "old" variables for next entry. + % + update.cite.num.names +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {definitive.cite.num.names} +{ % + % Check whether author or editor or other field acts as author. + % Number of names is only relevant with author or editor. + % + firstkey empty$ not + { firstkey sortify remove.spaces definitive.cite.no.names } + { key empty$ not + { key sortify remove.spaces definitive.cite.no.names } + { % + % No key or firstkey, so find out which field + % to use as author. + % + % Check reference type: + % if result is 1 then possibly editor acts as author + % 2 then editor does not act as author + % 3 then key should have been used + % 0 then unknown reference type + ref.type #2 = + { % + % Format first author with and without initials + author empty$ + { title.sort.label definitive.cite.no.names } + { author definitive.cite.num.names.field } + if$ + } + { % + % Format first author with and without initials + author empty$ + { editor empty$ + { title.sort.label definitive.cite.no.names } + { editor definitive.cite.num.names.field } + if$ + } + { author definitive.cite.num.names.field } + if$ + } + if$ + } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.tentative.year.sort.label} +{ % + % Implicit or explicit ``no date'' is put at the front + % (the year zero; years B.C. will imply complications) + % because these are possibly old works. + % ``In press'' is put at the end. + % + year empty$ + { "0000" 'year.label := } + { year "\bibnodate" = + year "l" change.case$ "no date" = or + year "l" change.case$ "n.d." = or + { "0000" 'year.label := } + { year "\BIP" = + year "l" change.case$ "in press" = or + year "l" change.case$ "forthcoming" = or + { "9999" 'year.label := } + { % It is not checked whether the year field + % makes sense. + year sortify remove.spaces 'year.label := + } + if$ + } + if$ + } + if$ + % + % Push year sort label on the stack + year.label +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {month.number.day} +{ month empty$ + { "" } + { month sortify remove.spaces + % + % Add the day when available. + day empty$ + 'skip$ + { "/" * + day sortify remove.spaces * + } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.name.sort.label} +{ % + % Author or editor-acting-as-author available. + % => Make tentative "short cite with initials" author + % label (L1) of one of the forms + % "Last1 F1" + % "Last1 F1 Last2" + % "Last1 F1 zzzz" ("zzzz" representing et al.) + % => If more than 2 'authors': make label (L2) for 2nd-6th authors + % of one of the forms + % "Last2 Last3" + % "Last2 Last3 Last4" + % "Last2 Last3 Last4 Last5" + % "Last2 Last3 Last4 Last5 Last6" + % "Last2 Last3 Last4 Last5 Last6 zzzz" + % + % Then format year label (L3) of one of the forms: + % "0000" (missing year or explicit 'no date') + % "9999" ('in press') + % year (otherwise; don't use originalyear here yet) + % + % From earlier sorting of titles, we have title number. Convert + % to string, which gives title label (L4) . + % + % Then tentative sorting label (author.year.sort.label) is a + % concatenation of + % L1 + % " " + % L3 + % " " + % L2 + % " " + % L4 + % + % The name field is on top of the stack. + 'field := + % + % numnames is the total number of names contained in field + field num.names$ 'numnames := + % + % Format first author + field #1 sort.name.format format.name$ + % + % Format the second author if there are two, or else "zzzz" = et al. + numnames #1 = + 'skip$ + { numnames #2 = + { % + % Two authors: format second author + field #2 "{ll{}}" format.name$ 's := + s "others" = + { " zzzz" * } % Add "et al."-substitute + { " " * s * } % Add second author + if$ + } + { " zzzz" * } % 3 or more authors: add "et al."-substitute + if$ + } + if$ + " " * % Add spaces + make.tentative.year.sort.label * % Add year (L3). + " " * % Add spaces + % + % Now build up L2 if applicable + numnames #3 < + 'skip$ + { % + % Treat last author slightly differently + numnames name.max > + { name.max 'lastname := + " zzzz" % Push "et al."-substitute on stack + } + { numnames 'lastname := + "" % Push empty string on stack + } + if$ + % + % Names 2 to "last" - 1 + "" % Push empty string on stack + #2 'nameptr := + { nameptr lastname < } + { % Add name no. nameptr + field nameptr "{ll{}}" format.name$ * + " " * + nameptr #1 + 'nameptr := + } + while$ + % + % "Last" author + field lastname "{ll{}}" format.name$ 's := + s "others" = + { "zzzz" * } % Add "et al."-substitute + { s * } % Add last author + if$ + % + swap$ * % Add the previously formatted empty string or + % "et al."-substitute if there are many authors. + * % Add L2 to the earlier labels. + } + if$ + % + " " * % Add spaces + title.number conv.int.to.str * % Add sorted title number (L4). + sortify % Clean up and convert to lowercase + " " * % Add spaces + month.number.day * % Add month and day when available + 'author.year.sort.label := % Assign result to sort label. +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.field.year.sort.label} +{ % + % 'field' acts as first author (L1), subsequent authors + % are empty (L2). + % + % Then format year label (L3) of one of the forms: + % "0000" (missing year or explicit 'no date') + % "9999" ('in press') + % year (otherwise; don't use originalyear here yet) + % + % From earlier sorting of titles, we have title number. Convert + % to string, which gives title label (L4) . + % + % Then tentative sorting label (author.year.sort.label) is a + % concatenation of + % L1 + % " " + % L3 + % " " + % L2 + % " " + % L4 + % + % 'field' is on top of the stack. It is already supposed to be cleaned + % (i.e., sortified and space-removed), so this is already L1. + " " * % Add spaces to L1 + make.tentative.year.sort.label * % Add year (L3). + " " * % Add spaces + " " * % L2 is empty, add spaces + title.number conv.int.to.str * % Add sorted title number (L4). + sortify % Clean up and convert to lowercase + " " * % Add spaces + month.number.day * % Add month and day when available + 'author.year.sort.label := % Assign result to sort label. +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.author.editor.sort.label} +{ author empty$ + { editor empty$ + { % + % Use what has previously been stored in title.sort.label + % as author substitute . + title.sort.label make.field.year.sort.label + } + { editor make.name.sort.label } + if$ + } + { author make.name.sort.label } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.author.sort.label} +{ author empty$ + { % + % Use what has previously been stored in title.sort.label + % as author substitute . + title.sort.label make.field.year.sort.label + } + { author make.name.sort.label } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.tentative.sort.label} +{ % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % General strategy: + % + % Ordinary situation: author or editor-acting-as-author + % available. + % => Make tentative "short cite with initials" author + % label (L1) of one of the forms + % "Last1 F1" + % "Last1 F1 Last2" + % "Last1 F1 zzzz" ("zzzz" representing et al.) + % => If more than 2 'authors': make label (L2) for 2nd-6th authors + % of one of the forms + % "Last2 Last3" + % "Last2 Last3 Last4" + % "Last2 Last3 Last4 Last5" + % "Last2 Last3 Last4 Last5 Last6" + % "Last2 Last3 Last4 Last5 Last6 zzzz" + % When key is available (overrules author and editor fields): + % => L1 = key, L2 = "" + % No author, editor, and key: define title or substitute as key + % and format as key. + % + % Then format year label (L3) of one of the forms: + % "0000" (missing year or explicit 'no date') + % "9999" ('in press') + % year (otherwise; don't use originalyear here yet) + % + % From earlier sorting of titles, we have title number. Convert + % to string, which gives title label (L4) . + % + % Then tentative sorting label (author.year.sort.label) is a + % concatenation of + % L1 + % " " + % L3 + % " " + % L2 + % " " + % L4 + % + % This can then be sorted, from which it can be derived + % whether initials are necessary, how many names must + % be used for short and full citations, and whether "a"'s and + % "b"'s etc. are necessary behind the year labels. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % key and firstkey overrule author information + % + firstkey empty$ not + { key empty$ not + { % + % Both key and firstkey available: + % for sorting and checking initials, treat key as last + % name and firstkey as initials. + % + key sortify remove.spaces + " " * + firstkey sortify remove.spaces * + make.field.year.sort.label + } + { firstkey sortify remove.spaces make.field.year.sort.label } + if$ + } + { key empty$ not + { key sortify remove.spaces make.field.year.sort.label } + { % + % No key or firstkey, so find out which field + % to use as author. + % + % Check reference type: + % if result is 1 then possibly editor acts as author + % 2 then editor does not act as author + % 3 then key should have been used + % 0 then unknown reference type + ref.type + duplicate$ #1 = + { pop$ + make.author.editor.sort.label + } + { duplicate$ #2 = + { pop$ + make.author.sort.label + } + { #3 = + { "no key in " cite$ * warning$ + make.author.editor.sort.label + } + { make.author.editor.sort.label } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + % + author.year.sort.label 'sort.key$ := +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.definitive.name.sort.label} +{ % + % Author or editor-acting-as-author available. + % => Make author-with-initials label (L1) of one of the forms + % "Last1 F1 Last2 F2 ... LastN FN" + % "Last1 F1 Last2 F2 ... Last6 F6 zzzz" + % (where N <= 6 is the total number of authors, and + % "zzzz" represents et al. if there are more than 6 authors) + % No author, editor, and key: define title or substitute as sort key. + % + % The name field is on top of the stack. + 'field := + % + % numnames is the total number of names contained in field + field num.names$ 'numnames := + % + % If there are more than 6 authors, only 6 are mentioned. + numnames name.max > + { name.max 'format.num.names := } + { numnames 'format.num.names := } + if$ + % Initialize stack with empty string + "" + % + % Cycle over authors. + #1 'nameptr := + { nameptr format.num.names < } + { % Format author and add spaces + field nameptr sort.name.format format.name$ * + " " * + nameptr #1 + 'nameptr := + } + while$ + % Format last author that must be formatted + field nameptr sort.name.format format.name$ * + % Add et al. if necessary + nameptr numnames < + { " zzzz" * } + 'skip$ + if$ + sortify % Clean up and change case + " " * % Add spaces + year.label * % Add year + " " * % Add spaces + title.number conv.int.to.str * % Add sorted title number + " " * % Add spaces + month.number.day * % Add month and day when available + 'author.year.sort.label := % Assign result to sort label. +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.definitive.field.year.sort.label} +{ % + % 'field' acts as author (L1). + % + % Then format year label (L2) of one of the forms: + % "0000" (missing year or explicit `no date') + % "9999" (`in press') + % year (otherwise; don't use originalyear here yet) + % + % From earlier sorting of titles, we have title number. Convert + % to string, which gives title label (L3) . + % + % Then tentative sorting label (author.year.sort.label) is a + % concatenation of + % L1 + % " " + % L2 + % " " + % L3 + % + % 'field' is on top of the stack. It is already supposed to be cleaned + % (i.e., sortified and space-removed), so this is already L1. + " " * % Add spaces + year.label * % Add year + " " * % Add spaces + title.number conv.int.to.str * % Add sorted title number + " " * % Add spaces + month.number.day * % Add month and day when available + 'author.year.sort.label := % Assign result to sort label. +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.definitive.author.editor.sort.label} +{ author empty$ + { editor empty$ + { % + % Use what has previously been stored in title.sort.label + % as author substitute . + title.sort.label make.definitive.field.year.sort.label + } + { editor make.definitive.name.sort.label } + if$ + } + { author make.definitive.name.sort.label } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.definitive.author.sort.label} +{ author empty$ + { % + % Use what has previously been stored in title.sort.label + % as author substitute . + title.sort.label make.definitive.field.year.sort.label + } + { author make.definitive.name.sort.label } + if$ +} +FUNCTION {make.final.sort.key} +{ ref.type #2 = + { make.definitive.author.sort.label } + { make.definitive.author.editor.sort.label } + if$ + unsorted + { citeorder.sort.label 'sort.key$ := } + { author.year.sort.label 'sort.key$ := } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + { s } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {chop.articles} +{ 's := + "a " #2 + "an " #3 + "the " #4 + s + chop.word + chop.word + chop.word +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {format.sort.title} +{ % + % Remove non-alphanumeric characters and change to lower case . + sortify + % + % Remove "a ", "an ", and "the " from the front . + chop.articles #1 entry.max$ substring$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.sort.title} +{ title empty$ + { text empty$ + { type empty$ + { howpublished empty$ + { note empty$ + { url empty$ + { " " } + { url format.sort.title } + if$ + } + { note format.sort.title } + if$ + } + { howpublished format.sort.title } + if$ + } + { type format.sort.title } + if$ + } + { text format.sort.title } + if$ + } + { title format.sort.title } + if$ + remove.spaces + 'title.sort.label := + title.sort.label 'sort.key$ := +} +FUNCTION {make.title.number} +{ title.sort.label old.label = + { + old.number 'title.number := + } + { + old.number #1 + 'title.number := + title.number 'old.number := + title.sort.label 'old.label := + } + if$ +} +FUNCTION {make.citeorder.number} +{ old.number #1 + 'cite.order := + cite.order 'old.number := + cite.order conv.int.to.str 'citeorder.sort.label := +} + +FUNCTION {last.part.name.format.classic} { "{ll}" } + +FUNCTION {von.junior.name.format.classic} { "{ vv}{, jj}" } + +FUNCTION {last.part.name.format} { "{vv }{ll}" } + +FUNCTION {initials.with.space.name.format} { "{f.}" } + +FUNCTION {von.last.junior.name.format} { "{vv }{ll}{ jj}" } + +FUNCTION {von.junior.name.format} { "{, jj}" } + +FUNCTION {one.complete.name.format} { "{vv }{ll}{, jj}{, ff}" } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {string.length} +{ #0 'pos := + % If the next character exists, i.e., is not empty, + % add 1 to the string length. + % We cannot use empty$ because " " empty$ is true. + { duplicate$ pos #1 + #1 substring$ "" = not } + { pos #1 + 'pos := } + while$ + pop$ pos +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {transform.spaces.and.hyphens} +{ 's := % The original string + s string.length 'len := % Its length (no. of characters) + "" 't := % Initialize the transformed string + #1 'pos := + #0 'brace.level := + % + % while (pos < len) do + % + { pos len < } + { % First, check whether we are at brace level 0 + brace.level #0 = + { + % At least two characters left: check for ". ", ".~", and ".-". + % If so, replace and shift two positions. + s pos #2 substring$ ". " = + s pos #2 substring$ ".~" = or + { t "." * 't := + pos #2 + 'pos := + } + { s pos #2 substring$ ".-" = + { t "\BHBI " * 't := + pos #2 + 'pos := + } + { % neither is true, copy one character and shift one position + t s pos #1 substring$ * 't := + % Check whether we need to increase brace level. + % Note that this is not sophisticated: it does not capture + % \{, \verb+}+, etc. + % Note also that unbalanced braces cause problems. + s pos #1 substring$ "{" = + { brace.level #1 + 'brace.level := } + 'skip$ + if$ + pos #1 + 'pos := + } + if$ + } + if$ + } + { % Not at brace level 0: copy result literally + t s pos #1 substring$ * 't := + % Check whether we need to increase or decrease brace level. + % Note that this is not sophisticated: it does not capture + % \{, \verb+}+, etc. + s pos #1 substring$ "{" = + { brace.level #1 + 'brace.level := } + { s pos #1 substring$ "}" = + { brace.level #1 - 'brace.level := } + 'skip$ + if$ + } + if$ + pos #1 + 'pos := + } + if$ + } + while$ + % + pos len = + { % Last character, copy + t s pos #1 substring$ * 't := + } + { % pos = len + 1, so s ends with ". " or ".-" + % This should not have happened, but make the best out of it. + % Push last two characters of s on the stack, i.e., ". " or ".-". + s len #1 - #2 substring$ + % Remove "\BPBI " or "\BHBI " from t + t text.length$ 'len := % Length of t (no. of characters) + t #1 len #6 - substring$ + % Concatenate and assign to t + swap$ * 't := + } + if$ + % + % Now push the result back on the stack + t +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {format.initials.with.hyphen} +{ % Format initials. + % Call with + % field authornumber format.initials.with.hyphen + % e.g. + % author #1 format.initials.with.hyphen + % Instead of field, a string may also be used. + % + % First, format initials in the default way, retaining spaces + % and hyphens. + initials.with.space.name.format format.name$ + transform.spaces.and.hyphens +} + +FUNCTION {format.last.part.name} +{ % Format a name with last.part.name.format, + % as part of more complicated things. + % Call with + % field authornumber format.last.part.name + % e.g. + % author #1 format.last.part.name + % Instead of field, a string may also be used. + last.part.name.format format.name$ +} + +FUNCTION {format.von.last.junior.name} +{ % Format a name with von.last.junior.name.format, + % for citing or as part of more complicated things. + % Call with + % field authornumber format.von.last.junior.name + % e.g. + % author #1 format.von.last.junior.name + % Instead of field, a string may also be used. + von.last.junior.name.format format.name$ +} + +FUNCTION {format.von.junior.name} +{ % Format a name with von.last.junior.name.format, + % for citing or as part of more complicated things. + % Call with + % field authornumber format.von.junior.name + % e.g. + % author #1 format.von.junior.name + % Instead of field, a string may also be used. + von.junior.name.format format.name$ +} + +FUNCTION {format.cite.initials.name} +{ % Format a name for citing with initials. + % Call with + % field authornumber format.cite.initials.name + % e.g. + % author #1 format.cite.initials.name + % Instead of field, a string may also be used. + % + % First, extract the complete name, format it in the canonical form, + % and push on the stack. + one.complete.name.format format.name$ + % + % Format the initials and push on the stack. + duplicate$ #1 format.initials.with.hyphen + % + % Format the von-last-junior part and push on the stack. + swap$ #1 format.von.last.junior.name + % + % Connect with "~" hyphen (if they're both non-empty). + "~" connect.check +} + +FUNCTION {format.author.name} +{ % Format an author name for the reference list. + % Call with + % field authornumber format.author.name + % e.g. + % author #1 format.author.name + % Instead of field, a string may also be used. + % + % First, extract the complete name, format it in the canonical form, + % and push on the stack. + one.complete.name.format format.name$ + % + % Make two copies of the name, format the last name and push on the stack. + duplicate$ duplicate$ #1 format.last.part.name + % + % Format the initials and push on the stack. + swap$ #1 format.initials.with.hyphen + % + % Connect with last name. + connect.with.comma.check + % + % Format the von-junior part and connect with initials. + swap$ #1 format.von.junior.name "" connect.check +} + +FUNCTION {format.editor.name} +{ % Format a name for the reference list as an editor. + % Call with + % field authornumber format.editor.name + % e.g. + % author #1 format.editor.name + % Instead of field, a string may also be used. + % + format.cite.initials.name +} + +FUNCTION {format.index.name} +{ % Format an author name for the index. + % Call with + % field authornumber format.index.name + % e.g. + % author #1 format.index.name + % Instead of field, a string may also be used. + % + format.author.name +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +FUNCTION {comma.between.two} { "\BCBT {}" } + +FUNCTION {comma.between.names} { ", " } + +FUNCTION {comma.before.last} { "\BCBL {}" } + +FUNCTION {dots.before.last} { "\BDBL {}" } + +FUNCTION {and.before.last} { "\ \BBA {} " } + +FUNCTION {no.and.before.last} { " " } + +FUNCTION {et.al.string.cite} { "\ \protect \BOthers {.}" } + +FUNCTION {et.al.string} { "\ \BOthers {.}" } + +FUNCTION {et.al.string.period} { "\ \BOthersPeriod {.}" } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {add.name.index} +{ % + % + make.index + { "%" * write$ newline$ + % Check for corporate author + field is.bibcorporate + { "\corporateAX{" } + { "\AX{" } + if$ + write$ + field nameptr sort.name.format format.name$ sortify write$ newline$ + "@" write$ + field nameptr format.index.name + "}%" * write$ newline$ + } + { "%" * write$ newline$ } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.name.cite.label} +{ 'field := + 'format.num.names := + % + field num.names$ 'numnames := % numnames is the total number of names + % contained in field + % + % It is implicit in the APA manual that if "et al." would refer + % to exactly one author, then this author should be named + % instead of "et al." + % + format.num.names numnames #1 - = + { numnames 'format.num.names := } + 'skip$ + if$ + % + % Format first author: with or without initials + % + #1 'nameptr := + cite.initials #1 = + { field nameptr format.cite.initials.name } + { field nameptr cite.name.format format.name$ } + if$ + add.name.index % Add index entry when desired. + % + numnames #1 = + 'skip$ + { format.num.names #1 = + { % + % First author et al. + % + et.al.string.cite write$ + } + { numnames #2 = + { % + % Given that format.num.names > 1, it is 2. + % Format second author. + % + #2 'nameptr := + field nameptr cite.name.format format.name$ 's := + % + % Check if 2nd author is explicit "others". + % If so, insert "et al." string. + % + s "others" = + { et.al.string.cite write$ } % First et al. + { % + % First \& Second + % + and.before.last write$ + s + add.name.index % Add index entry when desired. + } + if$ + } + { % + % 3 or more names, 2 or more must be cited + % + % for nameptr := 2 to format.num.names - 1 do + % + #2 'nameptr := + { nameptr format.num.names < } + { % + % Put comma between consecutive authors + % + comma.between.names write$ + % + % Format and add next author + % + field nameptr cite.name.format format.name$ + add.name.index % Add index entry when desired. + % + % Move to next author + % + nameptr #1 + 'nameptr := + } + while$ + % + % nameptr = format.num.names + % Format this author. + % + field nameptr cite.name.format format.name$ 's := + % + format.num.names numnames = + { % + % This is also the last author. Add (optional) comma. + % + comma.before.last write$ + % + % Check if this author is explicit "others". + % If so, insert "et al." string. + % + s "others" = + { et.al.string.cite write$ } + { and.before.last write$ + s + add.name.index % Add index entry when desired. + } + if$ + } + { % + % This is not the last author. + % Add comma, author name, and "et al." + % + comma.between.names write$ + s + add.name.index % Add index entry when desired. + % + comma.before.last et.al.string.cite * write$ + } + if$ + } + if$ + } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.title.cite.label} +{ % + % Formatting: check if formatted as article title or + % as book title, and insert this formatting. + % + is.atype + { "\APACciteatitle {" } + { "\APACcitebtitle {" } + if$ + % + title empty$ + { text empty$ + { type empty$ + { howpublished empty$ + { note empty$ + { url empty$ + { cite$ } + { url } + if$ + } + { note } + if$ + } + { howpublished } + if$ + } + { type } + if$ + } + { text } + if$ + } + { title } + if$ + % + % Connect with formatting. + % + * "}" * + % + % Write to output + % + write$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.author.editor.cite.label} +{ author empty$ + { editor empty$ + { % + % No author or editor: + % Use title or other description as citation label. + % + make.title.cite.label + "}{%" write$ newline$ + make.title.cite.label + } + { cite.num.names.full editor make.name.cite.label + "}{%" write$ newline$ + cite.num.names.short editor make.name.cite.label + } + if$ + } + { cite.num.names.full author make.name.cite.label + "}{%" write$ newline$ + cite.num.names.short author make.name.cite.label + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.author.cite.label} +{ author empty$ + { % + % No author: + % Use title or other description as citation label. + % + make.title.cite.label + "}{%" write$ newline$ + make.title.cite.label + } + { cite.num.names.full author make.name.cite.label + "}{%" write$ newline$ + cite.num.names.short author make.name.cite.label + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.definitive.year.supplement} +{ % + % Add "a", "b", etc. when necessary. + % + add.to.year #0 = + { "" } + { "{\protect " + year empty$ + { "\BCntND " * } + { year "\bibnodate" = + year "l" change.case$ "no date" = or + year "l" change.case$ "n.d." = or + { "\BCntND " * } + { year "\BIP" = + year "l" change.case$ "in press" = or + year "l" change.case$ "forthcoming" = or + { "\BCntIP " * } + { "\BCnt " * } + if$ + } + if$ + } + if$ + "{" * add.to.year int.to.str$ * "}}" * + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {protect.year} +{ year empty$ + { "{\protect \bibnodate {}}" } + { year "\bibnodate" = + year "l" change.case$ "no date" = or + year "l" change.case$ "n.d." = or + { "{\protect \bibnodate {}}" } + { year "\BIP" = + year "l" change.case$ "in press" = or + year "l" change.case$ "forthcoming" = or + { "{\protect \BIP {}}" } + { year } + if$ + } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.definitive.year.label} +{ "{\protect \APACyear {" + originalyear empty$ + { protect.year } + { originalyear "\bibnodate" = % date of original publication unknown + originalyear "l" change.case$ "no date" = or + originalyear "l" change.case$ "n.d." = or + { translator empty$ + { protect.year } + { "{\protect \BTRANSL {}}~" protect.year * } + if$ + } + { year empty$ + { originalyear "/{\protect \bibnodate {}}" * } % 1923/n.d. + { originalyear year = + { protect.year } + { originalyear "/" * protect.year * } % 1923/1961 + if$ + } + if$ + } + if$ + } + if$ + * "}}%" * write$ newline$ + % + % Add "a", "b", etc. when necessary. + % + "{\protect \APACexlab {" "}}" + make.definitive.year.supplement enclose.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {make.cite.labels} +{ newline$ + % + % Write a few lines for testing purposes. + % + test + { "\bibitem [] {} \fullciteA {" cite$ * "}" * write$ newline$ + "\bibitem [] {} \citeA {" cite$ * "}" * write$ newline$ + } + 'skip$ + if$ + % + "\bibitem [\protect \citeauthoryear {%" write$ newline$ + % + % When key or firstkey is available, this takes precedence. + % + firstkey empty$ not + { % + % Full cite: firstkey. + % + firstkey write$ + "}{%" write$ newline$ + % + % Short cite: if key is not empty and cite.initials is 0, + % then key, else firstkey. + % + cite.initials #0 = + key empty$ not + and + { key } + { firstkey } + if$ + write$ + } + { key empty$ not + { % + % No firstkey, but key available: + % Both full and short labels are key. + % + key write$ + "}{%" write$ newline$ + key write$ + } + { % No key or firstkey, so find out which field + % to use as author. + % + % Check reference type: + % if result is 1 then possibly editor acts as author + % 2 then editor does not act as author + % 3 then key should have been used + % 0 then unknown reference type + ref.type #2 = + { make.author.cite.label } + { make.author.editor.cite.label } + if$ + } + if$ + } + if$ + "}{%" write$ newline$ + % + % Make year label that's used for citations + % + make.definitive.year.label write$ + "}]{%" write$ newline$ + cite$ write$ + "} " write$ newline$ + % author.year.sort.label write$ newline$ % for testing purposes + % year.label write$ newline$ % for testing purposes + % + % If the item is used in a meta-analysis, indicate this with + % a star. + % + "\APACinsertmetastar {%" write$ newline$ + cite$ write$ + "}%" write$ newline$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {editor.postfix} +{ editor num.names$ #1 > + { "(\BEDS)" } + { "(\BED)" } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {editor.trans.postfix} +{ editor num.names$ #1 > + { "(\BEDS{} \BAnd{} \BTRANSS)" } + { "(\BED{} \BAnd{} \BTRANS)" } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % "(Trans.)" postfix + % translator must not be empty + % +FUNCTION {trans.postfix} +{ translator num.names$ #1 > + { "(\BTRANSS)" } + { "(\BTRANS)" } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {authors.editors.reflist.apa5} +{ 'field := + 'dot := + % + field num.names$ 'numnames := % numnames is the total number of names + % contained in field + numnames 'format.num.names := % Format all authors + format.num.names name.max > % Unless this exceeds the maximum of 6. + { dot + { name.max 'format.num.names := } % Format 6 authors + { cite.num.names.full 'format.num.names := } % Format 1 editor + if$ + } + 'skip$ + if$ + % + % Enclose authors in APACrefauthors environment to allow crude style + % options in \LaTeX. + "\begin{APACrefauthors}%" + write$ newline$ + % + % It is kind of explicit in the APA manual that if "et al." would + % refer to exactly one author (the 7th), then this author should + % still be replaced by "et al.", unlike with citations. + % So format.num.names is not adapted. + % + % Format first author + % + #1 'nameptr := + field nameptr format.author.name + % + % Add period if required and if this is the only author. + % + numnames #1 = + dot + and + { add.period$ } + 'skip$ + if$ + add.name.index % Add index entry when desired. + % + numnames #1 = + 'skip$ + { format.num.names #1 = + { % + % First author et al. + % + comma.between.two + % + % Add period if required. + % + dot + { et.al.string.period * } + { et.al.string * } + if$ + write$ + } + { numnames #2 = + { % + % Given that format.num.names > 1, it is 2. + % + comma.between.two write$ + % + % Format second author. + % + #2 'nameptr := + field nameptr format.author.name 's := + % + % Check if 2nd author is explicit "others". + % If so, insert "et al." string. + % + s "others" = + { % + % First et al. + % Add period if required. + % + dot + { et.al.string.period } + { et.al.string } + if$ + write$ + } + { % + % First \& Second + % + and.before.last write$ + % + % Add period if required. + % + dot + { s add.period$ } + { s } + if$ + add.name.index % Add index entry when desired. + } + if$ + } + { % + % 3 or more names, 2 or more must be cited + % + % for nameptr := 2 to format.num.names - 1 do + % + #2 'nameptr := + { nameptr format.num.names < } + { % + % Put comma between consecutive authors + % + comma.between.names write$ + % + % Format and add next author + % + field nameptr format.author.name + add.name.index % Add index entry when desired. + % + % Move to next author + % + nameptr #1 + 'nameptr := + } + while$ + % + % nameptr = format.num.names + % Format this author. + % + field nameptr format.author.name 's := + % + format.num.names numnames = + { % + % This is also the last author. Add (optional) comma. + % + comma.before.last write$ + % + % Check if this author is explicit "others". + % If so, insert "et al." string. + % + s "others" = + { % + % Add period if required. + % + dot + { et.al.string.period } + { et.al.string } + if$ + write$ + } + { and.before.last write$ + % + % Add period if required. + % + dot + { s add.period$ } + { s } + if$ + add.name.index % Add index entry when desired. + } + if$ + } + { % + % This is not the last author. + % Add comma, author name, and "et al." + % + comma.between.names write$ + s + add.name.index % Add index entry when desired. + % + comma.before.last + % + % Add period if required. + % + dot + { et.al.string.period * } + { et.al.string * } + if$ + write$ + } + if$ + } + if$ + } + if$ + } + if$ + % + % End APACrefauthors environment. + "\end{APACrefauthors}%" + write$ newline$ +} + +FUNCTION {authors.reflist.apa6} +{ 'field := + 'dot := + field num.names$ 'numnames := + numnames #7 > + { #7 'format.num.names := } + { numnames 'format.num.names := } + if$ + "\begin{APACrefauthors}%" + write$ newline$ + #1 'nameptr := + field nameptr format.author.name + numnames #1 = + { dot + { %add.period$ +} + 'skip$ + if$ + add.name.index + } + { add.name.index + numnames #2 = + { comma.between.two write$ + #2 'nameptr := + field nameptr format.author.name 's := + s "others" = + { "`others' not consistent with 6th ed. of the APA Manual" + warning$ + dot + { et.al.string.period } + { et.al.string } + if$ + write$ newline$ + } + { and.before.last write$ + dot + { s add.period$ } + { s } + if$ + add.name.index + } + if$ + } + { %% for nameptr := 2 to format.num.names - 1 do + #2 'nameptr := + { nameptr format.num.names < } + { comma.between.names write$ + field nameptr format.author.name + add.name.index + nameptr #1 + 'nameptr := + } + while$ + field numnames format.author.name 's := + format.num.names numnames = + { comma.before.last write$ + s "others" = + { "`others' not consistent with 6th ed. of the APA " + "Manual" * + warning$ + dot + { et.al.string.period } + { et.al.string } + if$ + write$ + } + { no.and.before.last write$ + dot + { s add.period$ } + { s } + if$ + add.name.index + } + if$ + } + { dots.before.last write$ + s + add.name.index + } + if$ + } + if$ + } + if$ + "\end{APACrefauthors}%" + write$ newline$ +} + +FUNCTION {format.author.names} +{ 'field := + 'dot := + dot + { dot field authors.reflist.apa6 } + { dot field authors.editors.reflist.apa5 } + if$ +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {format.authors} +{ #1 author format.author.names } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {format.editors.as.authors} +{ #0 editor format.author.names + "\ " editor.postfix * add.period$ write$ newline$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {format.ed.trans.as.authors} +{ #0 editor format.author.names + "\ " editor.trans.postfix * add.period$ write$ newline$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {format.editor.names} +{ 'field := + % + field num.names$ 'numnames := % numnames is the total number of names + % contained in field + numnames 'format.num.names := % Format all authors + format.num.names name.max > % Unless this exceeds the maximum of 6. + { #1 'format.num.names := } % Then it becomes 1 (First et al.) + 'skip$ + if$ + % + % Format first editor + % + field #1 format.editor.name + % + numnames #1 = + 'skip$ + { format.num.names #1 = + { et.al.string * } % First editor et al., no comma. + { numnames #2 = + { % + % Given that format.num.names > 1, it is 2. + % No comma. Format second editor. + % + field #2 format.editor.name 's := + % + % Check if 2nd editor is explicit "others". + % If so, insert "et al." string. + % + s "others" = + { et.al.string * } % First et al. + { and.before.last * s * } % First \& Second + if$ + } + { % + % 3 or more names, 2 or more must be cited + % + % for nameptr := 2 to format.num.names - 1 do + % + #2 'nameptr := + { nameptr format.num.names < } + { % + % Put comma between consecutive editors + % + comma.between.names * + % + % Format and add next editor + % + field nameptr format.editor.name * + % + % Move to next editor + % + nameptr #1 + 'nameptr := + } + while$ + % + % nameptr = format.num.names + % Format this editor. + % + field nameptr format.editor.name 's := + % + format.num.names numnames = + { % + % This is also the last editor. Add (optional) comma. + % + comma.before.last * + % + % Check if this editor is explicit "others". + % If so, insert "et al." string. + % + s "others" = + { et.al.string * } + { and.before.last * s * } + if$ + } + { % + % This is not the last editor. + % Add comma, editor name, and "et al." + % + comma.between.names * s * + comma.before.last * et.al.string * + } + if$ + } + if$ + } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format editors in case editors do not act as authors + % (such as reference to chapter in edited book) + % + % L. W. Poon (Ed.) (1 editor) + % or + % A. S. Gurman \& D. P. Kniskern (Eds.) (2 editors) + % or + % L. Poon, A. Jones, \& D. P. Smith (Eds.) (>2 editors) + % + % editor must not be empty + % +FUNCTION {format.editors.in.line} +{ editor format.editor.names + editor.postfix connect.with.space.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format editors in case editors are also translators + % and do not act as authors + % (such as reference to chapter in edited book + % of translated articles) + % + % L. W. Poon (Ed. and Trans.) (1 editor) + % or + % A. S. Gurman \& D. P. Kniskern (Eds. and Trans.) (2 editors) + % or + % L. Poon, A. Jones, \& D. P. Smith (Eds. and Trans.) (>2 editors) + % + % editor must not be empty + % +FUNCTION {format.editors.trans.in.line} +{ editor format.editor.names + editor.trans.postfix connect.with.space.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format translators in case translators act as editors + % (such as reference to chapter in translated book) + % + % L. W. Poon (Trans.) (1 translator) + % or + % A. S. Gurman \& D. P. Kniskern (Trans.) (2 translators) + % or + % L. Poon, A. Jones, \& D. P. Smith (Trans.) (>2 translators) + % + % translator must not be empty + % +FUNCTION {format.translators.in.line} +{ translator format.editor.names + trans.postfix connect.with.space.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format translators in case translator does not act as editor + % (such as reference to translated book) + % + % L. Solotaroff, Trans. + % +FUNCTION {format.translators.in.paren.check} +{ translator empty$ + { "" } + { translator format.editor.names + translator num.names$ #1 > + { ", \BTRANSS{}" * } + { ", \BTRANS{}" * } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format editors and translators in case neither act as editor + % (such as reference to edited or translated book with a + % a single author) + % + % L. Solotaroff, Ed. + % L. Solotaroff, Ed. \& Trans. + % L. Solotaroff, Trans. + % L. Solotaroff, Ed. \& S. Prokofieff, Trans. + % +FUNCTION {format.editors.translators.in.paren.check} +{ editor empty$ + { translator empty$ + { "" } + { translator format.editor.names + translator num.names$ #1 > + { ", \BTRANSS{}" * } + { ", \BTRANS{}" * } + if$ + } + if$ + } + { editor format.editor.names + editor num.names$ #1 > + { ", \BEDS{}" * } + { ", \BED{}" * } + if$ + translator empty$ + 'skip$ + { editor translator = + { editor num.names$ #1 > + { " \BAnd{} \BTRANSS" * } + { " \BAnd{} \BTRANS" * } + if$ + } + { " \BAnd{} " * + translator format.editor.names * + translator num.names$ #1 > + { ", \BTRANSS{}" * } + { ", \BTRANS{}" * } + if$ + } + if$ + } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % translator of article + % +FUNCTION {format.atrans.check} +{ format.translators.in.paren.check parenthesize.check } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format "In editor (Ed.), " + % +FUNCTION {format.in.editors} +{ "\BIn{} " + editor empty$ + 'skip$ + { format.editors.in.line * ", " * } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format "In translator (Trans.)," + % +FUNCTION {format.in.trans} +{ "\BIn{} " + translator empty$ + 'skip$ + { format.translators.in.line * ", " * } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format "In editor (Ed. and Trans.)" + % or "In editor (Ed.)" if editor not equal to translator + % +FUNCTION {format.in.editors.trans} +%{ "\BIn{} " Commented by SPI +{ " " + editor empty$ + { translator empty$ + 'skip$ + { format.translators.in.line * ", " * } + if$ + } + { translator empty$ + { format.editors.in.line * } + { editor translator = + { format.editors.trans.in.line * } + { format.editors.in.line * } + if$ + } + if$ + ", " * + } + if$ +} + +FUNCTION {in.format.in.editors.trans} +{ "\BIn{} " + editor empty$ + { translator empty$ + 'skip$ + { format.translators.in.line * ", " * } + if$ + } + { translator empty$ + { format.editors.in.line * } + { editor translator = + { format.editors.trans.in.line * } + { format.editors.in.line * } + if$ + } + if$ + ", " * + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {format.year.check} +{ "\APACrefYear{" + protect.year * + % + % Add "a", "b", etc. when necessary. + % + make.definitive.year.supplement * + "}" * +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {format.year.month.day.check} +{ "\APACrefYearMonthDay{" + protect.year * + % + % Add "a", "b", etc. when necessary. + % + make.definitive.year.supplement * + "}{" * + % + % Add month and day when present. + % + month empty$ + 'skip$ + { month * } + if$ + "}{" * + day empty$ + 'skip$ + { day * } + if$ + "}" * +} +FUNCTION {format.year.nomonth.day.check} +{ "\APACrefYearMonthDay{" + protect.year * + % + % Add "a", "b", etc. when necessary. + % + make.definitive.year.supplement * + "}{" * + % + % Add month and day when present. + % + month empty$ + 'skip$ + { } + if$ + "}{" * + day empty$ + 'skip$ + { day * } + if$ + "}" * +} + +FUNCTION {format.atitle.no.dot} +{ "{\BBOQ}" swap$ + "{\BBCQ}" swap$ + duplicate$ empty$ + 'skip$ + { duplicate$ + % Two arguments: Title twice: (1) don't change case; (2) change case + "\APACrefatitle {" swap$ * "} {" * swap$ + "t" change.case$ + * "}" * + } + if$ + enclose.check +} + +FUNCTION {format.atitle.dot} +{ "{\BBOQ}" swap$ + "{\BBCQ}" swap$ + duplicate$ empty$ + 'skip$ + { duplicate$ + % Two arguments: Title twice: (1) don't change case; (2) change case + "\APACrefatitle {" swap$ * "} {" * swap$ + "t" change.case$ + * "}" * add.period$ + } + if$ + enclose.check +} + +FUNCTION {format.atitle.connect} +{ swap$ + duplicate$ empty$ + { pop$ + format.atitle.dot + } + { swap$ + format.atitle.no.dot + swap$ connect.with.space.check + add.period$ + } + if$ +} + +FUNCTION {format.btitle.no.dot} +{ duplicate$ empty$ + { pop$ + "" + } + { duplicate$ + % Two arguments: Title twice: (1) don't change case; (2) change case + "\APACrefbtitle {" swap$ * "} {" * swap$ + "t" change.case$ + * "}" * + } + if$ +} + +FUNCTION {format.btitle.dot} +{ duplicate$ empty$ + { pop$ + "" + } + { add.period$ format.btitle.no.dot } + if$ +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % title of book and similar + % field must be on top of stack + % second element on stack must be connected: + % if that is empty, then btitle.dot + % else btitle.no.dot, connect, and add period + % +FUNCTION {format.btitle.connect} +{ swap$ + duplicate$ empty$ + { pop$ + format.btitle.dot + } + { swap$ + format.btitle.no.dot + swap$ connect.with.space.check + add.period$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % title of book and similar + % field must be on top of stack + % second element on stack must be connected + % +FUNCTION {format.btitle.connect.no.dot} +{ swap$ + duplicate$ empty$ + { pop$ + format.btitle.no.dot + } + { swap$ + format.btitle.no.dot + swap$ connect.with.space.check + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format englishtitle (of nonenglish article, etc.) + % +FUNCTION {format.aetitle.check} +{ englishtitle empty$ + { "" } + { % Two arguments: Title twice: (1) don't change case; (2) change case + "\APACrefaetitle {" englishtitle * "} {" * + englishtitle "t" change.case$ * "}" * + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format englishtitle (of nonenglish book, etc.) + % +FUNCTION {format.betitle.check} +{ englishtitle empty$ + { "" } + { % Two arguments: Title twice: (1) don't change case; (2) change case + "\APACrefbetitle {" englishtitle * "} {" * + englishtitle "t" change.case$ * "}" * + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format type (of article, etc.) + % +FUNCTION {format.atype.check} +{ type bracket.check } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format title and englishtitle (of article, etc.) + % +FUNCTION {format.atitle.check} +{ format.aetitle.check + title format.atitle.connect +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format title, englishtitle, and type + % (of article, etc.) + % +FUNCTION {format.atitle.type.check} +{ format.aetitle.check + format.atype.check connect.with.space.check + title format.atitle.connect +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format title, englishtitle, + % and translator (of article, etc.) + % +FUNCTION {format.atitle.trans.check} +{ format.aetitle.check + format.atrans.check connect.with.space.check + title format.atitle.connect +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format title, englishtitle, type, + % and translator (of article, etc.) + % +FUNCTION {format.atitle.type.trans.check} +{ format.aetitle.check + format.atype.check connect.with.space.check + format.atrans.check connect.with.space.check + title format.atitle.connect +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format journal, volume, number and pages + % call with + % formatted.pages format.journal.vol.num.pages.check + % +FUNCTION { format.journal.vol.num.pages.check } +{ "journal" journal warning.if.empty + duplicate$ empty$ + journal empty$ and + volume empty$ and + number empty$ and + { pop$ "" } + { "\APACjournalVolNumPages{" journal "" connect.check + "}{" * volume "" connect.check + "}{" * number "" connect.check + "}{" * swap$ "" connect.check + ",}" * + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % volume of book, checks whether + % "Volume" or "Volumes" + % + % call with + % field format.bvolume.check + % +FUNCTION {format.bvolume.check} +{ duplicate$ empty$ + 'skip$ + { duplicate$ multi.result.check + { "\BVOLS" swap$ tie.or.space.connect } + { "\BVOL" swap$ tie.or.space.connect } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % edition of book, must not be empty + % call with + % field format.edition.check + % +FUNCTION {format.edition.check} +{ duplicate$ empty$ + 'skip$ + { "\PrintOrdinal{" swap$ * "}" * + "\BEd" connect.with.space.check + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % volume and edition of book + % +FUNCTION {format.bvol.edition.check} +{ edition format.edition.check + volume format.bvolume.check + connect.with.comma.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % volume and edition of book + % +FUNCTION {format.bvol.edition} +{ format.bvol.edition.check + parenthesize.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % volume and edition and translator of translated book + % +FUNCTION {format.bvol.edition.trans} +{ format.bvol.edition.check + format.translators.in.paren.check connect.with.semicolon.check + parenthesize.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % volume, edition, editor, and translator of (translated) book + % +FUNCTION {format.bvol.edition.editor.trans} +{ format.bvol.edition.check + format.editors.translators.in.paren.check connect.with.semicolon.check + parenthesize.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % formats pages by first checking if 1 or more pages + % and prefixing pages with "p." or "pp." (these strings + % are given in the commands \BPG and \BPGS, respectively), + % whichever is applicable, and do a tie or space connect + % + % call with + % field format.bpages.check + % +FUNCTION {format.bpages.check} +{ duplicate$ empty$ + 'skip$ + { duplicate$ multi.result.check + { "\BPGS" swap$ tie.or.space.connect } + { "\BPG~" swap$ * } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % formats chapters by first checking if 1 or more chapters + % and prefixing pages with "chap." (this string + % is given in the commands \BCHAP and \BCHAPS, respectively), + % whichever is applicable, and do a tie or space connect + % + % call with + % field format.bchapter.check + % +FUNCTION {format.bchapter.check} +{ duplicate$ empty$ + 'skip$ + { duplicate$ multi.result.check + { "\BCHAPS" swap$ tie.or.space.connect } + { "\BCHAP" swap$ tie.or.space.connect } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % volume, edition, and pages or chapter of article in book etc. + % +FUNCTION {format.bvol.edition.pages} +{ format.bvol.edition.check + pages empty$ + { chapter format.bchapter.check connect.with.comma.check } + { pages format.bpages.check connect.with.comma.check } + if$ + parenthesize.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % title, volume, edition of book + % +FUNCTION {format.btitle.vol.edition} +{ format.betitle.check + format.bvol.edition connect.with.space.check + title format.btitle.connect.no.dot +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % title, volume, edition, and translator of book + % +FUNCTION {format.btitle.vol.edition.trans} +{ format.betitle.check + format.bvol.edition.trans connect.with.space.check + title format.btitle.connect.no.dot +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % title, volume, edition, editor, and translator of book + % +FUNCTION {format.btitle.vol.edition.editor.trans} +{ format.betitle.check + format.bvol.edition.editor.trans connect.with.space.check + title format.btitle.connect.no.dot +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format address and publisher of book etc. + % + % New York: Wiley + % or + % Wiley (if address empty) + % or + % New York (if publisher empty) + % +FUNCTION {format.address.publisher} +{ % + % If publisher = author or publisher = "author" or publisher = "Author" + % then hand over the final choice how to format this to \LaTeX. + % (I could imagine similar code for editors, but the APA manual does + % not mention it and then we'd have to check whether the editor is in + % the author position, so let's keep it simple until someone complains.) + % + author empty$ + publisher empty$ or + { publisher "\APACaddressPublisher{" } + { author publisher = + "author" publisher = or + "Author" publisher = or + { author "\APACaddressPublisherEqAuth{" } + { publisher "\APACaddressPublisher{" } + if$ + } + if$ + address "" connect.check "}{" * + % Recover publisher that was pushed onto the stack previously. + swap$ "" connect.check "}" * +} + +FUNCTION {format.address.publisher.check} +{ publisher empty$ + address empty$ + and + 'skip$ + { + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.address.publisher + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format number as in reports: No. 2017 + % call with + % field format.rnumber.check + % +FUNCTION {format.rnumber.check} +{ duplicate$ empty$ + 'skip$ + { duplicate$ multi.result.check + { "\BNUMS" swap$ tie.or.space.connect } + { "\BNUM" swap$ tie.or.space.connect } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format type and number of a standalone item + % call with + % format.type.number + % +FUNCTION { format.type.number } +{ type empty$ + { type.2 } + { type } + if$ + number empty$ + { bracket.check } + { number format.rnumber.check connect.with.space.check + parenthesize.check + } + if$ +} + +FUNCTION {format.howpublished} +{ howpublished empty$ + 'skip$ + { % clear the stack + duplicate$ empty$ + 'pop$ + { output.dot.new.block } + if$ + "\APAChowpublished {" howpublished * "}" * + } + if$ +} +FUNCTION {output.howpublished} +{ howpublished empty$ + 'skip$ + { "\APAChowpublished {" howpublished * "}" * + output.dot.new.block + } + if$ +} +FUNCTION {howpublished.block} +{ howpublished empty$ + 'skip$ + { start.new.block + "\APAChowpublished {" howpublished * "}" * + output.dot.end.block + } + if$ +} +FUNCTION {begin.end.url.env} +{ "\begin{APACrefURL} " + lastchecked empty$ + { urldate empty$ + 'skip$ + { "[{" * urldate * "}]" * } + if$ + } + { "[{" * lastchecked * "}]" * } + if$ + " \end{APACrefURL} " +} + +FUNCTION {begin.end.doi.env} +{ "\begin{APACrefDOI} " + " \end{APACrefDOI} " +} + +FUNCTION {begin.end.msg.env} +{ "\begin{APACrefURLmsg} " + " \end{APACrefURLmsg} " +} +FUNCTION {format.url} +{ type.2 empty$ + { begin.end.url.env } + { type.2 "\bibmessage" = + { begin.end.msg.env } + { begin.end.url.env } + if$ + } + if$ +%%"\url{" url * "}" * + "{" url * "}" * + enclose.check +} +FUNCTION {url.block} +{ doi empty$ + { url empty$ + 'skip$ + { start.new.block + format.url + output.end.block + } + if$ + } + 'skip$ + if$ +} +FUNCTION {format.doi} +{ begin.end.doi.env + "\doi{" doi * "}" * + enclose.check +} +FUNCTION {doi.block} +{ doi empty$ + 'skip$ + { start.new.block + format.doi + output.end.block + } + if$ +} +FUNCTION {format.note} +{ "\APACrefnote{" "}" note enclose.check } +FUNCTION {note.block} +{ note empty$ + 'skip$ + { start.new.block + format.note + output.end.block + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format original year of publication and note + % (reprint or translation) + % +FUNCTION {format.orig.year.note} +{ originalyear empty$ + { format.note } + { "\APACorigyearnote{" + originalyear "" connect.check "}{" * + note "" connect.check "}" * + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format original journal of publication and note + % (reprint or translation) + % +FUNCTION {format.orig.journal.note} +{ "\APACorigjournalnote{" + originalyear "" connect.check "}{" * + originaljournal "" connect.check "}{" * + originalvolume "" connect.check "}{" * + originalnumber "" connect.check "}{" * + originalpages "" connect.check "}{" * + note "" connect.check "}" * +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format original book of publication and note + % (reprint or translation) + % +FUNCTION {format.orig.book.note} +{ "\APACorigbooknote{" originalyear "" connect.check "}{" * + % + originaleditor empty$ + 'skip$ + { originaleditor num.names$ #1 > + { "\APACorigEDS {" * originaleditor format.editor.names * "}" * } + { "\APACorigED {" * originaleditor format.editor.names * "}" * } + if$ + } + if$ + % + "}{" * + originalbooktitle format.btitle.no.dot "" connect.check "} {" * + originaledition format.edition.check "" connect.check "} {" * + originalvolume format.bvolume.check "" connect.check "} {" * + originalpages format.bpages.check "" connect.check "} {" * + originaladdress "" connect.check "} {" * + originalpublisher "" connect.check "} {" * + note "" connect.check "}" * +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format information about original publication of reprint + % and format optional note + % +FUNCTION {format.orig.note} +{ originaljournal empty$ + { originalbooktitle empty$ + { note empty$ + { originalyear empty$ + 'skip$ + { originalyear "\bibnodate" = + originalyear "l" change.case$ "no date" = or + originalyear "l" change.case$ "n.d." = or + 'skip$ + { output.new.block + format.orig.year.note + } + if$ + } + if$ + } + { output.new.block + format.orig.year.note + } + if$ + } + { output.new.block + format.orig.book.note + } + if$ + } + { output.new.block + format.orig.journal.note + } + if$ +} +FUNCTION {fin.entry} +{ %doi empty$ + % 'skip$ + % { output.new.block + % format.doi + % } + % if$ + output.end.block + "\PrintBackRefs{\CurrentBib}" write$ newline$ + test + { "\vspace{\baselineskip}" write$ newline$ } + 'skip$ + if$ +} +FUNCTION {fin.entry.2} +{ doi.block + "\PrintBackRefs{\CurrentBib}" write$ newline$ + test + { "\vspace{\baselineskip}" write$ newline$ } + 'skip$ + if$ +} + +FUNCTION {format.archive} +{ + archivePrefix empty$ + { "" } + { archivePrefix ":" *} + if$ +} + +FUNCTION {format.primaryClass} +{ + primaryClass empty$ + { "" } + { " {[" primaryClass * "]}" *} + if$ +} + +FUNCTION {format.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + { "{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.softmisc.archive} +{ + archivePrefix empty$ + { "" } + { "" } + if$ +} + +FUNCTION {format.softmisc.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {periodical} +{ + author empty$ + % + % no author: possibly special issue with editors as authors + % (APA manual, ex. 11, p. 121) + % + { editor empty$ + % + % no author or editor: title serves as author. + % title formatted as article title (APA manual not consistent in this, + % compare statement on p. 119: ``treat as book title'' and + % example 8, p. 121: no underlining => article title) + % + { format.atitle.type.trans.check output.new.block + % + % now formatted date on top of stack + % + output.dot.new.block + } + % + % format editor and year, and check if year is present + % format article title and check if title or type present + % + { format.editors.as.authors start.new.block + % + % now formatted date on top of stack + % + output.dot.new.block + format.atitle.type.trans.check output.new.block + } + if$ + } + % + % format author and year, and check if year is present + % format article title and check if title or type present + % + { format.authors start.new.block + % + % now formatted date on top of stack + % + output.dot.new.block + format.atitle.type.trans.check output.new.block + } + if$ + % + % format journal name, volume and issue number, and pages + % and check if journal not empty + % + format.journal.vol.num.pages.check +% output.new.block + doi empty$ + 'skip$ + { output.new.block + format.doi + } + if$ + % + % if not empty, insert howpublished. + % (used if article is retrieved from the internet) + % +% format.howpublished add.period$ + % + % format url + % + url empty$ + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.url + } + if$ + % + % possible reprint and optional note + % + format.orig.note + output.new.block + format.eprint + output.new.block + format.primaryClass + fin.entry + } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % journal article + % +FUNCTION {article} +{ pages format.year.month.day.check periodical } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % magazine article + % +FUNCTION {magazine} +{ pages format.year.month.day.check periodical } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % newspaper article + % +FUNCTION {newspaper} +{ pages format.bpages.check format.year.month.day.check periodical } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % (translation of) entire book + % +FUNCTION {book} +{ % + % author or editor, + % year, title, englishtitle, translator + % + author empty$ + % + % no author: possibly edited book with editors as authors + % + { editor empty$ + % + % no author or editor: title serves as author. + % title formatted as book title + % + { format.btitle.vol.edition.trans + format.type.number connect.with.space.check + output.dot.new.block + format.year.check add.period$ + } + % + % format editor and year, and check if year is present + % format booktitle, volume, and edition and check if title present + % + { translator empty$ + { format.editors.as.authors start.new.block + format.year.check output.dot.new.block + format.btitle.vol.edition + } + % + % format translator correctly + % + { translator editor = + not + { format.editors.as.authors start.new.block + format.year.check output.dot.new.block + format.btitle.vol.edition.trans + } + { format.ed.trans.as.authors start.new.block + format.year.check output.dot.new.block + format.btitle.vol.edition + } + if$ + } + if$ + format.type.number connect.with.space.check + add.period$ + } + if$ + } + % + % format author and year, and check if year is present + % format booktitle, volume, and edition and check if title present + % + { format.authors start.new.block + format.year.check output.dot.new.block + format.btitle.vol.edition.editor.trans + format.type.number connect.with.space.check + add.period$ + } + if$ + % + % format address and publisher + % + format.address.publisher.check + % + % if not empty, insert howpublished. + % (used if book is retrieved from the internet) + % + format.howpublished add.period$ + % + % format url + % + url empty$ + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.url + } + if$ + % + % format original publication (of reprint/translation) + % and optional note + % + format.orig.note + fin.entry +} +FUNCTION {incollection} +{ author empty$ + { editor.ne.trans + { format.atitle.type.trans.check } + { format.atitle.type.check } + if$ + output.new.block + format.year.month.day.check add.period$ + } + { format.authors start.new.block + format.year.month.day.check output.dot.new.block + editor.ne.trans + { format.atitle.type.trans.check } + { format.atitle.type.check } + if$ + } + if$ + editor empty$ + translator empty$ and + edition empty$ and + volume empty$ and + pages empty$ and + chapter empty$ and + booktitle empty$ and + 'skip$ + { + output.new.block + format.in.editors.trans + format.bvol.edition.pages + booktitle format.btitle.connect * add.period$ + } + if$ + format.address.publisher.check + format.howpublished add.period$ + url empty$ + 'skip$ + { + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.url + } + if$ + format.orig.note + fin.entry +} + +FUNCTION {inbookcollection} +{ author empty$ + { editor.ne.trans + { format.atitle.type.trans.check } + { format.atitle.type.check } + if$ + output.new.block + format.year.month.day.check add.period$ + } + { format.authors start.new.block + format.year.month.day.check output.dot.new.block + editor.ne.trans + { format.atitle.type.trans.check } + { format.atitle.type.check } + if$ + } + if$ + editor empty$ + translator empty$ and + edition empty$ and + volume empty$ and + pages empty$ and + chapter empty$ and + booktitle empty$ and + 'skip$ + { + output.new.block + in.format.in.editors.trans + format.bvol.edition.pages + booktitle format.btitle.connect * add.period$ + } + if$ + format.address.publisher.check + format.howpublished add.period$ + url empty$ + 'skip$ + { + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.url + } + if$ + format.orig.note + fin.entry +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % technical report number + % +FUNCTION {format.tr.number} +{ type empty$ + { "\BTR{}" } + { type "\bibnotype" = + { "" } + { type } + if$ + } + if$ + number format.rnumber.check connect.with.space.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % title, volume, edition, report number + % +FUNCTION {format.tr.title.number} +{ format.betitle.check + % Single out the situation in which there is no number + % and type = {\bibnotype}, i.e., no type as well. + % (Why not use book then?) + type empty$ + { % Now, we're in the regular situation with at least a + % number, a type, a volume, or an edition. + "\APACbVolEdTR{" format.bvol.edition.check * "}{" * + format.tr.number * "}" * + } + { type "\bibnotype" = + number empty$ + volume empty$ + edition empty$ + and + and + and + { "" } + { % Now, we're in the regular situation with at least a + % number, a type, a volume, or an edition. + "\APACbVolEdTR {" format.bvol.edition.check * "}{" * + format.tr.number * "}" * + } + if$ + } + if$ + connect.with.space.check + title format.btitle.connect +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % format address and institution of reports etc. + % + % Washington, DC: National Institute of Education + % or + % National Institute of Education (if address empty) + % + % warning if no institution + % +FUNCTION {format.address.institution.check} +{ url empty$ + doi empty$ and + { "institution" institution warning.if.empty + "address" address warning.if.empty + } + 'skip$ + if$ + institution empty$ + address empty$ + and + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + % + % If institution = author or institution = "author" + % or institution = "Author" then hand over the final choice how to + % format this to \LaTeX. See also format.address.publisher + % + author empty$ + institution empty$ or + { institution "\APACaddressInstitution{" } + { author institution = + "author" institution = or + "Author" institution = or + { author "\APACaddressInstitutionEqAuth{" } + { institution "\APACaddressInstitution{" } + if$ + } + if$ + address "" connect.check "}{" * + % Recover institution that was pushed onto the stack previously. + swap$ "" connect.check "}" * + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % reports + % +FUNCTION {techreport} +{ author empty$ + % + % no author: possibly edited report with editors as authors + % + { editor empty$ + % + % no author or editor: title serves as author. + % title formatted as book title + % + { format.tr.title.number output.dot.new.block + format.year.month.day.check add.period$ + } + % + % format editor and year, and check if year is present + % format report title and check if title present + % format volume, edition, type, and number + % + { format.editors.as.authors start.new.block + format.year.month.day.check output.dot.new.block + format.tr.title.number add.period$ + } + if$ + } + % + % format author and year, and check if year is present + % format report title and check if title present + % format volume, edition, type, and number + % + { format.authors start.new.block + format.year.month.day.check output.dot.new.block + format.tr.title.number add.period$ + } + if$ + % + % format address and institution, check if institution present + % + format.address.institution.check + % + % if not empty, insert howpublished. + % (used if report is retrieved from the internet) + % + format.howpublished add.period$ + % + % format url + % + url empty$ + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.url + } + if$ + % + % format optional note + % + note empty$ + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.note + } + if$ + fin.entry +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % (translated) article or chapter in report + % +FUNCTION {intechreport} +{ author empty$ + % + % no author: title serves as author. + % title formatted as article title (APA manual not consistent in this, + % compare statement on p. 119: ``treat as book title'' and + % example 8, p. 121: no underlining => article title) + % + { editor.ne.trans + { format.atitle.trans.check } + { format.atitle.check } + if$ + output.new.block + format.year.month.day.check output.dot.new.block + } + % + % format author and year, and check if year is present + % format article title and check if title or type present + % + { format.authors start.new.block + format.year.month.day.check output.dot.new.block + editor.ne.trans + { format.atitle.trans.check } + { format.atitle.check } + if$ + output.new.block + } + if$ + % + % format "In " editor " (Ed. \& Trans.), " + % booktitle, volume, edition, pages + % + format.in.editors.trans + % + % volume, edition, report type and number, pages + % + "\APACbVolEdTRpgs {" format.bvol.edition.check * "} {" * + format.tr.number * + "} {" * pages format.bpages.check * + "}" * + % + booktitle format.btitle.connect * + add.period$ + % + % format address and publisher + % + format.address.institution.check + % + % if not empty, insert howpublished. + % (used if report is retrieved from the internet) + % + format.howpublished add.period$ + % + % format url + % + url empty$ + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.url + } + if$ + % + % format original publication (of reprint/translation) + % and optional note + % + format.orig.note + fin.entry +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % papers presented at conferences etc. + % +FUNCTION {lecture} +{ author empty$ + { "author" author warning.if.empty } + { format.authors start.new.block } + if$ + % + % format year, month, and day, and check if year present + % format title and check if title present + % format howpublished and check if howpublished present + % + format.year.month.day.check output.dot.new.block + symposium empty$ + { format.betitle.check + title format.btitle.connect output.new.block + howpublished empty$ + { "symposium and howpublished missing in " cite$ * warning$ + "" + } + { "\APAChowpublished {" howpublished * "}" * } + if$ + address connect.with.comma.check + } + { format.atitle.type.check output.new.block + "\BIn{} " + chair empty$ + 'skip$ + { chair format.editor.names + chair num.names$ #1 > + { "(\BCHAIRS)" } + { "(\BCHAIR)" } + if$ + connect.with.space.check * ", " * + } + if$ + symposium format.btitle.no.dot * + format.howpublished + address connect.with.comma.check + } + if$ + add.period$ + % + % format url + % + url empty$ + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.url + } + if$ + % + % format optional note + % + note empty$ + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.note + } + if$ + fin.entry +} + +FUNCTION {format.ttitle.type.school} +{ doi empty$ not + url empty$ not or + howpublished empty$ not or + { pop$ } + { swap$ pop$ } + if$ + type empty$ + 'skip$ + { type "\bibnotype" = + { pop$ + "" + } + { pop$ + type + } + if$ + } + if$ + duplicate$ empty$ + doi empty$ + url empty$ and + howpublished empty$ and + address empty$ + school empty$ and or and + { 'pop$ + title empty$ not + englishtitle empty$ not or + { start.new.block } + 'skip$ + if$ + "" + } + { start.new.block + "\APACtypeAddressSchool {" swap$ * "}{" * + doi empty$ + url empty$ and + howpublished empty$ and + { "}{}" * } + { address "" connect.check "}{" * + school "" connect.check "}" * + } + if$ + } + if$ + format.betitle.check swap$ + connect.with.space.check + "title" title warning.if.empty + title format.btitle.connect +} +FUNCTION {unpub.address.school.block} +{ doi empty$ + url empty$ and + howpublished empty$ and + { "school" school warning.if.empty + school empty$ + address empty$ and + 'skip$ + { start.new.block + "\APACaddressSchool {" address "" connect.check "}{" * + school "" connect.check "}" * + output.dot.end.block + } + if$ + } + 'skip$ + if$ +} +FUNCTION {thesis} +{ journal empty$ not + { pop$ pop$ + article + } + { author empty$ + { "author" author warning.if.empty } + { format.authors start.new.block } + if$ + format.year.check output.dot.end.block + format.ttitle.type.school output.dot.end.block + unpub.address.school.block + howpublished.block + url.block + note.block + fin.entry.2 + } + if$ +} +FUNCTION {phdthesis} +{ "\BPhD" "\BUPhD" thesis } +FUNCTION {mastersthesis} +{ "\BMTh" "\BUMTh" thesis } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % title of something (used in unpublished and misc) + % english translation of title + % type and number of something + % +FUNCTION {format.btitle.type.num} +{ format.betitle.check + format.bvol.edition connect.with.space.check + format.type.number + connect.with.space.check + title empty$ + { add.period$ } + { title format.btitle.connect } + if$ +} + +FUNCTION {format.version} +{ + version empty$ + { "" } + { " " * version *} + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % title of message or software-related thing (used in misc) + % english translation of title + % type and number of something + % +FUNCTION {format.mtitle.type.num} +{ format.aetitle.check + format.bvol.edition connect.with.space.check + type.2 "\bibmessage" = + { number empty$ + 'skip$ + { type.2 number tie.or.space.connect + bracket.check + connect.with.space.check + } + if$ + } + { format.type.number + connect.with.space.check + } + if$ + title empty$ + { add.period$ } + { title format.atitle.connect } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % title, english translation of title, + % type and number of something (used in misc) + % +FUNCTION {output.misctitle.type.num} +{ type.2 empty$ + { format.btitle.type.num } + { type.2 "\bibmessage" = + type.2 "\bibcomputerprogram" = or + type.2 "\bibcomputerprogrammanual" = or + type.2 "\bibcomputerprogramandmanual" = or + type.2 "\bibcomputersoftware" = or + type.2 "\bibcomputersoftwaremanual" = or + type.2 "\bibcomputersoftwareandmanual" = or + type.2 "\bibprogramminglanguage" = or + { format.mtitle.type.num } + { format.btitle.type.num } + if$ + } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % unpublished manuscripts, etc. + % +FUNCTION {unpublished} +{ check.relevant.fields + author empty$ + % + % no author: possibly edited book with editors as authors + % + { editor empty$ + % + % no author or editor: title serves as author. + % title formatted as book title + % + { format.btitle.type.num output.new.block + format.year.month.day.check add.period$ + } + % + % format editor and year, and check if year is present + % format book title, volume, and edition and check if title present + % + { format.editors.as.authors start.new.block + format.year.month.day.check output.dot.new.block + format.btitle.type.num + } + if$ + } + % + % format author and year, and check if year is present + % format book title, volume, and edition + % and check if title or type present + % + { format.authors start.new.block + format.year.month.day.check output.dot.new.block + format.btitle.type.num + } + if$ + howpublished empty$ + organization empty$ and + address empty$ and + 'skip$ + { output.new.block + "\APAChowpublished{" "}" howpublished enclose.check + organization connect.with.comma.check + address connect.with.comma.check + add.period$ + } + if$ + % + % format url + % + url empty$ + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.url + } + if$ + % + % format optional note + % + note empty$ + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.note + } + if$ + fin.entry +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % nonprint media and other things that don't fit + % +FUNCTION {misc} +{ % + % To handle @manual: use type.2 instead of type. + type.2 empty$ + type empty$ not and + { type 'type.2 := } + 'skip$ + if$ + % + author empty$ + % + % no author: possibly edited item with editors as authors + % + { editor empty$ + % + % no author or editor: title/type serves as author. + % title formatted as book title + % + % if no title and no type, howpublished is title + % + { title empty$ + type.2 empty$ and + { howpublished empty$ + { "No author, editor, title, type, and howpublished in " + cite$ * warning$ + "" + } + { "\APAChowpublished{" howpublished * "}" * add.period$ } + if$ + format.year.month.day.check add.period$ + } + { output.misctitle.type.num %output.new.block + format.year.month.day.check add.period$ + format.howpublished add.period$ + } + if$ + } + % + % format editor and year, and check if year is present + % format book title, volume, and edition and check if title present + % + { format.editors.as.authors start.new.block + format.year.month.day.check output.dot.new.block + output.misctitle.type.num output.dot.new.block + format.howpublished add.period$ + } + if$ + } + % + % format author and year, and check if year is present + % format book title, volume, and edition + % and check if title or type present + % + { format.authors start.new.block + format.year.month.day.check output.dot.new.block + output.misctitle.type.num + format.howpublished add.period$ + } + if$ + % + address empty$ + publisher empty$ and + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.address.publisher add.period$ + } + if$ + % + % format url + % + url empty$ + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.url + } + if$ + % + % format optional note + % + note empty$ + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.note + } + if$ + fin.entry +} + +FUNCTION {softmisc} +{ % + % To handle @manual: use type.2 instead of type. + type.2 empty$ + type empty$ not and + { type 'type.2 := } + 'skip$ + if$ + % + author empty$ + % + % no author: possibly edited item with editors as authors + % + { editor empty$ + % + % no author or editor: title/type serves as author. + % title formatted as book title + % + % if no title and no type, howpublished is title + % + { title empty$ + type.2 empty$ and + { howpublished empty$ + { "No author, editor, title, type, and howpublished in " + cite$ * warning$ + "" + } + { "\APAChowpublished{" howpublished * "}" * add.period$ } + if$ + format.year.month.day.check add.period$ + } + { output.misctitle.type.num %output.new.block + format.year.month.day.check add.period$ + format.howpublished add.period$ + } + if$ + } + % + % format editor and year, and check if year is present + % format book title, volume, and edition and check if title present + % + { format.editors.as.authors start.new.block + format.year.month.day.check output.dot.new.block + output.misctitle.type.num output.dot.new.block + format.howpublished add.period$ + } + if$ + } + % + % format author and year, and check if year is present + % format book title, volume, and edition + % and check if title or type present + % + { format.authors start.new.block + format.year.nomonth.day.check output.dot.new.block + output.misctitle.type.num + format.version + format.howpublished add.period$ + } + if$ + % + address empty$ + publisher empty$ and + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.address.publisher add.period$ + } + if$ + % + % format url + % + url empty$ + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.url + } + if$ + % + % format optional note + % + note empty$ + 'skip$ + { % Clear the stack + duplicate$ empty$ + 'skip$ + { output.new.block } + if$ + format.note + } + if$ + output.dot.new.block + format.softmisc.eprint + fin.entry +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % for legal cases and other cases that need to be + % done by hand + % +FUNCTION {literal} +{ "key" key warning.if.empty + "text" text warning.if.empty + text empty$ + { "" } + { text } + if$ + fin.entry +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % technical documentation + % +FUNCTION {manual} +{ % + % If type is empty, assume that it is a computer software manual. + % + type empty$ + { "\bibcomputersoftwaremanual" 'type.2 := } + 'skip$ + if$ + misc +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % booklet + % +FUNCTION {booklet} +{ misc } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % part of a book + % +FUNCTION {inbook} +{ inbookcollection } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % article in proceedings + % +FUNCTION {inproceedings} +{ incollection } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % article in proceedings (Kopka & Daly, 2004, p. 230) + % +FUNCTION {conference} +{ inproceedings } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % proceedings + % +FUNCTION {proceedings} +{ misc } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % unknown types + % +FUNCTION {default.type} +{ misc } + +FUNCTION {initialize} +{ + #6 'name.max := +%% #250 'entry.max$ := +%% #5000 'global.max$ := +} +FUNCTION {init.old.number} +{ #0 'old.number := } +FUNCTION {init.old.label} +{ "zzzzzz" 'old.label := } +FUNCTION {init.cite.initials.add.to.year} +{ #0 'cite.initials := + #0 'add.to.year := +} +FUNCTION {move.forward} +{ #1 'forward := } +FUNCTION {move.backward} +{ #0 'forward := } +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{}" write$ newline$ + "\renewcommand{\doi}[1]{\url{https://doi.org/#1}}" + write$ newline$ + "\bibcommenthead" write$ newline$ +} +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} +FUNCTION {write.bbl.entry} +{ + make.cite.labels + call.type$ +} +READ +EXECUTE { identify.apacite.version } +EXECUTE { initialize } +EXECUTE { init.old.number } +ITERATE { make.citeorder.number } +ITERATE { make.sort.title } +SORT +EXECUTE { init.old.number } +EXECUTE { init.old.label } +ITERATE { make.title.number } +ITERATE { make.tentative.sort.label } +SORT +ITERATE { init.cite.initials.add.to.year } +EXECUTE { init.initials } +ITERATE { check.add.initials } +EXECUTE { init.initials } +REVERSE { check.add.initials } +ITERATE { tentative.cite.num.names } +EXECUTE { init.cite.num.names } +EXECUTE { move.forward } +ITERATE { definitive.cite.num.names } +EXECUTE { init.cite.num.names } +EXECUTE { move.backward } +REVERSE { definitive.cite.num.names } +ITERATE { make.final.sort.key } +SORT +EXECUTE { begin.bib } +ITERATE { write.bbl.entry } +EXECUTE { end.bib } + +%% +%% End of file `sn-apacite.bst'. diff --git a/waypoint_control/sn-article-template/bst/sn-aps.bst b/waypoint_control/sn-article-template/bst/sn-aps.bst new file mode 100644 index 0000000..c6693bf --- /dev/null +++ b/waypoint_control/sn-article-template/bst/sn-aps.bst @@ -0,0 +1,1531 @@ +%% +%% This is file `sn-aps.bst', +%% generated with the docstrip utility. +%% +%% The original source files were: merlin.mbs +%% ------------------------------------------ +%%********************************************************************************%% +%% For Springer physics publications. Based on the APS reference style. %% +%%********************************************************************************%% +%% + % =============================================================== + % IMPORTANT NOTICE: + % This bibliographic style (bst) file has been generated from one or + % more master bibliographic style (mbs) files, listed above. + % + % This file can be redistributed and/or modified under the terms + % of the LaTeX Project Public License Distributed from CTAN + % archives in directory macros/latex/base/lppl.txt; either + % version 1 of the License, or any later version. + % =============================================================== + % For use with BibTeX version 0.99a or later + %------------------------------------------------------------------- + % This bibliography style file is intended for texts in ENGLISH + % This is a numerical citation style, and as such is standard LaTeX. + % It requires no extra package to interface to the main text. + % The form of the \bibitem entries is + % \bibitem{key}... + % Usage of \cite is as follows: + % \cite{key} ==>> [#] + % \cite[chap. 2]{key} ==>> [#, chap. 2] + % where # is a number determined by the ordering in the reference list. + % The order in the reference list is that by which the works were originally + % cited in the text, or that in the database. + %--------------------------------------------------------------------- + +FUNCTION {identify.aps.version} +{ % Put identifying string in the .blg file + "sn-aps.bst" + " [2024/07/19 v1.1 APS bibliography style]" + * top$ +} + +ENTRY + { address + author + booktitle + chapter + doi + edition + editor + eid + howpublished + institution + journal + key + keywords + month + note + number + organization + pages + publisher + school + series + title + type + url + volume + year + eprint + archive + archivePrefix + primaryClass + adsurl + adsnote + version + } + {} + { label } +INTEGERS { output.state before.all mid.sentence after.sentence after.block } +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} +STRINGS { s t} +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} +FUNCTION {fin.entry} +{ duplicate$ empty$ + 'pop$ + 'write$ + if$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + +FUNCTION {add.comma} +{ duplicate$ empty$ + 'skip$ + { "," * add.blank } + if$ +} + +FUNCTION {date.block} +{ + new.block +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\emph{" swap$ * "}" * } + if$ +} +FUNCTION {bolden} +{ duplicate$ empty$ + { pop$ "" } + { "\textbf{" swap$ * "}" * } + if$ +} +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {capitalize} +{ "u" change.case$ "t" change.case$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + % Here are the language-specific definitions for explicit words. + % Each function has a name bbl.xxx where xxx is the English word. + % The language selected here is ENGLISH +FUNCTION {bbl.and} +{ "and"} + +FUNCTION {bbl.etal} +{ "et~al." } + +FUNCTION {bbl.editors} +{ "eds." } + +FUNCTION {bbl.editor} +{ "ed." } + +FUNCTION {bbl.edby} +{ "ed. by" } + +FUNCTION {bbl.edition} +{ "edn." } + +FUNCTION {bbl.volume} +{ "vol." } + +FUNCTION {bbl.of} +{ "of" } + +FUNCTION {bbl.number} +{ "no." } + +FUNCTION {bbl.nr} +{ "no." } + +FUNCTION {bbl.in} +{ "in" } + +FUNCTION {bbl.pages} +{ "pp." } + +FUNCTION {bbl.page} +{ "p." } + +FUNCTION {bbl.chapter} +{ "chap." } + +FUNCTION {bbl.techrep} +{ "Tech. Rep." } + +FUNCTION {bbl.mthesis} +{ "Master's thesis" } + +FUNCTION {bbl.phdthesis} +{ "Ph.D. thesis" } + +FUNCTION {bbl.first} +{ "1st" } + +FUNCTION {bbl.second} +{ "2nd" } + +FUNCTION {bbl.third} +{ "3rd" } + +FUNCTION {bbl.fourth} +{ "4th" } + +FUNCTION {bbl.fifth} +{ "5th" } + +FUNCTION {bbl.st} +{ "st" } + +FUNCTION {bbl.nd} +{ "nd" } + +FUNCTION {bbl.rd} +{ "rd" } + +FUNCTION {bbl.th} +{ "th" } + +MACRO {jan} {"Jan."} + +MACRO {feb} {"Feb."} + +MACRO {mar} {"Mar."} + +MACRO {apr} {"Apr."} + +MACRO {may} {"May"} + +MACRO {jun} {"Jun."} + +MACRO {jul} {"Jul."} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sep."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + +FUNCTION {eng.ord} +{ duplicate$ "1" swap$ * + #-2 #1 substring$ "1" = + { bbl.th * } + { duplicate$ #-1 #1 substring$ + duplicate$ "1" = + { pop$ bbl.st * } + { duplicate$ "2" = + { pop$ bbl.nd * } + { "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ + } + if$ +} + +MACRO {acmcs} {"ACM Comput. Surv."} + +MACRO {acta} {"Acta Inf."} + +MACRO {cacm} {"Commun. ACM"} + +MACRO {ibmjrd} {"IBM J. Res. Dev."} + +MACRO {ibmsj} {"IBM Syst.~J."} + +MACRO {ieeese} {"IEEE Trans. Software Eng."} + +MACRO {ieeetc} {"IEEE Trans. Comput."} + +MACRO {ieeetcad} + {"IEEE Trans. Comput. Aid. Des."} + +MACRO {ipl} {"Inf. Process. Lett."} + +MACRO {jacm} {"J.~ACM"} + +MACRO {jcss} {"J.~Comput. Syst. Sci."} + +MACRO {scp} {"Sci. Comput. Program."} + +MACRO {sicomp} {"SIAM J. Comput."} + +MACRO {tocs} {"ACM Trans. Comput. Syst."} + +MACRO {tods} {"ACM Trans. Database Syst."} + +MACRO {tog} {"ACM Trans. Graphic."} + +MACRO {toms} {"ACM Trans. Math. Software"} + +MACRO {toois} {"ACM Trans. Office Inf. Syst."} + +MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} + +MACRO {tcs} {"Theor. Comput. Sci."} + +FUNCTION {bibinfo.check} +{ swap$ + duplicate$ missing$ + { + pop$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ pop$ + } + { swap$ + pop$ + } + if$ + } + if$ +} +FUNCTION {bibinfo.warn} +{ swap$ + duplicate$ missing$ + { + swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ "empty " swap$ * " in " * cite$ * warning$ + } + { swap$ + pop$ + } + if$ + } + if$ +} +FUNCTION {format.url} +{ url empty$ + { "" } + { "\urlprefix\url{" url * "}" * } + if$ +} + +STRINGS { bibinfo} +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{f{.}.~}{vv~}{ll}{, jj}" + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + "," * + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal * + } + { " " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} +FUNCTION {format.names.ed} +{ + format.names +} +FUNCTION {format.authors} +{ author "author" format.names +} +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { + " " * + get.bbl.editor + "(" swap$ * ")" * + * + } + if$ +} +FUNCTION {format.doi} +{ doi "doi" bibinfo.check + duplicate$ empty$ 'skip$ + { + new.block + "\doi{" swap$ * "}" * + } + if$ +} +FUNCTION {format.note} +{ + note empty$ + { "" } + { note #1 #1 substring$ + duplicate$ "{" = + 'skip$ + { output.state mid.sentence = + { "l" } + { "u" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + } + if$ +} + +FUNCTION {format.title} +{ title + duplicate$ empty$ 'skip$ + { "t" change.case$ } + if$ + "title" bibinfo.check +} +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {if.digit} +{ duplicate$ "0" = + swap$ duplicate$ "1" = + swap$ duplicate$ "2" = + swap$ duplicate$ "3" = + swap$ duplicate$ "4" = + swap$ duplicate$ "5" = + swap$ duplicate$ "6" = + swap$ duplicate$ "7" = + swap$ duplicate$ "8" = + swap$ "9" = or or or or or or or or or +} +FUNCTION {n.separate} +{ 't := + "" + #0 'numnames := + { t empty$ not } + { t #-1 #1 substring$ if.digit + { numnames #1 + 'numnames := } + { #0 'numnames := } + if$ + t #-1 #1 substring$ swap$ * + t #-2 global.max$ substring$ 't := + numnames #5 = + { duplicate$ #1 #2 substring$ swap$ + #3 global.max$ substring$ + "," swap$ * * + } + 'skip$ + if$ + } + while$ +} +FUNCTION {n.dashify} +{ +%% n.separate + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.in + " " * } + +FUNCTION {format.date} +{ + "" + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { swap$ 'skip$ + { + swap$ + " " * swap$ + } + if$ + * + } + if$ + duplicate$ empty$ + 'skip$ + { + before.all 'output.state := + " (" swap$ * ")" * + } + if$ +} +FUNCTION {format.btitle} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + emphasize + } + if$ +} +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { bbl.volume volume tie.or.space.prefix + "volume" bibinfo.check * * + series "series" bibinfo.check + duplicate$ empty$ 'pop$ + { emphasize ", " * swap$ * } + if$ + "volume and number" number either.or.check + } + if$ +} +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { series empty$ + { number "number" bibinfo.check } + { output.state mid.sentence = + { bbl.number } + { bbl.number capitalize } + if$ + number tie.or.space.prefix "number" bibinfo.check * * + bbl.in space.word * + series "series" bibinfo.check * + } + if$ + } + if$ + } + { "" } + if$ +} +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + +FUNCTION {convert.edition} +{ extract.num "l" change.case$ 's := + s "first" = s "1" = or + { bbl.first 't := } + { s "second" = s "2" = or + { bbl.second 't := } + { s "third" = s "3" = or + { bbl.third 't := } + { s "fourth" = s "4" = or + { bbl.fourth 't := } + { s "fifth" = s "5" = or + { bbl.fifth 't := } + { s #1 #1 substring$ is.num + { s eng.ord 't := } + { edition 't := } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + t +} + +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { + convert.edition + output.state mid.sentence = + { "l" } + { "t" } + if$ change.case$ + "edition" bibinfo.check + " " * bbl.edition * + } + if$ +} +INTEGERS { multiresult } +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { duplicate$ multi.page.check + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + } + if$ +} +FUNCTION {first.page} +{ 't := + "" + { t empty$ not t #1 #1 substring$ "-" = not and } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + while$ +} + +FUNCTION {format.journal.pages} +{ pages duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ + { pop$ pop$ format.pages } + { + ", " * + swap$ + n.dashify + "pages" bibinfo.check + * + } + if$ + } + if$ +} +FUNCTION {format.journal.eid} +{ eid "eid" bibinfo.check + duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ 'skip$ + { + ", " * + } + if$ + swap$ * + } + if$ +} +FUNCTION {format.vol.num.pages} +{ volume field.or.null + duplicate$ empty$ 'skip$ + { + "volume" bibinfo.check + } + if$ + bolden + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + "(" swap$ * ")" * + } + if$ * + eid empty$ + { format.journal.pages } + { format.journal.eid } + if$ +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ +} + +FUNCTION {format.booktitle} +{ + booktitle "booktitle" bibinfo.check + emphasize +} + +FUNCTION {format.in.ed.booktitle} +{format.booktitle duplicate$ empty$ 'skip$ + { + format.bvolume duplicate$ empty$ 'pop$ + { ", " swap$ * * } + if$ + editor "editor" format.names.ed duplicate$ empty$ 'pop$ + { + bbl.edby + " " * swap$ * + swap$ + "," * + " " * swap$ + * } + if$ + word.in swap$ * + } + if$ +} +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} +FUNCTION {format.thesis.type} +{ type duplicate$ empty$ + 'pop$ + { swap$ pop$ + "t" change.case$ "type" bibinfo.check + } + if$ +} +FUNCTION {format.tr.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ bbl.techrep } + 'skip$ + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ "t" change.case$ } + { tie.or.space.prefix * * } + if$ +} +FUNCTION {format.article.crossref} +{ + key duplicate$ empty$ + { pop$ + journal duplicate$ empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * warning$ } + { "journal" bibinfo.check emphasize word.in swap$ * } + if$ + } + { word.in swap$ * " " *} + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.crossref.editor} +{ editor #1 "{vv~}{ll}" format.name$ + "editor" bibinfo.check + editor num.names$ duplicate$ + #2 > + { pop$ + "editor" bibinfo.check + " " * bbl.etal + * + } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { + "editor" bibinfo.check + " " * bbl.etal + * + } + { + bbl.and space.word + * editor #2 "{vv~}{ll}" format.name$ + "editor" bibinfo.check + * + } + if$ + } + if$ + } + if$ +} +FUNCTION {format.book.crossref} +{ volume duplicate$ empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + pop$ word.in + } + { bbl.volume + capitalize + swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * + } + if$ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" * + } + { series emphasize * } + if$ + } + { key * } + if$ + } + { format.crossref.editor * } + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.incoll.inproc.crossref} +{ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { format.booktitle duplicate$ empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + } + { word.in swap$ * } + if$ + } + { word.in key * " " *} + if$ + } + { word.in format.crossref.editor * " " *} + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.org.or.pub} +{ 't := + "" + year empty$ + { "empty year in " cite$ * warning$ } + 'skip$ + if$ + address empty$ t empty$ and + year empty$ and + 'skip$ + { + add.blank "(" * + t empty$ + { address "address" bibinfo.check * + } + { t * + address empty$ + 'skip$ + { ", " * address "address" bibinfo.check * } + if$ + } + if$ + year empty$ + 'skip$ + { t empty$ address empty$ and + 'skip$ + { ", " * } + if$ + year "year" bibinfo.check + * + } + if$ + ")" * + } + if$ +} +FUNCTION {format.publisher.address} +{ publisher "publisher" bibinfo.warn format.org.or.pub +} + +FUNCTION {format.organization.address} +{ organization "organization" bibinfo.check format.org.or.pub +} + +FUNCTION {format.softmisc.archive} +{ + archivePrefix empty$ + { "" } + { "" } + if$ +} + +FUNCTION {format.archive} +{ + archivePrefix empty$ + { "" } + { archivePrefix ":" *} + if$ +} + +FUNCTION {format.primaryClass} +{ + primaryClass empty$ + { "" } + { "{[" primaryClass * "]}" *} + if$ +} + +FUNCTION {format.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.softmisc.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + add.comma + format.title "title" output.check + new.block + crossref missing$ + { + journal + "journal" bibinfo.check + "journal" output.check + add.blank + format.vol.num.pages output + format.date "year" output.check + } + { format.article.crossref output.nonnull + format.pages output + } + if$ + format.doi output + new.block + format.url output + new.block + format.note output + new.block + format.eprint output + add.blank + format.primaryClass output + fin.entry +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + add.comma + format.btitle "title" output.check + crossref missing$ + { format.bvolume output + format.edition output + new.block + format.number.series output + new.sentence + format.publisher.address output + format.pages output + } + { + new.block + format.book.crossref output.nonnull + format.date "year" output.check + } + if$ + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} +FUNCTION {booklet} +{ output.bibitem + format.authors output + add.comma + format.title "title" output.check + new.block + howpublished "howpublished" bibinfo.check output + address "address" bibinfo.check output + format.date output + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + add.comma + format.btitle "title" output.check + crossref missing$ + { + format.publisher.address output + format.bvolume output + format.edition output + format.chapter.pages "chapter and pages" output.check + new.block + format.number.series output + new.sentence + } + { + format.chapter.pages "chapter and pages" output.check + new.block + format.book.crossref output.nonnull + format.date "year" output.check + } + if$ + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + add.comma + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.edition output + format.number.series output + format.publisher.address output + format.chapter.pages output + new.sentence + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + add.comma + format.btitle "title" output.check + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + new.sentence + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + format.number.series output + format.pages output + } + { format.incoll.inproc.crossref output.nonnull + format.pages output + } + if$ + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} +FUNCTION {conference} { inproceedings } +FUNCTION {manual} +{ output.bibitem + author empty$ + { organization "organization" bibinfo.check + duplicate$ empty$ 'pop$ + { output + address "address" bibinfo.check output + } + if$ + } + { format.authors output.nonnull } + if$ + add.comma + format.btitle "title" output.check + author empty$ + { organization empty$ + { + address new.block.checka + address "address" bibinfo.check output + } + 'skip$ + if$ + } + { + organization address new.block.checkb + organization "organization" bibinfo.check output + address "address" bibinfo.check output + } + if$ + format.edition output + format.date output + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + add.comma + format.title + "title" output.check + new.block + bbl.mthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + title howpublished new.block.checkb + format.title output + howpublished new.block.checka + howpublished "howpublished" bibinfo.check output + format.date output + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry + empty.misc.check +} + +FUNCTION {softmisc} +{ output.bibitem + format.authors output + title howpublished new.block.checkb + format.title output + version output + howpublished new.block.checka + howpublished "howpublished" bibinfo.check output + format.date output + format.doi output + new.block + format.url output + new.block + format.note output + new.block + format.softmisc.eprint output + fin.entry + empty.misc.check +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + add.comma + format.title + "title" output.check + new.block + bbl.phdthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization "organization" bibinfo.check output + } + { format.editors output.nonnull } + if$ + new.block + format.btitle "title" output.check + format.bvolume output + format.number.series output + editor empty$ + { publisher empty$ + 'skip$ + { + new.sentence + format.publisher.address output + } + if$ + } + { publisher empty$ + { + new.sentence + format.organization.address output } + { + new.sentence + organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + } + if$ + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + add.comma + format.title + "title" output.check + new.block + format.tr.number output.nonnull + institution "institution" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + add.comma + format.title "title" output.check + format.date output + format.doi output + new.block + format.url output + new.block + format.note "note" output.check + fin.entry +} + +FUNCTION {default.type} { misc } +READ +EXECUTE {identify.aps.version} +STRINGS { longest.label } +INTEGERS { number.label longest.label.width } +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\providecommand{\url}[1]{{#1}}" + write$ newline$ + "\providecommand{\urlprefix}{URL }" + write$ newline$ + %%"\expandafter\ifx\csname urlstyle\endcsname\relax" + %% write$ newline$ + %%" \providecommand{\doi}[1]{\discretionary{}{}{}#1}\else" + %%write$ newline$ + %%" \providecommand{\doi}{\discretionary{}{}{}\begingroup \urlstyle{rm}\Url}\fi" + "\providecommand{\doi}[1]{\url{https://doi.org/#1}}" + write$ newline$ + "" write$ newline$ +} +EXECUTE {begin.bib} +EXECUTE {init.state.consts} +ITERATE {call.type$} +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} +EXECUTE {end.bib} +%% +%% End of file `sn-aps.bst'. + diff --git a/waypoint_control/sn-article-template/bst/sn-basic.bst b/waypoint_control/sn-article-template/bst/sn-basic.bst new file mode 100644 index 0000000..1eea5a2 --- /dev/null +++ b/waypoint_control/sn-article-template/bst/sn-basic.bst @@ -0,0 +1,1818 @@ +%% +%% This is file `sn-basic.bst', +%% generated with the docstrip utility. +%% +%% The original source files were: merlin.mbs +%% ---------------------------------------- +%% +%%**************************************************************************************%% +%% %% +%% For Springer medical, life sciences, chemistry, geology, engineering and %% +%% computer science publications. %% +%% For use with the natbib package (see below). Default is author-year citations. %% +%% When citations are numbered, please use \documentclass[sn-basic, Numbered]{sn-jnl}. %% +%% %% +%% Per default the reference list entries are alphabetized. %% +%% If the entries in the list should be numbered consecutively comment out the %% +%% two lines including SORT (in uppercase). %% +%%**************************************************************************************%% + % This file can be redistributed and/or modified under the terms + % of the LaTeX Project Public License Distributed from CTAN + % archives in directory macros/latex/base/lppl.txt; either + % version 1 of the License, or any later version. + % + % This bibliography style file is intended for texts in ENGLISH + % This is an author-year citation style bibliography. As such, it is + % non-standard LaTeX, and requires a special package file to function properly. + % Such a package is natbib.sty by Patrick W. Daly + % The form of the \bibitem entries is + % \bibitem[Jones et al.(1990)]{key}... + % \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}... + % The essential feature is that the label (the part in brackets) consists + % of the author names, as they should appear in the citation, with the year + % in parentheses following. There must be no space before the opening + % parenthesis! + % With natbib v5.3, a full list of authors may also follow the year. + % In natbib.sty, it is possible to define the type of enclosures that is + % really wanted (brackets or parentheses), but in either case, there must + % be parentheses in the label. + % The \cite command functions as follows: + % \citet{key} ==>> Jones et al. (1990) + % \citet*{key} ==>> Jones, Baker, and Smith (1990) + % \citep{key} ==>> (Jones et al. 1990) + % \citep*{key} ==>> (Jones, Baker, and Smith 1990) + % \citep[chap. 2]{key} ==>> (Jones et al. 1990, chap. 2) + % \citep[e.g.][]{key} ==>> (e.g. Jones et al. 1990) + % \citep[e.g.][p. 32]{key} ==>> (e.g. Jones et al., p. 32) + % \citeauthor{key} ==>> Jones et al. + % \citeauthor*{key} ==>> Jones, Baker, and Smith + % \citeyear{key} ==>> 1990 + %--------------------------------------------------------------------- + +FUNCTION {identify.basic.version} +{ % Put identifying string in the .blg file + "sn-basic.bst" + " [2024/07/19 v1.1 bibliography style]" + * top$ +} + +ENTRY + { address + archive + author + booktitle + chapter + doi + edition + editor + eid + eprint + howpublished + institution + journal + key + keywords + month + note + number + organization + pages + publisher + school + series + title + type + url + volume + year + archivePrefix + primaryClass + adsurl + adsnote + version + } + {} + { label extra.label sort.label short.list } +INTEGERS { output.state before.all mid.sentence after.sentence after.block } +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} +STRINGS { s t} +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} +FUNCTION {fin.entry} +{ duplicate$ empty$ + 'pop$ + 'write$ + if$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + +FUNCTION {no.blank.or.punct} +{ "\hspace{0pt}" * before.all 'output.state := +} + +FUNCTION {date.block} +{ + add.blank +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} +STRINGS {z} +FUNCTION {remove.dots} +{ 'z := + "" + { z empty$ not } + { z #1 #1 substring$ + z #2 global.max$ substring$ 'z := + duplicate$ "." = 'pop$ + { * } + if$ + } + while$ +} +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} +FUNCTION {emphasize} +{ skip$ } +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {capitalize} +{ "u" change.case$ "t" change.case$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + % Here are the language-specific definitions for explicit words. + % Each function has a name bbl.xxx where xxx is the English word. + % The language selected here is ENGLISH +FUNCTION {bbl.and} +{ "and"} + +FUNCTION {bbl.etal} +{ "et~al." } + +FUNCTION {refbbl.etal} +{ "et~al" } + +FUNCTION {bbl.editors} +{ "eds" } + +FUNCTION {bbl.editor} +{ "ed" } + +FUNCTION {bbl.edby} +{ "edited by" } + +FUNCTION {bbl.edition} +{ "edn." } + +FUNCTION {bbl.volume} +{ "vol" } + +FUNCTION {bbl.of} +{ "of" } + +FUNCTION {bbl.number} +{ "no." } + +FUNCTION {bbl.nr} +{ "no." } + +FUNCTION {bbl.in} +{ "in" } + +FUNCTION {bbl.pages} +{ "pp" } + +FUNCTION {bbl.incoll.pages} +{ "p" } + +FUNCTION {bbl.page} +{ "p" } + +FUNCTION {bbl.chapter} +{ "chap" } + +FUNCTION {bbl.techrep} +{ "Tech. Rep." } + +FUNCTION {bbl.mthesis} +{ "Master's thesis" } + +FUNCTION {bbl.phdthesis} +{ "PhD thesis" } + +FUNCTION {bbl.first} +{ "1st" } + +FUNCTION {bbl.second} +{ "2nd" } + +FUNCTION {bbl.third} +{ "3rd" } + +FUNCTION {bbl.fourth} +{ "4th" } + +FUNCTION {bbl.fifth} +{ "5th" } + +FUNCTION {bbl.st} +{ "st" } + +FUNCTION {bbl.nd} +{ "nd" } + +FUNCTION {bbl.rd} +{ "rd" } + +FUNCTION {bbl.th} +{ "th" } + +MACRO {jan} {"Jan."} + +MACRO {feb} {"Feb."} + +MACRO {mar} {"Mar."} + +MACRO {apr} {"Apr."} + +MACRO {may} {"May"} + +MACRO {jun} {"Jun."} + +MACRO {jul} {"Jul."} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sep."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + +FUNCTION {eng.ord} +{ duplicate$ "1" swap$ * + #-2 #1 substring$ "1" = + { bbl.th * } + { duplicate$ #-1 #1 substring$ + duplicate$ "1" = + { pop$ bbl.st * } + { duplicate$ "2" = + { pop$ bbl.nd * } + { "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ + } + if$ +} + +MACRO {acmcs} {"ACM Comput Surv"} + +MACRO {acta} {"Acta Inf"} + +MACRO {cacm} {"Commun ACM"} + +MACRO {ibmjrd} {"IBM~J~Res Dev"} + +MACRO {ibmsj} {"IBM Syst~J"} + +MACRO {ieeese} {"IEEE Trans Softw Eng"} + +MACRO {ieeetc} {"IEEE Trans Comput"} + +MACRO {ieeetcad} + {"IEEE Trans Comput Aid Des"} + +MACRO {ipl} {"Inf Process Lett"} + +MACRO {jacm} {"J~ACM"} + +MACRO {jcss} {"J~Comput Syst Sci"} + +MACRO {scp} {"Sci Comput Program"} + +MACRO {sicomp} {"SIAM J~Comput"} + +MACRO {tocs} {"ACM Trans Comput Syst"} + +MACRO {tods} {"ACM Trans Database Syst"} + +MACRO {tog} {"ACM Trans Graphic"} + +MACRO {toms} {"ACM Trans Math Softw"} + +MACRO {toois} {"ACM Trans Office Inf Syst"} + +MACRO {toplas} {"ACM Trans Program Lang Syst"} + +MACRO {tcs} {"Theor Comput Sci"} + +FUNCTION {bibinfo.check} +{ swap$ + duplicate$ missing$ + { + pop$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ pop$ + } + { swap$ + pop$ + } + if$ + } + if$ +} +FUNCTION {bibinfo.warn} +{ swap$ + duplicate$ missing$ + { + swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ "empty " swap$ * " in " * cite$ * warning$ + } + { swap$ + pop$ + } + if$ + } + if$ +} + +%%Commented on 17th July 2024 +%FUNCTION {format.eprint} +%{ eprint duplicate$ empty$ +% 'skip$ +% { "\eprint" +% archive empty$ +% 'skip$ +% { "[" * archive * "]" * } +% if$ +% "{" * swap$ * "}" * +% } +% if$ +%} + +FUNCTION {format.archive} +{ + archivePrefix empty$ + { "" } + { archivePrefix ":" *} + if$ +} + +%%Updated on 17th July 2024 +FUNCTION {format.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + + + +FUNCTION {format.primaryClass} +{ + primaryClass empty$ + { "" } + { "{[" primaryClass * "]}" *} + if$ +} + +FUNCTION {format.soft.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.softmisc.archive} +{ + archivePrefix empty$ + { "" } + { "" } + if$ +} + +FUNCTION {format.softmisc.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.url} +{ url empty$ + { "" } + { "\urlprefix\url{" url * "}" * } + if$ +} + +STRINGS { bibinfo} +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}{ f{}}{jj}" + format.name$ 't := + nameptr #1 > + { + nameptr #3 + #1 + = + numnames #3 + > and + { "others" 't := + #1 'namesleft := } + 'skip$ + if$ + namesleft #1 > + { ", " * t * } + { + "," * + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * refbbl.etal * + } + { " " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} + +FUNCTION {format.names.ed} +{ + format.names +} +FUNCTION {format.key} +{ empty$ + { key field.or.null } + { "" } + if$ +} + +FUNCTION {format.authors} +{ author "author" format.names +} +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { + " " * + get.bbl.editor + "(" swap$ * ")" * + * + } + if$ +} +FUNCTION {format.doi} +{ doi "doi" bibinfo.check + duplicate$ empty$ 'skip$ + { + "\doi{" swap$ * "}" * + } + if$ +} +FUNCTION {format.note} +{ + note empty$ + { "" } + { note #1 #1 substring$ + duplicate$ "{" = + 'skip$ + { output.state mid.sentence = + { "l" } + { "u" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + } + if$ +} + +FUNCTION {format.title} +{ title + duplicate$ empty$ 'skip$ + { "t" change.case$ } + if$ + "title" bibinfo.check +} +FUNCTION {format.full.names} +{'s := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}" format.name$ + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal * + } + { + numnames #2 > + { "," * } + 'skip$ + if$ + bbl.and + space.word * t * + } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {author.editor.key.full} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.full.names } + if$ + } + { author format.full.names } + if$ +} + +FUNCTION {author.key.full} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.full.names } + if$ +} + +FUNCTION {editor.key.full} +{ editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.full.names } + if$ +} + +FUNCTION {make.full.names} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.full + { type$ "proceedings" = + 'editor.key.full + 'author.key.full + if$ + } + if$ +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem[{" write$ + label write$ + ")" make.full.names duplicate$ short.list = + { pop$ } + { * } + if$ + "}]{" * write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {add.period} +{ duplicate$ empty$ + 'skip$ + { "." * add.blank } + if$ +} + +FUNCTION {if.digit} +{ duplicate$ "0" = + swap$ duplicate$ "1" = + swap$ duplicate$ "2" = + swap$ duplicate$ "3" = + swap$ duplicate$ "4" = + swap$ duplicate$ "5" = + swap$ duplicate$ "6" = + swap$ duplicate$ "7" = + swap$ duplicate$ "8" = + swap$ "9" = or or or or or or or or or +} +FUNCTION {n.separate} +{ 't := + "" + #0 'numnames := + { t empty$ not } + { t #-1 #1 substring$ if.digit + { numnames #1 + 'numnames := } + { #0 'numnames := } + if$ + t #-1 #1 substring$ swap$ * + t #-2 global.max$ substring$ 't := + numnames #5 = + { duplicate$ #1 #2 substring$ swap$ + #3 global.max$ substring$ + "," swap$ * * + } + 'skip$ + if$ + } + while$ +} +FUNCTION {n.dashify} +{ +%% n.separate + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.in capitalize + ":" * + " " * } + +FUNCTION {format.date} +{ year "year" bibinfo.check duplicate$ empty$ + { + "empty year in " cite$ * "; set to ????" * warning$ + pop$ "????" + } + 'skip$ + if$ + extra.label * + before.all 'output.state := + " (" swap$ * ")" * +} +FUNCTION {format.btitle} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + } + if$ +} +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { bbl.volume volume tie.or.space.prefix + "volume" bibinfo.check * * + series "series" bibinfo.check + duplicate$ empty$ 'pop$ + { emphasize ", " * swap$ * } + if$ + "volume and number" number either.or.check + } + if$ +} +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { series empty$ + { number "number" bibinfo.check } + { output.state mid.sentence = + { bbl.number } + { bbl.number capitalize } + if$ + number tie.or.space.prefix "number" bibinfo.check * * + bbl.in space.word * + series "series" bibinfo.check * + } + if$ + } + if$ + } + { "" } + if$ +} +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + +FUNCTION {convert.edition} +{ extract.num "l" change.case$ 's := + s "first" = s "1" = or + { bbl.first 't := } + { s "second" = s "2" = or + { bbl.second 't := } + { s "third" = s "3" = or + { bbl.third 't := } + { s "fourth" = s "4" = or + { bbl.fourth 't := } + { s "fifth" = s "5" = or + { bbl.fifth 't := } + { s #1 #1 substring$ is.num + { s eng.ord 't := } + { edition 't := } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + t +} + +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { + convert.edition + output.state mid.sentence = + { "l" } + { "t" } + if$ change.case$ + "edition" bibinfo.check + " " * bbl.edition * + } + if$ +} +INTEGERS { multiresult } +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { duplicate$ multi.page.check + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + } + if$ +} +FUNCTION {format.journal.pages} +{ pages duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ + { pop$ pop$ format.pages } + { + ":" * + swap$ + n.dashify + "pages" bibinfo.check + * + } + if$ + } + if$ +} +FUNCTION {format.journal.eid} +{ eid "eid" bibinfo.check + duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ 'skip$ + { + ":" * + } + if$ + swap$ * + } + if$ +} + +FUNCTION {format.incoll.pages} +{ pages duplicate$ empty$ 'skip$ + { duplicate$ multi.page.check + { + bbl.incoll.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + } + if$ +} + +FUNCTION {format.incoll.chapter.pages} +{ chapter empty$ + 'format.incoll.pages + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + pages empty$ + 'skip$ + { ", " * format.incoll.pages * } + if$ + } + if$ +} + +FUNCTION {format.vol.num.pages} +{ volume field.or.null + duplicate$ empty$ 'skip$ + { + "volume" bibinfo.check + } + if$ + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + "(" swap$ * ")" * + } + if$ * + eid empty$ + { format.journal.pages } + { format.journal.eid } + if$ +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ +} + +FUNCTION {format.booktitle} +{ + booktitle "booktitle" bibinfo.check +} +FUNCTION {format.in.ed.booktitle} +{ format.booktitle duplicate$ empty$ 'skip$ + { + editor "editor" format.names.ed duplicate$ empty$ 'pop$ + { + " " * + get.bbl.editor + "(" swap$ * ") " * + * swap$ + * } + if$ + word.in swap$ * + } + if$ +} +FUNCTION {format.thesis.type} +{ type duplicate$ empty$ + 'pop$ + { swap$ pop$ + "t" change.case$ "type" bibinfo.check + } + if$ +} +FUNCTION {format.tr.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ bbl.techrep } + 'skip$ + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ "t" change.case$ } + { tie.or.space.prefix * * } + if$ +} +FUNCTION {format.article.crossref} +{ + word.in + " \cite{" * crossref * "}" * +} +FUNCTION {format.book.crossref} +{ volume duplicate$ empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + pop$ word.in + } + { bbl.volume + capitalize + swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * + } + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.incoll.inproc.crossref} +{ + word.in + " \cite{" * crossref * "}" * +} +FUNCTION {format.org.or.pub} +{ 't := + "" + address empty$ t empty$ and + 'skip$ + { + t empty$ + { address "address" bibinfo.check * + } + { t * + address empty$ + 'skip$ + { ", " * address "address" bibinfo.check * } + if$ + } + if$ + } + if$ +} +FUNCTION {format.publisher.address} +{ publisher "publisher" bibinfo.warn format.org.or.pub +} + +FUNCTION {format.organization.address} +{ organization "organization" bibinfo.check format.org.or.pub +} + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title "title" output.check + new.sentence + crossref missing$ + { + journal + remove.dots + "journal" bibinfo.check + "journal" output.check + add.blank + format.vol.num.pages output + } + { format.article.crossref output.nonnull + format.pages output + } + if$ + new.sentence + format.doi output + format.url output + format.note output + format.soft.eprint output + add.blank + format.primaryClass output + fin.entry +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + editor format.key output + add.blank + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + format.date "year" output.check + date.block + format.btitle "title" output.check + crossref missing$ + { format.bvolume output + format.edition output + new.sentence + format.number.series output + format.publisher.address output + } + { + new.sentence + format.book.crossref output.nonnull + } + if$ + format.doi output + format.url output + format.note output + format.eprint output + fin.entry +} + +FUNCTION {booklet} +{ output.bibitem + format.authors output + author format.key output + format.date "year" output.check + date.block + format.title "title" output.check + new.sentence + howpublished "howpublished" bibinfo.check output + address "address" bibinfo.check output + format.doi output + format.url output + format.note output + format.eprint output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + editor format.key output + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + format.date "year" output.check + date.block + format.btitle "title" output.check + crossref missing$ + { + format.bvolume output + format.edition output + format.publisher.address output + format.chapter.pages "chapter and pages" output.check + new.sentence + format.number.series output + } + { + format.chapter.pages "chapter and pages" output.check + new.sentence + format.book.crossref output.nonnull + } + if$ + format.doi output + format.url output + format.note output + format.eprint output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title "title" output.check + new.sentence + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.bvolume output + format.edition output + new.sentence + format.number.series output + format.publisher.address output + format.incoll.chapter.pages output + } + { format.incoll.inproc.crossref output.nonnull + format.incoll.chapter.pages output + } + if$ + format.doi output + format.url output + format.note output + format.eprint output + fin.entry +} +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title "title" output.check + new.sentence + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + format.bvolume output + new.sentence + format.publisher.address output + } + if$ + format.number.series output + format.pages output + } + { format.incoll.inproc.crossref output.nonnull + format.pages output + } + if$ + format.doi output + format.url output + format.note output + format.eprint output + fin.entry +} +FUNCTION {conference} { inproceedings } +FUNCTION {manual} +{ output.bibitem + format.authors output + author format.key output + format.date "year" output.check + date.block + format.btitle "title" output.check + new.sentence + organization "organization" bibinfo.check output + address "address" bibinfo.check output + format.edition output + format.doi output + format.url output + format.note output + format.eprint output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title + "title" output.check + new.sentence + bbl.mthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.doi output + format.url output + format.note output + format.eprint output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + author format.key output + format.date "year" output.check + date.block + format.title output + new.sentence + howpublished "howpublished" bibinfo.check output + format.doi output + format.url output + format.note output + format.eprint output + fin.entry +} + +FUNCTION {insert.comma} +{ duplicate$ empty$ + 'skip$ + { ", " * add.blank } + if$ +} + +FUNCTION {softmisc} +{ output.bibitem + format.authors output + author format.key output + format.date "year" output.check + date.block + format.title output + insert.comma + version output + new.sentence + howpublished "howpublished" bibinfo.check output + format.doi output + format.url output + format.note output + format.softmisc.eprint output + fin.entry +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title + "title" output.check + new.sentence + bbl.phdthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.doi output + format.url output + format.note output + format.eprint output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + format.editors output + editor format.key output + format.date "year" output.check + date.block + format.btitle "title" output.check + format.bvolume output + format.number.series output + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + format.doi output + format.url output + format.note output + format.eprint output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title + "title" output.check + new.sentence + format.tr.number output.nonnull + institution "institution" bibinfo.warn output + address "address" bibinfo.check output + format.doi output + format.url output + format.note output + format.eprint output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title "title" output.check + format.doi output + format.url output + format.note "note" output.check + format.eprint output + fin.entry +} + +FUNCTION {default.type} { misc } +READ + +EXECUTE {identify.basic.version} + +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} +INTEGERS { len } +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} +FUNCTION {format.lab.names} +{ 's := + "" 't := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ + " " * bbl.etal * + } + { #2 < + 'skip$ + { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { + " " * bbl.etal * + } + { bbl.and space.word * s #2 "{vv~}{ll}" format.name$ + * } + if$ + } + if$ + } + if$ +} + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.label} +{ editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.short.authors} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.label + 'author.key.label + if$ + } + if$ + 'short.list := +} + +FUNCTION {calc.label} +{ calc.short.authors + short.list + "(" + * + year duplicate$ empty$ + { pop$ "????" } + 'skip$ + if$ + * + 'label := +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{ll{ }}{ f{ }}{ jj{ }}" + format.name$ 't := + nameptr #1 > + { + " " * + namesleft #1 = t "others" = and + { "zzzzz" * } + { numnames #2 > nameptr #2 = and + { "zz" * year field.or.null * " " * } + 'skip$ + if$ + t sortify * + } + if$ + } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {editor.sort} +{ editor empty$ + { key empty$ + { "to sort, need editor or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ +} +FUNCTION {presort} +{ calc.label + label sortify + " " + * + type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.sort + 'author.sort + if$ + } + if$ + #1 entry.max$ substring$ + 'sort.label := + sort.label + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {presort} +SORT +STRINGS { last.label next.extra } +INTEGERS { last.extra.num number.label } +FUNCTION {initialize.extra.label.stuff} +{ #0 int.to.chr$ 'last.label := + "" 'next.extra := + #0 'last.extra.num := + #0 'number.label := +} +FUNCTION {forward.pass} +{ last.label label = + { last.extra.num #1 + 'last.extra.num := + last.extra.num int.to.chr$ 'extra.label := + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + label 'last.label := + } + if$ + number.label #1 + 'number.label := +} +FUNCTION {reverse.pass} +{ next.extra "b" = + { "a" 'extra.label := } + 'skip$ + if$ + extra.label 'next.extra := + extra.label + duplicate$ empty$ + 'skip$ + { "{\natexlab{" swap$ * "}}" * } + if$ + 'extra.label := + label extra.label * 'label := +} +EXECUTE {initialize.extra.label.stuff} +ITERATE {forward.pass} +REVERSE {reverse.pass} +FUNCTION {bib.sort.order} +{ sort.label + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} +ITERATE {bib.sort.order} +SORT +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" number.label int.to.str$ * "}" * + write$ newline$ + "\providecommand{\natexlab}[1]{#1}" + write$ newline$ + "\providecommand{\url}[1]{{#1}}" + write$ newline$ + "\providecommand{\urlprefix}{URL }" + write$ newline$ + %%"\expandafter\ifx\csname urlstyle\endcsname\relax" + %%write$ newline$ + %%" \providecommand{\doi}[1]{\discretionary{}{}{}https://doi.org/#1}\else" + %%write$ newline$ + %%" \providecommand{\doi}{\discretionary{}{}{}\begingroup \urlstyle{rm}\Url}\fi" + "\providecommand{\doi}[1]{\url{https://doi.org/#1}}" + write$ newline$ + "\providecommand{\eprint}[2][]{\url{#2}}" + write$ newline$ + " \bibcommenthead " + write$ newline$ +} +EXECUTE {begin.bib} +EXECUTE {init.state.consts} +ITERATE {call.type$} +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} +EXECUTE {end.bib} + +%% End of file `sn-basic.bst'. + diff --git a/waypoint_control/sn-article-template/bst/sn-chicago.bst b/waypoint_control/sn-article-template/bst/sn-chicago.bst new file mode 100644 index 0000000..d9dfe5f --- /dev/null +++ b/waypoint_control/sn-article-template/bst/sn-chicago.bst @@ -0,0 +1,1683 @@ +%% This is file `sn-chicago.bst' +%% Compatible with bibtex version 0.99d. + +%% The original source files were: chicago.bst +% =================================== +% +% Reference list ordering: alphabetical by author or whatever passes for author in the absence of one. +% +% If the entries in the list should be numbered consecutively comment out the two lines including SORT (in uppercase). +% +% This BibTeX style has support for abbreviated author lists and for +% year-only citations. This is done by having the citations +% actually look like +% \citeauthoryear{full-author-info}{abbrev-author-info}{year} + +FUNCTION {identify.chicago.version} +{ % Put identifying string in the .blg file + "sn-chicago.bst" + " [2024/07/19 v1.1 Chicago bibliography style]" + * top$ +} + +ENTRY + { address + author + booktitle + chapter + edition + editor + howpublished + institution + journal + key + keywords + month + note + doi + number + organization + pages + publisher + school + series + title + type + volume + year + eprint + archive + archivePrefix + primaryClass + eid + adsurl + adsnote + version + } + {} + { label.year extra.label sort.year sort.label } + +INTEGERS { output.state before.all mid.sentence after.sentence after.block } + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} + +STRINGS { s t u } + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + +% Use a colon to separate output. Used only for address/publisher +% combination in book/inbook types, address/institution for manuals, +% and organization:publisher for proceedings (inproceedings). +% +FUNCTION {output.nonnull.colon} +{ 's := + output.state mid.sentence = + { ": " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.colon} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull.colon + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +FUNCTION {output.check.colon} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull.colon + if$ +} + +FUNCTION {output.year.check} +{ year empty$ + { "empty year in " cite$ * warning$ } + { write$ + " " year * extra.label * + month empty$ + { "" * } + { ", " * month * "" * } + if$ + mid.sentence 'output.state := + } + if$ +} + + +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +% +% Emphasize the top string on the stack. +% +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "{\em " swap$ * "}" * } + if$ +} + +% +% Emphasize the top string on the stack, but add a trailing space. +% +FUNCTION {emphasize.space} +{ duplicate$ empty$ + { pop$ "" } + { "{\em " swap$ * "\/}" * } + if$ +} + +INTEGERS { nameptr namesleft numnames } +% +% Format bibliographical entries with the first author last name first, +% and subsequent authors with initials followed by last name. +% All names are formatted in this routine. +% +FUNCTION {format.names} +{ 's := + #1 'nameptr := % nameptr = 1; + s num.names$ 'numnames := % numnames = num.name$(s); + numnames 'namesleft := + { namesleft #0 > } + + { nameptr #1 = + {s nameptr "{vv~}{ll}{, jj}{, f{.}.}" format.name$ 't := } + {s nameptr "{f{.}.~}{vv~}{ll}{, jj}" format.name$ 't := } + if$ + nameptr #1 > + { namesleft #1 > + { ", " * t * } + { numnames #2 > + { "," * } + 'skip$ + if$ + t "others" = + { " et~al." * } + { " and " * t * } % from Chicago Manual of Style + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := % nameptr += 1; + namesleft #1 - 'namesleft := % namesleft =- 1; + } + while$ +} + +FUNCTION {my.full.label} +{ 's := + #1 'nameptr := % nameptr = 1; + s num.names$ 'numnames := % numnames = num.name$(s); + numnames 'namesleft := + { namesleft #0 > } + + { s nameptr "{vv~}{ll}" format.name$ 't := % get the next name + nameptr #1 > + { namesleft #1 > + { ", " * t * } + { numnames #2 > + { "," * } + 'skip$ + if$ + t "others" = + { " et~al." * } + { " and " * t * } % from Chicago Manual of Style + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := % nameptr += 1; + namesleft #1 - 'namesleft := % namesleft =- 1; + } + while$ + +} + +FUNCTION {format.names.fml} +% +% Format names in "familiar" format, with first initial followed by +% last name. Like format.names, ALL names are formatted. +% +{ 's := + #1 'nameptr := % nameptr = 1; + s num.names$ 'numnames := % numnames = num.name$(s); + numnames 'namesleft := + { namesleft #0 > } + + { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't := + + nameptr #1 > + { namesleft #1 > + { ", " * t * } + { numnames #2 > + { "," * } + 'skip$ + if$ + t "others" = + { " et~al." * } + { " and " * t * } +% { " \& " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := % nameptr += 1; + namesleft #1 - 'namesleft := % namesleft =- 1; + } + while$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { author format.names } + if$ +} + +FUNCTION {format.key} +{ empty$ + { key field.or.null } + { "" } + if$ +} + +% +% Format editor names for use in the "in" types: inbook, incollection, +% inproceedings: first initial, then last names. When editors are the +% LABEL for an entry, then format.editor is used which lists editors +% by last name first. +% +FUNCTION {format.editors.fml} +{ editor empty$ + { "" } + { editor format.names.fml + editor num.names$ #1 > + { " (Eds.)" * } + { " (Ed.)" * } + if$ + } + if$ +} + +% +% Format editor names for use in labels, last names first. +% +FUNCTION {format.editors} +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + { " eds." * } + { " ed." * } + if$ + } + if$ +} + +FUNCTION {in.format.editors} +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + { " eds. " swap$ * } + { " ed. " swap$ * } + if$ + } + if$ +} + +FUNCTION {format.title} +{ title empty$ + { "" } + { title "t" change.case$ } + if$ +} + +% Note that the APA style requres case changes +% in article titles. The following does not +% change cases. If you perfer it, uncomment the +% following and comment out the above. + +%FUNCTION {format.title} +%{ title empty$ +% { "" } +% { title } +% if$ +%} + +FUNCTION {n.dashify} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {format.btitle} +{ edition empty$ + { title emphasize } + { title empty$ + { title emphasize } + { volume empty$ % gnp - check for volume, then don't need period + { "{\em " title * "\/} (" * edition * " ed.)" * "." * } + { "{\em " title * "\/} (" * edition * " ed.)" * } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.emphasize.booktitle} +{ edition empty$ + { booktitle emphasize } + { booktitle empty$ + { booktitle emphasize } + { volume empty$ % gnp - extra period an error if book has a volume + { "{\em " booktitle * "\/} (" * edition * " ed.)" * "." *} + { "{\em " booktitle * "\/} (" * edition * " ed.)" * } + if$ + } + if$ + } + if$ + } + + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { "Volume" volume tie.or.space.connect % gnp - changed to mixed case + series empty$ + 'skip$ + { " of " * series emphasize * } + if$ + "volume and number" number either.or.check + } + if$ +} + +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { output.state mid.sentence = + { "Number" } % gnp - changed to mixed case always + { "Number" } + if$ + number tie.or.space.connect + series empty$ + { "there's a number but no series in " cite$ * warning$ } + { " in " * series * } + if$ + } + if$ + } + { "" } + if$ +} + +INTEGERS { multiresult } + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages multi.page.check + { "pp.\ " pages n.dashify tie.or.space.connect } % gnp - removed () + { "pp.\ " pages tie.or.space.connect } + if$ + } + if$ +} + + +FUNCTION {format.in.pages} +{ pages empty$ + { "" } + { pages multi.page.check + { "" pages n.dashify tie.or.space.connect } % gnp - removed () + { "" pages tie.or.space.connect } + if$ + } + if$ +} + +% By Young (and Spencer) +% GNP - fixed bugs with missing volume, number, and/or pages +% +% Format journal, volume, number, pages for article types. +% +FUNCTION {format.jour.vol} +{ journal empty$ + { "no journal in " cite$ * warning$ + "" } + { journal emphasize.space } + if$ + number empty$ + { volume empty$ + { "no number and no volume in " cite$ * warning$ + "" * } + { "~" * Volume * "" * } + if$ + } + { volume empty$ + {"no volume for " cite$ * warning$ + "~(" * number * ")" * } + { "~" * + volume emphasize.space + "(" * number * ")" * * } + if$ + } + if$ + pages empty$ + {"page numbers missing in " cite$ * warning$ + "" * } % gnp - place a null string on the stack for output + { duplicate$ empty$ + { pop$ format.pages } + { ": " * pages n.dashify * } % gnp - removed pp. for articles + if$ + } + if$ +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { "Chapter" } % gnp - changed to mixed case + { type "t" change.case$ } + if$ + chapter tie.or.space.connect + pages empty$ + {"page numbers missing in " cite$ * warning$} % gnp - added check + { ", " * format.pages * } + if$ + } + if$ +} + + +FUNCTION {format.in.chapter.pages} +{ chapter empty$ + 'format.in.pages + { type empty$ + { "Chapter" } % gnp - changed to mixed case + { type "t" change.case$ } + if$ + chapter tie.or.space.connect + pages empty$ + {"page numbers missing in " cite$ * warning$} % gnp - added check + { ", " * format.in.pages * } + if$ + } + if$ +} + +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + { "" } + { editor empty$ + { "In " format.emphasize.booktitle * } + { "In " format.editors.fml * ", " * format.emphasize.booktitle * } + if$ + } + if$ +} + +FUNCTION {format.in.coll.ed.booktitle} +{ booktitle empty$ + { "" } + { editor empty$ + { "" format.emphasize.booktitle * } + { "In " format.emphasize.booktitle * ", " * in.format.editors * } + if$ + } + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { "Technical Report" } + 'type + if$ + number empty$ + { "t" change.case$ } + { number tie.or.space.connect } + if$ +} + +FUNCTION {format.article.crossref} +{ "See" + "\citeN{" * crossref * "}" * +} + +FUNCTION {format.crossref.editor} +{ editor #1 "{vv~}{ll}" format.name$ + editor num.names$ duplicate$ + #2 > + { pop$ " et~al." * } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { " et~al." * } + { " and " * editor #2 "{vv~}{ll}" format.name$ * } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.book.crossref} +{ volume empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + "In " + } + { "Volume" volume tie.or.space.connect % gnp - changed to mixed case + " of " * + } + if$ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" * + } + { "{\em " * series * "\/}" * } + if$ + } + { key * } + if$ + } + { format.crossref.editor * } + if$ + " \citeN{" * crossref * "}" * +} + +FUNCTION {format.incoll.inproc.crossref} +{ "See" + " \citeN{" * crossref * "}" * +} + +% format.lab.names: +% +% determines "short" names for the abbreviated author information. +% "Long" labels are created in calc.label, using the routine my.full.label +% to format author and editor fields. +% +% There are 4 cases for labels. (n=3 in the example) +% a) one author Foo +% b) one to n Foo, Bar and Baz +% c) use of "and others" Foo, Bar et al. +% d) more than n Foo et al. +% +FUNCTION {format.lab.names} +{ 's := + s num.names$ 'numnames := + numnames #2 > % change number to number of others allowed before + % forcing "et al". + { s #1 "{vv~}{ll}" format.name$ " et~al." * } + { + numnames #1 - 'namesleft := + #2 'nameptr := + s #1 "{vv~}{ll}" format.name$ + { namesleft #0 > } + { nameptr numnames = + { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { " et~al." * } + { " and " * s nameptr "{vv~}{ll}" format.name$ * } + if$ + } + { ", " * s nameptr "{vv~}{ll}" format.name$ * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } + if$ +} + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { "no key, author in " cite$ * warning$ + cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.label} +{ editor empty$ + { key empty$ + { "no key, editor in " cite$ * warning$ + cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {author.key.organization.label} +% +% added - gnp. Provide label formatting by organization if author is null. +% +{ author empty$ + { organization empty$ + { key empty$ + { "no key, author or organization in " cite$ * warning$ + cite$ #1 #3 substring$ } + 'key + if$ + } + { organization } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.organization.label} +% +% added - gnp. Provide label formatting by organization if editor is null. +% +{ editor empty$ + { organization empty$ + { key empty$ + { "no key, editor or organization in " cite$ * warning$ + cite$ #1 #3 substring$ } + 'key + if$ + } + { organization } + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { "no key, author, or editor in " cite$ * warning$ + cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {calc.label} +% +% Changed - GNP. See also author.organization.sort, editor.organization.sort +% Form label for BibTeX entry. The classification of which fields are used +% for which type of entry (book, inbook, etc.) are taken from alpha.bst. +% The change here from newapa is to also include organization as a +% citation label if author or editor is missing. +% +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.organization.label + { type$ "manual" = + 'author.key.organization.label + 'author.key.label + if$ + } + if$ + } + if$ + + author empty$ % generate the full label citation information. + { editor empty$ + { organization empty$ + { "no author, editor, or organization in " cite$ * warning$ + "??" } + { organization } + if$ + } + { editor my.full.label } + if$ + } + { author my.full.label } + if$ + +% leave label on the stack, to be popped when required. + + "}{" * swap$ * "}{" * +% year field.or.null purify$ #-1 #4 substring$ * +% +% save the year for sort processing afterwards (adding a, b, c, etc.) +% + year field.or.null purify$ #-1 #4 substring$ + 'label.year := +} + +FUNCTION {output.bibitem} +{ newline$ + + "\bibitem[\protect\citeauthoryear{" write$ + calc.label write$ + sort.year write$ + "}]{" write$ + + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {output.doi} +{ + doi empty$ + { skip$ } + { "\doi{" doi * "}" * output } + if$ +} + +FUNCTION {format.archive} +{ + archivePrefix empty$ + { "" } + { archivePrefix ":" *} + if$ +} + +FUNCTION {format.primaryClass} +{ + primaryClass empty$ + { "" } + { "{[" primaryClass * "]}" *} + if$ +} + +FUNCTION {format.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.softmisc.archive} +{ + archivePrefix empty$ + { "" } + { "" } + if$ +} + +FUNCTION {format.softmisc.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {article} +{ output.bibitem + format.authors + "author" output.check +add.period$ "" * + author format.key output % added + output.year.check % added + new.block + format.title + "title" output.check + new.block + crossref missing$ + { format.jour.vol output + } + { format.article.crossref output.nonnull + format.pages output + } + if$ + new.block + output.doi + new.block + format.eprint output + add.blank + format.primaryClass output + fin.entry +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors + "author and editor" output.check } + { format.authors + output.nonnull +add.period$ "" * + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + output.year.check % added + new.block + format.btitle + "title" output.check + crossref missing$ + { format.bvolume output + new.block + format.number.series output + new.sentence + address output + publisher "publisher" output.check.colon + } + { new.block + format.book.crossref output.nonnull + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {booklet} +{ output.bibitem + format.authors output + author format.key output % added + output.year.check % added + new.block + format.title + "title" output.check + new.block + howpublished output + address output + new.block + note output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors + "author and editor" output.check + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + output.year.check % added + new.block + format.btitle + "title" output.check + crossref missing$ + { format.bvolume output + format.chapter.pages + "chapter and pages" output.check + new.block + format.number.series output + new.sentence + address output + publisher + "publisher" output.check.colon + } + { format.chapter.pages "chapter and pages" output.check + new.block + format.book.crossref output.nonnull + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors + "author" output.check +add.period$ "" * + author format.key output % added + output.year.check % added + new.block + format.title + "title" output.check + crossref missing$ + { format.in.coll.ed.booktitle +"booktitle" output.check + format.bvolume output + format.number.series output + format.in.chapter.pages output % gnp - was special.output.nonnull +% left out comma before page numbers + new.sentence + address output + publisher "publisher" output.check.colon + } + { format.incoll.inproc.crossref + output.nonnull + format.in.chapter.pages output + } + if$ + new.block + note output + new.block + output.doi + fin.entry +} + +FUNCTION {inproceedings} +{ output.bibitem + format.authors + "author" output.check + author format.key output % added + output.year.check % added + new.block + format.title + "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle + "booktitle" output.check + format.bvolume output + format.number.series output + address output + format.pages output + new.sentence + organization output + publisher output.colon + } + { format.incoll.inproc.crossref output.nonnull + format.pages output + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ output.bibitem + author empty$ + { editor empty$ + { organization "organization" output.check + organization format.key output } % if all else fails, use key + { format.editors "author and editor" output.check } + if$ + } + { format.authors output.nonnull } + if$ + output.year.check % added + new.block + format.btitle + "title" output.check + organization address new.block.checkb +% Reversed the order of "address" and "organization", added the ":". + address output + organization "organization" output.check.colon +% address output +% ":" output +% organization output + new.block + note output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors + "author" output.check + author format.key output % added + output.year.check % added + new.block + format.title + "title" output.check + new.block + "Master's thesis" format.thesis.type output.nonnull + school "school" output.check + address output + new.block + note output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output +add.period$ "" * + author format.key output % added + output.year.check % added + title howpublished new.block.checkb + format.title output + new.block + howpublished output + new.block + note output + fin.entry +} + +FUNCTION {softmisc} +{ output.bibitem + format.authors output +add.period$ "" * + author format.key output % added + %%output.year.check % added + year output + title howpublished new.block.checkb + format.title output + version output + new.block + howpublished output + new.block + note output + new.block + format.softmisc.eprint output + fin.entry +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors + "author" output.check + author format.key output % added + output.year.check % added + new.block + format.btitle + "title" output.check + new.block + "Ph.\ D. thesis" format.thesis.type output.nonnull + school "school" output.check + address output + new.block + note output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization output + organization format.key output } % gnp - changed from author format.key + { format.editors output.nonnull } + if$ +% author format.key output % gnp - removed (should be either +% editor or organization + output.year.check % added (newapa) + new.block + format.btitle + "title" output.check + format.bvolume output + format.number.series output + address output + new.sentence + organization output + publisher output.colon + new.block + note output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors + "author" output.check + author format.key output % added + output.year.check % added + new.block + format.title + "title" output.check + new.block + format.tr.number output.nonnull + institution + "institution" output.check + address output + new.block + note output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors + "author" output.check + author format.key output % added + output.year.check % added + new.block + format.title + "title" output.check + new.block + note "note" output.check + fin.entry +} + +FUNCTION {default.type} { misc } + +MACRO {jan} {"January"} + +MACRO {feb} {"February"} + +MACRO {mar} {"March"} + +MACRO {apr} {"April"} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"August"} + +MACRO {sep} {"September"} + +MACRO {oct} {"October"} + +MACRO {nov} {"November"} + +MACRO {dec} {"December"} + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {ai} {"Artificial Intelligence"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} + +MACRO {ieeetc} {"IEEE Transactions on Computers"} + +MACRO {ieeetcad} + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + +MACRO {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +MACRO {tocs} {"ACM Transactions on Computer Systems"} + +MACRO {tods} {"ACM Transactions on Database Systems"} + +MACRO {tog} {"ACM Transactions on Graphics"} + +MACRO {toms} {"ACM Transactions on Mathematical Software"} + +MACRO {toois} {"ACM Transactions on Office Information Systems"} + +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} + +MACRO {tcs} {"Theoretical Computer Science"} + +READ + +EXECUTE {identify.chicago.version} + +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} + +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + + + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { nameptr #1 > + { " " * } + 'skip$ + if$ + s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := + nameptr numnames = t "others" = and + { " et~al" * } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {editor.sort} +{ editor empty$ + { key empty$ + { "to sort, need editor or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ author empty$ + { "missing author in " cite$ * warning$ + editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.organization.sort} +% +% added - GNP. Stack author or organization for sorting (from alpha.bst). +% Unlike alpha.bst, we need entire names, not abbreviations +% +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { organization sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {editor.organization.sort} +% +% added - GNP. Stack editor or organization for sorting (from alpha.bst). +% Unlike alpha.bst, we need entire names, not abbreviations +% +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { organization sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION {presort} +% +% Presort creates the bibentry's label via a call to calc.label, and then +% sorts the entries based on entry type. Chicago.bst adds support for +% including organizations as the sort key; the following is stolen from +% alpha.bst. +% +{ calc.label sortify % recalculate bibitem label + year field.or.null purify$ #-1 #4 substring$ * % add year + " " + * + type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.organization.sort + { type$ "manual" = + 'author.organization.sort + 'author.sort + if$ + } + if$ + } + if$ + #1 entry.max$ substring$ % added for newapa + 'sort.label := % added for newapa + sort.label % added for newapa + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {presort} + +SORT % by label, year, author/editor, title + +STRINGS { last.label next.extra } + +INTEGERS { last.extra.num } + +FUNCTION {initialize.extra.label.stuff} +{ #0 int.to.chr$ 'last.label := + "" 'next.extra := + #0 'last.extra.num := +} + +FUNCTION {forward.pass} +% +% Pass through all entries, comparing current entry to last one. +% Need to concatenate year to the stack (done by calc.label) to determine +% if two entries are the same (see presort) +% +{ last.label + calc.label year field.or.null purify$ #-1 #4 substring$ * % add year + #1 entry.max$ substring$ = % are they equal? + { last.extra.num #1 + 'last.extra.num := + last.extra.num int.to.chr$ 'extra.label := + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + calc.label year field.or.null purify$ #-1 #4 substring$ * % add year + #1 entry.max$ substring$ 'last.label := % assign to last.label + } + if$ +} + +FUNCTION {reverse.pass} +{ next.extra "b" = + { "a" 'extra.label := } + 'skip$ + if$ + label.year extra.label * 'sort.year := + extra.label 'next.extra := +} + +EXECUTE {initialize.extra.label.stuff} + +ITERATE {forward.pass} + +REVERSE {reverse.pass} + +FUNCTION {bib.sort.order} +{ sort.label + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {bib.sort.order} + +SORT % by sort.label, year, title --- giving final bib. order. + +FUNCTION {begin.bib} + +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{}" write$ newline$ + "\providecommand{\doi}[1]{\url{https://doi.org/#1}}" + write$ newline$ + "\bibcommenthead" write$ newline$ +} + + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} + +%% End of file `sn-chicago.bst'. diff --git a/waypoint_control/sn-article-template/bst/sn-mathphys-ay.bst b/waypoint_control/sn-article-template/bst/sn-mathphys-ay.bst new file mode 100644 index 0000000..3553315 --- /dev/null +++ b/waypoint_control/sn-article-template/bst/sn-mathphys-ay.bst @@ -0,0 +1,3208 @@ +%% This is file `sn-mathphys-ay.bst' +%% Compatible with bibtex version 0.99d. +%% +%% Sorting entries is done by name and year fields! +%% +%% You are free to use this style file as you see fit, provided +%% that you do not make changes to the file. +%% +%% It may be distributed under the terms of the LaTeX Project Public +%% License, as described in lppl.txt in the base LaTeX distribution. +%% Either version 1.0 or, at your option, any later version. +%% +%% LIMITATIONS: +%% If you are getting error like +%% "Sorry---you've exceeded BibTeX's number of string global-variables" +%% that means you are using to old bibtex version. You should download latest version 0.99d. +%% (One of the binaries location is minimals.contextgarden.net/current/bin/common/) + +FUNCTION {identify.mathphys.version} +{ % Put identifying string in the .blg file + "sn-mathphys-ay.bst" + " [2024/07/19 v1.1 bibliography style]" + * top$ +} + +ENTRY + { address + author + booktitle + bnumber + chapter + doi + edition + editor + howpublished + institution + isbn + journal + key + keywords + month + note + number + organization + pages + publisher + school + series + title + type + volume + year + url + info + options + urldate + eprint + archive + archivePrefix + primaryClass + eid + adsurl + adsnote + version + } + {} + { label extra.label sort.label short.list} + +INTEGERS { output.state before.all mid.sentence after.sentence + after.block after.authors between.elements bother + Nisbn Nmonth slen set.settings tmp month.printed} + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := + #4 'after.authors := + #5 'between.elements := +} + +STRINGS { s t element} +STRINGS { longest.label last.label list.string default.list} +STRINGS { v l f j b temp.str} + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { " " * write$ newline$} + { output.state after.block = + { add.period$ write$ + newline$ + } + { + output.state after.authors = + { ": " * write$ + newline$ + } + { output.state between.elements = + { ", " * write$ newline$} + { output.state before.all = + 'write$ + { add.period$ " " * write$ newline$} + if$ + } + if$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} +FUNCTION {fin.entry} +{ write$ newline$ } + +FUNCTION {stupid.colon} +{ after.authors 'output.state := } + + +FUNCTION {insert.comma} +{ output.state before.all = + 'skip$ + { between.elements 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {sort.format.month} +{ 't := + t #1 #2 substring$ "01" = + t #1 #1 substring$ "1" = + t #2 #2 substring$ "" = + and or + { "January" } + { t #1 #2 substring$ "02" = + t #1 #1 substring$ "2" = + t #2 #2 substring$ "" = + and or + { "February" } + { t #1 #2 substring$ "03" = + t #1 #1 substring$ "3" = + t #2 #2 substring$ "" = + and or + { "March" } + { t #1 #2 substring$ "04" = + t #1 #1 substring$ "4" = + or + { "April" } + { t #1 #2 substring$ "05" = + t #1 #1 substring$ "5" = + or + { "May" } + { t #1 #2 substring$ "06" = + t #1 #1 substring$ "6" = + or + { "June" } + { t #1 #2 substring$ "07" = + t #1 #1 substring$ "7" = + or + { "July" } + { t #1 #2 substring$ "08" = + t #1 #1 substring$ "8" = + or + { "August" } + { t #1 #2 substring$ "09" = + t #1 #1 substring$ "9" = + or + { "September" } + { t #1 #2 substring$ "10" = + { "October" } + { t #1 #2 substring$ "11" = + { "November" } + { t #1 #2 substring$ "12" = + { "December" } + { t } % No match + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + +} + +INTEGERS {sk} +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +FUNCTION {make.tag} +{ 't := + duplicate$ empty$ + { pop$ "" } + { bother #0 = + { + t "volume" = + {"\textbf{" swap$ * "}" * } + 'skip$ + if$ + } + { "\b" t * "{" * swap$ * "}" * } + if$ + } + if$ +} + + + +FUNCTION {springer.publisher} +{publisher #1 #8 substring$ "Springer" = + { "Springer" } + { publisher } + if$ +} + +FUNCTION {format.adsurl} +{ + adsurl empty$ + { "" } + {" \href{" adsurl "}" *} + if$ +} + +FUNCTION {format.adsnote} +{ + adsnote empty$ + { "" } + { ". " * adsnote *} + if$ +} + + +FUNCTION {format.soft.title} +{ + title empty$ + { "" } + { title "," *} + if$ +} + +FUNCTION {format.softmisctitle} +{ title empty$ + { ""} + { version empty$ + { title ", " *} + { title ", " * version " " *} + if$ + } + if$ +} + +FUNCTION {format.softmisc.archive} +{ + archivePrefix empty$ + { "" } + { "" } + if$ +} + +FUNCTION {format.archive} +{ + archivePrefix empty$ + { "" } + { archivePrefix ":" *} + if$ +} + +FUNCTION {format.primaryClass} +{ + primaryClass empty$ + { "" } + { "{[" primaryClass * "]}" *} + if$ +} + +FUNCTION {format.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.softmisc.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.pub.address} +{ publisher empty$ + howpublished empty$ + and + { + address empty$ + 'skip$ + { volume empty$ + 'insert.comma + 'new.sentence + if$ + address + type$ "inproceedings" = + {"conflocation"} + {"location"} + if$ + make.tag output + } + if$ + } + { + address empty$ + { publisher empty$ + {howpublished} + {springer.publisher} + if$ + "publisher" make.tag + #1 bother = + {", \blocation{???}" * } + 'skip$ + if$ + output + } + { + publisher empty$ + {howpublished } + {springer.publisher } + if$ + "publisher" make.tag output + insert.comma + address "location" make.tag output + } + if$ + } + if$ +} + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {mk.tag} +{ 'temp.str := + duplicate$ empty$ + { pop$ "" } + { + b "nothing" = + 'skip$ + { "\b" temp.str * "{" * swap$ * "}" * } + if$ + } + if$ +} + +FUNCTION {space.after.dot} +{'j := + t 'f := + j 't := + s 'j := + "" 'l := + "" 's := + { t empty$ not } + { + t #1 #3 substring$ "{-}" = + { l " {q}. " * 'l := + t #4 global.max$ substring$ 't := + } + 'skip$ + if$ + + t #1 #1 substring$ 's := + l s * 'l := + s "." = + { + t #2 #1 substring$ " " = + 'skip$ + { + l " " * 'l := + t #2 #4 substring$ "{\,}" = + { t #5 global.max$ substring$ 't := } + 'skip$ + if$ + } + if$ + } + 'skip$ + if$ + t #2 global.max$ substring$ 't := + } + while$ + f 't := + j 's := + l +} + +FUNCTION {fix.inits}{ + 't := + "" 'element := + { t empty$ not } + { + t #1 #3 substring$ ".q." = + { element ".-" * 'element := + t #3 global.max$ substring$ 't := + } + {element t #1 #1 substring$ * 'element :=} + if$ + + t #2 global.max$ substring$ 't := + } + while$ + element +} + +FUNCTION {fix.snm}{ + 't := + "" 'element := + { t empty$ not } + { + t #1 #3 substring$ "{-}" = + {element "-" * 'element := + t #3 global.max$ substring$ 't := + } + {element t #1 #1 substring$ * 'element :=} + if$ + + t #2 global.max$ substring$ 't := + } + while$ + element +} + +FUNCTION {enbrace.dash}{ + 't := + "" 'element := + { t empty$ not } + { + t #1 #1 substring$ "-" = + {element "{-}" * 'element :=} + {element t #1 #1 substring$ * 'element :=} + if$ + t #2 global.max$ substring$ 't := + } + while$ + element +} + +FUNCTION {fix.name}{ + + enbrace.dash 's := + "" 'l := + "" 't := + + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { + s nameptr "{vv~}{ll}{, jj}" format.name$ + s nameptr "{, ff}" format.name$ space.after.dot * 'l := + #1 nameptr = + {l 't :=} + {t " and " * l * 't := } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + t +} + +FUNCTION {name.separator}{ + namesleft #1 > + {", " * } + 'skip$ + if$ +} + +FUNCTION {format.author.editor} +{ 'b := + + bother #1 = + b "nothing" = + or + 'skip$ + {"b" b * 'b :=} + if$ + + b "editor" = + b "beditor" = + b "nothing" = + or or + {editor 's :=} + {author 's :=} + if$ + + %% modifying name + s fix.name 's := + + "" 't := + + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + + s numnames "{ll}" format.name$ 'l := + l "others" = + l "{others}" = + l "et al." = + l "{et al.}" = + or or or + {#1 'tmp :=} + {#0 'tmp :=} + if$ + + { namesleft #0 > } + { s nameptr "{vv}" format.name$ "particle" mk.tag 'v := + s nameptr "{ll}" format.name$ fix.snm "snm" mk.tag 'l := + s nameptr "{f{.}.}" format.name$ fix.inits "inits" mk.tag 'f := + s nameptr "{jj}" format.name$ "suffix" mk.tag 'j := + + + namesleft #1 = + tmp #1 = + and + { b "bauthor" = + b "beditor" = + or + {"et al."} + {"\betal"} + if$ + #1 'tmp := + } + { + b "bauthor" = + b "beditor" = + or + {"\oauthor{"} + { + b "nothing" = + {""} + {"\b" b * "{" *} + if$ + } +%% if$ +%% +%% v empty$ +%% 'skip$ +%% {v * " " *} + if$ + + l empty$ + 'skip$ + { l *} + if$ + + f empty$ + 'skip$ + {", " * f *} + if$ + + j empty$ + 'skip$ + {" " * j *} + if$ + + b "nothing" = + {""} + {"}"} + if$ + + * "" 't := + } + if$ + + name.separator + write$ + + namesleft #1 > + b "nothing" = not + and + { namesleft #2 = + tmp #1 = + and + 'skip$ + 'newline$ + if$ + } + 'skip$ + if$ + + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.editors} +{ editor empty$ + 'skip$ + { + bother #0 = + { author empty$ + {"editor"} + {"nothing"} + if$ + } + {"editor"} + if$ + format.author.editor + editor num.names$ #1 > + { " (eds.)" } + { " (ed.)" } + if$ + write$ + } + if$ +} + +FUNCTION {format.authors} +{ author empty$ + 'skip$ + {"author" format.author.editor} + if$ +} + +FUNCTION {cite.author.editor} +{ 's := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ " et~al." * } + { #2 = + { s #2 "{vv~}{ll}{ jj}{ f}" format.name$ "others" = + { " et~al." * } + { " and " * s #2 "{vv~}{ll}" format.name$ * } + if$ + } + 'skip$ + if$ + } + if$ +} + +FUNCTION {check.auth.edit.org} +{author empty$ + { + editor empty$ + { + organization empty$ + {""} + {organization} + if$ + } + {editor cite.author.editor} + if$ + } + {author cite.author.editor} + if$ +} + +FUNCTION {check.year} +{ year empty$ + {""} + {year extra.label *} + if$ +} + +INTEGERS { multiresult char.num k int} +INTEGERS {str.length count return save.num1 save.num2} +FUNCTION {is.in.list}{ + 'f := + %%%% saveing "s" and "t" + s 'j := + f 's := + t 'f := + list.string text.length$ 'str.length := + list.string 't := +% s text.length$ 'slen := + int 'save.num1 := + count 'save.num2 := + #1 'int := + #1 'count := + #0 'return := + + { count str.length = not + #0 str.length = not + and + } + { + count #1 + 'count := + t int #1 substring$ "," = + { + t #1 int substring$ s "," * = + { + #1 'return := + str.length 'count := + } + 'skip$ + if$ + + int #1 + 'int := + t int global.max$ substring$ 't := + #0 'int := + } + 'skip$ + if$ + int #1 + 'int := + } + while$ + + save.num1 'int := + save.num2 'count := + + #0 return = + { s t = + {#1 'return :=} + 'skip$ + if$ + } + 'skip$ + if$ + %%%% returning original "s" and "t" + j 's := + f 't := + + return +} + +INTEGERS {bibitem.count} + +FUNCTION {print.count} +{ bibitem.count #1 + 'bibitem.count := + newline$ + "%%% " + bibitem.count int.to.str$ * write$ +} + + +FUNCTION {output.bibitem} +{ print.count + newline$ + "\bibitem[\protect\citeauthoryear{" write$ + check.auth.edit.org write$ + "}{" write$ + check.year write$ + "}]{" write$ + cite$ write$ + "}" write$ + newline$ + "" before.all 'output.state := +} + + + + +FUNCTION {string.to.integer} +{ 't := + t text.length$ 'k := + #1 'char.num := + { t char.num #1 substring$ 's := + s is.num + s "." = + or + char.num k = not + and + } + { char.num #1 + 'char.num := } + while$ + char.num #1 - 'char.num := + t #1 char.num substring$ +} + + +FUNCTION {find.integer} +{ 't := + #0 'int := + { int not + t empty$ not + and + } + { t #1 #1 substring$ 's := + s is.num + {#1 'int :=} + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + int +} + +function{title.lowerwords}{ +"a,an,and,of,the,for,in,to,over,from,on,or,so,than,that,this,as,but,with,by,at,down,up,upon,al,ale,aus,aux,d'Analyse,d'Analystes,d'Architecture,d'Etudes,d'Histoire,da,dans,de,degli,dei,del," +"dell',dell'Accademia,dell'Istituto,dell'Universita,della,delle,dem,der,des,detta,di,die,din,dlia,do,du,e,eXpress,ed,ego,el,em,en,et,fur,i,iz,l'Academie,l'Age,l'Antiquite," * +"l'Approximation,l'Ecole,l'Histoire,l'I.S.U.P.,l'INSA,l'IREM,l'Indirizzo,l'Institut,l'Institute,l'UFR,l'Union,l'Universite,la,las,les,na,nella,per,po,si,sue,sur,ta,tes,und,van,voor,zu,zum,zur" * +} + +FUNCTION {upercase.first.letters}{ + 't := + "" 's := + #1 'int := + #1 'count := + list.string 'v := + "" 'b := + title.lowerwords 'list.string := + + t text.length$ 'slen := + + {count slen = not } + {t int #1 substring$ " " = + { + int #1 - 'int := + t #1 int substring$ 'b := + + % if word not in title.lowerwords - uppercase first letter + b is.in.list not + { b "l" change.case$ b = + { b "u" change.case$ "t" change.case$ 'b := } + 'skip$ + if$ + } + 'skip$ + if$ + + int #1 + 'int := + + s b " " * * 's := + int #1 + 'int := + t int global.max$ substring$ 't := + #0 'int := + } + 'skip$ + if$ + int #1 + 'int := + count #1 + 'count := +% "count=" count int.to.str$ * " slen=" * slen int.to.str$ * top$ + } + while$ + v 'list.string := + % last word is "t" and need to check it too + s t + t "l" change.case$ t = + { "u" change.case$ "t" change.case$ } + 'skip$ + if$ + * +} + + +FUNCTION {format.title} +{ title empty$ + { "" } + { title + "article" type$ = + type$ "techreport" = + type$ "inbook" = + type$ "inproceedings" = + type$ "incollection" = + type$ "phdthesis" = + type$ "mastersthesis" = + or or or or or or + {"t" change.case$} + { type$ "unpublished" = + type$ "misc" = + or + 'skip$ + 'upercase.first.letters + if$ + } + if$ + } + if$ +} + + +FUNCTION {note.presented} +{ note #1 #9 substring$ "presented" = + note #1 #9 substring$ "Presented" = + or +} + +FUNCTION {n.filter} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "," = + t #1 #1 substring$ "\" = + t #1 #1 substring$ "~" = + or or + { "" * + t #2 global.max$ substring$ 't := + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {byear} +{ duplicate$ empty$ + { pop$ "" } + { 't := + t text.length$ 'sk := + #5 sk = + { t #1 #4 substring$ 's := + t #5 #1 substring$ 'longest.label := + longest.label is.num not + {s "year" make.tag + "nameyear" is.in.list + {longest.label * } + 'skip$ + if$ + } + {t "year" make.tag } + if$ + } + { t "year" make.tag + "nameyear" is.in.list + {extra.label *} + 'skip$ + if$ + } + if$ + } + if$ +} + +FUNCTION {format.date} +{ year empty$ + { "" } + { year byear } + if$ +} + +FUNCTION {parens} +{ "(" swap$ * ")" * } + +FUNCTION {format.date.parens} +{ year empty$ + { "" } + { year byear parens } + if$ +} + +FUNCTION {noparens} +{ " " swap$ * "" * } + +FUNCTION {format.softmiscdate} +{ year empty$ + { "" } + { year byear parens } + if$ +} + +FUNCTION {format.month}{ + month empty$ + {""} + {month sort.format.month "confdate" make.tag} + if$ +} + +FUNCTION {formatpatent.date} +{ year empty$ + 'skip$ + { month empty$ + { year } + {format.month " " * year *} + if$ + } + if$ +} + +FUNCTION {month.year.date} +{ year empty$ + {""} + { month empty$ + {year byear} + { format.month " " * year byear * } + if$ + type$ "inproceedings" = + 'skip$ + {"(" swap$ * ")" * } + if$ + } + if$ +} + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} +FUNCTION {format.volume} +{ volume empty$ + { "book" type$ = + {number empty$ + {""} + {"vol. " number "seriesno" make.tag *} + if$ + } + {""} + if$ + } + {"vol. " volume "seriesno" make.tag *} + if$ +} +FUNCTION {format.volume2} +{ volume empty$ + {""} + {"vol. " volume "seriesno" make.tag *} + if$ +} + +FUNCTION {format.art.vol} +{ + volume empty$ + {""} + {volume n.filter "volume" make.tag} + if$ + number empty$ + 'skip$ + { "(" number "issue" make.tag * ")" * * } + if$ +} + +FUNCTION {format.series} +{ series empty$ + 'skip$ + {series "sertitle" make.tag} + if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { "" 'v := + "" 'l := + "" 'f := + edition "l" change.case$ 's := + "1" s = + "first" s = + or + { + "1" 'v := + "st" 'l := + } + { + "2" s = + "second" s = + or + { + "2" 'v := + "nd" 'l := + } + { + "3" s = + "third" s = + or + { + "3" 'v := + "rd" 'l := + } + { + "4" s = + "fourth" s = + or + { + "4" 'v := + "th" 'l := + } + { + "5" s = + "fifth" s = + or + { + "5" 'v := + "th" 'l := + } + { + "6" s = + "sixth" s = + or + { + "6" 'v := + "th" 'l := + } + { + "7" s = + "seventh" s = + or + { + "7" 'v := + "th" 'l := + } + { + "8" s = + "eighth" s = + or + { + "8" 'v := + "th" 'l := + } + { + "9" s = + "nineth" s = + or + { + "9" 'v := + "th" 'l := + } + { + edition "t" change.case$ 'f := + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + #0 bother = + { f "" = + { v l * 'f :=} + 'skip$ + if$ + } + { f "" = + { "\bedition{" v * "}" * l * 'f :=} + { "\bedition{" f * "}" * 'f :=} + if$ + } + if$ + f " edn." * + } + if$ +} +FUNCTION {format.isbn} +{ isbn empty$ + { "" } + { isbn "isbn" make.tag} + if$ +} + +INTEGERS {default.info} + + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + "" 'l := + + {t empty$ not} + { t #1 #1 substring$ 's := + + s is.num not + { "" l = not + {t find.integer + {#1 'multiresult := } + {#0 'multiresult := } + if$ + "" 't := + } + { + t #2 global.max$ substring$ 't := + } + if$ + } + { l s * 'l := + t #2 global.max$ substring$ 't := + } + if$ + } + while$ + multiresult +} +FUNCTION {clearpage} +{ 't := + "" 's := + "" 'l := + + { t empty$ not } + { + t #1 #1 substring$ 's := + s is.num not + 'skip$ + { l s * 'l := } + if$ + t #2 global.max$ substring$ 't := + } + while$ + l + +} +FUNCTION {do.pages} +{'t := + "" 'j := + "" 'v := + {t empty$ not} + { t #1 #1 substring$ 's := + s is.num not + s "," = not + and + { "" j = + { + t #2 global.max$ substring$ 't := + } + {t find.integer + { t clearpage 'v := } + 'skip$ + if$ + "" 't := + } + if$ + } + { j s * 'j := + t #2 global.max$ substring$ 't := + } + if$ + } + while$ + j clearpage 'j := + j "fpage" make.tag + "cnd" is.in.list + 'skip$ + {"--" * v "lpage" make.tag *} + if$ +} + + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages multi.page.check + {type$ "article" = + {""} + {"cnd" is.in.list + {"p. "} + {"pp. "} + if$ + } + if$ + pages do.pages * + } + {type$ "article" = + {""} + {"p. "} + if$ + pages clearpage "fpage" make.tag * + } + + if$ + } + if$ +} + +FUNCTION {replace.tilde} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "~" = + { { t #1 #1 substring$ "~" = } + { "\texttildelow " * + t #2 global.max$ substring$ 't := + } + while$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + + +FUNCTION {format.url} +{ url empty$ + 'skip$ + { type$ "article" = + 'skip$ + { #0 bother = + { "\url{" } + { "\burl{" } + if$ + url replace.tilde * "}" * + output + } + if$ + + urldate empty$ + 'skip$ + { "Accessed " urldate * output } + if$ + } + if$ +} + + +FUNCTION {publisher.month.pages}{ + publisher empty$ series empty$ and + { address empty$ + 'skip$ + 'new.sentence + if$ + format.pub.address + + pages empty$ + 'skip$ + {insert.comma} + if$ + format.pages output + + } + { + pages empty$ + 'skip$ + {insert.comma} + if$ + format.pages output + publisher empty$ + 'skip$ + {new.sentence} + if$ + format.pub.address + } + if$ +} + +function{process.doi}{ + doi 't := + "" 'b := + #1 'int := +% "doi =" t * top$ + + t text.length$ 'slen := + + {int slen = not } + {t int #3 substring$ "10." = + { + t int #1 - #1 substring$ 'b := + b "" = + {"a" 'b :=} % if b is empty need to set a letter + 'skip$ + if$ + + b is.num not + { + t int slen int - #1 + substring$ 't := + slen #1 - 'int := + } + 'skip$ + if$ + + } + 'skip$ + if$ + int #1 + 'int := + } + while$ + t +} + +FUNCTION {format.doi} +{ doi empty$ + {""} + { + "nodoi" is.in.list + {""} + %%{"doi:\doiurl{" process.doi * "}" * } + {"\doiurl{" process.doi * "} " * } + if$ + } + if$ +} + +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + {#1 bother = + "cnd" is.in.list not + and + { editor empty$ + 'skip$ + { "In: " output write$ format.editors } + if$ + } + 'skip$ + if$ + } + { editor empty$ + { "In: " booktitle upercase.first.letters "btitle" make.tag * output} + { "In: " output write$ format.editors "" %%% pushing empty string to the empty stack + booktitle upercase.first.letters "btitle" make.tag output + } + if$ + } + + if$ +} + +FUNCTION {format.in.ed} +{ title empty$ + 'skip$ + { editor empty$ + { title "btitle" make.tag output} + { author empty$ + { format.editors + stupid.colon + %format.date output + title "btitle" make.tag output + } + { "In: " output write$ format.editors "" %%% pushing empty string to the empty stack + title "btitle" make.tag output + } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { "Technical Report" } + 'type + if$ + number empty$ + { "t" change.case$ } + { number tie.or.space.connect } + if$ +} + +FUNCTION {patent.number} +{ number empty$ + 'skip$ + { number } + if$ +} +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + +FUNCTION {format.inpres} +{ "l" change.case$ 't := + "in press: " #10 + "in press. " #10 + "in press " #9 t chop.word + chop.word + chop.word + #1 global.max$ substring$ +} + +FUNCTION {bcomment.note} +{ note empty$ + 'skip$ + {note format.inpres "comment" make.tag output} + if$ +} + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.chapter.and.note} +{ note empty$ chapter empty$ organization empty$ and and + 'skip$ + { chapter empty$ + "notnumber" last.label = + or + {organization empty$ + { note "comment" make.tag output } + { note empty$ + { organization "comment" make.tag output } + { organization ". " * note * "comment" make.tag output } + if$ + } + if$ + } + { note empty$ + { "Chap. " chapter * "comment" make.tag output} + { type empty$ + { "Chap. " } + { type "t" change.case$ "Section" = + { "Sect. " } + { "Chap. " } + if$ + } + if$ + chapter * ". " * note * "comment" make.tag output + } + if$ + } + if$ + } + if$ +} + +FUNCTION {item.end} +{ chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + { new.sentence + format.doi output + } + 'skip$ + if$ + + type$ "unpublished" = + type$ "misc" = + or + { note empty$ + 'skip$ + {note.presented + 'skip$ + {new.sentence note output} + if$ + } + if$ + format.date.parens output + } + { new.sentence + type$ "proceedings" = + { author empty$ editor empty$ and + 'bcomment.note + 'format.chapter.and.note + if$ + } + 'format.chapter.and.note + if$ + } + if$ + list.string 'v := + default.list 'list.string := + + type$ ".isbn" * is.in.list + "cnd" is.in.list + or + { + new.sentence +% format.isbn output + } + 'skip$ + if$ + new.sentence + %% commented by SPi as we are using format.eprint %% + %% and also to avoide eprint being printed twice - Start %% + %%eprint empty$ + %% 'skip$ + %% {"\arxivurl{" eprint * "}" * output} + %%if$ + %% End %% + chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + 'skip$ + { new.sentence + format.doi output + } + if$ + new.sentence + format.url + v 'list.string := + fin.entry +} + +FUNCTION {article.item.end} +{ chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + { new.sentence +% format.doi output + } + 'skip$ + if$ + + type$ "unpublished" = + type$ "misc" = + or + { note empty$ + 'skip$ + {note.presented + 'skip$ + {new.sentence note output} + if$ + } + if$ + format.date.parens output + } + { new.sentence + type$ "proceedings" = + { author empty$ editor empty$ and + 'bcomment.note + 'format.chapter.and.note + if$ + } + 'format.chapter.and.note + if$ + } + if$ + list.string 'v := + default.list 'list.string := + + type$ ".isbn" * is.in.list + "cnd" is.in.list + or + { + new.sentence +% format.isbn output + } + 'skip$ + if$ + new.sentence + %% commented by SPi as we are using format.eprint %% + %% and also to avoide eprint being printed twice - Start %% + %%eprint empty$ + %% 'skip$ + %% {"\arxivurl{" eprint * "}" * output} + %%if$ + %% End %% + chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + 'skip$ + { new.sentence +%% format.doi output + } + if$ + new.sentence + format.url + v 'list.string := + fin.entry +} + + +FUNCTION {insert.element} +{ #0 bother = + { element "{botherref}" * write$ newline$} + { + type$ "article" = + {element "{barticle}" * write$ newline$} + 'skip$ + if$ + type$ "book" = + type$ "proceedings" = + type$ "manual" = + type$ "booklet" = + or or or + {element "{bbook}" * write$ newline$} + 'skip$ + if$ + + type$ "inbook" = + { "notnumber" last.label = + {element "{bchapter}" * write$ newline$} + {element "{bbook}" * write$ newline$} + if$ + } + 'skip$ + if$ + + type$ "incollection" = + type$ "inproceedings" = + type$ "conference" = + or or + {element "{bchapter}" * write$ newline$} + 'skip$ + if$ + } + if$ +} + +FUNCTION {end.element} +{ "\end" 'element := + item.end + insert.element + "\endbibitem" write$ newline$ +} + +FUNCTION {article.end.element} +{ "\end" 'element := + article.item.end + insert.element + "\endbibitem" write$ newline$ +} + + +FUNCTION {begin.element} +{ "\begin" 'element := + insert.element +} +function {set.options}{ + options empty$ + 'skip$ + {options 'list.string :=} + if$ +} + +FUNCTION {settings} +{} + +FUNCTION {article} +{ output.bibitem + author empty$ + institution empty$ + editor empty$ + and and + journal empty$ + or + year empty$ + or + % above tagging rule means: + % nead: (volume & (pages or number) ) or (doi [without volume, pages and number]) + volume empty$ not + pages empty$ not bnumber empty$ not or + and + + volume empty$ pages empty$ bnumber empty$ and and + doi empty$ not and + or + not + or + {#0 'bother :=} + {#1 'bother :=} + if$ + begin.element + author empty$ + { editor empty$ + 'skip$ + {format.editors stupid.colon} + if$ + } + { format.authors stupid.colon} + if$ + "cnd" is.in.list + { + journal empty$ + {format.title "atitle" make.tag "title" output.check} + {journal "jtitle" make.tag output} + if$ + } + { + format.title "atitle" make.tag "title" output.check + journal empty$ + 'skip$ + {new.sentence journal "jtitle" make.tag output} + if$ + } + if$ + format.art.vol output + pages empty$ + 'skip$ + {insert.comma} + if$ + format.pages output + format.date.parens output + format.doi output + format.eprint output + format.primaryClass output + article.end.element +} + + +FUNCTION {patent} +{ output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + add.period$ + patent.number output + insert.comma + formatpatent.date output + end.element +} + +FUNCTION { other } { patent } + +FUNCTION {book} +{ output.bibitem + author empty$ + institution empty$ + organization empty$ + editor empty$ + and and and + title empty$ + year empty$ + or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + begin.element + author empty$ + { editor empty$ + 'skip$ + {format.editors stupid.colon} + if$ + } + { format.authors stupid.colon} + if$ + format.title "btitle" make.tag "title" output.check + series empty$ + { + format.volume output + insert.comma + format.edition output + } + { edition empty$ + 'skip$ + 'insert.comma + if$ + format.edition output + new.sentence + format.series output + insert.comma + format.volume output + } + if$ + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {booklet} +{output.bibitem + author empty$ + title empty$ + year empty$ + howpublished empty$ + or or or + {#0 'bother :=} + {#1 'bother :=} + if$ + + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "btitle" make.tag "title" output.check + address empty$ publisher empty$ howpublished empty$ and and + 'skip$ + 'new.sentence + if$ + format.pub.address + format.date.parens output + end.element +} + +FUNCTION {misc} +{output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "btitle" make.tag "title" output.check + address empty$ publisher empty$ howpublished empty$ and and + 'skip$ + 'new.sentence + if$ + format.pub.address + end.element +} + +FUNCTION {softmisc} +{output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors} + if$ + stupid.colon + format.title "btitle" make.tag "title" output.check + insert.comma + version output + insert.comma + %%address empty$ publisher empty$ howpublished empty$ and and + %%'skip$ + %% 'new.sentence + %%if$ + format.pub.address + format.softmiscdate output + insert.comma + format.softmisc.eprint output + end.element +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + institution empty$ + organization empty$ + editor empty$ + and and and + title empty$ + year empty$ + or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + + chapter empty$ + { "" 'last.label :=} + { chapter string.to.integer empty$ author empty$ not and + { "notnumber" 'last.label :=} + { "" 'last.label :=} + if$ + } + if$ + + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + "notnumber" last.label = + { chapter "ctitle" make.tag output + add.period$ + } + 'skip$ + if$ + format.in.ed + series empty$ + { + insert.comma + format.volume output + insert.comma + format.edition output + new.sentence + } + { + insert.comma + format.edition output + new.sentence + format.series output + volume empty$ + 'skip$ + 'insert.comma + if$ + format.volume output + } + if$ + publisher.month.pages + publisher empty$ address empty$ edition empty$ series empty$ pages empty$ volume empty$ and and and and and + 'insert.comma + 'skip$ + if$ + format.date.parens output + end.element +} +FUNCTION {incollection} +{ output.bibitem + author empty$ + institution empty$ + and + booktitle empty$ + title empty$ + year empty$ + or or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + + "cnd" is.in.list + { + booktitle empty$ title empty$ not and + { + format.title "ctitle" make.tag "title" output.check + new.sentence + } + 'skip$ + if$ + } + { + format.title "ctitle" make.tag "title" output.check + title empty$ + 'skip$ + {new.sentence} + if$ + } + if$ + format.in.ed.booktitle + series empty$ + { + format.volume output + insert.comma + format.edition output + } + { + edition empty$ + 'skip$ + { insert.comma + format.edition output + } + if$ + new.sentence + format.series output + insert.comma + format.volume output + } + if$ + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {inproceedings} +{ output.bibitem + author empty$ + institution empty$ + and + title empty$ + year empty$ + or or + {#0 'bother :=} + {#1 'bother :=} + if$ + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + + "cnd" is.in.list + { + booktitle empty$ title empty$ not and + { + format.title "ctitle" make.tag "title" output.check + new.sentence + } + 'skip$ + if$ + } + { + format.title "ctitle" make.tag "title" output.check + title empty$ booktitle empty$ not and + 'skip$ + {new.sentence} + if$ + } + if$ + + format.in.ed.booktitle + series empty$ + 'skip$ + {new.sentence format.series output} + if$ + volume empty$ address empty$ publisher empty$ and and + 'skip$ + 'insert.comma + if$ + format.volume output + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ output.bibitem + author empty$ + organization empty$ + title empty$ + year empty$ + address empty$ + or or or or + {#0 'bother :=} + {#1 'bother :=} + if$ + begin.element + + author empty$ + { organization empty$ + 'skip$ + { organization "publisher" make.tag output.nonnull + stupid.colon% add.period$ + } + if$ + } + { format.authors stupid.colon} + if$ + title empty$ + 'skip$ + {format.title "btitle" make.tag output} + if$ + edition empty$ + {new.sentence} + {insert.comma} + if$ + format.edition output + edition empty$ + 'skip$ + {new.sentence} + if$ + author empty$ organization empty$ + or + 'skip$ + { organization "publisher" make.tag output.nonnull + insert.comma + } + if$ + address empty$ + 'skip$ + {address "location" make.tag output} + if$ + format.date.parens output + end.element +} + + +FUNCTION {phdthesis} +{output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + new.sentence + type$ "mastersthesis" = + {"Master's thesis" format.thesis.type output.nonnull} + {"PhD thesis" format.thesis.type output.nonnull} + if$ + school empty$ + 'skip$ + 'insert.comma + if$ + school "school" output.check + address empty$ + 'skip$ + 'insert.comma + if$ + address output + month.year.date output + end.element +} +FUNCTION {mastersthesis}{phdthesis} + + +FUNCTION {proceedings} +{ output.bibitem + author empty$ + institution empty$ + organization empty$ + editor empty$ + and and and + title empty$ + year empty$ + or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + + begin.element + author empty$ + { editor empty$ + {organization "institutionaled" make.tag "organization" output.check } + { format.editors } + if$ + } + { format.authors } + if$ + stupid.colon + format.title "btitle" make.tag output + series empty$ + 'skip$ + {new.sentence format.series output} + if$ + volume empty$ + 'skip$ + 'insert.comma + if$ + format.volume output + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {techreport} +{ output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + new.sentence + format.tr.number output.nonnull + institution empty$ + 'skip$ + 'insert.comma + if$ + institution "institution" output.check + address empty$ + 'skip$ + 'insert.comma + if$ + address output + month.year.date output + end.element +} + +FUNCTION {unpublished} +{ output.bibitem + #0 'bother := + + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + note empty$ + 'skip$ + { note.presented + {note output} + 'skip$ + if$ + } + if$ + end.element +} + +FUNCTION {default.type} { unpublished } + +MACRO {jan} {"January"} +MACRO {feb} {"February"} +MACRO {mar} {"March"} +MACRO {apr} {"April"} +MACRO {may} {"May"} +MACRO {jun} {"June"} +MACRO {jul} {"July"} +MACRO {aug} {"August"} +MACRO {sep} {"September"} +MACRO {oct} {"October"} +MACRO {nov} {"November"} +MACRO {dec} {"December"} + +READ + +EXECUTE {identify.mathphys.version} + +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} + +INTEGERS { et.al.char.used } + +FUNCTION {initialize.et.al.char.used} +{ #0 'et.al.char.used := +} + +%%%%% setting default options +FUNCTION {set.default.opt} +{"alpha" 'list.string :=} + +EXECUTE {set.default.opt} + +FUNCTION {assign.opt}{ + % First need to set options + "settings" type$ = + { options empty$ + 'skip$ + {options 'list.string :=} + if$ + } + 'skip$ + if$ +} + +ITERATE {assign.opt} +EXECUTE {initialize.et.al.char.used} + +FUNCTION {alpha.format.lab.names} +{ 's := + s num.names$ 'numnames := + numnames #1 > + { numnames #4 > + { #3 'namesleft := } + { numnames 'namesleft := } + if$ + #1 'nameptr := + "" + { namesleft #0 > } + { nameptr numnames = + { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { "+" * + #1 'et.al.char.used := + } + { s nameptr "{v{}}{l{}}" format.name$ * } + if$ + } + { s nameptr "{v{}}{l{}}" format.name$ * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + numnames #4 > + { "+" * + #1 'et.al.char.used := + } + 'skip$ + if$ + } + { s #1 "{v{}}{l{}}" format.name$ + duplicate$ text.length$ #2 < + { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ } + 'skip$ + if$ + } + if$ +} + +FUNCTION {standard.format.lab.names} +{ 's := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ " et~al." * } + { #2 < + 'skip$ + { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { " et~al." * } + { " and " * s #2 "{vv~}{ll}" format.name$ * } + if$ + } + if$ + } + if$ +} +FUNCTION {format.lab.names}{ + "alpha" is.in.list + 'alpha.format.lab.names + 'standard.format.lab.names + if$ +} + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + { key #3 text.prefix$ } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { "zzz" } + { key #3 text.prefix$ } + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.key.organization.label} +{ author empty$ + { key empty$ + { organization empty$ + { "zzz" } + { "The " #4 organization chop.word #3 text.prefix$ } + if$ + } + { key #3 text.prefix$ } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.organization.label} +{ editor empty$ + { key empty$ + { organization empty$ + { "zzz" } + { "The " #4 organization chop.word #3 text.prefix$ } + if$ + } + { key #3 text.prefix$ } + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.short.authors} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.organization.label + { type$ "manual" = + 'author.key.organization.label + 'author.key.label + if$ + } + if$ + } + if$ + 'short.list := +} + +FUNCTION {calc.label} +{ calc.short.authors + short.list + + "alpha" is.in.list + { + duplicate$ + year field.or.null purify$ #-1 #2 substring$ + * + 'label := + year field.or.null purify$ #-1 #4 substring$ + * + sortify 'sort.label := + } + { + "(" + * + year duplicate$ empty$ + short.list key field.or.null = or + { pop$ "" } + 'skip$ + if$ + * + 'label := + label 'sort.label := + } + if$ +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { nameptr #1 > + { " " * + "alpha" is.in.list + 'skip$ + {numnames int.to.str$ * " " *} + if$ + } + 'skip$ + if$ + s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := + nameptr numnames = + t "others" = + and + { "et al" * } + { t sortify * } + if$ + #3 numnames < + "alpha" is.in.list not + and + {#0 'namesleft := + " zzz " * + } + { + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + if$ + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "zzz" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "z" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "z" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "z" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION {presort} +{ calc.label + sort.label sortify + " " + * + type$ "book" = + type$ "inbook" = + or + {author empty$ + 'editor.organization.sort + 'author.organization.sort + if$ + } + { type$ "proceedings" = + type$ "incollection" = + or + {author empty$ + 'editor.organization.sort + 'author.organization.sort + if$ + } + { type$ "manual" = + 'author.organization.sort + 'author.sort + if$ + } + if$ + } + if$ + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ 'sort.label := + sort.label * + #1 entry.max$ substring$ 'sort.key$ := + + "settings" type$ = + {"aaa"} + {"unsort" is.in.list + {"bb"} + {"alpha" is.in.list + {sort.key$} + {sort.label} + if$ + } + if$ + } + if$ + 'sort.key$ := +} + + +ITERATE {presort} + +SORT + +INTEGERS { longest.label.width last.extra.num number.label } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #0 int.to.chr$ 'last.label := + "" 'j := + #0 'longest.label.width := + #0 'last.extra.num := + #0 'number.label := +} + +FUNCTION {forward.pass} +{ last.label label = + { last.extra.num #1 + 'last.extra.num := + last.extra.num int.to.chr$ 'extra.label := + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + label 'last.label := + } + if$ + number.label #1 + 'number.label := +} + +FUNCTION {reverse.pass} +{ j "b" = + { "a" 'extra.label := } + 'skip$ + if$ + extra.label 'j := + label extra.label * 'label := +} + +EXECUTE {initialize.longest.label} + +ITERATE {forward.pass} + +REVERSE {reverse.pass} + +FUNCTION {write.preambule} +{ "%% BioMed_Central_Bib_Style_v1.01" write$ newline$ newline$ + "\begin{thebibliography}{" number.label int.to.str$ * "}" * write$ newline$ + "% BibTex style file: bmc-mathphys.bst (version 2.1), 2014-07-24" write$ newline$ + "\ifx \bisbn \undefined \def \bisbn #1{ISBN #1}\fi" write$ newline$ + "\ifx \binits \undefined \def \binits#1{#1}\fi" write$ newline$ + "\ifx \bauthor \undefined \def \bauthor#1{#1}\fi" write$ newline$ + "\ifx \batitle \undefined \def \batitle#1{#1}\fi" write$ newline$ + "\ifx \bjtitle \undefined \def \bjtitle#1{#1}\fi" write$ newline$ + "\ifx \bvolume \undefined \def \bvolume#1{\textbf{#1}}\fi" write$ newline$ + "\ifx \byear \undefined \def \byear#1{#1}\fi" write$ newline$ + "\ifx \bissue \undefined \def \bissue#1{#1}\fi" write$ newline$ + "\ifx \bfpage \undefined \def \bfpage#1{#1}\fi" write$ newline$ + "\ifx \blpage \undefined \def \blpage #1{#1}\fi" write$ newline$ + "\ifx \burl \undefined \def \burl#1{\textsf{#1}}\fi" write$ newline$ + %%"\ifx \doiurl \undefined \def \doiurl#1{\textsf{#1}}\fi" write$ newline$ + "\ifx \doiurl \undefined \def \doiurl#1{\url{https://doi.org/#1}}\fi" write$ newline$ + "\ifx \betal \undefined \def \betal{\textit{et al.}}\fi" write$ newline$ + "\ifx \binstitute \undefined \def \binstitute#1{#1}\fi" write$ newline$ + "\ifx \binstitutionaled \undefined \def \binstitutionaled#1{#1}\fi" write$ newline$ + "\ifx \bctitle \undefined \def \bctitle#1{#1}\fi" write$ newline$ + "\ifx \beditor \undefined \def \beditor#1{#1}\fi" write$ newline$ + "\ifx \bpublisher \undefined \def \bpublisher#1{#1}\fi" write$ newline$ + "\ifx \bbtitle \undefined \def \bbtitle#1{#1}\fi" write$ newline$ + "\ifx \bedition \undefined \def \bedition#1{#1}\fi" write$ newline$ + "\ifx \bseriesno \undefined \def \bseriesno#1{#1}\fi" write$ newline$ + "\ifx \blocation \undefined \def \blocation#1{#1}\fi" write$ newline$ + "\ifx \bsertitle \undefined \def \bsertitle#1{#1}\fi" write$ newline$ + "\ifx \bsnm \undefined \def \bsnm#1{#1}\fi" write$ newline$ + "\ifx \bsuffix \undefined \def \bsuffix#1{#1}\fi" write$ newline$ + "\ifx \bparticle \undefined \def \bparticle#1{#1}\fi" write$ newline$ + "\ifx \barticle \undefined \def \barticle#1{#1}\fi" write$ newline$ + "\bibcommenthead" write$ newline$ +} + + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + write.preambule + "\ifx \bconfdate \undefined \def \bconfdate #1{#1}\fi" write$ newline$ + "\ifx \botherref \undefined \def \botherref #1{#1}\fi" write$ newline$ + "\ifx \url \undefined \def \url#1{\textsf{#1}}\fi" write$ newline$ + "\ifx \bchapter \undefined \def \bchapter#1{#1}\fi" write$ newline$ + "\ifx \bbook \undefined \def \bbook#1{#1}\fi" write$ newline$ + "\ifx \bcomment \undefined \def \bcomment#1{#1}\fi" write$ newline$ + "\ifx \oauthor \undefined \def \oauthor#1{#1}\fi" write$ newline$ + "\ifx \citeauthoryear \undefined \def \citeauthoryear#1{#1}\fi" write$ newline$ + "\ifx \endbibitem \undefined \def \endbibitem {}\fi" write$ newline$ + "\ifx \bconflocation \undefined \def \bconflocation#1{#1}\fi" write$ newline$ + "\ifx \arxivurl \undefined \def \arxivurl#1{\textsf{#1}}\fi" write$ newline$ + "\csname PreBibitemsHook\endcsname" write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} + + +%% XML output - done for each entry referenced in the BibTeX database +INTEGERS {i ll li j.int global.counter} +STRINGS {lr lp lt ls } + +FUNCTION {replace} +{ + 'lr := % replace string + 'lp := % pattern + 'lt := % text to search + "" 'ls := % result string + lp text.length$ 'll := % length of the search pattern + { lt empty$ not } + { lt #1 ll substring$ lp = + { ls lr * 'ls := + lt ll #1 + global.max$ substring$ 'lt := } + { ls lt #1 #1 substring$ * 'ls := + lt #2 global.max$ substring$ 'lt := } + if$ + } + while$ + ls +} + +FUNCTION {strip.letters} +{ + "" 's := + duplicate$ missing$ + 'pop$ + { + 't := + { t "" = not } + { % ascii '0' = 48, '9' = 57 + t #1 #1 substring$ chr.to.int$ 'i := + i #47 > i #58 < and + { s t #1 #1 substring$ * 's := } + 'skip$ + if$ + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + s +} +FUNCTION {output.xml} +{ duplicate$ "" = + 'pop$ + { " " swap$ * write$ newline$ } + if$ +} + +%% + % markup.xml + % + % Takes 2 args text & tag {"the text " "tag"} + % Returns 1 string {"the text <\tag>"} +%% +FUNCTION {markup.xml} +{ + "" 'v := % result + 't := % tag + duplicate$ missing$ + 'pop$ + { 'v := } + if$ + v "" = + 'skip$ + { "<" t * ">" * v * "" * 'v := } + if$ + v +} + +%% Takes 2 args - tag, string +FUNCTION{markup.xml.title} +{ pop$ % tag + duplicate$ missing$ + 'pop$ + { + 's := % string + s "\&" "&" replace 's := + s "p" markup.xml 's := + s "title" markup.xml output.xml + } + if$ +} + + +%% + % markup.xml.pages + % + % Takes 1 arg (pages string) + % seperates into and if + % there is a - seperator. else no lpage. + % + % need to remove others +%% +FUNCTION{markup.xml.pages} +{ + "" 'v := % fpage + "" 's := % lpage + duplicate$ missing$ + 'pop$ + { + 't := + t " " "" replace 't := % remove all spaces. pgs must be - seperated + { t empty$ not } + { + t #1 #1 substring$ "-" = + { + t #2 global.max$ substring$ 's := + "" 't := % break while loop + }{ + v t #1 #1 substring$ * 'v := + t #2 global.max$ substring$ 't := + } + if$ + } + while$ + } + if$ + v "fpage" markup.xml output.xml + s "lpage" markup.xml output.xml +} + + +%% + % markup.xml.names + % + % Takes 2 args + % tag, namefield (eg. author "au") + % splits fields into and + % writes info + % returns nothing +%% +FUNCTION {markup.xml.names} +{ + 't := % tag + "" 'v := + "" 's := + duplicate$ empty$ + { pop$ + organization missing$ + { institution "cnm" markup.xml + "au" markup.xml "aug" markup.xml output.xml } + { organization "cnm" markup.xml + "au" markup.xml "aug" markup.xml output.xml } + if$ } + { + " " write$ newline$ + 'temp.str := % names string + temp.str num.names$ 'j.int := % num of names + #1 'i := % init counter + { i #1 j.int + < } % while (i <= j.int) + { + " " write$ + + % Initial first names + % if first name all in capitals + % - assume is initial list of first names. + temp.str i "{ff{ }}" format.name$ + duplicate$ "u" change.case$ = + { temp.str i "{ff{ }}" format.name$ } + { temp.str i "{f{}}" format.name$ } + if$ + + % if last name but no first name use cnm; else snm + duplicate$ "" = + { temp.str i "{ll{ }}" format.name$ % last names space seperated. + "cnm" markup.xml write$ } + { temp.str i "{ll{ }}" format.name$ % last names space seperated. + "snm" markup.xml write$ } + if$ + + "fnm" markup.xml write$ + + "" write$ newline$ + i #1 + 'i := + } + while$ + " " write$ newline$ + } + if$ +} + + +%% + % markup.xml.pub + % + % Takes 4 args (school address publisher tag) + % prints concatenation + % returns nothing +%% +FUNCTION {markup.xml.pub} +{ + 't := % Tag + "" 'v := % Publisher + "" 'l := % Address + "" 'f := % School + "" 's := % Answer + duplicate$ missing$ 'pop$ { 'v := } if$ + duplicate$ missing$ 'pop$ { 'l := } if$ + duplicate$ missing$ 'pop$ { 'f := } if$ + "" f = not % school not empty + { f 's := } % return school as publisher + { % else + "" v = "" l = and % address and pub empty + 'skip$ + { + "" l = + { v 's := } % return pub + { "" v = + { l 's := } % return add + { l ": " * v * 's := } % return add : pub + if$ + } + if$ + } + if$ + } + if$ + s t markup.xml output.xml +} + +%% + % xml.phd + % + % Takes nothing + % Returns type (phd/msc) of empty string +%% +FUNCTION {xml.phd} +{ + "phdthesis" type$ = + "mastersthesis" type$ = or + { "phdthesis" type$ = + { "PhD thesis" } + { "Master's thesis" } + if$ + } + { type } % usually empty + if$ +} + +% markup.xml.edition +% +% edition is a numeric value. ie "2" +% if format 2nd 1st etc.. strip letters. +% +FUNCTION {markup.xml.edition} +{ pop$ pop$ %clear stack + edition strip.letters duplicate$ "" = + { pop$ edition } + 'skip$ + if$ + "edition" markup.xml output.xml +} + + +FUNCTION{begin.bmcxmlcomment}{ + newline$ + "\newcommand{\BMCxmlcomment}[1]{}" write$ newline$ + newline$ + "\BMCxmlcomment{" write$ newline$ + newline$ "" write$ newline$ +} + +FUNCTION{end.bmcxmlcomment}{ + newline$ + "" write$ newline$ + "} % end of \BMCxmlcomment" write$ newline$ +} + +FUNCTION {export.xml}{ + newline$ + global.counter #1 + 'global.counter := + "" * + write$ newline$ +% title "\&" "&" replace "title" markup.xml.title + title "title" markup.xml.title + author "aug" markup.xml.names % org. and inst. here + howpublished missing$ + { booktitle missing$ + { journal missing$ + { xml.phd } % Phd/Msc + {journal} + if$ + } {booktitle} + if$ + } { howpublished } + if$ "source" markup.xml output.xml + school + address + publisher "publisher" markup.xml.pub + editor "editor" markup.xml output.xml + edition "edition" markup.xml.edition + series "p" markup.xml + "title" markup.xml + "series" markup.xml output.xml + chapter "p" markup.xml + "title" markup.xml + "section" markup.xml output.xml + % month % ignore + year "pubdate" markup.xml output.xml + + note missing$ + { volume "volume" markup.xml output.xml + number "issue" markup.xml output.xml + pages markup.xml.pages + url "url" markup.xml output.xml } + { note "l" change.case$ "in press" = + { " " write$ newline$ } + { volume "volume" markup.xml output.xml + number "issue" markup.xml output.xml + pages markup.xml.pages + url "url" markup.xml output.xml + note "note" markup.xml output.xml + } + if$ + } + if$ + "" write$ newline$ +} + +%%EXECUTE {begin.bmcxmlcomment} +%%ITERATE {export.xml} +%%EXECUTE {end.bmcxmlcomment} + +%% End of file `sn-mathphys-ay.bst'. + + + diff --git a/waypoint_control/sn-article-template/bst/sn-mathphys-num.bst b/waypoint_control/sn-article-template/bst/sn-mathphys-num.bst new file mode 100644 index 0000000..e4d1e42 --- /dev/null +++ b/waypoint_control/sn-article-template/bst/sn-mathphys-num.bst @@ -0,0 +1,3211 @@ +%% This is file `sn-mathphys-num.bst' +%% Compatible with bibtex version 0.99d. +%% +%% Note: Per default sorting entries is done in the order of citation. +%% If the journal requires alphabetical order of references, select the alpha option +%% +%% You are free to use this style file as you see fit, provided +%% that you do not make changes to the file. +%% +%% It may be distributed under the terms of the LaTeX Project Public +%% License, as described in lppl.txt in the base LaTeX distribution. +%% Either version 1.0 or, at your option, any later version. +%% +%% LIMITATIONS: +%% If you are getting error like +%% "Sorry---you've exceeded BibTeX's number of string global-variables" +%% that means you are using to old bibtex version. You should download latest version 0.99d. +%% (One of the binaries location is minimals.contextgarden.net/current/bin/common/) + +FUNCTION {identify.mathphys.version} +{ % Put identifying string in the .blg file + "sn-mathphys-num.bst" + " [2024/07/19 v1.1 bibliography style]" + * top$ +} + +ENTRY + { address + author + booktitle + bnumber + chapter + doi + edition + editor + howpublished + institution + isbn + journal + key + keywords + month + note + number + organization + pages + publisher + school + series + title + type + volume + year + url + info + options + urldate + eprint + archive + archivePrefix + primaryClass + eid + adsurl + adsnote + version + } + {} + { label extra.label sort.label short.list} + +INTEGERS { output.state before.all mid.sentence after.sentence + after.block after.authors between.elements bother + Nisbn Nmonth slen set.settings tmp month.printed} + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := + #4 'after.authors := + #5 'between.elements := +} + +STRINGS { s t element} +STRINGS { longest.label last.label list.string default.list} +STRINGS { v l f j b temp.str} + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { " " * write$ newline$} + { output.state after.block = + { add.period$ write$ + newline$ + } + { + output.state after.authors = + { ": " * write$ + newline$ + } + { output.state between.elements = + { ", " * write$ newline$} + { output.state before.all = + 'write$ + { add.period$ " " * write$ newline$} + if$ + } + if$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} +FUNCTION {fin.entry} +{ write$ newline$ } + +FUNCTION {stupid.colon} +{ after.authors 'output.state := } + + +FUNCTION {insert.comma} +{ output.state before.all = + 'skip$ + { between.elements 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {sort.format.month} +{ 't := + t #1 #2 substring$ "01" = + t #1 #1 substring$ "1" = + t #2 #2 substring$ "" = + and or + { "January" } + { t #1 #2 substring$ "02" = + t #1 #1 substring$ "2" = + t #2 #2 substring$ "" = + and or + { "February" } + { t #1 #2 substring$ "03" = + t #1 #1 substring$ "3" = + t #2 #2 substring$ "" = + and or + { "March" } + { t #1 #2 substring$ "04" = + t #1 #1 substring$ "4" = + or + { "April" } + { t #1 #2 substring$ "05" = + t #1 #1 substring$ "5" = + or + { "May" } + { t #1 #2 substring$ "06" = + t #1 #1 substring$ "6" = + or + { "June" } + { t #1 #2 substring$ "07" = + t #1 #1 substring$ "7" = + or + { "July" } + { t #1 #2 substring$ "08" = + t #1 #1 substring$ "8" = + or + { "August" } + { t #1 #2 substring$ "09" = + t #1 #1 substring$ "9" = + or + { "September" } + { t #1 #2 substring$ "10" = + { "October" } + { t #1 #2 substring$ "11" = + { "November" } + { t #1 #2 substring$ "12" = + { "December" } + { t } % No match + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + +} + +INTEGERS {sk} +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +FUNCTION {make.tag} +{ 't := + duplicate$ empty$ + { pop$ "" } + { bother #0 = + { + t "volume" = + {"\textbf{" swap$ * "}" * } + 'skip$ + if$ + } + { "\b" t * "{" * swap$ * "}" * } + if$ + } + if$ +} + + + +FUNCTION {springer.publisher} +{publisher #1 #8 substring$ "Springer" = + { "Springer" } + { publisher } + if$ +} + +FUNCTION {format.adsurl} +{ + adsurl empty$ + { "" } + {" \href{" adsurl "}" *} + if$ +} + +FUNCTION {format.adsnote} +{ + adsnote empty$ + { "" } + { ". " * adsnote *} + if$ +} + + +FUNCTION {format.soft.title} +{ + title empty$ + { "" } + { title "," *} + if$ +} + +FUNCTION {format.softmisctitle} +{ title empty$ + { ""} + { version empty$ + { title ", " *} + { title ", " * version " " *} + if$ + } + if$ +} + +FUNCTION {format.softmisc.archive} +{ + archivePrefix empty$ + { "" } + { "" } + if$ +} + +FUNCTION {format.archive} +{ + archivePrefix empty$ + { "" } + { archivePrefix ":" *} + if$ +} + +FUNCTION {format.primaryClass} +{ + primaryClass empty$ + { "" } + { "{[" primaryClass * "]}" *} + if$ +} + +FUNCTION {format.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.softmisc.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.pub.address} +{ publisher empty$ + howpublished empty$ + and + { + address empty$ + 'skip$ + { volume empty$ + 'insert.comma + 'new.sentence + if$ + address + type$ "inproceedings" = + {"conflocation"} + {"location"} + if$ + make.tag output + } + if$ + } + { + address empty$ + { publisher empty$ + {howpublished} + {springer.publisher} + if$ + "publisher" make.tag + #1 bother = + {", \blocation{???}" * } + 'skip$ + if$ + output + } + { + publisher empty$ + {howpublished } + {springer.publisher } + if$ + "publisher" make.tag output + insert.comma + address "location" make.tag output + } + if$ + } + if$ +} + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {mk.tag} +{ 'temp.str := + duplicate$ empty$ + { pop$ "" } + { + b "nothing" = + 'skip$ + { "\b" temp.str * "{" * swap$ * "}" * } + if$ + } + if$ +} + +FUNCTION {space.after.dot} +{'j := + t 'f := + j 't := + s 'j := + "" 'l := + "" 's := + { t empty$ not } + { + t #1 #3 substring$ "{-}" = + { l " {q}. " * 'l := + t #4 global.max$ substring$ 't := + } + 'skip$ + if$ + + t #1 #1 substring$ 's := + l s * 'l := + s "." = + { + t #2 #1 substring$ " " = + 'skip$ + { + l " " * 'l := + t #2 #4 substring$ "{\,}" = + { t #5 global.max$ substring$ 't := } + 'skip$ + if$ + } + if$ + } + 'skip$ + if$ + t #2 global.max$ substring$ 't := + } + while$ + f 't := + j 's := + l +} + +FUNCTION {fix.inits}{ + 't := + "" 'element := + { t empty$ not } + { + t #1 #3 substring$ ".q." = + { element ".-" * 'element := + t #3 global.max$ substring$ 't := + } + {element t #1 #1 substring$ * 'element :=} + if$ + + t #2 global.max$ substring$ 't := + } + while$ + element +} + +FUNCTION {fix.snm}{ + 't := + "" 'element := + { t empty$ not } + { + t #1 #3 substring$ "{-}" = + {element "-" * 'element := + t #3 global.max$ substring$ 't := + } + {element t #1 #1 substring$ * 'element :=} + if$ + + t #2 global.max$ substring$ 't := + } + while$ + element +} + +FUNCTION {enbrace.dash}{ + 't := + "" 'element := + { t empty$ not } + { + t #1 #1 substring$ "-" = + {element "{-}" * 'element :=} + {element t #1 #1 substring$ * 'element :=} + if$ + t #2 global.max$ substring$ 't := + } + while$ + element +} + +FUNCTION {fix.name}{ + + enbrace.dash 's := + "" 'l := + "" 't := + + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { + s nameptr "{vv~}{ll}{, jj}" format.name$ + s nameptr "{, ff}" format.name$ space.after.dot * 'l := + #1 nameptr = + {l 't :=} + {t " and " * l * 't := } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + t +} + +FUNCTION {name.separator}{ + namesleft #1 > + {", " * } + 'skip$ + if$ +} + +FUNCTION {format.author.editor} +{ 'b := + + bother #1 = + b "nothing" = + or + 'skip$ + {"b" b * 'b :=} + if$ + + b "editor" = + b "beditor" = + b "nothing" = + or or + {editor 's :=} + {author 's :=} + if$ + + %% modifying name + s fix.name 's := + + "" 't := + + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + + s numnames "{ll}" format.name$ 'l := + l "others" = + l "{others}" = + l "et al." = + l "{et al.}" = + or or or + {#1 'tmp :=} + {#0 'tmp :=} + if$ + + { namesleft #0 > } + { s nameptr "{vv}" format.name$ "particle" mk.tag 'v := + s nameptr "{ll}" format.name$ fix.snm "snm" mk.tag 'l := + s nameptr "{f{.}.}" format.name$ fix.inits "inits" mk.tag 'f := + s nameptr "{jj}" format.name$ "suffix" mk.tag 'j := + + + namesleft #1 = + tmp #1 = + and + { b "bauthor" = + b "beditor" = + or + {"et al."} + {"\betal"} + if$ + #1 'tmp := + } + { + b "bauthor" = + b "beditor" = + or + {"\oauthor{"} + { + b "nothing" = + {""} + {"\b" b * "{" *} + if$ + } +%% if$ +%% +%% v empty$ +%% 'skip$ +%% {v * " " *} + if$ + + l empty$ + 'skip$ + { l *} + if$ + + f empty$ + 'skip$ + {", " * f *} + if$ + + j empty$ + 'skip$ + {" " * j *} + if$ + + b "nothing" = + {""} + {"}"} + if$ + + * "" 't := + } + if$ + + name.separator + write$ + + namesleft #1 > + b "nothing" = not + and + { namesleft #2 = + tmp #1 = + and + 'skip$ + 'newline$ + if$ + } + 'skip$ + if$ + + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.editors} +{ editor empty$ + 'skip$ + { + bother #0 = + { author empty$ + {"editor"} + {"nothing"} + if$ + } + {"editor"} + if$ + format.author.editor + editor num.names$ #1 > + { " (eds.)" } + { " (ed.)" } + if$ + write$ + } + if$ +} + +FUNCTION {format.authors} +{ author empty$ + 'skip$ + {"author" format.author.editor} + if$ +} + +FUNCTION {cite.author.editor} +{ 's := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ " et~al." * } + { #2 = + { s #2 "{vv~}{ll}{ jj}{ f}" format.name$ "others" = + { " et~al." * } + { " and " * s #2 "{vv~}{ll}" format.name$ * } + if$ + } + 'skip$ + if$ + } + if$ +} + +FUNCTION {check.auth.edit.org} +{author empty$ + { + editor empty$ + { + organization empty$ + {""} + {organization} + if$ + } + {editor cite.author.editor} + if$ + } + {author cite.author.editor} + if$ +} + +FUNCTION {check.year} +{ year empty$ + {""} + {year extra.label *} + if$ +} + +INTEGERS { multiresult char.num k int} +INTEGERS {str.length count return save.num1 save.num2} +FUNCTION {is.in.list}{ + 'f := + %%%% saveing "s" and "t" + s 'j := + f 's := + t 'f := + list.string text.length$ 'str.length := + list.string 't := +% s text.length$ 'slen := + int 'save.num1 := + count 'save.num2 := + #1 'int := + #1 'count := + #0 'return := + + { count str.length = not + #0 str.length = not + and + } + { + count #1 + 'count := + t int #1 substring$ "," = + { + t #1 int substring$ s "," * = + { + #1 'return := + str.length 'count := + } + 'skip$ + if$ + + int #1 + 'int := + t int global.max$ substring$ 't := + #0 'int := + } + 'skip$ + if$ + int #1 + 'int := + } + while$ + + save.num1 'int := + save.num2 'count := + + #0 return = + { s t = + {#1 'return :=} + 'skip$ + if$ + } + 'skip$ + if$ + %%%% returning original "s" and "t" + j 's := + f 't := + + return +} + +INTEGERS {bibitem.count} + +FUNCTION {print.count} +{ bibitem.count #1 + 'bibitem.count := + newline$ + "%%% " + bibitem.count int.to.str$ * write$ +} + + +FUNCTION {output.bibitem} +{ print.count + newline$ + "\bibitem[\protect\citeauthoryear{" write$ + check.auth.edit.org write$ + "}{" write$ + check.year write$ + "}]{" write$ + cite$ write$ + "}" write$ + newline$ + "" before.all 'output.state := +} + + + + +FUNCTION {string.to.integer} +{ 't := + t text.length$ 'k := + #1 'char.num := + { t char.num #1 substring$ 's := + s is.num + s "." = + or + char.num k = not + and + } + { char.num #1 + 'char.num := } + while$ + char.num #1 - 'char.num := + t #1 char.num substring$ +} + + +FUNCTION {find.integer} +{ 't := + #0 'int := + { int not + t empty$ not + and + } + { t #1 #1 substring$ 's := + s is.num + {#1 'int :=} + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + int +} + +function{title.lowerwords}{ +"a,an,and,of,the,for,in,to,over,from,on,or,so,than,that,this,as,but,with,by,at,down,up,upon,al,ale,aus,aux,d'Analyse,d'Analystes,d'Architecture,d'Etudes,d'Histoire,da,dans,de,degli,dei,del," +"dell',dell'Accademia,dell'Istituto,dell'Universita,della,delle,dem,der,des,detta,di,die,din,dlia,do,du,e,eXpress,ed,ego,el,em,en,et,fur,i,iz,l'Academie,l'Age,l'Antiquite," * +"l'Approximation,l'Ecole,l'Histoire,l'I.S.U.P.,l'INSA,l'IREM,l'Indirizzo,l'Institut,l'Institute,l'UFR,l'Union,l'Universite,la,las,les,na,nella,per,po,si,sue,sur,ta,tes,und,van,voor,zu,zum,zur" * +} + +FUNCTION {upercase.first.letters}{ + 't := + "" 's := + #1 'int := + #1 'count := + list.string 'v := + "" 'b := + title.lowerwords 'list.string := + + t text.length$ 'slen := + + {count slen = not } + {t int #1 substring$ " " = + { + int #1 - 'int := + t #1 int substring$ 'b := + + % if word not in title.lowerwords - uppercase first letter + b is.in.list not + { b "l" change.case$ b = + { b "u" change.case$ "t" change.case$ 'b := } + 'skip$ + if$ + } + 'skip$ + if$ + + int #1 + 'int := + + s b " " * * 's := + int #1 + 'int := + t int global.max$ substring$ 't := + #0 'int := + } + 'skip$ + if$ + int #1 + 'int := + count #1 + 'count := +% "count=" count int.to.str$ * " slen=" * slen int.to.str$ * top$ + } + while$ + v 'list.string := + % last word is "t" and need to check it too + s t + t "l" change.case$ t = + { "u" change.case$ "t" change.case$ } + 'skip$ + if$ + * +} + + +FUNCTION {format.title} +{ title empty$ + { "" } + { title + "article" type$ = + type$ "techreport" = + type$ "inbook" = + type$ "inproceedings" = + type$ "incollection" = + type$ "phdthesis" = + type$ "mastersthesis" = + or or or or or or + {"t" change.case$} + { type$ "unpublished" = + type$ "misc" = + or + 'skip$ + 'upercase.first.letters + if$ + } + if$ + } + if$ +} + + +FUNCTION {note.presented} +{ note #1 #9 substring$ "presented" = + note #1 #9 substring$ "Presented" = + or +} + +FUNCTION {n.filter} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "," = + t #1 #1 substring$ "\" = + t #1 #1 substring$ "~" = + or or + { "" * + t #2 global.max$ substring$ 't := + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {byear} +{ duplicate$ empty$ + { pop$ "" } + { 't := + t text.length$ 'sk := + #5 sk = + { t #1 #4 substring$ 's := + t #5 #1 substring$ 'longest.label := + longest.label is.num not + {s "year" make.tag + "nameyear" is.in.list + {longest.label * } + 'skip$ + if$ + } + {t "year" make.tag } + if$ + } + { t "year" make.tag + "nameyear" is.in.list + {extra.label *} + 'skip$ + if$ + } + if$ + } + if$ +} + +FUNCTION {format.date} +{ year empty$ + { "" } + { year byear } + if$ +} + +FUNCTION {parens} +{ "(" swap$ * ")" * } + +FUNCTION {format.date.parens} +{ year empty$ + { "" } + { year byear parens } + if$ +} + +FUNCTION {noparens} +{ " " swap$ * "" * } + +FUNCTION {format.softmiscdate} +{ year empty$ + { "" } + { year byear parens } + if$ +} + +FUNCTION {format.month}{ + month empty$ + {""} + {month sort.format.month "confdate" make.tag} + if$ +} + +FUNCTION {formatpatent.date} +{ year empty$ + 'skip$ + { month empty$ + { year } + {format.month " " * year *} + if$ + } + if$ +} + +FUNCTION {month.year.date} +{ year empty$ + {""} + { month empty$ + {year byear} + { format.month " " * year byear * } + if$ + type$ "inproceedings" = + 'skip$ + {"(" swap$ * ")" * } + if$ + } + if$ +} + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} +FUNCTION {format.volume} +{ volume empty$ + { "book" type$ = + {number empty$ + {""} + {"vol. " number "seriesno" make.tag *} + if$ + } + {""} + if$ + } + {"vol. " volume "seriesno" make.tag *} + if$ +} +FUNCTION {format.volume2} +{ volume empty$ + {""} + {"vol. " volume "seriesno" make.tag *} + if$ +} + +FUNCTION {format.art.vol} +{ + volume empty$ + {""} + {volume n.filter "volume" make.tag} + if$ + number empty$ + 'skip$ + { "(" number "issue" make.tag * ")" * * } + if$ +} + +FUNCTION {format.series} +{ series empty$ + 'skip$ + {series "sertitle" make.tag} + if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { "" 'v := + "" 'l := + "" 'f := + edition "l" change.case$ 's := + "1" s = + "first" s = + or + { + "1" 'v := + "st" 'l := + } + { + "2" s = + "second" s = + or + { + "2" 'v := + "nd" 'l := + } + { + "3" s = + "third" s = + or + { + "3" 'v := + "rd" 'l := + } + { + "4" s = + "fourth" s = + or + { + "4" 'v := + "th" 'l := + } + { + "5" s = + "fifth" s = + or + { + "5" 'v := + "th" 'l := + } + { + "6" s = + "sixth" s = + or + { + "6" 'v := + "th" 'l := + } + { + "7" s = + "seventh" s = + or + { + "7" 'v := + "th" 'l := + } + { + "8" s = + "eighth" s = + or + { + "8" 'v := + "th" 'l := + } + { + "9" s = + "nineth" s = + or + { + "9" 'v := + "th" 'l := + } + { + edition "t" change.case$ 'f := + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + #0 bother = + { f "" = + { v l * 'f :=} + 'skip$ + if$ + } + { f "" = + { "\bedition{" v * "}" * l * 'f :=} + { "\bedition{" f * "}" * 'f :=} + if$ + } + if$ + f " edn." * + } + if$ +} +FUNCTION {format.isbn} +{ isbn empty$ + { "" } + { isbn "isbn" make.tag} + if$ +} + +INTEGERS {default.info} + + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + "" 'l := + + {t empty$ not} + { t #1 #1 substring$ 's := + + s is.num not + { "" l = not + {t find.integer + {#1 'multiresult := } + {#0 'multiresult := } + if$ + "" 't := + } + { + t #2 global.max$ substring$ 't := + } + if$ + } + { l s * 'l := + t #2 global.max$ substring$ 't := + } + if$ + } + while$ + multiresult +} +FUNCTION {clearpage} +{ 't := + "" 's := + "" 'l := + + { t empty$ not } + { + t #1 #1 substring$ 's := + s is.num not + 'skip$ + { l s * 'l := } + if$ + t #2 global.max$ substring$ 't := + } + while$ + l + +} +FUNCTION {do.pages} +{'t := + "" 'j := + "" 'v := + {t empty$ not} + { t #1 #1 substring$ 's := + s is.num not + s "," = not + and + { "" j = + { + t #2 global.max$ substring$ 't := + } + {t find.integer + { t clearpage 'v := } + 'skip$ + if$ + "" 't := + } + if$ + } + { j s * 'j := + t #2 global.max$ substring$ 't := + } + if$ + } + while$ + j clearpage 'j := + j "fpage" make.tag + "cnd" is.in.list + 'skip$ + {"--" * v "lpage" make.tag *} + if$ +} + + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages multi.page.check + {type$ "article" = + {""} + {"cnd" is.in.list + {"p. "} + {"pp. "} + if$ + } + if$ + pages do.pages * + } + {type$ "article" = + {""} + {"p. "} + if$ + pages clearpage "fpage" make.tag * + } + + if$ + } + if$ +} + +FUNCTION {replace.tilde} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "~" = + { { t #1 #1 substring$ "~" = } + { "\texttildelow " * + t #2 global.max$ substring$ 't := + } + while$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + + +FUNCTION {format.url} +{ url empty$ + 'skip$ + { type$ "article" = + 'skip$ + { #0 bother = + { "\url{" } + { "\burl{" } + if$ + url replace.tilde * "}" * + output + } + if$ + + urldate empty$ + 'skip$ + { "Accessed " urldate * output } + if$ + } + if$ +} + + +FUNCTION {publisher.month.pages}{ + publisher empty$ series empty$ and + { address empty$ + 'skip$ + 'new.sentence + if$ + format.pub.address + + pages empty$ + 'skip$ + {insert.comma} + if$ + format.pages output + + } + { + pages empty$ + 'skip$ + {insert.comma} + if$ + format.pages output + publisher empty$ + 'skip$ + {new.sentence} + if$ + format.pub.address + } + if$ +} + +function{process.doi}{ + doi 't := + "" 'b := + #1 'int := +% "doi =" t * top$ + + t text.length$ 'slen := + + {int slen = not } + {t int #3 substring$ "10." = + { + t int #1 - #1 substring$ 'b := + b "" = + {"a" 'b :=} % if b is empty need to set a letter + 'skip$ + if$ + + b is.num not + { + t int slen int - #1 + substring$ 't := + slen #1 - 'int := + } + 'skip$ + if$ + + } + 'skip$ + if$ + int #1 + 'int := + } + while$ + t +} + +FUNCTION {format.doi} +{ doi empty$ + {""} + { + "nodoi" is.in.list + {""} + %%{"doi:\doiurl{" process.doi * "}" * } + {"\doiurl{" process.doi * "} " * } + if$ + } + if$ +} + +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + {#1 bother = + "cnd" is.in.list not + and + { editor empty$ + 'skip$ + { "In: " output write$ format.editors } + if$ + } + 'skip$ + if$ + } + { editor empty$ + { "In: " booktitle upercase.first.letters "btitle" make.tag * output} + { "In: " output write$ format.editors "" %%% pushing empty string to the empty stack + booktitle upercase.first.letters "btitle" make.tag output + } + if$ + } + + if$ +} + +FUNCTION {format.in.ed} +{ title empty$ + 'skip$ + { editor empty$ + { title "btitle" make.tag output} + { author empty$ + { format.editors + stupid.colon + %format.date output + title "btitle" make.tag output + } + { "In: " output write$ format.editors "" %%% pushing empty string to the empty stack + title "btitle" make.tag output + } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { "Technical Report" } + 'type + if$ + number empty$ + { "t" change.case$ } + { number tie.or.space.connect } + if$ +} + +FUNCTION {patent.number} +{ number empty$ + 'skip$ + { number } + if$ +} +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + +FUNCTION {format.inpres} +{ "l" change.case$ 't := + "in press: " #10 + "in press. " #10 + "in press " #9 t chop.word + chop.word + chop.word + #1 global.max$ substring$ +} + +FUNCTION {bcomment.note} +{ note empty$ + 'skip$ + {note format.inpres "comment" make.tag output} + if$ +} + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.chapter.and.note} +{ note empty$ chapter empty$ organization empty$ and and + 'skip$ + { chapter empty$ + "notnumber" last.label = + or + {organization empty$ + { note "comment" make.tag output } + { note empty$ + { organization "comment" make.tag output } + { organization ". " * note * "comment" make.tag output } + if$ + } + if$ + } + { note empty$ + { "Chap. " chapter * "comment" make.tag output} + { type empty$ + { "Chap. " } + { type "t" change.case$ "Section" = + { "Sect. " } + { "Chap. " } + if$ + } + if$ + chapter * ". " * note * "comment" make.tag output + } + if$ + } + if$ + } + if$ +} + +FUNCTION {item.end} +{ chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + { new.sentence + format.doi output + } + 'skip$ + if$ + + type$ "unpublished" = + type$ "misc" = + or + { note empty$ + 'skip$ + {note.presented + 'skip$ + {new.sentence note output} + if$ + } + if$ + format.date.parens output + } + { new.sentence + type$ "proceedings" = + { author empty$ editor empty$ and + 'bcomment.note + 'format.chapter.and.note + if$ + } + 'format.chapter.and.note + if$ + } + if$ + list.string 'v := + default.list 'list.string := + + type$ ".isbn" * is.in.list + "cnd" is.in.list + or + { + new.sentence +% format.isbn output + } + 'skip$ + if$ + new.sentence + %% commented by SPi as we are using format.eprint %% + %% and also to avoide eprint being printed twice - Start %% + %%eprint empty$ + %% 'skip$ + %% {"\arxivurl{" eprint * "}" * output} + %%if$ + %% End %% + chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + 'skip$ + { new.sentence + format.doi output + } + if$ + new.sentence + format.url + v 'list.string := + fin.entry +} + +FUNCTION {article.item.end} +{ chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + { new.sentence +% format.doi output + } + 'skip$ + if$ + + type$ "unpublished" = + type$ "misc" = + or + { note empty$ + 'skip$ + {note.presented + 'skip$ + {new.sentence note output} + if$ + } + if$ + format.date.parens output + } + { new.sentence + type$ "proceedings" = + { author empty$ editor empty$ and + 'bcomment.note + 'format.chapter.and.note + if$ + } + 'format.chapter.and.note + if$ + } + if$ + list.string 'v := + default.list 'list.string := + + type$ ".isbn" * is.in.list + "cnd" is.in.list + or + { + new.sentence +% format.isbn output + } + 'skip$ + if$ + new.sentence + %% commented by SPi as we are using format.eprint %% + %% and also to avoide eprint being printed twice - Start %% + %%eprint empty$ + %% 'skip$ + %% {"\arxivurl{" eprint * "}" * output} + %%if$ + %% End %% + chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + 'skip$ + { new.sentence +%% format.doi output + } + if$ + new.sentence + format.url + v 'list.string := + fin.entry +} + + +FUNCTION {insert.element} +{ #0 bother = + { element "{botherref}" * write$ newline$} + { + type$ "article" = + {element "{barticle}" * write$ newline$} + 'skip$ + if$ + type$ "book" = + type$ "proceedings" = + type$ "manual" = + type$ "booklet" = + or or or + {element "{bbook}" * write$ newline$} + 'skip$ + if$ + + type$ "inbook" = + { "notnumber" last.label = + {element "{bchapter}" * write$ newline$} + {element "{bbook}" * write$ newline$} + if$ + } + 'skip$ + if$ + + type$ "incollection" = + type$ "inproceedings" = + type$ "conference" = + or or + {element "{bchapter}" * write$ newline$} + 'skip$ + if$ + } + if$ +} + +FUNCTION {end.element} +{ "\end" 'element := + item.end + insert.element + "\endbibitem" write$ newline$ +} + +FUNCTION {article.end.element} +{ "\end" 'element := + article.item.end + insert.element + "\endbibitem" write$ newline$ +} + + +FUNCTION {begin.element} +{ "\begin" 'element := + insert.element +} +function {set.options}{ + options empty$ + 'skip$ + {options 'list.string :=} + if$ +} + +FUNCTION {settings} +{} + +FUNCTION {article} +{ output.bibitem + author empty$ + institution empty$ + editor empty$ + and and + journal empty$ + or + year empty$ + or + % above tagging rule means: + % nead: (volume & (pages or number) ) or (doi [without volume, pages and number]) + volume empty$ not + pages empty$ not bnumber empty$ not or + and + + volume empty$ pages empty$ bnumber empty$ and and + doi empty$ not and + or + not + or + {#0 'bother :=} + {#1 'bother :=} + if$ + begin.element + author empty$ + { editor empty$ + 'skip$ + {format.editors stupid.colon} + if$ + } + { format.authors stupid.colon} + if$ + "cnd" is.in.list + { + journal empty$ + {format.title "atitle" make.tag "title" output.check} + {journal "jtitle" make.tag output} + if$ + } + { + format.title "atitle" make.tag "title" output.check + journal empty$ + 'skip$ + {new.sentence journal "jtitle" make.tag output} + if$ + } + if$ + format.art.vol output + pages empty$ + 'skip$ + {insert.comma} + if$ + format.pages output + format.date.parens output + format.doi output + format.eprint output + format.primaryClass output + article.end.element +} + + +FUNCTION {patent} +{ output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + add.period$ + patent.number output + insert.comma + formatpatent.date output + end.element +} + +FUNCTION { other } { patent } + +FUNCTION {book} +{ output.bibitem + author empty$ + institution empty$ + organization empty$ + editor empty$ + and and and + title empty$ + year empty$ + or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + begin.element + author empty$ + { editor empty$ + 'skip$ + {format.editors stupid.colon} + if$ + } + { format.authors stupid.colon} + if$ + format.title "btitle" make.tag "title" output.check + series empty$ + { + format.volume output + insert.comma + format.edition output + } + { edition empty$ + 'skip$ + 'insert.comma + if$ + format.edition output + new.sentence + format.series output + insert.comma + format.volume output + } + if$ + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {booklet} +{output.bibitem + author empty$ + title empty$ + year empty$ + howpublished empty$ + or or or + {#0 'bother :=} + {#1 'bother :=} + if$ + + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "btitle" make.tag "title" output.check + address empty$ publisher empty$ howpublished empty$ and and + 'skip$ + 'new.sentence + if$ + format.pub.address + format.date.parens output + end.element +} + +FUNCTION {misc} +{output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "btitle" make.tag "title" output.check + address empty$ publisher empty$ howpublished empty$ and and + 'skip$ + 'new.sentence + if$ + format.pub.address + end.element +} + +FUNCTION {softmisc} +{output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors} + if$ + stupid.colon + format.title "btitle" make.tag "title" output.check + insert.comma + version output + insert.comma + %%address empty$ publisher empty$ howpublished empty$ and and + %%'skip$ + %% 'new.sentence + %%if$ + format.pub.address + format.softmiscdate output + insert.comma + format.softmisc.eprint output + end.element +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + institution empty$ + organization empty$ + editor empty$ + and and and + title empty$ + year empty$ + or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + + chapter empty$ + { "" 'last.label :=} + { chapter string.to.integer empty$ author empty$ not and + { "notnumber" 'last.label :=} + { "" 'last.label :=} + if$ + } + if$ + + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + "notnumber" last.label = + { chapter "ctitle" make.tag output + add.period$ + } + 'skip$ + if$ + format.in.ed + series empty$ + { + insert.comma + format.volume output + insert.comma + format.edition output + new.sentence + } + { + insert.comma + format.edition output + new.sentence + format.series output + volume empty$ + 'skip$ + 'insert.comma + if$ + format.volume output + } + if$ + publisher.month.pages + publisher empty$ address empty$ edition empty$ series empty$ pages empty$ volume empty$ and and and and and + 'insert.comma + 'skip$ + if$ + format.date.parens output + end.element +} +FUNCTION {incollection} +{ output.bibitem + author empty$ + institution empty$ + and + booktitle empty$ + title empty$ + year empty$ + or or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + + "cnd" is.in.list + { + booktitle empty$ title empty$ not and + { + format.title "ctitle" make.tag "title" output.check + new.sentence + } + 'skip$ + if$ + } + { + format.title "ctitle" make.tag "title" output.check + title empty$ + 'skip$ + {new.sentence} + if$ + } + if$ + format.in.ed.booktitle + series empty$ + { + format.volume output + insert.comma + format.edition output + } + { + edition empty$ + 'skip$ + { insert.comma + format.edition output + } + if$ + new.sentence + format.series output + insert.comma + format.volume output + } + if$ + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {inproceedings} +{ output.bibitem + author empty$ + institution empty$ + and + title empty$ + year empty$ + or or + {#0 'bother :=} + {#1 'bother :=} + if$ + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + + "cnd" is.in.list + { + booktitle empty$ title empty$ not and + { + format.title "ctitle" make.tag "title" output.check + new.sentence + } + 'skip$ + if$ + } + { + format.title "ctitle" make.tag "title" output.check + title empty$ booktitle empty$ not and + 'skip$ + {new.sentence} + if$ + } + if$ + + format.in.ed.booktitle + series empty$ + 'skip$ + {new.sentence format.series output} + if$ + volume empty$ address empty$ publisher empty$ and and + 'skip$ + 'insert.comma + if$ + format.volume output + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ output.bibitem + author empty$ + organization empty$ + title empty$ + year empty$ + address empty$ + or or or or + {#0 'bother :=} + {#1 'bother :=} + if$ + begin.element + + author empty$ + { organization empty$ + 'skip$ + { organization "publisher" make.tag output.nonnull + stupid.colon% add.period$ + } + if$ + } + { format.authors stupid.colon} + if$ + title empty$ + 'skip$ + {format.title "btitle" make.tag output} + if$ + edition empty$ + {new.sentence} + {insert.comma} + if$ + format.edition output + edition empty$ + 'skip$ + {new.sentence} + if$ + author empty$ organization empty$ + or + 'skip$ + { organization "publisher" make.tag output.nonnull + insert.comma + } + if$ + address empty$ + 'skip$ + {address "location" make.tag output} + if$ + format.date.parens output + end.element +} + + +FUNCTION {phdthesis} +{output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + new.sentence + type$ "mastersthesis" = + {"Master's thesis" format.thesis.type output.nonnull} + {"PhD thesis" format.thesis.type output.nonnull} + if$ + school empty$ + 'skip$ + 'insert.comma + if$ + school "school" output.check + address empty$ + 'skip$ + 'insert.comma + if$ + address output + month.year.date output + end.element +} +FUNCTION {mastersthesis}{phdthesis} + + +FUNCTION {proceedings} +{ output.bibitem + author empty$ + institution empty$ + organization empty$ + editor empty$ + and and and + title empty$ + year empty$ + or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + + begin.element + author empty$ + { editor empty$ + {organization "institutionaled" make.tag "organization" output.check } + { format.editors } + if$ + } + { format.authors } + if$ + stupid.colon + format.title "btitle" make.tag output + series empty$ + 'skip$ + {new.sentence format.series output} + if$ + volume empty$ + 'skip$ + 'insert.comma + if$ + format.volume output + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {techreport} +{ output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + new.sentence + format.tr.number output.nonnull + institution empty$ + 'skip$ + 'insert.comma + if$ + institution "institution" output.check + address empty$ + 'skip$ + 'insert.comma + if$ + address output + month.year.date output + end.element +} + +FUNCTION {unpublished} +{ output.bibitem + #0 'bother := + + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + note empty$ + 'skip$ + { note.presented + {note output} + 'skip$ + if$ + } + if$ + end.element +} + +FUNCTION {default.type} { unpublished } + +MACRO {jan} {"January"} +MACRO {feb} {"February"} +MACRO {mar} {"March"} +MACRO {apr} {"April"} +MACRO {may} {"May"} +MACRO {jun} {"June"} +MACRO {jul} {"July"} +MACRO {aug} {"August"} +MACRO {sep} {"September"} +MACRO {oct} {"October"} +MACRO {nov} {"November"} +MACRO {dec} {"December"} + +READ + +EXECUTE {identify.mathphys.version} + +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} + +INTEGERS { et.al.char.used } + +FUNCTION {initialize.et.al.char.used} +{ #0 'et.al.char.used := +} + +%%%%% setting default options +FUNCTION {set.default.opt} +{"unsort" 'list.string :=} +%%{"alpha" 'list.string :=} + +EXECUTE {set.default.opt} + +FUNCTION {assign.opt}{ + % First need to set options + "settings" type$ = + { options empty$ + 'skip$ + {options 'list.string :=} + if$ + } + 'skip$ + if$ +} + +ITERATE {assign.opt} +EXECUTE {initialize.et.al.char.used} + +FUNCTION {alpha.format.lab.names} +{ 's := + s num.names$ 'numnames := + numnames #1 > + { numnames #4 > + { #3 'namesleft := } + { numnames 'namesleft := } + if$ + #1 'nameptr := + "" + { namesleft #0 > } + { nameptr numnames = + { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { "+" * + #1 'et.al.char.used := + } + { s nameptr "{v{}}{l{}}" format.name$ * } + if$ + } + { s nameptr "{v{}}{l{}}" format.name$ * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + numnames #4 > + { "+" * + #1 'et.al.char.used := + } + 'skip$ + if$ + } + { s #1 "{v{}}{l{}}" format.name$ + duplicate$ text.length$ #2 < + { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ } + 'skip$ + if$ + } + if$ +} + +FUNCTION {standard.format.lab.names} +{ 's := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ " et~al." * } + { #2 < + 'skip$ + { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { " et~al." * } + { " and " * s #2 "{vv~}{ll}" format.name$ * } + if$ + } + if$ + } + if$ +} +FUNCTION {format.lab.names}{ + "alpha" is.in.list + 'alpha.format.lab.names + 'standard.format.lab.names + if$ +} + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + { key #3 text.prefix$ } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { "zzz" } + { key #3 text.prefix$ } + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.key.organization.label} +{ author empty$ + { key empty$ + { organization empty$ + { "zzz" } + { "The " #4 organization chop.word #3 text.prefix$ } + if$ + } + { key #3 text.prefix$ } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.organization.label} +{ editor empty$ + { key empty$ + { organization empty$ + { "zzz" } + { "The " #4 organization chop.word #3 text.prefix$ } + if$ + } + { key #3 text.prefix$ } + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.short.authors} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.organization.label + { type$ "manual" = + 'author.key.organization.label + 'author.key.label + if$ + } + if$ + } + if$ + 'short.list := +} + +FUNCTION {calc.label} +{ calc.short.authors + short.list + + "alpha" is.in.list + { + duplicate$ + year field.or.null purify$ #-1 #2 substring$ + * + 'label := + year field.or.null purify$ #-1 #4 substring$ + * + sortify 'sort.label := + } + { + "(" + * + year duplicate$ empty$ + short.list key field.or.null = or + { pop$ "" } + 'skip$ + if$ + * + 'label := + label 'sort.label := + } + if$ +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { nameptr #1 > + { " " * + "alpha" is.in.list + 'skip$ + {numnames int.to.str$ * " " *} + if$ + } + 'skip$ + if$ + s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := + nameptr numnames = + t "others" = + and + { "et al" * } + { t sortify * } + if$ + #3 numnames < + "alpha" is.in.list not + and + {#0 'namesleft := + " zzz " * + } + { + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + if$ + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "zzz" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "z" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "z" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "z" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION {presort} +{ calc.label + sort.label sortify + " " + * + type$ "book" = + type$ "inbook" = + or + {author empty$ + 'editor.organization.sort + 'author.organization.sort + if$ + } + { type$ "proceedings" = + type$ "incollection" = + or + {author empty$ + 'editor.organization.sort + 'author.organization.sort + if$ + } + { type$ "manual" = + 'author.organization.sort + 'author.sort + if$ + } + if$ + } + if$ + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ 'sort.label := + sort.label * + #1 entry.max$ substring$ 'sort.key$ := + + "settings" type$ = + {"aaa"} + {"unsort" is.in.list + {"bb"} + {"alpha" is.in.list + {sort.key$} + {sort.label} + if$ + } + if$ + } + if$ + 'sort.key$ := +} + + +ITERATE {presort} + +SORT + +INTEGERS { longest.label.width last.extra.num number.label } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #0 int.to.chr$ 'last.label := + "" 'j := + #0 'longest.label.width := + #0 'last.extra.num := + #0 'number.label := +} + +FUNCTION {forward.pass} +{ last.label label = + { last.extra.num #1 + 'last.extra.num := + last.extra.num int.to.chr$ 'extra.label := + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + label 'last.label := + } + if$ + number.label #1 + 'number.label := +} + +FUNCTION {reverse.pass} +{ j "b" = + { "a" 'extra.label := } + 'skip$ + if$ + extra.label 'j := + label extra.label * 'label := +} + +EXECUTE {initialize.longest.label} + +ITERATE {forward.pass} + +REVERSE {reverse.pass} + +FUNCTION {write.preambule} +{ "%% BioMed_Central_Bib_Style_v1.01" write$ newline$ newline$ + "\begin{thebibliography}{" number.label int.to.str$ * "}" * write$ newline$ + "% BibTex style file: bmc-mathphys.bst (version 2.1), 2014-07-24" write$ newline$ + "\ifx \bisbn \undefined \def \bisbn #1{ISBN #1}\fi" write$ newline$ + "\ifx \binits \undefined \def \binits#1{#1}\fi" write$ newline$ + "\ifx \bauthor \undefined \def \bauthor#1{#1}\fi" write$ newline$ + "\ifx \batitle \undefined \def \batitle#1{#1}\fi" write$ newline$ + "\ifx \bjtitle \undefined \def \bjtitle#1{#1}\fi" write$ newline$ + "\ifx \bvolume \undefined \def \bvolume#1{\textbf{#1}}\fi" write$ newline$ + "\ifx \byear \undefined \def \byear#1{#1}\fi" write$ newline$ + "\ifx \bissue \undefined \def \bissue#1{#1}\fi" write$ newline$ + "\ifx \bfpage \undefined \def \bfpage#1{#1}\fi" write$ newline$ + "\ifx \blpage \undefined \def \blpage #1{#1}\fi" write$ newline$ + "\ifx \burl \undefined \def \burl#1{\textsf{#1}}\fi" write$ newline$ + %%"\ifx \doiurl \undefined \def \doiurl#1{\textsf{#1}}\fi" write$ newline$ + "\ifx \doiurl \undefined \def \doiurl#1{\url{https://doi.org/#1}}\fi" write$ newline$ + "\ifx \betal \undefined \def \betal{\textit{et al.}}\fi" write$ newline$ + "\ifx \binstitute \undefined \def \binstitute#1{#1}\fi" write$ newline$ + "\ifx \binstitutionaled \undefined \def \binstitutionaled#1{#1}\fi" write$ newline$ + "\ifx \bctitle \undefined \def \bctitle#1{#1}\fi" write$ newline$ + "\ifx \beditor \undefined \def \beditor#1{#1}\fi" write$ newline$ + "\ifx \bpublisher \undefined \def \bpublisher#1{#1}\fi" write$ newline$ + "\ifx \bbtitle \undefined \def \bbtitle#1{#1}\fi" write$ newline$ + "\ifx \bedition \undefined \def \bedition#1{#1}\fi" write$ newline$ + "\ifx \bseriesno \undefined \def \bseriesno#1{#1}\fi" write$ newline$ + "\ifx \blocation \undefined \def \blocation#1{#1}\fi" write$ newline$ + "\ifx \bsertitle \undefined \def \bsertitle#1{#1}\fi" write$ newline$ + "\ifx \bsnm \undefined \def \bsnm#1{#1}\fi" write$ newline$ + "\ifx \bsuffix \undefined \def \bsuffix#1{#1}\fi" write$ newline$ + "\ifx \bparticle \undefined \def \bparticle#1{#1}\fi" write$ newline$ + "\ifx \barticle \undefined \def \barticle#1{#1}\fi" write$ newline$ + "\bibcommenthead" write$ newline$ +} + + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + write.preambule + "\ifx \bconfdate \undefined \def \bconfdate #1{#1}\fi" write$ newline$ + "\ifx \botherref \undefined \def \botherref #1{#1}\fi" write$ newline$ + "\ifx \url \undefined \def \url#1{\textsf{#1}}\fi" write$ newline$ + "\ifx \bchapter \undefined \def \bchapter#1{#1}\fi" write$ newline$ + "\ifx \bbook \undefined \def \bbook#1{#1}\fi" write$ newline$ + "\ifx \bcomment \undefined \def \bcomment#1{#1}\fi" write$ newline$ + "\ifx \oauthor \undefined \def \oauthor#1{#1}\fi" write$ newline$ + "\ifx \citeauthoryear \undefined \def \citeauthoryear#1{#1}\fi" write$ newline$ + "\ifx \endbibitem \undefined \def \endbibitem {}\fi" write$ newline$ + "\ifx \bconflocation \undefined \def \bconflocation#1{#1}\fi" write$ newline$ + "\ifx \arxivurl \undefined \def \arxivurl#1{\textsf{#1}}\fi" write$ newline$ + "\csname PreBibitemsHook\endcsname" write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} + + +%% XML output - done for each entry referenced in the BibTeX database +INTEGERS {i ll li j.int global.counter} +STRINGS {lr lp lt ls } + +FUNCTION {replace} +{ + 'lr := % replace string + 'lp := % pattern + 'lt := % text to search + "" 'ls := % result string + lp text.length$ 'll := % length of the search pattern + { lt empty$ not } + { lt #1 ll substring$ lp = + { ls lr * 'ls := + lt ll #1 + global.max$ substring$ 'lt := } + { ls lt #1 #1 substring$ * 'ls := + lt #2 global.max$ substring$ 'lt := } + if$ + } + while$ + ls +} + +FUNCTION {strip.letters} +{ + "" 's := + duplicate$ missing$ + 'pop$ + { + 't := + { t "" = not } + { % ascii '0' = 48, '9' = 57 + t #1 #1 substring$ chr.to.int$ 'i := + i #47 > i #58 < and + { s t #1 #1 substring$ * 's := } + 'skip$ + if$ + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + s +} +FUNCTION {output.xml} +{ duplicate$ "" = + 'pop$ + { " " swap$ * write$ newline$ } + if$ +} + +%% + % markup.xml + % + % Takes 2 args text & tag {"the text " "tag"} + % Returns 1 string {"the text <\tag>"} +%% +FUNCTION {markup.xml} +{ + "" 'v := % result + 't := % tag + duplicate$ missing$ + 'pop$ + { 'v := } + if$ + v "" = + 'skip$ + { "<" t * ">" * v * "" * 'v := } + if$ + v +} + +%% Takes 2 args - tag, string +FUNCTION{markup.xml.title} +{ pop$ % tag + duplicate$ missing$ + 'pop$ + { + 's := % string + s "\&" "&" replace 's := + s "p" markup.xml 's := + s "title" markup.xml output.xml + } + if$ +} + + +%% + % markup.xml.pages + % + % Takes 1 arg (pages string) + % seperates into and if + % there is a - seperator. else no lpage. + % + % need to remove others +%% +FUNCTION{markup.xml.pages} +{ + "" 'v := % fpage + "" 's := % lpage + duplicate$ missing$ + 'pop$ + { + 't := + t " " "" replace 't := % remove all spaces. pgs must be - seperated + { t empty$ not } + { + t #1 #1 substring$ "-" = + { + t #2 global.max$ substring$ 's := + "" 't := % break while loop + }{ + v t #1 #1 substring$ * 'v := + t #2 global.max$ substring$ 't := + } + if$ + } + while$ + } + if$ + v "fpage" markup.xml output.xml + s "lpage" markup.xml output.xml +} + + +%% + % markup.xml.names + % + % Takes 2 args + % tag, namefield (eg. author "au") + % splits fields into and + % writes info + % returns nothing +%% +FUNCTION {markup.xml.names} +{ + 't := % tag + "" 'v := + "" 's := + duplicate$ empty$ + { pop$ + organization missing$ + { institution "cnm" markup.xml + "au" markup.xml "aug" markup.xml output.xml } + { organization "cnm" markup.xml + "au" markup.xml "aug" markup.xml output.xml } + if$ } + { + " " write$ newline$ + 'temp.str := % names string + temp.str num.names$ 'j.int := % num of names + #1 'i := % init counter + { i #1 j.int + < } % while (i <= j.int) + { + " " write$ + + % Initial first names + % if first name all in capitals + % - assume is initial list of first names. + temp.str i "{ff{ }}" format.name$ + duplicate$ "u" change.case$ = + { temp.str i "{ff{ }}" format.name$ } + { temp.str i "{f{}}" format.name$ } + if$ + + % if last name but no first name use cnm; else snm + duplicate$ "" = + { temp.str i "{ll{ }}" format.name$ % last names space seperated. + "cnm" markup.xml write$ } + { temp.str i "{ll{ }}" format.name$ % last names space seperated. + "snm" markup.xml write$ } + if$ + + "fnm" markup.xml write$ + + "" write$ newline$ + i #1 + 'i := + } + while$ + " " write$ newline$ + } + if$ +} + + +%% + % markup.xml.pub + % + % Takes 4 args (school address publisher tag) + % prints concatenation + % returns nothing +%% +FUNCTION {markup.xml.pub} +{ + 't := % Tag + "" 'v := % Publisher + "" 'l := % Address + "" 'f := % School + "" 's := % Answer + duplicate$ missing$ 'pop$ { 'v := } if$ + duplicate$ missing$ 'pop$ { 'l := } if$ + duplicate$ missing$ 'pop$ { 'f := } if$ + "" f = not % school not empty + { f 's := } % return school as publisher + { % else + "" v = "" l = and % address and pub empty + 'skip$ + { + "" l = + { v 's := } % return pub + { "" v = + { l 's := } % return add + { l ": " * v * 's := } % return add : pub + if$ + } + if$ + } + if$ + } + if$ + s t markup.xml output.xml +} + +%% + % xml.phd + % + % Takes nothing + % Returns type (phd/msc) of empty string +%% +FUNCTION {xml.phd} +{ + "phdthesis" type$ = + "mastersthesis" type$ = or + { "phdthesis" type$ = + { "PhD thesis" } + { "Master's thesis" } + if$ + } + { type } % usually empty + if$ +} + +% markup.xml.edition +% +% edition is a numeric value. ie "2" +% if format 2nd 1st etc.. strip letters. +% +FUNCTION {markup.xml.edition} +{ pop$ pop$ %clear stack + edition strip.letters duplicate$ "" = + { pop$ edition } + 'skip$ + if$ + "edition" markup.xml output.xml +} + + +FUNCTION{begin.bmcxmlcomment}{ + newline$ + "\newcommand{\BMCxmlcomment}[1]{}" write$ newline$ + newline$ + "\BMCxmlcomment{" write$ newline$ + newline$ "" write$ newline$ +} + +FUNCTION{end.bmcxmlcomment}{ + newline$ + "" write$ newline$ + "} % end of \BMCxmlcomment" write$ newline$ +} + +FUNCTION {export.xml}{ + newline$ + global.counter #1 + 'global.counter := + "" * + write$ newline$ +% title "\&" "&" replace "title" markup.xml.title + title "title" markup.xml.title + author "aug" markup.xml.names % org. and inst. here + howpublished missing$ + { booktitle missing$ + { journal missing$ + { xml.phd } % Phd/Msc + {journal} + if$ + } {booktitle} + if$ + } { howpublished } + if$ "source" markup.xml output.xml + school + address + publisher "publisher" markup.xml.pub + editor "editor" markup.xml output.xml + edition "edition" markup.xml.edition + series "p" markup.xml + "title" markup.xml + "series" markup.xml output.xml + chapter "p" markup.xml + "title" markup.xml + "section" markup.xml output.xml + % month % ignore + year "pubdate" markup.xml output.xml + + note missing$ + { volume "volume" markup.xml output.xml + number "issue" markup.xml output.xml + pages markup.xml.pages + url "url" markup.xml output.xml } + { note "l" change.case$ "in press" = + { " " write$ newline$ } + { volume "volume" markup.xml output.xml + number "issue" markup.xml output.xml + pages markup.xml.pages + url "url" markup.xml output.xml + note "note" markup.xml output.xml + } + if$ + } + if$ + "" write$ newline$ +} + +%%EXECUTE {begin.bmcxmlcomment} +%%ITERATE {export.xml} +%%EXECUTE {end.bmcxmlcomment} + +%% End of file `sn-mathphys-num.bst'. + + + + diff --git a/waypoint_control/sn-article-template/bst/sn-nature.bst b/waypoint_control/sn-article-template/bst/sn-nature.bst new file mode 100644 index 0000000..9ee7503 --- /dev/null +++ b/waypoint_control/sn-article-template/bst/sn-nature.bst @@ -0,0 +1,1724 @@ +%% +%% This is file `sn-nature.bst', +%% generated with the docstrip utility. +%% +%% The original source files were: merlin.mbs +%% ------------------------------------------ + % This bibliographic style (bst) file has been generated from one or + % more master bibliographic style (mbs) files, listed above. + % + % This file can be redistributed and/or modified under the terms + % of the LaTeX Project Public License Distributed from CTAN + % archives in directory macros/latex/base/lppl.txt; either + % version 1 of the License, or any later version. + % This bibliography style file is intended for texts in ENGLISH + % This is a numerical citation style, and as such is standard LaTeX. + % It requires no extra package to interface to the main text. + % The form of the \bibitem entries is + % \bibitem{key}... + % Usage of \cite is as follows: + % \cite{key} ==>> [#] + % \cite[chap. 2]{key} ==>> [#, chap. 2] + % where # is a number determined by the ordering in the reference list. + % The order in the reference list is that by which the works were originally + % cited in the text, or that in the database. + %--------------------------------------------------------------------- + +FUNCTION {identify.nature.version} +{ % Put identifying string in the .blg file + "sn-nature.bst" + " [2024/07/19 v1.1 bibliography style]" + * top$ +} + +ENTRY + { address + archive + author + booktitle + chapter + edition + editor + eprint + howpublished + institution + journal + key + keywords + month + note + number + organization + pages + publisher + school + series + title + type + url + doi + volume + year + archivePrefix + primaryClass + eid + adsurl + adsnote + version + } + {} + { label } +INTEGERS { output.state before.all mid.sentence after.sentence after.block } +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} +STRINGS { s t} +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output.in.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +FUNCTION {in.output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.in.nonnull + if$ +} +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + +FUNCTION {date.block} +{ + new.block +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\emph{" swap$ * "}" * } + if$ +} +FUNCTION {bolden} +{ duplicate$ empty$ + { pop$ "" } + { "\textbf{" swap$ * "}" * } + if$ +} +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {capitalize} +{ "u" change.case$ "t" change.case$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + % Here are the language-specific definitions for explicit words. + % Each function has a name bbl.xxx where xxx is the English word. + % The language selected here is ENGLISH +FUNCTION {bbl.and} +{ "and"} + +FUNCTION {bbl.etal} +{ "et~al." } + +FUNCTION {bbl.in.editors} +{ "eds " } + +FUNCTION {bbl.editors} +{ "eds" } + +FUNCTION {bbl.editor} +{ "ed." } + +FUNCTION {bbl.edby} +{ "edited by" } + +FUNCTION {bbl.edition} +{ "edn" } + +FUNCTION {bbl.volume} +{ "Vol." } + +FUNCTION {bbl.of} +{ "of" } + +FUNCTION {bbl.number} +{ "no." } + +FUNCTION {bbl.nr} +{ "no." } + +FUNCTION {bbl.in} +{ "in" } + +FUNCTION {bbl.pages} +{ "" } + +FUNCTION {bbl.page} +{ "" } + +FUNCTION {bbl.chapter} +{ "Ch." } + +FUNCTION {bbl.techrep} +{ "Tech. Rep." } + +FUNCTION {bbl.mthesis} +{ "Master's thesis" } + +FUNCTION {bbl.phdthesis} +{ "Ph.D. thesis" } + +MACRO {jan} {"Jan."} + +MACRO {feb} {"Feb."} + +MACRO {mar} {"Mar."} + +MACRO {apr} {"Apr."} + +MACRO {may} {"May"} + +MACRO {jun} {"Jun."} + +MACRO {jul} {"Jul."} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sep."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + + %------------------------------------------------------------------- + % Begin module: + % \ProvidesFile{physjour.mbs}[2002/01/14 2.2 (PWD)] +MACRO {aa}{"Astron. \& Astrophys."} +MACRO {aasup}{"Astron. \& Astrophys. Suppl. Ser."} +MACRO {aj} {"Astron. J."} +MACRO {aph} {"Acta Phys."} +MACRO {advp} {"Adv. Phys."} +MACRO {ajp} {"Amer. J. Phys."} +MACRO {ajm} {"Amer. J. Math."} +MACRO {amsci} {"Amer. Sci."} +MACRO {anofd} {"Ann. Fluid Dyn."} +MACRO {am} {"Ann. Math."} +MACRO {ap} {"Ann. Phys. (NY)"} +MACRO {adp} {"Ann. Phys. (Leipzig)"} +MACRO {ao} {"Appl. Opt."} +MACRO {apl} {"Appl. Phys. Lett."} +MACRO {app} {"Astroparticle Phys."} +MACRO {apj} {"Astrophys. J."} +MACRO {apjsup} {"Astrophys. J. Suppl."} +MACRO {apss} {"Astrophys. Space Sci."} +MACRO {araa} {"Ann. Rev. Astron. Astrophys."} +MACRO {baas} {"Bull. Amer. Astron. Soc."} +MACRO {baps} {"Bull. Amer. Phys. Soc."} +MACRO {cmp} {"Comm. Math. Phys."} +MACRO {cpam} {"Commun. Pure Appl. Math."} +MACRO {cppcf} {"Comm. Plasma Phys. \& Controlled Fusion"} +MACRO {cpc} {"Comp. Phys. Comm."} +MACRO {cqg} {"Class. Quant. Grav."} +MACRO {cra} {"C. R. Acad. Sci. A"} +MACRO {fed} {"Fusion Eng. \& Design"} +MACRO {ft} {"Fusion Tech."} +MACRO {grg} {"Gen. Relativ. Gravit."} +MACRO {ieeens} {"IEEE Trans. Nucl. Sci."} +MACRO {ieeeps} {"IEEE Trans. Plasma Sci."} +MACRO {ijimw} {"Interntl. J. Infrared \& Millimeter Waves"} +MACRO {ip} {"Infrared Phys."} +MACRO {irp} {"Infrared Phys."} +MACRO {jap} {"J. Appl. Phys."} +MACRO {jasa} {"J. Acoust. Soc. America"} +MACRO {jcp} {"J. Comp. Phys."} +MACRO {jetp} {"Sov. Phys.--JETP"} +MACRO {jfe} {"J. Fusion Energy"} +MACRO {jfm} {"J. Fluid Mech."} +MACRO {jmp} {"J. Math. Phys."} +MACRO {jne} {"J. Nucl. Energy"} +MACRO {jnec} {"J. Nucl. Energy, C: Plasma Phys., Accelerators, Thermonucl. Res."} +MACRO {jnm} {"J. Nucl. Mat."} +MACRO {jpc} {"J. Phys. Chem."} +MACRO {jpp} {"J. Plasma Phys."} +MACRO {jpsj} {"J. Phys. Soc. Japan"} +MACRO {jsi} {"J. Sci. Instrum."} +MACRO {jvst} {"J. Vac. Sci. \& Tech."} +MACRO {nat} {"Nature"} +MACRO {nature} {"Nature"} +MACRO {nedf} {"Nucl. Eng. \& Design/Fusion"} +MACRO {nf} {"Nucl. Fusion"} +MACRO {nim} {"Nucl. Inst. \& Meth."} +MACRO {nimpr} {"Nucl. Inst. \& Meth. in Phys. Res."} +MACRO {np} {"Nucl. Phys."} +MACRO {npb} {"Nucl. Phys. B"} +MACRO {nt/f} {"Nucl. Tech./Fusion"} +MACRO {npbpc} {"Nucl. Phys. B (Proc. Suppl.)"} +MACRO {inc} {"Nuovo Cimento"} +MACRO {nc} {"Nuovo Cimento"} +MACRO {pf} {"Phys. Fluids"} +MACRO {pfa} {"Phys. Fluids A: Fluid Dyn."} +MACRO {pfb} {"Phys. Fluids B: Plasma Phys."} +MACRO {pl} {"Phys. Lett."} +MACRO {pla} {"Phys. Lett. A"} +MACRO {plb} {"Phys. Lett. B"} +MACRO {prep} {"Phys. Rep."} +MACRO {pnas} {"Proc. Nat. Acad. Sci. USA"} +MACRO {pp} {"Phys. Plasmas"} +MACRO {ppcf} {"Plasma Phys. \& Controlled Fusion"} +MACRO {phitrsl} {"Philos. Trans. Roy. Soc. London"} +MACRO {prl} {"Phys. Rev. Lett."} +MACRO {pr} {"Phys. Rev."} +MACRO {physrev} {"Phys. Rev."} +MACRO {pra} {"Phys. Rev. A"} +MACRO {prb} {"Phys. Rev. B"} +MACRO {prc} {"Phys. Rev. C"} +MACRO {prd} {"Phys. Rev. D"} +MACRO {pre} {"Phys. Rev. E"} +MACRO {ps} {"Phys. Scripta"} +MACRO {procrsl} {"Proc. Roy. Soc. London"} +MACRO {rmp} {"Rev. Mod. Phys."} +MACRO {rsi} {"Rev. Sci. Inst."} +MACRO {science} {"Science"} +MACRO {sciam} {"Sci. Am."} +MACRO {sam} {"Stud. Appl. Math."} +MACRO {sjpp} {"Sov. J. Plasma Phys."} +MACRO {spd} {"Sov. Phys.--Doklady"} +MACRO {sptp} {"Sov. Phys.--Tech. Phys."} +MACRO {spu} {"Sov. Phys.--Uspeki"} +MACRO {st} {"Sky and Telesc."} + % End module: physjour.mbs + %------------------------------------------------------------------- + % Begin module: + % \ProvidesFile{geojour.mbs}[2002/07/10 2.0h (PWD)] +MACRO {aisr} {"Adv. Space Res."} +MACRO {ag} {"Ann. Geophys."} +MACRO {anigeo} {"Ann. Geofis."} +MACRO {angl} {"Ann. Glaciol."} +MACRO {andmet} {"Ann. d. Meteor."} +MACRO {andgeo} {"Ann. d. Geophys."} +MACRO {andphy} {"Ann. Phys.-Paris"} +MACRO {afmgb} {"Arch. Meteor. Geophys. Bioklimatol."} +MACRO {atph} {"Atm\'osphera"} +MACRO {aao} {"Atmos. Ocean"} +MACRO {ass}{"Astrophys. Space Sci."} +MACRO {atenv} {"Atmos. Environ."} +MACRO {aujag} {"Aust. J. Agr. Res."} +MACRO {aumet} {"Aust. Meteorol. Mag."} +MACRO {blmet} {"Bound.-Lay. Meteorol."} +MACRO {bams} {"Bull. Amer. Meteorol. Soc."} +MACRO {cch} {"Clim. Change"} +MACRO {cdyn} {"Clim. Dynam."} +MACRO {cbul} {"Climatol. Bull."} +MACRO {cap} {"Contrib. Atmos. Phys."} +MACRO {dsr} {"Deep-Sea Res."} +MACRO {dhz} {"Dtsch. Hydrogr. Z."} +MACRO {dao} {"Dynam. Atmos. Oceans"} +MACRO {eco} {"Ecology"} +MACRO {empl}{"Earth, Moon and Planets"} +MACRO {envres} {"Environ. Res."} +MACRO {envst} {"Environ. Sci. Technol."} +MACRO {ecms} {"Estuarine Coastal Mar. Sci."} +MACRO {expa}{"Exper. Astron."} +MACRO {geoint} {"Geofis. Int."} +MACRO {geopub} {"Geofys. Publ."} +MACRO {geogeo} {"Geol. Geofiz."} +MACRO {gafd} {"Geophys. Astrophys. Fluid Dyn."} +MACRO {gfd} {"Geophys. Fluid Dyn."} +MACRO {geomag} {"Geophys. Mag."} +MACRO {georl} {"Geophys. Res. Lett."} +MACRO {grl} {"Geophys. Res. Lett."} +MACRO {ga} {"Geophysica"} +MACRO {gs} {"Geophysics"} +MACRO {ieeetap} {"IEEE Trans. Antenn. Propag."} +MACRO {ijawp} {"Int. J. Air Water Pollut."} +MACRO {ijc} {"Int. J. Climatol."} +MACRO {ijrs} {"Int. J. Remote Sens."} +MACRO {jam} {"J. Appl. Meteorol."} +MACRO {jaot} {"J. Atmos. Ocean. Technol."} +MACRO {jatp} {"J. Atmos. Terr. Phys."} +MACRO {jastp} {"J. Atmos. Solar-Terr. Phys."} +MACRO {jce} {"J. Climate"} +MACRO {jcam} {"J. Climate Appl. Meteor."} +MACRO {jcm} {"J. Climate Meteor."} +MACRO {jcy} {"J. Climatol."} +MACRO {jgr} {"J. Geophys. Res."} +MACRO {jga} {"J. Glaciol."} +MACRO {jh} {"J. Hydrol."} +MACRO {jmr} {"J. Mar. Res."} +MACRO {jmrj} {"J. Meteor. Res. Japan"} +MACRO {jm} {"J. Meteor."} +MACRO {jpo} {"J. Phys. Oceanogr."} +MACRO {jra} {"J. Rech. Atmos."} +MACRO {jaes} {"J. Aeronaut. Sci."} +MACRO {japca} {"J. Air Pollut. Control Assoc."} +MACRO {jas} {"J. Atmos. Sci."} +MACRO {jmts} {"J. Mar. Technol. Soc."} +MACRO {jmsj} {"J. Meteorol. Soc. Japan"} +MACRO {josj} {"J. Oceanogr. Soc. Japan"} +MACRO {jwm} {"J. Wea. Mod."} +MACRO {lao} {"Limnol. Oceanogr."} +MACRO {mwl} {"Mar. Wea. Log"} +MACRO {mau} {"Mausam"} +MACRO {meteor} {"``Meteor'' Forschungsergeb."} +MACRO {map} {"Meteorol. Atmos. Phys."} +MACRO {metmag} {"Meteor. Mag."} +MACRO {metmon} {"Meteor. Monogr."} +MACRO {metrun} {"Meteor. Rundsch."} +MACRO {metzeit} {"Meteor. Z."} +MACRO {metgid} {"Meteor. Gidrol."} +MACRO {mwr} {"Mon. Weather Rev."} +MACRO {nwd} {"Natl. Weather Dig."} +MACRO {nzjmfr} {"New Zeal. J. Mar. Freshwater Res."} +MACRO {npg} {"Nonlin. Proc. Geophys."} +MACRO {om} {"Oceanogr. Meteorol."} +MACRO {ocac} {"Oceanol. Acta"} +MACRO {oceanus} {"Oceanus"} +MACRO {paleoc} {"Paleoceanography"} +MACRO {pce} {"Phys. Chem. Earth"} +MACRO {pmg} {"Pap. Meteor. Geophys."} +MACRO {ppom} {"Pap. Phys. Oceanogr. Meteor."} +MACRO {physzeit} {"Phys. Z."} +MACRO {pps} {"Planet. Space Sci."} +MACRO {pss} {"Planet. Space Sci."} +MACRO {pag} {"Pure Appl. Geophys."} +MACRO {qjrms} {"Quart. J. Roy. Meteorol. Soc."} +MACRO {quatres} {"Quat. Res."} +MACRO {rsci} {"Radio Sci."} +MACRO {rse} {"Remote Sens. Environ."} +MACRO {rgeo} {"Rev. Geophys."} +MACRO {rgsp} {"Rev. Geophys. Space Phys."} +MACRO {rdgeo} {"Rev. Geofis."} +MACRO {revmeta} {"Rev. Meteorol."} +MACRO {sgp}{"Surveys in Geophys."} +MACRO {sp} {"Solar Phys."} +MACRO {ssr} {"Space Sci. Rev."} +MACRO {tellus} {"Tellus"} +MACRO {tac} {"Theor. Appl. Climatol."} +MACRO {tagu} {"Trans. Am. Geophys. Union (EOS)"} +MACRO {wrr} {"Water Resour. Res."} +MACRO {weather} {"Weather"} +MACRO {wafc} {"Weather Forecast."} +MACRO {ww} {"Weatherwise"} +MACRO {wmob} {"WMO Bull."} +MACRO {zeitmet} {"Z. Meteorol."} + % End module: geojour.mbs + %------------------------------------------------------------------- + % Begin module: + % \ProvidesFile{photjour.mbs}[1999/02/24 2.0b (PWD)] + +MACRO {appopt} {"Appl. Opt."} +MACRO {bell} {"Bell Syst. Tech. J."} +MACRO {ell} {"Electron. Lett."} +MACRO {jasp} {"J. Appl. Spectr."} +MACRO {jqe} {"IEEE J. Quantum Electron."} +MACRO {jlwt} {"J. Lightwave Technol."} +MACRO {jmo} {"J. Mod. Opt."} +MACRO {josa} {"J. Opt. Soc. America"} +MACRO {josaa} {"J. Opt. Soc. Amer.~A"} +MACRO {josab} {"J. Opt. Soc. Amer.~B"} +MACRO {jdp} {"J. Phys. (Paris)"} +MACRO {oc} {"Opt. Commun."} +MACRO {ol} {"Opt. Lett."} +MACRO {phtl} {"IEEE Photon. Technol. Lett."} +MACRO {pspie} {"Proc. Soc. Photo-Opt. Instrum. Eng."} +MACRO {sse} {"Solid-State Electron."} +MACRO {sjot} {"Sov. J. Opt. Technol."} +MACRO {sjqe} {"Sov. J. Quantum Electron."} +MACRO {sleb} {"Sov. Phys.--Leb. Inst. Rep."} +MACRO {stph} {"Sov. Phys.--Techn. Phys."} +MACRO {stphl} {"Sov. Techn. Phys. Lett."} +MACRO {vr} {"Vision Res."} +MACRO {zph} {"Z. f. Physik"} +MACRO {zphb} {"Z. f. Physik~B"} +MACRO {zphd} {"Z. f. Physik~D"} + +MACRO {CLEO} {"CLEO"} +MACRO {ASSL} {"Adv. Sol.-State Lasers"} +MACRO {OSA} {"OSA"} + % End module: photjour.mbs +%% Copyright 1994-2002 Patrick W Daly +MACRO {acmcs} {"ACM Comput. Surv."} + +MACRO {acta} {"Acta Inf."} + +MACRO {cacm} {"Commun. ACM"} + +MACRO {ibmjrd} {"IBM J. Res. Dev."} + +MACRO {ibmsj} {"IBM Syst.~J."} + +MACRO {ieeese} {"IEEE Trans. Software Eng."} + +MACRO {ieeetc} {"IEEE Trans. Comput."} + +MACRO {ieeetcad} + {"IEEE Trans. Comput. Aid. Des."} + +MACRO {ipl} {"Inf. Process. Lett."} + +MACRO {jacm} {"J.~ACM"} + +MACRO {jcss} {"J.~Comput. Syst. Sci."} + +MACRO {scp} {"Sci. Comput. Program."} + +MACRO {sicomp} {"SIAM J. Comput."} + +MACRO {tocs} {"ACM Trans. Comput. Syst."} + +MACRO {tods} {"ACM Trans. Database Syst."} + +MACRO {tog} {"ACM Trans. Graphic."} + +MACRO {toms} {"ACM Trans. Math. Software"} + +MACRO {toois} {"ACM Trans. Office Inf. Syst."} + +MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} + +MACRO {tcs} {"Theor. Comput. Sci."} + +FUNCTION {bibinfo.check} +{ swap$ + duplicate$ missing$ + { + pop$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ pop$ + } + { swap$ + "\bibinfo{" swap$ * "}{" * swap$ * "}" * + } + if$ + } + if$ +} +FUNCTION {bibinfo.warn} +{ swap$ + duplicate$ missing$ + { + swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ "empty " swap$ * " in " * cite$ * warning$ + } + { swap$ + "\bibinfo{" swap$ * "}{" * swap$ * "}" * + } + if$ + } + if$ +} + + +%%Commented on 17th July 2024 +%FUNCTION {format.eprint} +%{ eprint duplicate$ empty$ +% 'skip$ +% { "\eprint" +% archive empty$ +% 'skip$ +% { "[" * archive * "]" * } +% if$ +% "{" * swap$ * "}" * +% } +% if$ +%} + +FUNCTION {format.url} +{ url empty$ + { "" } + { "\urlprefix\url{" url * "}" * } + if$ +} + +FUNCTION {format.doi} +{ doi empty$ + { "" } + { "\doi{" doi * "}" * } + if$ +} + +STRINGS { bibinfo} +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}{, f.}{, jj}" + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + nameptr #1 + #1 + = + numnames #5 + > and + { "others" 't := + #1 'namesleft := } + 'skip$ + if$ + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal emphasize * + } + { + "\&" + space.word * t * + } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} +FUNCTION {format.names.ed} +{ + format.names +} +FUNCTION {format.authors} +{ author "author" format.names +} +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {get.in.bbl.editor} +{ } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { + " " * + get.bbl.editor + "(" swap$ * ")" * + * + } + if$ +} + +FUNCTION {format.in.editors} +{ "" editor "editor" format.names duplicate$ empty$ 'skip$ + { swap$ "(eds" * + " " * swap$ * + swap$ " " * + swap$ * ")" * + } + if$ +} + +FUNCTION {format.note} +{ + note empty$ + { "" } + { note #1 #1 substring$ + duplicate$ "{" = + 'skip$ + { output.state mid.sentence = + { "l" } + { "u" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + } + if$ +} + + + +FUNCTION {format.in.title} +{ title + duplicate$ empty$ 'skip$ + { "t" change.case$ } + if$ + " in \textit{" swap$ * "}" * "title" bibinfo.check +} + +FUNCTION {format.title} +{ title + duplicate$ empty$ 'skip$ + { "t" change.case$ } + if$ + "title" bibinfo.check +} + +FUNCTION {format.inpro.title} +{ title + duplicate$ empty$ 'skip$ + { "t" change.case$ } + if$ + "title" bibinfo.check + emphasize} + +FUNCTION {format.version} +{ version + duplicate$ empty$ 'skip$ + { "t" change.case$ } + if$ + "version" bibinfo.check +} + +%FUNCTION {format.inpro.title} +%{ title +% duplicate$ empty$ 'skip$ +% { "t" change.case$ } +% if$ +% "title" bibinfo.check +% emphasize} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {n.dashify} +{ + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.in capitalize + " " * } + +FUNCTION {format.date} +{ + "" + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { swap$ 'skip$ + { + swap$ + " " * swap$ + } + if$ + * + } + if$ + duplicate$ empty$ + 'skip$ + { + before.all 'output.state := + " (" swap$ * ")" * + } + if$ +} +FUNCTION {format.btitle} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + emphasize + } + if$ +} +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { bbl.volume volume tie.or.space.prefix + "volume" bibinfo.check * * + series "series" bibinfo.check + duplicate$ empty$ 'pop$ + { swap$ bbl.of space.word * swap$ + emphasize * } + if$ + "volume and number" number either.or.check + } + if$ +} +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { series empty$ + { number "number" bibinfo.check } + { output.state mid.sentence = + { bbl.number } + { bbl.number capitalize } + if$ + number tie.or.space.prefix "number" bibinfo.check * * + bbl.in space.word * + series "series" bibinfo.check * + } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { + output.state mid.sentence = + { "l" } + { "t" } + if$ change.case$ + "edition" bibinfo.check + " " * bbl.edition * + } + if$ +} +INTEGERS { multiresult } +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { duplicate$ multi.page.check + { + n.dashify + } + { + } + if$ + "pages" bibinfo.check + } + if$ +} +FUNCTION {format.journal.pages} +{ pages duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ + { pop$ pop$ format.pages } + { + ", " * + swap$ + n.dashify + "pages" bibinfo.check + * + } + if$ + } + if$ +} +FUNCTION {format.number} + {number empty$ + 'skip$ + { "~(" number * ")" * * } + if$ + } +FUNCTION {format.vol.num.pages} +{ volume field.or.null + duplicate$ empty$ 'skip$ + { + "volume" bibinfo.check + } + if$ + bolden +% format.number + format.journal.pages +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ +} + +FUNCTION {format.booktitle} +{ + booktitle "booktitle" bibinfo.check + emphasize +} +FUNCTION {format.in.ed.booktitle} +{ duplicate$ empty$ 'skip$ + { +editor "editor" format.names.ed duplicate$ empty$ 'pop$ + { +format.booktitle swap$ +"(" editor num.names$ #1 > 'bbl.in.editors 'bbl.editor if$ * swap$ ") " * + * swap$ + * } + if$ + } + if$ +} +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} +FUNCTION {format.thesis.type} +{ type duplicate$ empty$ + 'pop$ + { swap$ pop$ + "t" change.case$ "type" bibinfo.check + } + if$ +} +FUNCTION {format.tr.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ bbl.techrep } + 'skip$ + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ "t" change.case$ } + { tie.or.space.prefix * * } + if$ +} +FUNCTION {format.article.crossref} +{ + key duplicate$ empty$ + { pop$ + journal duplicate$ empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * warning$ } + { "journal" bibinfo.check emphasize word.in swap$ * } + if$ + } + { word.in swap$ * " " *} + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.crossref.editor} +{ editor #1 "{vv~}{ll}" format.name$ + "editor" bibinfo.check + editor num.names$ duplicate$ + #2 > + { pop$ + "editor" bibinfo.check + " " * bbl.etal + emphasize + * + } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { + "editor" bibinfo.check + " " * bbl.etal + emphasize + * + } + { + " \& " + * editor #2 "{vv~}{ll}" format.name$ + "editor" bibinfo.check + * + } + if$ + } + if$ + } + if$ +} +FUNCTION {format.book.crossref} +{ volume duplicate$ empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + pop$ word.in + } + { bbl.volume + capitalize + swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * + } + if$ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" * + } + { series emphasize * } + if$ + } + { key * } + if$ + } + { format.crossref.editor * } + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.incoll.inproc.crossref} +{ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { format.booktitle duplicate$ empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + } + { word.in swap$ * } + if$ + } + { word.in key * " " *} + if$ + } + { word.in format.crossref.editor * " " *} + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.org.or.pub} +{ 't := + "" + year empty$ + { "empty year in " cite$ * warning$ } + 'skip$ + if$ + address empty$ t empty$ and + year empty$ and + 'skip$ + { + add.blank "(" * + t empty$ + { address "address" bibinfo.check * + } + { t * + address empty$ + 'skip$ + { ", " * address "address" bibinfo.check * } + if$ + } + if$ + year empty$ + 'skip$ + { t empty$ address empty$ and + 'skip$ + { ", " * } + if$ + year "year" bibinfo.check + * + } + if$ + ")" * + } + if$ +} +FUNCTION {format.publisher.address} +{ publisher "publisher" bibinfo.warn format.org.or.pub +} + +FUNCTION {format.organization.address} +{ organization "organization" bibinfo.check format.org.or.pub +} + +FUNCTION {format.archive} +{ + archivePrefix empty$ + { "" } + { archivePrefix ":" *} + if$ +} + +%%updated on 17th July 2024 +FUNCTION {format.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ + "eprint" bibinfo.check +} + +FUNCTION {format.primaryClass} +{ + primaryClass empty$ + { "" } + { " {[" primaryClass * "]}" *} + if$ +} + +FUNCTION {format.soft.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ + "eprint" bibinfo.check +} + + + +FUNCTION {format.softmisc.archive} +{ + archivePrefix empty$ + { "" } + { "" } + if$ +} + +FUNCTION {format.softmisc.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + crossref missing$ + { + journal + "journal" bibinfo.check + emphasize + "journal" output.check + add.blank + format.vol.num.pages output + format.date "year" output.check + } + { format.article.crossref output.nonnull + format.pages output + } + if$ + new.block + format.url output + new.block + %% format.doi output + format.note output + %%format.eprint output + %% format.soft.eprint output + %% add.blank + %% format.primaryClass output + fin.entry +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + add.blank + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + new.block + format.btitle "title" output.check + add.blank + format.edition output + crossref missing$ + { format.bvolume output + new.block + format.number.series output + new.sentence + format.publisher.address output + } + { + new.block + format.book.crossref output.nonnull + format.date "year" output.check + } + if$ + new.block + format.url output + new.block + format.note output + format.eprint output + fin.entry +} +FUNCTION {booklet} +{ output.bibitem + format.authors output + new.block + format.title "title" output.check + new.block + howpublished "howpublished" bibinfo.check output + address "address" bibinfo.check output + format.date output + new.block + format.url output + new.block + format.note output + format.eprint output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + new.block + format.btitle "title" output.check + crossref missing$ + { + format.bvolume output + format.chapter.pages "chapter and pages" output.check + new.block + format.number.series output + new.sentence + format.publisher.address output + } + { + format.chapter.pages "chapter and pages" output.check + new.block + format.book.crossref output.nonnull + format.date "year" output.check + } + if$ + format.edition output + new.block + format.url output + new.block + format.note output + format.eprint output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + new.block + format.in.title "title" output.check + add.blank + format.edition output +% new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.bvolume output + add.blank + format.number.series output + format.chapter.pages output + new.sentence + format.publisher.address output + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ + new.block + format.url output + new.block + format.note output + format.eprint output + fin.entry +} +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + new.block + format.editors output +add.blank + format.inpro.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.bvolume output + format.number.series output + format.pages output + new.sentence + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + } + { format.incoll.inproc.crossref output.nonnull + format.pages output + } + if$ + new.block + format.url output + new.block + format.note output + format.eprint output + fin.entry +} +FUNCTION {conference} { inproceedings } +FUNCTION {manual} +{ output.bibitem + author empty$ + { organization "organization" bibinfo.check + duplicate$ empty$ 'pop$ + { output + address "address" bibinfo.check output + } + if$ + } + { format.authors output.nonnull } + if$ + new.block + format.btitle "title" output.check + author empty$ + { organization empty$ + { + address new.block.checka + address "address" bibinfo.check output + } + 'skip$ + if$ + } + { + organization address new.block.checkb + organization "organization" bibinfo.check output + address "address" bibinfo.check output + } + if$ + format.edition output + format.date output + new.block + format.url output + new.block + format.note output + format.eprint output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + new.block + format.btitle + "title" output.check + new.block + bbl.mthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check + new.block + format.url output + new.block + format.note output + format.eprint output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + title howpublished new.block.checkb + format.title output + howpublished new.block.checka + howpublished "howpublished" bibinfo.check output + format.date output + new.block + format.url output + new.block + format.note output + format.eprint output + fin.entry + empty.misc.check +} + +FUNCTION {softmisc} +{ output.bibitem + format.authors output + title howpublished new.block.checkb + format.title output + format.version output + howpublished new.block.checka + howpublished "howpublished" bibinfo.check output + format.date output + new.block + format.url output + new.block + format.note output + %%format.eprint output + format.softmisc.eprint output + fin.entry + empty.misc.check +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + new.block + format.btitle + "title" output.check + new.block + bbl.phdthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check + new.block + format.url output + new.block + format.note output + format.eprint output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization "organization" bibinfo.check output + } + { format.editors output.nonnull } + if$ + new.block + format.btitle "title" output.check + format.bvolume output + format.number.series output + editor empty$ + { publisher empty$ + 'skip$ + { + new.sentence + format.publisher.address output + } + if$ + } + { publisher empty$ + { + new.sentence + format.organization.address output } + { + new.sentence + organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + } + if$ + new.block + format.url output + new.block + format.note output + format.eprint output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + new.block + format.title + "title" output.check + new.block + format.tr.number output.nonnull + institution "institution" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check + new.block + format.url output + new.block + format.note output + format.eprint output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + format.date output + new.block + format.url output + new.block + format.note "note" output.check + format.eprint output + fin.entry +} + +FUNCTION {default.type} { misc } +READ +EXECUTE {identify.nature.version} + +STRINGS { longest.label } +INTEGERS { number.label longest.label.width } +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\expandafter\ifx\csname url\endcsname\relax" + write$ newline$ + %%" \def\url#1{\texttt{#1}}\fi" + " \def\url#1{\burl{#1}}\fi" + write$ newline$ + "\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi" + write$ newline$ + "\providecommand{\bibinfo}[2]{#2}" + write$ newline$ + "\providecommand{\eprint}[2][]{\url{#2}}" + write$ newline$ + "\providecommand{\doi}[1]{\url{https://doi.org/#1}}" + write$ newline$ + "\bibcommenthead" write$ newline$ +} +EXECUTE {begin.bib} +EXECUTE {init.state.consts} +ITERATE {call.type$} +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} +EXECUTE {end.bib} +%% End of customized bst file +%% +%% End of file `sn-nature.bst'. \ No newline at end of file diff --git a/waypoint_control/sn-article-template/bst/sn-vancouver-ay.bst b/waypoint_control/sn-article-template/bst/sn-vancouver-ay.bst new file mode 100644 index 0000000..df1ac27 --- /dev/null +++ b/waypoint_control/sn-article-template/bst/sn-vancouver-ay.bst @@ -0,0 +1,2085 @@ +%% +%% This is file `sn-vancouve-ay.bst', +%% generated with the docstrip utility. +%% +%% The original source files were: vancouver.bst +%% natbib-compatible BibTeX bibliography style `vancouver-authoryear' +%% +%% Per default the reference list entries are alphabetized. %% +%%**************************************************************************************%% + % This file can be redistributed and/or modified under the terms + % of the LaTeX Project Public License Distributed from CTAN + % archives in directory macros/latex/base/lppl.txt; either + % version 1 of the License, or any later version. + + % In natbib.sty, it is possible to define the type of enclosures that is + % really wanted (brackets or parentheses), but in either case, there must + % be parentheses in the label. + % The \cite command functions as follows: + % \citet{key} ==>> Jones et al. (1990) + % \citet*{key} ==>> Jones, Baker, and Smith (1990) + % \citep{key} ==>> (Jones et al. 1990) + % \citep*{key} ==>> (Jones, Baker, and Smith 1990) + % \citep[chap. 2]{key} ==>> (Jones et al. 1990, chap. 2) + % \citep[e.g.][]{key} ==>> (e.g. Jones et al. 1990) + % \citep[e.g.][p. 32]{key} ==>> (e.g. Jones et al., p. 32) + % \citeauthor{key} ==>> Jones et al. + % \citeauthor*{key} ==>> Jones, Baker, and Smith + % \citeyear{key} ==>> 1990 + %--------------------------------------------------------------------- + +FUNCTION {identify.vancouver.version} +{ % Put identifying string in the .blg file + "sn-vancouver-ay.bst" + " [2024/07/19 v1.1 bibliography style]" + * top$ +} + +ENTRY + { address + assignee % for patents + author + booktitle % for articles in books + chapter % for incollection, esp. internet documents + cartographer % for maps + day + edition + editor + eid + howpublished + institution % for technical reports + inventor % for patents + journal + key + month + note + number + organization + pages + version + part + publisher + school + series + title + type + url + volume + word + year + eprint % urlbst + doi % urlbst + lastchecked % urlbst + updated % urlbst + archive + archivePrefix + primaryClass + } + {} + { label extra.label sort.label short.list } +INTEGERS { output.state before.all mid.sentence after.sentence after.block } +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} +%% Declaration of string variables +STRINGS { s t} +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {format.archive} +{ + archivePrefix empty$ + { "" } + { archivePrefix ":" *} + if$ +} + + +FUNCTION {format.primaryClass} +{ + primaryClass empty$ + { "" } + { "{[" primaryClass * "]}" *} + if$ +} + +FUNCTION {format.soft.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.softmisc.archive} +{ + archivePrefix empty$ + { "" } + { "" } + if$ +} + +FUNCTION {format.softmisc.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +%FUNCTION {fin.entry} +%{ duplicate$ empty$ +% 'pop$ +% 'write$ +% if$ +% newline$ +%} +% +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + +FUNCTION {no.blank.or.punct} +{ "" * before.all 'output.state := +} + +FUNCTION {add.semicolon} +{ + ";" * + no.blank.or.punct +} + +FUNCTION {date.block} +{ + "." * + no.blank.or.punct +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% LOGICAL `NOT', `AND', AND `OR' % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Logical 'not': +% If the first element on the stack is A then this function +% does the following: +% push { #0 } +% push { #1 } +% So now the first 3 elements of the stack are +% { #1 } { #0 } A +% The first 3 are popped and subjected to 'if': +% If A > 0 then { #0 } is executed, else { #1 } is executed: +% if A > 0 +% then 0 +% else 1 +% So consider integers as logicals, where 1 = true and 0 = false, +% then this does +% (if A then false else true) +% which is a logical 'not'. + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% GENERAL PURPOSE FUNCTIONS FOR FORMATTING % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% issues warning if field is empty +% call with +% "field" field warning.if.empty +% Note that the first field must be between quotes +% because it is the fieldname for use in the warning message. +% + +FUNCTION {warning.if.empty} +{ empty$ + { "No " swap$ * " in " * cite$ * warning$ } + { pop$ } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % encloses string in pre- and postfix string + % call with + % prefix postfix S enclose.check + % delivers empty string if S empty + % +FUNCTION {enclose.check} +{ duplicate$ empty$ + { pop$ pop$ pop$ + "" + } + { swap$ * * } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% emphasizes top of stack +% call with +% string" emphasize.check +% + +FUNCTION {emphasize.check} +{ "\Bem{" swap$ + "}" swap$ + enclose.check +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % brackets top of stack + % call with + % "string" bracket.check + % +FUNCTION {bracket.check} +{ "[" swap$ + "]" swap$ + enclose.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % parenthesizes top of stack + % call with + % "string" parenthesize + % +FUNCTION {parenthesize.check} +{ "(" swap$ + ")" swap$ + enclose.check +} + +STRINGS {z} + +FUNCTION {remove.dots} +{ 'z := % expects string on top of the stack, pops the string and assigns it to variable z + "" % push empty string + { z empty$ not } % returns 0 if variable z is empty + { z #1 #1 substring$ % push the first character of variable z + z #2 global.max$ substring$ 'z := % assigns the 2nd to last character of variable z to variable z + duplicate$ "\" = % pushes 1 if the last character is "\", otherwise 0 + { * % concatenates the last 2 literals + z #1 #1 substring$ % push the first character of variable z + z #2 global.max$ substring$ 'z := % assigns the 2nd to last character of variable z to variable z + * % concatenates the last 2 literals, i.e. every character, even a dot, following a "\" will be printed + } + { duplicate$ "." = % pushes 1 if the last character is ".", otherwise 0 + 'pop$ % pushes the pop$ function + { * } % concatenates the last 2 literals + if$ % pops the last character if it is a dot, otherwise concatenates it with the string on top of the stack + } + if$ + } + while$ +} + +INTEGERS {l} +FUNCTION{string.length} +{ + #1 'l := + { duplicate$ duplicate$ #1 l substring$ = not } + { l #1 + 'l := } + while$ + pop$ l +} + +STRINGS {replace find text} +INTEGERS {find_length} +FUNCTION {find.replace} +{ + 'replace := + 'find := + 'text := + find string.length 'find_length := + "" + { text empty$ not } + { text #1 find_length substring$ find = + { + replace * + text #1 find_length + global.max$ substring$ 'text := + } + { text #1 #1 substring$ * + text #2 global.max$ substring$ 'text := + } + if$ + } + while$ +} + +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ skip$ } + +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {capitalize} +{ "u" change.case$ "t" change.case$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + + % Here are the language-specific definitions for explicit words. + % Each function has a name bbl.xxx where xxx is the English word. + % The language selected here is ENGLISH + +FUNCTION {bbl.and} +{ "and"} + +FUNCTION {bbl.etal} +{ "et~al." } + +FUNCTION {bbl.editors} +{ "editors" } + +FUNCTION {bbl.editor} +{ "editor" } + +FUNCTION {bbl.cartographers} +{ "cartographers" } + +FUNCTION {bbl.cartographer} +{ "cartographer" } + +FUNCTION {bbl.inventors} +{ "inventors" } + +FUNCTION {bbl.inventor} +{ "inventor" } + +FUNCTION {bbl.assignees} +{ "assignees" } + +FUNCTION {bbl.assignee} +{ "assignee" } + +FUNCTION {bbl.edby} +{ "edited by" } + +FUNCTION {bbl.edition} +{ "ed." } + +FUNCTION {bbl.volume} +{ "vol." } + +FUNCTION {bbl.of} +{ "of" } + +FUNCTION {bbl.number} +{ "no." } + +FUNCTION {bbl.nr} +{ "no." } + +FUNCTION {bbl.in} +{ "in" } + +FUNCTION {bbl.pages} +{ "p." } + +FUNCTION {bbl.page} +{ "p." } + +FUNCTION {bbl.chapter} +{ "chap." } + +FUNCTION {bbl.techrep} +{ "Tech. Rep." } + +FUNCTION {bbl.mthesis} +{ "Master's thesis" } + +FUNCTION {bbl.phdthesis} +{ "Ph.D. thesis" } + +FUNCTION {bbl.first} +{ "1st" } + +FUNCTION {bbl.second} +{ "2nd" } + +FUNCTION {bbl.third} +{ "3rd" } + +FUNCTION {bbl.fourth} +{ "4th" } + +FUNCTION {bbl.fifth} +{ "5th" } + +FUNCTION {bbl.st} +{ "st" } + +FUNCTION {bbl.nd} +{ "nd" } + +FUNCTION {bbl.rd} +{ "rd" } + +FUNCTION {bbl.th} +{ "th" } + +MACRO {jan} {"Jan."} + +MACRO {feb} {"Feb."} + +MACRO {mar} {"Mar."} + +MACRO {apr} {"Apr."} + +MACRO {may} {"May"} + +MACRO {jun} {"Jun."} + +MACRO {jul} {"Jul."} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sep."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + +MACRO {acmcs} {"ACM Comput. Surv."} + +MACRO {acta} {"Acta Inf."} + +MACRO {cacm} {"Commun. ACM"} + +MACRO {ibmjrd} {"IBM J. Res. Dev."} + +MACRO {ibmsj} {"IBM Syst.~J."} + +MACRO {ieeese} {"IEEE Trans. Software Eng."} + +MACRO {ieeetc} {"IEEE Trans. Comput."} + +MACRO {ieeetcad} + {"IEEE Trans. Comput. Aid. Des."} + +MACRO {ipl} {"Inf. Process. Lett."} + +MACRO {jacm} {"J.~ACM"} + +MACRO {jcss} {"J.~Comput. Syst. Sci."} + +MACRO {scp} {"Sci. Comput. Program."} + +MACRO {sicomp} {"SIAM J. Comput."} + +MACRO {tocs} {"ACM Trans. Comput. Syst."} + +MACRO {tods} {"ACM Trans. Database Syst."} + +MACRO {tog} {"ACM Trans. Graphic."} + +MACRO {toms} {"ACM Trans. Math. Software"} + +MACRO {toois} {"ACM Trans. Office Inf. Syst."} + +MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} + +MACRO {tcs} {"Theor. Comput. Sci."} + +FUNCTION {eng.ord} +{ duplicate$ "1" swap$ * + #-2 #1 substring$ "1" = + { bbl.th * } + { duplicate$ #-1 #1 substring$ + duplicate$ "1" = + { pop$ bbl.st * } + { duplicate$ "2" = + { pop$ bbl.nd * } + { "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ + } + if$ +} + +FUNCTION {bibinfo.check} +{ swap$ + duplicate$ missing$ + { + pop$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ pop$ + } + { swap$ + pop$ + } + if$ + } + if$ +} + +FUNCTION {bibinfo.warn} +{ swap$ + duplicate$ missing$ + { + swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ "empty " swap$ * " in " * cite$ * warning$ + } + { swap$ + pop$ + } + if$ + } + if$ +} +INTEGERS { nameptr namesleft numnames } + + +STRINGS { bibinfo} + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + "." ". " find.replace 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}{ f{}}{ jj}" + format.name$ + remove.dots + bibinfo bibinfo.check + 't := + nameptr #1 > + { + nameptr #6 + #1 + = + numnames #6 + > and + { "others" 't := + #1 'namesleft := } + 'skip$ + if$ + namesleft #1 > + { ", " * t * } + { + "," * + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal * + } + { " " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} + +FUNCTION {format.names.org} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{ff~}{vv~}{ll}" + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { "; " * t * } + { + ";" * + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal * + } + { " " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} + +FUNCTION {format.names.ed} +{ + format.names +} + +FUNCTION {format.key} +{ empty$ + { key field.or.null } + { "" } + if$ +} + +FUNCTION {format.authors} +{ + author "author" format.names + %%"." " " "author" find.replace format.names +} + +FUNCTION {format.organizations} +{ organization "organization" format.names.org +} + +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {get.bbl.cartographer} +{ cartographer num.names$ #1 > 'bbl.cartographers 'bbl.cartographer if$ } + +FUNCTION {get.bbl.inventor} +{ inventor num.names$ #1 > 'bbl.inventors 'bbl.inventor if$ } + +FUNCTION {get.bbl.assignee} +{ assignee num.names$ #1 > 'bbl.assignees 'bbl.assignee if$ } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { + "," * + " " * + get.bbl.editor + * + } + if$ +} + +FUNCTION {format.assignees} +{ assignee "assignee" format.names.org duplicate$ empty$ 'skip$ + { + "," * + " " * + get.bbl.assignee + * + } + if$ +} + +FUNCTION {format.cartographers} +{ cartographer "cartographer" format.names duplicate$ empty$ 'skip$ + { + "," * + " " * + get.bbl.cartographer + * + } + if$ +} + +FUNCTION {format.inventors} +{ inventor "inventor" format.names duplicate$ empty$ 'skip$ + { + "," * + " " * + get.bbl.inventor + * + } + if$ +} + +FUNCTION {format.note} +{ + url empty$ + 'skip$ + { "\urlprefix\url{" url * "}" * output } + if$ + note empty$ + { "" } + { note #1 #1 substring$ + duplicate$ "{" = + 'skip$ + { output.state mid.sentence = + { "l" } + { "u" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + } + if$ +} + +FUNCTION {format.title} +{ title +%%duplicate$ empty$ 'skip$ +%% { "t" change.case$ } +%%if$ + "title" bibinfo.check +} + + +FUNCTION {author.editor.key.full} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor } + if$ + } + { author } + if$ +} + +FUNCTION {author.key.full} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { author } + if$ +} + +FUNCTION {editor.key.full} +{ editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor } + if$ +} + +FUNCTION {make.full.names} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.full + { type$ "proceedings" = + 'editor.key.full + 'author.key.full + if$ + } + if$ +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem[{" write$ + label write$ + ")" make.full.names duplicate$ short.list = + { pop$ } + { * } + if$ + "}]{" * write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {n.dashify} +{ + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.in capitalize + ":" * + " " * } + +FUNCTION {format.journal.date} +{ + month "month" bibinfo.check + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { + swap$ 'skip$ + { "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { swap$ 'skip$ + { + " " * swap$ + } + if$ + * + remove.dots + } + if$ + duplicate$ empty$ + 'skip$ + { + before.all 'output.state := + after.sentence 'output.state := + } + if$ +} + +FUNCTION {format.date} +{ + no.blank.or.punct + ";" + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { swap$ 'skip$ + { + swap$ + " " * swap$ + } + if$ + * + } + if$ +} + +FUNCTION {format.btitle} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + } + if$ +} + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { bbl.volume volume tie.or.space.prefix + "volume" bibinfo.check * * + series "series" bibinfo.check + duplicate$ empty$ 'pop$ + { swap$ bbl.of space.word * swap$ + emphasize * } + if$ + "volume and number" number either.or.check + } + if$ +} + +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { output.state mid.sentence = + { bbl.number } + { bbl.number capitalize } + if$ + number tie.or.space.prefix "number" bibinfo.check * * + series empty$ + { "there's a number but no series in " cite$ * warning$ } + { bbl.in space.word * + series "series" bibinfo.check * + } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { +% convert.edition + output.state mid.sentence = + { "l" } + { "t" } + if$ change.case$ + "edition" bibinfo.check + " " * bbl.edition * + } + if$ +} +INTEGERS { multiresult } +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { duplicate$ multi.page.check + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + } + if$ +} + +FUNCTION {format.journal.pages} +{ pages duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ + { pop$ pop$ format.pages } + { + ":" * + swap$ + n.dashify + "pages" bibinfo.check + * + } + if$ + } + if$ +} + +FUNCTION {format.vol.num} +{ volume field.or.null + duplicate$ empty$ 'skip$ + { + "volume" bibinfo.check + } + if$ + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + "(" swap$ * ")" * + } + if$ * +} + +FUNCTION {format.vol.num.pages} +{ volume field.or.null + duplicate$ empty$ 'skip$ + { + "volume" bibinfo.check + } + if$ + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + "(" swap$ * ")" * + } + if$ * + format.journal.pages +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ + } + + FUNCTION {format.booktitle} + { + booktitle "booktitle" bibinfo.check + } + + FUNCTION {format.in.ed.booktitle} + { format.booktitle duplicate$ empty$ 'skip$ + { + editor "editor" format.names.ed duplicate$ empty$ 'pop$ + { + "," * + " " * + get.bbl.editor + ". " * + * swap$ + * } + if$ + word.in swap$ * + } + if$ + } + + FUNCTION {format.in.ed.title} + { format.title duplicate$ empty$ 'skip$ + { + editor "editor" format.names.ed duplicate$ empty$ 'pop$ + { + "," * + " " * + get.bbl.editor + ". " * + * swap$ + * } + if$ + word.in swap$ * + } + if$ + } + + FUNCTION {empty.misc.check} + { author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ + } +FUNCTION {format.thesis.type} + { type duplicate$ empty$ + 'pop$ + { swap$ pop$ + "t" change.case$ "type" bibinfo.check + } + if$ +} +FUNCTION {format.tr.number} +{ + number "number" bibinfo.check + %%type duplicate$ empty$ + %%{ pop$ bbl.techrep } + %%'skip$ + %%if$ + %%"type" bibinfo.check + %%swap$ duplicate$ empty$ + %%{ pop$ "t" change.case$ } + %%{ tie.or.space.prefix * * } + %%if$ +} + +FUNCTION {format.org.or.pub} +{ 't := + "" + address empty$ t empty$ and + 'skip$ + { + address "address" bibinfo.check * + t empty$ + 'skip$ + { address empty$ + 'skip$ + { ": " * } + if$ + t * + } + if$ + } + if$ +} + +FUNCTION {format.publisher.address} +{ publisher "publisher" bibinfo.warn format.org.or.pub +} + +FUNCTION {format.organization.address} +{ organization "organization" bibinfo.check format.org.or.pub +} + +FUNCTION {misc.add.comma} +{ + ", " * + } + +FUNCTION {misc.add.colon} +{ + ": " * + } + +INTEGERS { + bracket.state + outside.brackets + open.brackets + within.brackets + close.brackets +} + +FUNCTION {inbrackets} +{ bracket.state close.brackets = + { within.brackets 'bracket.state := } % reset the state: not open nor closed + { open.brackets 'bracket.state := } + if$ +} + +FUNCTION {format.type} +{ type empty$ + 'skip$ + { inbrackets type } + %%{ add.blank "[" type * "]" * } + if$ +} + +FUNCTION {format.institution.address} +{ institution "institution" bibinfo.check format.org.or.pub +} +FUNCTION {format.article.crossref} +{ + word.in + " \cite{" * crossref * "}" * +} +FUNCTION {format.book.crossref} +{ volume duplicate$ empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + pop$ word.in + } + { bbl.volume + capitalize + swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * + } + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.incoll.inproc.crossref} +{ + word.in + " \cite{" * crossref * "}" * +} +FUNCTION {misc} +{ output.bibitem + format.authors "author" output.check + format.editors "author and editor" output.check + no.blank.or.punct + add.period$ misc.add.colon + format.title "title" output.check + type missing$ + { skip$ } + { format.type "type" output.check } +% { "type" output.check } + %%{ inbrackets type output } + if$ + new.block + format.publisher.address output + format.date "year" output.check + new.block + format.note output + new.block + howpublished new.block.checka + howpublished "howpublished" bibinfo.check output +% output.web.refs % urlbst + fin.entry + empty.misc.check +} + +STRINGS { urlintro eprinturl eprintprefix doiprefix doiurl } % urlbst... +INTEGERS { hrefform addeprints adddoiresolver } + +FUNCTION {init.config.constants} +{ + "Available from: " 'urlintro := % prefix before URL + "http://arxiv.org/abs/" 'eprinturl := % prefix to make URL from eprint ref + "arXiv:" 'eprintprefix := % text prefix printed before eprint ref + "http://dx.doi.org/" 'doiurl := % prefix to make URL from DOI + "" 'doiprefix := % text prefix printed before DOI ref + #0 'addeprints := % 0=no eprints; 1=include eprints + #0 'adddoiresolver := % 0=no DOI resolver; 1=include it + #0 'hrefform := % 0=no crossrefs; 1=hypertex xrefs; 2=hyperref refs +} + +FUNCTION {make.href.null} +{ + pop$ +} + +FUNCTION {make.href.hypertex} +{ + "\special {html: }" * swap$ * + "\special {html:}" * +} +% make hyperref specials +FUNCTION {make.href.hyperref} +{ + "\href {" swap$ * "} {" * swap$ * "}" * +} +FUNCTION {make.href} +{ hrefform #2 = + 'make.href.hyperref % hrefform = 2 + { hrefform #1 = + 'make.href.hypertex % hrefform = 1 + 'make.href.null % hrefform = 0 (or anything else) + if$ + } + if$ +} + + +FUNCTION {format.eprint} +{ eprint empty$ + { "" } + { eprintprefix eprint * eprinturl eprint * make.href } + if$ +} + +FUNCTION {format.doi} +{ doi empty$ + { "" } + { doiprefix doi * doiurl doi * make.href } + if$ +} + +FUNCTION {format.ddoi} +{ doi "doi" bibinfo.check + duplicate$ empty$ 'skip$ + { + "\doi{" swap$ * "}" * + } + if$ +} + + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + organization empty$ + 'skip$ + { author empty$ + { + format.organizations "organization" output.check + } + { + "; " * + no.blank.or.punct + format.organizations "organization" output.check + } + if$ + } + if$ + new.block + format.title "title" output.check + type missing$ + { skip$ } + { "type" output.check } + if$ + new.block + journal + remove.dots + "journal" bibinfo.check + "journal" output.check + new.block + add.period$ + format.journal.date "year" output.check + add.semicolon + format.vol.num.pages output + new.block + format.note output + format.ddoi output + new.block + format.soft.eprint output + format.primaryClass output + fin.entry +} + + +FUNCTION {format.url} +{ url empty$ + { "" } + { hrefform #1 = + { % special case -- add HyperTeX specials + urlintro "\url{" url * "}" * url make.href.hypertex * } + { urlintro "\url{" * url * "}" * } + if$ + } + if$ +} + +FUNCTION {format.lastchecked} +{ lastchecked empty$ + { "" } + { updated empty$ + { inbrackets "cited " lastchecked * } + { inbrackets "updated " updated * "; cited " * lastchecked * } + if$ + } + if$ +} + +FUNCTION {output.url} +{ url empty$ + 'skip$ + { new.block + format.url output + format.lastchecked output + } + if$ +} + +FUNCTION {output.web.refs} +{ + new.block + output.url + addeprints eprint empty$ not and + { format.eprint output.nonnull } + 'skip$ + if$ + adddoiresolver doi empty$ not and + { format.doi output.nonnull } + 'skip$ + if$ +% addeprints +% { eprint empty$ +% 'skip$ +% { format.eprint output.nonnull } +% if$ +% } +% 'skip$ +% if$ +} + +FUNCTION {softmisc} +{ output.bibitem + format.authors "author" output.check + format.editors "author and editor" output.check + no.blank.or.punct + add.period$ misc.add.colon + format.title "title" output.check misc.add.comma + no.blank.or.punct + version output + type missing$ + { skip$ } + { format.type "type" output.check } + %%{ inbrackets type output } + if$ + new.block + format.publisher.address output +% format.date "year" output.check + new.block + format.note output + new.block + howpublished new.block.checka + howpublished "howpublished" bibinfo.check output + format.date "year" output.check + output.web.refs % urlbst + new.block + format.softmisc.eprint output + fin.entry + empty.misc.check +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { editor empty$ + { format.organizations "organization" output.check } + { format.editors "author and editor" output.check } + if$ + } + { format.authors output.nonnull + "author and editor" editor either.or.check + } + if$ + new.block + format.btitle "title" output.check + format.bvolume output + new.block + format.edition output + new.sentence + author empty$ not + editor empty$ not + and + { format.editors "author and editor" output.check } + 'skip$ + if$ + format.number.series output + format.publisher.address output + format.date "year" output.check + new.block + format.note output +% output.web.refs % urlbst + fin.entry +} +FUNCTION {booklet} +{ misc } + +FUNCTION {dictionary} +{ output.bibitem + format.booktitle "booktitle" output.check + format.bvolume output + new.block + format.edition output + new.sentence + format.publisher.address output + format.date "year" output.check + format.btitle "title" output.check + add.semicolon + add.blank + format.pages "pages" output.check + new.block + format.note output +% output.web.refs % urlbst + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + format.authors "author" output.check + new.block + chapter "chapter" output.check + new.block + format.in.ed.title "title" output.check + format.bvolume output + format.edition output + new.sentence + format.number.series output + format.publisher.address output + format.date "year" output.check + date.block + add.blank + format.pages "pages" output.check + new.block + format.note output +% output.web.refs % urlbst + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + format.in.ed.booktitle "booktitle" output.check + new.sentence + format.bvolume output + format.edition output + new.sentence + format.number.series output + new.sentence + add.period$ + format.publisher.address output + format.date "year" output.check + date.block + add.blank + format.pages "pages" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + format.in.ed.booktitle "booktitle" output.check + format.bvolume output + new.sentence + format.number.series output + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + format.date "year" output.check + date.block + add.blank + format.pages "pages" output.check + new.block + format.note output +% output.web.refs % urlbst + fin.entry +} +FUNCTION {conference} { inproceedings } +FUNCTION {manual} +{ output.bibitem + format.authors output + author format.key output +% add.colon + new.block + format.btitle "title" output.check + organization address new.block.checkb + organization "organization" bibinfo.check output + address "address" bibinfo.check output + format.edition output + format.date "year" output.check + % new.block ++++ REMOVED (to get comma before note) + format.note output + fin.entry +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + new.block + format.btitle "title" output.check + new.block + "PhD thesis" format.thesis.type output.nonnull + school "school" bibinfo.warn output +% address "address" bibinfo.check output + format.date "year" output.check +% new.block +% format.note output +% output.web.refs % urlbst + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + format.editors output + editor format.key output +% add.colon + new.block + format.btitle "title" output.check + format.bvolume output + new.sentence + format.number.series output + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + format.date "year" output.check + % new.block ++++ REMOVED (to get comma before note) + format.note output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + new.block + format.title + "title" output.check + new.block + format.institution.address output + format.date "year" output.check +% format.tr.number output.nonnull +% new.block +% format.note output +% output.web.refs % urlbst + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + author format.key output +% add.colon + new.block + format.title "title" output.check + format.date "year" output.check + % new.block ++++ REMOVED (to get comma before note) + format.note "note" output.check + fin.entry +} + +FUNCTION {default.type} { misc } +READ +EXECUTE {identify.vancouver.version} +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} +INTEGERS { len } +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} +FUNCTION {format.lab.names} +{ 's := + "" 't := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ + " " * bbl.etal * + } + { #2 < + 'skip$ + { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { + " " * bbl.etal * + } + { bbl.and space.word * s #2 "{vv~}{ll}" format.name$ + * } + if$ + } + if$ + } + if$ +} + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.label} +{ editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.short.authors} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.label + 'author.key.label + if$ + } + if$ + 'short.list := +} + +FUNCTION {calc.label} +{ calc.short.authors + short.list + "(" + * + year duplicate$ empty$ + { pop$ "????" } + 'skip$ + if$ + * + 'label := +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{ll{ }}{ ff{ }}{ jj{ }}" + format.name$ 't := + nameptr #1 > + { + " " * + namesleft #1 = t "others" = and + { "zzzzz" * } + { t sortify * } + if$ + } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {editor.sort} +{ editor empty$ + { key empty$ + { "to sort, need editor or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ +} +FUNCTION {presort} +{ calc.label + label sortify + " " + * + type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.sort + 'author.sort + if$ + } + if$ + #1 entry.max$ substring$ + 'sort.label := + sort.label + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {presort} +SORT +STRINGS { last.label next.extra } +INTEGERS { last.extra.num number.label } +FUNCTION {initialize.extra.label.stuff} +{ #0 int.to.chr$ 'last.label := + "" 'next.extra := + #0 'last.extra.num := + #0 'number.label := +} +FUNCTION {forward.pass} +{ last.label label = + { last.extra.num #1 + 'last.extra.num := + last.extra.num int.to.chr$ 'extra.label := + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + label 'last.label := + } + if$ + number.label #1 + 'number.label := +} +FUNCTION {reverse.pass} +{ next.extra "b" = + { "a" 'extra.label := } + 'skip$ + if$ + extra.label 'next.extra := + extra.label + duplicate$ empty$ + 'skip$ + { "{\natexlab{" swap$ * "}}" * } + if$ + 'extra.label := + label extra.label * 'label := +} +EXECUTE {initialize.extra.label.stuff} +ITERATE {forward.pass} +REVERSE {reverse.pass} +FUNCTION {bib.sort.order} +{ sort.label + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} +ITERATE {bib.sort.order} +SORT +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" number.label int.to.str$ * "}" * + write$ newline$ + "\providecommand{\natexlab}[1]{#1}" + write$ newline$ + "\providecommand{\doi}[1]{\url{https://doi.org/#1}}" + write$ newline$ + "\providecommand{\url}[1]{\texttt{#1}}" + write$ newline$ +% "\providecommand{\urlprefix}{URL }" ++++ EMPTIED by default + "\providecommand{\urlprefix}{}" + write$ newline$ +} +EXECUTE {begin.bib} +EXECUTE {init.state.consts} +ITERATE {call.type$} +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} +EXECUTE {end.bib} +%% End of customized bst file +%% +%% End of file `sn-vancouver-ay.bst'. \ No newline at end of file diff --git a/waypoint_control/sn-article-template/bst/sn-vancouver-num.bst b/waypoint_control/sn-article-template/bst/sn-vancouver-num.bst new file mode 100644 index 0000000..cdc9d68 --- /dev/null +++ b/waypoint_control/sn-article-template/bst/sn-vancouver-num.bst @@ -0,0 +1,2021 @@ +%% +%% This is file `sn-vancouver-num.bst', +%% generated with the docstrip utility. +%% +%% The original source files were: vancouver.bst +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This bibliography style file is intended for texts in ENGLISH +%% This is a numerical citation style, and as such is standard LaTeX. +%% It requires no extra package to interface to the main text. +%% The form of the \bibitem entries is +%% \bibitem{key}... +%% Usage of \cite is as follows: +%% \cite{key} ==>> [#] +%% \cite[chap. 2]{key} ==>> [#, chap. 2] +%% where # is a number determined by the ordering in the reference list. +%% The order in the reference list is that by which the works were originally +%% cited in the text, or that in the database. + % +%% To change the reference numbering system from [1] to 1, +%% put the following code in the preamble: +%% \makeatletter % Reference list option change +%% \renewcommand\@biblabel[1]{#1} % from [1] to 1 +%% \makeatother % +%%--------------------------------------------------------------------- + +FUNCTION {identify.vancouver.version} +{ % Put identifying string in the .blg file + "sn-vancouver-num.bst" + " [2024/07/19 v1.1 Vancouver bibliography style]" + * top$ +} + +%% List of all possible fields +ENTRY + { address + assignee % for patents + author + booktitle % for articles in books + chapter % for incollection, esp. internet documents + cartographer % for maps + day + edition + editor + howpublished + institution % for technical reports + inventor % for patents + journal + key + keywords + month + note + number + organization + pages + part + publisher + school + series + title + type + volume + word + year + eprint % urlbst + doi % urlbst + url % urlbst + lastchecked % urlbst + updated % urlbst + archive + archivePrefix + primaryClass + eid + adsurl + adsnote + version + } + {} + { label } +%% Declaration of integer variables +INTEGERS { output.state before.all mid.sentence after.sentence after.block } +STRINGS { urlintro eprinturl eprintprefix doiprefix doiurl } % urlbst... +INTEGERS { hrefform addeprints adddoiresolver } +% Following constants may be adjusted by hand, if desired +FUNCTION {init.config.constants} +{ + "Available from: " 'urlintro := % prefix before URL + "http://arxiv.org/abs/" 'eprinturl := % prefix to make URL from eprint ref + "arXiv:" 'eprintprefix := % text prefix printed before eprint ref + "http://dx.doi.org/" 'doiurl := % prefix to make URL from DOI + "" 'doiprefix := % text prefix printed before DOI ref + #0 'addeprints := % 0=no eprints; 1=include eprints + #0 'adddoiresolver := % 0=no DOI resolver; 1=include it + #0 'hrefform := % 0=no crossrefs; 1=hypertex xrefs; 2=hyperref refs +} +INTEGERS { + bracket.state + outside.brackets + open.brackets + within.brackets + close.brackets +} +% ...urlbst to here +FUNCTION {init.state.consts} +{ #0 'outside.brackets := % urlbst + #1 'open.brackets := + #2 'within.brackets := + #3 'close.brackets := + + #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} +%% Declaration of string variables +STRINGS { s t} + +% urlbst +FUNCTION {output.nonnull.original} +{ 's := + output.state mid.sentence = + { ". " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +% urlbst... +FUNCTION {output.nonnull} +{ % Save the thing we've been asked to output + 's := + % If the bracket-state is close.brackets, then add a close-bracket to + % what is currently at the top of the stack, and set bracket.state + % to outside.brackets + bracket.state close.brackets = + { "]" * + outside.brackets 'bracket.state := + } + 'skip$ + if$ + bracket.state outside.brackets = + { % We're outside all brackets -- this is the normal situation. + % Write out what's currently at the top of the stack, using the + % original output.nonnull function. + s + output.nonnull.original + } + { % Still in brackets. Add open-bracket or (continuation) comma, add the + % new text (in s) to the top of the stack, and move to the close-brackets + % state, ready for next time (unless inbrackets resets it). If we come + % into this branch, then output.state is carefully undisturbed. + bracket.state open.brackets = + { " [" * } + { ", " * } % bracket.state will be within.brackets + if$ + s * + close.brackets 'bracket.state := + } + if$ +} + +% Call this function just before adding something which should be presented in +% brackets. bracket.state is handled specially within output.nonnull. +FUNCTION {inbrackets} +{ bracket.state close.brackets = + { within.brackets 'bracket.state := } % reset the state: not open nor closed + { open.brackets 'bracket.state := } + if$ +} + +FUNCTION {format.lastchecked} +{ lastchecked empty$ + { "" } + { updated empty$ + { inbrackets "cited " lastchecked * } + { inbrackets "updated " updated * "; cited " * lastchecked * } + if$ + } + if$ +} +% ...urlbst to here + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +FUNCTION {fin.entry} +{ + bracket.state close.brackets = % urlbst + { "]" * } + 'skip$ + if$ + add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + +FUNCTION {no.blank.or.punct} +{ "" * before.all 'output.state := +} + +FUNCTION {add.semicolon} +{ + ";" * + no.blank.or.punct +} + +FUNCTION {misc.add.colon} +{ + ": " * + } + +FUNCTION {misc.add.comma} +{ + ", " * + } + +FUNCTION {date.block} +{ + "." * + no.blank.or.punct +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% LOGICAL `NOT', `AND', AND `OR' % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Logical 'not': +% If the first element on the stack is A then this function +% does the following: +% push { #0 } +% push { #1 } +% So now the first 3 elements of the stack are +% { #1 } { #0 } A +% The first 3 are popped and subjected to 'if': +% If A > 0 then { #0 } is executed, else { #1 } is executed: +% if A > 0 +% then 0 +% else 1 +% So consider integers as logicals, where 1 = true and 0 = false, +% then this does +% (if A then false else true) +% which is a logical 'not'. + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Logical 'and': +% If the first 2 elements on the stack are A B +% then this function does the following: +% push 'skip$ +% push { pop$ #0 } +% So now first 4 elements are +% { pop$ #0 } 'skip$ A B +% The first 3 are popped and subjected to 'if' (B is on top of +% the stack): +% If A > 0 then 'skip$ is executed, else { pop$ #0 } is executed: +% if A > 0 +% then (B stays on top of stack) +% else (B is popped and #0 is pushed) +% So consider integers as logicals, where 1 = true and 0 = false, +% then this does +% (if A then B else false) +% which is a logical 'and'. + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Logical 'or': +% If the first 2 elements on the stack are A B +% then this function does the following: +% push { pop$ #1 } +% push 'skip$ +% So now first 4 elements are +% 'skip$ { pop$ #1 } A B +% The first 3 are popped and subjected to 'if' (B is on top of +% the stack): +% If A > 0 then { pop$ #1 } is executed, else 'skip$ is executed: +% if A > 0 +% then (B is popped and #1 is pushed) +% else (B stays on top of stack) +% So consider integers as logicals, where 1 = true and 0 = false, +% then this does +% (if A then true else B) +% which is a logical 'or'. + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% GENERAL PURPOSE FUNCTIONS FOR FORMATTING % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% issues warning if field is empty +% call with +% "field" field warning.if.empty +% Note that the first field must be between quotes +% because it is the fieldname for use in the warning message. +% + +FUNCTION {warning.if.empty} +{ empty$ + { "No " swap$ * " in " * cite$ * warning$ } + { pop$ } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % encloses string in pre- and postfix string + % call with + % prefix postfix S enclose.check + % delivers empty string if S empty + % +FUNCTION {enclose.check} +{ duplicate$ empty$ + { pop$ pop$ pop$ + "" + } + { swap$ * * } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% emphasizes top of stack +% call with +% string" emphasize.check +% + +FUNCTION {emphasize.check} +{ "\Bem{" swap$ + "}" swap$ + enclose.check +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % brackets top of stack + % call with + % "string" bracket.check + % +FUNCTION {bracket.check} +{ "[" swap$ + "]" swap$ + enclose.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % parenthesizes top of stack + % call with + % "string" parenthesize + % +FUNCTION {parenthesize.check} +{ "(" swap$ + ")" swap$ + enclose.check +} + +STRINGS {z} + +FUNCTION {remove.dots} +{ 'z := % expects string on top of the stack, pops the string and assigns it to variable z + "" % push empty string + { z empty$ not } % returns 0 if variable z is empty + { z #1 #1 substring$ % push the first character of variable z + z #2 global.max$ substring$ 'z := % assigns the 2nd to last character of variable z to variable z + duplicate$ "\" = % pushes 1 if the last character is "\", otherwise 0 + { * % concatenates the last 2 literals + z #1 #1 substring$ % push the first character of variable z + z #2 global.max$ substring$ 'z := % assigns the 2nd to last character of variable z to variable z + * % concatenates the last 2 literals, i.e. every character, even a dot, following a "\" will be printed + } + { duplicate$ "." = % pushes 1 if the last character is ".", otherwise 0 + 'pop$ % pushes the pop$ function + { * } % concatenates the last 2 literals + if$ % pops the last character if it is a dot, otherwise concatenates it with the string on top of the stack + } + if$ + } + while$ +} + +INTEGERS {l} +FUNCTION{string.length} +{ + #1 'l := + { duplicate$ duplicate$ #1 l substring$ = not } + { l #1 + 'l := } + while$ + pop$ l +} + +STRINGS {replace find text} +INTEGERS {find_length} +FUNCTION {find.replace} +{ + 'replace := + 'find := + 'text := + find string.length 'find_length := + "" + { text empty$ not } + { text #1 find_length substring$ find = + { + replace * + text #1 find_length + global.max$ substring$ 'text := + } + { text #1 #1 substring$ * + text #2 global.max$ substring$ 'text := + } + if$ + } + while$ +} + +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ skip$ } + +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {capitalize} +{ "u" change.case$ "t" change.case$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + + % Here are the language-specific definitions for explicit words. + % Each function has a name bbl.xxx where xxx is the English word. + % The language selected here is ENGLISH + +FUNCTION {bbl.and} +{ "and"} + +FUNCTION {bbl.etal} +{ "et~al." } + +FUNCTION {bbl.editors} +{ "editors" } + +FUNCTION {bbl.editor} +{ "editor" } + +FUNCTION {bbl.cartographers} +{ "cartographers" } + +FUNCTION {bbl.cartographer} +{ "cartographer" } + +FUNCTION {bbl.inventors} +{ "inventors" } + +FUNCTION {bbl.inventor} +{ "inventor" } + +FUNCTION {bbl.assignees} +{ "assignees" } + +FUNCTION {bbl.assignee} +{ "assignee" } + +FUNCTION {bbl.edby} +{ "edited by" } + +FUNCTION {bbl.edition} +{ "ed." } + +FUNCTION {bbl.volume} +{ "vol." } + +FUNCTION {bbl.of} +{ "of" } + +FUNCTION {bbl.number} +{ "no." } + +FUNCTION {bbl.nr} +{ "no." } + +FUNCTION {bbl.in} +{ "in" } + +FUNCTION {bbl.pages} +{ "p." } + +FUNCTION {bbl.page} +{ "p." } + +FUNCTION {bbl.chapter} +{ "chap." } + +FUNCTION {bbl.techrep} +{ "Tech. Rep." } + +FUNCTION {bbl.mthesis} +{ "Master's thesis" } + +FUNCTION {bbl.phdthesis} +{ "Ph.D. thesis" } + +FUNCTION {bbl.first} +{ "1st" } + +FUNCTION {bbl.second} +{ "2nd" } + +FUNCTION {bbl.third} +{ "3rd" } + +FUNCTION {bbl.fourth} +{ "4th" } + +FUNCTION {bbl.fifth} +{ "5th" } + +FUNCTION {bbl.st} +{ "st" } + +FUNCTION {bbl.nd} +{ "nd" } + +FUNCTION {bbl.rd} +{ "rd" } + +FUNCTION {bbl.th} +{ "th" } + +MACRO {jan} {"Jan."} + +MACRO {feb} {"Feb."} + +MACRO {mar} {"Mar."} + +MACRO {apr} {"Apr."} + +MACRO {may} {"May"} + +MACRO {jun} {"Jun."} + +MACRO {jul} {"Jul."} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sep."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + +FUNCTION {eng.ord} +{ duplicate$ "1" swap$ * + #-2 #1 substring$ "1" = + { bbl.th * } + { duplicate$ #-1 #1 substring$ + duplicate$ "1" = + { pop$ bbl.st * } + { duplicate$ "2" = + { pop$ bbl.nd * } + { "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ + } + if$ +} + +FUNCTION {bibinfo.check} +{ swap$ + duplicate$ missing$ + { + pop$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ pop$ + } + { swap$ + pop$ + } + if$ + } + if$ +} + +FUNCTION {bibinfo.warn} +{ swap$ + duplicate$ missing$ + { + swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ "empty " swap$ * " in " * cite$ * warning$ + } + { swap$ + pop$ + } + if$ + } + if$ +} + +STRINGS { bibinfo} +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + "." ". " find.replace 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}{ f{}}{ jj}" + format.name$ + remove.dots + bibinfo bibinfo.check + 't := + nameptr #1 > + { + nameptr #6 + #1 + = + numnames #6 + > and + { "others" 't := + #1 'namesleft := } + 'skip$ + if$ + namesleft #1 > + { ", " * t * } + { + "," * + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal * + } + { " " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} + +FUNCTION {format.names.org} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{ff~}{vv~}{ll}" + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { "; " * t * } + { + ";" * + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal * + } + { " " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} + +FUNCTION {format.names.ed} +{ + format.names +} + +FUNCTION {format.authors} +{ + author "author" format.names + %%"." " " "author" find.replace format.names +} + +FUNCTION {format.organizations} +{ organization "organization" format.names.org +} + +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {get.bbl.cartographer} +{ cartographer num.names$ #1 > 'bbl.cartographers 'bbl.cartographer if$ } + +FUNCTION {get.bbl.inventor} +{ inventor num.names$ #1 > 'bbl.inventors 'bbl.inventor if$ } + +FUNCTION {get.bbl.assignee} +{ assignee num.names$ #1 > 'bbl.assignees 'bbl.assignee if$ } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { + "," * + " " * + get.bbl.editor + * + } + if$ +} + +FUNCTION {format.assignees} +{ assignee "assignee" format.names.org duplicate$ empty$ 'skip$ + { + "," * + " " * + get.bbl.assignee + * + } + if$ +} + +FUNCTION {format.cartographers} +{ cartographer "cartographer" format.names duplicate$ empty$ 'skip$ + { + "," * + " " * + get.bbl.cartographer + * + } + if$ +} + +FUNCTION {format.inventors} +{ inventor "inventor" format.names duplicate$ empty$ 'skip$ + { + "," * + " " * + get.bbl.inventor + * + } + if$ +} + +FUNCTION {format.note} +{ + note empty$ + { "" } + { note #1 #1 substring$ + duplicate$ "{" = + 'skip$ + { output.state mid.sentence = + { "l" } + { "u" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + } + if$ +} + +FUNCTION {format.title} +{ title +%%duplicate$ empty$ 'skip$ +%% { "t" change.case$ } +%%if$ + "title" bibinfo.check +} + +FUNCTION {format.type} +{ type empty$ + 'skip$ + { inbrackets type } + %%{ add.blank "[" type * "]" * } + if$ +} + +FUNCTION {cite.author.editor} +{ 's := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ " et~al." * } + { #2 = + { s #2 "{vv~}{ll}{ jj}{ f}" format.name$ "others" = + { " et~al." * } + { " and " * s #2 "{vv~}{ll}" format.name$ * } + if$ + } + 'skip$ + if$ + } + if$ +} + +FUNCTION {check.auth.edit.org} +{author empty$ + { + editor empty$ + { + organization empty$ + {""} + {organization} + if$ + } + {editor cite.author.editor} + if$ + } + {author cite.author.editor} + if$ +} + +FUNCTION {check.year} +{ year empty$ + {""} + {year} + if$ +} + +FUNCTION {output.bibitem} +{ outside.brackets 'bracket.state := % urlbst + newline$ + "\bibitem[\protect\citeauthoryear{" write$ +check.auth.edit.org write$ +"}{" write$ check.year write$ "}]{" write$ cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {n.dashify} +{ + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.in capitalize + ":" * + " " * } + +FUNCTION {format.journal.date} +{ + month "month" bibinfo.check + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { + swap$ 'skip$ + { "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { swap$ 'skip$ + { + " " * swap$ + } + if$ + * + remove.dots + } + if$ + duplicate$ empty$ + 'skip$ + { + before.all 'output.state := + after.sentence 'output.state := + } + if$ +} + +FUNCTION {format.date} +{ + no.blank.or.punct + ";" + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { swap$ 'skip$ + { + swap$ + " " * swap$ + } + if$ + * + } + if$ +} + +FUNCTION {format.btitle} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + } + if$ +} + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { bbl.volume volume tie.or.space.prefix + "volume" bibinfo.check * * + series "series" bibinfo.check + duplicate$ empty$ 'pop$ + { swap$ bbl.of space.word * swap$ + emphasize * } + if$ + "volume and number" number either.or.check + } + if$ +} + +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { series empty$ + { number "number" bibinfo.check } + { output.state mid.sentence = + { bbl.number } + { bbl.number capitalize } + if$ + number tie.or.space.prefix "number" bibinfo.check * * + bbl.in space.word * + series "series" bibinfo.check * + } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + +FUNCTION {convert.edition} +{ extract.num "l" change.case$ 's := + s "first" = s "1" = or + { bbl.first 't := } + { s "second" = s "2" = or + { bbl.second 't := } + { s "third" = s "3" = or + { bbl.third 't := } + { s "fourth" = s "4" = or + { bbl.fourth 't := } + { s "fifth" = s "5" = or + { bbl.fifth 't := } + { s #1 #1 substring$ is.num + { s eng.ord 't := } + { edition 't := } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + t +} + +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { + convert.edition + output.state mid.sentence = + { "l" } + { "t" } + if$ change.case$ + "edition" bibinfo.check + " " * bbl.edition * + } + if$ +} +INTEGERS { multiresult } +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { duplicate$ multi.page.check + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + } + if$ +} + +FUNCTION {format.journal.pages} +{ pages duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ + { pop$ pop$ format.pages } + { + ":" * + swap$ + n.dashify + "pages" bibinfo.check + * + } + if$ + } + if$ +} + +FUNCTION {format.vol.num} +{ volume field.or.null + duplicate$ empty$ 'skip$ + { + "volume" bibinfo.check + } + if$ + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + "(" swap$ * ")" * + } + if$ * +} + +FUNCTION {format.vol.num.pages} +{ volume field.or.null + duplicate$ empty$ 'skip$ + { + "volume" bibinfo.check + } + if$ + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + "(" swap$ * ")" * + } + if$ * + format.journal.pages +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ + } + + FUNCTION {format.booktitle} + { + booktitle "booktitle" bibinfo.check + } + + FUNCTION {format.in.ed.booktitle} + { format.booktitle duplicate$ empty$ 'skip$ + { + editor "editor" format.names.ed duplicate$ empty$ 'pop$ + { + "," * + " " * + get.bbl.editor + ". " * + * swap$ + * } + if$ + word.in swap$ * + } + if$ + } + + FUNCTION {format.in.ed.title} + { format.title duplicate$ empty$ 'skip$ + { + editor "editor" format.names.ed duplicate$ empty$ 'pop$ + { + "," * + " " * + get.bbl.editor + ". " * + * swap$ + * } + if$ + word.in swap$ * + } + if$ + } + + FUNCTION {empty.misc.check} + { author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ + } +FUNCTION {format.thesis.type} + { type duplicate$ empty$ + 'pop$ + { swap$ pop$ + "t" change.case$ "type" bibinfo.check + } + if$ +} +FUNCTION {format.tr.number} +{ + number "number" bibinfo.check + %%type duplicate$ empty$ + %%{ pop$ bbl.techrep } + %%'skip$ + %%if$ + %%"type" bibinfo.check + %%swap$ duplicate$ empty$ + %%{ pop$ "t" change.case$ } + %%{ tie.or.space.prefix * * } + %%if$ +} + +FUNCTION {format.org.or.pub} +{ 't := + "" + address empty$ t empty$ and + 'skip$ + { + address "address" bibinfo.check * + t empty$ + 'skip$ + { address empty$ + 'skip$ + { ": " * } + if$ + t * + } + if$ + } + if$ +} + +FUNCTION {format.publisher.address} +{ publisher "publisher" bibinfo.warn format.org.or.pub +} + +FUNCTION {format.organization.address} +{ organization "organization" bibinfo.check format.org.or.pub +} + +FUNCTION {format.institution.address} +{ institution "institution" bibinfo.check format.org.or.pub +} + + +% urlbst... +% Functions for making hypertext links. +% In all cases, the stack has (link-text href-url) +% +% make 'null' specials +FUNCTION {make.href.null} +{ + pop$ +} +% make hypertex specials +FUNCTION {make.href.hypertex} +{ + "\special {html: }" * swap$ * + "\special {html:}" * +} +% make hyperref specials +FUNCTION {make.href.hyperref} +{ + "\href {" swap$ * "} {" * swap$ * "}" * +} +FUNCTION {make.href} +{ hrefform #2 = + 'make.href.hyperref % hrefform = 2 + { hrefform #1 = + 'make.href.hypertex % hrefform = 1 + 'make.href.null % hrefform = 0 (or anything else) + if$ + } + if$ +} + +FUNCTION {format.url} +{ url empty$ + { "" } + { hrefform #1 = + { % special case -- add HyperTeX specials + urlintro "\url{" url * "}" * url make.href.hypertex * } + { urlintro "\url{" * url * "}" * } + if$ + } + if$ +} + +FUNCTION {format.eprint} +{ eprint empty$ + { "" } + { eprintprefix eprint * eprinturl eprint * make.href } + if$ +} + +FUNCTION {format.doi} +{ doi empty$ + { "" } + { doiprefix doi * doiurl doi * make.href } + if$ +} + +FUNCTION {format.ddoi} +{ doi "doi" bibinfo.check + duplicate$ empty$ 'skip$ + { + "\doi{" swap$ * "}" * + } + if$ +} + +% Output a URL. We can't use the more normal idiom (something like +% `format.url output'), because the `inbrackets' within +% format.lastchecked applies to everything between calls to `output', +% so that `format.url format.lastchecked * output' ends up with both +% the URL and the lastchecked in brackets. +FUNCTION {output.url} +{ url empty$ + 'skip$ + { new.block + format.url output + format.lastchecked output + } + if$ +} + +FUNCTION {output.web.refs} +{ + new.block + output.url + addeprints eprint empty$ not and + { format.eprint output.nonnull } + 'skip$ + if$ + adddoiresolver doi empty$ not and + { format.doi output.nonnull } + 'skip$ + if$ +% addeprints +% { eprint empty$ +% 'skip$ +% { format.eprint output.nonnull } +% if$ +% } +% 'skip$ +% if$ +} + +% Webpage entry type. +% Title and url fields required; +% author, note, year, month, and lastchecked fields optional +STRINGS {database} +FUNCTION {webpage} +{ output.bibitem + author empty$ + { editor empty$ + 'skip$ % author and editor both optional + { format.editors output.nonnull } + if$ + } + { editor empty$ + { format.authors output.nonnull } + { "can't use both author and editor fields in " cite$ * warning$ } + if$ + } + if$ +% author empty$ +% 'skip$ +% { format.authors output.nonnull } +% if$ + new.block + format.title "title" output.check + journal empty$ + { + format.type "type" output.check + publisher empty$ + 'skip$ + { format.publisher.address output } + if$ + "database on the Internet" 'database := + type database = + { format.journal.date "year" output.check } + { format.date "year" output.check } + if$ + lastchecked empty$ + 'skip$ + { format.lastchecked output } + if$ + new.block + part empty$ + 'skip$ + { part output } + if$ + pages empty$ + 'skip$ + { pages bracket.check output } + if$ + } + { journal + remove.dots + "journal" bibinfo.check + "journal" output.check + format.type "type" output.check + format.journal.date "year" output.check + lastchecked empty$ + 'skip$ + { format.lastchecked output + ";" no.blank.or.punct output + } + if$ + no.blank.or.punct format.vol.num output + pages empty$ + 'skip$ + { ":" no.blank.or.punct output + no.blank.or.punct pages bracket.check output + } + if$ + new.block + } + if$ + format.url "url" output.check + new.block + note output + fin.entry +} +% ...urlbst to here + +FUNCTION {misc} +{ output.bibitem + format.authors "author" output.check + format.editors "author and editor" output.check + no.blank.or.punct + add.period$ misc.add.colon +format.title "title" output.check + type missing$ + { skip$ } + { format.type "type" output.check } + %%{ inbrackets type output } + if$ + new.block + format.publisher.address output +% format.date "year" output.check + new.block + format.note output + new.block + howpublished new.block.checka + howpublished "howpublished" bibinfo.check output + output.web.refs % urlbst + fin.entry + empty.misc.check +} + +FUNCTION {format.archive} +{ + archivePrefix empty$ + { "" } + { archivePrefix ":" *} + if$ +} + +FUNCTION {format.primaryClass} +{ + primaryClass empty$ + { "" } + { "{[" primaryClass * "]}" *} + if$ +} + +FUNCTION {format.soft.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.softmisc.archive} +{ + archivePrefix empty$ + { "" } + { "" } + if$ +} + +FUNCTION {format.softmisc.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + organization empty$ + 'skip$ + { author empty$ + { + format.organizations "organization" output.check + } + { + "; " * + no.blank.or.punct + format.organizations "organization" output.check + } + if$ + } + if$ + new.block + format.title "title" output.check + type missing$ + { skip$ } + { format.type "type" output.check } + if$ + new.block + journal + remove.dots + "journal" bibinfo.check + "journal" output.check + format.journal.date "year" output.check + add.semicolon + format.vol.num.pages output + new.block + format.note output + format.ddoi output + new.block + format.soft.eprint output + format.primaryClass output + fin.entry +} + +FUNCTION {softmisc} +{ output.bibitem + format.authors "author" output.check + format.editors "author and editor" output.check + no.blank.or.punct + add.period$ misc.add.colon + format.title "title" output.check misc.add.comma + no.blank.or.punct + version output + type missing$ + { skip$ } + { format.type "type" output.check } + %%{ inbrackets type output } + if$ + new.block + format.publisher.address output +% format.date "year" output.check + new.block + format.note output + new.block + howpublished new.block.checka + howpublished "howpublished" bibinfo.check output + format.date "year" output.check + output.web.refs % urlbst + new.block + format.softmisc.eprint output + fin.entry + empty.misc.check +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { editor empty$ + { format.organizations "organization" output.check } + { format.editors "author and editor" output.check } + if$ + } + { format.authors output.nonnull + "author and editor" editor either.or.check + } + if$ + new.block + format.btitle "title" output.check + format.bvolume output + new.block + format.edition output + new.sentence + author empty$ not + editor empty$ not + and + { format.editors "author and editor" output.check } + 'skip$ + if$ + format.number.series output + format.publisher.address output + format.date "year" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {booklet} +{ misc } + +FUNCTION {dictionary} +{ output.bibitem + format.booktitle "booktitle" output.check + format.bvolume output + new.block + format.edition output + new.sentence + format.publisher.address output + format.date "year" output.check + format.btitle "title" output.check + add.semicolon + add.blank + format.pages "pages" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + format.authors "author" output.check + new.block + chapter "chapter" output.check + new.block + format.in.ed.title "title" output.check + format.bvolume output + format.edition output + new.sentence + format.number.series output + format.publisher.address output + format.date "year" output.check + date.block + add.blank + format.pages "pages" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + format.in.ed.booktitle "booktitle" output.check + format.bvolume output + format.edition output + new.sentence + format.number.series output + format.publisher.address output + format.date "year" output.check + date.block + add.blank + format.pages "pages" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + format.in.ed.booktitle "booktitle" output.check + format.bvolume output + new.sentence + format.number.series output + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + format.date "year" output.check + date.block + add.blank + format.pages "pages" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {conference} +{inproceedings} + +FUNCTION {manual} +{misc} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + new.block + format.btitle + "title" output.check + format.type "type" output.check + new.block + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {mastersthesis} +{phdthesis} + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization "organization" bibinfo.check output + } + { format.editors output.nonnull } + if$ + new.block + format.btitle "title" output.check + format.bvolume output + editor empty$ + { publisher empty$ + 'skip$ + { + new.sentence + format.number.series output + format.publisher.address output + } + if$ + } + { publisher empty$ + { + new.sentence + format.organization.address output } + { + new.sentence + organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + } + if$ + format.date "year" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + new.block + format.title + "title" output.check + new.block + format.institution.address output + format.date "year" output.check + format.tr.number output.nonnull + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {map} +{ output.bibitem + format.cartographers "cartographer" output.check + new.block + format.title + "title" output.check + format.type "type" output.check + new.block + format.publisher.address output + format.date "year" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {patent} +{ output.bibitem + format.inventors "inventor" output.check + "; " * + no.blank.or.punct + format.assignees "assignee" output.check + new.block + format.title + "title" output.check + new.block + format.tr.number output.nonnull + format.date "year" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + format.date output + new.block + format.note "note" output.check + output.web.refs % urlbst + fin.entry +} + +FUNCTION {default.type} { misc } +READ +EXECUTE {identify.vancouver.version} + +STRINGS { longest.label } +INTEGERS { number.label longest.label.width } +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\providecommand{\doi}[1]{\url{https://doi.org/#1}}" + write$ newline$ + "\bibcommenthead" write$ newline$ +} +EXECUTE {begin.bib} +EXECUTE {init.config.constants} +EXECUTE {init.state.consts} +ITERATE {call.type$} +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} +EXECUTE {end.bib} +%% End of customized bst file +%% +%% End of file `sn-vancouver-num.bst'. + diff --git a/waypoint_control/sn-article-template/empty.eps b/waypoint_control/sn-article-template/empty.eps new file mode 100644 index 0000000..d216d5b --- /dev/null +++ b/waypoint_control/sn-article-template/empty.eps @@ -0,0 +1,80 @@ +%!PS-Adobe-3.0 +%%Pages: (atend) +%%BoundingBox: 0 0 115 87 +%%HiResBoundingBox: 0.563794 0.527295 114.418213 86.036206 +%........................................... +%%Creator: GNU Ghostscript 653 (pswrite) +%%CreationDate: 2002/07/10 13:09:14 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%EndComments +%%BeginProlog +% This copyright applies to everything between here and the %%EndProlog: +% Copyright (C) 2002 artofcode LLC, Benicia, CA. All rights reserved. +%%BeginResource: procset GS_pswrite_2_0_1001 +/GS_pswrite_2_0_1001 80 dict dup begin +/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch +4 index eq and{ pop pop pop}{ PageSize dup 1 +5 -1 roll put 0 4 -1 roll put dup where{ exch get exec} +{ pop/setpagedevice where +{ pop 1 dict dup /PageSize PageSize put setpagedevice} +{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat +setpage}if}ifelse}ifelse}ifelse} bind def +/!{bind def}bind def/#{load def}!/N/counttomark # +/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! +/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! +/w/setlinewidth #/J/setlinecap # +/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # +/m/moveto #/l/lineto #/c/rcurveto # +/p{N 2 idiv{N -2 roll rlineto}repeat}! +/P{N 0 gt{N -2 roll moveto p}if}! +/h{p closepath}!/H{P closepath}! +/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! +/re{4 -2 roll m exch dup lx exch ly neg lx h}! +/^{3 index neg 3 index neg}! +/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! +/q/gsave #/Q/grestore #/rf{re fill}! +/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! +/|={pop exch 4 1 roll 3 array astore cvx exch 1 index def exec}! +/|{exch string readstring |=}! +/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! +/@/currentfile #/${+ @ |}! +/B{{2 copy string{readstring pop}aload pop 4 array astore cvx +3 1 roll}repeat pop pop true}! +/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! +/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! +/Ic{exch Ix false 3 colorimage}! +/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> +/CCITTFaxDecode filter}!/FX{< -- 37 +< -- 23 ++ -- 99 +- -- 6 +* -- 183 +:= -- 627 +add.period$ -- 1 +call.type$ -- 1 +change.case$ -- 6 +chr.to.int$ -- 61 +cite$ -- 1 +duplicate$ -- 50 +empty$ -- 170 +format.name$ -- 21 +if$ -- 780 +int.to.chr$ -- 1 +int.to.str$ -- 3 +missing$ -- 0 +newline$ -- 59 +num.names$ -- 5 +pop$ -- 17 +preamble$ -- 1 +purify$ -- 5 +quote$ -- 0 +skip$ -- 245 +stack$ -- 0 +substring$ -- 301 +swap$ -- 32 +text.length$ -- 12 +text.prefix$ -- 0 +top$ -- 1 +type$ -- 45 +warning$ -- 0 +while$ -- 28 +width$ -- 0 +write$ -- 63 diff --git a/waypoint_control/sn-article-template/sn-article.log b/waypoint_control/sn-article-template/sn-article.log new file mode 100644 index 0000000..38a6a65 --- /dev/null +++ b/waypoint_control/sn-article-template/sn-article.log @@ -0,0 +1,734 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023) (preloaded format=pdflatex 2024.6.12) 4 FEB 2026 19:27 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**sn-article.tex +(./sn-article.tex +LaTeX2e <2022-11-01> patch level 1 +L3 programming layer <2023-02-22> (./sn-jnl.cls +Document Class: sn-jnl 2019/11/18 v0.1: An authoring template for Springer Jour +nal articles +(e:/latex/texlive/2023/texmf-dist/tex/latex/base/article.cls +Document Class: article 2022/07/02 v1.4n Standard LaTeX document class +(e:/latex/texlive/2023/texmf-dist/tex/latex/base/fleqn.clo +File: fleqn.clo 2016/12/29 v1.2b Standard LaTeX option (flush left equations) +\mathindent=\skip48 +Applying: [2015/01/01] Make \[ robust on input line 50. +LaTeX Info: Redefining \[ on input line 51. +Already applied: [0000/00/00] Make \[ robust on input line 62. +Applying: [2015/01/01] Make \] robust on input line 74. +LaTeX Info: Redefining \] on input line 75. +Already applied: [0000/00/00] Make \] robust on input line 83. +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2022/07/02 v1.4n Standard LaTeX file (size option) +) +\c@part=\count185 +\c@section=\count186 +\c@subsection=\count187 +\c@subsubsection=\count188 +\c@paragraph=\count189 +\c@subparagraph=\count190 +\c@figure=\count191 +\c@table=\count192 +\abovecaptionskip=\skip49 +\belowcaptionskip=\skip50 +\bibindent=\dimen140 +) +LaTeX Info: Redefining \rm on input line 146. +LaTeX Info: Redefining \sf on input line 147. +LaTeX Info: Redefining \tt on input line 148. +LaTeX Info: Redefining \bf on input line 149. +LaTeX Info: Redefining \it on input line 150. +LaTeX Info: Redefining \sl on input line 151. +LaTeX Info: Redefining \sc on input line 152. +LaTeX Info: Redefining \cal on input line 153. +LaTeX Info: Redefining \mit on input line 154. +LaTeX Info: Redefining \textsubscript on input line 212. +\columnhsize=\skip51 + +(e:/latex/texlive/2023/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2022/05/29 v1.15 key=value parser (DPC) +\KV@toks@=\toks16 +) +(e:/latex/texlive/2023/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(e:/latex/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2022/02/03 v1.0f TeX engine tests +)) +\Gm@cnth=\count193 +\Gm@cntv=\count194 +\c@Gm@tempcnt=\count195 +\Gm@bindingoffset=\dimen141 +\Gm@wd@mp=\dimen142 +\Gm@odd@mp=\dimen143 +\Gm@even@mp=\dimen144 +\Gm@layoutwidth=\dimen145 +\Gm@layoutheight=\dimen146 +\Gm@layouthoffset=\dimen147 +\Gm@layoutvoffset=\dimen148 +\Gm@dimlist=\toks17 +) +\artcatbox=\box51 +\aucount=\count196 +\corraucount=\count197 +\punctcount=\count198 +\emailcnt=\count199 +\c@affn=\count266 +\addcount=\count267 +\PacsCount=\count268 +\PacsTmpCnt=\count269 +\FMremarkdim=\dimen149 +\fmremarkbox=\box52 + +(e:/latex/texlive/2023/texmf-dist/tex/latex/sttools/cuted.sty +Package: cuted 2021/10/04 v2.0 Mixing onecolumn and twocolumn modes +\At@ViperColsBreak=\toks18 +\preCutedStrip=\toks19 +\postCutedStrip=\toks20 +\cuted@@tempbox@a=\box53 +\cuted@@tempbox@c=\box54 +\cuted@@tempbox@var=\box55 +\hold@viper=\box56 +\@viper=\box57 +\cuted@@varbox@a=\box58 +\cuted@@varbox@c=\box59 +\cuted@@tempdim@spread=\dimen150 +\cuted@@tempdim@a=\dimen151 +\cuted@@tempdim@b=\dimen152 +\ht@hold@viper=\dimen153 +\ht@viper=\dimen154 +\var@@pagediscards@ht=\dimen155 +\stripsep=\skip52 +\viper@penalty=\count270 +) +\firstpagehtcheck=\dimen156 +\labelwidthi=\dimen157 +\labelwidthii=\dimen158 +\labelwidthiii=\dimen159 +\labelwidthiv=\dimen160 +\figwidth=\dimen161 +\figheight=\dimen162 +\sidecapwidth=\dimen163 +\wrapcapline=\dimen164 +\totalwrapline=\dimen165 +\wraptotline=\dimen166 +\figurebox=\box60 +\wrapfigcapbox=\box61 +\figcapbox=\box62 +\capbox=\box63 +\headwidthskip=\skip53 +\tabcapbox=\box64 +\temptbox=\box65 +\tempdime=\dimen167 +\tabhtdime=\dimen168 + +(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty +Package: rotating 2016/08/11 v2.16d rotated objects in LaTeX + +(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR) + +(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2022/03/10 v1.4e Standard LaTeX Graphics (DPC,SPQR) + +(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2021/08/11 v1.11 sin cos tan (DPC) +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 107. + +(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2022/09/22 v1.2b Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen169 +\Gin@req@width=\dimen170 +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +Package: ifthen 2022/04/13 v1.1d Standard LaTeX ifthen package (DPC) +) +\c@r@tfl@t=\count271 +\rotFPtop=\skip54 +\rotFPbot=\skip55 +\rot@float@box=\box66 +\rot@mess@toks=\toks21 +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/threeparttable/threeparttable.sty +Package: threeparttable 2003/06/13 v 3.0 +\@tempboxb=\box67 +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/appendix/appendix.sty +Package: appendix 2020/02/08 v1.2c extra appendix facilities +\c@@pps=\count272 +\c@@ppsavesec=\count273 +\c@@ppsaveapp=\count274 +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2023-02-07 v7.00v Hypertext links for LaTeX + +(e:/latex/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(e:/latex/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) + +(e:/latex/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2022-10-05 v1.19 Key value parser (HO) +) +(e:/latex/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(e:/latex/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2022-05-17 v2.50 Cross-referencing by name of section + +(e:/latex/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(e:/latex/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +(e:/latex/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2022-06-15 v3.15 Key value format for package options (HO) +)) +\c@section@level=\count275 +) +\@linkdim=\dimen171 +\Hy@linkcounter=\count276 +\Hy@pagecounter=\count277 + +(e:/latex/texlive/2023/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2023-02-07 v7.00v Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(e:/latex/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(e:/latex/texlive/2023/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count278 + +(e:/latex/texlive/2023/texmf-dist/tex/latex/hyperref/puenc.def +File: puenc.def 2023-02-07 v7.00v Hyperref: PDF Unicode definition (HO) +Now handling font encoding PU ... +... no UTF-8 mapping file for font encoding PU +) +Package hyperref Info: Hyper figures OFF on input line 4177. +Package hyperref Info: Link nesting OFF on input line 4182. +Package hyperref Info: Hyper index ON on input line 4185. +Package hyperref Info: Plain pages OFF on input line 4192. +Package hyperref Info: Backreferencing OFF on input line 4197. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4425. +\c@Hy@tempcnt=\count279 + +(e:/latex/texlive/2023/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip16 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 4763. +\XeTeXLinkMargin=\dimen172 + +(e:/latex/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(e:/latex/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count280 +\Field@Width=\dimen173 +\Fld@charsize=\dimen174 +Package hyperref Info: Hyper figures OFF on input line 6042. +Package hyperref Info: Link nesting OFF on input line 6047. +Package hyperref Info: Hyper index ON on input line 6050. +Package hyperref Info: backreferencing OFF on input line 6057. +Package hyperref Info: Link coloring OFF on input line 6062. +Package hyperref Info: Link coloring with OCG OFF on input line 6067. +Package hyperref Info: PDF/A mode OFF on input line 6072. + +(e:/latex/texlive/2023/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2021/01/10 v1.0c Emulation of the original atbegshi +package with kernel methods +) +\Hy@abspage=\count281 +\c@Item=\count282 +\c@Hfootnote=\count283 +) +Package hyperref Info: Driver (autodetected): hpdftex. + +(e:/latex/texlive/2023/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2023-02-07 v7.00v Hyperref driver for pdfTeX + +(e:/latex/texlive/2023/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atveryend pac +kage +with kernel methods +) +\Fld@listcount=\count284 +\c@bookmark@seq@number=\count285 + +(e:/latex/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2022-07-10 v1.10 Rerun checks for auxiliary files (HO) + +(e:/latex/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +85. +) +\Hy@SectionHShift=\skip56 +) +Package hyperref Info: Option `colorlinks' set `true' on input line 1471. +Package hyperref Info: Option `breaklinks' set `true' on input line 1471. +Package hyperref Info: Option `plainpages' set `false' on input line 1471. +Package hyperref Info: Option `bookmarksopen' set `true' on input line 1471. +Package hyperref Info: Option `bookmarksnumbered' set `false' on input line 147 +1. + (e:/latex/texlive/2023/texmf-dist/tex/latex/wrapfig/wrapfig.sty +\wrapoverhang=\dimen175 +\WF@size=\dimen176 +\c@WF@wrappedlines=\count286 +\WF@box=\box68 +\WF@everypar=\toks22 +Package: wrapfig 2003/01/31 v 3.6 +) +\wraplines=\count287 +\@authorfigbox=\box69 +\@authorfigboxdim=\skip57 +\biofigadjskip=\skip58 + +(e:/latex/texlive/2023/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2020/05/29 v2.20.6 +\thm@style=\toks23 +\thm@bodyfont=\toks24 +\thm@headfont=\toks25 +\thm@notefont=\toks26 +\thm@headpunct=\toks27 +\thm@preskip=\skip59 +\thm@postskip=\skip60 +\thm@headsep=\skip61 +\dth@everypar=\toks28 +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/base/fix-cm.sty +Package: fix-cm 2020/11/24 v1.1t fixes to LaTeX + +(e:/latex/texlive/2023/texmf-dist/tex/latex/base/ts1enc.def +File: ts1enc.def 2001/06/05 v3.0e (jk/car/fm) Standard LaTeX file +LaTeX Font Info: Redeclaring font encoding TS1 on input line 47. +)) +(e:/latex/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty +Package: natbib 2010/09/13 8.31b (PWD, AO) +\bibhang=\skip62 +\bibsep=\skip63 +LaTeX Info: Redefining \cite on input line 694. +\c@NAT@ctr=\count288 +)) +(e:/latex/texlive/2023/texmf-dist/tex/latex/multirow/multirow.sty +Package: multirow 2021/03/15 v2.8 Span multiple rows of a table +\multirow@colwidth=\skip64 +\multirow@cntb=\count289 +\multirow@dima=\skip65 +\bigstrutjot=\dimen177 +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2022/04/08 v2.17n AMS math features +\@mathmargin=\skip66 + +For additional information on amsmath, use the `?' option. +(e:/latex/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2021/08/26 v2.01 AMS text + +(e:/latex/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks29 +\ex@=\dimen178 +)) +(e:/latex/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen179 +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2022/04/08 v2.04 operator names +) +\inf@bad=\count290 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count291 +\leftroot@=\count292 +LaTeX Info: Redefining \overline on input line 399. +LaTeX Info: Redefining \colon on input line 410. +\classnum@=\count293 +\DOTSCASE@=\count294 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box70 +\strutbox@=\box71 +LaTeX Info: Redefining \big on input line 722. +LaTeX Info: Redefining \Big on input line 723. +LaTeX Info: Redefining \bigg on input line 724. +LaTeX Info: Redefining \Bigg on input line 725. +\big@size=\dimen180 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count295 +LaTeX Info: Redefining \bmod on input line 905. +LaTeX Info: Redefining \pmod on input line 910. +LaTeX Info: Redefining \smash on input line 940. +LaTeX Info: Redefining \relbar on input line 970. +LaTeX Info: Redefining \Relbar on input line 971. +\c@MaxMatrixCols=\count296 +\dotsspace@=\muskip17 +\c@parentequation=\count297 +\dspbrk@lvl=\count298 +\tag@help=\toks30 +\row@=\count299 +\column@=\count300 +\maxfields@=\count301 +\andhelp@=\toks31 +\eqnshift@=\dimen181 +\alignsep@=\dimen182 +\tagshift@=\dimen183 +\tagwidth@=\dimen184 +\totwidth@=\dimen185 +\lineht@=\dimen186 +\@envbody=\toks32 +\multlinegap=\skip67 +\multlinetaggap=\skip68 +\mathdisplay@stack=\toks33 +LaTeX Info: Redefining \[ on input line 2953. +LaTeX Info: Redefining \] on input line 2954. +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(e:/latex/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(e:/latex/texlive/2023/texmf-dist/tex/latex/jknapltx/mathrsfs.sty +Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk) +\symrsfs=\mathgroup6 +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2022/06/12 v2.14 LaTeX color extensions (UK) + +(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 227. + +(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics/mathcolor.ltx) +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1353. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1357. +Package xcolor Info: Model `RGB' extended on input line 1369. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1371. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1372. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1373. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1374. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1375. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1376. +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2020/02/02 v2.0n Standard LaTeX package +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/ncctools/manyfoot.sty +Package: manyfoot 2019/08/03 v1.11 Many Footnote Levels Package (NCC) + +(e:/latex/texlive/2023/texmf-dist/tex/latex/ncctools/nccfoots.sty +Package: nccfoots 2005/02/03 v1.2 NCC Footnotes Package (NCC) +) +\MFL@columnwidth=\dimen187 +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2020/01/12 v1.61803398 Publication quality tables +\heavyrulewidth=\dimen188 +\lightrulewidth=\dimen189 +\cmidrulewidth=\dimen190 +\belowrulesep=\dimen191 +\belowbottomsep=\dimen192 +\aboverulesep=\dimen193 +\abovetopsep=\dimen194 +\cmidrulesep=\dimen195 +\cmidrulekern=\dimen196 +\defaultaddspace=\dimen197 +\@cmidla=\count302 +\@cmidlb=\count303 +\@aboverulesep=\dimen198 +\@belowrulesep=\dimen199 +\@thisruleclass=\count304 +\@lastruleclass=\count305 +\@thisrulewidth=\dimen256 +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/algorithms/algorithm.sty +Package: algorithm 2009/08/24 v0.1 Document Style `algorithm' - floating enviro +nment + +(e:/latex/texlive/2023/texmf-dist/tex/latex/float/float.sty +Package: float 2001/11/08 v1.3d Float enhancements (AL) +\c@float@type=\count306 +\float@exts=\toks34 +\float@box=\box72 +\@float@everytoks=\toks35 +\@floatcapt=\box73 +) +\@float@every@algorithm=\toks36 +\c@algorithm=\count307 +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/algorithmicx/algorithmicx.sty +Package: algorithmicx 2005/04/27 v1.2 Algorithmicx + +Document Style algorithmicx 1.2 - a greatly improved `algorithmic' style +\c@ALG@line=\count308 +\c@ALG@rem=\count309 +\c@ALG@nested=\count310 +\ALG@tlm=\skip69 +\ALG@thistlm=\skip70 +\c@ALG@Lnr=\count311 +\c@ALG@blocknr=\count312 +\c@ALG@storecount=\count313 +\c@ALG@tmpcounter=\count314 +\ALG@tmplength=\skip71 +) (e:/latex/texlive/2023/texmf-dist/tex/latex/algorithmicx/algpseudocode.sty +Package: algpseudocode + +Document Style - pseudocode environments for use with the `algorithmicx' style +) (e:/latex/texlive/2023/texmf-dist/tex/latex/listings/listings.sty +\lst@mode=\count315 +\lst@gtempboxa=\box74 +\lst@token=\toks37 +\lst@length=\count316 +\lst@currlwidth=\dimen257 +\lst@column=\count317 +\lst@pos=\count318 +\lst@lostspace=\dimen258 +\lst@width=\dimen259 +\lst@newlines=\count319 +\lst@lineno=\count320 +\lst@maxwidth=\dimen260 + +(e:/latex/texlive/2023/texmf-dist/tex/latex/listings/lstmisc.sty +File: lstmisc.sty 2023/02/27 1.9 (Carsten Heinz) +\c@lstnumber=\count321 +\lst@skipnumbers=\count322 +\lst@framebox=\box75 +) +(e:/latex/texlive/2023/texmf-dist/tex/latex/listings/listings.cfg +File: listings.cfg 2023/02/27 1.9 listings configuration +)) +Package: listings 2023/02/27 1.9 (Carsten Heinz) +\c@theorem=\count323 +\c@example=\count324 +\c@remark=\count325 +\c@definition=\count326 + +(e:/latex/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2023-01-16 L3 backend support: PDF output (pdfTeX) +\l__color_backend_stack_int=\count327 +\l__pdf_internal_box=\box76 +) +(./sn-article.aux) +\openout1 = `sn-article.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 91. +LaTeX Font Info: ... okay on input line 91. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 91. +LaTeX Font Info: ... okay on input line 91. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 91. +LaTeX Font Info: ... okay on input line 91. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 91. +LaTeX Font Info: ... okay on input line 91. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 91. +LaTeX Font Info: ... okay on input line 91. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 91. +LaTeX Font Info: ... okay on input line 91. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 91. +LaTeX Font Info: ... okay on input line 91. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 91. +LaTeX Font Info: ... okay on input line 91. +LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 91. +LaTeX Font Info: ... okay on input line 91. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: custom +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* bindingoffset: 17.07164pt +* modes: twoside +* h-part:(L,W,R)=(83.37448pt, 372.0pt, 125.06175pt) +* v-part:(T,H,B)=(73.97716pt, 552.69478pt, 218.37491pt) +* \paperwidth=597.50787pt +* \paperheight=845.04684pt +* \textwidth=372.0pt +* \textheight=552.69478pt +* \oddsidemargin=28.17613pt +* \evensidemargin=52.79176pt +* \topmargin=-19.72638pt +* \headheight=5.5pt +* \headsep=15.93355pt +* \topskip=10.0pt +* \footskip=28.45274pt +* \marginparwidth=34.1433pt +* \marginparsep=14.22636pt +* \columnsep=14.22636pt +* \skip\footins=8.0pt plus 4.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidetrue +* \@mparswitchtrue +* \@reversemargintrue +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(e:/latex/texlive/2023/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count328 +\scratchdimen=\dimen261 +\scratchbox=\box77 +\nofMPsegments=\count329 +\nofMParguments=\count330 +\everyMPshowfont=\toks38 +\MPscratchCnt=\count331 +\MPscratchDim=\dimen262 +\MPnumerator=\count332 +\makeMPintoPDFobject=\count333 +\everyMPtoPDFconversion=\toks39 +) (e:/latex/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(e:/latex/texlive/2023/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +LaTeX Info: Redefining \S on input line 91. +LaTeX Font Info: Redeclaring symbol font `AMSa' on input line 91. +LaTeX Font Info: Overwriting symbol font `AMSa' in version `normal' +(Font) U/msa/m/n --> U/msa/m/n on input line 91. +LaTeX Font Info: Overwriting symbol font `AMSa' in version `bold' +(Font) U/msa/m/n --> U/msa/m/n on input line 91. +Package hyperref Info: Link coloring ON on input line 91. + +(./sn-article.out) (./sn-article.out) +\@outlinefile=\write3 +\openout3 = `sn-article.out'. + +\c@lstlisting=\count334 +LaTeX Font Info: Calculating math sizes for size <12.045> on input line 143. + +LaTeX Font Info: Trying to load font information for U+msa on input line 143 +. + +(e:/latex/texlive/2023/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 143 +. + +(e:/latex/texlive/2023/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +LaTeX Font Info: Trying to load font information for U+rsfs on input line 14 +3. + +(e:/latex/texlive/2023/texmf-dist/tex/latex/jknapltx/ursfs.fd +File: ursfs.fd 1998/03/24 rsfs font definition file (jk) +) + +LaTeX Font Warning: Font shape `U/rsfs/m/n' in size <8.43146> not available +(Font) size <8> substituted on input line 143. + +LaTeX Font Info: Calculating math sizes for size <11.04124> on input line 14 +3. + +LaTeX Font Warning: Font shape `U/rsfs/m/n' in size <5.52061> not available +(Font) size <6> substituted on input line 143. + +LaTeX Font Info: Calculating math sizes for size <10.03749> on input line 14 +3. + +Underfull \vbox (badness 10000) has occurred while \output is active [] + + [1 + +{e:/latex/texlive/2023/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./sn-art +icle.bbl) +Underfull \vbox (badness 10000) has occurred while \output is active [] + + [2] +(./sn-article.aux) + +LaTeX Font Warning: Size substitutions with differences +(Font) up to 0.47939pt have occurred. + + +Package rerunfilecheck Warning: File `sn-article.out' has changed. +(rerunfilecheck) Rerun to get outlines right +(rerunfilecheck) or use package `bookmark'. + +Package rerunfilecheck Info: Checksums for `sn-article.out': +(rerunfilecheck) Before: C25210F02B5B23771470D033D554A391;1899 +(rerunfilecheck) After: 05C3943D0FBC0B5585043DC85D1B3518;2077. + ) +Here is how much of TeX's memory you used: + 14224 strings out of 476025 + 221736 string characters out of 5791021 + 1860382 words of memory out of 5000000 + 34421 multiletter control sequences out of 15000+600000 + 530461 words of font info for 103 fonts, out of 8000000 for 9000 + 1151 hyphenation exceptions out of 8191 + 90i,7n,90p,521b,444s stack positions out of 10000i,1000n,20000p,200000b,200000s + +< +e:/latex/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb> +Output written on sn-article.pdf (2 pages, 140574 bytes). +PDF statistics: + 136 PDF objects out of 1000 (max. 8388607) + 106 compressed objects within 2 object streams + 19 named destinations out of 1000 (max. 500000) + 97 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/waypoint_control/sn-article-template/sn-article.out b/waypoint_control/sn-article-template/sn-article.out new file mode 100644 index 0000000..9323494 --- /dev/null +++ b/waypoint_control/sn-article-template/sn-article.out @@ -0,0 +1,13 @@ +\BOOKMARK [1][]{section.1}{\376\377\000I\000n\000t\000r\000o\000d\000u\000c\000t\000i\000o\000n}{}% 1 +\BOOKMARK [1][]{section.2}{\376\377\000R\000e\000s\000u\000l\000t\000s}{}% 2 +\BOOKMARK [2][]{subsection.2.1}{\376\377\000T\000w\000i\000n\000\040\000s\000y\000s\000t\000e\000m\000\040\000a\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{section.2}% 3 +\BOOKMARK [2][]{subsection.2.2}{\376\377\000E\000n\000d\000-\000t\000o\000-\000e\000n\000d\000\040\000d\000a\000t\000a\000\040\000t\000r\000a\000n\000s\000m\000i\000s\000s\000i\000o\000n}{section.2}% 4 +\BOOKMARK [2][]{subsection.2.3}{\376\377\000F\000a\000c\000e\000\040\000d\000i\000f\000f\000e\000r\000e\000n\000t\000\040\000t\000a\000r\000g\000e\000t\000s}{section.2}% 5 +\BOOKMARK [3][]{subsubsection.2.3.1}{\376\377\000P\000e\000d\000e\000s\000t\000r\000i\000a\000n\000\040\000t\000w\000i\000n}{subsection.2.3}% 6 +\BOOKMARK [3][]{subsubsection.2.3.2}{\376\377\000V\000e\000h\000i\000c\000l\000e\000\040\000t\000w\000i\000n}{subsection.2.3}% 7 +\BOOKMARK [3][]{subsubsection.2.3.3}{\376\377\000P\000e\000d\000e\000s\000t\000r\000i\000a\000n\000-\000V\000e\000h\000i\000c\000l\000e\000\040\000t\000w\000i\000n}{subsection.2.3}% 8 +\BOOKMARK [2][]{subsection.2.4}{\376\377\000T\000w\000i\000n\000s\000\040\000i\000n\000\040\000d\000i\000f\000f\000e\000r\000e\000n\000t\000\040\000s\000c\000e\000n\000a\000r\000i\000o\000s}{section.2}% 9 +\BOOKMARK [3][]{subsubsection.2.4.1}{\376\377\000T\000o\000w\000n\0000\0001\000\040\000s\000c\000e\000n\000e\000\040\000t\000w\000i\000n\000n\000i\000n\000g\000\040\000e\000f\000f\000e\000c\000t}{subsection.2.4}% 10 +\BOOKMARK [3][]{subsubsection.2.4.2}{\376\377\000T\000o\000w\000n\0001\0000\000\040\000s\000c\000e\000n\000e\000\040\000t\000w\000i\000n\000n\000i\000n\000g\000\040\000e\000f\000f\000e\000c\000t}{subsection.2.4}% 11 +\BOOKMARK [2][]{subsection.2.5}{\376\377\000C\000r\000i\000t\000i\000c\000a\000l\000-\000S\000t\000a\000t\000e\000\040\000T\000w\000i\000n}{section.2}% 12 +\BOOKMARK [1][]{section.3}{\376\377\000D\000i\000s\000c\000u\000s\000s\000i\000o\000n}{}% 13 diff --git a/waypoint_control/sn-article-template/sn-article.pdf b/waypoint_control/sn-article-template/sn-article.pdf new file mode 100644 index 0000000000000000000000000000000000000000..574aecf7ef317f679a5113dcd3d9df85d04a1d57 GIT binary patch literal 140574 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

$0 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 X4j;*URe>NdH8r>zNJ0W>p%3~O`r!!b literal 0 HcmV?d00001 diff --git a/waypoint_control/sn-article-template/sn-article.synctex.gz b/waypoint_control/sn-article-template/sn-article.synctex.gz new file mode 100644 index 0000000000000000000000000000000000000000..802761156eb201128f98ab1443f184a938e4bc95 GIT binary patch literal 8486 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 Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesClass{sn-jnl} [2019/11/18 v0.1: An authoring template for Springer Journal articles] \newif\if@restonecol \newif\if@titlepage \@titlepagefalse \newif\if@cropmarkson \@cropmarksonfalse \newif\ifDoublecol \Doublecolfalse% \newif\ifpagebody\global\pagebodyfalse% \newif\if@iicol\global\@iicolfalse% \newif\if@bibcomment\global\@bibcommentfalse% \newif\if@referee\global\@refereefalse% \newif\if@vrulerlinenumberon\global\@vrulerlinenumberonfalse% \newif\if@pdflatex\global\@pdflatexfalse% \newif\if@remarkboxon\global\@remarkboxonfalse% \newif\if@Numbered@refstyle\global\@Numbered@refstylefalse% Namedate \newif\if@Spr@basic@refstyle\global\@Spr@basic@refstylefalse% 1.Basic Springer Nature Reference Style/Chemistry Reference Style -> sn-basic.bst \newif\if@Mathphys@numrefstyle\global\@Mathphys@numrefstylefalse% 2.Math and Physical Sciences Reference Style -> sn-mathphys.bst \newif\if@Mathphys@ayrefstyle\global\@Mathphys@ayrefstylefalse% 2.Math and Physical Sciences Reference Style -> sn-mathphys.bst \newif\if@APS@refstyle\global\@APS@refstylefalse% 3.American Physical Society (APS) Reference Style -> sn-APS.bst \newif\if@Vancouver@numrefstyle\global\@Vancouver@numrefstylefalse% 4.Vancouver Reference Style -> sn-vancouver.bst \newif\if@Vancouver@ayrefstyle\global\@Vancouver@ayrefstylefalse% 4.Vancouver Reference Style -> sn-vancouver.bst \newif\if@APA@refstyle\global\@APA@refstylefalse% 5.APA-based Social Sciences/Psychology Reference Style -> sn-apacite.bst \newif\if@Chicago@refstyle\global\@Chicago@refstylefalse% 6.Chicago-based Humanities Reference Style -> sn-chicago.bst \newif\if@Standard@Nature@refstyle\global\@Standard@Nature@refstylefalse% 7.Standard Nature Research Style -> sn-nature.bst %% Template Options \DeclareOption{a4paper}{\PassOptionsToPackage{a4}{crop}} \DeclareOption{a3paper}{\PassOptionsToClass{a3paper}{article}\PassOptionsToPackage{a3}{crop}} \DeclareOption{centre}{\PassOptionsToPackage{center}{crop}} \DeclareOption{crop}{\PassOptionsToPackage{frame}{crop}\global\@cropmarksontrue} \DeclareOption{nocrop}{\PassOptionsToPackage{off}{crop}\global\@cropmarksontrue} \DeclareOption{info}{\PassOptionsToPackage{info}{crop}} \DeclareOption{noinfo}{\PassOptionsToPackage{noinfo}{crop}} %% Classfile Options \DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse} \DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} \DeclareOption{draft}{\setlength\overfullrule{5pt}} \DeclareOption{titlepage}{\@titlepagetrue} \DeclareOption{notitlepage}{\@titlepagefalse} \DeclareOption{onecolumn}{\@twocolumnfalse} \DeclareOption{twocolumn}{\@twocolumntrue} \DeclareOption{openbib}{\let\if@openbib\iftrue} \DeclareOption{pagegrid}{\global\pagebodytrue}% \DeclareOption{iicol}{\global\@iicoltrue}% \DeclareOption{bibcomment}{\global\@bibcommenttrue}% \DeclareOption{referee}{\global\@refereetrue}% \DeclareOption{lineno}{\global\@vrulerlinenumberontrue}% \DeclareOption{pdflatex}{\global\@pdflatextrue}% \DeclareOption{remarkboxoff}{\global\@remarkboxonfalse}% \DeclareOption{sn-basic}{\global\@Spr@basic@refstyletrue}% \DeclareOption{sn-mathphys-num}{\global\@Mathphys@numrefstyletrue}% \DeclareOption{sn-mathphys-ay}{\global\@Mathphys@ayrefstyletrue}% \DeclareOption{sn-aps}{\global\@APS@refstyletrue}% \DeclareOption{sn-vancouver-num}{\global\@Vancouver@numrefstyletrue}% \DeclareOption{sn-vancouver-ay}{\global\@Vancouver@ayrefstyletrue}% \DeclareOption{sn-apa}{\global\@APA@refstyletrue}% \DeclareOption{sn-chicago}{\global\@Chicago@refstyletrue}% \DeclareOption{sn-nature}{\global\@Standard@Nature@refstyletrue}% \DeclareOption{Numbered}{\global\@Numbered@refstyletrue}% %\DeclareOption{NameDate}{\global\@Numbered@refstylefalse}% %%\ExecuteOptions{twosidecrop,crop,centre,info,croppage} \ProcessOptions \LoadClass[twoside,fleqn]{article} \gdef\refereedefns{% \if@referee% \usepackage{setspace}% \doublespacing% \fi}% \refereedefns% %% General Packages Used % %\AtBeginDocument{% %%\newcommand*\ExtraParaSkip{12pt}% %\SetFootnoteHook{\hspace*{-8pt}}% %\DeclareNewFootnote{A}[gobble]% %\setlength{\skip\footinsA}{0pt} %}% % %%%%%%%%%%%%%%%%%%%%%%%%%%%% Fonts & Sizes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %% Fonts Used %%\RequirePackage[T1]{fontenc}% % \DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}% \DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}% \DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}% \DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}% \DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}% \DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}% \DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}% \DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal}% \DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal}% % \renewcommand\normalsize{% \@setfontsize\normalsize{10bp}{12bp}% \abovedisplayskip 12\p@ \@plus2\p@ \@minus1\p@ \abovedisplayshortskip \z@ \@plus3\p@% \belowdisplayshortskip 3\p@ \@plus3\p@ \@minus3\p@% \belowdisplayskip \abovedisplayskip% \let\@listi\@listI}% \normalsize% % \newcommand\medsize{% \@setfontsize\small\@xipt{13}% \abovedisplayskip 5\p@ \@plus3\p@ \@minus4\p@ \abovedisplayshortskip \z@ \@plus2\p@ \belowdisplayshortskip 3\p@ \@plus2\p@ \@minus2\p@ \def\@listi{\leftmargin\leftmargini \topsep 4\p@ \@plus2\p@ \@minus2\p@ \parsep 2\p@ \@plus\p@ \@minus\p@ \itemsep \parsep}% \belowdisplayskip \abovedisplayskip}% % \renewcommand\small{% \@setfontsize\small\@ixpt{11}% \abovedisplayskip 5\p@ \@plus3\p@ \@minus4\p@ \abovedisplayshortskip \z@ \@plus2\p@ \belowdisplayshortskip 3\p@ \@plus2\p@ \@minus2\p@ \def\@listi{\leftmargin\leftmargini \topsep 4\p@ \@plus2\p@ \@minus2\p@ \parsep 2\p@ \@plus\p@ \@minus\p@ \itemsep \parsep}% \belowdisplayskip \abovedisplayskip}% % \renewcommand\footnotesize{% \@setfontsize\footnotesize{7}{8}% \abovedisplayskip 5\p@ \@plus2\p@ \@minus4\p@ \abovedisplayshortskip \z@ \@plus\p@ \belowdisplayshortskip 3\p@ \@plus\p@ \@minus2\p@ \def\@listi{\leftmargin\leftmargini \topsep 3\p@ \@plus\p@ \@minus\p@ \parsep 2\p@ \@plus\p@ \@minus\p@ \itemsep \parsep}% \belowdisplayskip \abovedisplayskip} % \renewcommand\scriptsize{\@setfontsize\scriptsize\@ixpt\@ixpt}% \newcommand\scrisize{\@setfontsize\scrisize{9.3}{9}}% \renewcommand\tiny{\@setfontsize\tiny\@vpt\@vipt}% \renewcommand\large{\@setfontsize\large{12}{14}}% \newcommand\larg{\@setfontsize\larg{11}{13}}% \renewcommand\Large{\@setfontsize\Large{16}{18}}% \renewcommand\LARGE{\@setfontsize\LARGE\@xviipt{22}}% \renewcommand\huge{\@setfontsize\huge\@xxpt{25}}% \renewcommand\Huge{\@setfontsize\Huge\@xxvpt{30}}% % \DeclareMathSizes{\@ixpt}{\@ixpt}{7}{5}% \DeclareMathSizes{\@xpt}{\@xpt}{7}{5}% \DeclareMathSizes{\@xipt}{\@xipt}{7}{5}% % \DeclareRobustCommand*\textsubscript[1]{% \@textsubscript{\selectfont#1}}% % \def\@textsubscript#1{% {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}}% % %%%%%%%%%%%%%%%%%%%%%%%%%%%% Layout Settings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%\RequirePackage{geometry}% % \newlength\columnhsize% % %% Regular Pages (for Opening page - redefined) % \if@iicol% % %% for double column used sn-medium design trim and page size %% % \setlength\headheight{12pt}% \setlength\headsep{5.15mm}% % \setlength\columnsep{8mm}% \setlength\columnhsize{76mm}% % \setlength\maxdepth{0pt}% \setlength\footnotesep{7\p@}% \setlength{\skip\footins}{18\p@ \@plus 6\p@ \@minus 3\p@}% % \RequirePackage[% reversemp, paperwidth=210mm, paperheight=297mm, top={26mm}, headheight={12pt}, headsep={5.15mm}, text={160mm,216mm}, marginparsep=5mm, marginparwidth=12mm, bindingoffset=6mm, footskip=10.13mm,twocolumn]{geometry}% % \renewcommand\footnoterule{% \kern3\p@% \hrule \@height.2mm \@width\columnwidth% \kern5.5\p@}% % \else% %% For single column used smallcond design trim and page size %% \RequirePackage[% reversemp, paperwidth=210mm, paperheight=297mm, top={26mm}, headheight={5.5pt}, headsep={5.6mm}, text={31pc,194.25mm}, marginparsep=5mm, marginparwidth=12mm, bindingoffset=6mm, footskip=10mm]{geometry} % \setlength\maxdepth{0pt}% \setlength\columnsep{5mm}% \setlength{\marginparsep}{5mm}% \setlength{\marginparwidth}{12mm}% \setlength\footnotesep{5.75\p@}% \setlength{\skip\footins}{8\p@ \@plus 4\p@ \@minus 0\p@}% % \renewcommand\footnoterule{% \kern3\p@% \ifodd\c@page% \hrule \@height.2mm \@width\textwidth% \else% \hrule \@height.2mm \@width37mm \fi% \kern5.5\p@}% % \fi% % % \setlength\parindent{1.5em}% % \def\StepUpCounter#1{\global\advance#1by 1\relax}% \def\StepDownCounter#1{\global\advance#1by -1\relax}% % %%%%%%%%%%%%%%%%%%%%%%%%%%%% Pagination Settings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Line spacing \setlength\lineskip{1\p@}% \setlength\normallineskip{1\p@}% %%\renewcommand\baselinestretch{1.5}% \parskip=0pt% % % Page break penalties % \@lowpenalty 51 \@medpenalty 151 \@highpenalty 301 % % Disallow widows and orphans % \clubpenalty 10000 \widowpenalty 10000 % % Disable page breaks before equations, allow pagebreaks after % equations and discourage widow lines before equations. % \displaywidowpenalty 100 \predisplaypenalty 10000 \postdisplaypenalty 0 % % Set these global demerits % \doublehyphendemerits 1000000 % corresponds to badness 800 \finalhyphendemerits 1000000 % corresponds to badness 1000 % % Allow loose lines rather than overfull lines % \vbadness=9999 \tolerance=9999 % % Allow breaking the page in the middle of a paragraph % \interlinepenalty 0 % % Disallow breaking the page after a hyphenated line \brokenpenalty 10000 % % Hyphenation; don't split words into less than three characters \lefthyphenmin=3 \righthyphenmin=3 % % Float placement parameters % % The total number of floats that can be allowed on a page. \setcounter{totalnumber}{3} % % The maximum number of floats at the top and bottom of a page. \setcounter{topnumber}{5} \setcounter{bottomnumber}{5} % % The maximum part of the top or bottom of a text page that can be % occupied by floats. This is set so that at least four lines of text % fit on the page. \renewcommand\topfraction{.921} \renewcommand\bottomfraction{.921} % The minimum amount of a text page that must be occupied by text. % This should accomodate four lines of text. \renewcommand\textfraction{.13} % The minimum amount of a float page that must be occupied by floats. \renewcommand\floatpagefraction{.887} % The same parameters repeated for double column output \renewcommand\dbltopfraction{.88} \renewcommand\dblfloatpagefraction{.88} % Space between floats \setlength\floatsep{18\p@ \@plus 4\p@ \@minus 2\p@} % Space between floats and text \setlength\textfloatsep{15\p@ \@plus 4\p@ \@minus 2\p@} % Space above and below an inline figure \setlength\intextsep {18\p@ \@plus 4\p@ \@minus 2\p@} % For double column floats \setlength\dblfloatsep {20\p@ \@plus 4\p@ \@minus 2\p@} \setlength\dbltextfloatsep{15\p@ \@plus 4\p@ \@minus 2\p@} \hyphenation{Figure Figures Table Tables Equation Equations Section Sections Appendix Theorem Lemma} % %%%%%%%%%%%%%%%%%%%%%%%%%%% Math Settings %%%%%%%%%%%%%%%%%%%%%%%%%%% % %%%%%%%%%%%%%%%%%%%%%%%%%%%% For above/below spacing \def\eqnarray{% \stepcounter{equation}% \def\@currentlabel{\p@equation\theequation}% \global\@eqnswtrue \m@th \global\@eqcnt\z@ \tabskip\@centering \let\\\@eqncr $$\everycr{}\halign to\displaywidth\bgroup \hskip\@centering$\displaystyle\tabskip\z@skip{##}$\@eqnsel &\global\@eqcnt\@ne\hskip \tw@\arraycolsep \hfil${##}$\hfil &\global\@eqcnt\tw@ \hskip \tw@\arraycolsep $\displaystyle{##}$\hfil\tabskip\@centering &\global\@eqcnt\thr@@ \hb@xt@\z@\bgroup\hss##\egroup \tabskip\z@skip \cr } \def\endeqnarray{% \@@eqncr \egroup \global\advance\c@equation\m@ne $$\@ignoretrue } % %%%%%%%%%%%%%%%%%%%%%%%%%%% Titles %%%%%%%%%%%%%%%%%%%%%%%%%%% % \renewcommand\refname{References}% \renewcommand\figurename{Fig.}% defined as per springer style \renewcommand\tablename{Table}% \renewcommand\appendixname{Appendix}% \renewcommand\abstractname{Abstract}% % %%%%%%%%%%%%%%%%%%%%%%%%%%% Article Front Matter %%%%%%%%%%%%%%%%%%%%%%%%%%% % \def\raggedleft{\leftskip0pt plus 1fil\parfillskip=0pt\relax}% \def\raggedright{\rightskip0pt plus 1fil\parfillskip=0pt\relax}% \def\raggedcenter{\leftskip=0pt plus 0.5fil\rightskip=0pt plus 0.5fil% \parfillskip=0pt\let\hb=\break}% \def\titraggedcenter{\leftskip=12pt plus 0.5fil\rightskip=12pt plus 0.5fil% \parfillskip=0pt\let\hb=\break}% \def\absraggedcenter{\leftskip=24pt plus 0.5fil\rightskip=24pt plus 0.5fil% \parfillskip=0pt\let\hb=\break}% % %%% Font Def \def\Artcatfont{\reset@font\fontsize{8bp}{10bp}\selectfont}% \def\Titlefont{\reset@font\fontsize{17bp}{22.5bp}\selectfont\titraggedcenter}% \def\SubTitlefont{\reset@font\fontsize{14bp}{16.5bp}\selectfont\titraggedcenter}% \def\Authorfont{\reset@font\fontsize{12bp}{14.5bp}\selectfont\boldmath\titraggedcenter}% \def\addressfont{\reset@font\fontsize{11bp}{13.5bp}\selectfont\titraggedcenter}% \def\abstractheadfont{\reset@font\fontsize{9bp}{11bp}\bfseries\selectfont\titraggedcenter}% \def\abstractsubheadfont{\reset@font\fontsize{9bp}{11bp}\bfseries\selectfont}% \def\abstractfont{\reset@font\fontsize{9bp}{11bp}\selectfont\leftskip=24pt\rightskip=24pt\parfillskip=0pt plus 1fil}% \def\keywordfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont\leftskip=24pt\rightskip=24pt plus0.5fill}% \def\historyfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont\leftskip=24pt\rightskip=24pt plus0.5fill}% %% Article Type \newbox\artcatbox% \def\articletype#1{\if!#1!\else\setbox\artcatbox\hbox{\Artcatfont\hskip1mm#1\hskip1mm}\fi% \gdef\ArtType{\fboxsep=0pt{\vbox to 4mm{\vfil% {\raggedright\box\artcatbox}\vfil}}}% \gdef\@ArtType{#1}}% %%\articletype{RESEARCH ARTICLE}% \articletype{}% %% Article Title \renewcommand{\title}[2][]{% \gdef\@checktitle{#1}\ifx\@checktitle\empty\gdef\@title{#2}% \gdef\s@title{#2}\else\gdef\@title{#2}\gdef\s@title{#1}\fi% \markboth{\textit{\s@title}}{\textit{\s@title}}}% \def\subtitle#1{\gdef\@subtitle{#1}}\subtitle{}% %% Cross Link for Author & Address \def\jmkLabel#1{\@bsphack\protected@write\@auxout{}{\string\Newlabel{#1}{\@currentlabel}}\@esphack}% \def\Newlabel#1#2{\expandafter\xdef\csname X@#1\endcsname{#2}}% \def\jmkRef#1{\@ifundefined{X@#1}{0}{\csname X@#1\endcsname}}% %% Article Author(s) \let\sep\@empty% \let\authorsep\@empty% \newcount\aucount% \newcount\corraucount% \newcount\punctcount% % \def\artauthors{}% \newif\if@auemail% \newif\if@corauemail% % \def\au@and{\ifnum\punctcount=2\ and\else\unskip, \advance\punctcount by -1 \fi}% % \def\author{\advance\aucount by 1\@ifstar\@@corrauthor\@@author}% % \newcommand{\@@author}[2][]{\def\@authfrstarg{#1}\@corauemailfalse% \g@addto@macro\artauthors{% \ifnum\aucount=1% \global\@auemailtrue% \else% \global\@auemailfalse% \fi% \Authorfont% \def\baselinestretch{1}% \authorsep{#2}\unskip\ifx\@authfrstarg\empty\else\textsuperscript{\smash{{% \@for\@@affmark:=#1\do{\edef\affnum{\@ifundefined{X@\@@affmark}{\@@affmark}{\jmkRef{\@@affmark}}}% \unskip\sep\affnum\let\sep=,}}}}\fi% \def\authorsep{{\au@and} }%%% \global\let\sep\@empty\global\let\@corref\@empty% }}% % \newcommand{\@@corrauthor}[2][]{\def\@authfrstarg{#1}\@corauemailtrue\advance\corraucount by 1% \g@addto@macro\artauthors{% \global\@auemailtrue% \Authorfont% \def\baselinestretch{1}% \authorsep{#2}\unskip\ifx\@authfrstarg\empty\else\textsuperscript{\smash{{% \@for\@@affmark:=#1\do{\edef\affnum{\@ifundefined{X@\@@affmark}{\@@affmark}{\jmkRef{\@@affmark}}}% \unskip\sep\affnum\let\sep=,}}}{*}\hskip-1pt}\fi\unskip% \def\authorsep{\au@and~}%%% \global\let\sep\@empty\global\let\@corref\@empty% }}% %% %% Miscellaneous macros %% %% \def\fnm#1{\leavevmode\hbox{#1}}% \def\sur#1{\unskip~\nobreak\leavevmode\hbox{#1}}% \def\spfx#1{#1}% \def\pfx#1{#1}% \def\sfx#1{#1}% \def\tanm#1{#1}% \def\dgr#1{#1}% % %% Author Email % \let\nomail\relax% \def\corrauthemail{}% \def\authemail{}% \newcount\emailcnt% \def\email#1{\global\advance\emailcnt by 1\relax% \if@corauemail% \g@addto@macro\corrauthemail{% \setcounter{footnote}{0}% \textcolor{blue}{#1};\ % }% \else% \g@addto@macro\authemail{% \setcounter{footnote}{0}% \textcolor{blue}{#1};\ % }% \fi} %% Corrseponding Address \def\@copycorthanks{}% \def\auaddress{}% \def\@auaddress{}% \newcounter{affn}% \newcount\addcount% To check the count of address \renewcommand\theaffn{\arabic{affn}}% \def\affil{\advance\addcount by 1\@ifstar\@@coraddress\@@address}% \newcommand{\@@coraddress}[2][]{%\advance\addcount by 1 \g@addto@macro\auaddress{% \stepcounter{affn}% \xdef\@currentlabel{\theaffn}% \jmkLabel{\theaffn}% {\textsuperscript{#1*}#2.\par} } } %% Macros for present address \newif\ifpresentaddress% \def\@presentaddresstxt{}% \def\presentaddresstxt#1{\gdef\@presentaddresstxt{#1:}}\presentaddresstxt{Present Address}% \newcommand{\presentaddress}[1]{\gdef\@presentaddresstext{\@presentaddresstxt\par#1}\global\presentaddresstrue}% %% Macros for equally contributed \newif\ifequalcont% %\def\@equalconttxt{}% %\def\equalcontxt#1{\gdef\@equalconttxt{#1}}\equalcontxt{These authors contributed equally to this work.}% %\newcommand{\equalcont}[1][\@equalconttxt]{\gdef\@equalconttext{#1}\g@addto@macro\artauthors{$^{\dagger}$}\global\equalconttrue}% \def\@equalconttxt{}% \def\equalcontxt#1{\gdef\@equalconttxt{#1}}\equalcontxt{}% \newcommand{\equalcont}[1]{\gdef\@equalconttext{#1}\g@addto@macro\artauthors{$^{\dagger}$}\global\equalconttrue}% %% Author Address \newcommand{\@@address}[2][]{%%\advance\addcount by 1 \g@addto@macro\auaddress{% \stepcounter{affn}% \xdef\@currentlabel{\theaffn}% \jmkLabel{\theaffn}% {\textsuperscript{#1}#2.\par} }%\theaffn } %% Address tagging \newcommand{\orgdiv}[1]{#1}% \newcommand{\orgname}[1]{#1}% \newcommand{\orgaddress}[1]{#1}% \newcommand{\street}[1]{#1}% \newcommand{\postcode}[1]{#1}% \newcommand{\city}[1]{#1}% \newcommand{\state}[1]{#1}% \newcommand{\country}[1]{#1}% %% Article notes \def\@artnote{}% \def\artnote#1{\gdef\@artnote{#1}}% %% Miscellaneous notes \def\@miscnote{}% \def\miscnote#1{\gdef\@miscnote{\par\addvspace{3pt}#1}}% %% Motto \def\mottofont{\reset@font\fontfamily{\rmdefault}\fontsize{8.5bp}{10bp}\fontshape{it}\selectfont\raggedright} % \let\@motto\@empty \def\mottoraggedright{\rightskip0mm\leftskip=42mm plus 1fil\parfillskip=0pt\relax}% \newcommand{\motto}[2][]{\gdef\@headcheck{#1}\gdef\@motto{\@headcheck\ifx\@headcheck\@empty\vskip12pt\else\fi{\mottofont\mottoraggedright#2\par}}} %% Article Abstract \newcommand\abstracthead{\@startsection {section}{1}{\z@}{-22pt \@plus0ex \@minus0ex}{3pt}{\abstractheadfont}} \newcommand\subabstracthead{\@startsection{subsection}{2}{\z@}{3pt \@plus0ex \@minus0ex}{-.5em}{\abstractsubheadfont}} \def\@abstract{}% \long\def\abstract#1{\def\@abstract{% \let\paragraph\subabstracthead% \abstractfont% \abstracthead*{\abstractname}% #1\par}}% \def\printabstract{\ifx\@abstract\empty\else\@abstract\fi\par}% \def\printkeywords{\ifx\@keywords\empty\else\@keywords\fi\par}% % %% Keywords \def\keywordname{Keywords}% \def\keywords#1{\ifx#1\empty\else\def\@keywords{\par\addvspace{10pt}{\keywordfont{\bfseries\keywordname:} #1\par}}\fi}% \def\@keywords{}% %% PACs \def\pacsbullet{\hbox{\hskip2.5pt,\hskip2.5pt}}% \def\change@commas#1,#2{% \ifx#2\@empty% #1% \else% #1\nobreak\hbox{\pacsbullet}\allowbreak\expandafter\change@commas% \fi% #2}% \newcommand\keywordhead[1]{\par\addvspace{10pt}% {{\keywordfont\bfseries#1:\ }}}% \newcommand{\pacs}[1]{\keywordhead{\pacsname}#1}% % \newcount\PacsCount% \PacsCount=0% % \newcount\PacsTmpCnt% \PacsTmpCnt=1% % \gdef\StorePacsText#1#2{% \edef\GetRoman{\romannumeral#1}% \expandafter\gdef\csname\GetRoman StorePacsTxt\endcsname{#2}% }% % \let\oldpacs\pacs% \renewcommand\pacs[2][PAC Codes]{\gdef\pacsname{{\bfseries#1}}\gdef\@pacs{\keywordfont\raggedright\oldpacs\change@commas#2,\@empty\par} \StepUpCounter{\PacsCount}% \StorePacsText{\the\PacsCount}{\gdef\pacsname{{\bfseries#1}}\keywordfont\raggedright\oldpacs\change@commas#2,\@empty}% }% \def\@pacs{}% %% Glossary \def\gloshead{Glossary}% \newenvironment{glos}[1][\gloshead]{\begingroup\parindent=0pt% \section*{#1} \def\item[##1]{##1,\ }}{% \endgroup}% % %% Article History \def\received#1{\g@addto@macro\@history{{Received #1}}}% \def\revised#1{\g@addto@macro\@history{{; revised #1}}}% \def\accepted#1{\g@addto@macro\@history{{; accepted #1}}}% %% Remark on Front page %% \newdimen\FMremarkdim% \newcommand{\FMremark}{\begingroup\parindent=0pt\parskip=0pt% \if@referee\singlespacing\fi% \fboxsep=6pt\fboxrule=0.5pt% \FMremarkdim=\textwidth%%\paperwidth% \advance\FMremarkdim-\fboxsep% \advance\FMremarkdim-2\fboxrule% \if@referee\vskip-21pt\fi% %%\fbox{\vbox{\hsize=\FMremarkdim\small% \unvbox\fmremarkbox %%}}% \endgroup} \newbox\fmremarkbox% \newenvironment{fmremark}{\begingroup\parindent=0pt% \fboxsep=6pt\fboxrule=0.5pt% \FMremarkdim=\textwidth%%\paperwidth% \advance\FMremarkdim-\fboxsep% \advance\FMremarkdim-2\fboxrule% \global\setbox\fmremarkbox\vbox\bgroup\small% }{\egroup\endgroup} %% Article Header Definition \renewcommand{\@maketitle}{\newpage\null% \if@remarkboxon\vbox to 0pt{\vspace*{-78pt}\hspace*{-18pt}\FMremark}\else\vskip21pt\fi%%\par% \hsize\textwidth\parindent0pt%%%\vskip7pt% %% Aritle Type {\hbox to \textwidth{{\Artcatfont\ArtType\hfill}\par}} %% Aritle Title \ifx\@title\empty\else% \removelastskip\vskip20pt\nointerlineskip% {\Titlefont\@title\par} %\addcontentsline{toc}{chapter}{\@title}% for bookmarks \fi% %% Aritle SubTitle \ifx\@subtitle\empty\else% \vskip9pt% {{\SubTitlefont\@subtitle\par}} \fi% %% Aritle Authors, Address and Correspondings \ifnum\aucount>0 \global\punctcount\aucount% \vskip20pt% \artauthors\par%% authors and emails {\vskip7pt\addressfont\auaddress\par%% corresponding adress \removelastskip\vskip24pt% \ifnum\emailcnt>0\relax% \ifx\corrauthemail\@empty\else{\ifnum\aucount>1*\fi}% Corresponding author(s). E-mail(s): \corrauthemail\par\fi% \ifx\authemail\@empty\else Contributing authors:\ \authemail\fi% \fi% \ifequalcont{\par$^{\dagger}$\@equalconttext\par}\fi% \removelastskip\vskip24pt% \ifpresentaddress{\par\@presentaddresstext\par}\fi% } \fi% {\printabstract\par}% {\printkeywords\par}% \ifx\@pacs\empty\else% \loop\ifnum\PacsCount>0% \csname\romannumeral\PacsTmpCnt StorePacsTxt\endcsname\par% \StepDownCounter{\PacsCount}% \StepUpCounter{\PacsTmpCnt}% \repeat% \fi% %%{\printhistory\par}% %%{\ifx\@motto\empty\else\@motto\fi}% \removelastskip\vskip36pt\vskip0pt}% \usepackage{cuted}% \@ifpackageloaded{cuted}{\gdef\@setmarks{}}{}% %% Printing Article Header \newdimen\firstpagehtcheck \renewcommand\maketitle{\par \@afterindentfalse% \begingroup \gdef\UrlFont{\rmfamily}% \renewcommand\thefootnote{\@fnsymbol\c@footnote}% \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\smash{\@thefnmark}}}}% \long\def\@makefntext##1{\parindent 1em\noindent\small\selectfont \hbox{\@textsuperscript{\normalfont\@thefnmark}}##1}% \if@twocolumn \ifnum \col@number=\@ne% \setbox0=\vbox{\@maketitle} \firstpagehtcheck=\ht0% \advance\firstpagehtcheck by \dp0% \ifdim\firstpagehtcheck>\textheight% \setbox1=\vsplit0to2\textheight% \setbox1=\vbox{\unvbox1}% \setbox2=\vbox{\unvbox0}% \unvbox1% \stripsep=0pt% \begin{strip} \unvbox2% \end{strip} \else \twocolumn[\@maketitle]% \fi \else \@maketitle \fi% \else% \newpage% \global\@topnum\z@% Prevents figures from going at top of page. \@maketitle% \fi% \endgroup% \ifx\@artnote\@empty\else\footnoteA{\@artnote}\fi% \ifx\@miscnote\@empty\else\footnoteA{\@miscnote\par}\fi% \setcounter{footnote}{0}% \global\let\thanks\relax% \global\let\artnote\relax% \global\let\maketitle\relax% \global\let\@maketitle\relax% \global\let\@thanks\@empty% \global\let\@author\@empty% \global\let\@date\@empty% \global\let\title\relax% \global\let\author\relax% \global\let\date\relax% \global\let\and\relax% \pagestyle{headings}% %%%print continuous abstract on next page \@afterheading% %%\vskip-18pt% this is included to avoid vertical space at the beginning of left column on article opening pages }% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Page Styles %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \def\opheaderfont{\reset@font\fontsize{10bp}{0bp}\selectfont}% \def\headerfont{\reset@font\fontsize{10bp}{0bp}\selectfont}% \def\footerfont{\reset@font\fontsize{10bp}{0bp}\selectfont}% %% Regular Page Style \def\ps@headings{% \def\@oddfoot{\hfill\thepage\hfill}% \let\@evenfoot\@oddfoot% \def\@evenhead{% \vbox to 0pt{\vspace*{-48pt}% \hbox to \hsize{\hfill \relax\hfill}}\par%% \hspace*{-\textwidth}\hbox to \hsize{\hfill}}% \def\@oddhead{% \vbox to 0pt{\vspace*{-48pt}% \hbox to \hsize{\hfill \relax\hfill}}\par%% \hspace*{-\textwidth}\hbox to \hsize{\hfill}}% \let\@mkboth\markboth% }% %% Opening Page Style \def\ps@titlepage{% %%\def\@oddhead{\vbox{\vskip-36pt\hbox to \textwidth{\hfill\includegraphics{springer-nature-logo}\hspace*{-1pt}}}}% %%\let\@oddhead\@empty\let\@evenhead\@empty% \def\@oddhead{% \vbox to 0pt{\vspace*{-38pt}% \hbox to \hsize{\hfill \hfill}}}%% \let\@evenhead\@oddhead% \def\@oddfoot{\vbox to 18pt{\vfill\reset@font\rmfamily\hfil\thepage\hfil}}%% \def\@evenfoot{}}% \def\ps@plain{\let\@mkboth\@gobbletwo% \let\@oddhead\@empty\let\@evenhead\@empty% \def\@oddfoot{\vbox to 18pt{\vfill\reset@font\rmfamily\hfil ddd\thepage\hfil}}% \let\@evenfoot\@oddfoot}% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Sections %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \def\numbered{\setcounter{secnumdepth}{3}}% \def\unnumbered{\setcounter{secnumdepth}{0}}% \numbered%% default is numbered Sections \renewcommand\thesection {\@arabic\c@section}% \renewcommand\thesubsection {\thesection.\@arabic\c@subsection}% \renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection}% \renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph}% \renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph}% %% \def\@seccntformat#1{\csname the#1\endcsname\hskip.5em}% \def\@sect#1#2#3#4#5#6[#7]#8{% \ifnum #2>\c@secnumdepth \let\@svsec\@empty \else \refstepcounter{#1}% \protected@edef\@svsec{\@seccntformat{#1}\relax}% \fi \@tempskipa #5\relax \ifdim \@tempskipa>\z@ \begingroup #6{% \@hangfrom{\hskip #3\relax\@svsec}% \interlinepenalty \@M #8\@@par}% \endgroup \csname #1mark\endcsname{#7}% \addcontentsline{toc}{#1}{% \ifnum #2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}% \fi #7}% \else \def\@svsechd{% #6{\hskip #3\relax \@svsec #8.}% \csname #1mark\endcsname{#7}% \addcontentsline{toc}{#1}{% \ifnum #2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}% \fi #7}}% \fi \@xsect{#5}} % \def\sectionfont{\reset@font\fontfamily{\rmdefault}\fontsize{14bp}{16bp}\bfseries\selectfont\raggedright\boldmath}% \def\subsectionfont{\reset@font\fontfamily{\rmdefault}\fontsize{12bp}{14bp}\bfseries\selectfont\raggedright\boldmath}% \def\subsubsectionfont{\reset@font\fontsize{11bp}{13bp}\bfseries\selectfont\raggedright\boldmath}% \def\paragraphfont{\reset@font\fontsize{10bp}{12bp}\bfseries\itshape\selectfont\raggedright}% % \def\subparagraphfont{\itshape}% \def\bmheadfont{\reset@font\fontfamily{\rmdefault}\fontsize{10bp}{12bp}\bfseries\selectfont\raggedright\boldmath}% % \renewcommand\section{\@startsection{section}{1}{\z@}% {-12pt \@plus -4pt \@minus -2pt}% {9pt}% {\sectionfont}} \renewcommand\subsection{\@startsection{subsection}{2}{\z@}% {-12pt \@plus -4pt \@minus -2pt}% {6pt}% {\subsectionfont}} \renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% {-12pt \@plus -4pt \@minus -2pt}% {6pt}% {\subsubsectionfont}} \renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}% {-12pt \@plus -4pt \@minus-2pt}% {3pt}% {\paragraphfont}} \renewcommand\subparagraph{\@startsection{subparagraph}{5}{\z@}% {6pt \@plus1ex \@minus.2ex}% {-1em}% {\subparagraphfont}} \newcommand\bmhead{\@startsection{subparagraph}{5}{\z@}% {6pt \@plus1ex \@minus .2ex}% {-1em}% {\bmheadfont}} % \def\@startsection#1#2#3#4#5#6{% \if@noskipsec \leavevmode \fi \par \@tempskipa #4\relax \@afterindenttrue \ifdim \@tempskipa <\z@ \@tempskipa -\@tempskipa \@afterindentfalse \fi \if@nobreak \everypar{}% \else \addpenalty\@secpenalty\addvspace\@tempskipa \fi \@ifstar {\@ssect{#3}{#4}{#5}{#6}}% {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Lists %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \newdimen\labelwidthi% \newdimen\labelwidthii% \newdimen\labelwidthiii% \newdimen\labelwidthiv% \def\normal@labelsep{0.5em}% \labelsep\normal@labelsep% \settowidth{\labelwidthi}{(iii)}% \settowidth{\labelwidthii}{(d)}% \settowidth{\labelwidthiii}{(iii)}% \settowidth{\labelwidthiv}{(M)}% \leftmargini\labelwidthi \advance\leftmargini\labelsep \leftmarginii\labelwidthii \advance\leftmarginii\labelsep \leftmarginiii\labelwidthiii \advance\leftmarginiii\labelsep \leftmarginiv\labelwidthiv \advance\leftmarginiv\labelsep \def\setleftmargin#1#2{\settowidth{\@tempdima}{#2}\labelsep\normal@labelsep \csname labelwidth#1\endcsname\@tempdima \@tempdimb\@tempdima \advance\@tempdimb\labelsep \csname leftmargin#1\endcsname\@tempdimb} \def\@listI{\leftmargin\leftmargini \labelwidth\labelwidthi \labelsep\normal@labelsep % \topsep \z@ \topsep\baselineskip %%updated \partopsep\z@ \parsep\z@ \itemsep\z@ \listparindent 1em} \def\@listii{\leftmargin\leftmarginii \labelwidth\labelwidthii \labelsep\normal@labelsep \topsep\z@ \partopsep\z@ \parsep\z@ \itemsep\z@ \listparindent 1em} \def\@listiii{\leftmargin\leftmarginiii \labelwidth\labelwidthiii \labelsep\normal@labelsep \topsep\z@ \partopsep\z@ \parsep\z@ \itemsep\z@ \listparindent 1em} \def\@listiv{\leftmargin\leftmarginiv \labelwidth\labelwidthiv \labelsep\normal@labelsep \topsep\z@ \partopsep\z@ \parsep\z@ \itemsep\z@ \listparindent 1em} \let\@listi\@listI \@listi % \setlength \labelsep {.5em} \setlength \labelwidth{\leftmargini} \addtolength\labelwidth{-\labelsep} \@beginparpenalty -\@lowpenalty \@endparpenalty -\@lowpenalty \@itempenalty -\@lowpenalty \def\labelitemi{$\bullet$} \def\labelitemii{$\cdot$} \def\labelenumi{\theenumi.} \def\theenumi{\arabic{enumi}} \def\labelenumii{(\alph{enumii})} \def\theenumii{\alph{enumii}} \def\labelenumiii{(\roman{enumiii})}\def\theenumiii{\roman{enumiii}} \def\labelenumiv{(\Alph{enumiv})} \def\theenumiv{\Alph{enumiv}} % %%%%%%%%%%%%%%%%%%%%%%%%%%% Ordered & Unordered List %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \def\listfont{\normalsize}% % \def\enumargs{% \listfont% \leftmargini0pt% \leftmarginii0pt% \leftmarginiii0pt% \ifnum\@enumdepth=3\topsep0pt\else\ifnum\@enumdepth=2\topsep0pt\else\topsep 6pt\fi\fi% \partopsep \z@% \itemsep \z@% \parsep \z@% \labelsep 0.5em% \rightmargin \z@% \raggedright% \listparindent \parindent% \itemindent \z@}% \def\enumerate{% \@ifnextchar[{\@numerate}{\@numerate[0.]}} \def\@numerate[#1]{\par% \ifnum \@enumdepth >3 \@toodeep\else \advance\@enumdepth \@ne \edef\@enumctr{enum\romannumeral\the\@enumdepth} \list{\csname label\@enumctr\endcsname}{% \enumargs% \setlength{\leftmargin}{\csname leftmargin\romannumeral\the\@enumdepth\endcsname} \usecounter{\@enumctr} \settowidth\labelwidth{#1} \addtolength{\leftmargin}{\labelwidth} \addtolength{\leftmargin}{\labelsep} \def\makelabel##1{\hss\llap{##1}}}% \fi } \let\endenumerate\endlist %%Unnumbered list%% \def\unenumargs{% \listfont% \leftmargini\parindent% \topsep6pt% \partopsep \z@% \itemsep \z@% \parsep \z@% \labelsep 0\p@% \rightmargin \z@% \raggedright% \listparindent \parindent% \itemindent -12pt}% \def\unenumerate{% \@ifnextchar[{\@unenumerate}{\@unenumerate[0.]}} \def\@unenumerate[#1]{\par% \ifnum \@enumdepth >3 \@toodeep\else \advance\@enumdepth \@ne \edef\@enumctr{enum\romannumeral\the\@enumdepth} \list{}{% \unenumargs \setlength{\leftmargin}{\csname leftmargin\romannumeral\the\@enumdepth\endcsname} \usecounter{\@enumctr} \settowidth\labelwidth{#1} \addtolength{\leftmargin}{0pt} \addtolength{\leftmargin}{0pt} \def\makelabel##1{\hss\llap{##1}}}% \fi } \let\endunenumerate\endlist% %% bulleted list \def\itemargs{% \listfont% \leftmargini0pt% \leftmarginii0pt% \ifnum\@enumdepth=3\topsep0pt\else\ifnum\@enumdepth=2\topsep0pt\else\topsep 6pt\fi\fi% \partopsep \z@% \itemsep \z@% \parsep \z@% \labelsep 0.5em% \rightmargin \z@% \raggedright% \listparindent \z@% \itemindent \z@}% \renewcommand\labelitemi{\raise1pt\hbox{\textbullet}}% \renewcommand\labelitemii{\textendash}% \def\itemize{% \@ifnextchar[{\@itemize}{\@itemize[$\bullet$]}} \def\@itemize[#1]{\par% \ifnum \@itemdepth >3 \@toodeep\else \advance\@itemdepth \@ne \edef\@itemctr{item\romannumeral\the\@itemdepth} \list{\csname label\@itemctr\endcsname}{% \itemargs \setlength{\leftmargin}{\csname leftmargin\romannumeral\the\@itemdepth\endcsname} \settowidth\labelwidth{#1} \addtolength{\leftmargin}{\labelwidth} \addtolength{\leftmargin}{\labelsep} \def\makelabel##1{\hss \llap{##1}}}% \fi } \let\enditemize\endlist % \def\quote{\list{}{\itemindent\z@ \leftmargin 1em \rightmargin \z@}% \item[]} \let\endquote\endlist % \def\descriptionlabel#1{\hspace\labelsep \itshape #1} \def\description{\list{}{\labelwidth\z@ \leftmargin \z@ \topsep6pt\itemindent \z@ %-\leftmargin \let\makelabel\descriptionlabel}} \let\enddescription\endlist % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Float %%%%%%%%%%%%%%%%%%%%%%%%%%%% \setlength\abovecaptionskip{2.25\p@}% \setlength\belowcaptionskip{6\p@}% \setlength\arraycolsep{2\p@}% \setlength\tabcolsep{6\p@}% \setlength\arrayrulewidth{.4\p@}% \setlength\doublerulesep{2\p@}% \setlength\tabbingsep{\labelsep}% \def\fnum@figure{{\bfseries\figurename\space\thefigure}}% \def\fnum@table{{\bfseries\tablename\space\thetable}}% \def\FigName{figure}% \long\def\@makecaption#1#2{% \ifx\FigName\@captype \vskip\abovecaptionskip \@figurecaption{#1}{#2} \else \@tablecaption{#1}{#2} \vskip\belowcaptionskip \fi% } %% Figure \def\figurecaptionfont{\reset@font\fontfamily{\rmdefault}\fontsize{8}{9.5}\selectfont}% \newdimen\figwidth% \newdimen\figheight% \newdimen\sidecapwidth \newdimen\wrapcapline% \newdimen\totalwrapline% \newdimen\wraptotline% %% Figures macro \newbox\figurebox% \newbox\wrapfigcapbox \def\FIG#1#2{% \setbox\figurebox\hbox{#1}% %% Figure dimensions \figwidth\wd\figurebox% \figheight\ht\figurebox% {\parbox{\hsize}{% \centerline{\box\figurebox}% %% Caption #2}}} %% Figures caption \newbox\figcapbox \newbox\capbox \long\def\@figurecaption#1#2{{\figurecaptionfont{\bfseries#1}\hskip.7em#2\par}}% \newenvironment{unnumfigure}{\begingroup\setlength{\topsep}{12pt}% \begin{center}}{\end{center}\endgroup} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \@ifpackageloaded{booktabs}{\cmidrulewidth=.15pt}{}% % \def\tablecaptionfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont}% \def\tablebodyfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont}% \def\tablecolheadfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont\bfseries\boldmath}% \def\tablefootnotefont{\reset@font\fontsize{8bp}{9.5bp}\selectfont}% %% Table Macro \newskip\headwidthskip% \def\tabraggedcenter{\leftskip=0pt plus 0.5fil\rightskip=0pt plus 0.5fil\parfillskip=0pt}% \newenvironment{@processtable}[4]{% \setbox4=\hbox to \hsize{\hss% \begin{minipage}[t]{#4}% \tabraggedcenter% \caption{#1}\par% {\tablebodyfont\noindent\ignorespaces#2\par}\par\vglue6pt% {\if!#3!\else{\tablefootnotefont#3}\fi}% \end{minipage}% \hss}% \box4\par}% \newcommand\TBL[3]{\begingroup% % \if!#1!\let\caption\relax\fi% % \global\setbox\temptbox=\hbox{\bgroup{\tablebodyfont#2}\egroup}% \global\tempdime\wd\temptbox% \@processtable{#1}{\global\headwidthskip=\tempdime% \vbox{#2}}{#3}{\tempdime}% \endgroup}% %% Table Caption \newbox\tabcapbox% \newbox\temptbox% \newdimen\tempdime% \newdimen\tabhtdime% \long\def\@tablecaption#1#2{% \setbox\tabcapbox\vbox{\tablecaptionfont\raggedright% {\bfseries #1}{\hskip2mm}#2\vphantom{y}\par}% \box\tabcapbox% } %% Table Column Heads \def\TCH#1{{\tablecolheadfont #1}} %% Table Footnotes \newenvironment{tablenotes}{\list{}{\setlength{\labelsep}{0pt}% \setlength{\labelwidth}{0pt}% \setlength{\leftmargin}{0pt}% \setlength{\rightmargin}{0pt}% \setlength{\topsep}{-6pt}% \setlength{\itemsep}{2pt}% \setlength{\partopsep}{0pt}% \setlength{\listparindent}{0em}% \setlength{\parsep}{0pt}}% \item\relax% }{\endlist}% \def\tnote#1{$^{#1}$}%% %% Table Rules \def\toprule{%\noalign{\vskip3pt} \noalign{\ifnum0=`}\fi \hrule \@height 0\p@ \@width 0pt \hrule \@height 0.75\p@ % <- rule height \hrule \@height 5pt \@width 0pt \futurelet\@tempa\@xhline} % Middle rule \def\midrule{\noalign{\ifnum0=`}\fi% \hrule \@height 3pt \@width 0pt \hrule \@height .5pt % <- rule height \hrule \@height 5pt \@width 0pt \futurelet \@tempa\@xhline} % Bottom rule \def\botrule{\noalign{\ifnum0=`}\fi \hrule \@height 3pt \@width 0pt \hrule \@height 0.75\p@ % <- rule height \hrule \@height 3pt \@width 0pt \futurelet\@tempa\@xhline} % \def\@@@cmidrule[#1-#2]#3#4{\global\@cmidla#1\relax \global\advance\@cmidla\m@ne \ifnum\@cmidla>0\global\let\@gtempa\@cmidrulea\else \global\let\@gtempa\@cmidruleb\fi \global\@cmidlb#2\relax \global\advance\@cmidlb-\@cmidla \global\@thisrulewidth=#3 \@setrulekerning{#4} \ifnum\@lastruleclass=\z@\vskip 3\p@\fi \ifnum0=`{\fi}\@gtempa \noalign{\ifnum0=`}\fi\futurenonspacelet\@tempa\@xcmidrule} \def\@xcmidrule{% \ifx\@tempa\cmidrule \vskip-\@thisrulewidth \global\@lastruleclass=\@ne \else \ifx\@tempa\morecmidrules \vskip \cmidrulesep \global\@lastruleclass=\@ne\else \vskip 5\p@ \global\@lastruleclass=\z@ \fi\fi \ifnum0=`{\fi}} \let\cline\cmidrule \usepackage[figuresright]{rotating}% \usepackage{threeparttable} \let\tableorg\table% \let\endtableorg\endtable% \let\sidewaystableorg\sidewaystable% \let\endsidewaystableorg\endsidewaystable% \renewenvironment{table}[1][]% {\begin{tableorg}[#1]% \begin{center} \begin{threeparttable} \tablebodyfont% \renewcommand\footnotetext[2][]{{\removelastskip\vskip3pt% \let\tablebodyfont\tablefootnotefont% \hskip0pt\if!##1!\else{\smash{$^{##1}$}}\fi##2\par}}% }{\end{threeparttable}\end{center}\end{tableorg}} \renewenvironment{sidewaystable}[1][]% {\begin{sidewaystableorg}[#1]% \begin{center} \begin{threeparttable} \tablebodyfont% \renewcommand\footnotetext[2][]{{\removelastskip\vskip3pt% \let\tablebodyfont\tablefootnotefont% \hskip0pt\if!##1!\else{\smash{$^{##1}$}}\fi##2\par}}% }{\end{threeparttable}\end{center}\end{sidewaystableorg}} %%%%%%%%%%%%%%%%%%%%%%%%%%%% Other Env. %%%%%%%%%%%%%%%%%%%%%%%%% \def\quotefont{\reset@font\fontfamily{\rmdefault}\fontsize{9}{11}\selectfont}% \renewenvironment{quote} {\list{}{\topsep=0pt\topsep6pt\leftmargin=1em\raggedright\quotefont}% \item\relax} {\endlist} % %%%%%%%%%%%%%%%%%%%%%%%%%%%% Appendix %%%%%%%%%%%%%%%%%%%%%%%%% % \newif\ifbackmatter% \newcommand{\backmatter}{\global\backmattertrue}% \usepackage[title]{appendix}% \@ifpackageloaded{appendix}{% % \renewenvironment{appendices}{% \@resets@pp \if@dotoc@pp \if@dopage@pp % both page and toc \if@chapter@pp % chapters \clear@ppage \fi \appendixpage \else % toc only \if@chapter@pp % chapters \clear@ppage \fi \addappheadtotoc \fi \else \if@dopage@pp % page only \appendixpage \fi \fi \if@chapter@pp \if@dotitletoc@pp \@redotocentry@pp{chapter} \fi \else \if@dotitletoc@pp \@redotocentry@pp{section} \fi \if@dohead@pp \def\sectionmark##1{% \if@twoside \markboth{\@formatsecmark@pp{##1}}{} \else \markright{\@formatsecmark@pp{##1}}{} \fi} \fi \if@dotitle@pp \def\sectionname{\appendixname} \def\@seccntformat##1{\@ifundefined{##1name}{}{\csname ##1name\endcsname\ }% \csname the##1\endcsname\quad} \fi \fi }{% \@ppsaveapp\@pprestoresec} %% \AtBeginDocument{% % \let\oldappendices\appendices% \let\oldendappendices\endappendices% %% \renewenvironment{appendices}{% \setcounter{figure}{0}% \setcounter{table}{0}% \setcounter{equation}{0}% %% \begin{oldappendices}% \gdef\thefigure{\@Alph\c@section\arabic{figure}}% \gdef\thetable{\@Alph\c@section\arabic{table}}% \gdef\theequation{\@Alph\c@section\arabic{equation}}% }{\end{oldappendices}} } %% }{} % %%%%%%%%%%%%%%%%%%%%%%%%%%% Article History %%%%%%%%%%%%%%%%%%%% % \def\@history{} \def\printhistory{{\par\addvspace{8pt}% \historyfont\noindent% \ifx\@history\empty\gdef\@history{Received xx xxx xxxx}\fi\@history\par}}% % %%%%%%%%%%%%%%%%%%%%%%% Footnotes %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \renewcommand\@makefntext[1]{% \hskip8pt{\smash{\@makefnmark}}#1} % \RequirePackage{hyperref}% %%\RequirePackage{hypcap}% \gdef\breakurldefns{% \if@pdflatex\else% \RequirePackage[hyphenbreaks]{breakurl}% % \let\href\burlalt% \fi}% \breakurldefns% % \bgroup % \catcode`\&=12\relax % \hyper@normalise\burl@addtocharlistbefore{%} % \hyper@normalise\burl@addtocharlistafter{:/.?#&_,;!=+~}%% for extra breaks in url % \egroup % \burl@defifstructure % \hypersetup{% colorlinks, breaklinks=true, plainpages=false,% citecolor=blue, linkcolor=blue, urlcolor=blue, bookmarksopen=true,% bookmarksnumbered=false,% bookmarksdepth=5% } % \AtBeginDocument{\renewcommand\UrlFont{\rmfamily}}% % \AtBeginDocument{% \@ifpackageloaded{natbib}{% \renewcommand\bibsection{% \section*{\refname}% }% }{}% }% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \pagestyle{headings}% \pagenumbering{arabic}% \sloppy% \frenchspacing% \flushbottom% %%% special parameters for TeX \adjdemerits=100 \linepenalty=100 % %%%%%%%%%%%%%%% Biography % \RequirePackage{wrapfig}% % % % \begin{wrapfigure}[12]{r}[34pt]{5cm}

\end{wrapfigure} % -- - ---- --- % [number of narrow lines] {placement} [overhang] {width of figure} \newcount\wraplines% %%\wraplines=5% % \newbox\@authorfigbox% \newskip\@authorfigboxdim% % \newskip\biofigadjskip% \biofigadjskip=0pt% % \def\authbiotextfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont}% % \newenvironment{biography}[2]{\par\addvspace{11.5pt plus3.375pt minus1.6875pt}%\lineno@off% \def\author##1{{\bfseries##1}}% \if!#1!\def\@authorfig{}\else\def\@authorfig{{#1}}\fi% \setbox\@authorfigbox=\hbox{#1}% \@authorfigboxdim=\wd\@authorfigbox% \if@iicol\advance\@authorfigboxdim by -10pt\else\advance\@authorfigboxdim by -2pt\fi% \wraplines=9\fboxrule=1pt\fboxsep=6pt% \noindent{% \ifx\@authorfig\@empty\else\unskip% \begin{wrapfigure}[\wraplines]{l}[0pt]{\@authorfigboxdim}%{38.25mm}% \vskip-19pt\addvspace{\biofigadjskip}% \@authorfig% \end{wrapfigure}% \fi% {\authbiotextfont#2\par}% \par% }}{\par\addvspace{10.5pt plus3.375pt minus1.6875pt}} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Theorem %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \usepackage{amsthm} \usepackage{fix-cm} \@ifpackageloaded{amsthm}{% % %\let\proof\relax% %\let\endproof\relax% \def\@begintheorem#1#2[#3]{% \deferred@thm@head{\the\thm@headfont \thm@indent \@ifempty{#1}{\let\thmname\@gobble}{\let\thmname\@iden}% \@ifempty{#2}{\let\thmnumber\@gobble}{\let\thmnumber\@iden}% \@ifempty{#3}{\let\thmnote\@gobble}{\let\thmnote\@iden}% \thm@swap\swappedhead\thmhead{#1}{#2}{#3}% \the\thm@headpunct \thmheadnl % possibly a newline. \hskip\thm@headsep }% \ignorespaces } \def\@endtheorem{\endtrivlist\@endpefalse} \AtBeginDocument{% % \DeclareRobustCommand{\S}{\ifmmode\mathsection\else\textsection\fi} \DeclareSymbolFont{AMSa}{U}{msa}{m}{n}% \DeclareMathSymbol{\opensquare}{\mathord}{AMSa}{"03}% \def\qedsymbol{\ensuremath{\opensquare}}% % \newenvironment{spiproof}[1][\proofname]{\par\removelastskip%\vspace*{2pt}% \pushQED{\qed}% \small\normalfont \topsep7.5\p@\@plus7.5\p@\relax% \trivlist% \item[\hskip\labelsep% \itshape% #1\@addpunct{}]\ignorespaces% }{% \popQED\endtrivlist\@endpefalse% }% % \let\proof\spiproof\let\endproof\endspiproof% % }% % \def\thm@space@setup{% \thm@preskip=12pt% \thm@postskip=12pt} % %%%%%%%%%%%%%%%%%% StyleOne % \newtheoremstyle{thmstyleone}% Numbered {18pt plus2pt minus1pt}% Space above {18pt plus2pt minus1pt}% Space below {\small\itshape}% Body font {0pt}% Indent amount {\small\bfseries}% Theorem head font {}% Punctuation after theorem head {.5em}% Space after theorem headi {\thmname{#1}\thmnumber{\@ifnotempty{#1}{ }\@upn{#2}}% \thmnote{ {\the\thm@notefont(#3)}}}% Theorem head spec (can be left empty, meaning `normal') % \newtheoremstyle{thmstyletwo}% Numbered {18pt plus2pt minus1pt}% Space above {18pt plus2pt minus1pt}% Space below {\small\normalfont}% Body font {0pt}% Indent amount {\small\itshape}% Theorem head font {}% Punctuation after theorem head {.5em}% Space after theorem headi {\thmname{#1}\thmnumber{\@ifnotempty{#1}{ }{#2}}% \thmnote{ {\the\thm@notefont(#3)}}}% Theorem head spec (can be left empty, meaning `normal') % \newtheoremstyle{thmstylethree}% Definition {18pt plus2pt minus1pt}% Space above {18pt plus2pt minus1pt}% Space below {\small\normalfont}% Body font {0pt}% Indent amount {\small\bfseries}% Theorem head font {}% Punctuation after theorem head {.5em}% Space after theorem headi {\thmname{#1}\thmnumber{\@ifnotempty{#1}{ }\@upn{#2}}% \thmnote{ {\the\thm@notefont(#3)}}}% Theorem head spec (can be left empty, meaning `normal') % \newtheoremstyle{thmstylefour}% Proof {18pt plus2pt minus1pt}% Space above {18pt plus2pt minus1pt}% Space below {\small\normalfont}% Body font {0pt}% Indent amount {\small\itshape}% Theorem head font {}% Punctuation after theorem head {.5em}% Space after theorem headi {\global\proofthmtrue\thmname{#1} \thmnote{#3}}% Theorem head spec (can be left empty, meaning `normal') % }{} %% Macros for bibliographystyles %% % \def\bibcommenthead{\if@bibcomment\begingroup\parindent=0pt\parskip=0pt% % \removelastskip\vskip13pt\nointerlineskip% % % \vbox{\bibfont If you are submitting to one of the Nature Research journals, using the eJP % submission system, please include the references within the manuscript file itself. You may % do this by copying the reference list from your .bbl file, and pasting it into the bibliography % environment of the main manuscript .tex file.}\par% % \removelastskip\nobreak\vskip13pt\nobreak% % \endgroup\fi}% \def\bibcommenthead{}% \if@Spr@basic@refstyle% \if@Numbered@refstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \else% \usepackage[authoryear]{natbib}% \setcitestyle{aysep={}} \gdef\NumBib{NO}% \fi% \bibliographystyle{sn-basic}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \if@Mathphys@numrefstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \bibliographystyle{sn-mathphys-num}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \else% \if@Mathphys@ayrefstyle% \usepackage[authoryear]{natbib}% \gdef\NumBib{NO}% \setcitestyle{aysep={}} \bibliographystyle{sn-mathphys-ay}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi\fi% \if@APS@refstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \bibliographystyle{sn-APS}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \if@Vancouver@numrefstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \bibliographystyle{sn-vancouver-num}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \else% \if@Vancouver@ayrefstyle% \usepackage[authoryear]{natbib}% \gdef\NumBib{NO}% \setcitestyle{aysep={}} \bibliographystyle{sn-vancouver-ay}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi\fi% \if@APA@refstyle% \if@Numbered@refstyle% \usepackage[natbibapa]{apacite}% \gdef\NumBib{YES}% \else% \usepackage[natbibapa]{apacite}% \gdef\NumBib{NO}% \fi% \bibliographystyle{sn-apacite}% \def\refdoi#1{\urlstyle{rm}\url{#1}}% \renewcommand{\doiprefix}{}% \AtBeginDocument{% \renewcommand{\BPBI}{.}% Period between initials - command from apacite.sty }% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \if@Chicago@refstyle% \if@Numbered@refstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \else% \usepackage[authoryear]{natbib}% \gdef\NumBib{NO}% \setcitestyle{aysep={}} \fi% \bibliographystyle{sn-chicago}% \hypersetup{urlcolor=black,colorlinks=false,pdfborder={0 0 0}}\urlstyle{same}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \if@Standard@Nature@refstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \bibliographystyle{sn-nature}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \AtBeginDocument{\allowdisplaybreaks}% \def\eqnheadfont{\reset@font\fontfamily{\rmdefault}\fontsize{16}{18}\bfseries\selectfont}% \newcommand{\eqnhead}[1]{\begingroup% \begin{center} {\eqnheadfont #1}\par% \end{center} \removelastskip\vskip24pt% \thispagestyle{titlepage}%% %%\thispagestyle{empty}% \endgroup} %% Macros for border matrix %% \newif\if@borderstar \def\bordermatrix{\@ifnextchar*{% \@borderstartrue\@bordermatrix@i}{\@borderstarfalse\@bordermatrix@i*}% } \def\@bordermatrix@i*{\@ifnextchar[{\@bordermatrix@ii}{\@bordermatrix@ii[()]}} \def\@bordermatrix@ii[#1]#2{% \begingroup \m@th\@tempdima8.75\p@\setbox\z@\vbox{% \def\cr{\crcr\noalign{\kern 2\p@\global\let\cr\endline }}% \ialign {$##$\hfil\kern 2\p@\kern\@tempdima & \thinspace % \hfil $##$\hfil && \quad\hfil $##$\hfil\crcr\omit\strut % \hfil\crcr\noalign{\kern -\baselineskip}#2\crcr\omit % \strut\cr}}% \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}% \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}% \setbox\tw@\hbox{% $\kern\wd\@ne\kern -\@tempdima\left\@firstoftwo#1% \if@borderstar\kern2pt\else\kern -\wd\@ne\fi% \global\setbox\@ne\vbox{\box\@ne\if@borderstar\else\kern 2\p@\fi}% \vcenter{\if@borderstar\else\kern -\ht\@ne\fi% \unvbox\z@\kern-\if@borderstar2\fi\baselineskip}% \if@borderstar\kern-2\@tempdima\kern2\p@\else\,\fi\right\@secondoftwo#1 $% }\null \;\vbox{\kern\ht\@ne\box\tw@}% \endgroup } %% Macros for line numbers %% \if@vrulerlinenumberon% % \usepackage{vruler}% % %%\setvruler[][][][][][][][][] \def\linenoon{%%\definecolor{blue}{gray}{0}% \def\tiny{\normalsize\color{black}}% \setvruler[12bp][1][1][3][1][1.18\textwidth][26pt][-7pt][0.99\textheight]% for even pages: left side; for odd pages: right side; %%\linkbluecolor }% \linenoon% \def\lineno@off{\unsetvruler}% \fi% %% url macros %% \gdef\orcidlogo{% \includegraphics{Orcidlogo.eps}% }% \gdef\orcid#1{\href{#1}{\orcidlogo}}% \endinput \ No newline at end of file diff --git a/waypoint_control/sn-article-template/sn-mathphys-num.bst b/waypoint_control/sn-article-template/sn-mathphys-num.bst new file mode 100644 index 0000000..e4d1e42 --- /dev/null +++ b/waypoint_control/sn-article-template/sn-mathphys-num.bst @@ -0,0 +1,3211 @@ +%% This is file `sn-mathphys-num.bst' +%% Compatible with bibtex version 0.99d. +%% +%% Note: Per default sorting entries is done in the order of citation. +%% If the journal requires alphabetical order of references, select the alpha option +%% +%% You are free to use this style file as you see fit, provided +%% that you do not make changes to the file. +%% +%% It may be distributed under the terms of the LaTeX Project Public +%% License, as described in lppl.txt in the base LaTeX distribution. +%% Either version 1.0 or, at your option, any later version. +%% +%% LIMITATIONS: +%% If you are getting error like +%% "Sorry---you've exceeded BibTeX's number of string global-variables" +%% that means you are using to old bibtex version. You should download latest version 0.99d. +%% (One of the binaries location is minimals.contextgarden.net/current/bin/common/) + +FUNCTION {identify.mathphys.version} +{ % Put identifying string in the .blg file + "sn-mathphys-num.bst" + " [2024/07/19 v1.1 bibliography style]" + * top$ +} + +ENTRY + { address + author + booktitle + bnumber + chapter + doi + edition + editor + howpublished + institution + isbn + journal + key + keywords + month + note + number + organization + pages + publisher + school + series + title + type + volume + year + url + info + options + urldate + eprint + archive + archivePrefix + primaryClass + eid + adsurl + adsnote + version + } + {} + { label extra.label sort.label short.list} + +INTEGERS { output.state before.all mid.sentence after.sentence + after.block after.authors between.elements bother + Nisbn Nmonth slen set.settings tmp month.printed} + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := + #4 'after.authors := + #5 'between.elements := +} + +STRINGS { s t element} +STRINGS { longest.label last.label list.string default.list} +STRINGS { v l f j b temp.str} + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { " " * write$ newline$} + { output.state after.block = + { add.period$ write$ + newline$ + } + { + output.state after.authors = + { ": " * write$ + newline$ + } + { output.state between.elements = + { ", " * write$ newline$} + { output.state before.all = + 'write$ + { add.period$ " " * write$ newline$} + if$ + } + if$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} +FUNCTION {fin.entry} +{ write$ newline$ } + +FUNCTION {stupid.colon} +{ after.authors 'output.state := } + + +FUNCTION {insert.comma} +{ output.state before.all = + 'skip$ + { between.elements 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {sort.format.month} +{ 't := + t #1 #2 substring$ "01" = + t #1 #1 substring$ "1" = + t #2 #2 substring$ "" = + and or + { "January" } + { t #1 #2 substring$ "02" = + t #1 #1 substring$ "2" = + t #2 #2 substring$ "" = + and or + { "February" } + { t #1 #2 substring$ "03" = + t #1 #1 substring$ "3" = + t #2 #2 substring$ "" = + and or + { "March" } + { t #1 #2 substring$ "04" = + t #1 #1 substring$ "4" = + or + { "April" } + { t #1 #2 substring$ "05" = + t #1 #1 substring$ "5" = + or + { "May" } + { t #1 #2 substring$ "06" = + t #1 #1 substring$ "6" = + or + { "June" } + { t #1 #2 substring$ "07" = + t #1 #1 substring$ "7" = + or + { "July" } + { t #1 #2 substring$ "08" = + t #1 #1 substring$ "8" = + or + { "August" } + { t #1 #2 substring$ "09" = + t #1 #1 substring$ "9" = + or + { "September" } + { t #1 #2 substring$ "10" = + { "October" } + { t #1 #2 substring$ "11" = + { "November" } + { t #1 #2 substring$ "12" = + { "December" } + { t } % No match + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + +} + +INTEGERS {sk} +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +FUNCTION {make.tag} +{ 't := + duplicate$ empty$ + { pop$ "" } + { bother #0 = + { + t "volume" = + {"\textbf{" swap$ * "}" * } + 'skip$ + if$ + } + { "\b" t * "{" * swap$ * "}" * } + if$ + } + if$ +} + + + +FUNCTION {springer.publisher} +{publisher #1 #8 substring$ "Springer" = + { "Springer" } + { publisher } + if$ +} + +FUNCTION {format.adsurl} +{ + adsurl empty$ + { "" } + {" \href{" adsurl "}" *} + if$ +} + +FUNCTION {format.adsnote} +{ + adsnote empty$ + { "" } + { ". " * adsnote *} + if$ +} + + +FUNCTION {format.soft.title} +{ + title empty$ + { "" } + { title "," *} + if$ +} + +FUNCTION {format.softmisctitle} +{ title empty$ + { ""} + { version empty$ + { title ", " *} + { title ", " * version " " *} + if$ + } + if$ +} + +FUNCTION {format.softmisc.archive} +{ + archivePrefix empty$ + { "" } + { "" } + if$ +} + +FUNCTION {format.archive} +{ + archivePrefix empty$ + { "" } + { archivePrefix ":" *} + if$ +} + +FUNCTION {format.primaryClass} +{ + primaryClass empty$ + { "" } + { "{[" primaryClass * "]}" *} + if$ +} + +FUNCTION {format.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://arxiv.org/abs/" eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.softmisc.eprint} +{ eprint empty$ + { ""} + { archive empty$ + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * + "{{" * format.archive * eprint * "}}}" *} + if$ + } + if$ +} + +FUNCTION {format.pub.address} +{ publisher empty$ + howpublished empty$ + and + { + address empty$ + 'skip$ + { volume empty$ + 'insert.comma + 'new.sentence + if$ + address + type$ "inproceedings" = + {"conflocation"} + {"location"} + if$ + make.tag output + } + if$ + } + { + address empty$ + { publisher empty$ + {howpublished} + {springer.publisher} + if$ + "publisher" make.tag + #1 bother = + {", \blocation{???}" * } + 'skip$ + if$ + output + } + { + publisher empty$ + {howpublished } + {springer.publisher } + if$ + "publisher" make.tag output + insert.comma + address "location" make.tag output + } + if$ + } + if$ +} + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {mk.tag} +{ 'temp.str := + duplicate$ empty$ + { pop$ "" } + { + b "nothing" = + 'skip$ + { "\b" temp.str * "{" * swap$ * "}" * } + if$ + } + if$ +} + +FUNCTION {space.after.dot} +{'j := + t 'f := + j 't := + s 'j := + "" 'l := + "" 's := + { t empty$ not } + { + t #1 #3 substring$ "{-}" = + { l " {q}. " * 'l := + t #4 global.max$ substring$ 't := + } + 'skip$ + if$ + + t #1 #1 substring$ 's := + l s * 'l := + s "." = + { + t #2 #1 substring$ " " = + 'skip$ + { + l " " * 'l := + t #2 #4 substring$ "{\,}" = + { t #5 global.max$ substring$ 't := } + 'skip$ + if$ + } + if$ + } + 'skip$ + if$ + t #2 global.max$ substring$ 't := + } + while$ + f 't := + j 's := + l +} + +FUNCTION {fix.inits}{ + 't := + "" 'element := + { t empty$ not } + { + t #1 #3 substring$ ".q." = + { element ".-" * 'element := + t #3 global.max$ substring$ 't := + } + {element t #1 #1 substring$ * 'element :=} + if$ + + t #2 global.max$ substring$ 't := + } + while$ + element +} + +FUNCTION {fix.snm}{ + 't := + "" 'element := + { t empty$ not } + { + t #1 #3 substring$ "{-}" = + {element "-" * 'element := + t #3 global.max$ substring$ 't := + } + {element t #1 #1 substring$ * 'element :=} + if$ + + t #2 global.max$ substring$ 't := + } + while$ + element +} + +FUNCTION {enbrace.dash}{ + 't := + "" 'element := + { t empty$ not } + { + t #1 #1 substring$ "-" = + {element "{-}" * 'element :=} + {element t #1 #1 substring$ * 'element :=} + if$ + t #2 global.max$ substring$ 't := + } + while$ + element +} + +FUNCTION {fix.name}{ + + enbrace.dash 's := + "" 'l := + "" 't := + + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { + s nameptr "{vv~}{ll}{, jj}" format.name$ + s nameptr "{, ff}" format.name$ space.after.dot * 'l := + #1 nameptr = + {l 't :=} + {t " and " * l * 't := } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + t +} + +FUNCTION {name.separator}{ + namesleft #1 > + {", " * } + 'skip$ + if$ +} + +FUNCTION {format.author.editor} +{ 'b := + + bother #1 = + b "nothing" = + or + 'skip$ + {"b" b * 'b :=} + if$ + + b "editor" = + b "beditor" = + b "nothing" = + or or + {editor 's :=} + {author 's :=} + if$ + + %% modifying name + s fix.name 's := + + "" 't := + + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + + s numnames "{ll}" format.name$ 'l := + l "others" = + l "{others}" = + l "et al." = + l "{et al.}" = + or or or + {#1 'tmp :=} + {#0 'tmp :=} + if$ + + { namesleft #0 > } + { s nameptr "{vv}" format.name$ "particle" mk.tag 'v := + s nameptr "{ll}" format.name$ fix.snm "snm" mk.tag 'l := + s nameptr "{f{.}.}" format.name$ fix.inits "inits" mk.tag 'f := + s nameptr "{jj}" format.name$ "suffix" mk.tag 'j := + + + namesleft #1 = + tmp #1 = + and + { b "bauthor" = + b "beditor" = + or + {"et al."} + {"\betal"} + if$ + #1 'tmp := + } + { + b "bauthor" = + b "beditor" = + or + {"\oauthor{"} + { + b "nothing" = + {""} + {"\b" b * "{" *} + if$ + } +%% if$ +%% +%% v empty$ +%% 'skip$ +%% {v * " " *} + if$ + + l empty$ + 'skip$ + { l *} + if$ + + f empty$ + 'skip$ + {", " * f *} + if$ + + j empty$ + 'skip$ + {" " * j *} + if$ + + b "nothing" = + {""} + {"}"} + if$ + + * "" 't := + } + if$ + + name.separator + write$ + + namesleft #1 > + b "nothing" = not + and + { namesleft #2 = + tmp #1 = + and + 'skip$ + 'newline$ + if$ + } + 'skip$ + if$ + + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.editors} +{ editor empty$ + 'skip$ + { + bother #0 = + { author empty$ + {"editor"} + {"nothing"} + if$ + } + {"editor"} + if$ + format.author.editor + editor num.names$ #1 > + { " (eds.)" } + { " (ed.)" } + if$ + write$ + } + if$ +} + +FUNCTION {format.authors} +{ author empty$ + 'skip$ + {"author" format.author.editor} + if$ +} + +FUNCTION {cite.author.editor} +{ 's := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ " et~al." * } + { #2 = + { s #2 "{vv~}{ll}{ jj}{ f}" format.name$ "others" = + { " et~al." * } + { " and " * s #2 "{vv~}{ll}" format.name$ * } + if$ + } + 'skip$ + if$ + } + if$ +} + +FUNCTION {check.auth.edit.org} +{author empty$ + { + editor empty$ + { + organization empty$ + {""} + {organization} + if$ + } + {editor cite.author.editor} + if$ + } + {author cite.author.editor} + if$ +} + +FUNCTION {check.year} +{ year empty$ + {""} + {year extra.label *} + if$ +} + +INTEGERS { multiresult char.num k int} +INTEGERS {str.length count return save.num1 save.num2} +FUNCTION {is.in.list}{ + 'f := + %%%% saveing "s" and "t" + s 'j := + f 's := + t 'f := + list.string text.length$ 'str.length := + list.string 't := +% s text.length$ 'slen := + int 'save.num1 := + count 'save.num2 := + #1 'int := + #1 'count := + #0 'return := + + { count str.length = not + #0 str.length = not + and + } + { + count #1 + 'count := + t int #1 substring$ "," = + { + t #1 int substring$ s "," * = + { + #1 'return := + str.length 'count := + } + 'skip$ + if$ + + int #1 + 'int := + t int global.max$ substring$ 't := + #0 'int := + } + 'skip$ + if$ + int #1 + 'int := + } + while$ + + save.num1 'int := + save.num2 'count := + + #0 return = + { s t = + {#1 'return :=} + 'skip$ + if$ + } + 'skip$ + if$ + %%%% returning original "s" and "t" + j 's := + f 't := + + return +} + +INTEGERS {bibitem.count} + +FUNCTION {print.count} +{ bibitem.count #1 + 'bibitem.count := + newline$ + "%%% " + bibitem.count int.to.str$ * write$ +} + + +FUNCTION {output.bibitem} +{ print.count + newline$ + "\bibitem[\protect\citeauthoryear{" write$ + check.auth.edit.org write$ + "}{" write$ + check.year write$ + "}]{" write$ + cite$ write$ + "}" write$ + newline$ + "" before.all 'output.state := +} + + + + +FUNCTION {string.to.integer} +{ 't := + t text.length$ 'k := + #1 'char.num := + { t char.num #1 substring$ 's := + s is.num + s "." = + or + char.num k = not + and + } + { char.num #1 + 'char.num := } + while$ + char.num #1 - 'char.num := + t #1 char.num substring$ +} + + +FUNCTION {find.integer} +{ 't := + #0 'int := + { int not + t empty$ not + and + } + { t #1 #1 substring$ 's := + s is.num + {#1 'int :=} + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + int +} + +function{title.lowerwords}{ +"a,an,and,of,the,for,in,to,over,from,on,or,so,than,that,this,as,but,with,by,at,down,up,upon,al,ale,aus,aux,d'Analyse,d'Analystes,d'Architecture,d'Etudes,d'Histoire,da,dans,de,degli,dei,del," +"dell',dell'Accademia,dell'Istituto,dell'Universita,della,delle,dem,der,des,detta,di,die,din,dlia,do,du,e,eXpress,ed,ego,el,em,en,et,fur,i,iz,l'Academie,l'Age,l'Antiquite," * +"l'Approximation,l'Ecole,l'Histoire,l'I.S.U.P.,l'INSA,l'IREM,l'Indirizzo,l'Institut,l'Institute,l'UFR,l'Union,l'Universite,la,las,les,na,nella,per,po,si,sue,sur,ta,tes,und,van,voor,zu,zum,zur" * +} + +FUNCTION {upercase.first.letters}{ + 't := + "" 's := + #1 'int := + #1 'count := + list.string 'v := + "" 'b := + title.lowerwords 'list.string := + + t text.length$ 'slen := + + {count slen = not } + {t int #1 substring$ " " = + { + int #1 - 'int := + t #1 int substring$ 'b := + + % if word not in title.lowerwords - uppercase first letter + b is.in.list not + { b "l" change.case$ b = + { b "u" change.case$ "t" change.case$ 'b := } + 'skip$ + if$ + } + 'skip$ + if$ + + int #1 + 'int := + + s b " " * * 's := + int #1 + 'int := + t int global.max$ substring$ 't := + #0 'int := + } + 'skip$ + if$ + int #1 + 'int := + count #1 + 'count := +% "count=" count int.to.str$ * " slen=" * slen int.to.str$ * top$ + } + while$ + v 'list.string := + % last word is "t" and need to check it too + s t + t "l" change.case$ t = + { "u" change.case$ "t" change.case$ } + 'skip$ + if$ + * +} + + +FUNCTION {format.title} +{ title empty$ + { "" } + { title + "article" type$ = + type$ "techreport" = + type$ "inbook" = + type$ "inproceedings" = + type$ "incollection" = + type$ "phdthesis" = + type$ "mastersthesis" = + or or or or or or + {"t" change.case$} + { type$ "unpublished" = + type$ "misc" = + or + 'skip$ + 'upercase.first.letters + if$ + } + if$ + } + if$ +} + + +FUNCTION {note.presented} +{ note #1 #9 substring$ "presented" = + note #1 #9 substring$ "Presented" = + or +} + +FUNCTION {n.filter} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "," = + t #1 #1 substring$ "\" = + t #1 #1 substring$ "~" = + or or + { "" * + t #2 global.max$ substring$ 't := + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {byear} +{ duplicate$ empty$ + { pop$ "" } + { 't := + t text.length$ 'sk := + #5 sk = + { t #1 #4 substring$ 's := + t #5 #1 substring$ 'longest.label := + longest.label is.num not + {s "year" make.tag + "nameyear" is.in.list + {longest.label * } + 'skip$ + if$ + } + {t "year" make.tag } + if$ + } + { t "year" make.tag + "nameyear" is.in.list + {extra.label *} + 'skip$ + if$ + } + if$ + } + if$ +} + +FUNCTION {format.date} +{ year empty$ + { "" } + { year byear } + if$ +} + +FUNCTION {parens} +{ "(" swap$ * ")" * } + +FUNCTION {format.date.parens} +{ year empty$ + { "" } + { year byear parens } + if$ +} + +FUNCTION {noparens} +{ " " swap$ * "" * } + +FUNCTION {format.softmiscdate} +{ year empty$ + { "" } + { year byear parens } + if$ +} + +FUNCTION {format.month}{ + month empty$ + {""} + {month sort.format.month "confdate" make.tag} + if$ +} + +FUNCTION {formatpatent.date} +{ year empty$ + 'skip$ + { month empty$ + { year } + {format.month " " * year *} + if$ + } + if$ +} + +FUNCTION {month.year.date} +{ year empty$ + {""} + { month empty$ + {year byear} + { format.month " " * year byear * } + if$ + type$ "inproceedings" = + 'skip$ + {"(" swap$ * ")" * } + if$ + } + if$ +} + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} +FUNCTION {format.volume} +{ volume empty$ + { "book" type$ = + {number empty$ + {""} + {"vol. " number "seriesno" make.tag *} + if$ + } + {""} + if$ + } + {"vol. " volume "seriesno" make.tag *} + if$ +} +FUNCTION {format.volume2} +{ volume empty$ + {""} + {"vol. " volume "seriesno" make.tag *} + if$ +} + +FUNCTION {format.art.vol} +{ + volume empty$ + {""} + {volume n.filter "volume" make.tag} + if$ + number empty$ + 'skip$ + { "(" number "issue" make.tag * ")" * * } + if$ +} + +FUNCTION {format.series} +{ series empty$ + 'skip$ + {series "sertitle" make.tag} + if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { "" 'v := + "" 'l := + "" 'f := + edition "l" change.case$ 's := + "1" s = + "first" s = + or + { + "1" 'v := + "st" 'l := + } + { + "2" s = + "second" s = + or + { + "2" 'v := + "nd" 'l := + } + { + "3" s = + "third" s = + or + { + "3" 'v := + "rd" 'l := + } + { + "4" s = + "fourth" s = + or + { + "4" 'v := + "th" 'l := + } + { + "5" s = + "fifth" s = + or + { + "5" 'v := + "th" 'l := + } + { + "6" s = + "sixth" s = + or + { + "6" 'v := + "th" 'l := + } + { + "7" s = + "seventh" s = + or + { + "7" 'v := + "th" 'l := + } + { + "8" s = + "eighth" s = + or + { + "8" 'v := + "th" 'l := + } + { + "9" s = + "nineth" s = + or + { + "9" 'v := + "th" 'l := + } + { + edition "t" change.case$ 'f := + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + #0 bother = + { f "" = + { v l * 'f :=} + 'skip$ + if$ + } + { f "" = + { "\bedition{" v * "}" * l * 'f :=} + { "\bedition{" f * "}" * 'f :=} + if$ + } + if$ + f " edn." * + } + if$ +} +FUNCTION {format.isbn} +{ isbn empty$ + { "" } + { isbn "isbn" make.tag} + if$ +} + +INTEGERS {default.info} + + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + "" 'l := + + {t empty$ not} + { t #1 #1 substring$ 's := + + s is.num not + { "" l = not + {t find.integer + {#1 'multiresult := } + {#0 'multiresult := } + if$ + "" 't := + } + { + t #2 global.max$ substring$ 't := + } + if$ + } + { l s * 'l := + t #2 global.max$ substring$ 't := + } + if$ + } + while$ + multiresult +} +FUNCTION {clearpage} +{ 't := + "" 's := + "" 'l := + + { t empty$ not } + { + t #1 #1 substring$ 's := + s is.num not + 'skip$ + { l s * 'l := } + if$ + t #2 global.max$ substring$ 't := + } + while$ + l + +} +FUNCTION {do.pages} +{'t := + "" 'j := + "" 'v := + {t empty$ not} + { t #1 #1 substring$ 's := + s is.num not + s "," = not + and + { "" j = + { + t #2 global.max$ substring$ 't := + } + {t find.integer + { t clearpage 'v := } + 'skip$ + if$ + "" 't := + } + if$ + } + { j s * 'j := + t #2 global.max$ substring$ 't := + } + if$ + } + while$ + j clearpage 'j := + j "fpage" make.tag + "cnd" is.in.list + 'skip$ + {"--" * v "lpage" make.tag *} + if$ +} + + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages multi.page.check + {type$ "article" = + {""} + {"cnd" is.in.list + {"p. "} + {"pp. "} + if$ + } + if$ + pages do.pages * + } + {type$ "article" = + {""} + {"p. "} + if$ + pages clearpage "fpage" make.tag * + } + + if$ + } + if$ +} + +FUNCTION {replace.tilde} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "~" = + { { t #1 #1 substring$ "~" = } + { "\texttildelow " * + t #2 global.max$ substring$ 't := + } + while$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + + +FUNCTION {format.url} +{ url empty$ + 'skip$ + { type$ "article" = + 'skip$ + { #0 bother = + { "\url{" } + { "\burl{" } + if$ + url replace.tilde * "}" * + output + } + if$ + + urldate empty$ + 'skip$ + { "Accessed " urldate * output } + if$ + } + if$ +} + + +FUNCTION {publisher.month.pages}{ + publisher empty$ series empty$ and + { address empty$ + 'skip$ + 'new.sentence + if$ + format.pub.address + + pages empty$ + 'skip$ + {insert.comma} + if$ + format.pages output + + } + { + pages empty$ + 'skip$ + {insert.comma} + if$ + format.pages output + publisher empty$ + 'skip$ + {new.sentence} + if$ + format.pub.address + } + if$ +} + +function{process.doi}{ + doi 't := + "" 'b := + #1 'int := +% "doi =" t * top$ + + t text.length$ 'slen := + + {int slen = not } + {t int #3 substring$ "10." = + { + t int #1 - #1 substring$ 'b := + b "" = + {"a" 'b :=} % if b is empty need to set a letter + 'skip$ + if$ + + b is.num not + { + t int slen int - #1 + substring$ 't := + slen #1 - 'int := + } + 'skip$ + if$ + + } + 'skip$ + if$ + int #1 + 'int := + } + while$ + t +} + +FUNCTION {format.doi} +{ doi empty$ + {""} + { + "nodoi" is.in.list + {""} + %%{"doi:\doiurl{" process.doi * "}" * } + {"\doiurl{" process.doi * "} " * } + if$ + } + if$ +} + +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + {#1 bother = + "cnd" is.in.list not + and + { editor empty$ + 'skip$ + { "In: " output write$ format.editors } + if$ + } + 'skip$ + if$ + } + { editor empty$ + { "In: " booktitle upercase.first.letters "btitle" make.tag * output} + { "In: " output write$ format.editors "" %%% pushing empty string to the empty stack + booktitle upercase.first.letters "btitle" make.tag output + } + if$ + } + + if$ +} + +FUNCTION {format.in.ed} +{ title empty$ + 'skip$ + { editor empty$ + { title "btitle" make.tag output} + { author empty$ + { format.editors + stupid.colon + %format.date output + title "btitle" make.tag output + } + { "In: " output write$ format.editors "" %%% pushing empty string to the empty stack + title "btitle" make.tag output + } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { "Technical Report" } + 'type + if$ + number empty$ + { "t" change.case$ } + { number tie.or.space.connect } + if$ +} + +FUNCTION {patent.number} +{ number empty$ + 'skip$ + { number } + if$ +} +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + +FUNCTION {format.inpres} +{ "l" change.case$ 't := + "in press: " #10 + "in press. " #10 + "in press " #9 t chop.word + chop.word + chop.word + #1 global.max$ substring$ +} + +FUNCTION {bcomment.note} +{ note empty$ + 'skip$ + {note format.inpres "comment" make.tag output} + if$ +} + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.chapter.and.note} +{ note empty$ chapter empty$ organization empty$ and and + 'skip$ + { chapter empty$ + "notnumber" last.label = + or + {organization empty$ + { note "comment" make.tag output } + { note empty$ + { organization "comment" make.tag output } + { organization ". " * note * "comment" make.tag output } + if$ + } + if$ + } + { note empty$ + { "Chap. " chapter * "comment" make.tag output} + { type empty$ + { "Chap. " } + { type "t" change.case$ "Section" = + { "Sect. " } + { "Chap. " } + if$ + } + if$ + chapter * ". " * note * "comment" make.tag output + } + if$ + } + if$ + } + if$ +} + +FUNCTION {item.end} +{ chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + { new.sentence + format.doi output + } + 'skip$ + if$ + + type$ "unpublished" = + type$ "misc" = + or + { note empty$ + 'skip$ + {note.presented + 'skip$ + {new.sentence note output} + if$ + } + if$ + format.date.parens output + } + { new.sentence + type$ "proceedings" = + { author empty$ editor empty$ and + 'bcomment.note + 'format.chapter.and.note + if$ + } + 'format.chapter.and.note + if$ + } + if$ + list.string 'v := + default.list 'list.string := + + type$ ".isbn" * is.in.list + "cnd" is.in.list + or + { + new.sentence +% format.isbn output + } + 'skip$ + if$ + new.sentence + %% commented by SPi as we are using format.eprint %% + %% and also to avoide eprint being printed twice - Start %% + %%eprint empty$ + %% 'skip$ + %% {"\arxivurl{" eprint * "}" * output} + %%if$ + %% End %% + chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + 'skip$ + { new.sentence + format.doi output + } + if$ + new.sentence + format.url + v 'list.string := + fin.entry +} + +FUNCTION {article.item.end} +{ chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + { new.sentence +% format.doi output + } + 'skip$ + if$ + + type$ "unpublished" = + type$ "misc" = + or + { note empty$ + 'skip$ + {note.presented + 'skip$ + {new.sentence note output} + if$ + } + if$ + format.date.parens output + } + { new.sentence + type$ "proceedings" = + { author empty$ editor empty$ and + 'bcomment.note + 'format.chapter.and.note + if$ + } + 'format.chapter.and.note + if$ + } + if$ + list.string 'v := + default.list 'list.string := + + type$ ".isbn" * is.in.list + "cnd" is.in.list + or + { + new.sentence +% format.isbn output + } + 'skip$ + if$ + new.sentence + %% commented by SPi as we are using format.eprint %% + %% and also to avoide eprint being printed twice - Start %% + %%eprint empty$ + %% 'skip$ + %% {"\arxivurl{" eprint * "}" * output} + %%if$ + %% End %% + chapter empty$ + type$ "unpublished" = not + type$ "misc" = not + and and + 'skip$ + { new.sentence +%% format.doi output + } + if$ + new.sentence + format.url + v 'list.string := + fin.entry +} + + +FUNCTION {insert.element} +{ #0 bother = + { element "{botherref}" * write$ newline$} + { + type$ "article" = + {element "{barticle}" * write$ newline$} + 'skip$ + if$ + type$ "book" = + type$ "proceedings" = + type$ "manual" = + type$ "booklet" = + or or or + {element "{bbook}" * write$ newline$} + 'skip$ + if$ + + type$ "inbook" = + { "notnumber" last.label = + {element "{bchapter}" * write$ newline$} + {element "{bbook}" * write$ newline$} + if$ + } + 'skip$ + if$ + + type$ "incollection" = + type$ "inproceedings" = + type$ "conference" = + or or + {element "{bchapter}" * write$ newline$} + 'skip$ + if$ + } + if$ +} + +FUNCTION {end.element} +{ "\end" 'element := + item.end + insert.element + "\endbibitem" write$ newline$ +} + +FUNCTION {article.end.element} +{ "\end" 'element := + article.item.end + insert.element + "\endbibitem" write$ newline$ +} + + +FUNCTION {begin.element} +{ "\begin" 'element := + insert.element +} +function {set.options}{ + options empty$ + 'skip$ + {options 'list.string :=} + if$ +} + +FUNCTION {settings} +{} + +FUNCTION {article} +{ output.bibitem + author empty$ + institution empty$ + editor empty$ + and and + journal empty$ + or + year empty$ + or + % above tagging rule means: + % nead: (volume & (pages or number) ) or (doi [without volume, pages and number]) + volume empty$ not + pages empty$ not bnumber empty$ not or + and + + volume empty$ pages empty$ bnumber empty$ and and + doi empty$ not and + or + not + or + {#0 'bother :=} + {#1 'bother :=} + if$ + begin.element + author empty$ + { editor empty$ + 'skip$ + {format.editors stupid.colon} + if$ + } + { format.authors stupid.colon} + if$ + "cnd" is.in.list + { + journal empty$ + {format.title "atitle" make.tag "title" output.check} + {journal "jtitle" make.tag output} + if$ + } + { + format.title "atitle" make.tag "title" output.check + journal empty$ + 'skip$ + {new.sentence journal "jtitle" make.tag output} + if$ + } + if$ + format.art.vol output + pages empty$ + 'skip$ + {insert.comma} + if$ + format.pages output + format.date.parens output + format.doi output + format.eprint output + format.primaryClass output + article.end.element +} + + +FUNCTION {patent} +{ output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + add.period$ + patent.number output + insert.comma + formatpatent.date output + end.element +} + +FUNCTION { other } { patent } + +FUNCTION {book} +{ output.bibitem + author empty$ + institution empty$ + organization empty$ + editor empty$ + and and and + title empty$ + year empty$ + or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + begin.element + author empty$ + { editor empty$ + 'skip$ + {format.editors stupid.colon} + if$ + } + { format.authors stupid.colon} + if$ + format.title "btitle" make.tag "title" output.check + series empty$ + { + format.volume output + insert.comma + format.edition output + } + { edition empty$ + 'skip$ + 'insert.comma + if$ + format.edition output + new.sentence + format.series output + insert.comma + format.volume output + } + if$ + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {booklet} +{output.bibitem + author empty$ + title empty$ + year empty$ + howpublished empty$ + or or or + {#0 'bother :=} + {#1 'bother :=} + if$ + + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "btitle" make.tag "title" output.check + address empty$ publisher empty$ howpublished empty$ and and + 'skip$ + 'new.sentence + if$ + format.pub.address + format.date.parens output + end.element +} + +FUNCTION {misc} +{output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "btitle" make.tag "title" output.check + address empty$ publisher empty$ howpublished empty$ and and + 'skip$ + 'new.sentence + if$ + format.pub.address + end.element +} + +FUNCTION {softmisc} +{output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors} + if$ + stupid.colon + format.title "btitle" make.tag "title" output.check + insert.comma + version output + insert.comma + %%address empty$ publisher empty$ howpublished empty$ and and + %%'skip$ + %% 'new.sentence + %%if$ + format.pub.address + format.softmiscdate output + insert.comma + format.softmisc.eprint output + end.element +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + institution empty$ + organization empty$ + editor empty$ + and and and + title empty$ + year empty$ + or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + + chapter empty$ + { "" 'last.label :=} + { chapter string.to.integer empty$ author empty$ not and + { "notnumber" 'last.label :=} + { "" 'last.label :=} + if$ + } + if$ + + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + "notnumber" last.label = + { chapter "ctitle" make.tag output + add.period$ + } + 'skip$ + if$ + format.in.ed + series empty$ + { + insert.comma + format.volume output + insert.comma + format.edition output + new.sentence + } + { + insert.comma + format.edition output + new.sentence + format.series output + volume empty$ + 'skip$ + 'insert.comma + if$ + format.volume output + } + if$ + publisher.month.pages + publisher empty$ address empty$ edition empty$ series empty$ pages empty$ volume empty$ and and and and and + 'insert.comma + 'skip$ + if$ + format.date.parens output + end.element +} +FUNCTION {incollection} +{ output.bibitem + author empty$ + institution empty$ + and + booktitle empty$ + title empty$ + year empty$ + or or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + + "cnd" is.in.list + { + booktitle empty$ title empty$ not and + { + format.title "ctitle" make.tag "title" output.check + new.sentence + } + 'skip$ + if$ + } + { + format.title "ctitle" make.tag "title" output.check + title empty$ + 'skip$ + {new.sentence} + if$ + } + if$ + format.in.ed.booktitle + series empty$ + { + format.volume output + insert.comma + format.edition output + } + { + edition empty$ + 'skip$ + { insert.comma + format.edition output + } + if$ + new.sentence + format.series output + insert.comma + format.volume output + } + if$ + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {inproceedings} +{ output.bibitem + author empty$ + institution empty$ + and + title empty$ + year empty$ + or or + {#0 'bother :=} + {#1 'bother :=} + if$ + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + + "cnd" is.in.list + { + booktitle empty$ title empty$ not and + { + format.title "ctitle" make.tag "title" output.check + new.sentence + } + 'skip$ + if$ + } + { + format.title "ctitle" make.tag "title" output.check + title empty$ booktitle empty$ not and + 'skip$ + {new.sentence} + if$ + } + if$ + + format.in.ed.booktitle + series empty$ + 'skip$ + {new.sentence format.series output} + if$ + volume empty$ address empty$ publisher empty$ and and + 'skip$ + 'insert.comma + if$ + format.volume output + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ output.bibitem + author empty$ + organization empty$ + title empty$ + year empty$ + address empty$ + or or or or + {#0 'bother :=} + {#1 'bother :=} + if$ + begin.element + + author empty$ + { organization empty$ + 'skip$ + { organization "publisher" make.tag output.nonnull + stupid.colon% add.period$ + } + if$ + } + { format.authors stupid.colon} + if$ + title empty$ + 'skip$ + {format.title "btitle" make.tag output} + if$ + edition empty$ + {new.sentence} + {insert.comma} + if$ + format.edition output + edition empty$ + 'skip$ + {new.sentence} + if$ + author empty$ organization empty$ + or + 'skip$ + { organization "publisher" make.tag output.nonnull + insert.comma + } + if$ + address empty$ + 'skip$ + {address "location" make.tag output} + if$ + format.date.parens output + end.element +} + + +FUNCTION {phdthesis} +{output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + new.sentence + type$ "mastersthesis" = + {"Master's thesis" format.thesis.type output.nonnull} + {"PhD thesis" format.thesis.type output.nonnull} + if$ + school empty$ + 'skip$ + 'insert.comma + if$ + school "school" output.check + address empty$ + 'skip$ + 'insert.comma + if$ + address output + month.year.date output + end.element +} +FUNCTION {mastersthesis}{phdthesis} + + +FUNCTION {proceedings} +{ output.bibitem + author empty$ + institution empty$ + organization empty$ + editor empty$ + and and and + title empty$ + year empty$ + or or + {#0 'bother :=} + { + publisher empty$ address empty$ not and + {#0 'bother :=} + {#1 'bother :=} + if$ + } + if$ + + begin.element + author empty$ + { editor empty$ + {organization "institutionaled" make.tag "organization" output.check } + { format.editors } + if$ + } + { format.authors } + if$ + stupid.colon + format.title "btitle" make.tag output + series empty$ + 'skip$ + {new.sentence format.series output} + if$ + volume empty$ + 'skip$ + 'insert.comma + if$ + format.volume output + publisher.month.pages + format.date.parens output + end.element +} + +FUNCTION {techreport} +{ output.bibitem + #0 'bother := + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + new.sentence + format.tr.number output.nonnull + institution empty$ + 'skip$ + 'insert.comma + if$ + institution "institution" output.check + address empty$ + 'skip$ + 'insert.comma + if$ + address output + month.year.date output + end.element +} + +FUNCTION {unpublished} +{ output.bibitem + #0 'bother := + + begin.element + author empty$ + 'skip$ + {format.authors stupid.colon} + if$ + format.title "title" output.check + note empty$ + 'skip$ + { note.presented + {note output} + 'skip$ + if$ + } + if$ + end.element +} + +FUNCTION {default.type} { unpublished } + +MACRO {jan} {"January"} +MACRO {feb} {"February"} +MACRO {mar} {"March"} +MACRO {apr} {"April"} +MACRO {may} {"May"} +MACRO {jun} {"June"} +MACRO {jul} {"July"} +MACRO {aug} {"August"} +MACRO {sep} {"September"} +MACRO {oct} {"October"} +MACRO {nov} {"November"} +MACRO {dec} {"December"} + +READ + +EXECUTE {identify.mathphys.version} + +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} + +INTEGERS { et.al.char.used } + +FUNCTION {initialize.et.al.char.used} +{ #0 'et.al.char.used := +} + +%%%%% setting default options +FUNCTION {set.default.opt} +{"unsort" 'list.string :=} +%%{"alpha" 'list.string :=} + +EXECUTE {set.default.opt} + +FUNCTION {assign.opt}{ + % First need to set options + "settings" type$ = + { options empty$ + 'skip$ + {options 'list.string :=} + if$ + } + 'skip$ + if$ +} + +ITERATE {assign.opt} +EXECUTE {initialize.et.al.char.used} + +FUNCTION {alpha.format.lab.names} +{ 's := + s num.names$ 'numnames := + numnames #1 > + { numnames #4 > + { #3 'namesleft := } + { numnames 'namesleft := } + if$ + #1 'nameptr := + "" + { namesleft #0 > } + { nameptr numnames = + { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { "+" * + #1 'et.al.char.used := + } + { s nameptr "{v{}}{l{}}" format.name$ * } + if$ + } + { s nameptr "{v{}}{l{}}" format.name$ * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + numnames #4 > + { "+" * + #1 'et.al.char.used := + } + 'skip$ + if$ + } + { s #1 "{v{}}{l{}}" format.name$ + duplicate$ text.length$ #2 < + { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ } + 'skip$ + if$ + } + if$ +} + +FUNCTION {standard.format.lab.names} +{ 's := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ " et~al." * } + { #2 < + 'skip$ + { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { " et~al." * } + { " and " * s #2 "{vv~}{ll}" format.name$ * } + if$ + } + if$ + } + if$ +} +FUNCTION {format.lab.names}{ + "alpha" is.in.list + 'alpha.format.lab.names + 'standard.format.lab.names + if$ +} + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + { key #3 text.prefix$ } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { "zzz" } + { key #3 text.prefix$ } + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.key.organization.label} +{ author empty$ + { key empty$ + { organization empty$ + { "zzz" } + { "The " #4 organization chop.word #3 text.prefix$ } + if$ + } + { key #3 text.prefix$ } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.organization.label} +{ editor empty$ + { key empty$ + { organization empty$ + { "zzz" } + { "The " #4 organization chop.word #3 text.prefix$ } + if$ + } + { key #3 text.prefix$ } + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.short.authors} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.organization.label + { type$ "manual" = + 'author.key.organization.label + 'author.key.label + if$ + } + if$ + } + if$ + 'short.list := +} + +FUNCTION {calc.label} +{ calc.short.authors + short.list + + "alpha" is.in.list + { + duplicate$ + year field.or.null purify$ #-1 #2 substring$ + * + 'label := + year field.or.null purify$ #-1 #4 substring$ + * + sortify 'sort.label := + } + { + "(" + * + year duplicate$ empty$ + short.list key field.or.null = or + { pop$ "" } + 'skip$ + if$ + * + 'label := + label 'sort.label := + } + if$ +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { nameptr #1 > + { " " * + "alpha" is.in.list + 'skip$ + {numnames int.to.str$ * " " *} + if$ + } + 'skip$ + if$ + s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := + nameptr numnames = + t "others" = + and + { "et al" * } + { t sortify * } + if$ + #3 numnames < + "alpha" is.in.list not + and + {#0 'namesleft := + " zzz " * + } + { + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + if$ + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "zzz" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "z" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "z" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "z" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION {presort} +{ calc.label + sort.label sortify + " " + * + type$ "book" = + type$ "inbook" = + or + {author empty$ + 'editor.organization.sort + 'author.organization.sort + if$ + } + { type$ "proceedings" = + type$ "incollection" = + or + {author empty$ + 'editor.organization.sort + 'author.organization.sort + if$ + } + { type$ "manual" = + 'author.organization.sort + 'author.sort + if$ + } + if$ + } + if$ + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ 'sort.label := + sort.label * + #1 entry.max$ substring$ 'sort.key$ := + + "settings" type$ = + {"aaa"} + {"unsort" is.in.list + {"bb"} + {"alpha" is.in.list + {sort.key$} + {sort.label} + if$ + } + if$ + } + if$ + 'sort.key$ := +} + + +ITERATE {presort} + +SORT + +INTEGERS { longest.label.width last.extra.num number.label } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #0 int.to.chr$ 'last.label := + "" 'j := + #0 'longest.label.width := + #0 'last.extra.num := + #0 'number.label := +} + +FUNCTION {forward.pass} +{ last.label label = + { last.extra.num #1 + 'last.extra.num := + last.extra.num int.to.chr$ 'extra.label := + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + label 'last.label := + } + if$ + number.label #1 + 'number.label := +} + +FUNCTION {reverse.pass} +{ j "b" = + { "a" 'extra.label := } + 'skip$ + if$ + extra.label 'j := + label extra.label * 'label := +} + +EXECUTE {initialize.longest.label} + +ITERATE {forward.pass} + +REVERSE {reverse.pass} + +FUNCTION {write.preambule} +{ "%% BioMed_Central_Bib_Style_v1.01" write$ newline$ newline$ + "\begin{thebibliography}{" number.label int.to.str$ * "}" * write$ newline$ + "% BibTex style file: bmc-mathphys.bst (version 2.1), 2014-07-24" write$ newline$ + "\ifx \bisbn \undefined \def \bisbn #1{ISBN #1}\fi" write$ newline$ + "\ifx \binits \undefined \def \binits#1{#1}\fi" write$ newline$ + "\ifx \bauthor \undefined \def \bauthor#1{#1}\fi" write$ newline$ + "\ifx \batitle \undefined \def \batitle#1{#1}\fi" write$ newline$ + "\ifx \bjtitle \undefined \def \bjtitle#1{#1}\fi" write$ newline$ + "\ifx \bvolume \undefined \def \bvolume#1{\textbf{#1}}\fi" write$ newline$ + "\ifx \byear \undefined \def \byear#1{#1}\fi" write$ newline$ + "\ifx \bissue \undefined \def \bissue#1{#1}\fi" write$ newline$ + "\ifx \bfpage \undefined \def \bfpage#1{#1}\fi" write$ newline$ + "\ifx \blpage \undefined \def \blpage #1{#1}\fi" write$ newline$ + "\ifx \burl \undefined \def \burl#1{\textsf{#1}}\fi" write$ newline$ + %%"\ifx \doiurl \undefined \def \doiurl#1{\textsf{#1}}\fi" write$ newline$ + "\ifx \doiurl \undefined \def \doiurl#1{\url{https://doi.org/#1}}\fi" write$ newline$ + "\ifx \betal \undefined \def \betal{\textit{et al.}}\fi" write$ newline$ + "\ifx \binstitute \undefined \def \binstitute#1{#1}\fi" write$ newline$ + "\ifx \binstitutionaled \undefined \def \binstitutionaled#1{#1}\fi" write$ newline$ + "\ifx \bctitle \undefined \def \bctitle#1{#1}\fi" write$ newline$ + "\ifx \beditor \undefined \def \beditor#1{#1}\fi" write$ newline$ + "\ifx \bpublisher \undefined \def \bpublisher#1{#1}\fi" write$ newline$ + "\ifx \bbtitle \undefined \def \bbtitle#1{#1}\fi" write$ newline$ + "\ifx \bedition \undefined \def \bedition#1{#1}\fi" write$ newline$ + "\ifx \bseriesno \undefined \def \bseriesno#1{#1}\fi" write$ newline$ + "\ifx \blocation \undefined \def \blocation#1{#1}\fi" write$ newline$ + "\ifx \bsertitle \undefined \def \bsertitle#1{#1}\fi" write$ newline$ + "\ifx \bsnm \undefined \def \bsnm#1{#1}\fi" write$ newline$ + "\ifx \bsuffix \undefined \def \bsuffix#1{#1}\fi" write$ newline$ + "\ifx \bparticle \undefined \def \bparticle#1{#1}\fi" write$ newline$ + "\ifx \barticle \undefined \def \barticle#1{#1}\fi" write$ newline$ + "\bibcommenthead" write$ newline$ +} + + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + write.preambule + "\ifx \bconfdate \undefined \def \bconfdate #1{#1}\fi" write$ newline$ + "\ifx \botherref \undefined \def \botherref #1{#1}\fi" write$ newline$ + "\ifx \url \undefined \def \url#1{\textsf{#1}}\fi" write$ newline$ + "\ifx \bchapter \undefined \def \bchapter#1{#1}\fi" write$ newline$ + "\ifx \bbook \undefined \def \bbook#1{#1}\fi" write$ newline$ + "\ifx \bcomment \undefined \def \bcomment#1{#1}\fi" write$ newline$ + "\ifx \oauthor \undefined \def \oauthor#1{#1}\fi" write$ newline$ + "\ifx \citeauthoryear \undefined \def \citeauthoryear#1{#1}\fi" write$ newline$ + "\ifx \endbibitem \undefined \def \endbibitem {}\fi" write$ newline$ + "\ifx \bconflocation \undefined \def \bconflocation#1{#1}\fi" write$ newline$ + "\ifx \arxivurl \undefined \def \arxivurl#1{\textsf{#1}}\fi" write$ newline$ + "\csname PreBibitemsHook\endcsname" write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} + + +%% XML output - done for each entry referenced in the BibTeX database +INTEGERS {i ll li j.int global.counter} +STRINGS {lr lp lt ls } + +FUNCTION {replace} +{ + 'lr := % replace string + 'lp := % pattern + 'lt := % text to search + "" 'ls := % result string + lp text.length$ 'll := % length of the search pattern + { lt empty$ not } + { lt #1 ll substring$ lp = + { ls lr * 'ls := + lt ll #1 + global.max$ substring$ 'lt := } + { ls lt #1 #1 substring$ * 'ls := + lt #2 global.max$ substring$ 'lt := } + if$ + } + while$ + ls +} + +FUNCTION {strip.letters} +{ + "" 's := + duplicate$ missing$ + 'pop$ + { + 't := + { t "" = not } + { % ascii '0' = 48, '9' = 57 + t #1 #1 substring$ chr.to.int$ 'i := + i #47 > i #58 < and + { s t #1 #1 substring$ * 's := } + 'skip$ + if$ + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + s +} +FUNCTION {output.xml} +{ duplicate$ "" = + 'pop$ + { " " swap$ * write$ newline$ } + if$ +} + +%% + % markup.xml + % + % Takes 2 args text & tag {"the text " "tag"} + % Returns 1 string {"the text <\tag>"} +%% +FUNCTION {markup.xml} +{ + "" 'v := % result + 't := % tag + duplicate$ missing$ + 'pop$ + { 'v := } + if$ + v "" = + 'skip$ + { "<" t * ">" * v * "" * 'v := } + if$ + v +} + +%% Takes 2 args - tag, string +FUNCTION{markup.xml.title} +{ pop$ % tag + duplicate$ missing$ + 'pop$ + { + 's := % string + s "\&" "&" replace 's := + s "p" markup.xml 's := + s "title" markup.xml output.xml + } + if$ +} + + +%% + % markup.xml.pages + % + % Takes 1 arg (pages string) + % seperates into and if + % there is a - seperator. else no lpage. + % + % need to remove others +%% +FUNCTION{markup.xml.pages} +{ + "" 'v := % fpage + "" 's := % lpage + duplicate$ missing$ + 'pop$ + { + 't := + t " " "" replace 't := % remove all spaces. pgs must be - seperated + { t empty$ not } + { + t #1 #1 substring$ "-" = + { + t #2 global.max$ substring$ 's := + "" 't := % break while loop + }{ + v t #1 #1 substring$ * 'v := + t #2 global.max$ substring$ 't := + } + if$ + } + while$ + } + if$ + v "fpage" markup.xml output.xml + s "lpage" markup.xml output.xml +} + + +%% + % markup.xml.names + % + % Takes 2 args + % tag, namefield (eg. author "au") + % splits fields into and + % writes info + % returns nothing +%% +FUNCTION {markup.xml.names} +{ + 't := % tag + "" 'v := + "" 's := + duplicate$ empty$ + { pop$ + organization missing$ + { institution "cnm" markup.xml + "au" markup.xml "aug" markup.xml output.xml } + { organization "cnm" markup.xml + "au" markup.xml "aug" markup.xml output.xml } + if$ } + { + " " write$ newline$ + 'temp.str := % names string + temp.str num.names$ 'j.int := % num of names + #1 'i := % init counter + { i #1 j.int + < } % while (i <= j.int) + { + " " write$ + + % Initial first names + % if first name all in capitals + % - assume is initial list of first names. + temp.str i "{ff{ }}" format.name$ + duplicate$ "u" change.case$ = + { temp.str i "{ff{ }}" format.name$ } + { temp.str i "{f{}}" format.name$ } + if$ + + % if last name but no first name use cnm; else snm + duplicate$ "" = + { temp.str i "{ll{ }}" format.name$ % last names space seperated. + "cnm" markup.xml write$ } + { temp.str i "{ll{ }}" format.name$ % last names space seperated. + "snm" markup.xml write$ } + if$ + + "fnm" markup.xml write$ + + "" write$ newline$ + i #1 + 'i := + } + while$ + " " write$ newline$ + } + if$ +} + + +%% + % markup.xml.pub + % + % Takes 4 args (school address publisher tag) + % prints concatenation + % returns nothing +%% +FUNCTION {markup.xml.pub} +{ + 't := % Tag + "" 'v := % Publisher + "" 'l := % Address + "" 'f := % School + "" 's := % Answer + duplicate$ missing$ 'pop$ { 'v := } if$ + duplicate$ missing$ 'pop$ { 'l := } if$ + duplicate$ missing$ 'pop$ { 'f := } if$ + "" f = not % school not empty + { f 's := } % return school as publisher + { % else + "" v = "" l = and % address and pub empty + 'skip$ + { + "" l = + { v 's := } % return pub + { "" v = + { l 's := } % return add + { l ": " * v * 's := } % return add : pub + if$ + } + if$ + } + if$ + } + if$ + s t markup.xml output.xml +} + +%% + % xml.phd + % + % Takes nothing + % Returns type (phd/msc) of empty string +%% +FUNCTION {xml.phd} +{ + "phdthesis" type$ = + "mastersthesis" type$ = or + { "phdthesis" type$ = + { "PhD thesis" } + { "Master's thesis" } + if$ + } + { type } % usually empty + if$ +} + +% markup.xml.edition +% +% edition is a numeric value. ie "2" +% if format 2nd 1st etc.. strip letters. +% +FUNCTION {markup.xml.edition} +{ pop$ pop$ %clear stack + edition strip.letters duplicate$ "" = + { pop$ edition } + 'skip$ + if$ + "edition" markup.xml output.xml +} + + +FUNCTION{begin.bmcxmlcomment}{ + newline$ + "\newcommand{\BMCxmlcomment}[1]{}" write$ newline$ + newline$ + "\BMCxmlcomment{" write$ newline$ + newline$ "" write$ newline$ +} + +FUNCTION{end.bmcxmlcomment}{ + newline$ + "" write$ newline$ + "} % end of \BMCxmlcomment" write$ newline$ +} + +FUNCTION {export.xml}{ + newline$ + global.counter #1 + 'global.counter := + "" * + write$ newline$ +% title "\&" "&" replace "title" markup.xml.title + title "title" markup.xml.title + author "aug" markup.xml.names % org. and inst. here + howpublished missing$ + { booktitle missing$ + { journal missing$ + { xml.phd } % Phd/Msc + {journal} + if$ + } {booktitle} + if$ + } { howpublished } + if$ "source" markup.xml output.xml + school + address + publisher "publisher" markup.xml.pub + editor "editor" markup.xml output.xml + edition "edition" markup.xml.edition + series "p" markup.xml + "title" markup.xml + "series" markup.xml output.xml + chapter "p" markup.xml + "title" markup.xml + "section" markup.xml output.xml + % month % ignore + year "pubdate" markup.xml output.xml + + note missing$ + { volume "volume" markup.xml output.xml + number "issue" markup.xml output.xml + pages markup.xml.pages + url "url" markup.xml output.xml } + { note "l" change.case$ "in press" = + { " " write$ newline$ } + { volume "volume" markup.xml output.xml + number "issue" markup.xml output.xml + pages markup.xml.pages + url "url" markup.xml output.xml + note "note" markup.xml output.xml + } + if$ + } + if$ + "" write$ newline$ +} + +%%EXECUTE {begin.bmcxmlcomment} +%%ITERATE {export.xml} +%%EXECUTE {end.bmcxmlcomment} + +%% End of file `sn-mathphys-num.bst'. + + + + diff --git a/waypoint_control/sn-article-template/user-manual.pdf b/waypoint_control/sn-article-template/user-manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ed8f1c4038f2f69c7d875fbfc5232fc32a744d54 GIT binary patch literal 418495 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

9ABg6Yq&>Uo}C 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 z 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%0AvYJU6~~s@0@3v%cu$_xCn^y*B;>ncuhhMBm9x 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 + +\usepackage{graphicx}% +\usepackage{multirow}% +\usepackage{amsmath,amssymb,amsfonts}% +\usepackage{amsthm}% +\usepackage{mathrsfs}% +\usepackage[title]{appendix}% +\usepackage{xcolor}% +\usepackage{textcomp}% +\usepackage{manyfoot}% +\usepackage{booktabs}% +\usepackage{algorithm}% +\usepackage{algorithmicx}% +\usepackage{algpseudocode}% +\usepackage{listings}% +%%%% + +%%%%%=============================================================================%%%% +%%%% Remarks: This template is provided to aid authors with the preparation +%%%% of original research articles intended for submission to journals published +%%%% by Springer Nature. The guidance has been prepared in partnership with +%%%% production teams to conform to Springer Nature technical requirements. +%%%% Editorial and presentation requirements differ among journal portfolios and +%%%% research disciplines. You may find sections in this template are irrelevant +%%%% to your work and are empowered to omit any such section if allowed by the +%%%% journal you intend to submit to. The submission guidelines and policies +%%%% of the journal take precedence. A detailed User Manual is available in the +%%%% template package for technical guidance. +%%%%%=============================================================================%%%% + +%% as per the requirement new theorem styles can be included as shown below +\theoremstyle{thmstyleone}% +\newtheorem{theorem}{Theorem}% meant for continuous numbers +%%\newtheorem{theorem}{Theorem}[section]% meant for sectionwise numbers +%% optional argument [theorem] produces theorem numbering sequence instead of independent numbers for Proposition +\newtheorem{proposition}[theorem]{Proposition}% +%%\newtheorem{proposition}{Proposition}% to get separate numbers for theorem and proposition etc. + +\theoremstyle{thmstyletwo}% +\newtheorem{example}{Example}% +\newtheorem{remark}{Remark}% + +\theoremstyle{thmstylethree}% +\newtheorem{definition}{Definition}% + +\raggedbottom +%%\unnumbered% uncomment this for unnumbered level heads + +\begin{document} + +\title[Article Title]{Article Title} + +%%=============================================================%% +%% GivenName -> \fnm{Joergen W.} +%% Particle -> \spfx{van der} -> surname prefix +%% FamilyName -> \sur{Ploeg} +%% Suffix -> \sfx{IV} +%% \author*[1,2]{\fnm{Joergen W.} \spfx{van der} \sur{Ploeg} +%% \sfx{IV}}\email{iauthor@gmail.com} +%%=============================================================%% + +\author*[1,2]{\fnm{First} \sur{Author}}\email{iauthor@gmail.com} + +\author[2,3]{\fnm{Second} \sur{Author}}\email{iiauthor@gmail.com} +\equalcont{These authors contributed equally to this work.} + +\author[1,2]{\fnm{Third} \sur{Author}}\email{iiiauthor@gmail.com} +\equalcont{These authors contributed equally to this work.} + +\affil*[1]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{100190}, \state{State}, \country{Country}}} + +\affil[2]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{10587}, \state{State}, \country{Country}}} + +\affil[3]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{610101}, \state{State}, \country{Country}}} + +%%==================================%% +%% Sample for unstructured abstract %% +%%==================================%% + +\abstract{The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. Authors are advised to check the author instructions for the journal they are submitting to for word limits and if structural elements like subheadings, citations, or equations are permitted.} + +%%================================%% +%% Sample for structured abstract %% +%%================================%% + +% \abstract{\textbf{Purpose:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. +% +% \textbf{Methods:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. +% +% \textbf{Results:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. +% +% \textbf{Conclusion:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to.} + +\keywords{keyword1, Keyword2, Keyword3, Keyword4} + +%%\pacs[JEL Classification]{D8, H51} + +%%\pacs[MSC Classification]{35A01, 65L10, 65L12, 65L20, 65L70} + +\maketitle + +\section{Introduction}\label{sec1} + +The Introduction section, of referenced text \cite{bib1} expands on the background of the work (some overlap with the Abstract is acceptable). The introduction should not include subheadings. + +Springer Nature does not impose a strict layout as standard however authors are advised to check the individual requirements for the journal they are planning to submit to as there may be journal-level preferences. When preparing your text please also be aware that some stylistic choices are not supported in full text XML (publication version), including coloured font. These will not be replicated in the typeset article if it is accepted. + +\section{Results}\label{sec2} + +\subsection{Twin system architecture} +% 介绍我们这个孪生系统的组成结构,系统运行流程 + +\subsection{End-to-end data transmission} +% 介绍我们系统的数据是怎样端到端传输的,收集端与服务端的布局是怎样的,延迟有多少 + +\subsection{Face different targets} + +\subsubsection{Pedestrian twin} +% 单独孪生人的效果 + +\subsubsection{Vehicle twin} +% 单独孪生车的效果 + +\subsubsection{Pedestrian-Vehicle twin} +% 人车同时孪生的效果 + +\subsection{Twins in different scenarios} + +\subsubsection{Town01 scene twinning effect} +% 展示在town01场景下的人车孪生效果 + +\subsubsection{Town10 scene twinning effect} +% 展示在town10场景下的人车孪生效果 + +\subsection{Critical-State Twin} +% 测试各种极端条件(如大雾、暴雨等)对孪生的影响,找出对孪生效果起决定性作用(基本可以认为无法孪生,即孪生精度过低)的那个临界值 + +\section{Discussion}\label{sec12} + +Discussions should be brief and focused. In some disciplines use of Discussion or `Conclusion' is interchangeable. It is not mandatory to use both. Some journals prefer a section `Results and Discussion' followed by a section `Conclusion'. Please refer to Journal-level guidance for any specific requirements. + + + +%%===========================================================================================%% +%% If you are submitting to one of the Nature Portfolio journals, using the eJP submission %% +%% system, please include the references within the manuscript file itself. You may do this %% +%% by copying the reference list from your .bbl file, paste it into the main manuscript .tex %% +%% file, and delete the associated \verb+\bibliography+ commands. %% +%%===========================================================================================%% + +\bibliography{sn-bibliography}% common bib file +%% if required, the content of .bbl file can be included here once bbl is generated +%%\input sn-article.bbl + +\end{document} diff --git a/waypoint_control/twin_paper/sn-article.tex b/waypoint_control/twin_paper/sn-article.tex new file mode 100644 index 0000000..e004a3e --- /dev/null +++ b/waypoint_control/twin_paper/sn-article.tex @@ -0,0 +1,197 @@ +%Version 3.1 December 2024 +% See section 11 of the User Manual for version history +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% %% +%% Please do not use \input{...} to include other tex files. %% +%% Submit your LaTeX manuscript as one .tex document. %% +%% %% +%% All additional figures and files should be attached %% +%% separately and not embedded in the \TeX\ document itself. %% +%% %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%\documentclass[referee,sn-basic]{sn-jnl}% referee option is meant for double line spacing + +%%=======================================================%% +%% to print line numbers in the margin use lineno option %% +%%=======================================================%% + +%%\documentclass[lineno,pdflatex,sn-basic]{sn-jnl}% Basic Springer Nature Reference Style/Chemistry Reference Style + +%%=========================================================================================%% +%% the documentclass is set to pdflatex as default. You can delete it if not appropriate. %% +%%=========================================================================================%% + +%%\documentclass[sn-basic]{sn-jnl}% Basic Springer Nature Reference Style/Chemistry Reference Style + +%%Note: the following reference styles support Namedate and Numbered referencing. By default the style follows the most common style. To switch between the options you can add or remove �Numbered� in the optional parenthesis. +%%The option is available for: sn-basic.bst, sn-chicago.bst% + +%%\documentclass[pdflatex,sn-nature]{sn-jnl}% Style for submissions to Nature Portfolio journals +%%\documentclass[pdflatex,sn-basic]{sn-jnl}% Basic Springer Nature Reference Style/Chemistry Reference Style +\documentclass[pdflatex,sn-mathphys-num]{sn-jnl}% Math and Physical Sciences Numbered Reference Style +%%\documentclass[pdflatex,sn-mathphys-ay]{sn-jnl}% Math and Physical Sciences Author Year Reference Style +%%\documentclass[pdflatex,sn-aps]{sn-jnl}% American Physical Society (APS) Reference Style +%%\documentclass[pdflatex,sn-vancouver-num]{sn-jnl}% Vancouver Numbered Reference Style +%%\documentclass[pdflatex,sn-vancouver-ay]{sn-jnl}% Vancouver Author Year Reference Style +%%\documentclass[pdflatex,sn-apa]{sn-jnl}% APA Reference Style +%%\documentclass[pdflatex,sn-chicago]{sn-jnl}% Chicago-based Humanities Reference Style + +%%%% Standard Packages +%% + +\usepackage{graphicx}% +\usepackage{multirow}% +\usepackage{amsmath,amssymb,amsfonts}% +\usepackage{amsthm}% +\usepackage{mathrsfs}% +\usepackage[title]{appendix}% +\usepackage{xcolor}% +\usepackage{textcomp}% +\usepackage{manyfoot}% +\usepackage{booktabs}% +\usepackage{algorithm}% +\usepackage{algorithmicx}% +\usepackage{algpseudocode}% +\usepackage{listings}% +%%%% + +%%%%%=============================================================================%%%% +%%%% Remarks: This template is provided to aid authors with the preparation +%%%% of original research articles intended for submission to journals published +%%%% by Springer Nature. The guidance has been prepared in partnership with +%%%% production teams to conform to Springer Nature technical requirements. +%%%% Editorial and presentation requirements differ among journal portfolios and +%%%% research disciplines. You may find sections in this template are irrelevant +%%%% to your work and are empowered to omit any such section if allowed by the +%%%% journal you intend to submit to. The submission guidelines and policies +%%%% of the journal take precedence. A detailed User Manual is available in the +%%%% template package for technical guidance. +%%%%%=============================================================================%%%% + +%% as per the requirement new theorem styles can be included as shown below +\theoremstyle{thmstyleone}% +\newtheorem{theorem}{Theorem}% meant for continuous numbers +%%\newtheorem{theorem}{Theorem}[section]% meant for sectionwise numbers +%% optional argument [theorem] produces theorem numbering sequence instead of independent numbers for Proposition +\newtheorem{proposition}[theorem]{Proposition}% +%%\newtheorem{proposition}{Proposition}% to get separate numbers for theorem and proposition etc. + +\theoremstyle{thmstyletwo}% +\newtheorem{example}{Example}% +\newtheorem{remark}{Remark}% + +\theoremstyle{thmstylethree}% +\newtheorem{definition}{Definition}% + +\raggedbottom +%%\unnumbered% uncomment this for unnumbered level heads + +\begin{document} + +\title[Article Title]{Article Title} + +%%=============================================================%% +%% GivenName -> \fnm{Joergen W.} +%% Particle -> \spfx{van der} -> surname prefix +%% FamilyName -> \sur{Ploeg} +%% Suffix -> \sfx{IV} +%% \author*[1,2]{\fnm{Joergen W.} \spfx{van der} \sur{Ploeg} +%% \sfx{IV}}\email{iauthor@gmail.com} +%%=============================================================%% + +\author*[1,2]{\fnm{First} \sur{Author}}\email{iauthor@gmail.com} + +\author[2,3]{\fnm{Second} \sur{Author}}\email{iiauthor@gmail.com} +\equalcont{These authors contributed equally to this work.} + +\author[1,2]{\fnm{Third} \sur{Author}}\email{iiiauthor@gmail.com} +\equalcont{These authors contributed equally to this work.} + +\affil*[1]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{100190}, \state{State}, \country{Country}}} + +\affil[2]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{10587}, \state{State}, \country{Country}}} + +\affil[3]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{610101}, \state{State}, \country{Country}}} + +%%==================================%% +%% Sample for unstructured abstract %% +%%==================================%% + +\abstract{The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. Authors are advised to check the author instructions for the journal they are submitting to for word limits and if structural elements like subheadings, citations, or equations are permitted.} + +%%================================%% +%% Sample for structured abstract %% +%%================================%% + +% \abstract{\textbf{Purpose:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. +% +% \textbf{Methods:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. +% +% \textbf{Results:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. +% +% \textbf{Conclusion:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to.} + +\keywords{keyword1, Keyword2, Keyword3, Keyword4} + +%%\pacs[JEL Classification]{D8, H51} + +%%\pacs[MSC Classification]{35A01, 65L10, 65L12, 65L20, 65L70} + +\maketitle + +\section{Introduction}\label{sec1} + +The Introduction section, of referenced text \cite{bib1} expands on the background of the work (some overlap with the Abstract is acceptable). The introduction should not include subheadings. + +Springer Nature does not impose a strict layout as standard however authors are advised to check the individual requirements for the journal they are planning to submit to as there may be journal-level preferences. When preparing your text please also be aware that some stylistic choices are not supported in full text XML (publication version), including coloured font. These will not be replicated in the typeset article if it is accepted. + +\section{Results}\label{sec2} + +\subsection{Twin system architecture} +% 介绍我们这个孪生系统的组成结构,系统运行流程 + +\subsection{End-to-end data transmission} +% 介绍我们系统的数据是怎样端到端传输的,收集端与服务端的布局是怎样的,延迟有多少 + +\subsection{Face different targets} + +\subsubsection{Pedestrian twin} +% 单独孪生人的效果 + +\subsubsection{Vehicle twin} +% 单独孪生车的效果 + +\subsubsection{Pedestrian-Vehicle twin} +% 人车同时孪生的效果 + +\subsection{Twins in different scenarios} + +\subsubsection{Town01 scene twinning effect} +% 展示在town01场景下的人车孪生效果 + +\subsubsection{Town10 scene twinning effect} +% 展示在town10场景下的人车孪生效果 + +\subsection{Critical-State Twin} +% 测试各种极端条件(如大雾、暴雨等)对孪生的影响,找出对孪生效果起决定性作用(基本可以认为无法孪生,即孪生精度过低)的那个临界值 + +\section{Discussion}\label{sec12} + +Discussions should be brief and focused. In some disciplines use of Discussion or `Conclusion' is interchangeable. It is not mandatory to use both. Some journals prefer a section `Results and Discussion' followed by a section `Conclusion'. Please refer to Journal-level guidance for any specific requirements. + + + +%%===========================================================================================%% +%% If you are submitting to one of the Nature Portfolio journals, using the eJP submission %% +%% system, please include the references within the manuscript file itself. You may do this %% +%% by copying the reference list from your .bbl file, paste it into the main manuscript .tex %% +%% file, and delete the associated \verb+\bibliography+ commands. %% +%%===========================================================================================%% + +\bibliography{sn-bibliography}% common bib file +%% if required, the content of .bbl file can be included here once bbl is generated +%%\input sn-article.bbl + +\end{document} From 9aa1af5e6efc35ede07057cde8deeacccca2e039 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Wed, 4 Feb 2026 20:05:55 +0800 Subject: [PATCH 25/31] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sn-article-template/bst/sn-apacite.bst | 5332 ----------------- .../sn-article-template/bst/sn-aps.bst | 1531 ----- .../sn-article-template/bst/sn-basic.bst | 1818 ------ .../sn-article-template/bst/sn-chicago.bst | 1683 ------ .../bst/sn-mathphys-ay.bst | 3208 ---------- .../bst/sn-mathphys-num.bst | 3211 ---------- .../sn-article-template/bst/sn-nature.bst | 1724 ------ .../bst/sn-vancouver-ay.bst | 2085 ------- .../bst/sn-vancouver-num.bst | 2021 ------- .../sn-article-template/empty.eps | 80 - waypoint_control/sn-article-template/fig.eps | 1456 ----- .../sn-article-template/sn-article.aux | 39 - .../sn-article-template/sn-article.bbl | 59 - .../sn-article-template/sn-article.blg | 69 - .../sn-article-template/sn-article.log | 734 --- .../sn-article-template/sn-article.out | 13 - .../sn-article-template/sn-article.pdf | Bin 140574 -> 0 bytes .../sn-article-template/sn-article.synctex.gz | Bin 8486 -> 0 bytes .../sn-article-template/sn-article.tex | 197 - .../sn-article-template/sn-bibliography.bib | 164 - .../sn-article-template/sn-jnl.cls | 1 - .../sn-article-template/sn-mathphys-num.bst | 3211 ---------- .../sn-article-template/user-manual.pdf | Bin 418495 -> 0 bytes waypoint_control/twin_paper/sn-article.tex | 197 - 24 files changed, 28833 deletions(-) delete mode 100644 waypoint_control/sn-article-template/bst/sn-apacite.bst delete mode 100644 waypoint_control/sn-article-template/bst/sn-aps.bst delete mode 100644 waypoint_control/sn-article-template/bst/sn-basic.bst delete mode 100644 waypoint_control/sn-article-template/bst/sn-chicago.bst delete mode 100644 waypoint_control/sn-article-template/bst/sn-mathphys-ay.bst delete mode 100644 waypoint_control/sn-article-template/bst/sn-mathphys-num.bst delete mode 100644 waypoint_control/sn-article-template/bst/sn-nature.bst delete mode 100644 waypoint_control/sn-article-template/bst/sn-vancouver-ay.bst delete mode 100644 waypoint_control/sn-article-template/bst/sn-vancouver-num.bst delete mode 100644 waypoint_control/sn-article-template/empty.eps delete mode 100644 waypoint_control/sn-article-template/fig.eps delete mode 100644 waypoint_control/sn-article-template/sn-article.aux delete mode 100644 waypoint_control/sn-article-template/sn-article.bbl delete mode 100644 waypoint_control/sn-article-template/sn-article.blg delete mode 100644 waypoint_control/sn-article-template/sn-article.log delete mode 100644 waypoint_control/sn-article-template/sn-article.out delete mode 100644 waypoint_control/sn-article-template/sn-article.pdf delete mode 100644 waypoint_control/sn-article-template/sn-article.synctex.gz delete mode 100644 waypoint_control/sn-article-template/sn-article.tex delete mode 100644 waypoint_control/sn-article-template/sn-bibliography.bib delete mode 100644 waypoint_control/sn-article-template/sn-jnl.cls delete mode 100644 waypoint_control/sn-article-template/sn-mathphys-num.bst delete mode 100644 waypoint_control/sn-article-template/user-manual.pdf delete mode 100644 waypoint_control/twin_paper/sn-article.tex diff --git a/waypoint_control/sn-article-template/bst/sn-apacite.bst b/waypoint_control/sn-article-template/bst/sn-apacite.bst deleted file mode 100644 index f5e1335..0000000 --- a/waypoint_control/sn-article-template/bst/sn-apacite.bst +++ /dev/null @@ -1,5332 +0,0 @@ -%% -%% This is file `sn-apacite.bst', -%% generated with the docstrip utility. -%% -%% The original source files were: apacite.dtx -%% -%% This file may be distributed and/or modified under the -%% conditions of the LaTeX Project Public License, either -%% version 1.3 of this license or (at your option) any later -%% version. The latest version of this license is in: -%% -%% http://www.latex-project.org/lppl.txt -%% -%% and version 1.3 or later is part of all distributions of -%% LaTeX version 2005/12/01 or later. - -FUNCTION {identify.apacite.version} -{ % Put identifying string in the .blg file - "sn-apacite.bst" - " [2024/07/19 v1.1 APA bibliography style]" - * top$ -} - -ENTRY - { address - annote - annotate - author - booktitle - chair - chapter - day - doi - edition - editor - englishtitle - firstkey - howpublished - institution - journal - key - keywords - lastchecked - month - nihms - note - number - organization - originaladdress - originalbooktitle - originaledition - originaleditor - originaljournal - originalnumber - originalpages - originalpublisher - originalvolume - originalyear - pages - pmcid - publisher - school - series - symposium - text - title - translator - type - url - urldate - volume - year - eprint - archive - archivePrefix - primaryClass - eid - adsurl - adsnote - version - } - { cite.order %% order of first citation - title.number %% for sorting titles - cite.initials %% dummy (0-1) indicating whether or not - %% initials of the 1st author must - %% be used for citing - cite.num.names.full %% number of names to be cited for full and - cite.num.names.short %% short cite - add.to.year %% For a, b, c, etc. after year - %% in multiple citations with same author-year - } - { year.label %% For sorting entries by year - author.year.sort.label %% For sorting entries and checking whether - %% initials should be added, how many authors - %% should be cited and whether a, b, etc. - %% after year is necessary - title.sort.label %% for sorting titles - citeorder.sort.label %% for sorting by citation order - type.2 %% Replacement for type with misc entries and - %% entries that revert to misc. - } -INTEGERS { len pos name.max old.number numnames numnames.old - nameptr lastname format.num.names cite.initials.old - cite.num.names.old add.to.year.old forward - multiresult dot brace.level - } - -STRINGS { s t u old.label field - aut1f aut1s aut1f.old aut1s.old - aut2 aut2.old - aut3 aut3.old - aut4 aut4.old - aut5 aut5.old - aut6 aut6.old - year.label.old - } -FUNCTION {test} { #0 } -FUNCTION {dump.stack} -{ "---- STACK {" cite$ * "} ----" * top$ - stack$ - "---- END STACK {" cite$ * "} ----" * top$ -} -FUNCTION {make.index} { #0 } -FUNCTION {unsorted} { #0 } -MACRO {jan} {"{\APACmonth{01}}"} -MACRO {feb} {"{\APACmonth{02}}"} -MACRO {mar} {"{\APACmonth{03}}"} -MACRO {apr} {"{\APACmonth{04}}"} -MACRO {may} {"{\APACmonth{05}}"} -MACRO {jun} {"{\APACmonth{06}}"} -MACRO {jul} {"{\APACmonth{07}}"} -MACRO {aug} {"{\APACmonth{08}}"} -MACRO {sep} {"{\APACmonth{09}}"} -MACRO {oct} {"{\APACmonth{10}}"} -MACRO {nov} {"{\APACmonth{11}}"} -MACRO {dec} {"{\APACmonth{12}}"} -MACRO {winter} {"{\APACmonth{13}}"} -MACRO {spring} {"{\APACmonth{14}}"} -MACRO {summer} {"{\APACmonth{15}}"} -MACRO {fall} {"{\APACmonth{16}}"} -FUNCTION {not} -{ { #0 } - { #1 } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {and} -{ 'skip$ - { pop$ #0 } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {or} -{ { pop$ #1 } - 'skip$ - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % issues warning if field is empty - % call with - % "field" field warning.if.empty - % Note that the first field must be between quotes - % because it is the fieldname for use in the warning message. - % -FUNCTION {warning.if.empty} -{ empty$ - { "No " swap$ * " in " * cite$ * warning$ } - { pop$ } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % issues warning if title, type, and howpublished are empty - % -FUNCTION {check.relevant.fields} -{ title empty$ - type empty$ and - howpublished empty$ and - { "No title, type, and howpublished in " cite$ * warning$ } - 'skip$ - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % delivers 1 if (both editor and translator - % not empty and not equal to each other) - % 0 if (editor or translator empty) or - % (editor = translator) - % -FUNCTION {editor.ne.trans} -{ translator empty$ - { #0 } - { editor empty$ - { #0 } - { translator editor = - { #0 } - { #1 } - if$ - } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {conv.int.to.str} -{ duplicate$ #10 < - { "0000" swap$ int.to.str$ * } - { duplicate$ #100 < - { "000" swap$ int.to.str$ * } - { duplicate$ #1000 < - { "00" swap$ int.to.str$ * } - { duplicate$ #10000 < - { "0" swap$ int.to.str$ * } - { int.to.str$ } - if$ - } - if$ - } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {ref.type} -{ type$ "article" = - type$ "magazine" = - type$ "newspaper" = - type$ "book" = - type$ "techreport" = - type$ "unpublished" = - type$ "misc" = - type$ "booklet" = - type$ "manual" = - type$ "proceedings" = - or - or - or - or - or - or - or - or - or - { #1 } - { type$ "incollection" = - type$ "phdthesis" = - type$ "mastersthesis" = - type$ "lecture" = - type$ "inbook" = - type$ "inproceedings" = - type$ "conference" = - type$ "intechreport" = - or - or - or - or - or - or - or - { #2 } - { type$ "literal" = - { #3 } - { #0 } - if$ - } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {is.atype} -{ type$ "article" = - type$ "magazine" = - type$ "newspaper" = - type$ "incollection" = - type$ "inbook" = - type$ "inproceedings" = - type$ "conference" = - type$ "intechreport" = - type$ "manual" = - or - or - or - or - or - or - or - or - { #1 } - { journal empty$ not - % - type$ "phdthesis" = - type$ "mastersthesis" = - or - % - and - { #1 } - { type$ "misc" = - type empty$ not and - { type "\bibmessage" = - type "\bibcomputerprogram" = - type "\bibcomputerprogrammanual" = - type "\bibcomputerprogramandmanual" = - type "\bibcomputersoftware" = - type "\bibcomputersoftwaremanual" = - type "\bibcomputersoftwareandmanual" = - type "\bibprogramminglanguage" = - or - or - or - or - or - or - or - { #1 } - { #0 } - if$ - } - { #0 } - if$ - } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % connects two strings with connect string - % if one of them empty, then connect string - % is left out - % - % call with S1 S2 connectstring connect.check - % -FUNCTION {connect.check} -{ 'u := - % - % if S2 = "" - % - duplicate$ empty$ - % - % then remove S2 - % - { pop$ - % - % S1 is on top of stack. - % if it is empty, it is replaced by the empty string "" - % - duplicate$ empty$ - { pop$ "" } - 'skip$ - if$ - } - % - % else swap S1 and S2 so that S1 can be checked - % - { swap$ - % - % if S1 is empty, remove S1 so that S2 is left on the - % stack and is the result is given - % - duplicate$ empty$ - { pop$ } - % - % now the real work starts: - % push the connect string "C" - % so that top of stack is "C" "S1" "S2" - % concatenate, so that top of stack is - % "S1+C" "S2" - % - { u * - % - % swap and concatenate - % - swap$ * - } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % connects two strings with space ("\ ") - % if length of second is 4 or larger, - % connects them with non-breaking space ("tie", "~") - % if length of second smaller than 4 - % - % call with S1 S2 tie.or.space.connect - % result: "S1\ S2" or "S1~S2" - % -FUNCTION {tie.or.space.connect} -{ duplicate$ text.length$ #4 < - { "~" } - { "\ " } - if$ - swap$ * * -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % connects two strings with comma (", ") - % if one of them is empty, the comma is left out - % - % call with S1 S2 connect.with.comma.check - % result: "S1, S2" - % -FUNCTION {connect.with.comma.check} -{ ", " connect.check } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % connects two strings with semicolon ("; ") - % if one of them is empty, semicolon is left out - % - % call with S1 S2 connect.with.semicolon.check - % result: "S1; S2" - % -FUNCTION {connect.with.semicolon.check} -{ "; " connect.check } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % connects two strings with colon (": ") - % if one of them is empty, colon is left out - % - % call with S1 S2 connect.with.colon.check - % result: "S1: S2" - % -FUNCTION {connect.with.colon.check} -{ ": " connect.check } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % connects two strings with space ("\ ") - % - % call with S1 S2 connect.with.space.check - % result: "S1\ S2" - % -FUNCTION {connect.with.space.check} -{ "\ " connect.check } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % encloses string in pre- and postfix string - % call with - % prefix postfix S enclose.check - % delivers empty string if S empty - % -FUNCTION {enclose.check} -{ duplicate$ empty$ - { pop$ pop$ pop$ - "" - } - { swap$ * * } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % emphasizes top of stack - % call with - % "string" emphasize.check - % -FUNCTION {emphasize.check} -{ "\Bem{" swap$ - "}" swap$ - enclose.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % brackets top of stack - % call with - % "string" bracket - % -FUNCTION {bracket.check} -{ "[" swap$ - "]" swap$ - enclose.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % parenthesizes top of stack - % call with - % "string" parenthesize - % -FUNCTION {parenthesize.check} -{ "(" swap$ - ")" swap$ - enclose.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % checks whether argument is "multiresult": - % whether it contains '-', '+', or ',' characters - % used with pages to check whether pp. or p. must be used - % -FUNCTION {multi.result.check} -{ 't := - #0 'multiresult := - % - % while (not multiresult) and (length(t) > 1) do - % - { multiresult not - t text.length$ #1 > - and - } - % - % if t(1-2) = "--" or t(1) = "+" or "," - % then multiresult = 1 - % else t = t(2-last) - % - { t #1 #2 substring$ 's := - "--" s = - { #1 'multiresult := } - { t #1 #1 substring$ 's := - "+" s = - "," s = - or - { #1 'multiresult := } - { t #2 global.max$ substring$ 't := } - if$ - } - if$ - } - while$ - multiresult -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % Checks whether an author is a corporate author, i.e., - % whether the field starts with "{\bibcorporate". - % Call with - % field is.bibcorporate - % -FUNCTION {is.bibcorporate} -{ #1 #14 substring$ "{\bibcorporate" = } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {sortify} -{ purify$ - "l" change.case$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {remove.spaces} -{ % Remove spaces from string. - % Works best if string only contains alphanumeric characters and spaces. - 's := % The original string - s text.length$ 'len := % Its length (no. of characters) - "" 't := % Initialize the transformed string - #0 'pos := - % - % while (pos < len) do - % - { pos len < } - { pos #1 + 'pos := - s pos #1 substring$ 'u := - % - % u is the pos-th character in s - % If it is a space, move to next character, - % else copy character to output. - % - u " " = - 'skip$ - { t u * 't := } - if$ - } - while$ - % - % Now push the result back on the stack - t -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % end block by writing what's left on the stack and - % starting a new line - % -FUNCTION {output.end.block} -{ write$ - newline$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % end block by adding a period and writing what's left - % on the stack and starting a new line - % -FUNCTION {output.dot.end.block} -{ add.period$ - output.end.block -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % starting new block by writing what's left on the stack, - % starting a new line and adding some extra space or - % whatever is more defined in \newblock - % -FUNCTION {output.new.block} -{ output.end.block - "\newblock" write$ newline$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % starting new block by writing what's left on the stack, - % starting a new line and adding some extra space or - % whatever is more defined in \newblock - % -FUNCTION {output.dot.new.block} -{ add.period$ - output.new.block -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {start.new.block} -{ "\unskip\ " write$ newline$ - "\newblock " write$ newline$ -} - -FUNCTION {sort.name.format.classic} { "{ll{}}{ f{}}{ vv{}}{ jj{}}" } - -FUNCTION {cite.name.format.classic} { "{ll}" } - -FUNCTION {author.name.format.classic} { "{ll}{, f{.}.}{ vv}{, jj}" } - -FUNCTION {index.name.format.classic} { "{ll}{, f{.}.}{ vv}{, jj}" } - -FUNCTION {sort.name.format} { "{vv{}}{ll{}}{ f{}}{ jj{}}" } - -FUNCTION {cite.name.format} { "{vv }{ll}" } - -FUNCTION {cite.initials.name.format} { "{f{.}.~~}{vv }{ll}{ jj}" } - -FUNCTION {author.name.format} { "{vv }{ll}{, f{.}.}{, jj}" } - -FUNCTION {editor.name.format} { "{f{.}.~~}{vv }{ll}{ jj}" } - -FUNCTION {index.name.format} { "{vv }{ll}{, f{.}.}{, jj}" } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {init.initials} -{ "yyyyy" 'aut1f.old := - "yyyyy" 'aut1s.old := - #0 'cite.initials.old := -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {update.no.initials} -{ 'field := - field 'aut1f.old := - field 'aut1s.old := - #0 'cite.initials.old := -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {check.add.initials.aut} -{ % - % If last name is equal to previous last name - % but initials are different, then initials should - % be cited. If initials are also the same, initials - % should be cited if that is the case for the previous - % author . - % - aut1s aut1s.old = - { aut1f aut1f.old = - { cite.initials.old 'cite.initials := } - { #1 'cite.initials := - aut1f 'aut1f.old := - aut1s 'aut1s.old := - cite.initials 'cite.initials.old := - } - if$ - } - { % - % Different last name. - aut1f 'aut1f.old := - aut1s 'aut1s.old := - cite.initials 'cite.initials.old := - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {check.add.initials.field} -{ 'field := - field #1 cite.initials.name.format format.name$ 'aut1f := - field #1 cite.name.format format.name$ 'aut1s := - % - % Now do the actual work - % - check.add.initials.aut -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {check.add.initials} -{ % - % Check whether author or editor or other field acts as author. - % Initials are only relevant with author or editor. - % - firstkey empty$ not - { key empty$ not - { % - % Both key and firstkey are nonempty. - % Then, key is treated as last name of first author, - % and firstkey is treated as last name + initials of - % first author . - % - firstkey sortify remove.spaces 'aut1f := - key sortify remove.spaces 'aut1s := - check.add.initials.aut - } - { firstkey sortify remove.spaces update.no.initials } - if$ - } - { key empty$ not - { key sortify remove.spaces update.no.initials } - { % - % No key or firstkey, so find out which field - % to use as author. - % - % Check reference type: - % if result is 1 then possibly editor acts as author - % 2 then editor does not act as author - % 3 then key should have been used - % 0 then unknown reference type - ref.type #2 = - { % - % Format first author with and without initials - author empty$ - { title.sort.label update.no.initials } - { author check.add.initials.field } - if$ - } - { % - % Format first author with and without initials - author empty$ - { editor empty$ - { title.sort.label update.no.initials } - { editor check.add.initials.field } - if$ - } - { author check.add.initials.field } - if$ - } - if$ - } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {tentative.cite.num.names.field} -{ 'field := - field num.names$ 'numnames := - numnames #3 < - { % - % 1 or 2 names: always cite all of them. - numnames 'cite.num.names.full := - numnames 'cite.num.names.short := - } - { numnames #6 < - { % - % 3-5 names: cite all of them the first time, - % only the first name later times - numnames 'cite.num.names.full := - #1 'cite.num.names.short := - } - { % - % 6 or more names: cite only the first name - #1 'cite.num.names.full := - #1 'cite.num.names.short := - } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {tentative.cite.num.names} -{ % - % Check whether author or editor or other field acts as author. - % Number of names is only relevant with author or editor. - % - firstkey empty$ not - { - #1 'cite.num.names.full := - #1 'cite.num.names.short := - } - { key empty$ not - { - #1 'cite.num.names.full := - #1 'cite.num.names.short := - } - { % - % No key or firstkey, so find out which field - % to use as author. - % - % Check reference type: - % if result is 1 then possibly editor acts as author - % 2 then editor does not act as author - % 3 then key should have been used - % 0 then unknown reference type - ref.type #2 = - { % - % Format first author with and without initials - author empty$ - { - #1 'cite.num.names.full := - #1 'cite.num.names.short := - } - { author tentative.cite.num.names.field } - if$ - } - { % - % Format first author with and without initials - author empty$ - { editor empty$ - { - #1 'cite.num.names.full := - #1 'cite.num.names.short := - } - { editor tentative.cite.num.names.field } - if$ - } - { author tentative.cite.num.names.field } - if$ - } - if$ - } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {init.cite.num.names} -{ #0 'cite.num.names.old := - #0 'numnames.old := - "yyyy" 'year.label.old := - #0 'add.to.year.old := - "" 'aut1f.old := - "" 'aut2.old := - "" 'aut3.old := - "" 'aut4.old := - "" 'aut5.old := - "" 'aut6.old := -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {update.cite.num.names} -{ cite.num.names.short 'cite.num.names.old := - numnames 'numnames.old := - year.label 'year.label.old := - add.to.year 'add.to.year.old := - aut1f 'aut1f.old := - aut2 'aut2.old := - aut3 'aut3.old := - aut4 'aut4.old := - aut5 'aut5.old := - aut6 'aut6.old := -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {format.6.authors} -{ % - % First author: with initials. - % - field #1 cite.initials.name.format format.name$ 'aut1f := - % - % Second and later authors: without initials. - % - numnames #1 > - name.max #1 > - and - { % - % 2nd author - field #2 cite.name.format format.name$ 'aut2 := - % - numnames #2 > - name.max #2 > - and - { % - % 3nd author - field #3 cite.name.format format.name$ 'aut3 := - % - numnames #3 > - name.max #3 > - and - { % - % 4th author - field #4 cite.name.format format.name$ 'aut4 := - % - numnames #4 > - name.max #4 > - and - { % - % 5th author - field #5 cite.name.format format.name$ 'aut5 := - % - numnames #5 > - name.max #5 > - and - { % - % 6th author - field #6 cite.name.format format.name$ 'aut6 := - } - { % - % 5 authors: 6 is empty - % - "" 'aut6 := - } - if$ - } - { % - % 4 authors: 5-6 are empty - % - "" 'aut5 := - "" 'aut6 := - } - if$ - } - { % - % 3 authors: 4-6 are empty - % - "" 'aut4 := - "" 'aut5 := - "" 'aut6 := - } - if$ - } - { % - % 2 authors: 3-6 are empty - % - "" 'aut3 := - "" 'aut4 := - "" 'aut5 := - "" 'aut6 := - } - if$ - } - { % - % Only 1 author: 2-6 are empty - % - "" 'aut2 := - "" 'aut3 := - "" 'aut4 := - "" 'aut5 := - "" 'aut6 := - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {change.add.to.year} -{ - forward #1 = - { % - % Moving forward: this add.to.year number must be 1 higher than - % previous. - % - add.to.year.old #0 > - { add.to.year.old #1 + 'add.to.year := } - { #2 'add.to.year := } - if$ - } - { % - % Moving backward: this add.to.year number must be 1 lower than - % previous. - % - add.to.year.old #1 - 'add.to.year := - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {definitive.cite.num.names.1.or.2} -{ % - numnames numnames.old = - { % - % Same number of names: ambiguity could arise. Check whether current - % and previous have the same author(s). - % - aut1f aut1f.old = - { % - % Same first author: if the second author is also the same or if - % there is only one author, a's and b's should be added. - % - aut2 aut2.old = - numnames #2 = - and - % - numnames #1 = - or - { % - % Same author(s): add to year. - % - change.add.to.year - } - { % - % Different second author: no ambiguity possible. - % - skip$ - } - if$ - } - { % - % Different first author: no ambiguity possible. - % - skip$ - } - if$ - } - { % - % Different number of names: no ambiguity possible. - % - skip$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {definitive.cite.num.names.3.or.more} -{ % - % Check whether current and previous have the same first author. - % - aut1f aut1f.old = - { % - % Same first author: check second author - % - aut2 aut2.old = - { % - % Same 1st & 2nd author: check 3rd. - % - aut3 aut3.old = - { % - % Same 1st-3rd authors: check 4th. - % - numnames.old #3 = - { numnames #3 = - { % - % Both current and previous have 3 authors, which are - % the same, so both have identical author-year - % combinations, so ambiguity should be resolved by - % a's and b's. Check whether more authors were - % necessary for previous one. - % - change.add.to.year - cite.num.names.short cite.num.names.old < - { cite.num.names.old - 'cite.num.names.short := - } - 'skip$ - if$ - } - { % - % Previous has 3 authors, current has more, with same - % first 3, so at least 4 must be used for current to - % make a difference. - % - cite.num.names.short #4 < - { #4 'cite.num.names.short := } - 'skip$ - if$ - } - if$ - } - { numnames #3 = - { % - % Current has 3 authors, previous has more, with same - % first 3, so all 3 of current must be used. - % - numnames 'cite.num.names.short := - } - { % - % Same 1st-3rd author and both current and previous - % have at least 4 authors: check 4th. - % - aut4 aut4.old = - { % - % Same 1st-4th authors: check 5th. - % - numnames.old #4 = - { numnames #4 = - { % - % Both current and previous have 4 authors, - % which are the same, so both have - % identical author-year combinations, so - % ambiguity should be resolved by a's and - % b's. Check whether more authors were - % necessary for previous one. - % - change.add.to.year - cite.num.names.short cite.num.names.old < - { cite.num.names.old - 'cite.num.names.short := - } - 'skip$ - if$ - } - { % - % Previous has 4 authors, current has more, - % with same first 4, so at least 5 must be - % used for current to make a difference. - % - cite.num.names.short #5 < - { #5 'cite.num.names.short := } - 'skip$ - if$ - } - if$ - } - { numnames #4 = - { % - % Current has 4 authors, previous has more, - % with same first 4, so all 4 of current - % must be used. - % - numnames 'cite.num.names.short := - } - { % - % Same 1st-4th author and both current and - % previous have at least 5 authors: check - % 5th. - % - aut5 aut5.old = - { % - % Same 1st-5th authors: check 6th. - % - numnames.old #5 = - { numnames #5 = - { % - % Both current and previous - % have 5 authors, which are the - % same, so both have identical - % author-year combinations, so - % ambiguity should be resolved - % by a's and b's. Check whether - % more authors were necessary - % for previous one. - % - change.add.to.year - cite.num.names.short - cite.num.names.old < - { cite.num.names.old - 'cite.num.names.short := - } - 'skip$ - if$ - } - { % - % Previous has 5 authors, - % current has more, with same - % first 5, so at least 6 must - % be used for current to make - % a difference. - % - cite.num.names.short #6 < - { #6 'cite.num.names.short := } - 'skip$ - if$ - } - if$ - } - { numnames #5 = - { % - % Current has 5 authors, - % previous has more, with same - % first 5, so all 5 of current - % must be used. - % - numnames 'cite.num.names.short := - } - { % - % Same 1st-5th author and both - % current and previous have at - % least 6 authors. If one has - % 6 authors and the other has - % more or the 6th is different, - % 6 should be used (which is - % the maximum). - % - numnames #6 > - numnames.old #6 = - and - % - numnames #6 = - numnames.old #6 > - and - % - or - % - aut6 aut6.old = - not - % - or - { #6 cite.num.names.short < - { #6 - 'cite.num.names.short - := - } - 'skip$ - if$ - } - { % - % The first 6 authors are - % the same and either both - % have 6 or both have more. - % So for all practical - % purposes they have - % identical author-year - % combination, so ambiguity - % should be resolved by a's - % and b's. Check whether - % more authors were - % necessary for previous - % one. - % - change.add.to.year - cite.num.names.short - cite.num.names.old - < - { cite.num.names.old - 'cite.num.names.short - := - } - 'skip$ - if$ - } - if$ - } - if$ - } - if$ - } - { % - % Different 5th author: citing 5 authors is - % sufficient for this comparison. - % - cite.num.names.short #5 < - { #5 'cite.num.names.short := } - 'skip$ - if$ - } - if$ - } - if$ - } - if$ - } - { % - % Different 4th author: citing 4 authors is - % sufficient for this comparison. - % - cite.num.names.short #4 < - { #4 'cite.num.names.short := } - 'skip$ - if$ - } - if$ - } - if$ - } - if$ - } - { % - % Different 3rd author: citing 3 authors is sufficient for this - % comparison. - % - cite.num.names.short #3 < - { #3 'cite.num.names.short := } - 'skip$ - if$ - } - if$ - } - { % - % Different 2nd author: citing 2 authors is sufficient for this - % comparison. - % - cite.num.names.short #2 < - { #2 'cite.num.names.short := } - 'skip$ - if$ - } - if$ - } - { % - % Different first author: no ambiguity, move to next entry. - % - skip$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {definitive.cite.num.names.field} -{ 'field := - field num.names$ 'numnames := - % - % Format authors - % - format.6.authors - % - % Now compare authors with authors of previous entry. - % - cite.num.names.short numnames.old > - { % - % The previous entry has less authors than already defined - % necessary to be cited. No ambiguity is possible and we're ready. - % - skip$ - } - { % - % Both previous and current entry have at least one author . - % - year.label year.label.old = - { % - % Same year label: possibly ambiguous citation. - % - % First check: current and/or previous have 1 or - % 2 authors. - % - numnames #3 < - numnames.old #3 < - or - % - { definitive.cite.num.names.1.or.2 } - { definitive.cite.num.names.3.or.more } - if$ - } - { % - % Different year label: everything's fine, - % move to next entry. - % - skip$ - } - if$ - } - if$ - % - % If during the previous process the name maximum is exceeded - % (which was not checked), correct this. NOTE: If the name - % maximum is smaller than 6, this could lead to ambiguous - % citations if, e.g., the year and the first 5 authors are - % the same, but the 6th author is different. - % - cite.num.names.short name.max > - { name.max 'cite.num.names.short := } - 'skip$ - if$ - % - % For a "full" cite, the number of names should always be at least - % as large as for a "short" cite. - % - cite.num.names.full cite.num.names.short < - { cite.num.names.short 'cite.num.names.full := } - 'skip$ - if$ - % - % Update "old" variables for next entry. - % - update.cite.num.names -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {definitive.cite.no.names} -{ % - % The formatted field that acts as author is on top - % of the stack. - 'aut1f := - "" 'aut2 := - "" 'aut3 := - "" 'aut4 := - "" 'aut5 := - "" 'aut6 := - #1 'numnames := - % - year.label year.label.old = - { % - % Same year label: possibly ambiguous citation. - % - definitive.cite.num.names.1.or.2 - } - { % - % Different year label: everything's fine, - % move to next entry. - % - skip$ - } - if$ - % - % Update "old" variables for next entry. - % - update.cite.num.names -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {definitive.cite.num.names} -{ % - % Check whether author or editor or other field acts as author. - % Number of names is only relevant with author or editor. - % - firstkey empty$ not - { firstkey sortify remove.spaces definitive.cite.no.names } - { key empty$ not - { key sortify remove.spaces definitive.cite.no.names } - { % - % No key or firstkey, so find out which field - % to use as author. - % - % Check reference type: - % if result is 1 then possibly editor acts as author - % 2 then editor does not act as author - % 3 then key should have been used - % 0 then unknown reference type - ref.type #2 = - { % - % Format first author with and without initials - author empty$ - { title.sort.label definitive.cite.no.names } - { author definitive.cite.num.names.field } - if$ - } - { % - % Format first author with and without initials - author empty$ - { editor empty$ - { title.sort.label definitive.cite.no.names } - { editor definitive.cite.num.names.field } - if$ - } - { author definitive.cite.num.names.field } - if$ - } - if$ - } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.tentative.year.sort.label} -{ % - % Implicit or explicit ``no date'' is put at the front - % (the year zero; years B.C. will imply complications) - % because these are possibly old works. - % ``In press'' is put at the end. - % - year empty$ - { "0000" 'year.label := } - { year "\bibnodate" = - year "l" change.case$ "no date" = or - year "l" change.case$ "n.d." = or - { "0000" 'year.label := } - { year "\BIP" = - year "l" change.case$ "in press" = or - year "l" change.case$ "forthcoming" = or - { "9999" 'year.label := } - { % It is not checked whether the year field - % makes sense. - year sortify remove.spaces 'year.label := - } - if$ - } - if$ - } - if$ - % - % Push year sort label on the stack - year.label -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {month.number.day} -{ month empty$ - { "" } - { month sortify remove.spaces - % - % Add the day when available. - day empty$ - 'skip$ - { "/" * - day sortify remove.spaces * - } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.name.sort.label} -{ % - % Author or editor-acting-as-author available. - % => Make tentative "short cite with initials" author - % label (L1) of one of the forms - % "Last1 F1" - % "Last1 F1 Last2" - % "Last1 F1 zzzz" ("zzzz" representing et al.) - % => If more than 2 'authors': make label (L2) for 2nd-6th authors - % of one of the forms - % "Last2 Last3" - % "Last2 Last3 Last4" - % "Last2 Last3 Last4 Last5" - % "Last2 Last3 Last4 Last5 Last6" - % "Last2 Last3 Last4 Last5 Last6 zzzz" - % - % Then format year label (L3) of one of the forms: - % "0000" (missing year or explicit 'no date') - % "9999" ('in press') - % year (otherwise; don't use originalyear here yet) - % - % From earlier sorting of titles, we have title number. Convert - % to string, which gives title label (L4) . - % - % Then tentative sorting label (author.year.sort.label) is a - % concatenation of - % L1 - % " " - % L3 - % " " - % L2 - % " " - % L4 - % - % The name field is on top of the stack. - 'field := - % - % numnames is the total number of names contained in field - field num.names$ 'numnames := - % - % Format first author - field #1 sort.name.format format.name$ - % - % Format the second author if there are two, or else "zzzz" = et al. - numnames #1 = - 'skip$ - { numnames #2 = - { % - % Two authors: format second author - field #2 "{ll{}}" format.name$ 's := - s "others" = - { " zzzz" * } % Add "et al."-substitute - { " " * s * } % Add second author - if$ - } - { " zzzz" * } % 3 or more authors: add "et al."-substitute - if$ - } - if$ - " " * % Add spaces - make.tentative.year.sort.label * % Add year (L3). - " " * % Add spaces - % - % Now build up L2 if applicable - numnames #3 < - 'skip$ - { % - % Treat last author slightly differently - numnames name.max > - { name.max 'lastname := - " zzzz" % Push "et al."-substitute on stack - } - { numnames 'lastname := - "" % Push empty string on stack - } - if$ - % - % Names 2 to "last" - 1 - "" % Push empty string on stack - #2 'nameptr := - { nameptr lastname < } - { % Add name no. nameptr - field nameptr "{ll{}}" format.name$ * - " " * - nameptr #1 + 'nameptr := - } - while$ - % - % "Last" author - field lastname "{ll{}}" format.name$ 's := - s "others" = - { "zzzz" * } % Add "et al."-substitute - { s * } % Add last author - if$ - % - swap$ * % Add the previously formatted empty string or - % "et al."-substitute if there are many authors. - * % Add L2 to the earlier labels. - } - if$ - % - " " * % Add spaces - title.number conv.int.to.str * % Add sorted title number (L4). - sortify % Clean up and convert to lowercase - " " * % Add spaces - month.number.day * % Add month and day when available - 'author.year.sort.label := % Assign result to sort label. -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.field.year.sort.label} -{ % - % 'field' acts as first author (L1), subsequent authors - % are empty (L2). - % - % Then format year label (L3) of one of the forms: - % "0000" (missing year or explicit 'no date') - % "9999" ('in press') - % year (otherwise; don't use originalyear here yet) - % - % From earlier sorting of titles, we have title number. Convert - % to string, which gives title label (L4) . - % - % Then tentative sorting label (author.year.sort.label) is a - % concatenation of - % L1 - % " " - % L3 - % " " - % L2 - % " " - % L4 - % - % 'field' is on top of the stack. It is already supposed to be cleaned - % (i.e., sortified and space-removed), so this is already L1. - " " * % Add spaces to L1 - make.tentative.year.sort.label * % Add year (L3). - " " * % Add spaces - " " * % L2 is empty, add spaces - title.number conv.int.to.str * % Add sorted title number (L4). - sortify % Clean up and convert to lowercase - " " * % Add spaces - month.number.day * % Add month and day when available - 'author.year.sort.label := % Assign result to sort label. -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.author.editor.sort.label} -{ author empty$ - { editor empty$ - { % - % Use what has previously been stored in title.sort.label - % as author substitute . - title.sort.label make.field.year.sort.label - } - { editor make.name.sort.label } - if$ - } - { author make.name.sort.label } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.author.sort.label} -{ author empty$ - { % - % Use what has previously been stored in title.sort.label - % as author substitute . - title.sort.label make.field.year.sort.label - } - { author make.name.sort.label } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.tentative.sort.label} -{ % - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % General strategy: - % - % Ordinary situation: author or editor-acting-as-author - % available. - % => Make tentative "short cite with initials" author - % label (L1) of one of the forms - % "Last1 F1" - % "Last1 F1 Last2" - % "Last1 F1 zzzz" ("zzzz" representing et al.) - % => If more than 2 'authors': make label (L2) for 2nd-6th authors - % of one of the forms - % "Last2 Last3" - % "Last2 Last3 Last4" - % "Last2 Last3 Last4 Last5" - % "Last2 Last3 Last4 Last5 Last6" - % "Last2 Last3 Last4 Last5 Last6 zzzz" - % When key is available (overrules author and editor fields): - % => L1 = key, L2 = "" - % No author, editor, and key: define title or substitute as key - % and format as key. - % - % Then format year label (L3) of one of the forms: - % "0000" (missing year or explicit 'no date') - % "9999" ('in press') - % year (otherwise; don't use originalyear here yet) - % - % From earlier sorting of titles, we have title number. Convert - % to string, which gives title label (L4) . - % - % Then tentative sorting label (author.year.sort.label) is a - % concatenation of - % L1 - % " " - % L3 - % " " - % L2 - % " " - % L4 - % - % This can then be sorted, from which it can be derived - % whether initials are necessary, how many names must - % be used for short and full citations, and whether "a"'s and - % "b"'s etc. are necessary behind the year labels. - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % key and firstkey overrule author information - % - firstkey empty$ not - { key empty$ not - { % - % Both key and firstkey available: - % for sorting and checking initials, treat key as last - % name and firstkey as initials. - % - key sortify remove.spaces - " " * - firstkey sortify remove.spaces * - make.field.year.sort.label - } - { firstkey sortify remove.spaces make.field.year.sort.label } - if$ - } - { key empty$ not - { key sortify remove.spaces make.field.year.sort.label } - { % - % No key or firstkey, so find out which field - % to use as author. - % - % Check reference type: - % if result is 1 then possibly editor acts as author - % 2 then editor does not act as author - % 3 then key should have been used - % 0 then unknown reference type - ref.type - duplicate$ #1 = - { pop$ - make.author.editor.sort.label - } - { duplicate$ #2 = - { pop$ - make.author.sort.label - } - { #3 = - { "no key in " cite$ * warning$ - make.author.editor.sort.label - } - { make.author.editor.sort.label } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - % - author.year.sort.label 'sort.key$ := -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.definitive.name.sort.label} -{ % - % Author or editor-acting-as-author available. - % => Make author-with-initials label (L1) of one of the forms - % "Last1 F1 Last2 F2 ... LastN FN" - % "Last1 F1 Last2 F2 ... Last6 F6 zzzz" - % (where N <= 6 is the total number of authors, and - % "zzzz" represents et al. if there are more than 6 authors) - % No author, editor, and key: define title or substitute as sort key. - % - % The name field is on top of the stack. - 'field := - % - % numnames is the total number of names contained in field - field num.names$ 'numnames := - % - % If there are more than 6 authors, only 6 are mentioned. - numnames name.max > - { name.max 'format.num.names := } - { numnames 'format.num.names := } - if$ - % Initialize stack with empty string - "" - % - % Cycle over authors. - #1 'nameptr := - { nameptr format.num.names < } - { % Format author and add spaces - field nameptr sort.name.format format.name$ * - " " * - nameptr #1 + 'nameptr := - } - while$ - % Format last author that must be formatted - field nameptr sort.name.format format.name$ * - % Add et al. if necessary - nameptr numnames < - { " zzzz" * } - 'skip$ - if$ - sortify % Clean up and change case - " " * % Add spaces - year.label * % Add year - " " * % Add spaces - title.number conv.int.to.str * % Add sorted title number - " " * % Add spaces - month.number.day * % Add month and day when available - 'author.year.sort.label := % Assign result to sort label. -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.definitive.field.year.sort.label} -{ % - % 'field' acts as author (L1). - % - % Then format year label (L2) of one of the forms: - % "0000" (missing year or explicit `no date') - % "9999" (`in press') - % year (otherwise; don't use originalyear here yet) - % - % From earlier sorting of titles, we have title number. Convert - % to string, which gives title label (L3) . - % - % Then tentative sorting label (author.year.sort.label) is a - % concatenation of - % L1 - % " " - % L2 - % " " - % L3 - % - % 'field' is on top of the stack. It is already supposed to be cleaned - % (i.e., sortified and space-removed), so this is already L1. - " " * % Add spaces - year.label * % Add year - " " * % Add spaces - title.number conv.int.to.str * % Add sorted title number - " " * % Add spaces - month.number.day * % Add month and day when available - 'author.year.sort.label := % Assign result to sort label. -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.definitive.author.editor.sort.label} -{ author empty$ - { editor empty$ - { % - % Use what has previously been stored in title.sort.label - % as author substitute . - title.sort.label make.definitive.field.year.sort.label - } - { editor make.definitive.name.sort.label } - if$ - } - { author make.definitive.name.sort.label } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.definitive.author.sort.label} -{ author empty$ - { % - % Use what has previously been stored in title.sort.label - % as author substitute . - title.sort.label make.definitive.field.year.sort.label - } - { author make.definitive.name.sort.label } - if$ -} -FUNCTION {make.final.sort.key} -{ ref.type #2 = - { make.definitive.author.sort.label } - { make.definitive.author.editor.sort.label } - if$ - unsorted - { citeorder.sort.label 'sort.key$ := } - { author.year.sort.label 'sort.key$ := } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {chop.word} -{ 's := - 'len := - s #1 len substring$ = - { s len #1 + global.max$ substring$ } - { s } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {chop.articles} -{ 's := - "a " #2 - "an " #3 - "the " #4 - s - chop.word - chop.word - chop.word -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {format.sort.title} -{ % - % Remove non-alphanumeric characters and change to lower case . - sortify - % - % Remove "a ", "an ", and "the " from the front . - chop.articles #1 entry.max$ substring$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.sort.title} -{ title empty$ - { text empty$ - { type empty$ - { howpublished empty$ - { note empty$ - { url empty$ - { " " } - { url format.sort.title } - if$ - } - { note format.sort.title } - if$ - } - { howpublished format.sort.title } - if$ - } - { type format.sort.title } - if$ - } - { text format.sort.title } - if$ - } - { title format.sort.title } - if$ - remove.spaces - 'title.sort.label := - title.sort.label 'sort.key$ := -} -FUNCTION {make.title.number} -{ title.sort.label old.label = - { - old.number 'title.number := - } - { - old.number #1 + 'title.number := - title.number 'old.number := - title.sort.label 'old.label := - } - if$ -} -FUNCTION {make.citeorder.number} -{ old.number #1 + 'cite.order := - cite.order 'old.number := - cite.order conv.int.to.str 'citeorder.sort.label := -} - -FUNCTION {last.part.name.format.classic} { "{ll}" } - -FUNCTION {von.junior.name.format.classic} { "{ vv}{, jj}" } - -FUNCTION {last.part.name.format} { "{vv }{ll}" } - -FUNCTION {initials.with.space.name.format} { "{f.}" } - -FUNCTION {von.last.junior.name.format} { "{vv }{ll}{ jj}" } - -FUNCTION {von.junior.name.format} { "{, jj}" } - -FUNCTION {one.complete.name.format} { "{vv }{ll}{, jj}{, ff}" } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {string.length} -{ #0 'pos := - % If the next character exists, i.e., is not empty, - % add 1 to the string length. - % We cannot use empty$ because " " empty$ is true. - { duplicate$ pos #1 + #1 substring$ "" = not } - { pos #1 + 'pos := } - while$ - pop$ pos -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {transform.spaces.and.hyphens} -{ 's := % The original string - s string.length 'len := % Its length (no. of characters) - "" 't := % Initialize the transformed string - #1 'pos := - #0 'brace.level := - % - % while (pos < len) do - % - { pos len < } - { % First, check whether we are at brace level 0 - brace.level #0 = - { - % At least two characters left: check for ". ", ".~", and ".-". - % If so, replace and shift two positions. - s pos #2 substring$ ". " = - s pos #2 substring$ ".~" = or - { t "." * 't := - pos #2 + 'pos := - } - { s pos #2 substring$ ".-" = - { t "\BHBI " * 't := - pos #2 + 'pos := - } - { % neither is true, copy one character and shift one position - t s pos #1 substring$ * 't := - % Check whether we need to increase brace level. - % Note that this is not sophisticated: it does not capture - % \{, \verb+}+, etc. - % Note also that unbalanced braces cause problems. - s pos #1 substring$ "{" = - { brace.level #1 + 'brace.level := } - 'skip$ - if$ - pos #1 + 'pos := - } - if$ - } - if$ - } - { % Not at brace level 0: copy result literally - t s pos #1 substring$ * 't := - % Check whether we need to increase or decrease brace level. - % Note that this is not sophisticated: it does not capture - % \{, \verb+}+, etc. - s pos #1 substring$ "{" = - { brace.level #1 + 'brace.level := } - { s pos #1 substring$ "}" = - { brace.level #1 - 'brace.level := } - 'skip$ - if$ - } - if$ - pos #1 + 'pos := - } - if$ - } - while$ - % - pos len = - { % Last character, copy - t s pos #1 substring$ * 't := - } - { % pos = len + 1, so s ends with ". " or ".-" - % This should not have happened, but make the best out of it. - % Push last two characters of s on the stack, i.e., ". " or ".-". - s len #1 - #2 substring$ - % Remove "\BPBI " or "\BHBI " from t - t text.length$ 'len := % Length of t (no. of characters) - t #1 len #6 - substring$ - % Concatenate and assign to t - swap$ * 't := - } - if$ - % - % Now push the result back on the stack - t -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {format.initials.with.hyphen} -{ % Format initials. - % Call with - % field authornumber format.initials.with.hyphen - % e.g. - % author #1 format.initials.with.hyphen - % Instead of field, a string may also be used. - % - % First, format initials in the default way, retaining spaces - % and hyphens. - initials.with.space.name.format format.name$ - transform.spaces.and.hyphens -} - -FUNCTION {format.last.part.name} -{ % Format a name with last.part.name.format, - % as part of more complicated things. - % Call with - % field authornumber format.last.part.name - % e.g. - % author #1 format.last.part.name - % Instead of field, a string may also be used. - last.part.name.format format.name$ -} - -FUNCTION {format.von.last.junior.name} -{ % Format a name with von.last.junior.name.format, - % for citing or as part of more complicated things. - % Call with - % field authornumber format.von.last.junior.name - % e.g. - % author #1 format.von.last.junior.name - % Instead of field, a string may also be used. - von.last.junior.name.format format.name$ -} - -FUNCTION {format.von.junior.name} -{ % Format a name with von.last.junior.name.format, - % for citing or as part of more complicated things. - % Call with - % field authornumber format.von.junior.name - % e.g. - % author #1 format.von.junior.name - % Instead of field, a string may also be used. - von.junior.name.format format.name$ -} - -FUNCTION {format.cite.initials.name} -{ % Format a name for citing with initials. - % Call with - % field authornumber format.cite.initials.name - % e.g. - % author #1 format.cite.initials.name - % Instead of field, a string may also be used. - % - % First, extract the complete name, format it in the canonical form, - % and push on the stack. - one.complete.name.format format.name$ - % - % Format the initials and push on the stack. - duplicate$ #1 format.initials.with.hyphen - % - % Format the von-last-junior part and push on the stack. - swap$ #1 format.von.last.junior.name - % - % Connect with "~" hyphen (if they're both non-empty). - "~" connect.check -} - -FUNCTION {format.author.name} -{ % Format an author name for the reference list. - % Call with - % field authornumber format.author.name - % e.g. - % author #1 format.author.name - % Instead of field, a string may also be used. - % - % First, extract the complete name, format it in the canonical form, - % and push on the stack. - one.complete.name.format format.name$ - % - % Make two copies of the name, format the last name and push on the stack. - duplicate$ duplicate$ #1 format.last.part.name - % - % Format the initials and push on the stack. - swap$ #1 format.initials.with.hyphen - % - % Connect with last name. - connect.with.comma.check - % - % Format the von-junior part and connect with initials. - swap$ #1 format.von.junior.name "" connect.check -} - -FUNCTION {format.editor.name} -{ % Format a name for the reference list as an editor. - % Call with - % field authornumber format.editor.name - % e.g. - % author #1 format.editor.name - % Instead of field, a string may also be used. - % - format.cite.initials.name -} - -FUNCTION {format.index.name} -{ % Format an author name for the index. - % Call with - % field authornumber format.index.name - % e.g. - % author #1 format.index.name - % Instead of field, a string may also be used. - % - format.author.name -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -FUNCTION {comma.between.two} { "\BCBT {}" } - -FUNCTION {comma.between.names} { ", " } - -FUNCTION {comma.before.last} { "\BCBL {}" } - -FUNCTION {dots.before.last} { "\BDBL {}" } - -FUNCTION {and.before.last} { "\ \BBA {} " } - -FUNCTION {no.and.before.last} { " " } - -FUNCTION {et.al.string.cite} { "\ \protect \BOthers {.}" } - -FUNCTION {et.al.string} { "\ \BOthers {.}" } - -FUNCTION {et.al.string.period} { "\ \BOthersPeriod {.}" } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {add.name.index} -{ % - % - make.index - { "%" * write$ newline$ - % Check for corporate author - field is.bibcorporate - { "\corporateAX{" } - { "\AX{" } - if$ - write$ - field nameptr sort.name.format format.name$ sortify write$ newline$ - "@" write$ - field nameptr format.index.name - "}%" * write$ newline$ - } - { "%" * write$ newline$ } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.name.cite.label} -{ 'field := - 'format.num.names := - % - field num.names$ 'numnames := % numnames is the total number of names - % contained in field - % - % It is implicit in the APA manual that if "et al." would refer - % to exactly one author, then this author should be named - % instead of "et al." - % - format.num.names numnames #1 - = - { numnames 'format.num.names := } - 'skip$ - if$ - % - % Format first author: with or without initials - % - #1 'nameptr := - cite.initials #1 = - { field nameptr format.cite.initials.name } - { field nameptr cite.name.format format.name$ } - if$ - add.name.index % Add index entry when desired. - % - numnames #1 = - 'skip$ - { format.num.names #1 = - { % - % First author et al. - % - et.al.string.cite write$ - } - { numnames #2 = - { % - % Given that format.num.names > 1, it is 2. - % Format second author. - % - #2 'nameptr := - field nameptr cite.name.format format.name$ 's := - % - % Check if 2nd author is explicit "others". - % If so, insert "et al." string. - % - s "others" = - { et.al.string.cite write$ } % First et al. - { % - % First \& Second - % - and.before.last write$ - s - add.name.index % Add index entry when desired. - } - if$ - } - { % - % 3 or more names, 2 or more must be cited - % - % for nameptr := 2 to format.num.names - 1 do - % - #2 'nameptr := - { nameptr format.num.names < } - { % - % Put comma between consecutive authors - % - comma.between.names write$ - % - % Format and add next author - % - field nameptr cite.name.format format.name$ - add.name.index % Add index entry when desired. - % - % Move to next author - % - nameptr #1 + 'nameptr := - } - while$ - % - % nameptr = format.num.names - % Format this author. - % - field nameptr cite.name.format format.name$ 's := - % - format.num.names numnames = - { % - % This is also the last author. Add (optional) comma. - % - comma.before.last write$ - % - % Check if this author is explicit "others". - % If so, insert "et al." string. - % - s "others" = - { et.al.string.cite write$ } - { and.before.last write$ - s - add.name.index % Add index entry when desired. - } - if$ - } - { % - % This is not the last author. - % Add comma, author name, and "et al." - % - comma.between.names write$ - s - add.name.index % Add index entry when desired. - % - comma.before.last et.al.string.cite * write$ - } - if$ - } - if$ - } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.title.cite.label} -{ % - % Formatting: check if formatted as article title or - % as book title, and insert this formatting. - % - is.atype - { "\APACciteatitle {" } - { "\APACcitebtitle {" } - if$ - % - title empty$ - { text empty$ - { type empty$ - { howpublished empty$ - { note empty$ - { url empty$ - { cite$ } - { url } - if$ - } - { note } - if$ - } - { howpublished } - if$ - } - { type } - if$ - } - { text } - if$ - } - { title } - if$ - % - % Connect with formatting. - % - * "}" * - % - % Write to output - % - write$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.author.editor.cite.label} -{ author empty$ - { editor empty$ - { % - % No author or editor: - % Use title or other description as citation label. - % - make.title.cite.label - "}{%" write$ newline$ - make.title.cite.label - } - { cite.num.names.full editor make.name.cite.label - "}{%" write$ newline$ - cite.num.names.short editor make.name.cite.label - } - if$ - } - { cite.num.names.full author make.name.cite.label - "}{%" write$ newline$ - cite.num.names.short author make.name.cite.label - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.author.cite.label} -{ author empty$ - { % - % No author: - % Use title or other description as citation label. - % - make.title.cite.label - "}{%" write$ newline$ - make.title.cite.label - } - { cite.num.names.full author make.name.cite.label - "}{%" write$ newline$ - cite.num.names.short author make.name.cite.label - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.definitive.year.supplement} -{ % - % Add "a", "b", etc. when necessary. - % - add.to.year #0 = - { "" } - { "{\protect " - year empty$ - { "\BCntND " * } - { year "\bibnodate" = - year "l" change.case$ "no date" = or - year "l" change.case$ "n.d." = or - { "\BCntND " * } - { year "\BIP" = - year "l" change.case$ "in press" = or - year "l" change.case$ "forthcoming" = or - { "\BCntIP " * } - { "\BCnt " * } - if$ - } - if$ - } - if$ - "{" * add.to.year int.to.str$ * "}}" * - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {protect.year} -{ year empty$ - { "{\protect \bibnodate {}}" } - { year "\bibnodate" = - year "l" change.case$ "no date" = or - year "l" change.case$ "n.d." = or - { "{\protect \bibnodate {}}" } - { year "\BIP" = - year "l" change.case$ "in press" = or - year "l" change.case$ "forthcoming" = or - { "{\protect \BIP {}}" } - { year } - if$ - } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.definitive.year.label} -{ "{\protect \APACyear {" - originalyear empty$ - { protect.year } - { originalyear "\bibnodate" = % date of original publication unknown - originalyear "l" change.case$ "no date" = or - originalyear "l" change.case$ "n.d." = or - { translator empty$ - { protect.year } - { "{\protect \BTRANSL {}}~" protect.year * } - if$ - } - { year empty$ - { originalyear "/{\protect \bibnodate {}}" * } % 1923/n.d. - { originalyear year = - { protect.year } - { originalyear "/" * protect.year * } % 1923/1961 - if$ - } - if$ - } - if$ - } - if$ - * "}}%" * write$ newline$ - % - % Add "a", "b", etc. when necessary. - % - "{\protect \APACexlab {" "}}" - make.definitive.year.supplement enclose.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {make.cite.labels} -{ newline$ - % - % Write a few lines for testing purposes. - % - test - { "\bibitem [] {} \fullciteA {" cite$ * "}" * write$ newline$ - "\bibitem [] {} \citeA {" cite$ * "}" * write$ newline$ - } - 'skip$ - if$ - % - "\bibitem [\protect \citeauthoryear {%" write$ newline$ - % - % When key or firstkey is available, this takes precedence. - % - firstkey empty$ not - { % - % Full cite: firstkey. - % - firstkey write$ - "}{%" write$ newline$ - % - % Short cite: if key is not empty and cite.initials is 0, - % then key, else firstkey. - % - cite.initials #0 = - key empty$ not - and - { key } - { firstkey } - if$ - write$ - } - { key empty$ not - { % - % No firstkey, but key available: - % Both full and short labels are key. - % - key write$ - "}{%" write$ newline$ - key write$ - } - { % No key or firstkey, so find out which field - % to use as author. - % - % Check reference type: - % if result is 1 then possibly editor acts as author - % 2 then editor does not act as author - % 3 then key should have been used - % 0 then unknown reference type - ref.type #2 = - { make.author.cite.label } - { make.author.editor.cite.label } - if$ - } - if$ - } - if$ - "}{%" write$ newline$ - % - % Make year label that's used for citations - % - make.definitive.year.label write$ - "}]{%" write$ newline$ - cite$ write$ - "} " write$ newline$ - % author.year.sort.label write$ newline$ % for testing purposes - % year.label write$ newline$ % for testing purposes - % - % If the item is used in a meta-analysis, indicate this with - % a star. - % - "\APACinsertmetastar {%" write$ newline$ - cite$ write$ - "}%" write$ newline$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {editor.postfix} -{ editor num.names$ #1 > - { "(\BEDS)" } - { "(\BED)" } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {editor.trans.postfix} -{ editor num.names$ #1 > - { "(\BEDS{} \BAnd{} \BTRANSS)" } - { "(\BED{} \BAnd{} \BTRANS)" } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % "(Trans.)" postfix - % translator must not be empty - % -FUNCTION {trans.postfix} -{ translator num.names$ #1 > - { "(\BTRANSS)" } - { "(\BTRANS)" } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {authors.editors.reflist.apa5} -{ 'field := - 'dot := - % - field num.names$ 'numnames := % numnames is the total number of names - % contained in field - numnames 'format.num.names := % Format all authors - format.num.names name.max > % Unless this exceeds the maximum of 6. - { dot - { name.max 'format.num.names := } % Format 6 authors - { cite.num.names.full 'format.num.names := } % Format 1 editor - if$ - } - 'skip$ - if$ - % - % Enclose authors in APACrefauthors environment to allow crude style - % options in \LaTeX. - "\begin{APACrefauthors}%" - write$ newline$ - % - % It is kind of explicit in the APA manual that if "et al." would - % refer to exactly one author (the 7th), then this author should - % still be replaced by "et al.", unlike with citations. - % So format.num.names is not adapted. - % - % Format first author - % - #1 'nameptr := - field nameptr format.author.name - % - % Add period if required and if this is the only author. - % - numnames #1 = - dot - and - { add.period$ } - 'skip$ - if$ - add.name.index % Add index entry when desired. - % - numnames #1 = - 'skip$ - { format.num.names #1 = - { % - % First author et al. - % - comma.between.two - % - % Add period if required. - % - dot - { et.al.string.period * } - { et.al.string * } - if$ - write$ - } - { numnames #2 = - { % - % Given that format.num.names > 1, it is 2. - % - comma.between.two write$ - % - % Format second author. - % - #2 'nameptr := - field nameptr format.author.name 's := - % - % Check if 2nd author is explicit "others". - % If so, insert "et al." string. - % - s "others" = - { % - % First et al. - % Add period if required. - % - dot - { et.al.string.period } - { et.al.string } - if$ - write$ - } - { % - % First \& Second - % - and.before.last write$ - % - % Add period if required. - % - dot - { s add.period$ } - { s } - if$ - add.name.index % Add index entry when desired. - } - if$ - } - { % - % 3 or more names, 2 or more must be cited - % - % for nameptr := 2 to format.num.names - 1 do - % - #2 'nameptr := - { nameptr format.num.names < } - { % - % Put comma between consecutive authors - % - comma.between.names write$ - % - % Format and add next author - % - field nameptr format.author.name - add.name.index % Add index entry when desired. - % - % Move to next author - % - nameptr #1 + 'nameptr := - } - while$ - % - % nameptr = format.num.names - % Format this author. - % - field nameptr format.author.name 's := - % - format.num.names numnames = - { % - % This is also the last author. Add (optional) comma. - % - comma.before.last write$ - % - % Check if this author is explicit "others". - % If so, insert "et al." string. - % - s "others" = - { % - % Add period if required. - % - dot - { et.al.string.period } - { et.al.string } - if$ - write$ - } - { and.before.last write$ - % - % Add period if required. - % - dot - { s add.period$ } - { s } - if$ - add.name.index % Add index entry when desired. - } - if$ - } - { % - % This is not the last author. - % Add comma, author name, and "et al." - % - comma.between.names write$ - s - add.name.index % Add index entry when desired. - % - comma.before.last - % - % Add period if required. - % - dot - { et.al.string.period * } - { et.al.string * } - if$ - write$ - } - if$ - } - if$ - } - if$ - } - if$ - % - % End APACrefauthors environment. - "\end{APACrefauthors}%" - write$ newline$ -} - -FUNCTION {authors.reflist.apa6} -{ 'field := - 'dot := - field num.names$ 'numnames := - numnames #7 > - { #7 'format.num.names := } - { numnames 'format.num.names := } - if$ - "\begin{APACrefauthors}%" - write$ newline$ - #1 'nameptr := - field nameptr format.author.name - numnames #1 = - { dot - { %add.period$ -} - 'skip$ - if$ - add.name.index - } - { add.name.index - numnames #2 = - { comma.between.two write$ - #2 'nameptr := - field nameptr format.author.name 's := - s "others" = - { "`others' not consistent with 6th ed. of the APA Manual" - warning$ - dot - { et.al.string.period } - { et.al.string } - if$ - write$ newline$ - } - { and.before.last write$ - dot - { s add.period$ } - { s } - if$ - add.name.index - } - if$ - } - { %% for nameptr := 2 to format.num.names - 1 do - #2 'nameptr := - { nameptr format.num.names < } - { comma.between.names write$ - field nameptr format.author.name - add.name.index - nameptr #1 + 'nameptr := - } - while$ - field numnames format.author.name 's := - format.num.names numnames = - { comma.before.last write$ - s "others" = - { "`others' not consistent with 6th ed. of the APA " - "Manual" * - warning$ - dot - { et.al.string.period } - { et.al.string } - if$ - write$ - } - { no.and.before.last write$ - dot - { s add.period$ } - { s } - if$ - add.name.index - } - if$ - } - { dots.before.last write$ - s - add.name.index - } - if$ - } - if$ - } - if$ - "\end{APACrefauthors}%" - write$ newline$ -} - -FUNCTION {format.author.names} -{ 'field := - 'dot := - dot - { dot field authors.reflist.apa6 } - { dot field authors.editors.reflist.apa5 } - if$ -} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {format.authors} -{ #1 author format.author.names } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {format.editors.as.authors} -{ #0 editor format.author.names - "\ " editor.postfix * add.period$ write$ newline$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {format.ed.trans.as.authors} -{ #0 editor format.author.names - "\ " editor.trans.postfix * add.period$ write$ newline$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {format.editor.names} -{ 'field := - % - field num.names$ 'numnames := % numnames is the total number of names - % contained in field - numnames 'format.num.names := % Format all authors - format.num.names name.max > % Unless this exceeds the maximum of 6. - { #1 'format.num.names := } % Then it becomes 1 (First et al.) - 'skip$ - if$ - % - % Format first editor - % - field #1 format.editor.name - % - numnames #1 = - 'skip$ - { format.num.names #1 = - { et.al.string * } % First editor et al., no comma. - { numnames #2 = - { % - % Given that format.num.names > 1, it is 2. - % No comma. Format second editor. - % - field #2 format.editor.name 's := - % - % Check if 2nd editor is explicit "others". - % If so, insert "et al." string. - % - s "others" = - { et.al.string * } % First et al. - { and.before.last * s * } % First \& Second - if$ - } - { % - % 3 or more names, 2 or more must be cited - % - % for nameptr := 2 to format.num.names - 1 do - % - #2 'nameptr := - { nameptr format.num.names < } - { % - % Put comma between consecutive editors - % - comma.between.names * - % - % Format and add next editor - % - field nameptr format.editor.name * - % - % Move to next editor - % - nameptr #1 + 'nameptr := - } - while$ - % - % nameptr = format.num.names - % Format this editor. - % - field nameptr format.editor.name 's := - % - format.num.names numnames = - { % - % This is also the last editor. Add (optional) comma. - % - comma.before.last * - % - % Check if this editor is explicit "others". - % If so, insert "et al." string. - % - s "others" = - { et.al.string * } - { and.before.last * s * } - if$ - } - { % - % This is not the last editor. - % Add comma, editor name, and "et al." - % - comma.between.names * s * - comma.before.last * et.al.string * - } - if$ - } - if$ - } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format editors in case editors do not act as authors - % (such as reference to chapter in edited book) - % - % L. W. Poon (Ed.) (1 editor) - % or - % A. S. Gurman \& D. P. Kniskern (Eds.) (2 editors) - % or - % L. Poon, A. Jones, \& D. P. Smith (Eds.) (>2 editors) - % - % editor must not be empty - % -FUNCTION {format.editors.in.line} -{ editor format.editor.names - editor.postfix connect.with.space.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format editors in case editors are also translators - % and do not act as authors - % (such as reference to chapter in edited book - % of translated articles) - % - % L. W. Poon (Ed. and Trans.) (1 editor) - % or - % A. S. Gurman \& D. P. Kniskern (Eds. and Trans.) (2 editors) - % or - % L. Poon, A. Jones, \& D. P. Smith (Eds. and Trans.) (>2 editors) - % - % editor must not be empty - % -FUNCTION {format.editors.trans.in.line} -{ editor format.editor.names - editor.trans.postfix connect.with.space.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format translators in case translators act as editors - % (such as reference to chapter in translated book) - % - % L. W. Poon (Trans.) (1 translator) - % or - % A. S. Gurman \& D. P. Kniskern (Trans.) (2 translators) - % or - % L. Poon, A. Jones, \& D. P. Smith (Trans.) (>2 translators) - % - % translator must not be empty - % -FUNCTION {format.translators.in.line} -{ translator format.editor.names - trans.postfix connect.with.space.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format translators in case translator does not act as editor - % (such as reference to translated book) - % - % L. Solotaroff, Trans. - % -FUNCTION {format.translators.in.paren.check} -{ translator empty$ - { "" } - { translator format.editor.names - translator num.names$ #1 > - { ", \BTRANSS{}" * } - { ", \BTRANS{}" * } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format editors and translators in case neither act as editor - % (such as reference to edited or translated book with a - % a single author) - % - % L. Solotaroff, Ed. - % L. Solotaroff, Ed. \& Trans. - % L. Solotaroff, Trans. - % L. Solotaroff, Ed. \& S. Prokofieff, Trans. - % -FUNCTION {format.editors.translators.in.paren.check} -{ editor empty$ - { translator empty$ - { "" } - { translator format.editor.names - translator num.names$ #1 > - { ", \BTRANSS{}" * } - { ", \BTRANS{}" * } - if$ - } - if$ - } - { editor format.editor.names - editor num.names$ #1 > - { ", \BEDS{}" * } - { ", \BED{}" * } - if$ - translator empty$ - 'skip$ - { editor translator = - { editor num.names$ #1 > - { " \BAnd{} \BTRANSS" * } - { " \BAnd{} \BTRANS" * } - if$ - } - { " \BAnd{} " * - translator format.editor.names * - translator num.names$ #1 > - { ", \BTRANSS{}" * } - { ", \BTRANS{}" * } - if$ - } - if$ - } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % translator of article - % -FUNCTION {format.atrans.check} -{ format.translators.in.paren.check parenthesize.check } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format "In editor (Ed.), " - % -FUNCTION {format.in.editors} -{ "\BIn{} " - editor empty$ - 'skip$ - { format.editors.in.line * ", " * } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format "In translator (Trans.)," - % -FUNCTION {format.in.trans} -{ "\BIn{} " - translator empty$ - 'skip$ - { format.translators.in.line * ", " * } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format "In editor (Ed. and Trans.)" - % or "In editor (Ed.)" if editor not equal to translator - % -FUNCTION {format.in.editors.trans} -%{ "\BIn{} " Commented by SPI -{ " " - editor empty$ - { translator empty$ - 'skip$ - { format.translators.in.line * ", " * } - if$ - } - { translator empty$ - { format.editors.in.line * } - { editor translator = - { format.editors.trans.in.line * } - { format.editors.in.line * } - if$ - } - if$ - ", " * - } - if$ -} - -FUNCTION {in.format.in.editors.trans} -{ "\BIn{} " - editor empty$ - { translator empty$ - 'skip$ - { format.translators.in.line * ", " * } - if$ - } - { translator empty$ - { format.editors.in.line * } - { editor translator = - { format.editors.trans.in.line * } - { format.editors.in.line * } - if$ - } - if$ - ", " * - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {format.year.check} -{ "\APACrefYear{" - protect.year * - % - % Add "a", "b", etc. when necessary. - % - make.definitive.year.supplement * - "}" * -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -FUNCTION {format.year.month.day.check} -{ "\APACrefYearMonthDay{" - protect.year * - % - % Add "a", "b", etc. when necessary. - % - make.definitive.year.supplement * - "}{" * - % - % Add month and day when present. - % - month empty$ - 'skip$ - { month * } - if$ - "}{" * - day empty$ - 'skip$ - { day * } - if$ - "}" * -} -FUNCTION {format.year.nomonth.day.check} -{ "\APACrefYearMonthDay{" - protect.year * - % - % Add "a", "b", etc. when necessary. - % - make.definitive.year.supplement * - "}{" * - % - % Add month and day when present. - % - month empty$ - 'skip$ - { } - if$ - "}{" * - day empty$ - 'skip$ - { day * } - if$ - "}" * -} - -FUNCTION {format.atitle.no.dot} -{ "{\BBOQ}" swap$ - "{\BBCQ}" swap$ - duplicate$ empty$ - 'skip$ - { duplicate$ - % Two arguments: Title twice: (1) don't change case; (2) change case - "\APACrefatitle {" swap$ * "} {" * swap$ - "t" change.case$ - * "}" * - } - if$ - enclose.check -} - -FUNCTION {format.atitle.dot} -{ "{\BBOQ}" swap$ - "{\BBCQ}" swap$ - duplicate$ empty$ - 'skip$ - { duplicate$ - % Two arguments: Title twice: (1) don't change case; (2) change case - "\APACrefatitle {" swap$ * "} {" * swap$ - "t" change.case$ - * "}" * add.period$ - } - if$ - enclose.check -} - -FUNCTION {format.atitle.connect} -{ swap$ - duplicate$ empty$ - { pop$ - format.atitle.dot - } - { swap$ - format.atitle.no.dot - swap$ connect.with.space.check - add.period$ - } - if$ -} - -FUNCTION {format.btitle.no.dot} -{ duplicate$ empty$ - { pop$ - "" - } - { duplicate$ - % Two arguments: Title twice: (1) don't change case; (2) change case - "\APACrefbtitle {" swap$ * "} {" * swap$ - "t" change.case$ - * "}" * - } - if$ -} - -FUNCTION {format.btitle.dot} -{ duplicate$ empty$ - { pop$ - "" - } - { add.period$ format.btitle.no.dot } - if$ -} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % title of book and similar - % field must be on top of stack - % second element on stack must be connected: - % if that is empty, then btitle.dot - % else btitle.no.dot, connect, and add period - % -FUNCTION {format.btitle.connect} -{ swap$ - duplicate$ empty$ - { pop$ - format.btitle.dot - } - { swap$ - format.btitle.no.dot - swap$ connect.with.space.check - add.period$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % title of book and similar - % field must be on top of stack - % second element on stack must be connected - % -FUNCTION {format.btitle.connect.no.dot} -{ swap$ - duplicate$ empty$ - { pop$ - format.btitle.no.dot - } - { swap$ - format.btitle.no.dot - swap$ connect.with.space.check - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format englishtitle (of nonenglish article, etc.) - % -FUNCTION {format.aetitle.check} -{ englishtitle empty$ - { "" } - { % Two arguments: Title twice: (1) don't change case; (2) change case - "\APACrefaetitle {" englishtitle * "} {" * - englishtitle "t" change.case$ * "}" * - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format englishtitle (of nonenglish book, etc.) - % -FUNCTION {format.betitle.check} -{ englishtitle empty$ - { "" } - { % Two arguments: Title twice: (1) don't change case; (2) change case - "\APACrefbetitle {" englishtitle * "} {" * - englishtitle "t" change.case$ * "}" * - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format type (of article, etc.) - % -FUNCTION {format.atype.check} -{ type bracket.check } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format title and englishtitle (of article, etc.) - % -FUNCTION {format.atitle.check} -{ format.aetitle.check - title format.atitle.connect -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format title, englishtitle, and type - % (of article, etc.) - % -FUNCTION {format.atitle.type.check} -{ format.aetitle.check - format.atype.check connect.with.space.check - title format.atitle.connect -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format title, englishtitle, - % and translator (of article, etc.) - % -FUNCTION {format.atitle.trans.check} -{ format.aetitle.check - format.atrans.check connect.with.space.check - title format.atitle.connect -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format title, englishtitle, type, - % and translator (of article, etc.) - % -FUNCTION {format.atitle.type.trans.check} -{ format.aetitle.check - format.atype.check connect.with.space.check - format.atrans.check connect.with.space.check - title format.atitle.connect -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format journal, volume, number and pages - % call with - % formatted.pages format.journal.vol.num.pages.check - % -FUNCTION { format.journal.vol.num.pages.check } -{ "journal" journal warning.if.empty - duplicate$ empty$ - journal empty$ and - volume empty$ and - number empty$ and - { pop$ "" } - { "\APACjournalVolNumPages{" journal "" connect.check - "}{" * volume "" connect.check - "}{" * number "" connect.check - "}{" * swap$ "" connect.check - ",}" * - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % volume of book, checks whether - % "Volume" or "Volumes" - % - % call with - % field format.bvolume.check - % -FUNCTION {format.bvolume.check} -{ duplicate$ empty$ - 'skip$ - { duplicate$ multi.result.check - { "\BVOLS" swap$ tie.or.space.connect } - { "\BVOL" swap$ tie.or.space.connect } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % edition of book, must not be empty - % call with - % field format.edition.check - % -FUNCTION {format.edition.check} -{ duplicate$ empty$ - 'skip$ - { "\PrintOrdinal{" swap$ * "}" * - "\BEd" connect.with.space.check - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % volume and edition of book - % -FUNCTION {format.bvol.edition.check} -{ edition format.edition.check - volume format.bvolume.check - connect.with.comma.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % volume and edition of book - % -FUNCTION {format.bvol.edition} -{ format.bvol.edition.check - parenthesize.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % volume and edition and translator of translated book - % -FUNCTION {format.bvol.edition.trans} -{ format.bvol.edition.check - format.translators.in.paren.check connect.with.semicolon.check - parenthesize.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % volume, edition, editor, and translator of (translated) book - % -FUNCTION {format.bvol.edition.editor.trans} -{ format.bvol.edition.check - format.editors.translators.in.paren.check connect.with.semicolon.check - parenthesize.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % formats pages by first checking if 1 or more pages - % and prefixing pages with "p." or "pp." (these strings - % are given in the commands \BPG and \BPGS, respectively), - % whichever is applicable, and do a tie or space connect - % - % call with - % field format.bpages.check - % -FUNCTION {format.bpages.check} -{ duplicate$ empty$ - 'skip$ - { duplicate$ multi.result.check - { "\BPGS" swap$ tie.or.space.connect } - { "\BPG~" swap$ * } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % formats chapters by first checking if 1 or more chapters - % and prefixing pages with "chap." (this string - % is given in the commands \BCHAP and \BCHAPS, respectively), - % whichever is applicable, and do a tie or space connect - % - % call with - % field format.bchapter.check - % -FUNCTION {format.bchapter.check} -{ duplicate$ empty$ - 'skip$ - { duplicate$ multi.result.check - { "\BCHAPS" swap$ tie.or.space.connect } - { "\BCHAP" swap$ tie.or.space.connect } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % volume, edition, and pages or chapter of article in book etc. - % -FUNCTION {format.bvol.edition.pages} -{ format.bvol.edition.check - pages empty$ - { chapter format.bchapter.check connect.with.comma.check } - { pages format.bpages.check connect.with.comma.check } - if$ - parenthesize.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % title, volume, edition of book - % -FUNCTION {format.btitle.vol.edition} -{ format.betitle.check - format.bvol.edition connect.with.space.check - title format.btitle.connect.no.dot -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % title, volume, edition, and translator of book - % -FUNCTION {format.btitle.vol.edition.trans} -{ format.betitle.check - format.bvol.edition.trans connect.with.space.check - title format.btitle.connect.no.dot -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % title, volume, edition, editor, and translator of book - % -FUNCTION {format.btitle.vol.edition.editor.trans} -{ format.betitle.check - format.bvol.edition.editor.trans connect.with.space.check - title format.btitle.connect.no.dot -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format address and publisher of book etc. - % - % New York: Wiley - % or - % Wiley (if address empty) - % or - % New York (if publisher empty) - % -FUNCTION {format.address.publisher} -{ % - % If publisher = author or publisher = "author" or publisher = "Author" - % then hand over the final choice how to format this to \LaTeX. - % (I could imagine similar code for editors, but the APA manual does - % not mention it and then we'd have to check whether the editor is in - % the author position, so let's keep it simple until someone complains.) - % - author empty$ - publisher empty$ or - { publisher "\APACaddressPublisher{" } - { author publisher = - "author" publisher = or - "Author" publisher = or - { author "\APACaddressPublisherEqAuth{" } - { publisher "\APACaddressPublisher{" } - if$ - } - if$ - address "" connect.check "}{" * - % Recover publisher that was pushed onto the stack previously. - swap$ "" connect.check "}" * -} - -FUNCTION {format.address.publisher.check} -{ publisher empty$ - address empty$ - and - 'skip$ - { - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.address.publisher - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format number as in reports: No. 2017 - % call with - % field format.rnumber.check - % -FUNCTION {format.rnumber.check} -{ duplicate$ empty$ - 'skip$ - { duplicate$ multi.result.check - { "\BNUMS" swap$ tie.or.space.connect } - { "\BNUM" swap$ tie.or.space.connect } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format type and number of a standalone item - % call with - % format.type.number - % -FUNCTION { format.type.number } -{ type empty$ - { type.2 } - { type } - if$ - number empty$ - { bracket.check } - { number format.rnumber.check connect.with.space.check - parenthesize.check - } - if$ -} - -FUNCTION {format.howpublished} -{ howpublished empty$ - 'skip$ - { % clear the stack - duplicate$ empty$ - 'pop$ - { output.dot.new.block } - if$ - "\APAChowpublished {" howpublished * "}" * - } - if$ -} -FUNCTION {output.howpublished} -{ howpublished empty$ - 'skip$ - { "\APAChowpublished {" howpublished * "}" * - output.dot.new.block - } - if$ -} -FUNCTION {howpublished.block} -{ howpublished empty$ - 'skip$ - { start.new.block - "\APAChowpublished {" howpublished * "}" * - output.dot.end.block - } - if$ -} -FUNCTION {begin.end.url.env} -{ "\begin{APACrefURL} " - lastchecked empty$ - { urldate empty$ - 'skip$ - { "[{" * urldate * "}]" * } - if$ - } - { "[{" * lastchecked * "}]" * } - if$ - " \end{APACrefURL} " -} - -FUNCTION {begin.end.doi.env} -{ "\begin{APACrefDOI} " - " \end{APACrefDOI} " -} - -FUNCTION {begin.end.msg.env} -{ "\begin{APACrefURLmsg} " - " \end{APACrefURLmsg} " -} -FUNCTION {format.url} -{ type.2 empty$ - { begin.end.url.env } - { type.2 "\bibmessage" = - { begin.end.msg.env } - { begin.end.url.env } - if$ - } - if$ -%%"\url{" url * "}" * - "{" url * "}" * - enclose.check -} -FUNCTION {url.block} -{ doi empty$ - { url empty$ - 'skip$ - { start.new.block - format.url - output.end.block - } - if$ - } - 'skip$ - if$ -} -FUNCTION {format.doi} -{ begin.end.doi.env - "\doi{" doi * "}" * - enclose.check -} -FUNCTION {doi.block} -{ doi empty$ - 'skip$ - { start.new.block - format.doi - output.end.block - } - if$ -} -FUNCTION {format.note} -{ "\APACrefnote{" "}" note enclose.check } -FUNCTION {note.block} -{ note empty$ - 'skip$ - { start.new.block - format.note - output.end.block - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format original year of publication and note - % (reprint or translation) - % -FUNCTION {format.orig.year.note} -{ originalyear empty$ - { format.note } - { "\APACorigyearnote{" - originalyear "" connect.check "}{" * - note "" connect.check "}" * - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format original journal of publication and note - % (reprint or translation) - % -FUNCTION {format.orig.journal.note} -{ "\APACorigjournalnote{" - originalyear "" connect.check "}{" * - originaljournal "" connect.check "}{" * - originalvolume "" connect.check "}{" * - originalnumber "" connect.check "}{" * - originalpages "" connect.check "}{" * - note "" connect.check "}" * -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format original book of publication and note - % (reprint or translation) - % -FUNCTION {format.orig.book.note} -{ "\APACorigbooknote{" originalyear "" connect.check "}{" * - % - originaleditor empty$ - 'skip$ - { originaleditor num.names$ #1 > - { "\APACorigEDS {" * originaleditor format.editor.names * "}" * } - { "\APACorigED {" * originaleditor format.editor.names * "}" * } - if$ - } - if$ - % - "}{" * - originalbooktitle format.btitle.no.dot "" connect.check "} {" * - originaledition format.edition.check "" connect.check "} {" * - originalvolume format.bvolume.check "" connect.check "} {" * - originalpages format.bpages.check "" connect.check "} {" * - originaladdress "" connect.check "} {" * - originalpublisher "" connect.check "} {" * - note "" connect.check "}" * -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format information about original publication of reprint - % and format optional note - % -FUNCTION {format.orig.note} -{ originaljournal empty$ - { originalbooktitle empty$ - { note empty$ - { originalyear empty$ - 'skip$ - { originalyear "\bibnodate" = - originalyear "l" change.case$ "no date" = or - originalyear "l" change.case$ "n.d." = or - 'skip$ - { output.new.block - format.orig.year.note - } - if$ - } - if$ - } - { output.new.block - format.orig.year.note - } - if$ - } - { output.new.block - format.orig.book.note - } - if$ - } - { output.new.block - format.orig.journal.note - } - if$ -} -FUNCTION {fin.entry} -{ %doi empty$ - % 'skip$ - % { output.new.block - % format.doi - % } - % if$ - output.end.block - "\PrintBackRefs{\CurrentBib}" write$ newline$ - test - { "\vspace{\baselineskip}" write$ newline$ } - 'skip$ - if$ -} -FUNCTION {fin.entry.2} -{ doi.block - "\PrintBackRefs{\CurrentBib}" write$ newline$ - test - { "\vspace{\baselineskip}" write$ newline$ } - 'skip$ - if$ -} - -FUNCTION {format.archive} -{ - archivePrefix empty$ - { "" } - { archivePrefix ":" *} - if$ -} - -FUNCTION {format.primaryClass} -{ - primaryClass empty$ - { "" } - { " {[" primaryClass * "]}" *} - if$ -} - -FUNCTION {format.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - { "{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {format.softmisc.archive} -{ - archivePrefix empty$ - { "" } - { "" } - if$ -} - -FUNCTION {format.softmisc.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {periodical} -{ - author empty$ - % - % no author: possibly special issue with editors as authors - % (APA manual, ex. 11, p. 121) - % - { editor empty$ - % - % no author or editor: title serves as author. - % title formatted as article title (APA manual not consistent in this, - % compare statement on p. 119: ``treat as book title'' and - % example 8, p. 121: no underlining => article title) - % - { format.atitle.type.trans.check output.new.block - % - % now formatted date on top of stack - % - output.dot.new.block - } - % - % format editor and year, and check if year is present - % format article title and check if title or type present - % - { format.editors.as.authors start.new.block - % - % now formatted date on top of stack - % - output.dot.new.block - format.atitle.type.trans.check output.new.block - } - if$ - } - % - % format author and year, and check if year is present - % format article title and check if title or type present - % - { format.authors start.new.block - % - % now formatted date on top of stack - % - output.dot.new.block - format.atitle.type.trans.check output.new.block - } - if$ - % - % format journal name, volume and issue number, and pages - % and check if journal not empty - % - format.journal.vol.num.pages.check -% output.new.block - doi empty$ - 'skip$ - { output.new.block - format.doi - } - if$ - % - % if not empty, insert howpublished. - % (used if article is retrieved from the internet) - % -% format.howpublished add.period$ - % - % format url - % - url empty$ - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.url - } - if$ - % - % possible reprint and optional note - % - format.orig.note - output.new.block - format.eprint - output.new.block - format.primaryClass - fin.entry - } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % journal article - % -FUNCTION {article} -{ pages format.year.month.day.check periodical } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % magazine article - % -FUNCTION {magazine} -{ pages format.year.month.day.check periodical } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % newspaper article - % -FUNCTION {newspaper} -{ pages format.bpages.check format.year.month.day.check periodical } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % (translation of) entire book - % -FUNCTION {book} -{ % - % author or editor, - % year, title, englishtitle, translator - % - author empty$ - % - % no author: possibly edited book with editors as authors - % - { editor empty$ - % - % no author or editor: title serves as author. - % title formatted as book title - % - { format.btitle.vol.edition.trans - format.type.number connect.with.space.check - output.dot.new.block - format.year.check add.period$ - } - % - % format editor and year, and check if year is present - % format booktitle, volume, and edition and check if title present - % - { translator empty$ - { format.editors.as.authors start.new.block - format.year.check output.dot.new.block - format.btitle.vol.edition - } - % - % format translator correctly - % - { translator editor = - not - { format.editors.as.authors start.new.block - format.year.check output.dot.new.block - format.btitle.vol.edition.trans - } - { format.ed.trans.as.authors start.new.block - format.year.check output.dot.new.block - format.btitle.vol.edition - } - if$ - } - if$ - format.type.number connect.with.space.check - add.period$ - } - if$ - } - % - % format author and year, and check if year is present - % format booktitle, volume, and edition and check if title present - % - { format.authors start.new.block - format.year.check output.dot.new.block - format.btitle.vol.edition.editor.trans - format.type.number connect.with.space.check - add.period$ - } - if$ - % - % format address and publisher - % - format.address.publisher.check - % - % if not empty, insert howpublished. - % (used if book is retrieved from the internet) - % - format.howpublished add.period$ - % - % format url - % - url empty$ - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.url - } - if$ - % - % format original publication (of reprint/translation) - % and optional note - % - format.orig.note - fin.entry -} -FUNCTION {incollection} -{ author empty$ - { editor.ne.trans - { format.atitle.type.trans.check } - { format.atitle.type.check } - if$ - output.new.block - format.year.month.day.check add.period$ - } - { format.authors start.new.block - format.year.month.day.check output.dot.new.block - editor.ne.trans - { format.atitle.type.trans.check } - { format.atitle.type.check } - if$ - } - if$ - editor empty$ - translator empty$ and - edition empty$ and - volume empty$ and - pages empty$ and - chapter empty$ and - booktitle empty$ and - 'skip$ - { - output.new.block - format.in.editors.trans - format.bvol.edition.pages - booktitle format.btitle.connect * add.period$ - } - if$ - format.address.publisher.check - format.howpublished add.period$ - url empty$ - 'skip$ - { - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.url - } - if$ - format.orig.note - fin.entry -} - -FUNCTION {inbookcollection} -{ author empty$ - { editor.ne.trans - { format.atitle.type.trans.check } - { format.atitle.type.check } - if$ - output.new.block - format.year.month.day.check add.period$ - } - { format.authors start.new.block - format.year.month.day.check output.dot.new.block - editor.ne.trans - { format.atitle.type.trans.check } - { format.atitle.type.check } - if$ - } - if$ - editor empty$ - translator empty$ and - edition empty$ and - volume empty$ and - pages empty$ and - chapter empty$ and - booktitle empty$ and - 'skip$ - { - output.new.block - in.format.in.editors.trans - format.bvol.edition.pages - booktitle format.btitle.connect * add.period$ - } - if$ - format.address.publisher.check - format.howpublished add.period$ - url empty$ - 'skip$ - { - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.url - } - if$ - format.orig.note - fin.entry -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % technical report number - % -FUNCTION {format.tr.number} -{ type empty$ - { "\BTR{}" } - { type "\bibnotype" = - { "" } - { type } - if$ - } - if$ - number format.rnumber.check connect.with.space.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % title, volume, edition, report number - % -FUNCTION {format.tr.title.number} -{ format.betitle.check - % Single out the situation in which there is no number - % and type = {\bibnotype}, i.e., no type as well. - % (Why not use book then?) - type empty$ - { % Now, we're in the regular situation with at least a - % number, a type, a volume, or an edition. - "\APACbVolEdTR{" format.bvol.edition.check * "}{" * - format.tr.number * "}" * - } - { type "\bibnotype" = - number empty$ - volume empty$ - edition empty$ - and - and - and - { "" } - { % Now, we're in the regular situation with at least a - % number, a type, a volume, or an edition. - "\APACbVolEdTR {" format.bvol.edition.check * "}{" * - format.tr.number * "}" * - } - if$ - } - if$ - connect.with.space.check - title format.btitle.connect -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % format address and institution of reports etc. - % - % Washington, DC: National Institute of Education - % or - % National Institute of Education (if address empty) - % - % warning if no institution - % -FUNCTION {format.address.institution.check} -{ url empty$ - doi empty$ and - { "institution" institution warning.if.empty - "address" address warning.if.empty - } - 'skip$ - if$ - institution empty$ - address empty$ - and - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - % - % If institution = author or institution = "author" - % or institution = "Author" then hand over the final choice how to - % format this to \LaTeX. See also format.address.publisher - % - author empty$ - institution empty$ or - { institution "\APACaddressInstitution{" } - { author institution = - "author" institution = or - "Author" institution = or - { author "\APACaddressInstitutionEqAuth{" } - { institution "\APACaddressInstitution{" } - if$ - } - if$ - address "" connect.check "}{" * - % Recover institution that was pushed onto the stack previously. - swap$ "" connect.check "}" * - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % reports - % -FUNCTION {techreport} -{ author empty$ - % - % no author: possibly edited report with editors as authors - % - { editor empty$ - % - % no author or editor: title serves as author. - % title formatted as book title - % - { format.tr.title.number output.dot.new.block - format.year.month.day.check add.period$ - } - % - % format editor and year, and check if year is present - % format report title and check if title present - % format volume, edition, type, and number - % - { format.editors.as.authors start.new.block - format.year.month.day.check output.dot.new.block - format.tr.title.number add.period$ - } - if$ - } - % - % format author and year, and check if year is present - % format report title and check if title present - % format volume, edition, type, and number - % - { format.authors start.new.block - format.year.month.day.check output.dot.new.block - format.tr.title.number add.period$ - } - if$ - % - % format address and institution, check if institution present - % - format.address.institution.check - % - % if not empty, insert howpublished. - % (used if report is retrieved from the internet) - % - format.howpublished add.period$ - % - % format url - % - url empty$ - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.url - } - if$ - % - % format optional note - % - note empty$ - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.note - } - if$ - fin.entry -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % (translated) article or chapter in report - % -FUNCTION {intechreport} -{ author empty$ - % - % no author: title serves as author. - % title formatted as article title (APA manual not consistent in this, - % compare statement on p. 119: ``treat as book title'' and - % example 8, p. 121: no underlining => article title) - % - { editor.ne.trans - { format.atitle.trans.check } - { format.atitle.check } - if$ - output.new.block - format.year.month.day.check output.dot.new.block - } - % - % format author and year, and check if year is present - % format article title and check if title or type present - % - { format.authors start.new.block - format.year.month.day.check output.dot.new.block - editor.ne.trans - { format.atitle.trans.check } - { format.atitle.check } - if$ - output.new.block - } - if$ - % - % format "In " editor " (Ed. \& Trans.), " - % booktitle, volume, edition, pages - % - format.in.editors.trans - % - % volume, edition, report type and number, pages - % - "\APACbVolEdTRpgs {" format.bvol.edition.check * "} {" * - format.tr.number * - "} {" * pages format.bpages.check * - "}" * - % - booktitle format.btitle.connect * - add.period$ - % - % format address and publisher - % - format.address.institution.check - % - % if not empty, insert howpublished. - % (used if report is retrieved from the internet) - % - format.howpublished add.period$ - % - % format url - % - url empty$ - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.url - } - if$ - % - % format original publication (of reprint/translation) - % and optional note - % - format.orig.note - fin.entry -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % papers presented at conferences etc. - % -FUNCTION {lecture} -{ author empty$ - { "author" author warning.if.empty } - { format.authors start.new.block } - if$ - % - % format year, month, and day, and check if year present - % format title and check if title present - % format howpublished and check if howpublished present - % - format.year.month.day.check output.dot.new.block - symposium empty$ - { format.betitle.check - title format.btitle.connect output.new.block - howpublished empty$ - { "symposium and howpublished missing in " cite$ * warning$ - "" - } - { "\APAChowpublished {" howpublished * "}" * } - if$ - address connect.with.comma.check - } - { format.atitle.type.check output.new.block - "\BIn{} " - chair empty$ - 'skip$ - { chair format.editor.names - chair num.names$ #1 > - { "(\BCHAIRS)" } - { "(\BCHAIR)" } - if$ - connect.with.space.check * ", " * - } - if$ - symposium format.btitle.no.dot * - format.howpublished - address connect.with.comma.check - } - if$ - add.period$ - % - % format url - % - url empty$ - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.url - } - if$ - % - % format optional note - % - note empty$ - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.note - } - if$ - fin.entry -} - -FUNCTION {format.ttitle.type.school} -{ doi empty$ not - url empty$ not or - howpublished empty$ not or - { pop$ } - { swap$ pop$ } - if$ - type empty$ - 'skip$ - { type "\bibnotype" = - { pop$ - "" - } - { pop$ - type - } - if$ - } - if$ - duplicate$ empty$ - doi empty$ - url empty$ and - howpublished empty$ and - address empty$ - school empty$ and or and - { 'pop$ - title empty$ not - englishtitle empty$ not or - { start.new.block } - 'skip$ - if$ - "" - } - { start.new.block - "\APACtypeAddressSchool {" swap$ * "}{" * - doi empty$ - url empty$ and - howpublished empty$ and - { "}{}" * } - { address "" connect.check "}{" * - school "" connect.check "}" * - } - if$ - } - if$ - format.betitle.check swap$ - connect.with.space.check - "title" title warning.if.empty - title format.btitle.connect -} -FUNCTION {unpub.address.school.block} -{ doi empty$ - url empty$ and - howpublished empty$ and - { "school" school warning.if.empty - school empty$ - address empty$ and - 'skip$ - { start.new.block - "\APACaddressSchool {" address "" connect.check "}{" * - school "" connect.check "}" * - output.dot.end.block - } - if$ - } - 'skip$ - if$ -} -FUNCTION {thesis} -{ journal empty$ not - { pop$ pop$ - article - } - { author empty$ - { "author" author warning.if.empty } - { format.authors start.new.block } - if$ - format.year.check output.dot.end.block - format.ttitle.type.school output.dot.end.block - unpub.address.school.block - howpublished.block - url.block - note.block - fin.entry.2 - } - if$ -} -FUNCTION {phdthesis} -{ "\BPhD" "\BUPhD" thesis } -FUNCTION {mastersthesis} -{ "\BMTh" "\BUMTh" thesis } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % title of something (used in unpublished and misc) - % english translation of title - % type and number of something - % -FUNCTION {format.btitle.type.num} -{ format.betitle.check - format.bvol.edition connect.with.space.check - format.type.number - connect.with.space.check - title empty$ - { add.period$ } - { title format.btitle.connect } - if$ -} - -FUNCTION {format.version} -{ - version empty$ - { "" } - { " " * version *} - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % title of message or software-related thing (used in misc) - % english translation of title - % type and number of something - % -FUNCTION {format.mtitle.type.num} -{ format.aetitle.check - format.bvol.edition connect.with.space.check - type.2 "\bibmessage" = - { number empty$ - 'skip$ - { type.2 number tie.or.space.connect - bracket.check - connect.with.space.check - } - if$ - } - { format.type.number - connect.with.space.check - } - if$ - title empty$ - { add.period$ } - { title format.atitle.connect } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % title, english translation of title, - % type and number of something (used in misc) - % -FUNCTION {output.misctitle.type.num} -{ type.2 empty$ - { format.btitle.type.num } - { type.2 "\bibmessage" = - type.2 "\bibcomputerprogram" = or - type.2 "\bibcomputerprogrammanual" = or - type.2 "\bibcomputerprogramandmanual" = or - type.2 "\bibcomputersoftware" = or - type.2 "\bibcomputersoftwaremanual" = or - type.2 "\bibcomputersoftwareandmanual" = or - type.2 "\bibprogramminglanguage" = or - { format.mtitle.type.num } - { format.btitle.type.num } - if$ - } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % unpublished manuscripts, etc. - % -FUNCTION {unpublished} -{ check.relevant.fields - author empty$ - % - % no author: possibly edited book with editors as authors - % - { editor empty$ - % - % no author or editor: title serves as author. - % title formatted as book title - % - { format.btitle.type.num output.new.block - format.year.month.day.check add.period$ - } - % - % format editor and year, and check if year is present - % format book title, volume, and edition and check if title present - % - { format.editors.as.authors start.new.block - format.year.month.day.check output.dot.new.block - format.btitle.type.num - } - if$ - } - % - % format author and year, and check if year is present - % format book title, volume, and edition - % and check if title or type present - % - { format.authors start.new.block - format.year.month.day.check output.dot.new.block - format.btitle.type.num - } - if$ - howpublished empty$ - organization empty$ and - address empty$ and - 'skip$ - { output.new.block - "\APAChowpublished{" "}" howpublished enclose.check - organization connect.with.comma.check - address connect.with.comma.check - add.period$ - } - if$ - % - % format url - % - url empty$ - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.url - } - if$ - % - % format optional note - % - note empty$ - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.note - } - if$ - fin.entry -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % nonprint media and other things that don't fit - % -FUNCTION {misc} -{ % - % To handle @manual: use type.2 instead of type. - type.2 empty$ - type empty$ not and - { type 'type.2 := } - 'skip$ - if$ - % - author empty$ - % - % no author: possibly edited item with editors as authors - % - { editor empty$ - % - % no author or editor: title/type serves as author. - % title formatted as book title - % - % if no title and no type, howpublished is title - % - { title empty$ - type.2 empty$ and - { howpublished empty$ - { "No author, editor, title, type, and howpublished in " - cite$ * warning$ - "" - } - { "\APAChowpublished{" howpublished * "}" * add.period$ } - if$ - format.year.month.day.check add.period$ - } - { output.misctitle.type.num %output.new.block - format.year.month.day.check add.period$ - format.howpublished add.period$ - } - if$ - } - % - % format editor and year, and check if year is present - % format book title, volume, and edition and check if title present - % - { format.editors.as.authors start.new.block - format.year.month.day.check output.dot.new.block - output.misctitle.type.num output.dot.new.block - format.howpublished add.period$ - } - if$ - } - % - % format author and year, and check if year is present - % format book title, volume, and edition - % and check if title or type present - % - { format.authors start.new.block - format.year.month.day.check output.dot.new.block - output.misctitle.type.num - format.howpublished add.period$ - } - if$ - % - address empty$ - publisher empty$ and - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.address.publisher add.period$ - } - if$ - % - % format url - % - url empty$ - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.url - } - if$ - % - % format optional note - % - note empty$ - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.note - } - if$ - fin.entry -} - -FUNCTION {softmisc} -{ % - % To handle @manual: use type.2 instead of type. - type.2 empty$ - type empty$ not and - { type 'type.2 := } - 'skip$ - if$ - % - author empty$ - % - % no author: possibly edited item with editors as authors - % - { editor empty$ - % - % no author or editor: title/type serves as author. - % title formatted as book title - % - % if no title and no type, howpublished is title - % - { title empty$ - type.2 empty$ and - { howpublished empty$ - { "No author, editor, title, type, and howpublished in " - cite$ * warning$ - "" - } - { "\APAChowpublished{" howpublished * "}" * add.period$ } - if$ - format.year.month.day.check add.period$ - } - { output.misctitle.type.num %output.new.block - format.year.month.day.check add.period$ - format.howpublished add.period$ - } - if$ - } - % - % format editor and year, and check if year is present - % format book title, volume, and edition and check if title present - % - { format.editors.as.authors start.new.block - format.year.month.day.check output.dot.new.block - output.misctitle.type.num output.dot.new.block - format.howpublished add.period$ - } - if$ - } - % - % format author and year, and check if year is present - % format book title, volume, and edition - % and check if title or type present - % - { format.authors start.new.block - format.year.nomonth.day.check output.dot.new.block - output.misctitle.type.num - format.version - format.howpublished add.period$ - } - if$ - % - address empty$ - publisher empty$ and - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.address.publisher add.period$ - } - if$ - % - % format url - % - url empty$ - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.url - } - if$ - % - % format optional note - % - note empty$ - 'skip$ - { % Clear the stack - duplicate$ empty$ - 'skip$ - { output.new.block } - if$ - format.note - } - if$ - output.dot.new.block - format.softmisc.eprint - fin.entry -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % for legal cases and other cases that need to be - % done by hand - % -FUNCTION {literal} -{ "key" key warning.if.empty - "text" text warning.if.empty - text empty$ - { "" } - { text } - if$ - fin.entry -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % technical documentation - % -FUNCTION {manual} -{ % - % If type is empty, assume that it is a computer software manual. - % - type empty$ - { "\bibcomputersoftwaremanual" 'type.2 := } - 'skip$ - if$ - misc -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % booklet - % -FUNCTION {booklet} -{ misc } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % part of a book - % -FUNCTION {inbook} -{ inbookcollection } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % article in proceedings - % -FUNCTION {inproceedings} -{ incollection } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % article in proceedings (Kopka & Daly, 2004, p. 230) - % -FUNCTION {conference} -{ inproceedings } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % proceedings - % -FUNCTION {proceedings} -{ misc } - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % unknown types - % -FUNCTION {default.type} -{ misc } - -FUNCTION {initialize} -{ - #6 'name.max := -%% #250 'entry.max$ := -%% #5000 'global.max$ := -} -FUNCTION {init.old.number} -{ #0 'old.number := } -FUNCTION {init.old.label} -{ "zzzzzz" 'old.label := } -FUNCTION {init.cite.initials.add.to.year} -{ #0 'cite.initials := - #0 'add.to.year := -} -FUNCTION {move.forward} -{ #1 'forward := } -FUNCTION {move.backward} -{ #0 'forward := } -FUNCTION {begin.bib} -{ preamble$ empty$ - 'skip$ - { preamble$ write$ newline$ } - if$ - "\begin{thebibliography}{}" write$ newline$ - "\renewcommand{\doi}[1]{\url{https://doi.org/#1}}" - write$ newline$ - "\bibcommenthead" write$ newline$ -} -FUNCTION {end.bib} -{ newline$ - "\end{thebibliography}" write$ newline$ -} -FUNCTION {write.bbl.entry} -{ - make.cite.labels - call.type$ -} -READ -EXECUTE { identify.apacite.version } -EXECUTE { initialize } -EXECUTE { init.old.number } -ITERATE { make.citeorder.number } -ITERATE { make.sort.title } -SORT -EXECUTE { init.old.number } -EXECUTE { init.old.label } -ITERATE { make.title.number } -ITERATE { make.tentative.sort.label } -SORT -ITERATE { init.cite.initials.add.to.year } -EXECUTE { init.initials } -ITERATE { check.add.initials } -EXECUTE { init.initials } -REVERSE { check.add.initials } -ITERATE { tentative.cite.num.names } -EXECUTE { init.cite.num.names } -EXECUTE { move.forward } -ITERATE { definitive.cite.num.names } -EXECUTE { init.cite.num.names } -EXECUTE { move.backward } -REVERSE { definitive.cite.num.names } -ITERATE { make.final.sort.key } -SORT -EXECUTE { begin.bib } -ITERATE { write.bbl.entry } -EXECUTE { end.bib } - -%% -%% End of file `sn-apacite.bst'. diff --git a/waypoint_control/sn-article-template/bst/sn-aps.bst b/waypoint_control/sn-article-template/bst/sn-aps.bst deleted file mode 100644 index c6693bf..0000000 --- a/waypoint_control/sn-article-template/bst/sn-aps.bst +++ /dev/null @@ -1,1531 +0,0 @@ -%% -%% This is file `sn-aps.bst', -%% generated with the docstrip utility. -%% -%% The original source files were: merlin.mbs -%% ------------------------------------------ -%%********************************************************************************%% -%% For Springer physics publications. Based on the APS reference style. %% -%%********************************************************************************%% -%% - % =============================================================== - % IMPORTANT NOTICE: - % This bibliographic style (bst) file has been generated from one or - % more master bibliographic style (mbs) files, listed above. - % - % This file can be redistributed and/or modified under the terms - % of the LaTeX Project Public License Distributed from CTAN - % archives in directory macros/latex/base/lppl.txt; either - % version 1 of the License, or any later version. - % =============================================================== - % For use with BibTeX version 0.99a or later - %------------------------------------------------------------------- - % This bibliography style file is intended for texts in ENGLISH - % This is a numerical citation style, and as such is standard LaTeX. - % It requires no extra package to interface to the main text. - % The form of the \bibitem entries is - % \bibitem{key}... - % Usage of \cite is as follows: - % \cite{key} ==>> [#] - % \cite[chap. 2]{key} ==>> [#, chap. 2] - % where # is a number determined by the ordering in the reference list. - % The order in the reference list is that by which the works were originally - % cited in the text, or that in the database. - %--------------------------------------------------------------------- - -FUNCTION {identify.aps.version} -{ % Put identifying string in the .blg file - "sn-aps.bst" - " [2024/07/19 v1.1 APS bibliography style]" - * top$ -} - -ENTRY - { address - author - booktitle - chapter - doi - edition - editor - eid - howpublished - institution - journal - key - keywords - month - note - number - organization - pages - publisher - school - series - title - type - url - volume - year - eprint - archive - archivePrefix - primaryClass - adsurl - adsnote - version - } - {} - { label } -INTEGERS { output.state before.all mid.sentence after.sentence after.block } -FUNCTION {init.state.consts} -{ #0 'before.all := - #1 'mid.sentence := - #2 'after.sentence := - #3 'after.block := -} -STRINGS { s t} -FUNCTION {output.nonnull} -{ 's := - output.state mid.sentence = - { ", " * write$ } - { output.state after.block = - { add.period$ write$ - newline$ - "\newblock " write$ - } - { output.state before.all = - 'write$ - { add.period$ " " * write$ } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} -FUNCTION {output} -{ duplicate$ empty$ - 'pop$ - 'output.nonnull - if$ -} -FUNCTION {output.check} -{ 't := - duplicate$ empty$ - { pop$ "empty " t * " in " * cite$ * warning$ } - 'output.nonnull - if$ -} -FUNCTION {fin.entry} -{ duplicate$ empty$ - 'pop$ - 'write$ - if$ - newline$ -} - -FUNCTION {new.block} -{ output.state before.all = - 'skip$ - { after.block 'output.state := } - if$ -} -FUNCTION {new.sentence} -{ output.state after.block = - 'skip$ - { output.state before.all = - 'skip$ - { after.sentence 'output.state := } - if$ - } - if$ -} -FUNCTION {add.blank} -{ " " * before.all 'output.state := -} - -FUNCTION {add.comma} -{ duplicate$ empty$ - 'skip$ - { "," * add.blank } - if$ -} - -FUNCTION {date.block} -{ - new.block -} - -FUNCTION {not} -{ { #0 } - { #1 } - if$ -} -FUNCTION {and} -{ 'skip$ - { pop$ #0 } - if$ -} -FUNCTION {or} -{ { pop$ #1 } - 'skip$ - if$ -} -FUNCTION {new.block.checka} -{ empty$ - 'skip$ - 'new.block - if$ -} -FUNCTION {new.block.checkb} -{ empty$ - swap$ empty$ - and - 'skip$ - 'new.block - if$ -} -FUNCTION {new.sentence.checka} -{ empty$ - 'skip$ - 'new.sentence - if$ -} -FUNCTION {new.sentence.checkb} -{ empty$ - swap$ empty$ - and - 'skip$ - 'new.sentence - if$ -} -FUNCTION {field.or.null} -{ duplicate$ empty$ - { pop$ "" } - 'skip$ - if$ -} -FUNCTION {emphasize} -{ duplicate$ empty$ - { pop$ "" } - { "\emph{" swap$ * "}" * } - if$ -} -FUNCTION {bolden} -{ duplicate$ empty$ - { pop$ "" } - { "\textbf{" swap$ * "}" * } - if$ -} -FUNCTION {tie.or.space.prefix} -{ duplicate$ text.length$ #3 < - { "~" } - { " " } - if$ - swap$ -} - -FUNCTION {capitalize} -{ "u" change.case$ "t" change.case$ } - -FUNCTION {space.word} -{ " " swap$ * " " * } - % Here are the language-specific definitions for explicit words. - % Each function has a name bbl.xxx where xxx is the English word. - % The language selected here is ENGLISH -FUNCTION {bbl.and} -{ "and"} - -FUNCTION {bbl.etal} -{ "et~al." } - -FUNCTION {bbl.editors} -{ "eds." } - -FUNCTION {bbl.editor} -{ "ed." } - -FUNCTION {bbl.edby} -{ "ed. by" } - -FUNCTION {bbl.edition} -{ "edn." } - -FUNCTION {bbl.volume} -{ "vol." } - -FUNCTION {bbl.of} -{ "of" } - -FUNCTION {bbl.number} -{ "no." } - -FUNCTION {bbl.nr} -{ "no." } - -FUNCTION {bbl.in} -{ "in" } - -FUNCTION {bbl.pages} -{ "pp." } - -FUNCTION {bbl.page} -{ "p." } - -FUNCTION {bbl.chapter} -{ "chap." } - -FUNCTION {bbl.techrep} -{ "Tech. Rep." } - -FUNCTION {bbl.mthesis} -{ "Master's thesis" } - -FUNCTION {bbl.phdthesis} -{ "Ph.D. thesis" } - -FUNCTION {bbl.first} -{ "1st" } - -FUNCTION {bbl.second} -{ "2nd" } - -FUNCTION {bbl.third} -{ "3rd" } - -FUNCTION {bbl.fourth} -{ "4th" } - -FUNCTION {bbl.fifth} -{ "5th" } - -FUNCTION {bbl.st} -{ "st" } - -FUNCTION {bbl.nd} -{ "nd" } - -FUNCTION {bbl.rd} -{ "rd" } - -FUNCTION {bbl.th} -{ "th" } - -MACRO {jan} {"Jan."} - -MACRO {feb} {"Feb."} - -MACRO {mar} {"Mar."} - -MACRO {apr} {"Apr."} - -MACRO {may} {"May"} - -MACRO {jun} {"Jun."} - -MACRO {jul} {"Jul."} - -MACRO {aug} {"Aug."} - -MACRO {sep} {"Sep."} - -MACRO {oct} {"Oct."} - -MACRO {nov} {"Nov."} - -MACRO {dec} {"Dec."} - -FUNCTION {eng.ord} -{ duplicate$ "1" swap$ * - #-2 #1 substring$ "1" = - { bbl.th * } - { duplicate$ #-1 #1 substring$ - duplicate$ "1" = - { pop$ bbl.st * } - { duplicate$ "2" = - { pop$ bbl.nd * } - { "3" = - { bbl.rd * } - { bbl.th * } - if$ - } - if$ - } - if$ - } - if$ -} - -MACRO {acmcs} {"ACM Comput. Surv."} - -MACRO {acta} {"Acta Inf."} - -MACRO {cacm} {"Commun. ACM"} - -MACRO {ibmjrd} {"IBM J. Res. Dev."} - -MACRO {ibmsj} {"IBM Syst.~J."} - -MACRO {ieeese} {"IEEE Trans. Software Eng."} - -MACRO {ieeetc} {"IEEE Trans. Comput."} - -MACRO {ieeetcad} - {"IEEE Trans. Comput. Aid. Des."} - -MACRO {ipl} {"Inf. Process. Lett."} - -MACRO {jacm} {"J.~ACM"} - -MACRO {jcss} {"J.~Comput. Syst. Sci."} - -MACRO {scp} {"Sci. Comput. Program."} - -MACRO {sicomp} {"SIAM J. Comput."} - -MACRO {tocs} {"ACM Trans. Comput. Syst."} - -MACRO {tods} {"ACM Trans. Database Syst."} - -MACRO {tog} {"ACM Trans. Graphic."} - -MACRO {toms} {"ACM Trans. Math. Software"} - -MACRO {toois} {"ACM Trans. Office Inf. Syst."} - -MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} - -MACRO {tcs} {"Theor. Comput. Sci."} - -FUNCTION {bibinfo.check} -{ swap$ - duplicate$ missing$ - { - pop$ pop$ - "" - } - { duplicate$ empty$ - { - swap$ pop$ - } - { swap$ - pop$ - } - if$ - } - if$ -} -FUNCTION {bibinfo.warn} -{ swap$ - duplicate$ missing$ - { - swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ - "" - } - { duplicate$ empty$ - { - swap$ "empty " swap$ * " in " * cite$ * warning$ - } - { swap$ - pop$ - } - if$ - } - if$ -} -FUNCTION {format.url} -{ url empty$ - { "" } - { "\urlprefix\url{" url * "}" * } - if$ -} - -STRINGS { bibinfo} -INTEGERS { nameptr namesleft numnames } - -FUNCTION {format.names} -{ 'bibinfo := - duplicate$ empty$ 'skip$ { - 's := - "" 't := - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { s nameptr - "{f{.}.~}{vv~}{ll}{, jj}" - format.name$ - bibinfo bibinfo.check - 't := - nameptr #1 > - { - namesleft #1 > - { ", " * t * } - { - "," * - s nameptr "{ll}" format.name$ duplicate$ "others" = - { 't := } - { pop$ } - if$ - t "others" = - { - " " * bbl.etal * - } - { " " * t * } - if$ - } - if$ - } - 't - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ - } if$ -} -FUNCTION {format.names.ed} -{ - format.names -} -FUNCTION {format.authors} -{ author "author" format.names -} -FUNCTION {get.bbl.editor} -{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } - -FUNCTION {format.editors} -{ editor "editor" format.names duplicate$ empty$ 'skip$ - { - " " * - get.bbl.editor - "(" swap$ * ")" * - * - } - if$ -} -FUNCTION {format.doi} -{ doi "doi" bibinfo.check - duplicate$ empty$ 'skip$ - { - new.block - "\doi{" swap$ * "}" * - } - if$ -} -FUNCTION {format.note} -{ - note empty$ - { "" } - { note #1 #1 substring$ - duplicate$ "{" = - 'skip$ - { output.state mid.sentence = - { "l" } - { "u" } - if$ - change.case$ - } - if$ - note #2 global.max$ substring$ * "note" bibinfo.check - } - if$ -} - -FUNCTION {format.title} -{ title - duplicate$ empty$ 'skip$ - { "t" change.case$ } - if$ - "title" bibinfo.check -} -FUNCTION {output.bibitem} -{ newline$ - "\bibitem{" write$ - cite$ write$ - "}" write$ - newline$ - "" - before.all 'output.state := -} - -FUNCTION {if.digit} -{ duplicate$ "0" = - swap$ duplicate$ "1" = - swap$ duplicate$ "2" = - swap$ duplicate$ "3" = - swap$ duplicate$ "4" = - swap$ duplicate$ "5" = - swap$ duplicate$ "6" = - swap$ duplicate$ "7" = - swap$ duplicate$ "8" = - swap$ "9" = or or or or or or or or or -} -FUNCTION {n.separate} -{ 't := - "" - #0 'numnames := - { t empty$ not } - { t #-1 #1 substring$ if.digit - { numnames #1 + 'numnames := } - { #0 'numnames := } - if$ - t #-1 #1 substring$ swap$ * - t #-2 global.max$ substring$ 't := - numnames #5 = - { duplicate$ #1 #2 substring$ swap$ - #3 global.max$ substring$ - "," swap$ * * - } - 'skip$ - if$ - } - while$ -} -FUNCTION {n.dashify} -{ -%% n.separate - 't := - "" - { t empty$ not } - { t #1 #1 substring$ "-" = - { t #1 #2 substring$ "--" = not - { "--" * - t #2 global.max$ substring$ 't := - } - { { t #1 #1 substring$ "-" = } - { "-" * - t #2 global.max$ substring$ 't := - } - while$ - } - if$ - } - { t #1 #1 substring$ * - t #2 global.max$ substring$ 't := - } - if$ - } - while$ -} - -FUNCTION {word.in} -{ bbl.in - " " * } - -FUNCTION {format.date} -{ - "" - duplicate$ empty$ - year "year" bibinfo.check duplicate$ empty$ - { swap$ 'skip$ - { "there's a month but no year in " cite$ * warning$ } - if$ - * - } - { swap$ 'skip$ - { - swap$ - " " * swap$ - } - if$ - * - } - if$ - duplicate$ empty$ - 'skip$ - { - before.all 'output.state := - " (" swap$ * ")" * - } - if$ -} -FUNCTION {format.btitle} -{ title "title" bibinfo.check - duplicate$ empty$ 'skip$ - { - emphasize - } - if$ -} -FUNCTION {either.or.check} -{ empty$ - 'pop$ - { "can't use both " swap$ * " fields in " * cite$ * warning$ } - if$ -} -FUNCTION {format.bvolume} -{ volume empty$ - { "" } - { bbl.volume volume tie.or.space.prefix - "volume" bibinfo.check * * - series "series" bibinfo.check - duplicate$ empty$ 'pop$ - { emphasize ", " * swap$ * } - if$ - "volume and number" number either.or.check - } - if$ -} -FUNCTION {format.number.series} -{ volume empty$ - { number empty$ - { series field.or.null } - { series empty$ - { number "number" bibinfo.check } - { output.state mid.sentence = - { bbl.number } - { bbl.number capitalize } - if$ - number tie.or.space.prefix "number" bibinfo.check * * - bbl.in space.word * - series "series" bibinfo.check * - } - if$ - } - if$ - } - { "" } - if$ -} -FUNCTION {is.num} -{ chr.to.int$ - duplicate$ "0" chr.to.int$ < not - swap$ "9" chr.to.int$ > not and -} - -FUNCTION {extract.num} -{ duplicate$ 't := - "" 's := - { t empty$ not } - { t #1 #1 substring$ - t #2 global.max$ substring$ 't := - duplicate$ is.num - { s swap$ * 's := } - { pop$ "" 't := } - if$ - } - while$ - s empty$ - 'skip$ - { pop$ s } - if$ -} - -FUNCTION {convert.edition} -{ extract.num "l" change.case$ 's := - s "first" = s "1" = or - { bbl.first 't := } - { s "second" = s "2" = or - { bbl.second 't := } - { s "third" = s "3" = or - { bbl.third 't := } - { s "fourth" = s "4" = or - { bbl.fourth 't := } - { s "fifth" = s "5" = or - { bbl.fifth 't := } - { s #1 #1 substring$ is.num - { s eng.ord 't := } - { edition 't := } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - t -} - -FUNCTION {format.edition} -{ edition duplicate$ empty$ 'skip$ - { - convert.edition - output.state mid.sentence = - { "l" } - { "t" } - if$ change.case$ - "edition" bibinfo.check - " " * bbl.edition * - } - if$ -} -INTEGERS { multiresult } -FUNCTION {multi.page.check} -{ 't := - #0 'multiresult := - { multiresult not - t empty$ not - and - } - { t #1 #1 substring$ - duplicate$ "-" = - swap$ duplicate$ "," = - swap$ "+" = - or or - { #1 'multiresult := } - { t #2 global.max$ substring$ 't := } - if$ - } - while$ - multiresult -} -FUNCTION {format.pages} -{ pages duplicate$ empty$ 'skip$ - { duplicate$ multi.page.check - { - bbl.pages swap$ - n.dashify - } - { - bbl.page swap$ - } - if$ - tie.or.space.prefix - "pages" bibinfo.check - * * - } - if$ -} -FUNCTION {first.page} -{ 't := - "" - { t empty$ not t #1 #1 substring$ "-" = not and } - { t #1 #1 substring$ * - t #2 global.max$ substring$ 't := - } - while$ -} - -FUNCTION {format.journal.pages} -{ pages duplicate$ empty$ 'pop$ - { swap$ duplicate$ empty$ - { pop$ pop$ format.pages } - { - ", " * - swap$ - n.dashify - "pages" bibinfo.check - * - } - if$ - } - if$ -} -FUNCTION {format.journal.eid} -{ eid "eid" bibinfo.check - duplicate$ empty$ 'pop$ - { swap$ duplicate$ empty$ 'skip$ - { - ", " * - } - if$ - swap$ * - } - if$ -} -FUNCTION {format.vol.num.pages} -{ volume field.or.null - duplicate$ empty$ 'skip$ - { - "volume" bibinfo.check - } - if$ - bolden - number "number" bibinfo.check duplicate$ empty$ 'skip$ - { - swap$ duplicate$ empty$ - { "there's a number but no volume in " cite$ * warning$ } - 'skip$ - if$ - swap$ - "(" swap$ * ")" * - } - if$ * - eid empty$ - { format.journal.pages } - { format.journal.eid } - if$ -} - -FUNCTION {format.chapter.pages} -{ chapter empty$ - 'format.pages - { type empty$ - { bbl.chapter } - { type "l" change.case$ - "type" bibinfo.check - } - if$ - chapter tie.or.space.prefix - "chapter" bibinfo.check - * * - pages empty$ - 'skip$ - { ", " * format.pages * } - if$ - } - if$ -} - -FUNCTION {format.booktitle} -{ - booktitle "booktitle" bibinfo.check - emphasize -} - -FUNCTION {format.in.ed.booktitle} -{format.booktitle duplicate$ empty$ 'skip$ - { - format.bvolume duplicate$ empty$ 'pop$ - { ", " swap$ * * } - if$ - editor "editor" format.names.ed duplicate$ empty$ 'pop$ - { - bbl.edby - " " * swap$ * - swap$ - "," * - " " * swap$ - * } - if$ - word.in swap$ * - } - if$ -} -FUNCTION {empty.misc.check} -{ author empty$ title empty$ howpublished empty$ - month empty$ year empty$ note empty$ - and and and and and - { "all relevant fields are empty in " cite$ * warning$ } - 'skip$ - if$ -} -FUNCTION {format.thesis.type} -{ type duplicate$ empty$ - 'pop$ - { swap$ pop$ - "t" change.case$ "type" bibinfo.check - } - if$ -} -FUNCTION {format.tr.number} -{ number "number" bibinfo.check - type duplicate$ empty$ - { pop$ bbl.techrep } - 'skip$ - if$ - "type" bibinfo.check - swap$ duplicate$ empty$ - { pop$ "t" change.case$ } - { tie.or.space.prefix * * } - if$ -} -FUNCTION {format.article.crossref} -{ - key duplicate$ empty$ - { pop$ - journal duplicate$ empty$ - { "need key or journal for " cite$ * " to crossref " * crossref * warning$ } - { "journal" bibinfo.check emphasize word.in swap$ * } - if$ - } - { word.in swap$ * " " *} - if$ - " \cite{" * crossref * "}" * -} -FUNCTION {format.crossref.editor} -{ editor #1 "{vv~}{ll}" format.name$ - "editor" bibinfo.check - editor num.names$ duplicate$ - #2 > - { pop$ - "editor" bibinfo.check - " " * bbl.etal - * - } - { #2 < - 'skip$ - { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = - { - "editor" bibinfo.check - " " * bbl.etal - * - } - { - bbl.and space.word - * editor #2 "{vv~}{ll}" format.name$ - "editor" bibinfo.check - * - } - if$ - } - if$ - } - if$ -} -FUNCTION {format.book.crossref} -{ volume duplicate$ empty$ - { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ - pop$ word.in - } - { bbl.volume - capitalize - swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * - } - if$ - editor empty$ - editor field.or.null author field.or.null = - or - { key empty$ - { series empty$ - { "need editor, key, or series for " cite$ * " to crossref " * - crossref * warning$ - "" * - } - { series emphasize * } - if$ - } - { key * } - if$ - } - { format.crossref.editor * } - if$ - " \cite{" * crossref * "}" * -} -FUNCTION {format.incoll.inproc.crossref} -{ - editor empty$ - editor field.or.null author field.or.null = - or - { key empty$ - { format.booktitle duplicate$ empty$ - { "need editor, key, or booktitle for " cite$ * " to crossref " * - crossref * warning$ - } - { word.in swap$ * } - if$ - } - { word.in key * " " *} - if$ - } - { word.in format.crossref.editor * " " *} - if$ - " \cite{" * crossref * "}" * -} -FUNCTION {format.org.or.pub} -{ 't := - "" - year empty$ - { "empty year in " cite$ * warning$ } - 'skip$ - if$ - address empty$ t empty$ and - year empty$ and - 'skip$ - { - add.blank "(" * - t empty$ - { address "address" bibinfo.check * - } - { t * - address empty$ - 'skip$ - { ", " * address "address" bibinfo.check * } - if$ - } - if$ - year empty$ - 'skip$ - { t empty$ address empty$ and - 'skip$ - { ", " * } - if$ - year "year" bibinfo.check - * - } - if$ - ")" * - } - if$ -} -FUNCTION {format.publisher.address} -{ publisher "publisher" bibinfo.warn format.org.or.pub -} - -FUNCTION {format.organization.address} -{ organization "organization" bibinfo.check format.org.or.pub -} - -FUNCTION {format.softmisc.archive} -{ - archivePrefix empty$ - { "" } - { "" } - if$ -} - -FUNCTION {format.archive} -{ - archivePrefix empty$ - { "" } - { archivePrefix ":" *} - if$ -} - -FUNCTION {format.primaryClass} -{ - primaryClass empty$ - { "" } - { "{[" primaryClass * "]}" *} - if$ -} - -FUNCTION {format.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {format.softmisc.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {article} -{ output.bibitem - format.authors "author" output.check - add.comma - format.title "title" output.check - new.block - crossref missing$ - { - journal - "journal" bibinfo.check - "journal" output.check - add.blank - format.vol.num.pages output - format.date "year" output.check - } - { format.article.crossref output.nonnull - format.pages output - } - if$ - format.doi output - new.block - format.url output - new.block - format.note output - new.block - format.eprint output - add.blank - format.primaryClass output - fin.entry -} - -FUNCTION {book} -{ output.bibitem - author empty$ - { format.editors "author and editor" output.check - } - { format.authors output.nonnull - crossref missing$ - { "author and editor" editor either.or.check } - 'skip$ - if$ - } - if$ - add.comma - format.btitle "title" output.check - crossref missing$ - { format.bvolume output - format.edition output - new.block - format.number.series output - new.sentence - format.publisher.address output - format.pages output - } - { - new.block - format.book.crossref output.nonnull - format.date "year" output.check - } - if$ - format.doi output - new.block - format.url output - new.block - format.note output - fin.entry -} -FUNCTION {booklet} -{ output.bibitem - format.authors output - add.comma - format.title "title" output.check - new.block - howpublished "howpublished" bibinfo.check output - address "address" bibinfo.check output - format.date output - format.doi output - new.block - format.url output - new.block - format.note output - fin.entry -} - -FUNCTION {inbook} -{ output.bibitem - author empty$ - { format.editors "author and editor" output.check - } - { format.authors output.nonnull - crossref missing$ - { "author and editor" editor either.or.check } - 'skip$ - if$ - } - if$ - add.comma - format.btitle "title" output.check - crossref missing$ - { - format.publisher.address output - format.bvolume output - format.edition output - format.chapter.pages "chapter and pages" output.check - new.block - format.number.series output - new.sentence - } - { - format.chapter.pages "chapter and pages" output.check - new.block - format.book.crossref output.nonnull - format.date "year" output.check - } - if$ - format.doi output - new.block - format.url output - new.block - format.note output - fin.entry -} - -FUNCTION {incollection} -{ output.bibitem - format.authors "author" output.check - add.comma - crossref missing$ - { format.in.ed.booktitle "booktitle" output.check - format.edition output - format.number.series output - format.publisher.address output - format.chapter.pages output - new.sentence - } - { format.incoll.inproc.crossref output.nonnull - format.chapter.pages output - } - if$ - format.doi output - new.block - format.url output - new.block - format.note output - fin.entry -} - -FUNCTION {inproceedings} -{ output.bibitem - format.authors "author" output.check - add.comma - format.btitle "title" output.check - crossref missing$ - { format.in.ed.booktitle "booktitle" output.check - new.sentence - publisher empty$ - { format.organization.address output } - { organization "organization" bibinfo.check output - format.publisher.address output - } - if$ - format.number.series output - format.pages output - } - { format.incoll.inproc.crossref output.nonnull - format.pages output - } - if$ - format.doi output - new.block - format.url output - new.block - format.note output - fin.entry -} -FUNCTION {conference} { inproceedings } -FUNCTION {manual} -{ output.bibitem - author empty$ - { organization "organization" bibinfo.check - duplicate$ empty$ 'pop$ - { output - address "address" bibinfo.check output - } - if$ - } - { format.authors output.nonnull } - if$ - add.comma - format.btitle "title" output.check - author empty$ - { organization empty$ - { - address new.block.checka - address "address" bibinfo.check output - } - 'skip$ - if$ - } - { - organization address new.block.checkb - organization "organization" bibinfo.check output - address "address" bibinfo.check output - } - if$ - format.edition output - format.date output - format.doi output - new.block - format.url output - new.block - format.note output - fin.entry -} - -FUNCTION {mastersthesis} -{ output.bibitem - format.authors "author" output.check - add.comma - format.title - "title" output.check - new.block - bbl.mthesis format.thesis.type output.nonnull - school "school" bibinfo.warn output - address "address" bibinfo.check output - format.date "year" output.check - format.doi output - new.block - format.url output - new.block - format.note output - fin.entry -} - -FUNCTION {misc} -{ output.bibitem - format.authors output - title howpublished new.block.checkb - format.title output - howpublished new.block.checka - howpublished "howpublished" bibinfo.check output - format.date output - format.doi output - new.block - format.url output - new.block - format.note output - fin.entry - empty.misc.check -} - -FUNCTION {softmisc} -{ output.bibitem - format.authors output - title howpublished new.block.checkb - format.title output - version output - howpublished new.block.checka - howpublished "howpublished" bibinfo.check output - format.date output - format.doi output - new.block - format.url output - new.block - format.note output - new.block - format.softmisc.eprint output - fin.entry - empty.misc.check -} - -FUNCTION {phdthesis} -{ output.bibitem - format.authors "author" output.check - add.comma - format.title - "title" output.check - new.block - bbl.phdthesis format.thesis.type output.nonnull - school "school" bibinfo.warn output - address "address" bibinfo.check output - format.date "year" output.check - format.doi output - new.block - format.url output - new.block - format.note output - fin.entry -} - -FUNCTION {proceedings} -{ output.bibitem - editor empty$ - { organization "organization" bibinfo.check output - } - { format.editors output.nonnull } - if$ - new.block - format.btitle "title" output.check - format.bvolume output - format.number.series output - editor empty$ - { publisher empty$ - 'skip$ - { - new.sentence - format.publisher.address output - } - if$ - } - { publisher empty$ - { - new.sentence - format.organization.address output } - { - new.sentence - organization "organization" bibinfo.check output - format.publisher.address output - } - if$ - } - if$ - format.doi output - new.block - format.url output - new.block - format.note output - fin.entry -} - -FUNCTION {techreport} -{ output.bibitem - format.authors "author" output.check - add.comma - format.title - "title" output.check - new.block - format.tr.number output.nonnull - institution "institution" bibinfo.warn output - address "address" bibinfo.check output - format.date "year" output.check - format.doi output - new.block - format.url output - new.block - format.note output - fin.entry -} - -FUNCTION {unpublished} -{ output.bibitem - format.authors "author" output.check - add.comma - format.title "title" output.check - format.date output - format.doi output - new.block - format.url output - new.block - format.note "note" output.check - fin.entry -} - -FUNCTION {default.type} { misc } -READ -EXECUTE {identify.aps.version} -STRINGS { longest.label } -INTEGERS { number.label longest.label.width } -FUNCTION {initialize.longest.label} -{ "" 'longest.label := - #1 'number.label := - #0 'longest.label.width := -} -FUNCTION {longest.label.pass} -{ number.label int.to.str$ 'label := - number.label #1 + 'number.label := - label width$ longest.label.width > - { label 'longest.label := - label width$ 'longest.label.width := - } - 'skip$ - if$ -} -EXECUTE {initialize.longest.label} -ITERATE {longest.label.pass} -FUNCTION {begin.bib} -{ preamble$ empty$ - 'skip$ - { preamble$ write$ newline$ } - if$ - "\begin{thebibliography}{" longest.label * "}" * - write$ newline$ - "\providecommand{\url}[1]{{#1}}" - write$ newline$ - "\providecommand{\urlprefix}{URL }" - write$ newline$ - %%"\expandafter\ifx\csname urlstyle\endcsname\relax" - %% write$ newline$ - %%" \providecommand{\doi}[1]{\discretionary{}{}{}#1}\else" - %%write$ newline$ - %%" \providecommand{\doi}{\discretionary{}{}{}\begingroup \urlstyle{rm}\Url}\fi" - "\providecommand{\doi}[1]{\url{https://doi.org/#1}}" - write$ newline$ - "" write$ newline$ -} -EXECUTE {begin.bib} -EXECUTE {init.state.consts} -ITERATE {call.type$} -FUNCTION {end.bib} -{ newline$ - "\end{thebibliography}" write$ newline$ -} -EXECUTE {end.bib} -%% -%% End of file `sn-aps.bst'. - diff --git a/waypoint_control/sn-article-template/bst/sn-basic.bst b/waypoint_control/sn-article-template/bst/sn-basic.bst deleted file mode 100644 index 1eea5a2..0000000 --- a/waypoint_control/sn-article-template/bst/sn-basic.bst +++ /dev/null @@ -1,1818 +0,0 @@ -%% -%% This is file `sn-basic.bst', -%% generated with the docstrip utility. -%% -%% The original source files were: merlin.mbs -%% ---------------------------------------- -%% -%%**************************************************************************************%% -%% %% -%% For Springer medical, life sciences, chemistry, geology, engineering and %% -%% computer science publications. %% -%% For use with the natbib package (see below). Default is author-year citations. %% -%% When citations are numbered, please use \documentclass[sn-basic, Numbered]{sn-jnl}. %% -%% %% -%% Per default the reference list entries are alphabetized. %% -%% If the entries in the list should be numbered consecutively comment out the %% -%% two lines including SORT (in uppercase). %% -%%**************************************************************************************%% - % This file can be redistributed and/or modified under the terms - % of the LaTeX Project Public License Distributed from CTAN - % archives in directory macros/latex/base/lppl.txt; either - % version 1 of the License, or any later version. - % - % This bibliography style file is intended for texts in ENGLISH - % This is an author-year citation style bibliography. As such, it is - % non-standard LaTeX, and requires a special package file to function properly. - % Such a package is natbib.sty by Patrick W. Daly - % The form of the \bibitem entries is - % \bibitem[Jones et al.(1990)]{key}... - % \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}... - % The essential feature is that the label (the part in brackets) consists - % of the author names, as they should appear in the citation, with the year - % in parentheses following. There must be no space before the opening - % parenthesis! - % With natbib v5.3, a full list of authors may also follow the year. - % In natbib.sty, it is possible to define the type of enclosures that is - % really wanted (brackets or parentheses), but in either case, there must - % be parentheses in the label. - % The \cite command functions as follows: - % \citet{key} ==>> Jones et al. (1990) - % \citet*{key} ==>> Jones, Baker, and Smith (1990) - % \citep{key} ==>> (Jones et al. 1990) - % \citep*{key} ==>> (Jones, Baker, and Smith 1990) - % \citep[chap. 2]{key} ==>> (Jones et al. 1990, chap. 2) - % \citep[e.g.][]{key} ==>> (e.g. Jones et al. 1990) - % \citep[e.g.][p. 32]{key} ==>> (e.g. Jones et al., p. 32) - % \citeauthor{key} ==>> Jones et al. - % \citeauthor*{key} ==>> Jones, Baker, and Smith - % \citeyear{key} ==>> 1990 - %--------------------------------------------------------------------- - -FUNCTION {identify.basic.version} -{ % Put identifying string in the .blg file - "sn-basic.bst" - " [2024/07/19 v1.1 bibliography style]" - * top$ -} - -ENTRY - { address - archive - author - booktitle - chapter - doi - edition - editor - eid - eprint - howpublished - institution - journal - key - keywords - month - note - number - organization - pages - publisher - school - series - title - type - url - volume - year - archivePrefix - primaryClass - adsurl - adsnote - version - } - {} - { label extra.label sort.label short.list } -INTEGERS { output.state before.all mid.sentence after.sentence after.block } -FUNCTION {init.state.consts} -{ #0 'before.all := - #1 'mid.sentence := - #2 'after.sentence := - #3 'after.block := -} -STRINGS { s t} -FUNCTION {output.nonnull} -{ 's := - output.state mid.sentence = - { ", " * write$ } - { output.state after.block = - { add.period$ write$ - newline$ - "\newblock " write$ - } - { output.state before.all = - 'write$ - { add.period$ " " * write$ } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} -FUNCTION {output} -{ duplicate$ empty$ - 'pop$ - 'output.nonnull - if$ -} -FUNCTION {output.check} -{ 't := - duplicate$ empty$ - { pop$ "empty " t * " in " * cite$ * warning$ } - 'output.nonnull - if$ -} -FUNCTION {fin.entry} -{ duplicate$ empty$ - 'pop$ - 'write$ - if$ - newline$ -} - -FUNCTION {new.block} -{ output.state before.all = - 'skip$ - { after.block 'output.state := } - if$ -} -FUNCTION {new.sentence} -{ output.state after.block = - 'skip$ - { output.state before.all = - 'skip$ - { after.sentence 'output.state := } - if$ - } - if$ -} -FUNCTION {add.blank} -{ " " * before.all 'output.state := -} - -FUNCTION {no.blank.or.punct} -{ "\hspace{0pt}" * before.all 'output.state := -} - -FUNCTION {date.block} -{ - add.blank -} - -FUNCTION {not} -{ { #0 } - { #1 } - if$ -} -FUNCTION {and} -{ 'skip$ - { pop$ #0 } - if$ -} -FUNCTION {or} -{ { pop$ #1 } - 'skip$ - if$ -} -STRINGS {z} -FUNCTION {remove.dots} -{ 'z := - "" - { z empty$ not } - { z #1 #1 substring$ - z #2 global.max$ substring$ 'z := - duplicate$ "." = 'pop$ - { * } - if$ - } - while$ -} -FUNCTION {new.block.checkb} -{ empty$ - swap$ empty$ - and - 'skip$ - 'new.block - if$ -} -FUNCTION {field.or.null} -{ duplicate$ empty$ - { pop$ "" } - 'skip$ - if$ -} -FUNCTION {emphasize} -{ skip$ } -FUNCTION {tie.or.space.prefix} -{ duplicate$ text.length$ #3 < - { "~" } - { " " } - if$ - swap$ -} - -FUNCTION {capitalize} -{ "u" change.case$ "t" change.case$ } - -FUNCTION {space.word} -{ " " swap$ * " " * } - % Here are the language-specific definitions for explicit words. - % Each function has a name bbl.xxx where xxx is the English word. - % The language selected here is ENGLISH -FUNCTION {bbl.and} -{ "and"} - -FUNCTION {bbl.etal} -{ "et~al." } - -FUNCTION {refbbl.etal} -{ "et~al" } - -FUNCTION {bbl.editors} -{ "eds" } - -FUNCTION {bbl.editor} -{ "ed" } - -FUNCTION {bbl.edby} -{ "edited by" } - -FUNCTION {bbl.edition} -{ "edn." } - -FUNCTION {bbl.volume} -{ "vol" } - -FUNCTION {bbl.of} -{ "of" } - -FUNCTION {bbl.number} -{ "no." } - -FUNCTION {bbl.nr} -{ "no." } - -FUNCTION {bbl.in} -{ "in" } - -FUNCTION {bbl.pages} -{ "pp" } - -FUNCTION {bbl.incoll.pages} -{ "p" } - -FUNCTION {bbl.page} -{ "p" } - -FUNCTION {bbl.chapter} -{ "chap" } - -FUNCTION {bbl.techrep} -{ "Tech. Rep." } - -FUNCTION {bbl.mthesis} -{ "Master's thesis" } - -FUNCTION {bbl.phdthesis} -{ "PhD thesis" } - -FUNCTION {bbl.first} -{ "1st" } - -FUNCTION {bbl.second} -{ "2nd" } - -FUNCTION {bbl.third} -{ "3rd" } - -FUNCTION {bbl.fourth} -{ "4th" } - -FUNCTION {bbl.fifth} -{ "5th" } - -FUNCTION {bbl.st} -{ "st" } - -FUNCTION {bbl.nd} -{ "nd" } - -FUNCTION {bbl.rd} -{ "rd" } - -FUNCTION {bbl.th} -{ "th" } - -MACRO {jan} {"Jan."} - -MACRO {feb} {"Feb."} - -MACRO {mar} {"Mar."} - -MACRO {apr} {"Apr."} - -MACRO {may} {"May"} - -MACRO {jun} {"Jun."} - -MACRO {jul} {"Jul."} - -MACRO {aug} {"Aug."} - -MACRO {sep} {"Sep."} - -MACRO {oct} {"Oct."} - -MACRO {nov} {"Nov."} - -MACRO {dec} {"Dec."} - -FUNCTION {eng.ord} -{ duplicate$ "1" swap$ * - #-2 #1 substring$ "1" = - { bbl.th * } - { duplicate$ #-1 #1 substring$ - duplicate$ "1" = - { pop$ bbl.st * } - { duplicate$ "2" = - { pop$ bbl.nd * } - { "3" = - { bbl.rd * } - { bbl.th * } - if$ - } - if$ - } - if$ - } - if$ -} - -MACRO {acmcs} {"ACM Comput Surv"} - -MACRO {acta} {"Acta Inf"} - -MACRO {cacm} {"Commun ACM"} - -MACRO {ibmjrd} {"IBM~J~Res Dev"} - -MACRO {ibmsj} {"IBM Syst~J"} - -MACRO {ieeese} {"IEEE Trans Softw Eng"} - -MACRO {ieeetc} {"IEEE Trans Comput"} - -MACRO {ieeetcad} - {"IEEE Trans Comput Aid Des"} - -MACRO {ipl} {"Inf Process Lett"} - -MACRO {jacm} {"J~ACM"} - -MACRO {jcss} {"J~Comput Syst Sci"} - -MACRO {scp} {"Sci Comput Program"} - -MACRO {sicomp} {"SIAM J~Comput"} - -MACRO {tocs} {"ACM Trans Comput Syst"} - -MACRO {tods} {"ACM Trans Database Syst"} - -MACRO {tog} {"ACM Trans Graphic"} - -MACRO {toms} {"ACM Trans Math Softw"} - -MACRO {toois} {"ACM Trans Office Inf Syst"} - -MACRO {toplas} {"ACM Trans Program Lang Syst"} - -MACRO {tcs} {"Theor Comput Sci"} - -FUNCTION {bibinfo.check} -{ swap$ - duplicate$ missing$ - { - pop$ pop$ - "" - } - { duplicate$ empty$ - { - swap$ pop$ - } - { swap$ - pop$ - } - if$ - } - if$ -} -FUNCTION {bibinfo.warn} -{ swap$ - duplicate$ missing$ - { - swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ - "" - } - { duplicate$ empty$ - { - swap$ "empty " swap$ * " in " * cite$ * warning$ - } - { swap$ - pop$ - } - if$ - } - if$ -} - -%%Commented on 17th July 2024 -%FUNCTION {format.eprint} -%{ eprint duplicate$ empty$ -% 'skip$ -% { "\eprint" -% archive empty$ -% 'skip$ -% { "[" * archive * "]" * } -% if$ -% "{" * swap$ * "}" * -% } -% if$ -%} - -FUNCTION {format.archive} -{ - archivePrefix empty$ - { "" } - { archivePrefix ":" *} - if$ -} - -%%Updated on 17th July 2024 -FUNCTION {format.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - - - -FUNCTION {format.primaryClass} -{ - primaryClass empty$ - { "" } - { "{[" primaryClass * "]}" *} - if$ -} - -FUNCTION {format.soft.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {format.softmisc.archive} -{ - archivePrefix empty$ - { "" } - { "" } - if$ -} - -FUNCTION {format.softmisc.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {format.url} -{ url empty$ - { "" } - { "\urlprefix\url{" url * "}" * } - if$ -} - -STRINGS { bibinfo} -INTEGERS { nameptr namesleft numnames } - -FUNCTION {format.names} -{ 'bibinfo := - duplicate$ empty$ 'skip$ { - 's := - "" 't := - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { s nameptr - "{vv~}{ll}{ f{}}{jj}" - format.name$ 't := - nameptr #1 > - { - nameptr #3 - #1 + = - numnames #3 - > and - { "others" 't := - #1 'namesleft := } - 'skip$ - if$ - namesleft #1 > - { ", " * t * } - { - "," * - s nameptr "{ll}" format.name$ duplicate$ "others" = - { 't := } - { pop$ } - if$ - t "others" = - { - " " * refbbl.etal * - } - { " " * t * } - if$ - } - if$ - } - 't - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ - } if$ -} - -FUNCTION {format.names.ed} -{ - format.names -} -FUNCTION {format.key} -{ empty$ - { key field.or.null } - { "" } - if$ -} - -FUNCTION {format.authors} -{ author "author" format.names -} -FUNCTION {get.bbl.editor} -{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } - -FUNCTION {format.editors} -{ editor "editor" format.names duplicate$ empty$ 'skip$ - { - " " * - get.bbl.editor - "(" swap$ * ")" * - * - } - if$ -} -FUNCTION {format.doi} -{ doi "doi" bibinfo.check - duplicate$ empty$ 'skip$ - { - "\doi{" swap$ * "}" * - } - if$ -} -FUNCTION {format.note} -{ - note empty$ - { "" } - { note #1 #1 substring$ - duplicate$ "{" = - 'skip$ - { output.state mid.sentence = - { "l" } - { "u" } - if$ - change.case$ - } - if$ - note #2 global.max$ substring$ * "note" bibinfo.check - } - if$ -} - -FUNCTION {format.title} -{ title - duplicate$ empty$ 'skip$ - { "t" change.case$ } - if$ - "title" bibinfo.check -} -FUNCTION {format.full.names} -{'s := - "" 't := - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { s nameptr - "{vv~}{ll}" format.name$ - 't := - nameptr #1 > - { - namesleft #1 > - { ", " * t * } - { - s nameptr "{ll}" format.name$ duplicate$ "others" = - { 't := } - { pop$ } - if$ - t "others" = - { - " " * bbl.etal * - } - { - numnames #2 > - { "," * } - 'skip$ - if$ - bbl.and - space.word * t * - } - if$ - } - if$ - } - 't - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ -} - -FUNCTION {author.editor.key.full} -{ author empty$ - { editor empty$ - { key empty$ - { cite$ #1 #3 substring$ } - 'key - if$ - } - { editor format.full.names } - if$ - } - { author format.full.names } - if$ -} - -FUNCTION {author.key.full} -{ author empty$ - { key empty$ - { cite$ #1 #3 substring$ } - 'key - if$ - } - { author format.full.names } - if$ -} - -FUNCTION {editor.key.full} -{ editor empty$ - { key empty$ - { cite$ #1 #3 substring$ } - 'key - if$ - } - { editor format.full.names } - if$ -} - -FUNCTION {make.full.names} -{ type$ "book" = - type$ "inbook" = - or - 'author.editor.key.full - { type$ "proceedings" = - 'editor.key.full - 'author.key.full - if$ - } - if$ -} - -FUNCTION {output.bibitem} -{ newline$ - "\bibitem[{" write$ - label write$ - ")" make.full.names duplicate$ short.list = - { pop$ } - { * } - if$ - "}]{" * write$ - cite$ write$ - "}" write$ - newline$ - "" - before.all 'output.state := -} - -FUNCTION {add.period} -{ duplicate$ empty$ - 'skip$ - { "." * add.blank } - if$ -} - -FUNCTION {if.digit} -{ duplicate$ "0" = - swap$ duplicate$ "1" = - swap$ duplicate$ "2" = - swap$ duplicate$ "3" = - swap$ duplicate$ "4" = - swap$ duplicate$ "5" = - swap$ duplicate$ "6" = - swap$ duplicate$ "7" = - swap$ duplicate$ "8" = - swap$ "9" = or or or or or or or or or -} -FUNCTION {n.separate} -{ 't := - "" - #0 'numnames := - { t empty$ not } - { t #-1 #1 substring$ if.digit - { numnames #1 + 'numnames := } - { #0 'numnames := } - if$ - t #-1 #1 substring$ swap$ * - t #-2 global.max$ substring$ 't := - numnames #5 = - { duplicate$ #1 #2 substring$ swap$ - #3 global.max$ substring$ - "," swap$ * * - } - 'skip$ - if$ - } - while$ -} -FUNCTION {n.dashify} -{ -%% n.separate - 't := - "" - { t empty$ not } - { t #1 #1 substring$ "-" = - { t #1 #2 substring$ "--" = not - { "--" * - t #2 global.max$ substring$ 't := - } - { { t #1 #1 substring$ "-" = } - { "-" * - t #2 global.max$ substring$ 't := - } - while$ - } - if$ - } - { t #1 #1 substring$ * - t #2 global.max$ substring$ 't := - } - if$ - } - while$ -} - -FUNCTION {word.in} -{ bbl.in capitalize - ":" * - " " * } - -FUNCTION {format.date} -{ year "year" bibinfo.check duplicate$ empty$ - { - "empty year in " cite$ * "; set to ????" * warning$ - pop$ "????" - } - 'skip$ - if$ - extra.label * - before.all 'output.state := - " (" swap$ * ")" * -} -FUNCTION {format.btitle} -{ title "title" bibinfo.check - duplicate$ empty$ 'skip$ - { - } - if$ -} -FUNCTION {either.or.check} -{ empty$ - 'pop$ - { "can't use both " swap$ * " fields in " * cite$ * warning$ } - if$ -} -FUNCTION {format.bvolume} -{ volume empty$ - { "" } - { bbl.volume volume tie.or.space.prefix - "volume" bibinfo.check * * - series "series" bibinfo.check - duplicate$ empty$ 'pop$ - { emphasize ", " * swap$ * } - if$ - "volume and number" number either.or.check - } - if$ -} -FUNCTION {format.number.series} -{ volume empty$ - { number empty$ - { series field.or.null } - { series empty$ - { number "number" bibinfo.check } - { output.state mid.sentence = - { bbl.number } - { bbl.number capitalize } - if$ - number tie.or.space.prefix "number" bibinfo.check * * - bbl.in space.word * - series "series" bibinfo.check * - } - if$ - } - if$ - } - { "" } - if$ -} -FUNCTION {is.num} -{ chr.to.int$ - duplicate$ "0" chr.to.int$ < not - swap$ "9" chr.to.int$ > not and -} - -FUNCTION {extract.num} -{ duplicate$ 't := - "" 's := - { t empty$ not } - { t #1 #1 substring$ - t #2 global.max$ substring$ 't := - duplicate$ is.num - { s swap$ * 's := } - { pop$ "" 't := } - if$ - } - while$ - s empty$ - 'skip$ - { pop$ s } - if$ -} - -FUNCTION {convert.edition} -{ extract.num "l" change.case$ 's := - s "first" = s "1" = or - { bbl.first 't := } - { s "second" = s "2" = or - { bbl.second 't := } - { s "third" = s "3" = or - { bbl.third 't := } - { s "fourth" = s "4" = or - { bbl.fourth 't := } - { s "fifth" = s "5" = or - { bbl.fifth 't := } - { s #1 #1 substring$ is.num - { s eng.ord 't := } - { edition 't := } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - t -} - -FUNCTION {format.edition} -{ edition duplicate$ empty$ 'skip$ - { - convert.edition - output.state mid.sentence = - { "l" } - { "t" } - if$ change.case$ - "edition" bibinfo.check - " " * bbl.edition * - } - if$ -} -INTEGERS { multiresult } -FUNCTION {multi.page.check} -{ 't := - #0 'multiresult := - { multiresult not - t empty$ not - and - } - { t #1 #1 substring$ - duplicate$ "-" = - swap$ duplicate$ "," = - swap$ "+" = - or or - { #1 'multiresult := } - { t #2 global.max$ substring$ 't := } - if$ - } - while$ - multiresult -} -FUNCTION {format.pages} -{ pages duplicate$ empty$ 'skip$ - { duplicate$ multi.page.check - { - bbl.pages swap$ - n.dashify - } - { - bbl.page swap$ - } - if$ - tie.or.space.prefix - "pages" bibinfo.check - * * - } - if$ -} -FUNCTION {format.journal.pages} -{ pages duplicate$ empty$ 'pop$ - { swap$ duplicate$ empty$ - { pop$ pop$ format.pages } - { - ":" * - swap$ - n.dashify - "pages" bibinfo.check - * - } - if$ - } - if$ -} -FUNCTION {format.journal.eid} -{ eid "eid" bibinfo.check - duplicate$ empty$ 'pop$ - { swap$ duplicate$ empty$ 'skip$ - { - ":" * - } - if$ - swap$ * - } - if$ -} - -FUNCTION {format.incoll.pages} -{ pages duplicate$ empty$ 'skip$ - { duplicate$ multi.page.check - { - bbl.incoll.pages swap$ - n.dashify - } - { - bbl.page swap$ - } - if$ - tie.or.space.prefix - "pages" bibinfo.check - * * - } - if$ -} - -FUNCTION {format.incoll.chapter.pages} -{ chapter empty$ - 'format.incoll.pages - { type empty$ - { bbl.chapter } - { type "l" change.case$ - "type" bibinfo.check - } - if$ - chapter tie.or.space.prefix - "chapter" bibinfo.check - * * - pages empty$ - 'skip$ - { ", " * format.incoll.pages * } - if$ - } - if$ -} - -FUNCTION {format.vol.num.pages} -{ volume field.or.null - duplicate$ empty$ 'skip$ - { - "volume" bibinfo.check - } - if$ - number "number" bibinfo.check duplicate$ empty$ 'skip$ - { - swap$ duplicate$ empty$ - { "there's a number but no volume in " cite$ * warning$ } - 'skip$ - if$ - swap$ - "(" swap$ * ")" * - } - if$ * - eid empty$ - { format.journal.pages } - { format.journal.eid } - if$ -} - -FUNCTION {format.chapter.pages} -{ chapter empty$ - 'format.pages - { type empty$ - { bbl.chapter } - { type "l" change.case$ - "type" bibinfo.check - } - if$ - chapter tie.or.space.prefix - "chapter" bibinfo.check - * * - pages empty$ - 'skip$ - { ", " * format.pages * } - if$ - } - if$ -} - -FUNCTION {format.booktitle} -{ - booktitle "booktitle" bibinfo.check -} -FUNCTION {format.in.ed.booktitle} -{ format.booktitle duplicate$ empty$ 'skip$ - { - editor "editor" format.names.ed duplicate$ empty$ 'pop$ - { - " " * - get.bbl.editor - "(" swap$ * ") " * - * swap$ - * } - if$ - word.in swap$ * - } - if$ -} -FUNCTION {format.thesis.type} -{ type duplicate$ empty$ - 'pop$ - { swap$ pop$ - "t" change.case$ "type" bibinfo.check - } - if$ -} -FUNCTION {format.tr.number} -{ number "number" bibinfo.check - type duplicate$ empty$ - { pop$ bbl.techrep } - 'skip$ - if$ - "type" bibinfo.check - swap$ duplicate$ empty$ - { pop$ "t" change.case$ } - { tie.or.space.prefix * * } - if$ -} -FUNCTION {format.article.crossref} -{ - word.in - " \cite{" * crossref * "}" * -} -FUNCTION {format.book.crossref} -{ volume duplicate$ empty$ - { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ - pop$ word.in - } - { bbl.volume - capitalize - swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * - } - if$ - " \cite{" * crossref * "}" * -} -FUNCTION {format.incoll.inproc.crossref} -{ - word.in - " \cite{" * crossref * "}" * -} -FUNCTION {format.org.or.pub} -{ 't := - "" - address empty$ t empty$ and - 'skip$ - { - t empty$ - { address "address" bibinfo.check * - } - { t * - address empty$ - 'skip$ - { ", " * address "address" bibinfo.check * } - if$ - } - if$ - } - if$ -} -FUNCTION {format.publisher.address} -{ publisher "publisher" bibinfo.warn format.org.or.pub -} - -FUNCTION {format.organization.address} -{ organization "organization" bibinfo.check format.org.or.pub -} - -FUNCTION {article} -{ output.bibitem - format.authors "author" output.check - author format.key output - format.date "year" output.check - date.block - format.title "title" output.check - new.sentence - crossref missing$ - { - journal - remove.dots - "journal" bibinfo.check - "journal" output.check - add.blank - format.vol.num.pages output - } - { format.article.crossref output.nonnull - format.pages output - } - if$ - new.sentence - format.doi output - format.url output - format.note output - format.soft.eprint output - add.blank - format.primaryClass output - fin.entry -} - -FUNCTION {book} -{ output.bibitem - author empty$ - { format.editors "author and editor" output.check - editor format.key output - add.blank - } - { format.authors output.nonnull - crossref missing$ - { "author and editor" editor either.or.check } - 'skip$ - if$ - } - if$ - format.date "year" output.check - date.block - format.btitle "title" output.check - crossref missing$ - { format.bvolume output - format.edition output - new.sentence - format.number.series output - format.publisher.address output - } - { - new.sentence - format.book.crossref output.nonnull - } - if$ - format.doi output - format.url output - format.note output - format.eprint output - fin.entry -} - -FUNCTION {booklet} -{ output.bibitem - format.authors output - author format.key output - format.date "year" output.check - date.block - format.title "title" output.check - new.sentence - howpublished "howpublished" bibinfo.check output - address "address" bibinfo.check output - format.doi output - format.url output - format.note output - format.eprint output - fin.entry -} - -FUNCTION {inbook} -{ output.bibitem - author empty$ - { format.editors "author and editor" output.check - editor format.key output - } - { format.authors output.nonnull - crossref missing$ - { "author and editor" editor either.or.check } - 'skip$ - if$ - } - if$ - format.date "year" output.check - date.block - format.btitle "title" output.check - crossref missing$ - { - format.bvolume output - format.edition output - format.publisher.address output - format.chapter.pages "chapter and pages" output.check - new.sentence - format.number.series output - } - { - format.chapter.pages "chapter and pages" output.check - new.sentence - format.book.crossref output.nonnull - } - if$ - format.doi output - format.url output - format.note output - format.eprint output - fin.entry -} - -FUNCTION {incollection} -{ output.bibitem - format.authors "author" output.check - author format.key output - format.date "year" output.check - date.block - format.title "title" output.check - new.sentence - crossref missing$ - { format.in.ed.booktitle "booktitle" output.check - format.bvolume output - format.edition output - new.sentence - format.number.series output - format.publisher.address output - format.incoll.chapter.pages output - } - { format.incoll.inproc.crossref output.nonnull - format.incoll.chapter.pages output - } - if$ - format.doi output - format.url output - format.note output - format.eprint output - fin.entry -} -FUNCTION {inproceedings} -{ output.bibitem - format.authors "author" output.check - author format.key output - format.date "year" output.check - date.block - format.title "title" output.check - new.sentence - crossref missing$ - { format.in.ed.booktitle "booktitle" output.check - publisher empty$ - { format.organization.address output } - { organization "organization" bibinfo.check output - format.bvolume output - new.sentence - format.publisher.address output - } - if$ - format.number.series output - format.pages output - } - { format.incoll.inproc.crossref output.nonnull - format.pages output - } - if$ - format.doi output - format.url output - format.note output - format.eprint output - fin.entry -} -FUNCTION {conference} { inproceedings } -FUNCTION {manual} -{ output.bibitem - format.authors output - author format.key output - format.date "year" output.check - date.block - format.btitle "title" output.check - new.sentence - organization "organization" bibinfo.check output - address "address" bibinfo.check output - format.edition output - format.doi output - format.url output - format.note output - format.eprint output - fin.entry -} - -FUNCTION {mastersthesis} -{ output.bibitem - format.authors "author" output.check - author format.key output - format.date "year" output.check - date.block - format.title - "title" output.check - new.sentence - bbl.mthesis format.thesis.type output.nonnull - school "school" bibinfo.warn output - address "address" bibinfo.check output - format.doi output - format.url output - format.note output - format.eprint output - fin.entry -} - -FUNCTION {misc} -{ output.bibitem - format.authors output - author format.key output - format.date "year" output.check - date.block - format.title output - new.sentence - howpublished "howpublished" bibinfo.check output - format.doi output - format.url output - format.note output - format.eprint output - fin.entry -} - -FUNCTION {insert.comma} -{ duplicate$ empty$ - 'skip$ - { ", " * add.blank } - if$ -} - -FUNCTION {softmisc} -{ output.bibitem - format.authors output - author format.key output - format.date "year" output.check - date.block - format.title output - insert.comma - version output - new.sentence - howpublished "howpublished" bibinfo.check output - format.doi output - format.url output - format.note output - format.softmisc.eprint output - fin.entry -} - -FUNCTION {phdthesis} -{ output.bibitem - format.authors "author" output.check - author format.key output - format.date "year" output.check - date.block - format.title - "title" output.check - new.sentence - bbl.phdthesis format.thesis.type output.nonnull - school "school" bibinfo.warn output - address "address" bibinfo.check output - format.doi output - format.url output - format.note output - format.eprint output - fin.entry -} - -FUNCTION {proceedings} -{ output.bibitem - format.editors output - editor format.key output - format.date "year" output.check - date.block - format.btitle "title" output.check - format.bvolume output - format.number.series output - publisher empty$ - { format.organization.address output } - { organization "organization" bibinfo.check output - format.publisher.address output - } - if$ - format.doi output - format.url output - format.note output - format.eprint output - fin.entry -} - -FUNCTION {techreport} -{ output.bibitem - format.authors "author" output.check - author format.key output - format.date "year" output.check - date.block - format.title - "title" output.check - new.sentence - format.tr.number output.nonnull - institution "institution" bibinfo.warn output - address "address" bibinfo.check output - format.doi output - format.url output - format.note output - format.eprint output - fin.entry -} - -FUNCTION {unpublished} -{ output.bibitem - format.authors "author" output.check - author format.key output - format.date "year" output.check - date.block - format.title "title" output.check - format.doi output - format.url output - format.note "note" output.check - format.eprint output - fin.entry -} - -FUNCTION {default.type} { misc } -READ - -EXECUTE {identify.basic.version} - -FUNCTION {sortify} -{ purify$ - "l" change.case$ -} -INTEGERS { len } -FUNCTION {chop.word} -{ 's := - 'len := - s #1 len substring$ = - { s len #1 + global.max$ substring$ } - 's - if$ -} -FUNCTION {format.lab.names} -{ 's := - "" 't := - s #1 "{vv~}{ll}" format.name$ - s num.names$ duplicate$ - #2 > - { pop$ - " " * bbl.etal * - } - { #2 < - 'skip$ - { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = - { - " " * bbl.etal * - } - { bbl.and space.word * s #2 "{vv~}{ll}" format.name$ - * } - if$ - } - if$ - } - if$ -} - -FUNCTION {author.key.label} -{ author empty$ - { key empty$ - { cite$ #1 #3 substring$ } - 'key - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {author.editor.key.label} -{ author empty$ - { editor empty$ - { key empty$ - { cite$ #1 #3 substring$ } - 'key - if$ - } - { editor format.lab.names } - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {editor.key.label} -{ editor empty$ - { key empty$ - { cite$ #1 #3 substring$ } - 'key - if$ - } - { editor format.lab.names } - if$ -} - -FUNCTION {calc.short.authors} -{ type$ "book" = - type$ "inbook" = - or - 'author.editor.key.label - { type$ "proceedings" = - 'editor.key.label - 'author.key.label - if$ - } - if$ - 'short.list := -} - -FUNCTION {calc.label} -{ calc.short.authors - short.list - "(" - * - year duplicate$ empty$ - { pop$ "????" } - 'skip$ - if$ - * - 'label := -} - -FUNCTION {sort.format.names} -{ 's := - #1 'nameptr := - "" - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { s nameptr - "{ll{ }}{ f{ }}{ jj{ }}" - format.name$ 't := - nameptr #1 > - { - " " * - namesleft #1 = t "others" = and - { "zzzzz" * } - { numnames #2 > nameptr #2 = and - { "zz" * year field.or.null * " " * } - 'skip$ - if$ - t sortify * - } - if$ - } - { t sortify * } - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ -} - -FUNCTION {sort.format.title} -{ 't := - "A " #2 - "An " #3 - "The " #4 t chop.word - chop.word - chop.word - sortify - #1 global.max$ substring$ -} -FUNCTION {author.sort} -{ author empty$ - { key empty$ - { "to sort, need author or key in " cite$ * warning$ - "" - } - { key sortify } - if$ - } - { author sort.format.names } - if$ -} -FUNCTION {author.editor.sort} -{ author empty$ - { editor empty$ - { key empty$ - { "to sort, need author, editor, or key in " cite$ * warning$ - "" - } - { key sortify } - if$ - } - { editor sort.format.names } - if$ - } - { author sort.format.names } - if$ -} -FUNCTION {editor.sort} -{ editor empty$ - { key empty$ - { "to sort, need editor or key in " cite$ * warning$ - "" - } - { key sortify } - if$ - } - { editor sort.format.names } - if$ -} -FUNCTION {presort} -{ calc.label - label sortify - " " - * - type$ "book" = - type$ "inbook" = - or - 'author.editor.sort - { type$ "proceedings" = - 'editor.sort - 'author.sort - if$ - } - if$ - #1 entry.max$ substring$ - 'sort.label := - sort.label - * - " " - * - title field.or.null - sort.format.title - * - #1 entry.max$ substring$ - 'sort.key$ := -} - -ITERATE {presort} -SORT -STRINGS { last.label next.extra } -INTEGERS { last.extra.num number.label } -FUNCTION {initialize.extra.label.stuff} -{ #0 int.to.chr$ 'last.label := - "" 'next.extra := - #0 'last.extra.num := - #0 'number.label := -} -FUNCTION {forward.pass} -{ last.label label = - { last.extra.num #1 + 'last.extra.num := - last.extra.num int.to.chr$ 'extra.label := - } - { "a" chr.to.int$ 'last.extra.num := - "" 'extra.label := - label 'last.label := - } - if$ - number.label #1 + 'number.label := -} -FUNCTION {reverse.pass} -{ next.extra "b" = - { "a" 'extra.label := } - 'skip$ - if$ - extra.label 'next.extra := - extra.label - duplicate$ empty$ - 'skip$ - { "{\natexlab{" swap$ * "}}" * } - if$ - 'extra.label := - label extra.label * 'label := -} -EXECUTE {initialize.extra.label.stuff} -ITERATE {forward.pass} -REVERSE {reverse.pass} -FUNCTION {bib.sort.order} -{ sort.label - " " - * - year field.or.null sortify - * - " " - * - title field.or.null - sort.format.title - * - #1 entry.max$ substring$ - 'sort.key$ := -} -ITERATE {bib.sort.order} -SORT -FUNCTION {begin.bib} -{ preamble$ empty$ - 'skip$ - { preamble$ write$ newline$ } - if$ - "\begin{thebibliography}{" number.label int.to.str$ * "}" * - write$ newline$ - "\providecommand{\natexlab}[1]{#1}" - write$ newline$ - "\providecommand{\url}[1]{{#1}}" - write$ newline$ - "\providecommand{\urlprefix}{URL }" - write$ newline$ - %%"\expandafter\ifx\csname urlstyle\endcsname\relax" - %%write$ newline$ - %%" \providecommand{\doi}[1]{\discretionary{}{}{}https://doi.org/#1}\else" - %%write$ newline$ - %%" \providecommand{\doi}{\discretionary{}{}{}\begingroup \urlstyle{rm}\Url}\fi" - "\providecommand{\doi}[1]{\url{https://doi.org/#1}}" - write$ newline$ - "\providecommand{\eprint}[2][]{\url{#2}}" - write$ newline$ - " \bibcommenthead " - write$ newline$ -} -EXECUTE {begin.bib} -EXECUTE {init.state.consts} -ITERATE {call.type$} -FUNCTION {end.bib} -{ newline$ - "\end{thebibliography}" write$ newline$ -} -EXECUTE {end.bib} - -%% End of file `sn-basic.bst'. - diff --git a/waypoint_control/sn-article-template/bst/sn-chicago.bst b/waypoint_control/sn-article-template/bst/sn-chicago.bst deleted file mode 100644 index d9dfe5f..0000000 --- a/waypoint_control/sn-article-template/bst/sn-chicago.bst +++ /dev/null @@ -1,1683 +0,0 @@ -%% This is file `sn-chicago.bst' -%% Compatible with bibtex version 0.99d. - -%% The original source files were: chicago.bst -% =================================== -% -% Reference list ordering: alphabetical by author or whatever passes for author in the absence of one. -% -% If the entries in the list should be numbered consecutively comment out the two lines including SORT (in uppercase). -% -% This BibTeX style has support for abbreviated author lists and for -% year-only citations. This is done by having the citations -% actually look like -% \citeauthoryear{full-author-info}{abbrev-author-info}{year} - -FUNCTION {identify.chicago.version} -{ % Put identifying string in the .blg file - "sn-chicago.bst" - " [2024/07/19 v1.1 Chicago bibliography style]" - * top$ -} - -ENTRY - { address - author - booktitle - chapter - edition - editor - howpublished - institution - journal - key - keywords - month - note - doi - number - organization - pages - publisher - school - series - title - type - volume - year - eprint - archive - archivePrefix - primaryClass - eid - adsurl - adsnote - version - } - {} - { label.year extra.label sort.year sort.label } - -INTEGERS { output.state before.all mid.sentence after.sentence after.block } - -FUNCTION {init.state.consts} -{ #0 'before.all := - #1 'mid.sentence := - #2 'after.sentence := - #3 'after.block := -} - -STRINGS { s t u } - -FUNCTION {output.nonnull} -{ 's := - output.state mid.sentence = - { ", " * write$ } - { output.state after.block = - { add.period$ write$ - newline$ - "\newblock " write$ - } - { output.state before.all = - 'write$ - { add.period$ " " * write$ } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} - -FUNCTION {add.blank} -{ " " * before.all 'output.state := -} - -% Use a colon to separate output. Used only for address/publisher -% combination in book/inbook types, address/institution for manuals, -% and organization:publisher for proceedings (inproceedings). -% -FUNCTION {output.nonnull.colon} -{ 's := - output.state mid.sentence = - { ": " * write$ } - { output.state after.block = - { add.period$ write$ - newline$ - "\newblock " write$ - } - { output.state before.all = - 'write$ - { add.period$ " " * write$ } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} - -FUNCTION {output} -{ duplicate$ empty$ - 'pop$ - 'output.nonnull - if$ -} - -FUNCTION {output.colon} -{ duplicate$ empty$ - 'pop$ - 'output.nonnull.colon - if$ -} - -FUNCTION {output.check} -{ 't := - duplicate$ empty$ - { pop$ "empty " t * " in " * cite$ * warning$ } - 'output.nonnull - if$ -} - -FUNCTION {output.check.colon} -{ 't := - duplicate$ empty$ - { pop$ "empty " t * " in " * cite$ * warning$ } - 'output.nonnull.colon - if$ -} - -FUNCTION {output.year.check} -{ year empty$ - { "empty year in " cite$ * warning$ } - { write$ - " " year * extra.label * - month empty$ - { "" * } - { ", " * month * "" * } - if$ - mid.sentence 'output.state := - } - if$ -} - - -FUNCTION {fin.entry} -{ add.period$ - write$ - newline$ -} - -FUNCTION {new.block} -{ output.state before.all = - 'skip$ - { after.block 'output.state := } - if$ -} - -FUNCTION {new.sentence} -{ output.state after.block = - 'skip$ - { output.state before.all = - 'skip$ - { after.sentence 'output.state := } - if$ - } - if$ -} - -FUNCTION {not} -{ { #0 } - { #1 } - if$ -} - -FUNCTION {and} -{ 'skip$ - { pop$ #0 } - if$ -} - -FUNCTION {or} -{ { pop$ #1 } - 'skip$ - if$ -} - -FUNCTION {new.block.checka} -{ empty$ - 'skip$ - 'new.block - if$ -} - -FUNCTION {new.block.checkb} -{ empty$ - swap$ empty$ - and - 'skip$ - 'new.block - if$ -} - -FUNCTION {new.sentence.checka} -{ empty$ - 'skip$ - 'new.sentence - if$ -} - -FUNCTION {new.sentence.checkb} -{ empty$ - swap$ empty$ - and - 'skip$ - 'new.sentence - if$ -} - -FUNCTION {field.or.null} -{ duplicate$ empty$ - { pop$ "" } - 'skip$ - if$ -} - -% -% Emphasize the top string on the stack. -% -FUNCTION {emphasize} -{ duplicate$ empty$ - { pop$ "" } - { "{\em " swap$ * "}" * } - if$ -} - -% -% Emphasize the top string on the stack, but add a trailing space. -% -FUNCTION {emphasize.space} -{ duplicate$ empty$ - { pop$ "" } - { "{\em " swap$ * "\/}" * } - if$ -} - -INTEGERS { nameptr namesleft numnames } -% -% Format bibliographical entries with the first author last name first, -% and subsequent authors with initials followed by last name. -% All names are formatted in this routine. -% -FUNCTION {format.names} -{ 's := - #1 'nameptr := % nameptr = 1; - s num.names$ 'numnames := % numnames = num.name$(s); - numnames 'namesleft := - { namesleft #0 > } - - { nameptr #1 = - {s nameptr "{vv~}{ll}{, jj}{, f{.}.}" format.name$ 't := } - {s nameptr "{f{.}.~}{vv~}{ll}{, jj}" format.name$ 't := } - if$ - nameptr #1 > - { namesleft #1 > - { ", " * t * } - { numnames #2 > - { "," * } - 'skip$ - if$ - t "others" = - { " et~al." * } - { " and " * t * } % from Chicago Manual of Style - if$ - } - if$ - } - 't - if$ - nameptr #1 + 'nameptr := % nameptr += 1; - namesleft #1 - 'namesleft := % namesleft =- 1; - } - while$ -} - -FUNCTION {my.full.label} -{ 's := - #1 'nameptr := % nameptr = 1; - s num.names$ 'numnames := % numnames = num.name$(s); - numnames 'namesleft := - { namesleft #0 > } - - { s nameptr "{vv~}{ll}" format.name$ 't := % get the next name - nameptr #1 > - { namesleft #1 > - { ", " * t * } - { numnames #2 > - { "," * } - 'skip$ - if$ - t "others" = - { " et~al." * } - { " and " * t * } % from Chicago Manual of Style - if$ - } - if$ - } - 't - if$ - nameptr #1 + 'nameptr := % nameptr += 1; - namesleft #1 - 'namesleft := % namesleft =- 1; - } - while$ - -} - -FUNCTION {format.names.fml} -% -% Format names in "familiar" format, with first initial followed by -% last name. Like format.names, ALL names are formatted. -% -{ 's := - #1 'nameptr := % nameptr = 1; - s num.names$ 'numnames := % numnames = num.name$(s); - numnames 'namesleft := - { namesleft #0 > } - - { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't := - - nameptr #1 > - { namesleft #1 > - { ", " * t * } - { numnames #2 > - { "," * } - 'skip$ - if$ - t "others" = - { " et~al." * } - { " and " * t * } -% { " \& " * t * } - if$ - } - if$ - } - 't - if$ - nameptr #1 + 'nameptr := % nameptr += 1; - namesleft #1 - 'namesleft := % namesleft =- 1; - } - while$ -} - -FUNCTION {format.authors} -{ author empty$ - { "" } - { author format.names } - if$ -} - -FUNCTION {format.key} -{ empty$ - { key field.or.null } - { "" } - if$ -} - -% -% Format editor names for use in the "in" types: inbook, incollection, -% inproceedings: first initial, then last names. When editors are the -% LABEL for an entry, then format.editor is used which lists editors -% by last name first. -% -FUNCTION {format.editors.fml} -{ editor empty$ - { "" } - { editor format.names.fml - editor num.names$ #1 > - { " (Eds.)" * } - { " (Ed.)" * } - if$ - } - if$ -} - -% -% Format editor names for use in labels, last names first. -% -FUNCTION {format.editors} -{ editor empty$ - { "" } - { editor format.names - editor num.names$ #1 > - { " eds." * } - { " ed." * } - if$ - } - if$ -} - -FUNCTION {in.format.editors} -{ editor empty$ - { "" } - { editor format.names - editor num.names$ #1 > - { " eds. " swap$ * } - { " ed. " swap$ * } - if$ - } - if$ -} - -FUNCTION {format.title} -{ title empty$ - { "" } - { title "t" change.case$ } - if$ -} - -% Note that the APA style requres case changes -% in article titles. The following does not -% change cases. If you perfer it, uncomment the -% following and comment out the above. - -%FUNCTION {format.title} -%{ title empty$ -% { "" } -% { title } -% if$ -%} - -FUNCTION {n.dashify} -{ 't := - "" - { t empty$ not } - { t #1 #1 substring$ "-" = - { t #1 #2 substring$ "--" = not - { "--" * - t #2 global.max$ substring$ 't := - } - { { t #1 #1 substring$ "-" = } - { "-" * - t #2 global.max$ substring$ 't := - } - while$ - } - if$ - } - { t #1 #1 substring$ * - t #2 global.max$ substring$ 't := - } - if$ - } - while$ -} - -FUNCTION {format.btitle} -{ edition empty$ - { title emphasize } - { title empty$ - { title emphasize } - { volume empty$ % gnp - check for volume, then don't need period - { "{\em " title * "\/} (" * edition * " ed.)" * "." * } - { "{\em " title * "\/} (" * edition * " ed.)" * } - if$ - } - if$ - } - if$ -} - -FUNCTION {format.emphasize.booktitle} -{ edition empty$ - { booktitle emphasize } - { booktitle empty$ - { booktitle emphasize } - { volume empty$ % gnp - extra period an error if book has a volume - { "{\em " booktitle * "\/} (" * edition * " ed.)" * "." *} - { "{\em " booktitle * "\/} (" * edition * " ed.)" * } - if$ - } - if$ - } - if$ - } - - -FUNCTION {tie.or.space.connect} -{ duplicate$ text.length$ #3 < - { "~" } - { " " } - if$ - swap$ * * -} - -FUNCTION {either.or.check} -{ empty$ - 'pop$ - { "can't use both " swap$ * " fields in " * cite$ * warning$ } - if$ -} - -FUNCTION {format.bvolume} -{ volume empty$ - { "" } - { "Volume" volume tie.or.space.connect % gnp - changed to mixed case - series empty$ - 'skip$ - { " of " * series emphasize * } - if$ - "volume and number" number either.or.check - } - if$ -} - -FUNCTION {format.number.series} -{ volume empty$ - { number empty$ - { series field.or.null } - { output.state mid.sentence = - { "Number" } % gnp - changed to mixed case always - { "Number" } - if$ - number tie.or.space.connect - series empty$ - { "there's a number but no series in " cite$ * warning$ } - { " in " * series * } - if$ - } - if$ - } - { "" } - if$ -} - -INTEGERS { multiresult } - -FUNCTION {multi.page.check} -{ 't := - #0 'multiresult := - { multiresult not - t empty$ not - and - } - { t #1 #1 substring$ - duplicate$ "-" = - swap$ duplicate$ "," = - swap$ "+" = - or or - { #1 'multiresult := } - { t #2 global.max$ substring$ 't := } - if$ - } - while$ - multiresult -} - -FUNCTION {format.pages} -{ pages empty$ - { "" } - { pages multi.page.check - { "pp.\ " pages n.dashify tie.or.space.connect } % gnp - removed () - { "pp.\ " pages tie.or.space.connect } - if$ - } - if$ -} - - -FUNCTION {format.in.pages} -{ pages empty$ - { "" } - { pages multi.page.check - { "" pages n.dashify tie.or.space.connect } % gnp - removed () - { "" pages tie.or.space.connect } - if$ - } - if$ -} - -% By Young (and Spencer) -% GNP - fixed bugs with missing volume, number, and/or pages -% -% Format journal, volume, number, pages for article types. -% -FUNCTION {format.jour.vol} -{ journal empty$ - { "no journal in " cite$ * warning$ - "" } - { journal emphasize.space } - if$ - number empty$ - { volume empty$ - { "no number and no volume in " cite$ * warning$ - "" * } - { "~" * Volume * "" * } - if$ - } - { volume empty$ - {"no volume for " cite$ * warning$ - "~(" * number * ")" * } - { "~" * - volume emphasize.space - "(" * number * ")" * * } - if$ - } - if$ - pages empty$ - {"page numbers missing in " cite$ * warning$ - "" * } % gnp - place a null string on the stack for output - { duplicate$ empty$ - { pop$ format.pages } - { ": " * pages n.dashify * } % gnp - removed pp. for articles - if$ - } - if$ -} - -FUNCTION {format.chapter.pages} -{ chapter empty$ - 'format.pages - { type empty$ - { "Chapter" } % gnp - changed to mixed case - { type "t" change.case$ } - if$ - chapter tie.or.space.connect - pages empty$ - {"page numbers missing in " cite$ * warning$} % gnp - added check - { ", " * format.pages * } - if$ - } - if$ -} - - -FUNCTION {format.in.chapter.pages} -{ chapter empty$ - 'format.in.pages - { type empty$ - { "Chapter" } % gnp - changed to mixed case - { type "t" change.case$ } - if$ - chapter tie.or.space.connect - pages empty$ - {"page numbers missing in " cite$ * warning$} % gnp - added check - { ", " * format.in.pages * } - if$ - } - if$ -} - -FUNCTION {format.in.ed.booktitle} -{ booktitle empty$ - { "" } - { editor empty$ - { "In " format.emphasize.booktitle * } - { "In " format.editors.fml * ", " * format.emphasize.booktitle * } - if$ - } - if$ -} - -FUNCTION {format.in.coll.ed.booktitle} -{ booktitle empty$ - { "" } - { editor empty$ - { "" format.emphasize.booktitle * } - { "In " format.emphasize.booktitle * ", " * in.format.editors * } - if$ - } - if$ -} - -FUNCTION {format.thesis.type} -{ type empty$ - 'skip$ - { pop$ - type "t" change.case$ - } - if$ -} - -FUNCTION {format.tr.number} -{ type empty$ - { "Technical Report" } - 'type - if$ - number empty$ - { "t" change.case$ } - { number tie.or.space.connect } - if$ -} - -FUNCTION {format.article.crossref} -{ "See" - "\citeN{" * crossref * "}" * -} - -FUNCTION {format.crossref.editor} -{ editor #1 "{vv~}{ll}" format.name$ - editor num.names$ duplicate$ - #2 > - { pop$ " et~al." * } - { #2 < - 'skip$ - { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = - { " et~al." * } - { " and " * editor #2 "{vv~}{ll}" format.name$ * } - if$ - } - if$ - } - if$ -} - -FUNCTION {format.book.crossref} -{ volume empty$ - { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ - "In " - } - { "Volume" volume tie.or.space.connect % gnp - changed to mixed case - " of " * - } - if$ - editor empty$ - editor field.or.null author field.or.null = - or - { key empty$ - { series empty$ - { "need editor, key, or series for " cite$ * " to crossref " * - crossref * warning$ - "" * - } - { "{\em " * series * "\/}" * } - if$ - } - { key * } - if$ - } - { format.crossref.editor * } - if$ - " \citeN{" * crossref * "}" * -} - -FUNCTION {format.incoll.inproc.crossref} -{ "See" - " \citeN{" * crossref * "}" * -} - -% format.lab.names: -% -% determines "short" names for the abbreviated author information. -% "Long" labels are created in calc.label, using the routine my.full.label -% to format author and editor fields. -% -% There are 4 cases for labels. (n=3 in the example) -% a) one author Foo -% b) one to n Foo, Bar and Baz -% c) use of "and others" Foo, Bar et al. -% d) more than n Foo et al. -% -FUNCTION {format.lab.names} -{ 's := - s num.names$ 'numnames := - numnames #2 > % change number to number of others allowed before - % forcing "et al". - { s #1 "{vv~}{ll}" format.name$ " et~al." * } - { - numnames #1 - 'namesleft := - #2 'nameptr := - s #1 "{vv~}{ll}" format.name$ - { namesleft #0 > } - { nameptr numnames = - { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" = - { " et~al." * } - { " and " * s nameptr "{vv~}{ll}" format.name$ * } - if$ - } - { ", " * s nameptr "{vv~}{ll}" format.name$ * } - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ - } - if$ -} - -FUNCTION {author.key.label} -{ author empty$ - { key empty$ - { "no key, author in " cite$ * warning$ - cite$ #1 #3 substring$ } - 'key - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {editor.key.label} -{ editor empty$ - { key empty$ - { "no key, editor in " cite$ * warning$ - cite$ #1 #3 substring$ } - 'key - if$ - } - { editor format.lab.names } - if$ -} - -FUNCTION {author.key.organization.label} -% -% added - gnp. Provide label formatting by organization if author is null. -% -{ author empty$ - { organization empty$ - { key empty$ - { "no key, author or organization in " cite$ * warning$ - cite$ #1 #3 substring$ } - 'key - if$ - } - { organization } - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {editor.key.organization.label} -% -% added - gnp. Provide label formatting by organization if editor is null. -% -{ editor empty$ - { organization empty$ - { key empty$ - { "no key, editor or organization in " cite$ * warning$ - cite$ #1 #3 substring$ } - 'key - if$ - } - { organization } - if$ - } - { editor format.lab.names } - if$ -} - -FUNCTION {author.editor.key.label} -{ author empty$ - { editor empty$ - { key empty$ - { "no key, author, or editor in " cite$ * warning$ - cite$ #1 #3 substring$ } - 'key - if$ - } - { editor format.lab.names } - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {calc.label} -% -% Changed - GNP. See also author.organization.sort, editor.organization.sort -% Form label for BibTeX entry. The classification of which fields are used -% for which type of entry (book, inbook, etc.) are taken from alpha.bst. -% The change here from newapa is to also include organization as a -% citation label if author or editor is missing. -% -{ type$ "book" = - type$ "inbook" = - or - 'author.editor.key.label - { type$ "proceedings" = - 'editor.key.organization.label - { type$ "manual" = - 'author.key.organization.label - 'author.key.label - if$ - } - if$ - } - if$ - - author empty$ % generate the full label citation information. - { editor empty$ - { organization empty$ - { "no author, editor, or organization in " cite$ * warning$ - "??" } - { organization } - if$ - } - { editor my.full.label } - if$ - } - { author my.full.label } - if$ - -% leave label on the stack, to be popped when required. - - "}{" * swap$ * "}{" * -% year field.or.null purify$ #-1 #4 substring$ * -% -% save the year for sort processing afterwards (adding a, b, c, etc.) -% - year field.or.null purify$ #-1 #4 substring$ - 'label.year := -} - -FUNCTION {output.bibitem} -{ newline$ - - "\bibitem[\protect\citeauthoryear{" write$ - calc.label write$ - sort.year write$ - "}]{" write$ - - cite$ write$ - "}" write$ - newline$ - "" - before.all 'output.state := -} - -FUNCTION {output.doi} -{ - doi empty$ - { skip$ } - { "\doi{" doi * "}" * output } - if$ -} - -FUNCTION {format.archive} -{ - archivePrefix empty$ - { "" } - { archivePrefix ":" *} - if$ -} - -FUNCTION {format.primaryClass} -{ - primaryClass empty$ - { "" } - { "{[" primaryClass * "]}" *} - if$ -} - -FUNCTION {format.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {format.softmisc.archive} -{ - archivePrefix empty$ - { "" } - { "" } - if$ -} - -FUNCTION {format.softmisc.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {article} -{ output.bibitem - format.authors - "author" output.check -add.period$ "" * - author format.key output % added - output.year.check % added - new.block - format.title - "title" output.check - new.block - crossref missing$ - { format.jour.vol output - } - { format.article.crossref output.nonnull - format.pages output - } - if$ - new.block - output.doi - new.block - format.eprint output - add.blank - format.primaryClass output - fin.entry -} - -FUNCTION {book} -{ output.bibitem - author empty$ - { format.editors - "author and editor" output.check } - { format.authors - output.nonnull -add.period$ "" * - crossref missing$ - { "author and editor" editor either.or.check } - 'skip$ - if$ - } - if$ - output.year.check % added - new.block - format.btitle - "title" output.check - crossref missing$ - { format.bvolume output - new.block - format.number.series output - new.sentence - address output - publisher "publisher" output.check.colon - } - { new.block - format.book.crossref output.nonnull - } - if$ - new.block - note output - fin.entry -} - -FUNCTION {booklet} -{ output.bibitem - format.authors output - author format.key output % added - output.year.check % added - new.block - format.title - "title" output.check - new.block - howpublished output - address output - new.block - note output - fin.entry -} - -FUNCTION {inbook} -{ output.bibitem - author empty$ - { format.editors - "author and editor" output.check - } - { format.authors output.nonnull - crossref missing$ - { "author and editor" editor either.or.check } - 'skip$ - if$ - } - if$ - output.year.check % added - new.block - format.btitle - "title" output.check - crossref missing$ - { format.bvolume output - format.chapter.pages - "chapter and pages" output.check - new.block - format.number.series output - new.sentence - address output - publisher - "publisher" output.check.colon - } - { format.chapter.pages "chapter and pages" output.check - new.block - format.book.crossref output.nonnull - } - if$ - new.block - note output - fin.entry -} - -FUNCTION {incollection} -{ output.bibitem - format.authors - "author" output.check -add.period$ "" * - author format.key output % added - output.year.check % added - new.block - format.title - "title" output.check - crossref missing$ - { format.in.coll.ed.booktitle -"booktitle" output.check - format.bvolume output - format.number.series output - format.in.chapter.pages output % gnp - was special.output.nonnull -% left out comma before page numbers - new.sentence - address output - publisher "publisher" output.check.colon - } - { format.incoll.inproc.crossref - output.nonnull - format.in.chapter.pages output - } - if$ - new.block - note output - new.block - output.doi - fin.entry -} - -FUNCTION {inproceedings} -{ output.bibitem - format.authors - "author" output.check - author format.key output % added - output.year.check % added - new.block - format.title - "title" output.check - new.block - crossref missing$ - { format.in.ed.booktitle - "booktitle" output.check - format.bvolume output - format.number.series output - address output - format.pages output - new.sentence - organization output - publisher output.colon - } - { format.incoll.inproc.crossref output.nonnull - format.pages output - } - if$ - new.block - note output - fin.entry -} - -FUNCTION {conference} { inproceedings } - -FUNCTION {manual} -{ output.bibitem - author empty$ - { editor empty$ - { organization "organization" output.check - organization format.key output } % if all else fails, use key - { format.editors "author and editor" output.check } - if$ - } - { format.authors output.nonnull } - if$ - output.year.check % added - new.block - format.btitle - "title" output.check - organization address new.block.checkb -% Reversed the order of "address" and "organization", added the ":". - address output - organization "organization" output.check.colon -% address output -% ":" output -% organization output - new.block - note output - fin.entry -} - -FUNCTION {mastersthesis} -{ output.bibitem - format.authors - "author" output.check - author format.key output % added - output.year.check % added - new.block - format.title - "title" output.check - new.block - "Master's thesis" format.thesis.type output.nonnull - school "school" output.check - address output - new.block - note output - fin.entry -} - -FUNCTION {misc} -{ output.bibitem - format.authors output -add.period$ "" * - author format.key output % added - output.year.check % added - title howpublished new.block.checkb - format.title output - new.block - howpublished output - new.block - note output - fin.entry -} - -FUNCTION {softmisc} -{ output.bibitem - format.authors output -add.period$ "" * - author format.key output % added - %%output.year.check % added - year output - title howpublished new.block.checkb - format.title output - version output - new.block - howpublished output - new.block - note output - new.block - format.softmisc.eprint output - fin.entry -} - -FUNCTION {phdthesis} -{ output.bibitem - format.authors - "author" output.check - author format.key output % added - output.year.check % added - new.block - format.btitle - "title" output.check - new.block - "Ph.\ D. thesis" format.thesis.type output.nonnull - school "school" output.check - address output - new.block - note output - fin.entry -} - -FUNCTION {proceedings} -{ output.bibitem - editor empty$ - { organization output - organization format.key output } % gnp - changed from author format.key - { format.editors output.nonnull } - if$ -% author format.key output % gnp - removed (should be either -% editor or organization - output.year.check % added (newapa) - new.block - format.btitle - "title" output.check - format.bvolume output - format.number.series output - address output - new.sentence - organization output - publisher output.colon - new.block - note output - fin.entry -} - -FUNCTION {techreport} -{ output.bibitem - format.authors - "author" output.check - author format.key output % added - output.year.check % added - new.block - format.title - "title" output.check - new.block - format.tr.number output.nonnull - institution - "institution" output.check - address output - new.block - note output - fin.entry -} - -FUNCTION {unpublished} -{ output.bibitem - format.authors - "author" output.check - author format.key output % added - output.year.check % added - new.block - format.title - "title" output.check - new.block - note "note" output.check - fin.entry -} - -FUNCTION {default.type} { misc } - -MACRO {jan} {"January"} - -MACRO {feb} {"February"} - -MACRO {mar} {"March"} - -MACRO {apr} {"April"} - -MACRO {may} {"May"} - -MACRO {jun} {"June"} - -MACRO {jul} {"July"} - -MACRO {aug} {"August"} - -MACRO {sep} {"September"} - -MACRO {oct} {"October"} - -MACRO {nov} {"November"} - -MACRO {dec} {"December"} - -MACRO {acmcs} {"ACM Computing Surveys"} - -MACRO {acta} {"Acta Informatica"} - -MACRO {ai} {"Artificial Intelligence"} - -MACRO {cacm} {"Communications of the ACM"} - -MACRO {ibmjrd} {"IBM Journal of Research and Development"} - -MACRO {ibmsj} {"IBM Systems Journal"} - -MACRO {ieeese} {"IEEE Transactions on Software Engineering"} - -MACRO {ieeetc} {"IEEE Transactions on Computers"} - -MACRO {ieeetcad} - {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} - -MACRO {ipl} {"Information Processing Letters"} - -MACRO {jacm} {"Journal of the ACM"} - -MACRO {jcss} {"Journal of Computer and System Sciences"} - -MACRO {scp} {"Science of Computer Programming"} - -MACRO {sicomp} {"SIAM Journal on Computing"} - -MACRO {tocs} {"ACM Transactions on Computer Systems"} - -MACRO {tods} {"ACM Transactions on Database Systems"} - -MACRO {tog} {"ACM Transactions on Graphics"} - -MACRO {toms} {"ACM Transactions on Mathematical Software"} - -MACRO {toois} {"ACM Transactions on Office Information Systems"} - -MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} - -MACRO {tcs} {"Theoretical Computer Science"} - -READ - -EXECUTE {identify.chicago.version} - -FUNCTION {sortify} -{ purify$ - "l" change.case$ -} - -INTEGERS { len } - -FUNCTION {chop.word} -{ 's := - 'len := - s #1 len substring$ = - { s len #1 + global.max$ substring$ } - 's - if$ -} - - - -FUNCTION {sort.format.names} -{ 's := - #1 'nameptr := - "" - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { nameptr #1 > - { " " * } - 'skip$ - if$ - s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := - nameptr numnames = t "others" = and - { " et~al" * } - { t sortify * } - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ -} - -FUNCTION {sort.format.title} -{ 't := - "A " #2 - "An " #3 - "The " #4 t chop.word - chop.word - chop.word - sortify - #1 global.max$ substring$ -} - -FUNCTION {author.sort} -{ author empty$ - { key empty$ - { "to sort, need author or key in " cite$ * warning$ - "" } - { key sortify } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {editor.sort} -{ editor empty$ - { key empty$ - { "to sort, need editor or key in " cite$ * warning$ - "" - } - { key sortify } - if$ - } - { editor sort.format.names } - if$ -} - -FUNCTION {author.editor.sort} -{ author empty$ - { "missing author in " cite$ * warning$ - editor empty$ - { key empty$ - { "to sort, need author, editor, or key in " cite$ * warning$ - "" - } - { key sortify } - if$ - } - { editor sort.format.names } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {author.organization.sort} -% -% added - GNP. Stack author or organization for sorting (from alpha.bst). -% Unlike alpha.bst, we need entire names, not abbreviations -% -{ author empty$ - { organization empty$ - { key empty$ - { "to sort, need author, organization, or key in " cite$ * warning$ - "" - } - { key sortify } - if$ - } - { organization sortify } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {editor.organization.sort} -% -% added - GNP. Stack editor or organization for sorting (from alpha.bst). -% Unlike alpha.bst, we need entire names, not abbreviations -% -{ editor empty$ - { organization empty$ - { key empty$ - { "to sort, need editor, organization, or key in " cite$ * warning$ - "" - } - { key sortify } - if$ - } - { organization sortify } - if$ - } - { editor sort.format.names } - if$ -} - -FUNCTION {presort} -% -% Presort creates the bibentry's label via a call to calc.label, and then -% sorts the entries based on entry type. Chicago.bst adds support for -% including organizations as the sort key; the following is stolen from -% alpha.bst. -% -{ calc.label sortify % recalculate bibitem label - year field.or.null purify$ #-1 #4 substring$ * % add year - " " - * - type$ "book" = - type$ "inbook" = - or - 'author.editor.sort - { type$ "proceedings" = - 'editor.organization.sort - { type$ "manual" = - 'author.organization.sort - 'author.sort - if$ - } - if$ - } - if$ - #1 entry.max$ substring$ % added for newapa - 'sort.label := % added for newapa - sort.label % added for newapa - * - " " - * - title field.or.null - sort.format.title - * - #1 entry.max$ substring$ - 'sort.key$ := -} - -ITERATE {presort} - -SORT % by label, year, author/editor, title - -STRINGS { last.label next.extra } - -INTEGERS { last.extra.num } - -FUNCTION {initialize.extra.label.stuff} -{ #0 int.to.chr$ 'last.label := - "" 'next.extra := - #0 'last.extra.num := -} - -FUNCTION {forward.pass} -% -% Pass through all entries, comparing current entry to last one. -% Need to concatenate year to the stack (done by calc.label) to determine -% if two entries are the same (see presort) -% -{ last.label - calc.label year field.or.null purify$ #-1 #4 substring$ * % add year - #1 entry.max$ substring$ = % are they equal? - { last.extra.num #1 + 'last.extra.num := - last.extra.num int.to.chr$ 'extra.label := - } - { "a" chr.to.int$ 'last.extra.num := - "" 'extra.label := - calc.label year field.or.null purify$ #-1 #4 substring$ * % add year - #1 entry.max$ substring$ 'last.label := % assign to last.label - } - if$ -} - -FUNCTION {reverse.pass} -{ next.extra "b" = - { "a" 'extra.label := } - 'skip$ - if$ - label.year extra.label * 'sort.year := - extra.label 'next.extra := -} - -EXECUTE {initialize.extra.label.stuff} - -ITERATE {forward.pass} - -REVERSE {reverse.pass} - -FUNCTION {bib.sort.order} -{ sort.label - " " - * - year field.or.null sortify - * - " " - * - title field.or.null - sort.format.title - * - #1 entry.max$ substring$ - 'sort.key$ := -} - -ITERATE {bib.sort.order} - -SORT % by sort.label, year, title --- giving final bib. order. - -FUNCTION {begin.bib} - -{ preamble$ empty$ - 'skip$ - { preamble$ write$ newline$ } - if$ - "\begin{thebibliography}{}" write$ newline$ - "\providecommand{\doi}[1]{\url{https://doi.org/#1}}" - write$ newline$ - "\bibcommenthead" write$ newline$ -} - - -EXECUTE {begin.bib} - -EXECUTE {init.state.consts} - -ITERATE {call.type$} - -FUNCTION {end.bib} -{ newline$ - "\end{thebibliography}" write$ newline$ -} - -EXECUTE {end.bib} - -%% End of file `sn-chicago.bst'. diff --git a/waypoint_control/sn-article-template/bst/sn-mathphys-ay.bst b/waypoint_control/sn-article-template/bst/sn-mathphys-ay.bst deleted file mode 100644 index 3553315..0000000 --- a/waypoint_control/sn-article-template/bst/sn-mathphys-ay.bst +++ /dev/null @@ -1,3208 +0,0 @@ -%% This is file `sn-mathphys-ay.bst' -%% Compatible with bibtex version 0.99d. -%% -%% Sorting entries is done by name and year fields! -%% -%% You are free to use this style file as you see fit, provided -%% that you do not make changes to the file. -%% -%% It may be distributed under the terms of the LaTeX Project Public -%% License, as described in lppl.txt in the base LaTeX distribution. -%% Either version 1.0 or, at your option, any later version. -%% -%% LIMITATIONS: -%% If you are getting error like -%% "Sorry---you've exceeded BibTeX's number of string global-variables" -%% that means you are using to old bibtex version. You should download latest version 0.99d. -%% (One of the binaries location is minimals.contextgarden.net/current/bin/common/) - -FUNCTION {identify.mathphys.version} -{ % Put identifying string in the .blg file - "sn-mathphys-ay.bst" - " [2024/07/19 v1.1 bibliography style]" - * top$ -} - -ENTRY - { address - author - booktitle - bnumber - chapter - doi - edition - editor - howpublished - institution - isbn - journal - key - keywords - month - note - number - organization - pages - publisher - school - series - title - type - volume - year - url - info - options - urldate - eprint - archive - archivePrefix - primaryClass - eid - adsurl - adsnote - version - } - {} - { label extra.label sort.label short.list} - -INTEGERS { output.state before.all mid.sentence after.sentence - after.block after.authors between.elements bother - Nisbn Nmonth slen set.settings tmp month.printed} - -FUNCTION {init.state.consts} -{ #0 'before.all := - #1 'mid.sentence := - #2 'after.sentence := - #3 'after.block := - #4 'after.authors := - #5 'between.elements := -} - -STRINGS { s t element} -STRINGS { longest.label last.label list.string default.list} -STRINGS { v l f j b temp.str} - -FUNCTION {output.nonnull} -{ 's := - output.state mid.sentence = - { " " * write$ newline$} - { output.state after.block = - { add.period$ write$ - newline$ - } - { - output.state after.authors = - { ": " * write$ - newline$ - } - { output.state between.elements = - { ", " * write$ newline$} - { output.state before.all = - 'write$ - { add.period$ " " * write$ newline$} - if$ - } - if$ - } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} - -FUNCTION {output} -{ duplicate$ empty$ - 'pop$ - 'output.nonnull - if$ -} - -FUNCTION {output.check} -{ 't := - duplicate$ empty$ - { pop$ "empty " t * " in " * cite$ * warning$ } - 'output.nonnull - if$ -} -FUNCTION {fin.entry} -{ write$ newline$ } - -FUNCTION {stupid.colon} -{ after.authors 'output.state := } - - -FUNCTION {insert.comma} -{ output.state before.all = - 'skip$ - { between.elements 'output.state := } - if$ -} - -FUNCTION {new.sentence} -{ output.state after.block = - 'skip$ - { output.state before.all = - 'skip$ - { after.sentence 'output.state := } - if$ - } - if$ -} - -FUNCTION {not} -{ { #0 } - { #1 } - if$ -} - -FUNCTION {and} -{ 'skip$ - { pop$ #0 } - if$ -} - -FUNCTION {or} -{ { pop$ #1 } - 'skip$ - if$ -} - - -FUNCTION {field.or.null} -{ duplicate$ empty$ - { pop$ "" } - 'skip$ - if$ -} - -FUNCTION {sort.format.month} -{ 't := - t #1 #2 substring$ "01" = - t #1 #1 substring$ "1" = - t #2 #2 substring$ "" = - and or - { "January" } - { t #1 #2 substring$ "02" = - t #1 #1 substring$ "2" = - t #2 #2 substring$ "" = - and or - { "February" } - { t #1 #2 substring$ "03" = - t #1 #1 substring$ "3" = - t #2 #2 substring$ "" = - and or - { "March" } - { t #1 #2 substring$ "04" = - t #1 #1 substring$ "4" = - or - { "April" } - { t #1 #2 substring$ "05" = - t #1 #1 substring$ "5" = - or - { "May" } - { t #1 #2 substring$ "06" = - t #1 #1 substring$ "6" = - or - { "June" } - { t #1 #2 substring$ "07" = - t #1 #1 substring$ "7" = - or - { "July" } - { t #1 #2 substring$ "08" = - t #1 #1 substring$ "8" = - or - { "August" } - { t #1 #2 substring$ "09" = - t #1 #1 substring$ "9" = - or - { "September" } - { t #1 #2 substring$ "10" = - { "October" } - { t #1 #2 substring$ "11" = - { "November" } - { t #1 #2 substring$ "12" = - { "December" } - { t } % No match - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - -} - -INTEGERS {sk} -FUNCTION {is.num} -{ chr.to.int$ - duplicate$ "0" chr.to.int$ < not - swap$ "9" chr.to.int$ > not and -} - -FUNCTION {make.tag} -{ 't := - duplicate$ empty$ - { pop$ "" } - { bother #0 = - { - t "volume" = - {"\textbf{" swap$ * "}" * } - 'skip$ - if$ - } - { "\b" t * "{" * swap$ * "}" * } - if$ - } - if$ -} - - - -FUNCTION {springer.publisher} -{publisher #1 #8 substring$ "Springer" = - { "Springer" } - { publisher } - if$ -} - -FUNCTION {format.adsurl} -{ - adsurl empty$ - { "" } - {" \href{" adsurl "}" *} - if$ -} - -FUNCTION {format.adsnote} -{ - adsnote empty$ - { "" } - { ". " * adsnote *} - if$ -} - - -FUNCTION {format.soft.title} -{ - title empty$ - { "" } - { title "," *} - if$ -} - -FUNCTION {format.softmisctitle} -{ title empty$ - { ""} - { version empty$ - { title ", " *} - { title ", " * version " " *} - if$ - } - if$ -} - -FUNCTION {format.softmisc.archive} -{ - archivePrefix empty$ - { "" } - { "" } - if$ -} - -FUNCTION {format.archive} -{ - archivePrefix empty$ - { "" } - { archivePrefix ":" *} - if$ -} - -FUNCTION {format.primaryClass} -{ - primaryClass empty$ - { "" } - { "{[" primaryClass * "]}" *} - if$ -} - -FUNCTION {format.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {format.softmisc.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {format.pub.address} -{ publisher empty$ - howpublished empty$ - and - { - address empty$ - 'skip$ - { volume empty$ - 'insert.comma - 'new.sentence - if$ - address - type$ "inproceedings" = - {"conflocation"} - {"location"} - if$ - make.tag output - } - if$ - } - { - address empty$ - { publisher empty$ - {howpublished} - {springer.publisher} - if$ - "publisher" make.tag - #1 bother = - {", \blocation{???}" * } - 'skip$ - if$ - output - } - { - publisher empty$ - {howpublished } - {springer.publisher } - if$ - "publisher" make.tag output - insert.comma - address "location" make.tag output - } - if$ - } - if$ -} - -INTEGERS { nameptr namesleft numnames } - -FUNCTION {mk.tag} -{ 'temp.str := - duplicate$ empty$ - { pop$ "" } - { - b "nothing" = - 'skip$ - { "\b" temp.str * "{" * swap$ * "}" * } - if$ - } - if$ -} - -FUNCTION {space.after.dot} -{'j := - t 'f := - j 't := - s 'j := - "" 'l := - "" 's := - { t empty$ not } - { - t #1 #3 substring$ "{-}" = - { l " {q}. " * 'l := - t #4 global.max$ substring$ 't := - } - 'skip$ - if$ - - t #1 #1 substring$ 's := - l s * 'l := - s "." = - { - t #2 #1 substring$ " " = - 'skip$ - { - l " " * 'l := - t #2 #4 substring$ "{\,}" = - { t #5 global.max$ substring$ 't := } - 'skip$ - if$ - } - if$ - } - 'skip$ - if$ - t #2 global.max$ substring$ 't := - } - while$ - f 't := - j 's := - l -} - -FUNCTION {fix.inits}{ - 't := - "" 'element := - { t empty$ not } - { - t #1 #3 substring$ ".q." = - { element ".-" * 'element := - t #3 global.max$ substring$ 't := - } - {element t #1 #1 substring$ * 'element :=} - if$ - - t #2 global.max$ substring$ 't := - } - while$ - element -} - -FUNCTION {fix.snm}{ - 't := - "" 'element := - { t empty$ not } - { - t #1 #3 substring$ "{-}" = - {element "-" * 'element := - t #3 global.max$ substring$ 't := - } - {element t #1 #1 substring$ * 'element :=} - if$ - - t #2 global.max$ substring$ 't := - } - while$ - element -} - -FUNCTION {enbrace.dash}{ - 't := - "" 'element := - { t empty$ not } - { - t #1 #1 substring$ "-" = - {element "{-}" * 'element :=} - {element t #1 #1 substring$ * 'element :=} - if$ - t #2 global.max$ substring$ 't := - } - while$ - element -} - -FUNCTION {fix.name}{ - - enbrace.dash 's := - "" 'l := - "" 't := - - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { - s nameptr "{vv~}{ll}{, jj}" format.name$ - s nameptr "{, ff}" format.name$ space.after.dot * 'l := - #1 nameptr = - {l 't :=} - {t " and " * l * 't := } - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ - t -} - -FUNCTION {name.separator}{ - namesleft #1 > - {", " * } - 'skip$ - if$ -} - -FUNCTION {format.author.editor} -{ 'b := - - bother #1 = - b "nothing" = - or - 'skip$ - {"b" b * 'b :=} - if$ - - b "editor" = - b "beditor" = - b "nothing" = - or or - {editor 's :=} - {author 's :=} - if$ - - %% modifying name - s fix.name 's := - - "" 't := - - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - - s numnames "{ll}" format.name$ 'l := - l "others" = - l "{others}" = - l "et al." = - l "{et al.}" = - or or or - {#1 'tmp :=} - {#0 'tmp :=} - if$ - - { namesleft #0 > } - { s nameptr "{vv}" format.name$ "particle" mk.tag 'v := - s nameptr "{ll}" format.name$ fix.snm "snm" mk.tag 'l := - s nameptr "{f{.}.}" format.name$ fix.inits "inits" mk.tag 'f := - s nameptr "{jj}" format.name$ "suffix" mk.tag 'j := - - - namesleft #1 = - tmp #1 = - and - { b "bauthor" = - b "beditor" = - or - {"et al."} - {"\betal"} - if$ - #1 'tmp := - } - { - b "bauthor" = - b "beditor" = - or - {"\oauthor{"} - { - b "nothing" = - {""} - {"\b" b * "{" *} - if$ - } -%% if$ -%% -%% v empty$ -%% 'skip$ -%% {v * " " *} - if$ - - l empty$ - 'skip$ - { l *} - if$ - - f empty$ - 'skip$ - {", " * f *} - if$ - - j empty$ - 'skip$ - {" " * j *} - if$ - - b "nothing" = - {""} - {"}"} - if$ - - * "" 't := - } - if$ - - name.separator - write$ - - namesleft #1 > - b "nothing" = not - and - { namesleft #2 = - tmp #1 = - and - 'skip$ - 'newline$ - if$ - } - 'skip$ - if$ - - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ -} - -FUNCTION {format.editors} -{ editor empty$ - 'skip$ - { - bother #0 = - { author empty$ - {"editor"} - {"nothing"} - if$ - } - {"editor"} - if$ - format.author.editor - editor num.names$ #1 > - { " (eds.)" } - { " (ed.)" } - if$ - write$ - } - if$ -} - -FUNCTION {format.authors} -{ author empty$ - 'skip$ - {"author" format.author.editor} - if$ -} - -FUNCTION {cite.author.editor} -{ 's := - s #1 "{vv~}{ll}" format.name$ - s num.names$ duplicate$ - #2 > - { pop$ " et~al." * } - { #2 = - { s #2 "{vv~}{ll}{ jj}{ f}" format.name$ "others" = - { " et~al." * } - { " and " * s #2 "{vv~}{ll}" format.name$ * } - if$ - } - 'skip$ - if$ - } - if$ -} - -FUNCTION {check.auth.edit.org} -{author empty$ - { - editor empty$ - { - organization empty$ - {""} - {organization} - if$ - } - {editor cite.author.editor} - if$ - } - {author cite.author.editor} - if$ -} - -FUNCTION {check.year} -{ year empty$ - {""} - {year extra.label *} - if$ -} - -INTEGERS { multiresult char.num k int} -INTEGERS {str.length count return save.num1 save.num2} -FUNCTION {is.in.list}{ - 'f := - %%%% saveing "s" and "t" - s 'j := - f 's := - t 'f := - list.string text.length$ 'str.length := - list.string 't := -% s text.length$ 'slen := - int 'save.num1 := - count 'save.num2 := - #1 'int := - #1 'count := - #0 'return := - - { count str.length = not - #0 str.length = not - and - } - { - count #1 + 'count := - t int #1 substring$ "," = - { - t #1 int substring$ s "," * = - { - #1 'return := - str.length 'count := - } - 'skip$ - if$ - - int #1 + 'int := - t int global.max$ substring$ 't := - #0 'int := - } - 'skip$ - if$ - int #1 + 'int := - } - while$ - - save.num1 'int := - save.num2 'count := - - #0 return = - { s t = - {#1 'return :=} - 'skip$ - if$ - } - 'skip$ - if$ - %%%% returning original "s" and "t" - j 's := - f 't := - - return -} - -INTEGERS {bibitem.count} - -FUNCTION {print.count} -{ bibitem.count #1 + 'bibitem.count := - newline$ - "%%% " - bibitem.count int.to.str$ * write$ -} - - -FUNCTION {output.bibitem} -{ print.count - newline$ - "\bibitem[\protect\citeauthoryear{" write$ - check.auth.edit.org write$ - "}{" write$ - check.year write$ - "}]{" write$ - cite$ write$ - "}" write$ - newline$ - "" before.all 'output.state := -} - - - - -FUNCTION {string.to.integer} -{ 't := - t text.length$ 'k := - #1 'char.num := - { t char.num #1 substring$ 's := - s is.num - s "." = - or - char.num k = not - and - } - { char.num #1 + 'char.num := } - while$ - char.num #1 - 'char.num := - t #1 char.num substring$ -} - - -FUNCTION {find.integer} -{ 't := - #0 'int := - { int not - t empty$ not - and - } - { t #1 #1 substring$ 's := - s is.num - {#1 'int :=} - { t #2 global.max$ substring$ 't := } - if$ - } - while$ - int -} - -function{title.lowerwords}{ -"a,an,and,of,the,for,in,to,over,from,on,or,so,than,that,this,as,but,with,by,at,down,up,upon,al,ale,aus,aux,d'Analyse,d'Analystes,d'Architecture,d'Etudes,d'Histoire,da,dans,de,degli,dei,del," -"dell',dell'Accademia,dell'Istituto,dell'Universita,della,delle,dem,der,des,detta,di,die,din,dlia,do,du,e,eXpress,ed,ego,el,em,en,et,fur,i,iz,l'Academie,l'Age,l'Antiquite," * -"l'Approximation,l'Ecole,l'Histoire,l'I.S.U.P.,l'INSA,l'IREM,l'Indirizzo,l'Institut,l'Institute,l'UFR,l'Union,l'Universite,la,las,les,na,nella,per,po,si,sue,sur,ta,tes,und,van,voor,zu,zum,zur" * -} - -FUNCTION {upercase.first.letters}{ - 't := - "" 's := - #1 'int := - #1 'count := - list.string 'v := - "" 'b := - title.lowerwords 'list.string := - - t text.length$ 'slen := - - {count slen = not } - {t int #1 substring$ " " = - { - int #1 - 'int := - t #1 int substring$ 'b := - - % if word not in title.lowerwords - uppercase first letter - b is.in.list not - { b "l" change.case$ b = - { b "u" change.case$ "t" change.case$ 'b := } - 'skip$ - if$ - } - 'skip$ - if$ - - int #1 + 'int := - - s b " " * * 's := - int #1 + 'int := - t int global.max$ substring$ 't := - #0 'int := - } - 'skip$ - if$ - int #1 + 'int := - count #1 + 'count := -% "count=" count int.to.str$ * " slen=" * slen int.to.str$ * top$ - } - while$ - v 'list.string := - % last word is "t" and need to check it too - s t - t "l" change.case$ t = - { "u" change.case$ "t" change.case$ } - 'skip$ - if$ - * -} - - -FUNCTION {format.title} -{ title empty$ - { "" } - { title - "article" type$ = - type$ "techreport" = - type$ "inbook" = - type$ "inproceedings" = - type$ "incollection" = - type$ "phdthesis" = - type$ "mastersthesis" = - or or or or or or - {"t" change.case$} - { type$ "unpublished" = - type$ "misc" = - or - 'skip$ - 'upercase.first.letters - if$ - } - if$ - } - if$ -} - - -FUNCTION {note.presented} -{ note #1 #9 substring$ "presented" = - note #1 #9 substring$ "Presented" = - or -} - -FUNCTION {n.filter} -{ 't := - "" - { t empty$ not } - { t #1 #1 substring$ "," = - t #1 #1 substring$ "\" = - t #1 #1 substring$ "~" = - or or - { "" * - t #2 global.max$ substring$ 't := - } - { t #1 #1 substring$ * - t #2 global.max$ substring$ 't := - } - if$ - } - while$ -} - -FUNCTION {byear} -{ duplicate$ empty$ - { pop$ "" } - { 't := - t text.length$ 'sk := - #5 sk = - { t #1 #4 substring$ 's := - t #5 #1 substring$ 'longest.label := - longest.label is.num not - {s "year" make.tag - "nameyear" is.in.list - {longest.label * } - 'skip$ - if$ - } - {t "year" make.tag } - if$ - } - { t "year" make.tag - "nameyear" is.in.list - {extra.label *} - 'skip$ - if$ - } - if$ - } - if$ -} - -FUNCTION {format.date} -{ year empty$ - { "" } - { year byear } - if$ -} - -FUNCTION {parens} -{ "(" swap$ * ")" * } - -FUNCTION {format.date.parens} -{ year empty$ - { "" } - { year byear parens } - if$ -} - -FUNCTION {noparens} -{ " " swap$ * "" * } - -FUNCTION {format.softmiscdate} -{ year empty$ - { "" } - { year byear parens } - if$ -} - -FUNCTION {format.month}{ - month empty$ - {""} - {month sort.format.month "confdate" make.tag} - if$ -} - -FUNCTION {formatpatent.date} -{ year empty$ - 'skip$ - { month empty$ - { year } - {format.month " " * year *} - if$ - } - if$ -} - -FUNCTION {month.year.date} -{ year empty$ - {""} - { month empty$ - {year byear} - { format.month " " * year byear * } - if$ - type$ "inproceedings" = - 'skip$ - {"(" swap$ * ")" * } - if$ - } - if$ -} - -FUNCTION {tie.or.space.connect} -{ duplicate$ text.length$ #3 < - { "~" } - { " " } - if$ - swap$ * * -} -FUNCTION {format.volume} -{ volume empty$ - { "book" type$ = - {number empty$ - {""} - {"vol. " number "seriesno" make.tag *} - if$ - } - {""} - if$ - } - {"vol. " volume "seriesno" make.tag *} - if$ -} -FUNCTION {format.volume2} -{ volume empty$ - {""} - {"vol. " volume "seriesno" make.tag *} - if$ -} - -FUNCTION {format.art.vol} -{ - volume empty$ - {""} - {volume n.filter "volume" make.tag} - if$ - number empty$ - 'skip$ - { "(" number "issue" make.tag * ")" * * } - if$ -} - -FUNCTION {format.series} -{ series empty$ - 'skip$ - {series "sertitle" make.tag} - if$ -} - -FUNCTION {format.edition} -{ edition empty$ - { "" } - { "" 'v := - "" 'l := - "" 'f := - edition "l" change.case$ 's := - "1" s = - "first" s = - or - { - "1" 'v := - "st" 'l := - } - { - "2" s = - "second" s = - or - { - "2" 'v := - "nd" 'l := - } - { - "3" s = - "third" s = - or - { - "3" 'v := - "rd" 'l := - } - { - "4" s = - "fourth" s = - or - { - "4" 'v := - "th" 'l := - } - { - "5" s = - "fifth" s = - or - { - "5" 'v := - "th" 'l := - } - { - "6" s = - "sixth" s = - or - { - "6" 'v := - "th" 'l := - } - { - "7" s = - "seventh" s = - or - { - "7" 'v := - "th" 'l := - } - { - "8" s = - "eighth" s = - or - { - "8" 'v := - "th" 'l := - } - { - "9" s = - "nineth" s = - or - { - "9" 'v := - "th" 'l := - } - { - edition "t" change.case$ 'f := - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - #0 bother = - { f "" = - { v l * 'f :=} - 'skip$ - if$ - } - { f "" = - { "\bedition{" v * "}" * l * 'f :=} - { "\bedition{" f * "}" * 'f :=} - if$ - } - if$ - f " edn." * - } - if$ -} -FUNCTION {format.isbn} -{ isbn empty$ - { "" } - { isbn "isbn" make.tag} - if$ -} - -INTEGERS {default.info} - - -FUNCTION {multi.page.check} -{ 't := - #0 'multiresult := - "" 'l := - - {t empty$ not} - { t #1 #1 substring$ 's := - - s is.num not - { "" l = not - {t find.integer - {#1 'multiresult := } - {#0 'multiresult := } - if$ - "" 't := - } - { - t #2 global.max$ substring$ 't := - } - if$ - } - { l s * 'l := - t #2 global.max$ substring$ 't := - } - if$ - } - while$ - multiresult -} -FUNCTION {clearpage} -{ 't := - "" 's := - "" 'l := - - { t empty$ not } - { - t #1 #1 substring$ 's := - s is.num not - 'skip$ - { l s * 'l := } - if$ - t #2 global.max$ substring$ 't := - } - while$ - l - -} -FUNCTION {do.pages} -{'t := - "" 'j := - "" 'v := - {t empty$ not} - { t #1 #1 substring$ 's := - s is.num not - s "," = not - and - { "" j = - { - t #2 global.max$ substring$ 't := - } - {t find.integer - { t clearpage 'v := } - 'skip$ - if$ - "" 't := - } - if$ - } - { j s * 'j := - t #2 global.max$ substring$ 't := - } - if$ - } - while$ - j clearpage 'j := - j "fpage" make.tag - "cnd" is.in.list - 'skip$ - {"--" * v "lpage" make.tag *} - if$ -} - - -FUNCTION {format.pages} -{ pages empty$ - { "" } - { pages multi.page.check - {type$ "article" = - {""} - {"cnd" is.in.list - {"p. "} - {"pp. "} - if$ - } - if$ - pages do.pages * - } - {type$ "article" = - {""} - {"p. "} - if$ - pages clearpage "fpage" make.tag * - } - - if$ - } - if$ -} - -FUNCTION {replace.tilde} -{ 't := - "" - { t empty$ not } - { t #1 #1 substring$ "~" = - { { t #1 #1 substring$ "~" = } - { "\texttildelow " * - t #2 global.max$ substring$ 't := - } - while$ - } - { t #1 #1 substring$ * - t #2 global.max$ substring$ 't := - } - if$ - } - while$ -} - - -FUNCTION {format.url} -{ url empty$ - 'skip$ - { type$ "article" = - 'skip$ - { #0 bother = - { "\url{" } - { "\burl{" } - if$ - url replace.tilde * "}" * - output - } - if$ - - urldate empty$ - 'skip$ - { "Accessed " urldate * output } - if$ - } - if$ -} - - -FUNCTION {publisher.month.pages}{ - publisher empty$ series empty$ and - { address empty$ - 'skip$ - 'new.sentence - if$ - format.pub.address - - pages empty$ - 'skip$ - {insert.comma} - if$ - format.pages output - - } - { - pages empty$ - 'skip$ - {insert.comma} - if$ - format.pages output - publisher empty$ - 'skip$ - {new.sentence} - if$ - format.pub.address - } - if$ -} - -function{process.doi}{ - doi 't := - "" 'b := - #1 'int := -% "doi =" t * top$ - - t text.length$ 'slen := - - {int slen = not } - {t int #3 substring$ "10." = - { - t int #1 - #1 substring$ 'b := - b "" = - {"a" 'b :=} % if b is empty need to set a letter - 'skip$ - if$ - - b is.num not - { - t int slen int - #1 + substring$ 't := - slen #1 - 'int := - } - 'skip$ - if$ - - } - 'skip$ - if$ - int #1 + 'int := - } - while$ - t -} - -FUNCTION {format.doi} -{ doi empty$ - {""} - { - "nodoi" is.in.list - {""} - %%{"doi:\doiurl{" process.doi * "}" * } - {"\doiurl{" process.doi * "} " * } - if$ - } - if$ -} - -FUNCTION {format.in.ed.booktitle} -{ booktitle empty$ - {#1 bother = - "cnd" is.in.list not - and - { editor empty$ - 'skip$ - { "In: " output write$ format.editors } - if$ - } - 'skip$ - if$ - } - { editor empty$ - { "In: " booktitle upercase.first.letters "btitle" make.tag * output} - { "In: " output write$ format.editors "" %%% pushing empty string to the empty stack - booktitle upercase.first.letters "btitle" make.tag output - } - if$ - } - - if$ -} - -FUNCTION {format.in.ed} -{ title empty$ - 'skip$ - { editor empty$ - { title "btitle" make.tag output} - { author empty$ - { format.editors - stupid.colon - %format.date output - title "btitle" make.tag output - } - { "In: " output write$ format.editors "" %%% pushing empty string to the empty stack - title "btitle" make.tag output - } - if$ - } - if$ - } - if$ -} - -FUNCTION {format.tr.number} -{ type empty$ - { "Technical Report" } - 'type - if$ - number empty$ - { "t" change.case$ } - { number tie.or.space.connect } - if$ -} - -FUNCTION {patent.number} -{ number empty$ - 'skip$ - { number } - if$ -} -INTEGERS { len } - -FUNCTION {chop.word} -{ 's := - 'len := - s #1 len substring$ = - { s len #1 + global.max$ substring$ } - 's - if$ -} - -FUNCTION {format.inpres} -{ "l" change.case$ 't := - "in press: " #10 - "in press. " #10 - "in press " #9 t chop.word - chop.word - chop.word - #1 global.max$ substring$ -} - -FUNCTION {bcomment.note} -{ note empty$ - 'skip$ - {note format.inpres "comment" make.tag output} - if$ -} - -FUNCTION {empty.misc.check} -{ author empty$ title empty$ howpublished empty$ - month empty$ year empty$ note empty$ - and and and and and - { "all relevant fields are empty in " cite$ * warning$ } - 'skip$ - if$ -} - -FUNCTION {format.thesis.type} -{ type empty$ - 'skip$ - { pop$ - type "t" change.case$ - } - if$ -} - -FUNCTION {format.chapter.and.note} -{ note empty$ chapter empty$ organization empty$ and and - 'skip$ - { chapter empty$ - "notnumber" last.label = - or - {organization empty$ - { note "comment" make.tag output } - { note empty$ - { organization "comment" make.tag output } - { organization ". " * note * "comment" make.tag output } - if$ - } - if$ - } - { note empty$ - { "Chap. " chapter * "comment" make.tag output} - { type empty$ - { "Chap. " } - { type "t" change.case$ "Section" = - { "Sect. " } - { "Chap. " } - if$ - } - if$ - chapter * ". " * note * "comment" make.tag output - } - if$ - } - if$ - } - if$ -} - -FUNCTION {item.end} -{ chapter empty$ - type$ "unpublished" = not - type$ "misc" = not - and and - { new.sentence - format.doi output - } - 'skip$ - if$ - - type$ "unpublished" = - type$ "misc" = - or - { note empty$ - 'skip$ - {note.presented - 'skip$ - {new.sentence note output} - if$ - } - if$ - format.date.parens output - } - { new.sentence - type$ "proceedings" = - { author empty$ editor empty$ and - 'bcomment.note - 'format.chapter.and.note - if$ - } - 'format.chapter.and.note - if$ - } - if$ - list.string 'v := - default.list 'list.string := - - type$ ".isbn" * is.in.list - "cnd" is.in.list - or - { - new.sentence -% format.isbn output - } - 'skip$ - if$ - new.sentence - %% commented by SPi as we are using format.eprint %% - %% and also to avoide eprint being printed twice - Start %% - %%eprint empty$ - %% 'skip$ - %% {"\arxivurl{" eprint * "}" * output} - %%if$ - %% End %% - chapter empty$ - type$ "unpublished" = not - type$ "misc" = not - and and - 'skip$ - { new.sentence - format.doi output - } - if$ - new.sentence - format.url - v 'list.string := - fin.entry -} - -FUNCTION {article.item.end} -{ chapter empty$ - type$ "unpublished" = not - type$ "misc" = not - and and - { new.sentence -% format.doi output - } - 'skip$ - if$ - - type$ "unpublished" = - type$ "misc" = - or - { note empty$ - 'skip$ - {note.presented - 'skip$ - {new.sentence note output} - if$ - } - if$ - format.date.parens output - } - { new.sentence - type$ "proceedings" = - { author empty$ editor empty$ and - 'bcomment.note - 'format.chapter.and.note - if$ - } - 'format.chapter.and.note - if$ - } - if$ - list.string 'v := - default.list 'list.string := - - type$ ".isbn" * is.in.list - "cnd" is.in.list - or - { - new.sentence -% format.isbn output - } - 'skip$ - if$ - new.sentence - %% commented by SPi as we are using format.eprint %% - %% and also to avoide eprint being printed twice - Start %% - %%eprint empty$ - %% 'skip$ - %% {"\arxivurl{" eprint * "}" * output} - %%if$ - %% End %% - chapter empty$ - type$ "unpublished" = not - type$ "misc" = not - and and - 'skip$ - { new.sentence -%% format.doi output - } - if$ - new.sentence - format.url - v 'list.string := - fin.entry -} - - -FUNCTION {insert.element} -{ #0 bother = - { element "{botherref}" * write$ newline$} - { - type$ "article" = - {element "{barticle}" * write$ newline$} - 'skip$ - if$ - type$ "book" = - type$ "proceedings" = - type$ "manual" = - type$ "booklet" = - or or or - {element "{bbook}" * write$ newline$} - 'skip$ - if$ - - type$ "inbook" = - { "notnumber" last.label = - {element "{bchapter}" * write$ newline$} - {element "{bbook}" * write$ newline$} - if$ - } - 'skip$ - if$ - - type$ "incollection" = - type$ "inproceedings" = - type$ "conference" = - or or - {element "{bchapter}" * write$ newline$} - 'skip$ - if$ - } - if$ -} - -FUNCTION {end.element} -{ "\end" 'element := - item.end - insert.element - "\endbibitem" write$ newline$ -} - -FUNCTION {article.end.element} -{ "\end" 'element := - article.item.end - insert.element - "\endbibitem" write$ newline$ -} - - -FUNCTION {begin.element} -{ "\begin" 'element := - insert.element -} -function {set.options}{ - options empty$ - 'skip$ - {options 'list.string :=} - if$ -} - -FUNCTION {settings} -{} - -FUNCTION {article} -{ output.bibitem - author empty$ - institution empty$ - editor empty$ - and and - journal empty$ - or - year empty$ - or - % above tagging rule means: - % nead: (volume & (pages or number) ) or (doi [without volume, pages and number]) - volume empty$ not - pages empty$ not bnumber empty$ not or - and - - volume empty$ pages empty$ bnumber empty$ and and - doi empty$ not and - or - not - or - {#0 'bother :=} - {#1 'bother :=} - if$ - begin.element - author empty$ - { editor empty$ - 'skip$ - {format.editors stupid.colon} - if$ - } - { format.authors stupid.colon} - if$ - "cnd" is.in.list - { - journal empty$ - {format.title "atitle" make.tag "title" output.check} - {journal "jtitle" make.tag output} - if$ - } - { - format.title "atitle" make.tag "title" output.check - journal empty$ - 'skip$ - {new.sentence journal "jtitle" make.tag output} - if$ - } - if$ - format.art.vol output - pages empty$ - 'skip$ - {insert.comma} - if$ - format.pages output - format.date.parens output - format.doi output - format.eprint output - format.primaryClass output - article.end.element -} - - -FUNCTION {patent} -{ output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "title" output.check - add.period$ - patent.number output - insert.comma - formatpatent.date output - end.element -} - -FUNCTION { other } { patent } - -FUNCTION {book} -{ output.bibitem - author empty$ - institution empty$ - organization empty$ - editor empty$ - and and and - title empty$ - year empty$ - or or - {#0 'bother :=} - { - publisher empty$ address empty$ not and - {#0 'bother :=} - {#1 'bother :=} - if$ - } - if$ - begin.element - author empty$ - { editor empty$ - 'skip$ - {format.editors stupid.colon} - if$ - } - { format.authors stupid.colon} - if$ - format.title "btitle" make.tag "title" output.check - series empty$ - { - format.volume output - insert.comma - format.edition output - } - { edition empty$ - 'skip$ - 'insert.comma - if$ - format.edition output - new.sentence - format.series output - insert.comma - format.volume output - } - if$ - publisher.month.pages - format.date.parens output - end.element -} - -FUNCTION {booklet} -{output.bibitem - author empty$ - title empty$ - year empty$ - howpublished empty$ - or or or - {#0 'bother :=} - {#1 'bother :=} - if$ - - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "btitle" make.tag "title" output.check - address empty$ publisher empty$ howpublished empty$ and and - 'skip$ - 'new.sentence - if$ - format.pub.address - format.date.parens output - end.element -} - -FUNCTION {misc} -{output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "btitle" make.tag "title" output.check - address empty$ publisher empty$ howpublished empty$ and and - 'skip$ - 'new.sentence - if$ - format.pub.address - end.element -} - -FUNCTION {softmisc} -{output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors} - if$ - stupid.colon - format.title "btitle" make.tag "title" output.check - insert.comma - version output - insert.comma - %%address empty$ publisher empty$ howpublished empty$ and and - %%'skip$ - %% 'new.sentence - %%if$ - format.pub.address - format.softmiscdate output - insert.comma - format.softmisc.eprint output - end.element -} - -FUNCTION {inbook} -{ output.bibitem - author empty$ - institution empty$ - organization empty$ - editor empty$ - and and and - title empty$ - year empty$ - or or - {#0 'bother :=} - { - publisher empty$ address empty$ not and - {#0 'bother :=} - {#1 'bother :=} - if$ - } - if$ - - chapter empty$ - { "" 'last.label :=} - { chapter string.to.integer empty$ author empty$ not and - { "notnumber" 'last.label :=} - { "" 'last.label :=} - if$ - } - if$ - - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - "notnumber" last.label = - { chapter "ctitle" make.tag output - add.period$ - } - 'skip$ - if$ - format.in.ed - series empty$ - { - insert.comma - format.volume output - insert.comma - format.edition output - new.sentence - } - { - insert.comma - format.edition output - new.sentence - format.series output - volume empty$ - 'skip$ - 'insert.comma - if$ - format.volume output - } - if$ - publisher.month.pages - publisher empty$ address empty$ edition empty$ series empty$ pages empty$ volume empty$ and and and and and - 'insert.comma - 'skip$ - if$ - format.date.parens output - end.element -} -FUNCTION {incollection} -{ output.bibitem - author empty$ - institution empty$ - and - booktitle empty$ - title empty$ - year empty$ - or or or - {#0 'bother :=} - { - publisher empty$ address empty$ not and - {#0 'bother :=} - {#1 'bother :=} - if$ - } - if$ - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - - "cnd" is.in.list - { - booktitle empty$ title empty$ not and - { - format.title "ctitle" make.tag "title" output.check - new.sentence - } - 'skip$ - if$ - } - { - format.title "ctitle" make.tag "title" output.check - title empty$ - 'skip$ - {new.sentence} - if$ - } - if$ - format.in.ed.booktitle - series empty$ - { - format.volume output - insert.comma - format.edition output - } - { - edition empty$ - 'skip$ - { insert.comma - format.edition output - } - if$ - new.sentence - format.series output - insert.comma - format.volume output - } - if$ - publisher.month.pages - format.date.parens output - end.element -} - -FUNCTION {inproceedings} -{ output.bibitem - author empty$ - institution empty$ - and - title empty$ - year empty$ - or or - {#0 'bother :=} - {#1 'bother :=} - if$ - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - - "cnd" is.in.list - { - booktitle empty$ title empty$ not and - { - format.title "ctitle" make.tag "title" output.check - new.sentence - } - 'skip$ - if$ - } - { - format.title "ctitle" make.tag "title" output.check - title empty$ booktitle empty$ not and - 'skip$ - {new.sentence} - if$ - } - if$ - - format.in.ed.booktitle - series empty$ - 'skip$ - {new.sentence format.series output} - if$ - volume empty$ address empty$ publisher empty$ and and - 'skip$ - 'insert.comma - if$ - format.volume output - publisher.month.pages - format.date.parens output - end.element -} - -FUNCTION {conference} { inproceedings } - -FUNCTION {manual} -{ output.bibitem - author empty$ - organization empty$ - title empty$ - year empty$ - address empty$ - or or or or - {#0 'bother :=} - {#1 'bother :=} - if$ - begin.element - - author empty$ - { organization empty$ - 'skip$ - { organization "publisher" make.tag output.nonnull - stupid.colon% add.period$ - } - if$ - } - { format.authors stupid.colon} - if$ - title empty$ - 'skip$ - {format.title "btitle" make.tag output} - if$ - edition empty$ - {new.sentence} - {insert.comma} - if$ - format.edition output - edition empty$ - 'skip$ - {new.sentence} - if$ - author empty$ organization empty$ - or - 'skip$ - { organization "publisher" make.tag output.nonnull - insert.comma - } - if$ - address empty$ - 'skip$ - {address "location" make.tag output} - if$ - format.date.parens output - end.element -} - - -FUNCTION {phdthesis} -{output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "title" output.check - new.sentence - type$ "mastersthesis" = - {"Master's thesis" format.thesis.type output.nonnull} - {"PhD thesis" format.thesis.type output.nonnull} - if$ - school empty$ - 'skip$ - 'insert.comma - if$ - school "school" output.check - address empty$ - 'skip$ - 'insert.comma - if$ - address output - month.year.date output - end.element -} -FUNCTION {mastersthesis}{phdthesis} - - -FUNCTION {proceedings} -{ output.bibitem - author empty$ - institution empty$ - organization empty$ - editor empty$ - and and and - title empty$ - year empty$ - or or - {#0 'bother :=} - { - publisher empty$ address empty$ not and - {#0 'bother :=} - {#1 'bother :=} - if$ - } - if$ - - begin.element - author empty$ - { editor empty$ - {organization "institutionaled" make.tag "organization" output.check } - { format.editors } - if$ - } - { format.authors } - if$ - stupid.colon - format.title "btitle" make.tag output - series empty$ - 'skip$ - {new.sentence format.series output} - if$ - volume empty$ - 'skip$ - 'insert.comma - if$ - format.volume output - publisher.month.pages - format.date.parens output - end.element -} - -FUNCTION {techreport} -{ output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "title" output.check - new.sentence - format.tr.number output.nonnull - institution empty$ - 'skip$ - 'insert.comma - if$ - institution "institution" output.check - address empty$ - 'skip$ - 'insert.comma - if$ - address output - month.year.date output - end.element -} - -FUNCTION {unpublished} -{ output.bibitem - #0 'bother := - - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "title" output.check - note empty$ - 'skip$ - { note.presented - {note output} - 'skip$ - if$ - } - if$ - end.element -} - -FUNCTION {default.type} { unpublished } - -MACRO {jan} {"January"} -MACRO {feb} {"February"} -MACRO {mar} {"March"} -MACRO {apr} {"April"} -MACRO {may} {"May"} -MACRO {jun} {"June"} -MACRO {jul} {"July"} -MACRO {aug} {"August"} -MACRO {sep} {"September"} -MACRO {oct} {"October"} -MACRO {nov} {"November"} -MACRO {dec} {"December"} - -READ - -EXECUTE {identify.mathphys.version} - -FUNCTION {sortify} -{ purify$ - "l" change.case$ -} - -INTEGERS { et.al.char.used } - -FUNCTION {initialize.et.al.char.used} -{ #0 'et.al.char.used := -} - -%%%%% setting default options -FUNCTION {set.default.opt} -{"alpha" 'list.string :=} - -EXECUTE {set.default.opt} - -FUNCTION {assign.opt}{ - % First need to set options - "settings" type$ = - { options empty$ - 'skip$ - {options 'list.string :=} - if$ - } - 'skip$ - if$ -} - -ITERATE {assign.opt} -EXECUTE {initialize.et.al.char.used} - -FUNCTION {alpha.format.lab.names} -{ 's := - s num.names$ 'numnames := - numnames #1 > - { numnames #4 > - { #3 'namesleft := } - { numnames 'namesleft := } - if$ - #1 'nameptr := - "" - { namesleft #0 > } - { nameptr numnames = - { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" = - { "+" * - #1 'et.al.char.used := - } - { s nameptr "{v{}}{l{}}" format.name$ * } - if$ - } - { s nameptr "{v{}}{l{}}" format.name$ * } - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ - numnames #4 > - { "+" * - #1 'et.al.char.used := - } - 'skip$ - if$ - } - { s #1 "{v{}}{l{}}" format.name$ - duplicate$ text.length$ #2 < - { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ } - 'skip$ - if$ - } - if$ -} - -FUNCTION {standard.format.lab.names} -{ 's := - s #1 "{vv~}{ll}" format.name$ - s num.names$ duplicate$ - #2 > - { pop$ " et~al." * } - { #2 < - 'skip$ - { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = - { " et~al." * } - { " and " * s #2 "{vv~}{ll}" format.name$ * } - if$ - } - if$ - } - if$ -} -FUNCTION {format.lab.names}{ - "alpha" is.in.list - 'alpha.format.lab.names - 'standard.format.lab.names - if$ -} - -FUNCTION {author.key.label} -{ author empty$ - { key empty$ - { cite$ #1 #3 substring$ } - { key #3 text.prefix$ } - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {author.editor.key.label} -{ author empty$ - { editor empty$ - { key empty$ - { "zzz" } - { key #3 text.prefix$ } - if$ - } - { editor format.lab.names } - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {author.key.organization.label} -{ author empty$ - { key empty$ - { organization empty$ - { "zzz" } - { "The " #4 organization chop.word #3 text.prefix$ } - if$ - } - { key #3 text.prefix$ } - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {editor.key.organization.label} -{ editor empty$ - { key empty$ - { organization empty$ - { "zzz" } - { "The " #4 organization chop.word #3 text.prefix$ } - if$ - } - { key #3 text.prefix$ } - if$ - } - { editor format.lab.names } - if$ -} - -FUNCTION {calc.short.authors} -{ type$ "book" = - type$ "inbook" = - or - 'author.editor.key.label - { type$ "proceedings" = - 'editor.key.organization.label - { type$ "manual" = - 'author.key.organization.label - 'author.key.label - if$ - } - if$ - } - if$ - 'short.list := -} - -FUNCTION {calc.label} -{ calc.short.authors - short.list - - "alpha" is.in.list - { - duplicate$ - year field.or.null purify$ #-1 #2 substring$ - * - 'label := - year field.or.null purify$ #-1 #4 substring$ - * - sortify 'sort.label := - } - { - "(" - * - year duplicate$ empty$ - short.list key field.or.null = or - { pop$ "" } - 'skip$ - if$ - * - 'label := - label 'sort.label := - } - if$ -} - -FUNCTION {sort.format.names} -{ 's := - #1 'nameptr := - "" - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { nameptr #1 > - { " " * - "alpha" is.in.list - 'skip$ - {numnames int.to.str$ * " " *} - if$ - } - 'skip$ - if$ - s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := - nameptr numnames = - t "others" = - and - { "et al" * } - { t sortify * } - if$ - #3 numnames < - "alpha" is.in.list not - and - {#0 'namesleft := - " zzz " * - } - { - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - if$ - } - while$ -} - -FUNCTION {sort.format.title} -{ 't := - "A " #2 - "An " #3 - "The " #4 t chop.word - chop.word - chop.word - sortify - #1 global.max$ substring$ -} - -FUNCTION {author.sort} -{ author empty$ - { key empty$ - { "to sort, need author or key in " cite$ * warning$ - "zzz" - } - { key sortify } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {author.editor.sort} -{ author empty$ - { editor empty$ - { key empty$ - { "to sort, need author, editor, or key in " cite$ * warning$ - "z" - } - { key sortify } - if$ - } - { editor sort.format.names } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {author.organization.sort} -{ author empty$ - { organization empty$ - { key empty$ - { "to sort, need author, organization, or key in " cite$ * warning$ - "z" - } - { key sortify } - if$ - } - { "The " #4 organization chop.word sortify } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {editor.organization.sort} -{ editor empty$ - { organization empty$ - { key empty$ - { "to sort, need editor, organization, or key in " cite$ * warning$ - "z" - } - { key sortify } - if$ - } - { "The " #4 organization chop.word sortify } - if$ - } - { editor sort.format.names } - if$ -} - -FUNCTION {presort} -{ calc.label - sort.label sortify - " " - * - type$ "book" = - type$ "inbook" = - or - {author empty$ - 'editor.organization.sort - 'author.organization.sort - if$ - } - { type$ "proceedings" = - type$ "incollection" = - or - {author empty$ - 'editor.organization.sort - 'author.organization.sort - if$ - } - { type$ "manual" = - 'author.organization.sort - 'author.sort - if$ - } - if$ - } - if$ - " " - * - year field.or.null sortify - * - " " - * - title field.or.null - sort.format.title - * - #1 entry.max$ substring$ 'sort.label := - sort.label * - #1 entry.max$ substring$ 'sort.key$ := - - "settings" type$ = - {"aaa"} - {"unsort" is.in.list - {"bb"} - {"alpha" is.in.list - {sort.key$} - {sort.label} - if$ - } - if$ - } - if$ - 'sort.key$ := -} - - -ITERATE {presort} - -SORT - -INTEGERS { longest.label.width last.extra.num number.label } - -FUNCTION {initialize.longest.label} -{ "" 'longest.label := - #0 int.to.chr$ 'last.label := - "" 'j := - #0 'longest.label.width := - #0 'last.extra.num := - #0 'number.label := -} - -FUNCTION {forward.pass} -{ last.label label = - { last.extra.num #1 + 'last.extra.num := - last.extra.num int.to.chr$ 'extra.label := - } - { "a" chr.to.int$ 'last.extra.num := - "" 'extra.label := - label 'last.label := - } - if$ - number.label #1 + 'number.label := -} - -FUNCTION {reverse.pass} -{ j "b" = - { "a" 'extra.label := } - 'skip$ - if$ - extra.label 'j := - label extra.label * 'label := -} - -EXECUTE {initialize.longest.label} - -ITERATE {forward.pass} - -REVERSE {reverse.pass} - -FUNCTION {write.preambule} -{ "%% BioMed_Central_Bib_Style_v1.01" write$ newline$ newline$ - "\begin{thebibliography}{" number.label int.to.str$ * "}" * write$ newline$ - "% BibTex style file: bmc-mathphys.bst (version 2.1), 2014-07-24" write$ newline$ - "\ifx \bisbn \undefined \def \bisbn #1{ISBN #1}\fi" write$ newline$ - "\ifx \binits \undefined \def \binits#1{#1}\fi" write$ newline$ - "\ifx \bauthor \undefined \def \bauthor#1{#1}\fi" write$ newline$ - "\ifx \batitle \undefined \def \batitle#1{#1}\fi" write$ newline$ - "\ifx \bjtitle \undefined \def \bjtitle#1{#1}\fi" write$ newline$ - "\ifx \bvolume \undefined \def \bvolume#1{\textbf{#1}}\fi" write$ newline$ - "\ifx \byear \undefined \def \byear#1{#1}\fi" write$ newline$ - "\ifx \bissue \undefined \def \bissue#1{#1}\fi" write$ newline$ - "\ifx \bfpage \undefined \def \bfpage#1{#1}\fi" write$ newline$ - "\ifx \blpage \undefined \def \blpage #1{#1}\fi" write$ newline$ - "\ifx \burl \undefined \def \burl#1{\textsf{#1}}\fi" write$ newline$ - %%"\ifx \doiurl \undefined \def \doiurl#1{\textsf{#1}}\fi" write$ newline$ - "\ifx \doiurl \undefined \def \doiurl#1{\url{https://doi.org/#1}}\fi" write$ newline$ - "\ifx \betal \undefined \def \betal{\textit{et al.}}\fi" write$ newline$ - "\ifx \binstitute \undefined \def \binstitute#1{#1}\fi" write$ newline$ - "\ifx \binstitutionaled \undefined \def \binstitutionaled#1{#1}\fi" write$ newline$ - "\ifx \bctitle \undefined \def \bctitle#1{#1}\fi" write$ newline$ - "\ifx \beditor \undefined \def \beditor#1{#1}\fi" write$ newline$ - "\ifx \bpublisher \undefined \def \bpublisher#1{#1}\fi" write$ newline$ - "\ifx \bbtitle \undefined \def \bbtitle#1{#1}\fi" write$ newline$ - "\ifx \bedition \undefined \def \bedition#1{#1}\fi" write$ newline$ - "\ifx \bseriesno \undefined \def \bseriesno#1{#1}\fi" write$ newline$ - "\ifx \blocation \undefined \def \blocation#1{#1}\fi" write$ newline$ - "\ifx \bsertitle \undefined \def \bsertitle#1{#1}\fi" write$ newline$ - "\ifx \bsnm \undefined \def \bsnm#1{#1}\fi" write$ newline$ - "\ifx \bsuffix \undefined \def \bsuffix#1{#1}\fi" write$ newline$ - "\ifx \bparticle \undefined \def \bparticle#1{#1}\fi" write$ newline$ - "\ifx \barticle \undefined \def \barticle#1{#1}\fi" write$ newline$ - "\bibcommenthead" write$ newline$ -} - - -FUNCTION {begin.bib} -{ preamble$ empty$ - 'skip$ - { preamble$ write$ newline$ } - if$ - write.preambule - "\ifx \bconfdate \undefined \def \bconfdate #1{#1}\fi" write$ newline$ - "\ifx \botherref \undefined \def \botherref #1{#1}\fi" write$ newline$ - "\ifx \url \undefined \def \url#1{\textsf{#1}}\fi" write$ newline$ - "\ifx \bchapter \undefined \def \bchapter#1{#1}\fi" write$ newline$ - "\ifx \bbook \undefined \def \bbook#1{#1}\fi" write$ newline$ - "\ifx \bcomment \undefined \def \bcomment#1{#1}\fi" write$ newline$ - "\ifx \oauthor \undefined \def \oauthor#1{#1}\fi" write$ newline$ - "\ifx \citeauthoryear \undefined \def \citeauthoryear#1{#1}\fi" write$ newline$ - "\ifx \endbibitem \undefined \def \endbibitem {}\fi" write$ newline$ - "\ifx \bconflocation \undefined \def \bconflocation#1{#1}\fi" write$ newline$ - "\ifx \arxivurl \undefined \def \arxivurl#1{\textsf{#1}}\fi" write$ newline$ - "\csname PreBibitemsHook\endcsname" write$ newline$ -} - -EXECUTE {begin.bib} - -EXECUTE {init.state.consts} - -ITERATE {call.type$} - -FUNCTION {end.bib} -{ newline$ - "\end{thebibliography}" write$ newline$ -} - -EXECUTE {end.bib} - - -%% XML output - done for each entry referenced in the BibTeX database -INTEGERS {i ll li j.int global.counter} -STRINGS {lr lp lt ls } - -FUNCTION {replace} -{ - 'lr := % replace string - 'lp := % pattern - 'lt := % text to search - "" 'ls := % result string - lp text.length$ 'll := % length of the search pattern - { lt empty$ not } - { lt #1 ll substring$ lp = - { ls lr * 'ls := - lt ll #1 + global.max$ substring$ 'lt := } - { ls lt #1 #1 substring$ * 'ls := - lt #2 global.max$ substring$ 'lt := } - if$ - } - while$ - ls -} - -FUNCTION {strip.letters} -{ - "" 's := - duplicate$ missing$ - 'pop$ - { - 't := - { t "" = not } - { % ascii '0' = 48, '9' = 57 - t #1 #1 substring$ chr.to.int$ 'i := - i #47 > i #58 < and - { s t #1 #1 substring$ * 's := } - 'skip$ - if$ - t #2 global.max$ substring$ 't := - } - while$ - } - if$ - s -} -FUNCTION {output.xml} -{ duplicate$ "" = - 'pop$ - { " " swap$ * write$ newline$ } - if$ -} - -%% - % markup.xml - % - % Takes 2 args text & tag {"the text " "tag"} - % Returns 1 string {"the text <\tag>"} -%% -FUNCTION {markup.xml} -{ - "" 'v := % result - 't := % tag - duplicate$ missing$ - 'pop$ - { 'v := } - if$ - v "" = - 'skip$ - { "<" t * ">" * v * "" * 'v := } - if$ - v -} - -%% Takes 2 args - tag, string -FUNCTION{markup.xml.title} -{ pop$ % tag - duplicate$ missing$ - 'pop$ - { - 's := % string - s "\&" "&" replace 's := - s "p" markup.xml 's := - s "title" markup.xml output.xml - } - if$ -} - - -%% - % markup.xml.pages - % - % Takes 1 arg (pages string) - % seperates into and if - % there is a - seperator. else no lpage. - % - % need to remove others -%% -FUNCTION{markup.xml.pages} -{ - "" 'v := % fpage - "" 's := % lpage - duplicate$ missing$ - 'pop$ - { - 't := - t " " "" replace 't := % remove all spaces. pgs must be - seperated - { t empty$ not } - { - t #1 #1 substring$ "-" = - { - t #2 global.max$ substring$ 's := - "" 't := % break while loop - }{ - v t #1 #1 substring$ * 'v := - t #2 global.max$ substring$ 't := - } - if$ - } - while$ - } - if$ - v "fpage" markup.xml output.xml - s "lpage" markup.xml output.xml -} - - -%% - % markup.xml.names - % - % Takes 2 args - % tag, namefield (eg. author "au") - % splits fields into and - % writes info - % returns nothing -%% -FUNCTION {markup.xml.names} -{ - 't := % tag - "" 'v := - "" 's := - duplicate$ empty$ - { pop$ - organization missing$ - { institution "cnm" markup.xml - "au" markup.xml "aug" markup.xml output.xml } - { organization "cnm" markup.xml - "au" markup.xml "aug" markup.xml output.xml } - if$ } - { - " " write$ newline$ - 'temp.str := % names string - temp.str num.names$ 'j.int := % num of names - #1 'i := % init counter - { i #1 j.int + < } % while (i <= j.int) - { - " " write$ - - % Initial first names - % if first name all in capitals - % - assume is initial list of first names. - temp.str i "{ff{ }}" format.name$ - duplicate$ "u" change.case$ = - { temp.str i "{ff{ }}" format.name$ } - { temp.str i "{f{}}" format.name$ } - if$ - - % if last name but no first name use cnm; else snm - duplicate$ "" = - { temp.str i "{ll{ }}" format.name$ % last names space seperated. - "cnm" markup.xml write$ } - { temp.str i "{ll{ }}" format.name$ % last names space seperated. - "snm" markup.xml write$ } - if$ - - "fnm" markup.xml write$ - - "" write$ newline$ - i #1 + 'i := - } - while$ - " " write$ newline$ - } - if$ -} - - -%% - % markup.xml.pub - % - % Takes 4 args (school address publisher tag) - % prints concatenation - % returns nothing -%% -FUNCTION {markup.xml.pub} -{ - 't := % Tag - "" 'v := % Publisher - "" 'l := % Address - "" 'f := % School - "" 's := % Answer - duplicate$ missing$ 'pop$ { 'v := } if$ - duplicate$ missing$ 'pop$ { 'l := } if$ - duplicate$ missing$ 'pop$ { 'f := } if$ - "" f = not % school not empty - { f 's := } % return school as publisher - { % else - "" v = "" l = and % address and pub empty - 'skip$ - { - "" l = - { v 's := } % return pub - { "" v = - { l 's := } % return add - { l ": " * v * 's := } % return add : pub - if$ - } - if$ - } - if$ - } - if$ - s t markup.xml output.xml -} - -%% - % xml.phd - % - % Takes nothing - % Returns type (phd/msc) of empty string -%% -FUNCTION {xml.phd} -{ - "phdthesis" type$ = - "mastersthesis" type$ = or - { "phdthesis" type$ = - { "PhD thesis" } - { "Master's thesis" } - if$ - } - { type } % usually empty - if$ -} - -% markup.xml.edition -% -% edition is a numeric value. ie "2" -% if format 2nd 1st etc.. strip letters. -% -FUNCTION {markup.xml.edition} -{ pop$ pop$ %clear stack - edition strip.letters duplicate$ "" = - { pop$ edition } - 'skip$ - if$ - "edition" markup.xml output.xml -} - - -FUNCTION{begin.bmcxmlcomment}{ - newline$ - "\newcommand{\BMCxmlcomment}[1]{}" write$ newline$ - newline$ - "\BMCxmlcomment{" write$ newline$ - newline$ "" write$ newline$ -} - -FUNCTION{end.bmcxmlcomment}{ - newline$ - "" write$ newline$ - "} % end of \BMCxmlcomment" write$ newline$ -} - -FUNCTION {export.xml}{ - newline$ - global.counter #1 + 'global.counter := - "" * - write$ newline$ -% title "\&" "&" replace "title" markup.xml.title - title "title" markup.xml.title - author "aug" markup.xml.names % org. and inst. here - howpublished missing$ - { booktitle missing$ - { journal missing$ - { xml.phd } % Phd/Msc - {journal} - if$ - } {booktitle} - if$ - } { howpublished } - if$ "source" markup.xml output.xml - school - address - publisher "publisher" markup.xml.pub - editor "editor" markup.xml output.xml - edition "edition" markup.xml.edition - series "p" markup.xml - "title" markup.xml - "series" markup.xml output.xml - chapter "p" markup.xml - "title" markup.xml - "section" markup.xml output.xml - % month % ignore - year "pubdate" markup.xml output.xml - - note missing$ - { volume "volume" markup.xml output.xml - number "issue" markup.xml output.xml - pages markup.xml.pages - url "url" markup.xml output.xml } - { note "l" change.case$ "in press" = - { " " write$ newline$ } - { volume "volume" markup.xml output.xml - number "issue" markup.xml output.xml - pages markup.xml.pages - url "url" markup.xml output.xml - note "note" markup.xml output.xml - } - if$ - } - if$ - "" write$ newline$ -} - -%%EXECUTE {begin.bmcxmlcomment} -%%ITERATE {export.xml} -%%EXECUTE {end.bmcxmlcomment} - -%% End of file `sn-mathphys-ay.bst'. - - - diff --git a/waypoint_control/sn-article-template/bst/sn-mathphys-num.bst b/waypoint_control/sn-article-template/bst/sn-mathphys-num.bst deleted file mode 100644 index e4d1e42..0000000 --- a/waypoint_control/sn-article-template/bst/sn-mathphys-num.bst +++ /dev/null @@ -1,3211 +0,0 @@ -%% This is file `sn-mathphys-num.bst' -%% Compatible with bibtex version 0.99d. -%% -%% Note: Per default sorting entries is done in the order of citation. -%% If the journal requires alphabetical order of references, select the alpha option -%% -%% You are free to use this style file as you see fit, provided -%% that you do not make changes to the file. -%% -%% It may be distributed under the terms of the LaTeX Project Public -%% License, as described in lppl.txt in the base LaTeX distribution. -%% Either version 1.0 or, at your option, any later version. -%% -%% LIMITATIONS: -%% If you are getting error like -%% "Sorry---you've exceeded BibTeX's number of string global-variables" -%% that means you are using to old bibtex version. You should download latest version 0.99d. -%% (One of the binaries location is minimals.contextgarden.net/current/bin/common/) - -FUNCTION {identify.mathphys.version} -{ % Put identifying string in the .blg file - "sn-mathphys-num.bst" - " [2024/07/19 v1.1 bibliography style]" - * top$ -} - -ENTRY - { address - author - booktitle - bnumber - chapter - doi - edition - editor - howpublished - institution - isbn - journal - key - keywords - month - note - number - organization - pages - publisher - school - series - title - type - volume - year - url - info - options - urldate - eprint - archive - archivePrefix - primaryClass - eid - adsurl - adsnote - version - } - {} - { label extra.label sort.label short.list} - -INTEGERS { output.state before.all mid.sentence after.sentence - after.block after.authors between.elements bother - Nisbn Nmonth slen set.settings tmp month.printed} - -FUNCTION {init.state.consts} -{ #0 'before.all := - #1 'mid.sentence := - #2 'after.sentence := - #3 'after.block := - #4 'after.authors := - #5 'between.elements := -} - -STRINGS { s t element} -STRINGS { longest.label last.label list.string default.list} -STRINGS { v l f j b temp.str} - -FUNCTION {output.nonnull} -{ 's := - output.state mid.sentence = - { " " * write$ newline$} - { output.state after.block = - { add.period$ write$ - newline$ - } - { - output.state after.authors = - { ": " * write$ - newline$ - } - { output.state between.elements = - { ", " * write$ newline$} - { output.state before.all = - 'write$ - { add.period$ " " * write$ newline$} - if$ - } - if$ - } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} - -FUNCTION {output} -{ duplicate$ empty$ - 'pop$ - 'output.nonnull - if$ -} - -FUNCTION {output.check} -{ 't := - duplicate$ empty$ - { pop$ "empty " t * " in " * cite$ * warning$ } - 'output.nonnull - if$ -} -FUNCTION {fin.entry} -{ write$ newline$ } - -FUNCTION {stupid.colon} -{ after.authors 'output.state := } - - -FUNCTION {insert.comma} -{ output.state before.all = - 'skip$ - { between.elements 'output.state := } - if$ -} - -FUNCTION {new.sentence} -{ output.state after.block = - 'skip$ - { output.state before.all = - 'skip$ - { after.sentence 'output.state := } - if$ - } - if$ -} - -FUNCTION {not} -{ { #0 } - { #1 } - if$ -} - -FUNCTION {and} -{ 'skip$ - { pop$ #0 } - if$ -} - -FUNCTION {or} -{ { pop$ #1 } - 'skip$ - if$ -} - - -FUNCTION {field.or.null} -{ duplicate$ empty$ - { pop$ "" } - 'skip$ - if$ -} - -FUNCTION {sort.format.month} -{ 't := - t #1 #2 substring$ "01" = - t #1 #1 substring$ "1" = - t #2 #2 substring$ "" = - and or - { "January" } - { t #1 #2 substring$ "02" = - t #1 #1 substring$ "2" = - t #2 #2 substring$ "" = - and or - { "February" } - { t #1 #2 substring$ "03" = - t #1 #1 substring$ "3" = - t #2 #2 substring$ "" = - and or - { "March" } - { t #1 #2 substring$ "04" = - t #1 #1 substring$ "4" = - or - { "April" } - { t #1 #2 substring$ "05" = - t #1 #1 substring$ "5" = - or - { "May" } - { t #1 #2 substring$ "06" = - t #1 #1 substring$ "6" = - or - { "June" } - { t #1 #2 substring$ "07" = - t #1 #1 substring$ "7" = - or - { "July" } - { t #1 #2 substring$ "08" = - t #1 #1 substring$ "8" = - or - { "August" } - { t #1 #2 substring$ "09" = - t #1 #1 substring$ "9" = - or - { "September" } - { t #1 #2 substring$ "10" = - { "October" } - { t #1 #2 substring$ "11" = - { "November" } - { t #1 #2 substring$ "12" = - { "December" } - { t } % No match - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - -} - -INTEGERS {sk} -FUNCTION {is.num} -{ chr.to.int$ - duplicate$ "0" chr.to.int$ < not - swap$ "9" chr.to.int$ > not and -} - -FUNCTION {make.tag} -{ 't := - duplicate$ empty$ - { pop$ "" } - { bother #0 = - { - t "volume" = - {"\textbf{" swap$ * "}" * } - 'skip$ - if$ - } - { "\b" t * "{" * swap$ * "}" * } - if$ - } - if$ -} - - - -FUNCTION {springer.publisher} -{publisher #1 #8 substring$ "Springer" = - { "Springer" } - { publisher } - if$ -} - -FUNCTION {format.adsurl} -{ - adsurl empty$ - { "" } - {" \href{" adsurl "}" *} - if$ -} - -FUNCTION {format.adsnote} -{ - adsnote empty$ - { "" } - { ". " * adsnote *} - if$ -} - - -FUNCTION {format.soft.title} -{ - title empty$ - { "" } - { title "," *} - if$ -} - -FUNCTION {format.softmisctitle} -{ title empty$ - { ""} - { version empty$ - { title ", " *} - { title ", " * version " " *} - if$ - } - if$ -} - -FUNCTION {format.softmisc.archive} -{ - archivePrefix empty$ - { "" } - { "" } - if$ -} - -FUNCTION {format.archive} -{ - archivePrefix empty$ - { "" } - { archivePrefix ":" *} - if$ -} - -FUNCTION {format.primaryClass} -{ - primaryClass empty$ - { "" } - { "{[" primaryClass * "]}" *} - if$ -} - -FUNCTION {format.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {format.softmisc.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {format.pub.address} -{ publisher empty$ - howpublished empty$ - and - { - address empty$ - 'skip$ - { volume empty$ - 'insert.comma - 'new.sentence - if$ - address - type$ "inproceedings" = - {"conflocation"} - {"location"} - if$ - make.tag output - } - if$ - } - { - address empty$ - { publisher empty$ - {howpublished} - {springer.publisher} - if$ - "publisher" make.tag - #1 bother = - {", \blocation{???}" * } - 'skip$ - if$ - output - } - { - publisher empty$ - {howpublished } - {springer.publisher } - if$ - "publisher" make.tag output - insert.comma - address "location" make.tag output - } - if$ - } - if$ -} - -INTEGERS { nameptr namesleft numnames } - -FUNCTION {mk.tag} -{ 'temp.str := - duplicate$ empty$ - { pop$ "" } - { - b "nothing" = - 'skip$ - { "\b" temp.str * "{" * swap$ * "}" * } - if$ - } - if$ -} - -FUNCTION {space.after.dot} -{'j := - t 'f := - j 't := - s 'j := - "" 'l := - "" 's := - { t empty$ not } - { - t #1 #3 substring$ "{-}" = - { l " {q}. " * 'l := - t #4 global.max$ substring$ 't := - } - 'skip$ - if$ - - t #1 #1 substring$ 's := - l s * 'l := - s "." = - { - t #2 #1 substring$ " " = - 'skip$ - { - l " " * 'l := - t #2 #4 substring$ "{\,}" = - { t #5 global.max$ substring$ 't := } - 'skip$ - if$ - } - if$ - } - 'skip$ - if$ - t #2 global.max$ substring$ 't := - } - while$ - f 't := - j 's := - l -} - -FUNCTION {fix.inits}{ - 't := - "" 'element := - { t empty$ not } - { - t #1 #3 substring$ ".q." = - { element ".-" * 'element := - t #3 global.max$ substring$ 't := - } - {element t #1 #1 substring$ * 'element :=} - if$ - - t #2 global.max$ substring$ 't := - } - while$ - element -} - -FUNCTION {fix.snm}{ - 't := - "" 'element := - { t empty$ not } - { - t #1 #3 substring$ "{-}" = - {element "-" * 'element := - t #3 global.max$ substring$ 't := - } - {element t #1 #1 substring$ * 'element :=} - if$ - - t #2 global.max$ substring$ 't := - } - while$ - element -} - -FUNCTION {enbrace.dash}{ - 't := - "" 'element := - { t empty$ not } - { - t #1 #1 substring$ "-" = - {element "{-}" * 'element :=} - {element t #1 #1 substring$ * 'element :=} - if$ - t #2 global.max$ substring$ 't := - } - while$ - element -} - -FUNCTION {fix.name}{ - - enbrace.dash 's := - "" 'l := - "" 't := - - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { - s nameptr "{vv~}{ll}{, jj}" format.name$ - s nameptr "{, ff}" format.name$ space.after.dot * 'l := - #1 nameptr = - {l 't :=} - {t " and " * l * 't := } - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ - t -} - -FUNCTION {name.separator}{ - namesleft #1 > - {", " * } - 'skip$ - if$ -} - -FUNCTION {format.author.editor} -{ 'b := - - bother #1 = - b "nothing" = - or - 'skip$ - {"b" b * 'b :=} - if$ - - b "editor" = - b "beditor" = - b "nothing" = - or or - {editor 's :=} - {author 's :=} - if$ - - %% modifying name - s fix.name 's := - - "" 't := - - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - - s numnames "{ll}" format.name$ 'l := - l "others" = - l "{others}" = - l "et al." = - l "{et al.}" = - or or or - {#1 'tmp :=} - {#0 'tmp :=} - if$ - - { namesleft #0 > } - { s nameptr "{vv}" format.name$ "particle" mk.tag 'v := - s nameptr "{ll}" format.name$ fix.snm "snm" mk.tag 'l := - s nameptr "{f{.}.}" format.name$ fix.inits "inits" mk.tag 'f := - s nameptr "{jj}" format.name$ "suffix" mk.tag 'j := - - - namesleft #1 = - tmp #1 = - and - { b "bauthor" = - b "beditor" = - or - {"et al."} - {"\betal"} - if$ - #1 'tmp := - } - { - b "bauthor" = - b "beditor" = - or - {"\oauthor{"} - { - b "nothing" = - {""} - {"\b" b * "{" *} - if$ - } -%% if$ -%% -%% v empty$ -%% 'skip$ -%% {v * " " *} - if$ - - l empty$ - 'skip$ - { l *} - if$ - - f empty$ - 'skip$ - {", " * f *} - if$ - - j empty$ - 'skip$ - {" " * j *} - if$ - - b "nothing" = - {""} - {"}"} - if$ - - * "" 't := - } - if$ - - name.separator - write$ - - namesleft #1 > - b "nothing" = not - and - { namesleft #2 = - tmp #1 = - and - 'skip$ - 'newline$ - if$ - } - 'skip$ - if$ - - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ -} - -FUNCTION {format.editors} -{ editor empty$ - 'skip$ - { - bother #0 = - { author empty$ - {"editor"} - {"nothing"} - if$ - } - {"editor"} - if$ - format.author.editor - editor num.names$ #1 > - { " (eds.)" } - { " (ed.)" } - if$ - write$ - } - if$ -} - -FUNCTION {format.authors} -{ author empty$ - 'skip$ - {"author" format.author.editor} - if$ -} - -FUNCTION {cite.author.editor} -{ 's := - s #1 "{vv~}{ll}" format.name$ - s num.names$ duplicate$ - #2 > - { pop$ " et~al." * } - { #2 = - { s #2 "{vv~}{ll}{ jj}{ f}" format.name$ "others" = - { " et~al." * } - { " and " * s #2 "{vv~}{ll}" format.name$ * } - if$ - } - 'skip$ - if$ - } - if$ -} - -FUNCTION {check.auth.edit.org} -{author empty$ - { - editor empty$ - { - organization empty$ - {""} - {organization} - if$ - } - {editor cite.author.editor} - if$ - } - {author cite.author.editor} - if$ -} - -FUNCTION {check.year} -{ year empty$ - {""} - {year extra.label *} - if$ -} - -INTEGERS { multiresult char.num k int} -INTEGERS {str.length count return save.num1 save.num2} -FUNCTION {is.in.list}{ - 'f := - %%%% saveing "s" and "t" - s 'j := - f 's := - t 'f := - list.string text.length$ 'str.length := - list.string 't := -% s text.length$ 'slen := - int 'save.num1 := - count 'save.num2 := - #1 'int := - #1 'count := - #0 'return := - - { count str.length = not - #0 str.length = not - and - } - { - count #1 + 'count := - t int #1 substring$ "," = - { - t #1 int substring$ s "," * = - { - #1 'return := - str.length 'count := - } - 'skip$ - if$ - - int #1 + 'int := - t int global.max$ substring$ 't := - #0 'int := - } - 'skip$ - if$ - int #1 + 'int := - } - while$ - - save.num1 'int := - save.num2 'count := - - #0 return = - { s t = - {#1 'return :=} - 'skip$ - if$ - } - 'skip$ - if$ - %%%% returning original "s" and "t" - j 's := - f 't := - - return -} - -INTEGERS {bibitem.count} - -FUNCTION {print.count} -{ bibitem.count #1 + 'bibitem.count := - newline$ - "%%% " - bibitem.count int.to.str$ * write$ -} - - -FUNCTION {output.bibitem} -{ print.count - newline$ - "\bibitem[\protect\citeauthoryear{" write$ - check.auth.edit.org write$ - "}{" write$ - check.year write$ - "}]{" write$ - cite$ write$ - "}" write$ - newline$ - "" before.all 'output.state := -} - - - - -FUNCTION {string.to.integer} -{ 't := - t text.length$ 'k := - #1 'char.num := - { t char.num #1 substring$ 's := - s is.num - s "." = - or - char.num k = not - and - } - { char.num #1 + 'char.num := } - while$ - char.num #1 - 'char.num := - t #1 char.num substring$ -} - - -FUNCTION {find.integer} -{ 't := - #0 'int := - { int not - t empty$ not - and - } - { t #1 #1 substring$ 's := - s is.num - {#1 'int :=} - { t #2 global.max$ substring$ 't := } - if$ - } - while$ - int -} - -function{title.lowerwords}{ -"a,an,and,of,the,for,in,to,over,from,on,or,so,than,that,this,as,but,with,by,at,down,up,upon,al,ale,aus,aux,d'Analyse,d'Analystes,d'Architecture,d'Etudes,d'Histoire,da,dans,de,degli,dei,del," -"dell',dell'Accademia,dell'Istituto,dell'Universita,della,delle,dem,der,des,detta,di,die,din,dlia,do,du,e,eXpress,ed,ego,el,em,en,et,fur,i,iz,l'Academie,l'Age,l'Antiquite," * -"l'Approximation,l'Ecole,l'Histoire,l'I.S.U.P.,l'INSA,l'IREM,l'Indirizzo,l'Institut,l'Institute,l'UFR,l'Union,l'Universite,la,las,les,na,nella,per,po,si,sue,sur,ta,tes,und,van,voor,zu,zum,zur" * -} - -FUNCTION {upercase.first.letters}{ - 't := - "" 's := - #1 'int := - #1 'count := - list.string 'v := - "" 'b := - title.lowerwords 'list.string := - - t text.length$ 'slen := - - {count slen = not } - {t int #1 substring$ " " = - { - int #1 - 'int := - t #1 int substring$ 'b := - - % if word not in title.lowerwords - uppercase first letter - b is.in.list not - { b "l" change.case$ b = - { b "u" change.case$ "t" change.case$ 'b := } - 'skip$ - if$ - } - 'skip$ - if$ - - int #1 + 'int := - - s b " " * * 's := - int #1 + 'int := - t int global.max$ substring$ 't := - #0 'int := - } - 'skip$ - if$ - int #1 + 'int := - count #1 + 'count := -% "count=" count int.to.str$ * " slen=" * slen int.to.str$ * top$ - } - while$ - v 'list.string := - % last word is "t" and need to check it too - s t - t "l" change.case$ t = - { "u" change.case$ "t" change.case$ } - 'skip$ - if$ - * -} - - -FUNCTION {format.title} -{ title empty$ - { "" } - { title - "article" type$ = - type$ "techreport" = - type$ "inbook" = - type$ "inproceedings" = - type$ "incollection" = - type$ "phdthesis" = - type$ "mastersthesis" = - or or or or or or - {"t" change.case$} - { type$ "unpublished" = - type$ "misc" = - or - 'skip$ - 'upercase.first.letters - if$ - } - if$ - } - if$ -} - - -FUNCTION {note.presented} -{ note #1 #9 substring$ "presented" = - note #1 #9 substring$ "Presented" = - or -} - -FUNCTION {n.filter} -{ 't := - "" - { t empty$ not } - { t #1 #1 substring$ "," = - t #1 #1 substring$ "\" = - t #1 #1 substring$ "~" = - or or - { "" * - t #2 global.max$ substring$ 't := - } - { t #1 #1 substring$ * - t #2 global.max$ substring$ 't := - } - if$ - } - while$ -} - -FUNCTION {byear} -{ duplicate$ empty$ - { pop$ "" } - { 't := - t text.length$ 'sk := - #5 sk = - { t #1 #4 substring$ 's := - t #5 #1 substring$ 'longest.label := - longest.label is.num not - {s "year" make.tag - "nameyear" is.in.list - {longest.label * } - 'skip$ - if$ - } - {t "year" make.tag } - if$ - } - { t "year" make.tag - "nameyear" is.in.list - {extra.label *} - 'skip$ - if$ - } - if$ - } - if$ -} - -FUNCTION {format.date} -{ year empty$ - { "" } - { year byear } - if$ -} - -FUNCTION {parens} -{ "(" swap$ * ")" * } - -FUNCTION {format.date.parens} -{ year empty$ - { "" } - { year byear parens } - if$ -} - -FUNCTION {noparens} -{ " " swap$ * "" * } - -FUNCTION {format.softmiscdate} -{ year empty$ - { "" } - { year byear parens } - if$ -} - -FUNCTION {format.month}{ - month empty$ - {""} - {month sort.format.month "confdate" make.tag} - if$ -} - -FUNCTION {formatpatent.date} -{ year empty$ - 'skip$ - { month empty$ - { year } - {format.month " " * year *} - if$ - } - if$ -} - -FUNCTION {month.year.date} -{ year empty$ - {""} - { month empty$ - {year byear} - { format.month " " * year byear * } - if$ - type$ "inproceedings" = - 'skip$ - {"(" swap$ * ")" * } - if$ - } - if$ -} - -FUNCTION {tie.or.space.connect} -{ duplicate$ text.length$ #3 < - { "~" } - { " " } - if$ - swap$ * * -} -FUNCTION {format.volume} -{ volume empty$ - { "book" type$ = - {number empty$ - {""} - {"vol. " number "seriesno" make.tag *} - if$ - } - {""} - if$ - } - {"vol. " volume "seriesno" make.tag *} - if$ -} -FUNCTION {format.volume2} -{ volume empty$ - {""} - {"vol. " volume "seriesno" make.tag *} - if$ -} - -FUNCTION {format.art.vol} -{ - volume empty$ - {""} - {volume n.filter "volume" make.tag} - if$ - number empty$ - 'skip$ - { "(" number "issue" make.tag * ")" * * } - if$ -} - -FUNCTION {format.series} -{ series empty$ - 'skip$ - {series "sertitle" make.tag} - if$ -} - -FUNCTION {format.edition} -{ edition empty$ - { "" } - { "" 'v := - "" 'l := - "" 'f := - edition "l" change.case$ 's := - "1" s = - "first" s = - or - { - "1" 'v := - "st" 'l := - } - { - "2" s = - "second" s = - or - { - "2" 'v := - "nd" 'l := - } - { - "3" s = - "third" s = - or - { - "3" 'v := - "rd" 'l := - } - { - "4" s = - "fourth" s = - or - { - "4" 'v := - "th" 'l := - } - { - "5" s = - "fifth" s = - or - { - "5" 'v := - "th" 'l := - } - { - "6" s = - "sixth" s = - or - { - "6" 'v := - "th" 'l := - } - { - "7" s = - "seventh" s = - or - { - "7" 'v := - "th" 'l := - } - { - "8" s = - "eighth" s = - or - { - "8" 'v := - "th" 'l := - } - { - "9" s = - "nineth" s = - or - { - "9" 'v := - "th" 'l := - } - { - edition "t" change.case$ 'f := - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - #0 bother = - { f "" = - { v l * 'f :=} - 'skip$ - if$ - } - { f "" = - { "\bedition{" v * "}" * l * 'f :=} - { "\bedition{" f * "}" * 'f :=} - if$ - } - if$ - f " edn." * - } - if$ -} -FUNCTION {format.isbn} -{ isbn empty$ - { "" } - { isbn "isbn" make.tag} - if$ -} - -INTEGERS {default.info} - - -FUNCTION {multi.page.check} -{ 't := - #0 'multiresult := - "" 'l := - - {t empty$ not} - { t #1 #1 substring$ 's := - - s is.num not - { "" l = not - {t find.integer - {#1 'multiresult := } - {#0 'multiresult := } - if$ - "" 't := - } - { - t #2 global.max$ substring$ 't := - } - if$ - } - { l s * 'l := - t #2 global.max$ substring$ 't := - } - if$ - } - while$ - multiresult -} -FUNCTION {clearpage} -{ 't := - "" 's := - "" 'l := - - { t empty$ not } - { - t #1 #1 substring$ 's := - s is.num not - 'skip$ - { l s * 'l := } - if$ - t #2 global.max$ substring$ 't := - } - while$ - l - -} -FUNCTION {do.pages} -{'t := - "" 'j := - "" 'v := - {t empty$ not} - { t #1 #1 substring$ 's := - s is.num not - s "," = not - and - { "" j = - { - t #2 global.max$ substring$ 't := - } - {t find.integer - { t clearpage 'v := } - 'skip$ - if$ - "" 't := - } - if$ - } - { j s * 'j := - t #2 global.max$ substring$ 't := - } - if$ - } - while$ - j clearpage 'j := - j "fpage" make.tag - "cnd" is.in.list - 'skip$ - {"--" * v "lpage" make.tag *} - if$ -} - - -FUNCTION {format.pages} -{ pages empty$ - { "" } - { pages multi.page.check - {type$ "article" = - {""} - {"cnd" is.in.list - {"p. "} - {"pp. "} - if$ - } - if$ - pages do.pages * - } - {type$ "article" = - {""} - {"p. "} - if$ - pages clearpage "fpage" make.tag * - } - - if$ - } - if$ -} - -FUNCTION {replace.tilde} -{ 't := - "" - { t empty$ not } - { t #1 #1 substring$ "~" = - { { t #1 #1 substring$ "~" = } - { "\texttildelow " * - t #2 global.max$ substring$ 't := - } - while$ - } - { t #1 #1 substring$ * - t #2 global.max$ substring$ 't := - } - if$ - } - while$ -} - - -FUNCTION {format.url} -{ url empty$ - 'skip$ - { type$ "article" = - 'skip$ - { #0 bother = - { "\url{" } - { "\burl{" } - if$ - url replace.tilde * "}" * - output - } - if$ - - urldate empty$ - 'skip$ - { "Accessed " urldate * output } - if$ - } - if$ -} - - -FUNCTION {publisher.month.pages}{ - publisher empty$ series empty$ and - { address empty$ - 'skip$ - 'new.sentence - if$ - format.pub.address - - pages empty$ - 'skip$ - {insert.comma} - if$ - format.pages output - - } - { - pages empty$ - 'skip$ - {insert.comma} - if$ - format.pages output - publisher empty$ - 'skip$ - {new.sentence} - if$ - format.pub.address - } - if$ -} - -function{process.doi}{ - doi 't := - "" 'b := - #1 'int := -% "doi =" t * top$ - - t text.length$ 'slen := - - {int slen = not } - {t int #3 substring$ "10." = - { - t int #1 - #1 substring$ 'b := - b "" = - {"a" 'b :=} % if b is empty need to set a letter - 'skip$ - if$ - - b is.num not - { - t int slen int - #1 + substring$ 't := - slen #1 - 'int := - } - 'skip$ - if$ - - } - 'skip$ - if$ - int #1 + 'int := - } - while$ - t -} - -FUNCTION {format.doi} -{ doi empty$ - {""} - { - "nodoi" is.in.list - {""} - %%{"doi:\doiurl{" process.doi * "}" * } - {"\doiurl{" process.doi * "} " * } - if$ - } - if$ -} - -FUNCTION {format.in.ed.booktitle} -{ booktitle empty$ - {#1 bother = - "cnd" is.in.list not - and - { editor empty$ - 'skip$ - { "In: " output write$ format.editors } - if$ - } - 'skip$ - if$ - } - { editor empty$ - { "In: " booktitle upercase.first.letters "btitle" make.tag * output} - { "In: " output write$ format.editors "" %%% pushing empty string to the empty stack - booktitle upercase.first.letters "btitle" make.tag output - } - if$ - } - - if$ -} - -FUNCTION {format.in.ed} -{ title empty$ - 'skip$ - { editor empty$ - { title "btitle" make.tag output} - { author empty$ - { format.editors - stupid.colon - %format.date output - title "btitle" make.tag output - } - { "In: " output write$ format.editors "" %%% pushing empty string to the empty stack - title "btitle" make.tag output - } - if$ - } - if$ - } - if$ -} - -FUNCTION {format.tr.number} -{ type empty$ - { "Technical Report" } - 'type - if$ - number empty$ - { "t" change.case$ } - { number tie.or.space.connect } - if$ -} - -FUNCTION {patent.number} -{ number empty$ - 'skip$ - { number } - if$ -} -INTEGERS { len } - -FUNCTION {chop.word} -{ 's := - 'len := - s #1 len substring$ = - { s len #1 + global.max$ substring$ } - 's - if$ -} - -FUNCTION {format.inpres} -{ "l" change.case$ 't := - "in press: " #10 - "in press. " #10 - "in press " #9 t chop.word - chop.word - chop.word - #1 global.max$ substring$ -} - -FUNCTION {bcomment.note} -{ note empty$ - 'skip$ - {note format.inpres "comment" make.tag output} - if$ -} - -FUNCTION {empty.misc.check} -{ author empty$ title empty$ howpublished empty$ - month empty$ year empty$ note empty$ - and and and and and - { "all relevant fields are empty in " cite$ * warning$ } - 'skip$ - if$ -} - -FUNCTION {format.thesis.type} -{ type empty$ - 'skip$ - { pop$ - type "t" change.case$ - } - if$ -} - -FUNCTION {format.chapter.and.note} -{ note empty$ chapter empty$ organization empty$ and and - 'skip$ - { chapter empty$ - "notnumber" last.label = - or - {organization empty$ - { note "comment" make.tag output } - { note empty$ - { organization "comment" make.tag output } - { organization ". " * note * "comment" make.tag output } - if$ - } - if$ - } - { note empty$ - { "Chap. " chapter * "comment" make.tag output} - { type empty$ - { "Chap. " } - { type "t" change.case$ "Section" = - { "Sect. " } - { "Chap. " } - if$ - } - if$ - chapter * ". " * note * "comment" make.tag output - } - if$ - } - if$ - } - if$ -} - -FUNCTION {item.end} -{ chapter empty$ - type$ "unpublished" = not - type$ "misc" = not - and and - { new.sentence - format.doi output - } - 'skip$ - if$ - - type$ "unpublished" = - type$ "misc" = - or - { note empty$ - 'skip$ - {note.presented - 'skip$ - {new.sentence note output} - if$ - } - if$ - format.date.parens output - } - { new.sentence - type$ "proceedings" = - { author empty$ editor empty$ and - 'bcomment.note - 'format.chapter.and.note - if$ - } - 'format.chapter.and.note - if$ - } - if$ - list.string 'v := - default.list 'list.string := - - type$ ".isbn" * is.in.list - "cnd" is.in.list - or - { - new.sentence -% format.isbn output - } - 'skip$ - if$ - new.sentence - %% commented by SPi as we are using format.eprint %% - %% and also to avoide eprint being printed twice - Start %% - %%eprint empty$ - %% 'skip$ - %% {"\arxivurl{" eprint * "}" * output} - %%if$ - %% End %% - chapter empty$ - type$ "unpublished" = not - type$ "misc" = not - and and - 'skip$ - { new.sentence - format.doi output - } - if$ - new.sentence - format.url - v 'list.string := - fin.entry -} - -FUNCTION {article.item.end} -{ chapter empty$ - type$ "unpublished" = not - type$ "misc" = not - and and - { new.sentence -% format.doi output - } - 'skip$ - if$ - - type$ "unpublished" = - type$ "misc" = - or - { note empty$ - 'skip$ - {note.presented - 'skip$ - {new.sentence note output} - if$ - } - if$ - format.date.parens output - } - { new.sentence - type$ "proceedings" = - { author empty$ editor empty$ and - 'bcomment.note - 'format.chapter.and.note - if$ - } - 'format.chapter.and.note - if$ - } - if$ - list.string 'v := - default.list 'list.string := - - type$ ".isbn" * is.in.list - "cnd" is.in.list - or - { - new.sentence -% format.isbn output - } - 'skip$ - if$ - new.sentence - %% commented by SPi as we are using format.eprint %% - %% and also to avoide eprint being printed twice - Start %% - %%eprint empty$ - %% 'skip$ - %% {"\arxivurl{" eprint * "}" * output} - %%if$ - %% End %% - chapter empty$ - type$ "unpublished" = not - type$ "misc" = not - and and - 'skip$ - { new.sentence -%% format.doi output - } - if$ - new.sentence - format.url - v 'list.string := - fin.entry -} - - -FUNCTION {insert.element} -{ #0 bother = - { element "{botherref}" * write$ newline$} - { - type$ "article" = - {element "{barticle}" * write$ newline$} - 'skip$ - if$ - type$ "book" = - type$ "proceedings" = - type$ "manual" = - type$ "booklet" = - or or or - {element "{bbook}" * write$ newline$} - 'skip$ - if$ - - type$ "inbook" = - { "notnumber" last.label = - {element "{bchapter}" * write$ newline$} - {element "{bbook}" * write$ newline$} - if$ - } - 'skip$ - if$ - - type$ "incollection" = - type$ "inproceedings" = - type$ "conference" = - or or - {element "{bchapter}" * write$ newline$} - 'skip$ - if$ - } - if$ -} - -FUNCTION {end.element} -{ "\end" 'element := - item.end - insert.element - "\endbibitem" write$ newline$ -} - -FUNCTION {article.end.element} -{ "\end" 'element := - article.item.end - insert.element - "\endbibitem" write$ newline$ -} - - -FUNCTION {begin.element} -{ "\begin" 'element := - insert.element -} -function {set.options}{ - options empty$ - 'skip$ - {options 'list.string :=} - if$ -} - -FUNCTION {settings} -{} - -FUNCTION {article} -{ output.bibitem - author empty$ - institution empty$ - editor empty$ - and and - journal empty$ - or - year empty$ - or - % above tagging rule means: - % nead: (volume & (pages or number) ) or (doi [without volume, pages and number]) - volume empty$ not - pages empty$ not bnumber empty$ not or - and - - volume empty$ pages empty$ bnumber empty$ and and - doi empty$ not and - or - not - or - {#0 'bother :=} - {#1 'bother :=} - if$ - begin.element - author empty$ - { editor empty$ - 'skip$ - {format.editors stupid.colon} - if$ - } - { format.authors stupid.colon} - if$ - "cnd" is.in.list - { - journal empty$ - {format.title "atitle" make.tag "title" output.check} - {journal "jtitle" make.tag output} - if$ - } - { - format.title "atitle" make.tag "title" output.check - journal empty$ - 'skip$ - {new.sentence journal "jtitle" make.tag output} - if$ - } - if$ - format.art.vol output - pages empty$ - 'skip$ - {insert.comma} - if$ - format.pages output - format.date.parens output - format.doi output - format.eprint output - format.primaryClass output - article.end.element -} - - -FUNCTION {patent} -{ output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "title" output.check - add.period$ - patent.number output - insert.comma - formatpatent.date output - end.element -} - -FUNCTION { other } { patent } - -FUNCTION {book} -{ output.bibitem - author empty$ - institution empty$ - organization empty$ - editor empty$ - and and and - title empty$ - year empty$ - or or - {#0 'bother :=} - { - publisher empty$ address empty$ not and - {#0 'bother :=} - {#1 'bother :=} - if$ - } - if$ - begin.element - author empty$ - { editor empty$ - 'skip$ - {format.editors stupid.colon} - if$ - } - { format.authors stupid.colon} - if$ - format.title "btitle" make.tag "title" output.check - series empty$ - { - format.volume output - insert.comma - format.edition output - } - { edition empty$ - 'skip$ - 'insert.comma - if$ - format.edition output - new.sentence - format.series output - insert.comma - format.volume output - } - if$ - publisher.month.pages - format.date.parens output - end.element -} - -FUNCTION {booklet} -{output.bibitem - author empty$ - title empty$ - year empty$ - howpublished empty$ - or or or - {#0 'bother :=} - {#1 'bother :=} - if$ - - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "btitle" make.tag "title" output.check - address empty$ publisher empty$ howpublished empty$ and and - 'skip$ - 'new.sentence - if$ - format.pub.address - format.date.parens output - end.element -} - -FUNCTION {misc} -{output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "btitle" make.tag "title" output.check - address empty$ publisher empty$ howpublished empty$ and and - 'skip$ - 'new.sentence - if$ - format.pub.address - end.element -} - -FUNCTION {softmisc} -{output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors} - if$ - stupid.colon - format.title "btitle" make.tag "title" output.check - insert.comma - version output - insert.comma - %%address empty$ publisher empty$ howpublished empty$ and and - %%'skip$ - %% 'new.sentence - %%if$ - format.pub.address - format.softmiscdate output - insert.comma - format.softmisc.eprint output - end.element -} - -FUNCTION {inbook} -{ output.bibitem - author empty$ - institution empty$ - organization empty$ - editor empty$ - and and and - title empty$ - year empty$ - or or - {#0 'bother :=} - { - publisher empty$ address empty$ not and - {#0 'bother :=} - {#1 'bother :=} - if$ - } - if$ - - chapter empty$ - { "" 'last.label :=} - { chapter string.to.integer empty$ author empty$ not and - { "notnumber" 'last.label :=} - { "" 'last.label :=} - if$ - } - if$ - - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - "notnumber" last.label = - { chapter "ctitle" make.tag output - add.period$ - } - 'skip$ - if$ - format.in.ed - series empty$ - { - insert.comma - format.volume output - insert.comma - format.edition output - new.sentence - } - { - insert.comma - format.edition output - new.sentence - format.series output - volume empty$ - 'skip$ - 'insert.comma - if$ - format.volume output - } - if$ - publisher.month.pages - publisher empty$ address empty$ edition empty$ series empty$ pages empty$ volume empty$ and and and and and - 'insert.comma - 'skip$ - if$ - format.date.parens output - end.element -} -FUNCTION {incollection} -{ output.bibitem - author empty$ - institution empty$ - and - booktitle empty$ - title empty$ - year empty$ - or or or - {#0 'bother :=} - { - publisher empty$ address empty$ not and - {#0 'bother :=} - {#1 'bother :=} - if$ - } - if$ - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - - "cnd" is.in.list - { - booktitle empty$ title empty$ not and - { - format.title "ctitle" make.tag "title" output.check - new.sentence - } - 'skip$ - if$ - } - { - format.title "ctitle" make.tag "title" output.check - title empty$ - 'skip$ - {new.sentence} - if$ - } - if$ - format.in.ed.booktitle - series empty$ - { - format.volume output - insert.comma - format.edition output - } - { - edition empty$ - 'skip$ - { insert.comma - format.edition output - } - if$ - new.sentence - format.series output - insert.comma - format.volume output - } - if$ - publisher.month.pages - format.date.parens output - end.element -} - -FUNCTION {inproceedings} -{ output.bibitem - author empty$ - institution empty$ - and - title empty$ - year empty$ - or or - {#0 'bother :=} - {#1 'bother :=} - if$ - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - - "cnd" is.in.list - { - booktitle empty$ title empty$ not and - { - format.title "ctitle" make.tag "title" output.check - new.sentence - } - 'skip$ - if$ - } - { - format.title "ctitle" make.tag "title" output.check - title empty$ booktitle empty$ not and - 'skip$ - {new.sentence} - if$ - } - if$ - - format.in.ed.booktitle - series empty$ - 'skip$ - {new.sentence format.series output} - if$ - volume empty$ address empty$ publisher empty$ and and - 'skip$ - 'insert.comma - if$ - format.volume output - publisher.month.pages - format.date.parens output - end.element -} - -FUNCTION {conference} { inproceedings } - -FUNCTION {manual} -{ output.bibitem - author empty$ - organization empty$ - title empty$ - year empty$ - address empty$ - or or or or - {#0 'bother :=} - {#1 'bother :=} - if$ - begin.element - - author empty$ - { organization empty$ - 'skip$ - { organization "publisher" make.tag output.nonnull - stupid.colon% add.period$ - } - if$ - } - { format.authors stupid.colon} - if$ - title empty$ - 'skip$ - {format.title "btitle" make.tag output} - if$ - edition empty$ - {new.sentence} - {insert.comma} - if$ - format.edition output - edition empty$ - 'skip$ - {new.sentence} - if$ - author empty$ organization empty$ - or - 'skip$ - { organization "publisher" make.tag output.nonnull - insert.comma - } - if$ - address empty$ - 'skip$ - {address "location" make.tag output} - if$ - format.date.parens output - end.element -} - - -FUNCTION {phdthesis} -{output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "title" output.check - new.sentence - type$ "mastersthesis" = - {"Master's thesis" format.thesis.type output.nonnull} - {"PhD thesis" format.thesis.type output.nonnull} - if$ - school empty$ - 'skip$ - 'insert.comma - if$ - school "school" output.check - address empty$ - 'skip$ - 'insert.comma - if$ - address output - month.year.date output - end.element -} -FUNCTION {mastersthesis}{phdthesis} - - -FUNCTION {proceedings} -{ output.bibitem - author empty$ - institution empty$ - organization empty$ - editor empty$ - and and and - title empty$ - year empty$ - or or - {#0 'bother :=} - { - publisher empty$ address empty$ not and - {#0 'bother :=} - {#1 'bother :=} - if$ - } - if$ - - begin.element - author empty$ - { editor empty$ - {organization "institutionaled" make.tag "organization" output.check } - { format.editors } - if$ - } - { format.authors } - if$ - stupid.colon - format.title "btitle" make.tag output - series empty$ - 'skip$ - {new.sentence format.series output} - if$ - volume empty$ - 'skip$ - 'insert.comma - if$ - format.volume output - publisher.month.pages - format.date.parens output - end.element -} - -FUNCTION {techreport} -{ output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "title" output.check - new.sentence - format.tr.number output.nonnull - institution empty$ - 'skip$ - 'insert.comma - if$ - institution "institution" output.check - address empty$ - 'skip$ - 'insert.comma - if$ - address output - month.year.date output - end.element -} - -FUNCTION {unpublished} -{ output.bibitem - #0 'bother := - - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "title" output.check - note empty$ - 'skip$ - { note.presented - {note output} - 'skip$ - if$ - } - if$ - end.element -} - -FUNCTION {default.type} { unpublished } - -MACRO {jan} {"January"} -MACRO {feb} {"February"} -MACRO {mar} {"March"} -MACRO {apr} {"April"} -MACRO {may} {"May"} -MACRO {jun} {"June"} -MACRO {jul} {"July"} -MACRO {aug} {"August"} -MACRO {sep} {"September"} -MACRO {oct} {"October"} -MACRO {nov} {"November"} -MACRO {dec} {"December"} - -READ - -EXECUTE {identify.mathphys.version} - -FUNCTION {sortify} -{ purify$ - "l" change.case$ -} - -INTEGERS { et.al.char.used } - -FUNCTION {initialize.et.al.char.used} -{ #0 'et.al.char.used := -} - -%%%%% setting default options -FUNCTION {set.default.opt} -{"unsort" 'list.string :=} -%%{"alpha" 'list.string :=} - -EXECUTE {set.default.opt} - -FUNCTION {assign.opt}{ - % First need to set options - "settings" type$ = - { options empty$ - 'skip$ - {options 'list.string :=} - if$ - } - 'skip$ - if$ -} - -ITERATE {assign.opt} -EXECUTE {initialize.et.al.char.used} - -FUNCTION {alpha.format.lab.names} -{ 's := - s num.names$ 'numnames := - numnames #1 > - { numnames #4 > - { #3 'namesleft := } - { numnames 'namesleft := } - if$ - #1 'nameptr := - "" - { namesleft #0 > } - { nameptr numnames = - { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" = - { "+" * - #1 'et.al.char.used := - } - { s nameptr "{v{}}{l{}}" format.name$ * } - if$ - } - { s nameptr "{v{}}{l{}}" format.name$ * } - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ - numnames #4 > - { "+" * - #1 'et.al.char.used := - } - 'skip$ - if$ - } - { s #1 "{v{}}{l{}}" format.name$ - duplicate$ text.length$ #2 < - { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ } - 'skip$ - if$ - } - if$ -} - -FUNCTION {standard.format.lab.names} -{ 's := - s #1 "{vv~}{ll}" format.name$ - s num.names$ duplicate$ - #2 > - { pop$ " et~al." * } - { #2 < - 'skip$ - { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = - { " et~al." * } - { " and " * s #2 "{vv~}{ll}" format.name$ * } - if$ - } - if$ - } - if$ -} -FUNCTION {format.lab.names}{ - "alpha" is.in.list - 'alpha.format.lab.names - 'standard.format.lab.names - if$ -} - -FUNCTION {author.key.label} -{ author empty$ - { key empty$ - { cite$ #1 #3 substring$ } - { key #3 text.prefix$ } - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {author.editor.key.label} -{ author empty$ - { editor empty$ - { key empty$ - { "zzz" } - { key #3 text.prefix$ } - if$ - } - { editor format.lab.names } - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {author.key.organization.label} -{ author empty$ - { key empty$ - { organization empty$ - { "zzz" } - { "The " #4 organization chop.word #3 text.prefix$ } - if$ - } - { key #3 text.prefix$ } - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {editor.key.organization.label} -{ editor empty$ - { key empty$ - { organization empty$ - { "zzz" } - { "The " #4 organization chop.word #3 text.prefix$ } - if$ - } - { key #3 text.prefix$ } - if$ - } - { editor format.lab.names } - if$ -} - -FUNCTION {calc.short.authors} -{ type$ "book" = - type$ "inbook" = - or - 'author.editor.key.label - { type$ "proceedings" = - 'editor.key.organization.label - { type$ "manual" = - 'author.key.organization.label - 'author.key.label - if$ - } - if$ - } - if$ - 'short.list := -} - -FUNCTION {calc.label} -{ calc.short.authors - short.list - - "alpha" is.in.list - { - duplicate$ - year field.or.null purify$ #-1 #2 substring$ - * - 'label := - year field.or.null purify$ #-1 #4 substring$ - * - sortify 'sort.label := - } - { - "(" - * - year duplicate$ empty$ - short.list key field.or.null = or - { pop$ "" } - 'skip$ - if$ - * - 'label := - label 'sort.label := - } - if$ -} - -FUNCTION {sort.format.names} -{ 's := - #1 'nameptr := - "" - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { nameptr #1 > - { " " * - "alpha" is.in.list - 'skip$ - {numnames int.to.str$ * " " *} - if$ - } - 'skip$ - if$ - s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := - nameptr numnames = - t "others" = - and - { "et al" * } - { t sortify * } - if$ - #3 numnames < - "alpha" is.in.list not - and - {#0 'namesleft := - " zzz " * - } - { - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - if$ - } - while$ -} - -FUNCTION {sort.format.title} -{ 't := - "A " #2 - "An " #3 - "The " #4 t chop.word - chop.word - chop.word - sortify - #1 global.max$ substring$ -} - -FUNCTION {author.sort} -{ author empty$ - { key empty$ - { "to sort, need author or key in " cite$ * warning$ - "zzz" - } - { key sortify } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {author.editor.sort} -{ author empty$ - { editor empty$ - { key empty$ - { "to sort, need author, editor, or key in " cite$ * warning$ - "z" - } - { key sortify } - if$ - } - { editor sort.format.names } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {author.organization.sort} -{ author empty$ - { organization empty$ - { key empty$ - { "to sort, need author, organization, or key in " cite$ * warning$ - "z" - } - { key sortify } - if$ - } - { "The " #4 organization chop.word sortify } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {editor.organization.sort} -{ editor empty$ - { organization empty$ - { key empty$ - { "to sort, need editor, organization, or key in " cite$ * warning$ - "z" - } - { key sortify } - if$ - } - { "The " #4 organization chop.word sortify } - if$ - } - { editor sort.format.names } - if$ -} - -FUNCTION {presort} -{ calc.label - sort.label sortify - " " - * - type$ "book" = - type$ "inbook" = - or - {author empty$ - 'editor.organization.sort - 'author.organization.sort - if$ - } - { type$ "proceedings" = - type$ "incollection" = - or - {author empty$ - 'editor.organization.sort - 'author.organization.sort - if$ - } - { type$ "manual" = - 'author.organization.sort - 'author.sort - if$ - } - if$ - } - if$ - " " - * - year field.or.null sortify - * - " " - * - title field.or.null - sort.format.title - * - #1 entry.max$ substring$ 'sort.label := - sort.label * - #1 entry.max$ substring$ 'sort.key$ := - - "settings" type$ = - {"aaa"} - {"unsort" is.in.list - {"bb"} - {"alpha" is.in.list - {sort.key$} - {sort.label} - if$ - } - if$ - } - if$ - 'sort.key$ := -} - - -ITERATE {presort} - -SORT - -INTEGERS { longest.label.width last.extra.num number.label } - -FUNCTION {initialize.longest.label} -{ "" 'longest.label := - #0 int.to.chr$ 'last.label := - "" 'j := - #0 'longest.label.width := - #0 'last.extra.num := - #0 'number.label := -} - -FUNCTION {forward.pass} -{ last.label label = - { last.extra.num #1 + 'last.extra.num := - last.extra.num int.to.chr$ 'extra.label := - } - { "a" chr.to.int$ 'last.extra.num := - "" 'extra.label := - label 'last.label := - } - if$ - number.label #1 + 'number.label := -} - -FUNCTION {reverse.pass} -{ j "b" = - { "a" 'extra.label := } - 'skip$ - if$ - extra.label 'j := - label extra.label * 'label := -} - -EXECUTE {initialize.longest.label} - -ITERATE {forward.pass} - -REVERSE {reverse.pass} - -FUNCTION {write.preambule} -{ "%% BioMed_Central_Bib_Style_v1.01" write$ newline$ newline$ - "\begin{thebibliography}{" number.label int.to.str$ * "}" * write$ newline$ - "% BibTex style file: bmc-mathphys.bst (version 2.1), 2014-07-24" write$ newline$ - "\ifx \bisbn \undefined \def \bisbn #1{ISBN #1}\fi" write$ newline$ - "\ifx \binits \undefined \def \binits#1{#1}\fi" write$ newline$ - "\ifx \bauthor \undefined \def \bauthor#1{#1}\fi" write$ newline$ - "\ifx \batitle \undefined \def \batitle#1{#1}\fi" write$ newline$ - "\ifx \bjtitle \undefined \def \bjtitle#1{#1}\fi" write$ newline$ - "\ifx \bvolume \undefined \def \bvolume#1{\textbf{#1}}\fi" write$ newline$ - "\ifx \byear \undefined \def \byear#1{#1}\fi" write$ newline$ - "\ifx \bissue \undefined \def \bissue#1{#1}\fi" write$ newline$ - "\ifx \bfpage \undefined \def \bfpage#1{#1}\fi" write$ newline$ - "\ifx \blpage \undefined \def \blpage #1{#1}\fi" write$ newline$ - "\ifx \burl \undefined \def \burl#1{\textsf{#1}}\fi" write$ newline$ - %%"\ifx \doiurl \undefined \def \doiurl#1{\textsf{#1}}\fi" write$ newline$ - "\ifx \doiurl \undefined \def \doiurl#1{\url{https://doi.org/#1}}\fi" write$ newline$ - "\ifx \betal \undefined \def \betal{\textit{et al.}}\fi" write$ newline$ - "\ifx \binstitute \undefined \def \binstitute#1{#1}\fi" write$ newline$ - "\ifx \binstitutionaled \undefined \def \binstitutionaled#1{#1}\fi" write$ newline$ - "\ifx \bctitle \undefined \def \bctitle#1{#1}\fi" write$ newline$ - "\ifx \beditor \undefined \def \beditor#1{#1}\fi" write$ newline$ - "\ifx \bpublisher \undefined \def \bpublisher#1{#1}\fi" write$ newline$ - "\ifx \bbtitle \undefined \def \bbtitle#1{#1}\fi" write$ newline$ - "\ifx \bedition \undefined \def \bedition#1{#1}\fi" write$ newline$ - "\ifx \bseriesno \undefined \def \bseriesno#1{#1}\fi" write$ newline$ - "\ifx \blocation \undefined \def \blocation#1{#1}\fi" write$ newline$ - "\ifx \bsertitle \undefined \def \bsertitle#1{#1}\fi" write$ newline$ - "\ifx \bsnm \undefined \def \bsnm#1{#1}\fi" write$ newline$ - "\ifx \bsuffix \undefined \def \bsuffix#1{#1}\fi" write$ newline$ - "\ifx \bparticle \undefined \def \bparticle#1{#1}\fi" write$ newline$ - "\ifx \barticle \undefined \def \barticle#1{#1}\fi" write$ newline$ - "\bibcommenthead" write$ newline$ -} - - -FUNCTION {begin.bib} -{ preamble$ empty$ - 'skip$ - { preamble$ write$ newline$ } - if$ - write.preambule - "\ifx \bconfdate \undefined \def \bconfdate #1{#1}\fi" write$ newline$ - "\ifx \botherref \undefined \def \botherref #1{#1}\fi" write$ newline$ - "\ifx \url \undefined \def \url#1{\textsf{#1}}\fi" write$ newline$ - "\ifx \bchapter \undefined \def \bchapter#1{#1}\fi" write$ newline$ - "\ifx \bbook \undefined \def \bbook#1{#1}\fi" write$ newline$ - "\ifx \bcomment \undefined \def \bcomment#1{#1}\fi" write$ newline$ - "\ifx \oauthor \undefined \def \oauthor#1{#1}\fi" write$ newline$ - "\ifx \citeauthoryear \undefined \def \citeauthoryear#1{#1}\fi" write$ newline$ - "\ifx \endbibitem \undefined \def \endbibitem {}\fi" write$ newline$ - "\ifx \bconflocation \undefined \def \bconflocation#1{#1}\fi" write$ newline$ - "\ifx \arxivurl \undefined \def \arxivurl#1{\textsf{#1}}\fi" write$ newline$ - "\csname PreBibitemsHook\endcsname" write$ newline$ -} - -EXECUTE {begin.bib} - -EXECUTE {init.state.consts} - -ITERATE {call.type$} - -FUNCTION {end.bib} -{ newline$ - "\end{thebibliography}" write$ newline$ -} - -EXECUTE {end.bib} - - -%% XML output - done for each entry referenced in the BibTeX database -INTEGERS {i ll li j.int global.counter} -STRINGS {lr lp lt ls } - -FUNCTION {replace} -{ - 'lr := % replace string - 'lp := % pattern - 'lt := % text to search - "" 'ls := % result string - lp text.length$ 'll := % length of the search pattern - { lt empty$ not } - { lt #1 ll substring$ lp = - { ls lr * 'ls := - lt ll #1 + global.max$ substring$ 'lt := } - { ls lt #1 #1 substring$ * 'ls := - lt #2 global.max$ substring$ 'lt := } - if$ - } - while$ - ls -} - -FUNCTION {strip.letters} -{ - "" 's := - duplicate$ missing$ - 'pop$ - { - 't := - { t "" = not } - { % ascii '0' = 48, '9' = 57 - t #1 #1 substring$ chr.to.int$ 'i := - i #47 > i #58 < and - { s t #1 #1 substring$ * 's := } - 'skip$ - if$ - t #2 global.max$ substring$ 't := - } - while$ - } - if$ - s -} -FUNCTION {output.xml} -{ duplicate$ "" = - 'pop$ - { " " swap$ * write$ newline$ } - if$ -} - -%% - % markup.xml - % - % Takes 2 args text & tag {"the text " "tag"} - % Returns 1 string {"the text <\tag>"} -%% -FUNCTION {markup.xml} -{ - "" 'v := % result - 't := % tag - duplicate$ missing$ - 'pop$ - { 'v := } - if$ - v "" = - 'skip$ - { "<" t * ">" * v * "" * 'v := } - if$ - v -} - -%% Takes 2 args - tag, string -FUNCTION{markup.xml.title} -{ pop$ % tag - duplicate$ missing$ - 'pop$ - { - 's := % string - s "\&" "&" replace 's := - s "p" markup.xml 's := - s "title" markup.xml output.xml - } - if$ -} - - -%% - % markup.xml.pages - % - % Takes 1 arg (pages string) - % seperates into and if - % there is a - seperator. else no lpage. - % - % need to remove others -%% -FUNCTION{markup.xml.pages} -{ - "" 'v := % fpage - "" 's := % lpage - duplicate$ missing$ - 'pop$ - { - 't := - t " " "" replace 't := % remove all spaces. pgs must be - seperated - { t empty$ not } - { - t #1 #1 substring$ "-" = - { - t #2 global.max$ substring$ 's := - "" 't := % break while loop - }{ - v t #1 #1 substring$ * 'v := - t #2 global.max$ substring$ 't := - } - if$ - } - while$ - } - if$ - v "fpage" markup.xml output.xml - s "lpage" markup.xml output.xml -} - - -%% - % markup.xml.names - % - % Takes 2 args - % tag, namefield (eg. author "au") - % splits fields into and - % writes info - % returns nothing -%% -FUNCTION {markup.xml.names} -{ - 't := % tag - "" 'v := - "" 's := - duplicate$ empty$ - { pop$ - organization missing$ - { institution "cnm" markup.xml - "au" markup.xml "aug" markup.xml output.xml } - { organization "cnm" markup.xml - "au" markup.xml "aug" markup.xml output.xml } - if$ } - { - " " write$ newline$ - 'temp.str := % names string - temp.str num.names$ 'j.int := % num of names - #1 'i := % init counter - { i #1 j.int + < } % while (i <= j.int) - { - " " write$ - - % Initial first names - % if first name all in capitals - % - assume is initial list of first names. - temp.str i "{ff{ }}" format.name$ - duplicate$ "u" change.case$ = - { temp.str i "{ff{ }}" format.name$ } - { temp.str i "{f{}}" format.name$ } - if$ - - % if last name but no first name use cnm; else snm - duplicate$ "" = - { temp.str i "{ll{ }}" format.name$ % last names space seperated. - "cnm" markup.xml write$ } - { temp.str i "{ll{ }}" format.name$ % last names space seperated. - "snm" markup.xml write$ } - if$ - - "fnm" markup.xml write$ - - "" write$ newline$ - i #1 + 'i := - } - while$ - " " write$ newline$ - } - if$ -} - - -%% - % markup.xml.pub - % - % Takes 4 args (school address publisher tag) - % prints concatenation - % returns nothing -%% -FUNCTION {markup.xml.pub} -{ - 't := % Tag - "" 'v := % Publisher - "" 'l := % Address - "" 'f := % School - "" 's := % Answer - duplicate$ missing$ 'pop$ { 'v := } if$ - duplicate$ missing$ 'pop$ { 'l := } if$ - duplicate$ missing$ 'pop$ { 'f := } if$ - "" f = not % school not empty - { f 's := } % return school as publisher - { % else - "" v = "" l = and % address and pub empty - 'skip$ - { - "" l = - { v 's := } % return pub - { "" v = - { l 's := } % return add - { l ": " * v * 's := } % return add : pub - if$ - } - if$ - } - if$ - } - if$ - s t markup.xml output.xml -} - -%% - % xml.phd - % - % Takes nothing - % Returns type (phd/msc) of empty string -%% -FUNCTION {xml.phd} -{ - "phdthesis" type$ = - "mastersthesis" type$ = or - { "phdthesis" type$ = - { "PhD thesis" } - { "Master's thesis" } - if$ - } - { type } % usually empty - if$ -} - -% markup.xml.edition -% -% edition is a numeric value. ie "2" -% if format 2nd 1st etc.. strip letters. -% -FUNCTION {markup.xml.edition} -{ pop$ pop$ %clear stack - edition strip.letters duplicate$ "" = - { pop$ edition } - 'skip$ - if$ - "edition" markup.xml output.xml -} - - -FUNCTION{begin.bmcxmlcomment}{ - newline$ - "\newcommand{\BMCxmlcomment}[1]{}" write$ newline$ - newline$ - "\BMCxmlcomment{" write$ newline$ - newline$ "" write$ newline$ -} - -FUNCTION{end.bmcxmlcomment}{ - newline$ - "" write$ newline$ - "} % end of \BMCxmlcomment" write$ newline$ -} - -FUNCTION {export.xml}{ - newline$ - global.counter #1 + 'global.counter := - "" * - write$ newline$ -% title "\&" "&" replace "title" markup.xml.title - title "title" markup.xml.title - author "aug" markup.xml.names % org. and inst. here - howpublished missing$ - { booktitle missing$ - { journal missing$ - { xml.phd } % Phd/Msc - {journal} - if$ - } {booktitle} - if$ - } { howpublished } - if$ "source" markup.xml output.xml - school - address - publisher "publisher" markup.xml.pub - editor "editor" markup.xml output.xml - edition "edition" markup.xml.edition - series "p" markup.xml - "title" markup.xml - "series" markup.xml output.xml - chapter "p" markup.xml - "title" markup.xml - "section" markup.xml output.xml - % month % ignore - year "pubdate" markup.xml output.xml - - note missing$ - { volume "volume" markup.xml output.xml - number "issue" markup.xml output.xml - pages markup.xml.pages - url "url" markup.xml output.xml } - { note "l" change.case$ "in press" = - { " " write$ newline$ } - { volume "volume" markup.xml output.xml - number "issue" markup.xml output.xml - pages markup.xml.pages - url "url" markup.xml output.xml - note "note" markup.xml output.xml - } - if$ - } - if$ - "" write$ newline$ -} - -%%EXECUTE {begin.bmcxmlcomment} -%%ITERATE {export.xml} -%%EXECUTE {end.bmcxmlcomment} - -%% End of file `sn-mathphys-num.bst'. - - - - diff --git a/waypoint_control/sn-article-template/bst/sn-nature.bst b/waypoint_control/sn-article-template/bst/sn-nature.bst deleted file mode 100644 index 9ee7503..0000000 --- a/waypoint_control/sn-article-template/bst/sn-nature.bst +++ /dev/null @@ -1,1724 +0,0 @@ -%% -%% This is file `sn-nature.bst', -%% generated with the docstrip utility. -%% -%% The original source files were: merlin.mbs -%% ------------------------------------------ - % This bibliographic style (bst) file has been generated from one or - % more master bibliographic style (mbs) files, listed above. - % - % This file can be redistributed and/or modified under the terms - % of the LaTeX Project Public License Distributed from CTAN - % archives in directory macros/latex/base/lppl.txt; either - % version 1 of the License, or any later version. - % This bibliography style file is intended for texts in ENGLISH - % This is a numerical citation style, and as such is standard LaTeX. - % It requires no extra package to interface to the main text. - % The form of the \bibitem entries is - % \bibitem{key}... - % Usage of \cite is as follows: - % \cite{key} ==>> [#] - % \cite[chap. 2]{key} ==>> [#, chap. 2] - % where # is a number determined by the ordering in the reference list. - % The order in the reference list is that by which the works were originally - % cited in the text, or that in the database. - %--------------------------------------------------------------------- - -FUNCTION {identify.nature.version} -{ % Put identifying string in the .blg file - "sn-nature.bst" - " [2024/07/19 v1.1 bibliography style]" - * top$ -} - -ENTRY - { address - archive - author - booktitle - chapter - edition - editor - eprint - howpublished - institution - journal - key - keywords - month - note - number - organization - pages - publisher - school - series - title - type - url - doi - volume - year - archivePrefix - primaryClass - eid - adsurl - adsnote - version - } - {} - { label } -INTEGERS { output.state before.all mid.sentence after.sentence after.block } -FUNCTION {init.state.consts} -{ #0 'before.all := - #1 'mid.sentence := - #2 'after.sentence := - #3 'after.block := -} -STRINGS { s t} -FUNCTION {output.nonnull} -{ 's := - output.state mid.sentence = - { ", " * write$ } - { output.state after.block = - { add.period$ write$ - newline$ - "\newblock " write$ - } - { output.state before.all = - 'write$ - { add.period$ " " * write$ } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} - -FUNCTION {output.in.nonnull} -{ 's := - output.state mid.sentence = - { ", " * write$ } - { output.state after.block = - { add.period$ write$ - newline$ - "\newblock " write$ - } - { output.state before.all = - 'write$ - { add.period$ " " * write$ } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} -FUNCTION {output} -{ duplicate$ empty$ - 'pop$ - 'output.nonnull - if$ -} -FUNCTION {output.check} -{ 't := - duplicate$ empty$ - { pop$ "empty " t * " in " * cite$ * warning$ } - 'output.nonnull - if$ -} - -FUNCTION {in.output.check} -{ 't := - duplicate$ empty$ - { pop$ "empty " t * " in " * cite$ * warning$ } - 'output.in.nonnull - if$ -} -FUNCTION {fin.entry} -{ add.period$ - write$ - newline$ -} - -FUNCTION {new.block} -{ output.state before.all = - 'skip$ - { after.block 'output.state := } - if$ -} -FUNCTION {new.sentence} -{ output.state after.block = - 'skip$ - { output.state before.all = - 'skip$ - { after.sentence 'output.state := } - if$ - } - if$ -} -FUNCTION {add.blank} -{ " " * before.all 'output.state := -} - -FUNCTION {date.block} -{ - new.block -} - -FUNCTION {not} -{ { #0 } - { #1 } - if$ -} -FUNCTION {and} -{ 'skip$ - { pop$ #0 } - if$ -} -FUNCTION {or} -{ { pop$ #1 } - 'skip$ - if$ -} -FUNCTION {new.block.checka} -{ empty$ - 'skip$ - 'new.block - if$ -} -FUNCTION {new.block.checkb} -{ empty$ - swap$ empty$ - and - 'skip$ - 'new.block - if$ -} -FUNCTION {new.sentence.checka} -{ empty$ - 'skip$ - 'new.sentence - if$ -} -FUNCTION {new.sentence.checkb} -{ empty$ - swap$ empty$ - and - 'skip$ - 'new.sentence - if$ -} -FUNCTION {field.or.null} -{ duplicate$ empty$ - { pop$ "" } - 'skip$ - if$ -} -FUNCTION {emphasize} -{ duplicate$ empty$ - { pop$ "" } - { "\emph{" swap$ * "}" * } - if$ -} -FUNCTION {bolden} -{ duplicate$ empty$ - { pop$ "" } - { "\textbf{" swap$ * "}" * } - if$ -} -FUNCTION {tie.or.space.prefix} -{ duplicate$ text.length$ #3 < - { "~" } - { " " } - if$ - swap$ -} - -FUNCTION {capitalize} -{ "u" change.case$ "t" change.case$ } - -FUNCTION {space.word} -{ " " swap$ * " " * } - % Here are the language-specific definitions for explicit words. - % Each function has a name bbl.xxx where xxx is the English word. - % The language selected here is ENGLISH -FUNCTION {bbl.and} -{ "and"} - -FUNCTION {bbl.etal} -{ "et~al." } - -FUNCTION {bbl.in.editors} -{ "eds " } - -FUNCTION {bbl.editors} -{ "eds" } - -FUNCTION {bbl.editor} -{ "ed." } - -FUNCTION {bbl.edby} -{ "edited by" } - -FUNCTION {bbl.edition} -{ "edn" } - -FUNCTION {bbl.volume} -{ "Vol." } - -FUNCTION {bbl.of} -{ "of" } - -FUNCTION {bbl.number} -{ "no." } - -FUNCTION {bbl.nr} -{ "no." } - -FUNCTION {bbl.in} -{ "in" } - -FUNCTION {bbl.pages} -{ "" } - -FUNCTION {bbl.page} -{ "" } - -FUNCTION {bbl.chapter} -{ "Ch." } - -FUNCTION {bbl.techrep} -{ "Tech. Rep." } - -FUNCTION {bbl.mthesis} -{ "Master's thesis" } - -FUNCTION {bbl.phdthesis} -{ "Ph.D. thesis" } - -MACRO {jan} {"Jan."} - -MACRO {feb} {"Feb."} - -MACRO {mar} {"Mar."} - -MACRO {apr} {"Apr."} - -MACRO {may} {"May"} - -MACRO {jun} {"Jun."} - -MACRO {jul} {"Jul."} - -MACRO {aug} {"Aug."} - -MACRO {sep} {"Sep."} - -MACRO {oct} {"Oct."} - -MACRO {nov} {"Nov."} - -MACRO {dec} {"Dec."} - - %------------------------------------------------------------------- - % Begin module: - % \ProvidesFile{physjour.mbs}[2002/01/14 2.2 (PWD)] -MACRO {aa}{"Astron. \& Astrophys."} -MACRO {aasup}{"Astron. \& Astrophys. Suppl. Ser."} -MACRO {aj} {"Astron. J."} -MACRO {aph} {"Acta Phys."} -MACRO {advp} {"Adv. Phys."} -MACRO {ajp} {"Amer. J. Phys."} -MACRO {ajm} {"Amer. J. Math."} -MACRO {amsci} {"Amer. Sci."} -MACRO {anofd} {"Ann. Fluid Dyn."} -MACRO {am} {"Ann. Math."} -MACRO {ap} {"Ann. Phys. (NY)"} -MACRO {adp} {"Ann. Phys. (Leipzig)"} -MACRO {ao} {"Appl. Opt."} -MACRO {apl} {"Appl. Phys. Lett."} -MACRO {app} {"Astroparticle Phys."} -MACRO {apj} {"Astrophys. J."} -MACRO {apjsup} {"Astrophys. J. Suppl."} -MACRO {apss} {"Astrophys. Space Sci."} -MACRO {araa} {"Ann. Rev. Astron. Astrophys."} -MACRO {baas} {"Bull. Amer. Astron. Soc."} -MACRO {baps} {"Bull. Amer. Phys. Soc."} -MACRO {cmp} {"Comm. Math. Phys."} -MACRO {cpam} {"Commun. Pure Appl. Math."} -MACRO {cppcf} {"Comm. Plasma Phys. \& Controlled Fusion"} -MACRO {cpc} {"Comp. Phys. Comm."} -MACRO {cqg} {"Class. Quant. Grav."} -MACRO {cra} {"C. R. Acad. Sci. A"} -MACRO {fed} {"Fusion Eng. \& Design"} -MACRO {ft} {"Fusion Tech."} -MACRO {grg} {"Gen. Relativ. Gravit."} -MACRO {ieeens} {"IEEE Trans. Nucl. Sci."} -MACRO {ieeeps} {"IEEE Trans. Plasma Sci."} -MACRO {ijimw} {"Interntl. J. Infrared \& Millimeter Waves"} -MACRO {ip} {"Infrared Phys."} -MACRO {irp} {"Infrared Phys."} -MACRO {jap} {"J. Appl. Phys."} -MACRO {jasa} {"J. Acoust. Soc. America"} -MACRO {jcp} {"J. Comp. Phys."} -MACRO {jetp} {"Sov. Phys.--JETP"} -MACRO {jfe} {"J. Fusion Energy"} -MACRO {jfm} {"J. Fluid Mech."} -MACRO {jmp} {"J. Math. Phys."} -MACRO {jne} {"J. Nucl. Energy"} -MACRO {jnec} {"J. Nucl. Energy, C: Plasma Phys., Accelerators, Thermonucl. Res."} -MACRO {jnm} {"J. Nucl. Mat."} -MACRO {jpc} {"J. Phys. Chem."} -MACRO {jpp} {"J. Plasma Phys."} -MACRO {jpsj} {"J. Phys. Soc. Japan"} -MACRO {jsi} {"J. Sci. Instrum."} -MACRO {jvst} {"J. Vac. Sci. \& Tech."} -MACRO {nat} {"Nature"} -MACRO {nature} {"Nature"} -MACRO {nedf} {"Nucl. Eng. \& Design/Fusion"} -MACRO {nf} {"Nucl. Fusion"} -MACRO {nim} {"Nucl. Inst. \& Meth."} -MACRO {nimpr} {"Nucl. Inst. \& Meth. in Phys. Res."} -MACRO {np} {"Nucl. Phys."} -MACRO {npb} {"Nucl. Phys. B"} -MACRO {nt/f} {"Nucl. Tech./Fusion"} -MACRO {npbpc} {"Nucl. Phys. B (Proc. Suppl.)"} -MACRO {inc} {"Nuovo Cimento"} -MACRO {nc} {"Nuovo Cimento"} -MACRO {pf} {"Phys. Fluids"} -MACRO {pfa} {"Phys. Fluids A: Fluid Dyn."} -MACRO {pfb} {"Phys. Fluids B: Plasma Phys."} -MACRO {pl} {"Phys. Lett."} -MACRO {pla} {"Phys. Lett. A"} -MACRO {plb} {"Phys. Lett. B"} -MACRO {prep} {"Phys. Rep."} -MACRO {pnas} {"Proc. Nat. Acad. Sci. USA"} -MACRO {pp} {"Phys. Plasmas"} -MACRO {ppcf} {"Plasma Phys. \& Controlled Fusion"} -MACRO {phitrsl} {"Philos. Trans. Roy. Soc. London"} -MACRO {prl} {"Phys. Rev. Lett."} -MACRO {pr} {"Phys. Rev."} -MACRO {physrev} {"Phys. Rev."} -MACRO {pra} {"Phys. Rev. A"} -MACRO {prb} {"Phys. Rev. B"} -MACRO {prc} {"Phys. Rev. C"} -MACRO {prd} {"Phys. Rev. D"} -MACRO {pre} {"Phys. Rev. E"} -MACRO {ps} {"Phys. Scripta"} -MACRO {procrsl} {"Proc. Roy. Soc. London"} -MACRO {rmp} {"Rev. Mod. Phys."} -MACRO {rsi} {"Rev. Sci. Inst."} -MACRO {science} {"Science"} -MACRO {sciam} {"Sci. Am."} -MACRO {sam} {"Stud. Appl. Math."} -MACRO {sjpp} {"Sov. J. Plasma Phys."} -MACRO {spd} {"Sov. Phys.--Doklady"} -MACRO {sptp} {"Sov. Phys.--Tech. Phys."} -MACRO {spu} {"Sov. Phys.--Uspeki"} -MACRO {st} {"Sky and Telesc."} - % End module: physjour.mbs - %------------------------------------------------------------------- - % Begin module: - % \ProvidesFile{geojour.mbs}[2002/07/10 2.0h (PWD)] -MACRO {aisr} {"Adv. Space Res."} -MACRO {ag} {"Ann. Geophys."} -MACRO {anigeo} {"Ann. Geofis."} -MACRO {angl} {"Ann. Glaciol."} -MACRO {andmet} {"Ann. d. Meteor."} -MACRO {andgeo} {"Ann. d. Geophys."} -MACRO {andphy} {"Ann. Phys.-Paris"} -MACRO {afmgb} {"Arch. Meteor. Geophys. Bioklimatol."} -MACRO {atph} {"Atm\'osphera"} -MACRO {aao} {"Atmos. Ocean"} -MACRO {ass}{"Astrophys. Space Sci."} -MACRO {atenv} {"Atmos. Environ."} -MACRO {aujag} {"Aust. J. Agr. Res."} -MACRO {aumet} {"Aust. Meteorol. Mag."} -MACRO {blmet} {"Bound.-Lay. Meteorol."} -MACRO {bams} {"Bull. Amer. Meteorol. Soc."} -MACRO {cch} {"Clim. Change"} -MACRO {cdyn} {"Clim. Dynam."} -MACRO {cbul} {"Climatol. Bull."} -MACRO {cap} {"Contrib. Atmos. Phys."} -MACRO {dsr} {"Deep-Sea Res."} -MACRO {dhz} {"Dtsch. Hydrogr. Z."} -MACRO {dao} {"Dynam. Atmos. Oceans"} -MACRO {eco} {"Ecology"} -MACRO {empl}{"Earth, Moon and Planets"} -MACRO {envres} {"Environ. Res."} -MACRO {envst} {"Environ. Sci. Technol."} -MACRO {ecms} {"Estuarine Coastal Mar. Sci."} -MACRO {expa}{"Exper. Astron."} -MACRO {geoint} {"Geofis. Int."} -MACRO {geopub} {"Geofys. Publ."} -MACRO {geogeo} {"Geol. Geofiz."} -MACRO {gafd} {"Geophys. Astrophys. Fluid Dyn."} -MACRO {gfd} {"Geophys. Fluid Dyn."} -MACRO {geomag} {"Geophys. Mag."} -MACRO {georl} {"Geophys. Res. Lett."} -MACRO {grl} {"Geophys. Res. Lett."} -MACRO {ga} {"Geophysica"} -MACRO {gs} {"Geophysics"} -MACRO {ieeetap} {"IEEE Trans. Antenn. Propag."} -MACRO {ijawp} {"Int. J. Air Water Pollut."} -MACRO {ijc} {"Int. J. Climatol."} -MACRO {ijrs} {"Int. J. Remote Sens."} -MACRO {jam} {"J. Appl. Meteorol."} -MACRO {jaot} {"J. Atmos. Ocean. Technol."} -MACRO {jatp} {"J. Atmos. Terr. Phys."} -MACRO {jastp} {"J. Atmos. Solar-Terr. Phys."} -MACRO {jce} {"J. Climate"} -MACRO {jcam} {"J. Climate Appl. Meteor."} -MACRO {jcm} {"J. Climate Meteor."} -MACRO {jcy} {"J. Climatol."} -MACRO {jgr} {"J. Geophys. Res."} -MACRO {jga} {"J. Glaciol."} -MACRO {jh} {"J. Hydrol."} -MACRO {jmr} {"J. Mar. Res."} -MACRO {jmrj} {"J. Meteor. Res. Japan"} -MACRO {jm} {"J. Meteor."} -MACRO {jpo} {"J. Phys. Oceanogr."} -MACRO {jra} {"J. Rech. Atmos."} -MACRO {jaes} {"J. Aeronaut. Sci."} -MACRO {japca} {"J. Air Pollut. Control Assoc."} -MACRO {jas} {"J. Atmos. Sci."} -MACRO {jmts} {"J. Mar. Technol. Soc."} -MACRO {jmsj} {"J. Meteorol. Soc. Japan"} -MACRO {josj} {"J. Oceanogr. Soc. Japan"} -MACRO {jwm} {"J. Wea. Mod."} -MACRO {lao} {"Limnol. Oceanogr."} -MACRO {mwl} {"Mar. Wea. Log"} -MACRO {mau} {"Mausam"} -MACRO {meteor} {"``Meteor'' Forschungsergeb."} -MACRO {map} {"Meteorol. Atmos. Phys."} -MACRO {metmag} {"Meteor. Mag."} -MACRO {metmon} {"Meteor. Monogr."} -MACRO {metrun} {"Meteor. Rundsch."} -MACRO {metzeit} {"Meteor. Z."} -MACRO {metgid} {"Meteor. Gidrol."} -MACRO {mwr} {"Mon. Weather Rev."} -MACRO {nwd} {"Natl. Weather Dig."} -MACRO {nzjmfr} {"New Zeal. J. Mar. Freshwater Res."} -MACRO {npg} {"Nonlin. Proc. Geophys."} -MACRO {om} {"Oceanogr. Meteorol."} -MACRO {ocac} {"Oceanol. Acta"} -MACRO {oceanus} {"Oceanus"} -MACRO {paleoc} {"Paleoceanography"} -MACRO {pce} {"Phys. Chem. Earth"} -MACRO {pmg} {"Pap. Meteor. Geophys."} -MACRO {ppom} {"Pap. Phys. Oceanogr. Meteor."} -MACRO {physzeit} {"Phys. Z."} -MACRO {pps} {"Planet. Space Sci."} -MACRO {pss} {"Planet. Space Sci."} -MACRO {pag} {"Pure Appl. Geophys."} -MACRO {qjrms} {"Quart. J. Roy. Meteorol. Soc."} -MACRO {quatres} {"Quat. Res."} -MACRO {rsci} {"Radio Sci."} -MACRO {rse} {"Remote Sens. Environ."} -MACRO {rgeo} {"Rev. Geophys."} -MACRO {rgsp} {"Rev. Geophys. Space Phys."} -MACRO {rdgeo} {"Rev. Geofis."} -MACRO {revmeta} {"Rev. Meteorol."} -MACRO {sgp}{"Surveys in Geophys."} -MACRO {sp} {"Solar Phys."} -MACRO {ssr} {"Space Sci. Rev."} -MACRO {tellus} {"Tellus"} -MACRO {tac} {"Theor. Appl. Climatol."} -MACRO {tagu} {"Trans. Am. Geophys. Union (EOS)"} -MACRO {wrr} {"Water Resour. Res."} -MACRO {weather} {"Weather"} -MACRO {wafc} {"Weather Forecast."} -MACRO {ww} {"Weatherwise"} -MACRO {wmob} {"WMO Bull."} -MACRO {zeitmet} {"Z. Meteorol."} - % End module: geojour.mbs - %------------------------------------------------------------------- - % Begin module: - % \ProvidesFile{photjour.mbs}[1999/02/24 2.0b (PWD)] - -MACRO {appopt} {"Appl. Opt."} -MACRO {bell} {"Bell Syst. Tech. J."} -MACRO {ell} {"Electron. Lett."} -MACRO {jasp} {"J. Appl. Spectr."} -MACRO {jqe} {"IEEE J. Quantum Electron."} -MACRO {jlwt} {"J. Lightwave Technol."} -MACRO {jmo} {"J. Mod. Opt."} -MACRO {josa} {"J. Opt. Soc. America"} -MACRO {josaa} {"J. Opt. Soc. Amer.~A"} -MACRO {josab} {"J. Opt. Soc. Amer.~B"} -MACRO {jdp} {"J. Phys. (Paris)"} -MACRO {oc} {"Opt. Commun."} -MACRO {ol} {"Opt. Lett."} -MACRO {phtl} {"IEEE Photon. Technol. Lett."} -MACRO {pspie} {"Proc. Soc. Photo-Opt. Instrum. Eng."} -MACRO {sse} {"Solid-State Electron."} -MACRO {sjot} {"Sov. J. Opt. Technol."} -MACRO {sjqe} {"Sov. J. Quantum Electron."} -MACRO {sleb} {"Sov. Phys.--Leb. Inst. Rep."} -MACRO {stph} {"Sov. Phys.--Techn. Phys."} -MACRO {stphl} {"Sov. Techn. Phys. Lett."} -MACRO {vr} {"Vision Res."} -MACRO {zph} {"Z. f. Physik"} -MACRO {zphb} {"Z. f. Physik~B"} -MACRO {zphd} {"Z. f. Physik~D"} - -MACRO {CLEO} {"CLEO"} -MACRO {ASSL} {"Adv. Sol.-State Lasers"} -MACRO {OSA} {"OSA"} - % End module: photjour.mbs -%% Copyright 1994-2002 Patrick W Daly -MACRO {acmcs} {"ACM Comput. Surv."} - -MACRO {acta} {"Acta Inf."} - -MACRO {cacm} {"Commun. ACM"} - -MACRO {ibmjrd} {"IBM J. Res. Dev."} - -MACRO {ibmsj} {"IBM Syst.~J."} - -MACRO {ieeese} {"IEEE Trans. Software Eng."} - -MACRO {ieeetc} {"IEEE Trans. Comput."} - -MACRO {ieeetcad} - {"IEEE Trans. Comput. Aid. Des."} - -MACRO {ipl} {"Inf. Process. Lett."} - -MACRO {jacm} {"J.~ACM"} - -MACRO {jcss} {"J.~Comput. Syst. Sci."} - -MACRO {scp} {"Sci. Comput. Program."} - -MACRO {sicomp} {"SIAM J. Comput."} - -MACRO {tocs} {"ACM Trans. Comput. Syst."} - -MACRO {tods} {"ACM Trans. Database Syst."} - -MACRO {tog} {"ACM Trans. Graphic."} - -MACRO {toms} {"ACM Trans. Math. Software"} - -MACRO {toois} {"ACM Trans. Office Inf. Syst."} - -MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} - -MACRO {tcs} {"Theor. Comput. Sci."} - -FUNCTION {bibinfo.check} -{ swap$ - duplicate$ missing$ - { - pop$ pop$ - "" - } - { duplicate$ empty$ - { - swap$ pop$ - } - { swap$ - "\bibinfo{" swap$ * "}{" * swap$ * "}" * - } - if$ - } - if$ -} -FUNCTION {bibinfo.warn} -{ swap$ - duplicate$ missing$ - { - swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ - "" - } - { duplicate$ empty$ - { - swap$ "empty " swap$ * " in " * cite$ * warning$ - } - { swap$ - "\bibinfo{" swap$ * "}{" * swap$ * "}" * - } - if$ - } - if$ -} - - -%%Commented on 17th July 2024 -%FUNCTION {format.eprint} -%{ eprint duplicate$ empty$ -% 'skip$ -% { "\eprint" -% archive empty$ -% 'skip$ -% { "[" * archive * "]" * } -% if$ -% "{" * swap$ * "}" * -% } -% if$ -%} - -FUNCTION {format.url} -{ url empty$ - { "" } - { "\urlprefix\url{" url * "}" * } - if$ -} - -FUNCTION {format.doi} -{ doi empty$ - { "" } - { "\doi{" doi * "}" * } - if$ -} - -STRINGS { bibinfo} -INTEGERS { nameptr namesleft numnames } - -FUNCTION {format.names} -{ 'bibinfo := - duplicate$ empty$ 'skip$ { - 's := - "" 't := - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { s nameptr - "{vv~}{ll}{, f.}{, jj}" - format.name$ - bibinfo bibinfo.check - 't := - nameptr #1 > - { - nameptr #1 - #1 + = - numnames #5 - > and - { "others" 't := - #1 'namesleft := } - 'skip$ - if$ - namesleft #1 > - { ", " * t * } - { - s nameptr "{ll}" format.name$ duplicate$ "others" = - { 't := } - { pop$ } - if$ - t "others" = - { - " " * bbl.etal emphasize * - } - { - "\&" - space.word * t * - } - if$ - } - if$ - } - 't - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ - } if$ -} -FUNCTION {format.names.ed} -{ - format.names -} -FUNCTION {format.authors} -{ author "author" format.names -} -FUNCTION {get.bbl.editor} -{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } - -FUNCTION {get.in.bbl.editor} -{ } - -FUNCTION {format.editors} -{ editor "editor" format.names duplicate$ empty$ 'skip$ - { - " " * - get.bbl.editor - "(" swap$ * ")" * - * - } - if$ -} - -FUNCTION {format.in.editors} -{ "" editor "editor" format.names duplicate$ empty$ 'skip$ - { swap$ "(eds" * - " " * swap$ * - swap$ " " * - swap$ * ")" * - } - if$ -} - -FUNCTION {format.note} -{ - note empty$ - { "" } - { note #1 #1 substring$ - duplicate$ "{" = - 'skip$ - { output.state mid.sentence = - { "l" } - { "u" } - if$ - change.case$ - } - if$ - note #2 global.max$ substring$ * "note" bibinfo.check - } - if$ -} - - - -FUNCTION {format.in.title} -{ title - duplicate$ empty$ 'skip$ - { "t" change.case$ } - if$ - " in \textit{" swap$ * "}" * "title" bibinfo.check -} - -FUNCTION {format.title} -{ title - duplicate$ empty$ 'skip$ - { "t" change.case$ } - if$ - "title" bibinfo.check -} - -FUNCTION {format.inpro.title} -{ title - duplicate$ empty$ 'skip$ - { "t" change.case$ } - if$ - "title" bibinfo.check - emphasize} - -FUNCTION {format.version} -{ version - duplicate$ empty$ 'skip$ - { "t" change.case$ } - if$ - "version" bibinfo.check -} - -%FUNCTION {format.inpro.title} -%{ title -% duplicate$ empty$ 'skip$ -% { "t" change.case$ } -% if$ -% "title" bibinfo.check -% emphasize} - -FUNCTION {output.bibitem} -{ newline$ - "\bibitem{" write$ - cite$ write$ - "}" write$ - newline$ - "" - before.all 'output.state := -} - -FUNCTION {n.dashify} -{ - 't := - "" - { t empty$ not } - { t #1 #1 substring$ "-" = - { t #1 #2 substring$ "--" = not - { "--" * - t #2 global.max$ substring$ 't := - } - { { t #1 #1 substring$ "-" = } - { "-" * - t #2 global.max$ substring$ 't := - } - while$ - } - if$ - } - { t #1 #1 substring$ * - t #2 global.max$ substring$ 't := - } - if$ - } - while$ -} - -FUNCTION {word.in} -{ bbl.in capitalize - " " * } - -FUNCTION {format.date} -{ - "" - duplicate$ empty$ - year "year" bibinfo.check duplicate$ empty$ - { swap$ 'skip$ - { "there's a month but no year in " cite$ * warning$ } - if$ - * - } - { swap$ 'skip$ - { - swap$ - " " * swap$ - } - if$ - * - } - if$ - duplicate$ empty$ - 'skip$ - { - before.all 'output.state := - " (" swap$ * ")" * - } - if$ -} -FUNCTION {format.btitle} -{ title "title" bibinfo.check - duplicate$ empty$ 'skip$ - { - emphasize - } - if$ -} -FUNCTION {either.or.check} -{ empty$ - 'pop$ - { "can't use both " swap$ * " fields in " * cite$ * warning$ } - if$ -} -FUNCTION {format.bvolume} -{ volume empty$ - { "" } - { bbl.volume volume tie.or.space.prefix - "volume" bibinfo.check * * - series "series" bibinfo.check - duplicate$ empty$ 'pop$ - { swap$ bbl.of space.word * swap$ - emphasize * } - if$ - "volume and number" number either.or.check - } - if$ -} -FUNCTION {format.number.series} -{ volume empty$ - { number empty$ - { series field.or.null } - { series empty$ - { number "number" bibinfo.check } - { output.state mid.sentence = - { bbl.number } - { bbl.number capitalize } - if$ - number tie.or.space.prefix "number" bibinfo.check * * - bbl.in space.word * - series "series" bibinfo.check * - } - if$ - } - if$ - } - { "" } - if$ -} - -FUNCTION {format.edition} -{ edition duplicate$ empty$ 'skip$ - { - output.state mid.sentence = - { "l" } - { "t" } - if$ change.case$ - "edition" bibinfo.check - " " * bbl.edition * - } - if$ -} -INTEGERS { multiresult } -FUNCTION {multi.page.check} -{ 't := - #0 'multiresult := - { multiresult not - t empty$ not - and - } - { t #1 #1 substring$ - duplicate$ "-" = - swap$ duplicate$ "," = - swap$ "+" = - or or - { #1 'multiresult := } - { t #2 global.max$ substring$ 't := } - if$ - } - while$ - multiresult -} -FUNCTION {format.pages} -{ pages duplicate$ empty$ 'skip$ - { duplicate$ multi.page.check - { - n.dashify - } - { - } - if$ - "pages" bibinfo.check - } - if$ -} -FUNCTION {format.journal.pages} -{ pages duplicate$ empty$ 'pop$ - { swap$ duplicate$ empty$ - { pop$ pop$ format.pages } - { - ", " * - swap$ - n.dashify - "pages" bibinfo.check - * - } - if$ - } - if$ -} -FUNCTION {format.number} - {number empty$ - 'skip$ - { "~(" number * ")" * * } - if$ - } -FUNCTION {format.vol.num.pages} -{ volume field.or.null - duplicate$ empty$ 'skip$ - { - "volume" bibinfo.check - } - if$ - bolden -% format.number - format.journal.pages -} - -FUNCTION {format.chapter.pages} -{ chapter empty$ - 'format.pages - { type empty$ - { bbl.chapter } - { type "l" change.case$ - "type" bibinfo.check - } - if$ - chapter tie.or.space.prefix - "chapter" bibinfo.check - * * - pages empty$ - 'skip$ - { ", " * format.pages * } - if$ - } - if$ -} - -FUNCTION {format.booktitle} -{ - booktitle "booktitle" bibinfo.check - emphasize -} -FUNCTION {format.in.ed.booktitle} -{ duplicate$ empty$ 'skip$ - { -editor "editor" format.names.ed duplicate$ empty$ 'pop$ - { -format.booktitle swap$ -"(" editor num.names$ #1 > 'bbl.in.editors 'bbl.editor if$ * swap$ ") " * - * swap$ - * } - if$ - } - if$ -} -FUNCTION {empty.misc.check} -{ author empty$ title empty$ howpublished empty$ - month empty$ year empty$ note empty$ - and and and and and - { "all relevant fields are empty in " cite$ * warning$ } - 'skip$ - if$ -} -FUNCTION {format.thesis.type} -{ type duplicate$ empty$ - 'pop$ - { swap$ pop$ - "t" change.case$ "type" bibinfo.check - } - if$ -} -FUNCTION {format.tr.number} -{ number "number" bibinfo.check - type duplicate$ empty$ - { pop$ bbl.techrep } - 'skip$ - if$ - "type" bibinfo.check - swap$ duplicate$ empty$ - { pop$ "t" change.case$ } - { tie.or.space.prefix * * } - if$ -} -FUNCTION {format.article.crossref} -{ - key duplicate$ empty$ - { pop$ - journal duplicate$ empty$ - { "need key or journal for " cite$ * " to crossref " * crossref * warning$ } - { "journal" bibinfo.check emphasize word.in swap$ * } - if$ - } - { word.in swap$ * " " *} - if$ - " \cite{" * crossref * "}" * -} -FUNCTION {format.crossref.editor} -{ editor #1 "{vv~}{ll}" format.name$ - "editor" bibinfo.check - editor num.names$ duplicate$ - #2 > - { pop$ - "editor" bibinfo.check - " " * bbl.etal - emphasize - * - } - { #2 < - 'skip$ - { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = - { - "editor" bibinfo.check - " " * bbl.etal - emphasize - * - } - { - " \& " - * editor #2 "{vv~}{ll}" format.name$ - "editor" bibinfo.check - * - } - if$ - } - if$ - } - if$ -} -FUNCTION {format.book.crossref} -{ volume duplicate$ empty$ - { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ - pop$ word.in - } - { bbl.volume - capitalize - swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * - } - if$ - editor empty$ - editor field.or.null author field.or.null = - or - { key empty$ - { series empty$ - { "need editor, key, or series for " cite$ * " to crossref " * - crossref * warning$ - "" * - } - { series emphasize * } - if$ - } - { key * } - if$ - } - { format.crossref.editor * } - if$ - " \cite{" * crossref * "}" * -} -FUNCTION {format.incoll.inproc.crossref} -{ - editor empty$ - editor field.or.null author field.or.null = - or - { key empty$ - { format.booktitle duplicate$ empty$ - { "need editor, key, or booktitle for " cite$ * " to crossref " * - crossref * warning$ - } - { word.in swap$ * } - if$ - } - { word.in key * " " *} - if$ - } - { word.in format.crossref.editor * " " *} - if$ - " \cite{" * crossref * "}" * -} -FUNCTION {format.org.or.pub} -{ 't := - "" - year empty$ - { "empty year in " cite$ * warning$ } - 'skip$ - if$ - address empty$ t empty$ and - year empty$ and - 'skip$ - { - add.blank "(" * - t empty$ - { address "address" bibinfo.check * - } - { t * - address empty$ - 'skip$ - { ", " * address "address" bibinfo.check * } - if$ - } - if$ - year empty$ - 'skip$ - { t empty$ address empty$ and - 'skip$ - { ", " * } - if$ - year "year" bibinfo.check - * - } - if$ - ")" * - } - if$ -} -FUNCTION {format.publisher.address} -{ publisher "publisher" bibinfo.warn format.org.or.pub -} - -FUNCTION {format.organization.address} -{ organization "organization" bibinfo.check format.org.or.pub -} - -FUNCTION {format.archive} -{ - archivePrefix empty$ - { "" } - { archivePrefix ":" *} - if$ -} - -%%updated on 17th July 2024 -FUNCTION {format.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ - "eprint" bibinfo.check -} - -FUNCTION {format.primaryClass} -{ - primaryClass empty$ - { "" } - { " {[" primaryClass * "]}" *} - if$ -} - -FUNCTION {format.soft.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ - "eprint" bibinfo.check -} - - - -FUNCTION {format.softmisc.archive} -{ - archivePrefix empty$ - { "" } - { "" } - if$ -} - -FUNCTION {format.softmisc.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {article} -{ output.bibitem - format.authors "author" output.check - new.block - format.title "title" output.check - new.block - crossref missing$ - { - journal - "journal" bibinfo.check - emphasize - "journal" output.check - add.blank - format.vol.num.pages output - format.date "year" output.check - } - { format.article.crossref output.nonnull - format.pages output - } - if$ - new.block - format.url output - new.block - %% format.doi output - format.note output - %%format.eprint output - %% format.soft.eprint output - %% add.blank - %% format.primaryClass output - fin.entry -} - -FUNCTION {book} -{ output.bibitem - author empty$ - { format.editors "author and editor" output.check - add.blank - } - { format.authors output.nonnull - crossref missing$ - { "author and editor" editor either.or.check } - 'skip$ - if$ - } - if$ - new.block - format.btitle "title" output.check - add.blank - format.edition output - crossref missing$ - { format.bvolume output - new.block - format.number.series output - new.sentence - format.publisher.address output - } - { - new.block - format.book.crossref output.nonnull - format.date "year" output.check - } - if$ - new.block - format.url output - new.block - format.note output - format.eprint output - fin.entry -} -FUNCTION {booklet} -{ output.bibitem - format.authors output - new.block - format.title "title" output.check - new.block - howpublished "howpublished" bibinfo.check output - address "address" bibinfo.check output - format.date output - new.block - format.url output - new.block - format.note output - format.eprint output - fin.entry -} - -FUNCTION {inbook} -{ output.bibitem - author empty$ - { format.editors "author and editor" output.check - } - { format.authors output.nonnull - crossref missing$ - { "author and editor" editor either.or.check } - 'skip$ - if$ - } - if$ - new.block - format.btitle "title" output.check - crossref missing$ - { - format.bvolume output - format.chapter.pages "chapter and pages" output.check - new.block - format.number.series output - new.sentence - format.publisher.address output - } - { - format.chapter.pages "chapter and pages" output.check - new.block - format.book.crossref output.nonnull - format.date "year" output.check - } - if$ - format.edition output - new.block - format.url output - new.block - format.note output - format.eprint output - fin.entry -} - -FUNCTION {incollection} -{ output.bibitem - format.authors "author" output.check - new.block - format.in.title "title" output.check - add.blank - format.edition output -% new.block - crossref missing$ - { format.in.ed.booktitle "booktitle" output.check - format.bvolume output - add.blank - format.number.series output - format.chapter.pages output - new.sentence - format.publisher.address output - } - { format.incoll.inproc.crossref output.nonnull - format.chapter.pages output - } - if$ - new.block - format.url output - new.block - format.note output - format.eprint output - fin.entry -} -FUNCTION {inproceedings} -{ output.bibitem - format.authors "author" output.check - new.block - format.editors output -add.blank - format.inpro.title "title" output.check - new.block - crossref missing$ - { format.in.ed.booktitle "booktitle" output.check - format.bvolume output - format.number.series output - format.pages output - new.sentence - publisher empty$ - { format.organization.address output } - { organization "organization" bibinfo.check output - format.publisher.address output - } - if$ - } - { format.incoll.inproc.crossref output.nonnull - format.pages output - } - if$ - new.block - format.url output - new.block - format.note output - format.eprint output - fin.entry -} -FUNCTION {conference} { inproceedings } -FUNCTION {manual} -{ output.bibitem - author empty$ - { organization "organization" bibinfo.check - duplicate$ empty$ 'pop$ - { output - address "address" bibinfo.check output - } - if$ - } - { format.authors output.nonnull } - if$ - new.block - format.btitle "title" output.check - author empty$ - { organization empty$ - { - address new.block.checka - address "address" bibinfo.check output - } - 'skip$ - if$ - } - { - organization address new.block.checkb - organization "organization" bibinfo.check output - address "address" bibinfo.check output - } - if$ - format.edition output - format.date output - new.block - format.url output - new.block - format.note output - format.eprint output - fin.entry -} - -FUNCTION {mastersthesis} -{ output.bibitem - format.authors "author" output.check - new.block - format.btitle - "title" output.check - new.block - bbl.mthesis format.thesis.type output.nonnull - school "school" bibinfo.warn output - address "address" bibinfo.check output - format.date "year" output.check - new.block - format.url output - new.block - format.note output - format.eprint output - fin.entry -} - -FUNCTION {misc} -{ output.bibitem - format.authors output - title howpublished new.block.checkb - format.title output - howpublished new.block.checka - howpublished "howpublished" bibinfo.check output - format.date output - new.block - format.url output - new.block - format.note output - format.eprint output - fin.entry - empty.misc.check -} - -FUNCTION {softmisc} -{ output.bibitem - format.authors output - title howpublished new.block.checkb - format.title output - format.version output - howpublished new.block.checka - howpublished "howpublished" bibinfo.check output - format.date output - new.block - format.url output - new.block - format.note output - %%format.eprint output - format.softmisc.eprint output - fin.entry - empty.misc.check -} - -FUNCTION {phdthesis} -{ output.bibitem - format.authors "author" output.check - new.block - format.btitle - "title" output.check - new.block - bbl.phdthesis format.thesis.type output.nonnull - school "school" bibinfo.warn output - address "address" bibinfo.check output - format.date "year" output.check - new.block - format.url output - new.block - format.note output - format.eprint output - fin.entry -} - -FUNCTION {proceedings} -{ output.bibitem - editor empty$ - { organization "organization" bibinfo.check output - } - { format.editors output.nonnull } - if$ - new.block - format.btitle "title" output.check - format.bvolume output - format.number.series output - editor empty$ - { publisher empty$ - 'skip$ - { - new.sentence - format.publisher.address output - } - if$ - } - { publisher empty$ - { - new.sentence - format.organization.address output } - { - new.sentence - organization "organization" bibinfo.check output - format.publisher.address output - } - if$ - } - if$ - new.block - format.url output - new.block - format.note output - format.eprint output - fin.entry -} - -FUNCTION {techreport} -{ output.bibitem - format.authors "author" output.check - new.block - format.title - "title" output.check - new.block - format.tr.number output.nonnull - institution "institution" bibinfo.warn output - address "address" bibinfo.check output - format.date "year" output.check - new.block - format.url output - new.block - format.note output - format.eprint output - fin.entry -} - -FUNCTION {unpublished} -{ output.bibitem - format.authors "author" output.check - new.block - format.title "title" output.check - format.date output - new.block - format.url output - new.block - format.note "note" output.check - format.eprint output - fin.entry -} - -FUNCTION {default.type} { misc } -READ -EXECUTE {identify.nature.version} - -STRINGS { longest.label } -INTEGERS { number.label longest.label.width } -FUNCTION {initialize.longest.label} -{ "" 'longest.label := - #1 'number.label := - #0 'longest.label.width := -} -FUNCTION {longest.label.pass} -{ number.label int.to.str$ 'label := - number.label #1 + 'number.label := - label width$ longest.label.width > - { label 'longest.label := - label width$ 'longest.label.width := - } - 'skip$ - if$ -} -EXECUTE {initialize.longest.label} -ITERATE {longest.label.pass} -FUNCTION {begin.bib} -{ preamble$ empty$ - 'skip$ - { preamble$ write$ newline$ } - if$ - "\begin{thebibliography}{" longest.label * "}" * - write$ newline$ - "\expandafter\ifx\csname url\endcsname\relax" - write$ newline$ - %%" \def\url#1{\texttt{#1}}\fi" - " \def\url#1{\burl{#1}}\fi" - write$ newline$ - "\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi" - write$ newline$ - "\providecommand{\bibinfo}[2]{#2}" - write$ newline$ - "\providecommand{\eprint}[2][]{\url{#2}}" - write$ newline$ - "\providecommand{\doi}[1]{\url{https://doi.org/#1}}" - write$ newline$ - "\bibcommenthead" write$ newline$ -} -EXECUTE {begin.bib} -EXECUTE {init.state.consts} -ITERATE {call.type$} -FUNCTION {end.bib} -{ newline$ - "\end{thebibliography}" write$ newline$ -} -EXECUTE {end.bib} -%% End of customized bst file -%% -%% End of file `sn-nature.bst'. \ No newline at end of file diff --git a/waypoint_control/sn-article-template/bst/sn-vancouver-ay.bst b/waypoint_control/sn-article-template/bst/sn-vancouver-ay.bst deleted file mode 100644 index df1ac27..0000000 --- a/waypoint_control/sn-article-template/bst/sn-vancouver-ay.bst +++ /dev/null @@ -1,2085 +0,0 @@ -%% -%% This is file `sn-vancouve-ay.bst', -%% generated with the docstrip utility. -%% -%% The original source files were: vancouver.bst -%% natbib-compatible BibTeX bibliography style `vancouver-authoryear' -%% -%% Per default the reference list entries are alphabetized. %% -%%**************************************************************************************%% - % This file can be redistributed and/or modified under the terms - % of the LaTeX Project Public License Distributed from CTAN - % archives in directory macros/latex/base/lppl.txt; either - % version 1 of the License, or any later version. - - % In natbib.sty, it is possible to define the type of enclosures that is - % really wanted (brackets or parentheses), but in either case, there must - % be parentheses in the label. - % The \cite command functions as follows: - % \citet{key} ==>> Jones et al. (1990) - % \citet*{key} ==>> Jones, Baker, and Smith (1990) - % \citep{key} ==>> (Jones et al. 1990) - % \citep*{key} ==>> (Jones, Baker, and Smith 1990) - % \citep[chap. 2]{key} ==>> (Jones et al. 1990, chap. 2) - % \citep[e.g.][]{key} ==>> (e.g. Jones et al. 1990) - % \citep[e.g.][p. 32]{key} ==>> (e.g. Jones et al., p. 32) - % \citeauthor{key} ==>> Jones et al. - % \citeauthor*{key} ==>> Jones, Baker, and Smith - % \citeyear{key} ==>> 1990 - %--------------------------------------------------------------------- - -FUNCTION {identify.vancouver.version} -{ % Put identifying string in the .blg file - "sn-vancouver-ay.bst" - " [2024/07/19 v1.1 bibliography style]" - * top$ -} - -ENTRY - { address - assignee % for patents - author - booktitle % for articles in books - chapter % for incollection, esp. internet documents - cartographer % for maps - day - edition - editor - eid - howpublished - institution % for technical reports - inventor % for patents - journal - key - month - note - number - organization - pages - version - part - publisher - school - series - title - type - url - volume - word - year - eprint % urlbst - doi % urlbst - lastchecked % urlbst - updated % urlbst - archive - archivePrefix - primaryClass - } - {} - { label extra.label sort.label short.list } -INTEGERS { output.state before.all mid.sentence after.sentence after.block } -FUNCTION {init.state.consts} -{ #0 'before.all := - #1 'mid.sentence := - #2 'after.sentence := - #3 'after.block := -} -%% Declaration of string variables -STRINGS { s t} -FUNCTION {output.nonnull} -{ 's := - output.state mid.sentence = - { ", " * write$ } - { output.state after.block = - { add.period$ write$ - newline$ - "\newblock " write$ - } - { output.state before.all = - 'write$ - { " " * write$ } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} -FUNCTION {output} -{ duplicate$ empty$ - 'pop$ - 'output.nonnull - if$ -} - -FUNCTION {format.archive} -{ - archivePrefix empty$ - { "" } - { archivePrefix ":" *} - if$ -} - - -FUNCTION {format.primaryClass} -{ - primaryClass empty$ - { "" } - { "{[" primaryClass * "]}" *} - if$ -} - -FUNCTION {format.soft.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {format.softmisc.archive} -{ - archivePrefix empty$ - { "" } - { "" } - if$ -} - -FUNCTION {format.softmisc.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {output.check} -{ 't := - duplicate$ empty$ - { pop$ "empty " t * " in " * cite$ * warning$ } - 'output.nonnull - if$ -} - -%FUNCTION {fin.entry} -%{ duplicate$ empty$ -% 'pop$ -% 'write$ -% if$ -% newline$ -%} -% -FUNCTION {fin.entry} -{ add.period$ - write$ - newline$ -} - -FUNCTION {new.block} -{ output.state before.all = - 'skip$ - { after.block 'output.state := } - if$ -} - -FUNCTION {new.sentence} -{ output.state after.block = - 'skip$ - { output.state before.all = - 'skip$ - { after.sentence 'output.state := } - if$ - } - if$ -} - -FUNCTION {add.blank} -{ " " * before.all 'output.state := -} - -FUNCTION {no.blank.or.punct} -{ "" * before.all 'output.state := -} - -FUNCTION {add.semicolon} -{ - ";" * - no.blank.or.punct -} - -FUNCTION {date.block} -{ - "." * - no.blank.or.punct -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% LOGICAL `NOT', `AND', AND `OR' % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Logical 'not': -% If the first element on the stack is A then this function -% does the following: -% push { #0 } -% push { #1 } -% So now the first 3 elements of the stack are -% { #1 } { #0 } A -% The first 3 are popped and subjected to 'if': -% If A > 0 then { #0 } is executed, else { #1 } is executed: -% if A > 0 -% then 0 -% else 1 -% So consider integers as logicals, where 1 = true and 0 = false, -% then this does -% (if A then false else true) -% which is a logical 'not'. - -FUNCTION {not} -{ { #0 } - { #1 } - if$ -} -FUNCTION {and} -{ 'skip$ - { pop$ #0 } - if$ -} -FUNCTION {or} -{ { pop$ #1 } - 'skip$ - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% GENERAL PURPOSE FUNCTIONS FOR FORMATTING % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% issues warning if field is empty -% call with -% "field" field warning.if.empty -% Note that the first field must be between quotes -% because it is the fieldname for use in the warning message. -% - -FUNCTION {warning.if.empty} -{ empty$ - { "No " swap$ * " in " * cite$ * warning$ } - { pop$ } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % encloses string in pre- and postfix string - % call with - % prefix postfix S enclose.check - % delivers empty string if S empty - % -FUNCTION {enclose.check} -{ duplicate$ empty$ - { pop$ pop$ pop$ - "" - } - { swap$ * * } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% emphasizes top of stack -% call with -% string" emphasize.check -% - -FUNCTION {emphasize.check} -{ "\Bem{" swap$ - "}" swap$ - enclose.check -} - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % brackets top of stack - % call with - % "string" bracket.check - % -FUNCTION {bracket.check} -{ "[" swap$ - "]" swap$ - enclose.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % parenthesizes top of stack - % call with - % "string" parenthesize - % -FUNCTION {parenthesize.check} -{ "(" swap$ - ")" swap$ - enclose.check -} - -STRINGS {z} - -FUNCTION {remove.dots} -{ 'z := % expects string on top of the stack, pops the string and assigns it to variable z - "" % push empty string - { z empty$ not } % returns 0 if variable z is empty - { z #1 #1 substring$ % push the first character of variable z - z #2 global.max$ substring$ 'z := % assigns the 2nd to last character of variable z to variable z - duplicate$ "\" = % pushes 1 if the last character is "\", otherwise 0 - { * % concatenates the last 2 literals - z #1 #1 substring$ % push the first character of variable z - z #2 global.max$ substring$ 'z := % assigns the 2nd to last character of variable z to variable z - * % concatenates the last 2 literals, i.e. every character, even a dot, following a "\" will be printed - } - { duplicate$ "." = % pushes 1 if the last character is ".", otherwise 0 - 'pop$ % pushes the pop$ function - { * } % concatenates the last 2 literals - if$ % pops the last character if it is a dot, otherwise concatenates it with the string on top of the stack - } - if$ - } - while$ -} - -INTEGERS {l} -FUNCTION{string.length} -{ - #1 'l := - { duplicate$ duplicate$ #1 l substring$ = not } - { l #1 + 'l := } - while$ - pop$ l -} - -STRINGS {replace find text} -INTEGERS {find_length} -FUNCTION {find.replace} -{ - 'replace := - 'find := - 'text := - find string.length 'find_length := - "" - { text empty$ not } - { text #1 find_length substring$ find = - { - replace * - text #1 find_length + global.max$ substring$ 'text := - } - { text #1 #1 substring$ * - text #2 global.max$ substring$ 'text := - } - if$ - } - while$ -} - -FUNCTION {new.block.checka} -{ empty$ - 'skip$ - 'new.block - if$ -} - -FUNCTION {new.block.checkb} -{ empty$ - swap$ empty$ - and - 'skip$ - 'new.block - if$ -} - -FUNCTION {new.sentence.checka} -{ empty$ - 'skip$ - 'new.sentence - if$ -} - -FUNCTION {new.sentence.checkb} -{ empty$ - swap$ empty$ - and - 'skip$ - 'new.sentence - if$ -} - -FUNCTION {field.or.null} -{ duplicate$ empty$ - { pop$ "" } - 'skip$ - if$ -} - -FUNCTION {emphasize} -{ skip$ } - -FUNCTION {tie.or.space.prefix} -{ duplicate$ text.length$ #3 < - { "~" } - { " " } - if$ - swap$ -} - -FUNCTION {capitalize} -{ "u" change.case$ "t" change.case$ } - -FUNCTION {space.word} -{ " " swap$ * " " * } - - % Here are the language-specific definitions for explicit words. - % Each function has a name bbl.xxx where xxx is the English word. - % The language selected here is ENGLISH - -FUNCTION {bbl.and} -{ "and"} - -FUNCTION {bbl.etal} -{ "et~al." } - -FUNCTION {bbl.editors} -{ "editors" } - -FUNCTION {bbl.editor} -{ "editor" } - -FUNCTION {bbl.cartographers} -{ "cartographers" } - -FUNCTION {bbl.cartographer} -{ "cartographer" } - -FUNCTION {bbl.inventors} -{ "inventors" } - -FUNCTION {bbl.inventor} -{ "inventor" } - -FUNCTION {bbl.assignees} -{ "assignees" } - -FUNCTION {bbl.assignee} -{ "assignee" } - -FUNCTION {bbl.edby} -{ "edited by" } - -FUNCTION {bbl.edition} -{ "ed." } - -FUNCTION {bbl.volume} -{ "vol." } - -FUNCTION {bbl.of} -{ "of" } - -FUNCTION {bbl.number} -{ "no." } - -FUNCTION {bbl.nr} -{ "no." } - -FUNCTION {bbl.in} -{ "in" } - -FUNCTION {bbl.pages} -{ "p." } - -FUNCTION {bbl.page} -{ "p." } - -FUNCTION {bbl.chapter} -{ "chap." } - -FUNCTION {bbl.techrep} -{ "Tech. Rep." } - -FUNCTION {bbl.mthesis} -{ "Master's thesis" } - -FUNCTION {bbl.phdthesis} -{ "Ph.D. thesis" } - -FUNCTION {bbl.first} -{ "1st" } - -FUNCTION {bbl.second} -{ "2nd" } - -FUNCTION {bbl.third} -{ "3rd" } - -FUNCTION {bbl.fourth} -{ "4th" } - -FUNCTION {bbl.fifth} -{ "5th" } - -FUNCTION {bbl.st} -{ "st" } - -FUNCTION {bbl.nd} -{ "nd" } - -FUNCTION {bbl.rd} -{ "rd" } - -FUNCTION {bbl.th} -{ "th" } - -MACRO {jan} {"Jan."} - -MACRO {feb} {"Feb."} - -MACRO {mar} {"Mar."} - -MACRO {apr} {"Apr."} - -MACRO {may} {"May"} - -MACRO {jun} {"Jun."} - -MACRO {jul} {"Jul."} - -MACRO {aug} {"Aug."} - -MACRO {sep} {"Sep."} - -MACRO {oct} {"Oct."} - -MACRO {nov} {"Nov."} - -MACRO {dec} {"Dec."} - -MACRO {acmcs} {"ACM Comput. Surv."} - -MACRO {acta} {"Acta Inf."} - -MACRO {cacm} {"Commun. ACM"} - -MACRO {ibmjrd} {"IBM J. Res. Dev."} - -MACRO {ibmsj} {"IBM Syst.~J."} - -MACRO {ieeese} {"IEEE Trans. Software Eng."} - -MACRO {ieeetc} {"IEEE Trans. Comput."} - -MACRO {ieeetcad} - {"IEEE Trans. Comput. Aid. Des."} - -MACRO {ipl} {"Inf. Process. Lett."} - -MACRO {jacm} {"J.~ACM"} - -MACRO {jcss} {"J.~Comput. Syst. Sci."} - -MACRO {scp} {"Sci. Comput. Program."} - -MACRO {sicomp} {"SIAM J. Comput."} - -MACRO {tocs} {"ACM Trans. Comput. Syst."} - -MACRO {tods} {"ACM Trans. Database Syst."} - -MACRO {tog} {"ACM Trans. Graphic."} - -MACRO {toms} {"ACM Trans. Math. Software"} - -MACRO {toois} {"ACM Trans. Office Inf. Syst."} - -MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} - -MACRO {tcs} {"Theor. Comput. Sci."} - -FUNCTION {eng.ord} -{ duplicate$ "1" swap$ * - #-2 #1 substring$ "1" = - { bbl.th * } - { duplicate$ #-1 #1 substring$ - duplicate$ "1" = - { pop$ bbl.st * } - { duplicate$ "2" = - { pop$ bbl.nd * } - { "3" = - { bbl.rd * } - { bbl.th * } - if$ - } - if$ - } - if$ - } - if$ -} - -FUNCTION {bibinfo.check} -{ swap$ - duplicate$ missing$ - { - pop$ pop$ - "" - } - { duplicate$ empty$ - { - swap$ pop$ - } - { swap$ - pop$ - } - if$ - } - if$ -} - -FUNCTION {bibinfo.warn} -{ swap$ - duplicate$ missing$ - { - swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ - "" - } - { duplicate$ empty$ - { - swap$ "empty " swap$ * " in " * cite$ * warning$ - } - { swap$ - pop$ - } - if$ - } - if$ -} -INTEGERS { nameptr namesleft numnames } - - -STRINGS { bibinfo} - -FUNCTION {format.names} -{ 'bibinfo := - duplicate$ empty$ 'skip$ { - "." ". " find.replace 's := - "" 't := - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { s nameptr - "{vv~}{ll}{ f{}}{ jj}" - format.name$ - remove.dots - bibinfo bibinfo.check - 't := - nameptr #1 > - { - nameptr #6 - #1 + = - numnames #6 - > and - { "others" 't := - #1 'namesleft := } - 'skip$ - if$ - namesleft #1 > - { ", " * t * } - { - "," * - s nameptr "{ll}" format.name$ duplicate$ "others" = - { 't := } - { pop$ } - if$ - t "others" = - { - " " * bbl.etal * - } - { " " * t * } - if$ - } - if$ - } - 't - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ - } if$ -} - -FUNCTION {format.names.org} -{ 'bibinfo := - duplicate$ empty$ 'skip$ { - 's := - "" 't := - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { s nameptr - "{ff~}{vv~}{ll}" - format.name$ - bibinfo bibinfo.check - 't := - nameptr #1 > - { - namesleft #1 > - { "; " * t * } - { - ";" * - s nameptr "{ll}" format.name$ duplicate$ "others" = - { 't := } - { pop$ } - if$ - t "others" = - { - " " * bbl.etal * - } - { " " * t * } - if$ - } - if$ - } - 't - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ - } if$ -} - -FUNCTION {format.names.ed} -{ - format.names -} - -FUNCTION {format.key} -{ empty$ - { key field.or.null } - { "" } - if$ -} - -FUNCTION {format.authors} -{ - author "author" format.names - %%"." " " "author" find.replace format.names -} - -FUNCTION {format.organizations} -{ organization "organization" format.names.org -} - -FUNCTION {get.bbl.editor} -{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } - -FUNCTION {get.bbl.cartographer} -{ cartographer num.names$ #1 > 'bbl.cartographers 'bbl.cartographer if$ } - -FUNCTION {get.bbl.inventor} -{ inventor num.names$ #1 > 'bbl.inventors 'bbl.inventor if$ } - -FUNCTION {get.bbl.assignee} -{ assignee num.names$ #1 > 'bbl.assignees 'bbl.assignee if$ } - -FUNCTION {format.editors} -{ editor "editor" format.names duplicate$ empty$ 'skip$ - { - "," * - " " * - get.bbl.editor - * - } - if$ -} - -FUNCTION {format.assignees} -{ assignee "assignee" format.names.org duplicate$ empty$ 'skip$ - { - "," * - " " * - get.bbl.assignee - * - } - if$ -} - -FUNCTION {format.cartographers} -{ cartographer "cartographer" format.names duplicate$ empty$ 'skip$ - { - "," * - " " * - get.bbl.cartographer - * - } - if$ -} - -FUNCTION {format.inventors} -{ inventor "inventor" format.names duplicate$ empty$ 'skip$ - { - "," * - " " * - get.bbl.inventor - * - } - if$ -} - -FUNCTION {format.note} -{ - url empty$ - 'skip$ - { "\urlprefix\url{" url * "}" * output } - if$ - note empty$ - { "" } - { note #1 #1 substring$ - duplicate$ "{" = - 'skip$ - { output.state mid.sentence = - { "l" } - { "u" } - if$ - change.case$ - } - if$ - note #2 global.max$ substring$ * "note" bibinfo.check - } - if$ -} - -FUNCTION {format.title} -{ title -%%duplicate$ empty$ 'skip$ -%% { "t" change.case$ } -%%if$ - "title" bibinfo.check -} - - -FUNCTION {author.editor.key.full} -{ author empty$ - { editor empty$ - { key empty$ - { cite$ #1 #3 substring$ } - 'key - if$ - } - { editor } - if$ - } - { author } - if$ -} - -FUNCTION {author.key.full} -{ author empty$ - { key empty$ - { cite$ #1 #3 substring$ } - 'key - if$ - } - { author } - if$ -} - -FUNCTION {editor.key.full} -{ editor empty$ - { key empty$ - { cite$ #1 #3 substring$ } - 'key - if$ - } - { editor } - if$ -} - -FUNCTION {make.full.names} -{ type$ "book" = - type$ "inbook" = - or - 'author.editor.key.full - { type$ "proceedings" = - 'editor.key.full - 'author.key.full - if$ - } - if$ -} - -FUNCTION {output.bibitem} -{ newline$ - "\bibitem[{" write$ - label write$ - ")" make.full.names duplicate$ short.list = - { pop$ } - { * } - if$ - "}]{" * write$ - cite$ write$ - "}" write$ - newline$ - "" - before.all 'output.state := -} - -FUNCTION {n.dashify} -{ - 't := - "" - { t empty$ not } - { t #1 #1 substring$ "-" = - { t #1 #2 substring$ "--" = not - { "--" * - t #2 global.max$ substring$ 't := - } - { { t #1 #1 substring$ "-" = } - { "-" * - t #2 global.max$ substring$ 't := - } - while$ - } - if$ - } - { t #1 #1 substring$ * - t #2 global.max$ substring$ 't := - } - if$ - } - while$ -} - -FUNCTION {word.in} -{ bbl.in capitalize - ":" * - " " * } - -FUNCTION {format.journal.date} -{ - month "month" bibinfo.check - duplicate$ empty$ - year "year" bibinfo.check duplicate$ empty$ - { - swap$ 'skip$ - { "there's a month but no year in " cite$ * warning$ } - if$ - * - } - { swap$ 'skip$ - { - " " * swap$ - } - if$ - * - remove.dots - } - if$ - duplicate$ empty$ - 'skip$ - { - before.all 'output.state := - after.sentence 'output.state := - } - if$ -} - -FUNCTION {format.date} -{ - no.blank.or.punct - ";" - duplicate$ empty$ - year "year" bibinfo.check duplicate$ empty$ - { swap$ 'skip$ - { "there's a month but no year in " cite$ * warning$ } - if$ - * - } - { swap$ 'skip$ - { - swap$ - " " * swap$ - } - if$ - * - } - if$ -} - -FUNCTION {format.btitle} -{ title "title" bibinfo.check - duplicate$ empty$ 'skip$ - { - } - if$ -} - -FUNCTION {either.or.check} -{ empty$ - 'pop$ - { "can't use both " swap$ * " fields in " * cite$ * warning$ } - if$ -} - -FUNCTION {format.bvolume} -{ volume empty$ - { "" } - { bbl.volume volume tie.or.space.prefix - "volume" bibinfo.check * * - series "series" bibinfo.check - duplicate$ empty$ 'pop$ - { swap$ bbl.of space.word * swap$ - emphasize * } - if$ - "volume and number" number either.or.check - } - if$ -} - -FUNCTION {format.number.series} -{ volume empty$ - { number empty$ - { series field.or.null } - { output.state mid.sentence = - { bbl.number } - { bbl.number capitalize } - if$ - number tie.or.space.prefix "number" bibinfo.check * * - series empty$ - { "there's a number but no series in " cite$ * warning$ } - { bbl.in space.word * - series "series" bibinfo.check * - } - if$ - } - if$ - } - { "" } - if$ -} - -FUNCTION {format.edition} -{ edition duplicate$ empty$ 'skip$ - { -% convert.edition - output.state mid.sentence = - { "l" } - { "t" } - if$ change.case$ - "edition" bibinfo.check - " " * bbl.edition * - } - if$ -} -INTEGERS { multiresult } -FUNCTION {multi.page.check} -{ 't := - #0 'multiresult := - { multiresult not - t empty$ not - and - } - { t #1 #1 substring$ - duplicate$ "-" = - swap$ duplicate$ "," = - swap$ "+" = - or or - { #1 'multiresult := } - { t #2 global.max$ substring$ 't := } - if$ - } - while$ - multiresult -} - -FUNCTION {format.pages} -{ pages duplicate$ empty$ 'skip$ - { duplicate$ multi.page.check - { - bbl.pages swap$ - n.dashify - } - { - bbl.page swap$ - } - if$ - tie.or.space.prefix - "pages" bibinfo.check - * * - } - if$ -} - -FUNCTION {format.journal.pages} -{ pages duplicate$ empty$ 'pop$ - { swap$ duplicate$ empty$ - { pop$ pop$ format.pages } - { - ":" * - swap$ - n.dashify - "pages" bibinfo.check - * - } - if$ - } - if$ -} - -FUNCTION {format.vol.num} -{ volume field.or.null - duplicate$ empty$ 'skip$ - { - "volume" bibinfo.check - } - if$ - number "number" bibinfo.check duplicate$ empty$ 'skip$ - { - swap$ duplicate$ empty$ - { "there's a number but no volume in " cite$ * warning$ } - 'skip$ - if$ - swap$ - "(" swap$ * ")" * - } - if$ * -} - -FUNCTION {format.vol.num.pages} -{ volume field.or.null - duplicate$ empty$ 'skip$ - { - "volume" bibinfo.check - } - if$ - number "number" bibinfo.check duplicate$ empty$ 'skip$ - { - swap$ duplicate$ empty$ - { "there's a number but no volume in " cite$ * warning$ } - 'skip$ - if$ - swap$ - "(" swap$ * ")" * - } - if$ * - format.journal.pages -} - -FUNCTION {format.chapter.pages} -{ chapter empty$ - 'format.pages - { type empty$ - { bbl.chapter } - { type "l" change.case$ - "type" bibinfo.check - } - if$ - chapter tie.or.space.prefix - "chapter" bibinfo.check - * * - pages empty$ - 'skip$ - { ", " * format.pages * } - if$ - } - if$ - } - - FUNCTION {format.booktitle} - { - booktitle "booktitle" bibinfo.check - } - - FUNCTION {format.in.ed.booktitle} - { format.booktitle duplicate$ empty$ 'skip$ - { - editor "editor" format.names.ed duplicate$ empty$ 'pop$ - { - "," * - " " * - get.bbl.editor - ". " * - * swap$ - * } - if$ - word.in swap$ * - } - if$ - } - - FUNCTION {format.in.ed.title} - { format.title duplicate$ empty$ 'skip$ - { - editor "editor" format.names.ed duplicate$ empty$ 'pop$ - { - "," * - " " * - get.bbl.editor - ". " * - * swap$ - * } - if$ - word.in swap$ * - } - if$ - } - - FUNCTION {empty.misc.check} - { author empty$ title empty$ howpublished empty$ - month empty$ year empty$ note empty$ - and and and and and - { "all relevant fields are empty in " cite$ * warning$ } - 'skip$ - if$ - } -FUNCTION {format.thesis.type} - { type duplicate$ empty$ - 'pop$ - { swap$ pop$ - "t" change.case$ "type" bibinfo.check - } - if$ -} -FUNCTION {format.tr.number} -{ - number "number" bibinfo.check - %%type duplicate$ empty$ - %%{ pop$ bbl.techrep } - %%'skip$ - %%if$ - %%"type" bibinfo.check - %%swap$ duplicate$ empty$ - %%{ pop$ "t" change.case$ } - %%{ tie.or.space.prefix * * } - %%if$ -} - -FUNCTION {format.org.or.pub} -{ 't := - "" - address empty$ t empty$ and - 'skip$ - { - address "address" bibinfo.check * - t empty$ - 'skip$ - { address empty$ - 'skip$ - { ": " * } - if$ - t * - } - if$ - } - if$ -} - -FUNCTION {format.publisher.address} -{ publisher "publisher" bibinfo.warn format.org.or.pub -} - -FUNCTION {format.organization.address} -{ organization "organization" bibinfo.check format.org.or.pub -} - -FUNCTION {misc.add.comma} -{ - ", " * - } - -FUNCTION {misc.add.colon} -{ - ": " * - } - -INTEGERS { - bracket.state - outside.brackets - open.brackets - within.brackets - close.brackets -} - -FUNCTION {inbrackets} -{ bracket.state close.brackets = - { within.brackets 'bracket.state := } % reset the state: not open nor closed - { open.brackets 'bracket.state := } - if$ -} - -FUNCTION {format.type} -{ type empty$ - 'skip$ - { inbrackets type } - %%{ add.blank "[" type * "]" * } - if$ -} - -FUNCTION {format.institution.address} -{ institution "institution" bibinfo.check format.org.or.pub -} -FUNCTION {format.article.crossref} -{ - word.in - " \cite{" * crossref * "}" * -} -FUNCTION {format.book.crossref} -{ volume duplicate$ empty$ - { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ - pop$ word.in - } - { bbl.volume - capitalize - swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * - } - if$ - " \cite{" * crossref * "}" * -} -FUNCTION {format.incoll.inproc.crossref} -{ - word.in - " \cite{" * crossref * "}" * -} -FUNCTION {misc} -{ output.bibitem - format.authors "author" output.check - format.editors "author and editor" output.check - no.blank.or.punct - add.period$ misc.add.colon - format.title "title" output.check - type missing$ - { skip$ } - { format.type "type" output.check } -% { "type" output.check } - %%{ inbrackets type output } - if$ - new.block - format.publisher.address output - format.date "year" output.check - new.block - format.note output - new.block - howpublished new.block.checka - howpublished "howpublished" bibinfo.check output -% output.web.refs % urlbst - fin.entry - empty.misc.check -} - -STRINGS { urlintro eprinturl eprintprefix doiprefix doiurl } % urlbst... -INTEGERS { hrefform addeprints adddoiresolver } - -FUNCTION {init.config.constants} -{ - "Available from: " 'urlintro := % prefix before URL - "http://arxiv.org/abs/" 'eprinturl := % prefix to make URL from eprint ref - "arXiv:" 'eprintprefix := % text prefix printed before eprint ref - "http://dx.doi.org/" 'doiurl := % prefix to make URL from DOI - "" 'doiprefix := % text prefix printed before DOI ref - #0 'addeprints := % 0=no eprints; 1=include eprints - #0 'adddoiresolver := % 0=no DOI resolver; 1=include it - #0 'hrefform := % 0=no crossrefs; 1=hypertex xrefs; 2=hyperref refs -} - -FUNCTION {make.href.null} -{ - pop$ -} - -FUNCTION {make.href.hypertex} -{ - "\special {html: }" * swap$ * - "\special {html:}" * -} -% make hyperref specials -FUNCTION {make.href.hyperref} -{ - "\href {" swap$ * "} {" * swap$ * "}" * -} -FUNCTION {make.href} -{ hrefform #2 = - 'make.href.hyperref % hrefform = 2 - { hrefform #1 = - 'make.href.hypertex % hrefform = 1 - 'make.href.null % hrefform = 0 (or anything else) - if$ - } - if$ -} - - -FUNCTION {format.eprint} -{ eprint empty$ - { "" } - { eprintprefix eprint * eprinturl eprint * make.href } - if$ -} - -FUNCTION {format.doi} -{ doi empty$ - { "" } - { doiprefix doi * doiurl doi * make.href } - if$ -} - -FUNCTION {format.ddoi} -{ doi "doi" bibinfo.check - duplicate$ empty$ 'skip$ - { - "\doi{" swap$ * "}" * - } - if$ -} - - -FUNCTION {article} -{ output.bibitem - format.authors "author" output.check - organization empty$ - 'skip$ - { author empty$ - { - format.organizations "organization" output.check - } - { - "; " * - no.blank.or.punct - format.organizations "organization" output.check - } - if$ - } - if$ - new.block - format.title "title" output.check - type missing$ - { skip$ } - { "type" output.check } - if$ - new.block - journal - remove.dots - "journal" bibinfo.check - "journal" output.check - new.block - add.period$ - format.journal.date "year" output.check - add.semicolon - format.vol.num.pages output - new.block - format.note output - format.ddoi output - new.block - format.soft.eprint output - format.primaryClass output - fin.entry -} - - -FUNCTION {format.url} -{ url empty$ - { "" } - { hrefform #1 = - { % special case -- add HyperTeX specials - urlintro "\url{" url * "}" * url make.href.hypertex * } - { urlintro "\url{" * url * "}" * } - if$ - } - if$ -} - -FUNCTION {format.lastchecked} -{ lastchecked empty$ - { "" } - { updated empty$ - { inbrackets "cited " lastchecked * } - { inbrackets "updated " updated * "; cited " * lastchecked * } - if$ - } - if$ -} - -FUNCTION {output.url} -{ url empty$ - 'skip$ - { new.block - format.url output - format.lastchecked output - } - if$ -} - -FUNCTION {output.web.refs} -{ - new.block - output.url - addeprints eprint empty$ not and - { format.eprint output.nonnull } - 'skip$ - if$ - adddoiresolver doi empty$ not and - { format.doi output.nonnull } - 'skip$ - if$ -% addeprints -% { eprint empty$ -% 'skip$ -% { format.eprint output.nonnull } -% if$ -% } -% 'skip$ -% if$ -} - -FUNCTION {softmisc} -{ output.bibitem - format.authors "author" output.check - format.editors "author and editor" output.check - no.blank.or.punct - add.period$ misc.add.colon - format.title "title" output.check misc.add.comma - no.blank.or.punct - version output - type missing$ - { skip$ } - { format.type "type" output.check } - %%{ inbrackets type output } - if$ - new.block - format.publisher.address output -% format.date "year" output.check - new.block - format.note output - new.block - howpublished new.block.checka - howpublished "howpublished" bibinfo.check output - format.date "year" output.check - output.web.refs % urlbst - new.block - format.softmisc.eprint output - fin.entry - empty.misc.check -} - -FUNCTION {book} -{ output.bibitem - author empty$ - { editor empty$ - { format.organizations "organization" output.check } - { format.editors "author and editor" output.check } - if$ - } - { format.authors output.nonnull - "author and editor" editor either.or.check - } - if$ - new.block - format.btitle "title" output.check - format.bvolume output - new.block - format.edition output - new.sentence - author empty$ not - editor empty$ not - and - { format.editors "author and editor" output.check } - 'skip$ - if$ - format.number.series output - format.publisher.address output - format.date "year" output.check - new.block - format.note output -% output.web.refs % urlbst - fin.entry -} -FUNCTION {booklet} -{ misc } - -FUNCTION {dictionary} -{ output.bibitem - format.booktitle "booktitle" output.check - format.bvolume output - new.block - format.edition output - new.sentence - format.publisher.address output - format.date "year" output.check - format.btitle "title" output.check - add.semicolon - add.blank - format.pages "pages" output.check - new.block - format.note output -% output.web.refs % urlbst - fin.entry -} - -FUNCTION {inbook} -{ output.bibitem - format.authors "author" output.check - new.block - chapter "chapter" output.check - new.block - format.in.ed.title "title" output.check - format.bvolume output - format.edition output - new.sentence - format.number.series output - format.publisher.address output - format.date "year" output.check - date.block - add.blank - format.pages "pages" output.check - new.block - format.note output -% output.web.refs % urlbst - fin.entry -} - -FUNCTION {incollection} -{ output.bibitem - format.authors "author" output.check - new.block - format.title "title" output.check - new.block - format.in.ed.booktitle "booktitle" output.check - new.sentence - format.bvolume output - format.edition output - new.sentence - format.number.series output - new.sentence - add.period$ - format.publisher.address output - format.date "year" output.check - date.block - add.blank - format.pages "pages" output.check - new.block - format.note output - output.web.refs % urlbst - fin.entry -} -FUNCTION {inproceedings} -{ output.bibitem - format.authors "author" output.check - new.block - format.title "title" output.check - new.block - format.in.ed.booktitle "booktitle" output.check - format.bvolume output - new.sentence - format.number.series output - publisher empty$ - { format.organization.address output } - { organization "organization" bibinfo.check output - format.publisher.address output - } - if$ - format.date "year" output.check - date.block - add.blank - format.pages "pages" output.check - new.block - format.note output -% output.web.refs % urlbst - fin.entry -} -FUNCTION {conference} { inproceedings } -FUNCTION {manual} -{ output.bibitem - format.authors output - author format.key output -% add.colon - new.block - format.btitle "title" output.check - organization address new.block.checkb - organization "organization" bibinfo.check output - address "address" bibinfo.check output - format.edition output - format.date "year" output.check - % new.block ++++ REMOVED (to get comma before note) - format.note output - fin.entry -} - -FUNCTION {phdthesis} -{ output.bibitem - format.authors "author" output.check - new.block - format.btitle "title" output.check - new.block - "PhD thesis" format.thesis.type output.nonnull - school "school" bibinfo.warn output -% address "address" bibinfo.check output - format.date "year" output.check -% new.block -% format.note output -% output.web.refs % urlbst - fin.entry -} - -FUNCTION {proceedings} -{ output.bibitem - format.editors output - editor format.key output -% add.colon - new.block - format.btitle "title" output.check - format.bvolume output - new.sentence - format.number.series output - publisher empty$ - { format.organization.address output } - { organization "organization" bibinfo.check output - format.publisher.address output - } - if$ - format.date "year" output.check - % new.block ++++ REMOVED (to get comma before note) - format.note output - fin.entry -} - -FUNCTION {techreport} -{ output.bibitem - format.authors "author" output.check - new.block - format.title - "title" output.check - new.block - format.institution.address output - format.date "year" output.check -% format.tr.number output.nonnull -% new.block -% format.note output -% output.web.refs % urlbst - fin.entry -} - -FUNCTION {unpublished} -{ output.bibitem - format.authors "author" output.check - author format.key output -% add.colon - new.block - format.title "title" output.check - format.date "year" output.check - % new.block ++++ REMOVED (to get comma before note) - format.note "note" output.check - fin.entry -} - -FUNCTION {default.type} { misc } -READ -EXECUTE {identify.vancouver.version} -FUNCTION {sortify} -{ purify$ - "l" change.case$ -} -INTEGERS { len } -FUNCTION {chop.word} -{ 's := - 'len := - s #1 len substring$ = - { s len #1 + global.max$ substring$ } - 's - if$ -} -FUNCTION {format.lab.names} -{ 's := - "" 't := - s #1 "{vv~}{ll}" format.name$ - s num.names$ duplicate$ - #2 > - { pop$ - " " * bbl.etal * - } - { #2 < - 'skip$ - { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = - { - " " * bbl.etal * - } - { bbl.and space.word * s #2 "{vv~}{ll}" format.name$ - * } - if$ - } - if$ - } - if$ -} - -FUNCTION {author.key.label} -{ author empty$ - { key empty$ - { cite$ #1 #3 substring$ } - 'key - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {author.editor.key.label} -{ author empty$ - { editor empty$ - { key empty$ - { cite$ #1 #3 substring$ } - 'key - if$ - } - { editor format.lab.names } - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {editor.key.label} -{ editor empty$ - { key empty$ - { cite$ #1 #3 substring$ } - 'key - if$ - } - { editor format.lab.names } - if$ -} - -FUNCTION {calc.short.authors} -{ type$ "book" = - type$ "inbook" = - or - 'author.editor.key.label - { type$ "proceedings" = - 'editor.key.label - 'author.key.label - if$ - } - if$ - 'short.list := -} - -FUNCTION {calc.label} -{ calc.short.authors - short.list - "(" - * - year duplicate$ empty$ - { pop$ "????" } - 'skip$ - if$ - * - 'label := -} - -FUNCTION {sort.format.names} -{ 's := - #1 'nameptr := - "" - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { s nameptr - "{ll{ }}{ ff{ }}{ jj{ }}" - format.name$ 't := - nameptr #1 > - { - " " * - namesleft #1 = t "others" = and - { "zzzzz" * } - { t sortify * } - if$ - } - { t sortify * } - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ -} - -FUNCTION {sort.format.title} -{ 't := - "A " #2 - "An " #3 - "The " #4 t chop.word - chop.word - chop.word - sortify - #1 global.max$ substring$ -} -FUNCTION {author.sort} -{ author empty$ - { key empty$ - { "to sort, need author or key in " cite$ * warning$ - "" - } - { key sortify } - if$ - } - { author sort.format.names } - if$ -} -FUNCTION {author.editor.sort} -{ author empty$ - { editor empty$ - { key empty$ - { "to sort, need author, editor, or key in " cite$ * warning$ - "" - } - { key sortify } - if$ - } - { editor sort.format.names } - if$ - } - { author sort.format.names } - if$ -} -FUNCTION {editor.sort} -{ editor empty$ - { key empty$ - { "to sort, need editor or key in " cite$ * warning$ - "" - } - { key sortify } - if$ - } - { editor sort.format.names } - if$ -} -FUNCTION {presort} -{ calc.label - label sortify - " " - * - type$ "book" = - type$ "inbook" = - or - 'author.editor.sort - { type$ "proceedings" = - 'editor.sort - 'author.sort - if$ - } - if$ - #1 entry.max$ substring$ - 'sort.label := - sort.label - * - " " - * - title field.or.null - sort.format.title - * - #1 entry.max$ substring$ - 'sort.key$ := -} - -ITERATE {presort} -SORT -STRINGS { last.label next.extra } -INTEGERS { last.extra.num number.label } -FUNCTION {initialize.extra.label.stuff} -{ #0 int.to.chr$ 'last.label := - "" 'next.extra := - #0 'last.extra.num := - #0 'number.label := -} -FUNCTION {forward.pass} -{ last.label label = - { last.extra.num #1 + 'last.extra.num := - last.extra.num int.to.chr$ 'extra.label := - } - { "a" chr.to.int$ 'last.extra.num := - "" 'extra.label := - label 'last.label := - } - if$ - number.label #1 + 'number.label := -} -FUNCTION {reverse.pass} -{ next.extra "b" = - { "a" 'extra.label := } - 'skip$ - if$ - extra.label 'next.extra := - extra.label - duplicate$ empty$ - 'skip$ - { "{\natexlab{" swap$ * "}}" * } - if$ - 'extra.label := - label extra.label * 'label := -} -EXECUTE {initialize.extra.label.stuff} -ITERATE {forward.pass} -REVERSE {reverse.pass} -FUNCTION {bib.sort.order} -{ sort.label - " " - * - year field.or.null sortify - * - " " - * - title field.or.null - sort.format.title - * - #1 entry.max$ substring$ - 'sort.key$ := -} -ITERATE {bib.sort.order} -SORT -FUNCTION {begin.bib} -{ preamble$ empty$ - 'skip$ - { preamble$ write$ newline$ } - if$ - "\begin{thebibliography}{" number.label int.to.str$ * "}" * - write$ newline$ - "\providecommand{\natexlab}[1]{#1}" - write$ newline$ - "\providecommand{\doi}[1]{\url{https://doi.org/#1}}" - write$ newline$ - "\providecommand{\url}[1]{\texttt{#1}}" - write$ newline$ -% "\providecommand{\urlprefix}{URL }" ++++ EMPTIED by default - "\providecommand{\urlprefix}{}" - write$ newline$ -} -EXECUTE {begin.bib} -EXECUTE {init.state.consts} -ITERATE {call.type$} -FUNCTION {end.bib} -{ newline$ - "\end{thebibliography}" write$ newline$ -} -EXECUTE {end.bib} -%% End of customized bst file -%% -%% End of file `sn-vancouver-ay.bst'. \ No newline at end of file diff --git a/waypoint_control/sn-article-template/bst/sn-vancouver-num.bst b/waypoint_control/sn-article-template/bst/sn-vancouver-num.bst deleted file mode 100644 index cdc9d68..0000000 --- a/waypoint_control/sn-article-template/bst/sn-vancouver-num.bst +++ /dev/null @@ -1,2021 +0,0 @@ -%% -%% This is file `sn-vancouver-num.bst', -%% generated with the docstrip utility. -%% -%% The original source files were: vancouver.bst -%% -%% This work may be distributed and/or modified under the -%% conditions of the LaTeX Project Public License, either version 1.3 -%% of this license or (at your option) any later version. -%% The latest version of this license is in -%% http://www.latex-project.org/lppl.txt -%% and version 1.3 or later is part of all distributions of LaTeX -%% version 2005/12/01 or later. -%% -%% This bibliography style file is intended for texts in ENGLISH -%% This is a numerical citation style, and as such is standard LaTeX. -%% It requires no extra package to interface to the main text. -%% The form of the \bibitem entries is -%% \bibitem{key}... -%% Usage of \cite is as follows: -%% \cite{key} ==>> [#] -%% \cite[chap. 2]{key} ==>> [#, chap. 2] -%% where # is a number determined by the ordering in the reference list. -%% The order in the reference list is that by which the works were originally -%% cited in the text, or that in the database. - % -%% To change the reference numbering system from [1] to 1, -%% put the following code in the preamble: -%% \makeatletter % Reference list option change -%% \renewcommand\@biblabel[1]{#1} % from [1] to 1 -%% \makeatother % -%%--------------------------------------------------------------------- - -FUNCTION {identify.vancouver.version} -{ % Put identifying string in the .blg file - "sn-vancouver-num.bst" - " [2024/07/19 v1.1 Vancouver bibliography style]" - * top$ -} - -%% List of all possible fields -ENTRY - { address - assignee % for patents - author - booktitle % for articles in books - chapter % for incollection, esp. internet documents - cartographer % for maps - day - edition - editor - howpublished - institution % for technical reports - inventor % for patents - journal - key - keywords - month - note - number - organization - pages - part - publisher - school - series - title - type - volume - word - year - eprint % urlbst - doi % urlbst - url % urlbst - lastchecked % urlbst - updated % urlbst - archive - archivePrefix - primaryClass - eid - adsurl - adsnote - version - } - {} - { label } -%% Declaration of integer variables -INTEGERS { output.state before.all mid.sentence after.sentence after.block } -STRINGS { urlintro eprinturl eprintprefix doiprefix doiurl } % urlbst... -INTEGERS { hrefform addeprints adddoiresolver } -% Following constants may be adjusted by hand, if desired -FUNCTION {init.config.constants} -{ - "Available from: " 'urlintro := % prefix before URL - "http://arxiv.org/abs/" 'eprinturl := % prefix to make URL from eprint ref - "arXiv:" 'eprintprefix := % text prefix printed before eprint ref - "http://dx.doi.org/" 'doiurl := % prefix to make URL from DOI - "" 'doiprefix := % text prefix printed before DOI ref - #0 'addeprints := % 0=no eprints; 1=include eprints - #0 'adddoiresolver := % 0=no DOI resolver; 1=include it - #0 'hrefform := % 0=no crossrefs; 1=hypertex xrefs; 2=hyperref refs -} -INTEGERS { - bracket.state - outside.brackets - open.brackets - within.brackets - close.brackets -} -% ...urlbst to here -FUNCTION {init.state.consts} -{ #0 'outside.brackets := % urlbst - #1 'open.brackets := - #2 'within.brackets := - #3 'close.brackets := - - #0 'before.all := - #1 'mid.sentence := - #2 'after.sentence := - #3 'after.block := -} -%% Declaration of string variables -STRINGS { s t} - -% urlbst -FUNCTION {output.nonnull.original} -{ 's := - output.state mid.sentence = - { ". " * write$ } - { output.state after.block = - { add.period$ write$ - newline$ - "\newblock " write$ - } - { output.state before.all = - 'write$ - { add.period$ " " * write$ } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} - -% urlbst... -FUNCTION {output.nonnull} -{ % Save the thing we've been asked to output - 's := - % If the bracket-state is close.brackets, then add a close-bracket to - % what is currently at the top of the stack, and set bracket.state - % to outside.brackets - bracket.state close.brackets = - { "]" * - outside.brackets 'bracket.state := - } - 'skip$ - if$ - bracket.state outside.brackets = - { % We're outside all brackets -- this is the normal situation. - % Write out what's currently at the top of the stack, using the - % original output.nonnull function. - s - output.nonnull.original - } - { % Still in brackets. Add open-bracket or (continuation) comma, add the - % new text (in s) to the top of the stack, and move to the close-brackets - % state, ready for next time (unless inbrackets resets it). If we come - % into this branch, then output.state is carefully undisturbed. - bracket.state open.brackets = - { " [" * } - { ", " * } % bracket.state will be within.brackets - if$ - s * - close.brackets 'bracket.state := - } - if$ -} - -% Call this function just before adding something which should be presented in -% brackets. bracket.state is handled specially within output.nonnull. -FUNCTION {inbrackets} -{ bracket.state close.brackets = - { within.brackets 'bracket.state := } % reset the state: not open nor closed - { open.brackets 'bracket.state := } - if$ -} - -FUNCTION {format.lastchecked} -{ lastchecked empty$ - { "" } - { updated empty$ - { inbrackets "cited " lastchecked * } - { inbrackets "updated " updated * "; cited " * lastchecked * } - if$ - } - if$ -} -% ...urlbst to here - -FUNCTION {output} -{ duplicate$ empty$ - 'pop$ - 'output.nonnull - if$ -} - -FUNCTION {output.check} -{ 't := - duplicate$ empty$ - { pop$ "empty " t * " in " * cite$ * warning$ } - 'output.nonnull - if$ -} - -FUNCTION {fin.entry} -{ - bracket.state close.brackets = % urlbst - { "]" * } - 'skip$ - if$ - add.period$ - write$ - newline$ -} - -FUNCTION {new.block} -{ output.state before.all = - 'skip$ - { after.block 'output.state := } - if$ -} - -FUNCTION {new.sentence} -{ output.state after.block = - 'skip$ - { output.state before.all = - 'skip$ - { after.sentence 'output.state := } - if$ - } - if$ -} - -FUNCTION {add.blank} -{ " " * before.all 'output.state := -} - -FUNCTION {no.blank.or.punct} -{ "" * before.all 'output.state := -} - -FUNCTION {add.semicolon} -{ - ";" * - no.blank.or.punct -} - -FUNCTION {misc.add.colon} -{ - ": " * - } - -FUNCTION {misc.add.comma} -{ - ", " * - } - -FUNCTION {date.block} -{ - "." * - no.blank.or.punct -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% LOGICAL `NOT', `AND', AND `OR' % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Logical 'not': -% If the first element on the stack is A then this function -% does the following: -% push { #0 } -% push { #1 } -% So now the first 3 elements of the stack are -% { #1 } { #0 } A -% The first 3 are popped and subjected to 'if': -% If A > 0 then { #0 } is executed, else { #1 } is executed: -% if A > 0 -% then 0 -% else 1 -% So consider integers as logicals, where 1 = true and 0 = false, -% then this does -% (if A then false else true) -% which is a logical 'not'. - -FUNCTION {not} -{ { #0 } - { #1 } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Logical 'and': -% If the first 2 elements on the stack are A B -% then this function does the following: -% push 'skip$ -% push { pop$ #0 } -% So now first 4 elements are -% { pop$ #0 } 'skip$ A B -% The first 3 are popped and subjected to 'if' (B is on top of -% the stack): -% If A > 0 then 'skip$ is executed, else { pop$ #0 } is executed: -% if A > 0 -% then (B stays on top of stack) -% else (B is popped and #0 is pushed) -% So consider integers as logicals, where 1 = true and 0 = false, -% then this does -% (if A then B else false) -% which is a logical 'and'. - -FUNCTION {and} -{ 'skip$ - { pop$ #0 } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Logical 'or': -% If the first 2 elements on the stack are A B -% then this function does the following: -% push { pop$ #1 } -% push 'skip$ -% So now first 4 elements are -% 'skip$ { pop$ #1 } A B -% The first 3 are popped and subjected to 'if' (B is on top of -% the stack): -% If A > 0 then { pop$ #1 } is executed, else 'skip$ is executed: -% if A > 0 -% then (B is popped and #1 is pushed) -% else (B stays on top of stack) -% So consider integers as logicals, where 1 = true and 0 = false, -% then this does -% (if A then true else B) -% which is a logical 'or'. - -FUNCTION {or} -{ { pop$ #1 } - 'skip$ - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% GENERAL PURPOSE FUNCTIONS FOR FORMATTING % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% issues warning if field is empty -% call with -% "field" field warning.if.empty -% Note that the first field must be between quotes -% because it is the fieldname for use in the warning message. -% - -FUNCTION {warning.if.empty} -{ empty$ - { "No " swap$ * " in " * cite$ * warning$ } - { pop$ } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % encloses string in pre- and postfix string - % call with - % prefix postfix S enclose.check - % delivers empty string if S empty - % -FUNCTION {enclose.check} -{ duplicate$ empty$ - { pop$ pop$ pop$ - "" - } - { swap$ * * } - if$ -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% emphasizes top of stack -% call with -% string" emphasize.check -% - -FUNCTION {emphasize.check} -{ "\Bem{" swap$ - "}" swap$ - enclose.check -} - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % brackets top of stack - % call with - % "string" bracket.check - % -FUNCTION {bracket.check} -{ "[" swap$ - "]" swap$ - enclose.check -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % parenthesizes top of stack - % call with - % "string" parenthesize - % -FUNCTION {parenthesize.check} -{ "(" swap$ - ")" swap$ - enclose.check -} - -STRINGS {z} - -FUNCTION {remove.dots} -{ 'z := % expects string on top of the stack, pops the string and assigns it to variable z - "" % push empty string - { z empty$ not } % returns 0 if variable z is empty - { z #1 #1 substring$ % push the first character of variable z - z #2 global.max$ substring$ 'z := % assigns the 2nd to last character of variable z to variable z - duplicate$ "\" = % pushes 1 if the last character is "\", otherwise 0 - { * % concatenates the last 2 literals - z #1 #1 substring$ % push the first character of variable z - z #2 global.max$ substring$ 'z := % assigns the 2nd to last character of variable z to variable z - * % concatenates the last 2 literals, i.e. every character, even a dot, following a "\" will be printed - } - { duplicate$ "." = % pushes 1 if the last character is ".", otherwise 0 - 'pop$ % pushes the pop$ function - { * } % concatenates the last 2 literals - if$ % pops the last character if it is a dot, otherwise concatenates it with the string on top of the stack - } - if$ - } - while$ -} - -INTEGERS {l} -FUNCTION{string.length} -{ - #1 'l := - { duplicate$ duplicate$ #1 l substring$ = not } - { l #1 + 'l := } - while$ - pop$ l -} - -STRINGS {replace find text} -INTEGERS {find_length} -FUNCTION {find.replace} -{ - 'replace := - 'find := - 'text := - find string.length 'find_length := - "" - { text empty$ not } - { text #1 find_length substring$ find = - { - replace * - text #1 find_length + global.max$ substring$ 'text := - } - { text #1 #1 substring$ * - text #2 global.max$ substring$ 'text := - } - if$ - } - while$ -} - -FUNCTION {new.block.checka} -{ empty$ - 'skip$ - 'new.block - if$ -} - -FUNCTION {new.block.checkb} -{ empty$ - swap$ empty$ - and - 'skip$ - 'new.block - if$ -} - -FUNCTION {new.sentence.checka} -{ empty$ - 'skip$ - 'new.sentence - if$ -} - -FUNCTION {new.sentence.checkb} -{ empty$ - swap$ empty$ - and - 'skip$ - 'new.sentence - if$ -} - -FUNCTION {field.or.null} -{ duplicate$ empty$ - { pop$ "" } - 'skip$ - if$ -} - -FUNCTION {emphasize} -{ skip$ } - -FUNCTION {tie.or.space.prefix} -{ duplicate$ text.length$ #3 < - { "~" } - { " " } - if$ - swap$ -} - -FUNCTION {capitalize} -{ "u" change.case$ "t" change.case$ } - -FUNCTION {space.word} -{ " " swap$ * " " * } - - % Here are the language-specific definitions for explicit words. - % Each function has a name bbl.xxx where xxx is the English word. - % The language selected here is ENGLISH - -FUNCTION {bbl.and} -{ "and"} - -FUNCTION {bbl.etal} -{ "et~al." } - -FUNCTION {bbl.editors} -{ "editors" } - -FUNCTION {bbl.editor} -{ "editor" } - -FUNCTION {bbl.cartographers} -{ "cartographers" } - -FUNCTION {bbl.cartographer} -{ "cartographer" } - -FUNCTION {bbl.inventors} -{ "inventors" } - -FUNCTION {bbl.inventor} -{ "inventor" } - -FUNCTION {bbl.assignees} -{ "assignees" } - -FUNCTION {bbl.assignee} -{ "assignee" } - -FUNCTION {bbl.edby} -{ "edited by" } - -FUNCTION {bbl.edition} -{ "ed." } - -FUNCTION {bbl.volume} -{ "vol." } - -FUNCTION {bbl.of} -{ "of" } - -FUNCTION {bbl.number} -{ "no." } - -FUNCTION {bbl.nr} -{ "no." } - -FUNCTION {bbl.in} -{ "in" } - -FUNCTION {bbl.pages} -{ "p." } - -FUNCTION {bbl.page} -{ "p." } - -FUNCTION {bbl.chapter} -{ "chap." } - -FUNCTION {bbl.techrep} -{ "Tech. Rep." } - -FUNCTION {bbl.mthesis} -{ "Master's thesis" } - -FUNCTION {bbl.phdthesis} -{ "Ph.D. thesis" } - -FUNCTION {bbl.first} -{ "1st" } - -FUNCTION {bbl.second} -{ "2nd" } - -FUNCTION {bbl.third} -{ "3rd" } - -FUNCTION {bbl.fourth} -{ "4th" } - -FUNCTION {bbl.fifth} -{ "5th" } - -FUNCTION {bbl.st} -{ "st" } - -FUNCTION {bbl.nd} -{ "nd" } - -FUNCTION {bbl.rd} -{ "rd" } - -FUNCTION {bbl.th} -{ "th" } - -MACRO {jan} {"Jan."} - -MACRO {feb} {"Feb."} - -MACRO {mar} {"Mar."} - -MACRO {apr} {"Apr."} - -MACRO {may} {"May"} - -MACRO {jun} {"Jun."} - -MACRO {jul} {"Jul."} - -MACRO {aug} {"Aug."} - -MACRO {sep} {"Sep."} - -MACRO {oct} {"Oct."} - -MACRO {nov} {"Nov."} - -MACRO {dec} {"Dec."} - -FUNCTION {eng.ord} -{ duplicate$ "1" swap$ * - #-2 #1 substring$ "1" = - { bbl.th * } - { duplicate$ #-1 #1 substring$ - duplicate$ "1" = - { pop$ bbl.st * } - { duplicate$ "2" = - { pop$ bbl.nd * } - { "3" = - { bbl.rd * } - { bbl.th * } - if$ - } - if$ - } - if$ - } - if$ -} - -FUNCTION {bibinfo.check} -{ swap$ - duplicate$ missing$ - { - pop$ pop$ - "" - } - { duplicate$ empty$ - { - swap$ pop$ - } - { swap$ - pop$ - } - if$ - } - if$ -} - -FUNCTION {bibinfo.warn} -{ swap$ - duplicate$ missing$ - { - swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ - "" - } - { duplicate$ empty$ - { - swap$ "empty " swap$ * " in " * cite$ * warning$ - } - { swap$ - pop$ - } - if$ - } - if$ -} - -STRINGS { bibinfo} -INTEGERS { nameptr namesleft numnames } - -FUNCTION {format.names} -{ 'bibinfo := - duplicate$ empty$ 'skip$ { - "." ". " find.replace 's := - "" 't := - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { s nameptr - "{vv~}{ll}{ f{}}{ jj}" - format.name$ - remove.dots - bibinfo bibinfo.check - 't := - nameptr #1 > - { - nameptr #6 - #1 + = - numnames #6 - > and - { "others" 't := - #1 'namesleft := } - 'skip$ - if$ - namesleft #1 > - { ", " * t * } - { - "," * - s nameptr "{ll}" format.name$ duplicate$ "others" = - { 't := } - { pop$ } - if$ - t "others" = - { - " " * bbl.etal * - } - { " " * t * } - if$ - } - if$ - } - 't - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ - } if$ -} - -FUNCTION {format.names.org} -{ 'bibinfo := - duplicate$ empty$ 'skip$ { - 's := - "" 't := - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { s nameptr - "{ff~}{vv~}{ll}" - format.name$ - bibinfo bibinfo.check - 't := - nameptr #1 > - { - namesleft #1 > - { "; " * t * } - { - ";" * - s nameptr "{ll}" format.name$ duplicate$ "others" = - { 't := } - { pop$ } - if$ - t "others" = - { - " " * bbl.etal * - } - { " " * t * } - if$ - } - if$ - } - 't - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ - } if$ -} - -FUNCTION {format.names.ed} -{ - format.names -} - -FUNCTION {format.authors} -{ - author "author" format.names - %%"." " " "author" find.replace format.names -} - -FUNCTION {format.organizations} -{ organization "organization" format.names.org -} - -FUNCTION {get.bbl.editor} -{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } - -FUNCTION {get.bbl.cartographer} -{ cartographer num.names$ #1 > 'bbl.cartographers 'bbl.cartographer if$ } - -FUNCTION {get.bbl.inventor} -{ inventor num.names$ #1 > 'bbl.inventors 'bbl.inventor if$ } - -FUNCTION {get.bbl.assignee} -{ assignee num.names$ #1 > 'bbl.assignees 'bbl.assignee if$ } - -FUNCTION {format.editors} -{ editor "editor" format.names duplicate$ empty$ 'skip$ - { - "," * - " " * - get.bbl.editor - * - } - if$ -} - -FUNCTION {format.assignees} -{ assignee "assignee" format.names.org duplicate$ empty$ 'skip$ - { - "," * - " " * - get.bbl.assignee - * - } - if$ -} - -FUNCTION {format.cartographers} -{ cartographer "cartographer" format.names duplicate$ empty$ 'skip$ - { - "," * - " " * - get.bbl.cartographer - * - } - if$ -} - -FUNCTION {format.inventors} -{ inventor "inventor" format.names duplicate$ empty$ 'skip$ - { - "," * - " " * - get.bbl.inventor - * - } - if$ -} - -FUNCTION {format.note} -{ - note empty$ - { "" } - { note #1 #1 substring$ - duplicate$ "{" = - 'skip$ - { output.state mid.sentence = - { "l" } - { "u" } - if$ - change.case$ - } - if$ - note #2 global.max$ substring$ * "note" bibinfo.check - } - if$ -} - -FUNCTION {format.title} -{ title -%%duplicate$ empty$ 'skip$ -%% { "t" change.case$ } -%%if$ - "title" bibinfo.check -} - -FUNCTION {format.type} -{ type empty$ - 'skip$ - { inbrackets type } - %%{ add.blank "[" type * "]" * } - if$ -} - -FUNCTION {cite.author.editor} -{ 's := - s #1 "{vv~}{ll}" format.name$ - s num.names$ duplicate$ - #2 > - { pop$ " et~al." * } - { #2 = - { s #2 "{vv~}{ll}{ jj}{ f}" format.name$ "others" = - { " et~al." * } - { " and " * s #2 "{vv~}{ll}" format.name$ * } - if$ - } - 'skip$ - if$ - } - if$ -} - -FUNCTION {check.auth.edit.org} -{author empty$ - { - editor empty$ - { - organization empty$ - {""} - {organization} - if$ - } - {editor cite.author.editor} - if$ - } - {author cite.author.editor} - if$ -} - -FUNCTION {check.year} -{ year empty$ - {""} - {year} - if$ -} - -FUNCTION {output.bibitem} -{ outside.brackets 'bracket.state := % urlbst - newline$ - "\bibitem[\protect\citeauthoryear{" write$ -check.auth.edit.org write$ -"}{" write$ check.year write$ "}]{" write$ cite$ write$ - "}" write$ - newline$ - "" - before.all 'output.state := -} - -FUNCTION {n.dashify} -{ - 't := - "" - { t empty$ not } - { t #1 #1 substring$ "-" = - { t #1 #2 substring$ "--" = not - { "--" * - t #2 global.max$ substring$ 't := - } - { { t #1 #1 substring$ "-" = } - { "-" * - t #2 global.max$ substring$ 't := - } - while$ - } - if$ - } - { t #1 #1 substring$ * - t #2 global.max$ substring$ 't := - } - if$ - } - while$ -} - -FUNCTION {word.in} -{ bbl.in capitalize - ":" * - " " * } - -FUNCTION {format.journal.date} -{ - month "month" bibinfo.check - duplicate$ empty$ - year "year" bibinfo.check duplicate$ empty$ - { - swap$ 'skip$ - { "there's a month but no year in " cite$ * warning$ } - if$ - * - } - { swap$ 'skip$ - { - " " * swap$ - } - if$ - * - remove.dots - } - if$ - duplicate$ empty$ - 'skip$ - { - before.all 'output.state := - after.sentence 'output.state := - } - if$ -} - -FUNCTION {format.date} -{ - no.blank.or.punct - ";" - duplicate$ empty$ - year "year" bibinfo.check duplicate$ empty$ - { swap$ 'skip$ - { "there's a month but no year in " cite$ * warning$ } - if$ - * - } - { swap$ 'skip$ - { - swap$ - " " * swap$ - } - if$ - * - } - if$ -} - -FUNCTION {format.btitle} -{ title "title" bibinfo.check - duplicate$ empty$ 'skip$ - { - } - if$ -} - -FUNCTION {either.or.check} -{ empty$ - 'pop$ - { "can't use both " swap$ * " fields in " * cite$ * warning$ } - if$ -} - -FUNCTION {format.bvolume} -{ volume empty$ - { "" } - { bbl.volume volume tie.or.space.prefix - "volume" bibinfo.check * * - series "series" bibinfo.check - duplicate$ empty$ 'pop$ - { swap$ bbl.of space.word * swap$ - emphasize * } - if$ - "volume and number" number either.or.check - } - if$ -} - -FUNCTION {format.number.series} -{ volume empty$ - { number empty$ - { series field.or.null } - { series empty$ - { number "number" bibinfo.check } - { output.state mid.sentence = - { bbl.number } - { bbl.number capitalize } - if$ - number tie.or.space.prefix "number" bibinfo.check * * - bbl.in space.word * - series "series" bibinfo.check * - } - if$ - } - if$ - } - { "" } - if$ -} - -FUNCTION {is.num} -{ chr.to.int$ - duplicate$ "0" chr.to.int$ < not - swap$ "9" chr.to.int$ > not and -} - -FUNCTION {extract.num} -{ duplicate$ 't := - "" 's := - { t empty$ not } - { t #1 #1 substring$ - t #2 global.max$ substring$ 't := - duplicate$ is.num - { s swap$ * 's := } - { pop$ "" 't := } - if$ - } - while$ - s empty$ - 'skip$ - { pop$ s } - if$ -} - -FUNCTION {convert.edition} -{ extract.num "l" change.case$ 's := - s "first" = s "1" = or - { bbl.first 't := } - { s "second" = s "2" = or - { bbl.second 't := } - { s "third" = s "3" = or - { bbl.third 't := } - { s "fourth" = s "4" = or - { bbl.fourth 't := } - { s "fifth" = s "5" = or - { bbl.fifth 't := } - { s #1 #1 substring$ is.num - { s eng.ord 't := } - { edition 't := } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - t -} - -FUNCTION {format.edition} -{ edition duplicate$ empty$ 'skip$ - { - convert.edition - output.state mid.sentence = - { "l" } - { "t" } - if$ change.case$ - "edition" bibinfo.check - " " * bbl.edition * - } - if$ -} -INTEGERS { multiresult } -FUNCTION {multi.page.check} -{ 't := - #0 'multiresult := - { multiresult not - t empty$ not - and - } - { t #1 #1 substring$ - duplicate$ "-" = - swap$ duplicate$ "," = - swap$ "+" = - or or - { #1 'multiresult := } - { t #2 global.max$ substring$ 't := } - if$ - } - while$ - multiresult -} - -FUNCTION {format.pages} -{ pages duplicate$ empty$ 'skip$ - { duplicate$ multi.page.check - { - bbl.pages swap$ - n.dashify - } - { - bbl.page swap$ - } - if$ - tie.or.space.prefix - "pages" bibinfo.check - * * - } - if$ -} - -FUNCTION {format.journal.pages} -{ pages duplicate$ empty$ 'pop$ - { swap$ duplicate$ empty$ - { pop$ pop$ format.pages } - { - ":" * - swap$ - n.dashify - "pages" bibinfo.check - * - } - if$ - } - if$ -} - -FUNCTION {format.vol.num} -{ volume field.or.null - duplicate$ empty$ 'skip$ - { - "volume" bibinfo.check - } - if$ - number "number" bibinfo.check duplicate$ empty$ 'skip$ - { - swap$ duplicate$ empty$ - { "there's a number but no volume in " cite$ * warning$ } - 'skip$ - if$ - swap$ - "(" swap$ * ")" * - } - if$ * -} - -FUNCTION {format.vol.num.pages} -{ volume field.or.null - duplicate$ empty$ 'skip$ - { - "volume" bibinfo.check - } - if$ - number "number" bibinfo.check duplicate$ empty$ 'skip$ - { - swap$ duplicate$ empty$ - { "there's a number but no volume in " cite$ * warning$ } - 'skip$ - if$ - swap$ - "(" swap$ * ")" * - } - if$ * - format.journal.pages -} - -FUNCTION {format.chapter.pages} -{ chapter empty$ - 'format.pages - { type empty$ - { bbl.chapter } - { type "l" change.case$ - "type" bibinfo.check - } - if$ - chapter tie.or.space.prefix - "chapter" bibinfo.check - * * - pages empty$ - 'skip$ - { ", " * format.pages * } - if$ - } - if$ - } - - FUNCTION {format.booktitle} - { - booktitle "booktitle" bibinfo.check - } - - FUNCTION {format.in.ed.booktitle} - { format.booktitle duplicate$ empty$ 'skip$ - { - editor "editor" format.names.ed duplicate$ empty$ 'pop$ - { - "," * - " " * - get.bbl.editor - ". " * - * swap$ - * } - if$ - word.in swap$ * - } - if$ - } - - FUNCTION {format.in.ed.title} - { format.title duplicate$ empty$ 'skip$ - { - editor "editor" format.names.ed duplicate$ empty$ 'pop$ - { - "," * - " " * - get.bbl.editor - ". " * - * swap$ - * } - if$ - word.in swap$ * - } - if$ - } - - FUNCTION {empty.misc.check} - { author empty$ title empty$ howpublished empty$ - month empty$ year empty$ note empty$ - and and and and and - { "all relevant fields are empty in " cite$ * warning$ } - 'skip$ - if$ - } -FUNCTION {format.thesis.type} - { type duplicate$ empty$ - 'pop$ - { swap$ pop$ - "t" change.case$ "type" bibinfo.check - } - if$ -} -FUNCTION {format.tr.number} -{ - number "number" bibinfo.check - %%type duplicate$ empty$ - %%{ pop$ bbl.techrep } - %%'skip$ - %%if$ - %%"type" bibinfo.check - %%swap$ duplicate$ empty$ - %%{ pop$ "t" change.case$ } - %%{ tie.or.space.prefix * * } - %%if$ -} - -FUNCTION {format.org.or.pub} -{ 't := - "" - address empty$ t empty$ and - 'skip$ - { - address "address" bibinfo.check * - t empty$ - 'skip$ - { address empty$ - 'skip$ - { ": " * } - if$ - t * - } - if$ - } - if$ -} - -FUNCTION {format.publisher.address} -{ publisher "publisher" bibinfo.warn format.org.or.pub -} - -FUNCTION {format.organization.address} -{ organization "organization" bibinfo.check format.org.or.pub -} - -FUNCTION {format.institution.address} -{ institution "institution" bibinfo.check format.org.or.pub -} - - -% urlbst... -% Functions for making hypertext links. -% In all cases, the stack has (link-text href-url) -% -% make 'null' specials -FUNCTION {make.href.null} -{ - pop$ -} -% make hypertex specials -FUNCTION {make.href.hypertex} -{ - "\special {html: }" * swap$ * - "\special {html:}" * -} -% make hyperref specials -FUNCTION {make.href.hyperref} -{ - "\href {" swap$ * "} {" * swap$ * "}" * -} -FUNCTION {make.href} -{ hrefform #2 = - 'make.href.hyperref % hrefform = 2 - { hrefform #1 = - 'make.href.hypertex % hrefform = 1 - 'make.href.null % hrefform = 0 (or anything else) - if$ - } - if$ -} - -FUNCTION {format.url} -{ url empty$ - { "" } - { hrefform #1 = - { % special case -- add HyperTeX specials - urlintro "\url{" url * "}" * url make.href.hypertex * } - { urlintro "\url{" * url * "}" * } - if$ - } - if$ -} - -FUNCTION {format.eprint} -{ eprint empty$ - { "" } - { eprintprefix eprint * eprinturl eprint * make.href } - if$ -} - -FUNCTION {format.doi} -{ doi empty$ - { "" } - { doiprefix doi * doiurl doi * make.href } - if$ -} - -FUNCTION {format.ddoi} -{ doi "doi" bibinfo.check - duplicate$ empty$ 'skip$ - { - "\doi{" swap$ * "}" * - } - if$ -} - -% Output a URL. We can't use the more normal idiom (something like -% `format.url output'), because the `inbrackets' within -% format.lastchecked applies to everything between calls to `output', -% so that `format.url format.lastchecked * output' ends up with both -% the URL and the lastchecked in brackets. -FUNCTION {output.url} -{ url empty$ - 'skip$ - { new.block - format.url output - format.lastchecked output - } - if$ -} - -FUNCTION {output.web.refs} -{ - new.block - output.url - addeprints eprint empty$ not and - { format.eprint output.nonnull } - 'skip$ - if$ - adddoiresolver doi empty$ not and - { format.doi output.nonnull } - 'skip$ - if$ -% addeprints -% { eprint empty$ -% 'skip$ -% { format.eprint output.nonnull } -% if$ -% } -% 'skip$ -% if$ -} - -% Webpage entry type. -% Title and url fields required; -% author, note, year, month, and lastchecked fields optional -STRINGS {database} -FUNCTION {webpage} -{ output.bibitem - author empty$ - { editor empty$ - 'skip$ % author and editor both optional - { format.editors output.nonnull } - if$ - } - { editor empty$ - { format.authors output.nonnull } - { "can't use both author and editor fields in " cite$ * warning$ } - if$ - } - if$ -% author empty$ -% 'skip$ -% { format.authors output.nonnull } -% if$ - new.block - format.title "title" output.check - journal empty$ - { - format.type "type" output.check - publisher empty$ - 'skip$ - { format.publisher.address output } - if$ - "database on the Internet" 'database := - type database = - { format.journal.date "year" output.check } - { format.date "year" output.check } - if$ - lastchecked empty$ - 'skip$ - { format.lastchecked output } - if$ - new.block - part empty$ - 'skip$ - { part output } - if$ - pages empty$ - 'skip$ - { pages bracket.check output } - if$ - } - { journal - remove.dots - "journal" bibinfo.check - "journal" output.check - format.type "type" output.check - format.journal.date "year" output.check - lastchecked empty$ - 'skip$ - { format.lastchecked output - ";" no.blank.or.punct output - } - if$ - no.blank.or.punct format.vol.num output - pages empty$ - 'skip$ - { ":" no.blank.or.punct output - no.blank.or.punct pages bracket.check output - } - if$ - new.block - } - if$ - format.url "url" output.check - new.block - note output - fin.entry -} -% ...urlbst to here - -FUNCTION {misc} -{ output.bibitem - format.authors "author" output.check - format.editors "author and editor" output.check - no.blank.or.punct - add.period$ misc.add.colon -format.title "title" output.check - type missing$ - { skip$ } - { format.type "type" output.check } - %%{ inbrackets type output } - if$ - new.block - format.publisher.address output -% format.date "year" output.check - new.block - format.note output - new.block - howpublished new.block.checka - howpublished "howpublished" bibinfo.check output - output.web.refs % urlbst - fin.entry - empty.misc.check -} - -FUNCTION {format.archive} -{ - archivePrefix empty$ - { "" } - { archivePrefix ":" *} - if$ -} - -FUNCTION {format.primaryClass} -{ - primaryClass empty$ - { "" } - { "{[" primaryClass * "]}" *} - if$ -} - -FUNCTION {format.soft.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {format.softmisc.archive} -{ - archivePrefix empty$ - { "" } - { "" } - if$ -} - -FUNCTION {format.softmisc.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {article} -{ output.bibitem - format.authors "author" output.check - organization empty$ - 'skip$ - { author empty$ - { - format.organizations "organization" output.check - } - { - "; " * - no.blank.or.punct - format.organizations "organization" output.check - } - if$ - } - if$ - new.block - format.title "title" output.check - type missing$ - { skip$ } - { format.type "type" output.check } - if$ - new.block - journal - remove.dots - "journal" bibinfo.check - "journal" output.check - format.journal.date "year" output.check - add.semicolon - format.vol.num.pages output - new.block - format.note output - format.ddoi output - new.block - format.soft.eprint output - format.primaryClass output - fin.entry -} - -FUNCTION {softmisc} -{ output.bibitem - format.authors "author" output.check - format.editors "author and editor" output.check - no.blank.or.punct - add.period$ misc.add.colon - format.title "title" output.check misc.add.comma - no.blank.or.punct - version output - type missing$ - { skip$ } - { format.type "type" output.check } - %%{ inbrackets type output } - if$ - new.block - format.publisher.address output -% format.date "year" output.check - new.block - format.note output - new.block - howpublished new.block.checka - howpublished "howpublished" bibinfo.check output - format.date "year" output.check - output.web.refs % urlbst - new.block - format.softmisc.eprint output - fin.entry - empty.misc.check -} - -FUNCTION {book} -{ output.bibitem - author empty$ - { editor empty$ - { format.organizations "organization" output.check } - { format.editors "author and editor" output.check } - if$ - } - { format.authors output.nonnull - "author and editor" editor either.or.check - } - if$ - new.block - format.btitle "title" output.check - format.bvolume output - new.block - format.edition output - new.sentence - author empty$ not - editor empty$ not - and - { format.editors "author and editor" output.check } - 'skip$ - if$ - format.number.series output - format.publisher.address output - format.date "year" output.check - new.block - format.note output - output.web.refs % urlbst - fin.entry -} - -FUNCTION {booklet} -{ misc } - -FUNCTION {dictionary} -{ output.bibitem - format.booktitle "booktitle" output.check - format.bvolume output - new.block - format.edition output - new.sentence - format.publisher.address output - format.date "year" output.check - format.btitle "title" output.check - add.semicolon - add.blank - format.pages "pages" output.check - new.block - format.note output - output.web.refs % urlbst - fin.entry -} - -FUNCTION {inbook} -{ output.bibitem - format.authors "author" output.check - new.block - chapter "chapter" output.check - new.block - format.in.ed.title "title" output.check - format.bvolume output - format.edition output - new.sentence - format.number.series output - format.publisher.address output - format.date "year" output.check - date.block - add.blank - format.pages "pages" output.check - new.block - format.note output - output.web.refs % urlbst - fin.entry -} - -FUNCTION {incollection} -{ output.bibitem - format.authors "author" output.check - new.block - format.title "title" output.check - new.block - format.in.ed.booktitle "booktitle" output.check - format.bvolume output - format.edition output - new.sentence - format.number.series output - format.publisher.address output - format.date "year" output.check - date.block - add.blank - format.pages "pages" output.check - new.block - format.note output - output.web.refs % urlbst - fin.entry -} - -FUNCTION {inproceedings} -{ output.bibitem - format.authors "author" output.check - new.block - format.title "title" output.check - new.block - format.in.ed.booktitle "booktitle" output.check - format.bvolume output - new.sentence - format.number.series output - publisher empty$ - { format.organization.address output } - { organization "organization" bibinfo.check output - format.publisher.address output - } - if$ - format.date "year" output.check - date.block - add.blank - format.pages "pages" output.check - new.block - format.note output - output.web.refs % urlbst - fin.entry -} - -FUNCTION {conference} -{inproceedings} - -FUNCTION {manual} -{misc} - -FUNCTION {phdthesis} -{ output.bibitem - format.authors "author" output.check - new.block - format.btitle - "title" output.check - format.type "type" output.check - new.block - school "school" bibinfo.warn output - address "address" bibinfo.check output - format.date "year" output.check - new.block - format.note output - output.web.refs % urlbst - fin.entry -} - -FUNCTION {mastersthesis} -{phdthesis} - -FUNCTION {proceedings} -{ output.bibitem - editor empty$ - { organization "organization" bibinfo.check output - } - { format.editors output.nonnull } - if$ - new.block - format.btitle "title" output.check - format.bvolume output - editor empty$ - { publisher empty$ - 'skip$ - { - new.sentence - format.number.series output - format.publisher.address output - } - if$ - } - { publisher empty$ - { - new.sentence - format.organization.address output } - { - new.sentence - organization "organization" bibinfo.check output - format.publisher.address output - } - if$ - } - if$ - format.date "year" output.check - new.block - format.note output - output.web.refs % urlbst - fin.entry -} - -FUNCTION {techreport} -{ output.bibitem - format.authors "author" output.check - new.block - format.title - "title" output.check - new.block - format.institution.address output - format.date "year" output.check - format.tr.number output.nonnull - new.block - format.note output - output.web.refs % urlbst - fin.entry -} - -FUNCTION {map} -{ output.bibitem - format.cartographers "cartographer" output.check - new.block - format.title - "title" output.check - format.type "type" output.check - new.block - format.publisher.address output - format.date "year" output.check - new.block - format.note output - output.web.refs % urlbst - fin.entry -} - -FUNCTION {patent} -{ output.bibitem - format.inventors "inventor" output.check - "; " * - no.blank.or.punct - format.assignees "assignee" output.check - new.block - format.title - "title" output.check - new.block - format.tr.number output.nonnull - format.date "year" output.check - new.block - format.note output - output.web.refs % urlbst - fin.entry -} - -FUNCTION {unpublished} -{ output.bibitem - format.authors "author" output.check - new.block - format.title "title" output.check - format.date output - new.block - format.note "note" output.check - output.web.refs % urlbst - fin.entry -} - -FUNCTION {default.type} { misc } -READ -EXECUTE {identify.vancouver.version} - -STRINGS { longest.label } -INTEGERS { number.label longest.label.width } -FUNCTION {initialize.longest.label} -{ "" 'longest.label := - #1 'number.label := - #0 'longest.label.width := -} -FUNCTION {longest.label.pass} -{ number.label int.to.str$ 'label := - number.label #1 + 'number.label := - label width$ longest.label.width > - { label 'longest.label := - label width$ 'longest.label.width := - } - 'skip$ - if$ -} -EXECUTE {initialize.longest.label} -ITERATE {longest.label.pass} -FUNCTION {begin.bib} -{ preamble$ empty$ - 'skip$ - { preamble$ write$ newline$ } - if$ - "\begin{thebibliography}{" longest.label * "}" * - write$ newline$ - "\providecommand{\doi}[1]{\url{https://doi.org/#1}}" - write$ newline$ - "\bibcommenthead" write$ newline$ -} -EXECUTE {begin.bib} -EXECUTE {init.config.constants} -EXECUTE {init.state.consts} -ITERATE {call.type$} -FUNCTION {end.bib} -{ newline$ - "\end{thebibliography}" write$ newline$ -} -EXECUTE {end.bib} -%% End of customized bst file -%% -%% End of file `sn-vancouver-num.bst'. - diff --git a/waypoint_control/sn-article-template/empty.eps b/waypoint_control/sn-article-template/empty.eps deleted file mode 100644 index d216d5b..0000000 --- a/waypoint_control/sn-article-template/empty.eps +++ /dev/null @@ -1,80 +0,0 @@ -%!PS-Adobe-3.0 -%%Pages: (atend) -%%BoundingBox: 0 0 115 87 -%%HiResBoundingBox: 0.563794 0.527295 114.418213 86.036206 -%........................................... -%%Creator: GNU Ghostscript 653 (pswrite) -%%CreationDate: 2002/07/10 13:09:14 -%%DocumentData: Clean7Bit -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -% This copyright applies to everything between here and the %%EndProlog: -% Copyright (C) 2002 artofcode LLC, Benicia, CA. All rights reserved. -%%BeginResource: procset GS_pswrite_2_0_1001 -/GS_pswrite_2_0_1001 80 dict dup begin -/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch -4 index eq and{ pop pop pop}{ PageSize dup 1 -5 -1 roll put 0 4 -1 roll put dup where{ exch get exec} -{ pop/setpagedevice where -{ pop 1 dict dup /PageSize PageSize put setpagedevice} -{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat -setpage}if}ifelse}ifelse}ifelse} bind def -/!{bind def}bind def/#{load def}!/N/counttomark # -/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! -/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! -/w/setlinewidth #/J/setlinecap # -/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # -/m/moveto #/l/lineto #/c/rcurveto # -/p{N 2 idiv{N -2 roll rlineto}repeat}! -/P{N 0 gt{N -2 roll moveto p}if}! -/h{p closepath}!/H{P closepath}! -/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! -/re{4 -2 roll m exch dup lx exch ly neg lx h}! -/^{3 index neg 3 index neg}! -/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! -/q/gsave #/Q/grestore #/rf{re fill}! -/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! -/|={pop exch 4 1 roll 3 array astore cvx exch 1 index def exec}! -/|{exch string readstring |=}! -/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! -/@/currentfile #/${+ @ |}! -/B{{2 copy string{readstring pop}aload pop 4 array astore cvx -3 1 roll}repeat pop pop true}! -/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! -/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! -/Ic{exch Ix false 3 colorimage}! -/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> -/CCITTFaxDecode filter}!/FX{< -- 37 -< -- 23 -+ -- 99 -- -- 6 -* -- 183 -:= -- 627 -add.period$ -- 1 -call.type$ -- 1 -change.case$ -- 6 -chr.to.int$ -- 61 -cite$ -- 1 -duplicate$ -- 50 -empty$ -- 170 -format.name$ -- 21 -if$ -- 780 -int.to.chr$ -- 1 -int.to.str$ -- 3 -missing$ -- 0 -newline$ -- 59 -num.names$ -- 5 -pop$ -- 17 -preamble$ -- 1 -purify$ -- 5 -quote$ -- 0 -skip$ -- 245 -stack$ -- 0 -substring$ -- 301 -swap$ -- 32 -text.length$ -- 12 -text.prefix$ -- 0 -top$ -- 1 -type$ -- 45 -warning$ -- 0 -while$ -- 28 -width$ -- 0 -write$ -- 63 diff --git a/waypoint_control/sn-article-template/sn-article.log b/waypoint_control/sn-article-template/sn-article.log deleted file mode 100644 index 38a6a65..0000000 --- a/waypoint_control/sn-article-template/sn-article.log +++ /dev/null @@ -1,734 +0,0 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023) (preloaded format=pdflatex 2024.6.12) 4 FEB 2026 19:27 -entering extended mode - restricted \write18 enabled. - %&-line parsing enabled. -**sn-article.tex -(./sn-article.tex -LaTeX2e <2022-11-01> patch level 1 -L3 programming layer <2023-02-22> (./sn-jnl.cls -Document Class: sn-jnl 2019/11/18 v0.1: An authoring template for Springer Jour -nal articles -(e:/latex/texlive/2023/texmf-dist/tex/latex/base/article.cls -Document Class: article 2022/07/02 v1.4n Standard LaTeX document class -(e:/latex/texlive/2023/texmf-dist/tex/latex/base/fleqn.clo -File: fleqn.clo 2016/12/29 v1.2b Standard LaTeX option (flush left equations) -\mathindent=\skip48 -Applying: [2015/01/01] Make \[ robust on input line 50. -LaTeX Info: Redefining \[ on input line 51. -Already applied: [0000/00/00] Make \[ robust on input line 62. -Applying: [2015/01/01] Make \] robust on input line 74. -LaTeX Info: Redefining \] on input line 75. -Already applied: [0000/00/00] Make \] robust on input line 83. -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/base/size10.clo -File: size10.clo 2022/07/02 v1.4n Standard LaTeX file (size option) -) -\c@part=\count185 -\c@section=\count186 -\c@subsection=\count187 -\c@subsubsection=\count188 -\c@paragraph=\count189 -\c@subparagraph=\count190 -\c@figure=\count191 -\c@table=\count192 -\abovecaptionskip=\skip49 -\belowcaptionskip=\skip50 -\bibindent=\dimen140 -) -LaTeX Info: Redefining \rm on input line 146. -LaTeX Info: Redefining \sf on input line 147. -LaTeX Info: Redefining \tt on input line 148. -LaTeX Info: Redefining \bf on input line 149. -LaTeX Info: Redefining \it on input line 150. -LaTeX Info: Redefining \sl on input line 151. -LaTeX Info: Redefining \sc on input line 152. -LaTeX Info: Redefining \cal on input line 153. -LaTeX Info: Redefining \mit on input line 154. -LaTeX Info: Redefining \textsubscript on input line 212. -\columnhsize=\skip51 - -(e:/latex/texlive/2023/texmf-dist/tex/latex/geometry/geometry.sty -Package: geometry 2020/01/02 v5.9 Page Geometry - -(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty -Package: keyval 2022/05/29 v1.15 key=value parser (DPC) -\KV@toks@=\toks16 -) -(e:/latex/texlive/2023/texmf-dist/tex/generic/iftex/ifvtex.sty -Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. - -(e:/latex/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty -Package: iftex 2022/02/03 v1.0f TeX engine tests -)) -\Gm@cnth=\count193 -\Gm@cntv=\count194 -\c@Gm@tempcnt=\count195 -\Gm@bindingoffset=\dimen141 -\Gm@wd@mp=\dimen142 -\Gm@odd@mp=\dimen143 -\Gm@even@mp=\dimen144 -\Gm@layoutwidth=\dimen145 -\Gm@layoutheight=\dimen146 -\Gm@layouthoffset=\dimen147 -\Gm@layoutvoffset=\dimen148 -\Gm@dimlist=\toks17 -) -\artcatbox=\box51 -\aucount=\count196 -\corraucount=\count197 -\punctcount=\count198 -\emailcnt=\count199 -\c@affn=\count266 -\addcount=\count267 -\PacsCount=\count268 -\PacsTmpCnt=\count269 -\FMremarkdim=\dimen149 -\fmremarkbox=\box52 - -(e:/latex/texlive/2023/texmf-dist/tex/latex/sttools/cuted.sty -Package: cuted 2021/10/04 v2.0 Mixing onecolumn and twocolumn modes -\At@ViperColsBreak=\toks18 -\preCutedStrip=\toks19 -\postCutedStrip=\toks20 -\cuted@@tempbox@a=\box53 -\cuted@@tempbox@c=\box54 -\cuted@@tempbox@var=\box55 -\hold@viper=\box56 -\@viper=\box57 -\cuted@@varbox@a=\box58 -\cuted@@varbox@c=\box59 -\cuted@@tempdim@spread=\dimen150 -\cuted@@tempdim@a=\dimen151 -\cuted@@tempdim@b=\dimen152 -\ht@hold@viper=\dimen153 -\ht@viper=\dimen154 -\var@@pagediscards@ht=\dimen155 -\stripsep=\skip52 -\viper@penalty=\count270 -) -\firstpagehtcheck=\dimen156 -\labelwidthi=\dimen157 -\labelwidthii=\dimen158 -\labelwidthiii=\dimen159 -\labelwidthiv=\dimen160 -\figwidth=\dimen161 -\figheight=\dimen162 -\sidecapwidth=\dimen163 -\wrapcapline=\dimen164 -\totalwrapline=\dimen165 -\wraptotline=\dimen166 -\figurebox=\box60 -\wrapfigcapbox=\box61 -\figcapbox=\box62 -\capbox=\box63 -\headwidthskip=\skip53 -\tabcapbox=\box64 -\temptbox=\box65 -\tempdime=\dimen167 -\tabhtdime=\dimen168 - -(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty -Package: rotating 2016/08/11 v2.16d rotated objects in LaTeX - -(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty -Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR) - -(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty -Package: graphics 2022/03/10 v1.4e Standard LaTeX Graphics (DPC,SPQR) - -(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty -Package: trig 2021/08/11 v1.11 sin cos tan (DPC) -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics-cfg/graphics.cfg -File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration -) -Package graphics Info: Driver file: pdftex.def on input line 107. - -(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics-def/pdftex.def -File: pdftex.def 2022/09/22 v1.2b Graphics/color driver for pdftex -)) -\Gin@req@height=\dimen169 -\Gin@req@width=\dimen170 -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty -Package: ifthen 2022/04/13 v1.1d Standard LaTeX ifthen package (DPC) -) -\c@r@tfl@t=\count271 -\rotFPtop=\skip54 -\rotFPbot=\skip55 -\rot@float@box=\box66 -\rot@mess@toks=\toks21 -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/threeparttable/threeparttable.sty -Package: threeparttable 2003/06/13 v 3.0 -\@tempboxb=\box67 -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/appendix/appendix.sty -Package: appendix 2020/02/08 v1.2c extra appendix facilities -\c@@pps=\count272 -\c@@ppsavesec=\count273 -\c@@ppsaveapp=\count274 -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty -Package: hyperref 2023-02-07 v7.00v Hypertext links for LaTeX - -(e:/latex/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty -Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) -) -(e:/latex/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty -Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO -) - -(e:/latex/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty -Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) -) -Package pdftexcmds Info: \pdf@primitive is available. -Package pdftexcmds Info: \pdf@ifprimitive is available. -Package pdftexcmds Info: \pdfdraftmode found. -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty -Package: kvsetkeys 2022-10-05 v1.19 Key value parser (HO) -) -(e:/latex/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty -Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) -) -(e:/latex/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty -Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty -Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty -Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty -Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty -Package: nameref 2022-05-17 v2.50 Cross-referencing by name of section - -(e:/latex/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty -Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) -) -(e:/latex/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty -Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) -(e:/latex/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty -Package: kvoptions 2022-06-15 v3.15 Key value format for package options (HO) -)) -\c@section@level=\count275 -) -\@linkdim=\dimen171 -\Hy@linkcounter=\count276 -\Hy@pagecounter=\count277 - -(e:/latex/texlive/2023/texmf-dist/tex/latex/hyperref/pd1enc.def -File: pd1enc.def 2023-02-07 v7.00v Hyperref: PDFDocEncoding definition (HO) -Now handling font encoding PD1 ... -... no UTF-8 mapping file for font encoding PD1 -) -(e:/latex/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty -Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) -) -(e:/latex/texlive/2023/texmf-dist/tex/generic/etexcmds/etexcmds.sty -Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) -) -\Hy@SavedSpaceFactor=\count278 - -(e:/latex/texlive/2023/texmf-dist/tex/latex/hyperref/puenc.def -File: puenc.def 2023-02-07 v7.00v Hyperref: PDF Unicode definition (HO) -Now handling font encoding PU ... -... no UTF-8 mapping file for font encoding PU -) -Package hyperref Info: Hyper figures OFF on input line 4177. -Package hyperref Info: Link nesting OFF on input line 4182. -Package hyperref Info: Hyper index ON on input line 4185. -Package hyperref Info: Plain pages OFF on input line 4192. -Package hyperref Info: Backreferencing OFF on input line 4197. -Package hyperref Info: Implicit mode ON; LaTeX internals redefined. -Package hyperref Info: Bookmarks ON on input line 4425. -\c@Hy@tempcnt=\count279 - -(e:/latex/texlive/2023/texmf-dist/tex/latex/url/url.sty -\Urlmuskip=\muskip16 -Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. -) -LaTeX Info: Redefining \url on input line 4763. -\XeTeXLinkMargin=\dimen172 - -(e:/latex/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty -Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) - -(e:/latex/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty -Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO -) -)) -\Fld@menulength=\count280 -\Field@Width=\dimen173 -\Fld@charsize=\dimen174 -Package hyperref Info: Hyper figures OFF on input line 6042. -Package hyperref Info: Link nesting OFF on input line 6047. -Package hyperref Info: Hyper index ON on input line 6050. -Package hyperref Info: backreferencing OFF on input line 6057. -Package hyperref Info: Link coloring OFF on input line 6062. -Package hyperref Info: Link coloring with OCG OFF on input line 6067. -Package hyperref Info: PDF/A mode OFF on input line 6072. - -(e:/latex/texlive/2023/texmf-dist/tex/latex/base/atbegshi-ltx.sty -Package: atbegshi-ltx 2021/01/10 v1.0c Emulation of the original atbegshi -package with kernel methods -) -\Hy@abspage=\count281 -\c@Item=\count282 -\c@Hfootnote=\count283 -) -Package hyperref Info: Driver (autodetected): hpdftex. - -(e:/latex/texlive/2023/texmf-dist/tex/latex/hyperref/hpdftex.def -File: hpdftex.def 2023-02-07 v7.00v Hyperref driver for pdfTeX - -(e:/latex/texlive/2023/texmf-dist/tex/latex/base/atveryend-ltx.sty -Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atveryend pac -kage -with kernel methods -) -\Fld@listcount=\count284 -\c@bookmark@seq@number=\count285 - -(e:/latex/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty -Package: rerunfilecheck 2022-07-10 v1.10 Rerun checks for auxiliary files (HO) - -(e:/latex/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty -Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) -) -Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 -85. -) -\Hy@SectionHShift=\skip56 -) -Package hyperref Info: Option `colorlinks' set `true' on input line 1471. -Package hyperref Info: Option `breaklinks' set `true' on input line 1471. -Package hyperref Info: Option `plainpages' set `false' on input line 1471. -Package hyperref Info: Option `bookmarksopen' set `true' on input line 1471. -Package hyperref Info: Option `bookmarksnumbered' set `false' on input line 147 -1. - (e:/latex/texlive/2023/texmf-dist/tex/latex/wrapfig/wrapfig.sty -\wrapoverhang=\dimen175 -\WF@size=\dimen176 -\c@WF@wrappedlines=\count286 -\WF@box=\box68 -\WF@everypar=\toks22 -Package: wrapfig 2003/01/31 v 3.6 -) -\wraplines=\count287 -\@authorfigbox=\box69 -\@authorfigboxdim=\skip57 -\biofigadjskip=\skip58 - -(e:/latex/texlive/2023/texmf-dist/tex/latex/amscls/amsthm.sty -Package: amsthm 2020/05/29 v2.20.6 -\thm@style=\toks23 -\thm@bodyfont=\toks24 -\thm@headfont=\toks25 -\thm@notefont=\toks26 -\thm@headpunct=\toks27 -\thm@preskip=\skip59 -\thm@postskip=\skip60 -\thm@headsep=\skip61 -\dth@everypar=\toks28 -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/base/fix-cm.sty -Package: fix-cm 2020/11/24 v1.1t fixes to LaTeX - -(e:/latex/texlive/2023/texmf-dist/tex/latex/base/ts1enc.def -File: ts1enc.def 2001/06/05 v3.0e (jk/car/fm) Standard LaTeX file -LaTeX Font Info: Redeclaring font encoding TS1 on input line 47. -)) -(e:/latex/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty -Package: natbib 2010/09/13 8.31b (PWD, AO) -\bibhang=\skip62 -\bibsep=\skip63 -LaTeX Info: Redefining \cite on input line 694. -\c@NAT@ctr=\count288 -)) -(e:/latex/texlive/2023/texmf-dist/tex/latex/multirow/multirow.sty -Package: multirow 2021/03/15 v2.8 Span multiple rows of a table -\multirow@colwidth=\skip64 -\multirow@cntb=\count289 -\multirow@dima=\skip65 -\bigstrutjot=\dimen177 -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty -Package: amsmath 2022/04/08 v2.17n AMS math features -\@mathmargin=\skip66 - -For additional information on amsmath, use the `?' option. -(e:/latex/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty -Package: amstext 2021/08/26 v2.01 AMS text - -(e:/latex/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty -File: amsgen.sty 1999/11/30 v2.0 generic functions -\@emptytoks=\toks29 -\ex@=\dimen178 -)) -(e:/latex/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty -Package: amsbsy 1999/11/29 v1.2d Bold Symbols -\pmbraise@=\dimen179 -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty -Package: amsopn 2022/04/08 v2.04 operator names -) -\inf@bad=\count290 -LaTeX Info: Redefining \frac on input line 234. -\uproot@=\count291 -\leftroot@=\count292 -LaTeX Info: Redefining \overline on input line 399. -LaTeX Info: Redefining \colon on input line 410. -\classnum@=\count293 -\DOTSCASE@=\count294 -LaTeX Info: Redefining \ldots on input line 496. -LaTeX Info: Redefining \dots on input line 499. -LaTeX Info: Redefining \cdots on input line 620. -\Mathstrutbox@=\box70 -\strutbox@=\box71 -LaTeX Info: Redefining \big on input line 722. -LaTeX Info: Redefining \Big on input line 723. -LaTeX Info: Redefining \bigg on input line 724. -LaTeX Info: Redefining \Bigg on input line 725. -\big@size=\dimen180 -LaTeX Font Info: Redeclaring font encoding OML on input line 743. -LaTeX Font Info: Redeclaring font encoding OMS on input line 744. -\macc@depth=\count295 -LaTeX Info: Redefining \bmod on input line 905. -LaTeX Info: Redefining \pmod on input line 910. -LaTeX Info: Redefining \smash on input line 940. -LaTeX Info: Redefining \relbar on input line 970. -LaTeX Info: Redefining \Relbar on input line 971. -\c@MaxMatrixCols=\count296 -\dotsspace@=\muskip17 -\c@parentequation=\count297 -\dspbrk@lvl=\count298 -\tag@help=\toks30 -\row@=\count299 -\column@=\count300 -\maxfields@=\count301 -\andhelp@=\toks31 -\eqnshift@=\dimen181 -\alignsep@=\dimen182 -\tagshift@=\dimen183 -\tagwidth@=\dimen184 -\totwidth@=\dimen185 -\lineht@=\dimen186 -\@envbody=\toks32 -\multlinegap=\skip67 -\multlinetaggap=\skip68 -\mathdisplay@stack=\toks33 -LaTeX Info: Redefining \[ on input line 2953. -LaTeX Info: Redefining \] on input line 2954. -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty -Package: amssymb 2013/01/14 v3.01 AMS font symbols - -(e:/latex/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty -Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support -\symAMSa=\mathgroup4 -\symAMSb=\mathgroup5 -LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. -LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' -(Font) U/euf/m/n --> U/euf/b/n on input line 106. -)) -(e:/latex/texlive/2023/texmf-dist/tex/latex/jknapltx/mathrsfs.sty -Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk) -\symrsfs=\mathgroup6 -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty -Package: xcolor 2022/06/12 v2.14 LaTeX color extensions (UK) - -(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics-cfg/color.cfg -File: color.cfg 2016/01/02 v1.6 sample color configuration -) -Package xcolor Info: Driver file: pdftex.def on input line 227. - -(e:/latex/texlive/2023/texmf-dist/tex/latex/graphics/mathcolor.ltx) -Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1353. -Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1357. -Package xcolor Info: Model `RGB' extended on input line 1369. -Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1371. -Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1372. -Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1373. -Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1374. -Package xcolor Info: Model `Gray' substituted by `gray' on input line 1375. -Package xcolor Info: Model `wave' substituted by `hsb' on input line 1376. -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/base/textcomp.sty -Package: textcomp 2020/02/02 v2.0n Standard LaTeX package -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/ncctools/manyfoot.sty -Package: manyfoot 2019/08/03 v1.11 Many Footnote Levels Package (NCC) - -(e:/latex/texlive/2023/texmf-dist/tex/latex/ncctools/nccfoots.sty -Package: nccfoots 2005/02/03 v1.2 NCC Footnotes Package (NCC) -) -\MFL@columnwidth=\dimen187 -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/booktabs/booktabs.sty -Package: booktabs 2020/01/12 v1.61803398 Publication quality tables -\heavyrulewidth=\dimen188 -\lightrulewidth=\dimen189 -\cmidrulewidth=\dimen190 -\belowrulesep=\dimen191 -\belowbottomsep=\dimen192 -\aboverulesep=\dimen193 -\abovetopsep=\dimen194 -\cmidrulesep=\dimen195 -\cmidrulekern=\dimen196 -\defaultaddspace=\dimen197 -\@cmidla=\count302 -\@cmidlb=\count303 -\@aboverulesep=\dimen198 -\@belowrulesep=\dimen199 -\@thisruleclass=\count304 -\@lastruleclass=\count305 -\@thisrulewidth=\dimen256 -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/algorithms/algorithm.sty -Package: algorithm 2009/08/24 v0.1 Document Style `algorithm' - floating enviro -nment - -(e:/latex/texlive/2023/texmf-dist/tex/latex/float/float.sty -Package: float 2001/11/08 v1.3d Float enhancements (AL) -\c@float@type=\count306 -\float@exts=\toks34 -\float@box=\box72 -\@float@everytoks=\toks35 -\@floatcapt=\box73 -) -\@float@every@algorithm=\toks36 -\c@algorithm=\count307 -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/algorithmicx/algorithmicx.sty -Package: algorithmicx 2005/04/27 v1.2 Algorithmicx - -Document Style algorithmicx 1.2 - a greatly improved `algorithmic' style -\c@ALG@line=\count308 -\c@ALG@rem=\count309 -\c@ALG@nested=\count310 -\ALG@tlm=\skip69 -\ALG@thistlm=\skip70 -\c@ALG@Lnr=\count311 -\c@ALG@blocknr=\count312 -\c@ALG@storecount=\count313 -\c@ALG@tmpcounter=\count314 -\ALG@tmplength=\skip71 -) (e:/latex/texlive/2023/texmf-dist/tex/latex/algorithmicx/algpseudocode.sty -Package: algpseudocode - -Document Style - pseudocode environments for use with the `algorithmicx' style -) (e:/latex/texlive/2023/texmf-dist/tex/latex/listings/listings.sty -\lst@mode=\count315 -\lst@gtempboxa=\box74 -\lst@token=\toks37 -\lst@length=\count316 -\lst@currlwidth=\dimen257 -\lst@column=\count317 -\lst@pos=\count318 -\lst@lostspace=\dimen258 -\lst@width=\dimen259 -\lst@newlines=\count319 -\lst@lineno=\count320 -\lst@maxwidth=\dimen260 - -(e:/latex/texlive/2023/texmf-dist/tex/latex/listings/lstmisc.sty -File: lstmisc.sty 2023/02/27 1.9 (Carsten Heinz) -\c@lstnumber=\count321 -\lst@skipnumbers=\count322 -\lst@framebox=\box75 -) -(e:/latex/texlive/2023/texmf-dist/tex/latex/listings/listings.cfg -File: listings.cfg 2023/02/27 1.9 listings configuration -)) -Package: listings 2023/02/27 1.9 (Carsten Heinz) -\c@theorem=\count323 -\c@example=\count324 -\c@remark=\count325 -\c@definition=\count326 - -(e:/latex/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def -File: l3backend-pdftex.def 2023-01-16 L3 backend support: PDF output (pdfTeX) -\l__color_backend_stack_int=\count327 -\l__pdf_internal_box=\box76 -) -(./sn-article.aux) -\openout1 = `sn-article.aux'. - -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 91. -LaTeX Font Info: ... okay on input line 91. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 91. -LaTeX Font Info: ... okay on input line 91. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 91. -LaTeX Font Info: ... okay on input line 91. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 91. -LaTeX Font Info: ... okay on input line 91. -LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 91. -LaTeX Font Info: ... okay on input line 91. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 91. -LaTeX Font Info: ... okay on input line 91. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 91. -LaTeX Font Info: ... okay on input line 91. -LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 91. -LaTeX Font Info: ... okay on input line 91. -LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 91. -LaTeX Font Info: ... okay on input line 91. - -*geometry* driver: auto-detecting -*geometry* detected driver: pdftex -*geometry* verbose mode - [ preamble ] result: -* driver: pdftex -* paper: custom -* layout: -* layoutoffset:(h,v)=(0.0pt,0.0pt) -* bindingoffset: 17.07164pt -* modes: twoside -* h-part:(L,W,R)=(83.37448pt, 372.0pt, 125.06175pt) -* v-part:(T,H,B)=(73.97716pt, 552.69478pt, 218.37491pt) -* \paperwidth=597.50787pt -* \paperheight=845.04684pt -* \textwidth=372.0pt -* \textheight=552.69478pt -* \oddsidemargin=28.17613pt -* \evensidemargin=52.79176pt -* \topmargin=-19.72638pt -* \headheight=5.5pt -* \headsep=15.93355pt -* \topskip=10.0pt -* \footskip=28.45274pt -* \marginparwidth=34.1433pt -* \marginparsep=14.22636pt -* \columnsep=14.22636pt -* \skip\footins=8.0pt plus 4.0pt -* \hoffset=0.0pt -* \voffset=0.0pt -* \mag=1000 -* \@twocolumnfalse -* \@twosidetrue -* \@mparswitchtrue -* \@reversemargintrue -* (1in=72.27pt=25.4mm, 1cm=28.453pt) - -(e:/latex/texlive/2023/texmf-dist/tex/context/base/mkii/supp-pdf.mkii -[Loading MPS to PDF converter (version 2006.09.02).] -\scratchcounter=\count328 -\scratchdimen=\dimen261 -\scratchbox=\box77 -\nofMPsegments=\count329 -\nofMParguments=\count330 -\everyMPshowfont=\toks38 -\MPscratchCnt=\count331 -\MPscratchDim=\dimen262 -\MPnumerator=\count332 -\makeMPintoPDFobject=\count333 -\everyMPtoPDFconversion=\toks39 -) (e:/latex/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty -Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf -Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 -85. - -(e:/latex/texlive/2023/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg -File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv -e -)) -LaTeX Info: Redefining \S on input line 91. -LaTeX Font Info: Redeclaring symbol font `AMSa' on input line 91. -LaTeX Font Info: Overwriting symbol font `AMSa' in version `normal' -(Font) U/msa/m/n --> U/msa/m/n on input line 91. -LaTeX Font Info: Overwriting symbol font `AMSa' in version `bold' -(Font) U/msa/m/n --> U/msa/m/n on input line 91. -Package hyperref Info: Link coloring ON on input line 91. - -(./sn-article.out) (./sn-article.out) -\@outlinefile=\write3 -\openout3 = `sn-article.out'. - -\c@lstlisting=\count334 -LaTeX Font Info: Calculating math sizes for size <12.045> on input line 143. - -LaTeX Font Info: Trying to load font information for U+msa on input line 143 -. - -(e:/latex/texlive/2023/texmf-dist/tex/latex/amsfonts/umsa.fd -File: umsa.fd 2013/01/14 v3.01 AMS symbols A -) -LaTeX Font Info: Trying to load font information for U+msb on input line 143 -. - -(e:/latex/texlive/2023/texmf-dist/tex/latex/amsfonts/umsb.fd -File: umsb.fd 2013/01/14 v3.01 AMS symbols B -) -LaTeX Font Info: Trying to load font information for U+rsfs on input line 14 -3. - -(e:/latex/texlive/2023/texmf-dist/tex/latex/jknapltx/ursfs.fd -File: ursfs.fd 1998/03/24 rsfs font definition file (jk) -) - -LaTeX Font Warning: Font shape `U/rsfs/m/n' in size <8.43146> not available -(Font) size <8> substituted on input line 143. - -LaTeX Font Info: Calculating math sizes for size <11.04124> on input line 14 -3. - -LaTeX Font Warning: Font shape `U/rsfs/m/n' in size <5.52061> not available -(Font) size <6> substituted on input line 143. - -LaTeX Font Info: Calculating math sizes for size <10.03749> on input line 14 -3. - -Underfull \vbox (badness 10000) has occurred while \output is active [] - - [1 - -{e:/latex/texlive/2023/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./sn-art -icle.bbl) -Underfull \vbox (badness 10000) has occurred while \output is active [] - - [2] -(./sn-article.aux) - -LaTeX Font Warning: Size substitutions with differences -(Font) up to 0.47939pt have occurred. - - -Package rerunfilecheck Warning: File `sn-article.out' has changed. -(rerunfilecheck) Rerun to get outlines right -(rerunfilecheck) or use package `bookmark'. - -Package rerunfilecheck Info: Checksums for `sn-article.out': -(rerunfilecheck) Before: C25210F02B5B23771470D033D554A391;1899 -(rerunfilecheck) After: 05C3943D0FBC0B5585043DC85D1B3518;2077. - ) -Here is how much of TeX's memory you used: - 14224 strings out of 476025 - 221736 string characters out of 5791021 - 1860382 words of memory out of 5000000 - 34421 multiletter control sequences out of 15000+600000 - 530461 words of font info for 103 fonts, out of 8000000 for 9000 - 1151 hyphenation exceptions out of 8191 - 90i,7n,90p,521b,444s stack positions out of 10000i,1000n,20000p,200000b,200000s - -< -e:/latex/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb> -Output written on sn-article.pdf (2 pages, 140574 bytes). -PDF statistics: - 136 PDF objects out of 1000 (max. 8388607) - 106 compressed objects within 2 object streams - 19 named destinations out of 1000 (max. 500000) - 97 words of extra memory for PDF output out of 10000 (max. 10000000) - diff --git a/waypoint_control/sn-article-template/sn-article.out b/waypoint_control/sn-article-template/sn-article.out deleted file mode 100644 index 9323494..0000000 --- a/waypoint_control/sn-article-template/sn-article.out +++ /dev/null @@ -1,13 +0,0 @@ -\BOOKMARK [1][]{section.1}{\376\377\000I\000n\000t\000r\000o\000d\000u\000c\000t\000i\000o\000n}{}% 1 -\BOOKMARK [1][]{section.2}{\376\377\000R\000e\000s\000u\000l\000t\000s}{}% 2 -\BOOKMARK [2][]{subsection.2.1}{\376\377\000T\000w\000i\000n\000\040\000s\000y\000s\000t\000e\000m\000\040\000a\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{section.2}% 3 -\BOOKMARK [2][]{subsection.2.2}{\376\377\000E\000n\000d\000-\000t\000o\000-\000e\000n\000d\000\040\000d\000a\000t\000a\000\040\000t\000r\000a\000n\000s\000m\000i\000s\000s\000i\000o\000n}{section.2}% 4 -\BOOKMARK [2][]{subsection.2.3}{\376\377\000F\000a\000c\000e\000\040\000d\000i\000f\000f\000e\000r\000e\000n\000t\000\040\000t\000a\000r\000g\000e\000t\000s}{section.2}% 5 -\BOOKMARK [3][]{subsubsection.2.3.1}{\376\377\000P\000e\000d\000e\000s\000t\000r\000i\000a\000n\000\040\000t\000w\000i\000n}{subsection.2.3}% 6 -\BOOKMARK [3][]{subsubsection.2.3.2}{\376\377\000V\000e\000h\000i\000c\000l\000e\000\040\000t\000w\000i\000n}{subsection.2.3}% 7 -\BOOKMARK [3][]{subsubsection.2.3.3}{\376\377\000P\000e\000d\000e\000s\000t\000r\000i\000a\000n\000-\000V\000e\000h\000i\000c\000l\000e\000\040\000t\000w\000i\000n}{subsection.2.3}% 8 -\BOOKMARK [2][]{subsection.2.4}{\376\377\000T\000w\000i\000n\000s\000\040\000i\000n\000\040\000d\000i\000f\000f\000e\000r\000e\000n\000t\000\040\000s\000c\000e\000n\000a\000r\000i\000o\000s}{section.2}% 9 -\BOOKMARK [3][]{subsubsection.2.4.1}{\376\377\000T\000o\000w\000n\0000\0001\000\040\000s\000c\000e\000n\000e\000\040\000t\000w\000i\000n\000n\000i\000n\000g\000\040\000e\000f\000f\000e\000c\000t}{subsection.2.4}% 10 -\BOOKMARK [3][]{subsubsection.2.4.2}{\376\377\000T\000o\000w\000n\0001\0000\000\040\000s\000c\000e\000n\000e\000\040\000t\000w\000i\000n\000n\000i\000n\000g\000\040\000e\000f\000f\000e\000c\000t}{subsection.2.4}% 11 -\BOOKMARK [2][]{subsection.2.5}{\376\377\000C\000r\000i\000t\000i\000c\000a\000l\000-\000S\000t\000a\000t\000e\000\040\000T\000w\000i\000n}{section.2}% 12 -\BOOKMARK [1][]{section.3}{\376\377\000D\000i\000s\000c\000u\000s\000s\000i\000o\000n}{}% 13 diff --git a/waypoint_control/sn-article-template/sn-article.pdf b/waypoint_control/sn-article-template/sn-article.pdf deleted file mode 100644 index 574aecf7ef317f679a5113dcd3d9df85d04a1d57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140574 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

$0 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 X4j;*URe>NdH8r>zNJ0W>p%3~O`r!!b diff --git a/waypoint_control/sn-article-template/sn-article.synctex.gz b/waypoint_control/sn-article-template/sn-article.synctex.gz deleted file mode 100644 index 802761156eb201128f98ab1443f184a938e4bc95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8486 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 - -\usepackage{graphicx}% -\usepackage{multirow}% -\usepackage{amsmath,amssymb,amsfonts}% -\usepackage{amsthm}% -\usepackage{mathrsfs}% -\usepackage[title]{appendix}% -\usepackage{xcolor}% -\usepackage{textcomp}% -\usepackage{manyfoot}% -\usepackage{booktabs}% -\usepackage{algorithm}% -\usepackage{algorithmicx}% -\usepackage{algpseudocode}% -\usepackage{listings}% -%%%% - -%%%%%=============================================================================%%%% -%%%% Remarks: This template is provided to aid authors with the preparation -%%%% of original research articles intended for submission to journals published -%%%% by Springer Nature. The guidance has been prepared in partnership with -%%%% production teams to conform to Springer Nature technical requirements. -%%%% Editorial and presentation requirements differ among journal portfolios and -%%%% research disciplines. You may find sections in this template are irrelevant -%%%% to your work and are empowered to omit any such section if allowed by the -%%%% journal you intend to submit to. The submission guidelines and policies -%%%% of the journal take precedence. A detailed User Manual is available in the -%%%% template package for technical guidance. -%%%%%=============================================================================%%%% - -%% as per the requirement new theorem styles can be included as shown below -\theoremstyle{thmstyleone}% -\newtheorem{theorem}{Theorem}% meant for continuous numbers -%%\newtheorem{theorem}{Theorem}[section]% meant for sectionwise numbers -%% optional argument [theorem] produces theorem numbering sequence instead of independent numbers for Proposition -\newtheorem{proposition}[theorem]{Proposition}% -%%\newtheorem{proposition}{Proposition}% to get separate numbers for theorem and proposition etc. - -\theoremstyle{thmstyletwo}% -\newtheorem{example}{Example}% -\newtheorem{remark}{Remark}% - -\theoremstyle{thmstylethree}% -\newtheorem{definition}{Definition}% - -\raggedbottom -%%\unnumbered% uncomment this for unnumbered level heads - -\begin{document} - -\title[Article Title]{Article Title} - -%%=============================================================%% -%% GivenName -> \fnm{Joergen W.} -%% Particle -> \spfx{van der} -> surname prefix -%% FamilyName -> \sur{Ploeg} -%% Suffix -> \sfx{IV} -%% \author*[1,2]{\fnm{Joergen W.} \spfx{van der} \sur{Ploeg} -%% \sfx{IV}}\email{iauthor@gmail.com} -%%=============================================================%% - -\author*[1,2]{\fnm{First} \sur{Author}}\email{iauthor@gmail.com} - -\author[2,3]{\fnm{Second} \sur{Author}}\email{iiauthor@gmail.com} -\equalcont{These authors contributed equally to this work.} - -\author[1,2]{\fnm{Third} \sur{Author}}\email{iiiauthor@gmail.com} -\equalcont{These authors contributed equally to this work.} - -\affil*[1]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{100190}, \state{State}, \country{Country}}} - -\affil[2]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{10587}, \state{State}, \country{Country}}} - -\affil[3]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{610101}, \state{State}, \country{Country}}} - -%%==================================%% -%% Sample for unstructured abstract %% -%%==================================%% - -\abstract{The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. Authors are advised to check the author instructions for the journal they are submitting to for word limits and if structural elements like subheadings, citations, or equations are permitted.} - -%%================================%% -%% Sample for structured abstract %% -%%================================%% - -% \abstract{\textbf{Purpose:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. -% -% \textbf{Methods:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. -% -% \textbf{Results:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. -% -% \textbf{Conclusion:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to.} - -\keywords{keyword1, Keyword2, Keyword3, Keyword4} - -%%\pacs[JEL Classification]{D8, H51} - -%%\pacs[MSC Classification]{35A01, 65L10, 65L12, 65L20, 65L70} - -\maketitle - -\section{Introduction}\label{sec1} - -The Introduction section, of referenced text \cite{bib1} expands on the background of the work (some overlap with the Abstract is acceptable). The introduction should not include subheadings. - -Springer Nature does not impose a strict layout as standard however authors are advised to check the individual requirements for the journal they are planning to submit to as there may be journal-level preferences. When preparing your text please also be aware that some stylistic choices are not supported in full text XML (publication version), including coloured font. These will not be replicated in the typeset article if it is accepted. - -\section{Results}\label{sec2} - -\subsection{Twin system architecture} -% ?????????????????????? - -\subsection{End-to-end data transmission} -% ??????????????????????????????????????? - -\subsection{Face different targets} - -\subsubsection{Pedestrian twin} -% ???????? - -\subsubsection{Vehicle twin} -% ???????? - -\subsubsection{Pedestrian-Vehicle twin} -% ????????? - -\subsection{Twins in different scenarios} - -\subsubsection{Town01 scene twinning effect} -% ???town01?????????? - -\subsubsection{Town10 scene twinning effect} -% ???town10?????????? - -\subsection{Critical-State Twin} -% ????????(???????)????????????????????(??????????????????)?????? - -\section{Discussion}\label{sec12} - -Discussions should be brief and focused. In some disciplines use of Discussion or `Conclusion' is interchangeable. It is not mandatory to use both. Some journals prefer a section `Results and Discussion' followed by a section `Conclusion'. Please refer to Journal-level guidance for any specific requirements. - - - -%%===========================================================================================%% -%% If you are submitting to one of the Nature Portfolio journals, using the eJP submission %% -%% system, please include the references within the manuscript file itself. You may do this %% -%% by copying the reference list from your .bbl file, paste it into the main manuscript .tex %% -%% file, and delete the associated \verb+\bibliography+ commands. %% -%%===========================================================================================%% - -\bibliography{sn-bibliography}% common bib file -%% if required, the content of .bbl file can be included here once bbl is generated -%%\input sn-article.bbl - -\end{document} diff --git a/waypoint_control/sn-article-template/sn-bibliography.bib b/waypoint_control/sn-article-template/sn-bibliography.bib deleted file mode 100644 index 29764f8..0000000 --- a/waypoint_control/sn-article-template/sn-bibliography.bib +++ /dev/null @@ -1,164 +0,0 @@ - -%% Journal article -@article{bib1, - author = "Campbell, S. L. and Gear, C. W.", - title = "The index of general nonlinear {D}{A}{E}{S}", - journal = "Numer. {M}ath.", - volume = "72", - number = "2", - pages = "173--196", - year = "1995" -} - -%% Journal article with DOI -@article{bib2, - author = "Slifka, M. K. and Whitton, J. L.", - title = "Clinical implications of dysregulated cytokine production", - journal = "J. {M}ol. {M}ed.", - volume = "78", - pages = "74--80", - year = "2000", - doi = "10.1007/s001090000086" -} - -%% Journal article -@article{bib3, - author = "Hamburger, C.", - title = "Quasimonotonicity, regularity and duality for nonlinear systems of - partial differential equations", - journal = "Ann. Mat. Pura. Appl.", - volume = "169", - number = "2", - pages = "321--354", - year = "1995" -} - -%% book, authored -@book{bib4, - author = "Geddes, K. O. and Czapor, S. R. and Labahn, G.", - title = "Algorithms for {C}omputer {A}lgebra", - address = "Boston", - publisher = "Kluwer", - year = "1992" -} - -%% Item 8. Book, chapter -@incollection{bib5, - author = "Broy, M.", - title = "Software engineering---from auxiliary to key technologies", - editor = "Broy, M. and Denert, E.", - booktitle = "Software Pioneers", - pages = "10--13", - address = "New {Y}ork", - publisher = "Springer", - year = "1992" -} - -%% Book, edited -@book{bib6, - editor = "Seymour, R. S.", - title = "Conductive {P}olymers", - address = "New {Y}ork", - publisher = "Plenum", - year = "1981" -} - -%% Chapter in a book in a series with volume titles -@inproceedings{bib7, - author = "Smith, S. E.", - title = "Neuromuscular blocking drugs in man", - editor = "Zaimis, E.", - volume = "42", - booktitle = "Neuromuscular junction. {H}andbook of experimental pharmacology", - pages = "593--660", - address = "Heidelberg", - publisher = "Springer", - year = "1976" -} - -%% Paper presented at a conference -@misc{bib8, - author = "Chung, S. T. and Morris, R. L.", - title = "Isolation and characterization of plasmid deoxyribonucleic acid from - Streptomyces fradiae", - year = "1978", - note = "Paper presented at the 3rd international symposium on the genetics - of industrial microorganisms, University of {W}isconsin, {M}adison, - 4--9 June 1978" -} - -%% Data citation example -@misc{bib9, - author = "Hao, Z. and AghaKouchak, A. and Nakhjiri, N. and Farahmand, A.", - title = "Global integrated drought monitoring and prediction system (GIDMaPS) data sets", - year = "2014", - note = "figshare \url{https://doi.org/10.6084/m9.figshare.853801}" -} - -%% Preprint citation example -@misc{bib10, - author = "Babichev, S. A. and Ries, J. and Lvovsky, A. I.", - title = "Quantum scissors: teleportation of single-mode optical states by means - of a nonlocal single photon", - year = "2002", - note = "Preprint at \url{https://arxiv.org/abs/quant-ph/0208066v1}" -} - -@article{bib11, - author = "Beneke, M. and Buchalla, G. and Dunietz, I.", - title = "Mixing induced {CP} asymmetries in inclusive {B} decays", - journal = "Phys. {L}ett.", - volume = "B393", - year = "1997", - pages = "132-142", - archivePrefix = "arXiv", - eprint = "0707.3168", - primaryClass = "gr-gc" -} - -@softmisc{bib12, - author = "Stahl, B.", - title = "deep{SIP}: deep learning of {S}upernova {I}a {P}arameters", - version = "0.42", - keywords = "Software", - howpublished = "Astrophysics {S}ource {C}ode {L}ibrary", - year = "2020", - month = "Jun", - eid = "ascl:2006.023", - pages = "ascl:2006.023", - archivePrefix = "ascl", - eprint = "2006.023", - adsurl = "{https://ui.adsabs.harvard.edu/abs/2020ascl.soft06023S}", - adsnote = "Provided by the SAO/NASA Astrophysics Data System" -} - -@article{bib13, - author = "Abbott, T. M. C. and others", - collaboration = "DES", - title = "{Dark Energy Survey Year 1 Results: Constraints on Extended Cosmological Models from Galaxy Clustering and Weak Lensing}", - eprint = "1810.02499", - archivePrefix = "arXiv", - primaryClass = "astro-ph.CO", - reportNumber = "FERMILAB-PUB-18-507-PPD", - doi = "10.1103/PhysRevD.99.123505", - journal = "Phys. Rev. D", - volume = "99", - number = "12", - pages = "123505", - year = "2019" -} - -%%============================================================================%% -%% while using chicago reference style, both abbreviated and expanded form of %% -%% author name format is acceptable. Refer below example for expanded form %% -%%============================================================================%% - -%% author = "{Cameron, Deborah}", - single author -%% author = "{Saito, Yukio} and {Hyuga, Hiroyuki}", - double author - -%%======================================%% -%% Example for author names with suffix %% -%%======================================%% - -%% author = "{Price, R. A. Jr} and {Curry, N. {III}} and McCann, K. E. and -%% Fielding, J. L. and {Abercrombie, E. Jr}", diff --git a/waypoint_control/sn-article-template/sn-jnl.cls b/waypoint_control/sn-article-template/sn-jnl.cls deleted file mode 100644 index d25f07c..0000000 --- a/waypoint_control/sn-article-template/sn-jnl.cls +++ /dev/null @@ -1 +0,0 @@ -%% %% This is file `sn-jnl.cls', %% generated with the docstrip utility. %% %% The original source files were: %% %% classes.dtx (with options: `sn-jnl') %% %% This is a generated file. %% %% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 %% The LaTeX3 Project and any individual authors listed elsewhere %% in this file. %% %% This file was generated from file(s) of the LaTeX base system. %% -------------------------------------------------------------- %% %% It may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c %% of this license or (at your option) any later version. %% The latest version of this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.3c or later is part of all distributions of LaTeX %% version 2005/12/01 or later. %% %% This file has the LPPL maintenance status "maintained". %% %% This file may only be distributed together with a copy of the LaTeX %% base system. You may however distribute the LaTeX base system without %% such generated files. %% %% The list of all files belonging to the LaTeX base distribution is %% given in the file `manifest.txt'. See also `legal.txt' for additional %% information. %% %% The list of derived (unpacked) files belonging to the distribution %% and covered by LPPL is defined by the unpacking scripts (with %% extension .ins) which are part of the distribution. %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesClass{sn-jnl} [2019/11/18 v0.1: An authoring template for Springer Journal articles] \newif\if@restonecol \newif\if@titlepage \@titlepagefalse \newif\if@cropmarkson \@cropmarksonfalse \newif\ifDoublecol \Doublecolfalse% \newif\ifpagebody\global\pagebodyfalse% \newif\if@iicol\global\@iicolfalse% \newif\if@bibcomment\global\@bibcommentfalse% \newif\if@referee\global\@refereefalse% \newif\if@vrulerlinenumberon\global\@vrulerlinenumberonfalse% \newif\if@pdflatex\global\@pdflatexfalse% \newif\if@remarkboxon\global\@remarkboxonfalse% \newif\if@Numbered@refstyle\global\@Numbered@refstylefalse% Namedate \newif\if@Spr@basic@refstyle\global\@Spr@basic@refstylefalse% 1.Basic Springer Nature Reference Style/Chemistry Reference Style -> sn-basic.bst \newif\if@Mathphys@numrefstyle\global\@Mathphys@numrefstylefalse% 2.Math and Physical Sciences Reference Style -> sn-mathphys.bst \newif\if@Mathphys@ayrefstyle\global\@Mathphys@ayrefstylefalse% 2.Math and Physical Sciences Reference Style -> sn-mathphys.bst \newif\if@APS@refstyle\global\@APS@refstylefalse% 3.American Physical Society (APS) Reference Style -> sn-APS.bst \newif\if@Vancouver@numrefstyle\global\@Vancouver@numrefstylefalse% 4.Vancouver Reference Style -> sn-vancouver.bst \newif\if@Vancouver@ayrefstyle\global\@Vancouver@ayrefstylefalse% 4.Vancouver Reference Style -> sn-vancouver.bst \newif\if@APA@refstyle\global\@APA@refstylefalse% 5.APA-based Social Sciences/Psychology Reference Style -> sn-apacite.bst \newif\if@Chicago@refstyle\global\@Chicago@refstylefalse% 6.Chicago-based Humanities Reference Style -> sn-chicago.bst \newif\if@Standard@Nature@refstyle\global\@Standard@Nature@refstylefalse% 7.Standard Nature Research Style -> sn-nature.bst %% Template Options \DeclareOption{a4paper}{\PassOptionsToPackage{a4}{crop}} \DeclareOption{a3paper}{\PassOptionsToClass{a3paper}{article}\PassOptionsToPackage{a3}{crop}} \DeclareOption{centre}{\PassOptionsToPackage{center}{crop}} \DeclareOption{crop}{\PassOptionsToPackage{frame}{crop}\global\@cropmarksontrue} \DeclareOption{nocrop}{\PassOptionsToPackage{off}{crop}\global\@cropmarksontrue} \DeclareOption{info}{\PassOptionsToPackage{info}{crop}} \DeclareOption{noinfo}{\PassOptionsToPackage{noinfo}{crop}} %% Classfile Options \DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse} \DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} \DeclareOption{draft}{\setlength\overfullrule{5pt}} \DeclareOption{titlepage}{\@titlepagetrue} \DeclareOption{notitlepage}{\@titlepagefalse} \DeclareOption{onecolumn}{\@twocolumnfalse} \DeclareOption{twocolumn}{\@twocolumntrue} \DeclareOption{openbib}{\let\if@openbib\iftrue} \DeclareOption{pagegrid}{\global\pagebodytrue}% \DeclareOption{iicol}{\global\@iicoltrue}% \DeclareOption{bibcomment}{\global\@bibcommenttrue}% \DeclareOption{referee}{\global\@refereetrue}% \DeclareOption{lineno}{\global\@vrulerlinenumberontrue}% \DeclareOption{pdflatex}{\global\@pdflatextrue}% \DeclareOption{remarkboxoff}{\global\@remarkboxonfalse}% \DeclareOption{sn-basic}{\global\@Spr@basic@refstyletrue}% \DeclareOption{sn-mathphys-num}{\global\@Mathphys@numrefstyletrue}% \DeclareOption{sn-mathphys-ay}{\global\@Mathphys@ayrefstyletrue}% \DeclareOption{sn-aps}{\global\@APS@refstyletrue}% \DeclareOption{sn-vancouver-num}{\global\@Vancouver@numrefstyletrue}% \DeclareOption{sn-vancouver-ay}{\global\@Vancouver@ayrefstyletrue}% \DeclareOption{sn-apa}{\global\@APA@refstyletrue}% \DeclareOption{sn-chicago}{\global\@Chicago@refstyletrue}% \DeclareOption{sn-nature}{\global\@Standard@Nature@refstyletrue}% \DeclareOption{Numbered}{\global\@Numbered@refstyletrue}% %\DeclareOption{NameDate}{\global\@Numbered@refstylefalse}% %%\ExecuteOptions{twosidecrop,crop,centre,info,croppage} \ProcessOptions \LoadClass[twoside,fleqn]{article} \gdef\refereedefns{% \if@referee% \usepackage{setspace}% \doublespacing% \fi}% \refereedefns% %% General Packages Used % %\AtBeginDocument{% %%\newcommand*\ExtraParaSkip{12pt}% %\SetFootnoteHook{\hspace*{-8pt}}% %\DeclareNewFootnote{A}[gobble]% %\setlength{\skip\footinsA}{0pt} %}% % %%%%%%%%%%%%%%%%%%%%%%%%%%%% Fonts & Sizes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %% Fonts Used %%\RequirePackage[T1]{fontenc}% % \DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}% \DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}% \DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}% \DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}% \DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}% \DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}% \DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}% \DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal}% \DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal}% % \renewcommand\normalsize{% \@setfontsize\normalsize{10bp}{12bp}% \abovedisplayskip 12\p@ \@plus2\p@ \@minus1\p@ \abovedisplayshortskip \z@ \@plus3\p@% \belowdisplayshortskip 3\p@ \@plus3\p@ \@minus3\p@% \belowdisplayskip \abovedisplayskip% \let\@listi\@listI}% \normalsize% % \newcommand\medsize{% \@setfontsize\small\@xipt{13}% \abovedisplayskip 5\p@ \@plus3\p@ \@minus4\p@ \abovedisplayshortskip \z@ \@plus2\p@ \belowdisplayshortskip 3\p@ \@plus2\p@ \@minus2\p@ \def\@listi{\leftmargin\leftmargini \topsep 4\p@ \@plus2\p@ \@minus2\p@ \parsep 2\p@ \@plus\p@ \@minus\p@ \itemsep \parsep}% \belowdisplayskip \abovedisplayskip}% % \renewcommand\small{% \@setfontsize\small\@ixpt{11}% \abovedisplayskip 5\p@ \@plus3\p@ \@minus4\p@ \abovedisplayshortskip \z@ \@plus2\p@ \belowdisplayshortskip 3\p@ \@plus2\p@ \@minus2\p@ \def\@listi{\leftmargin\leftmargini \topsep 4\p@ \@plus2\p@ \@minus2\p@ \parsep 2\p@ \@plus\p@ \@minus\p@ \itemsep \parsep}% \belowdisplayskip \abovedisplayskip}% % \renewcommand\footnotesize{% \@setfontsize\footnotesize{7}{8}% \abovedisplayskip 5\p@ \@plus2\p@ \@minus4\p@ \abovedisplayshortskip \z@ \@plus\p@ \belowdisplayshortskip 3\p@ \@plus\p@ \@minus2\p@ \def\@listi{\leftmargin\leftmargini \topsep 3\p@ \@plus\p@ \@minus\p@ \parsep 2\p@ \@plus\p@ \@minus\p@ \itemsep \parsep}% \belowdisplayskip \abovedisplayskip} % \renewcommand\scriptsize{\@setfontsize\scriptsize\@ixpt\@ixpt}% \newcommand\scrisize{\@setfontsize\scrisize{9.3}{9}}% \renewcommand\tiny{\@setfontsize\tiny\@vpt\@vipt}% \renewcommand\large{\@setfontsize\large{12}{14}}% \newcommand\larg{\@setfontsize\larg{11}{13}}% \renewcommand\Large{\@setfontsize\Large{16}{18}}% \renewcommand\LARGE{\@setfontsize\LARGE\@xviipt{22}}% \renewcommand\huge{\@setfontsize\huge\@xxpt{25}}% \renewcommand\Huge{\@setfontsize\Huge\@xxvpt{30}}% % \DeclareMathSizes{\@ixpt}{\@ixpt}{7}{5}% \DeclareMathSizes{\@xpt}{\@xpt}{7}{5}% \DeclareMathSizes{\@xipt}{\@xipt}{7}{5}% % \DeclareRobustCommand*\textsubscript[1]{% \@textsubscript{\selectfont#1}}% % \def\@textsubscript#1{% {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}}% % %%%%%%%%%%%%%%%%%%%%%%%%%%%% Layout Settings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%\RequirePackage{geometry}% % \newlength\columnhsize% % %% Regular Pages (for Opening page - redefined) % \if@iicol% % %% for double column used sn-medium design trim and page size %% % \setlength\headheight{12pt}% \setlength\headsep{5.15mm}% % \setlength\columnsep{8mm}% \setlength\columnhsize{76mm}% % \setlength\maxdepth{0pt}% \setlength\footnotesep{7\p@}% \setlength{\skip\footins}{18\p@ \@plus 6\p@ \@minus 3\p@}% % \RequirePackage[% reversemp, paperwidth=210mm, paperheight=297mm, top={26mm}, headheight={12pt}, headsep={5.15mm}, text={160mm,216mm}, marginparsep=5mm, marginparwidth=12mm, bindingoffset=6mm, footskip=10.13mm,twocolumn]{geometry}% % \renewcommand\footnoterule{% \kern3\p@% \hrule \@height.2mm \@width\columnwidth% \kern5.5\p@}% % \else% %% For single column used smallcond design trim and page size %% \RequirePackage[% reversemp, paperwidth=210mm, paperheight=297mm, top={26mm}, headheight={5.5pt}, headsep={5.6mm}, text={31pc,194.25mm}, marginparsep=5mm, marginparwidth=12mm, bindingoffset=6mm, footskip=10mm]{geometry} % \setlength\maxdepth{0pt}% \setlength\columnsep{5mm}% \setlength{\marginparsep}{5mm}% \setlength{\marginparwidth}{12mm}% \setlength\footnotesep{5.75\p@}% \setlength{\skip\footins}{8\p@ \@plus 4\p@ \@minus 0\p@}% % \renewcommand\footnoterule{% \kern3\p@% \ifodd\c@page% \hrule \@height.2mm \@width\textwidth% \else% \hrule \@height.2mm \@width37mm \fi% \kern5.5\p@}% % \fi% % % \setlength\parindent{1.5em}% % \def\StepUpCounter#1{\global\advance#1by 1\relax}% \def\StepDownCounter#1{\global\advance#1by -1\relax}% % %%%%%%%%%%%%%%%%%%%%%%%%%%%% Pagination Settings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Line spacing \setlength\lineskip{1\p@}% \setlength\normallineskip{1\p@}% %%\renewcommand\baselinestretch{1.5}% \parskip=0pt% % % Page break penalties % \@lowpenalty 51 \@medpenalty 151 \@highpenalty 301 % % Disallow widows and orphans % \clubpenalty 10000 \widowpenalty 10000 % % Disable page breaks before equations, allow pagebreaks after % equations and discourage widow lines before equations. % \displaywidowpenalty 100 \predisplaypenalty 10000 \postdisplaypenalty 0 % % Set these global demerits % \doublehyphendemerits 1000000 % corresponds to badness 800 \finalhyphendemerits 1000000 % corresponds to badness 1000 % % Allow loose lines rather than overfull lines % \vbadness=9999 \tolerance=9999 % % Allow breaking the page in the middle of a paragraph % \interlinepenalty 0 % % Disallow breaking the page after a hyphenated line \brokenpenalty 10000 % % Hyphenation; don't split words into less than three characters \lefthyphenmin=3 \righthyphenmin=3 % % Float placement parameters % % The total number of floats that can be allowed on a page. \setcounter{totalnumber}{3} % % The maximum number of floats at the top and bottom of a page. \setcounter{topnumber}{5} \setcounter{bottomnumber}{5} % % The maximum part of the top or bottom of a text page that can be % occupied by floats. This is set so that at least four lines of text % fit on the page. \renewcommand\topfraction{.921} \renewcommand\bottomfraction{.921} % The minimum amount of a text page that must be occupied by text. % This should accomodate four lines of text. \renewcommand\textfraction{.13} % The minimum amount of a float page that must be occupied by floats. \renewcommand\floatpagefraction{.887} % The same parameters repeated for double column output \renewcommand\dbltopfraction{.88} \renewcommand\dblfloatpagefraction{.88} % Space between floats \setlength\floatsep{18\p@ \@plus 4\p@ \@minus 2\p@} % Space between floats and text \setlength\textfloatsep{15\p@ \@plus 4\p@ \@minus 2\p@} % Space above and below an inline figure \setlength\intextsep {18\p@ \@plus 4\p@ \@minus 2\p@} % For double column floats \setlength\dblfloatsep {20\p@ \@plus 4\p@ \@minus 2\p@} \setlength\dbltextfloatsep{15\p@ \@plus 4\p@ \@minus 2\p@} \hyphenation{Figure Figures Table Tables Equation Equations Section Sections Appendix Theorem Lemma} % %%%%%%%%%%%%%%%%%%%%%%%%%%% Math Settings %%%%%%%%%%%%%%%%%%%%%%%%%%% % %%%%%%%%%%%%%%%%%%%%%%%%%%%% For above/below spacing \def\eqnarray{% \stepcounter{equation}% \def\@currentlabel{\p@equation\theequation}% \global\@eqnswtrue \m@th \global\@eqcnt\z@ \tabskip\@centering \let\\\@eqncr $$\everycr{}\halign to\displaywidth\bgroup \hskip\@centering$\displaystyle\tabskip\z@skip{##}$\@eqnsel &\global\@eqcnt\@ne\hskip \tw@\arraycolsep \hfil${##}$\hfil &\global\@eqcnt\tw@ \hskip \tw@\arraycolsep $\displaystyle{##}$\hfil\tabskip\@centering &\global\@eqcnt\thr@@ \hb@xt@\z@\bgroup\hss##\egroup \tabskip\z@skip \cr } \def\endeqnarray{% \@@eqncr \egroup \global\advance\c@equation\m@ne $$\@ignoretrue } % %%%%%%%%%%%%%%%%%%%%%%%%%%% Titles %%%%%%%%%%%%%%%%%%%%%%%%%%% % \renewcommand\refname{References}% \renewcommand\figurename{Fig.}% defined as per springer style \renewcommand\tablename{Table}% \renewcommand\appendixname{Appendix}% \renewcommand\abstractname{Abstract}% % %%%%%%%%%%%%%%%%%%%%%%%%%%% Article Front Matter %%%%%%%%%%%%%%%%%%%%%%%%%%% % \def\raggedleft{\leftskip0pt plus 1fil\parfillskip=0pt\relax}% \def\raggedright{\rightskip0pt plus 1fil\parfillskip=0pt\relax}% \def\raggedcenter{\leftskip=0pt plus 0.5fil\rightskip=0pt plus 0.5fil% \parfillskip=0pt\let\hb=\break}% \def\titraggedcenter{\leftskip=12pt plus 0.5fil\rightskip=12pt plus 0.5fil% \parfillskip=0pt\let\hb=\break}% \def\absraggedcenter{\leftskip=24pt plus 0.5fil\rightskip=24pt plus 0.5fil% \parfillskip=0pt\let\hb=\break}% % %%% Font Def \def\Artcatfont{\reset@font\fontsize{8bp}{10bp}\selectfont}% \def\Titlefont{\reset@font\fontsize{17bp}{22.5bp}\selectfont\titraggedcenter}% \def\SubTitlefont{\reset@font\fontsize{14bp}{16.5bp}\selectfont\titraggedcenter}% \def\Authorfont{\reset@font\fontsize{12bp}{14.5bp}\selectfont\boldmath\titraggedcenter}% \def\addressfont{\reset@font\fontsize{11bp}{13.5bp}\selectfont\titraggedcenter}% \def\abstractheadfont{\reset@font\fontsize{9bp}{11bp}\bfseries\selectfont\titraggedcenter}% \def\abstractsubheadfont{\reset@font\fontsize{9bp}{11bp}\bfseries\selectfont}% \def\abstractfont{\reset@font\fontsize{9bp}{11bp}\selectfont\leftskip=24pt\rightskip=24pt\parfillskip=0pt plus 1fil}% \def\keywordfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont\leftskip=24pt\rightskip=24pt plus0.5fill}% \def\historyfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont\leftskip=24pt\rightskip=24pt plus0.5fill}% %% Article Type \newbox\artcatbox% \def\articletype#1{\if!#1!\else\setbox\artcatbox\hbox{\Artcatfont\hskip1mm#1\hskip1mm}\fi% \gdef\ArtType{\fboxsep=0pt{\vbox to 4mm{\vfil% {\raggedright\box\artcatbox}\vfil}}}% \gdef\@ArtType{#1}}% %%\articletype{RESEARCH ARTICLE}% \articletype{}% %% Article Title \renewcommand{\title}[2][]{% \gdef\@checktitle{#1}\ifx\@checktitle\empty\gdef\@title{#2}% \gdef\s@title{#2}\else\gdef\@title{#2}\gdef\s@title{#1}\fi% \markboth{\textit{\s@title}}{\textit{\s@title}}}% \def\subtitle#1{\gdef\@subtitle{#1}}\subtitle{}% %% Cross Link for Author & Address \def\jmkLabel#1{\@bsphack\protected@write\@auxout{}{\string\Newlabel{#1}{\@currentlabel}}\@esphack}% \def\Newlabel#1#2{\expandafter\xdef\csname X@#1\endcsname{#2}}% \def\jmkRef#1{\@ifundefined{X@#1}{0}{\csname X@#1\endcsname}}% %% Article Author(s) \let\sep\@empty% \let\authorsep\@empty% \newcount\aucount% \newcount\corraucount% \newcount\punctcount% % \def\artauthors{}% \newif\if@auemail% \newif\if@corauemail% % \def\au@and{\ifnum\punctcount=2\ and\else\unskip, \advance\punctcount by -1 \fi}% % \def\author{\advance\aucount by 1\@ifstar\@@corrauthor\@@author}% % \newcommand{\@@author}[2][]{\def\@authfrstarg{#1}\@corauemailfalse% \g@addto@macro\artauthors{% \ifnum\aucount=1% \global\@auemailtrue% \else% \global\@auemailfalse% \fi% \Authorfont% \def\baselinestretch{1}% \authorsep{#2}\unskip\ifx\@authfrstarg\empty\else\textsuperscript{\smash{{% \@for\@@affmark:=#1\do{\edef\affnum{\@ifundefined{X@\@@affmark}{\@@affmark}{\jmkRef{\@@affmark}}}% \unskip\sep\affnum\let\sep=,}}}}\fi% \def\authorsep{{\au@and} }%%% \global\let\sep\@empty\global\let\@corref\@empty% }}% % \newcommand{\@@corrauthor}[2][]{\def\@authfrstarg{#1}\@corauemailtrue\advance\corraucount by 1% \g@addto@macro\artauthors{% \global\@auemailtrue% \Authorfont% \def\baselinestretch{1}% \authorsep{#2}\unskip\ifx\@authfrstarg\empty\else\textsuperscript{\smash{{% \@for\@@affmark:=#1\do{\edef\affnum{\@ifundefined{X@\@@affmark}{\@@affmark}{\jmkRef{\@@affmark}}}% \unskip\sep\affnum\let\sep=,}}}{*}\hskip-1pt}\fi\unskip% \def\authorsep{\au@and~}%%% \global\let\sep\@empty\global\let\@corref\@empty% }}% %% %% Miscellaneous macros %% %% \def\fnm#1{\leavevmode\hbox{#1}}% \def\sur#1{\unskip~\nobreak\leavevmode\hbox{#1}}% \def\spfx#1{#1}% \def\pfx#1{#1}% \def\sfx#1{#1}% \def\tanm#1{#1}% \def\dgr#1{#1}% % %% Author Email % \let\nomail\relax% \def\corrauthemail{}% \def\authemail{}% \newcount\emailcnt% \def\email#1{\global\advance\emailcnt by 1\relax% \if@corauemail% \g@addto@macro\corrauthemail{% \setcounter{footnote}{0}% \textcolor{blue}{#1};\ % }% \else% \g@addto@macro\authemail{% \setcounter{footnote}{0}% \textcolor{blue}{#1};\ % }% \fi} %% Corrseponding Address \def\@copycorthanks{}% \def\auaddress{}% \def\@auaddress{}% \newcounter{affn}% \newcount\addcount% To check the count of address \renewcommand\theaffn{\arabic{affn}}% \def\affil{\advance\addcount by 1\@ifstar\@@coraddress\@@address}% \newcommand{\@@coraddress}[2][]{%\advance\addcount by 1 \g@addto@macro\auaddress{% \stepcounter{affn}% \xdef\@currentlabel{\theaffn}% \jmkLabel{\theaffn}% {\textsuperscript{#1*}#2.\par} } } %% Macros for present address \newif\ifpresentaddress% \def\@presentaddresstxt{}% \def\presentaddresstxt#1{\gdef\@presentaddresstxt{#1:}}\presentaddresstxt{Present Address}% \newcommand{\presentaddress}[1]{\gdef\@presentaddresstext{\@presentaddresstxt\par#1}\global\presentaddresstrue}% %% Macros for equally contributed \newif\ifequalcont% %\def\@equalconttxt{}% %\def\equalcontxt#1{\gdef\@equalconttxt{#1}}\equalcontxt{These authors contributed equally to this work.}% %\newcommand{\equalcont}[1][\@equalconttxt]{\gdef\@equalconttext{#1}\g@addto@macro\artauthors{$^{\dagger}$}\global\equalconttrue}% \def\@equalconttxt{}% \def\equalcontxt#1{\gdef\@equalconttxt{#1}}\equalcontxt{}% \newcommand{\equalcont}[1]{\gdef\@equalconttext{#1}\g@addto@macro\artauthors{$^{\dagger}$}\global\equalconttrue}% %% Author Address \newcommand{\@@address}[2][]{%%\advance\addcount by 1 \g@addto@macro\auaddress{% \stepcounter{affn}% \xdef\@currentlabel{\theaffn}% \jmkLabel{\theaffn}% {\textsuperscript{#1}#2.\par} }%\theaffn } %% Address tagging \newcommand{\orgdiv}[1]{#1}% \newcommand{\orgname}[1]{#1}% \newcommand{\orgaddress}[1]{#1}% \newcommand{\street}[1]{#1}% \newcommand{\postcode}[1]{#1}% \newcommand{\city}[1]{#1}% \newcommand{\state}[1]{#1}% \newcommand{\country}[1]{#1}% %% Article notes \def\@artnote{}% \def\artnote#1{\gdef\@artnote{#1}}% %% Miscellaneous notes \def\@miscnote{}% \def\miscnote#1{\gdef\@miscnote{\par\addvspace{3pt}#1}}% %% Motto \def\mottofont{\reset@font\fontfamily{\rmdefault}\fontsize{8.5bp}{10bp}\fontshape{it}\selectfont\raggedright} % \let\@motto\@empty \def\mottoraggedright{\rightskip0mm\leftskip=42mm plus 1fil\parfillskip=0pt\relax}% \newcommand{\motto}[2][]{\gdef\@headcheck{#1}\gdef\@motto{\@headcheck\ifx\@headcheck\@empty\vskip12pt\else\fi{\mottofont\mottoraggedright#2\par}}} %% Article Abstract \newcommand\abstracthead{\@startsection {section}{1}{\z@}{-22pt \@plus0ex \@minus0ex}{3pt}{\abstractheadfont}} \newcommand\subabstracthead{\@startsection{subsection}{2}{\z@}{3pt \@plus0ex \@minus0ex}{-.5em}{\abstractsubheadfont}} \def\@abstract{}% \long\def\abstract#1{\def\@abstract{% \let\paragraph\subabstracthead% \abstractfont% \abstracthead*{\abstractname}% #1\par}}% \def\printabstract{\ifx\@abstract\empty\else\@abstract\fi\par}% \def\printkeywords{\ifx\@keywords\empty\else\@keywords\fi\par}% % %% Keywords \def\keywordname{Keywords}% \def\keywords#1{\ifx#1\empty\else\def\@keywords{\par\addvspace{10pt}{\keywordfont{\bfseries\keywordname:} #1\par}}\fi}% \def\@keywords{}% %% PACs \def\pacsbullet{\hbox{\hskip2.5pt,\hskip2.5pt}}% \def\change@commas#1,#2{% \ifx#2\@empty% #1% \else% #1\nobreak\hbox{\pacsbullet}\allowbreak\expandafter\change@commas% \fi% #2}% \newcommand\keywordhead[1]{\par\addvspace{10pt}% {{\keywordfont\bfseries#1:\ }}}% \newcommand{\pacs}[1]{\keywordhead{\pacsname}#1}% % \newcount\PacsCount% \PacsCount=0% % \newcount\PacsTmpCnt% \PacsTmpCnt=1% % \gdef\StorePacsText#1#2{% \edef\GetRoman{\romannumeral#1}% \expandafter\gdef\csname\GetRoman StorePacsTxt\endcsname{#2}% }% % \let\oldpacs\pacs% \renewcommand\pacs[2][PAC Codes]{\gdef\pacsname{{\bfseries#1}}\gdef\@pacs{\keywordfont\raggedright\oldpacs\change@commas#2,\@empty\par} \StepUpCounter{\PacsCount}% \StorePacsText{\the\PacsCount}{\gdef\pacsname{{\bfseries#1}}\keywordfont\raggedright\oldpacs\change@commas#2,\@empty}% }% \def\@pacs{}% %% Glossary \def\gloshead{Glossary}% \newenvironment{glos}[1][\gloshead]{\begingroup\parindent=0pt% \section*{#1} \def\item[##1]{##1,\ }}{% \endgroup}% % %% Article History \def\received#1{\g@addto@macro\@history{{Received #1}}}% \def\revised#1{\g@addto@macro\@history{{; revised #1}}}% \def\accepted#1{\g@addto@macro\@history{{; accepted #1}}}% %% Remark on Front page %% \newdimen\FMremarkdim% \newcommand{\FMremark}{\begingroup\parindent=0pt\parskip=0pt% \if@referee\singlespacing\fi% \fboxsep=6pt\fboxrule=0.5pt% \FMremarkdim=\textwidth%%\paperwidth% \advance\FMremarkdim-\fboxsep% \advance\FMremarkdim-2\fboxrule% \if@referee\vskip-21pt\fi% %%\fbox{\vbox{\hsize=\FMremarkdim\small% \unvbox\fmremarkbox %%}}% \endgroup} \newbox\fmremarkbox% \newenvironment{fmremark}{\begingroup\parindent=0pt% \fboxsep=6pt\fboxrule=0.5pt% \FMremarkdim=\textwidth%%\paperwidth% \advance\FMremarkdim-\fboxsep% \advance\FMremarkdim-2\fboxrule% \global\setbox\fmremarkbox\vbox\bgroup\small% }{\egroup\endgroup} %% Article Header Definition \renewcommand{\@maketitle}{\newpage\null% \if@remarkboxon\vbox to 0pt{\vspace*{-78pt}\hspace*{-18pt}\FMremark}\else\vskip21pt\fi%%\par% \hsize\textwidth\parindent0pt%%%\vskip7pt% %% Aritle Type {\hbox to \textwidth{{\Artcatfont\ArtType\hfill}\par}} %% Aritle Title \ifx\@title\empty\else% \removelastskip\vskip20pt\nointerlineskip% {\Titlefont\@title\par} %\addcontentsline{toc}{chapter}{\@title}% for bookmarks \fi% %% Aritle SubTitle \ifx\@subtitle\empty\else% \vskip9pt% {{\SubTitlefont\@subtitle\par}} \fi% %% Aritle Authors, Address and Correspondings \ifnum\aucount>0 \global\punctcount\aucount% \vskip20pt% \artauthors\par%% authors and emails {\vskip7pt\addressfont\auaddress\par%% corresponding adress \removelastskip\vskip24pt% \ifnum\emailcnt>0\relax% \ifx\corrauthemail\@empty\else{\ifnum\aucount>1*\fi}% Corresponding author(s). E-mail(s): \corrauthemail\par\fi% \ifx\authemail\@empty\else Contributing authors:\ \authemail\fi% \fi% \ifequalcont{\par$^{\dagger}$\@equalconttext\par}\fi% \removelastskip\vskip24pt% \ifpresentaddress{\par\@presentaddresstext\par}\fi% } \fi% {\printabstract\par}% {\printkeywords\par}% \ifx\@pacs\empty\else% \loop\ifnum\PacsCount>0% \csname\romannumeral\PacsTmpCnt StorePacsTxt\endcsname\par% \StepDownCounter{\PacsCount}% \StepUpCounter{\PacsTmpCnt}% \repeat% \fi% %%{\printhistory\par}% %%{\ifx\@motto\empty\else\@motto\fi}% \removelastskip\vskip36pt\vskip0pt}% \usepackage{cuted}% \@ifpackageloaded{cuted}{\gdef\@setmarks{}}{}% %% Printing Article Header \newdimen\firstpagehtcheck \renewcommand\maketitle{\par \@afterindentfalse% \begingroup \gdef\UrlFont{\rmfamily}% \renewcommand\thefootnote{\@fnsymbol\c@footnote}% \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\smash{\@thefnmark}}}}% \long\def\@makefntext##1{\parindent 1em\noindent\small\selectfont \hbox{\@textsuperscript{\normalfont\@thefnmark}}##1}% \if@twocolumn \ifnum \col@number=\@ne% \setbox0=\vbox{\@maketitle} \firstpagehtcheck=\ht0% \advance\firstpagehtcheck by \dp0% \ifdim\firstpagehtcheck>\textheight% \setbox1=\vsplit0to2\textheight% \setbox1=\vbox{\unvbox1}% \setbox2=\vbox{\unvbox0}% \unvbox1% \stripsep=0pt% \begin{strip} \unvbox2% \end{strip} \else \twocolumn[\@maketitle]% \fi \else \@maketitle \fi% \else% \newpage% \global\@topnum\z@% Prevents figures from going at top of page. \@maketitle% \fi% \endgroup% \ifx\@artnote\@empty\else\footnoteA{\@artnote}\fi% \ifx\@miscnote\@empty\else\footnoteA{\@miscnote\par}\fi% \setcounter{footnote}{0}% \global\let\thanks\relax% \global\let\artnote\relax% \global\let\maketitle\relax% \global\let\@maketitle\relax% \global\let\@thanks\@empty% \global\let\@author\@empty% \global\let\@date\@empty% \global\let\title\relax% \global\let\author\relax% \global\let\date\relax% \global\let\and\relax% \pagestyle{headings}% %%%print continuous abstract on next page \@afterheading% %%\vskip-18pt% this is included to avoid vertical space at the beginning of left column on article opening pages }% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Page Styles %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \def\opheaderfont{\reset@font\fontsize{10bp}{0bp}\selectfont}% \def\headerfont{\reset@font\fontsize{10bp}{0bp}\selectfont}% \def\footerfont{\reset@font\fontsize{10bp}{0bp}\selectfont}% %% Regular Page Style \def\ps@headings{% \def\@oddfoot{\hfill\thepage\hfill}% \let\@evenfoot\@oddfoot% \def\@evenhead{% \vbox to 0pt{\vspace*{-48pt}% \hbox to \hsize{\hfill \relax\hfill}}\par%% \hspace*{-\textwidth}\hbox to \hsize{\hfill}}% \def\@oddhead{% \vbox to 0pt{\vspace*{-48pt}% \hbox to \hsize{\hfill \relax\hfill}}\par%% \hspace*{-\textwidth}\hbox to \hsize{\hfill}}% \let\@mkboth\markboth% }% %% Opening Page Style \def\ps@titlepage{% %%\def\@oddhead{\vbox{\vskip-36pt\hbox to \textwidth{\hfill\includegraphics{springer-nature-logo}\hspace*{-1pt}}}}% %%\let\@oddhead\@empty\let\@evenhead\@empty% \def\@oddhead{% \vbox to 0pt{\vspace*{-38pt}% \hbox to \hsize{\hfill \hfill}}}%% \let\@evenhead\@oddhead% \def\@oddfoot{\vbox to 18pt{\vfill\reset@font\rmfamily\hfil\thepage\hfil}}%% \def\@evenfoot{}}% \def\ps@plain{\let\@mkboth\@gobbletwo% \let\@oddhead\@empty\let\@evenhead\@empty% \def\@oddfoot{\vbox to 18pt{\vfill\reset@font\rmfamily\hfil ddd\thepage\hfil}}% \let\@evenfoot\@oddfoot}% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Sections %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \def\numbered{\setcounter{secnumdepth}{3}}% \def\unnumbered{\setcounter{secnumdepth}{0}}% \numbered%% default is numbered Sections \renewcommand\thesection {\@arabic\c@section}% \renewcommand\thesubsection {\thesection.\@arabic\c@subsection}% \renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection}% \renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph}% \renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph}% %% \def\@seccntformat#1{\csname the#1\endcsname\hskip.5em}% \def\@sect#1#2#3#4#5#6[#7]#8{% \ifnum #2>\c@secnumdepth \let\@svsec\@empty \else \refstepcounter{#1}% \protected@edef\@svsec{\@seccntformat{#1}\relax}% \fi \@tempskipa #5\relax \ifdim \@tempskipa>\z@ \begingroup #6{% \@hangfrom{\hskip #3\relax\@svsec}% \interlinepenalty \@M #8\@@par}% \endgroup \csname #1mark\endcsname{#7}% \addcontentsline{toc}{#1}{% \ifnum #2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}% \fi #7}% \else \def\@svsechd{% #6{\hskip #3\relax \@svsec #8.}% \csname #1mark\endcsname{#7}% \addcontentsline{toc}{#1}{% \ifnum #2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}% \fi #7}}% \fi \@xsect{#5}} % \def\sectionfont{\reset@font\fontfamily{\rmdefault}\fontsize{14bp}{16bp}\bfseries\selectfont\raggedright\boldmath}% \def\subsectionfont{\reset@font\fontfamily{\rmdefault}\fontsize{12bp}{14bp}\bfseries\selectfont\raggedright\boldmath}% \def\subsubsectionfont{\reset@font\fontsize{11bp}{13bp}\bfseries\selectfont\raggedright\boldmath}% \def\paragraphfont{\reset@font\fontsize{10bp}{12bp}\bfseries\itshape\selectfont\raggedright}% % \def\subparagraphfont{\itshape}% \def\bmheadfont{\reset@font\fontfamily{\rmdefault}\fontsize{10bp}{12bp}\bfseries\selectfont\raggedright\boldmath}% % \renewcommand\section{\@startsection{section}{1}{\z@}% {-12pt \@plus -4pt \@minus -2pt}% {9pt}% {\sectionfont}} \renewcommand\subsection{\@startsection{subsection}{2}{\z@}% {-12pt \@plus -4pt \@minus -2pt}% {6pt}% {\subsectionfont}} \renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% {-12pt \@plus -4pt \@minus -2pt}% {6pt}% {\subsubsectionfont}} \renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}% {-12pt \@plus -4pt \@minus-2pt}% {3pt}% {\paragraphfont}} \renewcommand\subparagraph{\@startsection{subparagraph}{5}{\z@}% {6pt \@plus1ex \@minus.2ex}% {-1em}% {\subparagraphfont}} \newcommand\bmhead{\@startsection{subparagraph}{5}{\z@}% {6pt \@plus1ex \@minus .2ex}% {-1em}% {\bmheadfont}} % \def\@startsection#1#2#3#4#5#6{% \if@noskipsec \leavevmode \fi \par \@tempskipa #4\relax \@afterindenttrue \ifdim \@tempskipa <\z@ \@tempskipa -\@tempskipa \@afterindentfalse \fi \if@nobreak \everypar{}% \else \addpenalty\@secpenalty\addvspace\@tempskipa \fi \@ifstar {\@ssect{#3}{#4}{#5}{#6}}% {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Lists %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \newdimen\labelwidthi% \newdimen\labelwidthii% \newdimen\labelwidthiii% \newdimen\labelwidthiv% \def\normal@labelsep{0.5em}% \labelsep\normal@labelsep% \settowidth{\labelwidthi}{(iii)}% \settowidth{\labelwidthii}{(d)}% \settowidth{\labelwidthiii}{(iii)}% \settowidth{\labelwidthiv}{(M)}% \leftmargini\labelwidthi \advance\leftmargini\labelsep \leftmarginii\labelwidthii \advance\leftmarginii\labelsep \leftmarginiii\labelwidthiii \advance\leftmarginiii\labelsep \leftmarginiv\labelwidthiv \advance\leftmarginiv\labelsep \def\setleftmargin#1#2{\settowidth{\@tempdima}{#2}\labelsep\normal@labelsep \csname labelwidth#1\endcsname\@tempdima \@tempdimb\@tempdima \advance\@tempdimb\labelsep \csname leftmargin#1\endcsname\@tempdimb} \def\@listI{\leftmargin\leftmargini \labelwidth\labelwidthi \labelsep\normal@labelsep % \topsep \z@ \topsep\baselineskip %%updated \partopsep\z@ \parsep\z@ \itemsep\z@ \listparindent 1em} \def\@listii{\leftmargin\leftmarginii \labelwidth\labelwidthii \labelsep\normal@labelsep \topsep\z@ \partopsep\z@ \parsep\z@ \itemsep\z@ \listparindent 1em} \def\@listiii{\leftmargin\leftmarginiii \labelwidth\labelwidthiii \labelsep\normal@labelsep \topsep\z@ \partopsep\z@ \parsep\z@ \itemsep\z@ \listparindent 1em} \def\@listiv{\leftmargin\leftmarginiv \labelwidth\labelwidthiv \labelsep\normal@labelsep \topsep\z@ \partopsep\z@ \parsep\z@ \itemsep\z@ \listparindent 1em} \let\@listi\@listI \@listi % \setlength \labelsep {.5em} \setlength \labelwidth{\leftmargini} \addtolength\labelwidth{-\labelsep} \@beginparpenalty -\@lowpenalty \@endparpenalty -\@lowpenalty \@itempenalty -\@lowpenalty \def\labelitemi{$\bullet$} \def\labelitemii{$\cdot$} \def\labelenumi{\theenumi.} \def\theenumi{\arabic{enumi}} \def\labelenumii{(\alph{enumii})} \def\theenumii{\alph{enumii}} \def\labelenumiii{(\roman{enumiii})}\def\theenumiii{\roman{enumiii}} \def\labelenumiv{(\Alph{enumiv})} \def\theenumiv{\Alph{enumiv}} % %%%%%%%%%%%%%%%%%%%%%%%%%%% Ordered & Unordered List %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \def\listfont{\normalsize}% % \def\enumargs{% \listfont% \leftmargini0pt% \leftmarginii0pt% \leftmarginiii0pt% \ifnum\@enumdepth=3\topsep0pt\else\ifnum\@enumdepth=2\topsep0pt\else\topsep 6pt\fi\fi% \partopsep \z@% \itemsep \z@% \parsep \z@% \labelsep 0.5em% \rightmargin \z@% \raggedright% \listparindent \parindent% \itemindent \z@}% \def\enumerate{% \@ifnextchar[{\@numerate}{\@numerate[0.]}} \def\@numerate[#1]{\par% \ifnum \@enumdepth >3 \@toodeep\else \advance\@enumdepth \@ne \edef\@enumctr{enum\romannumeral\the\@enumdepth} \list{\csname label\@enumctr\endcsname}{% \enumargs% \setlength{\leftmargin}{\csname leftmargin\romannumeral\the\@enumdepth\endcsname} \usecounter{\@enumctr} \settowidth\labelwidth{#1} \addtolength{\leftmargin}{\labelwidth} \addtolength{\leftmargin}{\labelsep} \def\makelabel##1{\hss\llap{##1}}}% \fi } \let\endenumerate\endlist %%Unnumbered list%% \def\unenumargs{% \listfont% \leftmargini\parindent% \topsep6pt% \partopsep \z@% \itemsep \z@% \parsep \z@% \labelsep 0\p@% \rightmargin \z@% \raggedright% \listparindent \parindent% \itemindent -12pt}% \def\unenumerate{% \@ifnextchar[{\@unenumerate}{\@unenumerate[0.]}} \def\@unenumerate[#1]{\par% \ifnum \@enumdepth >3 \@toodeep\else \advance\@enumdepth \@ne \edef\@enumctr{enum\romannumeral\the\@enumdepth} \list{}{% \unenumargs \setlength{\leftmargin}{\csname leftmargin\romannumeral\the\@enumdepth\endcsname} \usecounter{\@enumctr} \settowidth\labelwidth{#1} \addtolength{\leftmargin}{0pt} \addtolength{\leftmargin}{0pt} \def\makelabel##1{\hss\llap{##1}}}% \fi } \let\endunenumerate\endlist% %% bulleted list \def\itemargs{% \listfont% \leftmargini0pt% \leftmarginii0pt% \ifnum\@enumdepth=3\topsep0pt\else\ifnum\@enumdepth=2\topsep0pt\else\topsep 6pt\fi\fi% \partopsep \z@% \itemsep \z@% \parsep \z@% \labelsep 0.5em% \rightmargin \z@% \raggedright% \listparindent \z@% \itemindent \z@}% \renewcommand\labelitemi{\raise1pt\hbox{\textbullet}}% \renewcommand\labelitemii{\textendash}% \def\itemize{% \@ifnextchar[{\@itemize}{\@itemize[$\bullet$]}} \def\@itemize[#1]{\par% \ifnum \@itemdepth >3 \@toodeep\else \advance\@itemdepth \@ne \edef\@itemctr{item\romannumeral\the\@itemdepth} \list{\csname label\@itemctr\endcsname}{% \itemargs \setlength{\leftmargin}{\csname leftmargin\romannumeral\the\@itemdepth\endcsname} \settowidth\labelwidth{#1} \addtolength{\leftmargin}{\labelwidth} \addtolength{\leftmargin}{\labelsep} \def\makelabel##1{\hss \llap{##1}}}% \fi } \let\enditemize\endlist % \def\quote{\list{}{\itemindent\z@ \leftmargin 1em \rightmargin \z@}% \item[]} \let\endquote\endlist % \def\descriptionlabel#1{\hspace\labelsep \itshape #1} \def\description{\list{}{\labelwidth\z@ \leftmargin \z@ \topsep6pt\itemindent \z@ %-\leftmargin \let\makelabel\descriptionlabel}} \let\enddescription\endlist % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Float %%%%%%%%%%%%%%%%%%%%%%%%%%%% \setlength\abovecaptionskip{2.25\p@}% \setlength\belowcaptionskip{6\p@}% \setlength\arraycolsep{2\p@}% \setlength\tabcolsep{6\p@}% \setlength\arrayrulewidth{.4\p@}% \setlength\doublerulesep{2\p@}% \setlength\tabbingsep{\labelsep}% \def\fnum@figure{{\bfseries\figurename\space\thefigure}}% \def\fnum@table{{\bfseries\tablename\space\thetable}}% \def\FigName{figure}% \long\def\@makecaption#1#2{% \ifx\FigName\@captype \vskip\abovecaptionskip \@figurecaption{#1}{#2} \else \@tablecaption{#1}{#2} \vskip\belowcaptionskip \fi% } %% Figure \def\figurecaptionfont{\reset@font\fontfamily{\rmdefault}\fontsize{8}{9.5}\selectfont}% \newdimen\figwidth% \newdimen\figheight% \newdimen\sidecapwidth \newdimen\wrapcapline% \newdimen\totalwrapline% \newdimen\wraptotline% %% Figures macro \newbox\figurebox% \newbox\wrapfigcapbox \def\FIG#1#2{% \setbox\figurebox\hbox{#1}% %% Figure dimensions \figwidth\wd\figurebox% \figheight\ht\figurebox% {\parbox{\hsize}{% \centerline{\box\figurebox}% %% Caption #2}}} %% Figures caption \newbox\figcapbox \newbox\capbox \long\def\@figurecaption#1#2{{\figurecaptionfont{\bfseries#1}\hskip.7em#2\par}}% \newenvironment{unnumfigure}{\begingroup\setlength{\topsep}{12pt}% \begin{center}}{\end{center}\endgroup} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \@ifpackageloaded{booktabs}{\cmidrulewidth=.15pt}{}% % \def\tablecaptionfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont}% \def\tablebodyfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont}% \def\tablecolheadfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont\bfseries\boldmath}% \def\tablefootnotefont{\reset@font\fontsize{8bp}{9.5bp}\selectfont}% %% Table Macro \newskip\headwidthskip% \def\tabraggedcenter{\leftskip=0pt plus 0.5fil\rightskip=0pt plus 0.5fil\parfillskip=0pt}% \newenvironment{@processtable}[4]{% \setbox4=\hbox to \hsize{\hss% \begin{minipage}[t]{#4}% \tabraggedcenter% \caption{#1}\par% {\tablebodyfont\noindent\ignorespaces#2\par}\par\vglue6pt% {\if!#3!\else{\tablefootnotefont#3}\fi}% \end{minipage}% \hss}% \box4\par}% \newcommand\TBL[3]{\begingroup% % \if!#1!\let\caption\relax\fi% % \global\setbox\temptbox=\hbox{\bgroup{\tablebodyfont#2}\egroup}% \global\tempdime\wd\temptbox% \@processtable{#1}{\global\headwidthskip=\tempdime% \vbox{#2}}{#3}{\tempdime}% \endgroup}% %% Table Caption \newbox\tabcapbox% \newbox\temptbox% \newdimen\tempdime% \newdimen\tabhtdime% \long\def\@tablecaption#1#2{% \setbox\tabcapbox\vbox{\tablecaptionfont\raggedright% {\bfseries #1}{\hskip2mm}#2\vphantom{y}\par}% \box\tabcapbox% } %% Table Column Heads \def\TCH#1{{\tablecolheadfont #1}} %% Table Footnotes \newenvironment{tablenotes}{\list{}{\setlength{\labelsep}{0pt}% \setlength{\labelwidth}{0pt}% \setlength{\leftmargin}{0pt}% \setlength{\rightmargin}{0pt}% \setlength{\topsep}{-6pt}% \setlength{\itemsep}{2pt}% \setlength{\partopsep}{0pt}% \setlength{\listparindent}{0em}% \setlength{\parsep}{0pt}}% \item\relax% }{\endlist}% \def\tnote#1{$^{#1}$}%% %% Table Rules \def\toprule{%\noalign{\vskip3pt} \noalign{\ifnum0=`}\fi \hrule \@height 0\p@ \@width 0pt \hrule \@height 0.75\p@ % <- rule height \hrule \@height 5pt \@width 0pt \futurelet\@tempa\@xhline} % Middle rule \def\midrule{\noalign{\ifnum0=`}\fi% \hrule \@height 3pt \@width 0pt \hrule \@height .5pt % <- rule height \hrule \@height 5pt \@width 0pt \futurelet \@tempa\@xhline} % Bottom rule \def\botrule{\noalign{\ifnum0=`}\fi \hrule \@height 3pt \@width 0pt \hrule \@height 0.75\p@ % <- rule height \hrule \@height 3pt \@width 0pt \futurelet\@tempa\@xhline} % \def\@@@cmidrule[#1-#2]#3#4{\global\@cmidla#1\relax \global\advance\@cmidla\m@ne \ifnum\@cmidla>0\global\let\@gtempa\@cmidrulea\else \global\let\@gtempa\@cmidruleb\fi \global\@cmidlb#2\relax \global\advance\@cmidlb-\@cmidla \global\@thisrulewidth=#3 \@setrulekerning{#4} \ifnum\@lastruleclass=\z@\vskip 3\p@\fi \ifnum0=`{\fi}\@gtempa \noalign{\ifnum0=`}\fi\futurenonspacelet\@tempa\@xcmidrule} \def\@xcmidrule{% \ifx\@tempa\cmidrule \vskip-\@thisrulewidth \global\@lastruleclass=\@ne \else \ifx\@tempa\morecmidrules \vskip \cmidrulesep \global\@lastruleclass=\@ne\else \vskip 5\p@ \global\@lastruleclass=\z@ \fi\fi \ifnum0=`{\fi}} \let\cline\cmidrule \usepackage[figuresright]{rotating}% \usepackage{threeparttable} \let\tableorg\table% \let\endtableorg\endtable% \let\sidewaystableorg\sidewaystable% \let\endsidewaystableorg\endsidewaystable% \renewenvironment{table}[1][]% {\begin{tableorg}[#1]% \begin{center} \begin{threeparttable} \tablebodyfont% \renewcommand\footnotetext[2][]{{\removelastskip\vskip3pt% \let\tablebodyfont\tablefootnotefont% \hskip0pt\if!##1!\else{\smash{$^{##1}$}}\fi##2\par}}% }{\end{threeparttable}\end{center}\end{tableorg}} \renewenvironment{sidewaystable}[1][]% {\begin{sidewaystableorg}[#1]% \begin{center} \begin{threeparttable} \tablebodyfont% \renewcommand\footnotetext[2][]{{\removelastskip\vskip3pt% \let\tablebodyfont\tablefootnotefont% \hskip0pt\if!##1!\else{\smash{$^{##1}$}}\fi##2\par}}% }{\end{threeparttable}\end{center}\end{sidewaystableorg}} %%%%%%%%%%%%%%%%%%%%%%%%%%%% Other Env. %%%%%%%%%%%%%%%%%%%%%%%%% \def\quotefont{\reset@font\fontfamily{\rmdefault}\fontsize{9}{11}\selectfont}% \renewenvironment{quote} {\list{}{\topsep=0pt\topsep6pt\leftmargin=1em\raggedright\quotefont}% \item\relax} {\endlist} % %%%%%%%%%%%%%%%%%%%%%%%%%%%% Appendix %%%%%%%%%%%%%%%%%%%%%%%%% % \newif\ifbackmatter% \newcommand{\backmatter}{\global\backmattertrue}% \usepackage[title]{appendix}% \@ifpackageloaded{appendix}{% % \renewenvironment{appendices}{% \@resets@pp \if@dotoc@pp \if@dopage@pp % both page and toc \if@chapter@pp % chapters \clear@ppage \fi \appendixpage \else % toc only \if@chapter@pp % chapters \clear@ppage \fi \addappheadtotoc \fi \else \if@dopage@pp % page only \appendixpage \fi \fi \if@chapter@pp \if@dotitletoc@pp \@redotocentry@pp{chapter} \fi \else \if@dotitletoc@pp \@redotocentry@pp{section} \fi \if@dohead@pp \def\sectionmark##1{% \if@twoside \markboth{\@formatsecmark@pp{##1}}{} \else \markright{\@formatsecmark@pp{##1}}{} \fi} \fi \if@dotitle@pp \def\sectionname{\appendixname} \def\@seccntformat##1{\@ifundefined{##1name}{}{\csname ##1name\endcsname\ }% \csname the##1\endcsname\quad} \fi \fi }{% \@ppsaveapp\@pprestoresec} %% \AtBeginDocument{% % \let\oldappendices\appendices% \let\oldendappendices\endappendices% %% \renewenvironment{appendices}{% \setcounter{figure}{0}% \setcounter{table}{0}% \setcounter{equation}{0}% %% \begin{oldappendices}% \gdef\thefigure{\@Alph\c@section\arabic{figure}}% \gdef\thetable{\@Alph\c@section\arabic{table}}% \gdef\theequation{\@Alph\c@section\arabic{equation}}% }{\end{oldappendices}} } %% }{} % %%%%%%%%%%%%%%%%%%%%%%%%%%% Article History %%%%%%%%%%%%%%%%%%%% % \def\@history{} \def\printhistory{{\par\addvspace{8pt}% \historyfont\noindent% \ifx\@history\empty\gdef\@history{Received xx xxx xxxx}\fi\@history\par}}% % %%%%%%%%%%%%%%%%%%%%%%% Footnotes %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \renewcommand\@makefntext[1]{% \hskip8pt{\smash{\@makefnmark}}#1} % \RequirePackage{hyperref}% %%\RequirePackage{hypcap}% \gdef\breakurldefns{% \if@pdflatex\else% \RequirePackage[hyphenbreaks]{breakurl}% % \let\href\burlalt% \fi}% \breakurldefns% % \bgroup % \catcode`\&=12\relax % \hyper@normalise\burl@addtocharlistbefore{%} % \hyper@normalise\burl@addtocharlistafter{:/.?#&_,;!=+~}%% for extra breaks in url % \egroup % \burl@defifstructure % \hypersetup{% colorlinks, breaklinks=true, plainpages=false,% citecolor=blue, linkcolor=blue, urlcolor=blue, bookmarksopen=true,% bookmarksnumbered=false,% bookmarksdepth=5% } % \AtBeginDocument{\renewcommand\UrlFont{\rmfamily}}% % \AtBeginDocument{% \@ifpackageloaded{natbib}{% \renewcommand\bibsection{% \section*{\refname}% }% }{}% }% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \pagestyle{headings}% \pagenumbering{arabic}% \sloppy% \frenchspacing% \flushbottom% %%% special parameters for TeX \adjdemerits=100 \linepenalty=100 % %%%%%%%%%%%%%%% Biography % \RequirePackage{wrapfig}% % % % \begin{wrapfigure}[12]{r}[34pt]{5cm}

\end{wrapfigure} % -- - ---- --- % [number of narrow lines] {placement} [overhang] {width of figure} \newcount\wraplines% %%\wraplines=5% % \newbox\@authorfigbox% \newskip\@authorfigboxdim% % \newskip\biofigadjskip% \biofigadjskip=0pt% % \def\authbiotextfont{\reset@font\fontsize{8bp}{9.5bp}\selectfont}% % \newenvironment{biography}[2]{\par\addvspace{11.5pt plus3.375pt minus1.6875pt}%\lineno@off% \def\author##1{{\bfseries##1}}% \if!#1!\def\@authorfig{}\else\def\@authorfig{{#1}}\fi% \setbox\@authorfigbox=\hbox{#1}% \@authorfigboxdim=\wd\@authorfigbox% \if@iicol\advance\@authorfigboxdim by -10pt\else\advance\@authorfigboxdim by -2pt\fi% \wraplines=9\fboxrule=1pt\fboxsep=6pt% \noindent{% \ifx\@authorfig\@empty\else\unskip% \begin{wrapfigure}[\wraplines]{l}[0pt]{\@authorfigboxdim}%{38.25mm}% \vskip-19pt\addvspace{\biofigadjskip}% \@authorfig% \end{wrapfigure}% \fi% {\authbiotextfont#2\par}% \par% }}{\par\addvspace{10.5pt plus3.375pt minus1.6875pt}} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Theorem %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \usepackage{amsthm} \usepackage{fix-cm} \@ifpackageloaded{amsthm}{% % %\let\proof\relax% %\let\endproof\relax% \def\@begintheorem#1#2[#3]{% \deferred@thm@head{\the\thm@headfont \thm@indent \@ifempty{#1}{\let\thmname\@gobble}{\let\thmname\@iden}% \@ifempty{#2}{\let\thmnumber\@gobble}{\let\thmnumber\@iden}% \@ifempty{#3}{\let\thmnote\@gobble}{\let\thmnote\@iden}% \thm@swap\swappedhead\thmhead{#1}{#2}{#3}% \the\thm@headpunct \thmheadnl % possibly a newline. \hskip\thm@headsep }% \ignorespaces } \def\@endtheorem{\endtrivlist\@endpefalse} \AtBeginDocument{% % \DeclareRobustCommand{\S}{\ifmmode\mathsection\else\textsection\fi} \DeclareSymbolFont{AMSa}{U}{msa}{m}{n}% \DeclareMathSymbol{\opensquare}{\mathord}{AMSa}{"03}% \def\qedsymbol{\ensuremath{\opensquare}}% % \newenvironment{spiproof}[1][\proofname]{\par\removelastskip%\vspace*{2pt}% \pushQED{\qed}% \small\normalfont \topsep7.5\p@\@plus7.5\p@\relax% \trivlist% \item[\hskip\labelsep% \itshape% #1\@addpunct{}]\ignorespaces% }{% \popQED\endtrivlist\@endpefalse% }% % \let\proof\spiproof\let\endproof\endspiproof% % }% % \def\thm@space@setup{% \thm@preskip=12pt% \thm@postskip=12pt} % %%%%%%%%%%%%%%%%%% StyleOne % \newtheoremstyle{thmstyleone}% Numbered {18pt plus2pt minus1pt}% Space above {18pt plus2pt minus1pt}% Space below {\small\itshape}% Body font {0pt}% Indent amount {\small\bfseries}% Theorem head font {}% Punctuation after theorem head {.5em}% Space after theorem headi {\thmname{#1}\thmnumber{\@ifnotempty{#1}{ }\@upn{#2}}% \thmnote{ {\the\thm@notefont(#3)}}}% Theorem head spec (can be left empty, meaning `normal') % \newtheoremstyle{thmstyletwo}% Numbered {18pt plus2pt minus1pt}% Space above {18pt plus2pt minus1pt}% Space below {\small\normalfont}% Body font {0pt}% Indent amount {\small\itshape}% Theorem head font {}% Punctuation after theorem head {.5em}% Space after theorem headi {\thmname{#1}\thmnumber{\@ifnotempty{#1}{ }{#2}}% \thmnote{ {\the\thm@notefont(#3)}}}% Theorem head spec (can be left empty, meaning `normal') % \newtheoremstyle{thmstylethree}% Definition {18pt plus2pt minus1pt}% Space above {18pt plus2pt minus1pt}% Space below {\small\normalfont}% Body font {0pt}% Indent amount {\small\bfseries}% Theorem head font {}% Punctuation after theorem head {.5em}% Space after theorem headi {\thmname{#1}\thmnumber{\@ifnotempty{#1}{ }\@upn{#2}}% \thmnote{ {\the\thm@notefont(#3)}}}% Theorem head spec (can be left empty, meaning `normal') % \newtheoremstyle{thmstylefour}% Proof {18pt plus2pt minus1pt}% Space above {18pt plus2pt minus1pt}% Space below {\small\normalfont}% Body font {0pt}% Indent amount {\small\itshape}% Theorem head font {}% Punctuation after theorem head {.5em}% Space after theorem headi {\global\proofthmtrue\thmname{#1} \thmnote{#3}}% Theorem head spec (can be left empty, meaning `normal') % }{} %% Macros for bibliographystyles %% % \def\bibcommenthead{\if@bibcomment\begingroup\parindent=0pt\parskip=0pt% % \removelastskip\vskip13pt\nointerlineskip% % % \vbox{\bibfont If you are submitting to one of the Nature Research journals, using the eJP % submission system, please include the references within the manuscript file itself. You may % do this by copying the reference list from your .bbl file, and pasting it into the bibliography % environment of the main manuscript .tex file.}\par% % \removelastskip\nobreak\vskip13pt\nobreak% % \endgroup\fi}% \def\bibcommenthead{}% \if@Spr@basic@refstyle% \if@Numbered@refstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \else% \usepackage[authoryear]{natbib}% \setcitestyle{aysep={}} \gdef\NumBib{NO}% \fi% \bibliographystyle{sn-basic}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \if@Mathphys@numrefstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \bibliographystyle{sn-mathphys-num}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \else% \if@Mathphys@ayrefstyle% \usepackage[authoryear]{natbib}% \gdef\NumBib{NO}% \setcitestyle{aysep={}} \bibliographystyle{sn-mathphys-ay}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi\fi% \if@APS@refstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \bibliographystyle{sn-APS}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \if@Vancouver@numrefstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \bibliographystyle{sn-vancouver-num}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \else% \if@Vancouver@ayrefstyle% \usepackage[authoryear]{natbib}% \gdef\NumBib{NO}% \setcitestyle{aysep={}} \bibliographystyle{sn-vancouver-ay}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi\fi% \if@APA@refstyle% \if@Numbered@refstyle% \usepackage[natbibapa]{apacite}% \gdef\NumBib{YES}% \else% \usepackage[natbibapa]{apacite}% \gdef\NumBib{NO}% \fi% \bibliographystyle{sn-apacite}% \def\refdoi#1{\urlstyle{rm}\url{#1}}% \renewcommand{\doiprefix}{}% \AtBeginDocument{% \renewcommand{\BPBI}{.}% Period between initials - command from apacite.sty }% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \if@Chicago@refstyle% \if@Numbered@refstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \else% \usepackage[authoryear]{natbib}% \gdef\NumBib{NO}% \setcitestyle{aysep={}} \fi% \bibliographystyle{sn-chicago}% \hypersetup{urlcolor=black,colorlinks=false,pdfborder={0 0 0}}\urlstyle{same}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \if@Standard@Nature@refstyle% \usepackage[numbers,sort&compress]{natbib}% \gdef\NumBib{YES}% \bibliographystyle{sn-nature}% \setlength{\bibsep}{1em}% \def\bibfont{\reset@font\fontfamily{\rmdefault}\normalsize\selectfont}% \fi% \AtBeginDocument{\allowdisplaybreaks}% \def\eqnheadfont{\reset@font\fontfamily{\rmdefault}\fontsize{16}{18}\bfseries\selectfont}% \newcommand{\eqnhead}[1]{\begingroup% \begin{center} {\eqnheadfont #1}\par% \end{center} \removelastskip\vskip24pt% \thispagestyle{titlepage}%% %%\thispagestyle{empty}% \endgroup} %% Macros for border matrix %% \newif\if@borderstar \def\bordermatrix{\@ifnextchar*{% \@borderstartrue\@bordermatrix@i}{\@borderstarfalse\@bordermatrix@i*}% } \def\@bordermatrix@i*{\@ifnextchar[{\@bordermatrix@ii}{\@bordermatrix@ii[()]}} \def\@bordermatrix@ii[#1]#2{% \begingroup \m@th\@tempdima8.75\p@\setbox\z@\vbox{% \def\cr{\crcr\noalign{\kern 2\p@\global\let\cr\endline }}% \ialign {$##$\hfil\kern 2\p@\kern\@tempdima & \thinspace % \hfil $##$\hfil && \quad\hfil $##$\hfil\crcr\omit\strut % \hfil\crcr\noalign{\kern -\baselineskip}#2\crcr\omit % \strut\cr}}% \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}% \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}% \setbox\tw@\hbox{% $\kern\wd\@ne\kern -\@tempdima\left\@firstoftwo#1% \if@borderstar\kern2pt\else\kern -\wd\@ne\fi% \global\setbox\@ne\vbox{\box\@ne\if@borderstar\else\kern 2\p@\fi}% \vcenter{\if@borderstar\else\kern -\ht\@ne\fi% \unvbox\z@\kern-\if@borderstar2\fi\baselineskip}% \if@borderstar\kern-2\@tempdima\kern2\p@\else\,\fi\right\@secondoftwo#1 $% }\null \;\vbox{\kern\ht\@ne\box\tw@}% \endgroup } %% Macros for line numbers %% \if@vrulerlinenumberon% % \usepackage{vruler}% % %%\setvruler[][][][][][][][][] \def\linenoon{%%\definecolor{blue}{gray}{0}% \def\tiny{\normalsize\color{black}}% \setvruler[12bp][1][1][3][1][1.18\textwidth][26pt][-7pt][0.99\textheight]% for even pages: left side; for odd pages: right side; %%\linkbluecolor }% \linenoon% \def\lineno@off{\unsetvruler}% \fi% %% url macros %% \gdef\orcidlogo{% \includegraphics{Orcidlogo.eps}% }% \gdef\orcid#1{\href{#1}{\orcidlogo}}% \endinput \ No newline at end of file diff --git a/waypoint_control/sn-article-template/sn-mathphys-num.bst b/waypoint_control/sn-article-template/sn-mathphys-num.bst deleted file mode 100644 index e4d1e42..0000000 --- a/waypoint_control/sn-article-template/sn-mathphys-num.bst +++ /dev/null @@ -1,3211 +0,0 @@ -%% This is file `sn-mathphys-num.bst' -%% Compatible with bibtex version 0.99d. -%% -%% Note: Per default sorting entries is done in the order of citation. -%% If the journal requires alphabetical order of references, select the alpha option -%% -%% You are free to use this style file as you see fit, provided -%% that you do not make changes to the file. -%% -%% It may be distributed under the terms of the LaTeX Project Public -%% License, as described in lppl.txt in the base LaTeX distribution. -%% Either version 1.0 or, at your option, any later version. -%% -%% LIMITATIONS: -%% If you are getting error like -%% "Sorry---you've exceeded BibTeX's number of string global-variables" -%% that means you are using to old bibtex version. You should download latest version 0.99d. -%% (One of the binaries location is minimals.contextgarden.net/current/bin/common/) - -FUNCTION {identify.mathphys.version} -{ % Put identifying string in the .blg file - "sn-mathphys-num.bst" - " [2024/07/19 v1.1 bibliography style]" - * top$ -} - -ENTRY - { address - author - booktitle - bnumber - chapter - doi - edition - editor - howpublished - institution - isbn - journal - key - keywords - month - note - number - organization - pages - publisher - school - series - title - type - volume - year - url - info - options - urldate - eprint - archive - archivePrefix - primaryClass - eid - adsurl - adsnote - version - } - {} - { label extra.label sort.label short.list} - -INTEGERS { output.state before.all mid.sentence after.sentence - after.block after.authors between.elements bother - Nisbn Nmonth slen set.settings tmp month.printed} - -FUNCTION {init.state.consts} -{ #0 'before.all := - #1 'mid.sentence := - #2 'after.sentence := - #3 'after.block := - #4 'after.authors := - #5 'between.elements := -} - -STRINGS { s t element} -STRINGS { longest.label last.label list.string default.list} -STRINGS { v l f j b temp.str} - -FUNCTION {output.nonnull} -{ 's := - output.state mid.sentence = - { " " * write$ newline$} - { output.state after.block = - { add.period$ write$ - newline$ - } - { - output.state after.authors = - { ": " * write$ - newline$ - } - { output.state between.elements = - { ", " * write$ newline$} - { output.state before.all = - 'write$ - { add.period$ " " * write$ newline$} - if$ - } - if$ - } - if$ - } - if$ - mid.sentence 'output.state := - } - if$ - s -} - -FUNCTION {output} -{ duplicate$ empty$ - 'pop$ - 'output.nonnull - if$ -} - -FUNCTION {output.check} -{ 't := - duplicate$ empty$ - { pop$ "empty " t * " in " * cite$ * warning$ } - 'output.nonnull - if$ -} -FUNCTION {fin.entry} -{ write$ newline$ } - -FUNCTION {stupid.colon} -{ after.authors 'output.state := } - - -FUNCTION {insert.comma} -{ output.state before.all = - 'skip$ - { between.elements 'output.state := } - if$ -} - -FUNCTION {new.sentence} -{ output.state after.block = - 'skip$ - { output.state before.all = - 'skip$ - { after.sentence 'output.state := } - if$ - } - if$ -} - -FUNCTION {not} -{ { #0 } - { #1 } - if$ -} - -FUNCTION {and} -{ 'skip$ - { pop$ #0 } - if$ -} - -FUNCTION {or} -{ { pop$ #1 } - 'skip$ - if$ -} - - -FUNCTION {field.or.null} -{ duplicate$ empty$ - { pop$ "" } - 'skip$ - if$ -} - -FUNCTION {sort.format.month} -{ 't := - t #1 #2 substring$ "01" = - t #1 #1 substring$ "1" = - t #2 #2 substring$ "" = - and or - { "January" } - { t #1 #2 substring$ "02" = - t #1 #1 substring$ "2" = - t #2 #2 substring$ "" = - and or - { "February" } - { t #1 #2 substring$ "03" = - t #1 #1 substring$ "3" = - t #2 #2 substring$ "" = - and or - { "March" } - { t #1 #2 substring$ "04" = - t #1 #1 substring$ "4" = - or - { "April" } - { t #1 #2 substring$ "05" = - t #1 #1 substring$ "5" = - or - { "May" } - { t #1 #2 substring$ "06" = - t #1 #1 substring$ "6" = - or - { "June" } - { t #1 #2 substring$ "07" = - t #1 #1 substring$ "7" = - or - { "July" } - { t #1 #2 substring$ "08" = - t #1 #1 substring$ "8" = - or - { "August" } - { t #1 #2 substring$ "09" = - t #1 #1 substring$ "9" = - or - { "September" } - { t #1 #2 substring$ "10" = - { "October" } - { t #1 #2 substring$ "11" = - { "November" } - { t #1 #2 substring$ "12" = - { "December" } - { t } % No match - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - -} - -INTEGERS {sk} -FUNCTION {is.num} -{ chr.to.int$ - duplicate$ "0" chr.to.int$ < not - swap$ "9" chr.to.int$ > not and -} - -FUNCTION {make.tag} -{ 't := - duplicate$ empty$ - { pop$ "" } - { bother #0 = - { - t "volume" = - {"\textbf{" swap$ * "}" * } - 'skip$ - if$ - } - { "\b" t * "{" * swap$ * "}" * } - if$ - } - if$ -} - - - -FUNCTION {springer.publisher} -{publisher #1 #8 substring$ "Springer" = - { "Springer" } - { publisher } - if$ -} - -FUNCTION {format.adsurl} -{ - adsurl empty$ - { "" } - {" \href{" adsurl "}" *} - if$ -} - -FUNCTION {format.adsnote} -{ - adsnote empty$ - { "" } - { ". " * adsnote *} - if$ -} - - -FUNCTION {format.soft.title} -{ - title empty$ - { "" } - { title "," *} - if$ -} - -FUNCTION {format.softmisctitle} -{ title empty$ - { ""} - { version empty$ - { title ", " *} - { title ", " * version " " *} - if$ - } - if$ -} - -FUNCTION {format.softmisc.archive} -{ - archivePrefix empty$ - { "" } - { "" } - if$ -} - -FUNCTION {format.archive} -{ - archivePrefix empty$ - { "" } - { archivePrefix ":" *} - if$ -} - -FUNCTION {format.primaryClass} -{ - primaryClass empty$ - { "" } - { "{[" primaryClass * "]}" *} - if$ -} - -FUNCTION {format.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://arxiv.org/abs/" eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {format.softmisc.eprint} -{ eprint empty$ - { ""} - { archive empty$ - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - {"{\href{https://ascl.net/" format.softmisc.archive * eprint * "}" * - "{{" * format.archive * eprint * "}}}" *} - if$ - } - if$ -} - -FUNCTION {format.pub.address} -{ publisher empty$ - howpublished empty$ - and - { - address empty$ - 'skip$ - { volume empty$ - 'insert.comma - 'new.sentence - if$ - address - type$ "inproceedings" = - {"conflocation"} - {"location"} - if$ - make.tag output - } - if$ - } - { - address empty$ - { publisher empty$ - {howpublished} - {springer.publisher} - if$ - "publisher" make.tag - #1 bother = - {", \blocation{???}" * } - 'skip$ - if$ - output - } - { - publisher empty$ - {howpublished } - {springer.publisher } - if$ - "publisher" make.tag output - insert.comma - address "location" make.tag output - } - if$ - } - if$ -} - -INTEGERS { nameptr namesleft numnames } - -FUNCTION {mk.tag} -{ 'temp.str := - duplicate$ empty$ - { pop$ "" } - { - b "nothing" = - 'skip$ - { "\b" temp.str * "{" * swap$ * "}" * } - if$ - } - if$ -} - -FUNCTION {space.after.dot} -{'j := - t 'f := - j 't := - s 'j := - "" 'l := - "" 's := - { t empty$ not } - { - t #1 #3 substring$ "{-}" = - { l " {q}. " * 'l := - t #4 global.max$ substring$ 't := - } - 'skip$ - if$ - - t #1 #1 substring$ 's := - l s * 'l := - s "." = - { - t #2 #1 substring$ " " = - 'skip$ - { - l " " * 'l := - t #2 #4 substring$ "{\,}" = - { t #5 global.max$ substring$ 't := } - 'skip$ - if$ - } - if$ - } - 'skip$ - if$ - t #2 global.max$ substring$ 't := - } - while$ - f 't := - j 's := - l -} - -FUNCTION {fix.inits}{ - 't := - "" 'element := - { t empty$ not } - { - t #1 #3 substring$ ".q." = - { element ".-" * 'element := - t #3 global.max$ substring$ 't := - } - {element t #1 #1 substring$ * 'element :=} - if$ - - t #2 global.max$ substring$ 't := - } - while$ - element -} - -FUNCTION {fix.snm}{ - 't := - "" 'element := - { t empty$ not } - { - t #1 #3 substring$ "{-}" = - {element "-" * 'element := - t #3 global.max$ substring$ 't := - } - {element t #1 #1 substring$ * 'element :=} - if$ - - t #2 global.max$ substring$ 't := - } - while$ - element -} - -FUNCTION {enbrace.dash}{ - 't := - "" 'element := - { t empty$ not } - { - t #1 #1 substring$ "-" = - {element "{-}" * 'element :=} - {element t #1 #1 substring$ * 'element :=} - if$ - t #2 global.max$ substring$ 't := - } - while$ - element -} - -FUNCTION {fix.name}{ - - enbrace.dash 's := - "" 'l := - "" 't := - - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { - s nameptr "{vv~}{ll}{, jj}" format.name$ - s nameptr "{, ff}" format.name$ space.after.dot * 'l := - #1 nameptr = - {l 't :=} - {t " and " * l * 't := } - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ - t -} - -FUNCTION {name.separator}{ - namesleft #1 > - {", " * } - 'skip$ - if$ -} - -FUNCTION {format.author.editor} -{ 'b := - - bother #1 = - b "nothing" = - or - 'skip$ - {"b" b * 'b :=} - if$ - - b "editor" = - b "beditor" = - b "nothing" = - or or - {editor 's :=} - {author 's :=} - if$ - - %% modifying name - s fix.name 's := - - "" 't := - - #1 'nameptr := - s num.names$ 'numnames := - numnames 'namesleft := - - s numnames "{ll}" format.name$ 'l := - l "others" = - l "{others}" = - l "et al." = - l "{et al.}" = - or or or - {#1 'tmp :=} - {#0 'tmp :=} - if$ - - { namesleft #0 > } - { s nameptr "{vv}" format.name$ "particle" mk.tag 'v := - s nameptr "{ll}" format.name$ fix.snm "snm" mk.tag 'l := - s nameptr "{f{.}.}" format.name$ fix.inits "inits" mk.tag 'f := - s nameptr "{jj}" format.name$ "suffix" mk.tag 'j := - - - namesleft #1 = - tmp #1 = - and - { b "bauthor" = - b "beditor" = - or - {"et al."} - {"\betal"} - if$ - #1 'tmp := - } - { - b "bauthor" = - b "beditor" = - or - {"\oauthor{"} - { - b "nothing" = - {""} - {"\b" b * "{" *} - if$ - } -%% if$ -%% -%% v empty$ -%% 'skip$ -%% {v * " " *} - if$ - - l empty$ - 'skip$ - { l *} - if$ - - f empty$ - 'skip$ - {", " * f *} - if$ - - j empty$ - 'skip$ - {" " * j *} - if$ - - b "nothing" = - {""} - {"}"} - if$ - - * "" 't := - } - if$ - - name.separator - write$ - - namesleft #1 > - b "nothing" = not - and - { namesleft #2 = - tmp #1 = - and - 'skip$ - 'newline$ - if$ - } - 'skip$ - if$ - - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ -} - -FUNCTION {format.editors} -{ editor empty$ - 'skip$ - { - bother #0 = - { author empty$ - {"editor"} - {"nothing"} - if$ - } - {"editor"} - if$ - format.author.editor - editor num.names$ #1 > - { " (eds.)" } - { " (ed.)" } - if$ - write$ - } - if$ -} - -FUNCTION {format.authors} -{ author empty$ - 'skip$ - {"author" format.author.editor} - if$ -} - -FUNCTION {cite.author.editor} -{ 's := - s #1 "{vv~}{ll}" format.name$ - s num.names$ duplicate$ - #2 > - { pop$ " et~al." * } - { #2 = - { s #2 "{vv~}{ll}{ jj}{ f}" format.name$ "others" = - { " et~al." * } - { " and " * s #2 "{vv~}{ll}" format.name$ * } - if$ - } - 'skip$ - if$ - } - if$ -} - -FUNCTION {check.auth.edit.org} -{author empty$ - { - editor empty$ - { - organization empty$ - {""} - {organization} - if$ - } - {editor cite.author.editor} - if$ - } - {author cite.author.editor} - if$ -} - -FUNCTION {check.year} -{ year empty$ - {""} - {year extra.label *} - if$ -} - -INTEGERS { multiresult char.num k int} -INTEGERS {str.length count return save.num1 save.num2} -FUNCTION {is.in.list}{ - 'f := - %%%% saveing "s" and "t" - s 'j := - f 's := - t 'f := - list.string text.length$ 'str.length := - list.string 't := -% s text.length$ 'slen := - int 'save.num1 := - count 'save.num2 := - #1 'int := - #1 'count := - #0 'return := - - { count str.length = not - #0 str.length = not - and - } - { - count #1 + 'count := - t int #1 substring$ "," = - { - t #1 int substring$ s "," * = - { - #1 'return := - str.length 'count := - } - 'skip$ - if$ - - int #1 + 'int := - t int global.max$ substring$ 't := - #0 'int := - } - 'skip$ - if$ - int #1 + 'int := - } - while$ - - save.num1 'int := - save.num2 'count := - - #0 return = - { s t = - {#1 'return :=} - 'skip$ - if$ - } - 'skip$ - if$ - %%%% returning original "s" and "t" - j 's := - f 't := - - return -} - -INTEGERS {bibitem.count} - -FUNCTION {print.count} -{ bibitem.count #1 + 'bibitem.count := - newline$ - "%%% " - bibitem.count int.to.str$ * write$ -} - - -FUNCTION {output.bibitem} -{ print.count - newline$ - "\bibitem[\protect\citeauthoryear{" write$ - check.auth.edit.org write$ - "}{" write$ - check.year write$ - "}]{" write$ - cite$ write$ - "}" write$ - newline$ - "" before.all 'output.state := -} - - - - -FUNCTION {string.to.integer} -{ 't := - t text.length$ 'k := - #1 'char.num := - { t char.num #1 substring$ 's := - s is.num - s "." = - or - char.num k = not - and - } - { char.num #1 + 'char.num := } - while$ - char.num #1 - 'char.num := - t #1 char.num substring$ -} - - -FUNCTION {find.integer} -{ 't := - #0 'int := - { int not - t empty$ not - and - } - { t #1 #1 substring$ 's := - s is.num - {#1 'int :=} - { t #2 global.max$ substring$ 't := } - if$ - } - while$ - int -} - -function{title.lowerwords}{ -"a,an,and,of,the,for,in,to,over,from,on,or,so,than,that,this,as,but,with,by,at,down,up,upon,al,ale,aus,aux,d'Analyse,d'Analystes,d'Architecture,d'Etudes,d'Histoire,da,dans,de,degli,dei,del," -"dell',dell'Accademia,dell'Istituto,dell'Universita,della,delle,dem,der,des,detta,di,die,din,dlia,do,du,e,eXpress,ed,ego,el,em,en,et,fur,i,iz,l'Academie,l'Age,l'Antiquite," * -"l'Approximation,l'Ecole,l'Histoire,l'I.S.U.P.,l'INSA,l'IREM,l'Indirizzo,l'Institut,l'Institute,l'UFR,l'Union,l'Universite,la,las,les,na,nella,per,po,si,sue,sur,ta,tes,und,van,voor,zu,zum,zur" * -} - -FUNCTION {upercase.first.letters}{ - 't := - "" 's := - #1 'int := - #1 'count := - list.string 'v := - "" 'b := - title.lowerwords 'list.string := - - t text.length$ 'slen := - - {count slen = not } - {t int #1 substring$ " " = - { - int #1 - 'int := - t #1 int substring$ 'b := - - % if word not in title.lowerwords - uppercase first letter - b is.in.list not - { b "l" change.case$ b = - { b "u" change.case$ "t" change.case$ 'b := } - 'skip$ - if$ - } - 'skip$ - if$ - - int #1 + 'int := - - s b " " * * 's := - int #1 + 'int := - t int global.max$ substring$ 't := - #0 'int := - } - 'skip$ - if$ - int #1 + 'int := - count #1 + 'count := -% "count=" count int.to.str$ * " slen=" * slen int.to.str$ * top$ - } - while$ - v 'list.string := - % last word is "t" and need to check it too - s t - t "l" change.case$ t = - { "u" change.case$ "t" change.case$ } - 'skip$ - if$ - * -} - - -FUNCTION {format.title} -{ title empty$ - { "" } - { title - "article" type$ = - type$ "techreport" = - type$ "inbook" = - type$ "inproceedings" = - type$ "incollection" = - type$ "phdthesis" = - type$ "mastersthesis" = - or or or or or or - {"t" change.case$} - { type$ "unpublished" = - type$ "misc" = - or - 'skip$ - 'upercase.first.letters - if$ - } - if$ - } - if$ -} - - -FUNCTION {note.presented} -{ note #1 #9 substring$ "presented" = - note #1 #9 substring$ "Presented" = - or -} - -FUNCTION {n.filter} -{ 't := - "" - { t empty$ not } - { t #1 #1 substring$ "," = - t #1 #1 substring$ "\" = - t #1 #1 substring$ "~" = - or or - { "" * - t #2 global.max$ substring$ 't := - } - { t #1 #1 substring$ * - t #2 global.max$ substring$ 't := - } - if$ - } - while$ -} - -FUNCTION {byear} -{ duplicate$ empty$ - { pop$ "" } - { 't := - t text.length$ 'sk := - #5 sk = - { t #1 #4 substring$ 's := - t #5 #1 substring$ 'longest.label := - longest.label is.num not - {s "year" make.tag - "nameyear" is.in.list - {longest.label * } - 'skip$ - if$ - } - {t "year" make.tag } - if$ - } - { t "year" make.tag - "nameyear" is.in.list - {extra.label *} - 'skip$ - if$ - } - if$ - } - if$ -} - -FUNCTION {format.date} -{ year empty$ - { "" } - { year byear } - if$ -} - -FUNCTION {parens} -{ "(" swap$ * ")" * } - -FUNCTION {format.date.parens} -{ year empty$ - { "" } - { year byear parens } - if$ -} - -FUNCTION {noparens} -{ " " swap$ * "" * } - -FUNCTION {format.softmiscdate} -{ year empty$ - { "" } - { year byear parens } - if$ -} - -FUNCTION {format.month}{ - month empty$ - {""} - {month sort.format.month "confdate" make.tag} - if$ -} - -FUNCTION {formatpatent.date} -{ year empty$ - 'skip$ - { month empty$ - { year } - {format.month " " * year *} - if$ - } - if$ -} - -FUNCTION {month.year.date} -{ year empty$ - {""} - { month empty$ - {year byear} - { format.month " " * year byear * } - if$ - type$ "inproceedings" = - 'skip$ - {"(" swap$ * ")" * } - if$ - } - if$ -} - -FUNCTION {tie.or.space.connect} -{ duplicate$ text.length$ #3 < - { "~" } - { " " } - if$ - swap$ * * -} -FUNCTION {format.volume} -{ volume empty$ - { "book" type$ = - {number empty$ - {""} - {"vol. " number "seriesno" make.tag *} - if$ - } - {""} - if$ - } - {"vol. " volume "seriesno" make.tag *} - if$ -} -FUNCTION {format.volume2} -{ volume empty$ - {""} - {"vol. " volume "seriesno" make.tag *} - if$ -} - -FUNCTION {format.art.vol} -{ - volume empty$ - {""} - {volume n.filter "volume" make.tag} - if$ - number empty$ - 'skip$ - { "(" number "issue" make.tag * ")" * * } - if$ -} - -FUNCTION {format.series} -{ series empty$ - 'skip$ - {series "sertitle" make.tag} - if$ -} - -FUNCTION {format.edition} -{ edition empty$ - { "" } - { "" 'v := - "" 'l := - "" 'f := - edition "l" change.case$ 's := - "1" s = - "first" s = - or - { - "1" 'v := - "st" 'l := - } - { - "2" s = - "second" s = - or - { - "2" 'v := - "nd" 'l := - } - { - "3" s = - "third" s = - or - { - "3" 'v := - "rd" 'l := - } - { - "4" s = - "fourth" s = - or - { - "4" 'v := - "th" 'l := - } - { - "5" s = - "fifth" s = - or - { - "5" 'v := - "th" 'l := - } - { - "6" s = - "sixth" s = - or - { - "6" 'v := - "th" 'l := - } - { - "7" s = - "seventh" s = - or - { - "7" 'v := - "th" 'l := - } - { - "8" s = - "eighth" s = - or - { - "8" 'v := - "th" 'l := - } - { - "9" s = - "nineth" s = - or - { - "9" 'v := - "th" 'l := - } - { - edition "t" change.case$ 'f := - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - } - if$ - #0 bother = - { f "" = - { v l * 'f :=} - 'skip$ - if$ - } - { f "" = - { "\bedition{" v * "}" * l * 'f :=} - { "\bedition{" f * "}" * 'f :=} - if$ - } - if$ - f " edn." * - } - if$ -} -FUNCTION {format.isbn} -{ isbn empty$ - { "" } - { isbn "isbn" make.tag} - if$ -} - -INTEGERS {default.info} - - -FUNCTION {multi.page.check} -{ 't := - #0 'multiresult := - "" 'l := - - {t empty$ not} - { t #1 #1 substring$ 's := - - s is.num not - { "" l = not - {t find.integer - {#1 'multiresult := } - {#0 'multiresult := } - if$ - "" 't := - } - { - t #2 global.max$ substring$ 't := - } - if$ - } - { l s * 'l := - t #2 global.max$ substring$ 't := - } - if$ - } - while$ - multiresult -} -FUNCTION {clearpage} -{ 't := - "" 's := - "" 'l := - - { t empty$ not } - { - t #1 #1 substring$ 's := - s is.num not - 'skip$ - { l s * 'l := } - if$ - t #2 global.max$ substring$ 't := - } - while$ - l - -} -FUNCTION {do.pages} -{'t := - "" 'j := - "" 'v := - {t empty$ not} - { t #1 #1 substring$ 's := - s is.num not - s "," = not - and - { "" j = - { - t #2 global.max$ substring$ 't := - } - {t find.integer - { t clearpage 'v := } - 'skip$ - if$ - "" 't := - } - if$ - } - { j s * 'j := - t #2 global.max$ substring$ 't := - } - if$ - } - while$ - j clearpage 'j := - j "fpage" make.tag - "cnd" is.in.list - 'skip$ - {"--" * v "lpage" make.tag *} - if$ -} - - -FUNCTION {format.pages} -{ pages empty$ - { "" } - { pages multi.page.check - {type$ "article" = - {""} - {"cnd" is.in.list - {"p. "} - {"pp. "} - if$ - } - if$ - pages do.pages * - } - {type$ "article" = - {""} - {"p. "} - if$ - pages clearpage "fpage" make.tag * - } - - if$ - } - if$ -} - -FUNCTION {replace.tilde} -{ 't := - "" - { t empty$ not } - { t #1 #1 substring$ "~" = - { { t #1 #1 substring$ "~" = } - { "\texttildelow " * - t #2 global.max$ substring$ 't := - } - while$ - } - { t #1 #1 substring$ * - t #2 global.max$ substring$ 't := - } - if$ - } - while$ -} - - -FUNCTION {format.url} -{ url empty$ - 'skip$ - { type$ "article" = - 'skip$ - { #0 bother = - { "\url{" } - { "\burl{" } - if$ - url replace.tilde * "}" * - output - } - if$ - - urldate empty$ - 'skip$ - { "Accessed " urldate * output } - if$ - } - if$ -} - - -FUNCTION {publisher.month.pages}{ - publisher empty$ series empty$ and - { address empty$ - 'skip$ - 'new.sentence - if$ - format.pub.address - - pages empty$ - 'skip$ - {insert.comma} - if$ - format.pages output - - } - { - pages empty$ - 'skip$ - {insert.comma} - if$ - format.pages output - publisher empty$ - 'skip$ - {new.sentence} - if$ - format.pub.address - } - if$ -} - -function{process.doi}{ - doi 't := - "" 'b := - #1 'int := -% "doi =" t * top$ - - t text.length$ 'slen := - - {int slen = not } - {t int #3 substring$ "10." = - { - t int #1 - #1 substring$ 'b := - b "" = - {"a" 'b :=} % if b is empty need to set a letter - 'skip$ - if$ - - b is.num not - { - t int slen int - #1 + substring$ 't := - slen #1 - 'int := - } - 'skip$ - if$ - - } - 'skip$ - if$ - int #1 + 'int := - } - while$ - t -} - -FUNCTION {format.doi} -{ doi empty$ - {""} - { - "nodoi" is.in.list - {""} - %%{"doi:\doiurl{" process.doi * "}" * } - {"\doiurl{" process.doi * "} " * } - if$ - } - if$ -} - -FUNCTION {format.in.ed.booktitle} -{ booktitle empty$ - {#1 bother = - "cnd" is.in.list not - and - { editor empty$ - 'skip$ - { "In: " output write$ format.editors } - if$ - } - 'skip$ - if$ - } - { editor empty$ - { "In: " booktitle upercase.first.letters "btitle" make.tag * output} - { "In: " output write$ format.editors "" %%% pushing empty string to the empty stack - booktitle upercase.first.letters "btitle" make.tag output - } - if$ - } - - if$ -} - -FUNCTION {format.in.ed} -{ title empty$ - 'skip$ - { editor empty$ - { title "btitle" make.tag output} - { author empty$ - { format.editors - stupid.colon - %format.date output - title "btitle" make.tag output - } - { "In: " output write$ format.editors "" %%% pushing empty string to the empty stack - title "btitle" make.tag output - } - if$ - } - if$ - } - if$ -} - -FUNCTION {format.tr.number} -{ type empty$ - { "Technical Report" } - 'type - if$ - number empty$ - { "t" change.case$ } - { number tie.or.space.connect } - if$ -} - -FUNCTION {patent.number} -{ number empty$ - 'skip$ - { number } - if$ -} -INTEGERS { len } - -FUNCTION {chop.word} -{ 's := - 'len := - s #1 len substring$ = - { s len #1 + global.max$ substring$ } - 's - if$ -} - -FUNCTION {format.inpres} -{ "l" change.case$ 't := - "in press: " #10 - "in press. " #10 - "in press " #9 t chop.word - chop.word - chop.word - #1 global.max$ substring$ -} - -FUNCTION {bcomment.note} -{ note empty$ - 'skip$ - {note format.inpres "comment" make.tag output} - if$ -} - -FUNCTION {empty.misc.check} -{ author empty$ title empty$ howpublished empty$ - month empty$ year empty$ note empty$ - and and and and and - { "all relevant fields are empty in " cite$ * warning$ } - 'skip$ - if$ -} - -FUNCTION {format.thesis.type} -{ type empty$ - 'skip$ - { pop$ - type "t" change.case$ - } - if$ -} - -FUNCTION {format.chapter.and.note} -{ note empty$ chapter empty$ organization empty$ and and - 'skip$ - { chapter empty$ - "notnumber" last.label = - or - {organization empty$ - { note "comment" make.tag output } - { note empty$ - { organization "comment" make.tag output } - { organization ". " * note * "comment" make.tag output } - if$ - } - if$ - } - { note empty$ - { "Chap. " chapter * "comment" make.tag output} - { type empty$ - { "Chap. " } - { type "t" change.case$ "Section" = - { "Sect. " } - { "Chap. " } - if$ - } - if$ - chapter * ". " * note * "comment" make.tag output - } - if$ - } - if$ - } - if$ -} - -FUNCTION {item.end} -{ chapter empty$ - type$ "unpublished" = not - type$ "misc" = not - and and - { new.sentence - format.doi output - } - 'skip$ - if$ - - type$ "unpublished" = - type$ "misc" = - or - { note empty$ - 'skip$ - {note.presented - 'skip$ - {new.sentence note output} - if$ - } - if$ - format.date.parens output - } - { new.sentence - type$ "proceedings" = - { author empty$ editor empty$ and - 'bcomment.note - 'format.chapter.and.note - if$ - } - 'format.chapter.and.note - if$ - } - if$ - list.string 'v := - default.list 'list.string := - - type$ ".isbn" * is.in.list - "cnd" is.in.list - or - { - new.sentence -% format.isbn output - } - 'skip$ - if$ - new.sentence - %% commented by SPi as we are using format.eprint %% - %% and also to avoide eprint being printed twice - Start %% - %%eprint empty$ - %% 'skip$ - %% {"\arxivurl{" eprint * "}" * output} - %%if$ - %% End %% - chapter empty$ - type$ "unpublished" = not - type$ "misc" = not - and and - 'skip$ - { new.sentence - format.doi output - } - if$ - new.sentence - format.url - v 'list.string := - fin.entry -} - -FUNCTION {article.item.end} -{ chapter empty$ - type$ "unpublished" = not - type$ "misc" = not - and and - { new.sentence -% format.doi output - } - 'skip$ - if$ - - type$ "unpublished" = - type$ "misc" = - or - { note empty$ - 'skip$ - {note.presented - 'skip$ - {new.sentence note output} - if$ - } - if$ - format.date.parens output - } - { new.sentence - type$ "proceedings" = - { author empty$ editor empty$ and - 'bcomment.note - 'format.chapter.and.note - if$ - } - 'format.chapter.and.note - if$ - } - if$ - list.string 'v := - default.list 'list.string := - - type$ ".isbn" * is.in.list - "cnd" is.in.list - or - { - new.sentence -% format.isbn output - } - 'skip$ - if$ - new.sentence - %% commented by SPi as we are using format.eprint %% - %% and also to avoide eprint being printed twice - Start %% - %%eprint empty$ - %% 'skip$ - %% {"\arxivurl{" eprint * "}" * output} - %%if$ - %% End %% - chapter empty$ - type$ "unpublished" = not - type$ "misc" = not - and and - 'skip$ - { new.sentence -%% format.doi output - } - if$ - new.sentence - format.url - v 'list.string := - fin.entry -} - - -FUNCTION {insert.element} -{ #0 bother = - { element "{botherref}" * write$ newline$} - { - type$ "article" = - {element "{barticle}" * write$ newline$} - 'skip$ - if$ - type$ "book" = - type$ "proceedings" = - type$ "manual" = - type$ "booklet" = - or or or - {element "{bbook}" * write$ newline$} - 'skip$ - if$ - - type$ "inbook" = - { "notnumber" last.label = - {element "{bchapter}" * write$ newline$} - {element "{bbook}" * write$ newline$} - if$ - } - 'skip$ - if$ - - type$ "incollection" = - type$ "inproceedings" = - type$ "conference" = - or or - {element "{bchapter}" * write$ newline$} - 'skip$ - if$ - } - if$ -} - -FUNCTION {end.element} -{ "\end" 'element := - item.end - insert.element - "\endbibitem" write$ newline$ -} - -FUNCTION {article.end.element} -{ "\end" 'element := - article.item.end - insert.element - "\endbibitem" write$ newline$ -} - - -FUNCTION {begin.element} -{ "\begin" 'element := - insert.element -} -function {set.options}{ - options empty$ - 'skip$ - {options 'list.string :=} - if$ -} - -FUNCTION {settings} -{} - -FUNCTION {article} -{ output.bibitem - author empty$ - institution empty$ - editor empty$ - and and - journal empty$ - or - year empty$ - or - % above tagging rule means: - % nead: (volume & (pages or number) ) or (doi [without volume, pages and number]) - volume empty$ not - pages empty$ not bnumber empty$ not or - and - - volume empty$ pages empty$ bnumber empty$ and and - doi empty$ not and - or - not - or - {#0 'bother :=} - {#1 'bother :=} - if$ - begin.element - author empty$ - { editor empty$ - 'skip$ - {format.editors stupid.colon} - if$ - } - { format.authors stupid.colon} - if$ - "cnd" is.in.list - { - journal empty$ - {format.title "atitle" make.tag "title" output.check} - {journal "jtitle" make.tag output} - if$ - } - { - format.title "atitle" make.tag "title" output.check - journal empty$ - 'skip$ - {new.sentence journal "jtitle" make.tag output} - if$ - } - if$ - format.art.vol output - pages empty$ - 'skip$ - {insert.comma} - if$ - format.pages output - format.date.parens output - format.doi output - format.eprint output - format.primaryClass output - article.end.element -} - - -FUNCTION {patent} -{ output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "title" output.check - add.period$ - patent.number output - insert.comma - formatpatent.date output - end.element -} - -FUNCTION { other } { patent } - -FUNCTION {book} -{ output.bibitem - author empty$ - institution empty$ - organization empty$ - editor empty$ - and and and - title empty$ - year empty$ - or or - {#0 'bother :=} - { - publisher empty$ address empty$ not and - {#0 'bother :=} - {#1 'bother :=} - if$ - } - if$ - begin.element - author empty$ - { editor empty$ - 'skip$ - {format.editors stupid.colon} - if$ - } - { format.authors stupid.colon} - if$ - format.title "btitle" make.tag "title" output.check - series empty$ - { - format.volume output - insert.comma - format.edition output - } - { edition empty$ - 'skip$ - 'insert.comma - if$ - format.edition output - new.sentence - format.series output - insert.comma - format.volume output - } - if$ - publisher.month.pages - format.date.parens output - end.element -} - -FUNCTION {booklet} -{output.bibitem - author empty$ - title empty$ - year empty$ - howpublished empty$ - or or or - {#0 'bother :=} - {#1 'bother :=} - if$ - - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "btitle" make.tag "title" output.check - address empty$ publisher empty$ howpublished empty$ and and - 'skip$ - 'new.sentence - if$ - format.pub.address - format.date.parens output - end.element -} - -FUNCTION {misc} -{output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "btitle" make.tag "title" output.check - address empty$ publisher empty$ howpublished empty$ and and - 'skip$ - 'new.sentence - if$ - format.pub.address - end.element -} - -FUNCTION {softmisc} -{output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors} - if$ - stupid.colon - format.title "btitle" make.tag "title" output.check - insert.comma - version output - insert.comma - %%address empty$ publisher empty$ howpublished empty$ and and - %%'skip$ - %% 'new.sentence - %%if$ - format.pub.address - format.softmiscdate output - insert.comma - format.softmisc.eprint output - end.element -} - -FUNCTION {inbook} -{ output.bibitem - author empty$ - institution empty$ - organization empty$ - editor empty$ - and and and - title empty$ - year empty$ - or or - {#0 'bother :=} - { - publisher empty$ address empty$ not and - {#0 'bother :=} - {#1 'bother :=} - if$ - } - if$ - - chapter empty$ - { "" 'last.label :=} - { chapter string.to.integer empty$ author empty$ not and - { "notnumber" 'last.label :=} - { "" 'last.label :=} - if$ - } - if$ - - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - "notnumber" last.label = - { chapter "ctitle" make.tag output - add.period$ - } - 'skip$ - if$ - format.in.ed - series empty$ - { - insert.comma - format.volume output - insert.comma - format.edition output - new.sentence - } - { - insert.comma - format.edition output - new.sentence - format.series output - volume empty$ - 'skip$ - 'insert.comma - if$ - format.volume output - } - if$ - publisher.month.pages - publisher empty$ address empty$ edition empty$ series empty$ pages empty$ volume empty$ and and and and and - 'insert.comma - 'skip$ - if$ - format.date.parens output - end.element -} -FUNCTION {incollection} -{ output.bibitem - author empty$ - institution empty$ - and - booktitle empty$ - title empty$ - year empty$ - or or or - {#0 'bother :=} - { - publisher empty$ address empty$ not and - {#0 'bother :=} - {#1 'bother :=} - if$ - } - if$ - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - - "cnd" is.in.list - { - booktitle empty$ title empty$ not and - { - format.title "ctitle" make.tag "title" output.check - new.sentence - } - 'skip$ - if$ - } - { - format.title "ctitle" make.tag "title" output.check - title empty$ - 'skip$ - {new.sentence} - if$ - } - if$ - format.in.ed.booktitle - series empty$ - { - format.volume output - insert.comma - format.edition output - } - { - edition empty$ - 'skip$ - { insert.comma - format.edition output - } - if$ - new.sentence - format.series output - insert.comma - format.volume output - } - if$ - publisher.month.pages - format.date.parens output - end.element -} - -FUNCTION {inproceedings} -{ output.bibitem - author empty$ - institution empty$ - and - title empty$ - year empty$ - or or - {#0 'bother :=} - {#1 'bother :=} - if$ - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - - "cnd" is.in.list - { - booktitle empty$ title empty$ not and - { - format.title "ctitle" make.tag "title" output.check - new.sentence - } - 'skip$ - if$ - } - { - format.title "ctitle" make.tag "title" output.check - title empty$ booktitle empty$ not and - 'skip$ - {new.sentence} - if$ - } - if$ - - format.in.ed.booktitle - series empty$ - 'skip$ - {new.sentence format.series output} - if$ - volume empty$ address empty$ publisher empty$ and and - 'skip$ - 'insert.comma - if$ - format.volume output - publisher.month.pages - format.date.parens output - end.element -} - -FUNCTION {conference} { inproceedings } - -FUNCTION {manual} -{ output.bibitem - author empty$ - organization empty$ - title empty$ - year empty$ - address empty$ - or or or or - {#0 'bother :=} - {#1 'bother :=} - if$ - begin.element - - author empty$ - { organization empty$ - 'skip$ - { organization "publisher" make.tag output.nonnull - stupid.colon% add.period$ - } - if$ - } - { format.authors stupid.colon} - if$ - title empty$ - 'skip$ - {format.title "btitle" make.tag output} - if$ - edition empty$ - {new.sentence} - {insert.comma} - if$ - format.edition output - edition empty$ - 'skip$ - {new.sentence} - if$ - author empty$ organization empty$ - or - 'skip$ - { organization "publisher" make.tag output.nonnull - insert.comma - } - if$ - address empty$ - 'skip$ - {address "location" make.tag output} - if$ - format.date.parens output - end.element -} - - -FUNCTION {phdthesis} -{output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "title" output.check - new.sentence - type$ "mastersthesis" = - {"Master's thesis" format.thesis.type output.nonnull} - {"PhD thesis" format.thesis.type output.nonnull} - if$ - school empty$ - 'skip$ - 'insert.comma - if$ - school "school" output.check - address empty$ - 'skip$ - 'insert.comma - if$ - address output - month.year.date output - end.element -} -FUNCTION {mastersthesis}{phdthesis} - - -FUNCTION {proceedings} -{ output.bibitem - author empty$ - institution empty$ - organization empty$ - editor empty$ - and and and - title empty$ - year empty$ - or or - {#0 'bother :=} - { - publisher empty$ address empty$ not and - {#0 'bother :=} - {#1 'bother :=} - if$ - } - if$ - - begin.element - author empty$ - { editor empty$ - {organization "institutionaled" make.tag "organization" output.check } - { format.editors } - if$ - } - { format.authors } - if$ - stupid.colon - format.title "btitle" make.tag output - series empty$ - 'skip$ - {new.sentence format.series output} - if$ - volume empty$ - 'skip$ - 'insert.comma - if$ - format.volume output - publisher.month.pages - format.date.parens output - end.element -} - -FUNCTION {techreport} -{ output.bibitem - #0 'bother := - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "title" output.check - new.sentence - format.tr.number output.nonnull - institution empty$ - 'skip$ - 'insert.comma - if$ - institution "institution" output.check - address empty$ - 'skip$ - 'insert.comma - if$ - address output - month.year.date output - end.element -} - -FUNCTION {unpublished} -{ output.bibitem - #0 'bother := - - begin.element - author empty$ - 'skip$ - {format.authors stupid.colon} - if$ - format.title "title" output.check - note empty$ - 'skip$ - { note.presented - {note output} - 'skip$ - if$ - } - if$ - end.element -} - -FUNCTION {default.type} { unpublished } - -MACRO {jan} {"January"} -MACRO {feb} {"February"} -MACRO {mar} {"March"} -MACRO {apr} {"April"} -MACRO {may} {"May"} -MACRO {jun} {"June"} -MACRO {jul} {"July"} -MACRO {aug} {"August"} -MACRO {sep} {"September"} -MACRO {oct} {"October"} -MACRO {nov} {"November"} -MACRO {dec} {"December"} - -READ - -EXECUTE {identify.mathphys.version} - -FUNCTION {sortify} -{ purify$ - "l" change.case$ -} - -INTEGERS { et.al.char.used } - -FUNCTION {initialize.et.al.char.used} -{ #0 'et.al.char.used := -} - -%%%%% setting default options -FUNCTION {set.default.opt} -{"unsort" 'list.string :=} -%%{"alpha" 'list.string :=} - -EXECUTE {set.default.opt} - -FUNCTION {assign.opt}{ - % First need to set options - "settings" type$ = - { options empty$ - 'skip$ - {options 'list.string :=} - if$ - } - 'skip$ - if$ -} - -ITERATE {assign.opt} -EXECUTE {initialize.et.al.char.used} - -FUNCTION {alpha.format.lab.names} -{ 's := - s num.names$ 'numnames := - numnames #1 > - { numnames #4 > - { #3 'namesleft := } - { numnames 'namesleft := } - if$ - #1 'nameptr := - "" - { namesleft #0 > } - { nameptr numnames = - { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" = - { "+" * - #1 'et.al.char.used := - } - { s nameptr "{v{}}{l{}}" format.name$ * } - if$ - } - { s nameptr "{v{}}{l{}}" format.name$ * } - if$ - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - while$ - numnames #4 > - { "+" * - #1 'et.al.char.used := - } - 'skip$ - if$ - } - { s #1 "{v{}}{l{}}" format.name$ - duplicate$ text.length$ #2 < - { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ } - 'skip$ - if$ - } - if$ -} - -FUNCTION {standard.format.lab.names} -{ 's := - s #1 "{vv~}{ll}" format.name$ - s num.names$ duplicate$ - #2 > - { pop$ " et~al." * } - { #2 < - 'skip$ - { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = - { " et~al." * } - { " and " * s #2 "{vv~}{ll}" format.name$ * } - if$ - } - if$ - } - if$ -} -FUNCTION {format.lab.names}{ - "alpha" is.in.list - 'alpha.format.lab.names - 'standard.format.lab.names - if$ -} - -FUNCTION {author.key.label} -{ author empty$ - { key empty$ - { cite$ #1 #3 substring$ } - { key #3 text.prefix$ } - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {author.editor.key.label} -{ author empty$ - { editor empty$ - { key empty$ - { "zzz" } - { key #3 text.prefix$ } - if$ - } - { editor format.lab.names } - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {author.key.organization.label} -{ author empty$ - { key empty$ - { organization empty$ - { "zzz" } - { "The " #4 organization chop.word #3 text.prefix$ } - if$ - } - { key #3 text.prefix$ } - if$ - } - { author format.lab.names } - if$ -} - -FUNCTION {editor.key.organization.label} -{ editor empty$ - { key empty$ - { organization empty$ - { "zzz" } - { "The " #4 organization chop.word #3 text.prefix$ } - if$ - } - { key #3 text.prefix$ } - if$ - } - { editor format.lab.names } - if$ -} - -FUNCTION {calc.short.authors} -{ type$ "book" = - type$ "inbook" = - or - 'author.editor.key.label - { type$ "proceedings" = - 'editor.key.organization.label - { type$ "manual" = - 'author.key.organization.label - 'author.key.label - if$ - } - if$ - } - if$ - 'short.list := -} - -FUNCTION {calc.label} -{ calc.short.authors - short.list - - "alpha" is.in.list - { - duplicate$ - year field.or.null purify$ #-1 #2 substring$ - * - 'label := - year field.or.null purify$ #-1 #4 substring$ - * - sortify 'sort.label := - } - { - "(" - * - year duplicate$ empty$ - short.list key field.or.null = or - { pop$ "" } - 'skip$ - if$ - * - 'label := - label 'sort.label := - } - if$ -} - -FUNCTION {sort.format.names} -{ 's := - #1 'nameptr := - "" - s num.names$ 'numnames := - numnames 'namesleft := - { namesleft #0 > } - { nameptr #1 > - { " " * - "alpha" is.in.list - 'skip$ - {numnames int.to.str$ * " " *} - if$ - } - 'skip$ - if$ - s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := - nameptr numnames = - t "others" = - and - { "et al" * } - { t sortify * } - if$ - #3 numnames < - "alpha" is.in.list not - and - {#0 'namesleft := - " zzz " * - } - { - nameptr #1 + 'nameptr := - namesleft #1 - 'namesleft := - } - if$ - } - while$ -} - -FUNCTION {sort.format.title} -{ 't := - "A " #2 - "An " #3 - "The " #4 t chop.word - chop.word - chop.word - sortify - #1 global.max$ substring$ -} - -FUNCTION {author.sort} -{ author empty$ - { key empty$ - { "to sort, need author or key in " cite$ * warning$ - "zzz" - } - { key sortify } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {author.editor.sort} -{ author empty$ - { editor empty$ - { key empty$ - { "to sort, need author, editor, or key in " cite$ * warning$ - "z" - } - { key sortify } - if$ - } - { editor sort.format.names } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {author.organization.sort} -{ author empty$ - { organization empty$ - { key empty$ - { "to sort, need author, organization, or key in " cite$ * warning$ - "z" - } - { key sortify } - if$ - } - { "The " #4 organization chop.word sortify } - if$ - } - { author sort.format.names } - if$ -} - -FUNCTION {editor.organization.sort} -{ editor empty$ - { organization empty$ - { key empty$ - { "to sort, need editor, organization, or key in " cite$ * warning$ - "z" - } - { key sortify } - if$ - } - { "The " #4 organization chop.word sortify } - if$ - } - { editor sort.format.names } - if$ -} - -FUNCTION {presort} -{ calc.label - sort.label sortify - " " - * - type$ "book" = - type$ "inbook" = - or - {author empty$ - 'editor.organization.sort - 'author.organization.sort - if$ - } - { type$ "proceedings" = - type$ "incollection" = - or - {author empty$ - 'editor.organization.sort - 'author.organization.sort - if$ - } - { type$ "manual" = - 'author.organization.sort - 'author.sort - if$ - } - if$ - } - if$ - " " - * - year field.or.null sortify - * - " " - * - title field.or.null - sort.format.title - * - #1 entry.max$ substring$ 'sort.label := - sort.label * - #1 entry.max$ substring$ 'sort.key$ := - - "settings" type$ = - {"aaa"} - {"unsort" is.in.list - {"bb"} - {"alpha" is.in.list - {sort.key$} - {sort.label} - if$ - } - if$ - } - if$ - 'sort.key$ := -} - - -ITERATE {presort} - -SORT - -INTEGERS { longest.label.width last.extra.num number.label } - -FUNCTION {initialize.longest.label} -{ "" 'longest.label := - #0 int.to.chr$ 'last.label := - "" 'j := - #0 'longest.label.width := - #0 'last.extra.num := - #0 'number.label := -} - -FUNCTION {forward.pass} -{ last.label label = - { last.extra.num #1 + 'last.extra.num := - last.extra.num int.to.chr$ 'extra.label := - } - { "a" chr.to.int$ 'last.extra.num := - "" 'extra.label := - label 'last.label := - } - if$ - number.label #1 + 'number.label := -} - -FUNCTION {reverse.pass} -{ j "b" = - { "a" 'extra.label := } - 'skip$ - if$ - extra.label 'j := - label extra.label * 'label := -} - -EXECUTE {initialize.longest.label} - -ITERATE {forward.pass} - -REVERSE {reverse.pass} - -FUNCTION {write.preambule} -{ "%% BioMed_Central_Bib_Style_v1.01" write$ newline$ newline$ - "\begin{thebibliography}{" number.label int.to.str$ * "}" * write$ newline$ - "% BibTex style file: bmc-mathphys.bst (version 2.1), 2014-07-24" write$ newline$ - "\ifx \bisbn \undefined \def \bisbn #1{ISBN #1}\fi" write$ newline$ - "\ifx \binits \undefined \def \binits#1{#1}\fi" write$ newline$ - "\ifx \bauthor \undefined \def \bauthor#1{#1}\fi" write$ newline$ - "\ifx \batitle \undefined \def \batitle#1{#1}\fi" write$ newline$ - "\ifx \bjtitle \undefined \def \bjtitle#1{#1}\fi" write$ newline$ - "\ifx \bvolume \undefined \def \bvolume#1{\textbf{#1}}\fi" write$ newline$ - "\ifx \byear \undefined \def \byear#1{#1}\fi" write$ newline$ - "\ifx \bissue \undefined \def \bissue#1{#1}\fi" write$ newline$ - "\ifx \bfpage \undefined \def \bfpage#1{#1}\fi" write$ newline$ - "\ifx \blpage \undefined \def \blpage #1{#1}\fi" write$ newline$ - "\ifx \burl \undefined \def \burl#1{\textsf{#1}}\fi" write$ newline$ - %%"\ifx \doiurl \undefined \def \doiurl#1{\textsf{#1}}\fi" write$ newline$ - "\ifx \doiurl \undefined \def \doiurl#1{\url{https://doi.org/#1}}\fi" write$ newline$ - "\ifx \betal \undefined \def \betal{\textit{et al.}}\fi" write$ newline$ - "\ifx \binstitute \undefined \def \binstitute#1{#1}\fi" write$ newline$ - "\ifx \binstitutionaled \undefined \def \binstitutionaled#1{#1}\fi" write$ newline$ - "\ifx \bctitle \undefined \def \bctitle#1{#1}\fi" write$ newline$ - "\ifx \beditor \undefined \def \beditor#1{#1}\fi" write$ newline$ - "\ifx \bpublisher \undefined \def \bpublisher#1{#1}\fi" write$ newline$ - "\ifx \bbtitle \undefined \def \bbtitle#1{#1}\fi" write$ newline$ - "\ifx \bedition \undefined \def \bedition#1{#1}\fi" write$ newline$ - "\ifx \bseriesno \undefined \def \bseriesno#1{#1}\fi" write$ newline$ - "\ifx \blocation \undefined \def \blocation#1{#1}\fi" write$ newline$ - "\ifx \bsertitle \undefined \def \bsertitle#1{#1}\fi" write$ newline$ - "\ifx \bsnm \undefined \def \bsnm#1{#1}\fi" write$ newline$ - "\ifx \bsuffix \undefined \def \bsuffix#1{#1}\fi" write$ newline$ - "\ifx \bparticle \undefined \def \bparticle#1{#1}\fi" write$ newline$ - "\ifx \barticle \undefined \def \barticle#1{#1}\fi" write$ newline$ - "\bibcommenthead" write$ newline$ -} - - -FUNCTION {begin.bib} -{ preamble$ empty$ - 'skip$ - { preamble$ write$ newline$ } - if$ - write.preambule - "\ifx \bconfdate \undefined \def \bconfdate #1{#1}\fi" write$ newline$ - "\ifx \botherref \undefined \def \botherref #1{#1}\fi" write$ newline$ - "\ifx \url \undefined \def \url#1{\textsf{#1}}\fi" write$ newline$ - "\ifx \bchapter \undefined \def \bchapter#1{#1}\fi" write$ newline$ - "\ifx \bbook \undefined \def \bbook#1{#1}\fi" write$ newline$ - "\ifx \bcomment \undefined \def \bcomment#1{#1}\fi" write$ newline$ - "\ifx \oauthor \undefined \def \oauthor#1{#1}\fi" write$ newline$ - "\ifx \citeauthoryear \undefined \def \citeauthoryear#1{#1}\fi" write$ newline$ - "\ifx \endbibitem \undefined \def \endbibitem {}\fi" write$ newline$ - "\ifx \bconflocation \undefined \def \bconflocation#1{#1}\fi" write$ newline$ - "\ifx \arxivurl \undefined \def \arxivurl#1{\textsf{#1}}\fi" write$ newline$ - "\csname PreBibitemsHook\endcsname" write$ newline$ -} - -EXECUTE {begin.bib} - -EXECUTE {init.state.consts} - -ITERATE {call.type$} - -FUNCTION {end.bib} -{ newline$ - "\end{thebibliography}" write$ newline$ -} - -EXECUTE {end.bib} - - -%% XML output - done for each entry referenced in the BibTeX database -INTEGERS {i ll li j.int global.counter} -STRINGS {lr lp lt ls } - -FUNCTION {replace} -{ - 'lr := % replace string - 'lp := % pattern - 'lt := % text to search - "" 'ls := % result string - lp text.length$ 'll := % length of the search pattern - { lt empty$ not } - { lt #1 ll substring$ lp = - { ls lr * 'ls := - lt ll #1 + global.max$ substring$ 'lt := } - { ls lt #1 #1 substring$ * 'ls := - lt #2 global.max$ substring$ 'lt := } - if$ - } - while$ - ls -} - -FUNCTION {strip.letters} -{ - "" 's := - duplicate$ missing$ - 'pop$ - { - 't := - { t "" = not } - { % ascii '0' = 48, '9' = 57 - t #1 #1 substring$ chr.to.int$ 'i := - i #47 > i #58 < and - { s t #1 #1 substring$ * 's := } - 'skip$ - if$ - t #2 global.max$ substring$ 't := - } - while$ - } - if$ - s -} -FUNCTION {output.xml} -{ duplicate$ "" = - 'pop$ - { " " swap$ * write$ newline$ } - if$ -} - -%% - % markup.xml - % - % Takes 2 args text & tag {"the text " "tag"} - % Returns 1 string {"the text <\tag>"} -%% -FUNCTION {markup.xml} -{ - "" 'v := % result - 't := % tag - duplicate$ missing$ - 'pop$ - { 'v := } - if$ - v "" = - 'skip$ - { "<" t * ">" * v * "" * 'v := } - if$ - v -} - -%% Takes 2 args - tag, string -FUNCTION{markup.xml.title} -{ pop$ % tag - duplicate$ missing$ - 'pop$ - { - 's := % string - s "\&" "&" replace 's := - s "p" markup.xml 's := - s "title" markup.xml output.xml - } - if$ -} - - -%% - % markup.xml.pages - % - % Takes 1 arg (pages string) - % seperates into and if - % there is a - seperator. else no lpage. - % - % need to remove others -%% -FUNCTION{markup.xml.pages} -{ - "" 'v := % fpage - "" 's := % lpage - duplicate$ missing$ - 'pop$ - { - 't := - t " " "" replace 't := % remove all spaces. pgs must be - seperated - { t empty$ not } - { - t #1 #1 substring$ "-" = - { - t #2 global.max$ substring$ 's := - "" 't := % break while loop - }{ - v t #1 #1 substring$ * 'v := - t #2 global.max$ substring$ 't := - } - if$ - } - while$ - } - if$ - v "fpage" markup.xml output.xml - s "lpage" markup.xml output.xml -} - - -%% - % markup.xml.names - % - % Takes 2 args - % tag, namefield (eg. author "au") - % splits fields into and - % writes info - % returns nothing -%% -FUNCTION {markup.xml.names} -{ - 't := % tag - "" 'v := - "" 's := - duplicate$ empty$ - { pop$ - organization missing$ - { institution "cnm" markup.xml - "au" markup.xml "aug" markup.xml output.xml } - { organization "cnm" markup.xml - "au" markup.xml "aug" markup.xml output.xml } - if$ } - { - " " write$ newline$ - 'temp.str := % names string - temp.str num.names$ 'j.int := % num of names - #1 'i := % init counter - { i #1 j.int + < } % while (i <= j.int) - { - " " write$ - - % Initial first names - % if first name all in capitals - % - assume is initial list of first names. - temp.str i "{ff{ }}" format.name$ - duplicate$ "u" change.case$ = - { temp.str i "{ff{ }}" format.name$ } - { temp.str i "{f{}}" format.name$ } - if$ - - % if last name but no first name use cnm; else snm - duplicate$ "" = - { temp.str i "{ll{ }}" format.name$ % last names space seperated. - "cnm" markup.xml write$ } - { temp.str i "{ll{ }}" format.name$ % last names space seperated. - "snm" markup.xml write$ } - if$ - - "fnm" markup.xml write$ - - "" write$ newline$ - i #1 + 'i := - } - while$ - " " write$ newline$ - } - if$ -} - - -%% - % markup.xml.pub - % - % Takes 4 args (school address publisher tag) - % prints concatenation - % returns nothing -%% -FUNCTION {markup.xml.pub} -{ - 't := % Tag - "" 'v := % Publisher - "" 'l := % Address - "" 'f := % School - "" 's := % Answer - duplicate$ missing$ 'pop$ { 'v := } if$ - duplicate$ missing$ 'pop$ { 'l := } if$ - duplicate$ missing$ 'pop$ { 'f := } if$ - "" f = not % school not empty - { f 's := } % return school as publisher - { % else - "" v = "" l = and % address and pub empty - 'skip$ - { - "" l = - { v 's := } % return pub - { "" v = - { l 's := } % return add - { l ": " * v * 's := } % return add : pub - if$ - } - if$ - } - if$ - } - if$ - s t markup.xml output.xml -} - -%% - % xml.phd - % - % Takes nothing - % Returns type (phd/msc) of empty string -%% -FUNCTION {xml.phd} -{ - "phdthesis" type$ = - "mastersthesis" type$ = or - { "phdthesis" type$ = - { "PhD thesis" } - { "Master's thesis" } - if$ - } - { type } % usually empty - if$ -} - -% markup.xml.edition -% -% edition is a numeric value. ie "2" -% if format 2nd 1st etc.. strip letters. -% -FUNCTION {markup.xml.edition} -{ pop$ pop$ %clear stack - edition strip.letters duplicate$ "" = - { pop$ edition } - 'skip$ - if$ - "edition" markup.xml output.xml -} - - -FUNCTION{begin.bmcxmlcomment}{ - newline$ - "\newcommand{\BMCxmlcomment}[1]{}" write$ newline$ - newline$ - "\BMCxmlcomment{" write$ newline$ - newline$ "" write$ newline$ -} - -FUNCTION{end.bmcxmlcomment}{ - newline$ - "" write$ newline$ - "} % end of \BMCxmlcomment" write$ newline$ -} - -FUNCTION {export.xml}{ - newline$ - global.counter #1 + 'global.counter := - "" * - write$ newline$ -% title "\&" "&" replace "title" markup.xml.title - title "title" markup.xml.title - author "aug" markup.xml.names % org. and inst. here - howpublished missing$ - { booktitle missing$ - { journal missing$ - { xml.phd } % Phd/Msc - {journal} - if$ - } {booktitle} - if$ - } { howpublished } - if$ "source" markup.xml output.xml - school - address - publisher "publisher" markup.xml.pub - editor "editor" markup.xml output.xml - edition "edition" markup.xml.edition - series "p" markup.xml - "title" markup.xml - "series" markup.xml output.xml - chapter "p" markup.xml - "title" markup.xml - "section" markup.xml output.xml - % month % ignore - year "pubdate" markup.xml output.xml - - note missing$ - { volume "volume" markup.xml output.xml - number "issue" markup.xml output.xml - pages markup.xml.pages - url "url" markup.xml output.xml } - { note "l" change.case$ "in press" = - { " " write$ newline$ } - { volume "volume" markup.xml output.xml - number "issue" markup.xml output.xml - pages markup.xml.pages - url "url" markup.xml output.xml - note "note" markup.xml output.xml - } - if$ - } - if$ - "" write$ newline$ -} - -%%EXECUTE {begin.bmcxmlcomment} -%%ITERATE {export.xml} -%%EXECUTE {end.bmcxmlcomment} - -%% End of file `sn-mathphys-num.bst'. - - - - diff --git a/waypoint_control/sn-article-template/user-manual.pdf b/waypoint_control/sn-article-template/user-manual.pdf deleted file mode 100644 index ed8f1c4038f2f69c7d875fbfc5232fc32a744d54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 418495 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

9ABg6Yq&>Uo}C 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 z z5_;?BZzGuKKSuCMOkU5BjOo&?WYlHx%9IbJP9yxd?TZuSi%68IC4vr7wyYN#@2l+= zy1w;{oqA|Ev7D)gaIhLH2em6uwVpRb|GUtyZckP!VH z%I6WE_mXunxo+$zYWOQ7N~zqq`P?0x%g-6@kOQSfxwSnHp(~oxD<=UW_}|C(Z)9Y?Nhr4Fj@_KY_nU-&HqfXRapzDEifVHN7xBD&Ufv~~v zdoG?0iiu zFostG>YtgSP^AQv9bBQ`ZW>|uk3YF$;M6mIcvz`%$av5!&bgokyxf{4n%Q(&#FmXl zMNsPI6Q{0EnVyb-HiWd>nCW*HU$f~gfSK>xn|BKhdswv`vW@(jOuX<=-0;Z!y(^jI z8Qkz?Alh3d$D&hp(g;@Y;N7xr2kxZ`8T%@HCJzm$&IqqeD@BA3=QMcI)Hbmy#Jbh0 zOIl48@8s9jT$mH=qg{asr7E?qHT{{+z_WO+E2kxWd#SEDYV_EMLqJSb|u}E zN)&b^^$P`>s1V>Eb-n7Puzb`;U!B&>WEhzim z=a~_Ee9hx&u-OMIJO>zxlb)}5GsOm_*Yw-_JbTVVy1d*GV8#U9I@pfexJM1n#xd1v z5AX*pOf6y8OqI%S~ zRpY$dOEMZ0o<~#(*Zp;QOA+{GplAK|b9FpT0Jd-@VF=eF%URST={RpmXrptCbn)d z`!74E9?wwN1y6T8cUyQ@&2v|$&18z$3aeTz2AsRbrk6`6zNYcINN1nMrqH50ub0V9w%QkyO2!_2X3p4rD`V9!T*WRjzH2 zN6zP<80EeWl}CsZW$DB2auf#fykpM5@lmjeRS~Z!WZvndV7)&v*8V7M>Vkw0SupYD zcVlc*lkY^^W|b{wIub&rj1-;0Q%ZC}Iq7S&P5%Q#J7mT1!O)h_Pj~aV5)pm)r zIY(m0h8|DqQoGMzIESA^hZBOi+pZDn89h2Ov1fdEjTu2anM39av+k?Efy^D4z%@YL zriGOJ9JZ*!oY7K6%l|+mUb|pG+!{x9rWI8{kYdR(z9=A@8 z00joPj&S(a=jiil5+jdWuwrgMZ>_I;pq4_CRjp8lpPaQx^#jAA=MgGSsjbm(FEgW&L?KWj@8f?3`R0tm!HYn{U1Kq zZOxM|e9nqxj^fLvY$!H|R_}KBk&9}qh7?_dJZyK2$+4r@=utvf(>bHk4%kvAKk8fU z@ML5V2k>X%(U-K;Ww$~1pJ<=Vi%Wo!4_>!>oX0%TU_ZuN)1{h!R?-H>_G@JD-zSZF zYxYUh@wBjh8o05ey@8|QahusmlNi5ZVex{hULcR>t z|0HI!#C8Pkey*`+`J$O4G z5_QBlf0-xHIL?|`ecsqRZBke7N#Z=g8w(W!Wsv6=Il`Y9uRz;98{<%`g})uMAs>0x zC85B`jF>1@tbLv!-uMs4EfbyVaaYe!=6h7>mo24AXW*<}$&FGCaav8a+h8=4M)4(fcSwGUcJp2;|^XgRNSgiF&(yc<6vK5=yOZRT} z!ag!{=s`lYas6_3sZrzvxklmdVfIri??E0z>h`tk8{B9UxYwC*vvR?6_$n}`$;SCK z#G_c+!kY<|goi>^BLcxT?*UBo+Sv*Pn_h8Hi*Z}ZF4Jj^j#m-_%Mb+ z4;ed)%CgPxb7dsrquV-+;cRSa)=*0mP%Dy+S|qXIm~1W~BdzUYMYleunPfE{kKWVb z=b1z$U|q4VbMh}QfOk2%wvzzur4(=-BkXI|Dfm0gyQ+0Dglj@%=neQve%aJwn-lMz z4Kp*~J0z=qvy!-+NAnc$BV^;|S@limp6CF>Ou&7q0h~kw5oIJj7r#>k&poVZu_>@= z+JlJs48C$+9ft(9oD64QZg@j}V9|c!2yf!Vm?jAOn9=b}QmBG0p=Y**^7T=yazoruOw(e0scGA3wcv z^a-(pz2)fcGohu4{s*94biBhw;eCH-ZK#4PPb zeYvY0Hgx}dAPjnu^Tc0Ec8Pfd+@-E0Kc|()e#hc=C2R#jt}K??{ypPs>j5I3=8r5Z zR)S-l9*m}RNm-)vqn4gujHY~sk5VKHopECwl*JxpW0GF361#^}k@A}n?ctN^p{&yv zH?8kmP{`uMInd+ak<`Vl5oeCHEpHqWU8oapH($rTImI@N1~&SDeBNX4Evv6ZbHHC! z)dsiTYE4}#-z8hj^=(Pm&f@2|b8RowOznI{zf0pAx#X*jijQuton-;rD7qGX5Vs|> ztsdhmyva#IKMvim$M!lu>p67>yvYPcFM{eewBGq%W*M(rjJ7jnQBdaqn>Yr@A1x+6 zN`>UNz(^u@22tN4Co`v6f(mIfKE6f?)&ssupISr^%2E zp+wi%Mrwar1etyK4&sK1reQPYd=VnKI81+NLkh6M&tiYz%Kwc{u8e3sxf)`RK$S@< zL6q??OSdC;>rRusdJP_OKY1T|&Sb@WQzPifPK!CUx7Me@S&$}Ig*70TPHZ+|=Li3m-`wzq zcf^cm%qzvFiO)gqbP;SX=@t;>p33Pe~b z`O0N7`{~;YX|mxxlota_HEi!Ye(`dzF_wusX|F9mu%GuMKs-!MT>VS#YKodldYQ>3 z>8s%g9?S(QXpYi*J}!&K8e5lP*#oA`KN|~%Q#F&wz_cF=`d}?MaBVO z>#;3!MrfEwu32`8z%hZY-|lu|?QKA2**l_)+-F;CbCOBLVzH5F6?k*7LR2;!Ed}od z+kt<_&gnm^I4$(gQ!VVtRaIN=&hv)(6{Zi&+?~;C^e6hF4uJIVat#)cXY@J6ceQ@P zVU5wK568EzC(*H!>$yU2Y|E#yPx$$QLf{C-HOWuKdYCzno|y%9A?c}M&LETmAP%%a zb}UV3-u#!PbnDLuPS}W(H(jiFvqE+|=%>GYA5Fck7l~^VtXBjc zOy*Z&YityaIwXddSgP%amn0Li(5ngRJagTo-#a=U%(QvkD zrPd3>_Sg1el`-DDP2k(ubjHh^c;VOFfmkKcY=ed-8#bo*X*Yma4Wg7;r<*EH+FIaL zLeKE+rVIR%J?prM8^cD|Sud5_P!{@Sdr)!u*Mm#bhD1h|Pu9mT3PXesxq4~$DS!Tm zT+GOzXvRL711;l>HQKu-V?au;+vYI%Q3aG!Nc8ES3(3e9E%vr^{xRI&PXfiv{ILCo z9;sRzYM&Z5@q<)Pm^@Ucq7HF}RZdEs!Ft4IZ;p-sGX0un#8GV$R<_o?J3arsgiaCB zF7cIYg1z@^4AUPrLpuY%)6^pD(@xyHbur?6$d9U8W$pp|*ZGrHwHN|l2Wg{dLQgFH zn}G4RW|~p|g(rKn$-b2@oonwcPO^)>tV|-|yoG50u4mxw+=N{5r1>-@u(*-+S_$(d zrK5AYH2Eld*1_yX$;*UD6OhvgLu-?L!+$;X>pgw_>SLX?H2~KhhnKv+|Bx9?V7a$p zJtgj|qGZ~`YqmSBC16_m(sBAH$p*jPQk(O0x6jNZe^9dq4Z2I{gxq`9lM&7V?NLG9 zokNtkDPFF-ej-B{gn|6jlh4rtCV>ljb6av9fwTPH_pC{TB)9MbmTLs6wcGTR%Xy5^s3b!jRp5yPT6oWyKN3 z3@QVa#T1-_Wh-POMc6^`Ia1rgY<_v4+5fTsl6Y#_TM^$SrSsmjjIle9J}m3{`Mr)~ zA^kS6(6#YPmr;4tu!b8T)HvDpK}iE zWuH(2P6%Cj$D8qwe|#15I@)Ji;V05~ca^o7W}3a?I!0(qMRPH)OkA0nH;;nKIv z;|{JA-=wZ1XDaCI6vOQt1z%3vl*Sh{&#vg{V%b-U%=M=O+IRW1Qz|nP%R<6RLPU2t zW>e~RD^Y}<869bM~c9-%ny~haDenG;_SZ-EZ?JLNsSxMx*M!3MYdzB z!iB|yF1Vb<8^oui)rsn*m;54R}z0J?kCYbMv_7@rJQX6lC5hv!?$%E|+3T$;VX9f0`lf+{S6>SE5jQ=uEdcFeLc1 zHO+NN^5B(_dKiv(fj~(fd+0I5r<2c~mV8&d_i-lXRr)HyH@t45V98-75V6xWbmEqs zkJ~ z2HoA%88WL!k?-W!5L+4y;O8Ikg6J}jW(!+W^b?t^u@X*@tqZs|}r+41kW7(Wxs3+!fVelEH`;|sv8yB-?0`;kd_tC+n z4H8!gI!&kp3&&&FLjpKPzc5VGq_FnRwjfOsZ4SS@3y)jhF?{{tZh!tG?{NQ%llYPm zQ1wl45u9?-cZ=4Dx8NDg)QLv>Tb%Zv{MpzIW_tW8#aR?T=J;;2_g!QzL!PsLmmD_J z$As|MS2eSlq?0mNxh>(ZjmM;0-W6nRo_MZrGaU$Oj#GSWk5d!5} zGvA_4TrIS77-zrl0&XyS0Kjadn>^*Dg9O79Q!1M*PTqrUt^X{_VKnT~m)2WpnqjbA z{qg~BTcN`w_msf|V?DTyRrM<#bUuXL+Yk^hl#)+T-RE1BE3oAh0l2m0!zs$@l3P2c znj3wKyMGXwngJZbb+;Wn)16e1n0e*1{&_oaU;){_MeABMga1ZPDJB<<6fe#4Kqpe^dPO#Pn$bkv$hx#v!R9c9Bxs%yeNX z3c?TchAK63kznaiv+TzGDXNQT7|Q_AZyjt_O6c=2R5Ek=<1CUst>)Or{XlIuibfzg zJg^?wF;zto>vE$*YR@gTyi^ewuCA2sh{Y?T68iDU0K8v znfHlcVb+^M$GBdY(G}WkB_hi2h^a9BMz!?f+(7ycvdtUmNY}8!J|S8b)T!qq%op+C z+{9#w*>z%LkrnV6T=p2LVzu1gDemaYdN9^T4(+I+W<~Yr5q?)J&fTcZpbtMD7BZfi z5^5|wM(zW@QaS!oL-mNI{v-Z1$Twsv(YdztvR(*cS8$0Z4A91XZgE=pDop|Su{27b z1cylGLwpPbB-QB^&2l`Vxt5hh0&S0RkEMBh;hx@%yZX@`l3ii!($^2b-|$R*gS)fv zmQDr!cJUa8@{8n@u+V$E0Sa(LH zi~7MnZ|h?{XJhO!SYmu$F*mjy)?Vfkxi<5s_op(k$QOT|7Bz>KgrJH~A6FM`sl~R^ z2D0sfNBHPLzT^Pue2{!jw=sQA7!qhYeY{ct&ov2|{@oVG0#i>n1cr}rX=Scb6&Gq; zPutRIRaUcjGbq#JWg7rXZ$w9GlN^+}C9UbKZpiK?Ez{D#U7UNC)HkLToPIz_7j+`h zR)p8nPtN1-Qe@tzJ;l=_Sl9jGjV2pr75S8edb2;rPKM*(rRspKUjXTrdV+#|7KC6k z8xtLp!`aHH%rDxhDoOQtU@dRicDzYgi*Z-bJ@LIJ_Vr_nDdcnwffFU0VF!pL(D< zjIDk-)N=21{}+wRloPVA70%k*g|7{XXECZ}+Mb~@bT~8>A*S`k*`JE(fn@LXkHFh5 z-!L2Fk1gj+)SCV&va@jqK!35FpWtma`BRTAhnWQbRqpm{k{_n*(x8zz8h82pPz$X; zGS=UM_$MyKuaCH9R9y6Eo#@@@+vqk%ipwuarqLLqv#$g7lh!#VZt@pH$fTL&xWivZ zoU^kFe{hw)crMOwbx9HRL%0>qw#dlaR^!&Toud!0ya=2NzkCrZoiZ~7&%VSrHfh3# zWvj>Zn|Ny2q9c7Sbi%I2$7E1m0X8FRiJ@t^%^CL_aB3q-SEMSw6>Vw48b& z%$Gp$) z=ZJgBhm`s=Bw#w`;9UdBr~j7LKXyES#E=0r3#05rl(F)U>6Mz2GEW#6>bLr2?{$l9 znBCzClhQpvKbCR@V&Rhkbs^Q8jtzbI6OW4cbnNGu#i`A-AbgS+OUxb5OE;^R;3WL^ zANktHV{?wQ5AA=^S~y)c*MV4L?HVO*&|3bohmQTSXH9=O-aL8VHb&q`F_K1ZJ@C_g zab8bNPV?JG2aiZbo6IJ&sOGCkb6#Imx6>rQOuDp<3b?C5ydL>oY(hdTqL>JK5>ud| z{YiHW8<++;2RIY`vi5$*5$Q~jL=mECMuz#PrvEZh^ZxY@kB!n|6a_6vy-E{b$VN!z zx9lIyU4kenA{0>@h$2a}IH9MW$*&-)EU!pKslC-xT@xl?+dmKmNEXnOU#iKQ|m)o2d_jIl(QQYf+;Wc zbH4HK5(SS-o7*yXSrv+AtnF-4Q7^@j4QmFh+Yg9$iPz~sdZ4n#wM4sSN+0*Qrq<>f z#bT0k`PE-?4d*FRAWxicN0Vf*GB$@v*e&RJIz83_1lQGvn*9sp%d+HXZnLGx(sRlv ztuOKugG;gL?9s%)l=bh$L;|Vca@h}ZPsI^k6_SsUEyVY zd~@gp{y-zXX8F1U-^tLl>O)RXGQoWK$sFXaduW)t%-*3jX;Fo=EWvu*lrf0&4Z_5c z*ZVEi@`hdBKyeJUa^T{2Lf#lVmVsGVn{|{6_}DPNEsN28lN*qEnU-DUT4L7gDmjwm z8^??~_G_7HdI>~T$m>y%oOL6WQ3^y|!&RosQucnWggAwRdgU!+)22kBr2N^mG$*)p zU4Cj}ombAlT>Jf^*JgyRn1y91wSGo-gc!DtCVwRN#v;?<$O|aJujn z!)dWZe{Dvb_X0C~i{HpayqXIIOk8^xAnh6#PeIj%_nm)PDSBJ+1G;-2E6hiUM>nIA z^}GCirU6xNUsz#r1~k;>%cPJ5Wkmm+6;%Smqf53b=z7HzXLr(zQyd7YX_Jb|Y%sg|bHq%9QAfshqn>(Q~cu z^&<)D;LEVQb%3kFwOj6$(}MY!JcO}T3CCn6m~4`g%R?xc;=5+qW+s*!0(n7ICX8NK zTME$}MO-5idCGCmmR3?gZ?JGi(!DZraqh~7h-{?uOf&Z zNZ62OubIg^i}pR7A{;Idn4a+6I(}5F5k_r?2c1e-x(DnIQ~KEHZYU2R_9tyPx-t{(N9WL5sd>v zYe`40B+|a0UjUzRMKpr@kTF~;1EODBG&D3l7cu9v*Ja4U! z+pmd_b-Ggu6P+XMR0431Y~syRdKVtnc#Nf$ zLRs#15`}d|a*HN6{{^qb9gDALr~fjW#spW3OHEvHr2+U7V(5#osuiY<89dkt$_Bmr z__(6`7L#7YwsDDh6goNuu^%m@BY4RsqN|7}ykUMK1;3c&6npA&#(B$f%i564gOsj);u-vQdZGpJ6XGU3q}Vx&M3k<}v^_JNwt+r2O$kZgc;PXy@obU% zL>o@6u3LBQhAb@#-zOWArXAU@LlKw5!c04+Awqsn2whmFKk9&V4!s9Gnls&?IBMHJ z;Y?&&F}H8@gzcI-u`tur@5++>Zo^tCb*B94V5KsQ#vIkw^{mzx0CkJa8@nEi1Tw&W zz?11{`Ft0Of8XfGQRa(~NGAE##(OeSM~>qyO0;k3rSfk>hTL1fjO{4xIk}?th8_`lH zaS_3@pMNZ7tdU?$f;_g#&t`Q0my)67uU8=iirKcbeBK<4= zR8-XKt4LBO3h!MFi6q>=lNX9Rqv-)xt|hgI1)A(B$NOap^QA5j2c^!!{CXvviXi-i zly|UOJ5^)BUbBgOyc#VH9laGPTVEPrv)sN&5e1>XtI0Cj z35SB)szzG?;iY|>elu;WWb@R)Lj-pP(&gpLuuNJ~$A|aZCM=3Ox8yPU`_r}3@LE(-cNgXj;U(z+NFKX1H+fZ=eu?)hrC^UZC|%$hj=>ek3r1yh(QQ z0Qxr^JH@)QKOF{%0DGa?7U^Ee+xKrYpaWg5#dEtyPh~~gc)+L|`p>*r)GXF{|4p!O zqn^!xj@ELvug}Y_j-DM_uz40DuHRDNF~9KPaEka`fy7;jM1AE$Wbp(LpbkId*={Tf znUV!AWXUKL3jYX^K`lT)C31+u!}~R>%hsZ3Fc=|G=U(2B#cTC+c*KE4Mt|oR^7J@d zwH;@3KX-KmKj0e;4zBkW3$rl49Bx@Y!>}WWU!xEAlaP{s{h_bZYe|cc>{!(Qkh~^1J|7$OgoUM$=PMa_{OhN1=YhE>o zhWo}{2&xNqX!)CAArjpwg;(3fKu1_Terd14pB~%dLEA8XtY$e9`g04?m@+7IG(IlgL-%N6-3?JLvMR%Mz*$HgtcQ-f)A>F;Sao!eV;O{|l! zJ+%AQ)p*m%SKFK27GvUolr}UuZ1)&SLKczUQ*RJRJ;dB9BwuCpj`k$O7e-Ht=tal& z*y>If;w@@t!mZafxCwSo%M0`|6G6l47CIr<`~KKpDf@&SXSs1dL;RVck`os{D`5p~ z{GmluxoGIRl3+G3D4B*SIs3su@9C5C0s9Bs$erIYBto+r>@yCJEsb8hk=R~wJX@m- z^;w6`g=%D%iLz%658Sxz7eP z)E6eZ8}qTa`7R-=lN;UR&I3@ydXcUU!;=MEfzg>A>|a=C#c}dmNHqy^hA`x$jH57j zY-v`|{V_|Ti6>yfr73iLOL~#((V9w7K#K4AJW;lyU2egHm zj(BZ`c<3VGVj4X(Zy*c?F@y?JkL~3V+OS=N6U!N$)pgU2HvGnpsIRe|!O@y3X?37u zOvx<`lHBSN(eVMJj$e)=S1mE#IB&xhacPCua6O`@vetYfg~^GLxZjbTkpotH-%mz$o(2tR2Ao#z3;srk&Nz?}0GkMAp0`Qq2vP^aL`TKXujTnj%{nQ~SjgzJ!Z*&jxW} zNwkJcRK-!^$YFBfoD5PG$DhlIcoy-= zc-(whE@qRj-!1#FGFS6-!%^c*C{dwR*fhfP=u;fk6;lbB;nV$*_%HB`X>?nAN|;P$ zpcyX|FvW1Iw;LeNY!I5>j6gIuc#<->r3o-X9dxOs=)B_c<8TGaH7+IK#AjW!n(AeN zPM^x7QnVf>)zbAH)+cx}2lFEDUG>_Ia2&^#*1~yR=JTvPXEedIP*hjQ!D7NA`8IP& z{6Sl)2YFvtqU1Y%a!JF~jG0E%tvln)Uz^$~+2%)86;TiT;=4BHH>SI_l_GN=S)KCZ z{GTX>ybQvEd@EHrDdYJAt2O<+@`RP*xy~bi`RL(TFXCR3NwJQbTQy%1A$P`=44U81 zBeH=*bgDMm$Xnb+Op#eVS(TtN!dWER74o-td!_Mo_|Y*izMUi5a0?xsKNBPSxW`aO zy51W39ATSX>2KD;+N2Td#QQ9>>G`pWFhpHH$JFa9p}p64@3cdP*VKx}+R6Y{fYJr* z`>8GKpOU=Ax4+JZwk+n3LuJC52qn*ijru9%Bi@5>vl5duU zV&8kGWbbb6eiIvgTxa`ks^OE!)UVWcUAvb|-=|3 z5&f+!3oE3RRW$KxdY?2KOwN<;oRtEv)sd zFsx^%ZP3U^NnKnKPcN)gtLh@(%>pyn5C zW?}kth*aQ!`2XKMUU)-)RVkm~i$-zzqfs#lu_peCs!EgyeQPrH*ZNQbQdan8oh?x9 zmnS0oN#|1@RecldK6jGtUNwh(<`IP>wh?7!m27{8u4E6_Jxj{PSr`bHPeihr;y%iqy243};v zy;IsHrkbBEKJQ{p=P|p~wV!Lf3#xQgN`HOuN68kbi`;`S$FK^ImUGE!R8~MVxw}|2 zbr0r!CYEyVU*o^gt|%Pwf{vV(oXcR)|{MWlIlUt6cJ~X!i7+tF$U79X({*ulhK_RG#Qo9kh^sFh-eD zgUVdjyx&}rHid_}lRO|nd~E&s$od0wNqAB-&iP%-ThekS?&D+Bqjt^f?LPi_u0G{e zyUrO!q2)n}c&n1q)qA>Jq@iMBON10dtZyV%f`?KQHWV->TFJ3779*Us7k3wK*pGfi zviYLQnz_|FOC8m5keSD9?IflZbq)owJY=3A&7_P2&Yq_#rL}p!=St{ude!)RvNVQ{ z6Zx}OC8+OAmP)Z~d0$niNkJ7;+VwtB@ehLZgUtwe#88%Z+`K6fQX~hcv7(e@0!Nst z71v*mZTk`6gK7m0Z07^%`hF)6)Fie50{j+^y(13r6{pQ|c~&gv0qI0#(hCxSThXW% zZlCDd3@G9Ju!~_}A;O682u>8Bg1C9tLWdqzrVq{x*Xt^p6QYB@S`Fk#6^=RvWyh1g z}{?^zYTfNvl04_Gg7BsIb${m;u67aj1drt{S5fiLnDizzvu z&z_o@o|dzo8>OKdr-`?sBIdp~QXfe#4-fBRtz4a{Hs@|_o5l`R#w5jxY_Cpa<@j-q zqU^0Tp6T(r-_9j~&W$mQ?0(J_j_e|8<*PlF$_5)SfGO`b>YRZ0f=^+}(ODKzweO?b z3?fhQq@&sOAr~|o<1BZor>caN(azb*il<%cUTq~6noUg&9qPp5<=@pKeihu}+>}#S zx{oT&;e)t1@IoG!$^-#ikGG8ylUd|=rvf$ZwX`LP*f71 zbB0bxys4Ga`yMYaPqx<@)!lwIdz7ot9i^M#oTi&FI{m0O?4BSw{iL;1hD)d#ZR@`? zq>LHs#tfSga5E+khD2)NS$abfJ$sklZ*VF@T=uY4L2U*!Zb&)-Y6dK*^r<@`YI-Lm z-w~2%`yp?*xIis-)m%ZcgO_T<=~em_n5unA_rO(QCU)&yp>TqVYJs4*^wnJuVF&aV z+B;mqZ~}#D;c)1xI>Lc%c|VT^xKbeW@?p{VVuYp@c!Zmm`jaX4zry)JkcBYV;zQw+1>t3a9{01;flLR_ z*`h=;RJn&S?m?k}6XpU*hwRZoNeAT70f7wQu_1@&fkEscq5Wu}@gni@j)ritp-cOB z+x{qd;QnZ0JfX19LQ4B)&jPj!vYtR_d0rqbFleZZETlqb<^AZaAMDQDke>Xy+>0p| zsx}3+l7hSj+!}5?A&f4X^ZRAUPtq7{uxt7+!EQr74#q-yK?jTseg!s&^xnAH|InI8 zzXxN>93I$(m4&qw4MM8*l=t@Q>7A*?ed^PG0rw8X{V-GLes)Q`!;bRU)p!Bv4zAH< zz3|Vf1#BKjxdHZs$)VpVAt|VO0cuWz^6Hgu?ng<8BV-vMNszVCq)w-ZrVs}E@(644ZcmQgLtmyvZ|JiG!U~h13!&}a$(#Ue+ zxy!ECRx9Hws+7%E%$B{Hm)k6(l4$cM^@=k)^ZI-4%7)s{h6dRr`|Hyc<~0_SbUrED2vsF`}%o<4KB4A#VGV3!FELQt0u%3mQ5Ej$-a z+Ru;f*P9?FTk;SmoG;aA;Ib_g7IalE@rES;x*Ox+%(%BvPQA*j80bgAUBF$}-OnTK zRk`FX>aOW7?XK)DtX^uZ+)|F^+;N4XhN6aymXem7mV%aShH{47BGDwtX#9ZVb|g_G zsc0O*sMzJLjQ2j0Hb??bKm9C6fE-zN+JGDowI9x39<1NZmL?O>VAm22+N6(+4RP8x zj_$WNagC+^MyWsB7f)t$T~~)45}foo6|xvFT_+F_7`dn#vXh#v#z<5M2}~0p+IYx# zx)$$m@`x>gBJFUG6K?o3D_CaYs83`kSSQp+$TO2gnNrTujZ)mYxt+Y}JMeo-nn~I+x*0YrHtgoSL!cWWG(L({ z7zh9vU{3fFf4Udy)u*iB~s-LgiW4oj}O6?=(;gjDc*_6TIQG>;hU2zV8EdqGtQL2w`u7pX)B0oLyMm zqI8lc=aNJVGIPP$ghEgSBhyhbA~)k5?V)MEwvzz{8l@rj{sjGPi@!Vle-tn~MCi zlB@Mu?5%Mu)K%QU!TRtrSv4P96k%d1$k-$n)x%UaWhxZq!enl?ueLEi{JhS1s^6Y` zRAFXb^nB668ZQ^GCMIbKB^*G7Q5d)|LQd=m*5|UT(JqclZ{-ar7zhO?P8)0AZENM> z*f_gE-?3V7?2hPA*Cd{_-R!{qJ89^3BGJ3cHmyEoqAO0IEPvW$CWo{QFi6|l`U^rw zV**>1>|wpmM$L;i+{>RB^0l1St0(RG-c(izmryFK12!CmJj1T|6p?C-xAvn4(BcEF z9{0{jYF~@aPp=0zT4u>x?5n5tBP8X+A>u0o_S=WnzW{5d>3bJ%c)-`;j90nhi@5jK z@2j>c#O1)Znj3WGWzBU zj#mFA%x=1!I5%NFKnDjrtCMCVLGQj^jR&NkB5M*Sq%bcqD&Q1E7>moM&g7#b^fYUf zu(dSVH$T({1mOmuDL%>=I|Bg|SwtYYg9pR{T1NL5O&%(gSl>?-4-!GN$D3o14 zI+f5k6kR_!72i0NTt7UOpg7cQaAe58a=Pi1D=>+m2uC~0N*afuZ!98BIV=}ljdLrL zKWNsao9rz|FrFO61#W%r#m``~+R0+;FmG|%JL<_UUCo4TaO1$OLPK!eT*rzrB+yo2i>8&Wg8reQ0jvp*2&Up-*Xr4G{dm@K~w?bePz!2a4qE{9T0e#hWO{ zfjaH}@NRfseyV8Tp~exzd&mj3dVEl-Xu(HfM=fPr;Yr08;MWoGxWa!EtZe_~1%7L5 z8%GB`)_)u$Pb+9+?Pz5EQ)d5n(cZ>Zz{XXBj)o5JpD!~zGYumf9vc%q4LgGtt(1|W zncn}VT~^Qjr!zcydgg!kE^p*u<797Oozj{+|Nle-s$-*#0s4pL#|-wtrivsK|uJ{$m)PJP!}8ti6qaf{~*Jt?VCRT16vQ zN3EYqc^gMPMm57G}EtibT<{M3uE@%n@X-oSIS*XSgTF$8A5o-uR2b;ZZs~5O};}KLU0lYH8LX zql?$~&8G5pQSosF+NQ0;O$V8-^sTLLvXugmkCozzLs@6QU>nyIZ%%Vcy5;}{pW z3}bdE!{8lzjS?%f^m@^V`N`}n9?7pP$%aPy1cUgZs;Sw-IRcnF(guD8}|D zdu&|f1=zOCSlsV~>&=4zcfiF|dIhh0iIRGs&UG4d5pHlIM-7JN3kY1EHbq;d; z+b1yQ0M`wDw5m*4&7bQxJxd9aYX{M~kJdDRD%8;iNfwpWLZ!=|w;I{ZXeI4^o3e%4 zu&$;NAqg6^rjT5)shO7?_ya7Y(ui5H=itEEvc*Pe6*bqrfVNk)L);Fc43@?u7PoFe zap$_LAK^Z|b8R00E_;m)f1cppq0uThc?d<*8wf|(6(EgMsJRq2{#s7kzzKFaaNW)YRE3lCzaE zu6RCZpdQ+th#Q~ZlMMM<$lC_ubZ-k_KY6C+_sB81GIdIzac$oN^{X3rZxr7tBFz#eS*Q9Y4BD~Hp1 zP^F{3&HNFvo>4TMdpwU+)Mk)}Q`eBCSM5!*Mdea|>Q_8G5syYs*h6EN-E;Hy1E>gIj`YhfXL80Y3t`uAMEa9% z#9$TH|H_NkqZttf-fcGv!WBA87V9!f{h(!?}ha$?_ zNX!h66z=Q^)Z01%1NtH%crEw9--6s~mW7;!+JS#caaMNU0HGGH^`hRydkmSO#TK{@ z4nx-Yq-@cgmk#&dS8jw@BWFgjOg&e==hh%tSMN(vjo2(z7DR^tx4FRR0O4khy95KE;cg#F~egA?egzvhSP( z0ZfQDu}f^e2QaVVhr*ISb&Lky?A49(!jpBYH~5WM7dqp5BSD>DCYQs*Vele{_^(|| z2K$%@HZ6`LMe7A1KKtKy@5Fml7uX7%HM8nz#KH?t97b&z?9NOGXz7KQF0^Y$N#iN* zCv5sTYoufTliZ^q_Gn{X=RCwv0wW`ebjI7E2)u+tj@|e`@|v%W1g?hTg*L6}MKQox zj0?dbTf10DEVqjd%f-uQb4u-`sBD$GXY#Tc*@SpQ1-n0Bz7p*rv@5<&1kRDUVGg|I zqdm9SPJ*^S8AqCNHJ(u2a-qD!=7~7WAe}X91>axFSvjC2?+r4iNCg<*Z5fqdz>F{_ zD;4#y)2Nq9rJ`Mb9~Yo%3TRiA<5Pui*e*53eMeAiIl``Ki-Dl74;Kczt3ROV zx#hR<182ds=5(8hga`@!*r=&o*cPLgvPd(8PN<*cLk)Jts8?4Y1v)BXC&$Pi%$q*x z^L=|pvC4UJ3yfUS{UoIY5U@E`Z4kW|(|ai>ErfCs*65b7$;3yBnDU6*(l+^fn7Y3* z4A`>V@d2YO@qX6X+V*GXDggHtQ?*_Xln{X`M*YClW5)N-x^ONl(hd^}T_=afiWOGm)SE(FFqZvw{nEB58$+0!rY zD}uK7J_d|Zg7GsVxZXxJ&0|t(W1KJR#xgKKD9R!Q3e*rPq3%E+kLmo~-NYAaD4x*& z#j(#Z)*E3BH=}s8@XhL2!lM((fCwq0Rb3?D68E!l@Adj=mGCT%yu05WnXvHu8Ic@Iv&Nd+%NOs3^S#ix<2F@(>w$Sn2|d zEY@9p0$3NU@Wi~);O`MT^F?)+SXBnHKJM3GD?wJJFuu%Q!y^2hUF=ZzqCKAOD(S~& z3ayc5YUVG7sdde|Dy5Ualf<`ypZBJ-=#=ou%N=NztFwCT+LJ*uYlVuA7a#ZG&O}T6 zv%Ha9lO#T`cbRvtODAkFF2aRTz^kfW#V z@+C1;HhrxXon}`RA&{bJn|yiq)_bM(!b@j6ZIO!G#(t6uhd6F=a6pOM95PH+z64y9 zbno1dlTfL&?tKbo5YIt5ifSAZBAxR?^8ej0K0 zJ!^rw`1OlcM=;>vJjb-Yr^ky&B*;NR8MZ5;ETR3AV4vA#Xk9!50%`q(0tl`WQZ6B= ziLf}EnAk%$6cio!@g-hXD1hvMT4=M@m1A3{hc9e+?eZ^iH@{z3l8)gp$MEPy)B=oL z6`%AuL1j_}>u_^bV~kc}^#KmFgrJ_^uG-3n@-?!mOe&S(On~YGc|BOQZF8$rP}TX{ zK17AD1J~)bnZMpt?sOuCW(SpKPkgGaz^oWD!M)wUXUA_QMF303Fkzq63m4blte=@< zeDA4b2IF~d(ydM>-_!)`u?3PQup3_q293h#)B&}s4yvH=Sx3HLp=NkWtfYN~JkO@+ zK-ak7LA%=GA~_tFogfP@;$>UY;&Cfj_SNVjvzkU>;UfN(7k1ZPuXfJQ=FTqP*1XqQ zBFzspRoA_r)y#jfy4KpIBbJfel9J)JN+56cHL@91EsuTKfU-*Gn~T{&F?A+w1y=_l zX;sT1MUc(oz*Od$1UlWNuv(?A3K;nckO7v+=M&A{RKw1cUH%Am$S(gb<*d2Zr!PA2 zlFV^HxBX3z073OD-*im%nmKt~>nRrXwbGO{SBcRMe;JrR0!a*$;PfkG!0eq(Cv&o* zMUS6}y|+lx%Ay^iEeGy6PByj1V>)t=Hy+l5h8O%GZZJmtE!>L12q7B&sv2A%89 z8^eAlH7E4mwN&x(RLDZUL)LyYa1TcBv%nBko@VjZNSt7oXrJ#{dzzx+%LFpbWagu7 zS?r{LK+0?CIOg?3x0u;E_R69DE$JS1ST?o3z3o zHx6#Y@C9CBRkoBX!8OhPT*)(_*dULo@-%kLGfxHDF;L`_S&nP<(o)e`-x|t?pGi!r$Dz&qRcpwx_t^>4JL!C z>8^BHgI$_D3?VYdc0ZY?iiNTS&A}NE-?PNf(~oPB*Z1j3Ot=}bm7;D;B1m==!&_kz zMkVEY%i9MrLDcZ}++1L>Jrp-iU1|87y7}^8WnzK$DWVk5q~IR*hZ|*F1)v% zhZP(kYp2{ax*_sBByd{ql36vs=pmwdgRT8FU@1ZC?Piirlc=LR5DS?~s^eRbHr)+m zt6Cw>O{=m}TUt~jN4K0a!Vk#SI}oh)Buf5OYqUk)U9FrlQDn&aK_Hoh3NYlN$PEu{ zG+efvme_3&EZC5Md7Cyo9uDoGQ(5R%w9>>MFf}{o$=kDU^U_KFqqk@!rG_7e_nneQ z=R1#jqhdj$A}`Bm=TFqziJ?KGv7t4v0N*xe+5g$m|HRF-fvlf^I_B=*PhX(28U_4X zYYcY;S90?69`^^$3?t}06TGX|&NMieQf64MM=U`uIx&#Npi7WyS-65XCb5F_O?%>Q z(X)dWb_b2`y9ao2P<*LID7K{1O`YYNcVhSqiFR)>>Msff_#}F2hB{rA55NwPVLd^P zkz_Q+)k{;>C6N#HK-j*D!}5l+x#OQKy@oh=xRqg8! z_lmrI##+3ECgzr{>Kth$IU@10bjZaEkm>63P`;ho6cH5I?@9I^VJ$*w$&J}YI^r@& zUhKe8F`3Y6#bx&BQs%Br>De#2F)348HJYQkik7az!%(?M(9O(=2QKVthH#E57v63=>$qni}HRoE9I~$>S5;Q=r z(QHL{q#^p&mcK2@H^xlzkM{#tWkVv8B#>3=^$4me2cF$@k=ErbEMUM~k>PK<9!L+pjIAH#T6+`Xa`%JI$;d zfEkhK+aw2v&j;F!Y_2;)OzgkMuDhew>KS^)8h92xUH?3YG2{9GKmq-zFZC)K4hHy}e?Xt`N-ddV$W9Rz*@n z?r*6GY_r-a@n~IO<3k<#70OjGmF6q=hnq8(E{4`1^)N)G$8s81kV@b^ ztl>dkyAN4`_m#dQ;~GwFWl>|C>kohqwuP_+WZSWtU*O7!H_H83golwO*~{OwxC^3_ zOUc|OA99zQY)<|=5P~kcef_THYnFLsAOub(`uz?nvz_)`4x1`6*k5e*+rzqU6rV7BP)QY&rPGkjPBnSJ{30u3v}A=i{{ zTZ%|)X)lH9jZOVC@fJl>2`DK~gH_nH%aW+jZrt?w4fSgQ1*+n|VR7{T5Ul?hIQ<)m zGXEzLWn}mPqV)e05M^Lhp_2_|VXAEen&*e$3ucehgU}!R4TSc~iVh_9zZ;zXzXtzL z68LY<_J5E-dWL@p8?E5~=P2+$@ZWzDKl=Y7en0Tvfo(QC>#h_p!5|CReQSTK&pK&cn zJs&Bo^~U8>bWPKi!^e9SK|~0d{N zVty+1%!?pOLyG-$d3WmNID5^yeslkGd8!xrx8}!v-ZF@6Td8_*&oXR7zUIgC-m%Uc z_BBBRjrmBbQ{BI1lbBE{U)r zbi(r2o$nKVKjk{8$4w;#2zguH9*hD)$aaPEcynr~*4uz?M`hCxCGopBN>B1Vh=QGK zxM20!pLHK?uEuhCt-12HKmaR{|7Gci09Ed}y4&MA&jo+}d27Sy%)CRvz;iQBF6ZA{|EHMp}?}nDqyrwN;doqhMz_%_oo=%;@arzMW{9!mI zVcj?i%ZPUK(m#2MITLMzH0;<;JOtxswl%zj2a&8vv3@@Z+J{PqFfchV2HsCN z>Ola0wHF!q0OG2_LbUVWpkV!`qdPJ5TgV^2$NTW$!bm&zSK;m$7uNr-oh5nLfkmOjsXR%szD5& zJwg7>yLYfXOfF|YxwSU?C1q$j3jeoG?zHOOb~TuVj40?Y57=XRY+sI4U4qX*52>Y< z=rF9%aI85b$8VL8>ynLCQ(BTT9d12jQ4*8ovxUP3bdR5{YgZak-dO2%k#8F^$nYB^eK*7*}K)K-h+_KK(1Ntgw8isZC93aH{K zTv$%#ORo|_tP<2~v{GQ+3D9fCgrLQ)H5d2-156j>F=JEeWi7R)L&wS*&-6O#%bM^O zYRUmcTLScAtN;jgA&dICAZs_|dlA$(i(v}3_f8J}Aj@3BKwoH%E7R)*4TF)XsSK7# z7$Oc{HcE{UYDpi_kkkDQYG|WkURkq|D3eP1t&rPcrgAptN(s+E@2$7L@-5mL{th9$ z`+%?}=?bEOWy6r26{WBuRhF`%f_4yF(d6vvl%H6|8pjDSI>Dw;J*BiWQ1?K^QvX3E zom0fZ+P_KlB%;u;D%#M%=8(F+>7JE6l;$c$vpzk2I!7fvZb>JdoH}Iok6$pDTOcY9 zsnpTj*Z@ka| zKuyN_RzjH)`+lpF6;nzRuKg~~HO6kmvz7*bp;N=t4;~gXjLOhJKW||e%@*X4dGwsbql22aU|R`h z7D8v<=UgYyWNRzqUZXPV*BA-(bs4ZJs#!-yiCXApo6B|(v+Y(0_+?lOP^QYM(~6D^ zvJRQjW@9-zDKbTpn-kZm{xY*>E{$(0vr!0HJ4TwGtgnQ@!~y>8)jx%k)EDp|vI2OoWL zFLSPQ@yf2@wr+1_z3sY^RdizgHl8yxCiDH(^rqGfjfJ@ac^_(o2=tzwzgk3V$pXnt z5t?hEacNm`ZFt#V4Fz_N$Bq9A_Pgf{tak?1g@gIdSB%9`kF9awWozAcSe4WcnZUxg z+9_qa7xNvqW^X%~Ts1pvjaJ2RBVb8HMG5YSJ3DeJ9HnfCTW^BSa$8R;t_tRt^1}`a zi~a-N8EWS`PR$~mUp(>uWc+zv_Czlz0YCJO%u-RBlCZJ+%&6nF5EWv% zrt!2sz(6`*KaQE_DB)gl*VzdfMAE{BUPB-e!W}o=IDy%5mB5qIC>>_+xn^yGz<7Kc zvV@m8`=p?{xuBGU6`S_BK%EnX7u&wHb;LU)9<_x+gN&RUjntU;;Fpqj{Cdq(K~Qy7 zMp;mF3*t0+XlcvAdn=Z75Gkiq4nYPN^OiuuR_|Z94&TCuXnIeO>U@I*g&q7yMz(p^ z%lt?L#SsAuph_X$~eusV}-$}*;QKE;C(SO3A@S3a6d0LqCyXcb4Ob91h9PTQu zOb92N9PUd0IX5=&rkR`6r<)x+){?;cD>d0i4FuP(Q|A^$(UUTfGxgI2S*8vYs*y^T zH>0!2=jgFW+Q~N{k}z*T(#g93Sh@mg(?c?Gnq8*!o!A~{Iin5+vnD#OgC|JK{3!2} zZZ5xA*XaW5LKG$-uHXK)i+*f8DAG`>`=*_lVG}TG$8cfWs2L4G?Pg#m8^CX1I zV)FaW91l9m%BMlnPW=u_P}Z0^Tp6#%I+Ub#i_UBb+q8|7eSHoC1>t~H#p}d)7t!@M z?JxU%U({4Vnj>xm)pG66=W4`w)~DbC4uUh(Q*b`Nx&< z*&PU5sk6#0Tczq4W)?RIb3~k&7a%&0NoPuk_d3f#US)t{4>f;(QE+|OTiI+Joh5dW zJx?82KB_aU>mF3VPqzC^GRgR&#u(2&x8F0@)z5I6ZxiARW*Wbgq8mik1_Lc6+hZNW zDpF&GD6}RFm8s-sRqnJQA)Dm$@qno4TGtb}|L{Sc6YvcJpEAh8^K(q(5!6w7rt9{^ zlgl!smqu{{0>goZwvh&*1!RDL>%~(J)Vy?qvQtv#J-^I1hs_A8XqaR=foM!WkeIpQ zrI!`UxKWmn+7$Z!r~OMPNRhf4+G5YLAaEyr>6wc3uBxV=sa|&~WI+Z;=7CsjmiCPo zWxnnKUY-vzF0yB4V{RmmUK{4yw(fHEpE8#M0AlSR6eR5JnaHDMJkT#GCeQUD1f_TTpQ-o}VqcxMf&}coBDPO;y@*Gg zQhGTTquZ0bHHbKAhLpj(8wii5FK_6F?Fj}U_4w+W81Yk*slCcE(1F(!JIJ#%vvab_q| zigOcbP)TF5lEG6>)~%|gx1tryQf@Kbb5Qqumao|%(+Tt3p%jzkU{ZthZF2%o{+`Z8 zHiNE;3oPX$%ZD@#+Zo8n%tjUlYo3D_NLI$FZ28Rrbm7!^1r!p}h(vYL1@56aTbh1n z;c|8GFVI0G(mnI~1a$a4{p|*aZ6#I25!Rc|;YLZ5NQI;^DzVtEz@&od{m|n|&bQHf zLgDGmzsAsCFrgV7C5qk?Pk410&6X?3EJXmbc%@)S6m9I-Z-@EG6o2^eYip4=Nc6>p z@jfmR;MqK-VY~Bj*UCVK0$;&uLp&~BIz#it!2<%R=fmgs9jn0qun=){)L?J5a{^tb z1-Qh>8&`T8TY2GYoQ zL#32&5B%2oa`{K^qQe&tA@*0S|Nr5fs3Cx8{8fdiI!LuKoe{;ucYj+kYvH+_;?Nf1g1yg2g&ok6` zpNFRw+fZp24wa8%QpZv|cw2CluOya^YWN+Py}+9MKDr4JAnPhCbPBZ0%{_UMglF*8 z5?fZG&#3FVbV6FhUc6a2xhyX+lqI-* zieCfBY%FMH*sap+^1%){Edzm!aG-pyVF)gmSg`;Y7)r(DAWm++<4tqr+1}z$Mng?{ zuWAo~WXaLiNd2uJZ6~&0myYZ$gZght3R5#r+_NtTWD8P-kn@uNMcX+CNfxcyzSL#g zRb94i+paF#wr$(C*w^X{MnUx-wHku`#{GReb)>BZNSRKsK9S58`lmU8gq1O;5iWU67!}>spc7b z@2E7T8J}Da_mQLa4{v<;Sh)S}nHESZyBS5H+~XU4F4muiv#QdlA}K+%UwBAPXCoNATObe*FuswB_7phNo-proQow zKoe5G;OAm_GjpvQ150hA@L@|?NA)IDX~kY%*~kko<^o94CsqL_g)%w7EvEAl(NTdz zi?m_VhO6Smg+8Iy7^X*LjaFBhcF-hy!=4m~)*i^f)L!MNHLA`7K0a`YN$eELh>Z@< z*2To!La6txoHH4+q>ML_2eF17T_ZTe|G zHqD=KGp?vK?Hq`52s&&Y`&HQYaj{eoel-7E-LlOX@B1YIUe zI0Jq^(d!GwX@zM`ojdB#vw{8h)CYq40q4BwLTI0${Rwewal86;6}~BHvb;D?GHU!v z@07Qcp+-%qVgbNIUYYviqPHloBvT_a$vU zpGdj@=%_DU|4PpKi%j%Ci#z{KOJiXAw^~}0+~2e`CeT^_IsiaW0JI%o(tkB5(|->7 z4-M___}o8eI{LpcZU6r@w7=qX^mKoP;=WP2zw&hdkk07;E}eaU&hU3`?r${RKTcr! zPsNS-pFup9zXNywmy{hN^S_hf{&GkD=U?g{G8_{d+ds>2g{o`TSnP;iPpa4QFhUn3 zD`<}d;P9jksW?*p00kj9L=iz$W8a~&2Ug;C?K)k`hA1P(O_{Do1NB1n)g>~@T2zyh zykSctTr^8T}UQJ5yC$U)iiS^BHGEeyOMl;ln7B{1W?^9wypWUm?fB$ zGg3sT{+Q&LWLVPNiHx@@v#7dJ8$YdR9!ZQx+u|FmK1)Zea8O=Pds7ccX__$9^jj|N zQL>?}wD$tHgUu#ia*VZ4bk{n&QY!qOJT$WIx0I~mYzJL}GsSw(-s67OdOw+T(bce; z(ETyCBgntiqZzQ(u_F6CpB|4XLtEKRQhInM$q*-vs_|L0N9o}{%2Ed!eGTkQ8(?bl zUcHyY2LB1RGuM~xmpF)(AL6{kQ?DQL^pii8)G_nNroukitR*9FpK7`{i}v#(g;kZp zUNtAD@MFz@jfpT#24bEHIMW~0h$nzb`RFXNdHfI6D>AHI#g1GbbdGzz^8^sPL-v6{ zF4#_C-!#`DG&T?HZn7JOb^Qy@Xi~S7Tw~um-TMw&f?js)x6}|#ojyBFg>y_vgZ>AI zSad?O9}WsHnS%Jkl~>yl(9QcMh0cPrZH@QbM8X2FU_xQH3g zQ(8|#juj>gGn+ONg@1|R%P9jT2^3Pr_@@snHR$l*V}SW5OHKb6uAel`H-0yfng9)u zZ}P33jk^OHRePxgF}RiZ^L&M}&VET=c{c9t+gES5uU-()bQTHx6Q=(aj?!|P>^etO z{;+XQ9i(U8EG%lowrxEHnnz{j z5~(K3wVRQep!VJH8I6;kZ=oQS5`NQ`w>y{4=Xx&i*WBQlGEYZuh*Rl)U<}Job?9tS z`GcrRcAQ97)b1@C!GU@3EQ@UbG&*CegI#ii2c5*(KNKyO94r6}sKq~X#}UW`DHH>d zFUBm>%+MlwUvL@cPQAU#m3}Hf4^MR(1^@J4{s2iK@JM_|Zzo@AfH^>HfyeP4rQ(PS zpraX*Y5_8^Tor{|w}Apm`R#|E-t{<+>Ns+EN3kDZYvJ>mtxgDQ8X4VSoz<>S2nYO1 zGEzh4q<>-aD{?AG&;s8cVg;dVC0Z9$;=#*l*cgCFbmz z{Bh<*X+v5#)nPH@$qac}x>nq}5`ERdQ7$}Qy+$0MqKske43fHWi@D-Sv8za_{V5g? zkC85)LwSpKdCqaF?Y*7a6-3$hCnYz56{gPqrS|YbazHjJq&Q+PfuZm z3DFXjlqGpqb(p${CGPcad$F9JyhTX)KVe_Sc^D@;w(&=6awSYP-QR47UaLV+utp zawJQ4O&@v=9hx}(KR$O4FCbgVO{XOHKJU*O&hW5*PP8^CEV0Y9e>N(J`Oneja5_Lb zWngi{+oEa4;AOKt$i^AVie+&Lu&%F=vy$lWxEK>=-Pf8=_XTfDd8if0DOKgpCt2t( z0rXR(9o6*}FF-Y0p5fi{nQ?9VFnO%Zd5&vHT^N*>uUg#LzR!h;?yosTy7=P0&`Vk5 z_o;6!;&?93Ovb`f##~74wMF~r5i~<5@X!L?xdx+YMsFa|qU$M}o&$(Q402y6?D}P| zrdTzavGMCG9h0fD*UZ6$Ix=Prw8caU-Hvr^t%6d{L`&g%@G-VT7;`+EqR&AV$GwP` zhmkn4#9W;0E|kDDY(RvYAtOVAqoa&6g8cznS2wc9Nhz8a>zfgLX$UEmO>eIndgs6D zEyKp1lVq_cvOn!^-JX|f$rfWi`HbTo{A2#$!?VuUHf+FYeYwk%onC>(tpFtk_`}^T5L6{I-6SFbGs2Y1U2U`St6s$v+35qZYU>ehY~j^J8C1CFU@p|0(Bih9iMDRX z-l3sujq4qy%P-md12Jn_Fqu2}{l~AQHb#C4`DMG3RA4MTmB?-acaaZeGuG@wvC_~* zBU#H%nUt9XMzl(&_CoLAktg4ao+%}V<1Z%zkXb^x@+~Jm)uw#Je7BmIwUDq?Q3SX@ zb`=vwVW50Sao*Nw!`&0}=j4)*-h^JEJbHEJJ0@}rR_y2bory<}b7`E`>;R_qr*}o(2V0SZ=yn!VL<;(I;o;mo=IV{da^fTjAsV2$oW6 zFVRk17~=U`7w33;2=aGHB%ZmnZBS+pbdTDpq!A-ZgsEC&bzbjI)j|V(3>Fa$O)ebW zr&r~m$AJwfbF~s?u9;y9(-;7|wPECPmQu`yi7oVzuGTWQkOKVWm*dXc6F@=yi#ph@ z-bAqUT$R@cU?UT8`m>EU<{m#Ct{G<1Be9)RyQIJ-?uwP^2NaR2dh*IlHoV`V0hxE* zpUQo{y%38sUi&grpq~9@m`-)&gv9%SJvrb|+VEWwO!#KC1APD=B1vZ(%+HNi@V?;D zZ(g>;GIHjDex}ak1^c2Meo&o1mHdw()l?3CDEJnzj4-RiJ)+?}qU{F1?ZguvJ4hGZ z;Hh3Xrft4*s&L`!ywGN~$+pdI)(f7=>PYrfEsRosJ!)eI~0%bYXdz<8Fl-J1v%DhGsCn%dQJ z8Lidmi05a9xXJJ~X^s{b!cM=!^0n>nGblHYgFM>QX)2^sR4{-W>{3^5a4#l9RXWed z$MZ6lu(Zh2+u7eeaFVVCWkx9{M=!RG#DTPF?VZm{)Me=i!mN#e!u($42o5Ub$)l1u zai28!SR-t69UC(|3`P#oXr=u#xwyyUNc1LAS-NSngz@CDmVX&a5}0x&_*6L&)qt@^ z69UL#4)w!^qy*4-#1MN~QC%*s5`0<>24Pxtrq%uPt+?&ZQ|Uz+QX~4<#uc@I$XAIF zn2=J{AgF@=Xd*e0NN#ruMp_{&2e>SWaYF%gF0|o!kAhv-kHwG52@kt4`faGM9*VmO z!h2J$GC@WI6M)A%wY}bAZv+A(UFujNMagPelHj~%goeKM?A^*|S(8>3%};#()W{!#=c41 zsd_)Rb9a24p1LlYGVjmu!^q&^h#o#Jc2QAK1~aM_(q@wxIS2nY^UG_5yKD3okH(30 zEb+FHEkpr@T6>lflGZI+XH{7qoT{s{tNE_5{St*dc9fcke0rO8Ahp*YP38tpBk?Jf zS<~Dw1=m+hFE5_g>sZ95wNtk5&u`SAm5yU;_?J9OnpN5aL(dGOAGTTLAJs_`VcYbU zH9ef$au;ZAF`>Aew|>uuCa)As_vO)Pjue5w6dw|Ej`dy6-y2CW%$5|TSsuXDku!bh zT997~vbs>BLL1AU7VvVaU#z*?IbU_!)E!Z4e9xU-0z;UlAaV0|of?*Ys2hSb+^f+` z^q7)CS&e5tI`MZC*FRV6)`VfBjp7MRI?>ihhUSLCuA)1)vP!UX?qyx7Ig|_q>UB&y zjLXq70yKJ~*T)F}Qe6<8bnC8v`#fefH$O1b_&BAGM*tcuo`Ho7?V1n-RQ;JauEw!XPN<&=>K(|zWRJQbLew)c7R1RV$9%yOB{v7W(!uL4iuewj38$j8)S5e`pQH< zPeULsH`%ckvg69#k4k92gumB!ivWWBke|?^|!7f^r8jkd9 z`i!n@*oPQM_Ud1VcWto{HrZcNo-dQaD(0*@Sn(`TM z&rWgmTguj9^ma1Rdb*mCtRQxWF59i=kvugzvc6T8iheHe8en2%7oI~$kJys`A@>)rixCJcN zP&%c8Y<{O@jnRr{55QfG>Nc)I={K59iOg()Q!&6|r5AVPYf)#8Xthhjj;6%eVcT(* zLf0dKtvhqGM5C}{G@LFr!d@VOcLY>TKBa?jO>+xZ=jY45cP;di~{d`^sYmUwU_2;A9DB^x#~|)!6!zLYN{T&e7xIe7E-E zKS9+WyNw+;KZrZexA>lz1)1Phoz$OBQAMJ{WmM`orVyjN>Ts!ioz&B^o$tbIebpLt zUNUNk;!RFPhtu!b>M40YF(eXxWRQA(ohkzZo?02{Jl#^D!NP*UCj)h2mJ~7co3ApwP7N6KnKv0k#C|)SyrEr!| z*j#CBLjRQp_V4Y_|Chp>(%*%*Z;0)0!rLA&$-f%(pUlMniL3n`U;BTBtNrbA|H8TY z7j^A#?$d7-?Z0_d|H;MrU)`$zJG;jE??kh|eEokF%~;r3+5cHIt5mg$S!+i4{QfV+ zv%*&qQphjdwdG4_%cq9N=htfFn}vIE#IO&hMLbDjeKJ}?9N4iv zOmoY2``zyL^5>gcOR>@Zx+uw~@P5BpkgbWxNEtIy4%L6TF_uqK{?TO(^-gS9_x>xi z{G8J@`08Rx1=VUU#YvUQh4sp0jNNk$rD4J|FMP%32q?#i{@WffUqogc@*H9Yz{zIi2DbPGp>k93@!bg~4Qzb_wPEU6XRi*0 zCtY#p3qvP>_33#XtH#{(@FB**fkn+MN|Ex{ck{{(w0q1+FA$FbOKz@@z_BWJ5jMQb z>w-g1H!cZ4$HGzA3rQwZU3uM`uxG8&1d7}kQ}^cA|Ac3ksuBp-+~6l zr7ACU6^E}4y71MUaaDe>-#&(-Paz#6RzacV@KOx}o-dM!#`Tn(8xE^BGl*(j=XAlk z=0^d``K0fFI(A0fp|hn{trpPqTj)I|`c~6R46mq=3?-{TQD$eo7SY8}GVoU{ajLMF zSdJKXqprEf*Dh~}TNXU6ltm$L_LFJz?F}$}nILz7aDiVt#73bd%Gho2GPCM>PtWkT z96$}&TE@`EGM|80d?4(KcJc$?o{x2yMOe#dn_D=J;5n~CB`&!KAN~q{h}xb!obYdO zx;|VHO{w}OOV5G6b~O)n!g=Qg_^z)#>)PQ2Z~$PhxS^c_mf^|ZHsOxO5`oe@sqIyePpMoSCBg~qm^UyikftoS zhjD9Mnq@`xsIq%GQTnacE<>HNLoB=u@4sqs@d|xvqZ4-H_Xws((iPZ4Td-=hffJ0jF7v+|pGI zp_6xtDjX3B`^Q&6rRS{CbrTR)qKgLux}ly)L+8}E`jV>u+Ss$UZ4{#r*VN_1eijm$ zjOMiica*s?QmK=(?}T|c@J=OwfG=|l{ZpPOElJBGwzA6!mXbaVxsi|-0ss_4 z!Q$xB?6q$7c(itL>iDXXd~jtL3qaQ&32(Fz?uXVd`jZh5;euSkr8;DYx{IO;UXyHC zf;MiTH67DX0)B0lIo)ug^wp3vFJgD|qnGvr><78SBH0(C6kg#hGewGJJWx|&9sZGu zdL|eIlANm(8mUy7H#|j7xu>^KY|g{sT;C^_33*N?1IuQLg2+CKr9KAW4O-QJAZ=ns zmkgHV-H*CY?&*$hc&r|0iq7WZUuzT!e->5)FAhoEEh-THU{yz``B-vYEgNx+UE_ds z@I@YO)$+e7jmz|0uZ{#)ork6|L(FIB*f*QZ;sXfR(af`?S zn;Sr@G-va1l01J+8}%Bn{mv*R)`dHc((;L8JvD2eVVZ`gwqcUJ9wbnSFxYk7Ypv+$ zp~ZbFhL0v{j+lE9V}5XzWH^wz-A6DLjoVBT>L!_>9U<%5n*1PKlC#;ftitHw2r5XY z7ad@ouvY@EE#(-K_sN!w7??EI>vf5eGkA_^MG=;NLB)!!^1yXTRi1>HpmF0>eHvM( z@22$u$tJ(7uP`Vc>YbpN^=OcevwGB8s%>)tIS|GfC(T>Hxv9GH%LgUyy?!!71O1xXCWBgYmT`*?$_9>a|nvK4M2 znt5Mv^G`LKs0XCa)^U%S)V&ZEr*So3;~*Mn_4$J@GvZ_?*nzE{WUVWys7Sq0Y7zT|Q^JgX(uISwJ5a<6HkadY0kq$mnEv zrqO3tT}{j&2@||%G_4q_vg(G#z(v+bu9`#FlNGmf7Y*f45tDvfwRr#&d~6UeSq5X# z)rI}^5<(0q?v?zzB&}Cq6ui>&BJ&CCuJ);W@awW@521R?jncPlzt$pbMr(tpEcBLZ zir9g{0k?}`4(!F~eokwGB8)${5|}@LL(&P1wE9-6cx)yM&u}N#U@|7fR$Tv_fYLo+ zCfYwk%;ZNV?zk2HK5j(2QR=35!-t$0Z*9DZW)h}HN2#}hq~I-oA)(|qj`;8{#uj?CSx>S9hW)p?lBuOCc@OwQMM@DS1rnq9C9&-YGPV$tY?y8PBGFbV8 zszVbKUEv=S6-M@aW3tpZ`&#}z#eppo&@?`I5T~XbyrW{A;wyu2*&S_*F*A8UpJg0u zN!6dwYbVAmT(D9LGsG}pfcKM9hgjo!eFtAd>-E->v3+40u%wg8NRc6s8_QOQN~zkp zhi?^=R(7MI)o-Bq7H`G7)#9q}pL6cVBP*KP7TyXR9@{ON90_jkmy#0OZsa9}^-zjs zay4xRc@ZNPu*%GkHNSSYBt;)*;$V<#98D-do|sKowASH_Yy2&}YwV-~q7g&(Vs*3M z0%ZJ>7fHu1-S-r?OF5bslx^Q9p%xL*dEf?JSgEIBJwdNeEDF0OKLPjfXlquSO_nU% z?jqC#Z8hCVY5eK(gsJG{!N$siqYL{w2!5di!lxpSI^Czn5AuFyC z2Sh-X=P{oc&uJ%fZ-4P=+Q>_Zk!E%7oNbnB&qk@ZBo(@R+@%K9w6?|0He$NGY}K@R z^yWraXI=~n6b`RvCmCc@1(i6kPL$%o(8!T@YdY%@$lf%M%#lKUf+3EFd^92VXg`8~ z$W>>sh{q6FhQ}&%ND=kii~~qQI7nsn3^`bpL#}+91r7&_RJ4(-$hEhy@@(g?DaP zg8M$CO{nlKcWCp5BB+yATL|j)Wz2z}D0jx{NSg=VAJ%rC#fg;4*}AJ_2Q@wpTK#<7Zi}6_F0ZJ#2NM6vsolxem}eGEwAisUtkff1e9M+6XRC6lVs3-zu{Q2WwEHT;jpIYbtRW|t!Ip*R zyjWh->sDL5(qaJ4=L;ADt&4>_L^ikF$6}J=Ca0`VAuVLaqURJ8;@l~+nS(s=tsJ-d zh;N#1s=%ocaIK+-v0KLer-x?Mrn>#)e1A) z=MYq_<2fxtatc7m1TFTDjJNk}6_=U&i|gricf!NoS(s4VIaW3~iu10Bh(lY>DO+km~PX`N>&^=iEX|G))t#uDaC zV%XOt@3TFpkvH=${>}$LJgOI!aCF)L*_57&6u%!Ei69^wAKX&bXkZ*Nm!!ht7Zm-> z8(a|UHCjQIh(Qx#DV(bH(#V&T1Dx$1`N+aZmyzI5#<2*}+E&csVk7%18ZtxS)2ZcF z@=xFbcDT&OA3cvX(9JHPwR?em0;nQgQ(xx2mL|NOAr`5oLl2kMWb}HQU>9OJD2}0P z!(-lNaL)^0{$|%+fnw}1kVn}F&fc|p>HZojDmC_>RuOeg>z%n|rZT7~j@&2^$DN{= zm?b<%X*E(&vUkY7GigTE6M9L7=l@scm z&){{W>uCnp3)U6VTWt;ek^#Pe5m^A<4TN61Va0n8=2@RrO|HG9Z?t3sQ_}1CM6ct9 z=n4&%nPS(kpJ4|4EcGSn!H{0Lvc@{GaML2(>EpQb74cIDnq<{Y2rIdFA&Ak`5KzU}hv{f*MZtaU-^$#ZtE z{akEy4-33G#bb`ub!Aq4hPm=9X!A)JNfYIXok&gac zD__mq!>3`%aIU*FNIC!q8MMeSj_<52lplwTUuSaO3|XR#AYf6EKB&5)l}&$Z+;3jj z=qgTCMT3kMc_!6tg*sK@LAqZ`g@4?d-zcFeBg1TQnOm_T!=d3oW`BG$Epx-4{Gq;# zv~FsK0uM0x8d`)SJk`H=0#J>tDqR_@2L0Y^aYQ*fjwm4LUKb${Ie z6cxdzr?t?M>%IxXZBEut)-qqvV!=Q91(3@ckyx=U!t@s8wX8%^9;rc0ap#qxfRii% z$M!t&z>C<{&~1Y7!;EDR{vOZV`&+!ZumBh@St;!`&#QE0(ouEhc%9Pt(3~MBvwhcE z4XGtd9MD^Uj1LXzj!F12xj8s~5n%96AB?bk2rzq2Xe?U3deoQ-t(BOgBl(usgaAi! zlgt$LKZ(bvbYw(&`OD5R=*2nIHd+ywPCm^0vYb(BjSgyer+=Hw!WbgA>Iv6vLT%<$ zfI3f>>(O9Bo6JI=XE67LcO=;xP&W6ZtsV)CFgS?!o*O$)TDC;ULrzGr-`jm2gK#;r zSi-~lu3fhz+b*NUIrbsnOe~nRJ~R!5w)rp&c8D6H?;cKXZ}DDVvGe)}u!Umvr>nVm z#aeiAMQ9c{(FV+k#l{nlmz5a6V*h&QKyn_Ff0ElyES2$tNCLF=@cbOVB0WC1xWMYv z*4}({9(aNkQ(+q50{-$h(T#i<%kfKf&U#6l1b%|~b*3d9bZ*7%tJ!4st`P*pu3p$} zPGQ^)Q-aL|x~~~mb=vYBi|nL@8~-w8x-bFqIz7#Q#QO*1y~Kmzt8QkOcc=*sg!^e)(>8-VI4XP0_fEQaf$NJVR zE-4%Jr30t$cf4!HVw*$mOGc-|o^w;%jbI2X5$k5=)}7>}jcMLcm%g_mL6n?Mu9r17 z{JA}M4Qmt3^jjr%_8K)orPpFN1qGFYZuKg5I)5Bcrd2%9foA28(>r!^1z!j0cCC?t zU%JXmi~{wj(;7~M&o#`6d`#*Be0P!@_^VPFbZ+JpzM9ksxoz>F__C5frA7*1rBz6Z zPj?*O>nZVH*3-(?hSaQT^)i5%I}t4xK%X)T03ECunGL7{jaH8ZO$fdZ*9#9U{s{i3 z?W4q!W|Z)uf!U`QIPXua?6zAPwfAG`N(_8C-nZkZ#+EC1PZtq7-jb~^P_w(p$r}2Jp^EG=RyMw$e6FV zo}`=fI!uYu^@*-p?obSl5>JuS9tO){I(Z(!THmv&$d?NmbOR*=h%ygv%zTm=+st>; zK^mR=u#2~pH?^_Cq-qq_X)>hJh6-^_T!*Hf&DahB;7$-6}Yb) zus$r|B6s_ISPEYefdT~c+4aT!`*SY;!sO;NY;8eG2m85I)PfCI!StuU_YoKBV+kn_ z^tl7PmkMU&**Fw48}!oVn6X;HCaVRB*a!jAyaGL3WsH5&2su}*g7A2CF#)Pvc`F-% zo$o?P7;rAihpsKa3KgszHxgLv%)ak=g&hE=2DUC65?F1`0HAwI9m@LVv%~47QkC_- zec%iP<!Sgf9W6s{VG$%h}G}iRjdT*7+Y&G~3tlZm@r~v>fTlr@%6+8L4;v$hJSsi=Yr(YAX%cGGmhhvxr_BSJTd3Us zmpPT0Gc*)R zz0Y)32-DVW$}3orwE%{}c+(b&PuUB}DOTAwL<8V*|KiX%AI^E|ediEFzXd6%*5wes z$=Bg~Cnj#$FhEdFzrci{3@fiSfSi?q62!+S;`j0a3JU=!U&2&nQsU<=MO>pxuP*SB zDIJufKh0gsdr;QLLpVhmNUHbcdkjZ)ZOgUO3C4h`cjmI?h>3r377T}*cknx7rw`*s z>|S7KR{?BWJ!CrzB?cg>uh{Gk5?rw!A~2#1JqWlvo7Tjf8M#;q$uwD!9vVw|13XY{ z)v@UJh;f+J0wX^OhIC7o7jwtNWb!skCIrpOQvAAm%Y69qCW!eatyPZ(nFTuOI@G2y zE^`?jg`Z-~i22+s^6JQPFQy?HTH!#C^6c#&Ry7CFYvkaSk|G1S3RIDz(|VL@-*%p# zS~&|H-Gjexx;#mfQ)(nPLv?t}4BAC_e@;S31d?@qfbpF*86@uD#ek;+=oP}lHHog< z)La7e%JK2w?tK>*&>xH%ad|!fYvJfV@1wTye84I_T(*xiV4rr->n_QIgU~t=&Dvw8 zmxMBnB4M<;zqai3kYIC2@U5#ij-Rt=b+(3@>_Nck>Td#z=cokM6arB{!)QBNBy=aZ zoZ;|rL1J#EPO1bGC&AZ3h>CgZ2fe4DCU&S<#PNBMx{*FTCw<^j%g4&LANShsUY>^x}4RVoTW3?d9+(XX^veXl7wyO~*T$W|JyKohbj{ zRRGzHq(B(d;?V-)%OML@xp7^mUpSrWtA8oTi#z(5)oN;%DuA|07qIih^o1C)EEaQ| z`iiD{ZwoQ4h#?#fLQPeEoml;sh+Rf^gJM0rJoW`r5GAGB$VH#hb_v7~lmlm5}Z)=#GBzVbR&BJuL_UP`oAqO$uC|DwqGYj}>>_k@k6=}aaM5-7;c#~TfC6{)B@G1h9R+xXRqu!}^hy`> zRRz5`n>bUgcg&)#&kzk78*aigd>f0G*1h_hmHMw59j}ciyQHAXTv>w`^_$KR0S?AydU9tJ-xD6r{r%_3`co6XJl8h7ociZ+=@*n9F)C3J>(u~7jnY$o z*OB>SUw*V&E)szPFyU}{e`U`=aCNi4?C#AyHdW^_Xq|E0 zz2?RQDl$PV@DKdQBH;)_7<^_C&$O9~toEYqdNFJp^U!SSGktm@wE9g&hi z#G$^LsbDG7dDicQ^;dIMXc3Mnx*8R*Jw51KK6cL|vid#c#(ULpklU9+jUNxsviN*a zt)-sCuv)4n-;j4NutPyvvd+4A(+9zAV7LYTAsI_YXzK~zIUlKsDckhiPKPW0HA0A} zF0S&6piM#MPEhcD4V|Ih8fq;GX0Po6#rP)}kg}ya5SIo4JdYkHOyM5R9JwB5@^QI)CVYI$RddSaxZ-?6p~r(Q zP|xSitNm|n8yAys#Vlig*-f7F8XnKKM(4?OxUl{cjHZeXY8=(A6Eb_HoJ~pfbeD0n zkHDqYdZL7)De?q3Eyp=qNkCOtmsj7yMQ&o#m*_;|U%+DySEqz5PBH6sS($P1$EaIm z?W%CvM|*LT`=x`K?FEL0zwATm^Cl?`mjrsx)DiRm)F-4vSIirbA2(gX_?DU*Ncpz#><9|(=n_^vMXC0`b-dr5H4LAhI@ zSb4^A#U*E;xZ4tC@L(Q2VPQXmlV&zZ@5kH^zvHQ1sm2dyA1POtgA?`jYl)plde}~M z+(QuVWaZxzT5wbj+A&4aJs z6!I(lZ*2M`kcom+MkL%E0ifsWJ}N?ZHxCXI)AM66^+{XEpGa4iZ0 zZyhuHodMTw6$(tzoIW%syt4OUiSE9LT5RLjvjh8=a$;V~Cy0x;5eX$(aboGfHV%%@ zom8S1(k`zDiGOnI{(7d+a;30B1TJ!qt+PfPD@CA>+?8E2i)z3pEKct8o8&r_YuD;! z%StoJyP;yfJ5GhAM?u^Sthp|el=8*?G?wdnjCp_?Q2zinwAYGryZfCepAF0qL|^ln zuI>L4X`p*|l4oXvB{<*KCg{MG%~^_4W(anZ1T51pq9J)QCf|lztS0Gb{aA zFcA(0=iMD3%IPttp5A7?H$g#f0G&BwUo0Nkj~(MT7&%ry?;PAW7*k0<5|%v9sm~0B z->`}juwYxL*MT##cVq>xly;hV(SI_jo*P~m~pNj;s>)3L#8c@3riY2mOI&c3h zN^8Z8l`Ot? znI}ed_>KK>IDmthJDmF@IX0mtavUCK={%PWW$oNqBr*k!b7WRE)5Dkm&8zoI9$F*k+X8_*lj_rUW?gv+=S+2|N2R8%&4x;YrY zGN~)t1MVjp+j=~H{)P*5IqvLo>_)Pe6!V-Ko2&goL8lpO!6WY6EPt?p5|a3}bLFf6 zJq}o`5EXr0qftsq}C8@ z0ziN0lNsVOK?8%JKt`2QDS4UD<)I3d$%UwD11VeEL!rc{9a9L)z5EgsUm!I!ycg#P zpe9x6=8|D70RZj+xRhwtN56aZyXN?W`E%IkIDEcswDPQ@QInSG0U9v14&nmh*ML00 zi?BN2n^F)~nVmXpk2`!z;d9CNIMJA9HvN0(&}D|w$WoNprj6Rww~?AqxJqZ5(F3<@ z;yj>#kKLR^>U?^>Ku=}@o$e%y(LlEW5Tdr05%$--&yCtm0IzB$L^{AiisflqfmpWr zrg*}zaxG)3csmSNLcgSirb&`=QoFHV^OpXs+6kKGloXDJUNSmyE>+K1NZ2tJF1GuIKWJsrlw`*k(4DO)R!POvC-P)J$2K=$wE89OCL^+YO+tR`^2^G2Z`p6uiGYo zmmBx01poYSZw9rhnYd4jaDLZw373kq(2Ey|w`i7o)eKShgLVSL4CZ&1>*pgzd1qRHTDaR1uy- zBcxK)8lKqgup|tL41dka!G!h|wi?kSd1W0GSm0~*j0^-B6>KHP|5Q1%eGs#hS~;g# zKVor?NVHkY1h7Vf&DkrI8{5~!$+;F=u{-l#7-~hSz|GM-(zol`SF-Emt8~+BoG>%pk_Z z9@9WSo6Kcs|6t;$8&-i+!2Ge_{6G$1y12 znF4U`oHm{YBS6|1-PAQr_)n0z2*=S8VV)2T3p{DT~uKzl{sx#Zhy-l?`q}raoFl0u7|qEDsfU1 zJClylO6GdV9qNMd+0W+(`6}zD|#_-tzI&KZx4d4POxrf61%}bsvoW!$-l^Wbr8gV-W;&YmAyjT z@Xl6LH#uPicW&wI488UQ6Z;I~1_So7=+gFqR@%692QBUY;lG<CWM>3yE1>aUQ`?$-H zOQO|{cCeq!SV<~T98a-D`{u5s2ISlq!jkzffYXFMcw-}3ii)v9&j*s+u;4>MQ&@UC zjrLqI4af;$yBmf4hPAfJZJmTO2n#LWtJj=%e(&HIy9gBb5InH=<($ufA>!SPA35?D z8re=Y5+6TPGboBZoqGnBI*~^sdbL5*g6II;-m(0+2wY1{s5au{vUe@=pS3fr=a?0} z!_9I*rCv$${4AwRb=Mcnb6p3S>2}PR>1?A+b+<8R`2KvqPb=p;b2LpiULQ^qimF$& zQSwW2L3)6;(9WXNDe1mTufTpMcDf4B{ey2cJ;fSBW&PQCBa!2WS8OEP7 zYDF-C%|YVg{M*9XjvgOPgm}=@B=Tn~X(|s`YW(I(4i-_Aji1#)BQ33Nbtu#}%E@DE zW!uwCmBDS3C;JTVZF{pW5)zPo+aV~jPE6WNYW)?LRw+62uZohvm1S%fV|zm#(ddRW zj-9dl<18mr=ghs#g>}o!Ceq;(u578aJbTN9pkxZC-(u>PL#k+(sy7Fj^r$Iy2elA8 zVIe36OjLcBdxJ_N1Il{3CRH@+Ys=}=mB+yYsB2fmSbqekC9Ce^^C5azz&_5~5SvS@ zMmeyt4?C8_c<t{qwdZ4jYl)~p4V1N~pCBf@obPc z9|&iPb|y%#BH_*djlPs zDcHgPO@%@Qc-bQlR`e;L*p2k1k&R}%76_i>RKtF?2~;c$oEXTx4$X2EbAN5^shPu4 za`C#s(%CW~OQ_2&c7xplN9*+6HvWtyKs^Sv-J^2ZUBNx@0-=Zg^ToO!E${FN=rUEd zb;9rKu(cU{0#QsZWr_8@S9>$E(T=sK09G>3)E^io69FWs2_F$Yx$WiQSGWQFN~6oR)JK3{Yp7y!ySe7|KaT&gJk>KE#F;LyKLLG zZPzZ_<}UBDZQHhOYnN>!%eL9|KizM?eLK!Q_x6|mFf!M(#>$M0nJZ$hnDNZtXm!F~ zZtu}(9Gc{_r6es)0Ym0h$S=WJ11WpvB!8}dU@MVc>e#S=eVxtwU46o72K{!D2aOyA zJ|@Dn%y&mPvhnB8VKI0j1P>f8rPa1D*H&v!xkB0V{%#;NOxFzPF8zr-8I`29djOvn zAmVE6du~yVU7i2~9dv5@SJMAL6}xWpEkEKye@fFDbq8Uq#A4M%h6wmq8JJsTxuyTZ zqaamonwqaacf_D~RXhaGxjW&ps$6cnw zpU=)7smmx6!K`LC7R;hVE%4Egf=Xv@v#^4Ss_!{<9v(FhmYNWOUUO-)?NI$ef%CIL zO|Z{q8Dpr?Qd0Oh7i2oY2ohlR!ncWQ?RNnxL8O$e&E5|1(gOCrdr)$fgx&KKE`_sC zWnS6V)sz*oGg}gQO;cqizLCDIE}qIADHeRzHTD&m=BdFMIrk|R)fK3d68Eo9Nv{eY z471zEluk*IQq!(Ly8~;}lH=&&^ldF9DzXV06ft8hmXU*i`g zU*B+Be5-4S|74Ml>3@OSikVwEn%L8eS$*e0iI^DK8k_u!sLRO8!pZnQ3Pu7J24+^4 z|FwHQFd0%EMI6m{`z*T}vrPm}(4^P{%$;Z1qbvDgiM2yPgEhpC7Xo-Jue8+F9}yK1 zkzQEn7v;~=`@#d!IlIN95*Rqr2htib_ z2(T~l-yhK4N+nO&$I1L}%%`(TY3K--_zInAlRpLYezcVOqQ>>l&a~S7xD@>XRgxRJ z^GDCC9K`n)s!7LxKo#@=ufh=w;p{jyAJp&jE+^@M5!f-N;0{(p0M{8cRp`Rr;*AC( zCX$L$I!p9Ij7wa7W%q~AwPzcqem{yYViVv~0Wn+G`SS-O)ta9AK0cm0?VCPylla^N zm>7*Nn)y;cu5T;E*TwrFh7-Zj18l>e>9uQv~Gkf0|Glzw&1L|*`I>*AQLx^qp0a;xE1xn&avUJrpmsz|#9gY`=Mann+ntK<- z79CH=s}(Le{P!2jKE1ty0bd-($F%_B&;7TfxB{^lOm3U^z%ZY*`z^h%$IpFArH@ZO z>(@wlzW3w3w4908;d4%hqnCjapgWKNe{>ocNLXmSMh?T#Ig_|?waQ4%CilrTr?Ubh zHqT~8=lMfgJFUGIQY*QQxJHNNOJ0wJrwjgAU~_PIT-j-kc(;3XRp+Uj4P-0b&r$z= zrIKlsELu8Fm+pI^)xldS)D(clK~wn|yN&90d7Iaf4edt9SMDXCU>XoX@AOI@>>k@T zm4~e((n1v?T8l>;*$ZP}%Jee9yp)kOR&89c>dNLfsee^(YaCr)rpkD5%%VsXwTi3KeX`?D(i@mR?JG2Abb8n9?(CVU zJKm@F>^a2~+7^uq>e63q2I?cIuOGsokU=+c;h4-lTsJ>vMI49b zHQc~35`%gu406|oQFsDbE~3aVO`UQn)Mb$V?~$h7#qSIC3m$7 zZU8t7VnT>{=;$)b9Lo^PmgA~%9G8S_d<2U;7QIZ8sU(nMC<-BMin9cF5wBu$BJqKw zn_}L*ggXsyoTlbmOSDClrL~QQ zE4Gvyd3~A{?OVabuft*39aHTWT9=n?y2Iv(T}NVWnWDuxQ>fvshWINIB6Y zCCR8^OQt&mv1D0<+NwV--oD1Zs=yY>Z00=LNU*RiA1#n$$HR)ltp9+~SgL!#3nmS2 zTR64Fu*NXHo|RjWn|V78ISV-kKY2UzIAwjcacAc})jdvk+&=DJV$~EsDR)e9JZMK+ zYcJ+5rk;_RiCT=BeK}^~YLb134DRTgT&p>2`B5!weqA!EbU=9vqMFm0)7jD)vJss+ z+B5RRQozJ1~_$W;;mtuv4iUhK8_ zgge~5InN0An%=><?@>EQGre0$%&0JBVxrim(pAcASX_b1ZjFi5I@*$k8^357VQIs+{HE+J3kNva?2 z4BW*mP>eoVryu?e1>OM7#1IZobek*i9Rt3cArRUwB~O&u4!LXSO)G4~H4T~(WVW!l zWB;9cIPNSacOEoLuiA0AjVsXj3@*13u`&OlUG%$i(qcOf7YL-g}-wK}AZJaj6B zpygVqPgs6oVjfXEP~`%!nmyRgutisB%WJkRLEC#l#3omC%Nx9{VQ_Wuq7_^ZeYtbc z=^aZ?3Flan`h;_$j#0e&6p{olV}4EnMG2~?`hd(}9HJ1yh{6OI`#|IPf_;opqE(U* z9P+mPpQ8!1i9xZR_VFmOLiXXAWM&eGoKoSxAUVaS#)V7_SS;vgj=LnrMoAR~=@O_} z(y7g*)#A?f!PZ+!K?0GzUI-L$h~$qy*qG_&K(4mjO(bz{*3 zuKce8@cr=va{O}`ec^ziV2JWXgv8Wz<5Nt^JE>|$&u)Xa!?e6pY3RlI0GVU$nbp>9eG!Ovo48cD0?V-H0iWO^Rs}lj;?m#{@Yk(GQ9{ z??Dd=5XR&{O9@bK#oP-zXUpTuE6Yo3lvN&@%8Sb@u*!>Vs)e1PHx*mv4BDG)3f51Z z+q*u+TxM`TlD&S3z89kw>?-%yXi>u447nOnrjyN)q)Rih1QjdN49>Eo%Q91BBmE{L zouf&YarjL)Sy0$p)JvO=FY&;gCQaEG>zyy!nCe|j+L)L;Yp*Ft4Wb6D2C@vy4w3@G z{u{Nbn6)u^Y1VyB0NWh-V>ifSuk%JX5dB2d4Y~8TZ9e;`txhESV8-d7yWLi!z9)m9 zH*9p_tk!SKKM>Xh7mWeVb98Gm9>3`?3O*ct;pParq{WXZa0~Vv{blDUxn#_a zX|kZn+~>P6bvsjbChw8DG`6f%q!v}3lyy|5GxjDQ4rk5aY6p7#10reCQddo4P%YW4 zWH^f;bFc7UZlZS|y6E8X(m>xM73J+aM%Oe-b(-XYEyZ7XTZE`!aabt`Sl-s3y0%f9S8 zt;-?ZMpDn7&4$kO5#C0Ehn?-^fL9y-Q^+Vn0NVWZ6VH!%LoU3L00v&u-pJH2pPfFQ zzz{>ziGKcD2D~X^SCW|BS)Slwdk)hbzB*h^$NvtH*BBhhM+EJ_e z)Jn39Q8+m(=tZbcHqM>0Py_`cO=%=XB3Ws4=0O@pIg&R^i!yae)rcm;t`!Qlh$_R9 z6>7Nfg5APVBOz%*rG>;mv)#&8it148-RM?wyfE_JGFP~10BC2R+BN(;bPYg89tsIl z87xV`MA4wU$)aGb+_}7q651Ak+Zh6XjmXz$hKLaTgHU8<;|T;Wydw~$trjC0A+V?x zCV2o#9kRj@wlV-#1kcJp59530BX;h)%tv?}`sDZl4$#L5ANcb#x}OmvdXEu_d`BcR zQb|N1a?m{0w}BB-=?^2_fXeq&7>4i;+XBGbAP?UI;@N$>g3(1NVnnUkv+j(5zhUGX zPr7TWXhSKhaT&%52Ya+8%L^7q#>ssp{g&hB(sD_ zZZfvk5MN4qF!oyQWj7~YRcDKnF=1ZSZe>z#j-@rB#w61kXREKWDyc8E`s#_f4n%tO zd5XI*AzxK_jOA6KTNHFs-BhMul!H|kUiibR8Ks0sB`I2gfm*V=NW&^eS|MstrdhUB z9%a$+9|LC5!&N$cHvXF4U37Kq@#^PYm~(veivOY6vv~C&zK6k5{j1Tyv|2;on@MT{ zs$s~Ap(mZzG-K6Zef6<9;KHh770)>lwgvgz7~9fpc)z5 zi;kh{rn7VRjy{{l46DLb6Xy(G)0$PY#|)6eTux)S4C2F5PSfZN-de?9{t{}~o-58H-4D+rPcj&jNHclx^h%%tA0xV%$W=Cdc5bY(6IMo)_rD z?Cp>EEAOZ5x9%&q?4wROy{^^!J+1dB_d>i1^3$?c!H@NOc901H=8;Zous7A`IWNra zq;6@wWcu}#J*@++3$4BJhl7`;*ITcv*QJ-GH@4@kJL`MvTlPGm*Dm!@M#osb;sk9; z{8=Eb16#>5M}O5nY)8)-cG&aTwjJh|iY}PEhfFSQ9scX>CpN(x)$u2#9dnb84I5VM z;^HS_T$=1`b;SXEmHdoSz+rxFel5UvAm)vJ-39z}aAOA?nuA%cbTt6&sXY;{zrRq; zjzxIorkA1bg|Z409*DB?(a%V^R7y^&zGKKOf={g7JGSytPEFj~bPa+t5KRj)O~f)7 zO)G!RoNx)(ETp{(cZpvuzB&3$&8@okY?Zm3z~5i?!n{UCgPVexf|`OKwuW8uxcG5g z)ST5E!9OiOv0t;_i$4>8DC|z}Mm}q2q8|NqLqzdG)C+~)l~N!HA7r)D@uam0&Dc$T z7E26Y&zD|GcIrKnl{G7gsH8p{{iA_jd3kj20_J;CCksvv$8+^fCEfyl(sS_!G^W5B z3u6)z_pK05DI8&}@Gt%P;|+?7aS~}SHcqiBAvQiV6Y%Sgm zjQx`SuFDsHQy=0f+)e3mD#R%$o0za~yU%T3pGj0QW^Uh}NoY2vQ6FDsSpKS&L1|i^ zW?GzqX&>}L(UT7Df*x3+DQOv2hV-6Th{p3%mJVxKsuZ#dwx$K{l0+g2 zaG^-?8(-1Pwb}3BiM_wc>DfCxVb*eyR8SCAaL{T|r<%rPMq3teb?|$l2aefwm-!9s zp~R%|B&oRBm#B<*Ll?<&#}<%#x?a{Cs9hfH;?lr(W0ORA59>Qim(uREj$|3-LU4d)}5E4ySQdPW$&=rWDy! zvQKN-w+j83(B;4o^`w_%t^G0cBb-VeoF@aGoDy($>fo|Pted1a@)aw*NQoyG5uPJ>{g2wLN~DNSGQI2=Pf{hCfr;WV1Tv4g(d7uQ+Ye6@MD#q(JCl0x z&=S1c3!%+Y^eB<;idsdpu>!h01ZE

3NPc_WnAsmtYQ3@N&GG+CS&UY19RZ!hXmu3vAgKma$xye#;D&E-O8KKGzthI0rx!$;UXu3vbxdUb0aVHt5M50f!2T0!cu`WrYS*sq|sSrp2~>T2E;Hy9MrWrl7P_56_V#QsI{_tX}3Iumf7@M41F640nw-1j`xk zaR;I6FG(+6#eTyUxhXK^%@=5gvd8fiMxXndQaha7&kEFe%|eTC1Hp)QxesC|or!|i z9-l71C-EZ13CAiUhTewEi82~;TLx81MWxuJwx?XZRv=r7^e_MW4uyUc=r5ycr z0tt5shR>o4fd}!Q-zKzw=k-5q>8 zU^Kf?Uz?ci)rt+7_qNmNDvky!+U%Rl0bG9eAH4J)lI8tQ;eb6y^EdPA4R_MNGQBQD z&bJY1D1&|?J}fyeV3_)`ChnJp8EOW90f@c7uD*OsxV_VwMdFw)d4RZLU@e5VhVvSO z+_?d&mdH2;dx(!wRyoJ`Qf|t!QFVoMTzxEPkgv=cv0MnK{zK+i0PZ!o_`4v>%E)&p z7dM3~nw-kYxyC@x`hcnZNv{C<_{7m}jjJm2H#yE$eY}zaue{nK z=tJ3BwPN4qVR`x7E!KSlLN_ULhpsJVh!-zXR*=w_r{25pyN)*6@Ssgxe~)mY+Bs%N z-(yourX#a7nUd4uirirE_-TL+DY zeohQC29_1w`{ypPB;+K#yab|{ifBDTnWB+yF+E|a@~#F)^uy4(+&S^s25oloh$U` z-5+#YYnL6eTXFzVbse#OzpNU+)$j}4-qgE|H)}LN!vjc*XiA0h6G)SBH)b#M91KYA zg!Q?^3*Orz2OV5qJlHlFx}PQPXgiSAbqwe4mlFDWP-Cx|dUbD7o7&9Uci(g)*Gca#}-Gt3_n)qcEIvr${RjO)~w`1w2AwqrSW8ngBtKo`0`_z<=XsGTR zpmZg|C=d%J3(iW#1_@mK7UJTGO^bviFtmiJ%3_Ld_Lx)|+S0moWd-|NJ_!pB@vr$L zar+#93m)txlTMTslNyX`mj&Jj3)7QNV1`@lHV_Y^46P`j9%Ge~-V&Hdi!<{tLY}lJ znZsV0M1vq%8C5Z=LZl54^F>2vp&sOel^YSFAyCT>BY#{P-iL!N8i%Wv{W=6jZCaS2 zxHw@|9F5H{EOkS4e*_ZxsI&)O@H(=hyRS^$y z##Y9WWXAr4Sd*CxFUV2m`<;I~7iecs$xfnKHU`3Esk!tkt$WLo=76eFwnPE^5w+2I z-a>r7L<5D|=orEw2bPq*l#z9i;xK{fq15`+`|KAoImvH@V-M9d2(X7=Z$=Qs#ueN0 zsB2h?^TMMcOeXpdyl)LuI@Ov}VM}HtK6L46NP2iTX!N2(Xl^)ryD(>`S}^1Wcx73w zFr_?11?0iuAgdGQb(8v0R$`2vb3Z+16*7ZC77`d}%hF~wd`=fgRGKe=Wjna;2JOeb zdjRH0Hiq?TLwAA<4g3gwfJ)*Zsw#}m@(KKq!}yx7AB%r~04f=Z@Zyc%^`CQxdu>h* zF^04iRw}c{P8lL$xwb6#*O*{J$OK|U=ad;Rk6wXGJbmqk&^aPDWl&SDP~Xjf6O~+C zZytX6p_YA2CjR_{_MjQQTFY~OfWxvMW4f!mIMrJkyJ4rly~WUpWB3~zI~*80($3TjAZ0XEsMR{dfm0IL+HbTCLTy{IS=YW#4-T0Zceiv*ATVU77c z5ogSf-f@FP{el$m?%q!AJ@f3hk}^{zo=!~!a+F2INJ7*QHibPV!U%xun>-Ls;OgZ# z;^OdY5wHKrG1(amJ zOHF2Uh{x6u=52I>cGQp%oe$}Zym|DqGYzE|t!qeyA)+fQS_2VEXG%i>#XlQ(n8uIF zW!WJq&gLZN#@gY==4AYt&72Od>ZXk&-~l$ud$5Mm+aw3%a(wsUtsVK&@4Pj7*_+Aw zO9SP`S^H=B#XlEM&j(D2;tLkiQp{ zG`DCe&m>u;~ z`febi?JZ3YtuI2P4(F}}G zITlx~{H8iZ@0kw1udS{I{%G%c^q#ZF)|a50Nxu?&lkJQ;bk95S?o+4iyLT`XUWiI? z|FgLb%*f4!cf^i9w`iplzI>zbDloFXh9=9uu;PqL?y#4!+(NAHAUAyWc-3*{nE??H z-~f`$KCMsjR9;4l5k!)B2x3OzHHI7g47b_ z0lSG*;79OBv(y679TO&a+dZ#0f3LJoQ1dqjS1`?7Slec6j`ckOLQwK^enH~%#;;(^ zVWrfk&cN5c?wBs(Si)cdhC5EvZGkhch3_8li7328GkLY@$RlVAEgIIBTdB^to~UN= z5i$-il}9yoZ=o%sioB&yUW*M-FOE6yMvbU86=147WT?=bXMNP$_r{!y~PPxNTO`I={%eM*)yD*%=W6!{sWfc3ZkfxP_V4&oP7sYWY z-xRz0c-K*?{CK%h?0p!85pH8r5 zP2F%`uSDmJKPAS%u(4qP#Tf>zDBQzQzrzj7g~?Bc@h-;o7d|;b-HxD zDyrf*+g)nPLcP9ZJo&$o;&|dz1O4@ddli&th6shIP{fO&;?;#2QH{W>TXyy z5t)fYZ{>@_127c?-4-RKhb;tXnt%6FDTY#P&2MLW^my3P8S5AGa(hgFbURFWADyp$ zT+!_fYSK_Y7}gXBIQS(;ij&(xHfsSt(h3_gsTobLst>~hdl`x%ck+Q`i9KkbFPlW_ zXiaQkzw6|IkTGF(sb$ zbOd`F8I~Ka3nA*f56ztXjp*{6y>Lv;r28nD2Y0X!{eXM!$>4!ka8&n%n%n2W7uG+`tNAtx*B%#L~N@`LTV>vL`q_pwEuPG=+Jy!1!*I9GAOd zZl0NvIb&Q!)GyZRUcJ8oGJc)-)F2$|`!j_`6!Q*{NAEfk{nKMz?J}n(P|s>pUx>RL zZqaZFXZtD7B6ZqTUd9o|W1i;m>?U~=$=klL%=^x@#)*-0!!s8UOFHDsZRi`&6B&pF z?sB8?$o4glOv_{Kfjp+t2In$qcvuC{l$KM=WY+O!2D7GJpf*b{*M`=!CHGL1u|3xw z)#rQA+=ViS$7C94SoyZTqO0}-pLr)?@_pqsJm2U+rzqLKP(RI?op9K(taS`O=-h^$ zp2nw<`HWC~nl_wZvYSsR;w!0a#%3OcXzwz>tUUQcFj**6*Mhdo+ zdMZl3?y_r5e%sHXhjSlrOc_Z@8GUK{1 z`fb!{Y+PPK=W%p zMySM37TU3tjlmvtmzcb# z?(7l+LpF_=Ls{~oc_2ly4N4c40Kuu`lS7{q^|WHGS!{(mwpkCMQIH22FDAn*0_EuS zo@s7}Pr*FB80m_Kv7h;P@B_r6F;<#+%_{O?s{Tp&{MTSAK?VFDf{{y0!n>OYfi1Ch zJMC~cPciU!M(tLN&B6lO@xZ&hjFmnddlm!FpPUM58$%!aQqkHFlf)?-`?EgaZySfr zqm&a93Az(ggb|go_=2nFXOO2tT6zF)?>3#_>I>JfWv*kvmyDH;F2`$*wF-Lk<_O%2?dNbULrk-vjBr$12uGwZzcqYV#{LH2VI80N`etf?TyK$+enac`lZDdY(&Bi-sKfAj*HDbHy7rzU}IJcaQ zV;l))ief<0D^%WwS|Hk>fAhp}2cbP=vVD7ui`Yai8>FQ!Pk6>t8oc_xQP9_vmwl4g z_7&kZM1_1i02L^s5I)ra!r!IUXE)=+MDhKtpibp6Xe-6sl0r&vA>_f9YXld<7O*`4 zKy=4UTR`&C&|6g9(iQ`IVwjHN>B7PTz#U`fNl*HM^;a2l;nD75pbgex@qEk~J-eoj zICj!0EIRN15QOmpE^d}Fy|h=$gbj*+PCXyIw5lE+*T7wgrAQj*jV62M(1>iI++%ZD zSTUo~s5>8wW#93>6&H(`Q3P4E0k^l@jIfENcGlT6kDH8}{2Rg1MtUh%opbiRmcJE?m0Wavs$UEsxTz|5dw6&b0?QWv{p`E3u6j+Z-Tx5zPCm z{;8F=dbKJUY1b2kczd)3t@}VJH1%|CbC}>-IPxc#I*^8~+d0sEi)gxFi$nZl!<5${ zmQFz??rA~DK4Tl}rOsV%E^{c0zm8UZEy^p3X86~>zzM<25hE64)Vy5ZJdfAp^eHk| zl7|-PRC?0dSJ#SXls0@+-`7RyI$~~-oDv}G&unqoFbKM zFR^jJrR<6D$wz(w4FY#aZ3*Y3>Gq1z1h_eRU`%fz)WqRVAd&Kb&q;ZYgde}E;#8Eq zyBzaz=9o_V2i;>SP>d%9D}ea#ZgLT|HQ`TS?UOJ7(^8|Z{%k9zSpG=FV0j6+cmYHC zuy;L>0Pr@y%l5x}9t%vRJfS>k`m57I35CDjPQf?&E!(5KSPX!^JWy{U`AzIe5gG|1 zmQ@v-D>2QYQ?8*XJ4q+C_h*_@dH9`+VsHMG z5+`de0vY;Le>Q_;2~~vJdZIG}NqYvDkx007dEIcRncn1mdgOMq993ym+Pv>rvAr?8 zQ0VAM#+#O%->VF0s*_aD3wWtR=hly-2V}m&u$F0=u;TV@Wo5n0I|hA#T!OadP#+P} z_aCipYanS()#BG*87%V4ef+trqep9qQTT-M!1sD@a7I1{9+TTK{eu1k;q3obN zOgJM;Ve?D40M44~X+0d~$=zM64yF!Q_h!XsVjgGoI^TzT@%L++`UzMdgtnSYe z^HiuEsH0Y!hyKimqiljUdKawwIp279wIi3WP1~(id+tS=%#yovk~i25mp^x~fNHL> z=!w^J)XdWwf`@erUhQQYU)F}bbCZW?-ac95FWzNPkx2PPbffS4MrbuO&m8=%WzrE5~(SNaL(l{8-Vv;9oIqwq_`qKQD_QU zBw}Mam47WlG%2yK#;#MyGR78rOO_^r{f&o^;t#zKrBaB-;THw`Y$CFzKP{mwGGr@^ zntR&`Q5g;TBNKWdRxa}vH&@v>JY!RxRW-8(zv(qYoXZZEg$PB6BgEm?Y21w)ch!|r zj-Z(lqcZQl7(&28BCndeNw5~jCA3g5&KIE0u4rO||C%}$^J|STe+aS5*5{Ez3j&Iu z8=I4fwUoy03d8K-?}J2;MG<@(A*(LtI>_dm0(+U_t2|XD4S8&KMoh^pxp`J-Il5AF zmBNFyN`J9#BPA`aYWEE9SQ07~ZxD)kkBB$eRiyA?$!r9KMX`Pm*yeQT<@lq=5VCSt zf+b<)T5{Kw!rsOm!Pzk_;7(OF;?YLSDq?u|KYj;$H2UA*nx6U3ABPMETZ0o{B zs(F!^wP6-AKG+{5^LSa?=)WVYAv6=RKYtxy-Dn!(gO(pO`nF90I2v9j& zzcUv`Sn(LQa}z75bCspeMgkv@+r3gmG5qz#i7U~zQmn~<->< zc&DrEZzTeb9;{i(Jzy+HZ?g_~UkPwxsJ+mwP>X)1Gm!1Q_aWDm8WfEXw>)bp0Qu7mAhmh8DMZq-O1UC6u}(N8Fm_1 z03@sC!f@U}r_A$T-YgKJ?Jm*h2RXSIsXdrnI*yj<%_r@vGn+YlyA%eejxE0QWZ-$PUGy zytFjwJgvoyQLC-pyK%zFosfDe4}^MHq?$3S%oQK720xV2*7TPRw8gQ-iAU!gpAMMW);aH_DT^0m+U=QJ6I#7Frec$pWbQ_* z`P(~9zA}@lWIkHzChdX)D%zlAJklEDwQ{fzxoc_$ZSI}Z+ya(R72$up6e7G65%{7n1fcB*O>ypL4ots@dZV2kReBQi(gOp# z3iAHhLf(5{Rwai+hxeI(wI@3->t!0z$26{mVLE;j<%84NlU(L-j4F8Ku!t#mY@Kr= zA9|^Vf%n)t=ow>?xEYU&uQjXdiDwt^0#Q{20b9s@H2EQh7371cuC4&I50*>fiv$G2 zDImKwvJ7y(zt*$_w+^fn)E=Yt?26B5+W5O{!j_+Kj z6q=Nuq5E7^ssW|}sxhWE&OxSNob0VxWfVuLQ2=tlw@vRFw&-Umi$;n0B2-W_-s4*% z!mpP9Wa0^$1%k$;W=!Q(z7{^A6vgFxH}D1Vm58ch&1ppu-Lq$hLsi~r@+Spw>yLb|#&YSvI_6)>u30&0^ z&p;i#3bGLLtmeAw`pi#M=NkFTpzGZ*qkZa!_vJ6m41PL5%x?-F=Ep{dRd||T{ zeG2b|iN|^|RHI4H+p0W<@~*-1OP0fX*7Ww(%1z2jJ=e5)@*+(jPUT&g|N87IsU22y;Ll;jQHg+AO-@);@)PY*Jl{WT|85W4oIbxkZ zhVx+9cQAFcw0K(FJ~Xbc!WbbzA#QEU;CI-2eKhK6RW}taBWLB0?zvARtM$1`wu9&Y zfKAN_9NoiA^y6g4kJxblksD|dDP5Cwf>w(}_bPCJ*&^84p$r0c|Jb#1X#XP|Iykj& zp@&2apnmHg>wntkLk0}puq6PP%%tc4_pcQ6(mGvVXeqN*+D?9Dd$9heDC(B+%J`@F z=WOwJq1BOO+F^$17u74KAJL2C7t|}HPgpDREd+H48pLn?L<5%k7WB6jPp+@9o!>3$ zC3X6yxLwjM=auu?z3^0arSx6UKX{$K{ZmMNpXK|f`1d9JCFE|zUchQ@4q5Xd`oQ6T z)E|d)e}Efk6TRu9JPrVb!3e|MG7!ZHV)*mcs(C*ooML3>yK3{$;i1P+e=A~maPOP$ zxVLL})B2CTt?GZ-*^E3!uSTr?)W4I38GuANXx@zEeZON~^^eU%3?4(AZNtL`H+hO6 zEr19&zJ-CZLl7xtj33$W%|Q@nFd~R2M#2OkTnqj<_GY7KjTjO%&~E^!{rjyy>Krt7 z-@-wIllm6)w}tdC8?g7>z~PC*2ZtX*|E-vTVL-&U_O9)ocfa**b^i|=pW~i;Nc^?( z23W^F#->ebS-Y71@FY&^e(WbNv$Wa$JfWAPBsuQ9pq^C$fAbvq#r-&0dw$dG;)qN2J-WxLa)r$gansA-PV~7)JN7w8yOrr z*d;8S*3$4~%hsLGiz4?r9FXKYqR(s#k?8R?*Q3XH6T6>aWH0NaPXkdIYNy8?8$4VY|^{*EPiH zVSXu)GJU3R$cMkTqP%!hGHHgN(}}uE#bqlRi&NfiD*iRZW&SjEjDJ?bq#t`WU?}%s z@+RHG#e^SOp)`^niV`zp%}-v4^iiFp%YNc7FCMsmD(9TKw_Eh&e6`#oHo1*rw0Q5d zz$18VDCg{D(O}gx;L>K*Gd`_K_mbxAVc^bpnbd5E(?6WDGTWX&iqiX|KXt)r>jU=rVqYx1Us(=tiOXVpFCI9K+4C zCsN)*qOyfc>OrLv7e0W^V+E)HlCK>A2Y@2LpXb#-4(cH)t}@m)vi23b^v~<K*@i zhx%5@P7!coU}8m4wW=K|fb`2p3^FuvEvE-nz$Pq9L2Po)Tf$0*Gcu)*U%^F z&gE-W6J^sCFb6f8r3m(|Xe$9uDQv$XNLu)>RlXH$e`T`5A%z#x-r zg2zte)AU4mSK9kJQZXmoBCuTzqeO$Z*YvGeT5>y_)VP{*T|kxiT54@{T}r_HpWEHC z_XBv+8!~v@8#>}j*g)MZ=D+rvPILryJs1}6)<|kD;yNXJ(qvVn@4RJu_V4-AnZJHd zb?#5F+ozv$9tv|-v`{PAPb{wEkDGghXFif2l60R?J$mmg4W!iNg2D9EJJ9JwmO$S) zB0_D&97Z>~9}OGTfi}%w2UMjlH?}c&f1{=FX_jF4b*0_7_sY~w^e=C`Z0T0;LQAMD z=y($=CP*X7P6g}^}4Lqn;oPn2>chaG> zW#er=oXr+bH=nKLbZ ze55Vi&n^t`&n<+d{bk_~TLlkl6*pkrgqV;fN2#&1cgyRlZJOCuUQuUwxOe1(&^^*p zxvnCA_BKIaHbt@R9+DaW!A4g(g+@(O5)51u^MZ<&D6^DgO`?crFE%qBO;ve#fn5HG zdc}zp0K7%4{`CRH__2nf^bKh@u`zaVv^O!ZhW$SJhpETJ^#3OZjEVXG!Pe83pR^cY zfa!jtbhLsWlyztIo3)M=?x?eZ-&v6~RkteO2ITFng<3p?$oF{ z39=Z9rX6dpUK^HQ-^ajoM>+m^3t`?F`XSYz%&~*Y)&^UO=0zwKoy+Ip@OH4cdIy5t zRDA~0pNK;czNHjHU{!1JcPNG*>==$B|Jk51|CfXIzeUtBa&pki5-`#$yZtetmov0b za%~oJsKv$!QD?WQ*)&VH?ZyVZOO3m()oO}h>ywhOFE7BH!`UP7}Xm6tdA!Z zV{=F!raJZQ3E7NAw{@2<^MRQ4y%QSejH5|e9-Fm?W{>A*z4!md+&cw{5=L8^ zW!rYuDV(xx*D2e!ZQHhO+qP}nHl}XhiN1FtdZwQ`VqWttGvd$q_gZVO4=%gtDKn41 ztjps;Maf7#7!ji3BH?|d$yaHq(5UqYI572B&_)lcr|;(^<%Rny5!RlEj7)etq))QE z%->k!jc=1KO4W*YOFPzY*0Dw!4M@dJa7$9w7m2aZ1m6+1$l-heVhLX(Or!GT*snor zuwqDQ?chAfaW@so&^lhL5@f^}sh2qxRu5f^RtEE)jQ$YXKiO8d-W`DS@{eK^f#KAi zR1V_#X?yLc3ZuxYlus(7-c1*d-0m?5WZa}Z#CS?`x7A=d#R|l2%x<&qYYk+VCxf4kkLwXHmp!W9zkqv8Zo`z;-K+T@YNi<*aU0 z^cX>At5kzM9Y*mi#9M+IqtF2leP7cp@U{zpsFer9!zkW!7o_IzlrY_z<6&LwBsFP9 z{Nxfvy<#Et&V}c%ryK9-gh61KzVa^Sfd6lHy;B@oOJ8uTxE_%j>7WK3J+kmF&azlO z=vxbaha=HxE8}kXQSdm2ek8l(bulwp6e^sjMex+F^yaqhu|pr?Wkw@X z`NiYafRQbhzq$+ZGE)$2pBQzyPmg1W>u~hjyG@Yi?&-vfy6WL0Qf)nX*l5lyFPwh; zrx<7RLD!NznFrvZl4V{LD|M#)F0(`eB}r1P{B+U|LxF)`9q1PFM?jY(GCM3ZO8Wi^ zM9K7abB{8JDUA@U)%4LRWQ-DwyL7du9(3kn-T}ID`rlBKQG5UEL|rBNU+{B(=K#PZ z!EF%@xAG80Y-CA9!*o9OB&5_(H#w1&R0fOracv^BS)l+oss;H8y^FE$l+!5z@o6a{;;LsBjRB)t@ps53mv7AdHx$-JtAex(V(S`1^&<)xk@>w-=S0{2k% zMsP4H5&3>H%2YjUDuTv=ph*r(8=smY_fZ~689EPjCRcN{i&T?3sMT{asx$MzhpU1o z2Vy>SN;_SVrKO_}tBfJ_gm`y*F3EEQH%Ue=fww`1XtfbZP;?ZFVw5^1lWT4G_L#4w z)uC&)J>bJZG2BQB2%c_7u7M?B{Mm0)vfJv!A^{Uoly#&0RZ&%til$42ltM$)(cBwt zBYy-+1h*}{zih9A-Ps3)Vpw6?wdMWx^O%#a{2y%DhS#hqw|6>xnZOIhGi~Ry#UXE< z%yG$V0DP?6IIEHdW;o(V`XXmF-i1X$7@f*!VY&|k(9}S`3Edy41uU(e^W}@&_E5wnSUK*}7IkC_1RO_gU7PADkGO_36D1O$5*?jTL{WvwNC+m**ST)=%q@45xf4p7b z0`B-Zrs9Rdt^a_mxjrAS*Xn?pPI`$(lGw2mhLKL{&i0=|x?Wtxt1gtf2_wOWu_g}k zrh8i9(=d_6&?~HJ1Bo&37~>sX&9`1^GOmgfo!T!SR@a)o)TUmRn13YW9f)IVRY$rWd}J-m22c(sxEi=`uM~R_Y&YE#X78j>x81=$mxp zI1=TFC!_RBaZ;=}>xXe#8LxZ@sa^BQwvh^k`l04`4sBjSaB!v~C@ZS7oa_tNjQ~a` zf#lcYP^YJ0$P`0+Iyx%ilGLsl>lid!I#P3EJz!Ns+ zc?K{~hoHMg!}p@Yh7E{YTpNNy7Zb1N1wr8+1jM5h8iqT)3#cy>-v{t)%#jx8tTbOk zSc)qm%g`^?l1Ol^vo8}t`^-baNau9mtxjAU;an9tSBzKcsM%q1&g3MsMGwu>5!MO&e45bY#`1O6zupBIfvd6H zeh1FWu81Jy&rS;Ro4$0d;yZV&87P*r^~^WIFsR9DgTRg-1^;Mq%nwsPcdN}dGI300X}p&uP6x{+iEMtf`dQ!Ro0eaTnP2rv_3dLCs;X=SO@ty zGY!yyTrl&TNF%Hz| zUJ9L|b+kBT-y|MmlaX(;IKxq}=lp2XA}NBM;CpFFrOHr+{}(Y$)GEx+7AhvaKSVH< zReccHN_o*b?n}U|`@V;uc#U9uI_=V~Pej3M7T@&rA8iHLMAVUWcW6Uhv_$Hos60a;f_;Urp zWlcZS4F5i~0&m%Tr5$h#ASm9XU-T)`m=*0hhNFgg({-QrJlCP=UNT2JV@ucOOK+Nu zm!-bUm87jFA2eRo>X#d3*9gQW1yB2d{t*K83^(mbGV8(}7BxuDdA&29c;OC$dr6|jp|09^uM zkweLo2hFl#{X{Inv6}6chMa_o<4@syEq!(C0Q%K6=dq|U-gm$7Q*e2$W9KAc=$?3y z;i>E&q|BO3aSW#k@{6}nk)vdu*TpGOi^S4w%ZH8M4LFeuf>b&Whr*fdkKI9VdtSD3 z;fmj+vE0$2T*PVV`+9jcwx^8KVMDhAH#2_XmfWrDp=_#UAAH4MOFNd)2{sMEN}xqt zOdl}U=s8{8Cn&7UroAVqLXl&RQ^2LHXM4iLl_H!?z^db~AxQ1Cub9X3v#1TQ{Fm?W zuJ+z~B=InL-9vd2K0iG7+dRJc0B33&5YwU|3G5cS&mB$@6Y}u)+Wkxzi?Kb=ZnqeW z8}Hz@3t2z$0U-+O9QRh}_QTvNl~0>=y>vR=6dsbA|F* z!qmqx>;px=M_?8sg{LG3y`fOq#O@N|JSw6VUMdoT672ZbitpUwerO_ahuBp`Sex4Xv0bixMj$qVd(7~IzjgVJIsB(ra{NOJVG@Hhw^oh#)SlE!sSMAJVrV_hj3rH6aPEbEo~C&{0g*7@r0 zcmHBNx9+XSI?MNabwFzMrZRrRhN*J)<(83qM{1g#a)TG7)NUO*#F+Ir&CK!LeeXRY z%kxowStXkuG(@KUXwDS;0FRn?pPl9@$e1Xh&pjdZly38kCqt6Ssj-{q&uZGAtFN~p zPJA6;;t06Izu{)a=linDdk>a-`G#Ei&&HNC^mOu#T0S)NMh{|DUD&)J?X+kWjKf`+ zf@7?}Q&=_nWhK$;uQ6mG6P8Sq-LTmSrcP9srE);AMO4)4m+Db?VcNs<2$`bqwjGS6 z{$h#?ZwAo#02~&dS+gaOx_?53=un}AZb7Nr2dT3GDt;^kagRr{N47);8SdOJ@}5#H z@_Q<4Q!p@V*;@*MMavfssz;B`UQufjbPAcn-KzMN*NX-19x}c&JT_oHvG%bR%uW)B z%N6z_!uVN%l_bm@#>2f`JgNRxhN}L3^EBeNrs$g@e;L|fR26BN_bZKxI158p;3O%e zh6F0fuw*!8z%5y&7)yN!wy)(AqC(c6zSoluHO>!8@RpUD$2*7LY9!2)4fCW@BW75T zwS}IBOB#kp`Ae@iPq|YDJSxCGgQO73`K0yO%mZLxY%6#4=_UE20^H_1NQgqK?r)TS z2idRA39K5N!AC!Kpfrf8Kn)_b#AK0KCxt~(*c(bQU?QfxAAwxnmXL`4X*641nk)c7 zi2T?E>lk;DZvu;|ohKGDm$0*iY~5;R-BlMgg8HIiD*aTvJ)k!dc;Z6sU+Tw zb4NiFB}<;+=rU7mJoY zg|##}SIYEAnk z&Kf-vTbC#vax@ek8S!bJCY8^$ph-!uY2MjP$*GvNZGUac+G>)Dc~`w|+H-O(7^^dZ zvT~m>IohsTui2%t{4|sYrep%}{at1q;a%Vz#vZHC|0=nmq)r=1G;BJAV%Q6@%&c4@ za84g7{JB76EH3P7e{6+VHwH+hfBkQorFe|Ctc|DQ!Lu*Go=jh!JcH;dI)D3o9}B7} z1(xILdv&?Rp@E(wbtx1@Ku)FPSd&Eqd(p)1$Q z|4Ij9`7b5pzjUDggoFH_*Ma`eNIy(;|6kJ2f4tlOR{Hr>epvpy^s}fUnXtiv)IC$P zOF?R_#sqkKRw&=(T%WXM-~60Ap#0A>RwQ$>lGI)qp0lC)^X2L{=851rIoiGYCk|zH z>-78m0=`B?h4u&a>vmv5XXo>)ggnao^X^H;Cch%3LJ2F()X9T%zOXvq2bpPFgKt*GH7T+Qy`j zLWC%B`X!EJxpYHRCNGRPn(V;-db^cC6>pMhh%mND__^C1A=S!|q+p!QGpqQS67N+?)V)#7*|b%*Rs(-i0~`UgQ$d2v zPVN0-xWJ8VZLk`v77qmPg{k0qApC(AN+ijk_UQgfRk*&U+fCMy(o*Khnmo=yA>?L9 z|CQb0`^36s7XB3S@U4cH;rwydxSi>8F_0sZ)(0rrS=Dd zmK4i05_d+*@7Tt`@0W1!Y5fF$qba*7HKu)h3D^lDo|eYE5&_K7?@Pc?8W5GKL+=X& ze99>wHVU3dWR*?whRFQEzW0Wbu43wqEXf7%m~H3aiOLo$UIew{hy3$fuc4IJCySEe z=<)F3^>OCfW5rXA9|MP`P^vgf?#9Q(lHwKl6eSYZ#0tm64x-NMlQxWLp~mM=r=~fC zXT{2AkfX%WC7mliY! z+Yd46sM{j|Y+@efH6d#(^Rlj=3^A6W5eZp0Lw7SB>fpM1c^gsxyPxCfG8?>}wOwoD z1_>_U>U}9?kQI!ZaIATxQaoB;N*4QvP+aLPZFFJxbpq#bIC$sbbt?5~7eyA=G4h<= z972337RQK7j!d}PFZDQ5Xsablm{92r5VG1C#PqfxzLRE{yku~{D(u5^`YZv@p=3rD zyPA%g7c2=>>_|To>dVj_rzsj!b5~e2O!Y7!hz)OmfFJKp6V_$(08mOkd9WPr#@)h| zY(^!h^Oxi3Oyvfcb%gkntSxGXB-kAURneaPyOS5TRBQ*FH*KOKDNUkj7U~v|rD6uIJ z{CvOcAjV2Lr0JP9~Z@XIl|&w$1nO={aMjZr^D~-0G^h6zB8Lx8%fNXLI$f$V| z^_g`|)*pN*;^{%H4SbtY#GEZr=(ZTsfbSy)oE}P4o=f{G&=)ifM21~{oP;-MRW| z3<;u9_OTSlPnmi(r{(y@Pyk%m2!8*V5mUsY=t?Ma<~tj2&rU5~jUB@43;kY=VT)=~ zYx;11<;@C+2(?x6;6efdU)C(+Kk}d{T{!1G?Y9%uw@<6b>)gqinisc4X8-K~Z1zra zgLUzZFkiXt;4GIIEB6C-9tsc3^*{ZS$Mw$4u;o@QS@u;#VZK#xx_ z(lliDVUvm_szgjKTTYKzioNF#Tk_1m3B#+ZNs9zFD^;he?svUCt0>$9?$N^D-UI6T z@T>lVj2ZHCPj@iT094>uH@!PDZ1~Ejr`vybylmTdHgMh7+7nS!7LM4(^qJHbdR%-H z5Ne(Zd$a&K&V<$lLVu`w%s|Zu%$xM*9alhJ$()iu+M7FZ`cK8|nEdwOgXR%e56ro| zRpM77@S>A0t0>!r#|a0GyGk_6^xaoy4w28Tiu%+Z4Fl=*{>4JHH4$NTUd+5D+REM_ zKpp4Qo1`3OxL<;ulZsO%s32S#uYND1^!) zz}E%vpKO9P1+cQRZp(T1M9&t_C5#skjnC`Of@=ULR{}#Se)z0^bshrOj0E#ma0A?3izhQ|mT4$e&?E1|cGmM2H#K%5c68f+GMN$b_(#lNJ zURp0Kuo&ngPctcn8VzYs3}%r=CGx-$e(Zw zIbgR?SJEreRbpQC?4Qvmk1Z#uTC)66a@foyBdSq7lh}$gn68ESKM8yzr<=5Y1+dM-ATF1wD1z`hk9?oZ_koDkyN@o<7iCqGxl`zZI~VwSkV^a zb}jKjdw$=z2^?=&NlEm}&V`M;gNRZ-3*XF02C2!jR zkAhCzyYpPW(ON`9cERldntlT&YZP&JZ0YSs^;i112^Knyge-9uhK~i-lj~#7Uoo}f zRp5yl1044c+;CE))&73vU9Wf zSXZ7Bj;^n9C~CnJX~b`X z@UzcYtu*Y-gTF!QB7>3EHP?L=-crvZgD zU-fTQ5w?CM=iiEwd_f*Brh3y5GwP~1l}rp@NYgTNavyJPtuGy4K!6mEjNbp%Z1NwD z@Be*O|F7BPKX{DtwEw@EP3YpR3*fCqfLE`*UT!Jb9c=2q82yy`?RCAHemGZkjG4QFzAKaN6rzEe@xBG7BRKM6Csa+v>VFRK|iYG+hd zJ;)oCk7qPbIbW>tHe6jU**{yh{jF!v(4HPAvZ>;{_TJY~K2kUOw{)B|mYlKX*`xYx z^6bv;@o`uY(Mi6Ef3imL^%M(Rxz>55*0H^L!@E=6arK@tRm?IzP9nn4{_#Xhqc@|E zBq_a*9GQ$PvZZ|#iRE&e`;XKrIcl0}Lc~ewP`xE&G8-@Mpni`efcWOvM<>(#Wbt#L zKg+D)?bx!5{GKD@2Cd|ubp!jSW&IoICF9yB$hXS`=B3NdOT+@wcaQT=$W#{RB_+6b z4pysSz=p-9@&I$Ao$!Sxr%gwmM$6}3Wk(RTg!R|Uy^SVvk7RkHbM^W!MpYOxxZ`TS z(O*&Tl!c?~p5AIf*Hs7U<2OnNKuoe2 z9Ha-rcUA**q$!O9xM9g%r4-+(}y%@%vLnPNhe*zsci~WN&MDPNCQPkg^Xm zg@%w%&tLMq^^L&6EJx|3EkKgWQ-G95^4r|E{LG_}_LF1m&c7S0HTg9$tVdL5%HXkx z?DRrorL4_0@HO+jD%ql$IS zf@to8hx|z88n87^ww073?*W$K-xw|LC`k5w79Ze*d1r(tD2Y_jc&IUWESR9_#G>$k zyQl4MywP}>(8a-1AU|A?l`&P}dxd&?X9l2B=mu}NLu_)c3fu^_?UfD|CAI6c()v%Y zYQw)Ro>5E4$#c}<>2u4=UqeJSgSB>pSbC7vL$>a7QmHT%1~2lZjpPDX!W?!Es<<6* zyF^@_GP=D{_TW8rf_D#a-sgBk zOS3F1-8N9IONUNtY#*+98>(0}OE64_A>5gbcl+=jHD1JpU_wr-C*Qdd@`=AK)Z@2F zx~IXcU{PVF;dyx#)8UX1(PyRi&2`(`oykWJmHn63?gT70=ZinaQ6?GNipvlqbHdK5KMO? z|J{Rc^Hl@-VIXq%G28+E34xb1E+_pS@m))oiJyaAZn7Y}KtO@+xNqD4Bc>ht3K)z^ zXN!jHzr#p2WjLH`;6`BD922uhP&!Bab=a(&FT^nY^vB(eXbRTDRZ@)rUT}?JO%ASM zX1Bqi=|FT0>CetUFbhxmDM}l4fYtSbjf5EzxlQR5a8@wTaX*3}Qa8lU^L*~mMkK8+ zL&I03Z1dJz}dJ9AF*Hdl!P5@AK@fhN2KJjS63I z95o;dW)P(YOA~6CHCR7WlG&b@ytsG^owU7~gD}}C9T9rOx5Wwsee2qmQQiJ)+}mSS z;A;A zy4-eArG%@ny6U|rZu&FVxW|e|lsoBu>V!$MBNLjwC~%mFAV*PYByc;MuaxmD+Kzi- zg%c7~RV3xJ zDtY9EtE|agPxvCxW_p{TcrgYOF6#{%ob!h}l^tW0P61BC%2C8NBq|>;Z{!^}3de1Q z1fEHZr|XYMIjAC%_hul9i#I4X$^;;QoJV22+Qe6K?)qXB?f&qWK0V*b5W*e7+&SJ+ zw#q%a#4zLm%FA& z5nj7sw`x0m!rO^QqUqp9OgqY}I+{%nbP_fS6y3!UGB8`&!-tQiyKk25x}&k=fbD=f zggnP|?Pm=<%czqmW!Z00X~JMMgxp*r77SGW3CS532jI6_xiT5Z0_$Xd6AlC2A| z8}zXKN?(pQK_tde-X@*+uZJtsgKUuI9S8B{L3Sok93nIN=q4`hI#c9$uoas&Lxc=Z zqSjyeID@z3K33x>!Gz-*=T8hIb9(tV2W_V6eNf#+g#n?S6sG-xRcaa$sXo(sJ_Zsj zSprRJMapA2j(9tON>&ljS^!&1$EYnP1+5Tva0>u6&;+&SZT6WHs-bL7&xZ}JU|Rge zo+|Z7I|?CYp<6C2-Cj%r^D-+6?lb@emMb4~r|00{8aNhoYBITv=>0e=Fv65PIbS0=Yd+s2M&_4Lac)vLU*N`r_|vF%IRq@q!ERYr|HINa~5 z-@VNDW<}9oAk^WS{wyB0@Wg8NN{52np4mh&g$Y=p%YJ~u(^eu(jrLF%B3aDrdXeB? zKEw|JWwB$^u6F5{RkrTUuJev$(G8;IKD2oq{0T{t*$*g_kEHpIAmZ}zKSfh=!!jHs_ z8A$$)so^7H0CK*p*<(a}cVV@M3S3}BK2p3+%^=H;FOFNWFpU$P?4N>-%7(A^h3_Gi zR$4Rze^RnN!l^qm3A@|@mxm+f&M+UHfBDlw-#nY*>+R$6c?rAOXCe&saqn(5Wb2|D zDm=?AGP#qZ&RuRsTlnSyLdX51ty`Z`BUqeE8IvN9vuCN~K@A@_;R)0yBCp(};i`sC znyMAu8>~#O&KlReBc7!U@UgWdYt;n~fJW_#(ndH2Cl*-WMk?n#Q7Udpo-25Ai((9H zg@<}%4*b7qv2!*z4P(2oh^C%WM16{J0cEPbt?W?t{Ai0K_x`1=0%6TDBAWMtAyvSY z;kLo23DYp!jI1~TLat+{@16i7&n$*H#bI7n9)6(yFTe6f)eHL9aa>uvBa6N@0_w`@ zkyT`Yl=VKirUBK_b-6bG)R;uXsRIU}KlHNjdJrCNl1mOtd5YV5q&q@==DAF^Bnql~ zsplS)pUBDStsk(6yVU_eEUQbXiPP4gK1_F9IlXO_{UZSH>d?c^PX*<4Cz-h#193~K zy>u1SO`o7U-;9rtLIc;=ZhsG}RQh$3GMvfZizT~!5n=={-+dp&*^CO|Hg%-Q4X(iB z)sPS18T+{tH4>!4s9BzLxk!F`o;3$`$uT$9Aj zUx%Tvg0}O2R=rc}9CE-lRe-YWUM&G}U!kd{K!~tH!+6Lz+FiLLvYGm^Nk*LH#Dm$= zYGA}c2b911WTuQ+Z_ptG>kN&6go4H;l2ekuBXnVLyCP~9)Mb%byF=VxXAzpTs%3bE z0gIEE1UGp4l+!Mhn>*D873!KEpB*EZ&ZxO?yh^mL_ZdVvEO9h7c-zb*c688istWF> z(bvoeigmh^nk+X1=)LTCt9Pt*hsXy8B7W(WZ&g8~x+U@fz^9L_$J75?kEHVyavQ9W6MB5mH;bG zKjlCYnB<=vd8WwdmHQslY=jUrhd90bfYttYk>Y0mDcY6T}GS!G}bt#f_rxfHd)$HBj-Gwtv}3_;Ms!IdwWkn4VAQ!J@*R9fuo+Tw`{3$U(udux*ucH!a1{JfhO$!iV#g5Jr{W0dEAlN zsNLGG;6tis#C8d#NmCID>w1wSF!ou%F$cSR=w~(xKVV#3a>yYP3|LQWggn6^o5gDL z%8vHRpkS+7{+2bx0j@u|Nu6ZWzT)#;iEEijA8CzQ;IkcutGRDUSq)Z}rgMqu8K0+p zb9wor9p``;UjVP1Yhx!MGjxrZ?@^xkrC&7Z0Q3(SXB zBm$b1B@Dh~9uqjO|9FAMGo!fxF?bx2bMD$~Q&1A$OY_qwNzF-sQ5zEr0j-R8VI^!! z2)efyOA_aG04SNxIjyjhzI`XI)%G{W0T8$nlWvJ!twU(Fcvz8M@I{#VO?z^__dYS0 z$Ix7`UMLo*ag)r-ci#@{xE|O-7n+yWGOd*7BeI$l#oFKr#)n!nqOjee!-r@e7$LZnqSL^8QcF&0?{{sfCV zAVc|itp%&B%SX+CdjtV+QPHSR5;l8fUKV?-ueo*XX%B-sbuSEPrM59%iMh6F=*Ef0 zO!b7doDDwafk?1*Uo<{g+I1U?f@w3oyyc^fKe4a>5M8S+u~baCJ$Hm@1-32w7?fHu^nr!%^AaY%ULfIUswA~ z5+K~9t+~Z-P;}45$M)c}HCS8o63c(pAJTv7qzAuST&i(F>^TaH)$Dxt^zd^3{P=or zt+GueB3V7F@)UNPr@T(-g2igb;-%!*Vd~x~b4cNJ`I2n8=Kena;Gcp2a(}vBXwmrr z{00Vx{U+BH)14j3f%&c9lL`6p8Z;sPxqB;}Gw|Pwh^@=hI~bNpWizvXO)NuPD4q$; zWVd+EY527_$BD zACgR|(G0p^l{(HKE$U4#zKx*#EXR^I2V8~>pH;#jyhOT=X9bsNMHP*Z9AvxGxC>OJ;Bk1B<&@(T_mI*kty&O1Yd*!BxUN^e{sTTbaD;d-_U7Q$ zok@H$fo_!WDdtVKLKz+2p)VULAzBnMFL+k=s3bxmH%>_^Q??x8uF@5&)tWqAc}a7jlx{S~ND7ToSb^ zahCI18Z&RiDi|)mJC|Tqn^J680yeKsuR$w2S-dcBn_D?GxwOJDfT0h@{DWE29ASQw zRxK0b6RylzQPNbgw6eaiKC!-nrFx;IqM)Mk!%7NCa2jOYZ_;nQ2lyt7FjasdP43q$ zPv2z-_gBnQ2ZsB`}jc?-)!AIFCNK?kO;l zmjLB4SvEht@Y+?fG#0si81l(gl6;XZ4jF3z(ye&JUO?BW$-HWdjgZ#@-{MDoNTf7+ zg@oTm63=g`B=+q^u{=xG=HC%k4clK|SmS_IJ{Ex7;@0Cv=7xI|zN3e7cmPUA0GAX1 z)p}~R3F!&A31`V*(y98XcysYO5{+h6mYwPtjpkBIW_*Lz$!ZL><{JNzY7AL4 z6_%gn$@#D%hY2`Uxb1OD$=bnWEMt1 zQ|R!!{k>v;oAG>Ij%xCd@Or&}`BZXz0>MP8d0;Dh?wh_leb}YKoQt_2POXTnd&Zmo z;;E6(s}R@*$Wnb(w?NwZl-2`GQX?>%(VVt_jQ43aqde%Kdqylj0k!*#A_t6819_Exr1p|(O(ew1GW5* z!_pqXHl4RL=u*SaUi(t@Vex%?z+w$uX$N2l1g$4{rvC_pH5y|vmFQpSA>U>gM_KqGU!+LN9qS#3ClOOu%bKUDI z)hi^`Zz$E5)e7x$fVUY@)+&Rmf=>4@YtV5s2K<)5c$bhXGR+kvW}p5O)@S74JdvYn zy7b{ZkR#;JElGC&f-Bg}K08+o`fYy8_Qo&VfWjJbp48N%@lp1A`( z*2e>zWi9Fgp`DYwkMBaUDQTJ5xZ-G)(Gp!5b9#Pu_2^P87g;I`4lPVp+~iP9@h`<& zDgj%J#ga3CI(~TrwjRNkM>Ze7dLuSJ#%mY7t}E|7dDQZf*;z4p0{)WaotJr3$STM= zJ83WX&U0|ehC4OSCj=D`r1Ry|?E?mfd2@7fh1CxElm&niAS8zo&Lu}#V9sSroMm>R zCWkD_WlHp`mxUV_1a%cue2OUDqt?<`@e6OK`NZ80mbise45qw=FCG7Re0DRdZt_@Z zvLmdHxHxZ@<1GbS$^%;rRF}m*=hK4lch7GCdnEM&Ezo5O?8m@>KG5Zo@(rVdBpZNV z#P<%&DJ+J`^78f>gS214ZPqEZbC(+byFMeZ#+0Hm~k9gMKqWY9@y%E@Zvq z1tN7RNz*blU9@=yb!jS7(yIKW#^B|74s{!}v?1fLQ2R7BX>3zstNbbBAT=}Pw57(N zW_c1}IVP(DjCJWc6j9D!;30WjJb9YD>7Ofm8B_SHUv#kvR?&ht2LaWDI)@mhV<=oi zYxJxfhe*%djbo0!a@vz)`t+6U1F3m z(`~HN@@567F^g6oWQC})h}JNqM=2HXTkkOGn??t1EQm2_*F}JH+|L#2`&J8p)=#8r zDcQPR9dq%!@My4n^62Kpud|rqn5<=pzCr3-re&P6f$ChOWu&sf>|CW~va$i|T(D)x zxVSp~JEh;VhaV%Qzf)MB9q*Gp1wb^Boh_ykQx+Wo=-Uxutht z<^QiyoMo+eHOo0=%j#vdi)HD$!Hi|ANmfIN50-Jy&YTt?YMt&z{X2C*CmXE39|I&+z}iDlUK0 z^bDc4!LsfZZ$@T3C?!?Ozhdc}V1I_J>9V9x#h&|Xa;xkx+rnxQudIT0kk!J^6X5=K zxv)WC+CsnylHvFj*uvC=p_r7{*VpLsDCCR&^y_FS>sD$eT=;SAgdpdaH1;(A{4fkM zVD1;eu%}dajC~`sha*D=g@xXa-4U2I2o)7PX^naMlbcspeqom9n*LE}l0ziQr+5cW zDw}wJQPM!I0XuEZuR>AMZ2G->lC(9e@haL>l$SSC7WCKAZ$COLauOAa*PoMCnCBN` zQm(*vauM4=l)|ZwDJ8U^D{?Ca(*!^(p(3i3j}JTkwB{7?#R;Y4**mswaw`jmMuVLb z{=(acDb)p;mBg3CpOVCog&a$Sd5MR_M|3OC0=$3|5|cW*WlbCnw)%VWDJ$IdJ93sN z?Vac#Ltb??ffIgq0|kSgDHBt0 zL!SneB%iv^38;mn*aR{;1kvY^rO2LBv|p4^l^D&cmPX1;xD0Yf?aIj+wcQ=mxMQ^& z=dX;ewfwbJ1EY2AXcR3DHN=t-Ct@|<jwd3(1OuR=|_i6bv>e3@uiWMsJ)~E3bFe8zF9KWYbBl|5myX zJyN97&{rbkCdJCd3@iF%_H4?;*40$3k4asSyJr&@pyVA_4Ba>Wn@7?S|BNJmNRGV8 zXm2|t5qeoV5KdT=rzjwlyObU1Gy%(?yW0}HTNZuIT$eM|mfscHZQSY4xe9svKpBUD zO1A8|bQqv?>`NSpFu(0=NZ(^C4}{Mfc;A;iZfI5f!Xe7X}DGlrbiU#RUJ_ZG`Q zibv2zw|hrILPDU{1s|G=Q^%MGm#FYu<^XnXjGCV9$c^=FZe)W&v^`I}k7@L$Rx&j+ zc$3dKeCx1Dh;1xb@Uq$Ae93gUVSm|nnEA*$@%{FJr}6=-|AE#5q`3hm!jDqQ1hcSH zo;asZP;SO_J2q>EhWH?ueW2=XKUsCt_2YcqkJ*EEg|+EtUD~I;4furU>D@VAL6JwJ z#O13}@#FXb{zR8UbU5cnZzJnC*Rra9;WqimzM{R*S?y`~G4ROxLOa?Wlom2f)Ys|{ zZ6{6SGpe62qs1$!Vhih#Yv>H`dPh*28gYc)c9%sq1a6Z7KzaezNdZ*YoG~W!m@<%K z$yurstuv-xjcT&Q^@z9Xlgj3I6)6t_!vOfI&mk*F3V*l8HGT3R z>PoE>eNo{Ft25IAnD&XX6QOgT@Coak-7{7LWU{l@1*M`$s)1R7vYTEkr4m2RL2z0% z4tHec*`qMpwblDz;(I(pbyMN(1Vwj^mv0VV zKc#IL*Rd$hf*99@vt~@yHRuBPPx{cpb~>h(U?Laj@L|D|A|o)J&*hGOCrpj(%@ zwDCKL(Jro~{K!0UO(K?OpVJIl`WW~VH~hh4)&AS%ndL^$L=hi)7RInTStstPhn$he#)LBw`?6Ag-;|k3Zhgw9w|g?cF^W654S$Gpf~OMeS=ggX-a&S=?E(6c)dhx{RRQWt#9=pB<&dT10-rmW;t&r?uI=;~$F z?DW#unQ9=4%1-{bvS*sK0z8{MN6h(a!YJR)AcoLXt<-Be=IxEqi}s6llW)h; z*yGhL@z~%zX#_Uf(#jG|CFD#NBPUbEdEYp=@wU%S+=7UCa9-QJLi%2#v8z~uTN6T%|B<@X%3xb*wNt&36XYy!*9w@5fnvVJo?RbP5q+ufZ%-#v=6E=8DQfF^z_x6BJ3zP>1BQ`La40`auq< zg17yuO5q8Az_r7WxUrCj+!fmiP>7dT|C(PQ)s@cN$be0NMpVvbfSf%DY4^(Ig&K&o z5)%#37gWVB{U;z4w`!yJuqVoO{2Vcq=0^GAk;g-VYV;|EbL9ce0h= zAq~yT8NbS@b*@;cHb*JVN@Gz$`m{n4EctntCiMsU;Yeh&ai6|RyZVnj2zK1{L|Gx( zQvL|>h*njYlvnn)aTRMF0ZDT1Thx~z3CSMqJ7Urxa|J=(`;b;nwq<0rY!pd__rczN ztqQjSBDJjB{X#|B_!Jg?y+be(jUZ!){UV97HeX|=lzSmxAU*s#BuqB3qg0^+uLk9q zhCBqzM?7?w5L2^$(r9FAa*M>Bk_qZ z>9JKxlW*xp*1u^PC#2DG?h=TNt z9*@q{is?3gk{>=4cF)VFLIeM2J3IU};qkgIkC@xqm8;mH~anpoyTlRPHYkM zD-m&GliYb)j5dn=(zfkTqS(^3{`V5}yF;i4wwJDIs%Zj|GEVS<&fM7Oo*SrJq>AGm z^GpV-(m6V0ft31OSux4pZz~jT+4L5QDz6*gW-!E>L~J6@oH2xAAI3XEn6SN&&9I-H zAX1I6MHMA?NTb=zTUQqmF!zo{*r58&YFObtk~9o+uyfj(l@2v76cF=HHbJO20haBJ zJdo{f_$ipjphKUx#`n9=*I>S#opObm;>=T+j#H%hMI;$}`|pFN$jh-9o^-VKqp=5e zv8UHyHkQ|Jxxa4=9_BVR@1-Nae2jT?9=kW!ryF43(`$T{95@*JgY&@vamX$il| z_t{W2r7Z7@V#aCO^IpX7DWFmMEqQgZ%P0AJ9c)bYl+}Fkpx41DashWSt>jd;avk;_ zplO4(ON7hULwAr*fXfdlp>g7iZ0Jn&DWZ2O<8);bVE!UkcUJ2iN1{%Z9hkGzTG#I} z$H3FNZZJ1@Nb%%^&kj= z8W1t{Z-qekB0|Yn#MmZegi0DowB=+C^WRh`P@}L-{NS2u5`Ken(1`uGkfqW`qrXuJ z_>Jl)6;KC?eUp4Qzpl}EJ@GT`kEOOJ-mkN4t~b-ZKTg~X9R{gYbeuef|H>N-u`_Orp-&QoRi>koi^oy}=bM#SlECgUpLO+m6 zMdcO4v(-3+YIqSIEp5EUWBqkcWp^Kn;LkBQ^6>NqaiE*^uAeLti<1d_%z%Yj`cB%r zOMI{`Vb(?Mm`Ni<`q)u`5e`xJ*VTU8nd;urN=0vfm)$m=Bq&NJ6C@c+YDMHWBLK-9 zG4!2Wso(tL)gq9-zTqx#^T(gTxQb=a$qBxI-d;bklQwjo*?#2$)SgCTBz^`iVa`nT zU@bNC?k}_f<{;99KDFRy$>A@TcJ|g114FII#YVJ`o4mJ^!G*)|(~bI2@GX^?o)JZGF%Y35wi1 zGt$PU(BD(BGK>8q>nJ-O38%P-j`&-XNFQwG^uVV{;VNB6Fk?}41^kv0XbSKshq z$k~uOgJLAc{f1{(wELp#D0KC;tP-euqEH+VCn#de{?=0nym z`mLG)h7a645ZiRg9ga?1XSK59viiPGHjSPd<3)*CdQ)U7)e-Rpd_KgEQt~cOL&35} zH${zFaqGsDLkHE1=56BGyWxPF%-1SVJvRQ}ROO5#V~~e562>{bMJJ~axr-kdb~YC+ zOFE`_lD``zvnF?GMD+B?`7|?Vh@V9|=QPJfUq%>=FdCxHNEk`r=N$pTKZSl>gl{3* zC@PlT*j#cfN1x!JTtQ@kqxi%wh{viM#&%g|Rdqx)T5cG*srb@1!Kw_zTXueuGiptb z!Vzy{Zp2st%)^-t-oqaDq@d)jl2e6#@tuo%RG1l535F84l&>hwMKM=q*UDHc*VN>Z zKQ=sv?c;<{8e(-4SP>kCu=fCKOGL&1e1IGC5#beu!sT z;A{B9`kZhz9eV?@=vl8NvLeCLz9qProuG1h3LqbB3kA%->rz-D<(Tk0p=I@`V&q^L z+D!|zeGU+G!J&v%eOu+L@7%gwTxL`zX7H{&GbLc!;8tPzTgN*Dc@(l-KS5KZ#S$Ox zjN=vdj#vfjuewe-Q5rAe)1h*pI)9cc^Sw>Bv}GqREu0)xk;i94dv))@YRmQA8yD2O zF#1ZZjgo`zF9fX6=MuMpy9$+6BZ|3ajNKh`H(^ZpDrz$cE5lkF^yD}ACbrY|?hzk+ zMI$T*v!hpF@}`}Y7VCtKu$7uE^%U8MbOSr^rsNBs18%3X(m2;8k#z?+>B2D9#F8e$ zFBm_E%oMdYRr5WE?#1Jem^vG-ti=K&r2JZhK@J4`v;JLiFu78aHhWZTT2YrCN!GFV zH#X^&sJCL;MX9U;kH@y$7VauE%On({7`ydt*Zb08A%#60r?ZE!^ooE7Y$^?PDjwr! zf21v^-0td(#~-(ZGuvd>4neRB;fT0?UzEXqsLZ9%!gXGrUb?Yt2Ui%&sCh(-GP;94 z^vcM2p=-NT?2wR2f9cEPEEGMczhXcN+DO`%hK!mW9aXeguJzcu8oOtD@HhM>av&b-4ofNi6KuOa*G>0Vwe1WKPe|o zpCYd!~>FrI(WEmxYx3RHR|l6fGT8ICkSux6r2QX zS)2mC?`kMt##SYvjdce9{+1!RK$9OcQ@atxeJT6x8PrG_w zaSDE%#Mco7J^qUaBS&f2tCOSW1KT6LTRBmK!iU$2a!vHC`ZJ#HRH3K7Gpfk=!*sB> z4%mR1)~4!-H_K%2yRy%5!$Nhb>U9xm=gC*wx(?TpUu;Z}{A_ge(hAnR+zu|#raDtt z#_=mU(k8PaUUG6W*m7i>v9de!d)^*_o`H1JweEeE0kN?09>(dz_?}U>KHFN+fE!%) z|80>LWgS!B6{mj5@)}XNCMibb83pKrb`JLTnzUvff3$kBylei;oxs!GSVY@cf~2@_ zDXv`pD-u8BlRC+e>k6Jl1v(i7v3At%upjPBs^NEX5T^p$nSHHO7V9FT##Z~9{YH5Z zzKfd||Ar=M>rP~KZGbWY)pAGCY!O4tkz57KX`NANQL*2H9|tD7LX!1-km<9?iZ7M& ztusYh5`guTa5MvfR_wu{5$xZznS_zwVQQ|PKyjvdGv_v^d`xM=Cg+-O47{io-7*V& zX8>70T&fuFsrxe(z-|Z7L*71!kGBH77lN;y>CUvlalePaKQ!}1?ueCqB_(@xH~wep zyWgrRDl_NYS2Jlo6|xLI(YY-jah$HW%;!MoDEI0@O@#~h-x0)nGenFzoL?Oe06`;h zU{XbkFG7UbbZv2CYP1FoTQV-0Z<#Z%puOoE!uyUfT8%=tR*WW5Vw%sGY|Mzu4e~0j zEi977?Gg6;8Gftkx0RB8?H)WS{xMC?7wVtE7kxHUt~0;VC@yNde(5BO4#B0Mv51&o z5Ob~we8w-}`OjQ6V`^C1^j}}szFUTS3(0zjyO^PQ38En+{o%>Iui|d;>?>DSp2Bz6 zoz*>27tS*LduZx*`M8{ekXF8~2+EYj0|SfO+3kGFQ-rwu_`OQEfnHY47@gyB!w5Ax zv3woB)Obk)gAP2gC6Ks^I73Sg2$Tt7iTMZon%*HLYio@oAx(XCXm{QeNl;b2j!Ml? zAFyfzQo~<95<=RmLPZ)_BT6^8Se(x^a?sS%0^8?#ZDKk8Awrs-)W!PCW!h`nVfv<% z`yaZOt1iI`JHny~&0NZ)`F4qBrKQ1LlUopzc;on%9tdWEu0dty90jXR)!?ws;dOSK z+T%zT;1`c`lfJ!)%DVH<)_ytdg?%GzPVDNr;f*^f?b@C*yO$>ehchaXt=(o>&Gn&#a z_pth|-Ba)D`SzRgcI3P1OrXZ#^97Gqdcqo|jFzm!XVfOFNp*n|8r2RS`@IZ;O-R~Y z!Ss99PCrkc4)LGE2nnzBu1ktXOpn9Hx7-F_T$~f=TVKq=5#{YJI~i;~10CGlk&{KI zZem@s@0-pPq{br_nQb(TfD55X$@-nk_=IKB<7aZRT(ZQfmDP(Ah8nk$wy*cM-%Vf> za$ad?zP;Ea``|9S~)234&?nopOiRAM6LScyi=fp)lTH)Th zjIZqRTs%pk+FZf!Emfh6$3aI0M!s63kk;-w)_wmIUWYB?N#W?#(A7<${wTL-gf7jHS$Q98dj}Q;f zdNkk08*EeZV)$B#lX+4jfglWtr&lWmyF89M3;etFQ5l>?B9{;rRfAXfFag~sd8d_! zyAic#li!Kgq0n+<n@Dl4!uE(~B`*{s(2%sA7FTxn<-=TFgfM z0nO)_*hRkDC+@+ZuzSCA*G;;jK8 zFKVf7o#2t>sIJYUUNQEY;E5wCwy}pO)Cz$5g4TUK=M~`Q&sTigY9H!6F zmnC~rG+5(t;O;B0caGKxiy=?>dYzA+N;Iw|YY}o7hXf6`k#mLy=fWl0C7Ev;68pwl z%Fme64Kpibkar5j*zB(R^{j<^rPonV>A!F!7j$US`=iPBkWFeF_cAY;pmVc6|QB zacmhYVe_S6Q-3Wt%dvEN8chIl0M8uw%Dg+@|6Y%D=zby=b^5jPecDxIm_AaC4)uWT z;IjB~*Nj+1cr=A%@^!(t5j+@ELk|r=v-Uh zcO1J(QnVzZQWrHBAw<;}Mr|NoCCSGUS_VIb zH=|G`TIAY;-ZXA)^j|d5V^N>oFXtjfnQ*5X^U^re|5^?=q={PGoSBK9s%_ zzCpZEo2j|4aIhngC(u9ET&WHvEJcbJ%ols9~TXK86@*JVLzRzotJmk)NvHPm|yu?Vo00 zP$7Yt7-l?beDJ@fKQ)b?YVc3gv0BAvrPt~0+z#}q|6EmWh;4^;^G=Y=Ez^Uq6~oaIe1Kt4boNd)Gfmo$38 zbVyhPp15b1Z+DEhuQz#}1EiPwolI`RspKie*gKFrqI51@_|eZt=7^3A-TlH8%n{Cs z`130rB|XSEPu*0-6!l-zf7E`es6Wkrw*S%eGY&M)#V`d;NBGa_Pfg^f>i5&k`$zld zeZ_fZd1j`V>A}T8|DImE!)Bvq2bb)bxoWs#{xkVW|B(ct^+E;y#4gA!(B8j=D_|qP zDPSXj1^^BGPxzwpLk0dsF37BZsK{at+4M;0v(EmP{QkGsHOWb%$K0CiL)UNQZV6^@ z|59$DOO&uan8AJbKX-ycI$Q{?@nTv(hYGPx8ltZ+X^+>hX6Zn?kL&aynT?HkyhaLT z_cG~@DpD-}q(;le=#1(G>eP)$3JNU80GN4vZrk7az0CYcv8Qlwt9nJic^J$PI;|pq z%qqm+!Cc2INTXCc_dwdoe@O->@vkDx@Dg{9=7$9bBQABv4 z3iyC!?Vz)b$<%>v=z2X6I_UzQPj){sTy=qNB6dG1Tz!DH@dBPfZk_u)06S0mJYYLb z`re6n5-wF;>SanH7j;U##(86Xe*8Y^u=Y37WAsn50|C7F-n77_2NBNG{^lhhp$e#ttBMW?T5cYxSB61WkZR%1qMQr(nJVg0& z(YrcO&)^AS3_%o}5=(I3icW4(=|ACThu&|f*9p5f#Loe=XPA5GM~^^m20jBaZVe9X z#{iTkc*E$vmLrk8rO<7-Lv?V8W!qZLJ%$>Yvs#&7=Mw34X{8dji?^2e7t$lC#GT4x zOss)v+~qQ{E(J%?ef4+ihi~8exf-6>-x9X&h!4~hGzpPAN(P8bHhK#^uRx5lMIT&lP5u_5BcE2~ zexD*pX`(Pw;_Ssc$!wn=r>=Pd5?`;GY5w~yQDF-iZTUMi^N=F3e3-|ahq8gMZlj|8 z*f04xbCcnXyvNUG#dMl8sL2f3bp2_vyuVTkf*^HHq?xX~59IVg^e2sv*WI*o(x_17 zCo%%U`iA|2zXICcM}Gg++!KIhc}9FQ-P3@{dUFL z#-)R`G{X})M8~blrm#D&jCS>Qk75PGZxz4#$_(Qjw7G3%M9X&(Wi|)u~WezLLuuw*=eaSUS z>WNWuSe%;S&ozo94P2Zt$}QW>hZrt-a&GEhuxDbv5et~X((U3fvP5R@a& zE~L{aNVu%o zR@rh_f@Q(5cuAevg(tm==~wMQ+yXl8C-6fgY=Fj7V#55wpWtlN7ut7RTA<-zmk zp~FL!&n1Q7tPS>-FGewcwp|n!S0KU(|M|K<94(&q*4Cedc_6s=bh|UN@Nx9n8^Y=| z7j~W(_I>rAKN3d$jM=@mgPBhCCC{+X3ZY>faa=PG^Gq^yF8y<M_ANDEX_oWFw0;k6O>9~Klna#hsV6sRf=i0i{lDhV>SfFPIhs}tR~}& zWpamq&Z2u>VictC<EHUuCvxjiO$aM)Kb$Yh);ENi$7l<2S)91Y1#_1Gsy6gh&X@|$)&Leqz_M;3S z8q(DTX0UDPrAQf9$XR*T>%t3|IinexA4{-w9~<>ubayybzj&P=K&5VuB-bRPaSq%b@t18Y z^NZz9?6lW&r}F!ISq0^)^EV42o_rOrngPsLA6)%+ptFiMSo2S<^eDKw%V&lY+=Sj~ zZ4lPV+G=haD5^B#__dlf^7}7A9v3+ih>W9jYzHd;;FZc~6WzJ#= z?5YfZS)vY_0;AvrY!$Lk)OqS+SU3b$?uUa*=~79dyKq1G*Wu;oP><#Ca$`8v=w>AW z)zP`K)%LzSX5YM^hx7(%6WR)WUWCv&4C1Qh*2fKJD8xbUd{nfuI6NKUtiy3P&cSpd zqZQQ!CoA;?IbM0@wRtaewuxvn*;dLXPZ`p?E6L9J`UVR{f8t!+_IIh8Y{n|$nq#2} zaki;1A*z6T=O6)cMGU{1Cfb81-DTDOLr`zfk2@eMOE zU%V(teze94yktrqr7(MFgaJw64yMIj2JR1K2~T5A;)Ca$%|%12QKGxe3Y9A~@Mogx zvLI?SrSUH6p65&XE=Rv0F3A2ci;j(VpeDN~DSvkAe(*aFJY11*X1R3*|NTsAB$0Ns zVRUa@J2d?17voS;W~AXspk{FhEuGTw<=!TsGzbKCc?)|Y-!I%Y zSG+_-)}x$e3LfuT>TQk<;p`BVPp-%y!KM#TB6AgE*4=7X^p^15A?&bjPIp~={O9cA zO`J@~YEO5EhBY7tAmGb&U@L_dU_+*i9)r(i7S%*Z1(l9Gf$tt_V!_7OD2kw}N>tBV z`-(lrgBDx?-kJ2}L-~^q^+wb{`r9G-k;VvT*eJ)| zRwsbPgxAI@O5Eeeh?&0dJbzaf&=DQ>&XF>@2-w%J9Y}ebRHw|?J&JPo7VbcTI5;Yo zy0dY$M~S@I1W|z^&RnD3yLsgg^X75o1G^LwPH>DO*44g$@q-F% zEi~Lw%~UA@7iB;FihJOGQrrZ0YFcz7kLVAUOT>r$?ZV2D*;B(7@DzW1@L44KF{>+) z#j~zEK0Fh*B50X8*(kh4_|D`GqIXAdtn=5fgk0=3>k66fm%I;Ms!W7v`|ND@XD>7x5x?304H73f!{! z=7{%L9oYd$N(-#s81-af?vtnKba9oRKU)uw zw3%!3=XH5BVGG11)v%bd7U^sC=8Y9l$cqARjY}vhBlKS5m&3d9@&nVjYUimozq7J( zGvy%U(-6M~%zwp){gbBS-YNa3@Uqhv<}{O<~)S6nsg zp$dz&&;4|-)?kPoo0AGMBQVblc^}_nd*Ujgag+_UEI@x?G!`#`eUIWfAw%d+zxT*z z-416ZUwq$Qyu<`QGdT)Xw?FioicKaP&z)93M~EhBifUZ8;l=)17NL`9%}?BL0Sj-= z1`}5bGTbmAsHfa*g)|`$b|>vIbBjK&!=@bv;qPSQV?$C`1j=|7C8N6&PFM#stDfee z!xROPp|8Ma#Je&LO=7=o9x_X5DG}y1P@^E=go@4F9j*p*=9Ogt0)}L}{i6P3;(e%R zJ=X#axAP2B+Epgth7v9&JAv$WRkjv8IpDD3<|9O%tDP8J^!xcE4G=^72E@<}I33dn z5z1O=9mPqd{YHR#P<=aM+)+q#KzN!9r76n?Rm&HM4OpNI%X^J7&rnxRshYsKALC>r zQA5seo65ML%_6RChoE0ynL`D(!u{r#!bJ2a;r1a)H|XSd^sr(H|5Jn=CK8#cwya*1 zNH3)do1go@!5ZMttR@Pp{>s*!bV?0 zK!9+KZj%gRI&B|Mocb4stqlY7&#?r6}-oy$KhSO)zr)e{Sd#` zCOyE8m5kijTl}WO;(i|+eIImcxF4|ox$Wu^5T%2s;({|PGzbS3bD*4kSk!8)GsoHv zL8v+SCGzbd4$C1+5$v&MX-E@t7`r2g$zua`7mauW-Ud%h{~AzH+Ce?p8yCqBB;d0+v=OG6{}JZ_Q^z$%9kEa}N(tJKWS& zhpU$aN0J5e9X=7^Qwn}=A|N)jZnkz;_4>Y_mZ_bAX!_=WRI|%M72-tRj)9q(u@H=U zU>Bo$q)LI2TC@~M!J^ON5)>qjY9&Ta(1HV%V!Tdk{Ni5Ytiz_kIyv?689C%e>zFFT zVnUDj=Ct~tp@LK<`MzHAt}(|3gT^MeoI&FK;Y3=4?RiGr5R-2nLuXY`(+Nx>ZG8Zp%i71p)@Q*TmHs?(LXJU({0tCN6 z=iB(Blync?fD!THtLTw111$s31gwQY?d(8lLoPT7We$j&aI>Y#K5}HP0!5XE`xz@} zYH1ilQVL}3(UYx2I6iKiP=vpVoGTN6#&#U5myMvm zFhq>$h;W4nU;+lf!!aJ}MMX5>I>ixm*xVy3p zUyQU4rN(T@H08@9-HHM({79$FkL5QAWDal!Yr1T5h=aY9goTNoY(-!EZoJSd9s2VqU? zRLhIcRX*m~q!Hn?{HVfa%gV7DlL*meGHaJvJ0Z=*#4kA5Y70P0svq#Fq3a}yc z8X%=iUB>NjWjKsXRhnxnokrI6=rEl?6$1iY2R(n?b+gR|3Ksv%ifq%x-_BFd-&)Oi z1NuyfO6GpiU+O(DcQ}S)OCY?^s&upWng*~*(%oC6msO&gV7xX>%%pb9Ab2W)ZZnc1 zEQeS2Sz%*KQ=E8l?j|0(OngA-+?YKkxzuFLEY_wuGX7c<;$~oOTZH@`J#p%vQ@XZL zAj5CJEC+N1c0I+QnwAEif}y2+;B_$^+jng{AjTo9dW6nbBLpBNS07b`PqvURm*QZ& z$qz7C<>iK*k6ey@9-gftKb_}FMf6^66SuGr3LjQwk%H4~NPJod7KTa?v5u`ki>tmS z6og`r+8#SPX>0G{*O@(fB91E{0C6^ZZw&bmPuWCT&VZYuryQ8`L~gI$R2{F9N}9)G zHg{HLNbS05qUT|zpQFbx#`mOO2_bEL9HmhoVQW;NwRWCrU0@Q#kk!43)7pOKX$&f{ z>;U0$zjv-_1ypCGU}o0A-vR8+pIP~;T+pr;j4LUbh zF2UcA+3XeN>@sh5LKbj)86D}8R)#99AU0P(Nl6qMHj36r1 zYV+aJytG@pX@$AdS_>8_;R?41WeVGhE+L+iS-WDCl9{u%`NnEZvQg3Gje~)~M|SQ! zlT3q=yvw+F4JPL0ta!%U>uEgTUEUPn@a?#?05;PA!osdOe+7*Rv5%2B3|-cj3uSDH zw?7Bihzp3Z5i{S_?~g@xkUY{>j?a^n94(Pd`(pM=4GLC5^R+Z400 zu>B{WpH5Y6n}b#qujhY2bSqKf7EKU-of0cLLQVdeZ8wdulwS=qiPsh#AD%Y6zww}R zqZ60UXKK)VFe9xO+KzFU;dtJ1w|g=nnVy;9)$;ZsfwZ&xdws4zJ-vJ(AXfL)7%RNp z^hdeZ=BXzNQF`g92=O9hsD5ghk0!j+T*6h~t3&Ph$xq>f{~$m)4hiW^mOPJPle)rW)fag-Xb5hLAaj#qQJ14%O5i?UIV|47K? z&P5M3qyycy`mvSjLe}y4Gamg~Of>)_xo;zgZCs7ksjVsz$fi>1u*mzhHx%H~pSEe{ z;Eo2g0kEp~#vxe(&N21x1>>vy03mJRYpdU+JAy_T(H4%iO$hSIvF$1!(+rwvDc6&d z4PLe^ZLCfeTVc21_A6AJ?MWYZ1zxXX%a|GjRwWV}fH)tg+v15J?wT!$Z&hN1#Z?;J z*Z_c^c-ggk8q|2K*Qe_^+KNM4bD}I`|l`lEQz$$ zIV6Bp6^R7sP(plI9xnk0t!NG42m02B@@Uej)`XFm`zQ+)TJr=_`>~yLLl&$97uL!- zdUfd7W@3Z+JDb?UfcpXCU46%pCt&!ti(;F&3n?Lhx9x!Of`Lykn$-I>%@>bt@y(~k zpg+8nq)L&J%wENbuYDaLtv~+KM$I2`gACmJgVce`0H84fx!1LPdj26z1it23#$LOX zY%Z5VdRn#iT~5)46yi*2-vhQ5-3uO6DoahJbdeDr93;6`?5mb2wO5CVtgqgmqt}BY zEkI3ZJA>(2A=6Vj7M{o>MF25jGZ!E}$TX^^ylxs82!u%r;e$>jYbPoMeC!GF!T-qk zoc>D3KGO3p;A$M%e7w5>fwMz0)_*IY|%D7>f{vx*bjDdU%Dtr#kUa&c$wuYLu-@SQa@%) z;XK~NR4hV$!1mqh5330*REhAnj{|z>g&}@!-(BENe}t&eyL1_D^sii1F(^C7{Jx-L zDH--=g|_sVwYGQX5!SO3mjJ!r50!T;(R@C|kI_8C@t3M&Z*@{8d4_14hH4LA=vznN z?!(O!=?tEp;)TGlicz+_vMAXqcy+1lak7Sy(Pj4Iv3hVSzls~wRJkL1W>nvRzFBq8 z`d*I9_XczI8B9MmRFWm}W*+b0o|HY7*4(Rp1>Qq2?4Dd1_c|bt6HjtLzu1}7E{TFD zZdYmC`QH=glvKbgFlA{a&EDigT^^V*IBi=B73o7Vm0C%nICn8NT1{?P9Gh@OdK_Ed z^x5Y`9vgzA6>X?4mt_lf8*y#i(?=AiT?jhVLyeKL@8Q>$C*!f7;7LPvE;#B>tuG9o z1-Wg9AyUAoX@q*gqgD$=jMCt@V_=}0V7O@4<8-Yng&JoJ|pY1%9}YE<+V09Yk9 zM-SWAp=>DRX9%`edThJ8OlUD9?< zy<*KCV@A~P7>JbEQtyB(jX|Vn>O?f#RE97y14a9fnN~c+yr$t zuqGF_awI|3Fb0LT;PgVp%&m0z`zniqL3nTB@7-wz`T>faZv~ZY#?b) z2rV5{88uf`QOhY0j6-&*MLuw-U_@$TiK3XIR|DUmjIe-QINrbTf*T0ylBApilX zV%4y(Uo!fHsiMssmU6d5)%>t=@VmFwDc!dpCX{~Gj?UN=8AT{M?qlHV`nIJ&HNhKt zeO(KgxTy(5L_@o&-d!V~A2)1{SFSEZEyaqecX~yGxnY_{d)t%l%wBg=;*N7n82u0^ zf8-|ZZk>F1qQNljOJLnSnKkU&!JBQSeD>P~z9y$d1KX+11B1Jy=+v3dPz)jgJ_}m@ z;C{WG;}>*xD`7qe!I`)Pfs_BTkfE7&JgAHsleE-QL!KH|t`u%_5xg-7e1qNui>sCS zSZ$g57*{F#j$AR%p1L@qQq6{%(Y+lSfU+uAYG~BW1MHUu=_}In)CYn&P;NHW&$FOx zgv*jey@=Gr5f~$yCG_8KPFFZ;qCMEY%?ML?m06P!qCXAOJ9S?X%V8gxfeW5VYcw|@ zIzqkw%$%)A)yEsw8mutVX(6iM?RZg!P0687+gw zj`1+-a5X%)FyImfOnIk!5a%zO=FU+jcXIuT8cK}Db~XfeG%@8-3vT8{(~KsDshq3i z(h^1xAfEcgi5+ZiIze@Tl+KPR7e_21sf@e~gX175#d^E>7rYIkpb@(bj$mrxQg-xx za4~4|Ikf3qjNZ}x)c=9iV9Fk^_V|Z9nbIrOncdX1H|*|D$0;JDdBsXuk|)T0fn%%? z1eE8hC*X&XTFZUhmGj`NS0FMbWO()xf&5tY0L%CgSeG<%d%L4jewTu=Px;U!sdqN~= z|Gcc>PGiu`jwz&Mp_#hOa&u#jwIGWa6W}=qGrU?D_;qK0dQI@)ml%xVDB8bQfQJ%~ zb-6&&E&BCL@-gvSzZfWV-J*Agp{_P>gS*kbK2Tx_VB)H`kLP$D$HbG*jKNvU3$ljH zpYTgRf@)!~OJLp#ZGOb<-aRsa-LoWH z8mydZK~_;q(0*j41BLjk8ytT()H z4U6{UkO9z$>C5^KZ2AqwT2*Vb47OR_%GwI`+7YTvU>Yi++uXbjUj*26BROsq0h@6k zoyAC)DV`)+*3yqx6Qay*e>@LHWJGQSuYqLe&}&|$0Jatd-ov;`#|j!p$y)io2Wa-L z!nPWiXE0nL<1K6?QXxHqBn?Y_4zeQQ54kdFwN=>{t#>XH>3o=tLeEO4%3gj$!=^gJ zy&6jQvyjaOKI732?SK9}zsqOlSohRcEMPqpPv ze_4iyk!|G zfWK4$fjUo0a7x!Tapvnua(im>@apRdU;02)wX^0O+sc@#t)6=A{;IZEp)p*|?Nl5% zg|q#1r?plp@xlYy%_~RK*k%SR4&3rw4(h} zXJ!i>P)G5b$l`N1QCea^I}cAVQJQO9m#rN;peb~U7U{FLBi=e{TPQ^geOl_mT^Xpz zXaX7zUkmFx2w15Q)4Bd05Kr`Q!~MYPV|Zp7d=z`e<-(owJeQ&*kR(eye>zSwhvoFh zSs8K*afsVEBNs-=`3dk-nI(jDD}u$kw$i zA5D~xE&3M12D!Q%#xA<5%xYye@2P@~C!jGX^haCB9K_T~d`Nrt(S^ALMK1XNW zi0Y9?&kqJvESO$)^o60ndeL?L@Kyx`oO5Kf2Y=za+KYE?R3DbG(&2(=KjFvF)*FJQ zndktysuXlZ6^8fijV4Vs%K9)wky1J8`^Loyp^`lJ+cmpLiIc;wg;h_yduN%u&Ldod~jDV6%*zw>g18%NByx?Hm zqcSt-%EaRyBNM^ZEAsfAa-cUTC(rkF0H{6p*(Sa%Rj-j!u`3q}RmCK<%d)Z?A0@uLc*;sVORp9m8qp4k^B zf;VoasPo)>&F+UheZMNPH5f}daon#{u@m+k?~9qv(iXLw<>bNqFW%lMNVI0{(k*MP zvTfV8ZQHhO+qP}nw(Y7_wsqF`|L2_8-LZRj^i5yP$e4LCk&zLZk>h>Fa6zr;z?%M{ zT!G)azDoh)EayRfiyUxqTolB&XgslPQ=@0pP_;o)i8D*p>x`=%aS;Vdw?gfruyP$T zpGjhCi3B^AS3#$q@K?cwo>!_-5J^;jYK&1ot{bn~ZkDz5-z?RNqQ&VKTBP)>vV9dh)4?;cU0| zix0eLzS-CHAhRL_)C=FS^YIB+!(;cO*YCwdS;~&qPzCdEit>sUU-*ebX92s%7s7TZ%-GqY9im8h4-(U~lI!?9Yz6EbKp!^~j4 zcX50=b_+l?w#qwHP3X^sK?d*o=^$D{)f!;sRRP-VKM8j#*jbx63Ylh~zo`F#{1>?0IwjHJM<_Xxt0e-C1B22^d(Kpv5?xmV{yT$ZRI8h*V}M zv~DJ8!J<;wd>0z|wO$d$iau)8wWm~=E1s+VNEn4WJ@zc#Bd8pbnGX7D{ZYklX7Vy( z6+{n-6QrT1ni#ZZRuJd2QXhxKqED8kVjeb)0&|uh9J*!(93Rh!8Z>EzAFuDs4%!GK zJYw%kKZq48lBoyJguy{2O_3oL1kfGu(N``ly(nKQ<&<#<=uh^#tuuBrmp3|A|K`RK z?M_4zzDssQwRbmfo5EZBr_dG?A}@3()w7hMx3&f&#b5!RlrlyTg7zGOHsX)(tQd87 z2x^pU=p*8V@9bmYpI-F?)-%UJ^6CidIi?k*uVmbY^7=z zT0w0s(g>Pe! z2o)x0nSi;vn(siw%e(aRMYofuzw6WWrTYUEG_j4PWd6DtMU&48c@q{3GDnsQa>jIu zz(v0B-)_pLe}=|VO60c1TonC6Bvrl+rG9-|o%fQaShKKO&KAKwYLTX?M-l|)# zbf}<+gLme+g$R|j%DyC?gVhz+ZTT2QD3_wL_ib-sg$8n+5Od)|F-ZjyspNbloHju1>!b$@rBo_d3m|Gf9;Yhp={mv0U1r-ZRI!t!f#DKTdAs0`F*ze>c$ig`{Nn(}gl1##z5 zs~ko_%g0JVBemQnQHj71Uj4Y`UA{fmCTcWKObOOm?Oe6(hZ^JfO+feo5@??-Z1w!w8cGM+ar1^_{7+1cS#>2 zs(9fFF)=npHT+)vQjCN6c1@;Fl4g(}H)Ww9-$rB%_jfcoYveKIH?G8OTgL!w@^K2h z@rz&aS(tR066_dRv1nSV=%+R%Ga{unU_Z;~(I{B#B>NkpDgD!TH(0@)forM-AanxdryqkV#&SkAmDRHnSWpM`d1)n)A})Aj5h1 zv;g-%YXIu1p{iz-19KHk_J3_JO#f~#QuSlN4aD+l&$Ub=Oi*r=2Rm%c2|AKqPCSj5 ze#um)+puQz8E`3-$hWC)oD1$!`3|j8xWUT@7s4*A;A#2w84Qes*RI+NpQ`+F7KUrY{02}<} zCYNr0Fg9Iy20_VaQaU$;Fi@v3GczY{nzTPdcwXHkVS9uM4gZ))<^(`lJuT6;1OhNH z_KZ86PPl^KM6n_QqF5TpDP8)|%^V8cdU#-~di~({m+#r%%qAIG-`CK26Tz$rBtq+0 zODZ8NG0h@4z?XzMPAUo3V+f*yCZ>P@Qv^!RDni5liIPP1`K{}70>4bcA;3~85!$~M z%N$zcb1+Yl-$vCXYkMoxeBZEKcDv8~HQVedakp-=@-tWb(|+Qx5LSUj9W_B6Wwb>< z-5@-CTgbB!ZybtwxX8P={AC&J4I$8Gr(5t7=qlDR@#F1X3Q!i$vTS6~vLB*2n1v>;`({@$s|nko(S=xHX?}HWF8U zeVp~}^LfIYYuDZMS`v^1bk(Fcghk+($J^hckN9HvA%bN#TQuPPCrMRWc8dCPi7qhg& zy0djq*~vX?uje;zW)Y6Z_jmem;4kyw+8UNw-~_qwgWNkV)w=mKKsKoHBwK!I%CG*B39Q!NKCrpM8WL-a_2ZBrdeAf<|o%mckHaE*JGVQ(aD>K>nB;nEmas|z{Cs7EvHAn-} z^MUB|ByJ@GpCN*R!4a=r*Pe1=FvsADI)%WEz!NY20hB407={->a2RZ0_PbZK0l@AE zb_6&bC}e~CTY|Rh(v_Dgvf3C+&rvw}`4rAhY@pv)`UuypsB+Ts`$PqRDhyBD)a~oU zyY0j564*+-am|lqh^8zm^7-B%IilKVvo(k*_Hij(*34D{ye)7x@N&*YyN`VosW*MQ z$Y?qajkklrgPMr72qW#TO@?8e^t%EjyK}gZ&U|yq2e&TTX`!g{wKRYT7g3|fUy}!B zyL#*`e^6eUIns6O$YH)|Oc{zTu7|Kefad|}$lv=h!JTukCoT$lWKVL30u~eKni%%R zATe1IhvkB+Yq(UI->YR)*>sV9sq-p!@Ji6p*Np_s`wc30hDd(TfUsll1me(jr#_2g z7Tc3cCUl=E+Z{oJ3O;U~SK5;k2mIs8*R=t7w9)YOQ)~pzf-mUk(B>m;)CDD z#`bSsE!#iv&|d(?*2d|-@@pCYn?(7)lfwHyFfe~_{t?|3{(>(Icx?am8ULrW3)6oR zwf}kI|CV-PW@lme*YKJo)lC~hQ5f$R)uqh}RQbxv8>j$1Q-^+%G!XSDzv+QaSZZCP zSuu;@gwgq3+HnH)<>m9cqu~@K*84avF0alGjZc%FH_39l~`nDsv8ywWqiqwk@%$3{APgcvM4_i}G_r1%r*Fco0 zY8`mg8$dC&Hu?`F_2gDPk_}Dtjou8k3&kHAnd^vJNhl_NbMq7#TFomf`+?iJ;tqk0 zGuAh_=`N%i-tCg-IcoZaiFtV>?alS{<~z9ES0el`o>C zqt!mLrYt{uS#R`;1s+a`H@YR3yw-j=aYAcLL`x~RVsZEO+CwQBhWKlkIJFughICl4 z?18l$5~nnKzvBHlZe4+F-a5d)zQJUdULzUbD7WTs#}}qN00qBaXx#=vFHw9$qfNX; z65(4~+XmlNS5xihN)V+G4LJWEBPCOoz-5CB@|F8+(MOI$ZXoCI zgtZL_B<-!C?%2d=3=4uaH-IWKy^XA!KqKK62o^&{dD2g+82%Bh{}l9((xKqx-{ z+DAPinpISBv#25FJykRlOzcdHG#25-+i;1afp0Emp?o`D28IWxN^Ucq$u(0tOSpR!n{%3lzf<^Y1Z zGIhhGnbL&KuuH7GyH>eF2Q^Y(_m4)sv1yRF?s4tfx`;0P(;OUKz`8!ucU~1gt$=J= zu%pnZ>-KJ=HmLA>fGClj4*PY2wbRmwglHpCNAcnWgH;ze*{jF(gx|$g)4g%t5(7*z zcgw(@IXBv3J<2asz)4Ave#hS5g)~I`o0q{{>Hw&^$2z1L{-l&P9Fb>UftEyOS85o? zLO#LHg^4gYkA61r9tSSFr8+LK{FBtHEu;h;9S1S36$sNeuSi^@EHiqUS$m9CXrUE8^OTrlT z&&{)e23C03s3C-Y0ON6H8@`YcJa0{@v4P;z_9Tx{*!`~{Ygpv$KI zFB_fIaR9YSmMsF7KV3;Wq|L3v$Up`Ix@$V&gSyfWwtKh!ltz=-a_rx1*jrk^_`V2) z-^JS$K_(87-uN-7gDGYF>)c-2e#$loP^|$O=tafwnc|jYGbgYac5G|LgjHp{5}z;KrlV`0noDtM2eZ8?G+xOU2GWpNw`{+ zPf70M0AJgI_{xc$|Ll`roBss!p&5rR|7x*khZ5zh013?d!!Uaw;|{_wE$a}X*U-P$ zWIRm3vsEGC%ub)K$>WZNzr|_JvjDLX;Ux2GiXra?3RdoZ=m=?<8zF}V})j5`e7bz11=yK0W+mwV!L45V+_D$zEqt(y|Q*_9;0+vyoHm+3}5pY{>{mrK(V>)$f8D zN(#PQmRgN~mJJS75}ogUTH|ff9&*B!OsdB%C!#BY09q9&+G7D>U}Z zSxqHrCAnL=b#K`3b$M$OE%P%*N5$px7DPV@hqEjE_`2#H9p=dx zi@?Q~w_Q(zG>~9u4-w(x?t|I$*hJ+L0Om^|GyIld$a|x6>ZwevdI~J7Co>8J=<;~^!-i>t0jA@P(1(A-?BUUgX7Ima zme7n7Di!0t7sqFS-1@!v@F`^!iC`;d@LgO z5icI%+6755ow+x&X*NOu*x|7KgXp1{p9gB2^dZ;{%kp)HB`1s>21%}jMAV$wp@m0` z9E5*(J90fpShMr^(io!FLY2E+l2-ViMb<&M_z_ng~dFQt&RT{U0 zG@DLzfx^XkW4*b7H#SYJ7p=<<%8zVj7YpY^ZZoX62eH4v7f%K-(a~_86@To+A`6yP zHd&1{Ajzq9xpQ#uxU!NyJg3rq#E0VXv@i)T=B2*QEp9J&bB6D^*E9kj(a2|jvSJBl zl4Gg(lKu!Mb*`W=E-eKekq>yQ7IVf?ZQSY%y5dIhMf(!Bh%9fXW{i4$hbVmMj(ed; z?AP8to6z~kHOK2goT~GN4X4jb%4E6Worh?!lgwiw>Bh%;-uV&nv+5X(%L|;URK8>H z@3NbynSbD8`k21%@DfTDQz|h$pFP5!@y+*g z=n&eXKw&+%Y*SL{gH!Ey%1OZ>(^*B zzIp2BbYS-5F^T;&`q`sBp@VVkpBK;r$b3?wUk3((x6LCI@?&Zd!H+3G4K zc%s6SPe7W|$mONNl_wAEvU~t)I`*T^Q*(_Q!mcE~_tOS6(^}%E*V?QOMA;0Mkwu-7 z=J&(mIo0#)eas=|s3h2LxrFR{)^nMOH3oD3;~NU6IZp3Ln7%q#1wg|FGPqs>>> z?BgMQX81`~)%?zzuGn(%m?w?;)`MVN**DV<&cga6--TaEKP)dyM1A!(1opvZ&?~iZ zM9QHb(}_tl>P37dcwJ``1-(<&o}F{}PYntsn=jQF>K1or_$(gQ18Bq^!q~#62U~Gg z0n46tk=12}t<`*udfLEVU5=)ixm+iP)hw|Ljm07F{_3?4;8CPvwtl%L+JQ~uAj_Pi zmv`=$rTj)tULrQkH{oZ~sXy!4?{&*UBlYuMS_#h~j;*p*&_0!C&>tt+Tld@X^r7>I z(j$xtjlk@*62JD-H{Sl5k$uv<(*@iz?<270KKYyMh`Y2GK4S z^>e5q&%#U61e>WKJ!7gMrKy4ylYmU0e zlg43r)U$Tm0@}e%aFbN)zDuCcu7|*_D6%p$%r-VTLugG5w%bjLKkbmf)l6aZS#7ms z!v1}Cel*D+Q#g7ZE=D^tW@H(_z`CB==Y%2q707O5BK3`MkcQ@Cq3qYCWVx5s{+*PL zBy=KMs!oVXntOE(+OIb`?^%WyH#xCDf<-2}c{`GS-0Be^21M%f=wlK$29$P zm7e)og7xc6Gs%Cie%)6Ez7Q96J^a97LQ>*}c@u?2sa{A{N+@d7m8$-xm>>ZOHu_zV zuS*F?pgx#JR%;@pSEXwH?ptDB8TVAJ%s|HPHY2kvX8bpFlK?-i3YD=-_D*oOi-I{NcQ1De6o?zr3J0J>%L zFoD-|Ptrrn3f3Xj6RCmKvRboL>Yn@P9lRPRPFOfiNc}?kP}XG&CrCO=mBBQ2ZOJpR zht*5Fsa6)$sE`-Rw$WqsXEyz$CLt`Okn(Bq2Z127a6>x=@wl$OmTrtUK;I|=|Jp&! zzkB|40ifVN5Ae{}SDk|ooK&K?j{+vnGvGaLe2%2^0!=6+S(dB&aN`1)85Gj^Zk(tIdzSqWNcyOZrHC7VUx~K=^{s!vtVd^{YiTVLd%E|8uUu5NbKG(!^=?$9hDsmY)O zBjxZ>XeuCZi9QGf$_A|9UXp~sm$_)frnm8X9dmmFl)8P{#!FX-)_BkpPOvc3=*X&r zUXVidkML$1b`x*^4)OZ2fjP`7ZLbOV(BlitPwzeNx`BGXHUJLyTq0q?tIoiUn+;XG z3G}dJB5UCkUTrglt$Ml;kB~05mULLxbXNG*W^d-N0}5H;^4yp$w~0V=4(7Mne;J4<&jJs%9sVnG3FF)2>W{s}i!W1mj6OFa~OvSf&70AJ3 z=U~-1o+|*Ri)3IOV_tNY#CgL;41Dcg7qey$;OgJm%Meh*%iKSC$@`5M`o?&+6%idr zwZE2#a@$*Br)Zk})`wx-PeUuQ@S821Y(yxPi)*Fa1@D}hHxp+x$LB%7oBX<1#5nHX z*%0naIth=Sc0i84hSZhxIq0r|x3s#fFWZImkPUyNww=8A64OSZ~NR08GI#jhqB^OF^5WHZiGEc0!_{Cu#sm$=%{Q+p${T)iN$ z4Q+PCyU1!<&Xw4FJ1&+&<|XabuPmQjH<2aR5=eQ4=$tNkI$8f^<4}p{eNSNw1Jj}*!Kt=b?~3=pUg^kk-V#1PIH@Gk0*z5K>=ruW@Mn^S>E|FDV zIYVNg>&K=k&ZJG`lh-w!hxDCZPH&wzBvjMb^fB|!AEz~_rXf4aRX>!3$+u990$o_t z5EfmQ=R!W3g*T|S1S4-l3-Du2ywedF{~hCr=NY1$$ajf?%bni#`tE`f((q_-?@Zbi z;G(24iuxRZ+6M}ASc)?sQF*F}>53)%UzJQ!0FF13sk&GY`n^f#jfbf|+3(R(VD56%EB30VLp(%w=rlNx?h0D_e`gMd^zZ*T}&#qI)C_c0)4 z5wHD%m02MQ1Ts%Owlvo{dvsTF_gmJt7k@<#d{&BarqwJf&`}hk#2__sVq_D6iKJ&% z(w1KJ<0n#l4L~@3m#QMnP%(bNmDxr=e7qgiSGRyx7YLtBQ95jpzDT0kCDY&zft(8W z7z{rkmHX=6RIJulXIk;oBb-T%mfiKt$X-F!I)B>R`t_TR?PrK12@7Weqr`T?YG9H6 zOeLT~mtj8@dnA=Cwy{6qg3@wo^pC27=XjKbFwFes`pku*%y_WO{Py&=RTDH8PCEf`wv3LfBnV(Ug%(8Vf!Z4FEKseY-@Yc1tCZFiSR85f&R(Oh`Gp!+`L;62%XeSyFpH|dP?Rns-brVJL9Y# za<9saTWV?D<@Lef)W#Cg!@!izHW3T;v{ibZRg3iAsUpy+8>8l7BMak0VwaVWofsAk z4~dH-l2XOn2}FswygDBGtG1-5}=DQ*HIPO&M>6t@u}!Vy;dl z#ZxeOCWCX1^eZNXVtmTX)H66;9zOB|(&Ywm&J{f3PQV1amyEdL0&MKWEV)`mKv@c7 zWHSDbN|Bz%dI+m;+E+%B+w1!S3AtP`@TaLZ)y2V3YuiK^qAsmIy?ea@qfmV^{*_lo zXTA$Bl>n%v@~ti^4Xpw=Ohv{LN1~vf)ef3!vGHQs*ZaYZiRYceJPCvr5bbbTrS?wI zpK~Z!BGn%#9-6s=*>NlfW5+%!zzZ%-R#&pkg42tcp4NM%H~22O%51&Sk5Nl*Ir`bX zDvmjMttLI%?%qDDSv+>^HT9)O!@ItVMubm1f!)WVmOAsp!EP3m!E1qGXd#Tn!o*H4 z*~+u40|@v^!T?a?^kR4J_8&@vR}vnQLQe2j7f=Jtap61h_AM@QUv%TDX23tz;O{Wn zru#RQODj;mnH*B2Vq@H;EBNDRE}$w++bNP6CxuslRbq@cv;Dg$6&DZ|c*WJKpFaeA zy!(huZNsExw|vFpZBy!uZQIL(=V*hQDuQ0AETEu0pgs75)kzDk5c5!95VCV_z}Ns> zE$b27lJAu&<$~tSY;N9^C$*{IRfuTF+K!;|4IX{)lwd34NUUyL=0zx8!vp%%WBDkd z&rwSO4HfjhBk;5Xgq99mc5%wIh_cB+tL-gHn_z`l9@}$P`UM*oO?$LGuqmAB%danQ6Y58`^J(Qrfe+aUNF)*C0)+9hRZqL51G>Y$N7d{`*U@Hys)Kn zjagb18<9WGpK_SDxh%j<0Y=&s`0UXCp72v(%o|!(+jj{55Os2imhhHpn+jq#oD4zl zb)`O(C4No?{|!;^_HIj-CX6aIfkqfDi|V_6YXN-?#i~A@)+@%!jBDD4m3>bi-}=qJ zsk3dKhj>0mCyFcN;?~^NXqcI_kQ=DQ*}Ri0X&plBKde;bTn{gK$4Fdc(&4o#b&P~O z*cqE5b9+C}STk0JPnop|rp{YXO{Mme7*o9;$Y3GdyC%^Q(}1-6Ty-IckcZY8Z5!LR zGoHbjHp6vo^rJRXz*4gI5%=6<^`c9?Y%!B%g}>=l&v=tyHzBR{k4Z|a?k zC?VUO`cC4T&PQ3PwBbg+?g+PrWsKl0!mP1wHmRe@a4uO|Yk76{zBL}yc{7TX!FM=f z$dOV2qouMzR?=I2)9!_hc#dfK3a+uMeXlAv9C9_pKcZi4sB`o>kE;_GeXP$kXg{G0 z4~=o=E3Z}VyQ~yvy{ZqA^kp)dd@y8Oc;SQnTk~L%t?2*_~;f7f`$`dE_yYsy$n#w z3M>w0-DZ@?4b<#*-8{e2TENux>jOTO$A^oqppT0(&EYB?q=<;;e`d zQh$4D?p>-{w3Cr)Ss}Eo#VWVvl&^dXCEieEG+lHphmx6E#CkSgr@v(Gc{*7xtod2k zx;xX7y4G5CDaO*}D7xAS!m-QTlR}b-I=^(hf#gqDZrL!VcGJ<%#Sin|+Z%e#t(GRo z>CCC@^YvJH)AtWfL%~4QFG3Ohevq#~t?nL#2!o``vdqD{rpyjGg+DR=i~NP7NJ@b9 zl#5bO=N6$(Z3A_`hDjSdGLHhVFcXY2qZ^FaXlNv~35Q$s0!1*M<>Q^bo#tY!)HV}VKSD-OrohJ2XQ$57!!8RW6eZFEz4TV9?Mt=)>AO!uV|7E*@FiM7h*egSvZ1E zX9CIkSb!hXFj?`ZznpUD>(9CjjI?CmK6wPUM?YS}{F2y#2C}@0&}K{uH=9HB)>s}~ z!FmxIOY@PPYW!_jBCgk{07MPp%awCKawvYZV^$DBIk8HEm7~M7mvH^KE_U^?k#BFA zTL)CGX*8UT=aX)xxew+`D|~jckJn5lZ6?!sbZ#G)cLoN%13fD$nSKq^y*6>}ED$cv zYNhWp7EC-Js(HOB7Z~&|in?cNr7Efq(8(6Mdk~Bhij}k2HWs{keY``NPiHa?vQNQ7 zw#UWvihn#Fep~nH52MKWLRY%P1QkzS@i<8RfS`eidM6qjnOH-kNV>n#(BL|Nd#2TX z*l$+!E}YqD9`x>STOolTQByHPD$vW-CNL>@6XLE3nzz#~QoEMJw7oD{lp#~VFJzXn zyd29iTk5P5deSUvDV1xXrL|A6nIaU6!zUUvvE{H~AHK*!lO;X9<=9Y_TnE2A0INZ% znedVxqrJH1mw!#J>0F$0aj><_wBP5TiM;)?0@hGMLTDBr`m(Aw45Z``b`WrP!1>ZE zR%Vr}22us;ute}p^|!)wb+}jGAjfFj``~fk44B52Y;p;ilBR@cbE4&t0Y5xeB|*m3 z4(a3^OfU2?*KiU56B6mxMfb$IC@JzxaeYPOz)26ni8wkjh>*&%BY;G^%J_tWecYFL zPW6(EN0_iPrPkW{BDdfdXTlmfx@v5@TKT?^qVH-#U-E3%yhk%PF*RDzPKin1)BCo{ zn2wYp0Lg+~>A9*-sXKh#O?=6=0=D_+DaqoNdl3g$x=s3#)4D%1NB#tLY_^-scLwwk zOtkQU+e98P4U{Bl#_n1jz|flgAP}B8&3YmUXzOGGuZq-BFWnP@pZ>QCI}Pq~3gz*c z@$IaY=9V%D0wI7>9rjHkhcmWJrw~Q?(eRi_yp}x@R(PC9yroPG$}u!4?|6(G8l#ki zdbMer_Vc{wtM}x~ubs2RSCIuL^?HmR$ zw<~~gAWKg>=ezYnUqgEG4JQZ`Sm8FsXgH)Nj(5b}wKyd?c@Cl%`El;Fv|BH~APINs zm`~gw0mjv-_1h6pH%rwD4|Ua}VtpO#_BR7(V|~3(l2PR)VzF|HXV|&BGEpOU*G6)%--A<4?vQP z9#j+`?qaQ2I$_3g!dV>uNLpP?@)mARP68Ls%hSZSI#<|1u> z5^=!g!-!ULP&Er_w)TTOs+sbFp$hY-{qCkFTjTi}*grGQdB1fk0p8t-SRkwsq%5*_ zq7K%`FdoVJPJO0Ow>bnWc<~y>npPT`(t9?f5LcEdC!3${kwYM7JSiw3<9z>k1k0lb zjzbdHZIgoa5PZ2<+L37nF=NjN|&?zXt>pp=gfQ!UhtqDV&Ad? z?x6WKV#0QrVXlMLT_5zsv7`14s@PoHu)K8amnx*HKyR^wzzkk!tPH|QT9|wrBYM$v z*ev9;%0<(nOIqytJhqxaO$DwiD8hCbf{F&lI{oe~ajzzkN4HTBTY4n&RJU_bw(PQ} zAWCA%)P5w?-ZizpwN$P0iNSp18^pX)PfrwtGa$3#LKsqzS?+}O3$KYWS|bR7^qh^d z((7YiS^r~uJnNe(NbDG>w#W^P<;Pg#6W9PrYt}GQNNQ_ zC6amnEiBumhtg=#$;iHkU$rw0y@wTIY>X9UJP?>9V6ksxpQ0GYFyy7t~BD7ikARQ;9T+2SE51!sD^9n|O$@2>~y1SBwp zh7WI}MLMuuUue1VuGS{0K#Si@->w^{QrHnGI61)ymFstwH~R$l1ce#Y^7kY zS)m@5!gql^Haq-1c4VB)&d4nI2zJ&gJ^F}xcfitJh%7H}9Mqvpb;)nzu1^ura4 zSY&8x=@V$2F$Us)&ofHM778_qlqZT37X=6NKnll!8rMNkakMXL2aS?T6R4O|1aJ{A zbGmDFQ=%bU2%+$kB)(^J)%=8^v2O83jrwgQ!Uu9LHi4)C@ByVXc)stSc5=1_UE25~ zZ@Jb4?33=q@DH3-vI5aZho-dzr*1-Fc7*5g# zcJR#C843#9fbZgn2?dKpv0^qraFok*U8C9ngC(n^#YCPCp6G|GKvF%n4?Do<> zncNBze!L4j>S$=6L6J;T6=QnQ{G9oNbFywp*IjdsW>oe|GGGhvJKD*ezveQi9hekq zg7`ynh|cZhSJuE|?tq#N?V~2U`qOQN`2M(SCzUEQF7Kx_Yh#*XnPXnL7;K~O?b)}r zg4opGs&FkAPyxdV2ir5EEp1?*1HNdf7(xXBeH4b@7x5b>ifY=+>v9v^;|k^y-1HwO zedd{{DGCNa?%Gd_H4^XMLR9>U3vcza?Xi>Lz~xVzG|eH1704-0Z+2lQ$Sbu{oVRj{ z(~6Y}CKOe_;<^C?sLmGg$0BP6U)=KY5o`VeTbq&srm8~#na~|fCQfIcr7)= zLn|&4oi$Ak029*S?qb$>Hz3Aj%!E?<-%)U%1DE9Cqof$Hw{1mo+2u~M${nRMf6MZj z{j!GPEuBHW)^#Fka=U8A_~zENWg$qhZwk=O9C^TM6|v{{K%p_V%sC!U0_H~Ta}q9D zfKsjKhv{}DJ(L@K2elBlbs3EgWG6gID!s&KO=Y_fx;mo4RKi^91cc%qId)X*bTTMz zzt^h?8o|#692|SrO^@b6gltjWil$aa;522Iq6VJ}hWO+ATu?~rw{xTQIVBg@aComu z(8U+ma_%z=4!nrRTTn;GTm&dW6f2x1odmUN#qZGdR#VVs?7F!$&6%$ZIYha)N9BU9 zvOx)Vjtr(8WmUXDGCI99oF-OAVJAx!Z(pO@q;_O4u9K9W-;x#8UtXQ(jNk>0Slo%l zR>XUFh;m^QOTpMj#+Q_LD1^opvDAXdvy@B;*~k}&WJqKx$K!DK`ow$LDWuZw%uGTC z6a+8H1tO)2aWM5+x}=R2ASIcR2Bhlcj47m)l!XWuOU;zNN8=Ys*Vp=s(4)6%NxKTD3b?b^ z`>W5lecC=TW!Q;xWNc_kIil@-@K`#;=BAze;}t~%U<1(AUg*i3=_bnw;oZuiSGFCj@jzM+2#_>5D1rtE1Bds z%T^q#UdOMk;A- zvZ%q43&Q&aTa?2(qOZ~30GATMH%V!Sbkw4SfCCg1KYhQu@4v70!3X4i})2mKxSV! zSU^Hh24WAq+Ey!n*ds(ZVr{oe*Oo}1E{;X|HzxvuCQLGFWIjqrj2U5+-ErmLtA&bQkNCPk0K2yd~8RaU)u05&sL-1qXdtddnpACO{oqP*5W6t@8yv(|141l z_PPSbL`d$ecF&ZXXTmov*GFiuHg+ez>s3bu1Ca&Zq|VMYpMFcmqYtz9TW;2pU5i=i zef~qW*f81Ux2()0o%S!zl1C%FHMDeuo1|ph-#{wWiW~8lQ)10JOF00jG8Nw=WTp-W z*&L=KWZD2@xr&M-CCSunTG+480hGBMB=k=oBdIZzUt-7Hc+#ECT5wxt%;o9^SCf@) zAw=>O>P(55M2MZ1B^P@QFm%wu!hfTPey{l<=)#ag!^=Ea#M|;&*&QD_N4R)rYS1@B zz#RiukP~ZJ0ouCu9Nz^}3y`!xcwpz8YNFGwWle$*$-2Tm>kq60fU>%eXY%r(G9yKCH zbm)B)8Au>|6iGX5eAnDYKoe1UP&Sd-C0qU;#Gzd^!gnQrY*e8=nc#Tr)gB%|780^R zl_43)wfT{|>h0v)-H4O_vTFF`|E}lV(4)&+sJm4A2lk27%& zXHRcWV9&N~bJ^c>KvjS&qiUmxd>|J7IQ}br7XHjYy%m|ubd~WpD`8f>R+{1EL#d)eZ5Mx`IsJUIO_X)Wjw;XWx0#AXR1%5?~1_3 zFac2|B4P6?>}Uo>80I4ehK2TPW6CgkgvWXBmM{cX@-1gA!?jpS$}koima1%FjigDO zbXfK=oiPooSXs51J9IMaf6}iqt&{SGG}+;dXD4&M?Z+fs+bvpcC^kB4if2}1_p-sy z9bbB5PXe<+-TS`CRJ{rJc^zMdff41}1hE>I(3L%hL`7hc_cvx7ZIXs3)j5RFf2&D#hquSM>Kb)bQ#>4N&_me<*XXkk3p) z+u`+KSYQFS7L|-T5Uvxss&evk_H!h;S9>nc+lL=Ih_@2-#+#;EE}M?jWZE>UkJ%;5 zFJ>y#rC0PUi<|?RKhamnX%Ax!rrpqMohm4+3@Mh%RvE-sAZy8&2P;fWrpZ-1e_+E% zkY$l#jYNgBQZjN6;it?9|Q-o0r6(&W|ONyi4DTe+a_u-o2=tCDt@j{TITL3NF96=i#MOz$0JLDo1$I%|2 zqZ3Y{GtQt3&LSM=&=vXUhA+?^e?||S$Cv1duh0vBMFjqWNPL6d_!@n10sZiI^u^!s zEv5*GcW?y*)jy6wxa#6E;!uEhaRW{iA|5x9fLlmH5fX9Rlwlf=;kbwQ@BpLm2&wo5 zqwxe|@K21zQ>5V;#^E_8q7;)bSsj@yp&?TU+@U zdQeY_pk55>O_8ioAL>g{Y+_=jeiY4SiZQvHf~h~d(EzTbnD-95(?E{m$~1^QXt2r4 z)PaU5n#XY!aM#I^gM$mg)joxP;8p+iu znSE&#*Ps-xNvZ5dqq!E1;WyZy#&T^+W1T)=gVNbX4neTy9G9xEamo z=CpuY&_ZsBVYq`4xKE3?6)omqTEZc;lv~qB+=iBMTUyTTXa$GT$K0M)atB()9ceYc z&7C-mJ98KA%Hgzz)^aymN9(ye_n-~jlQz;O`h+%f1a0A7^eIQuR_;UD+}C}Y`*imi z=5+Ho_nGDl^Z4IcuFD23s4WbjzMB)A{hT9$h=_D|cPIj0iw5a#B)ztvAl==a(hbwy z-NP`&(B0i!KHPt?7SGXBc&?tx^LRcl;D!1xUc`&_G+x3>c^NO))AbBqp=a_+Ud5~R zEMCKF^=w|p>-8Moz#DlJZ{{t$mAC1+yq$OGdAyT%>G`~y_wZicuNUe?da+)jm+}EV z$cOkaAJNPBC?DhFe1cE%DfVJ-_F-T4V}B0dKn~^*4&^Wo=LnAEXpZ4nj^lVv;6zTs zQY^!AtiVdF!fLF+TCBr*Y`{ir!e(s2R&2v|?7&X!dglc{?Djz(E|s zVI09x9K&&(_`fFd-^n5!Cvgg1@P-e3;Rk;NAP_+awjFIJ+u3%pU2Qkp-S)6O?f15q z?QQ$mzP6w3ZwJ_cc90!xhuEQ>qn?upQpo=i`G*e&*med2&P zB#ww<;)EwioDyEbTlfgyLRrFJ1c*QpB!WeV2rYC=go$uZfhW&%Rz!$M5hbEUjEEI+ zB3>kjM3E$tMXE>_nIcPMiyV5=brE~V76uw-ealSO1vSxgp}C1goiN|u&oWqDaqR+d#| zby?H>;KsS}ZUQZ)C2pddWRB}}ouM;nk$Xb3X)ZOU`P77(QZs5vt!WUIrZQBP%29c$ zKozMHRi-Lbm8wy7szEiW7S*OYRF~>eeQH1rsS!1&R@9gJQGXgh!>A2?Ms4W}YDev< z1AR$f(bx11eM{d_N9shKsS9~S;y%_9il^Zm_DtO zb%Bo1XLO9t)8RTxN9t@Ht#fU-jk6Ip-bUI48)Xx1v`w-xHrdA76rH3~behiB{yJVK z=vaML2k0oBqf>RD4${GNl1|YvIzq?k1bLA+`H(*aP$2n{F9lIBEv03&oL10ET1BgA z4Xvehw4OH5M%qN1X$x(oZM2cDh zil+ohq$EnF6iTHuN~a9Uq|=l|XDFL;D3|gmpUzSNoul(~fv(YYx=a`83SFfebdzq; zUAjm2=?>kd2lUXMxA!Q79@z`_zP)H4*h}`Iy=))ZEB3LyYM=+gJ9EeQodBH#Xm<+H{*~vuv&{u;+}Id11WGOXFi+(NVf&e9dd)XWkfp z^VS6LdnS-QCWy%db0HJL!i2IkVXRCzYZJkRO(Yu=#cZM(CWftvWoP2}eG|_`Oagyk z61k{J;$kM5KQt*Om5ZA+{>Y?r36sGen@lcgPV*-wi%apR<_woM*<8lta9NYfxy04YWv*eaa7}ZSYnf|Y+g#^5<_6a_H@Tj< z#r4f?ZeZ?kLvxoKnS0#W+~+3d0XH=dxtV#y&CO$OVV-bH^OReeXWZI6=Qgg7>+AZt z{%(L9=mxpLZipM|hPmNxgd6EbxzVn@>)^(?vF@3B<(|9O?uC2fUb?p~!6mvRm*$dP zy325>E|Zfvg;P0=(>a4P`7~$o8P4V$&gDGL=d)bE=lDEd;EQ~TFY^_?%GdZh-{6~k zi*NHCzRUOcK0n}x{D>d(6Mo9i_&LAem;8!f^BaDP_uv7c5CkL?Gz!Cj0a!S^k0SU0 zMNteNqBuT634Dx__ync!DN3UZ%Ay>~qXH_T5-Ot#s-haIqXufC7HXpo>Y^U%qX8PC z5gMZjnxYw+qXk-`668 ze#7th1Ak%)rs6OBjcJ&Ue=q|xF$=RX2XiqG^RWO6u?UN?MAnvdW&L*>Yb2YZta$v`z(2B{xqu=+`csGnu1`bCDRUuC%Z zO-88SWu*E;MyWq#w3;Gg)KnR({*rO(ZyB$q$pkfBCaQmAlA0lt)l8Y9X311FTc)Ww zGF{D;8ET%)RP*I&wLoU6h4PGAB>%^Fl|VIhrQ!Q>?|b>8_hJy#U|bR-YDJ{(h=NEG zt56)IU<0)_^x!#2TkF2>T9<(PzVG|?Q0v&4sWKgBYTI%4cIuASab{W<#C@sEeF@@H zd(Pav`{%#^`rZHkU(U%%ZH{_Mo2#DI=Ba12`RZA1fqG6`sGiprsb$(?^@6rUy{Ii! zztfhfm$c>TzqA$VWo@PUZ*3JBLGF=}=p^sTBTFGJ=VXc|M;+ToO$|!5Y z7;DQ^){becJu|Zo46GxwuuiNd>&!SyV1jjFVXP~w#S)p7C9!bUjYY8TERv_`mCoIE=GuvVw4yy#-I>`@ID6PJ$#4{FvNV_eA9fxeA`@Z zzGbd3-@!D@z(<&c>6i%tD{7%O!Vr!k%)=ZkKr!ZHE*7E=qEHWZ)J1*R&;T2;6`Qdg zo3IUAumf$-0qxKUZP5|!5s&@&7zgo79KazYA{pI~f+TduZ%~RO_za)ow>XO5p%?y$ zzu-^!8&2S__%r^F-pE7-vhWMMfj-E_FbqWiv#}V9uorvq2@c~pKF8Pi2S#H&#$qDI zU;@TrlKByc`7uo9AEB5lL9q<0umWqa9ILSsYvDjsG(j^s5e*lb<6E4;DV)PeoW*IJ zM-JY`TX+Y#=#PHzV$>{esWtMSLQitjwX) z=|^-1ok?fW*)%|lXfd5b=PC>7JUX8)pbP0Dx|lAZOX)JYoUWiN=_%JRxJ1`Y9qJkAX9&o6BPvC_oKa+CC`TrVxce`@p7g{sYr!_l8H@{=Jy8(@(9 z_jmjM$@KhE`YW;I0y!?drzufNn8HX!P;OJ&DlN#7YQu^0_w_6Cfb1ZP$OKZL5NTIN zrjj${pv?Ug#Uzpho^e5dzb2*`FzuGAV_U+oXc{Q$e zY^#`-ue501EV`+yiPO=zQNsrI`cbxeb?Zb%)DE}S3KP6$4GYYg%BV>ptrVMXbNjr7 zdX(F*bC<_ub?Cfzd3u~qYTKQza7VkioY*QWU5(L6M4BF%;VU7@@j1E{^P)*_okm+L zoYFbn?(pg?T0XASynMYyrqAiJeq*oJ=SUyDzT4+?+I3U3e0oWhd{Xlq`MNbj%ANL* zq?b-Ie8xUpc`;rJNxU;h(oCP;=*clB=Vc&2kuOT=3ov^t0c#15a(i?VSwi?lozyYR z%Hw6@y6P=rBoM3Qg3(Bvu0&SoN`$V|NtckHPhq%~#lNHm-uyzBH-Dh4XukhxP0K?S zbvgo$K&CIeon(Wc)AZwgd?ht&xLxi6HKc$91*D`#O)05q2xN%CB??bcf{clK6G}`3 zLYA+#0oQBnLOr?2FBz9d)=g?6o@x$PmKHy&BGT;%7ZKt@Aau>Gn?oQR1NG!QofJ7r zT9pQh4_nE*{urL`%FpZP(`lYGC?Pc3TacwUNXy8TBAH5Ve}Thjwa_>D19{4S5wS=_#v&QiNxTYh`>@EBc4Gcop(od&$Nfezys2+VZo z>m}T0v`&M{A+Sm40k2DDlfk@&DMm};s@oQv#$Nfs<|G&8IrPcz7KUaoulULQI|Ejo z-*L+B$o@#rpkq}j^ZkVeQ*p$$52n3q8g*9Od+rZ0Vir^A@_@a-Jur zN>pW#Yq%L2zb7Zh8S1+<)y>f})z&UYz=&v$)+1xA&SO$n8rv!@)93ZrgSXdBZeQY6 zoBgWf(=w{XicQ)C;;!05HA;KKmDVRT1qDxtKP&VCo2ol6O{?sKQBT`+mRgeeZq0-_Q5+?ub-tHkvcb8wSgM zy-jpM(e0!46>(UT1Rqcx19Qd{+CjjmZ<99}%A+VC=*+Orgs2_?uNw4@!$V-)0+O_^ z*|3ndJuK@mI6n8_*kF!8AUx5W@ADHH;adj1S*)F`(Y_KB=8T6lou}Na^B)*LuwQYs zE&&rk=S~^}X`eJli>*tIszC{wxLv)x@m`}!DG;_yr-&BB;nz&#%U<`+PAW}IR}aljhE2#(KjOi)M(_k_Mntc zOy47IyP07d+G2+3x?WQ@otyH0Mcgiq-De)(Gy{EnQGA*nBP^<1Cd~QC%PMnz>Tvy< zfRJ>4x_*Ua*wIEsyW9=7`ZWojfebB6wNyz3i3(_f0dH4Wr!il=rXsXpSZ#*FkY|?} zWaylmItI-yv!+hi)UlwmnL5?bnNJn_B6E;}I)S1e*VRYrU(n{74UHxng-iefvdIY2 zSu%2&ffpjZg`BA9Zc?H8JygHP)N@qtAQgZ=G>1f6z1bkp{y@NWBr+O>Fog@7l$JL( zfI+VV^ComIc?2#XSeK$nfZ~T>-hO&DK)qjIn4O{fpfJUh%g1Lm-MQruri|+@@ZhpM zz>J!)hMoejXcoXaLyRG)p*a>bT~p{y>!+y$NrLC0F|t$VWYeczrZ>uIO+P6Z#|f9z zTaxGKKNswc5}~0HL4=!WW|ABp*!e60(`-Y6Y}?T66oAnt({GDtYEHnZZj( zw*6(&1WxBV1tt>V8B#@B^L~Z?7!arPer>CvZZ@5*4_;vA%h|g1pDK|ArwJsGlgDQ+ z4Eg&rkY{+UvOQ;?M!hJF@~9upsBM7&-^Fn}N-Ij9k3{nQY7QDi74xVl6xm|T-HT94 zX$uqriW?U*nSp#Ucimsk`NQSwIrx<656T_A9(^}T_1Asn+`Bh?WnU459eJkIKf(@< z;8MR#x_H(>N&^GMLYxf-K;UsO7!HyW<4gGH#SU_zRCibwy?aNbe0RI6G5q{!ZFZ!? z+dZ6?m_LL<$yBMQJy$G~iGzXeLj23|Y^+%8lSg*fGKq9gZwEL3 z>Z|LwY~Q$Z()QQCzYbv|b^~7DY+tb-L0u??UWD!(Jych--KbCUxAkF3N(+QxQ!MLC zVHja%Q6kJdlb{(1gdK@N$QhGpi`&d`slO+g=#fkPgM|I_`WZf)h`JAX*AIJ1DW7IP z#YhU0(iPdnA$(o>8T!zz4^oF>izk;Yc7Bz=1_I z)`s9YKn;Ke^&u84EZ4_jZc**CL3j`miU_Ol`syny+a!M(vIX%1I*P(-fo3WEUv{rC zm}FVf#W^_6!2{Gnp<-cRV6ccej&#v94geyHg^=y0dKSmk!Sv(V(i3vL80<&Joc6VpEn1b!76L&5`+cHa4Q0a#oI`akqdvRpJvFx@u`d? zTy5=1^UTXHe!rSNIh7v%?6<#jhg>U!B%)pRf{le4KAuqXF7yp@5R_wEQN3^v?!@kVyP;5Sw_HYI_4>pynX-v+DB;sE@+PR(+1kq&p0K&MR>gL&zJ$d|bg^xl_)`-;;kL z+hqk2c+w}|B090VNPJO6ilpQfRcREQowLmFcch{eg9?ew4;GC${RI9K4;?tD}i ze8sHc`}5DqLwRxj^eM00`#i%(<0P7ufrYnM$1I_zb9B#orB;nw-DH0ss9o z_3}BC+l6_4cV|ZMrF}jrjbVg^OKL`rW-jIPkroFQqas8f_4oD<;$%sdlS@_kAG}w6 zOdIDNzSr;h3$T6m*>^T)oAdb#u#LX}n*_`O4wwW6DG6W-fwcK3R3xEOx-Cgr($K6~ zCy}6zpk@1GYelk1+mvpLlD3o9Ey}d4(KI%tQ#DPU60O;?tXaFM(+XzqozGxC)=5b= zorL__=Joq~-skx}&rd8`sFIE%`w`7Y=otUWzZl;0u-mRe&jHs16SZh1bmXt_GYCoq zUq&rLxh>PXZN(eee)X~Vx*42r&Rb@&72p)H1>>3L8C%{PIk3e==BJ=8Zz&-T34}O< z^+|}Em820Wj7FP+L9@wh66lIF$i_9fvdtoM1O!p5Mi>Z$)qUz$(~hr{A2 ztbOh2=YJ-Ziq5@QmKldibZ!f_S30*t=O zF2kNheNptylhWxuN`;QGLajn!*J28wfeN+S3awLWUX(R$T$XVb*cD=4Dn~C~2lD_s zq}^*l}UYDqwP0A8th!lkvm6)ZM z(xea3F&iDkKj{4$0S4~jwoC&OL@ z=XuU2N4@mh2>B>BEg>HOI8}@r19GDYs#H}>Nd*kxI7O9u%1X;-lcfwsXrfwxVF)EG zM-%}XeGVM))iTz4Ll)@b2iXP1f0Cl3E42hgSiS4R3e4chTOAb|TQJ)J4~U5U?e=}E zzeJ}Bl%ymiPc0!S-@b7D{fpn30}Zt`OBj7}MfS#Hllwr^-IJNu*Fz7@O~QO2Z$a|` ziNg5f5`M*+agO7B#&I5EG^CLYlLc<*p5hCZ5_-L4E@Ivf-b0>3eCk)zav`55a1_pk zvj4Eb_HQ@%Eh~!vq{&g44#V; zsHA0YD88r9daOVZ_MtXRgGe^dqZGn<(O9!aaUdd$jR-F#ghj)#Er+-HyJqg5w$+t2 zDHW?y3aH)vd{1C-SG?@7e7iy!Y#(htaPeq^JTu1zJ!@jhLU+XzFKykuOSW($54{NL zXm8~@TBJY~Oc=;Il62HTHaO15<2)O|42gsR8m9O}!pm4xR>nG;EMUBKux`rBdp)yB z@5-X1S)t_0HefY1tC0l6Zz7^$xgN>xX+TjlZI>Y^k?6#Tw+^(9h#fZ>6-sv=#4pvx zNE=}b`?Q&}4hyUGYzQY(Yk~e~_ra&zW46~WWq$YMF@)ntTk%2JSoratue3Fk6*TTR zHoK+Ullh4wbnM+PQN`ws1@E{eLdr$G0P0hOs|L=$Bz3t(kI< zE0t0ExVF&YU_yk}lnUWG3}_)1-~%|sr}zL#U0%G;)953L5mK@YWn}Uw$v|d`Cv&Pq zXuXZx&`{%Bwba+>1(OkEy>Kl;TorS=^?&+nY0@r3VFN+#@p^4;H#It5+O=nJXYz&XU)ps(U3VOG4-FsM`9yjs6b^Q_Z0Vou|M@@y zwD<1zJ$GP3dfS%f3j-Z9W3?tGbL+rUV^20e*U~urY}=mx?wSZ?Wo>{(PVzc(k}kw~ z7CV*091XZ7lu|`Q3d1-`XV9b2q?e(05eRmcSJJH5^;np#6j2WqcLNm{39gEdXf%~V z%LDAPG+nMR3n!NpC_RiX4d(x7rr>#uYg-s$v)UFA{R@hxbIoZg=f%vT7B zStOvMw4(#gX)S^Fdaxa-y%n*o58g*Ptpa;ls@;#tV3CGZ6c&cO6TGQN!1>T}5g zeK{34Igu%7QiIhw z|1cS|nH8SuJMgulLVvt4bF^BMJUF(wc_a}Ynz}Oj)e5CLQZsO>*B59!xy=F3r-+4? zDxM0I${TOsy*o=AC-)8CyfU#VGtPFn8TBjMy>K0#EvTLtb|d8 zdV;U0h+(9eb;?bo$4C$!=$YXO3IkCXmWN?@nwJwLz-~JyOnyS6GS_GCn2zQy+fb98 z)5H!az~p#{ozj371tj{cpckcA=x-G=Z_FKqiX2E%i$ehfe59!#8BK0_y1u+^xSK{5s38+2B!AiWf%hhmdU+=G9In-IkmZk`NWJj2? z5NbsO@yWZJTUvQ@tg7++mG;do$1a=|rmyzJ`|uZtU#?{@p-ljI*a=<*c(W}9*zcjQ zVFW_=Jq%YvjKev|P4hTqGU#ZahqTpzLjDYIAac2axF+@xX>k)R28t~=mQ%?!v2}$W z_4Wu~VL%e-CuEmcwp%Hk%Pd6r%0AvYJU6~~s@0@3v%cu$_xCn^y*B;>ncuhhMBm9x zhk?3hINkfozMk&-x~;X%d#X(2-%V7i;X-EanKu)dq{ufB+dNntyCh*2FVvYRPdS=d zH-sm6yT|1Uz`zXeB1i)y4d;@iiK>Q`#g(vfnlGjbfLaCBs&h%T$d(m!3Hp3Xt!9-( z%OBOYX;7WVyLGiouOr?;1)(a< zT$1^Qy~ER#CubSfh8X!L#7GBLj?L#d$)Wx9ZQ?t| zH%x590TbY0PPil?0oo88N(c!_lnaCaNtSeJntMC7S+=Sasad6@o!qiX%hqm7tF1w6 z#ky%#t2UdqtWw(#l{QV$CQX^9H8^|U<7055Y#%x%K7fV&`aJ*ld4A9TuR`}FZDl@C zydrRM*Pov{{K_LbQ*iZ5zdbo~x#?nl@uymye@%Sg;`V&z`aALP(DNToj`v-eNcE2Q z@0;x#o7gbDEloGJ1lm%rj={T%Gha*AUPtamm2U+fC@vFG;t#U+RfI31vqL9WVXKHn zlo6$^0z@FJjyTDj7DVdS?X~*7E(7j`@u0pk9(){tZI}G;5rz zymXoX=Tqi%dVT9z!A$V5MhTR&LXA_ybN~^GK%7Ba$JwN>;5g*6X9W%}4Rx{1rJaN7 zeK&#pqSU|e=IsQM7QG4U8Ca2{vsPtcXCbkc*kP=z!?I#epaM!&$xq?`bv$_=SI}o? z9hTwY_K9u10d4ES$u6|*dY=2^vmHm9w@&n13@vttt-_A3C6s7rU%&mC8$$#A)URNo zVe6&ANGviilCeMHNqfb%>b)QQpseq)5JJn-q-K8173zffW7`Mvzd6y3>fzcRquObOo#O3lt zfIC8lsz9hJCx(zE<7f_WXjef41O}KB4HmZrQ?~@RNtwjxCJF&+-e4ppqN4`>%7>v< zCkc(*_Y%NOG7eBP1JAOtKqjK+ySsNEG53|LVmy-{IpJU`{q7Ch>J8)h&llMu(m^e~ zV`yqu>(>0m>Vz@oS7s>p^Z*x&*6g0#ym*h^w<9K_95K2Dwek~+g9IR0;#!f>Bp?Jz zOC!w~Kmo8*&{LZz>K;YvsTzWiH^k~=@%k7bTmj&ASF=jJ!H}tj`kV+|F*M!{=`g4Q(u@Px zjEumH&;rG9%!8M`4I3^rUHT1JizZ zx?^+-cn<8mA3NFjny4`rPmUf!+@YqbYP`Bs{P@XH^x_w`?5ePf&S-v5_m70f3pYWx zp__;huN0}R@KynmjOiVAM#t%NkOO*d&T3_WmCcD(y+fmRseyV%a6uvhh)7N(EJ&XC zLqH3^cqq2N`e|9ugP49m$>j^6{STnJM7gy`4tMO4iGClYO9k3I5-HWS;H+sa(#l4J zh^(v@XFlWeMYuC)?-WukB&4{7z+U1}myGajR6qQ$@60Mn6Bu7t2)vY138Z~b%iEuv zAI}Xd)n==&a`f=pzO7$>wRhmfo41=XfwtCE+}Hso4A_1e|;(QPm1zlUAbr};j*S4y!B#0|N!HO8|-BGKrtue6t!In)k9 z?ErrDoKmR(N<~go>iP0oT`j1c5p>WN2H{!3#`?U#=go;eM=?N^Ov}TXLT(E?mZfTC z&d!=1XbGgA4t+AH(ou!MB$dTTwmg)#Y++tc>c<)waeA^Oki~$4l88pW16QX5ElsXq zqZg;MJ}>p=fpEy9z^$@nB(#*sK86*X1``js*L8FWHoi9V>YLr`I!?{KD3cHT1u0!Y zd|%d?w^k6%F8IG5nI(PF%+aznlJ&*Rvw~}{SNNbW))ICyc+6O7$_}k(9)0UT zW*zlmTT1I$*WTTTr)y_a8m>RlM~|a*Lf*TJvg$JueQwEWv=d<+YxbR0sbbD^f==Uh zbKxKzq(Ki74{c^QF+n^@CT-R`wNFXncHLCxAeO1;Z#Z4qyWl*y4%ee_RB5P%(V2b>GkbhmVy0d0e zzfqrdT%{x>)hh$ZV#vV=$cbK&%MN1{yH?U zwlPp&U)6Gc>+VbKcJ`mR(+(nSE9qNkrss2|B4c|&z)Y6XA7Qsa>~UJ;lII#}vZBwTWm1$dvPxhW;y9>WI z)NYF8_#B__^Y=b}-uHPPGKzybXH~4McH5~=$asoiDSZP&$d;Znkjj`ScB9gTwtHG$ zF#B*dAX2&N1&ps;L?H`EL`D6cMMV(0P_QPI%4d9rQRFF0owTn>H+W`rL=n0~Grm!} z0aBNan?w101dKQ>aHj<|Q@H_-E5(TjABVoYs%7md%;0dYu z?Lmz_9Olr_!lRSHqygW^OXo|^lb`nG-8f&e{1yd0~kmgU`V!FDF}QnTdkK#1k%#auATPiRhs7W+h6ZxEfFYuF!!~G8#RWT zZHK;Iu76+Yj`Sgl?i>$pm#)2tQC9~(FUCvqZ5bHHy>BMF=SofjTW5A-IVV;59%&+Skrajx$=(%Bf{#NT_Qbc3%%8CM zoh~~kU3g|xwEH>fCxVFVD>iwQ4 zAl&Ul`rePbdxB<_%$?bYv{>PL?6Yav8dLc^G{LF}gGsBcBRtNaGl)4Kj4q!(=n5u- zprpYgqSH~MiWz9mL~1Ff>|W+D05S&%0*o?6QDsr6W|2#Pg7MN+hF4Il`@*&_`0j2a z$etv@GV)(pWU^LyrjR)#tWeiRVxP4Z5(4p8q}j=x{qu8)b)vi1)36zNJ@JmNp*HfP zo*q91{q{ccEB%(=CQVEG-#FQOpVuMiH8Qs+pleyqQsJN>A6X($pip_MCXKD?lhd?w>@30$ywBdXi{oa}gDS}dc7i3stdN-gs! z+HJA2k#N*~P~^B+lnrRLyo#YBOaw7;4xnml|w7e+$d9$m(9I$ z!B>n|+N9i*$v;)~Uct}5Zy_Wb`YiV4=J(z@uL=?N_=L(d0Yvcm8tn#sC>##qP*DtrDZ7hs zAR~5I_gG!nRTQmul;kpSCqwO_k~mouscMzrgQk@-@4hlAWy@{;?+GlFuKwA0^^&PY znIjGV!*48@=fcUB|5rweoTp^a16AW(4-a3zf8KMN zGrhYO?ATtgkN;wwdvb{y1bTZ1J&%JRW z1U$|8awvW2zPw&3BJALv8L51yEx%EXvFsX<%Tb(KmoOBVo355a6pAaw<)UTdwFGuZ{o z2vB+_M726a=yfh#QU^5%PNxoYx|8BoC*qt?p3`X};v^lXFQ$({Mc~M=>(*zL zB`1|*12n0v+N~zOIw1t(EG2gJlQ>d`<16&8|-@FHi{ReKTgzj`-Gs5t69|BJu1@PHr@F2Au8lp zdTi+FTTgG8I_hs8h%y2hD8?OVSEjRhwVt6wZp0^O^QV7Wi2uo1a^0v1W`gJd zc6?896iH$}ajsHV3t`|~l;A$VYr_Wwd?1%PpcQkucCB*1)$eb`twquAxBiRua)HXK z%HsI`?m72fOhm>|2aJ3*0?KHFjXK1DXexx7gd{9Ye1=X55?Y9jgb$QK)0BJ!WFu;t zpk>V(Egc^y=HRH44&`8umX;;rXbg@bXa4(sm(MR|jk4Cvx7Kg%ea}6wyU#v*?=Qp* z5g~6!n!X)^L=fV=D{D4C#g2E~qsH6HAT@UV-t~W(GtuGh4v27;Xz~*CXFhHh&r1{5 zzguC~Fd}Ev)4BiJw4`Es!5T-@kj1rYSMGmy*{a4&-+}#OGNPiRpPUlzTR1ZA(V>x{ z{==i=<_^}%f?iF`t$ZP7#nh!oquTVHA3JYn;>d;Z^FJB%UC2{?5{f5`9u+Y?>&}2N zqdGk?F(*1M;l%^EfxA?#d>)mK9|hAM+rs^H*@HZNdURUiiNx6(Wnhr*@8N;0Ss3Zz z5#*;i+Bv%M1@Yqx;^*sa*}~h+7S8M9tknMV4%T=d^DalxW8cF6&*X??xNiY2bK7>- z3`3d^`oOe?ZQ28E4mo-}(`wZ0fsisV+DnapFTS4NJtDOGL+#qO8X7w^ zbzt9L`PWv-9)8cRPF{ZHwP^XZhDYi_+>l-zjWucqGH8Tfyc$0+{O>2N1RPt?%5hvb8}O z*wX652n4WISx9J->E_!Ysu-9sn3A?4Tu3h&>TIN4DDmERR!tcXp1Dn$R|yI zigf*X%9Mx5V5xiIou+QeztCi)fcjQWtrhmSF5ts~O%;b9jIH zZ1S@9ct5azclcZM754Ys2SkS-eY1-pYCN$Kves z)G3*!-okiIR8qV=N1F73UI!UZ@j7&E9mrFU;cjc995LV+Vn-P$LjQ^A$FdmjHma)_ zGf$RKKE6B4SWOFLKUFFNX%>9qjI~Y+FbuVd;r%qn+TXX-n)i5Luzz>>Tl6mW_uL2l zksp7v_|%q_^niRHbC=mRD08#LJ%JAZW31CwO|Z?HW7)6?wq*-oTf4(HcZcoYgtcF` z;R{%QGMy30REgME&AQe|)ec1-VjPVX=~U^sNT(fV@%#(uXQ@*6q|;&!7(jm$Q|T=+ z7Gw6)X|0qtYvEKQGO1n=os^5{l=cnHhaRAPPH&rj%51e&nR*vxnxW7S;-1}x{#(dv zklD&KzC`F^;w4Q1XQ9}dd74(?_Iufb&j$!pgdUep_UgMN)(g}+S! zi?#JML0hkCAj3rtm5Cg+2l7G3XLK0s1Z%(o5kiN-Zm#8qOfKu;Uxta42=i@BOwDK+I zSP`YuN(xpl1Jf9Io z&lpE3-Rggs;&gwCl7*^DuE0G=rG8+ts75S*l}6y+bd`H43-`ebHqYYtF9)c1}`so9DC{Y2^Wo zX@dK@;_g2Y3({a8j=Q*@9H(Rj#d93u_=9(au9*9ns^fS9yJ}YKjlwvN6Ccn-{XEVU z@m4=W3-mG6&YGWNp3mL5X2l}(wfduv7UOsv{<>9*p|0@JPaVgo#Bt1FLVm)2DncEL zL@0S%HCheMi_bF*vY(pE=V^{nTjejwTi<{-CK@bOyRGxgwQIze?X%=sj_aG9WEu;c zXQ?knpU3H%`5ET=3iZil+Guu1-&*pJ+2mu+#Cw0_5UeQ!NH_d2J`ZELUb5>wSN+Cy zo4p5fvnnz7z#oRw$Go1t9PKw~t!!Ujr{+xEkb3aQKP=eTrxS6ER%OSY) zOabYlRK>`z5Hpf!5M%<{5=9(M5>sfZ#|Xr&6EqX=#)~f0UR+d_qFSxN9M?syDo1;^ zxJ1d2QNZd4(!c}gbB6nYdhQ2SxcU`Ps)(dEvV;1A^i^NtIY0)g+cFFG=}Con9t8be z?gw531Rl2f6~MO&;CBUd*6LS4yF?1z6e$i9vJC74<)9jE1_*`zIpjl-H$WY@prtyx zX{o3MQiwoXk)nPNj(|$=^}lH^^C%s!JC6V6+1_`Cj5T^{OOOzTGo%b5DN!n=mRchk z)GoH52ojErBuHfHa7@Y!<_~7l)LKg{wGWOaNF7BiwVWgf6<1wLDCooLUHII zKSXYZrpVsVZrO#Mj9r&-Th=l6w_pnV1bP^+$h_!(bpYGb=W&<>Pxi!3_l&(|OeN93wb?-9+PKp|V6?(Xg` z2d8m&hsNEdad&rjIQYR`-o7_8nYqb-Cihc)sY)tq|58cqz1Dh;5Vza4n6v&?1?w>) zkc&`HhUvD!ojS^n$h_KWL42Re_d~AChxkO#*=x_912wt#riPLg*}USGU_>vqgB@=V zOc%)c%z*e2x)nOHyqvB8#_AO1jzQ^Y{_2!3`_s_TZ{U%U=YRMUc%1V%qdeLb!42$p zf_FU`gni>`Klbj?Hn9vvwd*|5Wj{tDon&@3_wYL)m2U{mQszyGv9Sh z)Raz7NJg%p7{*ZUV~qf?9Ys8EI$P;tn_M#MSvq73RrIBk1FNZuKltO5Qi(GxPh}5a z-KIAO0g~~u!#NH$p>)pc*+P7F8cG&X(QKtdLs?u-zhBI=%_v4fr}Uo_=$(XjShzO) z17U#pTQ#}8XFf?%+v?Ae_XkSV1ar8Z#Q3-8POa$7gInJto%aJIshZfi-yYd+uT`&{ zZ_jSN6dVzz`(P7vIL7iMy`dT1Lpr>&czk^LeIeGak)L5o`u^q7c;QFN6?}hq{TROX zM?ZNX7crRc33Q#8tFzgII_dbtKj{!a_RIHuA?VrdhGlU>fG`t$Y9!Ef37MsG4(S{h zuO8K+J&(8;SpL&VUq|!`oDL|Q>vGYuIAm?%Kk7XGv7aX?Hh(#G;O3|>_pO|PV9Y=I zeJ7FQ`+aL!3J_BjpyRhS5r43;H~04h;HV+2BQR`(w^cf7YfC_|kf0w^9r%H{0qa9J!4ZDV zw`IM$HRmP%oNCWyyI{E!`Lbhg3EJ!GJUpM=DX(p2Zyu5UlO+7<!b#M@e4` zgLjgfI5u3qtvGI$BI$Q$r+vJ96^34t*G^*h6SVt5+>``hDWC^WW*3xGy?Hv4j(4}< z0_WRCNP41^7D^tDW-tCyY1zp>_i3^d)v+BaI-hCCTYb}<3zGh5oL|-n+v(nY+k5fX zD|zsjc>biWRYS3hZ;6iWiPuq+iH5hKj_^nyL1 zJ*u9zOa&+h-Dt0IMZduwoG}A_Lsyujj(y<_!ek2kA*Hyko}X=-T2eX?@o2e$_GoF$ zXt+5UYq_mTAbsde=ZL~SVA~#7b?bfCq{dz`4RJ!#^AcKO^r)m!XKEhUtfBvtfHt7# z)z~^dBTN>~;n~sER(O!(!H&6o)zF6r!p;u$P=#O+w;I8J_sH^lJJ%dJ*GQv_d&H}R z5BkT*nnJaz7{jv&J}WmNeZ#!`EeYW;?f2Hv1P5LNdbi>pcUk80O)*}&8s=EVgRHL zi>)}&#-pldzHV0KZ`Y~U4?|uQ+N)>_A7i>r@fOCW&q%4fQR3G2{PJ#+}%XXTy*r0`|1f{zH|`VJP(;E9qBPmz8Gje8(z{T z=q9s#qNT>?ySR+o9mzS&I@V&TwvKYi(<1Mvz8eK0cZ9)eNY5Jm5#>Z3HH&_%^)SD? zv4Qk_NrIAwcIHTNu~R@pMWZ@f{nFOo`*$>IlJFi9+RqyIbG)LIDzUx+?LZNTdL)SpzpxuW}wcp zXLoUxm#Vd=pJ}uA#=E>W&YJS33IFG<7uCU`vxY|7X}18K10Xz(V7J>w)@g@{{)S-2 zWmvygAlel1Pppq$CidjYu3lZ9QM0*j+$H)_HTI`QeJBK_RLdR zo0Mvg&5g@0Z{hBkFY4BJ7ZcDe3W`=miW|06^_;k+E0RdHI=y5rMVm1`US;#)`RLR{ zvt~6@eqeU(DY>1R(Xp0>w1piQ!^9*C^KqYu`%BMwIOmXa1W zIA&Gx9??jw3Mo&_WK?a~e;QN1`-9LRGFglbvV}OcJ7!K>PaOXkYZzAci*oP~Z-C%C z?;K3u!g0W|!5-sG!gdfix18u?&PbD2Apg?2jWaxF1|lZY6-2x2=VaL3-~25K!CO!O zzx#~z)*xehhriH0b4X(9BwA~sN%{9Kxk|1C9f_=8^?e)~9YoJH)W|{^VSSo|9eBkG zvfQbC{PkY7P^TUDGD64Y1B6!dhhKf=Bt7r-qdtv9Ow-kWs4ik+hWrLYFfrxwwLUej zyhlI}H6za(&_jM&(gM=L7E#B6?@!q8Pn2v7yhsLGL^ zA6GdK%#o)TzJI6458)QrXmRRMH_>n+*yt0YQEF3@mNw?RXDLWiRqDbc@$;hERP>~S zCd7$l(&Lt!%axTf(GrdEqBf`?IBGFO*pv?78xPmqn?>WY#ih$5p9Sz~75KJ+r+q8q z+6wF1isstN;K~78zhBUyG`l4r+FaHa4xHWqB=P9z&y1mXCL%PG4OYk%u$tv1Q1zMDJpYW0NgY+COPrB(^lPb9&D za7@60xwsy)S#RrP6X#VT?sT3UieBShIDN->Gs&Bcls=O$*rGk-MUA|f4^xUIwu+$& zMo``B_f}8TlA3JE(TCrzg!MuAwnbQl^|5?;DqW7j>ZCeqelJM({KI+;+YPOVq%`%P z&$R~|Km;)6_QgTB@m6cKsJh(a?f_&(q{$~Kk;=LI%>5$?IGWgt#Jpe(|IVEoRF1N0 z;LE$4i+Zd%cd-+S>E!3wROG-^QQ$wt3BK1M9Ojf0(1iYMr7e>50jEnT4vahUpH)zI zuE+CXjhQE7)d`)m^&teVIT#`goIDZp%nf9|KCw(M%$PW+7yix-UC%I@qv6K1_zO^k zVYTKx5k|bnc?~PCzbxM+-li(9x6d=S_EkypD1j|;Z*ATGB&k-n=%cS$&MGhMJBbJ6 zG`ivqo{w^sDTQ1GaEdi)r+sXe{srjU)v^s6ZZnxM0dlW&W$N6Gx_2tEyRW|wvhXG7 znR=7nHxkS$L?6$n;<7a+34s?^z9e5+PCMZbdLwqJ@DB5)x1W1w7rq+Pn>(n_qg2^c zRqb`WqB=81gU-Rb9lR0ib9w&$b3?8s*`Zgm8^y6JAvXtkhrj63ovRdui|})lY|o~B ze*<6UBbwZ`?%+BOVUfo&VPJU)*hKLC8O1QZwFBj7-+#c4qFsUkS z6CZ@`Ry1kTqz@HXI}dwR!QRd~X(~~gHmn2pY7E;}9y&2|SjcLR+;+unDC{71a0nzT zE2dB+>WVggfXXa;z0tk|x*j^WjTa9)3p~=p-+Z)n53!B1L3b&!VVBK2A@j{@Qn2Ot zg>~YQKHWgLB|}vJINv7ni(%0VP-j)5MdUL&{h{hny?E{|%d8_@fDE&tM3m?cHt^Md zVF2T*K9o}_7PCJ5;_ub>$&oLXL`(h|kMY*C8IW*9{rN)#-sB+3F^B{`>Mk0!mxVzd(-8B^ZylCQ`vY!OyH z#uaDkYBY!+HiT+pvB@POMiKI3SN9dsh3L_L1;yv3*b>K!e^~)W1R@9i`MAPl_A8lV zHAeS*u{TvoUow+7ziFp_14MhjqCMV+F|Ai z$qS^SLC8e=;a!996O^O&3tl{btwnI1PM=cNYEiZ);&u+qINWor@03hDrjmOccJ# z?8n!y8KbQ?LxcM56Q7x=ocloRUV#WI%_mw*DVZt{AMc+g<+wIIs=gw4M>6?ncIYdV z^3z2+&h(F-NCXn^C{EZ1St4D7D~mGXb6~zSL!Kaq*R(<1vYkI@|UsCZ5Gk3r~hZ+y)oAUZ=h5!KkBos>@o*_3UIzsLn#Rc!R2gu80 zC-BRmZp_dLC2E&rrUH${alQ`0wZs5FwBNzpRAU686cjJVx0W~w1yIKJ zwMQtyA=6~k5}}Q^Y^V!a@4B%7->v|(59B8J&I;HUA874-+XtgrQI*m2ivPV&H8AVi zB)4;uvygu!@OpowbR@h8#sbdk27RSV9a5sB6j0p5f0$aRUQTqK> zGv3jonAslE(FM5rfaP$RCMb(RH8z5OkPRBK0EY?7Pa#!D+!|yN3Ciz_TJ;dU+6)6& z$Q{j(na7DwBW0{@D%FV5&CJ(6#JLXzsn>J9mP#&8k$G%81mJ=?f-+%5EUn_5o6aZy!zMO@=_>K?LBgn!sV@NNg){E1#Y(xeSN1o&?tVmoZ z2jIFJKao}{4M}@RbPbTKq$+b%(9iITg;9u1v4TuNeq9z=-Yaa6gwlf<$Y>zot^`y6A~XnP#aEdVIcCq>(pFSwSb>=r z$?cPAOD58SJ+DDqgckP{oM9t3S}&y2Q9hg?3@~ zo+EXz*qD80DXf}J)CjLQj{k#!F@O6|`)yL+hZ!&;F{$U|z|8kUWzi^?X=Dz~Bi`o_ z-@0kySsT4Y38_$gXN+f`&vjxaOvUPmpd+*UjdA31m%ta7ptJUoI;~Fh1<}ub>4P`F zyVqmdM<=J(LvaFR0ttH4zBt(S65%ucRFVU}xMK2`+^Io#_jB@}^)O9!u;n>rViv`| zu;r>V+;!;6Wn-zFIT0b}M9EqUSc)4TUX6`JGiOKgcY0#AUj}>%?KbUMEK^h~W5-jyluMMG znqZk;?(bravmq3%)QGW_ zCVWg~-6;L4f{(0+?}6sF{?ege5r1@!i!UQv8%esK8%%07lki!1V<3~&tlnYul^yvgjdw~;T?uTm{Hb%da2&F;NEAC zzzczBW+QqdZVNI-D?G-(IHP=gxJh5JpC~ZjTb=HD z&<{r}J7q2~VZMX+VZ{i)?uzjQyp>H|mHG?3Azb%rIzxKaK~duTyBj=E@V_4V|GxP4 z#eb8)pB5R3%NG(yHUEPXKT*s~sZNFe%p?N2ynu~Jw-NgwD}@b+WW;a8FqMR5+7S0~ zo?Nz^iCJ?`mTXoBv2UHJc=MafP$t%l*y130Sx>4f{+fwhV_&ak(kbjBHFx2^-QfJj z0aOkUMqkhl`G$)kjAAq&4Rc3r89Ms|@naHpRy)c!by5WHYjYAgAF`SjUP47KIt#nj zVs$hV!*(TBZO+?o8AkM6Oa0fn1?hP+3z8AyU6oUHqWZDlYqa*CQ@88|ie^0QR+dZP zB>3FT9dcU~99+~^6gXmmA?GT-lg4)ug1&eGRG6A6j~N>qmoRX;>V!I;MRa?(Y6t5{ z1KsmVfMtDY|4uhG`t=MYatj-M^z#NdVqVwJ)B~iDEkBQ6hYq&ZPhrb#!Bba~HVa>q zyS zKfNM7WEdXDa_>K_yj(6mtUjET4XoC(T>$gj{8o1+i9jAawV7c$w8qv)$z1)0Vu=S{ zp?&XrV^vd(j(Lj?-KUO3kPDZ^U(`rl?*bVbM=BP*Q4d5ZlW}vk$((qeAttxTg$xQg z0wz9Ej_j4My*BSDC2nUkQTi_GBQN}gfB)rNu~J;qH)}{9EiR+JUAE;FaTy1)?G!>p zXnFZ-2dL;-<4H>Lv&q93o~1KXBZc4ZQq1}O+@A$|Y6*ZA4}R1R^2jLuS)qD(^(Ncj zjL3O)2Py%uV+)o498$`-n@b&_E?j0r)D$%hn(9a!Kk|kpTjo?FB#p`{OFzaRC>v|l zuy17nbIzt7n*n~*NhIViT$q0eNFjmV+uQCJ_Jb zpYs>iuUnX^E!DCzyNm;dYtu9J)Es^tCV%M!fPIVKZ5;VeZ~)f-U&iqNMU7x)X8(V~ z0CeMLtOtLh41@TG@I8>D*0RYIThN_Ph%z6+qUDtfaLkO6yxwBjZ3`f%51u{_UGA&> zFQ`ms9q_jTa7qMoonr8KLVf@R&(?#G>525Vwv3bJ!I9rGoldPH$FXNYBsCcxoP5um z`&y?OkE4O+oPh1$EGI@Xr+8RJ2#Br(p4o>57FqfiLHRW9r(Gw+AS|O#d?FuVOB??W z#DhO0Y+7NqR^n#3T*qf>Yz6NGpHj`1WqsBJ#`D`cLMNn-aAdOTZNI}U(TR4#6@%T=RGI)zjT47 z#k?JLPlhXc;@B29MYguU_X6}$Wc}#~^;N#L*#rGijt0r;xVkrP51;rg)B|Ms6ExLX zRzoMl0xSZ9hmfD}m$Ta29ZiJkcOEx?#Y5UBN2a1-F@a@>iI1dkYEEqVxqop3w?8)o zY^(ejcQQjN?(Ec@OnkSlQ*NvVN~4JwAYCTBIn33MzwO#@(28EP6{%L4Cruyljbf89 z(g@tp^nSBBcMtqe%CY}%lw;xepInl}sej5L1c3bDh&Du|vWPlDQ7En8xh}%Yd;%8L z+k5x1DfkXADa49{A(j365}#G6s4G>D+NH!nMvQE-4VT%7j7U$0g8F;QT=h}Kmy`F; z+J167o@seR9q; zQNr4m^|LYu23drrO+|LpQBPZ}4vavCeV50d2S+|5%;t5Bufu|tn~0*_L#6RAka@xZ zjbB$u=?gX0FZMyBCUD#KH-g(Npa|qi=zW$u9In0Rko}}|E^_${m3`8?A6#;n!w`Q> z=_3>-DU56Kls}@+O;ssO@}hkg?TvWj|Cap8j6A>?s*L6$RiBJZKQAjrdMYks7~+rg zMSr8bRk|n~mC#GSnVDpJswwxF>asc0Ym6f&n&Qv&Wqq@}ox8{%6KaGYWX&J>WvSYx zbo&?jm=L_Cx50hl!s;w17-;_5Co}m+;~kFi+g)Ls{(o9Nj{nW_F|%?0kHL@s@4**) zdX3Z~kNP>m3J72-vWM5d7uxa-ppDTJqJ!1ae+KdVn|y-!T}BrWujc}P^RnnJQC~R{ zDZ=nsK%-8O@QD*^Y6NPN(v9$oM$&zBQkxDiT*U@@qyp}lf((eQzM9i??lkl4Gm9Nf zVB}%n&UbBp^9fDS^aHNUW|lL4uJYc&S$J2=-IDD{P8Yf8rSe&uPdG!%c7U?f=~3Az z-d$831D#Ek0i8{x^6MxrtAc2;6+u-G6HyII>_w5{@er4$!;EWV z!l)j-UpY|@WX(hw+4ptQ9eRd%aSqH{;KMXT`Mk-0QCQ|4y>I`Mj-3A+9ho>eIGFw) z3JWs}*Z=sS_@;VkCP@&E^z?LkQTzah3-=@gW%c6Gn9Ws8{E?|{taYW zZhkXgXDR4BUco%ry4-^#^AR8DnMVll3D2)0SSO|f>zS!Zu%P}nBKAOy=V_Y>liV~LBPqJ8MaQ3P z{9h@_V++c9eb2a*S_k$D8MtXA2#6aaAEW^@GbkY&70ThWk$8hOz8IIdGJE9vYTepO zN99VDn^JngiYqvixKk2V!=Za3uj9J{8abM$@A2){-pWc0@e@bji{|x%e0c9(H9=WK zVFNEtQR~isy$YBTq>p0%#0btvrkeLy4N-?#Sp`}>bVi;xPu zkJRmb;or=SkV?dSu23kM{4rrLU%Dp?aZ~+z< z`+p9-L&9Ux>ED_S&rh0ZO*Cp$={9@IO|QG1a~Lih)9JXh+U?Z4XylUlKjnfKID)!A zpph^MxP1>TZ|V=oD5Mo~xdF$t(>XnkH}gj{W*W76Jxcn4S*_F#JAdEUt^hX8TeTIx z*Fp3KCx+dsh)^bke^nc-i>zx=C=oEs;jDyz$5Yv&jfbXLGdw8PCvgf#V`4?&>^t8i zK5P2+t+S+&%lT;fD4)+$oS;1b@6Ei^h^Ok7t_u$tPK!V1QBFy%ideN@MKfs#Qm187 z64kuPyW+E*UDkeO9ZfrP{0-YwxuTF5qq?=_lGCTlOUT0$E6ii+wPenWDHukM9*9vI zh8$)a_Dvcel%106Cihp-NisdN^xj|{MK_6rSA}eWVWn17jg+@4Xj0XtxlH*kc--qKQ@LhSg)oD3vTG7BId`n-(#bW)%k_(nwb!_b zwk281UYnZkiMA%FEod-rv=1LFmQf<4u(YtXFz=vhKn+Xh>Cb1^>-sC!!^50 z7O=tv#NQ2aR#U`LD^z_8`AMvtPD;B=+ZaM19C{tKu0uf8O&W`CGDx=1>=dd=%x_`{ zC0E3*;iKxKgFMYF<*yH7?Txn|Wm}Z4Ceyr8EtK?h{7w_O@^4tGj-VztQlh%837SQ|FAG{&*RUFlW!gP0iAplwXi zHJhPHHOoHY$To}9pgov`%{F7Tz%gXfO4X$1oZv}a51NL&$tJ`1L+T>UZoD`;Img~D ztBR_qtd6rZe92OAFX6P{T-c)3Lw?cn8+L<7*|FozoQ}BC)$6M^>^(rja(JMGKBLwb z7*u$Pd6fOIg)vlsAiUujyRvwy=VuwYW89*k0Pw*_i^Yn|1u_{2TzgS7u$7e0F?hbjQn( z=k(`(HvTq5HV!uNOQ!$aiaXW7gPd>VCC+LJRhgbd;gxYjbDyxgU;F~yS*&<$c&z7m z8kanI0+>6muHRkb0KA+WF!hK}+dt)FSQHhG+zJPM>%-HEN%HbSU1A`cpy;PnCk&A6 zkal8rJZ-O^msB1RAbEQn<1V>srO2KK4qpUETylg)Bo;#3Y+Q-kuYWgKn1t9bXT6>c zw-@8B9EyG2$ksj}tUP#{g>?~=mpRF9Es}qEnVb%dd3t>bjMHrLEc*P|%{hAPY{a`w zk&6L$Hw43kQyT3fr4`0ZHD+-)q0s&r9Gn}c<{3*=k6=?D65g{gQwQmDjb?oVzM=FF z%M{*)9i?e%fFg{1cw1TNIp}k^DNG4l zlq4?v<2w{n2#U7@Sb|dk7?dlz#B#uVM@S-ycl|eMEQ}Rg0=Fs7vsK8VkoXXkpMsVJ z&@dSm)moomZ&Q9ZI(ZDlg+$G~Byr;=w{5({3gapbqPeNXx6!moM-9TcDJi$vRf)hO zNG~Pz37Ol5P7<3#H7_~+R(VZ|Y8CYew{_~Jf^oH6I5ne+1UQW!)XHq?N)_eSC7G3$ z7=_wpsnqIWr{dhYczOjhXVL(9jnli=pzgBD2eP*sz)ZJ;K;8L8*dys%y`F1(v2jrBY=U)7X6bPyq;-LI5oRTsb-8v)Y9+@KoLatmg_?D< zb|IWvf_7yjfWjBUItP@jUCUk;(`UAUuiI8_owZ)Gt?W?gvDjf9Ry*jiu5m_#Jl-IC zsoJsVa|USExm5C5;%_z}P=sEBK8t@<1QhYBhq;*$6la~3v}f4Y6uQYeE@+==5|kde z1<5Z;adQAmRZ^@e zH8NPHTpzLsaLxVx0`LXTxmX4y)8pj zPJ3GxYsXcMsCPXKO2bo6LkrCZ1)vDV=LZDzITQy&;o-vsfMM~%gfd#1nhA1>YF1av zhKCHJK+5G)u?8QbATkLd*1+JBFON5@3uZ52?h}Kd62m4IU=#^fj4fTd`sh{6oG=6Q zc4j%;=m79m@kltcxXi@x>w-F#(3g8uCxTzaAVc!Wpp`wubVL_J`pMvzx^I~MB(H>+ z1E{ZoenojF7O$ax#iXvuv2zZt+48ee++t*|nbM~SDN0;wvsx8JE~;X{Q*gZ^>vmC% zvfnlHZ0+(KC*(`>bQD?k3k2;lPbd6*`P|+xGDbMB#_aNn?E+1<7FAD*#4ek!Zlgl`-bOU57{!P8Eq0L!WE6@#3|wUi{qHm zzF+Py4hQfbga~sp(S&O{A-gvsdvI(sQiU^Rfsqi6Gl!*(&B7V8b+2VJcH>TEGmz(Y zVG|aODdHci=@Y`^$f6BTU}9}E$E6J#c&78p{&dJI!F5=7;L&8_!f-VOXk&Of_~Z?M zzWqr!DdI_qe6YtGB*7hv<`{jD$zM`?YVn!{W}d&WHRj~a`PV!i$M$!6fq6QPy?A

N4)(q(q7s*eBX|xna0zewKeXRhF|^SaxO1*(>2BiH$;4 zBBvgLbkfpA;}E4=?5Ar(^w_1}41T-*#u)RtI4NXI9Fu1Gf3r4Yz{ttoB zw<3xovFzmmD$iM3t!ruN1{pH$mL)-S8wLG73glmZFQfH%*U5XJeLTPhy%9%V-_nJL&%_7pI~puxuE13t7*vkN4E|#Mb4n{8RuP-c}xYE8muWira>GEa!Dek ziX19($s(nZ9!hdaA9oNtH}MwLhYUxXD*+E(@a1Yt~ zMLDI(Gbi7o5;Q&8v;j%BI&@_YT=jA{@X6;}B(#dFA6YxNlzK$>vCbz^#3(~r{9XfT z4bckW0pS+tZGvMoOF1yilncwzu_}4hjCa@dGWUKV?^gPk;qSs0 z&ehHqxJL{}U)F`(o&IBq4@;-kHoilB>!8jV-Ce4WgEvhlxI=O4xXxwu4O|zAL$!{r zADhIalFQ_~d2ANiaS@l9^rV%F^>jM3iaqtDmWtJM2DQt!E+dv)^S?ckESf7?y(?Dt zKUK_?n-z7_+9}Ii_SbLksYLJnMEepw_cQ`8YoITp9W%nbg_PkNAlC%oU_1M%GfY!h z6xFnutU43P`p=zE6>(}g-(Yn0Nj`UEbag#O{ZfsvH3!Z-2^Fec6WcFk8#$TCpQFCf zU8zsgXe@UxlLjs`z<(VQ-A`RWUZ7U@)5}^cfhEm`jm?GyUPrs$0Mb0fz2K4(a=(qI z9xtZCKlo&nCwcC9pLaN6g~|gX-)4=~N`uXY+l66Ajou7W{rN_LI|R=pQY-1jZ+Fs; zdIBqnwK?}_f^&2pvT3W*#g}cagKW2HE?^G)v=|WDJxZ-^<04k&yMHLaHc&03b^v${ z=^J`fN94R`1LT|x5+2>%@~XY*{3@fdUP@-TJ+I@P?9bp*71qP|2dPB`=%JIaQSpXg=k*`N9WmKJ}i;k#h5jzt#o& zY6?p-#bw(Sang#l<=quoXEoksraSOEGNO4qKwL)4^gVHGE7}7lu#(JrM7w^<1Ge?& zXr?7OL^M2dXm-Z3RS_(5zBrEPaK3lGcK~=_ z_-d(TQyVy*D}3kMY+s-Zu+C+W>kOSU^aAgZ?kzUQ(BFh&jY@q|deusOyxYQJ)yzFK zr9N*>%{@lX;^+dZLkizUW>Y$$%Zz9{AneAGQ0N|)e&G;?L>oDS)(3Uw_h~=-&wE#BAA4JO+xM7-4Nv zRsW9EBL~zY(IjEIu;VjeUxGJf=~850i86)%sF$6MdO*dgO*@nAicZ%e_fOS`2xbx; zp!{Q$ePP&Kw;vH36A>*J5msHzuC9YaYH|$@L--( z+Yoz;5ia1H%V3>xLR`L&(lq4aSN{i@)Ln^*G>3FjgmcJBIN!KX4a-}r#fr{Q13 za?hIqO=(*)2rI}ylBg!+=Luq^WFK3Q_AGRwqzIG=K5f6-)tfzJQ>a<|5n->^m3(_oi0YL} z!)}A1CFIuW7eMk<{o2`cL=PS;9t^4Jx4tI4a`}M(a@^?eqdM@|UDhY6YFyE5O(?sc zKTx-XpCAYON$OSgs~)*bh55Cw96iuOgul}oI$e1^!HM?s)Iqu@$vJ8MIB=SVAsR;3BtVBsMkggtY z0yFSR=ZXybTiCA7y2BDB3dA5gSMSdB)-GXirsFre`G!ztA$mWqg{_OLP{9U@T;BPd zWgMu+2+y59fjxd1kA(uXqSybI0JtWajjvf0PcARrH1Cs>Xc{S$rOS@_i~l1?Wis zJt%%5Er9THB{vgeS2{+R`hrRR2s>XwyJP}JlOPpO z5FxyAMDHcLU8pVFNUqr`nKTW{`NI5oWG3(|@#^yaM&$uPnN*TU!7hw>1fU<<{qEJ2 zPD>vgh926E9jj#el(h=hVaRb22I2I5x*x$is%qFRJ=Dhvx(Qm@;0J9iSp$0NxOn{X zSbi)=nmFOj9dE}d_1NutC-Dt+Zbhd6QSUz*EBOtMFOnB~66lcZ9ieB;;YK=A+wKQ7 zc~rS^%qqFF7?skw9cy4ng{eJ0vSi;f0gDiBej!J->j1r+N2j?kys zz>Dw+H0)CiF0iG5M?KY)5?GV~%XBA{aFQ&j@cee!mbbrO-LBBGWZL&fd?{(!K@^Ek z0QRnc3{$9mh!Z@Vc{NO+f%yi*1|H~02^D4Mo6XzTZ-g~xN%e5`vP$Tzg}0nm4GcJH zBN(UJ5eUHGgrexDuNpKsaJ3CRbxd8_r{aWOZ_|=BWRvap5yb43O@IpC`yzZMe}}>N zj1i8o8Y~U2izI2stJy{J{5{_#<9Z-ksQPD;Wc=x`qF9%Zs>P{lT%Txsy*ljSAIM!R zvo5lde!gc&YEwcpRUeX5xi89kC0!StzjEdMW#fiCOIwmBk{BxTTF&V;l{HYx#T$c( z-z&~cPmrw`bIQ_AkK4|-{GIeK>*e$;-g%ykc!*J;ac`-QGG&;rhTK*BbPY;Ofn`^l(}wCGE}ZQbmMCsn*Je{)aEl}lOP*Hw`ZoNBufkQYSxQf< z^(K=VF)}%E^JDs^P`*WdJ^TF~0DS9q=^lBR{=1@}16|$ais3?$9wt|p=15|kzE?c) z%p>n_`oS57*UdY_@G9%3lx<%ptUj*3&%3FPylcf7()!uD#IymY`iAq$#QjR@>cY-^ zQnWLN*gk^4nniLuI}qNAS|4`eL`7@xOMs>Xz}YC{7`H;saymr4Bl0l4&ucKa_Wb>6 z5Xn1h+X9tFP(0@v)XV))b|RRbXTYLgNm@R7~-X zkvhzgbSFjU905NMZt%1bQEsE^V!{0B< zM^34`V)<^UpfAA8dYm<1CN(zZFDkWqraM~NE1aj!!ZfON>wVWWXn3z~i)Ff%)!Q`< z4(BoXn|AvW_y6<{T$dj1OVY+;@ zc`HTzw!GtINcb`{idW7$qH|$dN>&-I&V^PSo$4J1U*jW#Gw1N<^~~iW2k?m z)zCY%w^m{cY#6y^EDTDkC)u07l2~|>PUX+PQ%rJc^swn^4U^6jiHW3Zm;RO%=60?) zG}uZpbye?2$YUI!ZG`7(*qFSPK(Js-yL&0oK3ilvpf7;9-)Jq7Sx-XMDZit4N_~=Q zU&>dw`4=NhO}oRaf2%JIck05ft+~bzmx?=i%f^Knm(Wq%cyxSVPTo1%$J->jQ-X#v zH!z`OS}rRzP4}JHG*XFll;bTPbJ)x5PA2E$`%{=SgO;n5?7%%f|MhqJn};4keIDX0#BFeEU})BEX-A+9O<8B zc}A}yt^xFhed!F?%TC`)V4^Yy^jpB*zBHL8n>YKsdR{i&G@Upj;M`D~ zDFa-xj7$|4miEAzqq+4eSxCfvCeO}i*-GuBC2OT>ao&Ow7Jm;{!GDmMZ`CsgP^mC|@fYUopSW0Q2%j@`WRr|^@? zMI>38ceuVEsR(=wPwRs8BoahA@j9KSX#DOzyq@!Ra?;xbPJfN~t(t@RLKzweED8Ei z$jQp$JCiSuJs)+i}~m#8Bl99jbR95b8&bM;~nFDVbX-u4a14p1Tj-t z?F!dUv{q3TJh69kswnj{PofJP4 z_LanIKFjF4p!ren`C=v1d za~;zSdVYJS9ZZ4DgqTzc$Lt%9da_1q0{{FN>y$c-;hpCq_WQBmF99FNfEFGBbR)oq z@XPwKA&Vd@!m!<|9`SL&H3PLQZK4|0E_>6t7+3A{FLC^outJ%?zXb>lt|A`PD$Fev ziq-(v57ajv*IK99=_AZ86=_+xXFmK@{f)m^`4kglL)r@Q46FZjBf!4uCH5qYo-o)A z-nHPC3B#lsW)@;cL)mS=xzCgIk?s4&+dFT5&CItBrC=dLfjH#Pw3|$m9Z>yp`HImS z@%y4nFHjilFn3kM8}%-)S6lX3>Ov$4eD*27L;%7M>^*TLKIo+J*Pyn@FBy^L9zh`3 zP%pM)&=VdCSVbG+yTt&%&OMFy?9sN9{?Z)@cqUGbRAs=!vF$K^MfPV&X%!fLdzjnAhVdUrgpH}7MJf13_c$N3x z2TWZ*lJj&pf4vhe27_OaBlIO0N-QfdtzPlG!E9RA%!7TC zYr&sYM!z-6N2c^>Tgx~3XOhwxwIXeYxKQ&|t$wvcB;;n3=J%ufks`cpyz%pD%cB01 z%smOJ&S0k%m_%@8ik;%@;5$hXY`(2AV%AN0z+0kst95fbXYGxbOn z4`<<5-M?zub(<=s7mekz%jky+K%Co}`!;u!Hm#h1%E8xh_hxWoST{EwE=%Jv%tk>XUDc}JK3>q+qQLb{#W0{cX8^}Q>(hVc2#%vMb}&P6#b#9KtRc^g$@>8=`H6 zX9a+I6^jexQBe<{b*_^<&%i6{`WF#g&v(q!1Dm)3UD&rvg4%6@ugWO9Ry{sx_tF)V z`8ih(r_d_dH;(jd^9(9TpX#H5>R6txz=xB3uI2Y=myNExD`cfGdd#%a_~K6L!ffqn zWNSDR04VeF6b?Kw1n1MJZG$~U@jXonzQcF8O-Z}1<2cG~h^ujxGRfV>%z3*}Ka3jQ zVjE=w-z6jFNmkR1nGcsZ_==BC*q+^(y7Kofj@F@fkxK`VQTJ<-w^)ahBV)r?+uI7s zapWBsV;OGDGuk}uevRU6ojvDk(E%Qkfxp^ls!JFP?lwu2^0$As4ERfc3H1+ubkZLp zoOzOc9=Tm~2UqxfV{?~JU|YBnWcMwF?df*~>hqIpbAr<+yQo1D4u zd6vvpYDwO(_rCs}d;IK(C9PH&c{we=dC5P1GT8q5>+iGpX|>PQ9a@*Helz$R9DWnXG&Rk3@)Rv#!^&aa)KV*K%Xin*GZCB?gZcf4MvAS`Obdku~JG?_%=(HQFWZ+3Eg`I`q zSNakDuibJQSrP^YSa?G_M=+2|t0a^8jBOp1o=X(rEtotnFPiaXjy2B`-DdZ=0z@XF zT3wwQ@h*R9oq(@RUGRqd+ATooiL|G*4yk7Svbv0^@E#_;J>^~Ursf#XF4i0a(~4ie zGd=N+_Mm&v_HuBwYuC=IilrL8i{%`~d4FShhT`+|@=%*T=CyiTA8BX0Yl|41l9y~} z>cfF#+nc+RIttsHio3Er2hFbCGCKb?x)Iy@=~jcunjvsOXIOV-#5#n|daoCzkdSf{n(k)N`Bg2tW5tfpf7v&sKeDN@Zr zd*D&lA$8p*e@mF`*p=C}S|Vv+D`On8!UyE0oE_AvekpRuB-kKb3Fw<#kppa~Tn}~! z7u4f`6puf%u>R`_`X)pfEyCzy=`>ECOwTCKKN_^ywBVRYS#w6)T$`4XdD+c_TXDHK zD5S)0l6gAo_k%n$ zPpZ&VR-V?p31J#_#b%6d^aBU@Y*}9x5L<~a(_1x0-@(q8D$g@pE4YQKu2s7wNAAF5 z@agv3Lzw?osc;Pys!Q_X&2t4a0Vt{@Y6+Q#o+M7~9E;o4Obx41uVK{(pE490vM<^- z$i%hFIk1)0Za&>Z$FhHqHQC7bhlRRmOw)6~JWMh!0s$|$_a5x?BNxNEvfU}|MB2yy zUgyRymQMp&TsUoJekq-ydr6M`oy?5x7o~+ zG{17k`w%0`_1+gfo=MB}B+czya=*vO41AoCfzb!&<&HtnUyulMS6Wa+*`r#`d zZeq)Xown!uJY|YzZv#TL44Aw_hkE$+Q6sp+tG?rIhWgJypOin*Z|`}{kQ zOy}Apma>WUhRez?D>hWHtIU?fqKj}1@Q^DCrszwyFe=;m=G#x0z9;w}NZ!S`Z9g=A zMd|tB+s)gxU(l3!&asX1hdLG=5ouMyF4^p7VK@f>XWmBZeFXnH$!7rg$7j?t9a<^~ z7nU@$xn;S`2FmO-eceQ|lzfkJBVRJ^uZMS1h{f-~A9f!3!nT^9M)>2iW2n_V5XIpX z_{VXqmP3-a+3^$k+JZUdfW7NjuB=D)@WUJfhghs^s_+YLF;4L+ZUHkV1^djtuD)F~ zk7PUYeeKqsUwo&^Biwj#j^FK5s-?zx*QlqO7(#XMz{SnRVmdnLiI4^U*mzfA@0Rpi z{w#AQJ+BL|uV2KFX~1sdo;EaoI`)U_26uE2ix-xdM&=Cq3gpVhpy5R3JXu$w)IH_= zbJzw~YQlT+gX7Q1vX)#l<;=3 z$miPCNmltwsZ02E!IO^s^8uZLidpqd0rA=uHHo!rcO&20JX=N%#NBm3J_ob1a-_Xb(A-hlK1M$0-+ z{jvqUJ`+nX5ZAL0CazVI{9eW5`&y>5mga|L&yn%N+#wTgLIn8x;s{^-zPSGBo zU+FoRn*kvP`Fh5hA4IRMa}9Y5%t`Hga&LU8%ZQ4^A8fPotRD_>d$iB(L0=ox_1qv6 zbc{>(H_qIHY@N{D2kx(ev?x>GX^8J;_#fx>O|p_lyqQDJx)^J8?YgB?7GG5xU#_?o z^;OJK9dt#qFLi?(saHFucSP1pEM_OLPjo$LY@}01qKj9V5s14ZkRDm3Yp3Q$x~|>) zEMlCWzoL8E+nT)|{e<}8UPrbdY~YfY>PtkpC(3Ws>vg97eU-eZE7C5^y!R)kqpt+4 z?G-K`y-X!OMi#7|!A@F+4Z02t0DW|__CATwV(8}DfzN`EO$feOF{vSze9R*Q+ldXt z{o$80eM$$-WBcZ?c57Ar1<4a~K|osHqW~IU9w`)SVY?V%??Yr43gphs%V@B|`S33wSj;#B!W`A#1)| zd74jJrVce zSK2~>bf~UK9E5tM>Wa|&%H9#CctIPSdf0cLmrjl1)7ndcE$!jc(Vopqa}qjPLUdmE zFtBsqaPt>&p6z=uS{qtAzbeL0rzN2;&D;={= zRzKRZCfDMc=7P|rqzcJZ7}u1qQw?bs+jkuejIGF|4y~dV^#V=ltGK;;UGi_MNTz*G zL;7kPqn?-Ge94>p6@wkA-IrY^?~OY|9G*$4392R`gVm;5}4h} zi6h-k-3xX2yTkEPV0eFtTJJBPde2K+)-qGd{dV77#gR#r@FH7P40K{ns)tk}%maH~ zU-|RYTF~80tz*%yjxZ1y@XpA@K$rCIv5Ph6ZgXu`{)U`s2pN8A?#rH({qmQ)Z)-+g z!5eLJaWu;(+FhWfd1U^LWEz|7b%DI50X;Ubb5i$Iyi=fK@nE#_1EK@$Ba~wDp zJO+ww6;}FOC)rp6oU?|ZsujU9V*y9?CLtxjGVAEv_Z0!^Atke1OdPV%5bc1d&2M+Wbx4lx6$t zA=$nOaWAa7MfbSAC{davcp6DjkemUOVLdE*_afAh$fVV{?RvYa0sk|b{$|RMcKDsi zqd=SO={gaod_NgAS$Bns?W#V;$C+8}nzb3%AtO?L0327;H-LwAXEs z8*F{^0kLW3zEqsQvJaa<3QpE1yBJAlhD_+S3IdbSuvM4CBs{0V3?T5+9yHdbnDj=kRIOLsk0VOSJX- za3n<^>1O*cCX!6wr+?GbZpD<49Sxaxq_c~LLc0}NRRwp?XgeR z^rsiG+|x>=GoZT@QVr8~g(;7(Vp=oSXC+#6N5MuIUqYYtYI3mcx$O%fQ3~0IT-i9A zZg-S?8~?n)(v$#( zfEOB_yKS%5{?`c%=ZgTP&3~upAA!xoq-~o!3-hHW+Eud6A(u5q3m%QDO%_eSlP9vz zYCfJm*TIU9Q`gL~mhb5h!&91^$;kQAB;6jLqpP>&`LE{Xtp-%qoDIwA6x*r`-%k?J z#ji`-P30|@j|JCN7&VS9qtP!KW;eYBae8H6Vys*E1YYndDU2vfR3Rh3Jsz_V<58NPLQ@|$JEK9D2>v8a zA79yYdFaM`2g+h>t{(0YYY8J&AN=#M9{_g{m$8958hT{AhmMxJ3=QaZxE(uVgttP) zu%wZbjwxGct$ns?A=Mrw3<#5JZ;aj2q{?mYGzKKOz&U+{`@sAtptcyka;~eN#+FT6 zBeS2{zZYT}`htIVjk;w&@6J$d7_?>p{N0!RlaLU@)h*Ogj;rkgc%7IgVLo)|J?zR_ z!_{ysF9M>hbqgcOX=VWnrdA9%Hf^&!=+%2VuemDy#rmG3E8?upT~oYTlNsknx*bra zr4vu}F=$_TdqrKoTCz6`PGzn)AdWmot%UDTZ@%>#@oGuq3E}=L{T*1GwJl#?%k)dj zB~jE-Ur(FuPpcSrzt=$1{pndc{BMx^>woV3UgLpc4F{1^Y}o8=eyQ7r@&R>=7ygiUG@4}hn(eweY-7Jr&oW+t0p^!_5SfB?Ixvx0*^`is1*N>_&eFD4Ut+ zrWd{L@0Eto6ixjMvv+T(4KYHay&qS5cj`SKJm2lUS+yH}R?&tc$M%&04DV{^Xxl?X z=BXF=x-^lki5^;5OQ@?;WFxlk=v$E|$q`MAT0rW3{gBt&F|r1o&>gO6hZhF4$twd? zqn#1k!M=}sV^+rbh_#RQsQgY01aI&gpUadb>9Sns>Jtr`rJX*dhDFCf>qo|87-BHp zH9O2xjrEY(Ks~!&JSfYO z#=ooOfVYNh7aYP!HzXj_eM39N8*upvLucHH@@uy;;l(K#ZXE&$Zat?ft`bv^c?VX+ zf!($5H6LY=bcJ=LeYKg>xfRAvuoc`n$oV9&`SU4!9q%caGwI9_>5A8^@!C3T0$_w9qGrTz!tq*+5U8IE%dpShnQO69}*Z#N^ z!OVUKOI&i$9`zhzf^Y@pAb*5+q_G^*wtn?f6~%?~NOH^U11`#j@j!pn z|NMi}cV_t#JAqZKZHliP`>6Q{kG&XAj1 z_t~9J*lPVoPE>gX_~WjeNO1*H3wxcW_+)QxtRapj)^!L>Pk7^t+sdU%J%Qv;s3hnJ zmLZzu5UQU`)@7{-g5L0doov_@w+f>NRh{VeWCJ{XU=C+L5mq&O*pGZ}CfpML@?Ez? zh!3Psywg3t70-}&GJXF3c&EICu7xXS7=*FUvI}b;>>T#dGA>lduX-SGLSD*JTK}_N z9XU9~NsoTOS2k6&65{8u^5OpoUVBL(RRfIq*@V9B7M{XC`c64`4M%h6-Ly)x{Z{Ks<89BvR$C#gCA+J;-_qu!m4oT)%-`^? zZi1mc$oBr(B%>!9G0f~3ryJ3_Dl1c$W&AP436U%bkC&`12EAmCszHljMaQ6fsL9xL zw9&YrE)Nv*m9f{Mau-|BZ~fcvo$k^cub8Lz>&tku#|dNdj!ysmUq)_q=i%giw6mF# z97~e^@3%iC-VsnX~)1;Ar`CjCWos)Zn9ff1&} z`eAi*J+*Cyh2fw4T#jrWw5xWCMkMoMj0NydF`x~3s?mf5f&$jx>^X3h*?cwl(=>m$8sF$A1@V^UE{w8K{FN)HFBK zNWTbPj;cW%)T}-yD$-1)2L7#yF6A~txjD5h>=oQ3XLt(~^ z?P^-ex7N@)EKVUltp1pU+Qbcc&N8LXt4Q6YQ5lI#MKlpdjPpjqLx`mX@Kq<~TYai^ z9ErB)Rd@yCTDzPVhPe@KtXwWHgc*AhVM>W3-ypS9q1B(|(^j4&=v)~oPT86F)i zamh-Wb#_*4gh7aAlIBi|h_6PGYUUYmXP95f0JxeM^i(b65e&s@b?^a=&8v;MZXAfZ zW9y<}i!C~9h>~GR{*^NcxMz07oUsk)BI$-R_7tX`v~@E6k*lR5;!NiXEX7M9aZwwH z(HxT8w1bN14ap*Xay$p)waQUO+%~duB)cN#>SRk%9HsV5t90NLYoQz`3M@%frBzlX zS`Fq>f0(cUvN|!LqDkOgno0AbOG1CSFaaDkx%-;jGhSB~AM|#wf=G=wUwUjltZUW; z;m`bqTZ{~e#BvH^%jG%RXK0U{WN%*!r|;a-5Byo5#39OuzaZAb+~D48rRrGKjFKm)DtiRiA-(HA?*767IV_l&Hn) z?4{#X2`|b|D%L)-R|D}S#(%HE5{cTM_TPu73Mw+zntq{*{t2p3m12Q; zXfWBgxc%iGkaDg-Plu3v{A%zKLXL(u(;IDJZvJQ6t{~aQT6qa~a4P)9MG0vu5J6jr z13luRgJs~R7v>k~QxV*PsccJ(>ZJJ}kVq8^By}Q6>;_4FA)+veIo0&VKQ=I-6w9-l3t}r$DC6)ykA>i9f!}sdPAN; zVUDPpAsk}9xK6EdmulH=3}sff6JjeLtfGzARypq!F6O^9{Zw;d_fbYU&2e{2bVS$w z^gjRb8JG#OUD(Yu!!dj>?w6-T9R5UBQ?t5jI@>~Frp^2cEg%rH{=`)Z#Fz#CJcsQ? z$Z~FLTRGH&aWWc-531U->U7rkH#0o_(Y)xK&N z{_cR+-FqypE(Ivo+DP-@tn-^|kqiP`k9?>FuD!ENzF6$Dyo9!sB5*hMbI+?}*@Ms` z4Rdi+HNPZ{F8;7i(sE3<>k}FdvN%}Foak)=D*7K+D z?fUtZSih&Ns1Jr7T-&ub&pI|zhg$69+DIg{Fq)KPSy;~k{?RckHe7t2-qQHk=d1CsRb%4bzaoB)wgT;%>A?xQHd8>$p=*K9Rd7q$s6|r` zzXDr_nv2h|Q|a~!#NH%*mmU^habeqS0Em?*>Ev3x%7Y#Zr#a6KS8+L{8ZTtguLRR5N7Y4F{U86zqkqEp{=I zbJB~EDIBWM1~8Rdf);+}JV^gJGeRFB3?&@GV1bhrIJ&u-rQwFo4A2eIRhAdaQ9OpR zji(9yzf=&_5&Q>WxNK9LP|{f7KTu+S{)b{9jvcs&7$POYe~1&+M%Yg49uom4H_z#p=kpEB?k;7g8 zRz>N3DfnDe8XQ@yhFoc~39cnZ$9s+r4X52MN$9?m8|%JsItspMAgTET2PP6{-y#xu z%_BN=EksanBis`?L!|}mOV8p;C^!B&wwvZ!GrGKgZWLb4Xv*1`VWTlOiTv(>JDfJb zu5hn{!R%JXV9J9QNh>AU+@@D`2OybRW_a>{Y< z{+O>b{k$vDt zh3}@pDBuQi=qNxTA1Xj@ES$_(513H?{S^p4_h(_>JE*PgF{7*F;=1xt61Ozwk7cu$ zmLq|p=7<%piOv{yFj$z@A|cuW9Lt`s!#?{HU*^3806uyVrE8vWXFxoA!gwILPeu5U zRdKzOen*Qyl>30*CHX8PP7$7CiZ}FeWlE@vx#r{}Xs%hLtp|ma%~wgu3yPnITsZgh zVO|g;w%*K3x6NO(3Cy;J|J=|kuz+X9N7f5%?&sb9>h9fj^Rh+Zsaa6?$7iqXIO0`$wzrSglvF&SX8*Ve{ENiaqc?_^Ts5?Q^{o~6k6=x1_OH-BqA!Y zj_ZKMjg5m04jO&n^*Z8IxCy5WlgQlpAZ@HrublxJp*RmNRS6*;3O_Bb|K?< zY?r^dkZ7h?&45;RzaN#`871QaJ{~tGjRm#%t%tbdo07QFCY8CE1B=<(RdS3ObaKva zX9m#PZzx&f!jrYoAPb}QI(S$_eoa*0gS}#TVn5=_@Z=4vj7^5{|EpHjy1*xoF1W~U zhFf9O(6GamT0M%!m?}n3&0c^dLDT4L$i2@aAA1K0IdGC^V+^cmr-CVN#WNrwf;9m8 z7!EV6lYcP5c&da!gNU!gS%iKE?HZt>S5+!I;8E?}S`7*i*fQLbF5VspxvJ)inw6j+U?0%CZ}=;iPSL#1St z*L;oARuSf2d_Q5HT$P$VovlsuIXGe<;b4R@Jzo=(K_2@Z`i7$;N5T6JcgAm!>81JE ztfRq0kRR0<4EEdA@Mb!Q(%S>Vcr-9EWRBFvcLL{Z{=$PslLoH?K`hREU(>v%)n2=a z<8Wg}X6vf?&iJj>rsR7WP%eWFetr6d6B01SpBplVkqrM6X@V@)A<<5`@e`LzYk*~c zM}I~>46?`3GEC_2|B~4{V`FjHXj=kSd+XgbO5ZW*WAE@et_+(Ht8JZ1SM9(|eQX%l z%i~-<5;nzZQuShHExJr`Qu1$Y|NA^XSrGMZ7f)cNRHWxH=jtI;36xoDK=l8D$tAYO zCs%NpnLE=m$rLcLS4)GFEF|R^hUFq=pB{Qb=AruckkV-e6CPM@%z@nv?M+9`<13Do zq~WHDD8%sod-S(MKzJ>-cC8!|8PJt zF*5$od#xvhsr?zk9qMvA`taFCc9T~SgxP${f`9S`L!S=?Km&;K90F=2kPuY>+rKW~ z@K_zfc99$e19tIHTq`8go0`ZX7og}utt=~=@}}J-DtLK|eFcs(Q@OiLF59OPru;4kNL%@vd~YUC_;$5Y5li5zukpl4f9xubu0CxzCREvCS6)4L-xCi`~zep>#i*)JHO zL_JZ%2T5MfyxEs@7|CDc@yJ+Xw@WuLM4iJGG)B@_fc0Vu5$YJxKd?N-MkEQcUt-! zp#tiQD>9XMd4}Zs)uU-4%9AlUCZ(`()Nt%SO_vGTyQDYK*cNJAtC&(pfK2>}W7+py z<`^cEuqi+*PaQ8lVm$QOG|0|qaT>+ydQbTyz-Kejawgt%XWC1 z8@x}N=->H@x=a{^H%162M)eDXnFndKkEc-<+ z7r0vpl~b;jA2s*k(@ul$VEiMo9z}$JMa6sze@nO!vbXweq;}}wMXUC9sSIl zwaw_$t2`l|mGEI)a#-GK>7qy#V63(xi-U5skI2$%u0h~*0Qu60LqtD3SErym4?fE5 zSP~I)6dQ@Xn@f@Sa!VtOmw41qeWSUq$gKy@1~a6-KF=~ik_E^fFuD;r9FZ>Rc5amh z5BClA1>hP+tBRMCWrd?VW^_VroUEz0s7i8C=4+SAl@Ls#D^>J4@^GGTQLiXk))^W# z5|kJS*0|Rwgj1812&i;bdAczsd+Wq zik++J>P5@Os3MDbs2onzR{?76LBiKvq}QFL zOG^6mdEh9BRtrZ+;Ujaeb{^k%sJ8Hn%J;#f*SM#dEotb3uG17_H?|Vag;c zdr)b-!C0OQaRr=#dh*D8(8s*!W1}j`YtF{7y(_g zIJQzwt(X&ghb-Az)4yybp<7XDcNZH{)~1ncrKMYOY4;u*GPw0|E_aA|3Q*T$RULm+ z?h0s5WF9MD%2>5PR~}R~L_kD@yqey^fCF6~B1KR0*ptXpMv4W&C$elMdtVRcWVJ9c(&tviM7Mr^k` z(Gk>q%GnXweAe0#;Ckxb5$<}2w^@vS9OMzJTakS2!`BV*f`Gp${qh_Cz{o2@{#x?U z(C*Pd@6pH?Zd(BEP#LE;7iVw>r$-TIf)QuT0cQ#_Ba~DfV4@y{svh=7J(5*D+(kVa zb~#jbIf8Z>V6z;ByZkZDY$Ff9{3<{4GG>k6^vF2G^8-Va&Zo*HnIC+P-#W1HU%+Sl4NTzqa&P|8enydm64T zfLEM{oQE$9K|W%6NAlX(oe0XqqUk4&8IW$3X!HO?<#XK8Ay`Be3}z5eUW< z)b$(TACUxTxH3^eH!UJnFV9Ps_LK%99g#>uDAEj(SU-RRkse7TPXdXONY*%1CYH2L zG-?>tok%YO9eu#0Qx`v{byZ#)b!hrz!!K zO0;FNE+upe`LFYSX-d%F?`R4ALq6d=fG>aX9;`99X+8>APiJA{< zQ!qP~+9=_E$jO=yf1T6Ek_a#_NiQ*S@#iZPb}r$ojCTgYEtxqtOfDF3DT^P|;1)Vr zr$jdHuuY0ByJ1@(TPMgi%&?6NE*oc-#JiMD&V6#p4V__lt3n)0WL7FW=fKVOIQz@Z zDsssT9do$HvcJUegDDWa#L|N)GSKE0Hbf-NL1{{so3mEtHa0{p&VjE=q?oc-Wt38C`s0XY(YJaa&r&sZu~MJnHUG-obB z(u^X!jxxlNGI~;pFEjtn`CrwHOPdV(36xGDwsXAgj82>Q(+S*05ybs;R`b&_3U3|y zxwq#GUrqA4u;&V2o!Yt4x8SRG>0B8qcL+sF{@mqle6wciLiVk9v#I(V_ic5v(at(c zw$_5J&vX?h-EIn#{;t<8J$Z1bBahg5ktQwAX(^6=Lo3N&)> zY+xOeL4_;_It!w;3`u>MVTySZS#W09!ILZwI@8VjKgsQ0ve@txlFw<9bQC&Er5ED( z!2uaAUu&k87S4(66dAgn>@;TWSz`yv_=!SUxMapw?ZtfuPN$@?bgwG?Ne5Ae0*d#`OiRbANI;BA7oHQ2ksZ3eb2 z*gIlvO;wrL2V(7Jmx-R2y6xzfk)9`;ZEnfiNIGTGjuvzqg)K00yT)=mDsp?yliPC{ zBW4`o^_(G2oY7N`eA#<A!wO6FwH7!us(^){=S;)*;P|aD`)hinBI866AlJ7X&=Q#Q&MyMc0 z1R(~%03!+!BTNw^5}yIwh!O7FJcE2g{288o&Fs@t{S4c+2mc->nG!+y4E?P|^flr# z)h9DGU^~>OJ2c=!(+pvNR9n|NcHCZpgxCc>&iR*K1_F_A!NnI!Y4-XtxJcy2*EHTQ62&JsAT0=YPOY0`LFgu@cYq|7?Px`J@A&z=tt`Q7uwXQkTJpAC_VniKVL~WCd$wkWGDl_w0cQ+Rk^jZJA zhS{J73vvZ?`GBFi&0?a41`V|ShC0F7q`x{3v?*i-owV^oO1unFwEAz)_@KIGb?-&t z2-LlPH%37jl=zqsM2uiX3_vVKl-HfCQ{hX}OH}K+*P6BgFkIsq)QJJTUh&6IYRh~$ zOTr&P>Y*>{5kxe-zfg!Va!W!O=0&{&bAGZJQnMLxvl(DF=|imMfUM>sujUc25<|V+ zP{QpdbNC4#12~+8c?@T8v-4r}wmG79mpFpA2q1lX^=?={qxkpio}oYgsT2^yde30n z<-;>EfamWF^3V(*oe$vQ^cZAxCqILK^^3?17|RTi$n>Fj8T)`5Rt1l|6Qk6lql_s6 z64e7x)g%9?Lu04qL8kRY*>gzWKD_RF?!M94-MTxdJ$#!liyK#l{t#G_VP2O%8VD>q`n&+1Uo9X zj+s%SN)I+N;%N}pJ^1s~lK@L!n`>3demDa=ui0Cvhj+Co(Vld@zE+p5{_x|M9~q6+W_h_vi)I~L|OQS7= zo=u?b(tu6OA=JWzvgV?3YW6#6LYKeCq&eiI$o_?7g!JWp zyy@V0k;S4pWI;X7Iqr~Y(BP_&!h%HcQKocG$0MJ7ZhTxVmWK#g`w?kEWx(d)dOA=f z6V&~8S3$gfUnP$en_|Q!kq}a?)c#te$f=Y!} z7IR|6BWdn7En?NiHl2F|by`jc|HSx11V4Fbi@qn8VObt4bV`87=W}+~4r3oJp9d=X zk5_kp<_sS4znGJ9qiGi`V)pikN5OVU^HC!C$Mnliju2*;HhIRJNC#|SykW5xq!O^r1|q$?ca7hECbNC4gMKj+FBbNGq-!v9X4!`vz{ap`a^CT9V_X~WePV%rc+uZQP7wim8+u8t0s%!7;Uk3= zuwUp8q<(+)=hOe;{kli`c~MAfxpew9MQ1T;Kb-}|3WLw(+*52F< z6EXBQl$KKl`j&d6smLRt*#ARyUJ5!`*b!8>*J79v9fsIq2v?+)-erP$7zLX3Rq4Bh zig*3zYL?SgQ$|mxV8H7-aW)6x;PK-s=m1;;5D<~bnbQ;vWmQpQXx8)h!xZh}*I!m5 z_`Il&={Ef0x5qay-l^LnlY`W_W|{H^SM?2JsT7Sy{pq$gbE>>|(wr@zp!=syK*)s6 zNkk|@nKHxEZ8_LxYu&%xQR+2PYz|WmM}M+4Y^Jg7fxnh;b@-M)tR|s+p**2~aw(EV zE7U{$7Ib&}C5^_`P$evzAo>Zwo*%`cC{|~!i`DGtIOKq4nv=xq??w%Ql8Te8D8}~0 zS_%AFU3L7ZPMCgAHp4{KKO-`k$wl54m0_7VmtxBls?|~Rh=1G8*B(s173iXkJ}p&mo|d zfS@O5V!yMGKNb4-zZw&iTsc7B#@~w>ZS3POJLFENu+NR=$P4Bi(K8U}1VwdK6=_A+ z4i>>oKyPExbVB}nF!~u2f)_;x$rKqMKsb+V7h-TuTbBY4la-dt4H?#$;*_U)F>!6L zp2`L<%hSJ8#SFx&L$C{$9>%7rg4UXxAZI3xM3?7|9p=-0LI3|Sc22>W0BsfyCdtGT z+qP}nwrx9^Boo{IV%tt8wr$(?m!1D^w`yx^ue$23zUjW`>hANN=lH6aNtI~S9lc61 zYO$UW0Zt`S83G^vCiTau%Pq`?oiYoq7SlylpQ*Uxa!U$Pqk_ui+f6T}yZRNENUf~s z&pU)bE7f2;WzmnZIZR_UtNdMXp!#DObS_Md?3A|)!dBh?m*Mb?E+)QWw*x{bdcp@8 zi8UaHJmDTNQ4(?$GH*;2)AswIg-cs+9iFvUu5x|8JGO~{)97%M+|iXJ$m)CPC%2}} zouxlr9)zA9{Vi#tJ=hWZC?x5xCA@15%soK08iLhZ#!}mjw30BQ$vPO4N1~ow ztPWuJ`fdWdY%nkI6M2^5nvf|hU^e(*BVLd@IB{)%y#d%!ZcDKrwm~3SDZP%^k&`#4@}f*kG}c@uN{( zt0G3qSjts{gEaA=+7*x-s=BJZ(J-hG@<}JFSl4nJ+IGL9oZcu-jpJ*X?fm#L zAO|bQZ}`x%s0_Wk4%mS~Wmn3D>-Y@%!+pK3N}!F8nhQSEJz!AhK$ZmrVcxY39uoW+ zg3=}qcOeC~^Sk9BAaR|1H1){A=l#cq0kCD*W#HP`Oz>G|^$OLtIo?4u5C|v#RFWpm zLC!6H>*|EXoS9SGuCF?zf~;`C+k}%If#Di}1w&nKi$yu~>l|s3Uq#Xyx&NR*(LN-% zGLF>3G;C#`fdJ2*Bh;(wHk|J?n_$ao&NA_HBKbzJW?76;{MHHC+@g*u2PtW0-%NNF zI|K{@)GORfm5%0}yhwoZPfcp8AyTofGw#_xa-UjU*&pcy!W==Q%z?^@NGnQmSAHvq zf8kR6d*!;+PBAHU6to-9e>otv^%@w@pj$M?{boz)Q>bOLvyqZ)Zw~OcfJA6T!sgE(Wl zn+lr>gnqq#%r4)ES4me~m~dvra|u{0uhG2RiRKg{^aMC~I1}(MZ3Re}e-161XvW2h zpG|r6Yn&XaZd5fg@qPTo#{k^;jHTO|GieqbaXFdi8uLm9BRum10bWP*1JGwP^_mq9 zkB@h<_K9ffB&DG~Ju57)vh?4!-sao_@s|Qy8&`f$-7oll`@p+knd{!~2Mt4Z*B1_i z?|uIj6(T>!em|9^`iB}3mg~!+KTZA;g+JuSwb@bmp!$u8fhMeBH zcJnk(&))7HfD&g92})HIH#6&3d}}Ob(u`uUY(oC}&D+&gPx)u>wJ}$3S5x0AAR=gV z`%Vt?7f#APVs9^(^N~$RWtNu9`+S&A?YFiAG?uUooD|aOj6}5OM(bZl7>Aq_ms~)Nn+MId zr0O#+YzxGWfn}0Z>ms?w%cJPgseRnC$hN`hnV`)q-fptzD?KJ#WlNH-dZa}MBRmR} zi0TE902Na;iXd2vN3PM`!*D#7Pt46Utj{C<@F2&;B>uE?Bq@HKpNj*oJU1z+@XVDM z{liR#k!O>-dm&R^8T;#C=UAYX)1yJv%hP34rZLKFjje4vNoq_)1Soma@#aWb|LXQN z$H8ck57xc%mt#S>X^ew`dJJW({4fG=c6M5~gK-NP>oFwBx(831S7rV!=d(1z?v%UN z`H^$=u;RCx_Q1tIvO{pk#Xda*JkB^y zf5401_Q?t$9NYnEm0QuLn5<}>?<-#sCy;?U4MR@-D}lK{OP+kg*{*%eI_u4i6Y-cP zf-lk-H$@tdn4X6A8%fbLPJRIKq)*1t7#~Mt(nV}9dIQAia-th*7J<$Dw`VnxzjCG6 zhqQPRlDW9h((-PLcD|)wi)2iAP5P4cfXUCHs@9#%qfr~Jh%_79Y!?+fvC^IqD`vMM zE;%R}*r$0E5>WmO+&$dksT&>~tIdv?`(~{YppHIuGufzcjD+z3&?KiYZqjj(ZPV{7 z?0q~1eDAF@JRWKRa)N`~BBMF`hdEFE3r;#+v92ol3i*jyrQCE<#$-RCNT()+EfK0~ z2QxF({*ZjKBsogb5-Bp}9K$f+C?`LAc_Yu$g_N3vb{oerKI|ohMBd30Bl>#;f9R4;K{^wtj zA6fRh`BN^T2b$=pyV24MsATLUG!jv$B1EB(YFqF))xDUHW)7wAR*oG^~de-2D+o=ZVTmS~4z_oWuYqb?2da z$uo6{MO2PWyIzUNsWke4aQYg&ftr>R{pxROuam0QTmgjcv!Ab>Jh&&h%~9C4Y1}Tc zQ@Ruusg$WdKXr^KAryCn2g_?k@Op+ozh|d9jz-pEY+AwdY;H~_$ZPxaRh@HOe# z8sWN(74B1)O!>GA0&2L)DJFAz4iAT<9^Jj%-l&CQgrk=Qfccyr3(V!tnbH2HTJ40d zIu^0VI8OdaN>tjo>Mi+%%o!#2rG$#7@l~~vV%A8>liv_Dz^~@UnqjioM6K8+{RNV| z-6RNTUjxN$-gF=r35eDVaMfi2Tf6*YE^gIKc^c+kNHIA!dz6KdlYD0SH?H3hJ)Vlg z&~3D1A<$s4Q^_yF{V;X)Db8n;&hrFL7(Vle*E_@vXqIoMDk;GvVew z@1Xl~vSUalQyV3<-|ha*fuY$gFAr#bvA?=|FF4bJQKEjcN?+}ncQebam=Wdx z1dqv=(ZnppVbt$;B7*Uu!$k-w8=yWO&>O`_MUW;X9#M-pTC^<4g=M*1Sp&cH&`J#4 zl0)}Gns~531SonLE#pRB5(xfyX8&NAaIwE*20_Gt|0qAKbuNKWb1^XTHY71A!C5&U zTkNFBnw?a2Ho>mTOM}l8EGSS{EJFt?JH4MmK4Qu#nGyFDWj#8ouC+HoPWcQa0Z){voSo?PakdPo5!BVzis`8caHM6K#nR?hTw`(uPSWFcGVVM1@#<`t_8y_4kBqOD z!nZL{Q|!xiVGQ8PA3mwWgsIYktU}>(nq^feYx1Iu8)dyB)PuXpmKE&ol~e#2 z{{4L#2M&|kK=o`*@f%K4has}|(P!?L!5o+}&h|1wl~xx(8+JWG3D;^7YZ8|vU6 z3V_&3Fytd=bzGn`O8<)&G1Ay?v@{K+belYWO9c2ytXZ4r3R66+mN~TOSU>=4GH-#r zCyFffo)92R=1{%b9>kU%tw|!mE}Jkmr>0qh&0lu=?Fk*9dK_HZ#Je+q!iz{X((EnV zOtkk$e7bem*5dDX%Zg?qndNB=E@-ll!%sP0tor5Eb7@x{+4m~-WE@U+ThFH+v^%xZ z@7KlEbYKfG*5)-KrZn_va`+(bsU&^A-%O(Q+k2{{so}aDsF(ZgypoD%F+;E4@-UYV z<*>UgSyPEzPP^reaNG%W@Pqc=a>kZ9Fa{?HBnd zy-bERIf}+DqR8ar)fGhsEcRhWa6*Wc)u-o^8v!KQeL@Y(v`XVFqSr1p69Rbz-g;6Jv>S zXP7|Kvg}K&TCkWj(SP@6>Vi^>5?Kqw*B3ZcP#aHi`bOw1i6z|VVq$JTZYzUi^M}t) zhW}#A&xo^eiOY&C8ZBXXT9%+UqJ{2&USM^j8nqbrMRBOaA$!aOPPd+wKol>}ZOL@u zZ2xsC%~AE%V~LvXWY5v-d}9IyCHEg!Z{-nSpS7L5GQ0|s=W|q3lR_n3B?ij z$HsfA|H>?>06TD&SJQLLVb}gfDO`9FuFYZ(SdIpZocovra~%G~RI$aU&SJv0QnkEt zV7d@B+;Qwz;-UW@0nyIkGLfy$-}txY+r9s4cOK#-U_A9a1a{?H!l!wJ-7V+N<>rpX z{j<$qcck_Z8;YkMWusjR_khpyauDzcUZ(%<8W(z32G=wol<8X`Swvzqt{=#k4Ncw%c+3sgAThw}}73etoF z7`3NkU)0jQ(;sZ*I%Zj@Ts_%1j=tye%q|+-o#YSfVi=aFMJ!akPivB_=Be^Es{{y8 zG0G=I6k(V&4nYIfLIG1eUMkSXhD`^l#<>g?OFV+xDs%6W%*f^P`;;{ff9cgS2$T03 zq=Xphc+w;ntEw+$j$l=f=l;gQ_zb@@+w-vB2RVg<0PL)gCvNBeABw_L5qFj&9l@}q7ePr zT%M@-a4P8uHtXlP6)wXfj^6Xvw)+x3n(N=rBC4a#Ix9JO>s=;$6DH>5 zlkNE?u>`>At4G5Cqb7}`oY(Fjb_ZaRgziNUrYmR%`%QT)|3EqrHa|o&fJf5vvI!(~ ziMa~}k0i+~ig~2?Ec!TUys%Od;BrzWAqjY}ayh(DiE|A_`)@15_yWtyhXS9KlT+J0 z`6ydB-YvQ3Ouf!6{#&aZb0&CONdtU^BMz5Esr>BhB5ao^9^HxUKW99@7i2MjKLK-L z=d;ya7F8~>uyd!()oj-&59Qqsoj)Bz$hN_HHeYHH@?ID5rIZPU9n9tj7 z^of_kB`vS3ZAF1xtK_@Rr2QN7=S8~03hQ&-oa#RJyO6QedOI3z_Owxa#M)!1>RoY_SFf;4VcY(GRni6kr#Ha z%CoFaGs<7e!cO*IIz!+Sog|DMq-XrefO0Q>uLZMq$bjx6-5U5Fz!BVr0z%6R%S1)h z%@dQ%h#^alT6F-xL3+$8=~BQFFsPEoL$ca$-XY8E>dZ0DeWww*#z3%C)#$KfGxGH7G{)7m~hQ6 z!z%(*f9&IV1wfRTDE)tTB{K(@t997YzqdpM%`F+vtzver+0R=xoAWGVP9@`KVF|%5 zE7*L98b(XrCX~-d)x&m@Lu7Nvn_Ebwt2-AdMM0AMgg@Uwi3-y2mDEKJYuK!B)C3{3 z#@e7TMvx)YOd_6^FI&5Nl$I1e-4PL2jqv&9>xH_%l$|-yPL;yH;pY7ido>AcqHiZg ze#DPefq$ON0`J4_ac%-W?I}6ws8GOzt5^-pruN2}Kj&&~%r35rdjdcJ-_Z;O&aT{X z76D561BQ&+bpuEx$^N>=f@QwkA<@&sF~i_vj5)?GElC_GQGaA(X%dYkpJm-GmIE9# z6zq%B|DmKc%vUmMKp@Z&PE;|-h4q18$asjR?d35O{Dh8)()?z1Llq(I|c^ZF;}JBV}p zL&wLRoTQ}gTq_34<{DPbQ*^s*m9PfModdAgh1QAokm<|B{sFh|i`%QldccRazrnCx z-RW(E<&5o7;Na)c*@fsE&{+kG&ATyCF~*gSc@%LFRgL38Wk_nu5eB(@fm0qIG6Vhr zf*vQ~CR5b4%Z;LGZ?pHnP8~jfdep_OjBvLP_@LPPU6Py6{jck%V)NS?hIMs^Dt&7= zZ?*bWf|@PaW=LDk)Hm@VLA_O^mBDa!8fKcincpuUOW7kI-ZFpxG$~4H+iCsfA@k(5 zPg%!PB%C&CX`RCzn5*h9Kv;c}E;i;?vn*#1LnxJzwDML&;CGt1xdyW^G>^~tsAjc(E@N4 zgZ8oI@*E_06V9kB6p<);@e~PJq^~+JS+cxD4bzBBeU1g(lLHV)UJ6iRDmzmz`c_v( zKbTmfnvtC$wC%THVoy{9qa_KFDR7K3E%TPz1jBHP`KB^Jz~E=)@NlrSk3G!-BXY%= z>ihaSylzB|F-K7TXV+n_W<3gc=`;`FpL?(H@? zWi+|%Icl{2pivD<`|fH~HXnhM=9M16z{|d_^?ZQ_|`0*l-iH4!oSQ4}SJH^?c8y`3 z^VjX!fPlcqYMUjQoW7<#04+H&!NuAKSiNOgYQwss}@GSh9<4{Vti?0+6QgZ z1ZTW~`QS+(>0ZOQ;iuaDDz8T6$Mw9soX&&n`=22kgIvyh<3kfQGcj0m{V2R_wvG$*=>3HA3Rt#T@N9oy6J_a%Yle*2uawNZ+aYV41Ep57AcQ^6@E&gLESsT#KBnJg?U z7T3r7`}1})Hs<>+@!@s|9?tTm85pZM`%XUI(M>ZgDIDFsy{{ahFYm`ZNuSU0S4niO zlgQSp-zh?-cvvh$Jx1UBi*?s}e=t~7H%qJ0`CJ?< zHzS++%JGW2e>k@2EaBDpep$NzV}^9+S%}I}W*YNpYombhlTp~Cy}v(bAebbGcpqGj zgo%`?c4L)B`L;6iK$=9T-9H$16LrV;*vw=;d! zqeUr0k(+wDyV{e*AZ~u$_rRq}*TdlJ%!75iN37<$UJbdU_b_q$#t|hanE$BUad^k^WY=AQHoT9<+X4cjJ1dqN_A{hH!rigGKMT z%1Wj~5R0E^%-D-K04uRnD!E{EC*9*5KxcIlYP7 zjAEMT%$4}-AkcOq-%$T-z%=6;2k%RX!;9)91(rpr^A^v35!sZFXf<(7Xm=IY&@M0! z)K8wC51m-@CwHcZF_S4vx0n@uMvqyE+OqTgz1kl(uel{PdOhFr77ck+wR1p({BJan^nwJc4!z#rlZLZ8Qz31*MMDk+SZKR*4- zDySht7&oEi;h@0w&D$djaAt23bt?9i+*V^yKs4X7CA7Xxa0DK(i%7tW_`XpV&ojgZ zY+HpVSY4H(KC+qZ5F%Og1Ovn+$}#-#A_lctT~%+us-#T50SRG^+3NSOYzM!Q9^&AQ zPTljhJK?j+*OHf6(q&#lZ|f=}r8%0!IDwu$?x&v)7-=K%gPRXS9a^ zqL}M#?teB~zfhAO^WpM#-EhQDhZpy*eGvDsJ_Yd~eUuXCJ-+1|ne_qw@uB!G zjniWEh1xN_e-^2)z@dq(x1ul)e?`)u2{vUU-%-FeuVzP}_0Bi?aR##^qM=3pvml^; zd+~Su%F~gnTCRl8olpA!Gn}A^PYk zi`kBHlS7d3W9{Gr^Qc4nMl@3L&`z=GR=(40)~Mf4UpOwz=ulr&*HeUb82-R)M0Oz{ z$~K8z2aOO4pf)gMmlHq$g%*$a+kMof&w-HOM;ZB+0EmM(zzOt$mtgoo;5Hl53#Tpm zMA{MIUa}7IX889CVQ0i(V~0o;@j0c~2gJHLBg7Z9c6HgDU4d4s5nT5+OJqo{sSt_exg7J3Rm=*?=p%UX$8(_DyWHyqIa{EgA>Hw2WiN$)RHF{0_iuQ@ zFg6veQ&9HbxXYxeXBUYUJ9AL+nby?!oSs26H&xJakJNL$Z^-a=lb7 zr(u-x0;J}Jbb_5BNOBgW0Ex~YSL*D5=Y8HU>_?-MA+er}SdV24tiwZ{A+MAyGkjtG zV-F*N3Q)X`cGZ&ZfM?^LNx5~2mVIE)K8jvE4$|3p$i-O?E| z@W6kJav}*&L{pxIdfLDR=jey|G4@6VOWcgGv#}38bbpEy6!QhL_=ppTCCv`+%3d#7 zv%y|zdC50pTQ6A;`W{V?zlyxO{Jg}ape`1u)^$o8QOsi^@Jp1GW;2f{9M2^KV9!ws z>g<)Xq%fo@2HlZ4r#_nDzrQSS*`OYSK~A@?1@(X%vO{RgH>C~Y1LVP1Ej+(@qI2bF zRJ#wWU$`$g7VY@)s)U_3u|ePJJi6gVFRZfWN5oD{r~2$k2m-*5iArAX7BN!gxw8V- zSF=>s@G{3IM5B}_rf;RT-zARy7X=&m6WkIet4CXt%(ez(n5Oe!Sb~-_{fK4?_J*C- z!<*R~o$t zcyh`qvPD;U9r9GwPHXV`($B1ZEM|SD-T$Lq7j*2uzCB;t2O<7cDkCQET1*ECqDmB} zr9>z}r`G&|1U2*yf`-KN^9MW~jCG}26s01awRRzTcC0$Q5|UWmaHNV^(@$b!39&mg zg6LZ_hk%poYYF6_b%$dPi2qMPT*v!!P=J9L@ny@0M95sEbQ?k70n+^eC)z z9*;ou9;-U(+oc1C`|gro4b}((hh+i}p8Oa+kZ-f?b)ke&qezM#qkK)`fVg zTlclI47-f$<5Ag{F8T&#XpT|gkWV9%SA~ol10pvdj&pKu0{^Oi(~Sjxa!uEZbBi+d zq=RWi?q1J`??gaY##qaEKt}WEsO6<8kSFU^(lFWz#ecS?3I@*4P*qrl>T%xwwP*r5p4%tk$w zVXxG=-CYH5GPG=jALjDk-aR}Z&2MLbKtH;1VbOMg)yhU?L)yJRF5F=+ zharXK4pjdyPQ;FWg`=y}yjwfx%-DNYcXU=)&6%(2Lt2e-xmgr*ufgHht(ty$$y3Oc zf!{@d`@FGH^G3Z6N62Frj?xSn(;pUYsCSlrvoroj3iSpjdL#}ZQN`N?bnwS;TGP7N zyH@FNjl1G)DEdFXraxS-SPkYIj|^zZBG|p6F$GXMA$S<)NLpRgarVl)Z@7G<=4<#q zNbP{fpV!|a`zS9G^fOZZIRcC~GH*Ry(;pG z|M)0_Bqe>+#eCB}8_s?ddUwE8sGX=dpt{qzgP`l#(UkT63I+A3(|UT#HG-PK2sc&p z@c?xWJ1+F>1)bQky@m-kBK!6OBN)7DyfNZ2;TUEm!DyT$@*$g1F=E=p-8s74x@Dem z$&a--&efZESXyP+Z#TVznoGI!5WC1=XqR9y5&Js$z_SZla+>}X^V=+$;K!FC=grn4 zhG#L-LyS47OH|3+4cIs$+KWnnkrm1p_=ORRBi0d~(25uClfyyp3hQ?ss0~@`piSzR z$z@{!`L+**39Gd~>P%%j=a|EFIP65)h>-#M>@B%h+}7#ry?*76LAQ&9&xU~ zb0_N?IY6f=!(wXbSjdUDwv3`KcdBzgyGCo}6Zf)mRi#eDXvYYCwsS3`PquyiOlv9Q zps3M$Vb>Gum#zDE?&%KI5Db2$7v+wVxYRy?IbrbIKQX)LZ@3`;a#<7uk>ON*`Z81 zT_PESW<5duKmdLTNPDuHb5e?% zoG=`0oP!NxCgVtKWD8IKXm?s(!=8!>Vrqh&Tbtyv3J}-H*){fq@L`JK_a|C8Uo|R^ zhNq#-GRt*t$GnPAE0hcVs`jYoTg5Sr*-69X7WaMVx;otw-t_C|zqo2yhRrxApLD{l z@6inHY%lduJihM)wMW!`XheT6`N@5z%LYkfkM|1bUPW0d2n-!$^jK!xbFIaAh~Yw! zU;Kx6t3J_x)9PBys zB;}HUzVzwwm5rz{phY_b!d)b7Hj66-?%P0a&6^C($iRcYiuaUk+jQ`czm;Qk$-DaO@9CEZA<{x z43^p^1$7<0BDxyOgOg|0phcv@wXA=9Dj%0TRIXQIxkWcQ(82Dc^mmQ%D(u z;I%%;xA1+^jM@ayZdti#lTY~P`~|AZq`xUcc5org^Tp)%vV2{5*^6{?cL136P;y)l zd^)uqqVck>jUuNT$@(0M35TjRWY+y1Q0y`jpR5D9Fap*fJ@Adm|5A;;1E3mRd^V(N zl=~;lT7n>JJ-TwTbAPaOEwamEyS%E-RAk9IK6NPin z5%I}Os;LhL!e&n3 zWIg9~-XN2&A^zhn;$h*?Fe0`C_XE9!Xt~uL>{*FcyZ#LaK+(VV8^P`UiFZ6U!p@aF zZ>;d`_jOAcsT-QB7b_VN-ia?}*6MTmYUXj8UbeVE(fafn*S+H{j7^lA_nwZH5g>u4 zKX7x-$hkG3iuO5R>RTYu>-F+(Fh~wqtUS!`jwq3*^X?=Lxwd9bYi4p)Sq?AWxV>__Rx`xE?uu`aJW; z`DDyv*LteKXGES-w_|Zrqmkn;W&ZQeGKE(BkjpeKre>u{sxhYIjv&O2p^uYR>GKpI z@24EEkdHTpE|0~G>m!tGJn2-hZ=g4aH(wXvx7qQT-u}28aR_+1@yTU>);f+8D1)Eo zdc1uUv?xuXUjF7|Pvp~M+*yl`SnQ8@R(5S*K{D%(ruBiEzhtdBASTtM8r}P1p7Vmu z$<`EITMKX0A)LqvVYMJtUk}kV8zJnA6_1@(yVh8FBY9YIm3{P&l;0i-zsD8NE){6# z3J}WVz@zELzg|(EW{Z1!vj|Tl3r`}67pu)Or#}KLAAF=p#=9h_q|9jZ{4&A#JM#I0 zb-~J9HrALUu4!x6r@0YKrY>NrML;wHYQ7OxKXVn>yoo&ACwa#60WvxWt?r4$djdoTQUT1-I!7n%1f z{^}|U?gsAA)9x@c$ul&-7<1&n9MufvoM@ZY`kuZLcx|4vfx zrksY`!e!qz&(%~xvH8-~_6Y|A=0?FC_XF3gcl zq;_J6aD*t5yl>G}ggT?diKi6Z4S36H1=CTCgKgN~w74{>9?#my3fxJ)e>lI?de$)Y zD~W`wSET&@tUuL_>BSlMs+`+7=Jj+4NynqEVGLL;88HK5;a%n&;$^dL927l-uAg@ebFZZvn>kO$++{CG z*s&QDL#Zq}UY(K8v7{IhzQ{?MOE*M&9sWF~Gdp##7sY54;8R8RGqyXX17{LE;ag{U z=hJn$+Hegh3GqCxzpKIUi{O@b%{7m|RzORCjP79Y!n<1rYu0Hp7yx{nTgmkR)0p?RO%NoBG$wi|)tD&P0XP(Gv3i`kYEW|WN`V!Q~Vu9J6!BMWy= zpXhjVU>#9Edx|wx>r1^dxYo)OJ}Cdpl9sn}jD6uq zfggZpxq#;>+G}5Itf~`cD;EGYLvT`vpEU9X5Wb7{mvX=JLpoklS+erM{_xIpX`A9g z&980`JwSeRNbwoK#pq3(PzzBD^I_4=Vf<$=`x0$ST<3Ajo_owlFqbIm@Yx9j)KK7~ z1)%$-i<=iWHZNjJ%q86z#LhG4>nRF%jm28H*WHCk(XoDB=-!y83Fk}k_pqUAd z^f~r4DG0;;0Pz}aB{%n8ln1`7?~QtVEjWe>eG~57YlCkF2XBaEy<&-MSW@n`Lu!B+ zj43D6U;R_!n=65nJ`yY|pQ#_u9oqex2KbZLW9>viLN-BsP z?!G(Aj35d@KQ0E|=bS@3?56j;CIlTGR2G~4cfAcnFc19Na30<+C-(8T_px*b{NfC4 z&FbU6%4}*h#C!=Xa{7L}{p&m$DI;sV{lleimn`xxJ{42rU~cs40GW+8)8>IwJG1f4 zmbBqW_HYb06;FzRHYHe*HjZ$ElK4QiB3iuVm8T)&!hBqgK7<*q^b~q!g0bZd4_YK+ zlJQ(op*9@Zmq;3});0uovb}Y}oRdUnH)wQ3%vrI>kgnOenl-`J)^N)?doP1B#ZD4F z8?BNn6q~a)V8YN>zM3-W3SMVg6;_LDVp8y%-?&nA2kg1z` z%Lv1uJs?Wmy4qHRk8z3Pp1u1@49%FM81Tm>pbU{%{%cZR<;c9C!$`cs-Z}hTzeOeF z-isCO+c28WLKm$Z`W|cAC|BD!pq$<1^GS^3DJKIiE(6Spd~T-MNcI#6Ss~k)eX@@} zBLtgL(wz9tHoLT5b8a%+gq(&oqb*RbWPh2eR5(E6BCP>cF2idBvAASj0RM6$0tnW! zE?XALD0g?aV7y$UF=4u$3YAmC1d-P7fvxr*QO{%!&tlDOj|}TIS!g8M|vKg=f)dfa{MDyT%BVLiKDD7S{hfGbi1vJ z)?kroO2j(FA*wLIl&4W0S`FLyIWKx5o`~91p;p5ib(OkDU@RifX?OQo2<@lEhxV(t zAQEj=^Ye1}MXwVl--IJol85&)ac~aa9699}pMETxq?Qf6K4HNZAwo$}N5u2H>7_ns z5%S}v9B~RhzrC#wh54p#fUioo+`XB9-%z)-y>2?|fc#S{8fA$VMpcaYop z8?xnU$OInm<8|-vC$?9_LOwjD24Qu|83U3^9*Csd}i?Nsb@`76}1 zUJu%RBTaDmAFCgzSka!my{WMAr;I7LYDpe{OoaIMBpg{MN;r>F2YB)Qazg0VT`mj0 zmjYy&XqE&-IZ-dS6{RMX6U$bk(3PvPj9If{NLfcF{Fx#~47}dAU9j<PrVKBN)$o2gwW32jLb9I2>2s=k8+E6um4#uIB@T-7j)nk^Q>!vJ;4t zS$s>+OGKCG>`qStPdJh6#p*A( zo#56tZ9md~Z7e$$?Z3MQ1^&K#C7@FbY9a(eu_Tl#EWr5{Bo%j~U zc6B9Pp4ybpOVOqNe8t1DY;n)lXB5JDHSiyF#yJXZ67|M%VGANiirS6CC63dTM7lS( z9%?m<>5A*2cgQCTy~3DAsH2;FR=C@$^HuCQU|9u@`7A0=w%=`S!wU!?oCM$TNVB>b z-drldz8a)Z1DTBL?~b?itj9?Qc?$_8C}#q}#^=ZP9IErD!l6FL2?29vo-S!_1<|yf z$Og)6l2xTM#0Nv%<+#sdW(TYp!ng|0Z4K`#Zn5?e$n&<;V(wpGQUm#;O@PfFKiW>$}sZ#^2o379iuCl0 zcr^sRgAazR;+$({@Ay_(p&JK3kY3Q7g(v;rG0 zlJH}j-Wn5j2$ffm&Y%%TnC}cCB!BUai_)J_oSP8iEVG&aocqo39?>mHJJVl7>XO75WEQ;BI~u=na1doR)ktlRn|EpFiT5 zGm_r1Itp`*q`(3N|5N$DhM;e7%!Dc7lQHSqBzfeaSxIdnQazIoNha$tai4^7Q{EJF z>r-wvqLH$1tPqYm$DClX5H|>KZOxUuIQR>0w1)CJ)5s-H3LT_nEVIT5BR%3QRE%Y_ z@l?pLf77)7P2&i0iKu!xKUBs)5}_#td7~5+vIcP}M=~Ru6;^d9(NF%7x1@w% z9a#=3Krs%kDz;Q+!|38KDPW2+FRhuHr$;x%bk$Y&Gu=IO*|Mh**}XZQC^L?^(4epc zyBLu`DJ8=ooQbdQS!kK~W@r@5{F|#Yr_lM~KIaJ3fO7R$_QokKbm)07k%I}LX4(O5 zO}SGjnA%bd{J#j2J_74|jpJm6OeJ=c%*sI>9tzak*!0cQYUo$~03*&5I9AT?>EZa+ zd4mi1DG$gKZk)=mTx~%4Z0hi*7g20FmhcGqiCl0^nQr1eF@;*W&M+9(Bp!3w&xwJzp~XO}g8Vml})@Vw15!0jWbXfX8kIC1cw3M=yI zeUh5Y%27n&U&*p{bs5{x?t{Q`0vxq$J<%9=P;@J5e5fChP3l`of@;61Nz+BSsnYH} z7aw_##W~N%nLL-d#d{f(H)z^oy!f=X4z=R1GI0#$3BcKC6LKcA#ZJA#Z;KeRrMz#O zu`|@5m!Y3IY74ZV(Q$GTrvN;HpPIRKo_m+eIn&vh)R5U#Tx>IsH5cf)KQ-02JV!6? zld4aT*IB8oX{?H>93ONrn?h$9jx#hmmCza=$Z>_nJfkwNRJb2&L#Gx7oBf@)pDIOG z0I&_`WZy_)UO4jZh2tI6#kq^dIBP!OYS)P1pXK37)JL673cHsu$Jol6!?+GR-Y6lN z2trbO5yoJrgrA{;XV2!ux0j8D0ARPkz2~Td#C)u!hfB>6n$6&wHyT|Ui)_>E+9vop zx7bOy0EyNvCF@c#N@PBhzbS1*O_NJ>3QWa@Qs~62oXxCZ%!nSw^uW1#XUa+k8@gr={|ar^!#_9M*fwb010sKl;6k%oiZRpC#a13i{ob%d{TOvALZl>LMRv zqZA|K!^*SSUl#6`ix;&yK|u=-ou(7($h;-#Fl2Wm5D$rMaV~o%y%5_R>fz|W;}|J` z(WmXSEAz!*DKr{*)SsT=?jh8wqr-~7LJG{D%O3ma`QbUSji^MQyrLAg4KjLe9c3qv zleqsvQ=8D1crs|ZiKHKPUs^y~ZrEBQ#hyM4W|G15Q%P<^WHqr_i=uKwI~4$h1j$_o z(fZ#=$xQzrQZf@K7YoyWBPFx3{SQ*IZ>pE7sswsiK&wG-K?o!&hHl=@Md*r>>1LQv z80HHmg*Y=e`FR=PKeimT5~GsjAX!;B4z>O6GG$F$5RSN*7%HlpaR-Dr%1Aw*b@&LU z)hWQ55O6?noa1t_T;1Vzu~}Pb&-U{-&paWa>*DEk_j+`C`m_YCZa*<{KT4%-0v!kp z=z3RpdJ^f4fJPE@6YP)G$J4=b=)TT%Hwa&6kX8|u1C@f5q^$Gb( z`kYJ|Wi|(qv=(nG@MTa7o zlF|#?^UgzjptXmOpO2WP-r^gWJ_1TtopL%2cnBlJp>(&-ox?>-!(4N7i@xjQEwn)x zSesP;ON8_|tjiM%n9=BnK1ahCUFvLNoqVsdlAl@dV+`E`Bb%Pd{Ll~=;ur7v5Y1c3 z;zp4mCenZ01V}=57>eBPqB`5vQlKE1Jc02Jm4ht8I+>zWd$!GjOr7rbjES+wwM{XvdsRr<=sZY`J{NX1RJozsJY~ ziNj&7ou1R-Ee6;D$h-qz(xW_G2|C`)?)8&O#u5rT)t5dmp0QfYBxj9;M5f9x8nkHx zs@`9tBV;x^)!g2uxBU0EkxDVS`40u01>1V~#IngK$Elsm zJJlKD4Nk>_O&5osV;J@7ga><|eN6Y?VSDvVl*H&KpC z?rhFVG;&KZs^*og3K}(hF#P{@2CxHA7>C_V!{ZCpJZbs4Z-w@hB z+3?IP5Xk>D8-PZ1LuACqyYzb^^Dgh&{te>uecwDP&z-Lru0VqM6e(p=lschf4IvaM zx~W(fC8T-67zy9oS9S_%m8rzYVPyi!mQrZA=(=oRXPI?^#0@%-+S&A~s}-yn$L1ZW z8`FMW_hwd-jsXBk2 z{T7xQN4Rv@Yt#YyX1XB9y@qN`A>X5o)MwlprJ1D}$?wamyYU$p%ggHOiWMDdHf{~= z+B%wgm6J5ukQL(*l+y-CO_6vy`UW;90?~GtIUeiS9a{^b+u*(Vb}U(OC&=P{?X)ug5skx$L{*$55Wt3>tcEd1cG;dag}l>>yu zhUZleW&^sz*Tzw>MW1f*e|Uu0)2agoNb($l(K{W-t=)jct@hj01AGhH7RV{(D8cv5 zpO&5#OIDt2cDXKM_@#*UiyxVMjbk9~3gAA5ooNH+(+F=@6N}~sNM7)iP~cOZxv3%J z3R`|1nCJw4-kRWFEyx@(?j>EY@-$^{uE?Z>ycFWWf=zs`c!G(H4>wy48Qsmr zHb&InwW#d%q9fl2J-FBo>Awf^bPfV82QZV21&e=u*9sHE&3DAraDrG-in(}3&UZq` zEFJtNH^f@mZ?`FeS-jU%yRS1y0_7wn#8*s;&B}xxo))t9{9QUNsLdnFbW#+qd(g)x z1btML2J6Nj+28;+J3p-6ioZ(k=U8Sh>3(?6_tF@R?tvRw)|8tNl0 znOchRHQ?a!CzLE+&WmN%tX)K-EUNl9w_XYUq2y;_Ts%!_g8e*wdHx1fF}Re~E$_eg zu$)t*3B!q1=jK4O`eeGuD&vYZyylcDlQmoZjbE<~(R9!qYZT4tc1AjD94QlbtAOU9 zE7OiudvoQH@&iqQje)27@6EAS7SOB0fG|SykV_ce@)!-uT9ZpI-adtT67@-ix`j&w z-ihftG(fiR2t#e;B^s?+>KY~>Il0cJGE2{bQxmd6b)^D-5zr(WER`>VA=X3{A?J$9 z{#DW@(9=*}&lMx+o|EPBSDvDHvC6D_62mE8;0BU-Wbn)>BPgG;(Jqq^vT&NK!Kf zHp_6UcC0Vt@yKz`@9~ImF30o8a4t=`x@?I^UZk`q$LulL5ANBv2F^H>=N!-o%wRv0 z80=3x@xOKJ*$CENT!uc8zSZeD2-e{fRf0NmK?YRDlFQ$CMcvh5%fhr^6?um z&cZ*EbZIiq$v(1l>DJ6ToG0@b)XY~r;&rKGpNe!TV81B5(mZ(WPT#tcux0;||> zM*akUAe>N;hKac_LiZdA0!W=OVutw$f=q6?2|{NMp5sXD2c)wmsk6qdvZir;LTc{V zyQi13#_ZY%j}K^cqir1N|B4oA@l zHhWl^FX(@1ZVxQlTLSex&(1&Cw`lsq6&{E+ChXh2nI7;C2ZWUHHa86018MunNQTf4M{LgEqSWL?J?P4uFx0s;)8=(n+G4z{{T#2M9 zk4&Z*1DE!IDtVp?$U>F4uFPw#NO($pE(JWbI;T4@`|g%k{Q!L~F{9+}l~P{{ZKk3) zzQ?O8+C{Z8hs1OEObD?3KkE9E?GM!aFFZL>ODe>IJ+?rJd8!eo?=eog3o8$-A5;Ia z<K_ajhvRQjQ>Sh)yc8P9kuUPD-(kM{#&w<6jfFSM$yQK@5)A?U9=poJ;a93tI@B z3w9TFHyrJr*Eo3co@{@I=Uv!hvP*6sB)tMY#n3HDO*`jR(PBqA0qP`7&bCUX}pAQNSp6na! z+uQ=5$H+2W7p7g=^mbFYXcWTGepAp4K{|=6MrQ7FZ2sj{f^gsaxf!bM@r!q?#LVLV zS@44UBf2w+t$k1F7P&}2`$;_z9&di&1uJTP4@M!bR+LJoQZdC|Q~P%%2Z6O%bdE=L z*CdhRL<2EXDD#iFUIMeoO2)B|Xz$qLe_4!iJ7??u!X6{x2o^iHGcA~M!QM1N;N7%?Uv>@c^O7>F^d@Vl6sQ{P}O2d-c3V` zMkn{Y%vqH&xx%YLpuFb1DVXf#DOoy~m1~Z@&Xh{hPOgCylmZ`1S+L~^5x$=AZ z<(p6Vs_dyzNIaLuk=l`7iLjNh6m}DS5%N6REI3{QpC#s2u66B7fx~-B z_&)Dt(8s!)>5F404Kx*dY~h~4yX89u+?#g&x<2l(=?dS*aA*hDa}H#lO+6iZ$#xcP zvpBT1^m{MpoE>>rbS`bkK{aF*}W)|(4> zrI~QUhIYfkX2Su$qgijHx?*QZR8IRpRSKC7-=x*aw~$obmo=zv)aE#a`o}@ z6#&7zic}|h^%p?eQMWaS)G%-b!#i(p&DoH-@f!f&QAB7r!eyq=rm~mi&cKBYl%3wm z0%c81W1i4-j9fQBUqYAs_(bqt`(E+GAjr3tsJoB%2Ae7{ahf^}a)dYseDvYrpFNle zoKOmkbP9LD<2}vxNG-Vw@IfJ(gucPp@$N3@Ht9w%r~|b!E+DN|L)`qRAaKP2xVDmN z)}=v(5?aR+#2&auwM^<7EDdo&{A<;CUc*46o{@Jq_#75Y4)7Uy79hb2k! zQXI?*?XqPa+1SN3ucV(FuoZ)8PwPq;5ia$lsux87wGsV%cb;-m##n7J*jd0huab< zy+)pOVN)y}tGFnfgPCHv@$O`Rnd)igeg@2V!`MiniC!grndCCdedu#V0Epp|1ez$+ zxnu#&Emm7DYcA<{M`W~cX)Q1>`8s+T>Mt&#I>zklWB{4IGuO2pl@VM|P);^~a}!x1!`fR6cw5L>NoFt816xN zSJ^y)E9P`{Jw)$t)i-Ji$z41zv!;%rs=p|fkX@&I;!1yq_-?GtcjY6}3aP|JDPJuJ z2tpQ=gxBx6@c&h^XLqmryD|#vg$1eJ0eJa6v2%W}$oeu0l5Yb#f@1gUD=F5MzPCu7 zG!OZ4#l4<8+46s(1X_-8)gz1+d(`AF)u_bw|XVf*e{a1?30N%PVKv}O$r{eh$Z1=C^?}Z9@%Tx&U#h0QS;jcYS zg9&&Ue5O4&P<#pJtq`Do|B;b+jhA!V{0=9+5gUrda(EVZ0UhueW(4@jcaa7MEsokR*85!+yy@m9fq-9^fmBFs=7#^1#$ z2qle>6pE#$`$RThiFUxdMiKL7K5_!I^OEcWEyQ{Yz(-R2aTYD4$6CnBFyE1E7i2fO zjFkgs)ebAZM8#c|XPHlOLCG#-a{qCIgtmSxBNAn?aLqZD!pLyru2M8LXBbpajG2x} zCEvxLN5z?o?CNYX#d^xAhQ)>*7ivq*snn$I5`(_4j~fcNdWT!z+TbQ^;=u!!@e|k4 z-S8-ufMCwhj@4V`(O2fgyx=NZDNe zV-ZZ-g7UBwlkoD#8=Vw-tXdw;A99z43vT`9qh@+(K~|l!UX#`RVpP~1x+gh_;3HdP zMU16-!I(n0G&s+=gXv&u=i1gkT8pYk!N>a)bM&brkuVu0=xTpa7M@hxh)9rJ55ir^ z(^x12?nshheoHk+a1m1l)t3!JqYjPdj>;H8|B`);D~0$q4fQ&}d(EMFW!|R=-igxC zvn7xu%vpPLe)k0IuXej_XceFMY;r4P1h1Y9==*fb5+n{9NCSYHUH5C%g!99&cH&Y* zNO@Fe6ly5QYNYysDEaxyX$^0V3U7vwm|9Z5f<3+kBZ$Cg@D)mh4URaNgKUYu4{mQ> zf7yH*+~<5<{>u#K6Kzs=LqroL2qr)uih6n9V`-5w8lSwU_)VqG`(4Xo^0G_5MRQbl z8MJke0@9ijdUnA$QaK>>eGh;6VQK$czkfeiuRl&}k;mA$<(E;9PHG*;8)RbavzP9M zk}ObfKVzb>{B?c8)e~R#)tqB|Wc)C0;^lq?vSU49hk>!umxd!8yv#YV<3gcF1H)~* zLO$=S!R=t)ZU4Bp)q7CE4qt!w3oHQXsoV4HDRZaQ$@g|0zsBI>H96#E<=DKWq%snF zS}}|FO|78^M0>lfsR#}~7>Vh2K6G5ko3=dM4fuHD>1VuW#Jw!SHn3a~wX34{&IDiD zTO)8Rt}HF9g395Zef47{q}j$)tSETq`#1U&f#*qFGk@aNgr(r2l*^SRY8%l^k`pM% zPCn)5UCF2DrSVLi&_Gf3WERGDaSh*r1Wo_-aE{thaA5dI^zEoQ5*iNl{z$O}5}5`T zYbh6QXS*ky371Z+s8V_uH@CCO+%2*HXY*e;R(Dzny|3ywZCRF-6)82sEHq+)Gz>c* zC9hw6d#2_RQBm4s!dpz2)1|rLbU9eT$YFoO(1>BpB%aYpawlscaS_`_?&j1^{D`HB z7vk4(1rpnAVHJl{IPgeod8xF!o3`7dMLbpd+Zz%qyt7O%z9*I*Y#Qy)l{O{XjCRp_d(KBV_C3~`1uAW0P|Y@o=`3m&eRRLW%aSMsNnKPFf_jGYD-=^Yxj2FC!R2&wYSvXh45ScBDK>#)OQdehk5j&ZCf z@PTl<`2JOerZO1*T+fj4xs{1k$`CyWky2s=d{nYzalIM+BLX2rpr~%WSuO(v7QQ$E zmcUK(OHJ%~2OQ@B5T+apqS&DXJ+_6ZwgHK`#vqoqwzK*~*71EpBCShvaS1ogi;2jb zd4{;!$g(BO^%gKI7PcMiUu&WFdBa8Y6WFLZFP-Yl%lA8=?fsfw9~P|xJwR-HP~JQfB1{LOzAx{tLW#(f{cBHW+57= zs+V@N!i~=nC-mZGu<$@t<3`E4x-V}Y0#lKKE{OaGcPtQhmkS{|*U5@p)s>TM?W@unOo)xwHX#B2R~R3_SK=;tPtnCI zU{&=4*2tZ*l04cv{NWGKAD7Q21l5?PoT4m&3Y7wtMJ_&ryh>*5f|i1qd+3oSu)hIP z2BWH6u7FHuR#$tLeK8Lq-J@y}tCL}bPS#tv!r6*j!^>Z~9WE>PkdK(lDa^QC<6oh< znR*VBiFwUh$)n9^7#V%Q-H-aNBs%b%U-?O%i(EWBTPleC5wpmuk}N%_u<)qa@5K+UtP#%eim1ia3dqa>H)K=-J7X+`G>ilptPkHESBV>8hpfASrKK(3Dnw zZr!H$6i08QJ$Wvr#FKLLkFKbg)j)S{V+K;CO7+p%Krg*}pI4vad>2&&Y#2D9hI7M04 z9#8A}OD*ggB>_5I`TB?V1P;B?^^@D6P4ekGRz`wo89-iQhJ*(+V)m!$!0MY z7ISECUJ6bRIe7u6ohfkd4qdQqy(6-NcmW4cP@_)BeyEw#=p6% z0SYVC;GH!b24 z;v_JUG2=(*_URc>hrL+4hOLmklnHrc<_|Z8(drg8mZ!onD`UZye%tjDv!vfL9N#@# zE#$$jRbuh%zCoF{$uD>1#_zDqceQQ34?R@v>NLD&Q@XtS_Qz``^lU302)wDc#QWJ% zNLmLhA44Vb8x;L+x@!_${RRPfmDiT}+IBYL4U+E(*v+=Y*rZnFVv3gk*VGjy(k%cgJFs76nqvc&&gQ-^?@&mbTOgYe6;*IyS_*IG?U3~hokzsSbK=nwHwOl>B zPOE1V&97&}?-)LR;Oya@LkOO=5TBW8bZ{_FaY7kPfr?szObgX(;dt6v-Q)wXc&q>Sxy_B z+Di#vJqXr1C6=a-jXky%o3H)u&7g|%YNqaM&n^69w4cHO!b-pP5T)h*gO-YOr-~5y z9v!t8PeZO;rD{W1o`(t}@|qhGPDNd)NtG9bY?)jKc|kRV#N>u&S<$R!S}ZftjCFY< zrQmO~a(e87Jf?viV3FOvPqG4i@H5ruCge@riVnT?XHULs&bsyNJOK2X`FB?*C#~x*gW-Wkd(d?lV=He#Mm^r7Gdq zu=nFtf+_4mFI5(Tnoi~x3wmb>t(eTwpFH0ON7#1g4(5+0r&*DUGE)`}LQ}hP$MDty zOR5T-LmR|cdXqemU;gTlG~A9W+jP*Wt@0Pnt`URh+0CA|?s4=$bhzdp2RupR3(t#yA`b=_I!MTf1UL9j^w` z9=8EyMIX|i20}W7eE6QMJ1#h!bk7QrD^eO}yK~z)p6bwVQ}qT3J{I9$9NsTzE?5DW zmCS_MFvasF=sxJ0xEqX1bsv8GUjxcRue42sQOF)F_jD&;--jQCtM@zby*wPf9SKh@ zuHxd=Ej&?wj(=K^gAt!5M7CTevS$Tn%h(fm6yzaoKG7bUC0TeTk4j%qoIdq{!8Ram2qr2A9xjAI`+D*OE`{y@J$tP!DuwF>)l?Wbc>3ysO}CR zTK1n*R?NY>eAQU}hFdNQb71l98Kic62FEuGf$(ian7{Nt&cL!F8kNUY4? zH%Pi53~J!G8^z%nljtY8S27h9*2ofpH4~<9Z!9}6B~dMJ6DaODc9)^uiaL~s&4U7C zM|2Lteti8+5gsPC@g1?g9ELLzYhm&|$86dwywS`nb~igN4=|i_64AZoF+W=eI_)x8)A%a_kbc-s=lDZT(v2qL^K_7<* zBH#X#{B8{A)0*GQSwzpOimRlbNRS?!y^^~aer%XIm*wt3#}+PvaRq%5y$0A#&nMqJ z;q(b#Ed~{_#ozDCOARE}Ht7$+ObS{yYOVfLu^9(!lGfP^eCSWH&g0J`l~>Po$9qA_ zc!Q6R-y&vjfxn){2C~3(J79`eoi4pkj*fz!sfoQe%}!c7ss3@WYD~6 zhc51RfqgX{(%l+XqJuyZQHFQp;A!gdRg&apLl!Uh>}dyenDAxzHs-XhZMX1pZEW?E z%ziw8Nz%@ETI3L~3;RK#amC1@E7H1f+%L#Wc;r|H+Qk54l+IPqaJ^L}xoHYW{sYi zD2|@1R`^}l!+$t z?l3Kn^|%-v&{nKW9LWk`>8pstTetQoc`(^pYUG!BMS+t z2_KN_Qvo|=RG`D=gfB3bTXqts0P(5^BPQqHDl=0_w^EHC5aCWo~`R0rSwf7 zOv(IL%NL_f%I8tWK21JL)QRLztk2t^Be)ZV=?tf9_nSn4sINFrh`|`?GCdL7s@*p> z@UM?aypDHjIE#7&jss;wS47mgwT$uV2riX}C6MB2WHr6lU!H79!3ITOs?++2r-+16 z38(N5*}Xz}JXG!2YhqMG$rz`}hR=2s3v=LDS$!h54%}ZZ&pY_qD3I_?P49G}+*Jyt z!=IzcE@VH29Z0wfiZPAiDx}50oxfj2A}ibm-ZY!npV^9|9c?y3mxVo&s8_MTdo9Kt z+$+%U-AHjb5b7C$zYx!cR-?g0YuF`#G8-UEr1SpOShP?QU;v09gjWIMWJ7Nrk=&TW zft8W2|4uAlIrqH){u_w$6^x52M3ydDMg5}EMdKwQynMSA{=@g9O~rENCd=|Gz$!K? z$1QQEk|VZR^60d!nOtW^T8lXy_QK&|Ajsm1%;AiH6bDeixMX=S(7OMC=vKi?xQg z=-tT9<7UT}h%%4aRh3GZQO^JFoVC zfpz@E8~TzCTe$P_>c$T~oJ^SG%yE=DwQL-B}%D=0!2gEvFR_AVx=DoU4 zVSJ3~jN)ad6w>;EZH>%K(u*Pfz|gJQ=;m(lq~{mF%k!B1S?TOC6DoyI${pd6_wU$M z$?7b9vm3QrYD=Y&yoixaA$60clAJsLDg}i+%5k182TE<~(LC7gU4FJcA-jbQJIQuJ zvT$U?!QBb<>>^b`e^FRG{I~i0Q~NL!{e+D2mUT?H8fr7r?;F+1*Y3M!bl7A3PVl?k zq3cQR885Gpr_LwAqfXV#*MwJFuelb`>HTHfM#mKMANAJPF9JQOpoF%iM4(wGByOpp z^8?r8<!*mr##tW8~48q0nTP-?DD|KemB>fA3`w(Wd%uP5(m z@9i1`L8_^IgS(0Q?0ewbk>}^gx#;rbYoCtWI}4sdK){WKX54jCH}TnDrQ60cU#J6{(GIgWu`FM^RF5^A@Fa+K(~8&)TfzORQ<7{9xd*=Ly`DrJ=g@m+&R zmpJkE9zKY_v2BGfM9~1nRocoYsS%ww6-_ks=1cpWfl@D~DlBxotMMM^QNtP`On?Gu z`qxh^o6FoC^)(o56@b@G-R3noF}zU){W6)wA{LqV$R}E3j*45`QQ^6#n~5pvO2lxcWC7!=cw`> z$6!x9;_s?P8+rL;6Z(qfidW{zXVUwTKjdORm0@`fXvI>l(IplJ|im4>P!-ACHX zLQ6~&qn&7!!8fgAR6{|=OU0GZ3noT#_2Uj4e=~;TmT}u*ZvBML8TyPCbN5@x-( zoxqRONm%>uEyE!u(r?CkNKeHf%69!=gtW>xTVlXPTfGH!9{HvN*e2pyYc+>gxBSfk zaQdoQo!?2B+!xx5JMTo3RU?zO*QM|hy*U@Mi8*ap3pKS!JVB7eu4CIJYugq6n>ETp z*KYBG2?QYJ1ek0iYMX|HJkEdIk53|9l7Pft@o0+xA6Tr#YR&-1pI%ah5pIi~8b3(K zR_;AHYQJu1=h*?*)9XzcLS4$~#wTILcaq^Z2J!w8=d{aH$soaL%{=Bc$RY)aZ7mo zSr98972@|^(B==Rbn<;fYGtO-5X!xhvIJX1uc-i@*x(8b@ARS;5?9k)jdFK^#2T|b z{>TxteHV%?@_FN6M9|g5TZwWPN@(O`fhF>p{x!norE`)YGFrpk&sB^m^4Zw$w438G z0^lFmaOHhs#|D8-N{qRE^%QTX-u^XwJlIrkf{X|^zvYMkA#yB^m5T}A3|7C(Z@Kcv z64E`TKA9}{*3D)-6uEW$RD5l273laWb57**-XfqOlkQDYbv^TsJ^eN74`3fSI+6Lezw4-;a!I?euLsvmiUF>9 zxO||1Fs)|SO>=PHf->%PVq2d``l(wneA=D8shx#DEK#=m*tL@mKZzSMxTSPVE#7`Z&Eg$tbtjM%0?W zVlHO39zk*nJI!<7sgYtuu(@;^6&RxYrTjt>5VsTihOSQAH45X|-+r&Vmp27!j*qVJ zd-nqcpWCsD*O^)MT{Te_^G9aoIP|}w*vHmymydE%xvguh&zvuA=Qhn~D_s09?kn8cN3#xrN1 z8T6vgh=kBA9kPTpSe+%maT@2g=T;xV%3Q9rQpiJ7LM_rULT^RX_F~BHcYF-8&EBrP zQ1BB~VrVkrwt(Jp3Uf1wm@uO?($R27(NH~6$#>G)gfLpR~ zvUS_~9zD00YB^_)JH4HS)JZ+b_~*^Syq&i@?ZX?>+y(cfm2Z}x^JCP($?aw5oyF5) zmF3++y%n@TxKPWJq5mPAdQkP_4GA}+My2Yfe50FU=ECFC`y$v1{=vdQ9mHf| zs-%Ei;&rFg0mUmQUvR&@AG0m7m4{Nq(>|*VpvODP7}T~aeG;$$%{3Hj*UTQfx-m9$ zeq@xGBzmW;i)rj=8lG_R@-40Su4R2*8$~;vfes(M44Ty_sdUADO$t1cq!`)neOa%4SHBvuo}!-^ zh}45V`Ao+b=##)0h?ovcLDKvm74XbCnh#e1ocxYc?1&iIupGtO*Dsh_C^U5GNGNT5 zD>^=sQUvnP**caX9CAIdE8&8hkv)hR^wP#$^3eh4ITP?(@O^1M_ARVC831lVmqjNH z#AJTd`6T3ihSvuXpkBOk*#=<~*kD}CV1l1m{ePao-dzwlBiZlSmA5u-i<6724PlP) z??yie2Tt;Bz7F0e-2ZcYmZ>k3?txG1BYdwF{u)`J3TpeLsb%cOag;~;LA|b%5orI! z=Io3aHWz!EM|%`X(Q#y$nm8|zxQk-zkDQx$Pliq``u`r9CT}}URPsM2b80C!+RKD{s<%;8x|G3;#Yoo+4#8Q6^!UD!(?V^}Kn(-mg>0 zld+}QF-b}U~vD@K&O-G4%&TGSZs zQpTM8GNW$wg+WP){@l9b?vTwG=KWBu$_lkFz^ud?Dr7&QS8`h_t$!}TnPzhCm&G~R z1wV-vn^VeDg0r_RFj%TSy=SAl-jDF=_w+&0VFA^g7)jVB^_mYhZ0K7=~;x{m*-yNWrwmy#pN7ov9C{K4DAt5eSZ(RD1uJ zH`HAc(S^$s9Ldf#>V`v2|E^{Er}mnE={X51eMDbXLJD7cP&=(BzV+65_rmr7i(K7_-C&;8 zvFqQ2Om~B`&n$YW8J%l6Fvr)B1iLf8lbOb%(NmlshWdd4NbNiG-!A}H7ocG$w!;_F zVU}7s@!8Smz_@JKUk$o~%lq`RkRLbLpW9H)FYDrtrm)f8ljFW27mYb$_swupo_G-oPIyq1Z{VKv%Rm|PTptOkBZb?_Irj| zT8(SFm!(5q{f}M-yM*!HvbL2g>(ouk$8a5gS1p8bCbBgL$4coxw-W`4utVk7jatiH zj!KUBkjnFJvWHQ>Bw$S+(8>C0B6g8dP?$Y4PoOP(%OBvrti)>ARi^m8!x4c^l%9Q$ z$sBQYz z`fKUDkz2QkRT0mR=#ySll{w~RE8`r#bxA*7d4;^DyNGdEP8BC~x1?*Fo**WQA_bW2 z65haaeNzbEe5Q5h(Y{jFLGGezKfaizzI4-^&krgJ=@>boT~@i%EESQ#IBnJy{&KLc z6W2!ZGRZ|Ag(MXg{uSQFGCKIe^%OI~MT_pogdrF%E!gd11#ZasQ{i4Lh?JU5OBy$% z4u6S4$vKSJb6w>7lsI|O_c7e|^`d-9kbpbg!7|rIqGlzo9HMI$QWSgtr}899u$Cw> zZQ1H3BEpg9QCs(K91+W|z)^YRT<8mr`Sz8q^EzYUyuj!x_aPk$dFHa+t~QFs8q;1{@3v^+OrGgXvC{PDEd0 z>~C45ls}WmB|>Wg&)H~asfA7h-Eo0fr0xNUuzJcy4^n^6=K}W?VNpU%SJs%ntfI}sAWZv*u22O_s6rwbHw@l!H ztd#)yogA#puQR^kNy2h_>k|#Kky9l*p9(4Pl2cQOw-#P|N196le+IKfzAKaW#d@UA z$E1G=`heyHVV{SN^ODvp#?(7=fxlz5_SWO4n)|XV-gEl^Ijv_w&=x~w^3;1yKkbra zM4wT3TTNQWcq5M#`E4#g)l%z!>j52s-PeXFr*LQFp}}C&%5r!- zWaU}frWyNVJK4|W=Wl<5OGr7>0EN|VY!X&Jb3WlgBBL0+FT^Y2Y_K0K+Tp!SBN!3l2cgi0FH0YfprRf?ij9RJ#xml zkL=JM-YlQCh0YH8Ns@#IRh5wtCC*(xpyhzjihMXcd(o1g=vvo}B#fPKJ+h7u{C7uHLRQ1)+D7=tY0~Y9rA}}W3CN_ zZMb1)Ze@LGo%A5_Ab*=_{ zDp;LrOV|*n60a+7(cK$Oxv_701Oxfe23AapyAVHbybpDr!30_k!%*W;Z+>ei>2&xv zXUWf(GRBq$B{JE}UpmCJTWp{AfB8VRw*r8a`)1cFnKDO7W)RU5AJkY&Ay zWve@rJ##|o1h#Fa=-5Rk*P;6IUuYH~`tkU$x(8#(hRnvSv_r|3_TAQ0{eSveMm0f_ z4iYH=Wy+Sm5rsRrm{D`Z6qSztQ(&s@iFc=GnaM_?)FB^67{Z(7HM8wZb<9W9gS~|e9uer}37%V;_# zuHy+Wt#?L-s)B@P&mCD`=sZbNE05494Y61${}6AOFF{ueK7^C|o}#-ev2DYyg26Ix zptVDf-g%X*0VSHA93M5sQxa*A*L2Yiec-`hVfe*sEm3}PCmFowyEg3uKh!Nh z`L>PSu;+xxM&S=`EN-&jD|GSwEo7&dcDh4`<`U}A8`TD=21SN@beMq8@KP!jk7q5O*v^K!`?8!bn zxlV4*uubzT))SViPpK)uwoxDpZbxSYBXrLZXTA_mClC2IXll4Am+^5-98&FVP4C&V zZ+=l<@})LOM%bNi>*DUdLtNK@8%46C+gbVue--S`gS97ickOnGb#9ti?_gYpE%n86 ze68+}7`&^%R)w70w|d56n;qv-ajuCP2MI*oVsA`!m-*n3iI>ZvKQ3$NX}kfve5A5% z1xAL!-`uNfDGwq+xY_#l9m@80!%#7%I{v#zsfmIWT?TbAuZr+X6Q{*ZhCkiCw%_`< zk*!N<2W`w({%iBhzNei5*|Voe53XF!vM=Kgw>yk4TyNd6y(tc~xJ?;XxkS;|%AaR` zIqaxof#@%=7(0U)my*#z0UH52KBvckZHB#(3&jq0kG}xMIB2|=)?1hOi^yJ)^~ChV z$jz&h&P+II8z1-es)sZAJLF zJINvE2_2|dyO``5>54sS==%=dAI6m3MENTpEg5=kqaL9stI(O4!W^dyI?r~LOg89$ zy6YoVmJ8?C4l&`^fZxjqhi8`4`?bCa{`z1Hv@}l4j_iLb`*g6ybni5E=&N@S7#y2KXbODdBPp|E9)7U$r(RF; zxN6Ryk}3mY+aZ3w=Gz5r{qH>J$mSq~)gFaximV^fq*{_0hL3T?#zG(xX_oI2W2gxU z+3Jh)wINZxM5(BcmavIG;3&6l2!+0WC&aTutP4FDjiyD>30sNU{ih!kHLyS~Nz~WL zd9oHh7i)OQ95ujfk7hC~jRC*_z}cPY+~4S|aV9+0zPDJ*7b+a1^ubUMI#1&F@fk-^ z;r??Iayfp~SQ3iHr0dwAy`iLDNcorw1UWNuSqc08N8gVh&+Bx82Y)~oNqgj+!rUlv z-F8K zo-y8AIXnuXV!+%)($N~NG9~IriD0$@k!*~xKGJSyJ}Atl`fxi*!X~mqQmT0JjJ20& zvIuR58+$r3%P0H*FTc}2cj#Ak#|Rwyy%pt932N*>Ee4M*pVrHJW#`)IpSjzb$CzB|cu1 zmnebKU2G@+b=?NEhMXeK3uq%Q${*x?r?(RU7Jar9w0*+S(1HxS+j>`9FB z`U96}{lntZIjNxa`o;HTz-1bkFsP~ zuGHvp=r&vsR>28nCYWI`eiuS`eM$^nA^5UbvgU6u_UiUN*M`fJK|G63hL#w%D6!Q< z3uKE{BJ(^d^&n;AH1ED_u$eJ-FN59>-LU6ZpCdyPA@b#=Aqf>Nim;0iqon03mS?P| zdJv+IuP>RME1BJPAB?BJyjVjOgB9SSknSltd9Tc=ODkS7o#Gyo(p-dsSuRRR$#z-> zn|0RkDU=hiL?7tnqSb;{%@%h6efB1g-zGN|yidglz>bVKyK=nB`+?|dS>4LWi+5w} znB;1VZFR+z%CnwxgxkaXLfDL_5Uk^b$M{X4C;kC;>hj9{z_cL=b{^?{h%yrfad5~m z#H~ep6u?FowvB}Ai}iQbaH!evw_B5KV||mY%(bW1V)wibl(DGp!sSH!Uwv9;b%qg#+Sc}QmwYc3bj0(@5d`bgl!$lY7=Mv@*N}-J z>5L=Xu~sxqgU1K06JdDG6CDQE1-;<)sp3eXJ)mfMOii*0d+gryo}BnV$RL=i!FX`? zr`kov8loCF`cwY`r^tW)@d{?TBIVA&istMv+(VqF&>szSzC@ppkDAe>bCrj({w-S! z=L`;GaLz&}4r@^e_Xsk}6J0|0$i6C2Cf_A_UQFo7aTMa{$1Be+9HMEm^1IGN;03%! z*j<4iVfuexj(!CH)&}ATs!$PU+<)6Ov7bL)fzQL}e|DFl5Xr{_?ou>upUUe^riPih z;|=h~nd8hd#-iflVtzQRNjU6w*w{9iDThPa+PXgqa(VmTQkMdUPA5miW!~s5~{`9jE~1p z^k&}P%)DP12NxCzSkIyEP})47`Nso=5g7}&=mp3$2@d1|-S|EflN0Z-2kr>|EceZp zg(2ylEZtp>CuLZ@5r|W&mDbyu#XKpi0>p`b5cy7z&k;Xx`C_D^e;8d znbPI#&gc8ek0sazOI=3^gx|qBF~3%Qj!PN*?*uCxz4m^W6A~dT^C|K95E;Y+1cKxF zrQ5_kHTbl6)A@yzI$D;zJ6xj{&szoTl};$<%DO(DRlb2`C)IlNXg|tATV*$ALovZN zqs!8HNV|LM0IR%OS7pTO8N=x0If(qv@%%Kt?xQdNbx8(2tCdAreqY^Y0;oJb>3)Gt z%(EGOkH9XVj-2w#P>%WTjOyRToD%PS{wDHE>+3wS)bur>9*( zQ6NrrgQwJ{)b8d2)5k{pwZDH}S0I}qY>zdR81Bxf=1@_oH3~EgA_3m%JXTS(3e%{j zO(YYFeq}UytX~kR{CQonVgj1>63-dNQ73aow4u)l-2;Mmu!n_xidLDLw&B#T z@Q|wyop9j{%Bj(f7+O21g40EUVF~?4{tq52aVISP-mfg&V2)opPRg_{&TCG2oeTfX zpxIqPV-Q;pa1cP@4*#d%Eyf+Zo{BSZhxnTofs{*<^eK}TQuVA!w4OLgE1I!mLhV=b z8AS=D!nv@S9B{A^Y%i9<*4^Bjbqm`qu(18@Jv8vkO?^McRx!qs7y&;+iF&n#pmj0G z*Jtl8>&B|-_%_i$m1#RF>J~-1$q{Z&d%9iU|H7+gr_lZ@$+l~DnfU5E_n@);%rb}P z1of2AjJYW@hU@cH{)FU+8cFN{TjqtD7lM1lkHt0IoTsI;SKM4KU~1))_Se|E|h63gNNLLdk(OO zrQC&|~#fl4Ae=0ZFlQaB#8zUyu|JCl4p5 zu&}F}i@AwCGJ;Ihl~$k=<}wkue{+*EoKinvXh^MRlL}vm6e5)v^KNQe@(0pUMIWLD zFj>A+A{btxR4db1GFP!w16N)wQMHN4c02}J+XM({*$ zqLaY$)#KM{C*j|lqv*b&O}ZSM(iE{;UvSeR%idB-ZD(5{j556NJA_VpXFEC_37QZv ze8)>Fhsejbz10mIpGMvO#w*i$^QZ~rmOPu_2qfF+`gV8xGVvaNfL;}~_S&_ltu4Kg ziMeq``qCnK2U)e@+NNZ=Cd$!jj_ zQ7(&eiYFJtQe5Q>N2O(6SDl(^|A1XGJ!dq(p&Sl=*@3 zC>O)IJ%clm_aBKE7%3D*QjI4p-ks1~29wIv%8PJ_LufgHwab%yctMpXt2^09Qt=IY z0XC;Vbt+ zP8Gi8MS~>-IT|5(kbRXDyA}0UBsO_*d7OXV++X=C_E!%h^FV>x+M@$C#2{sOc<;&n98y4>X1|~N|zgVL|Oid*^~>v zSHd+b^L7*F5bBjVTol7uv-C-W3+`acFXZ!?9#853O4_Z9T+=-|#<}aikW%x6vwq@Ti2!HY9Z{j zxg}yP4ipCRIe0Js5p-IA43aQvhCjo2DtD6|{JWd{NZQp>^|UeJJ?NGm=Ods182(yp z&7o5$RzCN~H>JvKgu0^kK?Kx9ZmRN!zve+jcnBBV5bDke!FvM+QxBG>mht;=QNk-2rUS+TaEut+^-4Sp8+(kPwHjz zFMo7?Q{tmHNM)XU6^Yd{xe*FpZ_VR==jZXPGgw@AzP)(S1h%$~X|;1o=iuM=UxFCY zc|ygX-P@Kmr_)z7c2t{6{qC>LA;87A?+$vM#$TQ%v(Ev(b9Egv`CKinzy9^J`8kgC z{rBO;Rqq{~&pE4sX3^~4$-W1ne}X@H^;chWuWFsMR?SN*CY2_Ktngi3J47(;4pTm0 z0e_*o<&SmbSv1m}rqnrwwDSzm^Br8B*N5o_f^js$-X~6xA2|VOjPhL?N8OcToocEf zTRNcy{gmj(qg-T)o_%$tXC@POlV6GDbX%&SMtm}_Oi`7pH`S1a>gbs+N}6Q%PvatY zkg|qMv3=Ad4a&j$cR!VghX(O`|IC)nxILRIKEUx}J*lq1zFaxP@@-B_&G6oD^6n$*Zf%ZB{~EEDx>t42Fzq zP@dzapDw>n6i6q2s2H8_8jrz4Yq&i%)rQUR^EL-Rz7wV<#oZmldxjiXANCVN!3hO* z{!SKAI8Q)*iKj#xNv`-9q1%U6etdii#js%jO7cEe`Y*!H?gZd);pf*@635kkccz03 z7fy~2ZsHd%E3Ss1&HQ6FqLFkH)E0GAHI!)siQNn9Aw-%ij6f2{MNq7eSp+9)_BD@f zud?s$1?OEKVHv^%`kjC|iPWv936Xt*opu}2Ls6N%rV8!Q=>Y5gGo;yglRPOoS!1Kt zhA}~R^8Q&uV`qCUy|PcnvH6Q@akNEvF_Gv9E;+rBXsU97THhfi(iV18qorcK+or*t zYpDj`4lz>td+~b}@n7U3V+B+cf{{_@#OV6eWlrHq3TQT#X$ezp0cp|&otN+`p>^lMbE~Er(&iDBm=Inu_toFJ!k8NAZ}iN zT}ee+T$S2Q*9ei;y&(etZ=;Z1W%reYIz<|bMs7mVUg}NAV_4RT}qRDI*#iFGzD>hmk+n3@h8<929C zYKMtLfDcFwdGCIKGHQe`lSMKIspmtqIRF|TMlm!D1%<`3nhN)u2d4@V&dM3ontJ_M ze%Sm`;svqH%8KU{g&9?PCui=07I;YI%$gOi3~C=S1*~LzPUN1yQijuCxDsY&yU2pf zM62rPA6?$vo%^?S_ZG_6#q0~((dm0X(NFkHxgT>~S6~CN0%b-if1GOR!EsfNNi=ua zK-VVyrzKSkI<$-p!u{=}(@5(PWu_eJ;Z~HE+HW_kMa?feV|5i#6#=q__ET}cXa3Li|5v#-LXv4k~=9NWL zB?z&5qbd~~(?FU*Gl@$AF6!AZ&6$|H%aZr=Ja9hH%jG&m%7-3nGE2xaMnBM@p$wh= z@uRuTq-8DBiO$eNl_mH_OK!USmt|SCn!HMnzZh0r^ot2n9p+1sjW)y1-)c=sP-Bf| zXa9d4ga6jKEJq8cK9w6 z9$Z@TFGB6oN{!snWHXBTGYxOtt0pdz^ zroVckVv!y81$qms>S|`#uyk~XP-rBg`e+X0FiHku*}E1l!wxq50__xeG^vNg6={X+ z*&40?YrE70A<;3NC}`O{TxF&`o~^WdCOdOnU#1+cvis&1^$x3l zI_N4UVUGz_$hm=-P?Je^P!vA_Tdz+oL<%HyJ1%H@%D1AbgCt9Pd)7{c#n5D~f96rJ zcIoq0rm5UC4|s-g9)dX~khJh2qnMb7$!4*UDl|j|6TEgtm?HJcASqF0n8>N+`WVF? zLLW3KP0B;zzlFrbMNKQ`i+<|-?#AL`Y|<_i^KNFKLUS23EF>7#g7uootkF_IL2^N1 z*!ODtwU*Bgo$Ne}LU@IYBFZLrYK$BvtLfAfEnx%^zQnH0E{DLZD;R<#fu@w=TbdUx z$?eTO*{RZ8>RZOiG?t#ZA89ZaLG){w{YMh3n@Ll06=e+~WrG~622)IV0%5qyiFq%f z2}V{J2O10D@5y%_*r=?)T!#n~W#h7rzn+$mxPQ!<(iHZsZ(TyZt-RnWCCcm+PK`m& zqaekVFgh8)swO=pOjwv^DahfFh7`@GreK95d)oCvo^RydLQ8Bk3FCRK(}oHPv#T=P zY)Oj1m8Tal%Hos|1SGQW*@X;=%HS&P;nSVxKpfJh5^Y*6DVi8`bb-Op>PFna#Z%Rm zDNVALf)N`U(<+!i3i2gOm1;@ihTfjxoT0^0ygMsv$2@=8BIR)5=ROq&V`}coFG6Sy z4MEi(^ziCJ)NKt^rriJSJ14QP3PD{8l`nA2)(}+W-{uEw5RHaQUr8K(OiZ`VOT;;b z$Kk(T@WXF>7giGdtHdZLaDK#QXU@90DEd3-o5%=jc1`r?;ojHaf7Kh6C^3=Ca^gvG zX|b+Tu8d@AxK1?2p_^|YQ zG#n1cx>%Z=s+CZl%S=(YE{XM{NR;`xO0`{>B#1CFXeiaP4^_{DS;daHGWt9+WmjT) zS?-aj=hXqdAQS_a3DM1hmb~xWt9efLFHjal4ZU3x!$*|-fV6~RSl_Q7o*h;uTUuTp zO7(H}7;Dx59joxe7YTm0P}JJ+Uyx{JjU&{sfq}Xy&IRjS`nJd&9pB{Dg;@Ay@4F8pVr8ZOp!lB)Qam9)V<=KaGF1{g8CLi*Dx|;ZC+6iok5!_le+DPF3 z$r2M4JJh4R-Qn`UB~Hn1+1#gOr1gqXzexpPJ8#s$o&puSvnBa{tmUg6$$I%y_0G!5 zi7{)^flL5ZUMK^2ayzYc&m6Lg@EQ91v zd~mHl0RZuVHRFH+6#7TeC!t9}84`W@^4HhNKzm!4;|Bx=T;M zwpqhmt|RI;MsJrfI_Z$SOP7Y@&r3EO!`l63GIlM{RCh1f1{tSM&DAHUAX)o{l*2el z{(xyUhki6$r%HX!LZJ<|xSxB#ND=t#3O~rC<)9=W;JK$9DCBzz*CLXy<@>-)-qx%F%y+HT9qs_)|n_&kMH67uf!-*QWPoeZdE zAaQK_nIXm4-@a0o#C;GVr}WR4uKeXRJxu6Clct#rICZ{^7S-4)fuerJ4;90mMx>uY zVu$rxVC)P_lyx##4@j%>_E~CkEbD=0I7M-*LWLvg6J+dCr}LCvbt38L=@lWk-{3$= zy&xr1jK~R)rJhu7qpK;&LxhHsr+6`DPg5pRa5iJAVxn7_EK|#ZXmYid_!SD;7!jS` zQBV$_X0#a=azZd2t54uo{@xe1^t@we5}ZXs?-b|^bc(@t{G|Y%(5qkhd&K)mh1hN;3BnQC zb7-;J@=hcN)4lSco%{!`Ag=%p5NM^(@Ge!v)L~{Fx{zDviyQ8F)tht~$r$I>d27oj z9W&$lQ9RSB?{LCT7Jr?QI`rn|GqRt5%jj0i@ac%Fz9y3oi$PB~d|t5hwqIA|RQ>hH zaSfc`em|6Jd*L$0+Q`Qk-|sgnX=Ysc6%LzGT}rT(QvIKbVn0GBgIRVs%;IaQ;!Eh( zSnzW;X^eBZK+D-&@cF)-|KBRN@#dxzI06NqCS~ix+GV4H>8hE*hpKw3!C5$UA@EKZ znbU7@r^qtj*LBpvl{S*aI(w%7@fmi->Fwf;>LX%SphJO3~-TPY+1T&ewj8~|F z)i9 zqp9hi;J8fc#NFR9Tu>4L^OqMQ4o_X|1|Dp01>Lk#l_u6%Kk!?i~2{ zmrnD<4?i02Q#z z2)1up6V1Y!Mo9dKIBZgXX`Fze2@eN159+2q;3wy5o1fvyd*M|+%gwOc&?V{{ee7#3 z*}*XD!SonufBeX+Ao~44%!0PxE9~k(C|mb`eM|D0Wv3?T?~uYZ&^i~ef8E$VlVj~_ zFzjYGjh{ucTZq=Xb4#7S{E$}F_tkYKv>sX4H)6bma?BLxH)KWO+_4wzI#dTne(F@P z@p^n;s37y06e7Asd`^(CBlEXXwlq_BVHH(s-cD*Y2i45;+D~KUgc!xlwsPoQY1zkq zPOg}8YGaR28;EqSF(g|1J!~Jr&*^TE3L}c|a!CY6GS-LyO%M-88&+hWxccp(4?r@% zP|4Xq`^ElCfu!yX5{?G{A)Tqc-{6A;RBB7sg^@`BGmJYV1)4Hy`^z!BUjnaJBF5dq z!Q`Lh1vD=C6Q;tOQlBYFwMHe%>btI;(Z7_T*C0@F5M?Y-^hj14cyF+=c z^#cFUp7J(lqll*GI-WwcFRp)KHTR;b*B`FgKVZa*jC>IgTE>~P3{!57Q8J`>vSJYZ z?v6RaXkShI_fwqqWV-oJOvm#Ut5fHoECG&ua;AHgei6Z5Ye3_zK#Z~g3G&T)AX$&S zNFT902zQz8NN=ME6EHRsVZL55SDAx=zeEa%uqpuvzpuXt8_M)Y17J5hXc+`I=i>wL zl{^}S#uqy6?WLnkcu|u4gXtxN@#wsEh8dIb(x--d_PS`^@+#^8=eOvXl7GBjclC!v zZL#{7jq|A$^$Bs>up9Kw*N&=2r>kLJ5^0A2@`pc`8a@arkO7bEVpkH(;vq6CfvjVp zmoaEZ-_aEv(giiJs)-c((*!|et^;~{cZ?ZXy?l9xwQNtEPwag6w?mh6tc;1>f4s5b zU-ZWg9QW1+EM^;HsopHU(#(ZB08Isd@PC}}RMhSZF^npW70GRrd;Pw*3D=DA_noD;Q#Zr;GmV>!sOMhw@UU3?Q+*Q6A^N&?-Gy{O3ARNH`U#H;4_B z_KpC+IBwh;SDHBsucq8icO2(X&P{#KXWiWwFqzqM+7c2a@}*cAG3Y8d{lT_8LN-Ps z#EJWTT;Clhj5?oipVzG69Z5NhHwm}4%{9{!*YR5MtQzoFKpyQZUT^Q^Nn>$PfE=^D{*t_AnK^wwu2{u zt0h}Y@(z8cD-IzFbr%Qy&0ChO`X#puw|p|!cuyp<9Ooc>PL(Hq%G5a ztLCxCAE9&T#tkSjS4M>+RRyBdlZ1oF}wi%zIc^3EI8(O}b8B z2m^z!^P_JBw?CQF*9_fOWY6qM3pfwgW&a>he7=UQk7Ei>H*r#Y_L|8DbG@sd6jQnt z5e_y<++-M~89S#ij#UxdJ?c=oZl>7K_|$aZ?IzC`aQ%7gCP{a-!vzJj$NVCGW6F|G zpB8)|P?I#|eoSUfv1ROFE{u4`++O0lP#f`b%koW(8NDzI004kA|Gcoo>&H_z?9q0V zEQ!b#`2|hnc}?_0nn$2t!m?xxlM2lvL;y05NafPB5N+8%Azm5$7JS+&$8nNa$AVKj zsH09SA3uMjcf0f)QJnwNcFYiA{H541k;_6Izw{C$vlKlw>&=cr@?{0)zKtKn>R-91 zlLG=UuAg!3On0UnYx_^Y3!AlJhL+bH>0h6b>aUuPQ zCj)8;GZ>D0A`oX8MZL~pO%Z*Gb_V-N5i@)d3pCY%rDw=DSjtLQ9NaDI0ne^H6?RU=d}3)a@N>=TanM!((BNC z$K_n2{Y_xVu!H}=_@@zRTVU+8S~Ec>i1}D~(yd=4EcuOgKFcL-323M6a%zP1Nm9k& z{`{HMvtr+_hi9M)q*yJlqogU#_>c%R8^#Cb?0;c;&VJTA{0W?30qxaBGsKE?c>;GR zWlZgY3aMqtgNv=p&|-tW|3sAfW2yVSH3~Kf5cE$h7&j_LmJDBq`x`>Kt}t~&Zu9`I z?X0yeG9Ce@EEv5>0#~xUZiRO3TLc zY-R*A$NJBkY>FKC9=$XYwXYk>Y%a6gTQGK2YSG1$Y!;k{7a}M0d`rY##w= zEV0fl0*h|$3r=rV&gj+4^gCUcKgt>Sr$6-eEAB9O0J{^QF4f^E6IJC%Tnw(LWVthq zQK6%4ra0E0B))jrm%Ei+y;QDI02-lM?uIIE!eZGMa<}Zg4Tik{vdYgr1Q3nBY8*$!S_g4DIi#LVYt&}?~;R=ct zR#zJ|7+}TM!PAy%h}s-F$O&?&PkOzHKb0 z`Q?;)i$cS{B2Xl~&0n96sKwSV=Na0UwW-&lhM#DwX}@9}UW9C@D3cSVU!4=2Q^n)B z!sO8_H$3!i&#M1ytndeAfZLkXQuxO8b7LZ*drz;MIT;13`_mOYRJK~lFalZjDdB!V zx{5AgC@OKX{1Y z2urC2@$7XmU*;P^{DhFEwtsrjxaNJ1Ip$ur#19-HpWRLw^fYk zMNTo2Rhnz(SDP1G=L3cf87$)dJB)E*-HI~NjD=<>R<+D^c!7W>UcIXMh1JUBH|xC| zr(8|l%RQ!f^(C#GE0oW~4NG&@|Mb2f_oiR|`^103u@3cA5UA7(Ol^EdYk2>)o(p$J`DsxRTQ>CMSW@ONAOf(7`^tVJwln}tbA%;{f$pC zso>~{)Gfsoe#1Q7B~uicBfiUTgC?^*4Jx`1;PlYzRaQv*y`1YPWCiI;n9Q<(9&z_z z)w@Gd>^)Wo($E-IiZpeoD_?`B{{|KERSUmI8`Fp8Gx8+qh~;?hGp0_yw11fXz4r8g zEqbz|3r_iRt}w@gcTI0_bv@;US1o=F&C8i`%zm2g^ugS>fVTn2e@A!ewjkGF2!H|c zC7^bq263HadDycec7|MUNk*h>+>lJ9#nv6=j~rjxJQ!**obA$~s!0ENWBEunR(kccx_%c&#scW!sfR5~eHja4!#6IAM~v>xEDZ;;rC2M+hkZ z5Fm2TCR9SlC|$7%Cb66oYGdt2u;W>lF=jvVqMKgTjR(5>Ha1i1fVcw`a<*eb`EK>w zj_;m3a-%0(zs6&Tcx@A*9eH5b8K2H*#}Ca!sBsJ&_3N+;to};j6LEKrz-1i^C^l|! zNsEH;ccyIn9Wk(PwxR=}*_dsm^|F;?9<}dus{KxJpIS-O>}2lrug7Vb-Pt^4;=HSY zN*9qd;1y9E7e*S<(nA4c-p$5W#D@sQOHp4ikD~xz5!$4H6-tu2`uXj?q5`aSld1>S z;jkv|)edS?nKJk{{w=qCqb&VlT&_7FfhY`W=2wE6A~K&3;hQ&x zi;&9rZWBYqT4p$l;?B^|t}MkKvAChbsbY^wb_#Dj9P)AYQ>^DZl90m}b;YN; zRB&I7m<6=$65X!`pLgK7+gH*ps%93L+l81GYI=PU>9}WO!uLCIAnsezLlfWb(-8>e zDZ^u;fD|eZb@%p^M4RJZt3U*&{e|J{A@ra-7E?*{z`4+a$_G&oMsKe8`{A-e-9Xt_ zZqpF#QBO^My&897aM4Te1nZNMSuma}LJ!DMw8KeptVsl@HW*a(2cVj(E#{uvi+?4& zE#f)C4WgNjjS}4No6hdY)Kl;1*P@A^NByJ-cPZutA$Qw53qAb6bUgZkaLQD}u@zIE zJq##sy0Lgfzi&g$gJgyEB_2`oV~2{&(YvQo-{nf-oXwr~{9w1-yCm2mz;OhqAnweq zQJ*XY8O@6*>Nth5w~)1O3X6iUHkPZOIvxsU&vs%^+wMXZx`i|6`YGq^5i)1{yIjo* zwzIl8oKH{YVq19o9%r&O_xdIIqgrzQ=zBTh&l#Uw zKDbx<^s=Z6e7Vs3iu`=hyTTp0_{T$AL5Dz_6L7(+bxh>RB5Q;avo zrI?PLMxt~qcO@(1N+Bsn^e*hHp$TQq+lox>M~tT}&h61?ZwgayN?cRP5-f*3|81!+ z&MqmlI-W?v%d;^X7da52o^KWu%1@Ky`9QQ`Z-aFDUknb~A`rcUgaTM>R7yN{r=+AA z*B8{3u}nY!SCnGrLCe{7v3{=HafYm%@Uah`!|~1ZjTD)~u~SffHT?=lb{zYR^ZNmK zIlHsWhJ~)_ig<-=D1h6QG25QK0x;evcCSMbm*!uO5*^jC_B0~)-wM?dC?I|@kA>fy zF&=)soDd%*)Sd45|M9|^GhuOMKi@5@Ev%Wkx?8*1Q`_K(OoG}PKK!u6eFR6LTDqck zIH4-jvdkP_(ck;xv=d2itAXpt!3{}&bfexij%GDn`ewA~-ZaNLhLG#YR&S*Yi~T+{ zFrjv}|A{q~C;}P0<1slOKfizKC7o7H5S#b)b#EAkeKJ&X?Gz7;#*J=FfaLli`!M#L z{RHE`AXb=Q)t6`ag&&0Zh0X>jZNag%s#8QAr2P>>#1^=%B!Q7CQLh(-0&Gk$jR7vr5{%^1HYy~Y854GSQhHlaA0A$no#}KQ z2%chEdW!SR6`g{Mg+F!J#uCnk{IC2XA7UX*6B^+YUrc)lh<<+#LIV^ifO@J$BWsJ|kXo`rwv{EfKE2 zu-d&eHb*X|)Lm~K+QqSNM2-Ue?9Y~I50j+4QLMA`%B)usW=Q@qgxJ9F0XMfkh~U)% zF1n)}gFMjdY~LD~`r{h9Ppm&Xl!n+(?GnHDIsxis|rL-k-CArvs+v15bbKPitV-Y!$NANvf4a!j@JRj}v#p+VK z958xV6PU=u^*?G4ZN?%nRe_w3W3#=QE$&$zxb+qkqhSrB)kR=iuHm9}LzM7GZr9CY z-`KoWx0;M%uW>1taTVompQPQ5qb!rxEclawrr(TQnU3nGzaYfrk$AwYlYHn){~aw# ziwW<-xTtk(2N7{~ey;F>KVUtPy*)#+YA45JJ1Hx71nXHV2z=U=^JWhF1uW=*e4=D8 z4ZPy`?nfv`#{U&d3FP0_*>KVuyz1J=e35cJ5XYVQQJC?qXamZw%^72L9~EDZE-_q6 zRRG8rky5X@!GOzLK4f9VY7TS=LXh$uHM!jYU&I#|WCJCgkoMg6K8;AQwrXQ4t z!+VEQ+Bz8s1u%D2p~_A4eJy*BnXdXl0FGZwe*I?oad~kku{FF#En{nad#g$a{T%%0THV=`sNW7t zmAKw>R@;K-?)y)~rkv3&<#eJW+m^ZNiB~DOT5LO~6!N+P_nByQOP2wKjsU87&yx?m z*_hW+nkVnq`sX%&e`~=(fh)`dhLUWzMGtZU~BL6iO z1nsD1P~mZ9%h+8zoY4K|$+8~XzqB|6i7YAoJ32(j7=ahM{kMPN%oH_EZ+QqrCZhZI zUc1#2J?834WW+WYaMN~w%vA}~3jC3ry{C^AqEFZ8YYps%@0p0?4nd7eMa$In0NVh~ zqkdO@lV&Si3XQ%AKoI#3g`8W;CTKh3r<>SxE#c0&2!4c!QG}7sIFSFv;1`xUs_-(> zA?g&{%Aa%Ewn2+BpXU1p;vFF5qvEXDHUDF-%M2VnH>j8ea8{$)`Y1B0_c&jq+xO!u zn`qC>f6n{Fi8uol?Ag_6>HgNKpNX+DM5RFRAvkeqptPnOTrmBEZ_e|Bgm{jltWmo9 z6Mwh8UNo#od2R5~g#nMr z3^dLKvL4^xF8qG=z6&fSsds|!kD9lwQ8iJYs298unV}~7bocHGWnIbHma*s~5xhHsa^a(znu(%zFGCf( zL0JBq>)7g{Q)3$5Z)!ssh3JH~w?>Lzfvn$Ly2One7h`-DB)_-s6x%$c_?#mD!ut+^ z`o^r;h6nX-Md_guN2HN*t0h21D*5~xbowBC+F66z^!SSg&$p|@>(=|VA3$^q{Tb=2 z%{#9DWJ(M=Vh5vxq-?0TOyl$58+z!u`VSa|(&Dx)ee<2*!i>K^W>hD(X|6fa@hx)C zi3}M^7+F&JOmQW3a{aN_GuK@l8b@TNp9MsKd-S(jy8S-%i7SnQVm{kFy3CGtmYHb| z{FIc{VfLE12|K`9&hlVAL0lIqV`Y zPvY(ef&<^Sf^qlf7BlzoUO${JFD~aQ5+Af1&IJcC;d%Ci;WZ+co1E8?l96emhXI!4 z=&u|;L~NX(aRb4{PrL{FG#|K00S~bxVplb5@5uJU5x$l#0pPj#hqSjHP1lXpL5xun z57S}(R&_+)P%l&2gxpCVtatZ2pZt1^Y;`-i&kn!b8zB?f$qv@#tj-z|-`Z>$*!Z1s zk!s~1Co|f$RR?A(%OpQ)QR(;tj9$?9A6~sBnc$R{h0w=lI1;sJAqR zLQa#l-r|qZr6p;vaqi*1I;sudR? z3E7FlfvZIot49ZdD|XF1zdDx6ls_F+My9NHC_rUr@f;MuMDC<3izwR618JIA;{NPBdf}K)5SszjyX>Lp3%dMv=&wx$7q@a*PWxf|7w?*9_lfWZ;%DJA3~-?x+G;@VUHC@d9- z^2zjMnCCtKm|W`HmCWlRiR+D1J<`3ArSR5D&9x&34y&LtvFfIsE&s1tpyEfX`#sBV zVuY|*s72E|Ob=Y&Q^x~iTI2~DY6gM&0ozR^o=cP3Q^<3V5F=D+StC=8n?w2poO64` z;v(2f5uxs6>t?(K)f*L+6gS_G7CdAL@ts;J%C{{=4oOfOabOw~9+7VZXMK(`&4s zHK!VFBjK=r`D$SurLv*$lTvEXied-KU@dFj3BbmF;uc+})7cxgy~+M8!>G%))%QAM z86P6kH#RFMyKaQ1?mOd&2^vyLIue8$)1I`y%h!NuK^tCVr^iSyLp^y;j%PL0w(ac_BFAwIW2l%6CUtw)dcPU9m`ZE)r@G|c z9OJ#snvX4e9ShjBB6zynmM;K3OGb|+RK1t03tuJ1JHqObEYpz%6)kgg*|!}qvA|=C zxg4@3@wa5cR|nd@!;MTu#C&Eyk zO)DcxWYpB`ZusC#kC9B8T@f*TwF7&NxO*0ZnUb--R@XeTwH}$077my4sBL3pyAUQZ zJFAUNdYOnk2mA{Ah zpRJCgO_Xj8J)h+gSWOPLIhEwbdt>kv^ucbo(w_WL#0#GO);f4*Fdo(gC?ld)(KC_CSQJUs-YI z)Mg5AT7PblZ{_m!xF?h1Kk>5MKw6WHsB8Zo@bB*WONz8@;Cc7#%#cCZb}FiBKuOQn z8t1$)+2)wH79#tYwbRAA$XR1M#MR|DFvz}xWfkE@JNVT*^f@$nDKBTm(bZu|a_7fM zv!VG;pHGfwE7jJ&`Ly0??T3O#6Z~T#zZA#&Ku;^rNP&!ZHu^)~wEHo0R~A0qzp>`m zmi;2Kt|Fgc*pUXeLXUVAAS7VeRp|1SCJlk zZx_}$YRp5HEYe2x=L^d+1dXl)Ng(S1BXtD=;7mu8QISJ*fbnkO;}y;lfJq~)PaXwW z0=cWRp8#?^$OmdzqK+wx)LXCQbWiJ!e@SsJ1jxFUI9|YmWN#$W<~joFxL%yF^a$J- zECZTT#`S=qE4pzb$~2LhFI6L7P<(bQ{R?Gvj@>wq7CTB^`R%KmS-1LjEGwd(yzV(( zF(L=T!c%>nswKILnU8|V?LcE-*L!2W>KyTGEV0B5)RmxeiM}ecXMxt&*9llw727e5I@U6t^eSZ`tg-}8;06R=aIdgK;m1=)r3 z(lUqI*b}_grNHr1Ik;aI#Or>FkpR|MoWv+!gLCf_h-EW$>`Qj1-hN(NUrQqeSr>C; zxhoZZ7Wl2&a*hRPqTqTf>&8$16$#1VxERPwUmbdH<$Oo{AJ)z(Mzf$@)HBnzZBN_Q zv~AngwC!ozwmogzwrzjk*LL@w|6H8xi=C5wagtRlsicy1vEEdr-g@hKn7|p}M{Gav zxrzBdA=kjs42h}(ygb0v2ShDpH~(qK3!v=-pcX!&w>j3}CJXRkpNUv|X@eVDHdbv+ zvBMs*iy=kq3nmbJ4_;$fSqM6(7fIiYwoO+syOVq>a)BNy#5ui9i+bJ7RJY;X^ei;5 z9DbY;3Le?sKD{lStf0K!<;OK-pEE+crwLCThJsm&dGMP@e@n)v|C~7n5COKmfoaAB z`ohcsgOcH@KP17Al)#wfBGHwh6VSnN(WQ{t>VG}wx5Q$i^kc>chFAPVk_zVHD^6ai z=Zk9LK#yF+Os)@9qD7h8XP0z(+x!5e`Mf|Qm4QYbX12FGE!<}Txz6frkH)uq!-)U@ z`4?RN$EbC17Z%06eUd2ExW0w^(O2wk_BPad*uySCLdVt-KZ=b6xQ-aeZM;g(PhwO3 zLIR2|WP1)l(@iB37Ks=BfSwh4 z91l^no4PSyeu6t*Tf9Q60P|*->x4b%X%PC{w)L2QUL8{OX|&dyU^&rVZBj|Ho+#C) zO@sc>o-xU#GXy^b{jE^;kI)R;3j%xtYx!(EdNZ0qgG!IWu1SY~R}+%qDOfVrIQKt- zCi5AO`Tg)@<5=T+tMW|6(=mQWoYlvTvTLeIys@3g?zGd)MlgP<#ud_^9j5eVq;C`K zP)22A!*%;LuTIlmYu`F*3sKqyNNrA$%eEbcoM1*B-EG%tV)pKn60sw3lW7@6+;M6g z(QqZ`lQEU9W{)J8%iC^Cd}tsXUBc;gd?_S~7CV$Ixi?otW!m~%=KosJ>n#UrdHWEF-6)kmpp_f(e7;$I^in5C5!@g)Skj? zdx$Jqv?QvUwBGB$XEpf&*Ezg8x zRqzI1Mf1hk24#m#A>8K$!TrYUsZMJ~i+2!V=L4(L7dq)ndT4MXhmTWa-64rP`3Fna zAJW@q_S`iFlRP)|s6k2k2l?2@UN0e0+fE72aib z7x-X3>y#gO^fcZCKkxr6IpZgPf*G{DO~thS>G&i-tu9EcKbsl>Q^LaPB5dBVNg&7h%t z)PD}sJglL|Tnh*hM=m@z$`$nq#Fj zT$)wBBJUeZrSPa0qnAr+XPNIM=Dk@&%|{l)72sLr*VcZ`*5~@rYo$Se#rXc1`eKf^ zP>3tMUJQ7Cm@b=r5BD`T+KoD#w}~s6@8%oxg>vu#Z`QPDrh}i6N!FE8YyWf{0a!nt zSa}50yW&}-`|woXmZ04$ioI_V<*9&I9A&G#Yp?-iZ)cRA$8rNb<&8dt-z+QT;RpK) zI~CpZxyF}KfLlf9U_RWO5t_Q*E7)}ZD|;y93@2%1Q#bJE&aS>pqL+$S;hYh2`WU|g z)>#67eb$}g59PN#E0>!D@hf_9n?*b4kvlrTu|MLDH$<6cpKs~{@`3y-MGH%>5N{wf z;}tG)-x|+PzqdA*dZOgdRNBpPk`^7LF*)@H)idUpYp|>Kz>mZ5TH4Sb*S+i`kku4~ zEB-%!0Aq6l5&AEzku9xUA8fXq#v=;t)&o3r-qGIzTgNm551@!p!2K#w+c z^>LDTG4<^&HUU~lJokd7a(PAH6CScyUowidiC*58*jD5L4zF7PgC@=iOK*zylT()U z^`XvsFkrmyqX*LiRr;yaN|O{zwo<8phU?Mw5aF7^SkfcZC+>`0LFO=_xUq-#aEANp z1XFWXz01~)*xTs+v|%sp`4iE*yTOhi&!_yT0VA=vLek2k(aZ`J3+BKh&N!T0!Z=LM zjhw{X6J5{HDM1S%k&Hk;7rmT5^3W&b&d^|-d6Sxv=={`aZI?=wVZ#^@$>ng^>{k+DmC`pj!p+!~JQcgQj(-dSP*7=Sh4 zN4e-#2KM;%)C&xgjd0itmGvD#qAd`F#FY1FPWYPVbW-?s=KT4+M=b9R>KMV7D%v0e z=J;yabH`-Ul%}WaR}BQ9=+Ou=hl&A&)XC_qA@i4$S*dzACq(bTA6c*gNLYNqjx9k zC~{L2_3qLWEZ#S}I*Z56r zs6_eP>{hzLvlVmO1UpIPaC^eT^awGdds2Y=H4AO;SY;N*dGaL=D>@5(U8S+EMy^-7 z?oW&Ei7(Re&bz^o|7e9xAbwcx=(s}dZC$JIf^bIlvENEtD*KF43`8=KQA`&hDyo(a z^_y>Sy+QoAhVb!=!S2s$S*`D_S{a|;*ZSO1ZqaQ+PWL_nVw$=UwS3Y@2#!Y6j?iw3 zC*dF;AHVvWkM{Azg0X!F965D!MvV2rV)YHWb~LEQViv;d4ElG2omhLmV2%|DKyGs! z)X#tg;-@zJc`m#|hq?^1qpnpHU~QGN+$S&I7ec}J=Y+KAS?arnn_bUm;4o={!y-`o z9pLv42zw@c=kIAjB~r!IX1Jxt$}7GMD?HWq*_8LuA^B1e8#PE*;r2RF$qmcZ8}t5< zrj^MJlLO)YsiE^{%?`TQdy~0P1NpKUI?pjC02{~D)RCx1d&6q*J;yR6rnYIfJ@P`; zN?nw`;{UeB`;aO`MrawG5V|RsWMz?@zg}N(gHT;3!&iAid&$mErmHFvb+$gPd%ir89i-<+?{N=KakZ6g2OwZB_vuzvIEpOvULyK{2(nKAHB!|N z(s~#v(RhsjWhPjX-$mpxFuhrE+iq(g;CP_jM*z!OsnjQ7TbhqocByEc+Ee-Vn}OCT z^&^wes%OasKtSkSAZBGn(`F2+Q>pc8VcZGy*PW94i0B!JFnvok$EnXc zuu%{8F`gOORU7<-0>mm7NJ90X#ae9z5S?4OAYl0CQ_H;I4T&E67oNGS!u%??>E7m#JFPwGC68A;=UP13uD-^x3qcbi*B@1BL zRg%Z?=9fcJ9Dj&w@N{z{8aEry%ws1=K%qM)$o-3vV*#y`b~R9?1c7JL8;DMGtPJFKI+P^oN@CH_dmjb=AK3Q zHyx}DFq&J7icW{8F#GPLd8mhv@ehJa*fZm*HfW4k+eIo_tzqpx zjOkVQ@1@^1;|d+npFnJ{E05RG4}!|k(ofB z9`{t~sb9y&!7R=xen-)8E8Lvmms2 zZK=EJ9XH7$wHjiG8W*`C)80mx)~4Ihzz68cZTo%_=eW{#LHQ*zxx4q%`6mYJ4Y#rM zI0qjh5DL)B$D*6T@hiw)eL(y{Vim6o_E>u>R;Z{|;CaiTtYS%Ha7x~mHLux0t>;Bp zBlB&363I1#HK3y@;K`c{N^R{O(S?POz(Hh&M-#TUghQvW9#HX*jXPr;YaPm~s`p~9 z;T-LtAi9g!-1io66K4~cRUqrr9iT}zk#_bk<0bVQ;?xPFL$H`SADmeop({SXj=Lcm~ zohO1|Mlt@W35JlM%22j+On+^#Y(yy+l!$aTJB^E9!S@*>gebmXMmJLPtA0SpTpIH% za~Ovydi!<-&tmiud|tk=@zXG+N*TAr@<{Z&@}feHY%OKGUiwpsym2?`srd>{2KFi+ zWoS*3$-B;+o*1Y&25F{nkLVMyX8`a8CGBCbQgK;E25*~_J@oVTZ<^D-zT*p4Q4(IO zGk*Q`;$pwpt5#6}grIFLM=IIiJC^NVx^=I240R%RK2d3$M*-_bd+s7kI98MwwevXq z6!AvnjaAP&hx$NW^nEjLY%?PzOqg{`sye%wVQLp!g!sQ{HBDf8)Qb0KKCX_{?wvWV ztr24I=f=hm&3>m+ZgxvNhIL@$dI}Yh=2dhjq4)&xLy5MW`J8fAe^g2f>oFkC3c);5 zH@%MRQt?)?F*t>LFI{v;c0cX$g585HDv8WlQJqp_WXY&qU4@Ohe&5YDgN?8Hl_pAf zsB^a4uJ4;8c!0)iJnQrhuOlj;NMN%pmaE3Ci{AnyA>zV00^mryA8Mx;Z=k+pSZD9x zLZ61rial#Mj6AAuokLljop@`1Gdts@N|79{ughL-!&`WM#6)O*a}rQ>KTz%%AN1E* zT#MwJQ7LL5L2JktktF1?O7_P06f(pOHlfB35r4%Se6;C-m8#Cmco(PHrIe7-LUnTC zi&aF-@xrG+md7Eg&3iy-@JYirm~`sGr+$4_=k5^#{Qf}PC7$$8BqNd0kF-~L$oVT{ zvOs9Cd8%{0MkisTr9Bq-C5V4p{^|@_%Z6f%F*}1lvorck8y|((*kf}c49Vj@8L^d5 zQzjf$P+GyxUY)SVcgk~&Ms}Cuw6Y;wO;n02gROx?d0>1tI;5;|bn}ZZUIY(kGVVvi zZN5Yyznj$`UH*ocFQi4MllaE1mw-;oZgb}mPLB}WaV@;>&W3cdaEI!;+~-P8U%5xk z%uX2|YpZCGB{BOmaY?}81jgEPd$1?R>^58~gBTmP>Y9ndUX8ai{OxaPWld_o?QcI; zOm$Lx^e48=cJ}rN9R9L0H^-*c8`5@1ib^4PB2-Y zAVzA%FyWk^d-@lwPZn2+&;BUfo~M81^Etvlwe8wgLz_lC^?h`@@D+ zt0H-x>-~xG%QO$xH``H(s>mWgF0z$9uyJzLa|~)iHG6Ou4z0uWYd6leD`j+wLOBM{ zZR$4eUn*@HRS@jLD*Ju4RvmL~vQ9)b%4>(8e=L{GE+3TM=<`0@HY~^8TrVDYElyhc z^=7=lbvtYKNYss*`;P)vf68yW72GAXc*ijT#vC8(o_1uM$V=qDb6-{vT@-P52`2UR zMm*i^|JX*oFr(-Y9BCup$nF45t@2jg5wN;c8lyq2I^3Xk$X|y0MR73ysBUrWxovhsq>{3kkq#@@ zWAZ`y&_2zvoXe%{sNS=?Q-{W)n7b}E~@>N}bq%XjLx%JXI3s~b?*F~jwF-5v)a z8lhGXy+Q%`_De{Q5*{T5V-%MNx`(MWk}uWlxW273KR<{$K{K!7aE&?hpCvbINy(&; z*{(?Ts<;`gXoSm7PFqSAe>5|)2CW9C<70P_U!D4p+^+0eRxo|{>n+c@#~aXny2Jm3 z?~GT|{EUBkJ&*TMq1L2Qb?2Rql&ajnZ9+Q1Ov!M86srx4J9-rC!Bg@EP7$a8GetTi zA~O9udNt;&ygjfS7I*CHErge7c15Ua*Ix zq)n-M9CeuEG~a}rf&|jFhB*oWuIjn5b)+W<3tMLF0lxF#WZ|zS&j_ML0$GIM ztS+1>c&imcol-cOob<~{zxk=o;k;DIP3elHO}?dz?=p36mxh7gfw8+su|wh}ZY&C5-}KR*Zf9 z(F-&5rAHEm5g>0ArSVj7`YDw$fBW24q!Z=xIo#jWU!A#P&96@Q8VWk~3faNkst(=p z@OGrWIB&D0N-|Qn_~UJ@2xB6#`a;g8Ij--A=p!9}l~dF9H#rEOTCsuCzj5&%c%~zG zp!~ka&S$5~dfm?u+7luCzWP@!#;ImP?}=?Qjm{i>5Fz0E&(>_FnZ?l1m(8waAVeF( zR|yqU8h6p8qk7pD^kKw7Kjcg^%1zsZbD!VL!Gg5U>y7^~TJN?Ysc*+g?_$lS>791l zJjtfDDLuZDySU+C4YPJ?>>uXIqmTu0TaVcK=(W}x$%KGuGG@glrXSw_7G{xVth(>* z$<@GV&0bO4psQhktjpiv`R1m4p=Tv@HEJ?ZEwS3L*1u(cp>SylK*0NRa{7 z(kpOyeqBVb*BiyP+~93}?!>nxySA%bM1B263dD0%->Cqp@9x5Sicy-!IQuS8)h|Te@^Q8N&6MeZ#a_wyOAnm5{9IQp0s zkF^WExRzHJy87thz;~_RUQbj+}?0H@) zl7rCmk$;vkT{!IrsnRxMv-`E-N{d8=Rf2%R-FZH$fi3ZLo+#bn4|6Q0CkJiTGzp%= zW1vaC$q=(Vv#~01cx8%<>N{<0zWxCP+#Q}97=W}l6AUn!#>H0}8QzTB@-vDCF>v6~a`Vi`IUTdF5$W<1I5 zrBg&HFPa%u6YoM9G7~<!EL16;DjDi#9JGy6 z8Lku6YA04^+R2`}87~ujrBi%n=Cnz5Q*36XG^}D7VJSEjvK=gB$vCyLO)TUWn8I?+JOK3@`!+v;0@E`d&wve5De!t~p;{&hYO)ZFd!ParcW`4Or_HdQm7r1=a z1;ZT{3JbW&hrU_}JAr5C5%`UNW_yWlms7^O$@|ZzS)1Q1CNHr;Mu5`2f>uzwkiggfg zsx@gRz#GzC?~zS5nNOm*K&g4<;SIggv_B0&ky>#d4oLT&%Xn2&5ST!;u2-c)h7&^x z{rhWb=zvQ7C<2F+NMv2+DDX!l3Y;bUy9wwaAMu#rCz0?wy>T??FkBkmlG^K*ltEa5 zBHV8Rv&0ZZ^Be3h!t|dF$K}V7Jsye`q@xURBI_NO^@WV$c8M0>E(q9QULlc<;Wu(D zXN8*p42v@g;ysJFW>5WoH(I$K3HF@D>yAUa9`v1ST$Qx3vl;7-UAfJpYjl@a=H2!j zErUC9c6Gr?6;!t#No?^U4f617bV%O~)GlOn#$|Sc^!iapDG`OhC4&r!CPapVM{US$ z!3V^A(*K^&LWeYk6iaQ;I9>!;o-0;df60%aG*v8xRjz(cf9LTa%!$JM5OJEm#nO8F&nE3#%s z5m{8gg&T<`>`0@OjU1^G@#Z*XDb8FNjvgF}VuipKD=aF6{U-pDh9b#r(eA+X9!%li zZ4}YkGeiYo5bPWED|DV+w7i#Bu6$I|JdT3GqL@Zn!GM1R1L-QJA7k>nn#cOdxW>g9 zh{waq{EPW(K&PG(j8K|7gH4|_BtBBv*3L)X#o`1H?~r!H(q*{Kd|J(fyur9j;OarV z*{jatrD`rI!o2zl+>6}y>_NT%r&Oy9vk__}f>g;B0br&$!$bE<(u;Y+Qqw}HK5B!H;*{fc0`gQvjCThqLzX~KqTsXr>dKSAM~(| zB#~mfDhW+zWwJDma4C91Xodpbc7yinM=6PIm#?nTD3;HZ_VbLkQH~aLsID*Cy30f8 z-%A32SCO!UYmwa7c;Fq^N_!)Awj6o%FiUQ}lULTIfxR8Zt1&k^hkoZTuI65s3B9$8 zuDLB+AGg5jRWcL(7$0k&zsvON&M5|>N_Dnk-A(@mFZi%8}5w+9y zXA$Zr_7v=aYjOCB>w%6$n}W3sjz>3>W+A@y)eW-}W^V0gCXTgxI<^d`fw=h}A$(m;1ng9q{ z-4l6BlL@vJJ(&pe>vGL#c_M+2^`!CX93Ux^XS*YNnid5e_rnRKAwQMd@xe6NU;)ifv0{-c?6*^0~t1 z1Ne4M3$K>By48kRndZo&g)`WqXj1Usja%%UGrvtv4qB0mmYp2D^pfQRHxiaGDBT8D zZ&)ZuoTyT}+;x6MWpRn3b0Oa2MDuMcyQjLd-#e`Pvv!M@IxU+K z*H0Vc*WNAl7*(5=*w>N0oR^h;MI`?u10L_;|OBQSRa3g z>#b+&p(&6(f>KhkzMhbxggsiUq;@t0>7!&I7}~df0g*rS4({21_ZjqS>@n`KXhQn` zNb5swgZ4w333lG2dnVullMhDQ69IkqKBnA!B824r&4~>TmQQ5b zUqcM$7Q`@zxX}k05AOFDwtOY-Iqe2+?S-Oeh!J%6FV#3X3sQKY_Djs$i|U$+ zyK8;<;h)qyV{mx)uJ#F=x4-BUDLCriALWxsv=;}05twRt3{7mpB!;om+!0DCW_qrgAoEk^Q;vK`zubBN57zF&j&PF4vr?mIlgQH)%0}}J8 z!BF1jk!;2eR`U7Cj$UbtbHM{u8oOARdZ}l`Dvfi`mqU*}%k}RofsJ@}il8V`#DoyK zJ$6roop{bYdQUh%NTGUYzmerbi`{{IC=2Ux3`_voE zn-qqY(+a-nh*cxiZp2c;Eg(*;zOD?*6ARVEf;M0SgB! z2iyOJva_=@ak2dOu=tY-qlqqo8L)eqTZ3%8*j@Sb zs$f?$KK2C%tv~UHXF%9J z^>4%q(9lTmSqXqk==^&~VvN87rSBwaM5$mN8$Y6@pl_dYp73(k~0Da=QH?D z)QkW0XXEhfvlJ8}L;7#|1J8Gge(-!Y{sO(Dy7RQMAosPPYp&DF{y;?E(ywLY54nBH zeF*tBl5vR5Z8OM(PnNVSj3fgi8k=9WrWi-Goc9KbPR_s+fuNef5f2o_I=*Bfe7UA`tqPj`Ext<`R| zM?|6|5^D(;NkM6|!a1#WyTgC3$f9n?_x15j=j%Hd6vAicYM4l<7ZRR;@lpA_$%x)(@Fy>CIo-Se<@@SdMsyoD{b5TZv7sn~wy%N$%G>jabT$L|o~askx44zs=Pj z6S9kJ0rg$)hg9;pG+cU`E+@7(?RQuV`ZVqEC1x6vb$Y!@j*Yh~*Ok_7|7=ztP)NOh zMh(vI72w&4oioIcIsypQ5aA3Fw6O!vXJyS|nP;_-+((Yj#gl61G0Vu1%i0|#8HIMwhqdH== zi&iSV%c;uC$}K8PmU)-gam7X0YS?CQIpw?&>dp(#OL3}hmY=TA}N?$JA=K13OrRijZ%hPjx9wirqy+7G1aHTf7*BT|f0o;7_69u~Z8!fZ}0KbpR8 zAYTsv=J~f8m$YC63nJ3D|9sO+<=JADJZ5i>4FB8g>-DI8|^Am!^K1 z<0g%EneuB9xk2E`cv3as*s{MhPAQ!XKAe;~^=ygTv$m#Go#>+x)3nEtswtJXDR_b% z6I9ZvWUA#yDwR}TytH)n#U1-*dd{AhJPY?^`;Q6kU%s>kb??!&aozyP;8D9WJ*i+S zz6QO!yc)cCj&qgv`Jv8MHq}gGUxw+zuEAmoWn(m8GUg8FPhefK z*TiO3##5bnKfb-bd2Ib{3m;fKyC#~>qgm3-7ytD1T~_tJ%M!*frNTBzhg(lE<^Wat zZJ#ny_-7J`z2zwlt#2co-xw{2nQA#}S!>zF@m8@l@HB8VaEqc7Mvg~HMxYOk4-3my zUg4WBZQPX!WXwGEtn8EsYGhogtPgE8{JWbd+bAnr+G-aY?VBS;UNf&UO+^|=w*SKP z#ard*9NKG|rpwjnLpq2U1ef_W`6chj2uki6>}u@F?26URyU%rAC_PDQl)cG6#Q-W? zQ)_kIrQDS?L?tv_!(3lFlsfi1jCd4s#LHGHau;1V+q4fi{E_xp0x10>ee!(jeBzd= zfYd-rAYChk`K`k(SWSh36g_jilT%7^;@uHGHKm0V$wOJZuYA;)gemk>>gJX-grVU0 z4OYIHF6M@+i3s)bOoNoFLsCYCU^?%hUV$%#hJr<0Ny9Tz6Rcg5ylV31$a>FT=cY@` z=4(v0^F8zNKTm9((w&`hAI>z4+Fc5}oU=VrS6RK^+)kc`zgAj%_r3cPT;I4sXiFks#Uc#4VNP6-&izPmCg1W(YzwzvaDYk+f zNWKAnVW^4_f)CKH!9MLXYy}fP6J8jSfe-pX2QopI7$m4_LPrtfV-BKf!lL|zPaSke zhM^^fRUfd{gb<5|oc|m8Ib97w*7c_`J-Rbq2-9pV5Qcm!#``xTAXuDLWb_3gCqB9nDxQ4iC zLY-;^brmkHy01nT_SIJhLeC|M`%$SByb9vk>4WWxNb!JkD1!1T4A-t6uF@}gTS`9Rhf^kcBB@hoc1p;Yu+>U#(Ykk_ zE_s?HOuKCDoGrs!%*iWg;b!B2>r>#Z>+R};uk5UQ#B$y{>Z}_Pk_@^qjX0bI+Z-F7 zb%H6~NIZN;irfp>{gheGDJtgzXk5{IGFY?80lvJybNVV0CWalOc&ZX6jUK~zD(5Da z9piYa=O&#VhwOFkz3qkVjqa80S-|H92mA;Q|Cta!pMrHv;i;vcvU=p|IS3r0@5OX~ zH-D!FPI%w;_z)9KNZbnEGQMaEB=}F3-DdbO7>uROh@B=nueTrQy4HFQQlpub(j})f zD7j4taZ_U*mv-Gl92X%^C_t1GW88{+pzKJhNvWx;EooF%zG|zfEUO`?sc^0qbcEPf z=$tccYq!qZxwhGt_0C_rLiL&%D5LaR4VQDJfG*WxMY@!BEF%kG*b*p}=;TVN(Isx! zQcCAtGKFB+lFXGzr%Son(h`4i|7QLjbppZgmLprBs{KoFURYaHaM4&>SjGy6z6>Lf zHn1x2UsXn+OdwuUqWZkGwup@tK}{J#Q-a?OX*ctZCgViZBH?~6%=e&bn^*{C7 z!LaAe&eC4A;g1hoe4(r}&et4{#ne5+4e3ow-s}9FrYN^X!VQ@>OF@GCV3%;jMHC+C z(KD``{3Mr1`9&NayzFDSyHan~E^voZ&Pkbj^D6Dimdc`wO0OM!huSpJJnlY3FgQe( z22*46G=BB!^}p=LvYsmasz+?uE2=Ch+&O^q-sPMh?RJc(6?apf09|)|F2)>I3eu!^BY6~GI}Uu0W>Iq zE=}1)6>MdXbv|yTxGqklkmJwq6b0zXp)87+6GEN_%^2;l{tzfksN(&W;eVK!Fbj!s zNBTX&_bZvcQ{JxX##A{Y)Q&f|ajfol=*C?-gV~S8v@vt;mu^L8Isa_kOWlebY-4ZT zZ^56re#Qgz5xnRChH~2B{73cLvvNnb+o7J0^tZC!ej5Owl871kQ%?Q^O`6bP|qiCnJ36 zSiO6We7PnbKNOCn@F$ZzVMiUizOv*G&-sGUJSb-mM7J|eLAvq>rn#ec+#xE=M4_M` zyNPg~C|^@io-mBZW?k7DAZh*KDrP~wx>_caKjdD4A}aA)$(Ly%}M*e4w64n?5S`$E5?6<|`Cg7h zy};)k zJNx7^g2Z};(q3QwkDaSM|q*V zi6%!nE=0~eY1s7N?!(Q)Sf^Ya)H?oMK`a@Y%6Lc=h4x^Wjah{}l04y{u7biiM3Z7A z+|@XEjl3nCz&MVJI5r%OG7g40L{>=!H8+CwAgGPhKAiU;*MmGayzJiu9)<-%)$bPs zF?NM=3Q3Qt)|`@~4*dO`0q%>%m?a!rgn^K#LY zV&x^_X3-i&nJuwHXe6EK$==jT_aRy_wVIRqOVHcD$QAZVh^N?s!II*B-p%BkSiJ{WC4&9Lo$X zGFQr-Qw*)NSJIsmwJkPR+MP4Ct$0`Bcy?}?dgiU`CXboE=Dpm8h?ycMf4PlgGfhs~ zxQ*m9RZg0?O=dEkPyUhF88T%~8m=p7E`+@PIuEv=Z#miXx@QY+5p4+p4Bf-uig=d@ zP7vKC+E4(J?#a9xF)pKRCfh$bH$E8W&3>c|yAI!Y@A|Ux_}zuq3z^iw*_Y=JOTshc zFE#c5jD)2b3NhTKh{R(chJ~ex45D=8t&uQM9;UG8XJ7l7l8&0zCT7w+-!^Xq)(s?cLEACwtJo`E)nl@w| zBF{o+U4nOx%r2Q>v1nJhs{XCcLoq{R(X4Wj%x#n1Jd-t}GqX9vW6|B%zkX&5D>|pY zQI_h=Mo`?lz}zGEcK%Hbf|NRsrXpO!Nh+VL*U}3_(AlSN%UB?xYl5{Q_MX_iq+c3) zq03{-*cx?>@hIIngy6o}e!Y!IxiZuqwuLlR7=IPdO#&uz5{f?O)uHgu%cVNfZHX~@ zXUlNRqCdEP&pA_(c5L41ywwiibMMJIJn4Yj;&U(P9GiBB+oCsblVZ05s6P?7XLYXW z9bk5dov^bGM6(r5Sti-*bK(G$-7`A3=-u4gjsf!SX`P#T`?W4lZNLs-yT4;=nCUzU z4=xM8srcAbyp~%F|7dPmEL0|xHu%5~da#-wHDGo>?7;RfOdb@}Y6O(1mZV&zbJX)H zSud)2%4VtO@uy^yISI!pp(c{VT{n`Bx$v zy@XC9R=(K~H|ildO;IaK6xbWYe_&d@EC9YjmJ&($8UEJ*wKqL!3 zFBghsI*4N4k8(0V!a^ZTx)0~Mpu{uoKq1XD3AZ3tSa7$wLQn;n`PKRm;))<`VY%I4 z*NK=+Xw4b4k=Keh$=@Dz*Q@A8*R(AYM5*({>FiRNVRLf+-Mk0G-buE0d4-P2)10L1 zsM>Xg2g%1T>k-)@#G57&F$pLoCxN!(QleBS(j&)M5 zUdu>56SZ-onxmw2syYFyq{@d1=@>&QzUQ{`-uY?5BZC;tEKxR$n!^%8ky(3gIO$kjmOA3;m?6&U1X9tA2$Lj-x@HNo; z(NFQ^^LZ~la$|nIYbyVK4olPdZGZ-%pTZeS0HNbjZg%eu?k~f^{t{Yrnp~bz4j}S-XH3a*Wtr%i_s~*cQE~QN1(~=MqzFf$0<$qx zFX0YQf^h}SonjFNM~`zM?zZ>1sAFR`pMFb4Z>du#{HeW!vaXNuk@Gd{=O04p#XaWU z#=MA5<(~xj>A^U3;Lf=Rsu)$V&y!4L`{^QtmLPBm%Z2l$0La7DC@TVjLL{NAyx-pG|ZZjJgGKgtzmOJvm^5};~hGkBGxq{>gybVa-m z<&E%kdoU>Vc^sZ7=3XIL2wCiYYQ7+6Pna~2cKn(A-&1~g>6&XU|WGPYP?X{bxJ6?r3(Z z1*R!41`I_Ag3<1>Gq&vlB4mnvudQ$Omfv^qr$jt3&FkT|y%gC+KaH2rn-%l|cofc! zyxc(nSQpoKgdRNxfLMb)0oe&(XRkcU66c~hwWk-Jh8p#FEBr6T^GQ>N;=e^e>8s=3 z>sePA-YGj`z)&Jk+;i)A>CY+Vlo6BIc1?ehl({@5B3`CZ#)?n?$>}aB<^bXsE~~wM zR;xg|JE^%qw2CKwEDRsajltM)R~*uvQtgqoK>z74IixdQvN+{L%!Vx0`Jk@qD z1HF+O$&a6Q6b&oPhvWoR)QKgUvztz8_BJIVt`_{Fr{{6>^`GGaHYRq0u2|g*HiF(m zjEF&L*{Uf#@}+a;(!!VSSa1K#GHP)z{L9I-H%+C9god6A_+%1f8IzcBHu!<09zJ4xHA7nv0?EIRr`+=674Lwn0S zB2T%F0DNX7A_Qh}0v|4-RkeKeEGaipE-@uX_&!XjDLw;MK6y#Mf>O3bQWR;s>SmuD zui+r{#gB;&jL?hfCSe~cJA!6Q=WuI>aA_?gEBENfWZ>_)a*{lfTuLFbLo8j2q^#+i zRToudmYiXIM_=$^j|If-wW}P9hs&8=gi1&+E!qMvhTs&-GE}D~sZrUyljSRwFD6Wm z2dQF$uh9kDXT2!`A8$?cYN}F3BvZo8(YJ~?X-sMPNFgTRlUm9%u^Uv$FZ{{z{|fR~ z5jw_Z3Zr@E_zZ8V@*x!0vxs~I?%oofdz=S_`+nm*H*v3$S|^LwaXu#o%5 z4l9bcD0=s=FN>}Vlg+Wn=dSGs3xTfB$m`~$>bn(rT;5%|yLqhjkk&RL$KCzGEertXmZv@BPVm$7s%Hv* zi2I+a0l44T=-8C@_gkS#m7<-Om%S1Wyu{(l{!}~4Q*RG(D_?&<2bXvEed-Q2dd&gB zaZ@nmfnfja94JYdk_0$P-W^Xa*MKWa2b=Bng{`GEMFXt3Wk7jFtT?(hMk+1sgoqIJ z-cyPvzkQmDOL8hY*1DZ~)H*o`KhPr)(bSYbb3Wwfc4uqsjSD`+;Vd*uM|5G}HBU!2 z^U~3ECXIFOGm>0$eucdisuCcmwxcb(xZ%@WFvZ!_g)8J<!#06m2yOAPgUj?^yiCUVnX za%@N_Se3D2<4P^=&kchL$tz?ofx*ei%?aoTm;6GRgg_)S{(ORt=fwaTs1`EUo9Z(< zeA||#dLi^QJ{egDBS^DyR%_7Q$~bBZX$KOTa2l1Fu2kef?#4RPHsXdUZ{NpnZ$|d|Wofvi*)@qFNB79kP-P$PkYJICHl*dSfssuPVYanUS78Eh9kTECbgp0QQV zB-7Chf`N!ms6IjClMyImSlg zYfPBk1vG?nr&*EL=O%Ch?YK5d!&pPgah8H8%-GUU+L!_3@Ja|T18x?(0pX+x8$7VU zK-O%@k>Z=U6O+IQ9_(fl61RAslWZ0yyG0;iJuvH!?H500e# zPg7%yGwh6no#B%LJdyc3PgE293uNIAdRtrn6Tc>~-v+(#NbS62xn#T4@munSY}#FW zwDBZ8*)VH)vHNQ8g5`VNzwWjx4Lj740@ zxv9CmiPEMf1#BJ!dlk|s*k}h|Yu+LqeEqTN>S&HgH!I?*L-`rGfxnyxZ&H2jVDE|Z zMYXL`B7Cek+Z8tl`X0RI&k^M^+v8AvCC~NV9n&$J>If_tJqUS zL%|b0y*JiwJogR1tE9}jFm}}EcKJEGXZFbSOV0ydlMgrx{}=2W>&Q;^%bt)()zCxf zv0_RD=G}81zA{*;d`jVKl}yQ$`;792?_<|W@V;V=*H-aRWA~I=Jz-b8w%TDg2@$BP zQzD8d5>XVYM5q!9dP1RKPzr`5#qILA-7cHes<@mUm&;j)ZB)nvH4-*YHdCop0hg^# zfJlz#RhQG^I%c(kMHvdpuAf6GDb0~@st&6f9CFDP)D`|&Lm)@?s6_{AK3Bul1nOUZ z8q%>L7Cy{bDIn%0znCA(Gs=%C%w9dqJsllRS0S?O5jKK5Us~^vS^tX=kN`usr3Gy| z3>ysg*chA}BTgg4UT0)8$R?i=&8q5ZOCb^3+9Dg7;N#l;c>Kiawu^qJwDyk$G2kro zE-ZMxu7Go4?e77n-%;e|Z;;ALNvd4?bJ`qmI?Al+d%hA^p!~xR%LA?w-@Q?**WnD9 zF?uAn_73+JsRtXhsQzEU+weZz$7*&RxPWVVbNvIJzym0OkZLE3)*|8EqCn}HB~k(Y!i|F-w2Ew` zec`fjN0j!1!)* zv@6Nh?n>U(YNeI+SlRN*Pgyb$gVv@z8lbp@5ExrFqz^)IYcwHko=r)x8A7H&N!n&8 zq-hwY!9z=k8*Cu-N89O-JSLfvCett_%`hZQ5koUTn*_-{ceSP=Ei_c-+&^5DG&%XvIr?i9;VWXBFW0=C;Je2TG5x>Hd6$EmmAY_@F^_t;A>v5!k&e5br&jB$4K7u~Yjn(|DE_%IyW0+D-hP0&wfssZ zU&^$ScWi4{rjR)OS0k+?Iv0EIuN`X`YaB}*Y&@7c;hAV+YXp~=^~`FbQ}HHM_cy4G zacCNo(-#c+L!l&oB9ukCk!fra0=>8E<~WnwGsmpl+F!!wp!(dn29WQcU|E+ZIEg== zAn$}uz#F+iH~S};zwvXmo*HTdPJ|Nds_?v<`Zh}A-Pkdc=F27SDs*Fx)Ccrpu6&Lw zVJowUWESf>BzOLOMktaH0-{!*tcwN=9WGtpvZV?G{GcK(>T9~9 z)plG5<(lZ4M`b%nH+DKKn&vD5JDkW_rbY=-ubsx|qvFcQuO9f$A=$xtI9}Q?wQk>g z$^P$F-afuEO0c`19x5 zj~eRp4$QD@0%1R5T?o6#oQFAsc%~mu;zKVWS3lpw;zP)VPa+TXW2n|~#Nd-h9aDIc z8aG_6@Hb@vE#Cs|EVTj`D0Hk*;y zT-W|(MN)B?k>Dfv$V?;;PoJfi(ucvJoHg!k_TyHRN6V4TF4l>wq;L4YE^cVqUe@eyKnEE$Oc8Xy~a{SEk)tuf#C2F}0%9)lnZ;y*0=txZ@MLpmn)- z(5j|)*=R~~{Xfhd`qa?lUk@nX1d^_DP&)#+)M4Yyiig=G@#}OWLF%Bzmd$nwuw#2$^7$mm$4iub)#fMGtum6m4I#`;43GEm zb%Lm`cy&Yn;NrpU9i#7Wd!3HlLRj$kNHCzR>{+8nn!hr%aP^*(m46Hl)rq{+I#7r! zi^q50G5#R7?STA04SsYp{Ug+g{%H)ZwPP>q(K#;6Min(1i-na;v$rkMMz!gko#AGR zvF9)jGlE>F^L$uNrcsJZQ7K*1!s%E%DR&|*kwi$QaFUfNmg&@*wIoV&>AtirJ&ETT zX|N&)C%IS>DfJ4~r~F)bU3pizq}Y`ed_9K|_XBPhcZs7pIeT>qGgXNy6v6ryio`>7 zcf%6;KN!S3ETI>bVF5D?eTutMINeQ})RoiS$of6AUA=$(wpp~FQ-lm}=>cei2~su- zw%USiW(WVQDisxljKw0DKeuYz2Lcf&KZKhDRj~+A*-B(aIBXvRgf*_pS@MlnD@%sV z?_VV25K;9Oz+ektkj5j1$WWLK$sy{G6n0~WqF_;>-TWkVz;M^5gxXqO2)i|%tZPvt zZcL>c8})QpbJ6A_&Wz3Jq-|kW&~L6K9cst#3kMS_S;wN8a5Soh!wH4L0#>Vz5G%;1 zCpAq?CKA*nb^nWsKdA(%5KO@_xLq#HghMLy!?d9wls2@iH@!SPlpaa%OrK3V(!mzW zrV0vq+$RkAMtnPcmwdF>hkbJMoQ>DnRV;KbBM<_`3OXEO&YPzg01w0kXx43BrlSJ` zIDcTZ;l+%JvEeii*3QSH$JLQtlNQ`U|{)hAT1>202N27CU_J11eHhx!0@LuZwQBit<6~FIl1NPf7_pR zzAO+&NSIYXCJG6|E#wmh>xIGX%@Yu;v*#Csfl!TzK3K5gO(-{$WK;dMXh$wb+&~nB z;&WUBbN0dEcNTRl>6^2v@-g-lo?UY2k;tELE0g3YqVTW8${pcIENePxZRKT)(h~+8y~tw(Xp7rgI*HowZaLZA-N|e7-SsTndpoF3%Z`Rl zEjk~Br-6x@($l34sUs?-1{eA@qdgf<8a*Sahf_OKPp5vJvZv$)`;OyC)qBkt2(Dzp zVd;@2NIF;MXSbGSPD>_XstN^~M0~D!4*HzfR1dl;C5e(~IgL82p_vcDE+`Nry}|sL zo3=gGvK1t3e|GDR11(F}esjF%jy30h_s*jv+0{EI_U}Koa6#Ko-xwJ9)8QlZybuBD z&nnTMv7PHWR%9Z4DBSSa;I5aqw~<>P5NR6t$^PNq^=e%(zIgHI)>DAaPGCj1$%-Eu zO&~&9B0{lHBo~i|L!diZqB}lW%n3qRjteUEC#Yq45|6ydal8ru!_=t%58qWD+{AUp z-`mx(yOO1qv^sXRmb8*3>oAsO*+61~6;et`a7`EjfkdIj3E_gfI<9Ic#iXNa~c~Fm)!72`R3}jGc)HQ;Iv3I>!LA`rb-Da3=9+4{7y>{C&TZ z6~p3B#EYUrFP4jy;u5h&d|f;u_KTGGFYoDUxp37EVZUILxIIiuO*DpY*~GU5V#FNA zZivmja(nn1pL>Vj#nU1Gf~TjLe$O%n%;Bq8H(=fHM)``Ika%b~MK&p}qa^pkn9rcm z-3FjogZ|&!5EfG!hNX-E=Fu!u#LQ(#hBrR9KjVm)s|XYm-EREv9ibZW#)mSA1~Oz) zY`N2kf12_J_A1Pb&(n{S*Oku$J($x*`!#$COr(2aIp~I_dHMyof>P)buau7@}X5LVY0xxtzB%Q@A%Wg^4pzj;e|wyEUS` zJKO9A@b!rDVQkWO)1%M?E|)d@ehH*mid zws1|tL3K0tj&L~KrhZR%j5{uLIJ$L15i`80AZ zLiybZ;&4pxh9$4pExG;1T$430Spt&-kc?{Sg2@Ru5L*m4_yH4@NDVFF#8iV4Q=m+% z^>e#eDOZgju zl%#KgQgra?p;jYRNM#c*ves-o=FnG90SEeuDg6O{g0v|vm1a90Rvx+cWlP_bYzQ8~ zFzJ(@nK`UZQ^+SzT-tG9;L3v=DjOP>9&^#GmC;r0n!Bf^2J`7`*>7f_c>c$AFRnRN zRsZJB>UHgUcEikN4=^^Pfzb=W-Bqc}c;E1C16x@(Z_e_CORyhLLc3pxP$!}|m3J)1 zgmoRjOJzcKns=0oS>^UP5xjauJ((Hfci=&nIn3ya9B4kE@~y zYqQIU&0k5wB27`=EdK)kv;O_=eR(Hfhvq#;d;S?^H+5OjM^ba z&1}a4_=Ga9j%%KU%ap4%Yl)YcmmT%ajgFJf_uXw?3sQkwEgIIJNZ&Z-kjo5SUhN`i zKsy4cvtSePOz?47lCc`RFc|#fl>}4`f8Ex%_3W5~lYi>nvZWUvitDLQ&JBNg`podH zbNjGFDyCyiy4SVm>eW5yKwLkFw(}TbW)R$JlNb~~%*c>q1?c9yxzGF0`~l~H^l$Ht ze082V-|_=jg|{OA30K^^IDe&nCBMSEk=I%h>D#fFOxz;V0`n^Gviz?ErApvgvw*6L z(JQ>lzQu00H3|F7`_OkiKBGa;b9T8;@}f24?qGvK3aB-$3YGY_Rq|+bWz?c(C*17( zz)3iT0#5SbB{%z^-skjf_K`k5bY|S15!>Wq8LzDvLVF&>R2xiYYvov_%s6;$9Oop2 zjnJrvtHyh{WqecgxIt+N>W<`DEN4(|iK-*pPM!Y8fu-H^%&fus+}^J4;k!`N{Wmg4 z#4P!%Q?S}+HQd;-_wtYCa#llV#wtjj?}l2;h4pCK2N4$>Xx^W-&kimR5;$ZYMqNV* zm0>w&x+#YZf5h6uR=eG1bvqb~+fT^*P{EU{T{*4=N%R`RJoxTVA1Qk5s3l8+Rvl%eu*8h< zq5}leH(Oj>{z;@&zV!8050%G{YSgGzdSpGq_(g-YjzHNo4$2B5BQaY(d-3D?`j21g z+b+Ma>1o>D)3d#)M{)h`8mujU?y4WC`$hk{F4&tva&uo_Ge$B28qjRR2+2HfflIL! zjAf^pC?;kQ^N1?q9C6O{cfQxy%lFwow_S7IvE=Y#P%I&)Iv%ypaXxKd?5wu0cCNQ? zvhNgkI!-9{Yb__mGvpcL1@VGIMV&PWE*El8L#||1Dj97HQn+C&Q&Ov;{s28`qV;C&*~V&POs5{}zBr-MkOZ;nbm zL@&v5A23Ie3Dh!f)rv{?-nCrY|I9}Zn{=#=E&8&tXSg5gyFP-)wjM99tayMZ?zka7Vqy7>mvB*rW>YLDY>t_0%$LjxGhe#41AYiHv8w_lFO1PI{ILfqR`3rS$qb#&JsaYf8ljy*Bd}ZY>3uQ4Ht)zAJ%vUn`j{v_KUawe>keLsn z&=HHwh|R@XU1*m&$JU7CVnPzw>Qhr?gbJ#lKi36a48zjR^ii7B)0OlR z`UriIR?}mEK^(Z<$7d-=>TONgnFA4tiKCsGaF|C3fM9aVdusn$+6~|$A z@P5UJPq4~Uz@8ogLVBnrNEIj2-?TU=kU;MWs3Lp`XruVUNtQ6Oy{Y5=GRXy&j!1@q zQ|ky%c3oBs{ZgzVL}`gJT0CAl$i|HK<=JYUuJ{kW{qLi7`Tr-q>|>ia?>K(XWBbnU zzB`{^&c67Za~$HtAtpIHAu;i>EY8|h4edZABjzO#DgsrTK{u%{BU@WVdtn6us@iG- zscZj1NNrxK5H@9hq|@3Cv8jtRI&EQSe@q%_DWYszu)W`N=e#tCYSNPUe$PFA9N%;I z`+k3)pMPxr;?mN^`LT~qocQp=6DK~xzkOYIj7!_UmfT$jfF4ATJXF8+-X(;lrVv&7 z=9%AJIeq5J70|*C(880Tg*NmZt?{+cQWTq!4;`SNp--YS_&oXreg{op`&;ze%%o+C z`3>_YW+B9ctXx3%ZI2)eSQrQjLLjJci6$L*k^`w^vMHq`Si9l(F60`pxmVX8HE_hkR)glGKF6$9(4K6RMaU82L1G-0?7f66bb(-qpnET;8^Cq z`DHSCeB0?=gFhPBEsLUD`izv1-7h{fu(j#P9=$!&Q)7>=Y~Z4$oju*J^cMfMqF>Xl zXB(s6E8bk5Fi;89`zy!>zlEbrK(NQPdPQs&HSuwAzj#c1No2e(wod?#rJc4ui$!tz zCGo5eIM(z&oufCRDXvE!?~CR@~>QZ{#Yab3%~ zru8f!Uo7oi=V{f;Hvpe}{y2J=?7JA$o3V$#h=fD3g}ZjG^w_=IYn%#LhWOHC>HDTO zeP>nFIjw=Ez??B_+U4n&fbOJYo>6KPjp9+$S&#cs>nqlC)(g^%WRa}l8IZUHYPL9_ zU%mLA*{nE>4Qp-(9ojBNd9T}lIzj=u@6kAnO{R$KbVaMGddlx z8BSjiF2v}XbSy?0HttyQaEXY1l9G`ulP`6$ITAG%$XgzW$+8ktq!`uMqPs;Zl~+@# z7FB6f)0{*9NA4!O+wHI`T-c{~P@bS1#KGWeLNMqPl(67U){^<2L}DPGNYuuaWV|L` zQxi?ALOQL+1TXK6QZa#|Vw5*sBUoZc>5wE}N0_edNVaq|HYStU(ZO?+wF6nn5N#7P zm(kCuQ7VWIR0>Vj08%nsyt4=a@IAW-e}+@BP;?;Z2tQ`t*w8fqrr|CBaUznvft?Fd))g1~ya_yQ?dg4n_u#c)W%n&- z+-x?xY>VFV^@&i8Du69ccsSKd>=7clDDX$LmY`!m(1JBSQ@%~9<-3LvjuZ&?!3tQl zt+MLh6LC?E8a_Efkp`v#aqHW|77kTL6_bb|w9YRP`sJEt@qIMZpliiNjALJE8lBrm zMx|S1wxjea`flmRYg)(upd_&mGA?~u>R&b$bQBbI85AXeqJmUGQwM!VeJ}a|KAe4o z8G#b}2qE%8-&u}Rf)s!ug`ynG_Oi3Ai511QZb*#qD_rn_4tVOz{&$=B-*W4)#?;|j zeQ>R_z+`z`uVp>0o;LSpPrE1U+2YYWU7l_mU+c^`C&S}O^9Gbbc!xB|3`)nCW0EDq zG)vt~x3q(?q^zx5bbT(gqxO7fd;6A7rPb#lQ;{f-w(-B`uk*KfGsUyK#+&%Oo98`l z#TS=#P@oi6!Ad@&C~`!JXHv#w3)_NQ@=Yx*sU{_p*U041LKo`F=eoMIoYL4tM`|}V z)>TO~V(MG94k}OASDQlBHk*lQ&1B+npWWq-2K<_wPWeau*nh9KDiYmLOU`RYYjN$p zPO2%I>(pHS9Mw77d9~BjDfZM~H10lX(5um%LPK^Xz|$alH0Te+N#sbFoZn16fEK>; ztT6H*n4pOZ>oBn%Dk@YFtxE(&yVGoO#1rNXGP2O3Js_hxOTCPO&JdvtzzjA^NCQ}- zPypNrSCqEZPT9+!Qf7EDmx^`A24j3n^%?M=q5yg5#)ilD4GI&38z;~u5{i2+vbio8qJ{VR21#kyj9g^1{jy; zIlIjs4K0XBBn5@l@%CiuJm9TJ*mf0}Dr9RUXYmdci~ogW|39u3!ji?xSZOP!B?}~6 z*ji<med@5_!aXVHClyR+|S{d;@ccIo-> zH)3=7A3pi5XGhl3Z6#NZ_kTSR`N>1Y&sOQS|GBQ0i=VGc5MaPldz&^NR; z-f#8`0l(=3^nqg@|Jm{vX5K*`W)5+92oISLSr6HVT}QYf@4kM4jTHJ2~_4ux1MMePN|oW^5XkgujSSVn8G<|%rXzDi%GZ_yTd8r_%(f(0%2 zEl}JRi-i%=G5`_ei0|l4remea^aFtk; z0vpZ=$P;1xUqSuv;aFtGoZ z@p6G};=bef|9|J4?epV&51*g$-TCa;#)+K}hd4bGn~<_jKp1S{74C)q<%Vo+~c zU%K4q3zmmPL#1ro)z3)MtZ=%dM$nN+GnzZ7p-Oe86&syU;9ip%NLrMtP#6oe_-iYH zQw}lZ3(A+4ca)pTebb-VX%HOm&|C{*IUf-m&gF+tdm0LYl;cYU(EAs4=HpK3c-&r% zb4L}Tokq6)1*Eu-Y`N|-=8qRwYB**@JoM}kl;>$7(N5SF1(I~kHEcGu3Kk&CJ&w%y*XH!1`JN%ncofQWv zUrD`D(Np<)ian&l{fTb5J3$)x!3oOXg9u^FW}EwJX)GIKco81MjJu+`w_R5dzm`OoApFj zut`@-=`G+sO&mpGr%8YSFE~XmIPRcIU5A;3D`FLfoGJgm_Xy(9s}Ik8!N=21 zUd{OG_n(7nbnE{8kl!c0y&tdSvcVTypY-!SGq3s|?Jj0?I2`LC&XoMkz}PLah`Ov9 zepJ{ZJ@voHzQbQ@dXK*$-e~+w(}(;}=3djM{Qbwlf$mjA$_2Z zjt&FNxD73%Y(pBi9s>NpmV0#OT!U^{vh_`z9E|c&PorA`TA)FK^)gzxCbSjvUI}=- zjWZuA&mk}4*K%2Dh6IFJtZt>Tu`(8DD4Xta#_6BbgbW=#Gxj&&LEYPo+O|=sN8NiO zEarmQiOxl7byb`0uCqvEttfVA0$Q?IalI}#+M%TxOKh`%M73G4G5H|=JLqKaOQ*20 z5b!cdVv)LM^kN&YwwUg@-N?M)U!w?P0)-#e)fum%XLusiWnvYP3cU)alk1H%i)xC> zF50}KMVnK-skiytOaE}?$_9(ufrkO-^QfI2hq@LnDqh(#Z*cEXGFgr)byvtQ`f{;s zL$WRx4>G)0UH{0_ho1}!PJif^sC?ZisXG5$b4xlcXP(M^Zv#%9dyw1GOnX2jxK@aK z5`d0?KR_I!`{)bwyYvuU_N;T0^Cjo&&datNHp*jxW;{VmaCO0LF`3MkFmwr4H_NzK zPAK!)6aDbj0vpmI5wiv%pzMmzCTubF!#4^-Wu?U`S16Z3&=r(}D}(2PWyk@1aH0wa zJyb+PXgDATJp>F@&bdbQSjXuVG)06_6*>I@+Gg`xB|r!462OKR)dDuPZE(E9S$*Et z8%J$6PJX=IYfA`_-M^}fYj*9b*30#R!{v3z|5>&7=zcx?U>M{w+}xvo{OYn=+2Lau zhcf@CYl$?z`7wS8pX1}`92b+zKnzV{J8kL{iMR;;7RIViV0+qPw_7b?CS(X?pv4mi zcs=1zOu_pq5P^|7awMY2;TRMdK~^*nqdi_t3WXSpRdX?vppZ6M2EZfY3}Q{VSlKdQ zhUR|w;fXj3A>&3hhhqpj$YK2)NA)Oz6w#QxUrr9k$8CXz1w3r!$#KKQ@g}M)%9~gT zaFk%2ywQeysSVEpH)=l-nIUfMeZ%;!QtEK^Pda{`P5s2SG^WW-Jy+KizOH+mOHZ}@ zzFWuePd!GgJ23mvwM0mVv13vD8RPQPe|hxe0D*?oa1Uaj!WRm;ZrIKB@T5%3HrXya zWT(u?D7k4c%RR(@hxjhLLRg{pqL+^FTtR}W*Xn9&1^P<#kKH?oFObaK>%$kc3uAIS zfWzfTJ4iu|W(FwJs?#G{jj}Y;|VRz=Gk7BWKY9( zz(Z@nQQ%-T*THph*Eth+7WSfwib4fx{c=we^aj8|`L6XzMf z_q{vY=lJaV=lkdQa(8xP6N61I4oP-deBf5?h_axK3M!NpX{qr0vuUR3XI1?Cg2ZPD(&Rv*hP_?)`I# zetw?c^Lv`Nb0f2zHSf6n|YeNsD(&oi^> zceOLdnd0x&tJ+`HIqfrbUMqE|8MTB#B1SCqf0pQ2B-d-%S3PZNte zCx-b2mJRa@0w&Ba2zWWn7eS~ff*>m{ucVyHhknVu&;5feAdWlEa$JOU6D(t! zVcur56(gH94c9jGqgd7K*`>{amu6^NVHw6wD+;u;BBZ5mK*kyvVH(-G2C;@|jA%Qp z!U+|>kFHZ1dIj?BI{Y|kbUny1)K-M(txUY&JEm{TJ|FQDj&1XNA~K~T{gQ!Z(T{>| z>J1}U-){uPQq>5aD1gaYU$vI5U;Xn|p zcow}C@T|QvjnbDC<_*OMn16d}eLrzCgG1HuvDA8mKNEU*L+Igt=;39=2a>8)*&yBj z8heDr6g$ph_5!*=t$CoP?oLds^!~+pLztg1g$8+O=nIC>m@xIl*5;iBvPtQ+kcx>) z3f1tPVPT#GjYU#}vHikj@cNel@vW*XmGsBdVP#@sVtV?~wMQ3M>T~qnj%B%Aj2SUT z_)-+1y-t*-3-mHAw<}ea`(*i{HTuxx+1bfotRdz42{A7no!K>ebw~07IA%W_0ccPc2DQ7CTvwjI( z5P91Y;%0p6JlcFxai_qy1Vq>yro(@% zZ|O$BNgXxO>X2%1>PD~`0x_;?BO)}`k@`kUsv%L5kvV^KA2c*y5VEEHfo{qt}~n=VjQxNjlyx zltI~Dq=asg-8}lBc_gZW=m#CDp`qqgqIGnMSEDf8J`)RfV5NBriLI(is4=Ljqs<>M z$Dpb_NX3mhrAxY7;vKCY^^4@*ujiILnZsezW7*?~WifI&M43w1m9+I5(kim1DY9$IUQeE^zFa6&a)m-Z z=l0}W+4Jn2tK@R72-Qs?g_2|nd9Wdgh>BUP#1Z|J$tb>QLcwFApYncBuU{(lBq?i) zh4)z3t=krDnbj>UqF8~o**)xa_BI<~jlQ09A<;vTejUhrT37&ftPPKa%>96Z3WpPI z=wPf|V%vlb?s0Ve|Ej9xN8#bq(U>qC8%8Tq%V{UvV^VN+()Ky{yUkY(%jDDQ0!hSa zv<-bD6x=tvOhG9(KL25upPiu)ivoX3e3}ahd>sF(m1dBD_dg)HsL8TMczltf=zl@R zY1C&yJQ+_wnZ}ZFd|~M>#V_5X;uJ&Xo@j-RMj6_Tt6|x^pekxvzPsQoDX{ZxZ36wDO?;U6jJ}nX@+&Q)g6J&eh z84_F5BMgy1hbW{S3_J*YhDo~zN(()(8u-7Q0!~||F+jV8Iz{H8RSy6=G|WL%LTTi* zr^u+&j~s$AK-^FNsc{$&0x~*kPQ~)Pw`xHgC=le_d|8wPI>oNt5!7H^0(_X! z1hn4uK!m6?jZ{rd!?>mque8UwYIh+dzJU!J;3337iAJK42%L=I4W6WJ>g|g2rZL|C z^rpT}Rqd>9+_zOXdCvAW7SR{o?z)lY@u9D=G?xHs^Pc)Pnj9EqXjPF_ni(BHli%8} zOHv|EvzrH+$7*AM)lZuLrH4YSt_5r6Px+1e_0 z))S{~*jhjG?sK2_{k~F~!yo(JbHC5?{XWlgpZnZj&%Ii7*RVibo5ZxV%mMdKX11ZtjIM3G zpPpzs)hVk(*I?jWQ;(dk>4_cnuhEX3OQiKDiw2+X_2|RNp^FJ^62zVj*`pq{_E`VL z$>I1*<$=oyxqP-^zO4XTZ@jviJoRumK0G0C+5K()#03t^RO`^%f=@IkHS#goq#t^d zG*3Q~a?O>UdRWfN8AhsPpB$4qO_RUNIc=|p^)8uAF1%dZ%W+ASaZ)0cQXp%kREk+q zCFAL3%5734TfhR@AxmYnq)4`mltQWZ2Fqy;L0Pm`$|a8#&#>aS%#*RQOR8lz++@fv zq=KMs+ z>aQHvPAs^`5cWxf*XdB2EX%!LR`7MWD#RXa_qr#GWA? z=!w3mJ9UsAMS2gh=ME%OFAZKOd{yQ{eFgjFp}i!1O2=wpRO6Ag`_3MOMjs@^tu& zrqNFlkDwk!d&@>-wOY!(EHh9q%geHN1pP15j(^9|X$D8VRfaEB?j=pmjFAQ9al*YSRH`Z5x z7D--#|Jj^#xZE$@fgeKs6#Ff*YWN z!#u2du@{P4Ae;0Mwq2D;ny9@s70q7r zzk^CCZ;ejYN3gwYH>It#b~97p!=7>^Z@y(u5U^(xk@8bn34Y3~ zN_+u;6N}T4|0{K&*2DQ<^dR%I&_iyl_51&a2j15xH#yyOygVpxBcYX8{vNH>FC3pP zSkRB2Pv6qt#m?&gi=Op{wo*qKIvE(Yj>sm~UjMX<$|u@tXY|{w^<|6o9&>Fq{%+$5 z@@v;_*3IsJ6IN~Cjqqv@=W%D*Bu}~TsrcvuSubmdB%s#`ZDSYmsQd_doWwQ~v49Oo zVv>AQTA_!7Kt0-6$f)hIM%L)R^`c(Hzl(LNUeMFp%PT}`Z{RmWrI&udpVN9?_d@Xi zQmACFrpkG&y%sniFAzVT)k(nLfLeV)|9MT?F)5g( zn4GhmJ%~O46iB1IuV0|Aclc%Tl(-2Gt96yu>D#)8IJh6n-9h=&Q#18vdT-o3dCRR| ztGo11x=*(Oxejt1gkw;L1e$+egL{|_#_rEs#pZX%*WnqWlHD2p?QpAj{ms!F3tiq3 zLF2*pXkm@^*L1lE5(|mX>BP}F4vT@wtT!BqW%nVr+I@EqJVOh6DAS4hpza19bTHd_ zky)Z|jn{e6t+p+C+fBUiYjGv`VlxkI39t9un|SaI9(%LaJle-rfIWWHjC%PEtshNq z(#E1g3#}h5Zq~-+NmL>0Y;=8E@U56$Tf$_#G#X8#`j12+YbQj&ZXBwK0&bN(x(*+n zfxQLwyq8X-*`qV`kj?~NliOWXIInxI*Mcu~BKc+~y*O_AHL}f*bIlQYx#V(-yfm*1 zJS>qfHPPiFD_yRVK^~Nby^SLK2!NJFcVINnq0OiwKej)mvK3E#l5I<=M>6oH(=NNK zAqr;j*D|{h-qnG1TU=&WNA9$Y$ZGj=2rnDVEX$PFJ2*);QishglRRpgbMhD!MFJ3n zp9K6h9tg4*o~!+1d7z(j+RlCqSTAMRN@T5#1>wN5&Ff=NB*yIgN(O4^#{oaPuL2@D z?Xz;uaqLqukI(r^{IS?lL=D&1Wnk0jSv@zx-S9>7dte?=B`-5~Ecek=*+njC8FCF( zWh#=(h)QoDGe&UBRLBemRY>R*?^)?x|Y43*3xV4no**k`B<}I$rP4e7-|ef4r%ItaclM?+nrqtLte80=7qXTqj2> zLgCysYIaszLq5M#kGeg(8#T9*deCmuNXyyJvM!{Xw5#s(g#BvaGY9GkwhpVRhhpS@ zo2J{M4%C~kZ|O+wr5*KdjYAVhkisBtfIA|m#DX6nn-#D^zRg{2x-LTxYk_W+CexR3iJ3b`=@>IaZXq`lpEZm)K4Y-vjaU=gG_OcJVXSDlQ^mAMO=ve}hM6 zQBl}VozbpgSMvLOd6;$SoYYpAK(iVthrC2DQ5495?l}3m^W1Ft4jx+WZmy2x{i#3@ zKN^RBTLrh2xZ4h}TdWna%J59=zUx6fQ5*%EktyBC!hJ6??=v6Z=5s4-pMA)|_BZrB zVm=vHKfJ<6qvSzrCZ3VPiT=lawE#zTmEr%tHzW;^gg`)S3X1dwiB3wAsSp zuo#bZg45UEfDiLTz6ajydDZrY^iU*&NcM3c-?oVu0;_N!Stt?7-bYOX`4b{?p0OU?Un?QbsmQtjUH8ZQ=(8b0x7^5>n#+$9Ic0}hZIE9^3)lSY@E?4SO?f;LfeKdE$VhJ1_S4))y0y)w%(R`v7Gn{ z9EZr*4UskB(SY5G6UO7TIn^izE9`)+I^T=niz4t_1ziI3jKq8P2YeCoEO@dKQp_j# z_qIreoyQl!rxkc1$WlX$OuHRvrImPpjD{t40#Z6?KQqqJNwAc>y}kl;!rDf0p<4aj z^i{}is>g_i;1-fM);p;64Dz<)uLXI-z&YpXG-pEwgN^erw=`~oC;oTNqu1#QJf(sB zXCzBulhP~G4uIzy`^n@O;-;4c@!ssVBwY?7fNcO+9PJ6Hk6^5bnK$2<46bZQOSa zu=aOo5$D6_B>0&ZVSV*91>t(^XqNIibHS(Ml`TFCTe47oIrd~d_TV10od(PAL=Mp= zSjWAb#f8{!55$D0P-B#GE2I(L@l<*Xe(0-o3i=$_P7c@cB4s_*JczSlE31{<%~jH} z_%bZ)gz_JXV11LZr}AFhfLkGnWzbSg`o|=h*|-lRQ7=9A7jZhqfXlPgT_in-I>cE> zNe=H+@`ALLIJe7t7&kXBiwPa3!`NS(UCdpc)df#c{FaUc6F`LPVBri=i)?9qdcymh45X*&}^*2!+ed8 z^0oL&F8K`Hq;K91>sx{IzLRRf84WDGz5V3DSxN_UWFpSQPJ9=8n+8v)A97mM?))0E zkIK|4Ux4qK0v5>zj|{|{V4S^kbSF`lE*#s*FILC4?WAMdw%M_5+qSLl*y`A}&6{`b zoq6Ye>%Ft)o5DVOpE|3mR{gPc>g)#=(;A=?%x_QSYQ0^3xz8L%u$O!tYHW!?xVP7r z*|+5$nIQAd{Rz9sGa~pa;S<=RFJoUxke&wupO{i^3c`oGe)E+e-|usP5z=ZdRNeB4he_ zQX6;&vwIF?SBhR2UI<4J(Tt}wT|(Kjm*&a`(L>8c7`YZw=wh5m%={>3&TDf9q~o@~ zoFq(LAL%S=_oOd(uJmQL_RtaZpB~FH+>dwgG)Lx-IS?Dg&w5$mW^oSNF%?UIe{Aa` zzIKTuE&6!28Og$(fZB>|#o*shznB|iGa7r>L$2sA`GfL-#G=6ejzC;p#A(+Gzm*IR z*%mp_Bd6-K^#U;oohCwQ79k!+-hj?EzE2H{hzP$7_+mvr819x7eh|sUmUY$(GADCxjLYHW58<4)c<)TJBGFF_`5$dVUr1>bjpJTvhYFCz z34);JAgoB~zQ>JGir2B$uZ%*dghpj>DqPX;&)>z=vJ7|(OJ&Bsu|7(b;y&}UWkp|0 zUAdyiCYKZvl;&m+uakUSGc2S}bzE2TCKgCtSA#bHF>=$qR4IPbtduclq4oH?z)!qn zdDK{ZMWJZ}5`7WSi$7Geg1kk=HHMI82;Fgag$T5xX&fR^8G1)@89{#CYa@~tMK?sg zc=Cjw@?I^nX5^w!qk8kDc&{u!?94BmRa;SRkPC>JlGJsH&UgeOdbBI?0dYOa#5k&m zujF|SRtOADsDdhiUb=hYHG8E<9ap~3jQr&GYD^;zKJs=1T~@>`nc?}OMWGq#cXlFi zOC3wnU(<|>vVA$_^4(2DOVx+eUl}uxnhWrhGSreD3uDm7*&k`4jH7>VDt`Giw`1n`~-0Sl9Z;QrN(fXOi{K7OR+(5jO8iq`hTXs`t5*sL3 z1y|2tk1G)|F;!F##WkzaAZUJaX_)y}(#~Kb_w-5DYPEs(x5QNu8{ZWtio{2a4To!{ z(l66g==iwxZGc?73pDB}xBmLwP}*T?r~ZtxW&sm4AZ=GTedhWSv_U)uHd77-sVQs= ztDt0DO>G>m+B*yr9+oxS#Z}*T*79ypsTf2nrCy0m8#{apr6*0zqq>ZD3vmFZLV!=b zd;9vE)G0-Ii9VOL1xCiRdWOi#W-=kzrM0%{YoK76L5B#%(W6SGMm`dXWy33+-<0aO zGVf&jD;VK$24$isCuN=nJ5vOK(Xvc1JQy=|{VI9np`3Hwr~6B6G&Xs_P>pXEvQR!X ztFq_ltfb@k$KA|kapEPnUzw1oPI@rvn#nr7@Sx{BxlAr&KaYsuw#7C{oDemVZ5=CF zv;YTQ-0CEiZ|MsNFDNdEE^tu^PKK>{NB&8OX@`g3^12;gZ>v36hffW4ul;T(b4Z2` z8aSL&WP7|=!Nv624Gi~Ylsnum0{3S~yMx_9SQXZnanrAWjJDs;Z>Y=QD-aZc`U3=Uj4JKS+J*mkaHN9N$4CYo&bp#QVn+hDi{A<|M9guJq8YEtzmrttqt9ws}IH zC3FY8c<>2vA#n~v784voJ3{$DdGAc$GSB(`PMq_NYD44$*CBo~uD&`KA!Af`5FXHhfY3V3A2ec67?{6bew0_FbYS$M_tl3BmGx>VkxnoA zU*f5VG~va&-mf~yayMOs@qsFNgp449j`x*hS|w(-%h*n_Em;1s?(A1sxeajHR5fPZ zL|IJrIgS>szZ3>au!gQ|4|35$sYM~fH>};aZS4+QBwFD!!cvE<@W5IGhV5T9uwej2 z_uGkaI>w3|w~*VyqtNFzJ(oZQ{BlJ%Cm5j=5VJ4j=~v&&$NO z^u;ELues36B1yH5k-T{j!A%;#e<~hL+1-f3sqFw6t;bU)KsQ4WCL~j-^dgLpxfAME!%b>{v2!wQRBSs?5c*x}xH5g}4coLZ+nFG_BHmAdAWptl9Y#K- z%Mkif*rd(xlAm?8l1Wh|QqEFAmrWeeA16%tO?Oj@k!Q?U4zeBF`BG9?b6(V^k!(4( z9Gv=Bf}E+7YN6BXEB(@%*>+0A7DsQ3QS-#uTGi=js^*8nyQ6&h4%_ z*%Db8H>)1pcaq{DVQVIaP~&`E(Y6ZzbAf`L0;Z^i zC%>y$EifRf`$g>6r>seaW2-K(FV8M^V8n->DA?#C@Q{s2mmVc*!<`kQn#qPVQH@Be zi*Thbe_2Z<4={hML~QB5S=ReI(Tb66YWwartxuN1ZC#`c;|mcac$*HD!w%uWBbC>v zt4SAKCxtI?LwRl_T|H739x!?zmz*NoLJft}-=s(D@m;ZP-lk#<-zUEVP7dh#c|pT) zg5~DkS^8NAPWQDmhTqah*&E%7BU{;~kC^90HvhiEAwQIWcT;^eum+B?^g7|hy`P0H zV>LjC z)cr<%*ygDob(zl#mT#>!lHXZu;p;d1lZu6E2>14iyJH-kEAQH!pbN|AG>7|&>G}yx zIu=Xp$mTa`)hHnx2j_GU*qL-s{%fX&_|WLOozzhKosqr`?0et{X(_y`92;Dl*?R&F z*%A4&clImqwNLa7q}e?dwmb|?4BCCkp2jp(*D69b>E^+OKo0-l5jwK*;I8HnSftbf zMB*cALrcEGOwSxe$mZu>tlAPohFx}qCR%fnP(?ry;R4HWY6Lz$?2?2=qHRvX&&ogD zbs9k5fUoYWwd5c~8mBi2b(ea|>A#Vg&`Q{(IKVh+lSZ`k8yqeNdrI#I?iZ69He@5kW2w za8)jP%631Dc*7I3XYw8>HjCUr$IqxWad*hSVg>fS;1fMR<3xjJ*mZhOPAHY1eSVUB zLNCpZFtL%pU!^z73HOZ5f+bgIH*FpBEw+7(r{7y*H;dD=#6o)#w`x$Kr7MVgA=ILA zWd6;LV1Ve!H(al4awc$eR*?Pv~gm+ubbr31LUeG^sMT)A&VjWq7iCtyy>~|>fi=AZMpqcoTinMQMb@4!1CH3dzzFT%FSCL3c($X>=#i z;4+M8!|G*HIAmnA0hJs2DJH#N2iPxo9zr?Eb|dTuYcNR~lJXiQUQ#R7m}6R!p||ZQ zO8KYKg$sGV%I@r|SXxFV*kC6tokH6q%d4_`M20qehQY-3cm1RNFcqYpm$gyz%HZ~3YVWfnxZ zEeM`Cg=nR1oYO0#9D?tH^=JTR17!8W=YTiSN^{gycXDZqy=+XP(s9Lh0lEaK1I>2v zPxVg`{5VJx<(APUwETT)lQBz^$Ob9Ssw`z)wa*G|)!{O5%d}B>tp)zFCF>7std^S= zNv#E2Cu?V~{jeSIt{5oIOa7MyY1xSFrTchg<3tX6FCqo)g2^#GbB?P%w15uO%4;mM zXP|CMvN;f}g5dSuNoDcKYvy!H#BmLd+L{7M4Kda-<;PvA2LRaLIu6oc?38S0ttGgHJ-gX{SS{l86n2U4WHG$=wf{uaebbLXNO;_tUcCzD zVmn7gLm`6DjS?zFB**SwKLwZ@KtmF$r_54drAw2JhL1K)j#w3;^ zyTvket&8&;!#*Nay{fl9SMzE~felZ-A5ulC6m)Z#2MRWVfgtD;wZ*-YYpkTEMx zKZo;s9JGu5!~hh4qfv*}<4t*bL-qv$lE6Fl#y$NTp-=L<`9J5tb?>G)8=g>&} zV%RcoS80}!0WN=5Y9}34$w{~jJfX{2w90iYG%KCuWBD~lS;UQh<=VREWT*6_Thc|Bjv#?u=z>u`f||X+R3x0 z5E;9gq;z3>@<~XkoR?!z`DMomoO?_?x6kwS`0}SJpNk*#4=Na_!!E(o*}gteZtPYK zAqm-&*bLIovG763>4T9!s#dt_`m1o4XwF#4`gM&NP>N%+#HM0t=A(%?6#%0umZXf~ z1>kG5DDBXQDsKy+5fPHnnxu~B_oT8a?M;$Vty_3QGOL;~3q4KDua|C@oKNdcM^o9{ zPuowMrhIv2(AFIdNl27>@u&q9N&DrB0kfvn6@x}1xa^?aR{mi|tTSiou=1Yzw0*Pk zTl@E%QUj^bZ{5m7X<-V6=!)qhlE$kvCt4o9xm-0$I#-&) z-Se%ZX{*dFoN5MU;>wD^|koW*h14|HoMRapRn=nF`F6u#* zY%R}*Vf*}hn0zAa8q)geqbonB9q<(hSi|4kTu`U+YPub(q^7RzX&?ey@)$goLHD^o zTY`8bSjK#gR4vhfjLvn{v)FsjUf*nWo+4%>e%cd#1MlZU=CpEZ*fD_5v&Hlms&-!1 zp8P!158{NCCs9!A$K4IPaE!nBEE$L%=p)^P8IsWk@n`y@|JlqH-%V@Ngpc%5KehQ+ zU6bTfJ$-c>a7Zh7?nN54BATW$nkwQabzKF#eDbg8-^adRc<7nONV(j&SmGC)*&$y) z2A~Z;crB(Ghtct2t&TdHXqqgOxC70Wk{jKR$jcy{?sy-t-+mlY8Sc;w_IKkR*Mgfv ztXlIB=^4HV0H1%9JyCckZOeBrKy7IbMBFw5Yw-?Q^y7codcLC@Wx1p+ZR7bChgR$u zh0&dUK^zmbg@c~UyiRd7-d%GdeBlX!@+F}D#yQK&E}(vDI7WG_Wq$d=Z^Y=e;!%_) z620Yk^||=A{`L1G@~b}cN?dB$-`ENfWkk^Bo}&oomeVtIO#IZ{Z0VPww;b`O_-fc{ z2aTZ5SPEcdD>S)?XQAP~fR_1}AGnQ19+7Kbis*6das${)6D@Tdy-4YBV(4yok&j?3 zzU*mtd13j_vit0EqrGyYo6*??1#d4Jh04&~#2Zgmn3(7j??U2Ga`OA0eUaN`<=gGe z%kJ43zgd27V-D6uoNl+|0v4IQq$1&wOcecWIv|C8U+v3cwA*Ghnbm6N)$mouk*+9V ze#_>We5^oU+M>AP*soz;@Y#9HHpC2Mce%MB6{&zkbMD|C!U%IvW5Tn{5@MDp z{2?St%Vzxiy|Td_hpU#aU>Ckqn2un{b$}3fu{xvbAK=RO8kH6;6FmChj$p1@cIpMX z_n>)USQC{zTGM`V(#;UbRCf8%v!_fOBbCkABQ{Td;LRHA`yM3odp_6&V5PD<*JLM^ zO=Xi)iPQFlJ4I#yhLK=LRz|vs+Lq^f_R*A;tl3JaX=TP|dPYxKiTJ|3AZxdp%$4H& z+F$4D47LU5_KeMf4%XDenTRGKTD^G|(L@$O;>qkuZ)@!LKznKgS&omqB$|~U*NW<2 zx?m;H3&QDd19eE3SNb~>iUGg>{4#Cc$~Af6$RGPeNO1_J#J#vS){L@OoqRCKh_)Bo zXtcA>sb9ft!rB4P!YvHcNZG4UD(1n`CK+-pol088ja0Z%?kwGC{Faj@!RKA*xi*=!+oMme4Z|Ac6IIA)kGMz=p^cy4&z z!1?EH_=m3<3g%c=4%hi;7VhGM$6Z6Vx+)wzIf7FRIdkgAsQl1<=>5y~gw6!>I_`bw zp+yNZ7YDx)nJ}y%^YTe-s9_|U!JoUojbCV&gWNmlU%e1HlTH7)GBC4RCG9YfMEA5n@5iAU2@O#W`hhuS@tIaQw+|Rqs(uGv>P{I2%sQ|FT8&hq_h8bf^^3JD=N3tH`lk<_X~vZ0|Es?i39Hc zSNG-kFYha6;ppT{$jHh3e?oskMrI~pGN z&_1X?IiT{NZN#yE+$__X_=z?Niz|O1nWGau_|N6xeSY9`dvn@=&|-^PXuqxY^gKP| zlB*&~R*@*~F#%P|M8-&-g~J2BqnNLQ zQd34&PqZ!}YbfJ>{))w8fU8B+RzwmL&LCujA}M0c0Ba(msIIR`)b0rGA7Dz+C)^JP z15-m496&Y)CD!8`E1RgXnjsr;T=G=t=HTR>5=C%F!^xE$6LLX>Wg<7LmsonjkjW$7 zZSBaEZZiH=O_K{SqyLFeO2j_m!R0yDxMY~oDIo8Np+o8fJEXDT;YqWpH(!?7Tdbp( z_L*gjNfTVUxxVzv?bk}3d-?-ssqx!j`|qYP{$dx_u`t9dd$`G>vruyj5niW9o-PpxaV*8>131HCK?sA{q`r># zli2R{dH(K5-&fEtSyQ=_BKyoi5wp=V(G1>RG>P``^`x2;C~gMJ=!7GzmVAQ!d*|0q z-vP|Ro_K~Gw*nT>t#!$vmE(^!FLAsimlcXZ2*4(ennPmLd`S0^G?!=&x*YxNBntsK zvEE7Fh|eh(yEg$FU*6`F+MkB#mKT%fLQhRBUPE0|}{-YPd`+tO6U3(5mUt()OWq zeGHN2^PDsYcL8##(BcYeJexyc5u$B(+ojU;Z?_J}Cp8P8awAC0SJgad=TrCHYnPy6GIo8B)y!YpW)`IcLOJ;!tL-s6P{U=&qt&fg6Z0UK{oG> zwaj=2g%&I21(^Si!u*}(oYhzxaf%p>=5br(yXu-|Q1raLTEP306M}M_wyc z5IN;}*(A!ot=6y(;&6NlmnG$eXY8E?@;0{$oQV784^P7EE%R5vaaAn^K5mKcmW3km zR*p~FiSTR9@HOz5&U?yKG^P!qH1->0%F7$C*eI0{n@sU!RRp`6HNLOjN{dACc`ab)k$^w!a2hr2nOKL37r=eQnf={kbM-b<8w>@$k9riv4Xv zzuB=r?PgoX0424oIy`W}5g)1>AJRg3MWXHRBI2_Fp*v>SnC_|*sITG28BW{Z_BLM* zexA&p1C5NWqOT3tN7dFgBD@H;pP?vg#lrL3*#RM>Pn~T`Uv|3GZ>Q>+kNFoZjFopG ztiG=`T1Fqu=PL1}BQG#3?zEaew6r?(ncHKmt*w^CSTK5gq0Ug)!TO-{Xobz~#8-Tv zLhIOwvLcaox+8U;-aqT^_kikWnQqnx1% zE%l#3;}j+fBrMXVauKs5=R<+IxVyk5x^HMhLwG3n$TIf3(#al%LL)o%Qd`xkWqilg z&&MxQE^aT0)T@`SAAP?SJ+E(%&%aX0oc|4l%*OfexmZF*HYV0@h0MT9-Z zVn_$26GpI2C{MB=f7Pro!PMqU|@3_pNI=`4$#Sx^o_c1Eg+8 zS?QeIjY%VT2PC%vQA2V+g|36ei+|S=mfO>lP*Pr3N?`fa{7Wz8Av!Bh%z1!j!~F|KA?4g83a3c9Z*$dmR`SO|BB#@i+?e_ zE=}y(Mh9f)L1o9sDX_6sV#)g1O4r-uLeD)T$dHL%0@OV zv!rtC_;61ta^GW5;oi?j?jHgTG#1@f8T_ec`hPw|ty!c-%brPxa3wNxCB`~G(pCC- z#&7VP-I6#{uyPW!o*e4rj4-(ckl2`dc6`em()~PwBb#J_!O8tgOVW07;oVV%#m|Gb_2; zGn*|}H_BG0hGXX!B3}^f2ty_uDgO8?c_w~8&7oEX;+neo`;^;$NWzn-t5 zx__ffrMA>u8ojq!HL*P?S^lEc$_H7B1yP|Hv}0P#xVEk|>EsSAaEy{N4EsgPyyu5n zA>Z5MMTks7DTfkKqTdU<+@!0jY!U1C+)!6>fQba}KQ|>1ss)`=7zg1F=BW!H*Lu5* zmYcs<+qEdyp3M9Aea?J40_mQRVquV(mVyKy$-@J%y&E_)Tw%+f3xzV6^%DBbYm%WL zPO!h!{2xRHh9DTkqNc0L!-59~0LYF>_`}HDcYpjNY%hu3u4gkA#yqDM#Y_o%_d05q zWswTyM}L`yo-jnZ3f6X@JM~b3AgB?6kVX0BC{#j^m+vfp4SJSc*^douZqnuUiNB3X z_l0JPP8V$kt<1pwp0|7`zp-G6{NoKnyHMaYQvls;E<~G=4r3)mEA(2r%mbi0PbRS3 zNU3-rwOLCp{WWM(5)fQ{^%iI^pef#&(K@Cy$F}~LxEoSTK^e{Jo_6dVfd^q#xg1c4 zNTx~mqs%q8zi>y27EsF+mJ0u1WLm`SbF^**eB$!P{y=NP)!XmfVdaLWqNAsW>!>L* zJDLc-5(3h2gCUzl)Q)s-fO^GEt#~)QoHT35`CaC0)jO73w5E2o#P-B&LS1cAq$S#i zN?`(70d-E)GA4#v>+>9!Qp8YpT}ja^CdBScKX5gjOHITD;p4o`s#WV0zd2~QZL#=H zGsGji-^C*+vc`TvdoONwtEy!yU%F{Yr@0{Van5MO^OiP7V23Ozej-UW$3F||1dZ9* zSR~ZSdF}D6FBR4*Ks)+&!E{CSh zB{D%Y?VykB_}#5NW!N=9l{!i+~rE=DqBIIlw4oxf1 z4<^wU?e8~Iv0A=A$yM}dr|r3Vu8vjQ#O)T(^JJBT)5LAZtg^JB;Ciqlf>XUVh{Z= z#uI{aofJlT8#j>{%t>~jU|eB^D@N-a`azLt_(Lh;(R8OmCv)Ia(VHCJq3BnsFkC*& zN|3c(nr;+Il{YSt0^mGW7*GIR48tNaOLdKex`I;(ry$PEmSLjOS;?L*HkWIHM1BL4$^puDFT6#C5_QnH>c*?*x*ER)ux zUQo1AyWnJi<66R$VXm*}0UB|lh8WbUOlB0U*`jN4b z*@A{VzGIa>j%7L(A5VrnGIOp;jgCD_ zeu3p=dUL^)a7qMYB(y29BU64ypZ!GnYyazbc})7GqasdPnu&{Ex=C}r2;(>#0_ucg z%_j??W6O;g<2Yx!3FCP2tM-IrJ*Q}7i}oKfNvtvTJtB<>&Wh0h+p6axbD``!&RVcP zWMphV(oNo|@%2j7sC;IvlUMPpdw0#3)2gUz1dWA6{~oHg#jG6aabyY#w@3_XOg1R1 z!!;)ec^jrERme>=4Ci}vlr4~(YFMS2HDKcw*$JJb&+*#3c6Dm`=z4Q(?cVfmZ)!_^J-2k~>E5~^*xa~s&B;=+^Kou@JKIU! zSn?k~ytpXc@NIF+X;(SfSnAw3+}-)SS!LbY+~n(W-`NmNUqSLK|il)%P%TI$7r( zB5s2=3Rx^VGIDqf@>P2WA_NTbQ~MyYTYE+h?>0=c_$(=HV>48Y!Iy!-{ixjnuF|%& zY!z*qDeBAM+4RA|?e$$lXIF>#EWPhxm>7ecLxcM?dj(w6-@_~{m4BJPw{30lSrgdW zK4nIBUijSYef*guSUU@yd^tRre3N5uCAe&LBj{bsTzU(AtIf>iv%Ml<vVnl_0@^BWixd;J&oRZx6%8UYx~$48LJg(XWr}KRW@B>pgytn z-rni$)pxP?M!)pL?k3mj*7^1a@`@%{ck@$4y!XZC>+SM$bS@Gj71@A5Yle7+_;(i_ z$2{u}S92;!+v{EB_{UzUoER_avCkeqZ7__N{W6G@{ip%#Ye*=9)(kbS>vF)2%;#H) z=xjnKdJ#o(4S3_>ONg`13hZ9|P0WWD)Bm?9QT8ozlz$V7if@8Bj^6gaFFaR`07H=CNps82x~Qn7O0{gU zUwvt%qGweJFd;A-C;R!;|^43IDPS`;zC)Pxj4E%}CpnU|^nc zs*;h8`SQj&>drE%6zhzl)TV04CF3T#bT30~k83h*2wYliPt#2LkA<`eYl_PdOV*IG z>K^-aTF89bnB~MF)_fg)V}tB0bI%S-PXl(N$&j0NpBt;`c+^#!-<9QrrV1O5207HM zOCa;=-j~0tE<48`-WvMwTW#~TPjnM03sxy=b@^)jC9&l~WLM+rjGKepp}lHo15~kP z$L6KOr9bRy>S=69t0n9ye*s_+XZK7cPiK>#)1|?yF#Ri<7^qH(Rc-^N+#NI&6)=)D z0RdHc+SFyhQfvCnwCZa`%@>AimMxR!Yc;>Yv1&%`RcxDCB*UTRuSI&uhy83uPr*{=CEWU;DOlF~c|ad-kt4?zawVYDf|8LLA6rZUv9U zK+J-J5*MI?ZZe@u(6Z^XJU+7zL$pKfNw@{D1h}6`JlN|&#A=sL^!K%SLb1X+fbTI`MZJGkj|)r*dXr)l-%g* zppXgZ)aTxF(3ewRCMuRDa%b-?6wy&DQI+1Z6i;EAGxg^}e@c}lpuVRT@#c0&jywlh zkUdia#|GI^LHkHus|jtE4uQ_~AQREw0Q`{ngJ5z?@PcTj-ZVoquxPE0$oHdJ2SlZObBjdUC`)_*D( zEC-Ia%8+*Stn<0|!4aZL>AoQZxT>nouvqpgnG1EzPK}hO0to3MNe#CMW0x1EPVn9RP$u z;ztNf!pgh+CzVBT7n(^aEFA zBP1;5VCQWLB*66Qm#_&T$hj1@_4mgRAeJk|ug^}>7XS(ZMl!O93MJUYq8R#PcNry` zT%TT_0Y9u!*fLLNBaRe9ebw1@YshD5qL{8;(KIs#! zn4kAVPUdw!;WMd-AMZp?6oIs9O z$1eeQv*-_wmtj8>a{LDJ34VQ-$hE-0Eo%L{h;?j1%OBHa&<#-rNiaMyc^NR7Aq(pL zaONm+h2>8`UjfqAEcTC^J%C_t_-zRDQpcq;PyGDa@Re?W?@n1wUmNBr2v#^QlV3W|nDH>Be9V&^BLD^WG zKRA}ZXimkee(7wIs_o92c}dHY^a#-tD(#BWh{?WnoHIL3%Ee;#jcsrq8=r`uf1a8_FDRJ-e!Sd%Gu4K1f$visV2oMJQj zLe&Q<1m95pSAIL=KmB%5cV`n@V<*CY^W_!k#Vo9yO&saPtPPw^L`;nAj7`3~{xK!M z!O8mXZagC^^FK0B|AiZ0l`8k`#={Nvj^VBecM{*kiV!kv7lA91*hF#g(muvPh#|-% z;w$F8JbGt&Shc#k@`C)jmRywQcc9>tRO*zwQ})b^U~BTOa1zB)iVuNg+!KU%mej=L za-mX%CV5&JWGhH{FzrjGk-{G0n~P%fT;CYLcbjxL-yfs296B*V$XVK+S00 z#uv;}aS2G+9CL7uLv{V#JqD_XZxmqbm!Px8BL+9dz{H5_HuweH4n2~$v}oomaQS!U z22MDp$!iVwryH+0(Z--e_B`Ny!K54aXUAdKK3JU9=fN3C(;*6g?_g{kRs!U%o(wb| zz&e2xg)Iak?95{3XZ@lZkWR-5aNT62A#4qf=uP1}+RNdC9oY~7yo2wOpJpe0&%_z9E|0S^eUod;r$l)OM0 z)4xCvcJ_0V__uJ13)p556Sj_=5I)^w_*hM25{Y4Bkw9`fcJBC3wr{9UA4cV$8I!UP z!sBs}ULK3c+9m!qDJpD?8ZefUK%z<12JtXWUrv{X2%Q05adf(g)tD0MAnxB01N8{! zaU4k*VUN=~wETzQx|%XVd{_0fjuc1SS|5m;?xVhZB%N-1+&4)s=b9S%dU*11Imibj zXa~cv*wO%K8CzWDS{rI{{1XtRaV zGO@DGwlP{;sp+CYx6)cxZTYRbf~{q?w(Q!n54eT#2<{Tn{ZSjIHbVVxVse+HE@^Fo z+Gypz$}N@0x0n-0z7PHVi{3vQN)O4Lgwp;0)Wn{IlWokj+Uv+W%*xOI#bj zG-9>SdW-E5-6i%9QCtVcg>s=-K2_*HF%Lf$LgfjByrKR-jHEZkL;gajBEkQRNxrF? zuqxI)?fB9dhKW3WxO_d_I4Z{1k=NW# zRkJBqTy+wTrPf3Tx_F|hu_0vV?K&38wI3X%eibN6s;(UHPtuQwo~*9`{r{6(*V^1v znhn!ZAN_WrZ!l}fx04HgD{<*8=dpe5no(^vvS~cQUoxt|+@*J2=3~BP>zz6e^%q$5 zccW_ncyT^7cl>Fbdfn96;y&{<^S-k3=GP%TU14(Y?Ho5X;%GPZk2-G*gJYKw;?tsV6-J3@*d!Th;ktTZHmHN0^W1dJ?=9oewqi%6?}DtK2rO**$uAdfox}G?cTh`MXUwl zo%&%yV(kJ&3wrD%+v4}Vo^*b{y#oJN28Zc?U~t&~BX7jW%);_t8=Ne4DLWi?q)%#|mQcxk zo@bx{AXg<8fqPKvX4@pWiKa#QN{_Cpe0g89H#_j94W=x6?PNIn&ybKpdnm4 z*$5g8Fb-uB$`8&3D2zH+m5>Gb$`dE^a>10Dg~O#8s>O(FdL}qh4$S(3A~Z!J0ThEc zY6x7Eomi57fs4qHfmsGDQ2!5QBr`T{DD6Z8eGO()WE!)(aD7g*iGT;??RX>_jNmn} zag#8-l*-=-0g~{#Fo1Dw?74)D;#AE%^L`?SYgj!bAkrf7IBcThV5~rpKpF`SRdiLj z27f2Q$e#>}0}1|MiRx?$Sc;jXbyXwX`UYcZKS0JgGhtF-6G%YD!Ox&hWs3U{Py|^s zU{a{NQ2h@qrTjpZ6}$wS7UEC@;}))0c=A-GgI|Y?sp5V#l=l^xlg>m5G6Oi`X#|q| zLr*D|MN&55u;U#-P4t8OfuThI_F#@r)Q3{e+(@BJwfJ=du8w4}@D@>()cdsyo zXgk&8{+6OkArOJ>0MTA0vrI-&XHb=O{qnc+fxFK5fYSm%9sL-{9gY`Jdlfx)vfv77&rLv=?F@i}-tj_&X5y`!3$$}m zIqweM4z1fh&wjY8==zPh%)ZTwsx+Xy6zBrXZegrqhF z+vl`G>zO%HW5oO1j^D^nI|5Qg*LTQVr*&y(KdR3^xOmNvjgC4tm25ONYQk&YShZ)&rOh@?IiBSBO9L-;gOm+V^N_Pxnvy(q(x|Cx z+{lab#n7GHraO|E0gsa20_JfpSudBM_Z#jl7v}y`=kEPuE~AvU;%T}qv(`EJaciYhJ-$#q!0twz2in9uAEkAwrLGyauPJYm0lqt?U&+Wh?*n4+1Y! zW z&vMl}`DS;Qm_O-Z9=i*y@?l)&!?e&ov9{KwH;sGoH%0fNu#ql=++z#qk?aXx9$__s zcLy=au4QcQFv&$T{mHK3^89AafD7oz!k!1{4D8vxv_HBAFD>rG>hZZ3^5%8{IiN^ltBsBv&+kdUGlhnpz*4dEW z0r-i+4CmyTeg^t+U{KqH8dcfzzahyPyd1jP!CpR;tyr)<+i;^~Efb1SR#Y|;Sh^Mp zW+TAp6ol+gf-(Q-!m>tj14?k645sVR$~hN_0y;YZ79o`w2e_>TIcE+Lp7dm@Rf~q( zjgo`?X33GBF~v<8MzoWT*2NFFp3v7CHl#dPv2&Ee-Ok|TyPJN*RLa0ihG4r;V1h^> zv?5u|A$bQ;#C_0F*s_!!o`mKe+*7pfWjpyK?M4udZA3tgyX`~zs^eG;^yEeing%~jUBKd*^;Ji)7_7b@QmSmKFPn#z249d# zE2a;o{|NE3Zz?hb;!sq?ItBv(KN0_vfkAv9F3r>SZ+{oXF_?HUZx*t?+u=!l4l@H* zv9!HkoG=-Qki9#YJuNx&1Xx6fRyfi@7I5R?g?(PpV731WIzt*Q{7m0D zg9O5W0~%J8YKKp{LPR1SC@k8qCd3+JzlSuM_WG6dlygP8j|-n*VoXU+Ovpe_UFKB zKrNihPktsqXSh{vfxi4*Z`Vghv7xQLykB=W*U#@;=>ZTh>ECMyAP7=76PfLD8s3UD zSG?JpkE<5x&2Bp`Kh6eK#!9X2$zeSFcLOS@BMvE8X3v!JVoJqpxcj&;Yld-gJ^KPf zf31}_A();x1y*jr^U>J_iJlxJ+b`B3fF#C5YE>t!Ywo`k=&DKg43r%00&5>_pRJB8 z9ZVH1`4b&_81o**UwG+X3FB)F4brMiw4z(|P%N3mUtMZgl7#R~jSH;;#bkS+5m2o1 z#5TC#YjDSEbHxtF$*)9tXsrK=sLB@K2akZYyxWy0+Mr7$&yh-qJU(OBpC@31VIE;a(V}M*LC;0_wM&S_vd9Edb;~m zI#uUX_f(&%?y4%tzB%!bjQL3^Z{2;vkNf;r_JjaW@8H%$=EX;N%9m)rlt?ud1>|pXU+G6fnEH8wQ#wDO*(~heb zlTJGz*U`;3fm>t-Yb?cmX0ulF9n1ZvC&wu9IStG8#{Mj{Vz9Z5qhyzc?`!v%BS6!+ zD{|K~f99ox{(rm__itu1r_tIbf|ZE zdh~9eD;0;|&+d{YxgY!2Jg*BNwC-z4VVaW=pf?|g4J1mX24@#?%99vcD5ehNNmV?| zm3m?WcTP)c(i^mkP99`7@V@APFGeT)ai{5=HHbhZKp0>9RJEDpAV&7GJU=HaJvbI@ zctPGrEJVwvKIoT-=fQT2>IOGkDO8Br+O9v2j(v0Gnu6VzB(2~#Ih>lmtS}-7#++k_ zL}3w^t*Tqv;ejblR}CVmlG{>AMyb@{9MFbH8 zQ##3fTPcOyB|Y}@5NqJ2>)hk%#K~=MS$nluNv+%-l`CnHrUgs{q7?}~^CSmMghkzj z9}+aHO`xQkcrlDZ zb4#ER1dzF~nb7=J*r3T+>=O|kLzHOH-0CfbA(x(Bt^%T6T|--Ej~$0o@aD-#+j5lT z(dR>Tzx2}=k{3u`g6b!-e1gVCMQ5|b{btHdy&cJShL=r`Z>P(p=f&AN2imYsZ&LYq z?X4Y}Z>kyHvk+Uc(!F^#1YY`r66I)%jOT`91wNck}f_DExLa_M7MGwp`AaY}`N0?At}p zvTAnD28Y%9f7X7j>HFlh#+7x4FPzr7eccN6?9pteYu$#Tzsv-B-6FMR%`uWyUQ&CX z^VMc^?RY9&vP^JynVtNm;4Yf{^!lZQ{7|7x?!YA3OB;O< zi9FLLi&|HAokH0kOgl3Y#tNywzhZVgYN{rm-v6pl#H)lqZrbGq-7?4sgxMh0bt5cP z>LK6AP^=3`OXb^`e`OuFQ&70`e7Ux?CQ{T^q$nplH#>JZEM9>Blg%d^!G;nez2QOZ z$3Agkcr~ZN)X?<#at}2{b{*l(JL{xz_VN%%)x7;2(xt97o;SF@89;CjWCZR}K=TXD z=GPU*%9PJR^Eu*^wUJzF!EOVZHtEK>vCp7P%W>fN3;nt85O;f6jR~B6A4iI%&pWuV z-3e=Sh#FZ4Mh$4b5vftmy=9@b>Kz->qa>We^yxyE%VzWkbM=v1oqmHgkP}>DJcNih$9U|X2%hPy2NX5>y!gPr zGAGh>CU>1Zg{)|N@VL!1kwJ8_5}A;so)LXmt!vt-GcYPpRJqrkYn0?3WP zl;e}s!&zaJZ7;(jyEr3OU*ff!IdjZKU#;uwTAagMP$_rm8S5`f$;?Fc*olSY4nN5s z8<9+CEv7&>?1x%~0hzb`MOfgltOgLA3rgO38HQZR6Cz&86V8=-mY0e^GY1pZW!9db zx{qC}z`}MBOjTGz!?n=Abwyy9^3na_8!YgUx6#9LEL5S{s(s57c?&6CX$8JxQ1tVD|5 z<(`u!F>iJjZdPIHqleRU0j%df?xWJ>{2^x2`?Ll3TR7SYwajpF=!G;)=2UFB+5Nv< zm%>@Lh2t)#u=8f$$~Tq(0k7&i=ylutDdW&HB%X{W@pGAzwmHS7Ak#Avh z3o%A_kLO~x&CXMVFb;T{XW>$e$EEv!Nrz+Ki2XjoVy;Fk)hrFf$oOz(^S-px`AJq{3Rl zh}-9c?Tf<>qjTR3_U$mmyCX$!>L|KiRChq;Rnn7)nnL|DFK!Nf+5GD2b-H)3jY@E^ zn;2&3^30;p+saE+6?i5uVO&+{sSQDEM(Pdb<*BMx%8MJ0z}#ksO{#4Oi#~r+(wz}c zvN8I)^aQq?b|rr%V8C#(iobG$PxAcWV@^t47ySij1 z)K}B5eQvg(S<|mPnd2({Fk^g34?6j1=!JxBc9=oDqT10DB zGT9W<8(z!p&MY1o+o*Qnt+_h-%dFf&cBq>`Bv+y+yq4jDsY_0UOMR6wfR)bFEEP@OYK)#C+sl_ZMWlx-G**vHm;{038$L2 z*3%k&aLp5i8-DQnWFI-NA6Z%bmhoP;f$EGCTwJ*uVY~FT>wGGvFKBdr=)=&)lEFdN za%%QuLiUWIAc?|A>RZi1RvyocXPASp=Tza=lVeyg@EO?6_SEck*7f$mo6bkkl9B+) zhdb=d{W_wM1-n}+Lx{p9#>v!}MBIEA0YQ^u3xUWD`mz;!I1#h`LF1cU79akvKG_@n zD@Nx(8Vfin8D6PM7n6K=(`%M|CF%Ba+=HX(d7k5;!`o7lUzH`D#!3=JxpOYNmo_V4 zL35vZ7e7+5^}H#YG}Pt`P~gjNrw}2p!LU}Z>5+6aLu;~`UE@El<;3GM5ZWl`chs`y zx_Y%Xu&Stpl)?KN*q2M#vrad@zQo2KNBb#Ae&(EhsCe;@os%&9`+eeBKFq&$PU-s1 zPS^)t$8>B{vhMO))O;L7W-xriRvU)fUSN!~$)ym)%th*F`-c*Jc9*xineVt5C|;6i zq{>nx(=Q2P92Uw6Xb!L9;>W!j))IAK>%1zxi{|2Ur5 zNYm;IW@_)N?a?V9txkCmhIg@_T6t%gHcT&Kb18_*xb4{0t6Kg-dk|GJYao@cM>W;G z)T0zxs2}}DcC~B7air?q$sDBF)S=@QVZ;Ft@O9eWpn{YwMDqQfcP8A6{1L=l;AADz zPvaMPJQxGvJcNO8KGSZqzVTX6GQ<^RBgfQ|e7AxTk?-!>!&D7MAo71WM{R1FFUCyP(v2}qp zj61j_dXlv`R`PgyO~ry9=bvU}()9zQE+AbVG~&EpwW9^B}USR>pvgaE!^}g#Xg*)CK zY%gKVY-lG<-->zfeagS-w|BgH$E^Ozm9K={da@f<&L5i)cu#N7feEJg<_^p^(Npd) zzqhlFWlp<(vyOn>(_Y%#>`vUUrytt45~|;1Kva~T#!JG~UOq%Dq_rv9w~Gj4BxdYN zENrz1FS1`zAsp3qTa0{+eZ-OJ#(e`PG9yy1;Z{u8d>Cl7A|?tlElDYBYfgC48Zkod zZ6^`yM$5n7DYVw9(rvr$x;W1Aa@AlgLRfg{mI+IVqBdglMJb>AocEK+!fZtgHl992 zcPz%PA+ic4s8vzI}krSF3dTiua0(^_(3t(uBSk;Leh!z#jx zv81UrQM=H-yt2s^?+)us)Zt-2JG)_!$?NVO%sQ2lepRg6l@F^*i>|SyeL*4n?=r@v zf$t`6Z}pfjLNAptErfwaDyXtvOb=i06IFxEd!H^RmF@02*@=%yy-2^Uon1>3OB}B+ z?beb**So)eGHV~6*88ygG0Qc{v`Q!1Y9+nN#a)q#@HD_-f7bK5!?dZoD0hmi=gYf? zQ!mK@H9I@Qb)p+;6xmf3ebbo(pLy!i8!)oV!F^SpZI8w#hFPlv_yoQdZb>w*hkb2d zlHsqn%BiSWo0zn^;`pJ)sa$?f=tWVM1MX&cU31B33^qfctNR1QmCE2*7{$o{ae$+?HM^oInApI+&IWihA)nDgN#7HX(WL^IfRdD7e( zyOQwW6#AxxMXg`YPFzU)(M2yn#M|~IzZ5y~(qUyXRWhHIJD@yh+4w-kBZ^Z5@I4(s z^hlOePn*Ssr6)BB`V9K4isi#*|0g9tj)e(gp!O}%ADp15eSvE8U@#KjQJGAIleO!t` z$h~LT9SU3bV+#zSts3^k4mNh3bPw>usGqb+5uZN5NjY6^iXT)qyO+RY(Aagf|Z}_A0$&^p_HX5xUR=Wp8v3wBhxJ&5=EhZfOBtU**KQ$T~`3 z(mW$@Ecm?3wsX!N_%4$qcvp~K#47oc@a0a_{Q=FpG^1fu>C!guahzN1?u&?IYqJ&m zYh!?kk|}}qbLniPR`(hSZtLNT1lE-ElfKuoi%aEyZx1w6rw`6FSih zB|@^1Uf@%8wu}Zo1M#@h$|hHb@)NMhZ%zo|D-D7aD;67pbV_uMw7nDCnm}t8eqhlu z10J2*jfdGb{_rEETTqhZaBCden0YR&1HGEfDVr-p%%9oVc}q5WUd8euB}LnuNZZN> z`4uVR{-<({dAb9)@)ZG=c2SB&PvY%H*#^1a?8YqH$p_ln zhl>2P*6Zgs0SxOzE9YG(_L542Cos;5-K(Q!H`sH$5xP^+mj#+U*{)u2W*&)QpsjqA z?Z(E}cm7Rbq_3$U!E9e3%3foP@V;8!>hkszp}ywW_>0Etn?64bwr!SLWA3icM$HViW!ig;ermZC;dmhr zQtZ$?MA~CtzC73f7xUi#>Os2cT76J;LVZ6oW-}nDLy2DWzHPc?#Ve6gbO+5IoI9<3{NNE1W5Y%b=f z3m=}#r$Fq+Bp!z{Ri#z(ENRy9nZ!PrRNapaaZCBkL$L;43Mc>5Mulkv^@K+TyG5X6 z*hWybDc`oo8k}cn=C5k6|GEhnYc4>-naTOJqk=7l<}x2{nDzBjoX${w=yN{MogwD& zqg{(U%22+QWz8=HkhQB%QSH8)^@&|_qo1AJ-ETWUF^WOJ`1R6$oo~_Fmfp*) z4pSQAw7cv_YTCYA+l>XqUyIg!-q#owF~SD0>#{_}zF;~v-F@RNpNRVL{jy|II6L<6 zYj<#w_}JXz24xt5tt0lmbIwsv%@16Mq8_r(^25-YH|Y&W=87AV>xxW|52g;~OX-(v zmC{Pz*H(;we9|aFN1yA!w^ryZi!Gafn4dG#C62$p7wv0E#b`4-KUw`zs7^QVt-H;0 zCrTKZR>#t~=rhMA1>@D`oM*Ni;(A>T*|WlXXZa0Ps~KN@<{N*=mHwx`5f1%hofH@X z{!h1!ChBYoq{sYU#wFr2D#UMU1<6e+7gAS+rWH_x63S@mKpS+3bhc-A$LsFEnm_Ig zg_bw&MfiBPXJ$+p5re+!1-gncpDg5ua6`XdlwHN|r&R=J(h}X?U`-wY_@|wS6LPjc z#p?>X@>sX|>Am!?6SDN=eC>=F9;jBQ0a>675+V{m$n&U$>{5vG^Cv-uq}sCKR?i07 zb;X|%B!V6h{bF}Ft4+xg4{1XRiuQG27F~+oR2R6aY_4|?pVO==I@Ik(0CoKN$e?o$ z^+YcXu$9LdjKE8LgI5kO}Bs$6PsbjEaDUF?*n>+aNa(5AertVzHG zSB9`+bik~bVLOpUn_5pQGrPoU4h4HFTfZl+R9srH5)SgIoz__7{dXkAPA`~63R|gy zL?-&;$$Lb`7?X8c4QPt(a;!X6g>7l9;iaIL&| zRE5-eQ!>{+_J5?r=5#mYAQGjkdOgI?UpY$SLomC@R9S0CM(}z(c<0i0GkAB5T@srY zm{#}F37ehz@(R~&LuMMbz*nnZgU+RY%uq4C;o`KI07u(~j11D59_V-&lSE}oedas~ zmr|xVFWQ#BR3eEo>o^^bz7T>Bb1C1w7Y@FYOR-V9o7K3#wY(wmu@T?u)9AY+8Un|F ztp1hNK@{6`q=F=X(43b2Qdz4A%S}_lEppYd$v4j{b~C;R#^zRjO8Cf|TQ3;k@vL44 zZwKTdi`Pv^Wy6=_MWtBpPUY`0&A-S?RT3U8hG@_UTCr#)qe>>{+SF3q;&T2xBaauk zX1eoA)<+j_XF+QH9#=WL)DspiMX^v0m6VAr9qrN^8}-$6Wthn{>>0zc_rZLvb&cYY#*{Ny&+=3YBZ3 z)^V}R?E}?LL;Ny}cA~X&IMCCx4i4BK?6%cq{A>}kfT(4QGL4Jzmh3)Q(S~325jLG# z?&DY4jZUiVg|)YY4=?5lb}7IW*9j{eLYGB_(X@RX+4{LVCRtO#9&R;~0T?f7Q1B`V~+9?O4z}^@37BLF^LV@^fy9 zW+7v;x{$+;w2&`rhf~LaGwSlNSB5w5U9M*-rdErw~nVi!STi8Bqp+YcP~0Tu$5@^yrt;>S&#R8x2UwBM8mnVY)U+Y87HrF zx59b6m^TqVpt#ML{kXsasrRT!NE|Y1_11bfT z-%dOkZr3)B-}I# z&el1d+8lY^W$F1BH8-9uM-YBKQL#wV< zDn*$%^-B>01aFA=pFwSdEchny8wMmM?v)h!RE9@JhF(5@5*QzONr(i8LBU2KR5yy6 zct}nYeASbVhrg4%t{mRQU1tO6JQ$`Q-=~}k9or}o#`AnaBl)cD0&^R)zzdEDSv(rEptEysSSw3jTA+7*1 z((x*iqz!*QBQQ1FU29nF&}CjxXS*<5rnlBV&DB4)rkWY- z+flcy=eGWp)%n{-@pU^++OW1t@A1TzN({9$R|yILAzJjaWas! zx6nk9;i0Rqsyo_KH&0{ayOG@CHKIpIGMG#9D50|sFD9w`3r)f>>sq>h>_8;+u`Ric zdo^Yvajjy1z1Tr&DJLq8@(!nS`NPrJFFw6tv*Ikz>(UN&UEFoCDOti<;q1e&Wou@j zJziDVfPs5a)X1@&36wC*G<9b#6t{a_cVYdtq985-4?ZJ5$!Xo=ir~Jj0s?+*&Pr3m z8IKyRE#b`v3M0FrjRsQyi*4>2>gYJcMcIHjW66Cv4$fpMzJpWl<9%_r9k1QxoAo1G z=YwfvK5K=~C%v9}t*@0TKlx}~N%O``QA_f02Imro7{^Hc2b9t}>(E69bs) zBhVv{AT7#l?N<0CwpLufI=GYL{r5==4h{>UbkSPug7 z)a!+Rf+i?a;%WLO`u8)#C znUU4J4RC>8Sl^07eJ*x!;b&c=FS8(j>#5T#m$g9O8T}u zwjEWkoiI(J(0wY9G_t+TfGuXxIwx!W6Mql;AtU%Y%E{W*hC>Jp6ar|wnY*5q4>C}_ z{%h*5D#{gUiF8H&QAtQl(!&{PVUKdmyN5dGXel`cXtEw#^5O8w2^ed6y>Bym6EHJjtuC{0=jx)MQbF`bQI2YF$qwjyeb547Pq3hZP#bp^wH` z{@SM>q5n)sRTUwJws1Q$vyz;Io13jA!U_roL#&WU0jQ<0g@6!T1SSASS)c^K5ERJL zQUnY#hrqv){WI>r&{cABaYZ^=pnj(dwgg*2z(Q66A}A3{0U;C;Dj)*FvatdS1Cf?O zmco|8BEQr90ry|%y11F!p)6c~urSun-zKUy>eipn{@&nVD*+Y~1Ds7d?Cu{F&)UD8 z{WIq8Qv53?F-r>sR<({uR|%xEvxBV#@@zH(u)|#p@JG`h49?(PZCxEue_?tiiL}FC z`tXOeXYK~!fON7J=kgG+L|Gx-99+31bX~BvRYf|vAszl*U;a$@n_Pbt;Y=*cKfKX@ zLpWu$8^#Igz=6cL+FCfEIIbggPzD@GH&+`p#@5N2!xiP|e3obS|0wy-r96}0;%qje zF+Y+0&&I@R^$*2LXedBHaO^Pq=R@JAti-SuM`&QsmTnd(jKr^(8tnArxNd8XL1H|y zGf)uw!SeYN+z;add)@<~jn$b2>YHn_MOjM7A^g+_$NF6Q`bMy(s!8usq4Ec{>je&)b&ra^d08ksf*-~zyh|=fjE~tHf->-$i)ve z5&pIa0=5eBZ&3~G`;f4KX~^HzF#`(;LA8MzK(&M1>2!y8IKgWGcZJRajY{Rzq5pY`vD6x_e< zAME$;fxi`f2K`<49QvhIUP)2n&%Fd!Una7GDU~E>@e<(Mau0-=Ug^@&uNFnV75_Rb z8WtJ??(p=kw_f)qCeSM~kDF&v8J*U@?U}()?VS!xubk!klo9x63j84>?$^o~8c2+ziSET^y~qP z*6(J6U`M4E8jUUB4H7;Z&sqR&TQAhv(Qi*s475;I0DU762ZRG;@<;5=X6EBiKfjzN zE#c;!(soPU2TF0+ig`DbCU`IC1!l0z$5mQ(w8SP{OD2N^Nh1bef@6^k+gpTLiZq z!84BlK+k@Uv`ClNWUkx2kX}~c#knbQZ~MybZew(yka?Bd_=u_bQTGu(>-19TyMZ(w zWLU!l;m5LIm)t0p+J?aC>f(XGi=zk0W%_AmC#kpS`{+HxSdE#Q4{DfNYc7>WyxQI` zYZ$#@R!?eir{Er8FJih-)?A z4>5~@YrET_{_sVvq*p2e*gkfW)*9q~d{Dn2Kvt# - -\usepackage{graphicx}% -\usepackage{multirow}% -\usepackage{amsmath,amssymb,amsfonts}% -\usepackage{amsthm}% -\usepackage{mathrsfs}% -\usepackage[title]{appendix}% -\usepackage{xcolor}% -\usepackage{textcomp}% -\usepackage{manyfoot}% -\usepackage{booktabs}% -\usepackage{algorithm}% -\usepackage{algorithmicx}% -\usepackage{algpseudocode}% -\usepackage{listings}% -%%%% - -%%%%%=============================================================================%%%% -%%%% Remarks: This template is provided to aid authors with the preparation -%%%% of original research articles intended for submission to journals published -%%%% by Springer Nature. The guidance has been prepared in partnership with -%%%% production teams to conform to Springer Nature technical requirements. -%%%% Editorial and presentation requirements differ among journal portfolios and -%%%% research disciplines. You may find sections in this template are irrelevant -%%%% to your work and are empowered to omit any such section if allowed by the -%%%% journal you intend to submit to. The submission guidelines and policies -%%%% of the journal take precedence. A detailed User Manual is available in the -%%%% template package for technical guidance. -%%%%%=============================================================================%%%% - -%% as per the requirement new theorem styles can be included as shown below -\theoremstyle{thmstyleone}% -\newtheorem{theorem}{Theorem}% meant for continuous numbers -%%\newtheorem{theorem}{Theorem}[section]% meant for sectionwise numbers -%% optional argument [theorem] produces theorem numbering sequence instead of independent numbers for Proposition -\newtheorem{proposition}[theorem]{Proposition}% -%%\newtheorem{proposition}{Proposition}% to get separate numbers for theorem and proposition etc. - -\theoremstyle{thmstyletwo}% -\newtheorem{example}{Example}% -\newtheorem{remark}{Remark}% - -\theoremstyle{thmstylethree}% -\newtheorem{definition}{Definition}% - -\raggedbottom -%%\unnumbered% uncomment this for unnumbered level heads - -\begin{document} - -\title[Article Title]{Article Title} - -%%=============================================================%% -%% GivenName -> \fnm{Joergen W.} -%% Particle -> \spfx{van der} -> surname prefix -%% FamilyName -> \sur{Ploeg} -%% Suffix -> \sfx{IV} -%% \author*[1,2]{\fnm{Joergen W.} \spfx{van der} \sur{Ploeg} -%% \sfx{IV}}\email{iauthor@gmail.com} -%%=============================================================%% - -\author*[1,2]{\fnm{First} \sur{Author}}\email{iauthor@gmail.com} - -\author[2,3]{\fnm{Second} \sur{Author}}\email{iiauthor@gmail.com} -\equalcont{These authors contributed equally to this work.} - -\author[1,2]{\fnm{Third} \sur{Author}}\email{iiiauthor@gmail.com} -\equalcont{These authors contributed equally to this work.} - -\affil*[1]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{100190}, \state{State}, \country{Country}}} - -\affil[2]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{10587}, \state{State}, \country{Country}}} - -\affil[3]{\orgdiv{Department}, \orgname{Organization}, \orgaddress{\street{Street}, \city{City}, \postcode{610101}, \state{State}, \country{Country}}} - -%%==================================%% -%% Sample for unstructured abstract %% -%%==================================%% - -\abstract{The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. Authors are advised to check the author instructions for the journal they are submitting to for word limits and if structural elements like subheadings, citations, or equations are permitted.} - -%%================================%% -%% Sample for structured abstract %% -%%================================%% - -% \abstract{\textbf{Purpose:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. -% -% \textbf{Methods:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. -% -% \textbf{Results:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to. -% -% \textbf{Conclusion:} The abstract serves both as a general introduction to the topic and as a brief, non-technical summary of the main results and their implications. The abstract must not include subheadings (unless expressly permitted in the journal's Instructions to Authors), equations or citations. As a guide the abstract should not exceed 200 words. Most journals do not set a hard limit however authors are advised to check the author instructions for the journal they are submitting to.} - -\keywords{keyword1, Keyword2, Keyword3, Keyword4} - -%%\pacs[JEL Classification]{D8, H51} - -%%\pacs[MSC Classification]{35A01, 65L10, 65L12, 65L20, 65L70} - -\maketitle - -\section{Introduction}\label{sec1} - -The Introduction section, of referenced text \cite{bib1} expands on the background of the work (some overlap with the Abstract is acceptable). The introduction should not include subheadings. - -Springer Nature does not impose a strict layout as standard however authors are advised to check the individual requirements for the journal they are planning to submit to as there may be journal-level preferences. When preparing your text please also be aware that some stylistic choices are not supported in full text XML (publication version), including coloured font. These will not be replicated in the typeset article if it is accepted. - -\section{Results}\label{sec2} - -\subsection{Twin system architecture} -% 介绍我们这个孪生系统的组成结构,系统运行流程 - -\subsection{End-to-end data transmission} -% 介绍我们系统的数据是怎样端到端传输的,收集端与服务端的布局是怎样的,延迟有多少 - -\subsection{Face different targets} - -\subsubsection{Pedestrian twin} -% 单独孪生人的效果 - -\subsubsection{Vehicle twin} -% 单独孪生车的效果 - -\subsubsection{Pedestrian-Vehicle twin} -% 人车同时孪生的效果 - -\subsection{Twins in different scenarios} - -\subsubsection{Town01 scene twinning effect} -% 展示在town01场景下的人车孪生效果 - -\subsubsection{Town10 scene twinning effect} -% 展示在town10场景下的人车孪生效果 - -\subsection{Critical-State Twin} -% 测试各种极端条件(如大雾、暴雨等)对孪生的影响,找出对孪生效果起决定性作用(基本可以认为无法孪生,即孪生精度过低)的那个临界值 - -\section{Discussion}\label{sec12} - -Discussions should be brief and focused. In some disciplines use of Discussion or `Conclusion' is interchangeable. It is not mandatory to use both. Some journals prefer a section `Results and Discussion' followed by a section `Conclusion'. Please refer to Journal-level guidance for any specific requirements. - - - -%%===========================================================================================%% -%% If you are submitting to one of the Nature Portfolio journals, using the eJP submission %% -%% system, please include the references within the manuscript file itself. You may do this %% -%% by copying the reference list from your .bbl file, paste it into the main manuscript .tex %% -%% file, and delete the associated \verb+\bibliography+ commands. %% -%%===========================================================================================%% - -\bibliography{sn-bibliography}% common bib file -%% if required, the content of .bbl file can be included here once bbl is generated -%%\input sn-article.bbl - -\end{document} From 57365edc17a890e685002ad065ac5a7f4579ecdc Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Thu, 5 Feb 2026 12:10:11 +0800 Subject: [PATCH 26/31] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BA=E6=96=87?= =?UTF-8?q?=E6=8F=90=E7=BA=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- waypoint_control/twin_paper/main.tex | 29 +++++++++++++--------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/waypoint_control/twin_paper/main.tex b/waypoint_control/twin_paper/main.tex index e004a3e..33e6a80 100644 --- a/waypoint_control/twin_paper/main.tex +++ b/waypoint_control/twin_paper/main.tex @@ -150,32 +150,29 @@ \section{Introduction}\label{sec1} \section{Results}\label{sec2} \subsection{Twin system architecture} -% 介绍我们这个孪生系统的组成结构,系统运行流程 +% 介绍我们这个孪生系统的组成结构,系统运行流程,侧重点在于系统的整体布局,突出整体性 \subsection{End-to-end data transmission} -% 介绍我们系统的数据是怎样端到端传输的,收集端与服务端的布局是怎样的,延迟有多少 +% 介绍我们系统的数据是怎样端到端传输的,收集端与服务端的布局是怎样的,延迟有多少,详细说明”在线“属性 -\subsection{Face different targets} +\subsection{Twinning under diversified objects} -\subsubsection{Pedestrian twin} -% 单独孪生人的效果 +\subsubsection{Single-objective twin} +% 单独人、车的孪生 -\subsubsection{Vehicle twin} -% 单独孪生车的效果 - -\subsubsection{Pedestrian-Vehicle twin} -% 人车同时孪生的效果 +\subsubsection{Multi-objective twin} +% 人车同时孪生,这里重点写,前面单独人、车孪生简单写 \subsection{Twins in different scenarios} -\subsubsection{Town01 scene twinning effect} -% 展示在town01场景下的人车孪生效果 +\subsubsection{Virtual scene twinning} +% 在carla中town01、town10场景下的人车孪生 -\subsubsection{Town10 scene twinning effect} -% 展示在town10场景下的人车孪生效果 +\subsubsection{Real-world scene twinning} +% 这里写在中电软件园场景下的人车孪生,与前面carla中的场景作对照 -\subsection{Critical-State Twin} -% 测试各种极端条件(如大雾、暴雨等)对孪生的影响,找出对孪生效果起决定性作用(基本可以认为无法孪生,即孪生精度过低)的那个临界值 +\subsection{System robustness testing and sensor network optimization} +% 测试各种极端条件(如大雾、暴雨等)对孪生的影响,找出对孪生效果起决定性作用(基本可以认为无法孪生,即孪生精度过低)的那个临界值;考虑传感器数目、位置等对孪生效果的影响分布 \section{Discussion}\label{sec12} From 892ab6759f21b6d0426a49a869ca60aa87cdd4ca Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Sat, 28 Feb 2026 16:23:43 +0800 Subject: [PATCH 27/31] =?UTF-8?q?=E4=B8=BA=E8=BD=A8=E8=BF=B9=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E6=B7=BB=E5=8A=A0=E9=80=9F=E5=BA=A6=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reID/Utils/linkIdentities.m | 142 +++++++++++++++++- 1 file changed, 136 insertions(+), 6 deletions(-) diff --git a/waypoint_control/multi_obj_track/reID/Utils/linkIdentities.m b/waypoint_control/multi_obj_track/reID/Utils/linkIdentities.m index f1bc576..67a1887 100644 --- a/waypoint_control/multi_obj_track/reID/Utils/linkIdentities.m +++ b/waypoint_control/multi_obj_track/reID/Utils/linkIdentities.m @@ -46,18 +46,51 @@ for key = keys(road_trajectories{road_idx}) road_data = road_trajectories{road_idx}(key{1}); data_struct = road_data{1}; + data_distance = data_struct.wrl_pos; + data_time = data_struct.timestamp; data_features = data_struct.mean_hsv; % 提取外观特征 + % 计算 x 和 y 方向相邻差值的绝对值 + dx = abs(diff(data_distance(:, 1))); % 相邻 x 坐标差的绝对值 + dy = abs(diff(data_distance(:, 2))); % 相邻 y 坐标差的绝对值 + % 总路程 = 所有 dx 与 dy 之和 + total_distance = sum(dx + dy); + % 总用时 + total_time = data_time(end) - data_time(2); + speed = total_distance / total_time; + + % 记录第一帧与最后一帧的位置与时间 + first_position = data_distance(1, 1:2); + first_time = data_time(1); + last_position = data_distance(end, 1:2); + last_time = data_time(end); + % 尝试在相邻路口中找到匹配项 is_matched = false; for key2 = keys(road_trajectories{2}) matched_traj = road_trajectories{2}(key2{1}); traj_struct = matched_traj{1}; + % 记录第一帧与最后一帧的位置与时间 + f_position = traj_struct.wrl_pos(1, 1:2); % 第一帧的位置 + f_time = traj_struct.timestamp(1); % 第一帧的时间 + l_position = traj_struct.wrl_pos(end, 1:2); % 最后一帧的位置 + l_time = traj_struct.timestamp(end); % 最后一帧的时间 + + % 计算路口轨迹的速度 + if f_time - last_time > 0 + d_time = f_time - last_time; + dis = sum(abs(last_position - f_position)); + d_speed = dis / d_time; + else + d_time = first_time - l_time; + dis = sum(abs(first_position - l_position)); + d_speed = dis / d_time; + end % 这里需要一个函数来计算两个轨迹之间的相似度 % 基于外观特征的余弦相似度 similarity_score = 1 - pdist2(data_features, traj_struct.mean_hsv, 'cosine'); % 设定一个阈值来决定是否匹配 - if similarity_score > threshold + if similarity_score > threshold && d_speed > speed / 2 && d_speed < speed * 2 % 更新匹配轨迹 track = struct( ... 'roadID', road_idx, ... % 道路ID @@ -76,11 +109,27 @@ for key3 = keys(road_trajectories{3}) matched_traj = road_trajectories{3}(key3{1}); traj_struct = matched_traj{1}; + % 记录第一帧与最后一帧的位置与时间 + f_position = traj_struct.wrl_pos(1, 1:2); % 第一帧的位置 + f_time = traj_struct.timestamp(1); % 第一帧的时间 + l_position = traj_struct.wrl_pos(end, 1:2); % 最后一帧的位置 + l_time = traj_struct.timestamp(end); % 最后一帧的时间 + + % 计算路口轨迹的速度 + if f_time - last_time > 0 + d_time = f_time - last_time; + dis = sum(abs(last_position - f_position)); + d_speed = dis / d_time; + else + d_time = first_time - l_time; + dis = sum(abs(first_position - l_position)); + d_speed = dis / d_time; + end % 这里需要一个函数来计算两个轨迹之间的相似度 % 基于外观特征的余弦相似度 similarity_score = 1 - pdist2(data_features, traj_struct.mean_hsv, 'cosine'); % 设定一个阈值来决定是否匹配 - if similarity_score > threshold + if similarity_score > threshold && d_speed > speed / 2 && d_speed < speed * 2 % 更新匹配轨迹 track = struct( ... 'roadID', road_idx, ... % 道路ID @@ -99,11 +148,27 @@ for key4 = keys(road_trajectories{4}) matched_traj = road_trajectories{4}(key4{1}); traj_struct = matched_traj{1}; + % 记录第一帧与最后一帧的位置与时间 + f_position = traj_struct.wrl_pos(1, 1:2); % 第一帧的位置 + f_time = traj_struct.timestamp(1); % 第一帧的时间 + l_position = traj_struct.wrl_pos(end, 1:2); % 最后一帧的位置 + l_time = traj_struct.timestamp(end); % 最后一帧的时间 + + % 计算路口轨迹的速度 + if f_time - last_time > 0 + d_time = f_time - last_time; + dis = sum(abs(last_position - f_position)); + d_speed = dis / d_time; + else + d_time = first_time - l_time; + dis = sum(abs(first_position - l_position)); + d_speed = dis / d_time; + end % 这里需要一个函数来计算两个轨迹之间的相似度 % 基于外观特征的余弦相似度 similarity_score = 1 - pdist2(data_features, traj_struct.mean_hsv, 'cosine'); % 设定一个阈值来决定是否匹配 - if similarity_score > threshold + if similarity_score > threshold && d_speed > speed / 2 && d_speed < speed * 2 % 更新匹配轨迹 track = struct( ... 'roadID', road_idx, ... % 道路ID @@ -122,11 +187,27 @@ for key5 = keys(road_trajectories{5}) matched_traj = road_trajectories{5}(key5{1}); traj_struct = matched_traj{1}; + % 记录第一帧与最后一帧的位置与时间 + f_position = traj_struct.wrl_pos(1, 1:2); % 第一帧的位置 + f_time = traj_struct.timestamp(1); % 第一帧的时间 + l_position = traj_struct.wrl_pos(end, 1:2); % 最后一帧的位置 + l_time = traj_struct.timestamp(end); % 最后一帧的时间 + + % 计算路口轨迹的速度 + if f_time - last_time > 0 + d_time = f_time - last_time; + dis = sum(abs(last_position - f_position)); + d_speed = dis / d_time; + else + d_time = first_time - l_time; + dis = sum(abs(first_position - l_position)); + d_speed = dis / d_time; + end % 这里需要一个函数来计算两个轨迹之间的相似度 % 基于外观特征的余弦相似度 similarity_score = 1 - pdist2(data_features, traj_struct.mean_hsv, 'cosine'); % 设定一个阈值来决定是否匹配 - if similarity_score > threshold + if similarity_score > threshold && d_speed > speed / 2 && d_speed < speed * 2 % 更新匹配轨迹 track = struct( ... 'roadID', road_idx, ... % 道路ID @@ -153,18 +234,51 @@ for key = keys(road_trajectories{road_idx}) road_data = road_trajectories{road_idx}(key{1}); data_struct = road_data{1}; + data_distance = data_struct.wrl_pos; + data_time = data_struct.timestamp; data_features = data_struct.mean_hsv; % 提取外观特征 + % 计算 x 和 y 方向相邻差值的绝对值 + dx = abs(diff(data_distance(:, 1))); % 相邻 x 坐标差的绝对值 + dy = abs(diff(data_distance(:, 2))); % 相邻 y 坐标差的绝对值 + % 总路程 = 所有 dx 与 dy 之和 + total_distance = sum(dx + dy); + % 总用时 + total_time = data_time(end) - data_time(2); + speed = total_distance / total_time; + + % 记录第一帧与最后一帧的位置与时间 + first_position = data_distance(1, 1:2); + first_time = data_time(1); + last_position = data_distance(end, 1:2); + last_time = data_time(end); + % 尝试在相邻路口中找到匹配项 is_matched = false; for key4 = keys(road_trajectories{4}) matched_traj = road_trajectories{4}(key4{1}); traj_struct = matched_traj{1}; + % 记录第一帧与最后一帧的位置与时间 + f_position = traj_struct.wrl_pos(1, 1:2); % 第一帧的位置 + f_time = traj_struct.timestamp(1); % 第一帧的时间 + l_position = traj_struct.wrl_pos(end, 1:2); % 最后一帧的位置 + l_time = traj_struct.timestamp(end); % 最后一帧的时间 + + % 计算路口轨迹的速度 + if f_time - last_time > 0 + d_time = f_time - last_time; + dis = sum(abs(last_position - f_position)); + d_speed = dis / d_time; + else + d_time = first_time - l_time; + dis = sum(abs(first_position - l_position)); + d_speed = dis / d_time; + end % 这里需要一个函数来计算两个轨迹之间的相似度 % 基于外观特征的余弦相似度 similarity_score = 1 - pdist2(data_features, traj_struct.mean_hsv, 'cosine'); % 设定一个阈值来决定是否匹配 - if similarity_score > threshold + if similarity_score > threshold && d_speed > speed / 2 && d_speed < speed * 2 % 更新匹配轨迹 track = struct( ... 'roadID', road_idx, ... % 道路ID @@ -183,11 +297,27 @@ for key5 = keys(road_trajectories{5}) matched_traj = road_trajectories{5}(key5{1}); traj_struct = matched_traj{1}; + % 记录第一帧与最后一帧的位置与时间 + f_position = traj_struct.wrl_pos(1, 1:2); % 第一帧的位置 + f_time = traj_struct.timestamp(1); % 第一帧的时间 + l_position = traj_struct.wrl_pos(end, 1:2); % 最后一帧的位置 + l_time = traj_struct.timestamp(end); % 最后一帧的时间 + + % 计算路口轨迹的速度 + if f_time - last_time > 0 + d_time = f_time - last_time; + dis = sum(abs(last_position - f_position)); + d_speed = dis / d_time; + else + d_time = first_time - l_time; + dis = sum(abs(first_position - l_position)); + d_speed = dis / d_time; + end % 这里需要一个函数来计算两个轨迹之间的相似度 % 基于外观特征的余弦相似度 similarity_score = 1 - pdist2(data_features, traj_struct.mean_hsv, 'cosine'); % 设定一个阈值来决定是否匹配 - if similarity_score > threshold + if similarity_score > threshold && d_speed > speed / 2 && d_speed < speed * 2 % 更新匹配轨迹 track = struct( ... 'roadID', road_idx, ... % 道路ID From f40c37cb2ceacb1a0fd07f23fe2f05ac6e6d99d2 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Sat, 28 Feb 2026 16:36:40 +0800 Subject: [PATCH 28/31] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- waypoint_control/multi_obj_track/mergetraj.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/waypoint_control/multi_obj_track/mergetraj.m b/waypoint_control/multi_obj_track/mergetraj.m index 5704cb4..3c0b6c5 100644 --- a/waypoint_control/multi_obj_track/mergetraj.m +++ b/waypoint_control/multi_obj_track/mergetraj.m @@ -6,4 +6,4 @@ truth_data = [data1.pedestrian_cells, data2.vehicle_cells]; % 保存合并后的数据到新文件 -save('ground_truth.mat', 'truth_data'); \ No newline at end of file +save('ground_truth.mat', 'truth_data'); From d1abdbc6b4e34eb0c86e7d37057bd1f69f698212 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Tue, 10 Mar 2026 17:37:01 +0800 Subject: [PATCH 29/31] =?UTF-8?q?=E6=B7=BB=E5=8A=A0V2X=E4=BC=A0=E6=84=9F?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../collect_intersection_camera_lidar.py | 57 ++++++++++++++++++- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py b/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py index fd80ef0..431695c 100644 --- a/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py +++ b/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py @@ -622,6 +622,53 @@ def spawn_autonomous_pedestrians(world, num_pedestrians=100, random_seed=20): return pedestrian_list +def spawn_v2x_sensors(world, lidar_transform, z_height=2.62): + sensors = {} # 字典 + + # 用字典直接给坐标命名,明确区分 + coordinates = { + "v2x_left": (3.0, 4.0), + "v2x_right": (3.0, -4.0), + "v2x_center": (1.0, 0.0) + } + + # 获取传感器蓝图 + bp = world.get_blueprint_library().find('sensor.other.v2x_custom') + # 定义通信频道 + bp.set_attribute("channel_id", "5") + + for name, (x, y)in coordinates: + # 直接使用原始坐标 + transform = lidar_transform(x=x, y=y, z=z_height) + # 生成V2X传感器 + sensor = world.spawn_actor(bp, transform) + # 激活传感器 + sensor.listen(lambda data: _on_v2x_received(data)) + # 将生成的传感器以名字存入字典 + sensors[name] = sensor + + return sensors + +def spawn_v2x_receiver(world): + transform = carla.Location(x=0, y=0, z=2.62) + + # 获取传感器蓝图 + bp = world.get_blueprint_library().find('sensor.other.v2x_custom') + # 定义通信频道 + bp.set_attribute("channel_id", "5") + # 生成传感器 + receiver = world.spawn_actor(bp, transform) + receiver.listen(lambda data: _on_v2x_received(data)) + + return receiver + +def _on_v2x_received(sensor_data): + for data in sensor_data: + msg_dict = data.get() + raw_bytes = msg_dict["Message"]["Message"]["Bytes"] + content = raw_bytes.decode('utf-8', errors='ignore') + print(f" [接收端] 收到消息 ") + def destroy_actor(lidar, camera_dict, vehicles, sensor_queue, pedestrians): if lidar is not None: lidar.stop() # 确保停止传感器线程 @@ -648,7 +695,7 @@ def destroy_actor(lidar, camera_dict, vehicles, sensor_queue, pedestrians): # python用法 # 创建保存雷达数据的文件夹 def create_radar_folder_py(town_folder, junc): - folder_name = os.path.join("train_data", town_folder, junc, "point") + folder_name = os.path.join("train_data", town_folder, junc, "points") # 检查文件夹是否已存在,若不存在则创建 if not os.path.exists(folder_name): os.makedirs(folder_name) @@ -664,7 +711,7 @@ def create_radar_folder_py(town_folder, junc): # return folder_name # 创建保存标签数据的文件夹 def create_label_folder(town_folder, junc): - folder_name = os.path.join("train_data", town_folder, junc, "label") + folder_name = os.path.join("train_data", town_folder, junc, "labels") if not os.path.exists(folder_name): os.makedirs(folder_name) print(f"Created folder: {folder_name}") @@ -723,7 +770,7 @@ def main(): argparser.add_argument( '-i', '--intersection', metavar='INTERSECTION', - default='road_intersection_1', # 默认路口 + default='road_intersection_5', # 默认路口 help='Name of the intersection within the town (default: road_intersection_1)' ) args = argparser.parse_args() @@ -805,6 +852,10 @@ def main(): sensor_queue = Queue() # 启动相机、雷达传感器 lidar, camera_dict = setup_sensors(world, addtion_param, sensor_queue, lidar_transform, camera_loc) + # 生成并启动V2X数据传输端 + sensors = spawn_v2x_sensors(world, lidar_transform, z_height=2.62) + # 生成并启动V2X数据收集端 + receiver = spawn_v2x_receiver(world) actual_vehicle_num = [] actual_pedestrian_num = [] all_vehicle_labels = [] From f21aaf4c2a4372f55566af8727173807ad954a9d Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Wed, 11 Mar 2026 16:27:54 +0800 Subject: [PATCH 30/31] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=BC=8F=E6=B4=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multi_obj_track/collect_intersection_camera_lidar.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py b/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py index 431695c..6398199 100644 --- a/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py +++ b/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py @@ -637,9 +637,10 @@ def spawn_v2x_sensors(world, lidar_transform, z_height=2.62): # 定义通信频道 bp.set_attribute("channel_id", "5") - for name, (x, y)in coordinates: + for name, (x, y)in coordinates.items(): # 直接使用原始坐标 - transform = lidar_transform(x=x, y=y, z=z_height) + location = carla.Location(x=x, y=y, z=z_height) + transform = carla.Transform(location) # 生成V2X传感器 sensor = world.spawn_actor(bp, transform) # 激活传感器 @@ -650,7 +651,8 @@ def spawn_v2x_sensors(world, lidar_transform, z_height=2.62): return sensors def spawn_v2x_receiver(world): - transform = carla.Location(x=0, y=0, z=2.62) + location = carla.Location(x=0, y=0, z=2.62) + transform = carla.Transform(location, carla.Rotation(yaw=0)) # 获取传感器蓝图 bp = world.get_blueprint_library().find('sensor.other.v2x_custom') From a385bd31403cfb82416e6075e6791b0891036852 Mon Sep 17 00:00:00 2001 From: liuao08 <2496556459@qq.com> Date: Fri, 13 Mar 2026 17:49:47 +0800 Subject: [PATCH 31/31] =?UTF-8?q?=E5=9C=A8=E6=94=B6=E9=9B=86=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=97=B6=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=8A=A8=E5=8C=96?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../collect_intersection_camera_lidar.py | 130 +++++++++++++++++- .../multi_obj_track/object_detection.sh | 16 +++ 2 files changed, 141 insertions(+), 5 deletions(-) create mode 100755 waypoint_control/multi_obj_track/object_detection.sh diff --git a/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py b/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py index 6398199..1b25d06 100644 --- a/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py +++ b/waypoint_control/multi_obj_track/collect_intersection_camera_lidar.py @@ -19,6 +19,8 @@ import random import scipy.io import argparse +import json +import subprocess from queue import Queue from queue import Empty from scipy.spatial.transform import Rotation as R @@ -286,8 +288,43 @@ def dist(actor): return all_labels +def send_v2x_message_lidar(lidar_data, sensor): + """ + 不进行任何降采样,直接将完整激光雷达帧发送出去 + """ + # # 提取点云数据 (使用 Numpy 安全读取底层内存) + # points = np.frombuffer(lidar_data.raw_data, dtype=np.dtype('f4')) + # + # # 把点云字节流转换成十六进制字符串 (hex string) + # payload_hex_str = points.tobytes().hex() + # + # # 组装接收端期望的字典结构 + # v2x_msg_dict = { + # "Message": { + # "Header": { + # "Station ID": "5", + # "Msg Type": "LiDAR_PointCloud" + # }, + # "Message": { + # "Bytes": payload_hex_str # 这里存的是十六进制长字符串 + # } + # } + # } + # + # # 将字典转换为 JSON 文本字符串 (这就对应你代码里的 text) + # text = json.dumps(v2x_msg_dict) + + # 【测试代码】:只发送一个极短的文本 + text = '{"Message": {"Header": {"Station ID": 1001}, "Message": {"Bytes": "Hello"}}}' + + # 使用底层 API 进行打包和发送! + msg = carla.CustomV2XBytes() + msg.set_bytes(bytearray(text, 'utf-8')) + # 触发 V2X 发送 + sensor.send(msg) + # 定义函数来保存雷达点云数据 -def save_radar_data(radar_data, world, ego_vehicle_transform, actual_vehicle_num, actual_pedestrian_num,lidar_to_world_inv, all_vehicle_labels, all_pedestrian_labels, junc, town_folder, file_num): +def save_radar_data(radar_data, world, ego_vehicle_transform, actual_vehicle_num, actual_pedestrian_num,lidar_to_world_inv, all_vehicle_labels, all_pedestrian_labels, junc, town_folder, file_num, sensors): global global_time # 获取当前帧编号 current_frame = radar_data.frame @@ -298,6 +335,8 @@ def save_radar_data(radar_data, world, ego_vehicle_transform, actual_vehicle_num location = ego_vehicle_transform.location all_labels = save_point_label(world, location, lidar_to_world_inv, timestamp, all_vehicle_labels, all_pedestrian_labels) + sensor = sensors["v2x_point"] + send_v2x_message_lidar(radar_data, sensor) # 获取雷达数据并将其转化为numpy数组 points = np.frombuffer(radar_data.raw_data, dtype=np.dtype('f4')) points = np.reshape(points, (len(points) // 4, 4)) @@ -410,10 +449,13 @@ def dist(actor): # 1. 直接保存 datalogpy 为 .npy radar_folder = create_radar_folder_py(town_folder, junc) np.save(os.path.join(radar_folder, f"{file_num}.npy"), datalogpy) + # 保存备份用于目标检测 + target_dir = "OpenPCDet/data/custom/points" + clear_folder_contents(target_dir) + np.save(os.path.join(target_dir, f"{file_num}.npy"), datalogpy) # 2. 保存 label 为 .txt label_folder = create_label_folder(town_folder, junc) with open(os.path.join(label_folder, f"{file_num}.txt"), 'w') as f: - # 处理不同的数据结构 if isinstance(all_labels, list): # 检查是否是嵌套列表(多个标签) @@ -430,10 +472,61 @@ def dist(actor): # 其他类型(字符串、数字等) f.write(str(all_labels)) + # 保存备份用于目标检测 + goal_dir = "OpenPCDet/data/custom/labels" + clear_folder_contents(goal_dir) + with open(os.path.join(goal_dir, f"{file_num}.txt"), 'w') as f: + # 处理不同的数据结构 + if isinstance(all_labels, list): + # 检查是否是嵌套列表(多个标签) + if all_labels and isinstance(all_labels[0], list): + # 多个标签:每行一个标签 + for label_item in all_labels: + line = " ".join(str(item) for item in label_item) + f.write(line + "\n") + else: + # 单个标签:一行 + line = " ".join(str(item) for item in all_labels) + f.write(line + "\n") + else: + # 其他类型(字符串、数字等) + f.write(str(all_labels)) # 3. 每次保存 file_num 到 num.txt,并换行 with open("num.txt", 'a') as f: # 'a' 表示追加模式 f.write(str(file_num) + "\n") # 添加换行符 + # 保存备份用于目标检测 + dir_train = "OpenPCDet/data/custom/ImageSets/train.txt" + dir_val = "OpenPCDet/data/custom/ImageSets/val.txt" + with open(dir_train, 'w') as f: + f.write(str(file_num) + "\n") # 添加换行符 + with open(dir_val, 'w') as f: + f.write(str(file_num) + "\n") # 添加换行符 + + # 运行自动化目标检测脚本 + run_shell_script() + +# 更新目标检测的文件夹 +def clear_folder_contents(folder_path): + # 如果文件夹本来就不存在,直接建一个就行了 + if not os.path.exists(folder_path): + os.makedirs(folder_path) + print(f"文件夹不存在,已新建: {folder_path}") + return + + # 如果存在,就遍历里面的所有内容 + for filename in os.listdir(folder_path): + file_path = os.path.join(folder_path, filename) + try: + # 如果是普通文件或软链接,直接删除 + if os.path.isfile(file_path) or os.path.islink(file_path): + os.unlink(file_path) # 等同于 os.remove + # 如果里面还有子文件夹,用 shutil.rmtree 删掉子文件夹 + elif os.path.isdir(file_path): + shutil.rmtree(file_path) + except Exception as e: + print(f'删除 {file_path} 失败。原因: {e}') + print(f"文件夹内容已清空: {folder_path}") # 定义函数来保存相机图像数据 @@ -455,7 +548,6 @@ def save_camera_data(image_data, camera_id, junc, town_folder): def sensor_callback(sensor_data, sensor_queue, sensor_name): sensor_queue.put((sensor_data, sensor_name)) - # 记录雷达和相机数据 def setup_sensors(world, addtion_param, sensor_queue, transform, camera_loc): lidar = None @@ -629,7 +721,8 @@ def spawn_v2x_sensors(world, lidar_transform, z_height=2.62): coordinates = { "v2x_left": (3.0, 4.0), "v2x_right": (3.0, -4.0), - "v2x_center": (1.0, 0.0) + "v2x_center": (1.0, 0.0), + "v2x_point": (0.5, 0.5) } # 获取传感器蓝图 @@ -665,6 +758,7 @@ def spawn_v2x_receiver(world): return receiver def _on_v2x_received(sensor_data): + print(f"收到消息") for data in sensor_data: msg_dict = data.get() raw_bytes = msg_dict["Message"]["Message"]["Bytes"] @@ -736,6 +830,32 @@ def recognize_vehicle_class(vehicle): return "Car" +def run_shell_script(): + # 定义脚本的绝对路径 + script_path = "/home/yons/object_detection.sh" + + # 定义工作目录(脚本在哪里运行很重要!) + work_dir = "/mnt/mydrive/traffic_twin/waypoint_control/multi_obj_track" + print("开始执行 Shell 脚本...") + try: + # 使用 subprocess.run 执行脚本 + # cwd=work_dir 确保脚本是在 OpenPCDet 根目录下运行的 + # capture_output=True 可以截获脚本在终端打印的信息 + result = subprocess.run( + ["bash", script_path], + cwd=work_dir, + capture_output=True, + text=True, + check=True + ) + + print("✅ 脚本执行成功!输出如下:") + print(result.stdout) + + except subprocess.CalledProcessError as e: + print("❌ 脚本执行失败!") + print(f"错误信息:\n{e.stderr}") + # 主函数 def main(): argparser = argparse.ArgumentParser( @@ -897,7 +1017,7 @@ def main(): for _ in range(1 + len(camera_dict)): data, sensor_name = sensor_queue.get(True, 1.0) if "lidar" in sensor_name: # lidar数据 - save_radar_data(data, world, ego_transform, actual_vehicle_num, actual_pedestrian_num, lidar_to_world_inv, all_vehicle_labels, all_pedestrian_labels, junc, town_folder, file_num) + save_radar_data(data, world, ego_transform, actual_vehicle_num, actual_pedestrian_num, lidar_to_world_inv, all_vehicle_labels, all_pedestrian_labels, junc, town_folder, file_num, sensors) else: save_camera_data(data, sensor_name, junc, town_folder) # time.sleep(0.05) diff --git a/waypoint_control/multi_obj_track/object_detection.sh b/waypoint_control/multi_obj_track/object_detection.sh new file mode 100755 index 0000000..fe642c2 --- /dev/null +++ b/waypoint_control/multi_obj_track/object_detection.sh @@ -0,0 +1,16 @@ +#!/bin/bash +echo "========== 开始执行自动化目标检测 ==========" + +# 环境变量设置 +source ~/anaconda3/etc/profile.d/conda.sh +conda activate openpcdet + +# 先进入工作目录 +WORK_DIR="/home/yons/traffic_twin/waypoint_control/multi_obj_track/OpenPCDet" +cd $WORK_DIR + +# 运行 Python 脚本 +python -m pcdet.datasets.custom.custom_dataset create_custom_infos tools/cfgs/dataset_configs/custom_dataset.yaml +python tools/test.py --cfg_file output/cfgs/custom_models/pv_rcnn/default/pv_rcnn.yaml --ckpt latest_model.pth + +echo "========== 完成自动化目标检测 ==========" \ No newline at end of file

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