Dynamic copyright or layer credit in QGIS 3.4?
Is it possible to add a layer credit to the bottom right corner of the map and print composer in QGIS 3.4? This fuctionality existed in 2.8, as seen here.
I can't find this option in the layer properties anymore. I realize I can do something similar manually via the Copyright Decoration, but it was nice to just check/uncheck a box when needed. The Copyright Decoration is also always on top and visible.
Perhaps someone can suggest an expression to use in the Copyright Decoration that will pull the visible layer's metadata and use that as the text string? My QGIS expression skills aren't that strong yet.
qgis qgis-3
add a comment |
Is it possible to add a layer credit to the bottom right corner of the map and print composer in QGIS 3.4? This fuctionality existed in 2.8, as seen here.
I can't find this option in the layer properties anymore. I realize I can do something similar manually via the Copyright Decoration, but it was nice to just check/uncheck a box when needed. The Copyright Decoration is also always on top and visible.
Perhaps someone can suggest an expression to use in the Copyright Decoration that will pull the visible layer's metadata and use that as the text string? My QGIS expression skills aren't that strong yet.
qgis qgis-3
add a comment |
Is it possible to add a layer credit to the bottom right corner of the map and print composer in QGIS 3.4? This fuctionality existed in 2.8, as seen here.
I can't find this option in the layer properties anymore. I realize I can do something similar manually via the Copyright Decoration, but it was nice to just check/uncheck a box when needed. The Copyright Decoration is also always on top and visible.
Perhaps someone can suggest an expression to use in the Copyright Decoration that will pull the visible layer's metadata and use that as the text string? My QGIS expression skills aren't that strong yet.
qgis qgis-3
Is it possible to add a layer credit to the bottom right corner of the map and print composer in QGIS 3.4? This fuctionality existed in 2.8, as seen here.
I can't find this option in the layer properties anymore. I realize I can do something similar manually via the Copyright Decoration, but it was nice to just check/uncheck a box when needed. The Copyright Decoration is also always on top and visible.
Perhaps someone can suggest an expression to use in the Copyright Decoration that will pull the visible layer's metadata and use that as the text string? My QGIS expression skills aren't that strong yet.
qgis qgis-3
qgis qgis-3
asked Feb 12 at 16:29
ablairificationablairification
283
283
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
Building on J. Monticolo's excellent answer, here's a method that gives attributions for all visible layers.
@map_layer_ids
returns a list (or "array") of the visible map layers
array_get()
returns a single item from a list
array_get( @map_layer_ids ,0)
returns the first item from the list of visible map layers
concat()
combines multiple text strings
For a map with eight layers in the layer panel, use this expression to combine the attributions of all the visible layers, separated with a space:
concat(
layer_property( array_get( @map_layer_ids ,0),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,1),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,2),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,3),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,4),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,5),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,6),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,7),'attribution'))
Notes:
Add or subtract lines so there's one for every layer in your project. When the expression is evaluated, it only applies to visible layers. By creating sure you have a line for every map layer, you cover every possible combination of enabled/disabled layers.
Note that the array is 0 indexed, so the first map layer has the index value 0, and the last map layer has the index value (total number of layers) - 1
.
You can change the separator between attributions. For example, to use a semicolon, substitute ';'
for ' '
.
Layers without any attribution are omitted automatically. If you see extra spaces in the attribution as displayed on the map, check if any of the layers have a space in their attribution field.
Both great answers from J. Monticolo and csk! Thanks! J. Monticolo, kudos for simplcity and versatility. csk, I ended up modifying your answer based on the assumption that my maps will only ever need 1 attribution for a base map, and no other data citations. I would go back to your method for citing more than a single layer source. The expression is: layer_property(array_get(@map_layer_ids, array_length(@map_layer_ids )-1),'attribution') to select the bottom-most visible layer. For my purposes, this is a fair assumption, YMMV. Thanks again, super pleased with my first post to gis.stackexchange
– ablairification
Feb 12 at 19:43
Please put this in a comment under @csk 's answer instead of another answer. This will keep the question cleaner (check the tour and try to not post thanks and greetings). Otherwise, welcome to GIS:SE!
– Gabriel C.
Feb 12 at 19:52
@ablairification Welcome to GIS SE! As a new user be sure to take the Tour. You tried to say thank you in the area reserved for direct answers to the original question, and such cases posts are normally deleted. In this instance yours was converted to a comment instead. The way to say thanks here is to upvote (or accept answers to your own questions).
– PolyGeo♦
Feb 12 at 22:54
An even better answer, for QGIS 3.6 and above is to use:array_to_string( array_filter( array_foreach( @map_layers, layer_property(@element,'attribution')), @element), ',')
This will dynamically handle all map layers, regardless of how many are in the project.
– ndawson
Feb 12 at 22:56
add a comment |
In QGIS 3.x, go to the View menu > Decorations > Copyright Label.
Insert an expression ...
In the layers group, double-click on the raster layer you want to 'decorate', this will gives its ID
Copy and paste the layer ID in the following expression :
layer_property('raster_layer_ID', 'attribution')
Click
Ok
twice.
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "79"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f311909%2fdynamic-copyright-or-layer-credit-in-qgis-3-4%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Building on J. Monticolo's excellent answer, here's a method that gives attributions for all visible layers.
@map_layer_ids
returns a list (or "array") of the visible map layers
array_get()
returns a single item from a list
array_get( @map_layer_ids ,0)
returns the first item from the list of visible map layers
concat()
combines multiple text strings
For a map with eight layers in the layer panel, use this expression to combine the attributions of all the visible layers, separated with a space:
concat(
layer_property( array_get( @map_layer_ids ,0),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,1),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,2),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,3),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,4),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,5),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,6),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,7),'attribution'))
Notes:
Add or subtract lines so there's one for every layer in your project. When the expression is evaluated, it only applies to visible layers. By creating sure you have a line for every map layer, you cover every possible combination of enabled/disabled layers.
Note that the array is 0 indexed, so the first map layer has the index value 0, and the last map layer has the index value (total number of layers) - 1
.
You can change the separator between attributions. For example, to use a semicolon, substitute ';'
for ' '
.
Layers without any attribution are omitted automatically. If you see extra spaces in the attribution as displayed on the map, check if any of the layers have a space in their attribution field.
Both great answers from J. Monticolo and csk! Thanks! J. Monticolo, kudos for simplcity and versatility. csk, I ended up modifying your answer based on the assumption that my maps will only ever need 1 attribution for a base map, and no other data citations. I would go back to your method for citing more than a single layer source. The expression is: layer_property(array_get(@map_layer_ids, array_length(@map_layer_ids )-1),'attribution') to select the bottom-most visible layer. For my purposes, this is a fair assumption, YMMV. Thanks again, super pleased with my first post to gis.stackexchange
– ablairification
Feb 12 at 19:43
Please put this in a comment under @csk 's answer instead of another answer. This will keep the question cleaner (check the tour and try to not post thanks and greetings). Otherwise, welcome to GIS:SE!
– Gabriel C.
Feb 12 at 19:52
@ablairification Welcome to GIS SE! As a new user be sure to take the Tour. You tried to say thank you in the area reserved for direct answers to the original question, and such cases posts are normally deleted. In this instance yours was converted to a comment instead. The way to say thanks here is to upvote (or accept answers to your own questions).
– PolyGeo♦
Feb 12 at 22:54
An even better answer, for QGIS 3.6 and above is to use:array_to_string( array_filter( array_foreach( @map_layers, layer_property(@element,'attribution')), @element), ',')
This will dynamically handle all map layers, regardless of how many are in the project.
– ndawson
Feb 12 at 22:56
add a comment |
Building on J. Monticolo's excellent answer, here's a method that gives attributions for all visible layers.
@map_layer_ids
returns a list (or "array") of the visible map layers
array_get()
returns a single item from a list
array_get( @map_layer_ids ,0)
returns the first item from the list of visible map layers
concat()
combines multiple text strings
For a map with eight layers in the layer panel, use this expression to combine the attributions of all the visible layers, separated with a space:
concat(
layer_property( array_get( @map_layer_ids ,0),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,1),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,2),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,3),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,4),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,5),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,6),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,7),'attribution'))
Notes:
Add or subtract lines so there's one for every layer in your project. When the expression is evaluated, it only applies to visible layers. By creating sure you have a line for every map layer, you cover every possible combination of enabled/disabled layers.
Note that the array is 0 indexed, so the first map layer has the index value 0, and the last map layer has the index value (total number of layers) - 1
.
You can change the separator between attributions. For example, to use a semicolon, substitute ';'
for ' '
.
Layers without any attribution are omitted automatically. If you see extra spaces in the attribution as displayed on the map, check if any of the layers have a space in their attribution field.
Both great answers from J. Monticolo and csk! Thanks! J. Monticolo, kudos for simplcity and versatility. csk, I ended up modifying your answer based on the assumption that my maps will only ever need 1 attribution for a base map, and no other data citations. I would go back to your method for citing more than a single layer source. The expression is: layer_property(array_get(@map_layer_ids, array_length(@map_layer_ids )-1),'attribution') to select the bottom-most visible layer. For my purposes, this is a fair assumption, YMMV. Thanks again, super pleased with my first post to gis.stackexchange
– ablairification
Feb 12 at 19:43
Please put this in a comment under @csk 's answer instead of another answer. This will keep the question cleaner (check the tour and try to not post thanks and greetings). Otherwise, welcome to GIS:SE!
– Gabriel C.
Feb 12 at 19:52
@ablairification Welcome to GIS SE! As a new user be sure to take the Tour. You tried to say thank you in the area reserved for direct answers to the original question, and such cases posts are normally deleted. In this instance yours was converted to a comment instead. The way to say thanks here is to upvote (or accept answers to your own questions).
– PolyGeo♦
Feb 12 at 22:54
An even better answer, for QGIS 3.6 and above is to use:array_to_string( array_filter( array_foreach( @map_layers, layer_property(@element,'attribution')), @element), ',')
This will dynamically handle all map layers, regardless of how many are in the project.
– ndawson
Feb 12 at 22:56
add a comment |
Building on J. Monticolo's excellent answer, here's a method that gives attributions for all visible layers.
@map_layer_ids
returns a list (or "array") of the visible map layers
array_get()
returns a single item from a list
array_get( @map_layer_ids ,0)
returns the first item from the list of visible map layers
concat()
combines multiple text strings
For a map with eight layers in the layer panel, use this expression to combine the attributions of all the visible layers, separated with a space:
concat(
layer_property( array_get( @map_layer_ids ,0),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,1),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,2),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,3),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,4),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,5),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,6),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,7),'attribution'))
Notes:
Add or subtract lines so there's one for every layer in your project. When the expression is evaluated, it only applies to visible layers. By creating sure you have a line for every map layer, you cover every possible combination of enabled/disabled layers.
Note that the array is 0 indexed, so the first map layer has the index value 0, and the last map layer has the index value (total number of layers) - 1
.
You can change the separator between attributions. For example, to use a semicolon, substitute ';'
for ' '
.
Layers without any attribution are omitted automatically. If you see extra spaces in the attribution as displayed on the map, check if any of the layers have a space in their attribution field.
Building on J. Monticolo's excellent answer, here's a method that gives attributions for all visible layers.
@map_layer_ids
returns a list (or "array") of the visible map layers
array_get()
returns a single item from a list
array_get( @map_layer_ids ,0)
returns the first item from the list of visible map layers
concat()
combines multiple text strings
For a map with eight layers in the layer panel, use this expression to combine the attributions of all the visible layers, separated with a space:
concat(
layer_property( array_get( @map_layer_ids ,0),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,1),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,2),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,3),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,4),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,5),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,6),'attribution') || ' ',
layer_property( array_get( @map_layer_ids ,7),'attribution'))
Notes:
Add or subtract lines so there's one for every layer in your project. When the expression is evaluated, it only applies to visible layers. By creating sure you have a line for every map layer, you cover every possible combination of enabled/disabled layers.
Note that the array is 0 indexed, so the first map layer has the index value 0, and the last map layer has the index value (total number of layers) - 1
.
You can change the separator between attributions. For example, to use a semicolon, substitute ';'
for ' '
.
Layers without any attribution are omitted automatically. If you see extra spaces in the attribution as displayed on the map, check if any of the layers have a space in their attribution field.
answered Feb 12 at 19:11
cskcsk
8,3951035
8,3951035
Both great answers from J. Monticolo and csk! Thanks! J. Monticolo, kudos for simplcity and versatility. csk, I ended up modifying your answer based on the assumption that my maps will only ever need 1 attribution for a base map, and no other data citations. I would go back to your method for citing more than a single layer source. The expression is: layer_property(array_get(@map_layer_ids, array_length(@map_layer_ids )-1),'attribution') to select the bottom-most visible layer. For my purposes, this is a fair assumption, YMMV. Thanks again, super pleased with my first post to gis.stackexchange
– ablairification
Feb 12 at 19:43
Please put this in a comment under @csk 's answer instead of another answer. This will keep the question cleaner (check the tour and try to not post thanks and greetings). Otherwise, welcome to GIS:SE!
– Gabriel C.
Feb 12 at 19:52
@ablairification Welcome to GIS SE! As a new user be sure to take the Tour. You tried to say thank you in the area reserved for direct answers to the original question, and such cases posts are normally deleted. In this instance yours was converted to a comment instead. The way to say thanks here is to upvote (or accept answers to your own questions).
– PolyGeo♦
Feb 12 at 22:54
An even better answer, for QGIS 3.6 and above is to use:array_to_string( array_filter( array_foreach( @map_layers, layer_property(@element,'attribution')), @element), ',')
This will dynamically handle all map layers, regardless of how many are in the project.
– ndawson
Feb 12 at 22:56
add a comment |
Both great answers from J. Monticolo and csk! Thanks! J. Monticolo, kudos for simplcity and versatility. csk, I ended up modifying your answer based on the assumption that my maps will only ever need 1 attribution for a base map, and no other data citations. I would go back to your method for citing more than a single layer source. The expression is: layer_property(array_get(@map_layer_ids, array_length(@map_layer_ids )-1),'attribution') to select the bottom-most visible layer. For my purposes, this is a fair assumption, YMMV. Thanks again, super pleased with my first post to gis.stackexchange
– ablairification
Feb 12 at 19:43
Please put this in a comment under @csk 's answer instead of another answer. This will keep the question cleaner (check the tour and try to not post thanks and greetings). Otherwise, welcome to GIS:SE!
– Gabriel C.
Feb 12 at 19:52
@ablairification Welcome to GIS SE! As a new user be sure to take the Tour. You tried to say thank you in the area reserved for direct answers to the original question, and such cases posts are normally deleted. In this instance yours was converted to a comment instead. The way to say thanks here is to upvote (or accept answers to your own questions).
– PolyGeo♦
Feb 12 at 22:54
An even better answer, for QGIS 3.6 and above is to use:array_to_string( array_filter( array_foreach( @map_layers, layer_property(@element,'attribution')), @element), ',')
This will dynamically handle all map layers, regardless of how many are in the project.
– ndawson
Feb 12 at 22:56
Both great answers from J. Monticolo and csk! Thanks! J. Monticolo, kudos for simplcity and versatility. csk, I ended up modifying your answer based on the assumption that my maps will only ever need 1 attribution for a base map, and no other data citations. I would go back to your method for citing more than a single layer source. The expression is: layer_property(array_get(@map_layer_ids, array_length(@map_layer_ids )-1),'attribution') to select the bottom-most visible layer. For my purposes, this is a fair assumption, YMMV. Thanks again, super pleased with my first post to gis.stackexchange
– ablairification
Feb 12 at 19:43
Both great answers from J. Monticolo and csk! Thanks! J. Monticolo, kudos for simplcity and versatility. csk, I ended up modifying your answer based on the assumption that my maps will only ever need 1 attribution for a base map, and no other data citations. I would go back to your method for citing more than a single layer source. The expression is: layer_property(array_get(@map_layer_ids, array_length(@map_layer_ids )-1),'attribution') to select the bottom-most visible layer. For my purposes, this is a fair assumption, YMMV. Thanks again, super pleased with my first post to gis.stackexchange
– ablairification
Feb 12 at 19:43
Please put this in a comment under @csk 's answer instead of another answer. This will keep the question cleaner (check the tour and try to not post thanks and greetings). Otherwise, welcome to GIS:SE!
– Gabriel C.
Feb 12 at 19:52
Please put this in a comment under @csk 's answer instead of another answer. This will keep the question cleaner (check the tour and try to not post thanks and greetings). Otherwise, welcome to GIS:SE!
– Gabriel C.
Feb 12 at 19:52
@ablairification Welcome to GIS SE! As a new user be sure to take the Tour. You tried to say thank you in the area reserved for direct answers to the original question, and such cases posts are normally deleted. In this instance yours was converted to a comment instead. The way to say thanks here is to upvote (or accept answers to your own questions).
– PolyGeo♦
Feb 12 at 22:54
@ablairification Welcome to GIS SE! As a new user be sure to take the Tour. You tried to say thank you in the area reserved for direct answers to the original question, and such cases posts are normally deleted. In this instance yours was converted to a comment instead. The way to say thanks here is to upvote (or accept answers to your own questions).
– PolyGeo♦
Feb 12 at 22:54
An even better answer, for QGIS 3.6 and above is to use:
array_to_string( array_filter( array_foreach( @map_layers, layer_property(@element,'attribution')), @element), ',')
This will dynamically handle all map layers, regardless of how many are in the project.– ndawson
Feb 12 at 22:56
An even better answer, for QGIS 3.6 and above is to use:
array_to_string( array_filter( array_foreach( @map_layers, layer_property(@element,'attribution')), @element), ',')
This will dynamically handle all map layers, regardless of how many are in the project.– ndawson
Feb 12 at 22:56
add a comment |
In QGIS 3.x, go to the View menu > Decorations > Copyright Label.
Insert an expression ...
In the layers group, double-click on the raster layer you want to 'decorate', this will gives its ID
Copy and paste the layer ID in the following expression :
layer_property('raster_layer_ID', 'attribution')
Click
Ok
twice.
add a comment |
In QGIS 3.x, go to the View menu > Decorations > Copyright Label.
Insert an expression ...
In the layers group, double-click on the raster layer you want to 'decorate', this will gives its ID
Copy and paste the layer ID in the following expression :
layer_property('raster_layer_ID', 'attribution')
Click
Ok
twice.
add a comment |
In QGIS 3.x, go to the View menu > Decorations > Copyright Label.
Insert an expression ...
In the layers group, double-click on the raster layer you want to 'decorate', this will gives its ID
Copy and paste the layer ID in the following expression :
layer_property('raster_layer_ID', 'attribution')
Click
Ok
twice.
In QGIS 3.x, go to the View menu > Decorations > Copyright Label.
Insert an expression ...
In the layers group, double-click on the raster layer you want to 'decorate', this will gives its ID
Copy and paste the layer ID in the following expression :
layer_property('raster_layer_ID', 'attribution')
Click
Ok
twice.
answered Feb 12 at 16:58
J. MonticoloJ. Monticolo
920113
920113
add a comment |
add a comment |
Thanks for contributing an answer to Geographic Information Systems Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f311909%2fdynamic-copyright-or-layer-credit-in-qgis-3-4%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown