An error occurred while processing the template.
The following has evaluated to null or missing:
==> serviceLocator.findService("es.gob.exteriores.aecid.lcl.base.util.CustomPermissionUtil")  [in template "5931966#5932007#CIUDAD-INSPIRADORA-FTL" at line 5, column 33]

----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign customPermissionUtil = servic...  [in template "5931966#5932007#CIUDAD-INSPIRADORA-FTL" at line 5, column 1]
----
1<#include init /> 
2<#assign journalArticleResourceLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService") > 
3<#assign assetEntryService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")> 
4<#assign assetCategoryService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") > 
5<#assign customPermissionUtil = serviceLocator.findService("es.gob.exteriores.aecid.lcl.base.util.CustomPermissionUtil") > 
6<#assign dLFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService") /> 
7 
8<#assign areas_vocabulary_id = layout.getGroup().getExpandoBridge().getAttribute("areas_vocabulary_id")> 
9<#assign areas_vocabulary_id = areas_vocabulary_id?number> 
10<#assign articleId = .vars['reserved-article-id'].data > 
11<#assign classPK = journalArticleResourceLocalService.getArticleResourcePrimKey(groupId, articleId) > 
12<#assign categories = assetCategoryService.getCategories("com.liferay.journal.model.JournalArticle", classPK) > 
13 
14<div class="cabecera-pagina-interior cabecera-pagina-interior--ciudad-inspiradora primary-gradient"> 
15    <div class="global-container"> 
16        <#if ((name.getData())?? && name.getData() != "")> 
17            <header class="cabecera-pagina-interior--ciudad-inspiradora__header"> 
18                <h2 class="cabecera-pagina-interior--title">${name.getData()}</h2> 
19                <#if (locationX.getData()?has_content && locationY.getData()?has_content)> 
20                    <a href="https://www.google.com/maps?q=${locationX.getData()},${locationY.getData()}" target="_blank" class="ciudades-results--ciudad--content--ciudad-link"> 
21											${languageUtil.get(locale, 'es.gob.exteriores.aecid.lcl.proyecto.ver.en.el.mapa')} 
22										</a> 
23                </#if> 
24            </header> 
25        </#if> 
26    </div> 
27</div> 
28<div class="ciudades-results ciudades-results--ciudad-inspiradora"> 
29    <ul id="as-wrapper" class=""> 
30        <li class="couple"> 
31            <div class="ciudades-results--ciudad"> 
32 
33                <#if (image.getData())?has_content && image.getData() != ""> 
34                    <div class="ciudades-results--ciudad--image-wrapper" style="background-image: url('${image.getData()}')"> 
35                        <img alt="${image.getAttribute('alt')}" data-fileentryid="${image.getAttribute('fileEntryId')}" src="${image.getData()}" /> 
36                    </div> 
37                <#else> 
38                    <div class="ciudades-results--ciudad--image-wrapper" style="background-image: url('${images_folder}/thumbnail.png')"> 
39                        <img alt="Imagen con el logotipo de LAIF" src="${images_folder}/thumbnail.png" /> 
40                    </div> 
41                </#if> 
42 
43                <div class="ciudades-results--ciudad--content"> 
44                    <#if (country.getData())?has_content> 
45                        <div class="ciudades-results--ciudad--content--location"> 
46														<p class="ciudades-results--ciudad--content--country"> 
47                                <span title="${name.getData()}" class="ciudades-results--ciudad--content--country--map">${country.getData()}</span> 
48                            </p> 
49                            <#if (gobierno.getData())?has_content> 
50                                <p class="ciudades-results--ciudad--content--gob"> 
51                                    <a href="${gobierno.getData()}" title="${languageUtil.get(locale, 'ciudad.inspiradora.detalle.title.gobierno.de')} ${name.getData()}" class="ciudades-results--ciudad--content--gob-link" target="_blank">${languageUtil.get(locale, 'ciudad.inspiradora.detalle.gobierno')}</a> 
52                                </p> 
53                            </#if> 
54                        </div> 
55                    </#if> 
56                    <#if (description.getData())?has_content> 
57                        <div class="ciudades-results--ciudad--content--description d-none d-lg-block">${description.getData()}</div> 
58                    </#if> 
59										<#if (categories?? && categories?has_content) && (areas_vocabulary_id?? && areas_vocabulary_id?has_content)> 
60											<div class="ciudades-results--ciudad-inspiradora__areas"> 
61													<h3>${languageUtil.get(locale, 'ciudad.inspiradora.detalle.areas.tematicas')}</h3> 
62													<ul> 
63															<#list categories as cur_cat> 
64																<#if cur_cat.getVocabularyId() == areas_vocabulary_id> 
65																	<li><span title="${cur_cat.getName()}">${cur_cat.getName()?substring(2)}</span></li> 
66																</#if> 
67															</#list> 
68													</ul> 
69											</div> 
70										</#if> 
71                </div> 
72 
73            </div> 
74 
75            <div class="ciudades-results--ciudad ciudades-results--ciudad__description-mobile"> 
76                <#if (description.getData())?has_content> 
77                    <div class="ciudades-results--ciudad--content--description">${description.getData()}</div> 
78                </#if> 
79            </div> 
80        </li> 
81    </ul> 
82</div> 
83 
84<#if noticiaRelacionado?? && noticiaRelacionado.getData()??> 
85	<#assign webContentData = jsonFactoryUtil.createJSONObject(noticiaRelacionado.getData()) /> 
86	<#if webContentData?? && webContentData.className?? && webContentData.classPK?? > 
87		<#assign 
88			className = webContentData.className 
89			classPK = webContentData.classPK 
90			asset = assetEntryService.getEntry(className, classPK?number) 
91			assetRenderer = asset.getAssetRenderer() 
92			journalArticle = assetRenderer.getAssetObject() 
93		/> 
94		<div class="light-grey-bg mt-6 mb-6 pt-6 pb-6"> 
95			<div class="global-container"> 
96					<h3 class="ciudades-results--ciudad-inspiradora__sectionTittle">${languageUtil.get(locale, 'ciudad.inspiradora.detalle.noticia.masterclass.title')}</h3> 
97        	<#assign void = request.setAttribute("detalleInspiradora", true) /> 
98					<div class="ciudades-results--ciudad-inspiradora__masterclass"> 
99							<@liferay_journal["journal-article"] 
100								articleId=journalArticle.getArticleId() 
101								ddmTemplateKey="NOTICIA-MASTERCLASS-FTL" 
102								groupId=journalArticle.getGroupId() 
103							/> 
104					</div> 
105			</div> 
106		</div> 
107	</#if> 
108</#if> 
109 
110<#if documentos.documentoAsociado.getSiblings()?has_content && !(documentos.documentoAsociado.getSiblings()?size == 1 && validator.isNull(documentos.documentoAsociado.getSiblings()[0].docs.getData()))> 
111    <div class="global-container mt-5"> 
112			<h3 class="ciudades-results--ciudad-inspiradora__sectionTittle">${languageUtil.get(locale, 'ciudad.inspiradora.detalle.docs.title')}</h3> 
113			<div class="lcl-docs ciudades-inspiradoras"> 
114					<#list documentos.documentoAsociado.getSiblings() as cur_documento> 
115							<div class="lcl-docs__doc"> 
116									<#assign viewThumbnail = "" 
117													 viewURL = "" 
118									/> 
119									<#if (cur_documento.docs.getData()?has_content)> 
120											<#assign 
121													viewURL = cur_documento.docs.getData() 
122													viewThumbnail = cur_documento.docs.getData() + "&documentThumbnail=1" 
123											/> 
124 
125											<#assign uuId = cur_documento.docs.getData()?split("/")[5]?split("?")[0] /> 
126											<#assign fileEntry = dLFileEntryLocalService.getFileEntryByUuidAndGroupId(uuId, groupId) /> 
127											<#if viewThumbnail??> 
128												<div class="lcl-docs__doc__image"> 
129														<img alt="pdf view" src="${viewThumbnail}" /> 
130												</div> 
131										<#else> 
132												<div class="lcl-docs__doc__image lcl-docs__doc__image--no-thumbnail"> 
133														<img alt="" src="/o/laif-theme/images/thumbnail.png" /> 
134												</div> 
135										</#if> 
136										<header class="lcl-docs__doc__header"> 
137												<h4 class="lcl-docs__doc__title"> 
138														<#if (cur_documento.docNombre.getData())??> 
139																${cur_documento.docNombre.getData()} 
140														</#if> 
141												</h4> 
142										</header> 
143										<div class="lcl-docs__doc__download-link"> 
144												<a href="${viewURL}" target="_blank"> 
145														<span class="sr-only">${languageUtil.get(locale, "es.gob.exteriores.aecid.lcl.documentacion.descargar.documento")}</span>  
146														<em onmouseenter="addDownloadParam(this)" onmouseleave="removeDownloadParam(this)"><@getSizeVisualization sizeBytes=fileEntry.getSize()/></em>  
147												</a> 
148										</div> 
149									</#if> 
150							</div> 
151					</#list> 
152			</div> 
153	</div> 
154</#if> 
155 
156<#macro getSizeVisualization sizeBytes> 
157    <#if (fileEntry.getSize()/1024/1024) lt 1> 
158        (#{(fileEntry.getSize()/1024); M2} Kb) 
159    <#else> 
160        (#{(fileEntry.getSize()/1024/1024); M2} Mb) 
161    </#if> 
162</#macro> 
163 
164<script> 
165  function addDownloadParam(element) { 
166    const link = element.parentElement; 
167    const currentUrl = link.href; 
168 
169    link.target = "_self"; 
170		 
171    if (currentUrl.includes('?')) { 
172      if (!currentUrl.includes('download=true')) { 
173        link.href = currentUrl + '&download=true'; 
174
175    } else { 
176      link.href = currentUrl + '?download=true'; 
177
178
179 
180  function removeDownloadParam(element) { 
181    const link = element.parentElement;  
182    const currentUrl = link.href; 
183		 
184    if (currentUrl.includes('download=true')) { 
185      link.href = currentUrl.replace('&download=true', '').replace('?download=true', ''); 
186
187		 
188		link.target = "_blank"; 
189
190</script>