(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,53507,(e,t,r)=>{t.exports={hashes:["8ad72d00486d4a0a4edf0d8c40375ef4e01c54f50271693ba8b921899b84f2ca"]}},63398,93527,24573,88922,e=>{"use strict";var t=e.i(47167),r=e.i(43476),n=e.i(71645),i=e.i(53507),o=e.i(22677),a=e.i(61056),s=e.i(88558),u=e.i(82568),l=e.i(87451);let d="ab_group_bible_mock_store_v1",c="https://jwhhboergk.execute-api.ap-northeast-2.amazonaws.com/Prod".replace(/\/$/,"")??"";class p extends Error{code;statusCode;constructor(e,t){super(e),this.name="GroupApiError",this.code=t?.code,this.statusCode=t?.statusCode}}function m(e){return e.filter(e=>"pending"!==e.membershipStatus&&"removed"!==e.membershipStatus&&"left"!==e.membershipStatus).length}function g(){return new Date().toISOString()}function h(e,t){if(!e)return t;try{return JSON.parse(e)}catch{return t}}function f(e){if("u"0)return t.posts||(t.posts={}),t;let r={groups:{grp_demo_youth:{group:{groupId:"grp_demo_youth",name:"청년부 그룹성경",description:"주중 통독과 필사를 함께 점검하는 데모 그룹입니다.",groupType:"church",joinPolicy:"approval",memberCount:4,myRole:"owner",defaultInviteCode:"YOUTH26",status:"active",createdAt:e=g(),updatedAt:e,readingPlan:{planId:"plan_demo_001",title:"이번 주 읽기 플랜",ranges:[{book:"Genesis",startChapter:1,endChapter:3},{book:"Matthew",startChapter:1,endChapter:2}],startDate:"2026-05-11",endDate:"2026-05-17",createdBy:"leader@example.com",createdAt:e}},members:[{userEmail:"leader@example.com",displayName:"Leader",role:"owner",joinedAt:e,membershipStatus:"active",lastActivityAt:e,readingContribution:154,writingContribution:81},{userEmail:"anna@example.com",displayName:"Anna",role:"admin",joinedAt:e,membershipStatus:"active",lastActivityAt:e,readingContribution:133,writingContribution:45},{userEmail:"paul@example.com",displayName:"Paul",role:"member",joinedAt:e,membershipStatus:"active",lastActivityAt:e,readingContribution:92,writingContribution:13},{userEmail:"mira@example.com",displayName:"Mira",role:"member",joinedAt:e,membershipStatus:"active",lastActivityAt:e,readingContribution:47,writingContribution:22},{userEmail:"wonjin@example.com",displayName:"Wonjin",role:"member",joinedAt:e,membershipStatus:"pending",lastActivityAt:e,readingContribution:0,writingContribution:0}]},grp_demo_typing:{group:{groupId:"grp_demo_typing",name:"소그룹 필사반",description:"주일 전까지 함께 필사 진도를 맞추는 소규모 그룹입니다.",groupType:"small_group",memberCount:3,myRole:"member",defaultInviteCode:"TYPE03",status:"active",createdAt:e,updatedAt:e},members:[{userEmail:"sarah@example.com",displayName:"Sarah",role:"owner",joinedAt:e,membershipStatus:"active",lastActivityAt:e,readingContribution:66,writingContribution:110},{userEmail:"leader@example.com",displayName:"Leader",role:"member",joinedAt:e,membershipStatus:"active",lastActivityAt:e,readingContribution:21,writingContribution:76},{userEmail:"noah@example.com",displayName:"Noah",role:"member",joinedAt:e,membershipStatus:"active",lastActivityAt:e,readingContribution:14,writingContribution:38}]}},posts:{}};return window.localStorage.setItem(d,JSON.stringify(r)),r}function k(e){window.localStorage.setItem(d,JSON.stringify(e))}function C(){return w()||"leader@example.com"}function E(){let e=w();if(!e)throw Error("로그인 정보를 확인하지 못했습니다. 다시 로그인한 뒤 시도해 주세요.");return e}function A(e,t=v()){let r=t.groups[e];if(!r)throw Error("그룹을 찾을 수 없습니다.");return r}function S(e,t){let r=e.members.find(e=>e.userEmail===t);if(!r)throw Error("이 그룹에 접근할 권한이 없습니다.");return r}function I(e){if(!e)return!1;let t=Date.parse(e);return!Number.isNaN(t)&&t>=Date.now()-6048e5}async function T(e,t){await (0,o.waitForSessionToken)();let r=(0,o.getSessionToken)();return{...t||{},...r?{Authorization:`Bearer ${r}`}:{}}}async function N(e,t){let r=await fetch(`${c}${e}`,t),n=await r.text(),i=n?h(n,null):null;if(!r.ok||i?.ok===!1){let e=i&&"object"==typeof i?i.error:void 0;throw new p(e?.message||`Request failed (${r.status})`,{code:e?.code,statusCode:r.status})}return i?.data??{}}function O(){return!!c}function R(e){return(0,l.withStaticHtmlPath)(e)}function P(e,t){return R(`/groups/join?groupId=${encodeURIComponent(e)}&inviteCode=${encodeURIComponent(t)}`)}async function x(){if(O()){let e=E();return{source:"api",groups:(await N("/groups/my",{headers:await T(e)})).groups}}y();let e=C(),t=v(),r=Date.now()-6048e5;return{source:"mock",groups:Object.values(t.groups).filter(t=>t.members.some(t=>t.userEmail===e)).map(t=>{let n=t.members.find(t=>t.userEmail===e),i=t.members.filter(e=>{if("active"!==e.membershipStatus&&void 0!==e.membershipStatus)return!1;let t=Date.parse(e.joinedAt);return!Number.isNaN(t)&&t>=r}).length,o=t.members.filter(e=>{if("active"!==e.membershipStatus&&void 0!==e.membershipStatus||!e.lastActivityAt)return!1;let t=Date.parse(e.lastActivityAt);return!Number.isNaN(t)&&t>=r}).length;return{groupId:t.group.groupId,name:t.group.name,description:t.group.description,groupType:t.group.groupType,role:n.role,memberCount:m(t.members),lastActivityAt:n.lastActivityAt??null,newMembersLast7d:i,activeMembersLast7d:o}})}}async function j(e){if(O()){let t=E();return{source:"api",group:(await N("/groups",{method:"POST",headers:await T(t,{"Content-Type":"application/json"}),body:JSON.stringify({...e,profileImage:b()||void 0})})).group}}y();let t=C(),r=`grp_mock_${Math.random().toString(36).slice(2,10)}`,n=g(),i=v(),o={groupId:r,name:e.name,description:e.description,groupType:e.groupType,joinPolicy:"approval"===e.joinPolicy?"approval":"open",maxMemberCount:Math.max(0,Math.floor(e.maxMemberCount??0)),memberCount:1,myRole:"owner",defaultInviteCode:Math.random().toString(36).slice(2,8).toUpperCase(),status:"active",createdAt:n,updatedAt:n};return i.groups[r]={group:o,members:[{userEmail:t,displayName:t.split("@")[0],role:"owner",joinedAt:n,membershipStatus:"active",lastActivityAt:n,readingContribution:0,writingContribution:0}]},k(i),{source:"mock",group:o}}async function _(e){let t,r,n,i;if(O()){let t=E(),[r,n]=await Promise.all([N(`/groups/${e}`,{headers:await T(t)}),N(`/groups/${e}/progress/overview`,{headers:await T(t)})]);return{source:"api",group:r.group,overview:n.overview}}y();let o=C(),a=A(e),s=a.members.find(e=>e.userEmail===o)??a.members[0];return{source:"mock",group:{...a.group,myRole:s.role,myPushMuted:!0===s.pushMuted,memberCount:m(a.members)},overview:(t=a.members.filter(e=>!!e.lastActivityAt&&Date.parse(e.lastActivityAt)>=Date.now()-6048e5).length,r=a.members.reduce((e,t)=>e+t.readingContribution,0),n=a.members.reduce((e,t)=>e+t.writingContribution,0),i=a.members.find(e=>e.userEmail===o),{memberCount:m(a.members),activeCount7d:t,readingCompletionRate:a.members.length?Math.min(r/(1189*a.members.length),1):0,writingCompletionRate:a.members.length?Math.min(n/(31102*a.members.length),1):0,myReadingContribution:i?.readingContribution??0,myWritingContribution:i?.writingContribution??0})}}async function L(e,t={}){if(O()){let r=E(),n=t.includeHistory?"?includeHistory=true":"";return{source:"api",members:(await N(`/groups/${e}/members${n}`,{headers:await T(r)})).members}}y();let r=A(e);return{source:"mock",members:[...t.includeHistory?r.members:r.members.filter(e=>"removed"!==e.membershipStatus&&"left"!==e.membershipStatus)].sort((e,t)=>{let r={owner:0,admin:1,member:2};return r[e.role]-r[t.role]||t.readingContribution-e.readingContribution})}}async function $(e){if(O()){let t=E(),r=e.groupId?`/groups/${e.groupId}/join`:"/groups/join",n=await N(r,{method:"POST",headers:await T(t,{"Content-Type":"application/json"}),body:JSON.stringify({inviteCode:e.inviteCode,profileImage:b()||void 0})});return{source:"api",groupId:n.membership.groupId,alreadyJoined:n.alreadyJoined??!1,pending:n.pending??!1,alreadyPending:n.alreadyPending??!1}}y();let t=C(),r=v(),n=Object.values(r.groups).find(t=>t.group.defaultInviteCode===e.inviteCode.trim().toUpperCase());if(!n)throw Error("유효한 초대 코드를 찾지 못했습니다.");let i=n.members.find(e=>e.userEmail===t);if(i)return"pending"===i.membershipStatus?{source:"mock",groupId:n.group.groupId,alreadyJoined:!1,pending:!0,alreadyPending:!0}:{source:"mock",groupId:n.group.groupId,alreadyJoined:!0,pending:!1,alreadyPending:!1};let o=n.group.maxMemberCount??0,a=n.members.filter(e=>"pending"!==e.membershipStatus).length;if(o>0&&a>=o)throw new p("그룹 정원이 가득 찼습니다.",{code:"GROUP_FULL",statusCode:409});let s="approval"===n.group.joinPolicy,u=g();return n.members.push({userEmail:t,displayName:t.split("@")[0],role:"member",joinedAt:u,membershipStatus:s?"pending":"active",lastActivityAt:u,readingContribution:0,writingContribution:0}),s||(n.group.memberCount=n.members.filter(e=>"pending"!==e.membershipStatus).length,n.group.updatedAt=u),k(r),{source:"mock",groupId:n.group.groupId,alreadyJoined:!1,pending:s,alreadyPending:!1}}async function D(e,t,r){if(O()){let n=E(),i=await N(`/groups/${e}/members/${encodeURIComponent(t)}/respond`,{method:"POST",headers:await T(n,{"Content-Type":"application/json"}),body:JSON.stringify({action:r})});return{source:"api",action:i.action,userEmail:i.userEmail}}y();let n=C(),i=v(),o=A(e,i),a=S(o,n);if("owner"!==a.role&&"admin"!==a.role)throw Error("관리자만 참여 요청을 처리할 수 있습니다.");let s=o.members.find(e=>e.userEmail===t);if(!s||"pending"!==s.membershipStatus)throw Error("승인 대기 중인 멤버가 아닙니다.");if("approve"===r){let e=o.group.maxMemberCount??0,r=o.members.filter(e=>"active"===e.membershipStatus).length;if(e>0&&r>=e)throw new p("그룹 정원이 가득 찼습니다.",{code:"GROUP_FULL",statusCode:409});return s.membershipStatus="active",s.lastActivityAt=g(),o.group.memberCount=o.members.filter(e=>"pending"!==e.membershipStatus).length,o.group.updatedAt=g(),k(i),{source:"mock",action:"approve",userEmail:t}}return o.members=o.members.filter(e=>e.userEmail!==t),o.group.updatedAt=g(),k(i),{source:"mock",action:"reject",userEmail:t}}async function M(e,t){var r;let n,i,o;if(O()){let r=E(),n="7d"===t?"7":"30d"===t?"30":"all"===t?"all":void 0,i=n?`?days=${n}`:"";return{source:"api",progress:await N(`/groups/${e}/progress/reading${i}`,{headers:await T(r)})}}return y(),{source:"mock",progress:(n=(r=A(e)).members.reduce((e,t)=>e+t.readingContribution,0),i=r.members.filter(e=>e.readingContribution>0),o=[...r.members].sort((e,t)=>t.readingContribution-e.readingContribution||e.userEmail.localeCompare(t.userEmail)),{summary:{completionRate:r.members.length?Math.min(n/(1189*r.members.length),1):0,activeCount7d:i.filter(e=>I(e.lastActivityAt)).length,totalReadChapters:n},members:o.map((e,t)=>{let r=I(e.lastActivityAt)&&e.readingContribution>0,n=Array.from({length:30},(e,t)=>({date:new Date(Date.now()-(29-t)*864e5).toISOString().slice(0,10),chapters:r&&t>=16?Math.floor(4*Math.random()):0})),i=0;for(let e=n.length-1;e>=0;e--)if(n[e].chapters>0)i++;else if(e===n.length-1)continue;else break;return{userEmail:e.userEmail,displayName:e.displayName,readChapters:e.readingContribution,activeDays7d:r?n.filter(e=>e.chapters>0).length:0,dailyActivity:n,currentStreak:i,currentRank:t+1,previousRank:Math.min(t+2,o.length),rankDelta:+(t+1t.readChapters-e.readChapters||e.userEmail.localeCompare(t.userEmail))})}}async function U(e,t,r){var n;let i,o,a;if(O()){let n=E(),i=new URLSearchParams;if(r)i.set("book",r);else{let e="7d"===t?"7":"30d"===t?"30":"all"===t?"all":void 0;e&&i.set("days",e)}let o=i.toString()?`?${i.toString()}`:"";return{source:"api",progress:await N(`/groups/${e}/progress/writing${o}`,{headers:await T(n)})}}return y(),{source:"mock",progress:(i=(n=A(e)).members.reduce((e,t)=>e+t.writingContribution,0),o=n.members.filter(e=>e.writingContribution>0),a=[...n.members].sort((e,t)=>t.writingContribution-e.writingContribution||e.userEmail.localeCompare(t.userEmail)),{summary:{completionRate:n.members.length?Math.min(i/(31102*n.members.length),1):0,activeCount7d:o.filter(e=>I(e.lastActivityAt)).length,totalCompletedVerses:i},members:a.map((e,t)=>{let r=I(e.lastActivityAt)&&e.writingContribution>0,n=Array.from({length:30},(e,t)=>({date:new Date(Date.now()-(29-t)*864e5).toISOString().slice(0,10),verses:r&&t>=16?Math.floor(8*Math.random()):0})),i=0;for(let e=n.length-1;e>=0;e--)if(n[e].verses>0)i++;else if(e===n.length-1)continue;else break;return{userEmail:e.userEmail,displayName:e.displayName,completedVerses:e.writingContribution,completedChapters:Math.floor(e.writingContribution/10),activeDays7d:r?n.filter(e=>e.verses>0).length:0,dailyActivity:n,currentStreak:i,currentRank:t+1,previousRank:Math.min(t+2,a.length),rankDelta:+(t+1t.completedVerses-e.completedVerses||e.userEmail.localeCompare(t.userEmail))})}}async function G(e,t){if(O()){let r=E();return{source:"api",group:(await N(`/groups/${e}`,{method:"PATCH",headers:await T(r,{"Content-Type":"application/json"}),body:JSON.stringify(t)})).group}}y();let r=C(),n=v(),i=A(e,n),o=S(i,r);if("owner"!==o.role&&"admin"!==o.role)throw Error("관리자만 그룹 정보를 수정할 수 있습니다.");if(void 0!==t.name){let e=t.name.trim();if(!e)throw Error("그룹 이름을 입력해 주세요.");i.group.name=e}let a=g();if(void 0!==t.description&&(i.group.description=t.description.trim()),t.groupType&&(i.group.groupType=t.groupType),t.joinPolicy&&(i.group.joinPolicy=t.joinPolicy),void 0!==t.maxMemberCount&&(i.group.maxMemberCount=Math.max(0,Math.floor(t.maxMemberCount))),t.regenerateInviteCode&&(i.group.defaultInviteCode=Math.random().toString(36).slice(2,8).toUpperCase()),t.clearPinNotice||null===t.pinNotice)i.group.pinNotice=null;else if(t.pinNotice){let e=t.pinNotice.text.trim();if(e.length>500)throw Error("공지사항은 500자 이내로 입력해 주세요.");i.group.pinNotice=e?{text:e,updatedAt:a,authorEmail:r}:null}return i.group.updatedAt=a,k(n),{source:"mock",group:{...i.group,myRole:o.role,memberCount:m(i.members)}}}async function J(e,t,r){let n;if(O()){let n=E(),i=await N(`/groups/${e}/members/${encodeURIComponent(t)}`,{method:"PATCH",headers:await T(n,{"Content-Type":"application/json"}),body:JSON.stringify({role:r})});return{source:"api",member:i.member,previousOwner:i.previousOwner}}y();let i=C(),o=v(),a=A(e,o),s=S(a,i);if("owner"!==s.role)throw Error("owner만 역할을 변경할 수 있습니다.");let u=a.members.find(e=>e.userEmail===t);if(!u)throw Error("대상 멤버를 찾을 수 없습니다.");if("owner"===u.role)throw Error("owner 역할은 직접 변경할 수 없습니다.");return"owner"===r&&(s.role="admin",n={userEmail:s.userEmail,role:"admin"},a.group.ownerEmail=u.userEmail),u.role=r,a.group.updatedAt=g(),k(o),{source:"mock",member:{...u},previousOwner:n}}async function B(e,t,r,n){let i=r.trim();if(O()){let r=E(),o=await N(`/groups/${e}/members/${encodeURIComponent(t)}/assignment`,{method:"PATCH",headers:await T(r,{"Content-Type":"application/json"}),body:JSON.stringify(n?{range:n}:{assignedRange:i})});return{source:"api",userEmail:o.userEmail,assignedRange:o.assignedRange,assignedRangeStruct:o.assignedRangeStruct??null}}y();let o=C(),a=v(),s=A(e,a),u=S(s,o);if("owner"!==u.role&&"admin"!==u.role)throw Error("관리자만 할당 범위를 편집할 수 있습니다.");let l=s.members.find(e=>e.userEmail===t);if(!l)throw Error("대상 멤버를 찾을 수 없습니다.");return n?(l.assignedRange=`${n.book} ${n.startChapter}-${n.endChapter}`,l.assignedRangeStruct=n):(l.assignedRange=i||null,l.assignedRangeStruct=null),s.group.updatedAt=g(),k(a),{source:"mock",userEmail:t,assignedRange:l.assignedRange,assignedRangeStruct:l.assignedRangeStruct??null}}async function V(e,t,r){let n=r.trim();if(O()){let r=E(),i=await N(`/groups/${e}/members/${encodeURIComponent(t)}/note`,{method:"PATCH",headers:await T(r,{"Content-Type":"application/json"}),body:JSON.stringify({note:n})});return{source:"api",userEmail:i.userEmail,adminNote:i.adminNote}}y();let i=C(),o=v(),a=A(e,o),s=S(a,i);if("owner"!==s.role&&"admin"!==s.role)throw Error("관리자만 멤버 메모를 편집할 수 있습니다.");let u=a.members.find(e=>e.userEmail===t);if(!u)throw Error("대상 멤버를 찾을 수 없습니다.");return u.adminNote=n||null,a.group.updatedAt=g(),k(o),{source:"mock",userEmail:t,adminNote:u.adminNote}}async function z(e,t){if(O()){let r=E();return await N(`/groups/${e}/members/${encodeURIComponent(t)}`,{method:"DELETE",headers:await T(r)}),{source:"api",removed:!0}}y();let r=C(),n=v(),i=A(e,n),o=S(i,r),a=i.members.find(e=>e.userEmail===t);if(!a)throw Error("대상 멤버를 찾을 수 없습니다.");if("owner"===a.role)throw Error("owner는 제거할 수 없습니다.");if(r===t)throw Error("자기 자신은 제거할 수 없습니다.");if("member"===o.role)throw Error("멤버를 제거할 권한이 없습니다.");if("admin"===o.role&&"member"!==a.role)throw Error("admin은 member만 제거할 수 있습니다.");let s=g();return a.membershipStatus="removed",a.removedAt=s,a.removedBy=r,i.group.memberCount=i.members.filter(e=>"pending"!==e.membershipStatus&&"removed"!==e.membershipStatus&&"left"!==e.membershipStatus).length,i.group.updatedAt=s,k(n),{source:"mock",removed:!0}}async function K(e){if(O()){let t=E();return await N(`/groups/${e}/leave`,{method:"POST",headers:await T(t)}),{source:"api",left:!0}}y();let t=C(),r=v(),n=A(e,r),i=S(n,t);if("owner"===i.role)throw Error("owner는 그룹을 탈퇴할 수 없습니다. 그룹을 삭제해 주세요.");let o=g();return i.membershipStatus="left",i.leftAt=o,n.group.memberCount=n.members.filter(e=>"pending"!==e.membershipStatus&&"removed"!==e.membershipStatus&&"left"!==e.membershipStatus).length,n.group.updatedAt=o,k(r),{source:"mock",left:!0}}async function H(e){if(O()){let t=E();return await N(`/groups/${e}`,{method:"DELETE",headers:await T(t)}),{source:"api",deleted:!0}}y();let t=C(),r=v();if("owner"!==S(A(e,r),t).role)throw Error("owner만 그룹을 삭제할 수 있습니다.");return delete r.groups[e],k(r),{source:"mock",deleted:!0}}async function W(e,t){if(O()){let r=E();return{source:"api",plan:(await N(`/groups/${e}/plan`,{method:"PUT",headers:await T(r,{"Content-Type":"application/json"}),body:JSON.stringify(t)})).plan}}y();let r=C(),n=v(),i=A(e,n),o=S(i,r);if("owner"!==o.role&&"admin"!==o.role)throw Error("관리자만 읽기 플랜을 설정할 수 있습니다.");if("clear"in t&&t.clear)return i.group.readingPlan=void 0,i.group.updatedAt=g(),k(n),{source:"mock",plan:null};let a=i.group.readingPlan,s={planId:a?.planId||`plan_mock_${Date.now()}`,title:t.title.trim(),ranges:t.ranges,startDate:t.startDate,endDate:t.endDate,createdBy:a?.createdBy||r,createdAt:a?.createdAt||g(),updatedAt:g(),updatedBy:r};return i.group.readingPlan=s,i.group.updatedAt=g(),k(n),{source:"mock",plan:s}}async function F(e){if(O()){let t=E();return{source:"api",progress:await N(`/groups/${e}/plan/progress`,{headers:await T(t)})}}y();let t=C(),r=A(e);S(r,t);let n=r.group.readingPlan??null;if(!n)return{source:"mock",progress:{plan:null,totalChapters:0,members:[]}};let i=n.ranges.reduce((e,t)=>e+Math.max(0,t.endChapter-t.startChapter+1),0),o=[...r.members].map(e=>{let t=Math.min(1,e.readingContribution/200);return{userEmail:e.userEmail,displayName:e.displayName,completedChapters:Math.floor(t*i),totalChapters:i}}).sort((e,t)=>t.completedChapters-e.completedChapters||e.userEmail.localeCompare(t.userEmail));return{source:"mock",progress:{plan:n,totalChapters:i,members:o}}}async function q(e){if(O()){let t=E();return{source:"api",posts:(await N(`/groups/${e}/posts`,{headers:await T(t)})).posts}}y();let t=C(),r=v();return S(A(e,r),t),{source:"mock",posts:(r.posts[e]??[]).slice().reverse().map(e=>{let r=Array.isArray(e.heartedBy)?e.heartedBy:[],n=e.mockEmoji??{},i={},o=[];for(let e of["👍","🙏","🔥"]){let r=new Set(n[e]??[]);i[e]=r.size,r.has(t)&&o.push(e)}return{groupId:e.groupId,postId:e.postId,authorEmail:e.authorEmail,authorName:e.authorName,content:e.content,createdAt:e.createdAt,heartCount:r.length,myReacted:r.includes(t),emojiCounts:i,myEmojiReactions:o}})}}async function Y(e,t){if(O()){let r=E(),n=h(f("ab_user"),null),i=n?.name?.trim()||r.split("@")[0];return{source:"api",post:(await N(`/groups/${e}/posts`,{method:"POST",headers:await T(r,{"Content-Type":"application/json"}),body:JSON.stringify({content:t,authorName:i})})).post}}y();let r=C(),n=v();S(A(e,n),r);let i=g(),o={groupId:e,postId:`${Date.now()}#mock`,authorEmail:r,authorName:r.split("@")[0],content:t.trim(),createdAt:i,heartedBy:[]};return n.posts[e]||(n.posts[e]=[]),n.posts[e].push(o),k(n),{source:"mock",post:{...o,heartCount:0,myReacted:!1}}}async function Q(e,t,r){if(O()){let n=E();if("like"!==r&&"unlike"!==r){let i=await N(`/groups/${e}/posts/${encodeURIComponent(t)}/reactions`,{method:"POST",headers:await T(n,{"Content-Type":"application/json"}),body:JSON.stringify({action:r})});return{source:"api",emojiCounts:i.emojiCounts,myEmojiReactions:i.myEmojiReactions}}let i=await N(`/groups/${e}/posts/${encodeURIComponent(t)}/reactions`,{method:"POST",headers:await T(n,{"Content-Type":"application/json"}),body:JSON.stringify({action:r})});return{source:"api",heartCount:i.heartCount,myReacted:i.myReacted}}y();let n=C(),i=v();S(A(e,i),n);let o=(i.posts[e]??[]).find(e=>e.postId===t);if(!o)throw Error("게시물을 찾을 수 없습니다.");if("like"===r||"unlike"===r){let e=new Set(o.heartedBy??[]);return"like"===r?e.add(n):e.delete(n),o.heartedBy=Array.from(e),k(i),{source:"mock",heartCount:o.heartedBy.length,myReacted:e.has(n)}}let a=r.startsWith("remove_"),s=a?r.slice(7):r,u=o.mockEmoji??{},l=new Set(u[s]??[]);a?l.delete(n):l.add(n),u[s]=Array.from(l),o.mockEmoji=u,k(i);let d={},c=[];for(let e of["👍","🙏","🔥"]){let t=new Set(u[e]??[]);d[e]=t.size,t.has(n)&&c.push(e)}return{source:"mock",emojiCounts:d,myEmojiReactions:c}}async function X(e,t){if(O()){let r=E();return await N(`/groups/${e}/posts/${encodeURIComponent(t)}`,{method:"DELETE",headers:await T(r)}),{source:"api",deleted:!0}}y();let r=C(),n=v(),i=S(A(e,n),r),o=n.posts[e]??[],a=o.find(e=>e.postId===t);if(!a)throw Error("게시물을 찾을 수 없습니다.");if(a.authorEmail!==r&&"owner"!==i.role&&"admin"!==i.role)throw Error("이 게시물을 삭제할 권한이 없습니다.");return n.posts[e]=o.filter(e=>e.postId!==t),k(n),{source:"mock",deleted:!0}}async function Z(e){if(!O())throw new p("푸시 알림은 운영 환경에서만 사용할 수 있습니다.",{code:"PUSH_NOT_AVAILABLE",statusCode:501});let t=E();return{source:"api",...await N("/push/subscribe",{method:"POST",headers:await T(t,{"Content-Type":"application/json"}),body:JSON.stringify(e)})}}async function ee(e,t){if(!O())throw new p("푸시 알림은 운영 환경에서만 사용할 수 있습니다.",{code:"PUSH_NOT_AVAILABLE",statusCode:501});let r=t?{"Content-Type":"application/json",Authorization:`Bearer ${t}`}:await T(E(),{"Content-Type":"application/json"});return await N("/push/subscribe",{method:"DELETE",headers:r,body:JSON.stringify({endpoint:e})}),{source:"api",removed:!0}}async function et(e){if(!O())throw new p("푸시 알림은 운영 환경에서만 사용할 수 있습니다.",{code:"PUSH_NOT_AVAILABLE",statusCode:501});let t=E();return N(`/push/preferences?endpoint=${encodeURIComponent(e)}`,{headers:await T(t)})}async function er(e,t){if(!O())throw new p("푸시 알림은 운영 환경에서만 사용할 수 있습니다.",{code:"PUSH_NOT_AVAILABLE",statusCode:501});let r=E();return N("/push/preferences",{method:"PUT",headers:await T(r,{"Content-Type":"application/json"}),body:JSON.stringify({endpoint:e,noticeEnabled:t})})}async function en(e,t){if(O()){let r=E();return{source:"api",pushMuted:(await N(`/groups/${e}/push-preference`,{method:"PUT",headers:await T(r,{"Content-Type":"application/json"}),body:JSON.stringify({muted:t})})).pushMuted}}y();let r=v();return S(A(e,r),C()).pushMuted=t,k(r),{source:"mock",pushMuted:t}}async function ei(e,t){if(!O())throw new p("푸시 알림은 운영 환경에서만 사용할 수 있습니다.",{code:"PUSH_NOT_AVAILABLE",statusCode:501});let r=E();return{source:"api",...await N(`/groups/${e}/push`,{method:"POST",headers:await T(r,{"Content-Type":"application/json"}),body:JSON.stringify(t)})}}async function eo(e,t={}){let r=t.reading??1,n=t.writing??1,[i,o]=await Promise.all([M(e),U(e)]),a="mock"===i.source||"mock"===o.source?"mock":"api",s=new Map;for(let e of i.progress.members)s.set(e.userEmail,e);let u=new Map;for(let e of o.progress.members)u.set(e.userEmail,e);let l=new Set([...s.keys(),...u.keys()]),d=[];for(let e of l){let t=s.get(e),i=u.get(e),o=t?.readChapters??0,a=i?.completedVerses??0,l=o*r+a*n;d.push({userEmail:e,displayName:t?.displayName||i?.displayName||e.split("@")[0],readChapters:o,completedVerses:a,totalScore:l})}return{source:a,ranking:{weights:{reading:r,writing:n},members:d.sort((e,t)=>t.totalScore-e.totalScore||e.userEmail.localeCompare(t.userEmail)).map((e,t)=>({...e,currentRank:t+1}))}}}async function ea(e,t){if(!O())throw new p("이메일 초대는 운영 환경에서만 사용할 수 있습니다.",{code:"EMAIL_NOT_AVAILABLE",statusCode:501});let r=E();return{source:"api",...await N(`/groups/${e}/invite/email`,{method:"POST",headers:await T(r,{"Content-Type":"application/json"}),body:JSON.stringify(t)})}}async function es(e){if(O()){let t=E();return{source:"api",league:await N(`/groups/${e}/league`,{headers:await T(t)})}}y();let t=C(),r=v(),n=A(e,r);S(n,t);let i=Object.values(r.groups).filter(e=>e.group.groupType===n.group.groupType),o=i.map(e=>e.members.filter(e=>"active"===e.membershipStatus).length),a=o.length,s=o.reduce((e,t)=>e+t,0),u=a>0?Math.round(s/a*10)/10:0,l=n.members.filter(e=>"active"===e.membershipStatus).length,d=e=>{let t=e.members.filter(e=>"active"===e.membershipStatus);return 0===t.length?0:Math.round(t.reduce((e,t)=>e+t.readingContribution+t.writingContribution,0)/t.length*10)/10},c=i.map(d),p=d(n),m=a>0?Math.round(c.reduce((e,t)=>e+t,0)/a*10)/10:0,g=1+c.filter(e=>e>p).length;return{source:"mock",league:{groupType:n.group.groupType,totalGroups:a,myMemberCount:l,averageMemberCount:u,myAvgScore:p,leagueAvgScore:m,myRank:a>0?g:0}}}async function eu(e,t=365){let r=Math.max(7,Math.min(365,Math.floor(t)||365));if(O()){let t=E();return{source:"api",heatmap:await N(`/groups/${e}/activity/heatmap?days=${r}`,{headers:await T(t)})}}y();let n=C(),i=A(e);S(i,n);let o=i.members.filter(e=>"pending"!==e.membershipStatus),a={},s=new Date;for(let e of o){let t=e.userEmail,n=Math.min(r,90);for(let r=0;r0&&(a[i]=(a[i]??0)+c)}}let u=Object.entries(a).map(([e,t])=>({date:e,chapters:t})).sort((e,t)=>e.date.localeCompare(t.date)),l=u.reduce((e,t)=>e+t.chapters,0);return{source:"mock",heatmap:{days:r,memberCount:o.length,totalChapters:l,entries:u}}}async function el(){let{FirebaseMessaging:t}=await e.A(59363);return{messaging:t}}e.s(["GroupApiError",0,p,"buildAbsoluteInviteUrl",0,function(e,t){let r=P(e,t);return`${window.location.origin}${r}`},"canJoinGroupViaApi",0,function(){return O()},"createGroup",0,j,"createGroupPost",0,Y,"deleteGroup",0,H,"deleteGroupPost",0,X,"getGroupActivityHeatmap",0,eu,"getGroupCombinedRanking",0,eo,"getGroupDetail",0,_,"getGroupHomeLink",0,function(e){return R(`/groups/detail?groupId=${encodeURIComponent(e)}`)},"getGroupJoinLink",0,P,"getGroupLeague",0,es,"getGroupLink",0,R,"getGroupMembers",0,L,"getGroupMembersLink",0,function(e){return R(`/groups/members?groupId=${encodeURIComponent(e)}`)},"getGroupPlanProgress",0,F,"getGroupReadingLink",0,function(e){return R(`/groups/reading?groupId=${encodeURIComponent(e)}`)},"getGroupReadingProgress",0,M,"getGroupWritingLink",0,function(e){return R(`/groups/writing?groupId=${encodeURIComponent(e)}`)},"getGroupWritingProgress",0,U,"getPushPreferences",0,et,"hasGroupBibleApi",0,O,"joinGroup",0,$,"leaveGroup",0,K,"listGroupPosts",0,q,"listMyGroups",0,x,"reactGroupPost",0,Q,"removeGroupMember",0,z,"respondPendingMember",0,D,"sendGroupInvite",0,ea,"sendGroupPush",0,ei,"setGroupReadingPlan",0,W,"subscribePush",0,Z,"unsubscribePush",0,ee,"updateGroup",0,G,"updateGroupMemberAssignment",0,B,"updateGroupMemberNote",0,V,"updateGroupMemberRole",0,J,"updateGroupPushPreference",0,en,"updatePushPreferences",0,er],93527);let ed=!1,ec=null;async function ep(){if(!(0,s.isNative)())return"unsupported";try{let{messaging:e}=await el(),t=await e.checkPermissions();if("granted"===t.receive)return"granted";if("denied"===t.receive)return"denied";return"prompt"}catch{return"unsupported"}}async function em(){if(!(0,s.isNative)())return!1;try{let{messaging:e}=await el(),t=await e.requestPermissions();return"granted"===t.receive}catch{return!1}}async function eg(){if(!(0,s.isNative)())return null;try{let{messaging:e}=await el(),t=await e.getToken();if(t?.token)return ec=t.token,t.token;return null}catch{return null}}async function eh(e){if(!(0,s.isNative)()||!e)return!1;try{let t="ios"===u.Capacitor.getPlatform()?"ios":"android";return await Z({platform:t,token:e,userAgent:navigator.userAgent}),ec=e,!0}catch{return!1}}async function ef(e){if(!(0,s.isNative)())return!1;try{let t=ec||await eg();t&&await ee(`fcm:${t}`,e).catch(()=>{});let{messaging:r}=await el();return await r.deleteToken().catch(()=>{}),ec=null,!0}catch{return!1}}let ew="BBYaU1n6-Fb7BcVFTPi96a55laaIALu1nPQC-n7-mftajlfc2nUiaPs13V5nVxFcCI_uF1JwIKgDCmyjyQSDcmU";function eb(e){if(!e)return"";let t=new Uint8Array(e),r="";for(let e=0;e{}),window.dispatchEvent(new Event(ey));return}if(!("serviceWorker"in navigator)||!("PushManager"in window))return;let t=await navigator.serviceWorker.getRegistration(),r=await t?.pushManager.getSubscription();if(!r)return;e&&O()&&await ee(r.endpoint,e).catch(()=>{}),await r.unsubscribe(),window.dispatchEvent(new Event(ey))}catch{}}e.s(["OPEN_NOTIFICATION_SETTINGS_EVENT",0,ev,"openNotificationSettings",0,function(){window.dispatchEvent(new Event(ev))},"releaseDevicePush",0,ek,"usePushSubscription",0,function(e={}){let{withPreferences:t=!1}=e,[r,i]=(0,n.useState)("unknown"),[o,u]=(0,n.useState)(null),[d,c]=(0,n.useState)(null),[p,m]=(0,n.useState)(!1),[g,h]=(0,n.useState)(""),[f,w]=(0,n.useState)(null),[b,y]=(0,n.useState)(0);(0,n.useEffect)(()=>{let e=()=>y(e=>e+1);return window.addEventListener(ey,e),()=>window.removeEventListener(ey,e)},[]);let v=(0,s.isNative)(),k=!!v||"serviceWorker"in navigator&&"PushManager"in window&&"u">typeof Notification,C=O(),E=!!v||!!ew,A=(0,a.useHydrated)()?k?C?E?null:"not-configured":"disabled":"unsupported":null;(0,n.useEffect)(()=>{if(!v||!C)return;(0,s.isNative)()&&!ed&&(ed=!0,el().then(({messaging:e})=>{e.addListener("tokenReceived",e=>{e.token&&(ec=e.token,eh(e.token))}).catch(()=>{}),e.addListener("notificationActionPerformed",e=>{try{let t=e.notification?.data,r=t?.url,n=function(e){if("string"!=typeof e)return null;let t=e.trim();if(!t||/[\u0000-\u001f\u007f]/.test(t)||!t.startsWith("/")||t.startsWith("//")||t.includes("\\")||t.split(/[?#]/)[0].includes(":"))return null;try{let e=new URL(t,"https://app.invalid");if("https://app.invalid"!==e.origin||!e.pathname.startsWith("/")||e.pathname.startsWith("//"))return null}catch{return null}return t}(r);if(n){let e=(0,l.withStaticHtmlPath)(n);window.location.href=e}}catch{}}).catch(()=>{})}).catch(()=>{}));let e=!1;return ep().then(async t=>{if(!e)if("granted"===t){let t=await eg();if(e)return;c(t),i(t?"granted":"unknown")}else"denied"===t?i("denied"):i("unknown")}),()=>{e=!0}},[v,C,b]),(0,n.useEffect)(()=>{if(v||!k||!C||!E)return;let e=!1;return navigator.serviceWorker.ready.then(e=>e.pushManager.getSubscription()).then(t=>{e||(u(t),t?i("granted"):i("denied"===Notification.permission?"denied":"unknown"))}).catch(()=>{e||i("unknown")}),()=>{e=!0}},[v,k,C,E,b]),(0,n.useEffect)(()=>{if(!v||!t||!d)return;let e=!1,r=`fcm:${d}`;return et(r).then(async e=>e.subscribed?e.noticeEnabled:(await eh(d),!0)).then(t=>{e||w({endpoint:r,enabled:t})}).catch(t=>{e||h(t instanceof Error?t.message:"알림 설정을 불러오지 못했습니다.")}),()=>{e=!0}},[v,t,d]),(0,n.useEffect)(()=>{if(v||!t||!o)return;let e=!1;return et(o.endpoint).then(async e=>{if(e.subscribed)return e.noticeEnabled;let t=o.toJSON();return!1!==(await Z({endpoint:o.endpoint,keys:{p256dh:t.keys?.p256dh||eb(o.getKey("p256dh")),auth:t.keys?.auth||eb(o.getKey("auth"))},userAgent:navigator.userAgent})).noticeEnabled}).then(t=>{e||w({endpoint:o.endpoint,enabled:t})}).catch(t=>{e||h(t instanceof Error?t.message:"알림 설정을 불러오지 못했습니다.")}),()=>{e=!0}},[v,t,o]);let S=(0,n.useCallback)(async e=>{let t=v?d?`fcm:${d}`:null:o?.endpoint;if(!t)return!1;m(!0),h("");try{let r=await er(t,e);return w({endpoint:t,enabled:r.noticeEnabled}),!0}catch(e){return h(e instanceof Error?e.message:"알림 설정 변경 중 오류가 발생했습니다."),!1}finally{m(!1)}},[v,d,o]),I=(0,n.useCallback)(async()=>{if(!k||!C||!E)return!1;if(m(!0),h(""),v)try{if(!await em())return i("denied"),!1;let e=await eg();if(!e)return h("푸시 토큰을 가져오지 못했습니다."),!1;if(!await eh(e))return h("푸시 등록에 실패했습니다."),!1;return c(e),i("granted"),window.dispatchEvent(new Event(ey)),!0}catch(e){return h(e instanceof Error?e.message:"구독 처리 중 오류가 발생했습니다."),!1}finally{m(!1)}try{let e=await Notification.requestPermission();if("granted"!==e)return i("denied"===e?"denied":"unknown"),!1;let t=await navigator.serviceWorker.ready,r=await t.pushManager.getSubscription();r||(r=await t.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:function(e){let t="=".repeat((4-e.length%4)%4),r=(e+t).replace(/-/g,"+").replace(/_/g,"/"),n=window.atob(r),i=new Uint8Array(n.length);for(let e=0;e{if(!k||!C)return!1;if(m(!0),h(""),v)try{return await ef(),c(null),i("unknown"),window.dispatchEvent(new Event(ey)),!0}catch(e){return h(e instanceof Error?e.message:"구독 해제 중 오류가 발생했습니다."),!1}finally{m(!1)}try{let e=await navigator.serviceWorker.ready,t=await e.pushManager.getSubscription();if(t){try{await ee(t.endpoint)}catch{}await t.unsubscribe()}return u(null),i("denied"===Notification.permission?"denied":"unknown"),window.dispatchEvent(new Event(ey)),!0}catch(e){return h(e instanceof Error?e.message:"구독 해제 중 오류가 발생했습니다."),!1}finally{m(!1)}},[v,k,C]),N=v?d?`fcm:${d}`:null:o?.endpoint;return{status:A??r,subscription:o,busy:p,error:g,supported:k,apiAvailable:C,configured:E,subscribe:I,unsubscribe:T,noticeEnabled:t&&N&&f?.endpoint===N?f.enabled:null,setNoticeEnabled:S}}],24573);var eC=e.i(90571),eE=e.i(77954),eA=e.i(9413),eS=e.i(85715),eI=e.i(78964),eT=e.i(4002),eN=e.i(84995);async function eO(){var e;let t,r,n,i=new URL(window.location.href),o=localStorage.getItem(eS.OAUTH_STATE_KEY),a=null;if(o)try{let n=JSON.parse(o);a=null!=(e=n.provider)?e:null,t=n.state,r=n.nonce}catch(e){a="true"===o?"google":null}let s=new eA.GoogleSocialLogin,u=new eI.OAuth2SocialLogin,l=new eN.TwitterSocialLogin,d=new eT.TelegramSocialLogin;switch(a){case"twitter":n=await l.handleOAuthRedirect(i,t);break;case"telegram":n=await d.handleOAuthRedirect(i,t);break;case"oauth2":n=await u.handleOAuthRedirect(i,t);break;default:n=s.handleOAuthRedirect(i)}return{provider:a,state:t,nonce:r,result:n}}function eR(e){let{result:t}=e;if(!t)return null;if("error"in t){let r=(0,eE.inferUserCancelledError)(t.error);return Object.assign({type:"oauth-error",provider:e.provider,error:r.message},r.code?{code:r.code}:null)}return Object.assign({type:"oauth-response",provider:t.provider},t.result)}async function eP(){var e,t,r,n,i;let o=await eO(),a=null!=(e=o.nonce)?e:o.state,s=eR(o);if(s)(0,eS.deliverOAuthResult)(null!=(i=o.provider)?i:"google",a,s);else if((0,eS.shouldAutoFinishOAuthRedirect)()){await new Promise(e=>setTimeout(e,100));let e=await eO(),i=eR(e);i?(0,eS.deliverOAuthResult)(null!=(t=e.provider)?t:"google",null!=(r=e.nonce)?r:e.state,i):(0,eS.deliverOAuthResult)(null!=(n=o.provider)?n:"google",a,{type:"oauth-error",provider:o.provider,error:"OAuth redirect did not contain expected parameters."})}(0,eS.clearOAuthPopupMarker)();try{window.close()}catch(e){}}"u">typeof window&&((0,eS.shouldAutoFinishOAuthRedirect)()&&eP(),window.addEventListener("hashchange",function(){(0,eS.shouldAutoFinishOAuthRedirect)()&&eP()}));var ex=e.i(60262),ej=e.i(61250);let e_=(0,u.registerPlugin)("SocialLogin",{web:()=>e.A(66265).then(e=>new e.SocialLoginWeb)}),eL=new class{normalizeInitializeOptions(e){var t,r;let n=e;if(n.linkedin){let{linkedin:e,oauth2:r}=n;n=Object.assign(Object.assign({},(0,eC.__rest)(n,["linkedin","oauth2"])),{linkedin:e,oauth2:Object.assign(Object.assign({},null!=r?r:{}),{[ex.LINKEDIN_PROVIDER_ID]:null!=(t=null==r?void 0:r[ex.LINKEDIN_PROVIDER_ID])?t:(0,ex.buildLinkedInOAuthConfig)(e)})})}if(n.tiktok){if(!n.tiktok.clientKey||!n.tiktok.redirectUrl)throw Error("tiktok.clientKey and tiktok.redirectUrl are required");let{tiktok:e,oauth2:t}=n;n=Object.assign(Object.assign({},(0,eC.__rest)(n,["tiktok","oauth2"])),{tiktok:e,oauth2:Object.assign(Object.assign({},null!=t?t:{}),{[ej.TIKTOK_PROVIDER_ID]:null!=(r=null==t?void 0:t[ej.TIKTOK_PROVIDER_ID])?r:(0,ej.buildTikTokOAuthConfig)(e)})})}return n}constructor(){this.initialize=this.initialize.bind(this),this.refresh=this.refresh.bind(this)}async initialize(e){let t=this.normalizeInitializeOptions(e);await e_.initialize(t),this.initializeOptions=t}async login(e){var t;if("linkedin"===e.provider){let r=null!=(t=e.options)?t:{},n=(0,ex.buildLinkedInLoginOptions)(r);"redirect"===n.flow&&n.state&&(0,ex.markLinkedInRedirectPending)(n.state);let i=await e_.login({provider:"oauth2",options:n});return(0,ex.asLinkedInLoginResult)(i)}if("tiktok"===e.provider){let t=await e_.login({provider:"oauth2",options:(0,ej.buildTikTokLoginOptions)(e.options)});return(0,ej.asTikTokLoginResult)(t)}return e_.login(e)}async logout(e){return"linkedin"===e.provider?e_.logout({provider:"oauth2",providerId:ex.LINKEDIN_PROVIDER_ID}):"tiktok"===e.provider?e_.logout({provider:"oauth2",providerId:ej.TIKTOK_PROVIDER_ID}):e_.logout(e)}async isLoggedIn(e){return"linkedin"===e.provider?e_.isLoggedIn({provider:"oauth2",providerId:ex.LINKEDIN_PROVIDER_ID}):"tiktok"===e.provider?e_.isLoggedIn({provider:"oauth2",providerId:ej.TIKTOK_PROVIDER_ID}):e_.isLoggedIn(e)}async getAuthorizationCode(e){return"linkedin"===e.provider?e_.getAuthorizationCode({provider:"oauth2",providerId:ex.LINKEDIN_PROVIDER_ID}):"tiktok"===e.provider?e_.getAuthorizationCode({provider:"oauth2",providerId:ej.TIKTOK_PROVIDER_ID}):e_.getAuthorizationCode(e)}async refresh(e){var t,r,n;return("google"===e.provider&&(null==(r=null==(t=this.initializeOptions)?void 0:t.google)?void 0:r.mode)==="offline"&&console.warn("[SocialLogin] Google refresh() is not available when using offline mode. Offline mode only returns serverAuthCode for backend token exchange. Send serverAuthCode to your backend and refresh tokens there, or switch google.mode to 'online' for client-side refresh."),"linkedin"===e.provider)?e_.refresh({provider:"oauth2",options:(0,ex.buildLinkedInLoginOptions)(null!=(n=e.options)?n:{})}):"tiktok"===e.provider?e_.refresh({provider:"oauth2",options:(0,ej.buildTikTokLoginOptions)(e.options)}):e_.refresh(e)}async refreshToken(e){return"linkedin"===e.provider?e_.refreshToken({provider:"oauth2",providerId:ex.LINKEDIN_PROVIDER_ID,refreshToken:e.refreshToken,additionalParameters:e.additionalParameters}):"tiktok"===e.provider?e_.refreshToken({provider:"oauth2",providerId:ej.TIKTOK_PROVIDER_ID,refreshToken:e.refreshToken,additionalParameters:e.additionalParameters}):e_.refreshToken(e)}async handleRedirectCallback(){let e=await e_.handleRedirectCallback();return e&&(0,ej.isTikTokOAuthResult)(e)?(0,ej.asTikTokLoginResult)(e):e}async decodeIdToken(e){return e_.decodeIdToken(e)}async getAccessTokenExpirationDate(e){return e_.getAccessTokenExpirationDate(e)}async isAccessTokenAvailable(e){return e_.isAccessTokenAvailable(e)}async isAccessTokenExpired(e){return e_.isAccessTokenExpired(e)}async isRefreshTokenAvailable(e){return e_.isRefreshTokenAvailable(e)}async providerSpecificCall(e){return e_.providerSpecificCall(e)}async getPluginVersion(){return e_.getPluginVersion()}async openSecureWindow(e){return e_.openSecureWindow(e)}async openAuthSession(e){return e_.openAuthSession(e)}};var e$=e.i(58579);let eD=(0,n.createContext)(null);function eM(){let e=(0,n.useContext)(eD);if(!e)throw Error("useToast must be used within ToastProvider");return e}let eU={success:"bg-green-700 dark:bg-green-800",error:"bg-red-700 dark:bg-red-800",info:"bg-slate-800 dark:bg-slate-700"};function eG({toasts:e,onDismiss:t}){return e.length?(0,r.jsx)("div",{role:"status","aria-live":"polite","aria-atomic":"false",className:"pointer-events-none fixed inset-x-3 bottom-28 z-[70] flex flex-col items-center gap-2 md:bottom-6",children:e.map(e=>(0,r.jsxs)("div",{className:`pointer-events-auto flex w-full max-w-md items-center justify-between gap-3 rounded-2xl px-4 py-3 text-sm font-medium text-white shadow-xl ${eU[e.type]}`,children:[(0,r.jsx)("span",{children:e.message}),(0,r.jsx)("button",{type:"button","aria-label":"닫기",onClick:()=>t(e.id),className:"shrink-0 text-lg leading-none text-white/70 transition-colors hover:text-white",children:"×"})]},e.id))}):null}e.s(["ToastProvider",0,function({children:e}){let[t,i]=(0,n.useState)([]),o=(0,n.useRef)(0),a=(0,n.useCallback)(e=>{i(t=>t.filter(t=>t.id!==e))},[]),s=(0,n.useCallback)((e,t={})=>{let r=++o.current,n=t.type??"success",s=t.duration??3e3;i(t=>[...t,{id:r,message:e,type:n}]),setTimeout(()=>a(r),s)},[a]);return(0,r.jsxs)(eD.Provider,{value:{show:s},children:[e,(0,r.jsx)(eG,{toasts:t,onDismiss:a})]})},"useToast",0,eM],88922);let eJ=(0,n.createContext)({user:null,status:"loading",gisReady:!1,isAdmin:!1,isAdminReady:!1,sessionReady:!1,signIn:()=>{},signOut:()=>{}}),eB=new Set(i.default.hashes);async function eV(e){let t=new TextEncoder().encode(e);return Array.from(new Uint8Array(await crypto.subtle.digest("SHA-256",t))).map(e=>e.toString(16).padStart(2,"0")).join("")}function ez(e){return`ab_admin:${e}`}function eK(e){if(!e)return null;try{let t=window.sessionStorage.getItem(ez(e));if("1"===t)return!0}catch{}return null}let eH="ab_user",eW="ab_user";function eF(e){try{let t=JSON.parse(e);if(!t||"object"!=typeof t)return null;return{email:t.email?.trim()??"",name:eQ(t.name,t.email),image:t.image?.trim()??""}}catch{return null}}function eq(e){let t=JSON.stringify(e),r=encodeURIComponent(t),n=new Date(Date.now()+2592e6).toUTCString(),i="u">typeof location&&"https:"===location.protocol?"; Secure":"";document.cookie=`${eH}=${r}; expires=${n}; path=/; SameSite=Lax${i}`;try{window.localStorage.setItem(eW,t)}catch{}}async function eY(e){let t="https://jwhhboergk.execute-api.ap-northeast-2.amazonaws.com/Prod".replace(/\/$/,"");if(!t)return!1;try{let r=await fetch(`${t}/auth/verifySession`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({idToken:e})});if(!r.ok)return!1;let n=await r.json(),i=n?.data?.sessionToken;if("string"==typeof i&&i)return(0,o.setSessionToken)(i),!0;return!1}catch{return!1}}function eQ(e,t){let r=e?.trim()??"";if(r&&!r.includes("�")&&!/[ÃÂìëêíð]/.test(r))return r;if(r){let e=function(e){try{let t=Uint8Array.from(e,e=>255&e.charCodeAt(0));return new TextDecoder("utf-8",{fatal:!0}).decode(t).trim()||e}catch{return e}}(r);if(e&&!e.includes("�"))return e}return(t?.split("@")[0]?.trim()??"")||r||"User"}let eX=!1,eZ=null;function e0(){return(0,n.useContext)(eJ)}e.s(["AuthProvider",0,function({children:e}){let[i,u]=(0,n.useState)(null),[l,d]=(0,n.useState)(!1),[c,p]=(0,n.useState)(!1),[m,g]=(0,n.useState)(null),[h,f]=(0,n.useState)(!1),w=(0,a.useHydrated)(),b=(0,n.useRef)("");w&&!l&&(d(!0),u(function(){if("u">typeof document){let e=function(){try{let e=document.cookie.match(RegExp(`(?:^|; )${eH}=([^;]*)`));return e?decodeURIComponent(e[1]):null}catch{return null}}();if(e){let t=eF(e);if(t?.email)return t}}try{let e=window.localStorage.getItem(eW);if(e){let t=eF(e);if(t?.email)return t}}catch{}return null}()));let y=(0,n.useRef)(!1);(0,n.useEffect)(()=>{l&&!y.current&&(y.current=!0,i&&eq(i),b.current=i?.email?.trim().toLowerCase()??"")},[l,i]);let v=l?i?"authenticated":"unauthenticated":"loading",k=i?.email?.trim().toLowerCase()??"",C="u">typeof crypto&&"function"==typeof crypto?.subtle?.digest,E=w?eK(k):null,A=!1,S=!1;w&&(m&&m.email===k?(A=m.isAdmin,S=!0):k&&C?!0===E&&(A=!0,S=!0):(A=!0===E,S=!0)),(0,n.useEffect)(()=>{if(!k||!C)return;let e=!1,t=eK(k);return eV(k).then(t=>{if(e)return;let r=eB.has(t);if(k)try{r?window.sessionStorage.setItem(ez(k),"1"):window.sessionStorage.removeItem(ez(k))}catch{}g({email:k,isAdmin:r})}).catch(()=>{e||g({email:k,isAdmin:!0===t})}),()=>{e=!0}},[k,C]);let{show:I}=eM(),T=h||l&&(!i||!!(0,o.getSessionToken)()),N=e=>{let t,r,n,i=(r=atob((t=e.split(".")[1].replace(/-/g,"+").replace(/_/g,"/")).padEnd(t.length+(4-t.length%4)%4,"=")),n=Uint8Array.from(r,e=>e.charCodeAt(0)),JSON.parse(new TextDecoder("utf-8").decode(n))),a=i.email?.trim().toLowerCase()??"",l=""!==b.current&&b.current!==a,d={email:i.email,name:eQ(i.name,i.email),image:i.picture};l&&(ek((0,o.getSessionToken)()),(0,o.clearSessionToken)()),b.current=a,eq(d),u(d),(0,o.getSessionToken)()||f(!1),eY(e).then(e=>{!e&&(0,s.isNative)()&&I((0,e$.getUiText)((0,e$.getInitialUiLang)()).loginFailed,{type:"error"})}).finally(()=>f(!0))},O=(0,n.useRef)(N);(0,n.useEffect)(()=>{O.current=N}),(0,n.useEffect)(()=>{if(!(0,s.isNative)())return;let e=t.default.env.NEXT_PUBLIC_GOOGLE_IOS_CLIENT_ID;eL.initialize({google:{webClientId:"1047552908442-pmp2k55r129779sh55lqvljkulr474qp.apps.googleusercontent.com",...e?{iOSClientId:e}:{},mode:"online"}}).then(()=>p(!0)).catch(e=>{console.error("SocialLogin initialize error:",e),p(!0)})},[]),(0,n.useEffect)(()=>{if((0,s.isNative)())return;let e=()=>{window.google?.accounts?.id&&(eZ=e=>{O.current(e.credential)},eX||(window.google.accounts.id.initialize({client_id:"1047552908442-pmp2k55r129779sh55lqvljkulr474qp.apps.googleusercontent.com",use_fedcm_for_prompt:!1,callback:e=>eZ?.(e)}),eX=!0),p(!0))};if(window.google?.accounts?.id)e();else{let t=document.querySelector('script[src*="accounts.google.com/gsi"]');if(t)return t.addEventListener("load",e),()=>t.removeEventListener("load",e)}},[]),(0,n.useEffect)(()=>{if(!l||!i||(0,o.getSessionToken)())return;!(0,s.isNative)()&&c&&window.google?.accounts?.id&&window.google.accounts.id.prompt();let e=setTimeout(()=>f(!0),3e3);return()=>clearTimeout(e)},[c,l,i]);let R=async()=>{if((0,s.isNative)()){try{let e=(await eL.login({provider:"google",options:{scopes:["email","profile"]}})).result;e&&"idToken"in e&&"string"==typeof e.idToken&&e.idToken?N(e.idToken):I((0,e$.getUiText)((0,e$.getInitialUiLang)()).loginFailed,{type:"error"})}catch(r){console.warn("Native Google sign in failed or cancelled:",r);let e=String(r?.message||"").toLowerCase(),t=String(r?.code??"");e.includes("cancel")||e.includes("abort")||e.includes("dismiss")||"16"===t||"SIGN_IN_CANCELLED"===t||"USER_CANCELLED"===t||I((0,e$.getUiText)((0,e$.getInitialUiLang)()).loginFailed,{type:"error"})}return}window.google?.accounts?.id&&window.google.accounts.id.prompt()};return(0,r.jsx)(eJ.Provider,{value:{user:i,status:v,gisReady:c,isAdmin:A,isAdminReady:S,sessionReady:T,signIn:R,signOut:()=>{ek((0,o.getSessionToken)()),document.cookie=`${eH}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`;try{window.localStorage.removeItem(eW)}catch{}(0,o.clearSessionToken)(),u(null),f(!0),(0,s.isNative)()?eL.logout({provider:"google"}).catch(()=>{}):window.google?.accounts?.id&&window.google.accounts.id.disableAutoSelect()}},children:e})},"GoogleSignInButton",0,function({locale:e}){let{gisReady:t,signIn:i}=e0(),o=(0,n.useRef)(null);if((0,n.useEffect)(()=>{if((0,s.isNative)()||!t||!o.current||!window.google?.accounts?.id)return;let r=o.current,n=()=>{let t=!window.matchMedia("(min-width: 640px)").matches;r.innerHTML="",window.google.accounts.id.renderButton(r,t?{type:"standard",theme:"outline",size:"medium",text:"signin",shape:"pill",locale:e||"ko"}:{type:"standard",theme:"outline",size:"medium",text:"signin_with",shape:"pill",width:200,locale:e||"ko"})};n();let i=window.matchMedia("(min-width: 640px)");return i.addEventListener("change",n),()=>i.removeEventListener("change",n)},[t,e]),(0,s.isNative)()){let t=(0,e$.getUiText)(e).login;return(0,r.jsx)("div",{className:"flex h-8 w-[104px] items-center justify-end overflow-hidden sm:w-[200px]",children:(0,r.jsxs)("button",{type:"button",onClick:()=>i(),className:"inline-flex h-8 items-center justify-center gap-2 rounded-full border border-stone-300 bg-white px-3 text-xs font-medium text-stone-700 shadow-xs hover:bg-stone-50 active:bg-stone-100 dark:border-stone-600 dark:bg-stone-800 dark:text-stone-200 dark:hover:bg-stone-700",children:[(0,r.jsxs)("svg",{className:"h-4 w-4 shrink-0",viewBox:"0 0 24 24",children:[(0,r.jsx)("path",{fill:"#4285F4",d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"}),(0,r.jsx)("path",{fill:"#34A853",d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"}),(0,r.jsx)("path",{fill:"#FBBC05",d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.06H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.94l2.85-2.22.81-.63z"}),(0,r.jsx)("path",{fill:"#EA4335",d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.06l3.66 2.84c.87-2.6 3.3-4.52 6.16-4.52z"})]}),(0,r.jsx)("span",{className:"truncate",children:t})]})})}return(0,r.jsx)("div",{ref:o,className:"flex h-8 w-[104px] items-center justify-end overflow-hidden sm:w-[200px]"})},"useAuth",0,e0],63398)}]);