An error occurred while processing the template.
The following has evaluated to null or missing: ==> productLayout.getLayoutSet [in template "20115#20151#196977" at line 11, column 67] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- 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 docsDownloadURL = portalUtil... [in template "20115#20151#196977" at line 11, column 9] ----
1<@leonardo.articleInfo .vars "SP-Product-complete"/>
2<#assign rndNamespace = randomNamespace>
3<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
4
5<#assign jArticle = journalArticleLocalService.getArticle(groupId, .vars['reserved-article-id'].data) >
6
7<#assign productLayout = (jArticle.getLayout()!)>
8
9<#assign docsDownloadURL = ''>
10<#if (layout.getGroup().getGroupId()) != (jArticle.getGroupId())>
11 <#assign docsDownloadURL = portalUtil.getVirtualHostname (productLayout.getLayoutSet())>
12 <#if (docsDownloadURL)?has_content && (docsDownloadURL?lower_case != 'localhost')>
13 <#assign docsDownloadURL = 'https://' + docsDownloadURL >
14 <#else>
15 <#assign docsDownloadURL = ''>
16 </#if>
17</#if>
18<#assign currentGroupExpandoBridge = themeDisplay.getScopeGroup().getExpandoBridge()>
19<#assign isDarkTheme = false>
20<#if currentGroupExpandoBridge.hasAttribute("dark-theme")>
21 <#assign isDarkTheme = currentGroupExpandoBridge.getAttribute("dark-theme", false)>
22</#if>
23
24<#if isDarkTheme && !(hasDetailPage?? && getterUtil.getBoolean(hasDetailPage.getData())) >
25<#assign scalingDetails = {
26 "desktop": {"alternateImage": {}, "key": "w_317"},
27 "tl": {"alternateImage": SeparatorOverview.OverviewImage.ImageTl!, "key": "w_317"},
28 "tp": {"alternateImage": SeparatorOverview.OverviewImage.ImageTp!, "key": "w_317"},
29 "mobile": {"alternateImage": SeparatorOverview.OverviewImage.ImageM!, "key": "w_317"}
30 }>
31
32
33<#assign dataImg = leonardo.adaptImage(SeparatorOverview.OverviewImage!, scalingDetails )>
34 <div class="product-page-hero-card product-card-modal-container product-base section-hero-card--smallerVersion section-hero-card--wider-page-padding">
35 <div class="product-card-modal">
36 <div class="product-card-modal-text">
37 <div class="modal-title-container">
38 <h1 class="modal-title">
39 ${SeparatorOverview.ProductName.getData()}
40 </h1>
41 </div>
42 <div class="product-card--graphic-container">
43 <img class="product-card--graphic" alt="${SeparatorOverview.ProductName.getData()!}" title="${SeparatorOverview.ProductName.getData()!}" src="${themeDisplay.pathThemeImages}/blank.png"
44 data-src-url-d="${dataImg.desktop!}"
45 data-src-url-tl="${dataImg.tablet_landscape!}"
46 data-src-url-tp="${dataImg.tablet_portrait!}"
47 data-src-url-m="${dataImg.mobile!}"/>
48 </div>
49 <div class="modal-description">
50 ${SeparatorOverview.OverviewText.getData()}
51 </div>
52
53 <#if SeparatorOverview.OverviewFileUrl??>
54 <#assign docsDownloadURL = ''>
55
56 <ul class="js-ul-overview">
57 <#list SeparatorOverview.OverviewFileUrl.getSiblings() as itemList>
58 <#assign file_info = leonardo.findFileEntryInfo(itemList.getData()) >
59 <#if itemList.OverviewFileLabel.getData()!= '' && file_info.downloadUrl != ''>
60 <li class="list-item">
61 <a href="${docsDownloadURL}${file_info.downloadUrl}" target="_blank">
62 ${itemList.OverviewFileLabel.getData()!}
63 </a>
64 </li>
65 </#if>
66 </#list>
67 </ul>
68 </#if>
69
70 <#if SeparatorDownloads.DownloadFileURL.getSiblings()?has_content>
71 <ul class="js-ul-download">
72 <#list SeparatorDownloads.DownloadFileURL.getSiblings() as cur_SeparatorDownloads_DownloadFileURL>
73 <#if cur_SeparatorDownloads_DownloadFileURL.DownloadFileLabel.getData()!= '' && cur_SeparatorDownloads_DownloadFileURL.getData() != ''>
74 <li class="list-item">
75 <a href="${cur_SeparatorDownloads_DownloadFileURL.getData()}" target="_blank">
76 ${languageUtil.format(locale, "download-x", cur_SeparatorDownloads_DownloadFileURL.DownloadFileLabel.getData(), false)}
77 </a>
78 </li>
79 </#if>
80 </#list>
81 </ul>
82 </#if>
83 </div>
84 </div>
85 </div>
86<#else>
87<#macro downloadIcon>
88 <svg xmlns="http://www.w3.org/2000/svg" width="14" height="18" viewBox="0 0 14 18">
89 <path fill="#000" fill-rule="nonzero" d="M6.61 12.763l-2.145-2.24a.58.58 0 0 1 0-.796c.211-.22.551-.22.762 0l1.235 1.29V6.75c0-.31.24-.563.538-.563.297 0 .538.252.538.563v4.267l1.235-1.29c.21-.22.551-.22.762 0a.58.58 0 0 1 0 .796l-2.145 2.24a.526.526 0 0 1-.78 0zM12.62 18H1.383C.62 18 0 17.368 0 16.592V5.037c0-.49.19-.968.52-1.314L3.565.544A1.728 1.728 0 0 1 4.82 0h7.797C13.38 0 14 .631 14 1.407v15.186C14 17.37 13.38 18 12.619 18zM4.82 1.125a.682.682 0 0 0-.496.214L1.282 4.52a.755.755 0 0 0-.205.518v11.555c0 .156.137.283.306.283h11.235c.168 0 .305-.127.305-.282V1.407c0-.155-.137-.282-.305-.282H4.821zm-.783 4.5H2.154a.551.551 0 0 1-.539-.563c0-.31.242-.562.539-.562h1.884c.15 0 .27-.126.27-.281V2.25c0-.31.24-.563.538-.563.297 0 .539.252.539.563v1.969c0 .775-.605 1.406-1.347 1.406zm6.193 9.563H3.769a.55.55 0 0 1-.538-.563.55.55 0 0 1 .538-.563h6.462a.55.55 0 0 1 .538.563.55.55 0 0 1-.538.563z"/>
90 </svg>
91</#macro>
92
93
94<#macro displayDownloadLinks fileUrlElms>
95 <div class="section-content--action-items">
96 <#list fileUrlElms as cur_file>
97 <#if cur_file.getData()?? && cur_file.getData() != "">
98 <#assign defLabel = languageUtil.get(locale, "download-brochure")>
99 <div class="section-content--action-items--download">
100 <#assign file_info = leonardo.findFileEntryInfo(cur_file.getData()) >
101
102 <a class="section-content--action-items--download--link"
103 target="_blank"
104 href="${docsDownloadURL}${file_info.downloadUrl}"
105 title='${(file_info.title)!cur_file.OverviewFileLabel.getData()!defLabel}'>
106 <@downloadIcon />
107 <span class="section-content--action-items--download--link--filename">
108 ${(cur_file.OverviewFileLabel.getData())!(file_info.title)!defLabel}
109 </span>
110 </a>
111 </div>
112 </#if>
113 </#list>
114 </div>
115</#macro>
116
117<!-- default number of visible technical data boxes -->
118<#assign maxTechnicalBoxes = 12>
119
120<#assign languageId = languageUtil.getLanguageId(locale) />
121
122<#assign sectionOFound = false>
123<#assign sectionOHtmlFound = false>
124<#assign sectionFreeArea1 = false>
125<#assign sectionFreeArea2 = false>
126<#assign sectionTDFound = false>
127<#assign sectionMFFound = false>
128<#assign sectionDownloadFound = false>
129
130<!--FREE AREA 1 -->
131<#if SeparatorMainFeatures?? && SeparatorMainFeatures.getSiblings()?has_content>
132 <#list SeparatorMainFeatures.getSiblings() as cur_sectionMF>
133 <#if (cur_sectionMF.MFSectionTitle.getData())?has_content ||
134 (cur_sectionMF.MFText.getData())?has_content ||
135 (cur_sectionMF.FreeWebContent.getData())?has_content>
136 <#assign sectionFreeArea1 = true>
137 <#break>
138 </#if>
139 </#list>
140</#if>
141<!--FREE AREA 2 -->
142<#if SeparatorFreeArea2?? && SeparatorFreeArea2.getSiblings()?has_content>
143 <#list SeparatorFreeArea2.getSiblings() as cur_sectionFA2>
144 <#if (cur_sectionFA2.Fa2Text.getData())?has_content ||
145 (cur_sectionFA2.Fa2SectionTitle.getData())?has_content ||
146 (cur_sectionFA2.Fa2WebContent.getData())?has_content>
147 <#assign sectionFreeArea2 = true>
148 <#break>
149 </#if>
150 </#list>
151</#if>
152<!--TECHNICAL DATA-->
153<#if SeparatorTechnicalData.TDTitle.getSiblings()?has_content>
154 <#list SeparatorTechnicalData.TDTitle.getSiblings() as cur_sectionTD>
155 <#if cur_sectionTD.getData() != "">
156 <#assign sectionTDFound = true>
157 <#break>
158 </#if>
159 </#list>
160</#if>
161<!--OVERVIEW LAUNCH-->
162<#if (SeparatorOverview.OverviewText.getData())?has_content ||
163 (SeparatorOverview.OverviewTitle.getData())?has_content>
164 <#assign sectionOFound = true>
165</#if>
166<#if SeparatorOverview.ContentHtml?? &&
167 SeparatorOverview.ContentHtml.getData() != "" >
168 <#assign sectionOHtmlFound = true>
169</#if>
170<#if SeparatorOverview.OverviewFileUrl??>
171 <#assign overviewFileUrlElms = SeparatorOverview.OverviewFileUrl.getSiblings()>
172</#if>
173<!--MAIN FEATURES-->
174<#if (SeparatorMainFeaturesWall.SeparatorWallGroup)??>
175 <#assign sectionMFFound = false>
176 <#list SeparatorMainFeaturesWall.SeparatorWallGroup.getSiblings() as cur_sectionMF>
177 <#if (cur_sectionMF.SeparatorWallGroupPoster)??>
178 <#list cur_sectionMF.SeparatorWallGroupPoster.getSiblings() as cur_sectionMFPoster>
179 <#if (cur_sectionMFPoster.Row1.Row1BackgroundImage.getData())?has_content ||
180 (cur_sectionMFPoster.Row1.Row1Title.getData())?has_content ||
181 (cur_sectionMFPoster.Row1.Row1Abstract.getData())?has_content>
182 <#assign sectionMFFound = true>
183 </#if>
184 <#break>
185 </#list>
186 <#if sectionMFFound>
187 <#break>
188 </#if>
189 </#if>
190 </#list>
191</#if>
192<!--DOWNLOADS-->
193<#if SeparatorDownloads.DownloadFileURL.getSiblings()?has_content>
194 <#list SeparatorDownloads.DownloadFileURL.getSiblings() as cur_sectionDownload>
195 <#if (cur_sectionDownload.getData())?has_content>
196 <#assign sectionDownloadFound = true>
197 <#break>
198 </#if>
199 </#list>
200</#if>
201<div class="product-wrapper product-complete">
202 <!--START MODULE: HERO BANNER-->
203 <#if SeparatorHero?? && ((SeparatorHero.HeroImage.getData())?has_content || (SeparatorHero.CantoHeroUrl.getData())?has_content)>
204 <div class="section-container section-container--fluid">
205
206 <#assign scalingDetails = {
207 "desktop": {"alternateImage": {}, "key": "w_1440"},
208 "tl": {"alternateImage": (SeparatorHero.HeroImage.HeroImageTl)!, "key": "h_703"},
209 "tp": {"alternateImage": (SeparatorHero.HeroImage.HeroImageTp)!, "key": "h_959"},
210 "mobile": {"alternateImage": (SeparatorHero.HeroImage.HeroImageM)!, "key": "h_602"}
211 }>
212 <#assign heroImg = leonardo.adaptImage(SeparatorHero.HeroImage!, scalingDetails )>
213
214 <style>
215 .slide1{background-image: url("${heroImg.desktop!}");}
216 @media all and (min-width: 1024px) and (max-width: 1279px) {
217 .slide1{background-image: url("${heroImg.tablet_landscape!}");}
218 }
219 @media all and (min-width: 768px) and (max-width: 1023px) {
220 .slide1{background-image: url("${heroImg.tablet_portrait!}");}
221 }
222 @media all and (max-width: 767px) {
223 .slide1{background-image: url("${heroImg.mobile!}");}
224 }
225 </style>
226 <noscript>
227 <img src="${heroImg.desktop!}" alt='${heroImg.alt_desktop!}'>
228 <img src="${heroImg.tablet_landscape!}" alt='${heroImg.alt_tablet_landscape!}'>
229 <img src="${heroImg.tablet_portrait!}" alt='${heroImg.alt_tablet_portrait!}'>
230 <img src="${heroImg.mobile!}" alt='${heroImg.alt_mobile!}'>
231 </noscript>
232
233 <div class="hero">
234 <#if (SeparatorHero.CantoHeroUrl.getData())?has_content>
235 <!--Start Module: Hero Banner-->
236 <div class="leo-video canto-video"
237 data-video-data='{
238 "type":"video",
239 "showControls":${(getterUtil.getBoolean(SeparatorHero.CantoHeroUrl.CantoControlBar.getData()))?then("1","0")},
240 "videoSources":[
241 "${SeparatorHero.CantoHeroUrl.getData()!}"
242 ],
243 "posters":{
244 "desktop":"${heroImg.desktop!}",
245 "tabletLandscape":"${heroImg.tablet_landscape!}",
246 "tabletPortrait":"${heroImg.tablet_portrait!}",
247 "mobile":"${heroImg.mobile!}"
248 },
249 "content":{
250 "heading":"${((SeparatorOverview.ProductName.getData())!"")?html?html} <br> <@leonardo.escapeTitle title=((SeparatorHero.HeroTitle.getData())!"Product")?html/>"
251 ,"descriptions":["${((SeparatorHero.HeroSubtitle1.getData())!"")?html?html}", "${((SeparatorHero.HeroSubtitle2.getData())!"")?html?html}"]
252 }}'
253 <#if (SeparatorHero.CantoHeroUrl.CantoAutoPlay.getData())?has_content>
254 data-autoplay="${(getterUtil.getBoolean(SeparatorHero.CantoHeroUrl.CantoAutoPlay.getData()))?then('1','0')}",
255 </#if>
256 <#if (SeparatorHero.CantoHeroUrl.CantoLoop.getData())?has_content>
257 data-loop="${(getterUtil.getBoolean(SeparatorHero.CantoHeroUrl.CantoLoop.getData()))?then('1','0')}",
258 </#if>
259 data-title-tag="h1">
260 </div>
261 <!--End Module: Hero Banner-->
262 <#else>
263 <!--Start Module: Hero Slide-->
264 <div class="hero-slide swiper-slide slide1">
265 <div class="hero-slide--content">
266 <#assign h1Found = true>
267 <#if (!isDarkTheme) && (SeparatorHero.HeroTitle.getData())?has_content>
268 <h1 class="hero-slide--content--title">
269 ${(SeparatorOverview.ProductName.getData())!""}<br>
270 <#assign escVar = (SeparatorHero.HeroTitle.getData())!"Product">
271 <@leonardo.escapeTitle title=escVar />
272 </h1>
273 <#elseif (SeparatorOverview.ProductName.getData())?has_content>
274 <h1 class="hero-slide--content--title">
275 ${(SeparatorOverview.ProductName.getData())!""}
276 </h1>
277 <#else>
278 <#assign h1Found = false>
279 </#if>
280 <#if (!isDarkTheme) && ((SeparatorHero.HeroSubtitle1.getData())?has_content || (SeparatorHero.HeroSubtitle2.getData())?has_content)>
281 <div class="hero-slide--content--descriptions">
282 <#if (SeparatorHero.HeroSubtitle1.getData())?has_content>
283 <div class="hero-slide--content--description">
284 ${(!h1Found)?then("<h1>","")}
285 <#assign escVar = (SeparatorHero.HeroSubtitle1.getData())!>
286 <@leonardo.escapeTitle title=escVar />
287 ${(!h1Found)?then("</h1>","")}
288 <#assign h1Found = true>
289 </div>
290 </#if>
291 <#if (SeparatorHero.HeroSubtitle2.getData())?has_content>
292 <div class="hero-slide--content--description">
293 ${(!h1Found)?then("<h1>","")}
294 <#assign escVar = (SeparatorHero.HeroSubtitle2.getData())!>
295 <@leonardo.escapeTitle title=escVar />
296 ${(!h1Found)?then("</h1>","")}
297 </div>
298 </#if>
299 </div>
300 </#if>
301 </div>
302 </div>
303 <!--End Module: Hero Slide-->
304 </#if>
305 <!--Start Mixin: Icon Share Primary-->
306 <@leonardo.shareLinkHero/>
307 <!--End Mixin: Icon Share Primary-->
308 </div>
309 </div>
310 </#if>
311 <!--END MODULE: HERO BANNER-->
312 <!--Start Module: Section Navigator Anchor bar product complete-->
313 <div class="section-container section-container--fluid">
314 <div class="section-navigator">
315 <#if sectionOFound>
316 <div class="section-navigator--list">
317 <div class="section-container swiper-container--sectionNavigator section-container--fixed">
318 <div class="section-navigator--list--item-wrap swiper-wrapper">
319 <!--Overview-->
320 <#assign defaultValue=languageUtil.get(locale, "section-overview-default")>
321 <a class="section-navigator--list--item swiper-slide active" href="javascript:void(0);"
322 title="${(SeparatorOverview.OverviewTitle.getData())!defaultValue}"
323 data-target=".section-hero-card">
324 ${((SeparatorOverview.OverviewTitle.getData())?has_content)?then(SeparatorOverview.OverviewTitle.getData(),defaultValue)}</a>
325 <!--Main Features-->
326 <#if sectionMFFound && (SeparatorMainFeaturesWall.WallSectionTitle.data)?has_content>
327 <a class="section-navigator--list--item swiper-slide" href="javascript:void(0);"
328 title='${(SeparatorMainFeaturesWall.WallSectionTitle.data)}'
329 data-target=".product-missions-and-features">
330 ${SeparatorMainFeaturesWall.WallSectionTitle.data}</a>
331 </#if>
332 <!--Free Area 1 -->
333 <#if sectionFreeArea1 && SeparatorMainFeatures??>
334 <#list SeparatorMainFeatures.getSiblings() as cur_section>
335 <#if (cur_section.Fa1AnchorBarText.getData())?has_content >
336 <a class="section-navigator--list--item swiper-slide" href="javascript:void(0);"
337 title='${(cur_section.Fa1AnchorBarText.getData())}'
338 data-target=".section-content--features-${cur_section?index}">
339 ${(cur_section.Fa1AnchorBarText.getData())!}</a>
340 </#if>
341 </#list>
342 </#if>
343 <!--Technical data-->
344 <#if sectionTDFound = true >
345 <#assign defaultValue=languageUtil.get(locale, "section-techdata-default")>
346 <a class="section-navigator--list--item swiper-slide" href="javascript:void(0)"
347 title='${(SeparatorTechnicalData.TDSectionTitle.getData())!defaultValue}'
348 data-target=".products-technical-data">
349 ${((SeparatorTechnicalData.TDSectionTitle.getData())?has_content)?then(SeparatorTechnicalData.TDSectionTitle.getData(),defaultValue)}</a>
350 </#if>
351 <!--Free Area 2 -->
352 <#if sectionFreeArea2 && SeparatorFreeArea2??>
353 <#list SeparatorFreeArea2.getSiblings() as cur_section>
354 <#if (cur_section.Fa2AnchorBarText.getData())?has_content >
355 <a class="section-navigator--list--item swiper-slide" href="javascript:void(0)"
356 title='${(cur_section.Fa2AnchorBarText.getData())!}'
357 data-target=".section-content--features-fa2-${cur_section?index}">
358 ${(cur_section.Fa2AnchorBarText.getData())!}</a>
359 </#if>
360 </#list>
361 </#if>
362 <!--Contacts-->
363 <a class="section-navigator--list--item anchorbar_products_contacts swiper-slide" href="javascript:void(0)"
364 title='${languageUtil.get(locale, "anchor-contacts")}'
365 data-target=".section-contacts">
366 ${languageUtil.get(locale, "anchor-contacts")}</a>
367 <!--Related Products-->
368 <a class="section-navigator--list--item anchorbar_products_related swiper-slide" href="javascript:void(0)"
369 title='${languageUtil.get(locale, "related-products")}'
370 data-target=".related-products">
371 ${languageUtil.get(locale, "related-products")}</a>
372 </div>
373 </div>
374 <div class="swiper-button-prev section-navigator--scroll--left"><span class="section-navigator--scroll--left--icon"></span></div>
375 <div class="swiper-button-next section-navigator--scroll--right"><span class="section-navigator--scroll--right--icon"></span></div>
376 </div>
377 <div class="section-navigator--spacer"></div>
378 </div>
379 </#if>
380 </div>
381 <!--End Module: Section Navigator-->
382
383 <!--START MODULE: LAUNCH SECTION -->
384 <#if sectionOFound || sectionOHtmlFound >
385 <style>
386 /*Desktop and tablet landscape viewport*/
387 @media all and (min-width: 1024px) {
388 .section-hero-card .section-grid .section-hero-card--content .section-hero-card--title.${rndNamespace}forced-style-200 {
389 margin-left: -200px !important;
390 }
391 .section-hero-card .section-grid .section-hero-card--content .section-hero-card--title.${rndNamespace}forced-style-0 {
392 margin-left: 0 !important;
393 }
394 }
395 </style>
396 <div class="section-container section-container--fixed">
397 <div class="product-page-hero-card section-hero-card">
398 <div class="section-grid layout--tp-col layout--m-col">
399
400 <#if (SeparatorOverview.ProductTitle.getData())?has_content>
401 <#assign isMiddle = leonardo.isRadioButtonValue(SeparatorOverview.ProductTitle.ProductTitlePosition, "middle")>
402 <#if (isMiddle=="true")>
403 <#assign forcedStyle = rndNamespace + "forced-style-200">
404 <#else>
405 <#assign forcedStyle = rndNamespace + "forced-style-0">
406 </#if>
407 </#if>
408
409 <div class="grid grid--tp100p grid--m100p grid--d50p grid--tl50p hidden-on-dark-theme">
410
411 <#assign scalingDetails = {
412 "desktop": {"alternateImage": {}, "key": "w_720"},
413 "tl": {"alternateImage": (SeparatorOverview.OverviewImage.ImageTl)!, "key": "h_695"},
414 "tp": {"alternateImage": (SeparatorOverview.OverviewImage.ImageTp)!, "key": "w_768"},
415 "mobile": {"alternateImage": (SeparatorOverview.OverviewImage.ImageM)!, "key": "w_375"}
416 }>
417 <#assign overviewImg = leonardo.adaptImage((SeparatorOverview.OverviewImage)!, scalingDetails )>
418 <#if (SeparatorAdditionalOverview.CantoUrl)?has_content && SeparatorAdditionalOverview.CantoUrl.getData() != "">
419 <#assign video = SeparatorAdditionalOverview.CantoUrl.getData()>
420 <div class="leo-video canto-video section-hero-card--graphic"
421 data-video-data='{
422 "showControls":true,
423 "videoSources":[
424 "${video}"
425 ],
426 "posters":{
427 "desktop":"${overviewImg.desktop!}",
428 "tabletLandscape":"${overviewImg.tablet_landscape!}",
429 "tabletPortrait":"${overviewImg.tablet_portrait!}",
430 "mobile":"${overviewImg.mobile!}"
431 }}'
432 data-img-url-d="${overviewImg.desktop!}"
433 data-img-url-tl="${overviewImg.tablet_landscape!}"
434 data-img-url-tp="${overviewImg.tablet_portrait!}"
435 data-img-url-m="${overviewImg.mobile!}">
436 </div>
437 <#else>
438 <div class="section-hero-card--graphic"
439 data-img-url-d="${overviewImg.desktop!}"
440 data-img-url-tl="${overviewImg.tablet_landscape!}"
441 data-img-url-tp="${overviewImg.tablet_portrait!}"
442 data-img-url-m="${overviewImg.mobile!}">
443 <noscript>
444 <img src="${overviewImg.desktop!}" alt='${overviewImg.alt_desktop!}'>
445 <img src="${overviewImg.tablet_landscape!}" alt='${overviewImg.alt_tablet_landscape!}'>
446 <img src="${overviewImg.tablet_portrait!}" alt='${overviewImg.alt_tablet_portrait!}'>
447 <img src="${overviewImg.mobile!}" alt='${overviewImg.alt_mobile!}'>
448 </noscript>
449 </div>
450 </#if>
451 </div>
452 <div class="grid grid--tp100p grid--m100p grid--d50p grid--tl50p">
453 <div class="section-hero-card--content">
454 <#if (SeparatorOverview.ProductTitle.getData())?has_content>
455 <h2 class="section-hero-card--title section-hero-card--title-alwayson ${forcedStyle}">${(SeparatorOverview.ProductTitle.getData())}</h2>
456 </#if>
457 <#if (SeparatorOverview.OverviewText.getData())?has_content>
458 <h3 class="section-hero-card--description">${SeparatorOverview.OverviewText.getData()}</h3>
459 </#if>
460 <!--download section-->
461 <#if sectionOHtmlFound = false && overviewFileUrlElms??>
462 <@displayDownloadLinks fileUrlElms=overviewFileUrlElms />
463 </#if>
464 </div>
465 </div>
466 </div>
467 </div>
468 </div>
469 <#if SeparatorOverview.ContentHtml.getData() != "">
470 <div class="section-container section-container--fixed">
471 <div class="section-content">
472 <div class="section-content--content">
473 ${SeparatorOverview.ContentHtml.getData()}
474 </div>
475 <#if sectionOHtmlFound && overviewFileUrlElms??>
476 <@displayDownloadLinks fileUrlElms=overviewFileUrlElms />
477 </#if>
478 </div>
479 </div>
480 </#if>
481 </#if>
482 <!--END MODULE: LAUNCH SECTION-->
483
484 <!--START MODULE: MAIN FEATURES-->
485 <#if sectionMFFound >
486 <div class="section-container section-container--fixed">
487 <div class="products-and-services-features product-missions-and-features">
488 <#if (SeparatorMainFeaturesWall.WallSectionTitle.data)?has_content>
489 <h2 class="products-and-services-features--heading section-heading section-heading--center">
490 <#assign escVar = (SeparatorMainFeaturesWall.WallSectionTitle.data)!"">
491 <@leonardo.escapeTitle title=escVar />
492 </h2>
493 </#if>
494 <div class="products-and-services-features--content">
495 <#assign ulPresent = false>
496
497 <#list SeparatorMainFeaturesWall.SeparatorWallGroup.getSiblings() as cur_GroupMF>
498 <#if (cur_GroupMF.MenuLabel.data)?has_content>
499 <#if !ulPresent>
500 <ul class="nav nav-tabs" role="tablist">
501 <#assign ulPresent = true>
502 </#if>
503 <li class='${(cur_GroupMF?index == 0)?then("active","")}' role="presentation">
504 <a href="#features-${cur_GroupMF?index}" aria-controls="features-${cur_GroupMF?index}-0"
505 role="tab" data-toggle="tab">${(cur_GroupMF.MenuLabel.data)!}</a>
506 </li>
507 </#if>
508 </#list>
509 <#if ulPresent>
510 </ul>
511 </#if>
512 <div class="tab-content">
513 <#list SeparatorMainFeaturesWall.SeparatorWallGroup.getSiblings() as cur_GroupMFWrap>
514 <div class='tab-pane ${(cur_GroupMFWrap?index == 0)?then("active","")}' id="features-${cur_GroupMFWrap?index}" role="tabpanel">
515 <#list cur_GroupMFWrap.SeparatorWallGroupPoster.getSiblings() as cur_GroupMF>
516 <!--POSTER ${cur_GroupMF?index}"-->
517 <!--ROW 1-->
518 <#if (cur_GroupMF.Row1.Row1BackgroundImage.getData())?has_content ||
519 (cur_GroupMF.Row1.Row1Title.getData())?has_content ||
520 (cur_GroupMF.Row1.Row1Abstract.getData())?has_content>
521 <div class="section-grid layout--d-row-reverse layout--tp-col layout--m-col">
522 <div class="grid grid--d67p grid--tl67p grid--tp100p grid--m100p">
523
524 <#assign scalingDetails = {
525 "desktop": {"alternateImage": {}, "key": "w_960"},
526 "tl": {"alternateImage": (cur_GroupMF.Row1.Row1BackgroundImage.ImageTl)!, "key": "w_960"},
527 "tp": {"alternateImage": (cur_GroupMF.Row1.Row1BackgroundImage.ImageTp)!, "key": "h_335"},
528 "mobile": {"alternateImage": (cur_GroupMF.Row1.Row1BackgroundImage.ImageM)!, "key": "h_335"}
529 }>
530 <#assign rowImage = leonardo.adaptImage((cur_GroupMF.Row1.Row1BackgroundImage)!, scalingDetails )>
531 <div class="products-and-services-features--content--graphic"
532 data-img-url-d="${rowImage.desktop!}"
533 data-img-url-tl="${rowImage.tablet_landscape!}"
534 data-img-url-tp="${rowImage.tablet_portrait!}"
535 data-img-url-m="${rowImage.mobile!}">
536 </div>
537 <noscript>
538 <img src="${rowImage.desktop!}" alt='${rowImage.alt_desktop!}'>
539 <img src="${rowImage.tablet_landscape!}" alt='${rowImage.alt_tablet_landscape!}'>
540 <img src="${rowImage.tablet_portrait!}" alt='${rowImage.alt_tablet_portrait!}'>
541 <img src="${rowImage.mobile!}" alt='${rowImage.alt_mobile!}'>
542 </noscript>
543 </div>
544 <div class="grid grid--d33p grid--tl33p grid--tp100p grid--m100p">
545 <div class="products-and-services-features--content--text">
546 <div class="products-and-services-features--content--text--wrap">
547 <h3 class="products-and-services-features--content--text--title">
548 <#assign escVar = (cur_GroupMF.Row1.Row1Title.data)!>
549 <@leonardo.escapeTitle title=escVar />
550 </h3>
551 <div class="products-and-services-features--content--text--desc">
552 ${(cur_GroupMF.Row1.Row1Abstract.data)!}
553 </div>
554 </div>
555 </div>
556 </div>
557 </div>
558 </#if>
559 <!--ROW 2-->
560 <#if (cur_GroupMF.Row2.Row2BackgroundImage.getData())?has_content ||
561 (cur_GroupMF.Row2.Row2Title.getData())?has_content ||
562 (cur_GroupMF.Row2.Row2Abstract.getData())?has_content>
563 <div class="section-grid layout--tp-col layout--m-col">
564 <div class="grid grid--d67p grid--tl67p grid--tp100p grid--m100p">
565
566 <#assign scalingDetails = {
567 "desktop": {"alternateImage": {}, "key": "w_960"},
568 "tl": {"alternateImage": (cur_GroupMF.Row2.Row2BackgroundImage.Row2ImageTl)!, "key": "w_960"},
569 "tp": {"alternateImage": (cur_GroupMF.Row2.Row2BackgroundImage.Row2ImageTp)!, "key": "h_335"},
570 "mobile": {"alternateImage": (cur_GroupMF.Row2.Row2BackgroundImage.Row2ImageM)!, "key": "h_335"}
571 }>
572 <#assign rowImage = leonardo.adaptImage((cur_GroupMF.Row2.Row2BackgroundImage)!, scalingDetails )>
573 <div class="products-and-services-features--content--graphic"
574 data-img-url-d="${rowImage.desktop!}"
575 data-img-url-tl="${rowImage.tablet_landscape!}"
576 data-img-url-tp="${rowImage.tablet_portrait!}"
577 data-img-url-m="${rowImage.mobile!}">
578 </div>
579 <noscript>
580 <img src="${rowImage.desktop!}" alt='${rowImage.alt_desktop!}'>
581 <img src="${rowImage.tablet_landscape!}" alt='${rowImage.alt_tablet_landscape!}'>
582 <img src="${rowImage.tablet_portrait!}" alt='${rowImage.alt_tablet_portrait!}'>
583 <img src="${rowImage.mobile!}" alt='${rowImage.alt_mobile!}'>
584 </noscript>
585 </div>
586 <div class="grid grid--d33p grid--tl33p grid--tp100p grid--m100p">
587 <div class="products-and-services-features--content--text">
588 <div class="products-and-services-features--content--text--wrap">
589 <h3 class="products-and-services-features--content--text--title">
590 <#assign escVar = (cur_GroupMF.Row2.Row2Title.data)!>
591 <@leonardo.escapeTitle title=escVar />
592 </h3>
593 <div class="products-and-services-features--content--text--desc">
594 ${(cur_GroupMF.Row2.Row2Abstract.data)!}
595 </div>
596 </div>
597 </div>
598 </div>
599 </div>
600 </#if>
601 <!--ROW 3-->
602 <#if (cur_GroupMF.Row3.Row3BackgroundImageLeft.getData())?has_content ||
603 (cur_GroupMF.Row3.Row3BackgroundImageRight.getData())?has_content ||
604 (cur_GroupMF.Row3.Row3Title.getData())?has_content ||
605 (cur_GroupMF.Row3.Row3Abstract.getData())?has_content>
606 <div class="section-grid layout--m-col layout--tp-wrap">
607 <div class="grid grid--d25p grid--tl25p grid--tp50p grid--m100p">
608 <#assign scalingDetails = {
609 "desktop": {"alternateImage": {}, "key": "h_400"},
610 "tl": {"alternateImage": (cur_GroupMF.Row3.Row3BackgroundImageLeft.Row3LeftImageTl)!, "key": "w_366"},
611 "tp": {"alternateImage": (cur_GroupMF.Row3.Row3BackgroundImageLeft.Row3LeftImageTp)!, "key": "w_335"},
612 "mobile": {"alternateImage": (cur_GroupMF.Row3.Row3BackgroundImageLeft.Row3LeftImageM)!, "key": "h_335"}
613 }>
614 <#assign rowImage = leonardo.adaptImage((cur_GroupMF.Row3.Row3BackgroundImageLeft)!, scalingDetails )>
615 <div class="products-and-services-features--content--graphic"
616 data-img-url-d="${rowImage.desktop!}"
617 data-img-url-tl="${rowImage.tablet_landscape!}"
618 data-img-url-tp="${rowImage.tablet_portrait!}"
619 data-img-url-m="${rowImage.mobile!}">
620 </div>
621 <noscript>
622 <img src="${rowImage.desktop!}" alt='${rowImage.alt_desktop!}'>
623 <img src="${rowImage.tablet_landscape!}" alt='${rowImage.alt_tablet_landscape!}'>
624 <img src="${rowImage.tablet_portrait!}" alt='${rowImage.alt_tablet_portrait!}'>
625 <img src="${rowImage.mobile!}" alt='${rowImage.alt_mobile!}'>
626 </noscript>
627 </div>
628 <div class="grid grid--d35p grid--tl35p grid--tp100p grid--m100p">
629 <div class="products-and-services-features--content--text">
630 <div class="products-and-services-features--content--text--wrap">
631 <h3 class="products-and-services-features--content--text--title">
632 <#assign escVar = (cur_GroupMF.Row3.Row3Title.data)!>
633 <@leonardo.escapeTitle title=escVar />
634 </h3>
635 <div class="products-and-services-features--content--text--desc">
636 ${(cur_GroupMF.Row3.Row3Abstract.data)!}
637 </div>
638 </div>
639 </div>
640 </div>
641 <div class="grid grid--d40p grid--tl40p grid--tp50p m-hidden">
642 <#assign scalingDetails = {
643 "desktop": {"alternateImage": {}, "key": "w_596"},
644 "tl": {"alternateImage": (cur_GroupMF.Row3.Row3BackgroundImageRight.Row3RightImageTl)!, "key": "w_596"},
645 "tp": {"alternateImage": (cur_GroupMF.Row3.Row3BackgroundImageRight.Row3RightImageTp)!, "key": "h_335"},
646 "mobile": {"alternateImage": (cur_GroupMF.Row3.Row3BackgroundImageRight.Row3RightImageM)!, "key": "h_335"}
647 }>
648 <#assign rowImage = leonardo.adaptImage((cur_GroupMF.Row3.Row3BackgroundImageRight)!, scalingDetails )>
649 <div class="products-and-services-features--content--graphic"
650 data-img-url-d="${rowImage.desktop!}"
651 data-img-url-tl="${rowImage.tablet_landscape!}"
652 data-img-url-tp="${rowImage.tablet_portrait!}"
653 data-img-url-m="${rowImage.mobile!}">
654 </div>
655 <noscript>
656 <img src="${rowImage.desktop!}" alt='${rowImage.alt_desktop!}'>
657 <img src="${rowImage.tablet_landscape!}" alt='${rowImage.alt_tablet_landscape!}'>
658 <img src="${rowImage.tablet_portrait!}" alt='${rowImage.alt_tablet_portrait!}'>
659 <img src="${rowImage.mobile!}" alt='${rowImage.alt_mobile!}'>
660 </noscript>
661 </div>
662 </div>
663 </#if>
664 </#list>
665 </div>
666 </#list>
667 </div>
668 </div>
669 </div>
670 </div>
671 </#if>
672 <!--END MODULE: MAIN FEATURES-->
673
674 <!--START MODULE: FREE AREA 1-->
675 <#if sectionFreeArea1 >
676 <#list SeparatorMainFeatures.getSiblings() as cur_sectionMF>
677 <!--Start Module: Section Content-->
678 <#assign showTitleOrText = false>
679 <#if (cur_sectionMF.MFSectionTitle.getData())?has_content ||
680 (cur_sectionMF.MFText.getData())?has_content>
681 <#assign showTitleOrText = true>
682 </#if>
683 <#if showTitleOrText>
684 <div class="section-container section-container--fixed generic-content-body">
685 <div class="section-content">
686 <div class="section-content--content section-content--features-${cur_sectionMF?index}">
687 <#if (cur_sectionMF.MFSectionTitle.getData())?has_content>
688 <div class="section-content--features--heading section-heading section-heading--center">
689 ${cur_sectionMF.MFSectionTitle.getData()}
690 </div>
691 </#if>
692 <#if cur_sectionMF.MFText.getData() != "">
693 <#assign htmlFormatted = leonardo.expandElementsInPage(cur_sectionMF.MFText.getData())>
694 <div class="check-html-content">${htmlFormatted}</div>
695 </#if>
696 </div>
697 </div>
698 </div>
699 </#if>
700 <#if (cur_sectionMF.FreeWebContent.getData())?has_content>
701 <!--Start Module: Free Web Content -->
702 <div ${(showTitleOrText)?then('','class="section-content--features-'+ cur_sectionMF?index + '"')}>
703 <#assign data = cur_sectionMF.FreeWebContent.getData()/>
704 <#assign json = jsonFactoryUtil.createJSONObject(data) />
705 <#assign classPK = json.getLong("classPK") />
706 <#if (classPK >0) >
707 <#assign ja = journalArticleLocalService.getLatestArticle(classPK) />
708 <#assign jad = journalArticleLocalService.getArticleDisplay(ja, ja.getTemplateId(), "", languageId, 1, null, themeDisplay) />
709 ${jad.getContent()}
710 </#if>
711 </div>
712 <!--End Module: Free Web Content-->
713 </#if>
714 <!--End Module: Section Content-->
715 </#list>
716 </#if>
717 <!--END MODULE: FREE AREA 1-->
718
719 <!--START MODULE: PRODUCTS TECHNICAL DATA-->
720 <#if sectionTDFound >
721 <div class="section-container section-container--fixed">
722 <div class="products-technical-data" data-expandable="true" data-lazy-load="12">
723 <#if SeparatorTechnicalData.TDSectionTitle.getData() != "">
724 <h2 class="products-technical-data--heading section-heading section-heading--center">
725 ${SeparatorTechnicalData.TDSectionTitle.getData()}
726 </h2>
727 </#if>
728 <div class="products-technical-data--specifications">
729 <#if SeparatorTechnicalData.TDTitle.getSiblings()?has_content>
730 <#list SeparatorTechnicalData.TDTitle.getSiblings() as cur_TDTitle>
731 <div class='products-technical-data--spec invisible'>
732 <#if cur_TDTitle.getData() != "">
733 <div class="products-technical-data--spec--label">${cur_TDTitle.getData()}</div>
734 </#if>
735 <#if cur_TDTitle.TDText.getData() != "">
736 <div class="products-technical-data--spec--value">
737 ${cur_TDTitle.TDText.getData()}
738 </div>
739 </#if>
740 </div>
741
742 </#list>
743 </#if>
744 </div>
745 <#if SeparatorTechnicalData.TDButtonLabel.getData() != "">
746 <div class="products-technical-data--action-items">
747 <div class="" style="text-align: center;">
748 <button class="btn btn-leo see-more" type="button">${SeparatorTechnicalData.TDButtonLabel.getData()}</button>
749 </div>
750 </div>
751 </#if>
752 </div>
753 </div>
754 </#if>
755 <!--END MODULE: PRODUCTS TECHNICAL DATA-->
756
757 <!--START MODULE: FREE AREA 2 -->
758 <#if sectionFreeArea2 >
759 <#list SeparatorFreeArea2.getSiblings() as cur_sectionFA2>
760 <!--Start Module: Section Content-->
761 <#assign showTitleOrText = false>
762 <#if (cur_sectionFA2.Fa2SectionTitle.getData())?has_content ||
763 (cur_sectionFA2.Fa2Text.getData())?has_content>
764 <#assign showTitleOrText = true>
765 </#if>
766 <#if showTitleOrText>
767 <div class="section-container section-container--fixed generic-content-body">
768 <div class="section-content">
769 <div class="section-content--content section-content--features-fa2-${cur_sectionFA2?index}">
770 <#if (cur_sectionFA2.Fa2SectionTitle.getData())?has_content>
771 <div class="section-content--features--heading section-heading section-heading--center">
772 ${cur_sectionFA2.Fa2SectionTitle.getData()}
773 </div>
774 </#if>
775 <#if cur_sectionFA2.Fa2Text.getData() != "">
776 <#assign htmlFormatted = leonardo.expandElementsInPage(cur_sectionFA2.Fa2Text.getData())>
777 <div class="check-html-content">${htmlFormatted}</div>
778 </#if>
779 </div>
780 </div>
781 </div>
782 </#if>
783 <#if (cur_sectionFA2.Fa2WebContent.getData())?has_content>
784 <!--Start Module: Free Web Content -->
785 <div ${(showTitleOrText)?then('','class="section-content--features-fa2-'+ cur_sectionFA2?index + '"')}>
786 <#assign data = cur_sectionFA2.Fa2WebContent.getData()/>
787 <#assign json = jsonFactoryUtil.createJSONObject(data) />
788 <#assign classPK = json.getLong("classPK") />
789 <#if (classPK >0) >
790 <#assign ja = journalArticleLocalService.getLatestArticle(classPK) />
791 <#assign jad = journalArticleLocalService.getArticleDisplay(ja, ja.getTemplateId(), "", languageId, 1, null, themeDisplay) />
792 ${jad.getContent()}
793 </#if>
794 </div>
795 <!--End Module: Free Web Content-->
796 </#if>
797 <!--End Module: Section Content-->
798 </#list>
799 </#if>
800 <!--END MODULE: FREE AREA 2 -->
801
802 <!--START MODULE: DOWNLOAD -->
803 <#if sectionDownloadFound>
804
805 <div class="section-container section-container--fixed">
806 <div class="section-content">
807 <div class="products-technical-data--action-items--downloads" style="margin-top: 0px;">
808 <#if (SeparatorDownloads.DownloadsSectionTitle.getData())?has_content>
809 <div class="products-technical-data--action-items--downloads--title">
810 ${SeparatorDownloads.DownloadsSectionTitle.getData()}
811 </div>
812 </#if>
813 <#if SeparatorDownloads.DownloadFileURL.getSiblings()?has_content>
814 <div class="products-technical-data--action-items--downloads--items">
815 <#list SeparatorDownloads.DownloadFileURL.getSiblings() as cur_DownloadFileURL>
816 <#if cur_DownloadFileURL.getData()?? && cur_DownloadFileURL.getData() != "">
817 <div class="products-technical-data--action-items--downloads--item">
818 <#assign file_info = leonardo.findFileEntryInfo(cur_DownloadFileURL.getData()) >
819
820 <a class="products-technical-data--action-items--downloads--item--link"
821 href="${docsDownloadURL}${file_info.downloadUrl}"
822 title='${(file_info.title)!cur_DownloadFileURL.DownloadFileLabel.getData()!}'
823 target="_blank">
824 <svg xmlns="http://www.w3.org/2000/svg" width="14" height="18" viewBox="0 0 14 18">
825 <path fill="#000" fill-rule="nonzero" d="M6.61 12.763l-2.145-2.24a.58.58 0 0 1 0-.796c.211-.22.551-.22.762 0l1.235 1.29V6.75c0-.31.24-.563.538-.563.297 0 .538.252.538.563v4.267l1.235-1.29c.21-.22.551-.22.762 0a.58.58 0 0 1 0 .796l-2.145 2.24a.526.526 0 0 1-.78 0zM12.62 18H1.383C.62 18 0 17.368 0 16.592V5.037c0-.49.19-.968.52-1.314L3.565.544A1.728 1.728 0 0 1 4.82 0h7.797C13.38 0 14 .631 14 1.407v15.186C14 17.37 13.38 18 12.619 18zM4.82 1.125a.682.682 0 0 0-.496.214L1.282 4.52a.755.755 0 0 0-.205.518v11.555c0 .156.137.283.306.283h11.235c.168 0 .305-.127.305-.282V1.407c0-.155-.137-.282-.305-.282H4.821zm-.783 4.5H2.154a.551.551 0 0 1-.539-.563c0-.31.242-.562.539-.562h1.884c.15 0 .27-.126.27-.281V2.25c0-.31.24-.563.538-.563.297 0 .539.252.539.563v1.969c0 .775-.605 1.406-1.347 1.406zm6.193 9.563H3.769a.55.55 0 0 1-.538-.563.55.55 0 0 1 .538-.563h6.462a.55.55 0 0 1 .538.563.55.55 0 0 1-.538.563z"/>
826 </svg>
827 <span class="products-technical-data--action-items--downloads--item--link--title">
828 ${(cur_DownloadFileURL.DownloadFileLabel.getData())!(file_info.title)!}
829 </span>
830 </a>
831 </div>
832 </#if>
833 </#list>
834 </div>
835 </#if>
836 </div>
837 </div>
838 </div>
839 </#if>
840 <!--END MODULE: DOWNLOAD -->
841</div>
842<#assign metaDesc = "">
843<!-- Meta description -->
844<#if (layout.getDescription(themeDisplay.locale))?has_content>
845 <#assign metaDesc = layout.getDescription(themeDisplay.locale)>
846<#elseif (.vars['reserved-article-description'].data)?has_content>
847 <#assign metaDesc = .vars['reserved-article-description'].data>
848</#if>
849<#if metaDesc?has_content>
850 ${layout.setDescription(metaDesc)}
851</#if>
852<#if SeparatorHero?? && (SeparatorHero.HeroImage.getData())?has_content>
853 <!-- Social Sharing -->
854 <#if (heroImg.desktop)?has_content>
855 <#assign imageFileName = heroImg.desktop!"" >
856 <#elseif (overviewImg.desktop)?has_content>
857 <#assign imageFileName = overviewImg.desktop!"" >
858 <#else>
859 <#assign imageFileName = "" >
860 </#if>
861
862 <#if (SeparatorHero.HeroTitle.getData())?has_content>
863 <#assign shareDescription = (htmlUtil.escape(SeparatorHero.HeroTitle.getData())!"")/>
864 <#assign shareDescription = (shareDescription?replace("\n", " "))/>
865 </#if>
866
867 <#assign ogType='product'>
868
869 <#assign twitterVia = "Leonardo_live">
870 <@leonardo.socialShareMetaAndLinks shareDescription=shareDescription imageFileName=imageFileName ogType=ogType twitterVia=twitterVia/>
871</#if>
872</#if>