change affected files for output rules
This commit is contained in:
parent
7434c12b31
commit
d85905035c
11 changed files with 1073 additions and 1073 deletions
|
|
@ -1,7 +1,7 @@
|
|||
# Walking-Hiking-Mountain/Alpine Hiking profile TEMPLATE
|
||||
# 18/5/2016 v1.8.7 ! Fixed down/uphillcostfactors for shortest_way - to be really shortest
|
||||
#
|
||||
# SAC T3 - demanding_mountain_hiking - exposed sites may be secured, possible need of hands for balance, Partly exposed with fall hazard, Well sure-footed, Good hiking shoes, Basic alpine experience
|
||||
# SAC T3 - demanding_mountain_hiking - exposed sites may be secured, possible need of hands for balance, Partly exposed with fall hazard, Well sure-footed, Good hiking shoes, Basic alpine experience
|
||||
#
|
||||
# Legend above is placeholder for generated comments of final profile
|
||||
# See the profile bottom for changelogs and verbose *) comments
|
||||
|
|
@ -13,7 +13,7 @@
|
|||
assign consider_elevation 1 # 0 as default, otherwise less interesting flat roads are chosen.
|
||||
assign shortest_way 0 # 0 as default, duplicate shortest standard profile, SAC access limit ignored for now
|
||||
|
||||
assign turnInstructionMode = 1 # 0=none, 1=auto-choose, 2=locus-style, 3=osmand-style
|
||||
assign turnInstructionMode = 1 # %turnInstructionMode% | Mode for the generated turn instructions | [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style, 7=locus-old-style]
|
||||
assign turnInstructionCatchingRange 20 # V1.8.5 / default=40, but foot paths may be more distingushed, especially in cities.
|
||||
|
||||
assign iswet 0 # 0 as default, 1 tries to prevent muddy boots and wet buttocks
|
||||
|
|
@ -28,10 +28,10 @@ assign path_preference 0.0 # 0.0 as default, try 20.0 to penalize non
|
|||
assign SAC_scale_limit 3 # 0..6, 0 to avoid any SAC paths, 1 for T1 as maximum, 6 for T6 as maximum
|
||||
# all paths with sac_scale higher than SAC_scale_limit are forbidden.
|
||||
assign SAC_scale_preferred 1 # The same, but the preferred SAC scale level. Level below are slightly, above strongly penalized
|
||||
assign SAC_access_penalty 9000 # costfactor 9999 means the most horrible but allowed road.,
|
||||
assign SAC_access_penalty 9000 # costfactor 9999 means the most horrible but allowed road.,
|
||||
# 100000=forbidden. This makes difference if forbidden way is the only option.
|
||||
assign SAC_K1 0.05 # Penalizing of SAC levels below preferred
|
||||
assign SAC_K2 0.6 # Penalizing of SAC levels above preferred
|
||||
assign SAC_K1 0.05 # Penalizing of SAC levels below preferred
|
||||
assign SAC_K2 0.6 # Penalizing of SAC levels above preferred
|
||||
|
||||
#orientation/decision penalties, not used for preferred hiking routes
|
||||
assign turncost_value 0 # not used now
|
||||
|
|
@ -58,14 +58,14 @@ assign Offroad_hillcostfactor multiply -0.3333 ( max -3.0 ( multiply -1.0 (
|
|||
# progressively decreases hillcosts to be 0.0 at Offroad_factor = 3.0
|
||||
# if Offroad_factor = 1 , then downhillcost decreases e.g. from 60 to 40
|
||||
|
||||
assign downhillcost if consider_elevation then
|
||||
assign downhillcost if consider_elevation then
|
||||
( multiply ( add 1.0 ( multiply Offroad_hillcostfactor -1.0 ) ) downhillcostvalue ) else 0
|
||||
|
||||
assign uphillcost if consider_elevation then
|
||||
( multiply ( add 1.0 ( multiply Offroad_hillcostfactor -1.0 ) ) uphillcostvalue ) else 0
|
||||
|
||||
assign uphillcutoff if consider_elevation then uphillcutoffvalue else 1.5
|
||||
assign downhillcutoff if consider_elevation then downhillcutoffvalue else 1.5
|
||||
assign downhillcutoff if consider_elevation then downhillcutoffvalue else 1.5
|
||||
|
||||
assign nonhiking_route_penalty add 1.0 max 0.0 hiking_routes_preference
|
||||
|
||||
|
|
@ -80,7 +80,7 @@ assign validForFoot 1
|
|||
#Penalty is ( 1 + SAC_K1)^(SAC_scale_preferred - SAC) -1 for SAC_scale_preferred > SAC, SAC <= SAC_scale_limit
|
||||
#Penalty is ( 1 + SAC_K2)^(SAC - SAC_scale_preferred) -1 for SAC_scale_preferred < SAC, SAC <= SAC_scale_limit
|
||||
|
||||
#extra complexity of code below, with adding +/- 1.0
|
||||
#extra complexity of code below, with adding +/- 1.0
|
||||
#is to keep final penalties additive, even with multiplicative incremental penalty approach
|
||||
#code is run only once, being in global context
|
||||
|
||||
|
|
@ -109,35 +109,35 @@ assign any_hiking_route or route=hiking or route_hiking_iwn=yes
|
|||
or route_hiking_nwn=yes or route_hiking_rwn=yes
|
||||
or route_hiking_lwn=yes or route_hiking_=yes
|
||||
or route_foot_=yes or route_foot_nwn=yes
|
||||
or route_foot_rwn=yes route_foot_lwn=yes
|
||||
|
||||
or route_foot_rwn=yes route_foot_lwn=yes
|
||||
|
||||
assign any_cycleroute =
|
||||
if route_bicycle_icn=yes then true
|
||||
else if route_bicycle_ncn=yes then true
|
||||
else if route_bicycle_rcn=yes then true
|
||||
else if route_bicycle_lcn=yes then true
|
||||
else false
|
||||
|
||||
else false
|
||||
|
||||
assign is_ldhr and any_hiking_route not equal 0.0 hiking_routes_preference
|
||||
assign nodeaccessgranted any_hiking_route
|
||||
|
||||
# ismuddy addresses potentially bad surface conditions during wet weather ( mud, slickiness of grass)
|
||||
assign ismuddy and or isunpaved surface=
|
||||
assign ismuddy and or isunpaved surface=
|
||||
and iswet
|
||||
not or surface=gravel surface=pebblestone
|
||||
not or surface=gravel surface=pebblestone
|
||||
|
||||
assign issidewalk sidewalk=left|right|both|yes
|
||||
|
||||
assign istrack highway=track|road|path|footway
|
||||
assign ismainroad highway=motorway|motorway_link|trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link|unclassified
|
||||
|
||||
#assign turncost switch or shortest_way is_ldhr 0 turncost_value #v1.5
|
||||
#assign turncost switch or shortest_way is_ldhr 0 turncost_value #v1.5
|
||||
assign turncost 0 #v1.8.3
|
||||
|
||||
assign initialcost
|
||||
switch route=ferry 10000
|
||||
|
||||
switch or shortest_way is_ldhr 0 initialcost_value
|
||||
assign initialcost
|
||||
switch route=ferry 10000
|
||||
|
||||
switch or shortest_way is_ldhr 0 initialcost_value
|
||||
|
||||
assign defaultaccess switch access= not motorroad=yes switch or access=private access=no 0 1
|
||||
|
||||
|
|
@ -151,28 +151,28 @@ assign bikeaccess
|
|||
1
|
||||
not or bicycle=private or bicycle=no bicycle=dismount
|
||||
|
||||
assign footaccess or any_hiking_route
|
||||
or issidewalk
|
||||
assign footaccess or any_hiking_route
|
||||
or issidewalk
|
||||
or and bikeaccess not foot=no
|
||||
or bicycle=dismount
|
||||
switch foot= defaultaccess not foot=private|no
|
||||
|
||||
|
||||
assign accesspenalty switch footaccess 0 switch bikeaccess 4 100000
|
||||
|
||||
assign badoneway = 0
|
||||
assign onewaypenalty = 0
|
||||
|
||||
|
||||
#SAC is estimated path difficulty,
|
||||
#SAC is estimated path difficulty,
|
||||
#integrating both MTB and SAC scales with estimated MTB/SAC difficulty matching
|
||||
#see http://wiki.openstreetmap.org/wiki/Key:mtb:scale
|
||||
# http://wiki.openstreetmap.org/wiki/Key:sac_scale
|
||||
|
||||
assign SAC
|
||||
assign SAC
|
||||
if sac_scale= then (
|
||||
|
||||
|
||||
if mtb:scale= then 0
|
||||
|
||||
|
||||
else if mtb:scale=6|5 then 5
|
||||
else if mtb:scale=4 then 4
|
||||
else if mtb:scale=3 then 3
|
||||
|
|
@ -181,7 +181,7 @@ assign SAC
|
|||
else 0
|
||||
)
|
||||
else
|
||||
|
||||
|
||||
if sac_scale=difficult_alpine_hiking then 6
|
||||
else if sac_scale=demanding_alpine_hiking then 5
|
||||
else if sac_scale=alpine_hiking then 4
|
||||
|
|
@ -189,29 +189,29 @@ assign SAC
|
|||
else if sac_scale=mountain_hiking then 2
|
||||
else if sac_scale=hiking|T1-hiking|yes then 1
|
||||
else 0
|
||||
|
||||
assign SAC_scale_access # if SAC_scale_limit < SAC then true else false
|
||||
if sac_scale= then true else equal ( max SAC_scale_limit SAC ) SAC_scale_limit
|
||||
|
||||
|
||||
assign SAC_scale_access # if SAC_scale_limit < SAC then true else false
|
||||
if sac_scale= then true else equal ( max SAC_scale_limit SAC ) SAC_scale_limit
|
||||
|
||||
assign SAC_scale_penalty
|
||||
|
||||
if not SAC_scale_access then SAC_access_penalty # not allowed SAC scale
|
||||
|
||||
|
||||
else if equal SAC SAC_scale_preferred then 0.0
|
||||
else if equal ( add SAC 1 ) SAC_scale_preferred then SAC_K1
|
||||
else if equal ( add SAC 2 ) SAC_scale_preferred then SAC_K1_2
|
||||
else if equal ( add SAC 3 ) SAC_scale_preferred then SAC_K1_3
|
||||
else if equal ( add SAC 4 ) SAC_scale_preferred then SAC_K1_4
|
||||
else if equal ( add SAC 5 ) SAC_scale_preferred then SAC_K1_5
|
||||
else if equal ( add SAC 6 ) SAC_scale_preferred then SAC_K1_6
|
||||
else if equal ( add SAC_scale_preferred 1 ) SAC then SAC_K2
|
||||
else if equal ( add SAC 2 ) SAC_scale_preferred then SAC_K1_2
|
||||
else if equal ( add SAC 3 ) SAC_scale_preferred then SAC_K1_3
|
||||
else if equal ( add SAC 4 ) SAC_scale_preferred then SAC_K1_4
|
||||
else if equal ( add SAC 5 ) SAC_scale_preferred then SAC_K1_5
|
||||
else if equal ( add SAC 6 ) SAC_scale_preferred then SAC_K1_6
|
||||
else if equal ( add SAC_scale_preferred 1 ) SAC then SAC_K2
|
||||
else if equal ( add SAC_scale_preferred 2 ) SAC then SAC_K2_2
|
||||
else if equal ( add SAC_scale_preferred 3 ) SAC then SAC_K2_3
|
||||
else if equal ( add SAC_scale_preferred 4 ) SAC then SAC_K2_4
|
||||
else if equal ( add SAC_scale_preferred 5 ) SAC then SAC_K2_5
|
||||
else if equal ( add SAC_scale_preferred 6 ) SAC then SAC_K2_6
|
||||
else 1.0
|
||||
|
||||
else if equal ( add SAC_scale_preferred 3 ) SAC then SAC_K2_3
|
||||
else if equal ( add SAC_scale_preferred 4 ) SAC then SAC_K2_4
|
||||
else if equal ( add SAC_scale_preferred 5 ) SAC then SAC_K2_5
|
||||
else if equal ( add SAC_scale_preferred 6 ) SAC then SAC_K2_6
|
||||
else 1.0
|
||||
|
||||
assign tracktype_penalty (
|
||||
if not istrack then 0.0 else if tracktype= then 0.0
|
||||
else if tracktype=grade1 then 0.1 else if tracktype=grade2 then 0.05
|
||||
|
|
@ -240,91 +240,91 @@ assign wet_penalty (
|
|||
)
|
||||
|
||||
assign Offroad_factor_for_road
|
||||
if ( equal Offroad_factor 0.0 ) then 0.0 else
|
||||
if ( equal Offroad_factor 0.0 ) then 0.0 else
|
||||
(
|
||||
if ismainroad then Offroad_factor
|
||||
else if ( or ispaved highway=residential|living_street|service|pedestrian ) then ( multiply 0.33 Offroad_factor )
|
||||
else if ( not isunpaved ) then ( multiply -0.33 Offroad_factor )
|
||||
if ismainroad then Offroad_factor
|
||||
else if ( or ispaved highway=residential|living_street|service|pedestrian ) then ( multiply 0.33 Offroad_factor )
|
||||
else if ( not isunpaved ) then ( multiply -0.33 Offroad_factor )
|
||||
else ( multiply -1 multiply Offroad_factor ( add 1.0 ( multiply 0.33 SAC_scale_penalty ) ) )
|
||||
)
|
||||
|
||||
|
||||
assign nonpath_penalty =
|
||||
if ( equal path_preference 0.0 ) then 0.0 # nonpath_penalty inactive
|
||||
else if not istrack then path_preference #istrack = highway=track/path/road/footway
|
||||
else if ispaved then ( multiply path_preference 0.5 )
|
||||
else if or ( and not isunpaved not highway=path )
|
||||
else if or ( and not isunpaved not highway=path )
|
||||
( tracktype=grade1|grade2 ) then ( multiply path_preference 0.25 )
|
||||
else if not ( and isunpaved
|
||||
and highway=path
|
||||
and tracktype=grade1|grade2
|
||||
not surface=gravel|cobblestone|pebblestone )
|
||||
else if not ( and isunpaved
|
||||
and highway=path
|
||||
and tracktype=grade1|grade2
|
||||
not surface=gravel|cobblestone|pebblestone )
|
||||
then ( multiply path_preference 0.125 )
|
||||
else 0.0
|
||||
|
||||
else 0.0
|
||||
|
||||
assign rawcostfactor # can be <1.0, is treated later
|
||||
|
||||
if shortest_way then ( add 1 accesspenalty ) else
|
||||
|
||||
|
||||
add nonpath_penalty
|
||||
add accesspenalty
|
||||
(
|
||||
if ( and highway= not route=ferry ) then 100000
|
||||
if ( and highway= not route=ferry ) then 100000
|
||||
else if highway=steps then ( switch allow_steps ( switch consider_elevation 1.0 3.0 ) 100000 )
|
||||
else if route=ferry then ( if allow_ferries then 2.34 else 100000 )
|
||||
|
||||
|
||||
# iswet=1 in global context section means wet weather, increases penalty for eventually inconvenient ways
|
||||
# ismuddy boolean relates in wet weather to unpaved or unclassified surface, that can have mud or get slicky in wet weather.
|
||||
|
||||
else if highway=pedestrian then ( switch ismuddy 1.3 1.0 )
|
||||
else if highway=bridleway then ( switch ismuddy 2.5 switch iswet 1.4 1.2 )
|
||||
else if highway=cycleway then ( switch ismuddy 1.4 switch iswet 1.0 1.1 )
|
||||
else if highway=residential|living_street
|
||||
else if highway=residential|living_street
|
||||
then ( switch ismuddy 1.5 switch iswet 1.0 1.1 )
|
||||
else if highway=service then ( switch ismuddy 1.5 switch iswet 1.1 1.2 )
|
||||
|
||||
else if istrack then
|
||||
|
||||
else if istrack then
|
||||
( add 1.0 add tracktype_penalty add surface_penalty add wet_penalty SAC_scale_penalty )
|
||||
|
||||
else if highway=motorway|motorway_link then 100000
|
||||
else if highway=proposed|abandoned|construction then ( switch ismuddy 10 switch iswet 6 4 )
|
||||
|
||||
else if highway=trunk|trunk_link then
|
||||
|
||||
else if highway=trunk|trunk_link then
|
||||
( switch iswet ( switch issidewalk 1.5 10 ) ( switch issidewalk 2.0 20 ) )
|
||||
else if highway=primary|primary_link then
|
||||
( switch iswet ( switch issidewalk 1.5 5 ) ( switch issidewalk 2.0 10 ) )
|
||||
else if highway=secondary|secondary_link then
|
||||
else if highway=primary|primary_link then
|
||||
( switch iswet ( switch issidewalk 1.5 5 ) ( switch issidewalk 2.0 10 ) )
|
||||
else if highway=secondary|secondary_link then
|
||||
( switch iswet ( switch issidewalk 1.2 2.5 ) ( switch issidewalk 1.5 4.0 ) )
|
||||
else if highway=tertiary|tertiary_link then
|
||||
( if iswet then ( switch issidewalk 1.1 1.5 ) else ( switch issidewalk 1.2 2.5 ) )
|
||||
else if highway=unclassified then
|
||||
( if ismuddy then 3.0 else if iswet then ( switch issidewalk 1.0 1.3 ) else ( switch issidewalk 1.1 1.5 ) )
|
||||
|
||||
( if ismuddy then 3.0 else if iswet then ( switch issidewalk 1.0 1.3 ) else ( switch issidewalk 1.1 1.5 ) )
|
||||
|
||||
else add cost_of_unknown switch ismuddy 0.5 0.0
|
||||
)
|
||||
|
||||
assign rawcostfactor2
|
||||
|
||||
|
||||
assign rawcostfactor2
|
||||
|
||||
if equal hiking_routes_preference 0.0 then rawcostfactor # Not preferring hiking routes
|
||||
else if is_ldhr then rawcostfactor # is hiking route
|
||||
else multiply rawcostfactor nonhiking_route_penalty
|
||||
|
||||
assign costfactor if shortest_way then ( add 1 accesspenalty )
|
||||
else max 1.0 add rawcostfactor2 Offroad_factor_for_road
|
||||
else multiply rawcostfactor nonhiking_route_penalty
|
||||
|
||||
assign costfactor if shortest_way then ( add 1 accesspenalty )
|
||||
else max 1.0 add rawcostfactor2 Offroad_factor_for_road
|
||||
|
||||
assign downhillcostfactor
|
||||
if shortest_way then ( add 1 accesspenalty ) else
|
||||
max 1.0
|
||||
max 1.0
|
||||
add rawcostfactor2
|
||||
add Offroad_factor_for_road
|
||||
add Offroad_factor_for_road
|
||||
if ismuddy then 0.5 # slicky
|
||||
else if surface=grass then -0.2 # soft impact
|
||||
else if ispaved then 0.2 # hard impact
|
||||
else if surface=gravel|pebblestone|fine_gravel then 0.3 # slides
|
||||
else 0.0
|
||||
|
||||
assign uphillcostfactor
|
||||
assign uphillcostfactor
|
||||
if shortest_way then ( add 1 accesspenalty ) else
|
||||
max 1.0
|
||||
max 1.0
|
||||
add rawcostfactor2
|
||||
add Offroad_factor_for_road
|
||||
if ismuddy then 0.3 # slicky
|
||||
|
|
@ -332,9 +332,9 @@ assign uphillcostfactor
|
|||
else if ispaved then -0.1 # sure foot
|
||||
else if surface=gravel|pebblestone|fine_gravel then 0.2 # slides
|
||||
else 0.0
|
||||
|
||||
|
||||
# way priorities used for voice hint generation
|
||||
|
||||
|
||||
assign priorityclassifier =
|
||||
|
||||
if ( highway=motorway ) then 30
|
||||
|
|
@ -350,12 +350,12 @@ assign priorityclassifier =
|
|||
else if ( highway=unclassified ) then 20
|
||||
else if ( highway=residential|living_street ) then 18
|
||||
else if ( highway=steps|pedestrian ) then 16
|
||||
else if ( highway=service|cycleway ) then if ( or tracktype=grade1 ispaved ) then 14 else 12
|
||||
else if ( highway=track|road|bridleway ) then if ( or tracktype=grade1 ispaved ) then 10 else 8
|
||||
else if ( highway=service|cycleway ) then if ( or tracktype=grade1 ispaved ) then 14 else 12
|
||||
else if ( highway=track|road|bridleway ) then if ( or tracktype=grade1 ispaved ) then 10 else 8
|
||||
else if ( highway=path|footway ) then ( if ( or tracktype=grade1 ispaved ) then 6
|
||||
else if tracktype=grade2 then 4
|
||||
else if not surface=grass|gravel then 3
|
||||
else 2 )
|
||||
else 2 )
|
||||
else 0
|
||||
|
||||
# some more classifying bits used for voice hint generation...
|
||||
|
|
@ -375,8 +375,8 @@ assign classifiermask add isbadoneway
|
|||
add multiply isgoodoneway 2
|
||||
add multiply isroundabout 4
|
||||
add multiply islinktype 8
|
||||
multiply isgoodforcars 16
|
||||
|
||||
multiply isgoodforcars 16
|
||||
|
||||
---context:node # following code refers to node tags
|
||||
|
||||
|
||||
|
|
@ -436,9 +436,9 @@ assign initialcost switch or bikeaccess footaccess 0 1000000
|
|||
# - 0.33 * MTB_factor for not paved/not unpaved roads,
|
||||
# - MTB_factor * ( 1 + 0.33 * smoothnesspenalty ) for unpaved roads. - at MTB_factor 3.0 smootheness is ignored
|
||||
#
|
||||
# Default is 0.0 = no effect.
|
||||
# Default is 0.0 = no effect.
|
||||
# Recommended -0.5 - +1.0
|
||||
# Reasonable -2.0 .. +3.0,
|
||||
# Reasonable -2.0 .. +3.0,
|
||||
#
|
||||
# Final costfactor is kept >= 1 for final costfacto values.
|
||||
#############################################################################################
|
||||
|
|
@ -453,13 +453,13 @@ assign initialcost switch or bikeaccess footaccess 0 1000000
|
|||
#
|
||||
# 2014-10-10 v1.1 - changed hiking route preference logic
|
||||
# 1.2 - fixed preference counting bug
|
||||
# 2014-10-11 1.3 - adding foot route to hiking routes,
|
||||
# 2014-10-11 1.3 - adding foot route to hiking routes,
|
||||
# fixed ferry cost to respect initial cost triggerring.
|
||||
# added bikeaccess, added shortest way mode, code cleanup
|
||||
# 2014-10-12: v1.4 - involving turncosts and way/node initial costs as orientation/decision penalties,
|
||||
# but turning them off for sticking to hiking routes as extra preference,
|
||||
# tweaking cost preferences
|
||||
# 2014-10-13 v1.5
|
||||
# 2014-10-13 v1.5
|
||||
# redesigned route preference policy - turncost turned off even for nonsticky but preferred hiking routes
|
||||
# cost tweaking.
|
||||
# removed uniform cost=1 for sticky hiking routes, to distinguish quality
|
||||
|
|
@ -467,14 +467,14 @@ assign initialcost switch or bikeaccess footaccess 0 1000000
|
|||
# used not round costs to often trigger initial cost calculation
|
||||
#v1.51 - bugfix of redundant routing penalty
|
||||
#v 1.6 - initialcost penalty only for sticking routes, decreased way penalties for preferring routes
|
||||
# 31/5/2015 v 1.7 ALFA + sac_scale + sac_scale_limit implemented
|
||||
# 31/5/2015 v 1.7 ALFA + sac_scale + sac_scale_limit implemented
|
||||
# 10/6/2015 v1.7.1 ALFA * sac_scale improved
|
||||
# + MTB scale integrated to SAC scale
|
||||
# + sac_scale_preferred implemented, with progressive penalizing for SAC <> SAC preferred
|
||||
# 10/6/2015 v1.7.2 BETA ! Fixed general way access penalties
|
||||
# 15/6/2015 v1.7.3 BETA * SAC-MTB scale integration reevaluated, increased MTB scale penalty
|
||||
# * MTB scale penalty used as fallback if no SAC rating
|
||||
# 16/6/2015 v1.7.4 ALFA * Optimized SAC logic
|
||||
# 16/6/2015 v1.7.4 ALFA * Optimized SAC logic
|
||||
# 17/6/2015 v1.7.5 BETA + Track penalty system
|
||||
# 20/6/2015 v1.7.6 RELEASE * Modified and simplified route preferencing
|
||||
# 01/12/2015 v1.8.1 ALFA +ported MTB_factor from bicycle Trekking template, renamed for hiking context to Offroad_factor
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue