PageSourceSearch

https://event-us.kr/account/login?ReturnUrl=%2Fmypage%2FFavoriteEvent

html event-us.kr collected 2026-10-01 10:17:08 UTC 84,610 bytes, 1,640 lines download raw bytes

1
2<!DOCTYPE html>
3<html>
4<head>
5    <!-- Ver 2.0 -->
6    <title>로그인</title>
7    <link rel="apple-touch-icon" href="/images/eventus-icon_iphone.png?220325">
8    
9    
10    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
11    <meta name="format-detection" content="telephone=no" />
12    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover">
13    <meta name="naver-site-verification" content="6abb99506d19b79d2c3fe7bfb92cafc4c17f40e4" />
14    <meta http-equiv="X-UA-Compatible" content="IE=edge">
15    <meta name="msapplication-tap-highlight" content="no">
16    <meta name="description" content="내가 원하는 행사를 개최하거나, 참여할 수 있는 플랫폼 - 이벤터스">
17    <meta name="keywords" content="행사모집,행사 플랫폼,모임 플랫폼, 행사운영,모임,이벤트,하이브리드 이벤트, 추천 행사, 온라인 행사, 웨비나">
18
19    <meta property="og:type" content="website">
20    <meta property="og:title" content="로그인" />
21    <meta property="og:description" content="내가 원하는 행사를 개최하거나, 참여할 수 있는 플랫폼 - 이벤터스">
22    <meta property="og:image" content="https://event-us.kr/images/eventus_thumbnail2.jpg?fit=640%2C360" />
23    <meta property="og:image:secure_url" content="https://event-us.kr/images/eventus_thumbnail2.jpg?fit=640%2C360" />
24    <meta property="og:image:width" content="1000" />
25    <meta property="og:image:height" content="343" />
26    <meta property="og:url" content="https://event-us.kr/">
27
28    <meta property="fb:app_id" content="136314230510204" />
29
30    <link rel="canonical" href="https://event-us.kr/account/login">
31    <!-- GrowthFit Google Tag Manager -->
32    <meta name="naver-site-verification" content="3704d95cf4764b65ca1cfea40f2d1af2d21572f2" />
33    <meta name="google-site-verification" content="vpzujpK-hobMlPNOk1yRN5aj31iVrls2qq-r9sAQtS0" />
34    
34<script>
vendor: 495 bytes, lines 34-42
34
35        (function (w, d, s, l, i) {
36            w[l] = w[l] || []; w[l].push({
37                'gtm.start':
38                    new Date().getTime(), event: 'gtm.js'
39            }); 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-WXXCN9W
vendor: 3 bytes, line 42
42');
42</script>
42
43    <!-- End GrowthFit Google Tag Manager -->
44    
44<script type="text/javascript" charset="UTF-8" src="//t1.daumcdn.net/adfit/static/kp.js"></script>
44
45    
45<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.6.8/axios.min.js"></script>
45
46
47    <!-- Nachocode SDK 초기화 함수를 먼저 정의 -->
48    
48<script>
49        (async () => {
50            if (window.Nachocode) {
51                try {
52                    await Nachocode.initAsync('CoJZITgcvIxPdPNaAriQ', { logger: true });
53                    /*await Nachocode.initAsync('EsOxDvKpXITLAEBWHWYh', { logger: true });*/
54
55                    if (Nachocode.env.isApp()) {
56                        // 앱 환경에서만 동작할 로직을 작성합니다.
57                    }
58                } catch (error) {
59                    console.error('nachocode Client SDK 초기화 실패:', error);
60                }
61            } else {
62                console.error('nachocode Client SDK가 로드되지 않았습니다.');
63            }
64        })();
65    </script>
65
66
67    <!-- CDN 로드 -->
68    
68<script src="https://cdn.nachocode.io/nachocode/client-sdk/@latest/client-sdk.min.js"></script>
68
69
70    
71
72    </script>
72
73        <!-- Global site tag (gtag.js) - Google Analytics -->
vendor: 73 bytes, lines 73-74
73
74        <script async src="https://www.googletagmanager.com/gtag/js?id=
74UA-75736254-1
vendor: 21 bytes, lines 74-75
74"></script>
75        
75<script>
76            if (typeof kakaoPixel !== 'undefined') {
77                kakaoPixel('4997877247864322440').pageView();
78            }
vendor: 529 bytes, lines 78-87
78
79
80            (function (w, d, s, l, i) {
81                w[l] = w[l] || []; w[l].push({
82                    'gtm.start':
83                        new Date().getTime(), event: 'gtm.js'
84                }); var f = d.getElementsByTagName(s)[0],
85                    j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src =
86                        'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f);
87            })(window, document, 'script', 'dataLayer', '
87GTM-PDVW6RC
vendor: 19 bytes, lines 87-89
87');
88
89            
vendor: 171 bytes, lines 89-93
89window.dataLayer = window.dataLayer || [];
90            function gtag() { dataLayer.push(arguments); }
91            gtag('js', new Date());
92
93            gtag('config', '
93UA-75736254-1
vendor: 13 bytes, lines 93-94
93');
94        
94</script>
94
95        
95<script src="/contents/js/log.es5.min.js" defer></script>
vendor: 71 bytes, lines 95-97
95
96
97    <script async src="https://www.googletagmanager.com/gtag/js?id=
97G-Z3JJ3P1SEG
vendor: 17 bytes, lines 97-98
97"></script>
98    
98<script>
99        
vendor: 157 bytes, lines 99-102
99window.dataLayer = window.dataLayer || [];
100        function gtag() { dataLayer.push(arguments); }
101        gtag('js', new Date());
102        gtag('config', '
102G-Z3JJ3P1SEG
vendor: 189 bytes, lines 102-105
102', {
103            'user_id': 'l2dX0YoAjO4EYEQNmfSB7q-wV69zQrH1H1-8jjV4gpSuOJQzB58MczQGB9s44vE7hoQFA2aVJ3Okw8UMZq3zzh-V62wHb-nn84R44sg4qarv3KkSfSAJx5d49_DIEf3K6Vd9Gg2'
104        });
105        
105gtag('set', 'user_properties', {
106            'crm_id': 'l2dX0YoAjO4EYEQNmfSB7q-wV69zQrH1H1-8jjV4gpSuOJQzB58MczQGB9s44vE7hoQFA2aVJ3Okw8UMZq3zzh-V62wHb-nn84R44sg4qarv3KkSfSAJx5d49_DIEf3K6Vd9Gg2'
107        });
108    </script>
108
109    
109<script>
110        (function () {
111            'use strict';
112
113            var color = {
114                brown: "color:#560000;font-size:11px;",
115                red: "color:#d83128;font-size:11px;",
116                yellow: "color:#ea991b;font-size:11px;",
117                green: "color:#93ba2f;font-size:11px;",
118                blue: "color:#4da4e0;font-size:11px;",
119                purple: [
120                    "color:#1d4ed8;font-size:11px;",
121                    "color:#4338ca;font-size:11px;",
122                    "color:#6d28d9;font-size:11px;",
123                    "color:#5b21b6;font-size:11px;",
124                    "color:#6b21a8;font-size:11px;",
125                    "color:#581c87;font-size:11px;",
126                    "color:#4c1d95;font-size:13px;",
127                ],
128            };
129
130            if (typeof console === "object" && console.log && typeof console.log === "function") {
131                const msg = "%c _____                      _                       \
132                                                                        \n%c|  ___|                    | |                      \
133                                                                        \n%c| |__  __   __  ___  _ __  | |_  ______  _   _  ___ \
134                                                                        \n%c|  __| \\ \\ / / / _ \\| '_ \\ | __||______|| | | |/ __|\
135                                                                        \n%c| |___  \\ V / |  __/| | | || |_         | |_| |\\__ \\ \
136                                                                        \n%c|____/   \\_/   \\___||_| |_| \\__|         \\__,_||___/ \
137                                                                        \n%c 행사와 함께 하는 모든 순간 이벤터스\n";
138                if (isUA('chrome') && !isUA('edge')) {
139                    console.log(
140                        msg,
141                        color.purple[0],
142                        color.purple[1],
143                        color.purple[2],
144                        color.purple[3],
145                        color.purple[4],
146                        color.purple[5],
147                        color.purple[6],
148                    );
149                } else {
150                    console.log(msg.replaceAll("%c", ""));
151                }
152                console.log("\x3e \x3e \x3e https://event-us.workfit.info/\n")
153            }
154
155            function isUA(userAgent) {
156                return navigator.userAgent.toLowerCase().indexOf(userAgent) > -1;
157            }
158            fetch(`/home/inflowsessionsave?referrer=${encodeURIComponent(document.referrer)}`)
159                .catch(error => console.error('Error:', error));
160        })();
161    </script>
161
162        
162<script type="text/javascript">
163        (function (w, d, a) {
164            w.__beusablerumclient__ = {
165                load: function (src) {
166                    var b = d.createElement("script");
167                    b.src = src; b.async = true; b.type = "text/javascript";
168                    d.getElementsByTagName("head")[0].appendChild(b);
169                }
170            }; w.__beusablerumclient__.load(a + "?url=" + encodeURIComponent(d.URL));
171        })(window, document, "//rum.beusable.net/load/b190312e135117u861");
172    </script>
172
173    
173<script src="/Content/dist/js/preload.js?651080f95fcecbb1"></script>
173<style>body {
174        opacity: 0;
175      }
176
177      body[loaded] {
178        opacity: 1;
179      }</style>
179<script>function docReady(e) {
180        'complete' === document.readyState || 'interactive' === document.readyState
181          ? setTimeout(e, 1)
182          : document.addEventListener('DOMContentLoaded', e);
183      }
184      docReady(() => {
185        document.querySelector('body').setAttribute('loaded', '');
186      });</script>
186
187    
187<script defer="defer" src="/Content/dist/js/chunk-vendors.js?651080f95fcecbb1"></script>
187<script defer="defer" src="/Content/dist/js/default.js?651080f95fcecbb1"></script>
187<link href="/Content/dist/css/default.css?651080f95fcecbb1" rel="stylesheet">
188    
189    <style>
190        #google_translate_element * {
191            font-family: 'Spoqa Han Sans Neo', sans-serif;
192            margin: 0;
193            padding: 0;
194        }
195
196        .goog-te-gadget-simple {
197            background: transparent;
198            border: none;
199            white-space: nowrap;
200        }
201
202        .skiptranslate {
203            display: none !important;
204        }
205    </style>
206 
207    
207<script>
208        const asp = {
209            user: {
210                get isAuthenticated() {
211                    return false;
212                },
213                get name() {
214                    return '';
215                },
216                get email() {
217                    return '';
218                },
219                get encodedRawUrl() {
220                    return '%2faccount%2flogin%3fReturnUrl%3d%252Fmypage%252FFavoriteEvent';
221                },
222            },
223            get blobUrl(){
224                return 'https://eventusstorage.blob.core.windows.net/evs'
225            },
226        };
227    </script>
227
228
229    
229<script type="application/ld+json">
230        
231    {
232        "@context": "http://schema.org",
233        "@type": "Organization",
234        "name": "이벤터스(Event-us)",
235        "url": "https://event-us.kr",
236        "logo": "https://event-us.kr/Content/neweventus/Image/eventus_logo.png",
237        "description": "이벤터스(Event-us)는 행사 운영, 신청, 참가자 관리 및 B2B 리드 제너레이션을 지원하는 올인원 이벤트 플랫폼입니다. 2014년부터 11년간 국내 이벤트 플랫폼 업계를 선도하며 축적된 전문성으로 신뢰받는 서비스를 제공합니다.",
238        "foundingDate":"2014-09-05",
239        "sameAs": [
240            "https://www.facebook.com/eventus.korea",
241            "https://www.linkedin.com/company/event-us/",
242            "https://www.instagram.com/event.with.us/",
243            "https://www.youtube.com/channel/UCotb2ainbLyD59J88M0XXxw",
244            "https://blog.naver.com/withitblog",
245            "https://event-us.kr/hostcenter/blog",
246            "https://blog.event-us.kr/eventus-solution"
247        ]
248    }
249    
250    </script>
250
251    
252    
252<script type="text/javascript">
253        _linkedin_partner_id = "4074420";
254        window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
255        window._linkedin_data_partner_ids.push(_linkedin_partner_id);
256    </script>
256
257    
257<script type="text/javascript">
258        (function (l) {
259            if (!l) {
260                window.lintrk = function (a, b) { window.lintrk.q.push([a, b]) };
261                window.lintrk.q = []
262            }
263            var s = document.getElementsByTagName("script")[0];
264            var b = document.createElement("script");
265            b.type = "text/javascript"; b.async = true;
266            b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
267            s.parentNode.insertBefore(b, s);
268        })(window.lintrk);
269    </script>
269
270    <noscript>
271        <img height="1" width="1" style="display: none;" alt="" src="https://px.ads.linkedin.com/collect/?pid=4074420&fmt=gif" />
272    </noscript>
273    
273<script src="/contents/js/log.es5.min.js" defer></script>
273
274</head>
275
276<body class="">
277    <!-- GrowthFit Google Tag Manager (noscript) -->
vendor: 83 bytes, lines 277-279
277
278    <noscript>
279        <iframe src="https://www.googletagmanager.com/ns.html?id=
279GTM-WXXCN9W
vendor: 111 bytes, lines 279-282
279"
280                height="0" width="0" style="display:none;visibility:hidden"></iframe>
281    </noscript>
282    
282<!-- End GrowthFit Google Tag Manager (noscript) -->
283
284    <noscript>
285        <img height="1" width="1" src="https://www.facebook.com/tr?id=467831983562863&ev=PageView&noscript=1" />
286        <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PDVW6RC"
287                height="0" width="0" style="display: none; visibility: hidden">
288        </iframe>
289    </noscript>
290    <div id="uiAlerts">
291    
292    <ev-modal level="alert" :open="isOpen" :position="position"
293              :dismissible="isBottomSheet && !hideCloseButton && onClose !== false" @dismiss="closeAction"
294              :class="[position === 'center' ? 'max-w-sm' : '', { 'text-center': confirmTheme || iconTheme }]">
295        <template #title v-if="title">
296            
297            <div class="mx-auto mb-5 h-1 w-10 rounded-full bg-gray-200 sm:hidden" v-if="isBottomSheet"></div>
298            <div class="flex justify-center items-center mx-auto mb-6 w-12 h-12 rounded-full bg-primary-50"
299                 v-if="iconTheme === 'lock'">
300                <svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-primary-500" viewBox="0 0 24 24"
301                     fill="none" stroke-width="1.5" stroke="currentColor">
302                    <path stroke-linecap="round" stroke-linejoin="round"
303                          d="M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z" />
304                </svg>
305            </div>
306            <div class="flex justify-center items-center mx-auto mb-6 w-12 h-12 rounded-full bg-success-50"
307                 v-if="confirmTheme === 'success'">
308                <svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-success-500" viewBox="0 0 20 20"
309                     fill="currentColor">
310                    <path fill-rule="evenodd"
311                          d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
312                          clip-rule="evenodd" />
313                </svg>
314            </div>
315            <div class="flex justify-center items-center mx-auto mb-6 w-12 h-12 rounded-full bg-danger-50"
316                 v-if="confirmTheme === 'danger'">
317                <svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-danger-500" viewBox="0 0 20 20"
318                     fill="currentColor" aria-hidden="true">
319                    <path fill-rule="evenodd"
320                          d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
321                          clip-rule="evenodd" />
322                </svg>
323            </div>
324            <div class="flex justify-center items-center mx-auto mb-6 w-12 h-12 rounded-full bg-danger-50"
325                 v-if="confirmTheme === 'delete'">
326                <svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-danger-500" viewBox="0 0 24 24"
327                     fill="none" stroke-width="1.5" stroke="currentColor">
328                    <path stroke-linecap="round" stroke-linejoin="round"
329                          d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0" />
330                </svg>
331            </div>
332            <div class="flex justify-center items-center mx-auto mb-6 w-12 h-12 rounded-full bg-warning-50"
333                 v-if="confirmTheme === 'warning'">
334                <svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-warning-500" viewBox="0 0 24 24"
335                     fill="none" stroke-width="1.5" stroke="currentColor">
336                    <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75
336a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z" />
337                </svg>
338            </div>
339            <div class="flex justify-center items-center mx-auto mb-6 w-12 h-12 rounded-full bg-info-50"
340                 v-if="confirmTheme === 'copy'">
341                <svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 text-info-50" viewBox="0 0 24 24" fill="none">
342                    <path d="M15.666 3.888C15.5327 3.4163 15.2489 3.00105 14.858 2.70538C14.467 2.40972 13.9902 2.24982 13.5 2.25H10.5C9.47 2.25 8.6 2.943 8.334 3.888M15.666 3.888C15.721 4.082 15.75 4.288 15.75 4.5C15.75 4.69891 15.671 4.88968 15.5303 5.03033C15.3897 5.17098 15.1989 5.25 15 5.25H9C8.80109 5.25 8.61032 5.17098 8.46967 5.03033C8.32902 4.88968 8.25 4.69891 8.25 4.5C8.25 4.288 8.28 4.082 8.334 3.888M15.666 3.888C16.312 3.937 16.954 3.998 17.593 4.072C18.693 4.2 19.5 5.149 19.5 6.257V19.5C19.5 20.0967 19.2629 20.669 18.841 21.091C18.419 21.5129 17.8467 21.75 17.25 21.75H6.75C6.15326 21.75 5.58097 21.5129 5.15901 21.091C4.73705 20.669 4.5 20.0967 4.5 19.5V6.257C4.5 5.149 5.306 4.2 6.407 4.072C7.04804 3.99778 7.6905 3.93643 8.334 3.888" stroke="#245DCB" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
343                </svg>
344            </div>
345            <div class="font-bold text-base">{{ title }}</div>
346        </template>
347        <template #description v-if="description">
348            <div class="whitespace-pre-line mt-2" v-dompurify-html="description">
349            </div>
350        </template>
351        
352        <template v-if="stacked">
353            <div class="space-y-2">
354                <ev-button v-if="!hideConfirmButton && onConfirm" class="bg-primary-500" @click="confirmAction"
355                    :disabled="isProcessing">
356                    <span v-if="isProcessing" class="inline-flex items-center justify-center gap-2">
357                        <span>{{ processingTitle ?? '진행 중' }}</span>
358                        <svg class="animate-spin w-4 h-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
359                            <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
360                            <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z"></path>
361                        </svg>
362                    </span>
363                    <template v-else>{{ confirmTitle ?? '확인' }}</template>
364                </ev-button>
365                <ev-button small v-if="!hideCloseButton && onClose !== false"
366                    class="border-0 bg-transparent shadow-none text-gray-500" @click="closeAction" :disabled="isProcessing">
367                    {{ closeTitle ?? '닫기' }}
368                </ev-button>
369            </div>
370        </template>
371        <template v-else-if="confirmTheme">
372            <div class="flex space-x-4">
373                <ev-button small v-if="!hideCloseButton && onClose !== false" @click="closeAction" :disabled="isProcessing">
374                    {{ closeTitle ?? '닫기' }}
375                </ev-button>
376                <ev-button small v-if="!hideConfirmButton" @click="confirmAction"
377                    :class="[ confirmButtonClass[confirmTheme] ]" :disabled="isProcessing">
378                    <span v-if="isProcessing" class="inline-flex items-center justify-center gap-2">
379                        <span>{{ processingTitle ?? '진행 중' }}</span>
380                        <svg class="animate-spin w-4 h-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
381                            <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
382                            <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z"></path>
383                        </svg>
384                    </span>
385                    <template v-else>{{ confirmTitle ?? '확인' }}</template>
386                </ev-button>
387            </div>
388        </template>
389        <template v-else>
390            <div class="flex space-x-2">
391                <ev-button small v-if="!hideCloseButton" class="flex-1" @click="closeAction" :disabled="isProcessing">
392                    {{ closeTitle ?? '닫기' }}
393                </ev-button>
394                <ev-button small :class="[ 'flex-1', confirmTheme === 'danger' ? 'bg-danger-500' : 'bg-primary-500' ]"
395                    @click="confirmAction" v-if="!hideConfirmButton && onConfirm" :disabled="isProcessing">
396                    <span v-if="isProcessing" class="inline-flex items-center justify-center gap-2">
397                        <span>{{ processingTitle ?? '진행 중' }}</span>
398                        <svg class="animate-spin w-4 h-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
399                            <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
400                            <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z"></path>
401                        </svg>
402                    </span>
403                    <template v-else>{{ confirmTitle ?? '확인' }}</template>
404                </ev-button>
405            </div>
406        </template>
407    </ev-modal>
408</div>
409<script>
410    docReady(() => {
411        ui.createApp({
412            data() {
413                return {
414                    isOpen: false,
415                    title: null,
416                    description: null,
417                    onClose: null,
418                    closeTitle: null,
419                    onConfirm: null,
420                    confirmTitle: null,
421                    confirmTheme: null,
422                    hideCloseButton: false,
423                    hideConfirmButton: false,
424                    isProcessing: false,
425                    loadingOnConfirm: false,
426                    processingTitle: null,
427                    position: 'center',
428                    iconTheme: null,
429                    stacked: false,
430
431                    confirmButtonClass: {
432                        success: 'bg-primary-500',
433                        danger: 'bg-danger-500',
434                        delete: 'bg-danger-500',
435                        warning: 'bg-primary-500',
436                        copy: 'bg-primary-500',
437                    },
438                };
439            },
440            computed: {
441                isBottomSheet() {
442                    return String(this.position).split(' ').indexOf('bottom') !== -1;
443                },
444            },
445            methods: {
446                closeAction() {
447                    if (this.isProcessing) return;
448                    if (typeof this.onClose === 'function') {
449                        this.onClose();
450                    }
451                    this.isOpen = false;
452                },
453                confirmAction() {
454                    if (this.isProcessing) return;
455                    if (typeof this.onConfirm === 'function') {
456                        const result = this.onConfirm();
457                        if (this.loadingOnConfirm && result && typeof result.then === 'function') {
458                            this.isProcessing = true;
459                            const self = this;
460                            result.finally(() => {
461                                self.isProcessing = false;
462                            });
463                            return;
464                        }
465                    }
466                    this.isOpen = false;
467                },
468            },
469            mounted() {
470                const self = this;
471                ui.alertClose = function () {
472                    self.isProcessing = false;
473                    self.isOpen = false;
474                };
475                ui.alert = function (model) {
476                    Object.assign(self, {
477                        title: null,
478                        description: null,
479                        onClose: null,
480                        closeTitle: null,
481                        onConfirm: null,
482                        confirmTitle: null,
483                        confirmTheme: null,
484                        hideCloseButton: false,
485                        hideConfirmButton: false,
486                        isProcessing: false,
487                        loadingOnConfirm: false,
488                        processingTitle: null,
489                        position: 'center',
490                        iconTheme: null,
491                        stacked: false,
492
493                        confirmButtonClass: {
494                            success: 'bg-primary-500',
495                            danger: 'bg-danger-500',
496                            delete: 'bg-danger-500',
497                            warning: 'bg-primary-500',
498                            copy: 'bg-primary-500',
499                        },
500                    });
501                    if (typeof model === 'string') {
502                        self.title = model;
503                    } else if (typeof model === 'object') {
504                        Object.assign(self, model);
505                    }
506                    self.$nextTick(() => {
507                        self.isOpen = true;
508                    });
509                };
510                ui.favorite = function (id, callback) {
511                    axios
512                        .post('/useraction/favoriteevent', {
513                            id,
514                            location: location.pathname,
515                        })
516                        .then(function ({ data }) {
517                            if (data.Message === 'NeedLogin') {
518                                ui.needLoginAlert(function () {
519                                    util.newTab('/account/login?afterAction');
520                                    window._loginCallBack = function () {
521                                        ui.favorite(id, callback);
522                                    };
523                                });
524
525                                return;
526                            }
527                            if (data.IsSuccess) {
528                                if (data.Message === 'Added') {
529                                    ui.alert('관심 행사에 추가 했습니다');
530                                    mixpanel.track('favorite_item', {
531                                        item_id: id,
532                                        item_name: data.EventTitle,
533                                        item_brand: data.Channel,
534                                    });
535                                } else {
536                                    ui.alert('관심 행사에서 삭제했습니다');
537                                }
538                                if (typeof callback === 'function') {
539                                    callback(data.Message === 'Added');
540                                }
541                            }
542                        });
543                };
544                ui.subscribe = function (subdomain, callback) {
545                    axios.post('/useraction/usersubscribe', { subdomain }).then(({ data }) => {
546                        if (data.Message === 'NeedLogin') {
547                            ui.needLoginAlert(function () {
548                                util.newTab('/account/login?afterAction');
549                                window._loginCallBack = function () {
550                                    ui.subscribe(subdomain, callback);
551                                };
552                            });
553
554                            return;
555                        }
556                        if (data.IsSuccess) {
557                            if (data.Message === 'Added') {
558                                mixpanel.track('channel_subscribe', { channel_id: subdomain });
559                                ui.alert({
560                                    title: '채널을 구독했습니다.',
561                                    description: '구독 채널에 새로운 행사가 개설되면 메일로 알려드려요.',
562                                    confirmTheme: 'success',
563                                    confirmTitle: '구독 채널 바로가기',
564                                    closeTitle: '계속 살펴보기',
565                                    onConfirm() {
566                                        location.href = '/mypage/subscriptions';
567                                    },
568                                });
569                                gtag('event', 'channel_subscribe', {
570                                    channel: subdomain,
571                                    items: [
572                                        {
573                                            index: 'channel_subscribe',
574                                        },
575                                    ],
576                                });
577                            } else {
578                                mixpanel.track('channel_subscribe_cancel', { channel_id: subdomain });
579                                ui.alert({
580                                    title: '구독을 취소 했습니다.',
581                                    description:
582                                        '구독 채널에서 삭제했습니다.\n더이상 새로운 행사 알림 메일을 받을 수 없습니다.',
583                                    closeTitle: '확인',
584                                });
585                                gtag('event', 'channel_subscribe_cancel', {
586                                    channel: subdomain,
587                                    items: [
588                                        {
589                                            index: 'channel_subscribe_cancel',
590                                        },
591                                    ],
592                                });
593                            }
594                            if (typeof callback === 'function') {
595                                callback(data.Message === 'Added');
596                            }
597                        }
598                    });
599                };
600                ui.subscribeAlert = function (subdomain, callback) {
601                    axios.post('/useraction/toggleusersubscribealert', { subdomain }).then(({ data }) => {
602                        if (data.Message === 'NeedLogin') {
603                            ui.needLoginAlert(function () {
604                                util.newTab('/account/login?afterAction');
605                                window._loginCallBack = function () {
606                                    ui.subscribeAlert(subdomain, callback);
607                                };
608                            });
609
610                            return;
611                        }
612                        if (data.IsSuccess) {
613                            if (data.Message === 'Added') {
614                                ui.alert({
615                                    title: '채널알람을 설정했습니다.',
616                                    description: '구독 채널에 새로운 행사가 개설되면 메일로 알려드려요.',
617                                    confirmTheme: 'success',
618                                    confirmTitle: '구독 채널 바로가기',
619                                    closeTitle: '계속 살펴보기',
620                                    onConfirm() {
621                                        location.href = '/mypage/subscriptions';
622                                    },
623                                });
624                            } else {
625                                ui.alert({
626                                    title: '채널알람을 해제했습니다.',
627                                    description: '더이상 새로운 행사 알림 메일을 받을 수 없습니다.',
628                                    closeTitle: '확인',
629                                });
630                            }
631                            if (typeof callback === 'function') {
632                                callback(data.Message === 'Added');
633                            }
634                        }
635                    });
636                };
637                ui.needLoginAlert = function (onConfirm) {
638                    ui.alert({
639                        title: '로그인이 필요한 서비스입니다.',
640                        description: '로그인 페이지로 이동하시겠습니까?',
641                        closeTitle: '취소',
642                        onConfirm: onConfirm,
643                    });
644                };
645            },
646        }).mount('#uiAlerts');
647    });
648</script>
648
649    
650
651    <div id="uiToast" class="print:hidden">
652    <ui-transition-root as="template" enter="transition-opacity duration-500" enter-from="opacity-0"
653        enter-to="opacity-100" leave="transition-opacity duration-500" leave-from="opacity-100" leave-to="opacity-0"
654        :show="isOpen">
655        <div class="fixed left-0 right-0 top-0 z-[300] p-4 w-full sm:left-auto" :class="[maxWidthClass]">
656        
657            <div class="flex justify-between p-4 rounded-md border" :class="{
658                'bg-success-50 border-success-300': theme === 'success',
659                'bg-danger-50 border-danger-300': theme === 'danger',
660                'bg-info-50 border-info-300': theme === 'info',
661                'bg-gray-50 border-gray-300' : theme === 'disabled' || !theme
662            }">
663                <div class="flex items-center">
664                    <span class="mr-2.5 text-white">
665                        <template v-if="theme === 'success'">
666                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="w-6 h-6 fill-success-400">
667                                <path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd" />
668                            </svg>
669
670                        </template>
671                        <template v-else-if="theme === 'danger'">
672                            <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
673                                stroke="currentColor" class="w-6 h-6 fill-danger-400">
674                                <path stroke-linecap="round" stroke-linejoin="round"
675                                    d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z" />
676                            </svg>
677                        </template>
678                        <template v-else-if="theme === 'disabled'">
679                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="w-6 h-6 fill-gray-400">
680                                <path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd" />
681                            </svg>
682
683                        </template>
684                        <template v-else>
685                            <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
686                                stroke="currentColor" class="w-6 h-6 fill-info-400">
687                                <path stroke-linecap="round" stroke-linejoin="round"
688                                    d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z" />
689                            </svg>
690                        </template>
691                    </span>
692                    <span class="text-xs">
693                        {{ message }}
694                    </span>
695                </div>
696                <div class="flex items-center">
697                    <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-5 h-5 cursor-pointer text-gray-500 " @click="isOpen = false" >
698                        <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
699                    </svg>
700                </div>
701            </div>
702        </div>
703    </ui-transition-root>
704</div>
705<script>
706    docReady(() => {
707        function getOptions() {
708            return {
709                theme: 'info',
710                maxwidth: 'max-w-sm',
711                message: '',
712                onOpen: null,
713                onClose: null,
714                onLocation: null,
715                duration: 5000,
716            };
717        }
718        ui.createApp({
719            data() {
720                const data = Object.assign(
721                    {
722                        isOpen: false,
723                    },
724                    getOptions(),
725                );
726
727                return data;
728            },
729            computed: {
730                maxWidthClass() {
731                    const maxWidthMap = {
732                        'max-w-xs': 'sm:max-w-xs',
733                        'max-w-sm': 'sm:max-w-sm',
734                        'max-w-md': 'sm:max-w-md',
735                        'max-w-lg': 'sm:max-w-lg',
736                        'max-w-xl': 'sm:max-w-xl',
737                        'max-w-2xl': 'sm:max-w-2xl',
738                    };
739
740                    return maxWidthMap[this.maxwidth] || this.maxwidth;
741                },
742            },
743            mounted() {
744                const self = this;
745                ui.toast = function (model, theme, maxwidth) {
746                    Object.assign(self, getOptions());
747                    if (typeof model === 'object') {
748                        Object.assign(self, model);
749                    } else {
750                        self.message = model;
751                    }
752                    if (theme) {
753                        self.theme = theme;
754                    }
755                    if (maxwidth) {
756                        self.maxwidth = maxwidth;
757                    }
758                    self.$nextTick(() => {
759                        if (typeof self.onOpen === 'function') {
760                            self.onOpen();
761                        }
762                        self.isOpen = true;
763                        setTimeout(() => {
764                            if (typeof self.onClose === 'function') {
765                                self.onClose();
766                            }
767                            self.isOpen = false;
768                        }, self.duration);
769                    });
770                };
771            },
772        }).mount('#uiToast');
773    });
774</script>
774
775      
776<div class="container min-h-screen flex flex-col items-center">
777    <div class="w-full flex-1 flex sm:items-center">
778        <div class="mx-auto w-full py-8">
779            
780
781<style>
782    .g_id_signin iframe {
783        width: 64px !important;
784        height: 44px !important;
785    }
786</style>
787<div id="app">
788    <div class="flex">
789        <div class="mx-auto w-full max-w-sm space-y-8 flex flex-col justify-center text-center">
790            <a class="flex items-center justify-center" href="/">
791                <svg class="w-auto h-10" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56.965 25.467"><g><g transform="translate(28.416 14.918)"><path d="M66.549 33.4v5.987a2.055 2.055 0 0 1-.179.8 1.385 1.385 0 0 1-.447.536 1.3 1.3 0 0 1-.849.268 1.34 1.34 0 0 1-.849-.268 1.385 1.385 0 0 1-.447-.536 2.055 2.055 0 0 1-.179-.8V33.4h1.072v5.987a.67.67 0 0 0 .134.491l.223.089a.313.313 0 0 0 .313-.268.715.715 0 0 0 .045-.268V33.4z" fill="#5c3fbf" transform="translate(-63.6 -33.395)"></path><path d="M77.146 35.4a2.457 2.457 0 0 0-.089-.715c-.089-.223-.179-.357-.357-.357s-.357.313-.357.76a1.7 1.7 0 0 0 .268.8l.581.894a11.573 11.573 0 0 1 .715 1.162 2.591 2.591 0 0 1 .313 1.162 2.368 2.368 0 0 1-.313 1.3 1.608 1.608 0 0 1-2.547-.089 3.217 3.217 0 0 1-.268-1.519l1.072-.089a2.815 2.815 0 0 0 .089.849c.089.223.179.4.447.4s.447-.357.447-.8a1.876 1.876 0 0 0-.268-.8l-.268-.447-.711-1.032a4.289 4.289 0 0 1-.536-1.162 2.011 2.011 0 0 1-.089-.581 2.1 2.1 0 0 1 .313-1.162 1.34 1.34 0 0 1 1.117-.581 1.3 1.3 0 0 1 1.251.67 2.9 2.9 0 0 1 .268 1.34z" fill="#5c3fbf" transform="translate(-69.953 -33.389)"></path></g><path d="M86.562 13.493H53.5V0h33.062zm-31.5-1.564h29.981V1.564H55.064z" fill="#5c3fbf" transform="translate(-29.597)"></path><path d="M25.467 25.467H0V0h25.467z" fill="#5c3fbf"></path><path d="M70.835 40.238H53.5V26.7h17.335zm-15.771-1.564h14.208v-10.41H55.064z" fill="#5c3fbf" transform="translate(-29.597 -14.771)"></path><g transform="translate(28.46 2.993)"><path d="M63.7 6.7h2.5v1.162h-1.383v1.966h1.028v1.206h-1.028v2.055h1.43v1.117H63.7z" fill="#5c3fbf" transform="translate(-63.7 -6.7)"></path><path d="M76.923 6.7H78l-1.162 7.506h-1.121L74.6 6.7h1.072l.536 4.11v.313h.045v-.313z" fill="#5c3fbf" transform="translate(-69.73 -6.7)"></path><path d="M87.9 6.7h2.5v1.162h-1.43v1.966H90v1.206h-1.028v2.055H90.4v1.117h-2.5z" fill="#5c3fbf" transform="translate(-77.088 -6.7)"></path><path d="M100.562 10.319l-.089-.357h-.045v4.244H99.4V6.7h.983l1.072 3.887.089.357h.045V6.7h1.028v7.506h-.983z" fill="#5c3fbf" transform="translate(-83.45 -6.7)"></path><path d="M112.2 7.862V6.7h3.172v1.162h-1.028v6.344h-1.117V7.862z" fill="#5c3fbf" transform="translate(-90.531 -6.7)"></path></g></g><g transform="translate(7.551 6.523)"><path fill="#ffc200" d="M0 0H10.008V2.895H0z"></path><path d="M23.557 28.1H16.9v-2.9h7.193z" fill="#fff" transform="translate(-16.9 -20.464)"></path><path d="M0 0H10.231V2.895H0z" fill="#fff" transform="translate(0 9.472)"></path></g></svg>
792            </a>
793            <div class="text-xl md:text-2xl font-bold">
794                <span v-if="!show2FA && language === 'ko'">다시 만나서 반가워요!</span>
795                <span v-else-if="!show2FA">Great to see you back!</span>
796                <span v-else-if="language === 'ko'">2단계 인증</span>
797                <span v-else>Two-Factor Authentication</span>
798            </div>
799
800            <!-- 로그인 폼 -->
801            <div class="sm:mt-12" v-if="!show2FA">
802                <form @submit.prevent="submit" novalidate>
803                    <input name="__RequestVerificationToken" type="hidden" value="P9B8Y2tGhagOwnoKI14dQh_UhwehvMcei0LqhcZjWUGSe8YvhRbZApghaOweUchRcTKcUUxY5yGG4HYhc-7TrT9vnP41" />
804                    <input name="Sub" type="hidden" hidden />
805                    <input name="AbsolutePath" type="hidden" value="" hidden />
806                    <div class="space-y-6 text-left">
807                        <ev-input id="email" name="Email" type="email" tabindex="1" :invalid="isError" ref="email"
808                                  v-model="email" vaildation required>
809                            <span v-if="language === 'ko'">이메일(ID)</span>
810                            <span v-else>Email(ID)</span>
811                        </ev-input>
812                        <ev-input id="password" name="Password" type="password" tabindex="2" :invalid="isError"
813                                  ref="password" vaildation required>
814                            <span v-if="language === 'ko'">비밀번호</span>
815                            <span v-else>Password</span>
816                        </ev-input>
817                        <div v-show="requireCaptcha" class="flex justify-center">
818                            <div ref="captchaContainer" data-sitekey="6Lf0m7EtAAAAACHOXbjjcmGxDFmbLnuK1I-Um5vq"></div>
819                        </div>
820                        <div class="text-danger-500" v-show="isError">
821                            <span v-if="language === 'ko'">이메일 또는 비밀번호를 확인하세요</span>
822                            <span v-else>Confirm email or password</span>
823                        </div>
824                        <div class="text-danger-500" v-show="isLocked">
825                            <template v-if="lockoutMinutes">
826                                <span v-if="language === 'ko'">로그인 실패가 반복되어 계정이 잠겼습니다. 약 {{ lockoutMinutes }}분 뒤 자동으로 풀립니다. 이메일로 가입한 계정은 <a class="underline" href="/account/forgotpassword" target="_blank">비밀번호 찾기</a>로 비밀번호를 재설정하면 바로 풀립니다.</span>
827                                <span v-else>Too many failed sign-in attempts locked this account. It unlocks automatically in about {{ lockoutMinutes }} minute(s). Email-registered accounts can unlock right away by resetting the password via <a class="underline" href="/account/forgotpassword" target="_blank">Forgot password</a>.</span>
828                            </template>
829                            <template v-else>
830                                <span v-if="language === 'ko'">계정이 잠겨 있어 로그인할 수 없습니다. 고객센터로 문의해 주세요.</span>
831                                <span v-else>This account is locked and cannot sign in. Please contact support.</span>
832                            </template>
833                        </div>
834                        <div>
835                            <div class="flex justify-between">
836                                <ev-checkbox name="RememberMe" v-model="isRemember" tabindex="3">
837                                    <span v-if="language === 'ko'">로그인 유지</span>
838                                    <span v-else>Stay logged in</span>
839                                </ev-checkbox>
840                                <a class="text-primary-500 underline" href="/account/forgotpassword" target="_blank">
841                                    <span v-if="language === 'ko'">비밀번호 찾기</span>
842                                    <span v-else>Forgot Password</span>
843                                </a>
844                            </div>
845                            <div v-show="isRemember">
846                                <div class="mt-1 text-gray-500">
847                                    <span v-if="language === 'ko'">개인정보 보호를 위해 개인 기기에서만 사용하세요</span>
848                                    <span v-else>Use only on personal devices for the protection of personal information.</span>
849                                </div>
850                            </div>
851                        </div>
852                        <div class="relative">
853                            <div v-if="lastLoginMethod === 'eventus'"
854                                 class="pointer-events-none absolute -top-8 left-1/2 z-10 -translate-x-1/2 whitespace-nowrap">
855                                <div class="relative rounded-md bg-primary-500 px-2 py-1 text-xs text-white">
856                                    <span v-if="language === 'ko'">최근 로그인</span><span v-else>Recent</span>
857                                    <span class="absolute -bottom-1 left-1/2 h-2 w-2 -translate-x-1/2 rotate-45 bg-primary-500"></span>
858                                </div>
859                            </div>
860                            <ev-button class="bg-primary-500" type="submit" :disabled="onRequest">
861                                <span v-if="language === 'ko'">로그인</span>
862                                <span v-else>Login</span>
863                            </ev-button>
864                        </div>
865                    </div>
866                </form>
867            </div>
868
869            <!-- 2FA 코드 입력 폼 -->
870            <div class="sm:mt-12" v-if="show2FA">
871                <div class="text-gray-600 mb-6">
872                    <span v-if="language === 'ko'">인증 앱(Google Authenticator, Microsoft Authenticator 등)에서 6자리 코드를 입력해주세요.</span>
873                    <span v-else>Enter the 6-digit code from your authenticator app.</span>
874                </div>
875                <form @submit.prevent="submit2FA" novalidate>
876                    <input name="__RequestVerificationToken" type="hidden" value="rCIaZ2aW-tzp-nMh1K_ZBqqxJRUB2ywTyrphF2yDXM5JPjuq7khLe6n-MjoKx3qmDjFLFNCJyojX8Ti86ISAC1e5o3Y1" />
877                    <div class="space-y-6 text-left">
878                        <ev-input id="twoFactorCode" type="text" tabindex="1" :invalid="is2FAError" ref="twoFactorCode"
879                                  v-model="twoFactorCode" maxlength="6" pattern="[0-9]*" inputmode="numeric"
880                                  autocomplete="one-time-code" vaildation required>
881                            <span v-if="language === 'ko'">인증 코드</span>
882                            <span v-else>
882Authentication Code</span>
883                        </ev-input>
884                        <div class="text-danger-500" v-show="is2FAError">
885                            {{ twoFAErrorMessage }}
886                        </div>
887                        <div>
888                            <ev-checkbox v-model="rememberMachine" tabindex="2">
889                                <span v-if="language === 'ko'">이 기기에서는 다음부터 2단계 인증 생략</span>
890                                <span v-else>Skip 2FA on this device next time</span>
891                            </ev-checkbox>
892                        </div>
893                        <ev-button class="bg-primary-500" type="submit" :disabled="onRequest">
894                            <span v-if="language === 'ko'">확인</span>
895                            <span v-else>Verify</span>
896                        </ev-button>
897                        <ev-button class="bg-white text-gray-500 border-gray-300 hover:bg-gray-50 shadow-none" type="button" @click="cancel2FA">
898                            <span v-if="language === 'ko'">취소</span>
899                            <span v-else>Cancel</span>
900                        </ev-button>
901                    </div>
902                </form>
903            </div>
904
905            <div class="sm:mt-10" v-if="!show2FA">
906                
907
908<div class="text-sm">
909    <span v-if="language === 'ko'">SNS 계정으로 로그인/회원가입</span>
910    <span v-else>Sign in/register with a social media account</span>
911</div>
912<div class="flex flex-row space-x-4 justify-center mt-4">
913
914    <div class="relative flex items-center justify-center">
915        <div v-if="lastLoginMethod === 'google'"
916             class="pointer-events-none absolute -top-9 left-1/2 z-10 -translate-x-1/2 whitespace-nowrap">
917            <div class="relative rounded-md bg-primary-500 px-2 py-1 text-xs text-white">
918                <span v-if="language === 'ko'">최근 로그인</span><span v-else>Recent</span>
919                <span class="absolute -bottom-1 left-1/2 h-2 w-2 -translate-x-1/2 rotate-45 bg-primary-500"></span>
920            </div>
921        </div>
922        <ev-button data-login-method="google" class="h-12 w-12 p-0 rounded-full flex items-center justify-center border border-gray-200" onclick="googleLogin()">
923            <svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" viewBox="10 10 20 20">
924                <g>
925                    <path d="M29.6 20.227a11.49 11.49 0 0 0-.182-2.045H20v3.868h5.382a4.6 4.6 0 0 1-2 3.018v2.509h3.232a9.753 9.753 0 0 0 2.986-7.35z" style="fill:#4285f4"/>
926                    <path d="M20 30a9.547 9.547 0 0 0 6.618-2.423l-3.232-2.509A6.033 6.033 0 0 1 14.4 21.9h-3.336v2.591A10 10 0 0 0 20 30z" style="fill:#34a853"/>
927                    <path d="M14.4 21.9a5.913 5.913 0 0 1 0-3.8v-2.591h-3.336a10.013 10.013 0 0 0 0 8.982z" style="fill:#fbbc04"/>
928                    <path d="M20 13.977a5.4 5.4 0 0 1 3.823 1.5l2.868-2.877A9.611 9.611 0 0 0 20 10a10 10 0 0 0-8.936 5.509L14.4 18.1a5.96 5.96 0 0 1 5.6-4.123z" style="fill:#e94235"/>
929                </g>
930            </svg>
931            <span class="sr-only">
932                <span v-if="language === 'ko'">구글 로그인</span>
933                <span v-else>Google Login</span>
934            </span>
935        </ev-button>
936    </div>
937
938    <div class="relative flex items-center justify-center">
939        <div v-if="lastLoginMethod === 'naver'"
940             class="pointer-events-none absolute -top-9 left-1/2 z-10 -translate-x-1/2 whitespace-nowrap">
941            <div class="relative rounded-md bg-primary-500 px-2 py-1 text-xs text-white">
942                <span v-if="language === 'ko'">최근 로그인</span><span v-else>Recent</span>
943                <span class="absolute -bottom-1 left-1/2 h-2 w-2 -translate-x-1/2 rotate-45 bg-primary-500"></span>
944            </div>
945        </div>
946        <ev-button data-login-method="naver" class="bg-[#03c75a] rounded-full h-12 w-12 p-0 border-none flex items-center justify-center" onclick="naverLogin()">
947            <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" data-name="그룹 8392" width="21" height="18" viewBox="0 0 21 18">
948                <path data-name="사각형 5227" d="M0 0h21v18H0z" style="fill:none"/>
949                <path data-name="패스 5638" d="m170.744 255.583-5.837-8.385h-4.839v15.668h5.069v-8.385l5.837 8.385h4.839V247.2h-5.069z" transform="translate(-157.569 -246.197)" style="fill:#fff"/>
950            </svg>
951            <span class="sr-only">
952                <span v-if="language === 'ko'">네이버 로그인</span>
953                <span v-else>Naver Login</span>
954            </span>
955        </ev-button>
956    </div>
957
958    <div class="relative flex items-center justify-center">
959        <div v-if="lastLoginMethod === 'kakao'"
960             class="pointer-events-none absolute -top-9 left-1/2 z-10 -translate-x-1/2 whitespace-nowrap">
961            <div class="relative rounded-md bg-primary-500 px-2 py-1 text-xs text-white">
962                <span v-if="language === 'ko'">최근 로그인</span><span v-else>Recent</span>
963                <span class="absolute -bottom-1 left-1/2 h-2 w-2 -translate-x-1/2 rotate-45 bg-primary-500"></span>
964            </div>
965        </div>
966        <ev-button data-login-method="kakao" class="bg-[#fee500] rounded-full h-12 w-12 p-0 border-none flex items-center justify-center" onclick="kakaoLogin()">
967            <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" data-name="그룹 8392" width="21" height="18" viewBox="0 0 21 18">
968                <path data-name="패스 5635" d="M10.538 1.713c4.418 0 8 2.91 8 6.5s-3.582 6.5-8 6.5a9.7 9.7 0 0 1-2.094-.234c-.389-.08-2.992 1.618-3.548 1.4-.392-.152 1.153-2.274.66-2.581a6.08 6.08 0 0 1-3.018-5.085c0-3.59 3.582-6.5 8-6.5z"/>
969                <path data-name="사각형 5227" d="M0 0h21v18H0z" style="fill:none"/>
970            </svg>
971            <span class="sr-only">
972                <span v-if="language === 'ko'">카카오 로그인</span>
973                <span v-else>Kakao Login</span>
974            </span>
975        </ev-button>
976    </div>
977</div>
978
979<!--Google One-Tap-->
980<div id="g_id_onload"
981        style="display:none;"
982        data-client_id="985112695392-lbq9d35mgi0goivepmhmfou4poccfdjs.apps.googleusercontent.com"
983        data-context="signin"
984        data-ux_mode="popup"
985        data-login_uri="https://event-us.kr/account/GoogleSdkLoginCallback"
986        data-use_fedcm_for_prompt="true"
987        data-itp_support="true">
988</div>
989<!--End of Google One-Tap-->
990
991            </div>
992
993            <div class="flex flex-col space-y-6" v-if="!show2FA">
994                <ev-button class="bg-white text-primary-500 outline-primary-500 border-primary-500 hover:bg-primary-50 shadow-none" href="/account/usersignup">
995                    <span v-if="language === 'ko'">회원가입</span>
996                    <span v-else>Sign up</span>
997                </ev-button>
998                <div class="flex items-center">
999                    <div class="border-t flex-1"></div>
1000                </div>
1001                <div class="text-center">
1002                    <a class="text-gray-500 text-sm" href="/account/nonmemberconfirm">
1003                        <span v-if="language === 'ko'">비회원 신청조회 &gt;</span>
1004                        <span v-else>Check applications as guest &gt;</span>
1005                    </a>
1006                </div>
1007            </div>
1008        </div>
1009    </div>
1010</div>
1011
1012
1013        </div>
1014    </div>
1015    <div class="w-full">
1016        
1017    </div>
1018</div>
1019
1020  
1021     
1022    
1023    
1023<script>/* global Kakao */
1024    // eslint-disable-next-line no-unused-vars
1025    function kakaoLogin() {
1026        Kakao.Auth.login({
1027            success: function (authObj) {
1028                mixpanel.track("login", { "method": "kakao" });
1029                location.href =
1030                    `/Account/Kakao?AccessTokren=${authObj.access_token}&ReturnUrl=` +
1031                    encodeURIComponent('?ReturnUrl=%2Fmypage%2FFavoriteEvent');
1032            },
1033            fail: function (err) {
1034                alert(JSON.stringify(err));
1035            },
1036        });
1037    }
1038</script>
1038
1039    
1039<script>
1040    function naverLogin() { // eslint-disable-line
1041        mixpanel.track("login", { "method": "naver" });
1042        const createA = document.createElement('a');
1043        createA.setAttribute('href', 'https://nid.naver.com/oauth2.0/authorize?response_type=code&amp;client_id=RvwOc7rJXusOU6HMP_3N&amp;redirect_uri=https://event-us.kr/account/naversignin&amp;state=56395038');
1044        createA.click();
1045    }
1046</script>
1046
1047    
1048
1049<script>
1050    function googleLogin() {
1051        if (exitInAppBrowser().isExit) {
1052            return;
1053        }
1054
1055        const url = 'https://accounts.google.com/o/oauth2/v2/auth' +
1056            '?client_id=985112695392-lbq9d35mgi0goivepmhmfou4poccfdjs.apps.googleusercontent.com' +
1057            '&redirect_uri=https://event-us.kr/account/GoogleOAuthLoginCallback' +
1058            '&response_type=code' +
1059            '&state=b06157fc49cc489390e5aa8213f50080' +
1060            '&scope=https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile' +
1061            '&access_type=offline';
1062
1063        location.href = url;
1064    }
1065
1066    function exitInAppBrowser() {
1067        var useragt = navigator.userAgent.toLowerCase();
1068        var target_url = location.href;
1069        if (useragt.match(/kakaotalk/i)) {
1070            //카카오톡 외부브라우저로 호출
1071            location.href = 'kakaotalk://web/openExternal?url=' + encodeURIComponent(target_url);
1072            return { isExit: true };
1073        } else if (useragt.match(/line/i)) {
1074            //라인 외부브라우저로 호출
1075            if (target_url.indexOf('?') !== -1) {
1076                location.href = target_url + '&openExternalBrowser=1';
1077            } else {
1078                location.href = target_url + '?openExternalBrowser=1';
1079            }
1080            return { isExit: true };
1081        } else if (useragt.match(/inapp|naver|snapchat|wirtschaftswoche|thunderbird|instagram|everytimeapp|whatsApp|electron|wadiz|aliapp|zumapp|iphone(.*)whale|kakaostory|band|twitter|DaumApps|DaumDevice\/mobile|FB_IAB|FB4A|FBAN|FBIOS|FBSS|trill\/[^1]/i)) {
1082            //그외 다른 인앱들
1083            if (useragt.match(/iphone|ipad|ipod/i)) {
1084                //아이폰은 강제로 사파리를 실행할 수 없음... 에러가 뜨겠지만 그냥 놔둔다.
1085                return { isExit: false };
1086            } else {
1087                //안드로이드는 Chrome이 설치되어 있으므로 강제로 스킴실행한다.
1088                location.href = 'intent://' + target_url.replace(/https?:\/\//i, '') + '#Intent;scheme=https;package=com.android.chrome;end';
1089                return { isExit: true };
1090            }
1091        }
1092
1093        return { isExit: false };
1094    }
1095</script>
1095
1096
1097    
1097<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
1097
1098    
1098<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/sha256.js"></script>
1098
1099    
1099<script src="https://accounts.google.com/gsi/client" async></script>
1099
1100    
1100<script>
1101/* global CryptoJS */
1102const App = {
1103    data() {
1104        return {
1105            email: '',
1106            onRequest: false,
1107            isRemember: false,
1108            lastLoginMethod: '',
1109            isError: false,
1110            isLocked: false,
1111            lockoutMinutes: null,
1112            requireCaptcha: false,
1113            captchaWidgetId: null,
1114            captchaScriptRequested: false,
1115            language: 'ko',
1116            // 2FA 관련 상태
1117            show2FA: false,
1118            twoFactorCode: '',
1119            is2FAError: false,
1120            twoFAErrorMessage: '',
1121            rememberMachine: false,
1122            twoFAReturnUrl: '/',
1123        };
1124    },
1125    watch: {
1126        show2FA(value) {
1127            // 로그인 폼이 v-if로 제거되면 기존 위젯도 폐기된다.
1128            if (value) {
1129                this.captchaWidgetId = null;
1130            } else if (this.requireCaptcha) {
1131                this.showCaptcha();
1132            }
1133        },
1134    },
1135    methods: {
1136        showCaptcha() {
1137            this.requireCaptcha = true;
1138            this.$nextTick(() => {
1139                if (window.grecaptcha?.enterprise?.render) {
1140                    this.renderCaptcha();
1141                } else if (!this.captchaScriptRequested) {
1142                    this.captchaScriptRequested = true;
1143                    window.onLoginRecaptchaLoaded = () => this.renderCaptcha();
1144                    const script = document.createElement('script');
1145                    const language = this.language === 'ko' ? 'ko' : 'en';
1146                    script.src = 'https://www.google.com/recaptcha/enterprise.js?render=explicit&onload=onLoginRecaptchaLoaded&hl=' + language;
1147                    script.async = true;
1148                    script.defer = true;
1149                    // 로드 실패(일시 네트워크 장애)면 다음 showCaptcha 에서 다시 시도한다 — 아니면 새로고침 전까지 위젯이 영영 비어 있다.
1150                    script.onerror = () => {
1151                        this.captchaScriptRequested = false;
1152                        script.remove();
1153                    };
1154                    document.head.appendChild(script);
1155                }
1156            });
1157        },
1158        renderCaptcha() {
1159            const container = this.$refs.captchaContainer;
1160            if (!container || this.captchaWidgetId !== null) return;
1161            this.captchaWidgetId = grecaptcha.enterprise.render(container, {
1162                sitekey: container.dataset.sitekey,
1163                action: 'LOGIN',
1164            });
1165        },
1166        resetCaptcha() {
1167            if (this.captchaWidgetId !== null) {
1168                grecaptcha.enterprise.reset(this.captchaWidgetId);
1169            }
1170        },
1171        submit(event) {
1172            const self = this;
1173            if (self.isError) {
1174                self.isError = false;
1175            }
1176            self.isLocked = false;
1177            if (self.onRequest || ui.checkInvalidRefs(self, ['email', 'password'])) {
1178                return;
1179            }
1180            self.onRequest = true;
1181            let runCallback = false;
1182            axios
1183                .post('/account/login', new FormData(event.target))
1184                .then((response) => {
1185                    switch (response.data.Success) {
1186                        case 'OK':
1187                            self.handleLoginSuccess(response.data, runCallback);
1188                            break;
1189                        case '2FA':
1190                            // 2단계 인증 필요 - 2FA 입력 폼 표시
1191                            self.show2FA = true;
1192                            self.twoFAReturnUrl = response.data.returnUrl || '/';
1193                            self.onRequest = false;
1194                            self.$nextTick(() => {
1195                                if (self.$refs.twoFactorCode) {
1196                                    self.$refs.twoFactorCode.$el?.querySelector('input')?.focus();
1197                                }
1198                            });
1199                            break;
1200                        case 'LOCKED':
1201                            self.resetCaptcha();
1202                            // 실패 누적 잠금 — 비밀번호가 맞아도 잠금이 풀릴 때까지 들어올 수 없다. 자동 잠금이면 남은 분이 온다(운영 잠금은 null).
1203                            self.lockoutMinutes = response.data.RetryAfterMinutes || null;
1204                            self.isLocked = true;
1205                            self.onRequest = false;
1206                            break;
1207                        case 'CAPTCHA':
1208                            self.resetCaptcha();
1209                            self.showCaptcha();
1210                            self.onRequest = false;
1211                            break;
1212                        case 'ERROR':
1213                            self.resetCaptcha();
1214                            self.isError = true;
1215                            self.onRequest = false;
1216                            break;
1217                        case 'NOT':
1218                        default:
1219                            self.resetCaptcha();
1220                            if (response.data.RequireCaptcha) self.showCaptcha();
1221                            else self.requireCaptcha = false; // 다른 계정으로 바꿔 3회 미만이면 위젯·안내를 내린다
1222                            setTimeout(() => {
1223                                self.isError = true;
1224                                self.onRequest = false;
1225                            }, 300);
1226                            break;
1227                    }
1228                })
1229                .catch(() => {
1230                    self.resetCaptcha();
1231                    self.isError = true;
1232                    self.onRequest = false;
1233                });
1234        },
1235        submit2FA() {
1236            const self = this;
1237            if (self.is2FAError) {
1238                self.is2FAError = false;
1239            }
1240            if (self.onRequest || !self.twoFactorCode || self.twoFactorCode.length < 6) {
1241                self.is2FAError = true;
1242                self.twoFAErrorMessage = self.language === 'ko' ? '6자리 코드를 입력해주세요.' : 'Please enter a 6-digit code.';
1243                return;
1244            }
1245            self.onRequest = true;
1246            // antiforgery 검증(서버 [ValidateAntiForgeryToken])은 폼 필드의 토큰만 읽으므로 JSON 대신 FormData로 보낸다.
1247            // 로그인 폼은 v-if로 DOM에서 제거되므로 토큰은 2FA 폼 안의 렌더에서 읽는다(#772 회귀).
1248            const tokenInput = document.querySelector('input[name="__RequestVerificationToken"]');
1249            if (!tokenInput) {
1250                self.is2FAError = true;
1251                self.twoFAErrorMessage = self.language === 'ko' ? '보안 토큰을 찾을 수 없습니다. 페이지를 새로고침한 뒤 다시 시도해주세요.' : 'Security token missing. Please refresh the page and try again.';
1252                self.onRequest = false;
1253                return;
1254            }
1255            const fd = new FormData();
1256            fd.append('__RequestVerificationToken', tokenInput.value);
1257            fd.append('code', self.twoFactorCode);
1258            fd.append('returnUrl', self.twoFAReturnUrl || '/');
1259            fd.append('rememberMe', self.isRemember);
1260            fd.append('rememberMachine', self.rememberMachine);
1261            axios
1262                .post('/account/verifyAuthenticatorCode', fd)
1263                .then((response) => {
1264                    if (response.data.Success) {
1265                        self.handleLoginSuccess(response.data, false);
1266                    } else {
1267                        self.is2FAError = true;
1268                        self.twoFAErrorMessage = response.data.Error || (self.language === 'ko' ? '인증에 실패했습니다.' : 'Authentication failed.');
1269                        self.onRequest = false;
1270                    }
1271                })
1272                .catch(() => {
1273                    self.is2FAError = true;
1274                    self.twoFAErrorMessage = self.language === 'ko' ? '에러가 발생했습니다.' : 'An error occurred.';
1275                    self.onRequest = false;
1276                });
1277        },
1278        cancel2FA() {
1279            this.show2FA = false;
1280            this.twoFactorCode = '';
1281            this.is2FAError = false;
1282            this.twoFAErrorMessage = '';
1283            this.rememberMachine = false;
1284        },
1285        handleLoginSuccess(data, runCallback) {
1286            const self = this;
1287            try { localStorage.setItem('eventus_last_login_method', 'eventus'); } catch (e) { /* ignore */ }
1288            window.util.checkUserDeviceMapping(data.UserId);
1289            mixpanel.identify(data.Email);
1290            gtag('set', 'user_properties', {
1291                crm_id: data.UserId,
1292            });
1293            gtag('event', 'login', {
1294                method: 'eventus',
1295            });
1296            mixpanel.track("login", { "method": "eventus" });
1297            mixpanel.people.set('mail_confirm', data.EmailConfirmed);
1298            dataLayer.push({
1299                event: 'login',
1300                eventCategory: '로그인',
1301                eventAction: '버튼클릭',
1302                eventLable: '로그인버튼클릭',
1303                eventCallback: function () {
1304                    if (runCallback) {
1305                        return;
1306                    } else {
1307                        runCallback = true;
1308                    }
1309                    if (location.search.indexOf('afterAction') !== -1) {
1310                        if (typeof window.opener._loginCallBack === 'function') {
1311                            window.opener._loginCallBack();
1312                        }
1313                        window.close();
1314                        return;
1315                    }
1316
1317                    if (data.IsApp) {
1318                        location.href = `/${data.subdomain}/ps?ver=new&eventType=${data.eventType}`;
1319                    } else if (data.IsApp === false) {
1320                        axios
1321                            .post('/app/create', {
1322                                value: 'eventus',
1323                                title: 'eventus',
1324                                where: 'Empty',
1325                            })
1326                            .then((response) => {
1327                                if (response.data.success) {
1328                                    location.href = `/${response.data.channel}
1328/ps?ver=new&eventType=${response.data.eventType}`;
1329                                }
1330                            });
1331                    } else {
1332                        let url = data.url.replace(
1333                            /&email=([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/,
1334                            '',
1335                        );
1336                        if (!url.includes('?')) {
1337                            url = url.replace('&', '?');
1338                        }
1339                        url = url.replace(/groupid=g/gi, 'groupid=G').replace(/&amp%3bGroupNum/gi,'&GroupNum');
1340                        location.replace(url.replace(/%2F/gi, '/'));
1341                    }
1342                },
1343            });
1344        },
1345    },
1346    created() {
1347        document.addEventListener('languageChanged', (e) => {
1348            this.language = e.detail.language;
1349        });
1350    },
1351    mounted() {
1352        const self = this;
1353        try { self.lastLoginMethod = localStorage.getItem('eventus_last_login_method') || ''; } catch (e) { /* ignore */ }
1354        document.addEventListener('click', (e) => {
1355            const el = e.target.closest && e.target.closest('[data-login-method]');
1356            if (el) {
1357                try { localStorage.setItem('eventus_last_login_method', el.getAttribute('data-login-method')); } catch (e2) { /* ignore */ }
1358            }
1359        });
1360        const urlParams = new URLSearchParams(window.location.search);
1361        const emailParam = urlParams.get('eventusEmail')?.replace(/ /gi, '+');
1362        if (emailParam) {
1363            const decrypted = CryptoJS.AES.decrypt(emailParam, 'ApplicantLogin');
1364            const text = decrypted.toString(CryptoJS.enc.Utf8);
1365            self.email = text;
1366        }
1367    },
1368};
1369
1370docReady(() => {
1371    ui.createApp(App).mount('#app');
1372    mixpanel.track("login_view", {"method": "eventus"});
1373
1374    // 소셜 가입이 서브 이메일 충돌로 막혀 되돌아온 경우에만 사유를 알린다.
1375    // 사유 없이 로그인 화면에 떨어지면 같은 소셜 버튼을 다시 눌러 제자리로 돌아온다.
1376    const socialSignupError = "";
1377    if (socialSignupError) {
1378        ui.alert({ title: socialSignupError, confirmTheme: 'danger', hideConfirmButton: true });
1379    }
1380});
1381    </script>
1381
1382
1383 
1384    
1385<!--구글번역 코드-->
1386<div id="google_translate_element_applicant" style="display:none;">
1387</div>
1388
1389<script>
1390    function appendGoogleTranslateScript() {
1391        const script = document.createElement('script');
1392        script.src = '//translate.google.com/translate_a/element.js?cb=googleTranslateInit';
1393        document.head.appendChild(script);
1394    }
1395
1396    window.setLanguage = function setLanguage(language) {
1397        // Google 번역 trigger
1398        const selectbox = document.querySelector('.goog-te-combo');
1399        selectbox.value = language;
1400        selectbox.dispatchEvent(new Event('change'));
1401        
1402        // 이벤트 dispatch 시 쿠키가 없거나 잘못 설정되는 케이스 방지
1403        const interval = setInterval(() => {
1404            const langCookie = getLangCookie();
1405            if (langCookie !== language) {
1406                selectbox.value = language;
1407                selectbox.dispatchEvent(new Event('change'));
1408            } else {
1409                clearInterval(interval);
1410            }
1411        }, 100);
1412
1413        // 이벤트 발행
1414        const event = new CustomEvent('languageChanged', {
1415            detail: {
1416                language: language,
1417            },
1418        });
1419        document.dispatchEvent(event);
1420    }
1421
1422    window.googleTranslateInit = function googleTranslateInit() {
1423        new google.translate.TranslateElement(
1424            {
1425                pageLanguage: 'ko',
1426                includedLanguages: 'ko,en',
1427                autoDisplay: false,
1428            },
1429            'google_translate_element_applicant',
1430        );
1431
1432        // Google 번역 로드 확인 후 언어값 설정
1433        const interval = setInterval(() => {
1434            if (document.querySelector('.goog-te-combo')?.children?.length > 0) {
1435                clearInterval(interval);
1436
1437                const language = getLangCookie(); // 쿠키 우선
1438                if (language) {
1439                    setLanguage(language);
1440                } else {
1441                    // Global 행사 && 브라우저 언어가 외국어면 자동 번역
1442                    if ('False' === 'True' && !window.navigator.language.includes('ko')) {
1443                        setLanguage('en');
1444                    }
1445                }
1446            }
1447        }, 100);
1448
1449        const googleTranslateIframeStyle = document.createElement('style');
1450        googleTranslateIframeStyle.innerHTML = `
1451                    .skiptranslate {
1452                        display: none !important;
1453                    }
1454                    html > body {
1455                        top: 0 !important;
1456                    }
1457                `;
1458        document.head.appendChild(googleTranslateIframeStyle);
1459    }
1460
1461    function getLangCookie() {
1462        const gtCookie = getCookie('googtrans');
1463        if (gtCookie) {
1464            const lang = gtCookie.split('/')[2].split('-')[0];
1465            return lang;
1466        }
1467        return null;
1468    }
1469
1470    function getCookie(name) {
1471        const nameEQ = name + "=";
1472        const ca = document.cookie.split(';');
1473        for (let i = 0; i < ca.length; i++) {
1474            let c = ca[i];
1475            while (c.charAt(0) === ' ') c = c.substring(1, c.length);
1476            if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
1477        }
1478        return null;
1479    }
1480
1481    function setCookie(name, value, days) {
1482        let expires = "";
1483        if (days) {
1484            const intDays = parseInt(days);
1485            if (isNaN(intDays)) {
1486                throw new Error('매개변수가 잘못되었습니다. days는 숫자여야 합니다.')
1487            }
1488            const date = new Date();
1489            date.setTime(date.getTime() + (intDays * 24 * 60 * 60 * 1000));
1490            expires = "; expires=" + date.toUTCString();
1491        }
1492        document.cookie = name + "=" + (value || "") + expires + "; path=/";
1493    }
1494
1495    // 뒤로가기 시 Google 번역이 사라지는 현상 방지
1496    window.addEventListener('pageshow', (e) => {
1497        if (e.persisted && !document.querySelector('.goog-te-combo')) {
1498            appendGoogleTranslateScript();
1499        }
1500    });
1501
1502    window.getLangCookie = getLangCookie;
1503
1504    appendGoogleTranslateScript();
1505</script>
1505
1506<!--구글번역 코드 끝-->
1507
1508    
1508<script src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js"
1509            integrity="sha512-CNgIRecGo7nphbeZ04Sc13ka07paqdeTu0WR1IM4kNcpmBAUSHSQX0FslNhTDadL4O5SAGapGt4FodqL8My0mA=="
1510            crossorigin="anonymous" referrerpolicy="no-referrer"></script>
1510
1511    
1511<script src="/Content/neweventus/lib/html2/1.3.2/html2canvas.min.js"></script>
1511
1512    
1512<script src="//developers.kakao.com/sdk/js/kakao.min.js"></script>
1512
1513
1514    
1514<script>
1515        // SDK
1516        Kakao.init('2b4978da5d2625e633561e5eacc9be14');
1517        window.fbAsyncInit = function () {
1518            FB.init({
1519                appId: '136314230510204',
1520                autoLogAppEvents: true,
1521                xfbml: true,
1522                version: 'v3.2',
1523            });
1524        };
1525        (function (d, s, id) {
1526            const fjs = d.getElementsByTagName(s)[0];
1527            if (d.getElementById(id)) {
1528                return;
1529            }
1530            const js = d.createElement(s);
1531            js.id = id;
1532            js.src = 'https://connect.facebook.net/en_US/sdk.js';
1533            fjs.parentNode.insertBefore(js, fjs);
1534        })(document, 'script', 'facebook-jssdk');
1535        //facebook Analytics
1536        (function (f, b, e, v, n, t, s) {
1537            if (f.fbq) return; n = f.fbq = function () {
1538                n.callMethod ?
1539                    n.callMethod.apply(n, arguments) : n.queue.push(arguments)
1540            };
1541            if (!f._fbq) f._fbq = n; n.push = n; n.loaded = !0; n.version = '2.0';
1542            n.queue = []; t = b.createElement(e); t.async = !0;
1543            t.src = v; s = b.getElementsByTagName(e)[0];
1544            s.parentNode.insertBefore(t, s)
1545        })(window, document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');
1546    </script>
1546
1547
1548    
1548<script type="text/javascript" src="https://wcs.naver.net/wcslog.js"></script>
1548
1549
1550
1551     
1552    
1552<script>
1553        //네이버 analytics
1554        if (!wcs_add) var wcs_add = {};
1555        wcs_add["wa"] = "s_239ba85b9cf2";
1556        if (!_nasa) var _nasa = {};
1557        if (window.wcs) {
1558            wcs.inflow("event-us.kr");
1559            wcs_do(_nasa);
1560        }
1561    </script>
1561
1562    
1562<script>
1563        function getQueryParam(url, param) {
1564            // Expects a raw URL
1565            param = param.replace(/[[]/, "\[").replace(/[]]/, "\]");
1566
1567            var regexS = "[\?&]" + param + "=([^&#]*)",
1568                regex = new RegExp(regexS),
1569                results = regex.exec(url);
1570
1571            if (results === null || (results && typeof (results[1]) !== 'string' && results[1].length)) {
1572                return '';
1573            } else {
1574                return decodeURIComponent(results[1]).replace(/\W/gi, ' ');
1575            }
1576        };
1577
1578        function campaignParams() {
1579
1580            // campaign_keywords sets the UTM tags to parse for
1581            var campaign_keywords = 'utm_source utm_medium utm_campaign utm_content utm_term'.split(' ')
1582                , kw = ''
1583                , last_params = {}
1584                , first_params = {};
1585
1586            var index;
1587
1588            //save UTM tags parsed from the URL as a key-value pair
1589            //used to set last-touch UTM properties
1590            for (index = 0;
1590 index < campaign_keywords.length; ++index) {
1591                kw = getQueryParam(document.URL, campaign_keywords[index]);
1592                if (kw.length) {
1593                    last_params[campaign_keywords[index] + ' [last touch]'] = kw;
1594                }
1595            }
1596
1597            //save UTM tags parsed from the URL as a key-value pair
1598            //used to set first-touch UTM properties
1599            for (index = 0; index < campaign_keywords.length; ++index) {
1600                kw = getQueryParam(document.URL, campaign_keywords[index]);
1601                if (kw.length) {
1602                    first_params[campaign_keywords[index] + ' [first touch]'] = kw;
1603                }
1604            }
1605
1606            //set last-touch UTM tags as profile properties
1607            mixpanel.people.set(last_params);
1608            //update last-touch UTM super property with the latest value
1609            mixpanel.register(last_params);
1610
1611            //set first-touch UTM tag as profile property
1612            //will be skipped if the property is already present
1613            mixpanel.people.set_once(first_params);
1614
1615        }
1616
1617        window.onload = function () {
1618            if (typeof mixpanel !== 'undefined') {
1619                campaignParams();
1620            } else {
1621                console.error('Mixpanel is not initialized yet. Retrying...');
1622
1623                // Retry 로직 추가 (최대 5회 시도, 1초 간격)
1624                let attempts = 0;
1625                const maxAttempts = 5;
1626                const interval = setInterval(() => {
1627                    if (typeof mixpanel !== 'undefined') {
1628                        clearInterval(interval);
1629                        console.log('Mixpanel initialized. Executing campaignParams...');
1630                        campaignParams();
1631                    } else if (++attempts >= maxAttempts) {
1632                        clearInterval(interval);
1633                        console.error('Mixpanel initialization failed after maximum attempts.');
1634                    }
1635                }, 1000);
1636            }
1637        };
1638    </script>
1638
1639</body>
1640</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.