PageSourceSearch

https://tg4.ie/en/

html tg4.ie collected 2026-10-01 10:13:38 UTC 74,607 bytes, 979 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en-ie" class="no-js">
3<head>
4    <meta charset="utf-8">
5    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8,IE=9,IE=edge,chrome=1">
6    <meta name="viewport" content="width=device-width, initial-scale=1">
7
8    <link rel="dns-prefetch" href="https://www.google-analytics.com">
9    <link rel="shortcut icon" href="/cf-static/images/favicon.ico">
10    <link rel="apple-touch-icon-precomposed" href="/cf-static/images/apple-touch-icon.png">
11
12    <link rel="stylesheet" href="/cf-static/css/main.min.css">
13    <!-- Proxima Webfont -->
14    <link rel="stylesheet" href="https://use.typekit.net/hwo8xkl.css">
15    
16    
16<script id="Cookiebot" data-culture="en" src="https://consent.cookiebot.com/uc.js" data-cbid="2d8f3fdb-5d3b-4571-924b-a31490834677" type="text/javascript" data-blockingmode="auto" async></script>
16
17    
18    
18<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js" integrity="sha384-Pn+PczAsODRZ2PiGg0IheRROpP7lXO1NTIjiPo6cca8TliBvaeil42fobhzvZd74" crossorigin="anonymous"></script>
18
19    
19<script>window.jQuery || document.write('
19<script src="https://d1og0s8nlbd0hm.cloudfront.net/js/vendor/jquery-1.11.2.min.js" integrity="sha384-Wh2y1zBlLOqJYO6CJ0R6NGuq5lDcHh+Vu4oBMN2M2e/eF1T26LiH1FHUQKREWSa/" crossorigin="anonymous"><\/script>')</script>
19
20    
20<script src="/cf-static/js/main-min.js"></script>
20
21
22    <!-- Set TG4 Geo Cookie -->
23    
23<script src="/cf-static/js/tg4-geo-cookie.js"></script>
23
24    
25    <!-- Set SSO UUID Cookie -->
26    
26<script src="/cf-static/js/sso-uuid-cookie.js"></script>
26
27
28    <!-- Set Site URL -->
29    
29<script src="/cf-static/js/site-url-en.js"></script>
29
30
31    <!-- Angular -->
32    
32<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js" data-cookieconsent="ignore" integrity="sha384-r1y8TJcloKTvouxnYsi4PJAx+nHNr90ibsEn3zznzDzWBN9X3o3kbHLSgcIPtzAp" crossorigin="anonymous"></script>
32
33    
33<script defer src='/cf-static/js/angular-slick.js'></script>
33
34    <!-- Angular -->
35
36    <!-- Google Tag Manager -->
37    
37<script>
vendor: 373 bytes, lines 37-42
37
38        (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
39        new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
40        j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
41        'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
42        })(window,document,'script','dataLayer','
42GTM-TSCVD6V
vendor: 9 bytes, lines 42-43
42');
43    
43</script>
43
44    <!-- End Google Tag Manager -->
45
46    <meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" />
47    <link rel="alternate" hreflang="ga" href="https://www.tg4.ie/ga/" />
48    <link rel="alternate" hreflang="en-ie" href="https://www.tg4.ie/en/" />
49    <link rel="alternate" hreflang="x-default" href="https://www.tg4.ie/ga/" />
50
51    <meta name="description" content="TG4 is the National Irish Language Public Service Broadcaster. The TG4 Player is a Global Hub of Irish language and Cultural Content, freely available for audiences worldwide. Music, Sport, Documentaries, Kids. Stream Irish TV now!" />
52    <meta property="og:locale" content="en_US" />
53    <meta property="og:type" content="website" />
54    <meta property="og:title" content="TG4 Television | TG4 Player | Irish TV | Irish Language TV | Gaeilge | Súil Eile" />
55    <meta property="og:description" content="TG4 is the National Irish Language Public Service Broadcaster. The TG4 Player is a Global Hub of Irish language and Cultural Content, freely available for audiences worldwide. Music, Sport, Documentaries, Kids. Stream Irish TV now!" />
56    <meta property="og:url" content="https://www.tg4.ie/en/" />
57    <meta property="og:site_name" content="TG4" />
58    <meta property="article:publisher" content="https://www.facebook.com/TG4TV" />
59    <meta property="article:modified_time" content="2022-02-03T16:18:46+00:00" />
60    <meta property="og:image" content="https://d1og0s8nlbd0hm.cloudfront.net/tg4-redesign-2015/wp-content/uploads/2021/02/Generic_BG_Player.jpg" />
61    <meta property="og:image:width" content="1920" />
62    <meta property="og:image:height" content="1080" />
63    <meta property="og:image:type" content="image/jpeg" />
64    
65    <meta name="twitter:card" content="summary_large_image" />
66    <meta name="twitter:image" content="https://d1og0s8nlbd0hm.cloudfront.net/tg4-redesign-2015/wp-content/uploads/2021/02/Generic_BG_Player.jpg" />
67    <meta name="twitter:site" content="@TG4TV" />
68
69    <title>TG4 Television | TG4 Player | Irish TV | Irish Language TV | Gaeilge | Súil Eile</title>
70
71    <!-- Google Search Console Verification -->
72    <meta name="google-site-verification" content="SgwAy4fECTlR6eVmPVGTktbR_S0IsqHxG8CIM-TbVhs" />
73    
74    <!-- Google Analytics Tracking Code -->
75    
75<script async language="JavaScript" type="text/javascript">
76        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
77        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
78        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
79        })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
80        //ga('create', 'UA-4024457-9', 'auto');
81        ga('create', 'UA-4024457-9', {cookieFlags: 'max-age=7200; secure; samesite=none'});
82        ga('send', 'pageview');
83    </script>
83
84    
85    <!-- Global site tag (gtag.js) - Google Analytics -->
vendor: 69 bytes, lines 85-86
85
86    <script async src="https://www.googletagmanager.com/gtag/js?id=
86G-MJ34VNCPXL
vendor: 17 bytes, lines 86-87
86"></script>
87    
87<script>
88        
vendor: 178 bytes, lines 88-93
88window.dataLayer = window.dataLayer || [];
89        function gtag(){
90            dataLayer.push(arguments);
91        }
92        gtag('js', new Date());
93        gtag('config', '
93G-MJ34VNCPXL
vendor: 9 bytes, lines 93-94
93');
94    
94</script>
94
95
96    
96<script src="https://d1og0s8nlbd0hm.cloudfront.net/js/jquery.cookie.js" integrity="sha384-Ehlc1ZsMjYz95/F2ZUZCuAmGVDVoCRenlqtta/zbghGZLMqckKL+D4vqWU5esSQe" crossorigin="anonymous"></script>
96
97
98    
98<script>
99        document.addEventListener("DOMContentLoaded", function () {
100            updateLinks();
101        });
102    </script>
102
103</head>
104<body class="home" ng-app="tg4App" ng-controller="tg4Ctrl">
105    <!-- Google Tag Manager (noscript) -->
vendor: 83 bytes, lines 105-107
105
106    <noscript>
107        <iframe src="https://www.googletagmanager.com/ns.html?id=
107GTM-TSCVD6V
vendor: 94 bytes, lines 107-109
107" height="0" width="0" style="display:none;visibility:hidden"></iframe>
108    </noscript>
109    
109<!-- End Google Tag Manager (noscript) -->
110    <a href="#maincontent" class="skip-to-main">Skip to main content</a> 
111    <div class="wrapper">
112        <header class="header-nav">
113            <div class="header-wrapper">
114                <div class="top-bar">
115                    <a class="logo-home" href="#" data-path=""><img src="/cf-static/images/TG4_Player_Logo_Pink.svg" alt="TG4 Logo" class="logo"></a>
116                    <div>
117                        <nav id="main-menu" class="main-menu" role="navigation">
118                            <ul class="main-menu-list">
119                                <li><a href="#" class="dynamic-link menu-active" data-path="">Home</a></li>
120                                <li><a href="#" class="dynamic-link" data-path="player/categories/top-documentaries/">Watch</a>
121                                    <ul class="sub-menu">
122                                        <li><a href="#" class="dynamic-link" data-path="player/categories/top-documentaries/">Documentaries</a></li>
123                                        <li><a href="#" class="dynamic-link" data-path="player/categories/irish-music-series/">Music</a></li>
124                                        <li><a href="#" class="dynamic-link" data-path="player/categories/drama-tv-shows/">Drama</a></li>
125                                        <li><a href="#" class="dynamic-link" data-path="player/categories/news-stories/">Current Affairs</a></li>
126                                        <li><a href="#" class="dynamic-link" data-path="player/categories/entertainment-shows/">Entertainment</a></li>
127                                        <li><a href="#" class="dynamic-link" data-path="player/categories/sport-tv-player/">Sport</a></li>
128                                        <li><a href="#" class="dynamic-link" data-path="player/categories/lifestyle-tv-shows/">Lifestyle</a></li>
129                                        <li><a href="#" class="dynamic-link" data-path="player/categories/childrens-tv-shows/">Cúla4</a></li>
130                                        <li><a href="#" class="dynamic-link" data-path="player/online-boxsets/">Boxsets</a></li>
131                                    </ul>                                       
132                                </li>
133                                <li><a href="#" class="dynamic-link" data-path="player/watch-live/home/">Live</a></li>
134                                <li><a href="#" class="dynamic-link" data-path="irish-tv-schedule/daily-schedule/">Schedule</a>
135                                    <ul class="sub-menu">
136                                        <li><a href="#" class="dynamic-link" data-path="irish-tv-schedule/daily-schedule/">Daily Schedule</a></li>
137                                        <li><a href="#" class="dynamic-link" data-path="irish-tv-schedule/cula4-schedule/">Cúla4 Schedule</a></li>
138                                        <li><a href="#" class="dynamic-link" data-path="irish-tv-schedule/sport-schedule/">Sport Schedule</a></li>
139                                        <li><a href="#" class="dynamic-link" data-path="irish-tv-schedule/live-sport/">Live Sport</a></li>
140                                    </ul>
141                                </li>
142                                <li class="menu-item-language"><a id="irish-lang-mobile" title="Switch to Gaeilge" href="../ga/"><span lang="ga">Gaeilge</span></a></li>
143                            </ul>
144                        </nav>
145                    </div>
146                </div>
147                <div class="languages">
148                    <a href="../ga/" class="lang-btn">Gaeilge</a>
149                </div>
150                <nav id="sso-menu" class="main-menu" role="navigation">
151                    <div class="sso" class="main-menu-list">
152                        <ul class="main-menu-list" id="sso-menu-dd">
153                            <li><a href="#" class="dynamic-link" data-path="account/profile/"><img src="/cf-static/images/profile.svg" alt="TG4 Account" class="sso_logo"></a>
154                            </li>
155                        </ul>
156                    </div>
157                </nav>
158                <a href="" class="search-btn-toggle"></a>
159                <div class="search-wrapper">
160                    <div class="search">
161                        <form method="get" id="searchform" class="search-form" action="search/" autocomplete="off">
162                            <input type="search" class="search-input" name="s" id="s" value="" placeholder="Search here...">
163                            <button type="submit" id="searchsubmit" value="Search" class="search-btn">Search</button>
164                        </form>
165                    </div>
166                </div>
167                <div class="nav-cover"></div>
168                <a href="#main-menu" class="burger-menu"></a>
169            </div>
170        </header>
171        <main id="maincontent">
172
173        <h1 class="visuallyhidden">TG4</h1>
174
175        <span ng-cloak ng-repeat="rail in pRails">
176        <!--  Carousel Rail (1-10 Programmes) -->
177        <section class="slider-wrapper" ng-if="rail.rail_number==40">
178            <slick init-onload="false" slides-to-show="1" data="" dots="true" settings="slickConfig1" ng-if="slickConfig1Loaded">
179                <section class="prog-module" ng-repeat="prog in rail.grid | limitTo:(rail.page_addon[0].limit)">
180                    <div class="home-slide-wrap">
181                        <div>
182                            <a ng-href="/en/player/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets/play/':'play/')}}?pid={{prog.prog_metadata.programmeid}}&title={{prog.prog_metadata.title | encodeURIComponent}}&series={{prog.prog_metadata.series_title | encodeURIComponent}}&genre={{prog.prog_metadata.category | encodeURIComponent}}" class="prog-panel">
183                                <div class="blockContainer">
184                                    <h2 class="hero-title" ng-bind="prog.prog_metadata.series_title"></h2>
185                                    <h3 ng-if="prog.prog_metadata.series_title!=prog.prog_metadata.title" class="hero-subtitle" ng-bind="prog.prog_metadata.title"></h3>
186                                </div>
187                                <div class="hero-image">
188                                    <img ng-if="prog.prog_metadata.product_code.length>0" data-lazy="https://res.cloudinary.com/tg4/image/upload/w_1300,ar_16:9,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}">
189                                    <img ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0" data-lazy="https://res.cloudinary.com/tg4/image/upload/w_1300,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}">
190                                </div>
191                            </a>
192                        </div>
193                    </div>
194                </section>
195            </slick>
196        </section>
197
198        <section class="section-panel-rail-31" ng-cloak ng-show="streamsReady && isOnDemandEnabled" ng-if="$index === 1">
199            <section class="homerail-mods">
200                <!-- Pulse indicator -->
201                <div class="pulse-wrapper">
202                    <div class="pulse-container">
203                        <img src="/cf-static/images/Ellipse-1.png" class="pulse-off">
204                        <img src="/cf-static/images/Ellipse-2.png" class="pulse-on">
205                    </div>
206                    <span class="pulse-text">LIVE</span>
207                </div>
208                <!-- Streams list -->
209                <div class="livemods-wrapper">
210                    <div class="mod-live" ng-repeat="p in pStreams track by $index" ng-if="p.state=='ONAIR' || p.isSoon">
211                        <!-- Logo -->
212                        <div class="tg4-card-logo">
213                            <a ng-href="{{getStreamLink(p)}}" target="{{getLinkTarget(p)}}"><img ng-src="{{p.logoUrl || '/cf-static/images/Blank.svg'}}" onerror="this.src='/cf-static/images/Blank.svg'"></a>
214                        </div>
215                        <!-- Progress bar -->
216                        <div class="tg4-progress" ng-if="p.state=='ONAIR'">
217                            <div class="tg4-progress-bar" ng-class="'tg4-progress-bar-' + p.stream" ng-style="{'width': p.progress + '%'}"></div>
218                        </div>
219                        <div class="tg4-dummy-progress" ng-if="p.state=='UPCOMING'"></div>
220                        <!-- On-air card -->
221                        <div class="tg4-card-home" ng-if="p.state=='ONAIR'">
222                            <div class="tg4-home-now">
223                                <div class="tg4-home-label">{{p.startTimeFormatted}}</div>
224                                <div class="tg4-home-title">
225                                    <a ng-href="{{getStreamLink(p)}}" target="{{getLinkTarget(p)}}">{{p.currentShow.title}}</a> 
226                                    <span ng-if="p.currentShow.iconUrl">
227                                        <img ng-src="{{p.currentShow.iconUrl}}" style="width:20px; height:20px; display:inline-block;">
228                                    </span>
229                                </div>
230                            </div>
231                        </div>
232                        <!-- Upcoming card -->
233                        <div class="tg4-card-upcoming" ng-if="p.state=='UPCOMING'">
234                            <div class="tg4-home-now">
235                                <div class="tg4-home-label" ng-if="isToday(p.currentShow.startTime)">
236                                    {{p.startTimeFormatted}}
237                                </div>
238                                <div class="tg4-home-title" ng-if="isToday(p.currentShow.startTime)">
239                                    <a ng-href="{{getStreamLink(p)}}" target="{{getLinkTarget(p)}}">
240                                        {{p.currentShow.title}}
241                                    </a> 
242                                    <span ng-if="p.currentShow.iconUrl">
243                                        <img ng-src="{{p.currentShow.iconUrl}}" style="width:20px; height:20px; display:inline-block;">
244                                    </span>
245                                </div>
246                                <div class="tg4-home-label" ng-if="!isToday(p.currentShow.startTime)">
247                                    On air: {{p.startTimeFormatted}}
248                                </div>
249                                <div class="tg4-home-title" ng-if="!isToday(p.currentShow.startTime)">
250                                    {{p.currentShow.title}} 
251                                    <span ng-if="p.currentShow.iconUrl">
252                                        <img ng-src="{{p.currentShow.iconUrl}}" style="width:20px; height:20px; display:inline-block;">
253                                    </span>
254                                </div>
255                            </div>
256                        </div>
257                    </div>
258                </div>
259            </section>
260        </section>
261
262        <!-- 2/4/6 Image Rail (2/4/6 Programmes) -->
263        <section ng-if="rail.rail_number>=1 && rail.rail_number<20" class="section-panel-rail-{{rail.rail_number}}">
264            <div class="panel-header">
265                <div class="title-tab-wrap">
266                    <h2 class="header-title" ng-bind="rail.page_addon[0].header_en"></h2>
267                    <p class="para-medium" ng-bind="rail.page_addon[0].subheader_en"></p>
268                </div>
269            </div>
270            <section class="homerail-mods">
271                <h2 class="visuallyhidden"></h2>
272                <div class="plyrmods-wrapper">
273                    <div class="player-mod-wrap">
274                        <section ng-class="rail.page_addon[0].style" ng-repeat="prog in rail.grid | limitTo:(rail.page_addon[0].limit)">
275                            <div class="img_wrap">
276                                <a ng-if="rail.rail_number>=5 && rail.rail_number<=8 || rail.rail_number>=15 && rail.rail_number<=16" ng-href="/en/player/categories/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets':replaceBulk(prog.prog_metadata.category, ['Boxset','Ceol','Cula4','Cursai Reatha','Drama','Faisneis','Saolchlar','Siamsaiocht','Sport','Blaisín'], ['online-boxsets','irish-music-series','childrens-tv-shows','news-stories','drama-tv-shows','top-documentaries','lifestyle-tv-shows','entertainment-shows','sport-tv-player','promo']))}}{{'/?series='+(prog.prog_metadata.series_title | encodeURIComponent)+'&genre='+(prog.prog_metadata.category | encodeURIComponent)}}" class="prog-panel">
277                                    <div ng-if="prog.prog_metadata.product_code.length>0">
278                                        <img ng-if="rail.rail_number==7" ng-src="{{ getImagePath(prog, rail) }}" alt="{{ prog.prog_metadata.series_title }}" style="height:{{ rail.page_addon[0].height }}; object-fit:cover;">
279                                        <img ng-if="rail.rail_number>=9 && rail.rail_number<13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_195,h_273,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
280                                        <img ng-if="(rail.rail_number>=1 && rail.rail_number<9 && rail.rail_number!=7) || rail.rail_number>=13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
281                                    </div>
282                                    <div ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0">
283                                        <img ng-if="rail.rail_number==7" ng-src="{{ getImagePath(prog, rail) }}" alt="{{ prog.prog_metadata.series_title }}" style="height:{{ rail.page_addon[0].height }}; object-fit:cover;">
284                                        <img ng-if="rail.rail_number>=9 && rail.rail_number<13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_195,h_273,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
285                                        <img ng-if="(rail.rail_number>=1 && rail.rail_number<9 && rail.rail_number!=7) || rail.rail_number>=13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
286                                    </div>
287                                    <div class="img_description_layer">
288                                        <p ng-if="rail.rail_number>=15 && rail.rail_number<=16"><span class="series-infolg"><span ng-if="prog.prog_metadata.series_number.length>0">S</span><span ng-bind="prog.prog_metadata.series_number"></span><span ng-if="prog.prog_metadata.prog_number.length>0"> E</span><span ng-bind="prog.prog_metadata.prog_number"></span> | <span ng-bind="prog.prog_metadata.date"></span></span><br /><span class="series-desclg" ng-bind="(prog.prog_metadata.description_en).substr(0,150)+'...'"></span></p>
289                                        <p ng-if="rail.rail_number>=5 && rail.rail_number<=12"><span class="series-info"><span ng-if="prog.prog_metadata.series_number.length>0">S</span><span ng-bind="prog.prog_metadata.series_number"></span><span ng-if="prog.prog_metadata.prog_number.length>0"> E</span><span ng-bind="prog.prog_metadata.prog_number"></span> | <span ng-bind="prog.prog_metadata.date"></span></span><br /><span class="series-desc" ng-bind="(prog.prog_metadata.description_en).substr(0,150)+'...'"></span></p>
290                                        <p>
291                                    </div>
292                                </a>
293                                <a ng-if="rail.rail_number>=9 && rail.rail_number<=12" ng-href="/en/player/online-boxsets/{{'?series='+(prog.prog_metadata.series_title | encodeURIComponent)+'&genre='+(prog.prog_metadata.category | encodeURIComponent)}}" class="prog-panel">
294                                    <div ng-if="prog.prog_metadata.product_code.length>0">
295                                        <img ng-if="rail.rail_number==9" ng-src="{{ getImagePath(prog, rail) }}" alt="{{ prog.prog_metadata.series_title }}" style="height:{{ rail.page_addon[0].height }}; object-fit:cover;">
296                                        <img ng-if="rail.rail_number>9 && rail.rail_number<13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_195,h_273,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
297                                        <img ng-if="rail.rail_number>=1 && rail.rail_number<9 || rail.rail_number>=13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
298                                    </div>
299                                    <div ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0">
300                                        <img ng-if="rail.rail_number==9" ng-src="{{ getImagePath(prog, rail) }}" alt="{{ prog.prog_metadata.series_title }}" style="height:{{ rail.page_addon[0].height }}; object-fit:cover;">
301                                        <img ng-if="rail.rail_number>9 && rail.rail_number<13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_195,h_273,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
302                                        <img ng-if="rail.rail_number>=1 && rail.rail_number<9 || rail.rail_number>=13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
303                                    </div>
304                                    <div class="img_description_layer">
305                                        <p ng-if="rail.rail_number>=15 && rail.rail_number<=16"><span class="series-infolg"><span ng-if="prog.prog_metadata.series_number.length>0">S</span><span ng-bind="prog.prog_metadata.series_number"></span><span ng-if="prog.prog_metadata.prog_number.length>0"> E</span><span ng-bind="prog.prog_metadata.prog_number"></span> | <span ng-bind="prog.prog_metadata.date"></span></span><br /><span class="series-desclg" ng-bind="(prog.prog_metadata.description_en).substr(0,150)+'...'"></span></p>
306                                        <p ng-if="rail.rail_number>=5 && rail.rail_number<=12"><span class="series-info"><span ng-if="prog.prog_metadata.series_number.length>0">S</span><span ng-bind="prog.prog_metadata.series_number"></span><span ng-if="prog.prog_metadata.prog_number.length>0"> E</span><span ng-bind="prog.prog_metadata.prog_number"></span> | <span ng-bind="prog.prog_metadata.date"></span></span><br /><span class="series-desc" ng-bind="(prog.prog_metadata.description_en).substr(0,150)+'...'"></span></p>
307                                        <p>
308                                    </div>
309                                </a>
310                                <a ng-if="rail.rail_number>=1 && rail.rail_number<=4 || rail.rail_number>=13 && rail.rail_number<=14" ng-href="/en/player/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets/play/':'play/')}}?pid={{prog.prog_metadata.programmeid}}&series={{prog.prog_metadata.series_title | encodeURIComponent}}&genre={{prog.prog_metadata.category | encodeURIComponent}}" class="prog-panel">
311                                    <div ng-if="prog.prog_metadata.product_code.length>0">
312                                        <img ng-if="rail.rail_number>=9 && rail.rail_number<13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_195,h_273,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
313                                        <img ng-if="rail.rail_number>=1 && rail.rail_number<9 || rail.rail_number>=13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
314                                    </div>
315                                    <div ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0">
316                                        <img ng-if="rail.rail_number>=9 && rail.rail_number<13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_195,h_273,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
317                                        <img ng-if="rail.rail_number>=1 && rail.rail_number<9 || rail.rail_number>=13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
318                                    </div>
319                                    <div class="img_description_layer">
320                                        <p ng-if="rail.rail_number>=13 && rail.rail_number<=14"><span class="series-infolg"><span ng-if="prog.prog_metadata.series_number.length>0">S</span><span ng-bind="prog.prog_metadata.series_number"></span><span ng-if="prog.prog_metadata.prog_number.length>0"> E</span><span ng-bind="prog.prog_metadata.prog_number"></span> | <span ng-bind="prog.prog_metadata.date"></span></span><br /><span class="series-desclg" ng-bind="(prog.prog_metadata.description_en).substr(0,120)+'...'"></span></p>
321                                        <p ng-if="rail.rail_number>=1 && rail.rail_number<=4"><span class="series-info"><span ng-if="prog.prog_metadata.series_number.length>0">S</span><span ng-bind="prog.prog_metadata.series_number"></span><span ng-if="prog.prog_metadata.prog_number.length>0"> E</span><span ng-bind="prog.prog_metadata.prog_number"></span> | <span ng-bind="prog.prog_metadata.date"></span></span><br /><span class="series-desc" ng-bind="(prog.prog_metadata.description_en).substr(0,120)+'...'"></span></p>
322                                    </div>
323                                </a>
324                            </div>
325                            <div class="prog-footer">
326                                <p class="player-genre" ng-if="rail.rail_number>=5 && rail.rail_number<13" ng-bind="replaceBulk(prog.prog_metadata.category, ['Boxset','Ceol','Cula4','Cursai Reatha','Drama','Faisneis','Saolchlar','Siamsaiocht','Sport'], ['Boxsets','Music','Young People','News','Drama','Documentaries','Lifestyle','Entertainment','Sport'])"></p>
327                                <span ng-if="rail.rail_number>=1 && rail.rail_number<9">
328                                    <h3 class="player-title" ng-if="prog.prog_metadata.series_title != prog.prog_metadata.title" ng-bind="prog.prog_metadata.series_title"></h3>
329                                    <h3 class="player-title" ng-if="prog.prog_metadata.series_title == prog.prog_metadata.title" ng-bind="prog.prog_metadata.series_title"></h3>
330                                    <h3 class="player-subtitle" ng-if="prog.prog_metadata.title != prog.prog_metadata.series_title" ng-bind="prog.prog_metadata.title"></h3>
331                                    <h3 class="player-subtitle" ng-if="prog.prog_metadata.title == prog.prog_metadata.series_title">&nbsp;</h3>
332                                </span>
333                                <span ng-if="rail.rail_number>=9 && rail.rail_number<13">
334                                    <h3 class="player-title" ng-bind="prog.prog_metadata.series_title"></h3>
335                                </span>
336                                <!-- <span ng-if="rail.rail_number==13">
337                                    <h3 class="player-title-lg" ng-bind="prog.prog_metadata.title"></h3>
338                                </span> -->
339                                <span ng-if="rail.rail_number>=13 && rail.rail_number!=14">
340                                    <h3 class="player-title-lg" ng-bind="prog.prog_metadata.series_title"></h3>
341                                </span>
342                                <span ng-if="rail.rail_number==14">
343                                    <h3 class="player-title-lg" ng-if="prog.prog_metadata.series_title != prog.prog_metadata.title" ng-bind="prog.prog_metadata.series_title"></h3>
344                                    <h3 class="player-title-lg" ng-if="prog.prog_metadata.series_title == prog.prog_metadata.title" ng-bind="prog.prog_metadata.series_title"></h3>
345                                    <h3 class="player-subtitle" ng-if="prog.prog_metadata.title != prog.prog_metadata.series_title" ng-bind="prog.prog_metadata.title"></h3>
346                                    <h3 class="player-subtitle" ng-if="prog.prog_metadata.title == prog.prog_metadata.series_title">&nbsp;</h3>
347                                </span>
348                            </div>
349                        </section>
350                    </div>
351                    <div class="view-btn-wrap"><a ng-href="/en/player/playlist/{{'?plid=' + rail.playlist_id + '&ptitle=' + rail.page_addon[0].header_en}}" class="view-btn"><span>View All</span></a></div>
352                </div>
353            </section>
354        </section>
355
356        <!-- Image/Text Rail (1 Programme) -->
357        <section ng-if="rail.rail_number==20" class="section-panel-rail-{{rail.rail_number}}">
358            <div ng-class="rail.page_addon[0].style" ng-repeat="prog in rail.grid | limitTo:(rail.page_addon[0].limit)">
359                <div ng-if="prog.prog_metadata.product_code.length>0" class="columnImg1">
360                    <img ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
361                </div>
362                <div ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0" class="columnImg1">
363                    <img ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;'>
364                </div>
365                <div class="columnTxt1">
366                    <h2 class="headbox-title" ng-bind="prog.prog_metadata.series_title"></h2>
367                    <p ng-bind="(prog.prog_metadata.description_en).substr(0,250)+'...'"></p>
368                    <p><br />
369                        <a ng-href="/en/player/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets/play/':'play/')}}?pid={{prog.prog_metadata.programmeid}}&series={{prog.prog_metadata.series_title | encodeURIComponent}}&genre={{prog.prog_metadata.category | encodeURIComponent}}" class="watch-btn"><span>Watch Now</span></a>
370                </div>
371            </div>
372        </section>
373
374        <!-- Text/Image Rail (1 Programme) -->
375        <section ng-if="rail.rail_number==21" class="section-panel-rail-{{rail.rail_number}}">
376            <div ng-class="rail.page_addon[0].style" ng-repeat="prog in rail.grid | limitTo:(rail.page_addon[0].limit)">
377                <div class="columnTxt1">
378                    <h2 class="headbox-title" ng-bind="prog.prog_metadata.series_title"></h2>
379                    <p ng-bind="(prog.prog_metadata.description_en).substr(0,250)+'...'"></p>
380                    <p><br />
381                        <a ng-href="/en/player/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets/play/':'play/')}}?pid={{prog.prog_metadata.programmeid}}&series={{prog.prog_metadata.series_title | encodeURIComponent}}&genre={{prog.prog_metadata.category | encodeURIComponent}}" class="watch-btn"><span>Watch Now</span></a>
382                    </p>
383                </div>
384                <div ng-if="prog.prog_metadata.product_code.length>0" class="columnImg1">
385                    <img ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
386                </div>
387                <div ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0" class="columnImg1">
388                    <img ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
389                </div>
390            </div>
391        </section>
392
393        <!-- Image/Text/Image Rail (1 Programme) -->
394        <section ng-if="rail.rail_number==22" class="section-panel-rail-{{rail.rail_number}}">
395            <div ng-class="rail.page_addon[0].style" ng-repeat="prog in rail.grid | limitTo:(rail.page_addon[0].limit)">
396                <div ng-if="prog.prog_metadata.product_code.length>0" class="columnImg4">
397                    <img ng-src="https://res.cloudinary.com/tg4/image/upload/w_366,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
398                </div>
399                <div class="columnTxt5">
400                    <h2 class="headbox-title" ng-bind="prog.prog_metadata.series_title"></h2>
401                    <p ng-bind="(prog.prog_metadata.description_en).substr(0,250)+'...'"></p>
402                    <p><br />
403                        <a ng-href="/en/player/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets/play/':'play/')}}?pid={{prog.prog_metadata.programmeid}}&series={{prog.prog_metadata.series_title | encodeURIComponent}}&genre={{prog.prog_metadata.category | encodeURIComponent}}" class="watch-btn"><span>Watch Now</span></a>
404                    </p>
405                </div>
406                <div ng-if="prog.prog_metadata.series_code.length>0" class="columnImg6">
407                    <img ng-src="https://res.cloudinary.com/tg4/image/upload/w_366,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
408                </div>
409            </div>
410        </section>
411
412        <!-- Text/Image/Image/Text Rail (2 Programmes) -->
413        <section ng-if="rail.rail_number==23" class="section-panel-rail-{{rail.rail_number}}">
414            <div ng-class="rail.page_addon[0].style">
415                <div ng-if="$index==0" class="columnTxt6" ng-repeat="prog in rail.grid | orderBy:'$index' | limitTo:(rail.page_addon[0].limit)">
416                    <h2 class="headbox-title" ng-bind="prog.prog_metadata.series_title"></h2>
417                    <p ng-bind="(prog.prog_metadata.description_en).substr(0,250)+'...'"></p>
418                    <p><br />
419                        <a ng-href="/en/player/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets/play/':'play/')}}?pid={{prog.prog_metadata.programmeid}}&series={{prog.prog_metadata.series_title | encodeURIComponent}}&genre={{prog.prog_metadata.category | encodeURIComponent}}" class="watch-btn"><span>Watch Now</span></a>
420                    </p>
421                </div>
422                <div ng-if="$index==0" class="columnImg7" ng-repeat="prog in rail.grid | orderBy:'$index' | limitTo:(rail.page_addon[0].limit)">
423                    <img ng-if="prog.prog_metadata.product_code.length>0" ng-src="https://res.cloudinary.com/tg4/image/upload/w_261,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
424                </div>
425                <div ng-if="$index==1" class="columnImg7" ng-repeat="prog in rail.grid | orderBy:'$index' | limitTo:(rail.page_addon[0].limit)">
426                    <img ng-if="prog.prog_metadata.product_code.length>0" ng-src="https://res.cloudinary.com/tg4/image/upload/w_261,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'">
427                </div>
428                <div ng-if="$index==1" class="columnTxt6" ng-repeat="prog in rail.grid | orderBy:'$index' | limitTo:(rail.page_addon[0].limit)">
429                    <h2 class="headbox-title" ng-bind="prog.prog_metadata.series_title"></h2>
430                    <p ng-bind="(prog.prog_metadata.description_en).substr(0,250)+'...'"></p>
431                    <p><br />
432                        <a ng-href="/en/player/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets/play/':'play/')}}?pid={{prog.prog_metadata.programmeid}}&series={{prog.prog_metadata.series_title | encodeURIComponent}}&genre={{prog.prog_metadata.category | encodeURIComponent}}" class="watch-btn"><span>Watch Now</span></a>
433                    </p>
434                </div>
435            </div>
436        </section>
437
438        <!-- 5 Image Mosaic Rail (5 Programmes - Main Image at start) -->
439        <section ng-if="rail.rail_number==30" class="section-panel-rail-{{rail.rail_number}}">
440            <div ng-class="rail.page_addon[0].style">
441                <div ng-repeat="prog in rail.grid | orderBy:'$index' | limitTo:(rail.page_addon[0].limit)" class="item-{{$index}}"><a ng-href="{{'/en/player/categories/'+replaceBulk(prog.prog_metadata.category, ['Boxset','Ceol','Cula4','Cursai Reatha','Drama','Faisneis','Saolchlar','Siamsaiocht','Sport'], ['online-boxsets','irish-music-series','childrens-tv-shows','news-stories','drama-tv-shows','top-documentaries','lifestyle-tv-shows','entertainment-shows','sport-tv-player'])+'/?series='+(prog.prog_metadata.series_title | encodeURIComponent)+'&genre='+(prog.prog_metadata.category | encodeURIComponent)}}"><img ng-if="prog.prog_metadata.product_code.length>0" ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" title="{{prog.prog_metadata.series_title}}"><img ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0" ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" title="{{prog.prog_metadata.series_title}}">
442                    <div class="ImgContainerText-{{$index}}">
443                        <h3 ng-if="$index==0" class="img-titleLg" ng-bind="prog.prog_metadata.series_title"></h3>
444                        <h3 ng-if="$index!=0" class="img-titleSm" ng-bind="prog.prog_metadata.series_title"></h3>
445                    </div>
446                </a></div>
447            </div>
448        </section>
449
450        <!-- 5 Image Mosaic Rail (5 Programmes - Main Image at end) -->
451        <section ng-if="rail.rail_number==31" class="section-panel-rail-{{rail.rail_number}}">
452            <div ng-class="rail.page_addon[0].style">
453                <div ng-repeat="prog in rail.grid | orderBy:'$index' | limitTo:(rail.page_addon[0].limit)" class="itemrev-{{$index}}"><a ng-href="{{'/en/player/categories/'+replaceBulk(prog.prog_metadata.category, ['Boxset','Ceol','Cula4','Cursai Reatha','Drama','Faisneis','Saolchlar','Siamsaiocht','Sport'], ['online-boxsets','irish-music-series','childrens-tv-shows','news-stories','drama-tv-shows','top-documentaries','lifestyle-tv-shows','entertainment-shows','sport-tv-player'])+'/?series='+(prog.prog_metadata.series_title | encodeURIComponent)+'&genre='+(prog.prog_metadata.category | encodeURIComponent)}}"><img ng-if="prog.prog_metadata.product_code.length>0" ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" title="{{prog.prog_metadata.series_title}}"><img ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0" ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" title="{{prog.prog_metadata.series_title}}">
454                    <div class="ImgContainerText-{{$index}}">
455                        <h3 ng-if="$index==4" class="img-titleLg" ng-bind="prog.prog_metadata.series_title"></h3>
456                        <h3 ng-if="$index!=4" class="img-titleSm" ng-bind="prog.prog_metadata.series_title"></h3>
457                    </div>
458                </a></div>
459            </div>
460        </section>
461        </span>
462
463        
463<script>
464            // Minified version of isMobile
465            !function(e){var n=/iPhone/i,t=/iPod/i,r=/iPad/i,a=/\bAndroid(?:.+)Mobile\b/i,p=/Android/i,l=/\bAndroid(?:.+)SD4930UR\b/i,b=/\bAndroid(?:.+)(?:KF[A-Z]{2,4})\b/i,f=/Windows Phone/i,u=/\bWindows(?:.+)ARM\b/i,c=/BlackBerry/i,s=/BB10/i,v=/Opera Mini/i,h=/\b(CriOS|Chrome)(?:.+)Mobile/i,w=/\Mobile(?:.+)Firefox\b/i;function m(e,i){return e.test(i)}function i(e){var i=e||("undefined"!=typeof navigator?navigator.userAgent:""),o=i.split("[FBAN");void 0!==o[1]&&(i=o[0]),void 0!==(o=i.split("Twitter"))[1]&&(i=o[0]);var d={apple:{phone:m(n,i),ipod:m(t,i),tablet:!m(n,i)&&m(r,i),device:m(n,i)||m(t,i)||m(r,i)},amazon:{phone:m(l,i),tablet:!m(l,i)&&m(b,i),device:m(l,i)||m(b,i)},android:{phone:m(l,i)||m(a,i),tablet:!m(l,i)&&!m(a,i)&&(m(b,i)||m(p,i)),device:m(l,i)||m(b,i)||m(a,i)||m(p,i)},windows:{phone:m(f,i),tablet:m(u,i),device:m(f,i)||m(u,i)},other:{blackberry:m(c,i),blackberry10:m(s,i),opera:m(v,i),firefox:m(w,i),chrome:m(h,i),device:m(c,i)||m(s,i)||m(v,i)||m(w,i)||m(h,i)}};return d.any=d.apple.device||d.android.device||d.windows.device||d.other.device,d.phone=d.apple.phone||d.android.phone||d.windows.phone,d.tablet=d.apple.tablet||d.android.tablet||d.windows.tablet,d}"undefined"!=typeof module&&module.exports&&"undefined"==typeof window?module.exports=i:"undefined"!=typeof module&&module.exports&&"undefined"!=typeof window?module.exports=i():"function"==typeof define&&define.amd?define([],e.isMobile=i()):e.isMobile=i()}(this);
466
467            if (isMobile.apple.phone || isMobile.android.phone) {
468            console.log("Apple Phone:", isMobile.apple.phone, " Android Phone:", isMobile.android.phone, " Windows Phone:", isMobile.windows.phone)
469            };
470
471            var tg4App=angular.module("tg4App", ['slickCarousel']);
472
473            tg4App.filter('encodeURIComponent', function() {
474                return function(input) {
475                    if (input === undefined || input === null) return '';
476                    return encodeURIComponent(String(input).trim());
477                };
478            });
479
480            tg4App.controller('tg4Ctrl', function($scope, $http, $timeout, $interval) {
481
482            var GeoCountry = getCookie('GeoCountry');
483            var url = (GeoCountry == 'IE') ? "https://tg4-platforms.s3.amazonaws.com/rails/IOI.json" : "https://tg4-platforms.s3.amazonaws.com/rails/WW.json";
484            var controlURL = "https://api.tg4dev.com/api/epg/show_live_rail?api_key=d3b8f0c1-2e4a-4f5b-9c6d-7e8f9a0b1c2d";
485            var getLiveURL = "https://api.tg4dev.com/api/epg/current?api_key=d3b8f0c1-2e4a-4f5b-9c6d-7e8f9a0b1c2d&limit=4&currentEventsOnly=true";
486            var refreshTimer = null;
487
488            function startPolling() {
489                loadControl();
490            }
491
492            $scope.isOnDemandEnabled = false; // default
493
494            function loadControl() {
495                $http.get(controlURL).then(function(response) {
496                    var control = response.data;
497
498                    // Only show the section if enabled
499                    $scope.isOnDemandEnabled = control.enabled;
500                    
501                    if (control.enabled) {
502                        // Only load /current if ONDEMAND is enabled
503                        loadCurrent(control);
504                    } else {
505                        // If disabled, clear ONDEMAND streams or skip polling
506                        $scope.pStreams = [];
507                        scheduleNextRefresh(control);
508                    }
509                }).catch(function(err){
510                    console.error("Control API error:", err);
511                    scheduleNextRefresh({enabled: false}); // fallback slow poll
512                });
513            }
514
515            $http.get(url).then(function(response) {
516                $scope.pAllRail = response.data;
517                $scope.pRails = response.data.rails;
518                //console.log("Rails: ", $scope.pRails);
519
520                if ($scope.pRails) {
521                    for (var intCnt = 0; intCnt < $scope.pRails.length; intCnt++) {
522                        var pRail = $scope.pRails[intCnt];  // Avoid using $scope.pRail globally
523                        pRail.page_addon = [];
524
525                        var HeaderIE = "";
526                        var HeaderEN = "";
527                        var subHeaderIE = "";
528                        var subHeaderEN = "";
529
530                        if (pRail.header && pRail.header.title) {
531                            if (pRail.header.title.indexOf("$") > 0) {
532                                var splitHeader = pRail.header.title.split("$");
533                                HeaderIE = splitHeader[0].trim();
534                                HeaderEN = splitHeader[1].trim();
535                            } else {
536                                HeaderIE = pRail.header.title;
537                                HeaderEN = pRail.header.title;
538                            }
539                        }
540
541                        if (pRail.sub_header && pRail.sub_header.title) {
542                            if (pRail.sub_header.title.indexOf("$") > 0) {
543                                var splitSubHeader = pRail.sub_header.title.split("$");
544                                subHeaderIE = splitSubHeader[0].trim();
545                                subHeaderEN = splitSubHeader[1].trim();
546                            } else {
547                                subHeaderIE = pRail.sub_header.title;
548                                subHeaderEN = pRail.sub_header.title;
549                            }
550                        }
551
552                        //console.log(splitSubHeader, HeaderIE, HeaderEN, subHeaderIE, subHeaderEN);
553
554                        var railNumber = pRail.rail_number;
555                        if (railNumber <= 8) {
556                            pRail.page_addon.push({ style: 'mod-home', limit: '4', height: '', header_ie: HeaderIE, header_en: HeaderEN, subheader_ie: subHeaderIE, subheader_en: subHeaderEN });
557                        } else if (railNumber > 8 && railNumber <= 12) {
558                            pRail.page_addon.push({ style: 'mod-2', limit: '6', height: '273px', header_ie: HeaderIE, header_en: HeaderEN, subheader_ie: subHeaderIE, subheader_en: subHeaderEN });
559                        } else if (railNumber > 12 && railNumber <= 16) {
560                            pRail.page_addon.push({ style: 'mod-3', limit: '2', height: '', header_ie: HeaderIE, header_en: HeaderEN, subheader_ie: subHeaderIE, subheader_en: subHeaderEN });
561                        } else if (railNumber > 16 && railNumber <= 22) {
562                            pRail.page_addon.push({ style: 'rowImg', limit: '1', height: '' });
563                        } else if (railNumber == 23) {
564                            pRail.page_addon.push({ style: 'rowImg', limit: '2', height: '' });
565                        } else if (railNumber == 30) {
566                            pRail.page_addon.push({ style: 'mosaic_container', limit: '5', height: '' });
567                        } else if (railNumber == 31) {
568                            pRail.page_addon.push({ style: 'mosaic_container_rev', limit: '5', height: '' });
569                        } else if (railNumber == 40) {
570                            pRail.page_addon.push({ style: '', limit: '6', height: '' });
571                        }
572                    }
573                }
574            }).catch(function(error) {
575                console.error("Error loading JSON:", error);
576            });
577
578            // -------------------------
579            // Load & process data
580            // -------------------------
581            $scope.streamsReady = false;
582
583            // Update progress bars and precompute 'upcoming' flag
584            function updateProgressBars() {
585                if (!$scope.pStreams) return;
586                const now = Date.now();
587                const timeToLive = 240 * 60 * 60 * 1000;
588
589                $scope.pStreams.forEach(function(p) {
590                    if (p.currentShow && p.currentShow.startTime && p.currentShow.endTime) {
591                        const start = Date.parse(p.currentShow.startTime);
592                        const end = Date.parse(p.currentShow.endTime);
593                        const duration = end - start;
594                        if (duration <= 0) return;
595                        // Progress bar (1–100%)
596                        var progress = ((now - start) / duration) * 100;
597                        progress = Math.max(1, Math.min(progress, 100)); // clamp to 1–100%
598                        p.progress = progress;
599
600                        if (p.progress < p.prevProgress) {
601                            p.progress = 1;
602                        }
603                        p.prevProgress = p.progress;
604
605                        // Upcoming flag: show if within 6 hours
606                        p.isSoon = start >= now && (start - now) <= timeToLive;
607                        //console.log(p.currentShow.title, 'start:', new Date(start), 'now:', new Date(now), 'isSoon:', p.isSoon);
608                    }
609                });
610            }
611
612            $interval(updateProgressBars, 10000);
613
614            $scope.isToday = function(dateString) {
615                const d = new Date(dateString);
616                const today = new Date();
617                return d.getFullYear() === today.getFullYear() && d.getMonth() === today.getMonth() && d.getDate() === today.getDate();
618            };
619
620            function loadCurrent(control) {
621                $http.get(getLiveURL).then(function(response) {
622                    var streams = response.data.streams
623                        .filter(function(p){
624                            return (p.state === 'ONAIR' || p.state === 'UPCOMING') && p.stream !== "TG4PLUSTWO";
625                        })
626                        .map(function(p){
627                            // Preserve streamId for links
628                            p.streamId = p.streamId || p.id || p.streamId;
629
630                            if (p.currentShow && p.currentShow.startTime && p.currentShow.endTime){
631                                var startTs = new Date(p.currentShow.startTime).getTime();
632                                var endTs   = new Date(p.currentShow.endTime).getTime();
633
634                                // TG4+1 adjustment
635                                if (p.stream === "TG4+1"){
636                                    startTs += 3600000;
637                                    endTs   += 3600000;
638                                }
639
640                                // Ad break offset
641                                if (p.offsetSeconds && !isNaN(p.offsetSeconds)){
642                                    startTs -= (p.offsetSeconds * 1000);
643                                }
644
645                                p.adjustedStartTime = startTs;
646                                p.endTimeTs = endTs;
647
648                                var startDate = new Date(startTs);
649                                var now = new Date();
650
651                                var sameDay =
652                                    startDate.getDate() === now.getDate() &&
653                                    startDate.getMonth() === now.getMonth() &&
654                                    startDate.getFullYear() === now.getFullYear();
655
656                                if (sameDay){
657                                    p.startTimeFormatted =
658                                        startDate.toLocaleTimeString([],{
659                                            hour:'2-digit',
660                                            minute:'2-digit',
661                                            hour12:false
662                                        });
663                                } else {
664                                    p.startTimeFormatted =
665                                        startDate.toLocaleString([],{
666                                            day:'2-digit',
667                                            month:'2-digit',
668                                            hour:'2-digit',
669                                            minute:'2-digit',
670                                            hour12:false
671                                        });
672                                }
673                            }
674
675                            // Icon logic
676                            if (p.currentShow && p.currentShow.availability){
677                                var avail = p.currentShow.availability.trim().toUpperCase();
678                                if(avail === 'IRELAND_ONLY') p.currentShow.iconUrl = '/cf-static/images/irl_icon.svg';
679                                else if(avail === 'UNAVAILABLE') p.currentShow.iconUrl = '/cf-static/images/not_available_icon.svg';
680                            }
681
682                            return p;
683                        });
684
685                    $timeout(function() {
686                        updateProgressBars();
687                    });
688
689                    $scope.pStreams = streams;
690                    $scope.streamsReady = true;
691
692                    //console.log("Streams", $scope.pStreams);
693
694                    scheduleNextRefresh(control);
695
696                }).catch(function(err){
697                    console.error("Current API error:", err);
698                    scheduleNextRefresh(control); // retry later
699                });
700            }
701
702            $scope.getStreamLink = function(p) {
703                if (p.streamId == 6383455473112) {
704                    return 'https://cula4.com/beo';
705                } else if (p.streamId == 6383454185112 || p.streamId == 6384196213112) {
706                    return 'player/watch-live/home/?start=' + p.adjustedStartTime;
707                } else {
708                    return 'player/play/?pid=' + p.streamId + '&s=live';
709                }
710            };
711
712            $scope.getLinkTarget = function(p) {
713                // Open external site in new tab, others in same tab
714                return p.streamId == 6383455473112 ? '_blank' : '_self';
715            };
716
717            function scheduleNextRefresh(control){
718                var interval = control.enabled ? (control.pollIntervalSeconds || 30) * 1000 : 5 * 60 * 1000;
719                var delay = Math.max(1000, interval); // min 1s delay
720
721                if (refreshTimer) $timeout.cancel(refreshTimer);
722                refreshTimer = $timeout(loadControl, delay);
723
724                //console.log(interval, delay, control);
725            }
726
727            startPolling();
728
729            $scope.$on('$destroy', function() {
730                if (refreshTimer) $timeout.cancel(refreshTimer);
731            });
732
733            $scope.knownImages = new Set([
734                'box_262470_p',
735                'box_262470_l',
736                'box_434190_p',
737                'box_434190_l',
738                'box_237595_p',
739                'box_237595_l',
740                'box_507439_p',
741                'box_507439_l',
742                'box_639304_p',
743                'box_639304_l',
744                'box_227336_p',
745                'box_227336_l',
746                'box_665171s_p',
747                'box_665171s_l',
748                'box_000020s_p',
749                'box_000020s_l',
750                'box_109027_p',
751                'box_109027_l',
752                'box_254483_p',
753                'box_254483_l',
754                'box_442078_p',
755                'box_442078_l',
756                'box_075134_p',
757                'box_075134_l',
758                'box_242501_p',
759                'box_242501_l',
760                'box_330543_p',
761                'box_330543_l'
762                // Add all valid image codes here (either product_codeP, product_code, or series_code)
763            ]);
764
765            $scope.getImagePath = function(prog, rail) {
766                const baseUrlSmallP = "https://res.cloudinary.com/tg4/image/upload/w_195,h_273,c_fill,f_auto,q_auto:eco/";
767                const baseUrlSmallL = "https://res.cloudinary.com/tg4/image/upload/w_700,h_395,c_fill,f_auto,q_auto:eco/";
768                const baseUrlSmall = "https://res.cloudinary.com/tg4/image/upload/w_195,h_273,g_faces,c_fill,f_auto,q_auto:eco/";
769                const baseUrlLarge = "https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/";
770                const fallback = "https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/000000.jpg";
771
772                //const code = prog?.prog_metadata?.product_code;
773                const code = prog?.prog_metadata?.series_code;
774                const series = prog?.prog_metadata?.series_code;
775                const product = prog?.prog_metadata?.product_code;
776
777                const candidatesP = [
778                    code ? 'box_' + code + '_p' : null,
779                    code,
780                    series
781                ];
782
783                const candidatesL = [
784                    code ? 'box_' + code + '_l' : null,
785                    code,
786                    series
787                ];
788
789                /* console.log("Raw code:", `"${prog?.prog_metadata?.product_code}"`);
790                console.log(candidatesP);
791                console.log(candidatesL); */
792
793                let baseUrl = '';
794                let imageCode = null;
795
796                //const baseUrl = (rail.rail_number >= 9 && rail.rail_number < 13) ? baseUrlSmall : baseUrlLarge;
797
798                if (rail.rail_number == 7) {
799                    baseUrl = baseUrlSmallL;
800                    imageCode = candidatesL.find(c => c && $scope.knownImages.has(c));
801                    //return imageCode ? baseUrl + imageCode + '.jpg' : series ? baseUrlLarge + series + '.jpg' : fallback;
802                    return imageCode
803                      ? baseUrl + imageCode + '.jpg'
804                      : series
805                        ? baseUrlLarge + series + '.jpg'
806                        : product
807                          ? baseUrlLarge + product + '.jpg'
808                          : fallback;
809                }
810                if (rail.rail_number == 9) {
811                    baseUrl = baseUrlSmallP;
812                    imageCode = candidatesP.find(c => c && $scope.knownImages.has(c));
813                    //return imageCode ? baseUrl + imageCode + '.jpg' : series ? baseUrlSmall + series + '.jpg' : fallback;
814                    return imageCode
815                      ? baseUrl + imageCode + '.jpg'
816                      : series
817                        ? baseUrlSmall + series + '.jpg'
818                        : product
819                          ? baseUrlSmall + product + '.jpg'
820                          : fallback;
821                }
822            };
823
824            $scope.diffDate = function(date1) {
825                var dateOut1 = new Date(Date.parse(date1, "yyyy-MM-dd HH:mm:ss")); // It will work if date1 is in ISO format
826                var dateOut2 = new Date(); // Today's date
827                var timeDiff = Math.abs(dateOut1.getTime() - dateOut2.getTime());
828                var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24));
829                return diffDays;
830            };
831
832            $scope.replaceBulk = function(str, findArray, replaceArray) {
833                var i, regex = [], map = {}; 
834                for(i=0; i<findArray.length; i++){ 
835                    regex.push( findArray[i].replace(/([-[\]{}()*+?.\\^$|#,])/g,'\\$1'));
836                    map[findArray[i]] = replaceArray[i]; 
837                }
838                regex = regex.join('|');
839                str = str.replace(new RegExp(regex, 'g'), function(matched){
840                    return map[matched];
841                });
842                return str;
843            };
844
845            $scope.slickConfig1Loaded = true;
846            $scope.slickConfig1 = {
847                method: {},
848                dots: true,
849                infinite: true,
850                speed: 1000,
851                slidesToShow: 1,
852                slidesToScroll: 1,
853                autoplay: false,
854                draggable: true,
855                lazyLoad: 'ondemand',
856                autoplaySpeed: 4000
857            };
858            });
859        </script>
859
860
861        <section class="section-panel-othersites">
862            <p class="othersites-title">Other Brands</p>
863        </section>
864
865        <section class="section-panel-microsite">
866            <h2 class="visuallyhidden">Micro-sites</h2>
867            <div class="micromods-wrapper">
868                <section class="mod-1"><a href="https://www.cula4.com/en" target="_New"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Cula4-2024.png" alt="Cúla4"></a></section>
869                <section class="mod-1"><a href="https://www.cine4.ie/en/produced-films" target="_New"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Cine4-2024.png" alt="Cine4"></a></section>
870                <section class="mod-1"><a href="https://bloc.tg4.ie/en" target="_New"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Bloc2024_1.png" alt="BLOC"></a></section>
871                <section class="mod-1"><a href="https://www.molsceal.ie" target="_New"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Molsceal-2024.png" alt="Molscéal"></a></section>
872                <section class="mod-1"><a href="https://www.tg4.ie/en/other-brands/gradam-ceoil/current-awards/"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/GradamCeoil-2024.png" alt="Gradam Ceoil TG4"></a></section>
873                <section class="mod-1"><a href="https://www.tg4.ie/en/other-brands/irish-news/"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Nuacht-2024.png" alt="Nuacht TG4"></a></section>
874                <section class="mod-1"><a href="https://www.tg4.ie/en/other-brands/weather/"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Aimsir-2024.png" alt="Aimsir TG4"></a></section>
875                <section class="mod-1"><a href="https://foghlaim.tg4.ie" target="_New"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Foghlaim-2024.png" alt="TG4 Foghlaim"></a></section>
876                <section class="mod-1"><a href="https://seannos.tg4.ie" target="_New"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/SeanNos-2024.png" alt="Sean Nós TG4"></a></section>
877                <section class="mod-1"><a href="https://www.tg4.ie/en/other-brands/tg4-archive/" target="_New"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Cartlann_TG4-2024.png" alt="Cartlann TG4"></a></section>
878            </div>
879        </section>
880
881        <section class="section-panel-socmedia">
882            <a class="soc-link" href="https://www.facebook.com/TG4TV" target="_New"><span><img src="/cf-static/images/Facebook.png" alt="Facebook"></span></a>
883            <a class="soc-link" href="https://twitter.com/TG4TV" target="_New"><span><img src="/cf-static/images/X.png" alt="X"></span></a>
884            <a class="soc-link" href="https://www.instagram.com/tg4tv/" target="_New"><span><img src="/cf-static/images/Instagram.png" alt="Instagram"></span></a>
885            <a class="soc-link" href="https://www.instagram.com/tg4tv/" target="_New"><span><img src="/cf-static/images/IGTV.png" alt="IGTV"></span></a>
886            <a class="soc-link" href="https://www.youtube.com/user/TG4" target="_New"><span><img src="/cf-static/images/Youtube.png" alt="Youtube"></span></a>
887            <a class="soc-link" href="https://www.tiktok.com/@tg4tv" target="_New"><span><img src="/cf-static/images/TikTok.png" alt="TikTok"></span></a>
888            <a class="soc-link" href="https://www.flickr.com/photos/tg4" target="_New"><span><img src="/cf-static/images/Flickr.png" alt="Flickr"></span></a>
889        </section>
890        </main>
891
892        <!-- Placeholder where footer will be injected -->
893        <div id="footer-placeholder"></div>
894
895        
895<script>
896            fetch('/cf-static/html/footer-en.html')
897                .then(response => response.text())
898                .then(data => {
899                    document.getElementById('footer-placeholder').innerHTML = data;
900                });
901        </script>
901
902
903        <style>
904            /* Cookie Bar CSS */
905            #cookieBar {
906                display: none;
907            }
908            #cookieBar {
909                display: block;
910            }
911            .cookie-message {
912                background-color: #000;
913                font-size: 14px;
914                position: fixed;
915                bottom: 0;
916                left: 0;
917                right: 0;
918                padding: 10px;
919                z-index: 99;
920                color: #FFF;
921                text-align: center;
922            }
923            .cookie-message a {
924                color: #FFF;
925                text-align: center;
926                cursor: pointer;
927            }
928            .cookie-message a:hover {
929                color: #EB0071;
930                text-align: center;
931                cursor: pointer;
932            }
933        </style>
934    </div>
935
936    <!-- Facebook Pixel Code - 26.07.2018 -->
937    
937<script>
vendor: 480 bytes, lines 937-946
937
938        !function(f,b,e,v,n,t,s)
939        {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
940        n.callMethod.apply(n,arguments):n.queue.push(arguments)};
941        if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
942        n.queue=[];t=b.createElement(e);t.async=!0;
943        t.src=v;s=b.getElementsByTagName(e)[0];
944        s.parentNode.insertBefore(t,s)}(window, document,'script',
945        'https://connect.facebook.net/en_US/fbevents.js');
946        fbq('init', '
946204101163593179
vendor: 44 bytes, lines 946-948
946');
947        fbq('track', 'PageView');
948    
948</script>
948
949    <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=204101163593179&ev=PageView&noscript=1"
950    /></noscript>
951    <!-- End Facebook Pixel Code -->
952
953    <!-- X universal website tag code -->
954    
954<script>
955        !function(e,t,n,s,u,a){e.twq||(s=e.twq=function(){s.exe?s.exe.apply(s,arguments):s.queue.push(arguments);
956        },s.version='1.1',s.queue=[],u=t.createElement(n),u.async=!0,u.src='//static.ads-twitter.com/uwt.js',
957        a=t.getElementsByTagName(n)[0],a.parentNode.insertBefore(u,a))}(window,document,'script');
958        // Insert X Pixel ID and Standard Event data below
959        twq('init','o8qz7');
960        twq('track','PageView');
961    </script>
961
962    <!-- End X universal website tag code -->
963
964    <!-- Tiktok tag code -->
965    
965<script>
966        !function (w, d, t) {
967          w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];ttq.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance=function(t){for(var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++
968        )ttq.setAndDefer(e,ttq.methods[n]);return e},ttq.load=function(e,n){var i="https://analytics.tiktok.com/i18n/pixel/events.js";ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=i,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{};n=document.createElement("script");n.type="text/javascript",n.async=!0,n.src=i+"?sdkid="+e+"&lib="+t;e=document.getElementsByTagName("script")[0];e.parentNode.insertBefore(n,e)};
969
970          ttq.load('C9V5TNJC77U4F2PS59JG');
971          ttq.page();
972        }(window, document, 'ttq');
973    </script>
973
974    <!-- End Tiktok tag code -->
975
976    <!-- ============= OUTDATED BROWSER ============= -->
977    <div id="outdated"></div>
978</body>
979</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.