From dbbdbdb96bc73ef8191a6318812af333c83de62d Mon Sep 17 00:00:00 2001 From: Jaehyeon Han Date: Sun, 19 Apr 2026 12:12:45 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat(admin):=20=EA=B4=80=EB=A6=AC=EC=9E=90?= =?UTF-8?q?=20=EA=B6=8C=ED=95=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/controller/AdminAuthController.java | 39 +++++++++++++++++++ .../PromptManagementController.java | 2 +- .../admin/dto/request/AdminLoginRequest.java | 24 ++++++++++++ .../domain/admin/entity/Admin.java | 31 +++++++++++++++ .../admin/repository/AdminRepository.java | 11 ++++++ .../admin/service/AdminAuthService.java | 35 +++++++++++++++++ .../global/config/WebSecurityConfig.java | 3 +- 7 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/example/konnect_backend/domain/admin/controller/AdminAuthController.java rename src/main/java/com/example/konnect_backend/domain/{ai => admin}/controller/PromptManagementController.java (99%) create mode 100644 src/main/java/com/example/konnect_backend/domain/admin/dto/request/AdminLoginRequest.java create mode 100644 src/main/java/com/example/konnect_backend/domain/admin/entity/Admin.java create mode 100644 src/main/java/com/example/konnect_backend/domain/admin/repository/AdminRepository.java create mode 100644 src/main/java/com/example/konnect_backend/domain/admin/service/AdminAuthService.java diff --git a/src/main/java/com/example/konnect_backend/domain/admin/controller/AdminAuthController.java b/src/main/java/com/example/konnect_backend/domain/admin/controller/AdminAuthController.java new file mode 100644 index 0000000..49cf1bb --- /dev/null +++ b/src/main/java/com/example/konnect_backend/domain/admin/controller/AdminAuthController.java @@ -0,0 +1,39 @@ +package com.example.konnect_backend.domain.admin.controller; + +import com.example.konnect_backend.domain.admin.dto.request.AdminLoginRequest; +import com.example.konnect_backend.domain.admin.service.AdminAuthService; +import com.example.konnect_backend.domain.auth.dto.response.AuthResponse; +import com.example.konnect_backend.global.ApiResponse; +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/admin/auth") +@RequiredArgsConstructor +@Hidden +@Tag(name = "Admin Authentication", description = "관리자 인증 (스펙 비노출)") +public class AdminAuthController { + + private final AdminAuthService adminAuthService; + + @PostMapping("/login") + @Operation(summary = "관리자 로그인", description = "요청 JSON의 id(로그인 ID)·password 검증 후 ADMIN 역할 JWT 액세스 토큰을 발급합니다.") + @ApiResponses(value = { + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "잘못된 요청", content = @Content(schema = @Schema(implementation = ApiResponse.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "계정 없음 또는 비밀번호 불일치", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + public ApiResponse login(@Valid @RequestBody AdminLoginRequest request) { + return ApiResponse.onSuccess(adminAuthService.login(request)); + } +} diff --git a/src/main/java/com/example/konnect_backend/domain/ai/controller/PromptManagementController.java b/src/main/java/com/example/konnect_backend/domain/admin/controller/PromptManagementController.java similarity index 99% rename from src/main/java/com/example/konnect_backend/domain/ai/controller/PromptManagementController.java rename to src/main/java/com/example/konnect_backend/domain/admin/controller/PromptManagementController.java index 4516eca..8dc0fda 100644 --- a/src/main/java/com/example/konnect_backend/domain/ai/controller/PromptManagementController.java +++ b/src/main/java/com/example/konnect_backend/domain/admin/controller/PromptManagementController.java @@ -1,4 +1,4 @@ -package com.example.konnect_backend.domain.ai.controller; +package com.example.konnect_backend.domain.admin.controller; import com.example.konnect_backend.domain.ai.domain.vo.PipelineContext; import com.example.konnect_backend.domain.ai.domain.vo.TextExtractionResult; diff --git a/src/main/java/com/example/konnect_backend/domain/admin/dto/request/AdminLoginRequest.java b/src/main/java/com/example/konnect_backend/domain/admin/dto/request/AdminLoginRequest.java new file mode 100644 index 0000000..ca37b0d --- /dev/null +++ b/src/main/java/com/example/konnect_backend/domain/admin/dto/request/AdminLoginRequest.java @@ -0,0 +1,24 @@ +package com.example.konnect_backend.domain.admin.dto.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@Schema(description = "관리자 로그인 요청") +public class AdminLoginRequest { + + @NotBlank + @JsonProperty("id") + @Schema(description = "로그인 ID", example = "root") + private String loginId; + + @NotBlank + @Schema(description = "비밀번호") + private String password; +} diff --git a/src/main/java/com/example/konnect_backend/domain/admin/entity/Admin.java b/src/main/java/com/example/konnect_backend/domain/admin/entity/Admin.java new file mode 100644 index 0000000..1e3c411 --- /dev/null +++ b/src/main/java/com/example/konnect_backend/domain/admin/entity/Admin.java @@ -0,0 +1,31 @@ +package com.example.konnect_backend.domain.admin.entity; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "admin") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Admin { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "login_id", nullable = false, unique = true, length = 64) + private String loginId; + + @Column(nullable = false) + private String password; + + @Column(length = 100) + private String name; + + @Column(name = "created_at", nullable = false, updatable = false) + private LocalDateTime createdAt; +} diff --git a/src/main/java/com/example/konnect_backend/domain/admin/repository/AdminRepository.java b/src/main/java/com/example/konnect_backend/domain/admin/repository/AdminRepository.java new file mode 100644 index 0000000..af28c28 --- /dev/null +++ b/src/main/java/com/example/konnect_backend/domain/admin/repository/AdminRepository.java @@ -0,0 +1,11 @@ +package com.example.konnect_backend.domain.admin.repository; + +import com.example.konnect_backend.domain.admin.entity.Admin; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface AdminRepository extends JpaRepository { + + Optional findByLoginId(String loginId); +} diff --git a/src/main/java/com/example/konnect_backend/domain/admin/service/AdminAuthService.java b/src/main/java/com/example/konnect_backend/domain/admin/service/AdminAuthService.java new file mode 100644 index 0000000..2897ea6 --- /dev/null +++ b/src/main/java/com/example/konnect_backend/domain/admin/service/AdminAuthService.java @@ -0,0 +1,35 @@ +package com.example.konnect_backend.domain.admin.service; + +import com.example.konnect_backend.domain.admin.dto.request.AdminLoginRequest; +import com.example.konnect_backend.domain.admin.entity.Admin; +import com.example.konnect_backend.domain.admin.repository.AdminRepository; +import com.example.konnect_backend.domain.auth.dto.response.AuthResponse; +import com.example.konnect_backend.global.code.status.ErrorStatus; +import com.example.konnect_backend.global.exception.GeneralException; +import com.example.konnect_backend.global.security.JwtTokenProvider; +import lombok.RequiredArgsConstructor; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class AdminAuthService { + + private final AdminRepository adminRepository; + private final PasswordEncoder passwordEncoder; + private final JwtTokenProvider jwtTokenProvider; + + public AuthResponse login(AdminLoginRequest request) { + Admin admin = adminRepository.findByLoginId(request.getLoginId()) + .orElseThrow(() -> new GeneralException(ErrorStatus.PASSWORD_FAILED)); + + if (!passwordEncoder.matches(request.getPassword(), admin.getPassword())) { + throw new GeneralException(ErrorStatus.PASSWORD_FAILED); + } + + String accessToken = jwtTokenProvider.createToken(admin.getId(), "ADMIN"); + return AuthResponse.of(accessToken, admin.getId(), "ADMIN"); + } +} diff --git a/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java b/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java index cff242b..10963a9 100644 --- a/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java +++ b/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java @@ -58,7 +58,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti "/webjars/**" ).permitAll() .requestMatchers("/api/auth/**", "/api/schools/**", "/api/device/**", "/api/ai/**", "/api/usage/**", "/api/message/**", "/api/users/language").permitAll() - .requestMatchers("/api/admin/**").denyAll() // Todo 관리자만 허용 필요 + .requestMatchers(HttpMethod.POST, "/api/admin/auth/login").permitAll() + .requestMatchers("/api/admin/**").hasRole("ADMIN") .requestMatchers("/api/ws/**", "/ws/**").permitAll() .requestMatchers("/login/oauth2/**", "/oauth2/**").permitAll() .requestMatchers("/public/**").permitAll() From 480033966e5485a90089013ebcf8cae32fbb329d Mon Sep 17 00:00:00 2001 From: Jaehyeon Han Date: Sun, 19 Apr 2026 12:17:17 +0900 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20Swagger=20=EC=84=9C=EB=B2=84=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/konnect_backend/global/config/SwaggerConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/konnect_backend/global/config/SwaggerConfig.java b/src/main/java/com/example/konnect_backend/global/config/SwaggerConfig.java index bf0e662..8da229a 100644 --- a/src/main/java/com/example/konnect_backend/global/config/SwaggerConfig.java +++ b/src/main/java/com/example/konnect_backend/global/config/SwaggerConfig.java @@ -29,7 +29,7 @@ public OpenAPI openAPI() { // 서버 URL 명시 (http 대신 https) Server productionServer = new Server() - .url("https://api.konnect-women.com") + .url("https://api.women-konnect.com") .description("Production Server (HTTPS)"); Server localServer = new Server() From 2f1f6bbe0721524280021bb048a3f95bb81a6bcb Mon Sep 17 00:00:00 2001 From: Jaehyeon Han Date: Sun, 19 Apr 2026 15:06:38 +0900 Subject: [PATCH 3/6] =?UTF-8?q?refactor(ai):=20=EB=A1=9C=EA=B9=85=20?= =?UTF-8?q?=EB=B0=8F=20=ED=94=84=EB=A1=AC=ED=94=84=ED=8A=B8=20=ED=99=9C?= =?UTF-8?q?=EC=84=B1=ED=99=94=20=EC=98=88=EC=99=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EB=B3=B4=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 파이프라인 외부 호출로 인한 로깅 시 기본 requestId 주입 - 로깅 서비스 트랜잭션 분리 강화 - 프롬프트 활성화 시 unique 제약 위반 방지 위해 flush 추가 --- .../domain/ai/aop/LlmLoggingAspect.java | 4 ++-- .../domain/ai/service/log/GeminiLogService.java | 17 ++++++++++++++--- .../management/PromptManagementService.java | 4 +++- .../global/config/WebSecurityConfig.java | 2 +- src/main/resources/application.properties | 2 +- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/konnect_backend/domain/ai/aop/LlmLoggingAspect.java b/src/main/java/com/example/konnect_backend/domain/ai/aop/LlmLoggingAspect.java index cb331fe..89f52aa 100644 --- a/src/main/java/com/example/konnect_backend/domain/ai/aop/LlmLoggingAspect.java +++ b/src/main/java/com/example/konnect_backend/domain/ai/aop/LlmLoggingAspect.java @@ -57,8 +57,8 @@ public Object saveModuleNameAndPromptVersionInContext(ProceedingJoinPoint joinPo public Object logGeminiCall(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); PromptContext promptContext = PromptContextHolder.get(); - String requestIdString = MDC.get(REQUEST_ID_KEY); // 모듈 자체를 비동기로 호출 시 주입 또는 전파 필요 - UUID requestId = UUID.fromString(requestIdString); + String requestIdString = MDC.get(REQUEST_ID_KEY); + UUID requestId = requestIdString == null ? UUID.randomUUID() : UUID.fromString(requestIdString); try { GeminiCallResult callResult = (GeminiCallResult) joinPoint.proceed(); diff --git a/src/main/java/com/example/konnect_backend/domain/ai/service/log/GeminiLogService.java b/src/main/java/com/example/konnect_backend/domain/ai/service/log/GeminiLogService.java index 0613a94..9ae6584 100644 --- a/src/main/java/com/example/konnect_backend/domain/ai/service/log/GeminiLogService.java +++ b/src/main/java/com/example/konnect_backend/domain/ai/service/log/GeminiLogService.java @@ -49,11 +49,22 @@ public void saveLog(UUID requestId, @Nullable GeminiCallResult result, PromptCon moduleName, result.finishReason(), logTime); } - LlmCallMetadata saved = metadataRepository.save(metadata); + LlmCallMetadata saved = null; + + try { + saved = metadataRepository.saveAndFlush(metadata); + } catch (Exception e) { + log.error("metadata save 실패", + kv("request id", requestId), + kv("module name", moduleName), + kv("prompt version", promptVersion), + kv("error", e.getMessage()), + e + ); + } - // 프롬프트 템플릿 정보 및 입력 변수와 모델 응답 로깅 log.info("Gemini API 호출 완료", - kv("metadata id", saved.getId()), + kv("metadata id", saved != null ? saved.getId() : null), kv("request id", requestId), kv("model response", result == null ? null : result.response()), kv("module name", moduleName), diff --git a/src/main/java/com/example/konnect_backend/domain/ai/service/prompt/management/PromptManagementService.java b/src/main/java/com/example/konnect_backend/domain/ai/service/prompt/management/PromptManagementService.java index 988acc1..222d0bd 100644 --- a/src/main/java/com/example/konnect_backend/domain/ai/service/prompt/management/PromptManagementService.java +++ b/src/main/java/com/example/konnect_backend/domain/ai/service/prompt/management/PromptManagementService.java @@ -73,10 +73,12 @@ public void activate(Long promptId) { } PromptTemplate previousActive = activePrompts.get(0); - toActivate.setStatus(PromptStatus.ACTIVE); previousActive.setStatus(PromptStatus.DEPRECATED); + promptRepository.flush(); + toActivate.setStatus(PromptStatus.ACTIVE); } + @Transactional public RunResultResponse run(RunPromptRequest request) { String prompt = resolver.resolve(request.promptTemplate(), request.vars()); diff --git a/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java b/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java index 10963a9..2b9d063 100644 --- a/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java +++ b/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java @@ -64,7 +64,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .requestMatchers("/login/oauth2/**", "/oauth2/**").permitAll() .requestMatchers("/public/**").permitAll() .requestMatchers(HttpMethod.OPTIONS, "/**").permitAll() - .requestMatchers("/api/ai/analyze").permitAll() // 로컬 테스트 편의를 위해 허용 + .requestMatchers("/api/ai/analyze").permitAll() .anyRequest().authenticated() ) .oauth2Login(o -> o diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5ff633a..4161061 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -6,7 +6,7 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # JPA Configuration spring.jpa.hibernate.ddl-auto=none -spring.jpa.show-sql=true +spring.jpa.show-sql=false spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect spring.jpa.properties.hibernate.format_sql=true From 5a7b779dbd4418103e74b33833fb771ef52641f9 Mon Sep 17 00:00:00 2001 From: Jaehyeon Han Date: Sun, 19 Apr 2026 15:37:09 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat(admin):=20=ED=94=84=EB=A1=AC=ED=94=84?= =?UTF-8?q?=ED=8A=B8=20=EA=B4=80=EB=A6=AC=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EB=A6=AC=EC=95=A1=ED=8A=B8=20=EB=B9=8C=EB=93=9C=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/config/WebSecurityConfig.java | 2 +- .../resources/static/assets/index-B3y3P6tv.js | 120 ++++++++++++++++++ .../static/assets/index-DuX3EULQ.css | 1 + src/main/resources/static/index.html | 13 ++ 4 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/static/assets/index-B3y3P6tv.js create mode 100644 src/main/resources/static/assets/index-DuX3EULQ.css create mode 100644 src/main/resources/static/index.html diff --git a/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java b/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java index 2b9d063..0b171ee 100644 --- a/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java +++ b/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java @@ -46,7 +46,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .cors(cors -> cors.configurationSource(corsConfigurationSource())) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth -> auth - .requestMatchers("/", "/index.html", "/static/**", "/favicon.ico").permitAll() + .requestMatchers("/", "/index.html", "/assets/**", "/favicon.ico").permitAll() // Swagger UI 관련 모든 경로 허용 .requestMatchers( "/swagger-ui.html", diff --git a/src/main/resources/static/assets/index-B3y3P6tv.js b/src/main/resources/static/assets/index-B3y3P6tv.js new file mode 100644 index 0000000..b9d6b80 --- /dev/null +++ b/src/main/resources/static/assets/index-B3y3P6tv.js @@ -0,0 +1,120 @@ +function Pd(e,t){for(var n=0;nr[l]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const o of l)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(l){const o={};return l.integrity&&(o.integrity=l.integrity),l.referrerPolicy&&(o.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?o.credentials="include":l.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(l){if(l.ep)return;l.ep=!0;const o=n(l);fetch(l.href,o)}})();function Td(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var za={exports:{}},Ql={},Aa={exports:{}},F={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var _r=Symbol.for("react.element"),Od=Symbol.for("react.portal"),jd=Symbol.for("react.fragment"),Ld=Symbol.for("react.strict_mode"),zd=Symbol.for("react.profiler"),Ad=Symbol.for("react.provider"),Fd=Symbol.for("react.context"),Id=Symbol.for("react.forward_ref"),Dd=Symbol.for("react.suspense"),Ud=Symbol.for("react.memo"),Md=Symbol.for("react.lazy"),Ys=Symbol.iterator;function Bd(e){return e===null||typeof e!="object"?null:(e=Ys&&e[Ys]||e["@@iterator"],typeof e=="function"?e:null)}var Fa={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Ia=Object.assign,Da={};function An(e,t,n){this.props=e,this.context=t,this.refs=Da,this.updater=n||Fa}An.prototype.isReactComponent={};An.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};An.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Ua(){}Ua.prototype=An.prototype;function Ki(e,t,n){this.props=e,this.context=t,this.refs=Da,this.updater=n||Fa}var bi=Ki.prototype=new Ua;bi.constructor=Ki;Ia(bi,An.prototype);bi.isPureReactComponent=!0;var Gs=Array.isArray,Ma=Object.prototype.hasOwnProperty,qi={current:null},Ba={key:!0,ref:!0,__self:!0,__source:!0};function $a(e,t,n){var r,l={},o=null,i=null;if(t!=null)for(r in t.ref!==void 0&&(i=t.ref),t.key!==void 0&&(o=""+t.key),t)Ma.call(t,r)&&!Ba.hasOwnProperty(r)&&(l[r]=t[r]);var s=arguments.length-2;if(s===1)l.children=n;else if(1>>1,V=_[U];if(0>>1;Ul(on,A))Itl(Ur,on)?(_[U]=Ur,_[It]=A,U=It):(_[U]=on,_[je]=A,U=je);else if(Itl(Ur,A))_[U]=Ur,_[It]=A,U=It;else break e}}return L}function l(_,L){var A=_.sortIndex-L.sortIndex;return A!==0?A:_.id-L.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var i=Date,s=i.now();e.unstable_now=function(){return i.now()-s}}var u=[],a=[],c=1,f=null,g=3,S=!1,p=!1,y=!1,w=typeof setTimeout=="function"?setTimeout:null,h=typeof clearTimeout=="function"?clearTimeout:null,d=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function m(_){for(var L=n(a);L!==null;){if(L.callback===null)r(a);else if(L.startTime<=_)r(a),L.sortIndex=L.expirationTime,t(u,L);else break;L=n(a)}}function E(_){if(y=!1,m(_),!p)if(n(u)!==null)p=!0,ne(N);else{var L=n(a);L!==null&&ln(E,L.startTime-_)}}function N(_,L){p=!1,y&&(y=!1,h(O),O=-1),S=!0;var A=g;try{for(m(L),f=n(u);f!==null&&(!(f.expirationTime>L)||_&&!ue());){var U=f.callback;if(typeof U=="function"){f.callback=null,g=f.priorityLevel;var V=U(f.expirationTime<=L);L=e.unstable_now(),typeof V=="function"?f.callback=V:f===n(u)&&r(u),m(L)}else r(u);f=n(u)}if(f!==null)var dt=!0;else{var je=n(a);je!==null&&ln(E,je.startTime-L),dt=!1}return dt}finally{f=null,g=A,S=!1}}var P=!1,R=null,O=-1,B=5,z=-1;function ue(){return!(e.unstable_now()-z_||125<_?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):B=0<_?Math.floor(1e3/_):5},e.unstable_getCurrentPriorityLevel=function(){return g},e.unstable_getFirstCallbackNode=function(){return n(u)},e.unstable_next=function(_){switch(g){case 1:case 2:case 3:var L=3;break;default:L=g}var A=g;g=L;try{return _()}finally{g=A}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=function(){},e.unstable_runWithPriority=function(_,L){switch(_){case 1:case 2:case 3:case 4:case 5:break;default:_=3}var A=g;g=_;try{return L()}finally{g=A}},e.unstable_scheduleCallback=function(_,L,A){var U=e.unstable_now();switch(typeof A=="object"&&A!==null?(A=A.delay,A=typeof A=="number"&&0U?(_.sortIndex=A,t(a,_),n(u)===null&&_===n(a)&&(y?(h(O),O=-1):y=!0,ln(E,A-U))):(_.sortIndex=V,t(u,_),p||S||(p=!0,ne(N))),_},e.unstable_shouldYield=ue,e.unstable_wrapCallback=function(_){var L=g;return function(){var A=g;g=L;try{return _.apply(this,arguments)}finally{g=A}}}})(Ka);Qa.exports=Ka;var Zd=Qa.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ep=k,Pe=Zd;function C(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),bo=Object.prototype.hasOwnProperty,tp=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,eu={},tu={};function np(e){return bo.call(tu,e)?!0:bo.call(eu,e)?!1:tp.test(e)?tu[e]=!0:(eu[e]=!0,!1)}function rp(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function lp(e,t,n,r){if(t===null||typeof t>"u"||rp(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function ye(e,t,n,r,l,o,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var se={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){se[e]=new ye(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];se[t]=new ye(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){se[e]=new ye(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){se[e]=new ye(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){se[e]=new ye(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){se[e]=new ye(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){se[e]=new ye(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){se[e]=new ye(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){se[e]=new ye(e,5,!1,e.toLowerCase(),null,!1,!1)});var Xi=/[\-:]([a-z])/g;function Yi(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Xi,Yi);se[t]=new ye(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Xi,Yi);se[t]=new ye(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Xi,Yi);se[t]=new ye(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){se[e]=new ye(e,1,!1,e.toLowerCase(),null,!1,!1)});se.xlinkHref=new ye("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){se[e]=new ye(e,1,!1,e.toLowerCase(),null,!0,!0)});function Gi(e,t,n,r){var l=se.hasOwnProperty(t)?se[t]:null;(l!==null?l.type!==0:r||!(2s||l[i]!==o[s]){var u=` +`+l[i].replace(" at new "," at ");return e.displayName&&u.includes("")&&(u=u.replace("",e.displayName)),u}while(1<=i&&0<=s);break}}}finally{vo=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Jn(e):""}function op(e){switch(e.tag){case 5:return Jn(e.type);case 16:return Jn("Lazy");case 13:return Jn("Suspense");case 19:return Jn("SuspenseList");case 0:case 2:case 15:return e=wo(e.type,!1),e;case 11:return e=wo(e.type.render,!1),e;case 1:return e=wo(e.type,!0),e;default:return""}}function Yo(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case an:return"Fragment";case un:return"Portal";case qo:return"Profiler";case Zi:return"StrictMode";case Jo:return"Suspense";case Xo:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Ja:return(e.displayName||"Context")+".Consumer";case qa:return(e._context.displayName||"Context")+".Provider";case es:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ts:return t=e.displayName||null,t!==null?t:Yo(e.type)||"Memo";case ht:t=e._payload,e=e._init;try{return Yo(e(t))}catch{}}return null}function ip(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Yo(t);case 8:return t===Zi?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Ot(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Ya(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function sp(e){var t=Ya(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(i){r=""+i,o.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function $r(e){e._valueTracker||(e._valueTracker=sp(e))}function Ga(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Ya(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function vl(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Go(e,t){var n=t.checked;return q({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function ru(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=Ot(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Za(e,t){t=t.checked,t!=null&&Gi(e,"checked",t,!1)}function Zo(e,t){Za(e,t);var n=Ot(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?ei(e,t.type,n):t.hasOwnProperty("defaultValue")&&ei(e,t.type,Ot(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function lu(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function ei(e,t,n){(t!=="number"||vl(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Xn=Array.isArray;function xn(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=Vr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function ar(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Zn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},up=["Webkit","ms","Moz","O"];Object.keys(Zn).forEach(function(e){up.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Zn[t]=Zn[e]})});function rc(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Zn.hasOwnProperty(e)&&Zn[e]?(""+t).trim():t+"px"}function lc(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=rc(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var ap=q({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ri(e,t){if(t){if(ap[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(C(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(C(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(C(61))}if(t.style!=null&&typeof t.style!="object")throw Error(C(62))}}function li(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var oi=null;function ns(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var ii=null,Sn=null,En=null;function su(e){if(e=Or(e)){if(typeof ii!="function")throw Error(C(280));var t=e.stateNode;t&&(t=Xl(t),ii(e.stateNode,e.type,t))}}function oc(e){Sn?En?En.push(e):En=[e]:Sn=e}function ic(){if(Sn){var e=Sn,t=En;if(En=Sn=null,su(e),t)for(e=0;e>>=0,e===0?32:31-(xp(e)/Sp|0)|0}var Hr=64,Wr=4194304;function Yn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function El(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,o=e.pingedLanes,i=n&268435455;if(i!==0){var s=i&~l;s!==0?r=Yn(s):(o&=i,o!==0&&(r=Yn(o)))}else i=n&~l,i!==0?r=Yn(i):o!==0&&(r=Yn(o));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,o=t&-t,l>=o||l===16&&(o&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Pr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-We(t),e[t]=n}function Np(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=tr),gu=" ",yu=!1;function Rc(e,t){switch(e){case"keyup":return Zp.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function _c(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var cn=!1;function th(e,t){switch(e){case"compositionend":return _c(t);case"keypress":return t.which!==32?null:(yu=!0,gu);case"textInput":return e=t.data,e===gu&&yu?null:e;default:return null}}function nh(e,t){if(cn)return e==="compositionend"||!cs&&Rc(e,t)?(e=Cc(),il=ss=vt=null,cn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Su(n)}}function jc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?jc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Lc(){for(var e=window,t=vl();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=vl(e.document)}return t}function fs(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function fh(e){var t=Lc(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&jc(n.ownerDocument.documentElement,n)){if(r!==null&&fs(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,o=Math.min(r.start,l);r=r.end===void 0?o:Math.min(r.end,l),!e.extend&&o>r&&(l=r,r=o,o=l),l=Eu(n,o);var i=Eu(n,r);l&&i&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,fn=null,di=null,rr=null,pi=!1;function ku(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;pi||fn==null||fn!==vl(r)||(r=fn,"selectionStart"in r&&fs(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),rr&&mr(rr,r)||(rr=r,r=Nl(di,"onSelect"),0hn||(e.current=wi[hn],wi[hn]=null,hn--)}function $(e,t){hn++,wi[hn]=e.current,e.current=t}var jt={},pe=zt(jt),xe=zt(!1),bt=jt;function _n(e,t){var n=e.type.contextTypes;if(!n)return jt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},o;for(o in n)l[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function Se(e){return e=e.childContextTypes,e!=null}function _l(){W(xe),W(pe)}function Ou(e,t,n){if(pe.current!==jt)throw Error(C(168));$(pe,t),$(xe,n)}function $c(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(C(108,ip(e)||"Unknown",l));return q({},n,r)}function Pl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||jt,bt=pe.current,$(pe,e),$(xe,xe.current),!0}function ju(e,t,n){var r=e.stateNode;if(!r)throw Error(C(169));n?(e=$c(e,t,bt),r.__reactInternalMemoizedMergedChildContext=e,W(xe),W(pe),$(pe,e)):W(xe),$(xe,n)}var nt=null,Yl=!1,zo=!1;function Vc(e){nt===null?nt=[e]:nt.push(e)}function kh(e){Yl=!0,Vc(e)}function At(){if(!zo&&nt!==null){zo=!0;var e=0,t=M;try{var n=nt;for(M=1;e>=i,l-=i,rt=1<<32-We(t)+l|n<O?(B=R,R=null):B=R.sibling;var z=g(h,R,m[O],E);if(z===null){R===null&&(R=B);break}e&&R&&z.alternate===null&&t(h,R),d=o(z,d,O),P===null?N=z:P.sibling=z,P=z,R=B}if(O===m.length)return n(h,R),Q&&Dt(h,O),N;if(R===null){for(;OO?(B=R,R=null):B=R.sibling;var ue=g(h,R,z.value,E);if(ue===null){R===null&&(R=B);break}e&&R&&ue.alternate===null&&t(h,R),d=o(ue,d,O),P===null?N=ue:P.sibling=ue,P=ue,R=B}if(z.done)return n(h,R),Q&&Dt(h,O),N;if(R===null){for(;!z.done;O++,z=m.next())z=f(h,z.value,E),z!==null&&(d=o(z,d,O),P===null?N=z:P.sibling=z,P=z);return Q&&Dt(h,O),N}for(R=r(h,R);!z.done;O++,z=m.next())z=S(R,h,O,z.value,E),z!==null&&(e&&z.alternate!==null&&R.delete(z.key===null?O:z.key),d=o(z,d,O),P===null?N=z:P.sibling=z,P=z);return e&&R.forEach(function(I){return t(h,I)}),Q&&Dt(h,O),N}function w(h,d,m,E){if(typeof m=="object"&&m!==null&&m.type===an&&m.key===null&&(m=m.props.children),typeof m=="object"&&m!==null){switch(m.$$typeof){case Br:e:{for(var N=m.key,P=d;P!==null;){if(P.key===N){if(N=m.type,N===an){if(P.tag===7){n(h,P.sibling),d=l(P,m.props.children),d.return=h,h=d;break e}}else if(P.elementType===N||typeof N=="object"&&N!==null&&N.$$typeof===ht&&Au(N)===P.type){n(h,P.sibling),d=l(P,m.props),d.ref=Qn(h,P,m),d.return=h,h=d;break e}n(h,P);break}else t(h,P);P=P.sibling}m.type===an?(d=Qt(m.props.children,h.mode,E,m.key),d.return=h,h=d):(E=hl(m.type,m.key,m.props,null,h.mode,E),E.ref=Qn(h,d,m),E.return=h,h=E)}return i(h);case un:e:{for(P=m.key;d!==null;){if(d.key===P)if(d.tag===4&&d.stateNode.containerInfo===m.containerInfo&&d.stateNode.implementation===m.implementation){n(h,d.sibling),d=l(d,m.children||[]),d.return=h,h=d;break e}else{n(h,d);break}else t(h,d);d=d.sibling}d=$o(m,h.mode,E),d.return=h,h=d}return i(h);case ht:return P=m._init,w(h,d,P(m._payload),E)}if(Xn(m))return p(h,d,m,E);if(Bn(m))return y(h,d,m,E);Yr(h,m)}return typeof m=="string"&&m!==""||typeof m=="number"?(m=""+m,d!==null&&d.tag===6?(n(h,d.sibling),d=l(d,m),d.return=h,h=d):(n(h,d),d=Bo(m,h.mode,E),d.return=h,h=d),i(h)):n(h,d)}return w}var Tn=Kc(!0),bc=Kc(!1),jl=zt(null),Ll=null,yn=null,ms=null;function gs(){ms=yn=Ll=null}function ys(e){var t=jl.current;W(jl),e._currentValue=t}function Ei(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Cn(e,t){Ll=e,ms=yn=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(we=!0),e.firstContext=null)}function De(e){var t=e._currentValue;if(ms!==e)if(e={context:e,memoizedValue:t,next:null},yn===null){if(Ll===null)throw Error(C(308));yn=e,Ll.dependencies={lanes:0,firstContext:e}}else yn=yn.next=e;return t}var $t=null;function vs(e){$t===null?$t=[e]:$t.push(e)}function qc(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,vs(t)):(n.next=l.next,l.next=n),t.interleaved=n,ut(e,r)}function ut(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var mt=!1;function ws(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Jc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function ot(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Nt(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,D&2){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,ut(e,n)}return l=r.interleaved,l===null?(t.next=t,vs(r)):(t.next=l.next,l.next=t),r.interleaved=t,ut(e,n)}function ul(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,ls(e,n)}}function Fu(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,o=null;if(n=n.firstBaseUpdate,n!==null){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};o===null?l=o=i:o=o.next=i,n=n.next}while(n!==null);o===null?l=o=t:o=o.next=t}else l=o=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:o,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function zl(e,t,n,r){var l=e.updateQueue;mt=!1;var o=l.firstBaseUpdate,i=l.lastBaseUpdate,s=l.shared.pending;if(s!==null){l.shared.pending=null;var u=s,a=u.next;u.next=null,i===null?o=a:i.next=a,i=u;var c=e.alternate;c!==null&&(c=c.updateQueue,s=c.lastBaseUpdate,s!==i&&(s===null?c.firstBaseUpdate=a:s.next=a,c.lastBaseUpdate=u))}if(o!==null){var f=l.baseState;i=0,c=a=u=null,s=o;do{var g=s.lane,S=s.eventTime;if((r&g)===g){c!==null&&(c=c.next={eventTime:S,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var p=e,y=s;switch(g=t,S=n,y.tag){case 1:if(p=y.payload,typeof p=="function"){f=p.call(S,f,g);break e}f=p;break e;case 3:p.flags=p.flags&-65537|128;case 0:if(p=y.payload,g=typeof p=="function"?p.call(S,f,g):p,g==null)break e;f=q({},f,g);break e;case 2:mt=!0}}s.callback!==null&&s.lane!==0&&(e.flags|=64,g=l.effects,g===null?l.effects=[s]:g.push(s))}else S={eventTime:S,lane:g,tag:s.tag,payload:s.payload,callback:s.callback,next:null},c===null?(a=c=S,u=f):c=c.next=S,i|=g;if(s=s.next,s===null){if(s=l.shared.pending,s===null)break;g=s,s=g.next,g.next=null,l.lastBaseUpdate=g,l.shared.pending=null}}while(!0);if(c===null&&(u=f),l.baseState=u,l.firstBaseUpdate=a,l.lastBaseUpdate=c,t=l.shared.interleaved,t!==null){l=t;do i|=l.lane,l=l.next;while(l!==t)}else o===null&&(l.shared.lanes=0);Xt|=i,e.lanes=i,e.memoizedState=f}}function Iu(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=Fo.transition;Fo.transition={};try{e(!1),t()}finally{M=n,Fo.transition=r}}function pf(){return Ue().memoizedState}function _h(e,t,n){var r=_t(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},hf(e))mf(t,n);else if(n=qc(e,t,n,r),n!==null){var l=me();Qe(n,e,r,l),gf(n,t,r)}}function Ph(e,t,n){var r=_t(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(hf(e))mf(t,l);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var i=t.lastRenderedState,s=o(i,n);if(l.hasEagerState=!0,l.eagerState=s,Ke(s,i)){var u=t.interleaved;u===null?(l.next=l,vs(t)):(l.next=u.next,u.next=l),t.interleaved=l;return}}catch{}finally{}n=qc(e,t,l,r),n!==null&&(l=me(),Qe(n,e,r,l),gf(n,t,r))}}function hf(e){var t=e.alternate;return e===b||t!==null&&t===b}function mf(e,t){lr=Fl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function gf(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,ls(e,n)}}var Il={readContext:De,useCallback:ae,useContext:ae,useEffect:ae,useImperativeHandle:ae,useInsertionEffect:ae,useLayoutEffect:ae,useMemo:ae,useReducer:ae,useRef:ae,useState:ae,useDebugValue:ae,useDeferredValue:ae,useTransition:ae,useMutableSource:ae,useSyncExternalStore:ae,useId:ae,unstable_isNewReconciler:!1},Th={readContext:De,useCallback:function(e,t){return Xe().memoizedState=[e,t===void 0?null:t],e},useContext:De,useEffect:Uu,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,cl(4194308,4,uf.bind(null,t,e),n)},useLayoutEffect:function(e,t){return cl(4194308,4,e,t)},useInsertionEffect:function(e,t){return cl(4,2,e,t)},useMemo:function(e,t){var n=Xe();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Xe();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=_h.bind(null,b,e),[r.memoizedState,e]},useRef:function(e){var t=Xe();return e={current:e},t.memoizedState=e},useState:Du,useDebugValue:_s,useDeferredValue:function(e){return Xe().memoizedState=e},useTransition:function(){var e=Du(!1),t=e[0];return e=Rh.bind(null,e[1]),Xe().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=b,l=Xe();if(Q){if(n===void 0)throw Error(C(407));n=n()}else{if(n=t(),le===null)throw Error(C(349));Jt&30||Zc(r,t,n)}l.memoizedState=n;var o={value:n,getSnapshot:t};return l.queue=o,Uu(tf.bind(null,r,o,e),[e]),r.flags|=2048,kr(9,ef.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=Xe(),t=le.identifierPrefix;if(Q){var n=lt,r=rt;n=(r&~(1<<32-We(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=Sr++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n==="select"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[Ye]=t,e[vr]=r,Rf(e,t,!1,!1),t.stateNode=e;e:{switch(i=li(n,r),n){case"dialog":H("cancel",e),H("close",e),l=r;break;case"iframe":case"object":case"embed":H("load",e),l=r;break;case"video":case"audio":for(l=0;lLn&&(t.flags|=128,r=!0,Kn(o,!1),t.lanes=4194304)}else{if(!r)if(e=Al(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Kn(o,!0),o.tail===null&&o.tailMode==="hidden"&&!i.alternate&&!Q)return ce(t),null}else 2*X()-o.renderingStartTime>Ln&&n!==1073741824&&(t.flags|=128,r=!0,Kn(o,!1),t.lanes=4194304);o.isBackwards?(i.sibling=t.child,t.child=i):(n=o.last,n!==null?n.sibling=i:t.child=i,o.last=i)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=X(),t.sibling=null,n=K.current,$(K,r?n&1|2:n&1),t):(ce(t),null);case 22:case 23:return zs(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?Ne&1073741824&&(ce(t),t.subtreeFlags&6&&(t.flags|=8192)):ce(t),null;case 24:return null;case 25:return null}throw Error(C(156,t.tag))}function Dh(e,t){switch(ps(t),t.tag){case 1:return Se(t.type)&&_l(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return On(),W(xe),W(pe),Es(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Ss(t),null;case 13:if(W(K),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(C(340));Pn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return W(K),null;case 4:return On(),null;case 10:return ys(t.type._context),null;case 22:case 23:return zs(),null;case 24:return null;default:return null}}var Zr=!1,fe=!1,Uh=typeof WeakSet=="function"?WeakSet:Set,T=null;function vn(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){J(e,t,r)}else n.current=null}function ji(e,t,n){try{n()}catch(r){J(e,t,r)}}var Ju=!1;function Mh(e,t){if(hi=kl,e=Lc(),fs(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var i=0,s=-1,u=-1,a=0,c=0,f=e,g=null;t:for(;;){for(var S;f!==n||l!==0&&f.nodeType!==3||(s=i+l),f!==o||r!==0&&f.nodeType!==3||(u=i+r),f.nodeType===3&&(i+=f.nodeValue.length),(S=f.firstChild)!==null;)g=f,f=S;for(;;){if(f===e)break t;if(g===n&&++a===l&&(s=i),g===o&&++c===r&&(u=i),(S=f.nextSibling)!==null)break;f=g,g=f.parentNode}f=S}n=s===-1||u===-1?null:{start:s,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(mi={focusedElem:e,selectionRange:n},kl=!1,T=t;T!==null;)if(t=T,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,T=e;else for(;T!==null;){t=T;try{var p=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(p!==null){var y=p.memoizedProps,w=p.memoizedState,h=t.stateNode,d=h.getSnapshotBeforeUpdate(t.elementType===t.type?y:$e(t.type,y),w);h.__reactInternalSnapshotBeforeUpdate=d}break;case 3:var m=t.stateNode.containerInfo;m.nodeType===1?m.textContent="":m.nodeType===9&&m.documentElement&&m.removeChild(m.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(C(163))}}catch(E){J(t,t.return,E)}if(e=t.sibling,e!==null){e.return=t.return,T=e;break}T=t.return}return p=Ju,Ju=!1,p}function or(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var o=l.destroy;l.destroy=void 0,o!==void 0&&ji(t,n,o)}l=l.next}while(l!==r)}}function eo(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Li(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Tf(e){var t=e.alternate;t!==null&&(e.alternate=null,Tf(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ye],delete t[vr],delete t[vi],delete t[Sh],delete t[Eh])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Of(e){return e.tag===5||e.tag===3||e.tag===4}function Xu(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Of(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function zi(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Rl));else if(r!==4&&(e=e.child,e!==null))for(zi(e,t,n),e=e.sibling;e!==null;)zi(e,t,n),e=e.sibling}function Ai(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Ai(e,t,n),e=e.sibling;e!==null;)Ai(e,t,n),e=e.sibling}var oe=null,Ve=!1;function pt(e,t,n){for(n=n.child;n!==null;)jf(e,t,n),n=n.sibling}function jf(e,t,n){if(Ge&&typeof Ge.onCommitFiberUnmount=="function")try{Ge.onCommitFiberUnmount(Kl,n)}catch{}switch(n.tag){case 5:fe||vn(n,t);case 6:var r=oe,l=Ve;oe=null,pt(e,t,n),oe=r,Ve=l,oe!==null&&(Ve?(e=oe,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):oe.removeChild(n.stateNode));break;case 18:oe!==null&&(Ve?(e=oe,n=n.stateNode,e.nodeType===8?Lo(e.parentNode,n):e.nodeType===1&&Lo(e,n),pr(e)):Lo(oe,n.stateNode));break;case 4:r=oe,l=Ve,oe=n.stateNode.containerInfo,Ve=!0,pt(e,t,n),oe=r,Ve=l;break;case 0:case 11:case 14:case 15:if(!fe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var o=l,i=o.destroy;o=o.tag,i!==void 0&&(o&2||o&4)&&ji(n,t,i),l=l.next}while(l!==r)}pt(e,t,n);break;case 1:if(!fe&&(vn(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){J(n,t,s)}pt(e,t,n);break;case 21:pt(e,t,n);break;case 22:n.mode&1?(fe=(r=fe)||n.memoizedState!==null,pt(e,t,n),fe=r):pt(e,t,n);break;default:pt(e,t,n)}}function Yu(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new Uh),t.forEach(function(r){var l=qh.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Be(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=i),r&=~o}if(r=l,r=X()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*$h(r/1960))-r,10e?16:e,wt===null)var r=!1;else{if(e=wt,wt=null,Ml=0,D&6)throw Error(C(331));var l=D;for(D|=4,T=e.current;T!==null;){var o=T,i=o.child;if(T.flags&16){var s=o.deletions;if(s!==null){for(var u=0;uX()-js?Wt(e,0):Os|=n),Ee(e,t)}function Mf(e,t){t===0&&(e.mode&1?(t=Wr,Wr<<=1,!(Wr&130023424)&&(Wr=4194304)):t=1);var n=me();e=ut(e,t),e!==null&&(Pr(e,t,n),Ee(e,n))}function bh(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Mf(e,n)}function qh(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(C(314))}r!==null&&r.delete(t),Mf(e,n)}var Bf;Bf=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||xe.current)we=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return we=!1,Fh(e,t,n);we=!!(e.flags&131072)}else we=!1,Q&&t.flags&1048576&&Hc(t,Ol,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;fl(e,t),e=t.pendingProps;var l=_n(t,pe.current);Cn(t,n),l=Cs(null,t,r,e,l,n);var o=Ns();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Se(r)?(o=!0,Pl(t)):o=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,ws(t),l.updater=Zl,t.stateNode=l,l._reactInternals=t,Ci(t,r,e,n),t=_i(null,t,r,!0,o,n)):(t.tag=0,Q&&o&&ds(t),he(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(fl(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=Xh(r),e=$e(r,e),l){case 0:t=Ri(null,t,r,e,n);break e;case 1:t=Ku(null,t,r,e,n);break e;case 11:t=Wu(null,t,r,e,n);break e;case 14:t=Qu(null,t,r,$e(r.type,e),n);break e}throw Error(C(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:$e(r,l),Ri(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:$e(r,l),Ku(e,t,r,l,n);case 3:e:{if(kf(t),e===null)throw Error(C(387));r=t.pendingProps,o=t.memoizedState,l=o.element,Jc(e,t),zl(t,r,null,n);var i=t.memoizedState;if(r=i.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){l=jn(Error(C(423)),t),t=bu(e,t,r,n,l);break e}else if(r!==l){l=jn(Error(C(424)),t),t=bu(e,t,r,n,l);break e}else for(Re=Ct(t.stateNode.containerInfo.firstChild),_e=t,Q=!0,He=null,n=bc(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(Pn(),r===l){t=at(e,t,n);break e}he(e,t,r,n)}t=t.child}return t;case 5:return Xc(t),e===null&&Si(t),r=t.type,l=t.pendingProps,o=e!==null?e.memoizedProps:null,i=l.children,gi(r,l)?i=null:o!==null&&gi(r,o)&&(t.flags|=32),Ef(e,t),he(e,t,i,n),t.child;case 6:return e===null&&Si(t),null;case 13:return Cf(e,t,n);case 4:return xs(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=Tn(t,null,r,n):he(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:$e(r,l),Wu(e,t,r,l,n);case 7:return he(e,t,t.pendingProps,n),t.child;case 8:return he(e,t,t.pendingProps.children,n),t.child;case 12:return he(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,o=t.memoizedProps,i=l.value,$(jl,r._currentValue),r._currentValue=i,o!==null)if(Ke(o.value,i)){if(o.children===l.children&&!xe.current){t=at(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var s=o.dependencies;if(s!==null){i=o.child;for(var u=s.firstContext;u!==null;){if(u.context===r){if(o.tag===1){u=ot(-1,n&-n),u.tag=2;var a=o.updateQueue;if(a!==null){a=a.shared;var c=a.pending;c===null?u.next=u:(u.next=c.next,c.next=u),a.pending=u}}o.lanes|=n,u=o.alternate,u!==null&&(u.lanes|=n),Ei(o.return,n,t),s.lanes|=n;break}u=u.next}}else if(o.tag===10)i=o.type===t.type?null:o.child;else if(o.tag===18){if(i=o.return,i===null)throw Error(C(341));i.lanes|=n,s=i.alternate,s!==null&&(s.lanes|=n),Ei(i,n,t),i=o.sibling}else i=o.child;if(i!==null)i.return=o;else for(i=o;i!==null;){if(i===t){i=null;break}if(o=i.sibling,o!==null){o.return=i.return,i=o;break}i=i.return}o=i}he(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,Cn(t,n),l=De(l),r=r(l),t.flags|=1,he(e,t,r,n),t.child;case 14:return r=t.type,l=$e(r,t.pendingProps),l=$e(r.type,l),Qu(e,t,r,l,n);case 15:return xf(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:$e(r,l),fl(e,t),t.tag=1,Se(r)?(e=!0,Pl(t)):e=!1,Cn(t,n),yf(t,r,l),Ci(t,r,l,n),_i(null,t,r,!0,e,n);case 19:return Nf(e,t,n);case 22:return Sf(e,t,n)}throw Error(C(156,t.tag))};function $f(e,t){return pc(e,t)}function Jh(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Fe(e,t,n,r){return new Jh(e,t,n,r)}function Fs(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Xh(e){if(typeof e=="function")return Fs(e)?1:0;if(e!=null){if(e=e.$$typeof,e===es)return 11;if(e===ts)return 14}return 2}function Pt(e,t){var n=e.alternate;return n===null?(n=Fe(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function hl(e,t,n,r,l,o){var i=2;if(r=e,typeof e=="function")Fs(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case an:return Qt(n.children,l,o,t);case Zi:i=8,l|=8;break;case qo:return e=Fe(12,n,t,l|2),e.elementType=qo,e.lanes=o,e;case Jo:return e=Fe(13,n,t,l),e.elementType=Jo,e.lanes=o,e;case Xo:return e=Fe(19,n,t,l),e.elementType=Xo,e.lanes=o,e;case Xa:return no(n,l,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case qa:i=10;break e;case Ja:i=9;break e;case es:i=11;break e;case ts:i=14;break e;case ht:i=16,r=null;break e}throw Error(C(130,e==null?e:typeof e,""))}return t=Fe(i,n,t,l),t.elementType=e,t.type=r,t.lanes=o,t}function Qt(e,t,n,r){return e=Fe(7,e,r,t),e.lanes=n,e}function no(e,t,n,r){return e=Fe(22,e,r,t),e.elementType=Xa,e.lanes=n,e.stateNode={isHidden:!1},e}function Bo(e,t,n){return e=Fe(6,e,null,t),e.lanes=n,e}function $o(e,t,n){return t=Fe(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Yh(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=So(0),this.expirationTimes=So(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=So(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function Is(e,t,n,r,l,o,i,s,u){return e=new Yh(e,t,n,s,u),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Fe(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},ws(o),e}function Gh(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Qf)}catch(e){console.error(e)}}Qf(),Wa.exports=Te;var rm=Wa.exports,Kf,oa=rm;Kf=oa.createRoot,oa.hydrateRoot;/** + * @remix-run/router v1.23.2 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function Nr(){return Nr=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function so(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function om(){return Math.random().toString(36).substr(2,8)}function sa(e,t){return{usr:e.state,key:e.key,idx:t}}function Mi(e,t,n,r){return n===void 0&&(n=null),Nr({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?tn(t):t,{state:n,key:t&&t.key||r||om()})}function Vl(e){let{pathname:t="/",search:n="",hash:r=""}=e;return n&&n!=="?"&&(t+=n.charAt(0)==="?"?n:"?"+n),r&&r!=="#"&&(t+=r.charAt(0)==="#"?r:"#"+r),t}function tn(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function im(e,t,n,r){r===void 0&&(r={});let{window:l=document.defaultView,v5Compat:o=!1}=r,i=l.history,s=xt.Pop,u=null,a=c();a==null&&(a=0,i.replaceState(Nr({},i.state,{idx:a}),""));function c(){return(i.state||{idx:null}).idx}function f(){s=xt.Pop;let w=c(),h=w==null?null:w-a;a=w,u&&u({action:s,location:y.location,delta:h})}function g(w,h){s=xt.Push;let d=Mi(y.location,w,h);n&&n(d,w),a=c()+1;let m=sa(d,a),E=y.createHref(d);try{i.pushState(m,"",E)}catch(N){if(N instanceof DOMException&&N.name==="DataCloneError")throw N;l.location.assign(E)}o&&u&&u({action:s,location:y.location,delta:1})}function S(w,h){s=xt.Replace;let d=Mi(y.location,w,h);n&&n(d,w),a=c();let m=sa(d,a),E=y.createHref(d);i.replaceState(m,"",E),o&&u&&u({action:s,location:y.location,delta:0})}function p(w){let h=l.location.origin!=="null"?l.location.origin:l.location.href,d=typeof w=="string"?w:Vl(w);return d=d.replace(/ $/,"%20"),Y(h,"No window.location.(origin|href) available to create URL for href: "+d),new URL(d,h)}let y={get action(){return s},get location(){return e(l,i)},listen(w){if(u)throw new Error("A history only accepts one active listener");return l.addEventListener(ia,f),u=w,()=>{l.removeEventListener(ia,f),u=null}},createHref(w){return t(l,w)},createURL:p,encodeLocation(w){let h=p(w);return{pathname:h.pathname,search:h.search,hash:h.hash}},push:g,replace:S,go(w){return i.go(w)}};return y}var ua;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(ua||(ua={}));function sm(e,t,n){return n===void 0&&(n="/"),um(e,t,n)}function um(e,t,n,r){let l=typeof t=="string"?tn(t):t,o=Bs(l.pathname||"/",n);if(o==null)return null;let i=bf(e);am(i);let s=null;for(let u=0;s==null&&u{let u={relativePath:s===void 0?o.path||"":s,caseSensitive:o.caseSensitive===!0,childrenIndex:i,route:o};u.relativePath.startsWith("/")&&(Y(u.relativePath.startsWith(r),'Absolute route path "'+u.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),u.relativePath=u.relativePath.slice(r.length));let a=Tt([r,u.relativePath]),c=n.concat(u);o.children&&o.children.length>0&&(Y(o.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+a+'".')),bf(o.children,t,c,a)),!(o.path==null&&!o.index)&&t.push({path:a,score:gm(a,o.index),routesMeta:c})};return e.forEach((o,i)=>{var s;if(o.path===""||!((s=o.path)!=null&&s.includes("?")))l(o,i);else for(let u of qf(o.path))l(o,i,u)}),t}function qf(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,l=n.endsWith("?"),o=n.replace(/\?$/,"");if(r.length===0)return l?[o,""]:[o];let i=qf(r.join("/")),s=[];return s.push(...i.map(u=>u===""?o:[o,u].join("/"))),l&&s.push(...i),s.map(u=>e.startsWith("/")&&u===""?"/":u)}function am(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:ym(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}const cm=/^:[\w-]+$/,fm=3,dm=2,pm=1,hm=10,mm=-2,aa=e=>e==="*";function gm(e,t){let n=e.split("/"),r=n.length;return n.some(aa)&&(r+=mm),t&&(r+=dm),n.filter(l=>!aa(l)).reduce((l,o)=>l+(cm.test(o)?fm:o===""?pm:hm),r)}function ym(e,t){return e.length===t.length&&e.slice(0,-1).every((r,l)=>r===t[l])?e[e.length-1]-t[t.length-1]:0}function vm(e,t,n){let{routesMeta:r}=e,l={},o="/",i=[];for(let s=0;s{let{paramName:g,isOptional:S}=c;if(g==="*"){let y=s[f]||"";i=o.slice(0,o.length-y.length).replace(/(.)\/+$/,"$1")}const p=s[f];return S&&!p?a[g]=void 0:a[g]=(p||"").replace(/%2F/g,"/"),a},{}),pathname:o,pathnameBase:i,pattern:e}}function xm(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!0),so(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],l="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(i,s,u)=>(r.push({paramName:s,isOptional:u!=null}),u?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(r.push({paramName:"*"}),l+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?l+="\\/*$":e!==""&&e!=="/"&&(l+="(?:(?=\\/|$))"),[new RegExp(l,t?void 0:"i"),r]}function Sm(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return so(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function Bs(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}const Em=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,km=e=>Em.test(e);function Cm(e,t){t===void 0&&(t="/");let{pathname:n,search:r="",hash:l=""}=typeof e=="string"?tn(e):e,o;if(n)if(km(n))o=n;else{if(n.includes("//")){let i=n;n=n.replace(/\/\/+/g,"/"),so(!1,"Pathnames cannot have embedded double slashes - normalizing "+(i+" -> "+n))}n.startsWith("/")?o=ca(n.substring(1),"/"):o=ca(n,t)}else o=t;return{pathname:o,search:_m(r),hash:Pm(l)}}function ca(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(l=>{l===".."?n.length>1&&n.pop():l!=="."&&n.push(l)}),n.length>1?n.join("/"):"/"}function Vo(e,t,n,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+n+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function Nm(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function $s(e,t){let n=Nm(e);return t?n.map((r,l)=>l===n.length-1?r.pathname:r.pathnameBase):n.map(r=>r.pathnameBase)}function Vs(e,t,n,r){r===void 0&&(r=!1);let l;typeof e=="string"?l=tn(e):(l=Nr({},e),Y(!l.pathname||!l.pathname.includes("?"),Vo("?","pathname","search",l)),Y(!l.pathname||!l.pathname.includes("#"),Vo("#","pathname","hash",l)),Y(!l.search||!l.search.includes("#"),Vo("#","search","hash",l)));let o=e===""||l.pathname==="",i=o?"/":l.pathname,s;if(i==null)s=n;else{let f=t.length-1;if(!r&&i.startsWith("..")){let g=i.split("/");for(;g[0]==="..";)g.shift(),f-=1;l.pathname=g.join("/")}s=f>=0?t[f]:"/"}let u=Cm(l,s),a=i&&i!=="/"&&i.endsWith("/"),c=(o||i===".")&&n.endsWith("/");return!u.pathname.endsWith("/")&&(a||c)&&(u.pathname+="/"),u}const Tt=e=>e.join("/").replace(/\/\/+/g,"/"),Rm=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),_m=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,Pm=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function Tm(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const Jf=["post","put","patch","delete"];new Set(Jf);const Om=["get",...Jf];new Set(Om);/** + * React Router v6.30.3 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function Rr(){return Rr=Object.assign?Object.assign.bind():function(e){for(var t=1;t{s.current=!0}),k.useCallback(function(a,c){if(c===void 0&&(c={}),!s.current)return;if(typeof a=="number"){r.go(a);return}let f=Vs(a,JSON.parse(i),o,c.relative==="path");e==null&&t!=="/"&&(f.pathname=f.pathname==="/"?t:Tt([t,f.pathname])),(c.replace?r.replace:r.push)(f,c.state,c)},[t,r,i,o,e])}const Am=k.createContext(null);function Fm(e){let t=k.useContext(et).outlet;return t&&k.createElement(Am.Provider,{value:e},t)}function Im(){let{matches:e}=k.useContext(et),t=e[e.length-1];return t?t.params:{}}function Gf(e,t){let{relative:n}=t===void 0?{}:t,{future:r}=k.useContext(Ft),{matches:l}=k.useContext(et),{pathname:o}=nn(),i=JSON.stringify($s(l,r.v7_relativeSplatPath));return k.useMemo(()=>Vs(e,JSON.parse(i),o,n==="path"),[e,i,o,n])}function Dm(e,t){return Um(e,t)}function Um(e,t,n,r){Dn()||Y(!1);let{navigator:l}=k.useContext(Ft),{matches:o}=k.useContext(et),i=o[o.length-1],s=i?i.params:{};i&&i.pathname;let u=i?i.pathnameBase:"/";i&&i.route;let a=nn(),c;if(t){var f;let w=typeof t=="string"?tn(t):t;u==="/"||(f=w.pathname)!=null&&f.startsWith(u)||Y(!1),c=w}else c=a;let g=c.pathname||"/",S=g;if(u!=="/"){let w=u.replace(/^\//,"").split("/");S="/"+g.replace(/^\//,"").split("/").slice(w.length).join("/")}let p=sm(e,{pathname:S}),y=Hm(p&&p.map(w=>Object.assign({},w,{params:Object.assign({},s,w.params),pathname:Tt([u,l.encodeLocation?l.encodeLocation(w.pathname).pathname:w.pathname]),pathnameBase:w.pathnameBase==="/"?u:Tt([u,l.encodeLocation?l.encodeLocation(w.pathnameBase).pathname:w.pathnameBase])})),o,n,r);return t&&y?k.createElement(uo.Provider,{value:{location:Rr({pathname:"/",search:"",hash:"",state:null,key:"default"},c),navigationType:xt.Pop}},y):y}function Mm(){let e=bm(),t=Tm(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,l={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return k.createElement(k.Fragment,null,k.createElement("h2",null,"Unexpected Application Error!"),k.createElement("h3",{style:{fontStyle:"italic"}},t),n?k.createElement("pre",{style:l},n):null,null)}const Bm=k.createElement(Mm,null);class $m extends k.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,n){return n.location!==t.location||n.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:n.error,location:n.location,revalidation:t.revalidation||n.revalidation}}componentDidCatch(t,n){console.error("React Router caught the following error during render",t,n)}render(){return this.state.error!==void 0?k.createElement(et.Provider,{value:this.props.routeContext},k.createElement(Xf.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function Vm(e){let{routeContext:t,match:n,children:r}=e,l=k.useContext(Hs);return l&&l.static&&l.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(l.staticContext._deepestRenderedBoundaryId=n.route.id),k.createElement(et.Provider,{value:t},r)}function Hm(e,t,n,r){var l;if(t===void 0&&(t=[]),n===void 0&&(n=null),r===void 0&&(r=null),e==null){var o;if(!n)return null;if(n.errors)e=n.matches;else if((o=r)!=null&&o.v7_partialHydration&&t.length===0&&!n.initialized&&n.matches.length>0)e=n.matches;else return null}let i=e,s=(l=n)==null?void 0:l.errors;if(s!=null){let c=i.findIndex(f=>f.route.id&&(s==null?void 0:s[f.route.id])!==void 0);c>=0||Y(!1),i=i.slice(0,Math.min(i.length,c+1))}let u=!1,a=-1;if(n&&r&&r.v7_partialHydration)for(let c=0;c=0?i=i.slice(0,a+1):i=[i[0]];break}}}return i.reduceRight((c,f,g)=>{let S,p=!1,y=null,w=null;n&&(S=s&&f.route.id?s[f.route.id]:void 0,y=f.route.errorElement||Bm,u&&(a<0&&g===0?(Jm("route-fallback"),p=!0,w=null):a===g&&(p=!0,w=f.route.hydrateFallbackElement||null)));let h=t.concat(i.slice(0,g+1)),d=()=>{let m;return S?m=y:p?m=w:f.route.Component?m=k.createElement(f.route.Component,null):f.route.element?m=f.route.element:m=c,k.createElement(Vm,{match:f,routeContext:{outlet:c,matches:h,isDataRoute:n!=null},children:m})};return n&&(f.route.ErrorBoundary||f.route.errorElement||g===0)?k.createElement($m,{location:n.location,revalidation:n.revalidation,component:y,error:S,children:d(),routeContext:{outlet:null,matches:h,isDataRoute:!0}}):d()},null)}var Zf=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(Zf||{}),ed=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(ed||{});function Wm(e){let t=k.useContext(Hs);return t||Y(!1),t}function Qm(e){let t=k.useContext(jm);return t||Y(!1),t}function Km(e){let t=k.useContext(et);return t||Y(!1),t}function td(e){let t=Km(),n=t.matches[t.matches.length-1];return n.route.id||Y(!1),n.route.id}function bm(){var e;let t=k.useContext(Xf),n=Qm(),r=td();return t!==void 0?t:(e=n.errors)==null?void 0:e[r]}function qm(){let{router:e}=Wm(Zf.UseNavigateStable),t=td(ed.UseNavigateStable),n=k.useRef(!1);return Yf(()=>{n.current=!0}),k.useCallback(function(l,o){o===void 0&&(o={}),n.current&&(typeof l=="number"?e.navigate(l):e.navigate(l,Rr({fromRouteId:t},o)))},[e,t])}const fa={};function Jm(e,t,n){fa[e]||(fa[e]=!0)}function Xm(e,t){e==null||e.v7_startTransition,e==null||e.v7_relativeSplatPath}function Hl(e){let{to:t,replace:n,state:r,relative:l}=e;Dn()||Y(!1);let{future:o,static:i}=k.useContext(Ft),{matches:s}=k.useContext(et),{pathname:u}=nn(),a=Un(),c=Vs(t,$s(s,o.v7_relativeSplatPath),u,l==="path"),f=JSON.stringify(c);return k.useEffect(()=>a(JSON.parse(f),{replace:n,state:r,relative:l}),[a,f,l,n,r]),null}function Ym(e){return Fm(e.context)}function Mt(e){Y(!1)}function Gm(e){let{basename:t="/",children:n=null,location:r,navigationType:l=xt.Pop,navigator:o,static:i=!1,future:s}=e;Dn()&&Y(!1);let u=t.replace(/^\/*/,"/"),a=k.useMemo(()=>({basename:u,navigator:o,static:i,future:Rr({v7_relativeSplatPath:!1},s)}),[u,s,o,i]);typeof r=="string"&&(r=tn(r));let{pathname:c="/",search:f="",hash:g="",state:S=null,key:p="default"}=r,y=k.useMemo(()=>{let w=Bs(c,u);return w==null?null:{location:{pathname:w,search:f,hash:g,state:S,key:p},navigationType:l}},[u,c,f,g,S,p,l]);return y==null?null:k.createElement(Ft.Provider,{value:a},k.createElement(uo.Provider,{children:n,value:y}))}function Zm(e){let{children:t,location:n}=e;return Dm(Bi(t),n)}new Promise(()=>{});function Bi(e,t){t===void 0&&(t=[]);let n=[];return k.Children.forEach(e,(r,l)=>{if(!k.isValidElement(r))return;let o=[...t,l];if(r.type===k.Fragment){n.push.apply(n,Bi(r.props.children,o));return}r.type!==Mt&&Y(!1),!r.props.index||!r.props.children||Y(!1);let i={id:r.props.id||o.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,loader:r.props.loader,action:r.props.action,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(i.children=Bi(r.props.children,o)),n.push(i)}),n}/** + * React Router DOM v6.30.3 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function $i(){return $i=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(n[l]=e[l]);return n}function tg(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function ng(e,t){return e.button===0&&(!t||t==="_self")&&!tg(e)}const rg=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],lg="6";try{window.__reactRouterVersion=lg}catch{}const og="startTransition",da=Kd[og];function ig(e){let{basename:t,children:n,future:r,window:l}=e,o=k.useRef();o.current==null&&(o.current=lm({window:l,v5Compat:!0}));let i=o.current,[s,u]=k.useState({action:i.action,location:i.location}),{v7_startTransition:a}=r||{},c=k.useCallback(f=>{a&&da?da(()=>u(f)):u(f)},[u,a]);return k.useLayoutEffect(()=>i.listen(c),[i,c]),k.useEffect(()=>Xm(r),[r]),k.createElement(Gm,{basename:t,children:n,location:s.location,navigationType:s.action,navigator:i,future:r})}const sg=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",ug=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,ag=k.forwardRef(function(t,n){let{onClick:r,relative:l,reloadDocument:o,replace:i,state:s,target:u,to:a,preventScrollReset:c,viewTransition:f}=t,g=eg(t,rg),{basename:S}=k.useContext(Ft),p,y=!1;if(typeof a=="string"&&ug.test(a)&&(p=a,sg))try{let m=new URL(window.location.href),E=a.startsWith("//")?new URL(m.protocol+a):new URL(a),N=Bs(E.pathname,S);E.origin===m.origin&&N!=null?a=N+E.search+E.hash:y=!0}catch{}let w=Lm(a,{relative:l}),h=cg(a,{replace:i,state:s,target:u,preventScrollReset:c,relative:l,viewTransition:f});function d(m){r&&r(m),m.defaultPrevented||h(m)}return k.createElement("a",$i({},g,{href:p||w,onClick:y||o?r:d,ref:n,target:u}))});var pa;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(pa||(pa={}));var ha;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(ha||(ha={}));function cg(e,t){let{target:n,replace:r,state:l,preventScrollReset:o,relative:i,viewTransition:s}=t===void 0?{}:t,u=Un(),a=nn(),c=Gf(e,{relative:i});return k.useCallback(f=>{if(ng(f,n)){f.preventDefault();let g=r!==void 0?r:Vl(a)===Vl(c);u(e,{replace:g,state:l,preventScrollReset:o,relative:i,viewTransition:s})}},[a,u,c,r,l,n,e,o,i,s])}const fg={ACTIVE:"bg-green-100 text-green-700",DRAFT:"bg-yellow-100 text-yellow-700",DEPRECATED:"bg-gray-200 text-gray-600"};function dg({prompts:e,isLoading:t,error:n}){const r=Un();return v.jsx("div",{className:"min-h-screen bg-gray-50 p-8",children:v.jsxs("div",{className:"max-w-6xl mx-auto",children:[v.jsx("h1",{className:"text-3xl font-bold text-gray-900 mb-8",children:"Prompt Management"}),n&&v.jsx("div",{className:"mb-6 px-4 py-3 bg-red-50 border border-red-200 rounded-lg text-sm text-red-700",children:n}),v.jsx("div",{className:"bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden",children:v.jsxs("table",{className:"w-full text-sm",children:[v.jsx("thead",{className:"bg-gray-100 border-b border-gray-200",children:v.jsxs("tr",{children:[v.jsx("th",{className:"px-6 py-4 text-left font-semibold text-gray-700",children:"Name"}),v.jsx("th",{className:"px-6 py-4 text-left font-semibold text-gray-700",children:"Version"}),v.jsx("th",{className:"px-6 py-4 text-left font-semibold text-gray-700",children:"Status"}),v.jsx("th",{className:"px-6 py-4 text-left font-semibold text-gray-700",children:"Model"}),v.jsx("th",{className:"px-6 py-4 text-left font-semibold text-gray-700",children:"Created At"})]})}),v.jsx("tbody",{className:"divide-y divide-gray-200",children:t?v.jsx("tr",{children:v.jsx("td",{colSpan:5,className:"py-16 text-center",children:v.jsx("div",{className:"flex items-center justify-center",children:v.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"})})})}):e.length===0?v.jsx("tr",{children:v.jsx("td",{colSpan:5,className:"py-16 text-center text-gray-400",children:"프롬프트가 없습니다."})}):e.map(l=>v.jsxs("tr",{className:"hover:bg-gray-50 transition-colors cursor-pointer",onClick:()=>r(`/admin/prompts/${l.id}`),children:[v.jsx("td",{className:"px-6 py-4 font-medium text-blue-600 hover:text-blue-800",children:l.name}),v.jsxs("td",{className:"px-6 py-4 text-gray-700",children:["v",l.version]}),v.jsx("td",{className:"px-6 py-4",children:v.jsx("span",{className:`text-xs px-2 py-1 rounded-full font-medium ${fg[l.status]??"bg-gray-100 text-gray-600"}`,children:l.status})}),v.jsx("td",{className:"px-6 py-4 text-gray-700",children:l.model}),v.jsx("td",{className:"px-6 py-4 text-gray-600",children:new Date(l.createdAt).toLocaleString()})]},l.id))})]})})]})})}/** + * @license lucide-react v0.344.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var pg={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** + * @license lucide-react v0.344.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const hg=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase().trim(),rn=(e,t)=>{const n=k.forwardRef(({color:r="currentColor",size:l=24,strokeWidth:o=2,absoluteStrokeWidth:i,className:s="",children:u,...a},c)=>k.createElement("svg",{ref:c,...pg,width:l,height:l,stroke:r,strokeWidth:i?Number(o)*24/Number(l):o,className:["lucide",`lucide-${hg(e)}`,s].join(" "),...a},[...t.map(([f,g])=>k.createElement(f,g)),...Array.isArray(u)?u:[u]]));return n.displayName=`${e}`,n};/** + * @license lucide-react v0.344.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const mg=rn("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);/** + * @license lucide-react v0.344.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const gg=rn("CheckCircle",[["path",{d:"M22 11.08V12a10 10 0 1 1-5.93-9.14",key:"g774vq"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);/** + * @license lucide-react v0.344.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const yg=rn("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);/** + * @license lucide-react v0.344.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const vg=rn("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** + * @license lucide-react v0.344.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const wg=rn("Play",[["polygon",{points:"5 3 19 12 5 21 5 3",key:"191637"}]]);/** + * @license lucide-react v0.344.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const xg=rn("Save",[["path",{d:"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z",key:"1owoqh"}],["polyline",{points:"17 21 17 13 7 13 7 21",key:"1md35c"}],["polyline",{points:"7 3 7 8 15 8",key:"8nz8an"}]]);/** + * @license lucide-react v0.344.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Sg=rn("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function nd(e,t){return function(){return e.apply(t,arguments)}}const{toString:Eg}=Object.prototype,{getPrototypeOf:Ws}=Object,{iterator:ao,toStringTag:rd}=Symbol,co=(e=>t=>{const n=Eg.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),be=e=>(e=e.toLowerCase(),t=>co(t)===e),fo=e=>t=>typeof t===e,{isArray:Mn}=Array,zn=fo("undefined");function Lr(e){return e!==null&&!zn(e)&&e.constructor!==null&&!zn(e.constructor)&&ke(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const ld=be("ArrayBuffer");function kg(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&ld(e.buffer),t}const Cg=fo("string"),ke=fo("function"),od=fo("number"),zr=e=>e!==null&&typeof e=="object",Ng=e=>e===!0||e===!1,ml=e=>{if(co(e)!=="object")return!1;const t=Ws(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(rd in e)&&!(ao in e)},Rg=e=>{if(!zr(e)||Lr(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},_g=be("Date"),Pg=be("File"),Tg=e=>!!(e&&typeof e.uri<"u"),Og=e=>e&&typeof e.getParts<"u",jg=be("Blob"),Lg=be("FileList"),zg=e=>zr(e)&&ke(e.pipe);function Ag(){return typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}}const ma=Ag(),ga=typeof ma.FormData<"u"?ma.FormData:void 0,Fg=e=>{let t;return e&&(ga&&e instanceof ga||ke(e.append)&&((t=co(e))==="formdata"||t==="object"&&ke(e.toString)&&e.toString()==="[object FormData]"))},Ig=be("URLSearchParams"),[Dg,Ug,Mg,Bg]=["ReadableStream","Request","Response","Headers"].map(be),$g=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ar(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,l;if(typeof e!="object"&&(e=[e]),Mn(e))for(r=0,l=e.length;r0;)if(l=n[r],t===l.toLowerCase())return l;return null}const Ht=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,sd=e=>!zn(e)&&e!==Ht;function Vi(){const{caseless:e,skipUndefined:t}=sd(this)&&this||{},n={},r=(l,o)=>{if(o==="__proto__"||o==="constructor"||o==="prototype")return;const i=e&&id(n,o)||o;ml(n[i])&&ml(l)?n[i]=Vi(n[i],l):ml(l)?n[i]=Vi({},l):Mn(l)?n[i]=l.slice():(!t||!zn(l))&&(n[i]=l)};for(let l=0,o=arguments.length;l(Ar(t,(l,o)=>{n&&ke(l)?Object.defineProperty(e,o,{value:nd(l,n),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(e,o,{value:l,writable:!0,enumerable:!0,configurable:!0})},{allOwnKeys:r}),e),Hg=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),Wg=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},Qg=(e,t,n,r)=>{let l,o,i;const s={};if(t=t||{},e==null)return t;do{for(l=Object.getOwnPropertyNames(e),o=l.length;o-- >0;)i=l[o],(!r||r(i,e,t))&&!s[i]&&(t[i]=e[i],s[i]=!0);e=n!==!1&&Ws(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},Kg=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},bg=e=>{if(!e)return null;if(Mn(e))return e;let t=e.length;if(!od(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},qg=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&Ws(Uint8Array)),Jg=(e,t)=>{const r=(e&&e[ao]).call(e);let l;for(;(l=r.next())&&!l.done;){const o=l.value;t.call(e,o[0],o[1])}},Xg=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},Yg=be("HTMLFormElement"),Gg=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,l){return r.toUpperCase()+l}),ya=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Zg=be("RegExp"),ud=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Ar(n,(l,o)=>{let i;(i=t(l,o,e))!==!1&&(r[o]=i||l)}),Object.defineProperties(e,r)},ey=e=>{ud(e,(t,n)=>{if(ke(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(ke(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},ty=(e,t)=>{const n={},r=l=>{l.forEach(o=>{n[o]=!0})};return Mn(e)?r(e):r(String(e).split(t)),n},ny=()=>{},ry=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function ly(e){return!!(e&&ke(e.append)&&e[rd]==="FormData"&&e[ao])}const oy=e=>{const t=new Array(10),n=(r,l)=>{if(zr(r)){if(t.indexOf(r)>=0)return;if(Lr(r))return r;if(!("toJSON"in r)){t[l]=r;const o=Mn(r)?[]:{};return Ar(r,(i,s)=>{const u=n(i,l+1);!zn(u)&&(o[s]=u)}),t[l]=void 0,o}}return r};return n(e,0)},iy=be("AsyncFunction"),sy=e=>e&&(zr(e)||ke(e))&&ke(e.then)&&ke(e.catch),ad=((e,t)=>e?setImmediate:t?((n,r)=>(Ht.addEventListener("message",({source:l,data:o})=>{l===Ht&&o===n&&r.length&&r.shift()()},!1),l=>{r.push(l),Ht.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",ke(Ht.postMessage)),uy=typeof queueMicrotask<"u"?queueMicrotask.bind(Ht):typeof process<"u"&&process.nextTick||ad,ay=e=>e!=null&&ke(e[ao]),x={isArray:Mn,isArrayBuffer:ld,isBuffer:Lr,isFormData:Fg,isArrayBufferView:kg,isString:Cg,isNumber:od,isBoolean:Ng,isObject:zr,isPlainObject:ml,isEmptyObject:Rg,isReadableStream:Dg,isRequest:Ug,isResponse:Mg,isHeaders:Bg,isUndefined:zn,isDate:_g,isFile:Pg,isReactNativeBlob:Tg,isReactNative:Og,isBlob:jg,isRegExp:Zg,isFunction:ke,isStream:zg,isURLSearchParams:Ig,isTypedArray:qg,isFileList:Lg,forEach:Ar,merge:Vi,extend:Vg,trim:$g,stripBOM:Hg,inherits:Wg,toFlatObject:Qg,kindOf:co,kindOfTest:be,endsWith:Kg,toArray:bg,forEachEntry:Jg,matchAll:Xg,isHTMLForm:Yg,hasOwnProperty:ya,hasOwnProp:ya,reduceDescriptors:ud,freezeMethods:ey,toObjectSet:ty,toCamelCase:Gg,noop:ny,toFiniteNumber:ry,findKey:id,global:Ht,isContextDefined:sd,isSpecCompliantForm:ly,toJSONObject:oy,isAsyncFn:iy,isThenable:sy,setImmediate:ad,asap:uy,isIterable:ay};let j=class cd extends Error{static from(t,n,r,l,o,i){const s=new cd(t.message,n||t.code,r,l,o);return s.cause=t,s.name=t.name,t.status!=null&&s.status==null&&(s.status=t.status),i&&Object.assign(s,i),s}constructor(t,n,r,l,o){super(t),Object.defineProperty(this,"message",{value:t,enumerable:!0,writable:!0,configurable:!0}),this.name="AxiosError",this.isAxiosError=!0,n&&(this.code=n),r&&(this.config=r),l&&(this.request=l),o&&(this.response=o,this.status=o.status)}toJSON(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:x.toJSONObject(this.config),code:this.code,status:this.status}}};j.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE";j.ERR_BAD_OPTION="ERR_BAD_OPTION";j.ECONNABORTED="ECONNABORTED";j.ETIMEDOUT="ETIMEDOUT";j.ERR_NETWORK="ERR_NETWORK";j.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS";j.ERR_DEPRECATED="ERR_DEPRECATED";j.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE";j.ERR_BAD_REQUEST="ERR_BAD_REQUEST";j.ERR_CANCELED="ERR_CANCELED";j.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT";j.ERR_INVALID_URL="ERR_INVALID_URL";const cy=null;function Hi(e){return x.isPlainObject(e)||x.isArray(e)}function fd(e){return x.endsWith(e,"[]")?e.slice(0,-2):e}function Ho(e,t,n){return e?e.concat(t).map(function(l,o){return l=fd(l),!n&&o?"["+l+"]":l}).join(n?".":""):t}function fy(e){return x.isArray(e)&&!e.some(Hi)}const dy=x.toFlatObject(x,{},null,function(t){return/^is[A-Z]/.test(t)});function po(e,t,n){if(!x.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=x.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(y,w){return!x.isUndefined(w[y])});const r=n.metaTokens,l=n.visitor||c,o=n.dots,i=n.indexes,u=(n.Blob||typeof Blob<"u"&&Blob)&&x.isSpecCompliantForm(t);if(!x.isFunction(l))throw new TypeError("visitor must be a function");function a(p){if(p===null)return"";if(x.isDate(p))return p.toISOString();if(x.isBoolean(p))return p.toString();if(!u&&x.isBlob(p))throw new j("Blob is not supported. Use a Buffer instead.");return x.isArrayBuffer(p)||x.isTypedArray(p)?u&&typeof Blob=="function"?new Blob([p]):Buffer.from(p):p}function c(p,y,w){let h=p;if(x.isReactNative(t)&&x.isReactNativeBlob(p))return t.append(Ho(w,y,o),a(p)),!1;if(p&&!w&&typeof p=="object"){if(x.endsWith(y,"{}"))y=r?y:y.slice(0,-2),p=JSON.stringify(p);else if(x.isArray(p)&&fy(p)||(x.isFileList(p)||x.endsWith(y,"[]"))&&(h=x.toArray(p)))return y=fd(y),h.forEach(function(m,E){!(x.isUndefined(m)||m===null)&&t.append(i===!0?Ho([y],E,o):i===null?y:y+"[]",a(m))}),!1}return Hi(p)?!0:(t.append(Ho(w,y,o),a(p)),!1)}const f=[],g=Object.assign(dy,{defaultVisitor:c,convertValue:a,isVisitable:Hi});function S(p,y){if(!x.isUndefined(p)){if(f.indexOf(p)!==-1)throw Error("Circular reference detected in "+y.join("."));f.push(p),x.forEach(p,function(h,d){(!(x.isUndefined(h)||h===null)&&l.call(t,h,x.isString(d)?d.trim():d,y,g))===!0&&S(h,y?y.concat(d):[d])}),f.pop()}}if(!x.isObject(e))throw new TypeError("data must be an object");return S(e),t}function va(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function Qs(e,t){this._pairs=[],e&&po(e,this,t)}const dd=Qs.prototype;dd.append=function(t,n){this._pairs.push([t,n])};dd.toString=function(t){const n=t?function(r){return t.call(this,r,va)}:va;return this._pairs.map(function(l){return n(l[0])+"="+n(l[1])},"").join("&")};function py(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function pd(e,t,n){if(!t)return e;const r=n&&n.encode||py,l=x.isFunction(n)?{serialize:n}:n,o=l&&l.serialize;let i;if(o?i=o(t,l):i=x.isURLSearchParams(t)?t.toString():new Qs(t,l).toString(r),i){const s=e.indexOf("#");s!==-1&&(e=e.slice(0,s)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class wa{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){x.forEach(this.handlers,function(r){r!==null&&t(r)})}}const Ks={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},hy=typeof URLSearchParams<"u"?URLSearchParams:Qs,my=typeof FormData<"u"?FormData:null,gy=typeof Blob<"u"?Blob:null,yy={isBrowser:!0,classes:{URLSearchParams:hy,FormData:my,Blob:gy},protocols:["http","https","file","blob","url","data"]},bs=typeof window<"u"&&typeof document<"u",Wi=typeof navigator=="object"&&navigator||void 0,vy=bs&&(!Wi||["ReactNative","NativeScript","NS"].indexOf(Wi.product)<0),wy=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",xy=bs&&window.location.href||"http://localhost",Sy=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:bs,hasStandardBrowserEnv:vy,hasStandardBrowserWebWorkerEnv:wy,navigator:Wi,origin:xy},Symbol.toStringTag,{value:"Module"})),de={...Sy,...yy};function Ey(e,t){return po(e,new de.classes.URLSearchParams,{visitor:function(n,r,l,o){return de.isNode&&x.isBuffer(n)?(this.append(r,n.toString("base64")),!1):o.defaultVisitor.apply(this,arguments)},...t})}function ky(e){return x.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function Cy(e){const t={},n=Object.keys(e);let r;const l=n.length;let o;for(r=0;r=n.length;return i=!i&&x.isArray(l)?l.length:i,u?(x.hasOwnProp(l,i)?l[i]=[l[i],r]:l[i]=r,!s):((!l[i]||!x.isObject(l[i]))&&(l[i]=[]),t(n,r,l[i],o)&&x.isArray(l[i])&&(l[i]=Cy(l[i])),!s)}if(x.isFormData(e)&&x.isFunction(e.entries)){const n={};return x.forEachEntry(e,(r,l)=>{t(ky(r),l,n,0)}),n}return null}function Ny(e,t,n){if(x.isString(e))try{return(t||JSON.parse)(e),x.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const Fr={transitional:Ks,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",l=r.indexOf("application/json")>-1,o=x.isObject(t);if(o&&x.isHTMLForm(t)&&(t=new FormData(t)),x.isFormData(t))return l?JSON.stringify(hd(t)):t;if(x.isArrayBuffer(t)||x.isBuffer(t)||x.isStream(t)||x.isFile(t)||x.isBlob(t)||x.isReadableStream(t))return t;if(x.isArrayBufferView(t))return t.buffer;if(x.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let s;if(o){if(r.indexOf("application/x-www-form-urlencoded")>-1)return Ey(t,this.formSerializer).toString();if((s=x.isFileList(t))||r.indexOf("multipart/form-data")>-1){const u=this.env&&this.env.FormData;return po(s?{"files[]":t}:t,u&&new u,this.formSerializer)}}return o||l?(n.setContentType("application/json",!1),Ny(t)):t}],transformResponse:[function(t){const n=this.transitional||Fr.transitional,r=n&&n.forcedJSONParsing,l=this.responseType==="json";if(x.isResponse(t)||x.isReadableStream(t))return t;if(t&&x.isString(t)&&(r&&!this.responseType||l)){const i=!(n&&n.silentJSONParsing)&&l;try{return JSON.parse(t,this.parseReviver)}catch(s){if(i)throw s.name==="SyntaxError"?j.from(s,j.ERR_BAD_RESPONSE,this,null,this.response):s}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:de.classes.FormData,Blob:de.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};x.forEach(["delete","get","head","post","put","patch"],e=>{Fr.headers[e]={}});const Ry=x.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),_y=e=>{const t={};let n,r,l;return e&&e.split(` +`).forEach(function(i){l=i.indexOf(":"),n=i.substring(0,l).trim().toLowerCase(),r=i.substring(l+1).trim(),!(!n||t[n]&&Ry[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},xa=Symbol("internals"),Py=e=>!/[\r\n]/.test(e);function md(e,t){if(!(e===!1||e==null)){if(x.isArray(e)){e.forEach(n=>md(n,t));return}if(!Py(String(e)))throw new Error(`Invalid character in header content ["${t}"]`)}}function qn(e){return e&&String(e).trim().toLowerCase()}function Ty(e){let t=e.length;for(;t>0;){const n=e.charCodeAt(t-1);if(n!==10&&n!==13)break;t-=1}return t===e.length?e:e.slice(0,t)}function gl(e){return e===!1||e==null?e:x.isArray(e)?e.map(gl):Ty(String(e))}function Oy(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const jy=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function Wo(e,t,n,r,l){if(x.isFunction(r))return r.call(this,t,n);if(l&&(t=n),!!x.isString(t)){if(x.isString(r))return t.indexOf(r)!==-1;if(x.isRegExp(r))return r.test(t)}}function Ly(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function zy(e,t){const n=x.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(l,o,i){return this[r].call(this,t,l,o,i)},configurable:!0})})}let Ce=class{constructor(t){t&&this.set(t)}set(t,n,r){const l=this;function o(s,u,a){const c=qn(u);if(!c)throw new Error("header name must be a non-empty string");const f=x.findKey(l,c);(!f||l[f]===void 0||a===!0||a===void 0&&l[f]!==!1)&&(md(s,u),l[f||u]=gl(s))}const i=(s,u)=>x.forEach(s,(a,c)=>o(a,c,u));if(x.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(x.isString(t)&&(t=t.trim())&&!jy(t))i(_y(t),n);else if(x.isObject(t)&&x.isIterable(t)){let s={},u,a;for(const c of t){if(!x.isArray(c))throw TypeError("Object iterator must return a key-value pair");s[a=c[0]]=(u=s[a])?x.isArray(u)?[...u,c[1]]:[u,c[1]]:c[1]}i(s,n)}else t!=null&&o(n,t,r);return this}get(t,n){if(t=qn(t),t){const r=x.findKey(this,t);if(r){const l=this[r];if(!n)return l;if(n===!0)return Oy(l);if(x.isFunction(n))return n.call(this,l,r);if(x.isRegExp(n))return n.exec(l);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=qn(t),t){const r=x.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||Wo(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let l=!1;function o(i){if(i=qn(i),i){const s=x.findKey(r,i);s&&(!n||Wo(r,r[s],s,n))&&(delete r[s],l=!0)}}return x.isArray(t)?t.forEach(o):o(t),l}clear(t){const n=Object.keys(this);let r=n.length,l=!1;for(;r--;){const o=n[r];(!t||Wo(this,this[o],o,t,!0))&&(delete this[o],l=!0)}return l}normalize(t){const n=this,r={};return x.forEach(this,(l,o)=>{const i=x.findKey(r,o);if(i){n[i]=gl(l),delete n[o];return}const s=t?Ly(o):String(o).trim();s!==o&&delete n[o],n[s]=gl(l),r[s]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return x.forEach(this,(r,l)=>{r!=null&&r!==!1&&(n[l]=t&&x.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` +`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(l=>r.set(l)),r}static accessor(t){const r=(this[xa]=this[xa]={accessors:{}}).accessors,l=this.prototype;function o(i){const s=qn(i);r[s]||(zy(l,i),r[s]=!0)}return x.isArray(t)?t.forEach(o):o(t),this}};Ce.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);x.reduceDescriptors(Ce.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});x.freezeMethods(Ce);function Qo(e,t){const n=this||Fr,r=t||n,l=Ce.from(r.headers);let o=r.data;return x.forEach(e,function(s){o=s.call(n,o,l.normalize(),t?t.status:void 0)}),l.normalize(),o}function gd(e){return!!(e&&e.__CANCEL__)}let Ir=class extends j{constructor(t,n,r){super(t??"canceled",j.ERR_CANCELED,n,r),this.name="CanceledError",this.__CANCEL__=!0}};function yd(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new j("Request failed with status code "+n.status,[j.ERR_BAD_REQUEST,j.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function Ay(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function Fy(e,t){e=e||10;const n=new Array(e),r=new Array(e);let l=0,o=0,i;return t=t!==void 0?t:1e3,function(u){const a=Date.now(),c=r[o];i||(i=a),n[l]=u,r[l]=a;let f=o,g=0;for(;f!==l;)g+=n[f++],f=f%e;if(l=(l+1)%e,l===o&&(o=(o+1)%e),a-i{n=c,l=null,o&&(clearTimeout(o),o=null),e(...a)};return[(...a)=>{const c=Date.now(),f=c-n;f>=r?i(a,c):(l=a,o||(o=setTimeout(()=>{o=null,i(l)},r-f)))},()=>l&&i(l)]}const Wl=(e,t,n=3)=>{let r=0;const l=Fy(50,250);return Iy(o=>{const i=o.loaded,s=o.lengthComputable?o.total:void 0,u=i-r,a=l(u),c=i<=s;r=i;const f={loaded:i,total:s,progress:s?i/s:void 0,bytes:u,rate:a||void 0,estimated:a&&s&&c?(s-i)/a:void 0,event:o,lengthComputable:s!=null,[t?"download":"upload"]:!0};e(f)},n)},Sa=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},Ea=e=>(...t)=>x.asap(()=>e(...t)),Dy=de.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,de.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(de.origin),de.navigator&&/(msie|trident)/i.test(de.navigator.userAgent)):()=>!0,Uy=de.hasStandardBrowserEnv?{write(e,t,n,r,l,o,i){if(typeof document>"u")return;const s=[`${e}=${encodeURIComponent(t)}`];x.isNumber(n)&&s.push(`expires=${new Date(n).toUTCString()}`),x.isString(r)&&s.push(`path=${r}`),x.isString(l)&&s.push(`domain=${l}`),o===!0&&s.push("secure"),x.isString(i)&&s.push(`SameSite=${i}`),document.cookie=s.join("; ")},read(e){if(typeof document>"u")return null;const t=document.cookie.match(new RegExp("(?:^|; )"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function My(e){return typeof e!="string"?!1:/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function By(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function vd(e,t,n){let r=!My(t);return e&&(r||n==!1)?By(e,t):t}const ka=e=>e instanceof Ce?{...e}:e;function Gt(e,t){t=t||{};const n={};function r(a,c,f,g){return x.isPlainObject(a)&&x.isPlainObject(c)?x.merge.call({caseless:g},a,c):x.isPlainObject(c)?x.merge({},c):x.isArray(c)?c.slice():c}function l(a,c,f,g){if(x.isUndefined(c)){if(!x.isUndefined(a))return r(void 0,a,f,g)}else return r(a,c,f,g)}function o(a,c){if(!x.isUndefined(c))return r(void 0,c)}function i(a,c){if(x.isUndefined(c)){if(!x.isUndefined(a))return r(void 0,a)}else return r(void 0,c)}function s(a,c,f){if(f in t)return r(a,c);if(f in e)return r(void 0,a)}const u={url:o,method:o,data:o,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:s,headers:(a,c,f)=>l(ka(a),ka(c),f,!0)};return x.forEach(Object.keys({...e,...t}),function(c){if(c==="__proto__"||c==="constructor"||c==="prototype")return;const f=x.hasOwnProp(u,c)?u[c]:l,g=f(e[c],t[c],c);x.isUndefined(g)&&f!==s||(n[c]=g)}),n}const wd=e=>{const t=Gt({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:l,xsrfCookieName:o,headers:i,auth:s}=t;if(t.headers=i=Ce.from(i),t.url=pd(vd(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),s&&i.set("Authorization","Basic "+btoa((s.username||"")+":"+(s.password?unescape(encodeURIComponent(s.password)):""))),x.isFormData(n)){if(de.hasStandardBrowserEnv||de.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if(x.isFunction(n.getHeaders)){const u=n.getHeaders(),a=["content-type","content-length"];Object.entries(u).forEach(([c,f])=>{a.includes(c.toLowerCase())&&i.set(c,f)})}}if(de.hasStandardBrowserEnv&&(r&&x.isFunction(r)&&(r=r(t)),r||r!==!1&&Dy(t.url))){const u=l&&o&&Uy.read(o);u&&i.set(l,u)}return t},$y=typeof XMLHttpRequest<"u",Vy=$y&&function(e){return new Promise(function(n,r){const l=wd(e);let o=l.data;const i=Ce.from(l.headers).normalize();let{responseType:s,onUploadProgress:u,onDownloadProgress:a}=l,c,f,g,S,p;function y(){S&&S(),p&&p(),l.cancelToken&&l.cancelToken.unsubscribe(c),l.signal&&l.signal.removeEventListener("abort",c)}let w=new XMLHttpRequest;w.open(l.method.toUpperCase(),l.url,!0),w.timeout=l.timeout;function h(){if(!w)return;const m=Ce.from("getAllResponseHeaders"in w&&w.getAllResponseHeaders()),N={data:!s||s==="text"||s==="json"?w.responseText:w.response,status:w.status,statusText:w.statusText,headers:m,config:e,request:w};yd(function(R){n(R),y()},function(R){r(R),y()},N),w=null}"onloadend"in w?w.onloadend=h:w.onreadystatechange=function(){!w||w.readyState!==4||w.status===0&&!(w.responseURL&&w.responseURL.indexOf("file:")===0)||setTimeout(h)},w.onabort=function(){w&&(r(new j("Request aborted",j.ECONNABORTED,e,w)),w=null)},w.onerror=function(E){const N=E&&E.message?E.message:"Network Error",P=new j(N,j.ERR_NETWORK,e,w);P.event=E||null,r(P),w=null},w.ontimeout=function(){let E=l.timeout?"timeout of "+l.timeout+"ms exceeded":"timeout exceeded";const N=l.transitional||Ks;l.timeoutErrorMessage&&(E=l.timeoutErrorMessage),r(new j(E,N.clarifyTimeoutError?j.ETIMEDOUT:j.ECONNABORTED,e,w)),w=null},o===void 0&&i.setContentType(null),"setRequestHeader"in w&&x.forEach(i.toJSON(),function(E,N){w.setRequestHeader(N,E)}),x.isUndefined(l.withCredentials)||(w.withCredentials=!!l.withCredentials),s&&s!=="json"&&(w.responseType=l.responseType),a&&([g,p]=Wl(a,!0),w.addEventListener("progress",g)),u&&w.upload&&([f,S]=Wl(u),w.upload.addEventListener("progress",f),w.upload.addEventListener("loadend",S)),(l.cancelToken||l.signal)&&(c=m=>{w&&(r(!m||m.type?new Ir(null,e,w):m),w.abort(),w=null)},l.cancelToken&&l.cancelToken.subscribe(c),l.signal&&(l.signal.aborted?c():l.signal.addEventListener("abort",c)));const d=Ay(l.url);if(d&&de.protocols.indexOf(d)===-1){r(new j("Unsupported protocol "+d+":",j.ERR_BAD_REQUEST,e));return}w.send(o||null)})},Hy=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let r=new AbortController,l;const o=function(a){if(!l){l=!0,s();const c=a instanceof Error?a:this.reason;r.abort(c instanceof j?c:new Ir(c instanceof Error?c.message:c))}};let i=t&&setTimeout(()=>{i=null,o(new j(`timeout of ${t}ms exceeded`,j.ETIMEDOUT))},t);const s=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach(a=>{a.unsubscribe?a.unsubscribe(o):a.removeEventListener("abort",o)}),e=null)};e.forEach(a=>a.addEventListener("abort",o));const{signal:u}=r;return u.unsubscribe=()=>x.asap(s),u}},Wy=function*(e,t){let n=e.byteLength;if(n{const l=Qy(e,t);let o=0,i,s=u=>{i||(i=!0,r&&r(u))};return new ReadableStream({async pull(u){try{const{done:a,value:c}=await l.next();if(a){s(),u.close();return}let f=c.byteLength;if(n){let g=o+=f;n(g)}u.enqueue(new Uint8Array(c))}catch(a){throw s(a),a}},cancel(u){return s(u),l.return()}},{highWaterMark:2})},Na=64*1024,{isFunction:nl}=x,by=(({Request:e,Response:t})=>({Request:e,Response:t}))(x.global),{ReadableStream:Ra,TextEncoder:_a}=x.global,Pa=(e,...t)=>{try{return!!e(...t)}catch{return!1}},qy=e=>{e=x.merge.call({skipUndefined:!0},by,e);const{fetch:t,Request:n,Response:r}=e,l=t?nl(t):typeof fetch=="function",o=nl(n),i=nl(r);if(!l)return!1;const s=l&&nl(Ra),u=l&&(typeof _a=="function"?(p=>y=>p.encode(y))(new _a):async p=>new Uint8Array(await new n(p).arrayBuffer())),a=o&&s&&Pa(()=>{let p=!1;const y=new Ra,w=new n(de.origin,{body:y,method:"POST",get duplex(){return p=!0,"half"}}).headers.has("Content-Type");return y.cancel(),p&&!w}),c=i&&s&&Pa(()=>x.isReadableStream(new r("").body)),f={stream:c&&(p=>p.body)};l&&["text","arrayBuffer","blob","formData","stream"].forEach(p=>{!f[p]&&(f[p]=(y,w)=>{let h=y&&y[p];if(h)return h.call(y);throw new j(`Response type '${p}' is not supported`,j.ERR_NOT_SUPPORT,w)})});const g=async p=>{if(p==null)return 0;if(x.isBlob(p))return p.size;if(x.isSpecCompliantForm(p))return(await new n(de.origin,{method:"POST",body:p}).arrayBuffer()).byteLength;if(x.isArrayBufferView(p)||x.isArrayBuffer(p))return p.byteLength;if(x.isURLSearchParams(p)&&(p=p+""),x.isString(p))return(await u(p)).byteLength},S=async(p,y)=>{const w=x.toFiniteNumber(p.getContentLength());return w??g(y)};return async p=>{let{url:y,method:w,data:h,signal:d,cancelToken:m,timeout:E,onDownloadProgress:N,onUploadProgress:P,responseType:R,headers:O,withCredentials:B="same-origin",fetchOptions:z}=wd(p),ue=t||fetch;R=R?(R+"").toLowerCase():"text";let I=Hy([d,m&&m.toAbortSignal()],E),Me=null;const qe=I&&I.unsubscribe&&(()=>{I.unsubscribe()});let Dr;try{if(P&&a&&w!=="get"&&w!=="head"&&(Dr=await S(O,h))!==0){let U=new n(y,{method:"POST",body:h,duplex:"half"}),V;if(x.isFormData(h)&&(V=U.headers.get("content-type"))&&O.setContentType(V),U.body){const[dt,je]=Sa(Dr,Wl(Ea(P)));h=Ca(U.body,Na,dt,je)}}x.isString(B)||(B=B?"include":"omit");const ne=o&&"credentials"in n.prototype,ln={...z,signal:I,method:w.toUpperCase(),headers:O.normalize().toJSON(),body:h,duplex:"half",credentials:ne?B:void 0};Me=o&&new n(y,ln);let _=await(o?ue(Me,z):ue(y,ln));const L=c&&(R==="stream"||R==="response");if(c&&(N||L&&qe)){const U={};["status","statusText","headers"].forEach(on=>{U[on]=_[on]});const V=x.toFiniteNumber(_.headers.get("content-length")),[dt,je]=N&&Sa(V,Wl(Ea(N),!0))||[];_=new r(Ca(_.body,Na,dt,()=>{je&&je(),qe&&qe()}),U)}R=R||"text";let A=await f[x.findKey(f,R)||"text"](_,p);return!L&&qe&&qe(),await new Promise((U,V)=>{yd(U,V,{data:A,headers:Ce.from(_.headers),status:_.status,statusText:_.statusText,config:p,request:Me})})}catch(ne){throw qe&&qe(),ne&&ne.name==="TypeError"&&/Load failed|fetch/i.test(ne.message)?Object.assign(new j("Network Error",j.ERR_NETWORK,p,Me,ne&&ne.response),{cause:ne.cause||ne}):j.from(ne,ne&&ne.code,p,Me,ne&&ne.response)}}},Jy=new Map,xd=e=>{let t=e&&e.env||{};const{fetch:n,Request:r,Response:l}=t,o=[r,l,n];let i=o.length,s=i,u,a,c=Jy;for(;s--;)u=o[s],a=c.get(u),a===void 0&&c.set(u,a=s?new Map:qy(t)),c=a;return a};xd();const qs={http:cy,xhr:Vy,fetch:{get:xd}};x.forEach(qs,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Ta=e=>`- ${e}`,Xy=e=>x.isFunction(e)||e===null||e===!1;function Yy(e,t){e=x.isArray(e)?e:[e];const{length:n}=e;let r,l;const o={};for(let i=0;i`adapter ${u} `+(a===!1?"is not supported by the environment":"is not available in the build"));let s=n?i.length>1?`since : +`+i.map(Ta).join(` +`):" "+Ta(i[0]):"as no adapter specified";throw new j("There is no suitable adapter to dispatch the request "+s,"ERR_NOT_SUPPORT")}return l}const Sd={getAdapter:Yy,adapters:qs};function Ko(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ir(null,e)}function Oa(e){return Ko(e),e.headers=Ce.from(e.headers),e.data=Qo.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),Sd.getAdapter(e.adapter||Fr.adapter,e)(e).then(function(r){return Ko(e),r.data=Qo.call(e,e.transformResponse,r),r.headers=Ce.from(r.headers),r},function(r){return gd(r)||(Ko(e),r&&r.response&&(r.response.data=Qo.call(e,e.transformResponse,r.response),r.response.headers=Ce.from(r.response.headers))),Promise.reject(r)})}const Ed="1.15.0",ho={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{ho[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const ja={};ho.transitional=function(t,n,r){function l(o,i){return"[Axios v"+Ed+"] Transitional option '"+o+"'"+i+(r?". "+r:"")}return(o,i,s)=>{if(t===!1)throw new j(l(i," has been removed"+(n?" in "+n:"")),j.ERR_DEPRECATED);return n&&!ja[i]&&(ja[i]=!0,console.warn(l(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(o,i,s):!0}};ho.spelling=function(t){return(n,r)=>(console.warn(`${r} is likely a misspelling of ${t}`),!0)};function Gy(e,t,n){if(typeof e!="object")throw new j("options must be an object",j.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let l=r.length;for(;l-- >0;){const o=r[l],i=t[o];if(i){const s=e[o],u=s===void 0||i(s,o,e);if(u!==!0)throw new j("option "+o+" must be "+u,j.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new j("Unknown option "+o,j.ERR_BAD_OPTION)}}const yl={assertOptions:Gy,validators:ho},Le=yl.validators;let Kt=class{constructor(t){this.defaults=t||{},this.interceptors={request:new wa,response:new wa}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let l={};Error.captureStackTrace?Error.captureStackTrace(l):l=new Error;const o=(()=>{if(!l.stack)return"";const i=l.stack.indexOf(` +`);return i===-1?"":l.stack.slice(i+1)})();try{if(!r.stack)r.stack=o;else if(o){const i=o.indexOf(` +`),s=i===-1?-1:o.indexOf(` +`,i+1),u=s===-1?"":o.slice(s+1);String(r.stack).endsWith(u)||(r.stack+=` +`+o)}}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Gt(this.defaults,n);const{transitional:r,paramsSerializer:l,headers:o}=n;r!==void 0&&yl.assertOptions(r,{silentJSONParsing:Le.transitional(Le.boolean),forcedJSONParsing:Le.transitional(Le.boolean),clarifyTimeoutError:Le.transitional(Le.boolean),legacyInterceptorReqResOrdering:Le.transitional(Le.boolean)},!1),l!=null&&(x.isFunction(l)?n.paramsSerializer={serialize:l}:yl.assertOptions(l,{encode:Le.function,serialize:Le.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),yl.assertOptions(n,{baseUrl:Le.spelling("baseURL"),withXsrfToken:Le.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=o&&x.merge(o.common,o[n.method]);o&&x.forEach(["delete","get","head","post","put","patch","common"],p=>{delete o[p]}),n.headers=Ce.concat(i,o);const s=[];let u=!0;this.interceptors.request.forEach(function(y){if(typeof y.runWhen=="function"&&y.runWhen(n)===!1)return;u=u&&y.synchronous;const w=n.transitional||Ks;w&&w.legacyInterceptorReqResOrdering?s.unshift(y.fulfilled,y.rejected):s.push(y.fulfilled,y.rejected)});const a=[];this.interceptors.response.forEach(function(y){a.push(y.fulfilled,y.rejected)});let c,f=0,g;if(!u){const p=[Oa.bind(this),void 0];for(p.unshift(...s),p.push(...a),g=p.length,c=Promise.resolve(n);f{if(!r._listeners)return;let o=r._listeners.length;for(;o-- >0;)r._listeners[o](l);r._listeners=null}),this.promise.then=l=>{let o;const i=new Promise(s=>{r.subscribe(s),o=s}).then(l);return i.cancel=function(){r.unsubscribe(o)},i},t(function(o,i,s){r.reason||(r.reason=new Ir(o,i,s),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new kd(function(l){t=l}),cancel:t}}};function e0(e){return function(n){return e.apply(null,n)}}function t0(e){return x.isObject(e)&&e.isAxiosError===!0}const Qi={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Qi).forEach(([e,t])=>{Qi[t]=e});function Cd(e){const t=new Kt(e),n=nd(Kt.prototype.request,t);return x.extend(n,Kt.prototype,t,{allOwnKeys:!0}),x.extend(n,t,null,{allOwnKeys:!0}),n.create=function(l){return Cd(Gt(e,l))},n}const G=Cd(Fr);G.Axios=Kt;G.CanceledError=Ir;G.CancelToken=Zy;G.isCancel=gd;G.VERSION=Ed;G.toFormData=po;G.AxiosError=j;G.Cancel=G.CanceledError;G.all=function(t){return Promise.all(t)};G.spread=e0;G.isAxiosError=t0;G.mergeConfig=Gt;G.AxiosHeaders=Ce;G.formToJSON=e=>hd(x.isHTMLForm(e)?new FormData(e):e);G.getAdapter=Sd.getAdapter;G.HttpStatusCode=Qi;G.default=G;const{Axios:N0,AxiosError:R0,CanceledError:_0,isCancel:P0,CancelToken:T0,VERSION:O0,all:j0,Cancel:L0,isAxiosError:z0,spread:A0,toFormData:F0,AxiosHeaders:I0,HttpStatusCode:D0,formToJSON:U0,getAdapter:M0,mergeConfig:B0}=G;let Js=null,Xs=null;function mo(){return Js}function n0(){return Xs??"Bearer"}function r0(e,t){Js=e,Xs=t!=null&&t.trim()?t.trim():"Bearer"}function l0(){Js=null,Xs=null}function Nd(e){return!!(e!=null&&e.includes("/api/admin/auth/login"))}const ft=G.create({baseURL:"http://localhost:8080",headers:{"Content-Type":"application/json"}});ft.interceptors.request.use(e=>{const t=e.url??"";if(Nd(t))return e;const n=mo();if(n){const r=n0();e.headers.set("Authorization",`${r} ${n}`)}return e});ft.interceptors.response.use(e=>e,e=>{var l,o,i,s;const t=(l=e.response)==null?void 0:l.status,n=((o=e.config)==null?void 0:o.url)??"";if(t===401&&!Nd(n)){l0();const u="/".replace(/\/$/,"");window.location.replace(u?`${u}/login`:"/login")}const r=((s=(i=e.response)==null?void 0:i.data)==null?void 0:s.message)??e.message??"알 수 없는 오류가 발생했습니다.";return Promise.reject(new Error(r))});async function Rd(e){return(await ft.get("/api/admin/ai/prompts",{params:e})).data.promptSummaries}async function _d(e){return(await ft.get(`/api/admin/ai/prompts/${e}`)).data}async function o0(e){return(await ft.post("/api/admin/ai/prompts",e)).data}async function i0(e){await ft.post(`/api/admin/ai/prompts/${e}/activate`)}async function s0(e){return(await ft.post("/api/admin/ai/prompts/run",e)).data}const u0={ACTIVE:"bg-green-100 text-green-700",DRAFT:"bg-yellow-100 text-yellow-700",DEPRECATED:"bg-gray-200 text-gray-600"};function a0({versions:e,currentPromptId:t,onSelectVersion:n,isOpen:r,onToggle:l}){const o=[...e].sort((i,s)=>i.status==="ACTIVE"?-1:s.status==="ACTIVE"?1:s.version-i.version);return v.jsxs(v.Fragment,{children:[v.jsx("div",{className:`${r?"w-64":"w-0"} bg-white border-r border-gray-200 transition-all duration-300 overflow-hidden flex-shrink-0`,children:v.jsxs("div",{className:"h-full overflow-y-auto p-4",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-4 uppercase tracking-wider",children:"Versions"}),v.jsx("div",{className:"space-y-2",children:o.map(i=>v.jsx("div",{onClick:()=>n(i.id),className:`p-3 rounded-lg cursor-pointer transition-all ${t===i.id?"bg-blue-50 border-2 border-blue-500":"bg-gray-50 border-2 border-transparent hover:bg-gray-100"} ${i.status==="ACTIVE"?"ring-2 ring-green-400 ring-offset-2":""}`,children:v.jsxs("div",{className:"flex items-center justify-between",children:[v.jsxs("span",{className:"text-sm font-medium text-gray-900",children:["v",i.version]}),v.jsx("span",{className:`text-xs px-2 py-1 rounded-full ${u0[i.status]??"bg-gray-100 text-gray-600"}`,children:i.status})]})},i.id))})]})}),v.jsx("button",{onClick:l,className:"absolute left-0 top-1/2 -translate-y-1/2 bg-white border border-gray-200 rounded-r-md p-1 hover:bg-gray-50 transition-colors shadow-sm z-10",style:{left:r?"256px":"0"},children:r?v.jsx(yg,{size:20}):v.jsx(vg,{size:20})})]})}async function c0(){return(await ft.get("/api/admin/ai/models")).data.models}function f0({content:e,slots:t,maxTokens:n,model:r,onContentChange:l,onMaxTokensChange:o,onModelChange:i,onVariablesChange:s}){const[u,a]=k.useState({}),[c,f]=k.useState([]);k.useEffect(()=>{c0().then(f).catch(()=>{})},[]),k.useEffect(()=>{const p={};t.forEach(({key:y})=>{p[y]=""}),a(p),s(p)},[t]);const g=[...t].sort((p,y)=>p.order-y.order),S=(p,y)=>{const w={...u,[p]:y};a(w),s(w)};return v.jsxs("div",{className:"flex-1 bg-white border-r border-gray-200 flex flex-col",children:[v.jsxs("div",{className:"flex items-center gap-4 p-4 border-b border-gray-200 bg-gray-50",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx("label",{className:"text-sm font-medium text-gray-700",children:"Max Tokens:"}),v.jsx("input",{type:"number",value:n,onChange:p=>o(Number(p.target.value)),className:"w-24 px-3 py-1.5 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",min:"500",max:"10000"})]}),v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx("label",{className:"text-sm font-medium text-gray-700",children:"Model:"}),v.jsx("select",{value:r,onChange:p=>i(p.target.value),className:"px-3 py-1.5 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 bg-white",children:c.length>0?c.map(p=>v.jsx("option",{value:p.name,children:p.name},p.id)):v.jsx("option",{value:r,children:r})})]})]}),v.jsxs("div",{className:"flex-1 overflow-y-auto p-4 flex flex-col",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:"Prompt Content"}),v.jsx("textarea",{value:e,onChange:p=>l(p.target.value),className:"flex-1 min-h-[200px] bg-gray-50 rounded-lg p-4 border border-gray-200 text-sm text-gray-800 font-mono resize-none focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent",spellCheck:!1})]}),g.length>0&&v.jsxs("div",{className:"border-t border-gray-200 p-4 bg-gray-50",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Variables"}),v.jsx("div",{className:"space-y-3",children:g.map(({key:p})=>v.jsxs("div",{children:[v.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:p}),v.jsx("input",{type:"text",value:u[p]||"",onChange:y=>S(p,y.target.value),className:"w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",placeholder:`Enter ${p}`})]},p))})]})]})}function d0({result:e,isExecuting:t,onExecute:n}){return v.jsxs("div",{className:"w-96 bg-white flex flex-col",children:[v.jsxs("div",{className:"flex-1 overflow-y-auto p-4 border-b border-gray-200",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Response"}),v.jsx("div",{className:"bg-gray-50 rounded-lg p-4 border border-gray-200 min-h-[200px]",children:t?v.jsx("div",{className:"flex items-center justify-center h-full",children:v.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"})}):e?v.jsx("div",{className:"text-sm text-gray-800 whitespace-pre-wrap",children:e.response}):v.jsx("div",{className:"text-sm text-gray-400 text-center",children:"Click execute to see response"})})]}),e&&!t&&v.jsxs("div",{className:"p-4 bg-gray-50 border-b border-gray-200",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Metrics"}),v.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[v.jsxs("div",{className:"bg-white p-3 rounded-lg border border-gray-200",children:[v.jsx("div",{className:"text-xs text-gray-500 mb-1",children:"Latency"}),v.jsxs("div",{className:"text-sm font-semibold text-gray-900",children:[e.latencyMs,"ms"]})]}),v.jsxs("div",{className:"bg-white p-3 rounded-lg border border-gray-200",children:[v.jsx("div",{className:"text-xs text-gray-500 mb-1",children:"Input"}),v.jsx("div",{className:"text-sm font-semibold text-gray-900",children:e.inputTokens})]}),v.jsxs("div",{className:"bg-white p-3 rounded-lg border border-gray-200",children:[v.jsx("div",{className:"text-xs text-gray-500 mb-1",children:"Output"}),v.jsx("div",{className:"text-sm font-semibold text-gray-900",children:e.outputTokens})]})]})]}),v.jsx("div",{className:"p-4",children:v.jsxs("button",{onClick:n,disabled:t,className:"w-full flex items-center justify-center gap-2 px-4 py-3 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 transition-colors disabled:bg-gray-400 disabled:cursor-not-allowed",children:[v.jsx(wg,{size:18}),t?"Executing...":"Execute"]})})]})}function p0({isOpen:e,title:t,message:n,onConfirm:r,onCancel:l}){return e?v.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:v.jsxs("div",{className:"bg-white rounded-lg shadow-xl max-w-md w-full mx-4",children:[v.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b border-gray-200",children:[v.jsx("h3",{className:"text-lg font-semibold text-gray-900",children:t}),v.jsx("button",{onClick:l,className:"text-gray-400 hover:text-gray-600 transition-colors",children:v.jsx(Sg,{size:20})})]}),v.jsx("div",{className:"px-6 py-4",children:v.jsx("p",{className:"text-gray-700",children:n})}),v.jsxs("div",{className:"flex items-center justify-end gap-3 px-6 py-4 bg-gray-50 rounded-b-lg",children:[v.jsx("button",{onClick:l,className:"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors",children:"Cancel"}),v.jsx("button",{onClick:r,className:"px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 transition-colors",children:"Confirm"})]})]})}):null}function h0({prompt:e,isFetching:t=!1}){const n=Un(),[r,l]=k.useState(e),[o,i]=k.useState([]),[s,u]=k.useState(!0),[a,c]=k.useState(e.template),[f,g]=k.useState(e.maxTokens),[S,p]=k.useState(e.model),[y,w]=k.useState({}),[h,d]=k.useState(null),[m,E]=k.useState(!1),[N,P]=k.useState({isOpen:!1,title:"",message:"",onConfirm:()=>{}}),R=k.useCallback(async()=>{try{const I=await Rd({moduleName:e.name});i(I)}catch{i([{id:e.id,name:e.name,version:e.version,status:e.status,model:e.model,createdAt:e.createdAt}])}},[e]);k.useEffect(()=>{l(e),c(e.template),g(e.maxTokens),p(e.model),d(null),w({}),R()},[e,R]);const O=I=>{n(`/admin/prompts/${I}`,{replace:!0})},B=()=>{P({isOpen:!0,title:"Save New Version",message:`"${r.name}"의 새 버전을 저장하시겠습니까?`,onConfirm:async()=>{P(I=>({...I,isOpen:!1}));try{const I=await o0({moduleName:r.name,template:a,maxTokens:f,model:S});n(`/admin/prompts/${I.id}`,{replace:!0})}catch(I){alert(I instanceof Error?I.message:"저장에 실패했습니다.")}}})},z=()=>{P({isOpen:!0,title:"Activate Version",message:`v${r.version}을 활성 버전으로 설정하시겠습니까?`,onConfirm:async()=>{P(I=>({...I,isOpen:!1}));try{await i0(r.id),await R();const I=await _d(r.id);l(I)}catch(I){alert(I instanceof Error?I.message:"활성화에 실패했습니다.")}}})},ue=async()=>{E(!0),d(null);try{const I=await s0({promptTemplate:a,maxTokens:f,modelName:S,vars:y});d(I)}catch(I){alert(I instanceof Error?I.message:"실행에 실패했습니다.")}finally{E(!1)}};return v.jsxs("div",{className:"min-h-screen bg-gray-50 flex flex-col relative",children:[v.jsx("div",{className:"bg-white border-b border-gray-200 px-6 py-4",children:v.jsxs("div",{className:"flex items-center justify-between",children:[v.jsxs("div",{className:"flex items-center gap-4",children:[v.jsxs("button",{type:"button",onClick:()=>n("/admin/prompts"),className:"flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors",children:[v.jsx(mg,{size:18}),"Back"]}),v.jsxs("div",{className:"border-l border-gray-300 pl-4",children:[v.jsx("h1",{className:"text-xl font-bold text-gray-900",children:r.name}),v.jsxs("p",{className:"text-sm text-gray-500",children:["Version ",r.version]})]})]}),v.jsxs("div",{className:"flex items-center gap-3",children:[v.jsxs("button",{onClick:B,className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors",children:[v.jsx(xg,{size:18}),"Save New Version"]}),v.jsxs("button",{onClick:z,disabled:r.status==="ACTIVE",className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-green-600 rounded-md hover:bg-green-700 transition-colors disabled:bg-gray-400 disabled:cursor-not-allowed",children:[v.jsx(gg,{size:18}),"Activate"]})]})]})}),v.jsxs("div",{className:"flex-1 flex relative",children:[t?v.jsx("div",{className:"absolute inset-0 z-20 flex items-center justify-center bg-gray-50/70 backdrop-blur-[1px]","aria-busy":"true","aria-live":"polite",children:v.jsxs("div",{className:"flex flex-col items-center gap-3 rounded-lg bg-white/90 px-6 py-4 shadow-md border border-gray-200",children:[v.jsx("div",{className:"animate-spin rounded-full h-9 w-9 border-b-2 border-blue-600"}),v.jsx("span",{className:"text-sm text-gray-600",children:"버전 불러오는 중…"})]})}):null,v.jsx(a0,{versions:o,currentPromptId:r.id,onSelectVersion:O,isOpen:s,onToggle:()=>u(!s)}),v.jsx(f0,{content:a,slots:r.slots,maxTokens:f,model:S,onContentChange:c,onMaxTokensChange:g,onModelChange:p,onVariablesChange:w}),v.jsx(d0,{result:h,isExecuting:m,onExecute:ue})]}),v.jsx(p0,{isOpen:N.isOpen,title:N.title,message:N.message,onConfirm:N.onConfirm,onCancel:()=>P(I=>({...I,isOpen:!1}))})]})}function m0(e){if(!e||typeof e!="object")throw new Error("잘못된 응답 형식입니다.");const t=e;if(t.isSuccess===!1)throw new Error(t.message??"로그인에 실패했습니다.");if(t.result&&typeof t.result=="object"&&t.result.accessToken)return{accessToken:t.result.accessToken,tokenType:t.result.tokenType};if(typeof t.accessToken=="string")return{accessToken:t.accessToken,tokenType:t.tokenType};throw new Error(t.message??"로그인에 실패했습니다.")}async function g0(e){const t=await ft.post("/api/admin/auth/login",e);return m0(t.data)}function y0(){var g,S;const e=Un(),n=((S=(g=nn().state)==null?void 0:g.from)==null?void 0:S.pathname)??"/admin/prompts",[r,l]=k.useState(""),[o,i]=k.useState(""),[s,u]=k.useState(null),[a,c]=k.useState(!1);if(mo())return v.jsx(Hl,{to:"/admin/prompts",replace:!0});const f=async p=>{p.preventDefault(),u(null),c(!0);try{const{accessToken:y,tokenType:w}=await g0({id:r.trim(),password:o});r0(y,w),e(n,{replace:!0})}catch(y){u(y instanceof Error?y.message:"로그인에 실패했습니다.")}finally{c(!1)}};return v.jsx("div",{className:"min-h-screen bg-gray-50 flex items-center justify-center p-8",children:v.jsxs("div",{className:"w-full max-w-md bg-white rounded-lg shadow-sm border border-gray-200 p-8",children:[v.jsx("h1",{className:"text-2xl font-bold text-gray-900 mb-6",children:"로그인"}),s?v.jsx("div",{className:"mb-4 px-4 py-3 bg-red-50 border border-red-200 rounded-lg text-sm text-red-700",children:s}):null,v.jsxs("form",{onSubmit:f,className:"space-y-4",children:[v.jsxs("div",{children:[v.jsx("label",{htmlFor:"login-id",className:"block text-sm font-medium text-gray-700 mb-1",children:"ID"}),v.jsx("input",{id:"login-id",type:"text",autoComplete:"username",value:r,onChange:p=>l(p.target.value),className:"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 text-sm",required:!0})]}),v.jsxs("div",{children:[v.jsx("label",{htmlFor:"login-password",className:"block text-sm font-medium text-gray-700 mb-1",children:"비밀번호"}),v.jsx("input",{id:"login-password",type:"password",autoComplete:"current-password",value:o,onChange:p=>i(p.target.value),className:"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 text-sm",required:!0})]}),v.jsx("button",{type:"submit",disabled:a,className:"w-full py-2.5 px-4 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 disabled:bg-gray-400 disabled:cursor-not-allowed transition-colors",children:a?"로그인 중…":"로그인"})]})]})})}function v0(){const e=nn();return mo()?v.jsx(Ym,{}):v.jsx(Hl,{to:"/login",replace:!0,state:{from:e}})}function La(){return mo()?v.jsx(Hl,{to:"/admin/prompts",replace:!0}):v.jsx(Hl,{to:"/login",replace:!0})}function w0(){const[e,t]=k.useState([]),[n,r]=k.useState(!1),[l,o]=k.useState(null),i=async()=>{r(!0),o(null);try{const s=await Rd({status:"ACTIVE"});t(s)}catch(s){o(s instanceof Error?s.message:"목록을 불러오지 못했습니다.")}finally{r(!1)}};return k.useEffect(()=>{i()},[]),v.jsx(dg,{prompts:e,isLoading:n,error:l})}function x0(){const{id:e}=Im(),t=Un(),[n,r]=k.useState(null),[l,o]=k.useState(!0),[i,s]=k.useState(null),u=k.useRef(n);u.current=n,k.useEffect(()=>{const g=e!==void 0?Number(e):NaN;if(e===void 0||!Number.isFinite(g)){r(null),o(!1),s("잘못된 프롬프트 ID입니다.");return}let S=!1;return o(!0),s(null),(async()=>{try{const p=await _d(g);S||(r(p),s(null))}catch(p){if(!S){const y=p instanceof Error?p.message:"상세 정보를 불러오지 못했습니다.";s(y);const w=u.current;w&&w.id!==g&&t(`/admin/prompts/${w.id}`,{replace:!0})}}finally{S||o(!1)}})(),()=>{S=!0}},[e,t]);const a=e!==void 0?Number(e):NaN,c=l&&n===null,f=!!(n&&l&&Number.isFinite(a)&&n.id!==a);return c?v.jsx("div",{className:"min-h-screen bg-gray-50 flex items-center justify-center",children:v.jsx("div",{className:"animate-spin rounded-full h-10 w-10 border-b-2 border-blue-600"})}):i&&!n||!n?v.jsxs("div",{className:"min-h-screen bg-gray-50 p-8",children:[v.jsx("div",{className:"max-w-lg mx-auto px-4 py-3 bg-red-50 border border-red-200 rounded-lg text-sm text-red-700",children:i??"프롬프트를 찾을 수 없습니다."}),v.jsx("div",{className:"max-w-lg mx-auto mt-4",children:v.jsx(ag,{to:"/admin/prompts",className:"text-blue-600 hover:text-blue-800 text-sm font-medium",children:"목록으로 돌아가기"})})]}):v.jsx(h0,{prompt:n,isFetching:f})}function S0(){return v.jsxs(Zm,{children:[v.jsx(Mt,{path:"/",element:v.jsx(La,{})}),v.jsx(Mt,{path:"/login",element:v.jsx(y0,{})}),v.jsxs(Mt,{path:"/admin",element:v.jsx(v0,{}),children:[v.jsx(Mt,{path:"prompts",element:v.jsx(w0,{})}),v.jsx(Mt,{path:"prompts/:id",element:v.jsx(x0,{})})]}),v.jsx(Mt,{path:"*",element:v.jsx(La,{})})]})}Kf(document.getElementById("root")).render(v.jsx(k.StrictMode,{children:v.jsx(ig,{children:v.jsx(S0,{})})})); diff --git a/src/main/resources/static/assets/index-DuX3EULQ.css b/src/main/resources/static/assets/index-DuX3EULQ.css new file mode 100644 index 0000000..df372e2 --- /dev/null +++ b/src/main/resources/static/assets/index-DuX3EULQ.css @@ -0,0 +1 @@ +*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.left-0{left:0}.top-1\/2{top:50%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mt-4{margin-top:1rem}.block{display:block}.flex{display:flex}.table{display:table}.grid{display:grid}.h-10{height:2.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-full{height:100%}.min-h-\[200px\]{min-height:200px}.min-h-screen{min-height:100vh}.w-0{width:0px}.w-10{width:2.5rem}.w-24{width:6rem}.w-64{width:16rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-full{width:100%}.max-w-6xl{max-width:72rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.whitespace-pre-wrap{white-space:pre-wrap}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-600{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-50\/70{background-color:#f9fafbb3}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/90{background-color:#ffffffe6}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-opacity-50{--tw-bg-opacity: .5}.p-1{padding:.25rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pl-4{padding-left:1rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tracking-wider{letter-spacing:.05em}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-green-400{--tw-ring-opacity: 1;--tw-ring-color: rgb(74 222 128 / var(--tw-ring-opacity, 1))}.ring-offset-2{--tw-ring-offset-width: 2px}.backdrop-blur-\[1px\]{--tw-backdrop-blur: blur(1px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-green-700:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.hover\:text-blue-800:hover{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:border-transparent:focus{border-color:transparent}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-400:disabled{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))} diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html new file mode 100644 index 0000000..e648bab --- /dev/null +++ b/src/main/resources/static/index.html @@ -0,0 +1,13 @@ + + + + + + Prompt Management Page + + + + +
+ + From c6a99e9e4aeba6b31997ad7cc5152600329b9ec7 Mon Sep 17 00:00:00 2001 From: Jaehyeon Han Date: Sun, 19 Apr 2026 20:34:38 +0900 Subject: [PATCH 5/6] =?UTF-8?q?feat(admin):=20admin=20=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=B8=94=20flyway=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/db/migration/V25__add_admin_table.sql | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/resources/db/migration/V25__add_admin_table.sql diff --git a/src/main/resources/db/migration/V25__add_admin_table.sql b/src/main/resources/db/migration/V25__add_admin_table.sql new file mode 100644 index 0000000..93e3340 --- /dev/null +++ b/src/main/resources/db/migration/V25__add_admin_table.sql @@ -0,0 +1,12 @@ +CREATE TABLE `admin` +( + id BIGINT NOT NULL AUTO_INCREMENT, + login_id VARCHAR(64) NOT NULL, + password VARCHAR(255) NOT NULL, + name VARCHAR(100) NULL, + created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + PRIMARY KEY (id), + UNIQUE KEY uk_admin_login_id (login_id) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_unicode_ci; \ No newline at end of file From 3b09b19ac42a625494b5adbdcddc33a9c34f20ce Mon Sep 17 00:00:00 2001 From: Jaehyeon Han Date: Sun, 26 Apr 2026 17:55:45 +0900 Subject: [PATCH 6/6] =?UTF-8?q?refactor(ai,=20admin):=20Copilot=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EC=9D=98=EA=B2=AC=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Admin 엔티티 생성시각 DB 위임 명시 - admin 페이지 base Url 수정 - 로깅 시 UUID 파싱 실패 예외 방지 --- .../konnect_backend/domain/admin/entity/Admin.java | 2 +- .../konnect_backend/domain/ai/aop/LlmLoggingAspect.java | 9 ++++++++- .../assets/{index-B3y3P6tv.js => index-D1pptRKf.js} | 2 +- src/main/resources/static/index.html | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) rename src/main/resources/static/assets/{index-B3y3P6tv.js => index-D1pptRKf.js} (92%) diff --git a/src/main/java/com/example/konnect_backend/domain/admin/entity/Admin.java b/src/main/java/com/example/konnect_backend/domain/admin/entity/Admin.java index 1e3c411..326ebc2 100644 --- a/src/main/java/com/example/konnect_backend/domain/admin/entity/Admin.java +++ b/src/main/java/com/example/konnect_backend/domain/admin/entity/Admin.java @@ -26,6 +26,6 @@ public class Admin { @Column(length = 100) private String name; - @Column(name = "created_at", nullable = false, updatable = false) + @Column(name = "created_at", nullable = false, updatable = false, insertable = false) private LocalDateTime createdAt; } diff --git a/src/main/java/com/example/konnect_backend/domain/ai/aop/LlmLoggingAspect.java b/src/main/java/com/example/konnect_backend/domain/ai/aop/LlmLoggingAspect.java index 89f52aa..ed74c84 100644 --- a/src/main/java/com/example/konnect_backend/domain/ai/aop/LlmLoggingAspect.java +++ b/src/main/java/com/example/konnect_backend/domain/ai/aop/LlmLoggingAspect.java @@ -58,7 +58,14 @@ public Object logGeminiCall(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); PromptContext promptContext = PromptContextHolder.get(); String requestIdString = MDC.get(REQUEST_ID_KEY); - UUID requestId = requestIdString == null ? UUID.randomUUID() : UUID.fromString(requestIdString); + UUID requestId; + try { + requestId = (requestIdString == null || requestIdString.isBlank()) + ? UUID.randomUUID() + : UUID.fromString(requestIdString); + } catch (IllegalArgumentException e) { + requestId = UUID.randomUUID(); + } try { GeminiCallResult callResult = (GeminiCallResult) joinPoint.proceed(); diff --git a/src/main/resources/static/assets/index-B3y3P6tv.js b/src/main/resources/static/assets/index-D1pptRKf.js similarity index 92% rename from src/main/resources/static/assets/index-B3y3P6tv.js rename to src/main/resources/static/assets/index-D1pptRKf.js index b9d6b80..43e0aa3 100644 --- a/src/main/resources/static/assets/index-B3y3P6tv.js +++ b/src/main/resources/static/assets/index-D1pptRKf.js @@ -117,4 +117,4 @@ Error generating stack: `+o.message+` `);return i===-1?"":l.stack.slice(i+1)})();try{if(!r.stack)r.stack=o;else if(o){const i=o.indexOf(` `),s=i===-1?-1:o.indexOf(` `,i+1),u=s===-1?"":o.slice(s+1);String(r.stack).endsWith(u)||(r.stack+=` -`+o)}}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Gt(this.defaults,n);const{transitional:r,paramsSerializer:l,headers:o}=n;r!==void 0&&yl.assertOptions(r,{silentJSONParsing:Le.transitional(Le.boolean),forcedJSONParsing:Le.transitional(Le.boolean),clarifyTimeoutError:Le.transitional(Le.boolean),legacyInterceptorReqResOrdering:Le.transitional(Le.boolean)},!1),l!=null&&(x.isFunction(l)?n.paramsSerializer={serialize:l}:yl.assertOptions(l,{encode:Le.function,serialize:Le.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),yl.assertOptions(n,{baseUrl:Le.spelling("baseURL"),withXsrfToken:Le.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=o&&x.merge(o.common,o[n.method]);o&&x.forEach(["delete","get","head","post","put","patch","common"],p=>{delete o[p]}),n.headers=Ce.concat(i,o);const s=[];let u=!0;this.interceptors.request.forEach(function(y){if(typeof y.runWhen=="function"&&y.runWhen(n)===!1)return;u=u&&y.synchronous;const w=n.transitional||Ks;w&&w.legacyInterceptorReqResOrdering?s.unshift(y.fulfilled,y.rejected):s.push(y.fulfilled,y.rejected)});const a=[];this.interceptors.response.forEach(function(y){a.push(y.fulfilled,y.rejected)});let c,f=0,g;if(!u){const p=[Oa.bind(this),void 0];for(p.unshift(...s),p.push(...a),g=p.length,c=Promise.resolve(n);f{if(!r._listeners)return;let o=r._listeners.length;for(;o-- >0;)r._listeners[o](l);r._listeners=null}),this.promise.then=l=>{let o;const i=new Promise(s=>{r.subscribe(s),o=s}).then(l);return i.cancel=function(){r.unsubscribe(o)},i},t(function(o,i,s){r.reason||(r.reason=new Ir(o,i,s),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new kd(function(l){t=l}),cancel:t}}};function e0(e){return function(n){return e.apply(null,n)}}function t0(e){return x.isObject(e)&&e.isAxiosError===!0}const Qi={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Qi).forEach(([e,t])=>{Qi[t]=e});function Cd(e){const t=new Kt(e),n=nd(Kt.prototype.request,t);return x.extend(n,Kt.prototype,t,{allOwnKeys:!0}),x.extend(n,t,null,{allOwnKeys:!0}),n.create=function(l){return Cd(Gt(e,l))},n}const G=Cd(Fr);G.Axios=Kt;G.CanceledError=Ir;G.CancelToken=Zy;G.isCancel=gd;G.VERSION=Ed;G.toFormData=po;G.AxiosError=j;G.Cancel=G.CanceledError;G.all=function(t){return Promise.all(t)};G.spread=e0;G.isAxiosError=t0;G.mergeConfig=Gt;G.AxiosHeaders=Ce;G.formToJSON=e=>hd(x.isHTMLForm(e)?new FormData(e):e);G.getAdapter=Sd.getAdapter;G.HttpStatusCode=Qi;G.default=G;const{Axios:N0,AxiosError:R0,CanceledError:_0,isCancel:P0,CancelToken:T0,VERSION:O0,all:j0,Cancel:L0,isAxiosError:z0,spread:A0,toFormData:F0,AxiosHeaders:I0,HttpStatusCode:D0,formToJSON:U0,getAdapter:M0,mergeConfig:B0}=G;let Js=null,Xs=null;function mo(){return Js}function n0(){return Xs??"Bearer"}function r0(e,t){Js=e,Xs=t!=null&&t.trim()?t.trim():"Bearer"}function l0(){Js=null,Xs=null}function Nd(e){return!!(e!=null&&e.includes("/api/admin/auth/login"))}const ft=G.create({baseURL:"http://localhost:8080",headers:{"Content-Type":"application/json"}});ft.interceptors.request.use(e=>{const t=e.url??"";if(Nd(t))return e;const n=mo();if(n){const r=n0();e.headers.set("Authorization",`${r} ${n}`)}return e});ft.interceptors.response.use(e=>e,e=>{var l,o,i,s;const t=(l=e.response)==null?void 0:l.status,n=((o=e.config)==null?void 0:o.url)??"";if(t===401&&!Nd(n)){l0();const u="/".replace(/\/$/,"");window.location.replace(u?`${u}/login`:"/login")}const r=((s=(i=e.response)==null?void 0:i.data)==null?void 0:s.message)??e.message??"알 수 없는 오류가 발생했습니다.";return Promise.reject(new Error(r))});async function Rd(e){return(await ft.get("/api/admin/ai/prompts",{params:e})).data.promptSummaries}async function _d(e){return(await ft.get(`/api/admin/ai/prompts/${e}`)).data}async function o0(e){return(await ft.post("/api/admin/ai/prompts",e)).data}async function i0(e){await ft.post(`/api/admin/ai/prompts/${e}/activate`)}async function s0(e){return(await ft.post("/api/admin/ai/prompts/run",e)).data}const u0={ACTIVE:"bg-green-100 text-green-700",DRAFT:"bg-yellow-100 text-yellow-700",DEPRECATED:"bg-gray-200 text-gray-600"};function a0({versions:e,currentPromptId:t,onSelectVersion:n,isOpen:r,onToggle:l}){const o=[...e].sort((i,s)=>i.status==="ACTIVE"?-1:s.status==="ACTIVE"?1:s.version-i.version);return v.jsxs(v.Fragment,{children:[v.jsx("div",{className:`${r?"w-64":"w-0"} bg-white border-r border-gray-200 transition-all duration-300 overflow-hidden flex-shrink-0`,children:v.jsxs("div",{className:"h-full overflow-y-auto p-4",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-4 uppercase tracking-wider",children:"Versions"}),v.jsx("div",{className:"space-y-2",children:o.map(i=>v.jsx("div",{onClick:()=>n(i.id),className:`p-3 rounded-lg cursor-pointer transition-all ${t===i.id?"bg-blue-50 border-2 border-blue-500":"bg-gray-50 border-2 border-transparent hover:bg-gray-100"} ${i.status==="ACTIVE"?"ring-2 ring-green-400 ring-offset-2":""}`,children:v.jsxs("div",{className:"flex items-center justify-between",children:[v.jsxs("span",{className:"text-sm font-medium text-gray-900",children:["v",i.version]}),v.jsx("span",{className:`text-xs px-2 py-1 rounded-full ${u0[i.status]??"bg-gray-100 text-gray-600"}`,children:i.status})]})},i.id))})]})}),v.jsx("button",{onClick:l,className:"absolute left-0 top-1/2 -translate-y-1/2 bg-white border border-gray-200 rounded-r-md p-1 hover:bg-gray-50 transition-colors shadow-sm z-10",style:{left:r?"256px":"0"},children:r?v.jsx(yg,{size:20}):v.jsx(vg,{size:20})})]})}async function c0(){return(await ft.get("/api/admin/ai/models")).data.models}function f0({content:e,slots:t,maxTokens:n,model:r,onContentChange:l,onMaxTokensChange:o,onModelChange:i,onVariablesChange:s}){const[u,a]=k.useState({}),[c,f]=k.useState([]);k.useEffect(()=>{c0().then(f).catch(()=>{})},[]),k.useEffect(()=>{const p={};t.forEach(({key:y})=>{p[y]=""}),a(p),s(p)},[t]);const g=[...t].sort((p,y)=>p.order-y.order),S=(p,y)=>{const w={...u,[p]:y};a(w),s(w)};return v.jsxs("div",{className:"flex-1 bg-white border-r border-gray-200 flex flex-col",children:[v.jsxs("div",{className:"flex items-center gap-4 p-4 border-b border-gray-200 bg-gray-50",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx("label",{className:"text-sm font-medium text-gray-700",children:"Max Tokens:"}),v.jsx("input",{type:"number",value:n,onChange:p=>o(Number(p.target.value)),className:"w-24 px-3 py-1.5 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",min:"500",max:"10000"})]}),v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx("label",{className:"text-sm font-medium text-gray-700",children:"Model:"}),v.jsx("select",{value:r,onChange:p=>i(p.target.value),className:"px-3 py-1.5 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 bg-white",children:c.length>0?c.map(p=>v.jsx("option",{value:p.name,children:p.name},p.id)):v.jsx("option",{value:r,children:r})})]})]}),v.jsxs("div",{className:"flex-1 overflow-y-auto p-4 flex flex-col",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:"Prompt Content"}),v.jsx("textarea",{value:e,onChange:p=>l(p.target.value),className:"flex-1 min-h-[200px] bg-gray-50 rounded-lg p-4 border border-gray-200 text-sm text-gray-800 font-mono resize-none focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent",spellCheck:!1})]}),g.length>0&&v.jsxs("div",{className:"border-t border-gray-200 p-4 bg-gray-50",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Variables"}),v.jsx("div",{className:"space-y-3",children:g.map(({key:p})=>v.jsxs("div",{children:[v.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:p}),v.jsx("input",{type:"text",value:u[p]||"",onChange:y=>S(p,y.target.value),className:"w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",placeholder:`Enter ${p}`})]},p))})]})]})}function d0({result:e,isExecuting:t,onExecute:n}){return v.jsxs("div",{className:"w-96 bg-white flex flex-col",children:[v.jsxs("div",{className:"flex-1 overflow-y-auto p-4 border-b border-gray-200",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Response"}),v.jsx("div",{className:"bg-gray-50 rounded-lg p-4 border border-gray-200 min-h-[200px]",children:t?v.jsx("div",{className:"flex items-center justify-center h-full",children:v.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"})}):e?v.jsx("div",{className:"text-sm text-gray-800 whitespace-pre-wrap",children:e.response}):v.jsx("div",{className:"text-sm text-gray-400 text-center",children:"Click execute to see response"})})]}),e&&!t&&v.jsxs("div",{className:"p-4 bg-gray-50 border-b border-gray-200",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Metrics"}),v.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[v.jsxs("div",{className:"bg-white p-3 rounded-lg border border-gray-200",children:[v.jsx("div",{className:"text-xs text-gray-500 mb-1",children:"Latency"}),v.jsxs("div",{className:"text-sm font-semibold text-gray-900",children:[e.latencyMs,"ms"]})]}),v.jsxs("div",{className:"bg-white p-3 rounded-lg border border-gray-200",children:[v.jsx("div",{className:"text-xs text-gray-500 mb-1",children:"Input"}),v.jsx("div",{className:"text-sm font-semibold text-gray-900",children:e.inputTokens})]}),v.jsxs("div",{className:"bg-white p-3 rounded-lg border border-gray-200",children:[v.jsx("div",{className:"text-xs text-gray-500 mb-1",children:"Output"}),v.jsx("div",{className:"text-sm font-semibold text-gray-900",children:e.outputTokens})]})]})]}),v.jsx("div",{className:"p-4",children:v.jsxs("button",{onClick:n,disabled:t,className:"w-full flex items-center justify-center gap-2 px-4 py-3 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 transition-colors disabled:bg-gray-400 disabled:cursor-not-allowed",children:[v.jsx(wg,{size:18}),t?"Executing...":"Execute"]})})]})}function p0({isOpen:e,title:t,message:n,onConfirm:r,onCancel:l}){return e?v.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:v.jsxs("div",{className:"bg-white rounded-lg shadow-xl max-w-md w-full mx-4",children:[v.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b border-gray-200",children:[v.jsx("h3",{className:"text-lg font-semibold text-gray-900",children:t}),v.jsx("button",{onClick:l,className:"text-gray-400 hover:text-gray-600 transition-colors",children:v.jsx(Sg,{size:20})})]}),v.jsx("div",{className:"px-6 py-4",children:v.jsx("p",{className:"text-gray-700",children:n})}),v.jsxs("div",{className:"flex items-center justify-end gap-3 px-6 py-4 bg-gray-50 rounded-b-lg",children:[v.jsx("button",{onClick:l,className:"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors",children:"Cancel"}),v.jsx("button",{onClick:r,className:"px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 transition-colors",children:"Confirm"})]})]})}):null}function h0({prompt:e,isFetching:t=!1}){const n=Un(),[r,l]=k.useState(e),[o,i]=k.useState([]),[s,u]=k.useState(!0),[a,c]=k.useState(e.template),[f,g]=k.useState(e.maxTokens),[S,p]=k.useState(e.model),[y,w]=k.useState({}),[h,d]=k.useState(null),[m,E]=k.useState(!1),[N,P]=k.useState({isOpen:!1,title:"",message:"",onConfirm:()=>{}}),R=k.useCallback(async()=>{try{const I=await Rd({moduleName:e.name});i(I)}catch{i([{id:e.id,name:e.name,version:e.version,status:e.status,model:e.model,createdAt:e.createdAt}])}},[e]);k.useEffect(()=>{l(e),c(e.template),g(e.maxTokens),p(e.model),d(null),w({}),R()},[e,R]);const O=I=>{n(`/admin/prompts/${I}`,{replace:!0})},B=()=>{P({isOpen:!0,title:"Save New Version",message:`"${r.name}"의 새 버전을 저장하시겠습니까?`,onConfirm:async()=>{P(I=>({...I,isOpen:!1}));try{const I=await o0({moduleName:r.name,template:a,maxTokens:f,model:S});n(`/admin/prompts/${I.id}`,{replace:!0})}catch(I){alert(I instanceof Error?I.message:"저장에 실패했습니다.")}}})},z=()=>{P({isOpen:!0,title:"Activate Version",message:`v${r.version}을 활성 버전으로 설정하시겠습니까?`,onConfirm:async()=>{P(I=>({...I,isOpen:!1}));try{await i0(r.id),await R();const I=await _d(r.id);l(I)}catch(I){alert(I instanceof Error?I.message:"활성화에 실패했습니다.")}}})},ue=async()=>{E(!0),d(null);try{const I=await s0({promptTemplate:a,maxTokens:f,modelName:S,vars:y});d(I)}catch(I){alert(I instanceof Error?I.message:"실행에 실패했습니다.")}finally{E(!1)}};return v.jsxs("div",{className:"min-h-screen bg-gray-50 flex flex-col relative",children:[v.jsx("div",{className:"bg-white border-b border-gray-200 px-6 py-4",children:v.jsxs("div",{className:"flex items-center justify-between",children:[v.jsxs("div",{className:"flex items-center gap-4",children:[v.jsxs("button",{type:"button",onClick:()=>n("/admin/prompts"),className:"flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors",children:[v.jsx(mg,{size:18}),"Back"]}),v.jsxs("div",{className:"border-l border-gray-300 pl-4",children:[v.jsx("h1",{className:"text-xl font-bold text-gray-900",children:r.name}),v.jsxs("p",{className:"text-sm text-gray-500",children:["Version ",r.version]})]})]}),v.jsxs("div",{className:"flex items-center gap-3",children:[v.jsxs("button",{onClick:B,className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors",children:[v.jsx(xg,{size:18}),"Save New Version"]}),v.jsxs("button",{onClick:z,disabled:r.status==="ACTIVE",className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-green-600 rounded-md hover:bg-green-700 transition-colors disabled:bg-gray-400 disabled:cursor-not-allowed",children:[v.jsx(gg,{size:18}),"Activate"]})]})]})}),v.jsxs("div",{className:"flex-1 flex relative",children:[t?v.jsx("div",{className:"absolute inset-0 z-20 flex items-center justify-center bg-gray-50/70 backdrop-blur-[1px]","aria-busy":"true","aria-live":"polite",children:v.jsxs("div",{className:"flex flex-col items-center gap-3 rounded-lg bg-white/90 px-6 py-4 shadow-md border border-gray-200",children:[v.jsx("div",{className:"animate-spin rounded-full h-9 w-9 border-b-2 border-blue-600"}),v.jsx("span",{className:"text-sm text-gray-600",children:"버전 불러오는 중…"})]})}):null,v.jsx(a0,{versions:o,currentPromptId:r.id,onSelectVersion:O,isOpen:s,onToggle:()=>u(!s)}),v.jsx(f0,{content:a,slots:r.slots,maxTokens:f,model:S,onContentChange:c,onMaxTokensChange:g,onModelChange:p,onVariablesChange:w}),v.jsx(d0,{result:h,isExecuting:m,onExecute:ue})]}),v.jsx(p0,{isOpen:N.isOpen,title:N.title,message:N.message,onConfirm:N.onConfirm,onCancel:()=>P(I=>({...I,isOpen:!1}))})]})}function m0(e){if(!e||typeof e!="object")throw new Error("잘못된 응답 형식입니다.");const t=e;if(t.isSuccess===!1)throw new Error(t.message??"로그인에 실패했습니다.");if(t.result&&typeof t.result=="object"&&t.result.accessToken)return{accessToken:t.result.accessToken,tokenType:t.result.tokenType};if(typeof t.accessToken=="string")return{accessToken:t.accessToken,tokenType:t.tokenType};throw new Error(t.message??"로그인에 실패했습니다.")}async function g0(e){const t=await ft.post("/api/admin/auth/login",e);return m0(t.data)}function y0(){var g,S;const e=Un(),n=((S=(g=nn().state)==null?void 0:g.from)==null?void 0:S.pathname)??"/admin/prompts",[r,l]=k.useState(""),[o,i]=k.useState(""),[s,u]=k.useState(null),[a,c]=k.useState(!1);if(mo())return v.jsx(Hl,{to:"/admin/prompts",replace:!0});const f=async p=>{p.preventDefault(),u(null),c(!0);try{const{accessToken:y,tokenType:w}=await g0({id:r.trim(),password:o});r0(y,w),e(n,{replace:!0})}catch(y){u(y instanceof Error?y.message:"로그인에 실패했습니다.")}finally{c(!1)}};return v.jsx("div",{className:"min-h-screen bg-gray-50 flex items-center justify-center p-8",children:v.jsxs("div",{className:"w-full max-w-md bg-white rounded-lg shadow-sm border border-gray-200 p-8",children:[v.jsx("h1",{className:"text-2xl font-bold text-gray-900 mb-6",children:"로그인"}),s?v.jsx("div",{className:"mb-4 px-4 py-3 bg-red-50 border border-red-200 rounded-lg text-sm text-red-700",children:s}):null,v.jsxs("form",{onSubmit:f,className:"space-y-4",children:[v.jsxs("div",{children:[v.jsx("label",{htmlFor:"login-id",className:"block text-sm font-medium text-gray-700 mb-1",children:"ID"}),v.jsx("input",{id:"login-id",type:"text",autoComplete:"username",value:r,onChange:p=>l(p.target.value),className:"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 text-sm",required:!0})]}),v.jsxs("div",{children:[v.jsx("label",{htmlFor:"login-password",className:"block text-sm font-medium text-gray-700 mb-1",children:"비밀번호"}),v.jsx("input",{id:"login-password",type:"password",autoComplete:"current-password",value:o,onChange:p=>i(p.target.value),className:"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 text-sm",required:!0})]}),v.jsx("button",{type:"submit",disabled:a,className:"w-full py-2.5 px-4 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 disabled:bg-gray-400 disabled:cursor-not-allowed transition-colors",children:a?"로그인 중…":"로그인"})]})]})})}function v0(){const e=nn();return mo()?v.jsx(Ym,{}):v.jsx(Hl,{to:"/login",replace:!0,state:{from:e}})}function La(){return mo()?v.jsx(Hl,{to:"/admin/prompts",replace:!0}):v.jsx(Hl,{to:"/login",replace:!0})}function w0(){const[e,t]=k.useState([]),[n,r]=k.useState(!1),[l,o]=k.useState(null),i=async()=>{r(!0),o(null);try{const s=await Rd({status:"ACTIVE"});t(s)}catch(s){o(s instanceof Error?s.message:"목록을 불러오지 못했습니다.")}finally{r(!1)}};return k.useEffect(()=>{i()},[]),v.jsx(dg,{prompts:e,isLoading:n,error:l})}function x0(){const{id:e}=Im(),t=Un(),[n,r]=k.useState(null),[l,o]=k.useState(!0),[i,s]=k.useState(null),u=k.useRef(n);u.current=n,k.useEffect(()=>{const g=e!==void 0?Number(e):NaN;if(e===void 0||!Number.isFinite(g)){r(null),o(!1),s("잘못된 프롬프트 ID입니다.");return}let S=!1;return o(!0),s(null),(async()=>{try{const p=await _d(g);S||(r(p),s(null))}catch(p){if(!S){const y=p instanceof Error?p.message:"상세 정보를 불러오지 못했습니다.";s(y);const w=u.current;w&&w.id!==g&&t(`/admin/prompts/${w.id}`,{replace:!0})}}finally{S||o(!1)}})(),()=>{S=!0}},[e,t]);const a=e!==void 0?Number(e):NaN,c=l&&n===null,f=!!(n&&l&&Number.isFinite(a)&&n.id!==a);return c?v.jsx("div",{className:"min-h-screen bg-gray-50 flex items-center justify-center",children:v.jsx("div",{className:"animate-spin rounded-full h-10 w-10 border-b-2 border-blue-600"})}):i&&!n||!n?v.jsxs("div",{className:"min-h-screen bg-gray-50 p-8",children:[v.jsx("div",{className:"max-w-lg mx-auto px-4 py-3 bg-red-50 border border-red-200 rounded-lg text-sm text-red-700",children:i??"프롬프트를 찾을 수 없습니다."}),v.jsx("div",{className:"max-w-lg mx-auto mt-4",children:v.jsx(ag,{to:"/admin/prompts",className:"text-blue-600 hover:text-blue-800 text-sm font-medium",children:"목록으로 돌아가기"})})]}):v.jsx(h0,{prompt:n,isFetching:f})}function S0(){return v.jsxs(Zm,{children:[v.jsx(Mt,{path:"/",element:v.jsx(La,{})}),v.jsx(Mt,{path:"/login",element:v.jsx(y0,{})}),v.jsxs(Mt,{path:"/admin",element:v.jsx(v0,{}),children:[v.jsx(Mt,{path:"prompts",element:v.jsx(w0,{})}),v.jsx(Mt,{path:"prompts/:id",element:v.jsx(x0,{})})]}),v.jsx(Mt,{path:"*",element:v.jsx(La,{})})]})}Kf(document.getElementById("root")).render(v.jsx(k.StrictMode,{children:v.jsx(ig,{children:v.jsx(S0,{})})})); +`+o)}}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Gt(this.defaults,n);const{transitional:r,paramsSerializer:l,headers:o}=n;r!==void 0&&yl.assertOptions(r,{silentJSONParsing:Le.transitional(Le.boolean),forcedJSONParsing:Le.transitional(Le.boolean),clarifyTimeoutError:Le.transitional(Le.boolean),legacyInterceptorReqResOrdering:Le.transitional(Le.boolean)},!1),l!=null&&(x.isFunction(l)?n.paramsSerializer={serialize:l}:yl.assertOptions(l,{encode:Le.function,serialize:Le.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),yl.assertOptions(n,{baseUrl:Le.spelling("baseURL"),withXsrfToken:Le.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=o&&x.merge(o.common,o[n.method]);o&&x.forEach(["delete","get","head","post","put","patch","common"],p=>{delete o[p]}),n.headers=Ce.concat(i,o);const s=[];let u=!0;this.interceptors.request.forEach(function(y){if(typeof y.runWhen=="function"&&y.runWhen(n)===!1)return;u=u&&y.synchronous;const w=n.transitional||Ks;w&&w.legacyInterceptorReqResOrdering?s.unshift(y.fulfilled,y.rejected):s.push(y.fulfilled,y.rejected)});const a=[];this.interceptors.response.forEach(function(y){a.push(y.fulfilled,y.rejected)});let c,f=0,g;if(!u){const p=[Oa.bind(this),void 0];for(p.unshift(...s),p.push(...a),g=p.length,c=Promise.resolve(n);f{if(!r._listeners)return;let o=r._listeners.length;for(;o-- >0;)r._listeners[o](l);r._listeners=null}),this.promise.then=l=>{let o;const i=new Promise(s=>{r.subscribe(s),o=s}).then(l);return i.cancel=function(){r.unsubscribe(o)},i},t(function(o,i,s){r.reason||(r.reason=new Ir(o,i,s),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new kd(function(l){t=l}),cancel:t}}};function e0(e){return function(n){return e.apply(null,n)}}function t0(e){return x.isObject(e)&&e.isAxiosError===!0}const Qi={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Qi).forEach(([e,t])=>{Qi[t]=e});function Cd(e){const t=new Kt(e),n=nd(Kt.prototype.request,t);return x.extend(n,Kt.prototype,t,{allOwnKeys:!0}),x.extend(n,t,null,{allOwnKeys:!0}),n.create=function(l){return Cd(Gt(e,l))},n}const G=Cd(Fr);G.Axios=Kt;G.CanceledError=Ir;G.CancelToken=Zy;G.isCancel=gd;G.VERSION=Ed;G.toFormData=po;G.AxiosError=j;G.Cancel=G.CanceledError;G.all=function(t){return Promise.all(t)};G.spread=e0;G.isAxiosError=t0;G.mergeConfig=Gt;G.AxiosHeaders=Ce;G.formToJSON=e=>hd(x.isHTMLForm(e)?new FormData(e):e);G.getAdapter=Sd.getAdapter;G.HttpStatusCode=Qi;G.default=G;const{Axios:N0,AxiosError:R0,CanceledError:_0,isCancel:P0,CancelToken:T0,VERSION:O0,all:j0,Cancel:L0,isAxiosError:z0,spread:A0,toFormData:F0,AxiosHeaders:I0,HttpStatusCode:D0,formToJSON:U0,getAdapter:M0,mergeConfig:B0}=G;let Js=null,Xs=null;function mo(){return Js}function n0(){return Xs??"Bearer"}function r0(e,t){Js=e,Xs=t!=null&&t.trim()?t.trim():"Bearer"}function l0(){Js=null,Xs=null}function Nd(e){return!!(e!=null&&e.includes("/api/admin/auth/login"))}const ft=G.create({baseURL:"https://api.women-konnect.com:8080",headers:{"Content-Type":"application/json"}});ft.interceptors.request.use(e=>{const t=e.url??"";if(Nd(t))return e;const n=mo();if(n){const r=n0();e.headers.set("Authorization",`${r} ${n}`)}return e});ft.interceptors.response.use(e=>e,e=>{var l,o,i,s;const t=(l=e.response)==null?void 0:l.status,n=((o=e.config)==null?void 0:o.url)??"";if(t===401&&!Nd(n)){l0();const u="/".replace(/\/$/,"");window.location.replace(u?`${u}/login`:"/login")}const r=((s=(i=e.response)==null?void 0:i.data)==null?void 0:s.message)??e.message??"알 수 없는 오류가 발생했습니다.";return Promise.reject(new Error(r))});async function Rd(e){return(await ft.get("/api/admin/ai/prompts",{params:e})).data.promptSummaries}async function _d(e){return(await ft.get(`/api/admin/ai/prompts/${e}`)).data}async function o0(e){return(await ft.post("/api/admin/ai/prompts",e)).data}async function i0(e){await ft.post(`/api/admin/ai/prompts/${e}/activate`)}async function s0(e){return(await ft.post("/api/admin/ai/prompts/run",e)).data}const u0={ACTIVE:"bg-green-100 text-green-700",DRAFT:"bg-yellow-100 text-yellow-700",DEPRECATED:"bg-gray-200 text-gray-600"};function a0({versions:e,currentPromptId:t,onSelectVersion:n,isOpen:r,onToggle:l}){const o=[...e].sort((i,s)=>i.status==="ACTIVE"?-1:s.status==="ACTIVE"?1:s.version-i.version);return v.jsxs(v.Fragment,{children:[v.jsx("div",{className:`${r?"w-64":"w-0"} bg-white border-r border-gray-200 transition-all duration-300 overflow-hidden flex-shrink-0`,children:v.jsxs("div",{className:"h-full overflow-y-auto p-4",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-4 uppercase tracking-wider",children:"Versions"}),v.jsx("div",{className:"space-y-2",children:o.map(i=>v.jsx("div",{onClick:()=>n(i.id),className:`p-3 rounded-lg cursor-pointer transition-all ${t===i.id?"bg-blue-50 border-2 border-blue-500":"bg-gray-50 border-2 border-transparent hover:bg-gray-100"} ${i.status==="ACTIVE"?"ring-2 ring-green-400 ring-offset-2":""}`,children:v.jsxs("div",{className:"flex items-center justify-between",children:[v.jsxs("span",{className:"text-sm font-medium text-gray-900",children:["v",i.version]}),v.jsx("span",{className:`text-xs px-2 py-1 rounded-full ${u0[i.status]??"bg-gray-100 text-gray-600"}`,children:i.status})]})},i.id))})]})}),v.jsx("button",{onClick:l,className:"absolute left-0 top-1/2 -translate-y-1/2 bg-white border border-gray-200 rounded-r-md p-1 hover:bg-gray-50 transition-colors shadow-sm z-10",style:{left:r?"256px":"0"},children:r?v.jsx(yg,{size:20}):v.jsx(vg,{size:20})})]})}async function c0(){return(await ft.get("/api/admin/ai/models")).data.models}function f0({content:e,slots:t,maxTokens:n,model:r,onContentChange:l,onMaxTokensChange:o,onModelChange:i,onVariablesChange:s}){const[u,a]=k.useState({}),[c,f]=k.useState([]);k.useEffect(()=>{c0().then(f).catch(()=>{})},[]),k.useEffect(()=>{const p={};t.forEach(({key:y})=>{p[y]=""}),a(p),s(p)},[t]);const g=[...t].sort((p,y)=>p.order-y.order),S=(p,y)=>{const w={...u,[p]:y};a(w),s(w)};return v.jsxs("div",{className:"flex-1 bg-white border-r border-gray-200 flex flex-col",children:[v.jsxs("div",{className:"flex items-center gap-4 p-4 border-b border-gray-200 bg-gray-50",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx("label",{className:"text-sm font-medium text-gray-700",children:"Max Tokens:"}),v.jsx("input",{type:"number",value:n,onChange:p=>o(Number(p.target.value)),className:"w-24 px-3 py-1.5 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",min:"500",max:"10000"})]}),v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx("label",{className:"text-sm font-medium text-gray-700",children:"Model:"}),v.jsx("select",{value:r,onChange:p=>i(p.target.value),className:"px-3 py-1.5 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 bg-white",children:c.length>0?c.map(p=>v.jsx("option",{value:p.name,children:p.name},p.id)):v.jsx("option",{value:r,children:r})})]})]}),v.jsxs("div",{className:"flex-1 overflow-y-auto p-4 flex flex-col",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:"Prompt Content"}),v.jsx("textarea",{value:e,onChange:p=>l(p.target.value),className:"flex-1 min-h-[200px] bg-gray-50 rounded-lg p-4 border border-gray-200 text-sm text-gray-800 font-mono resize-none focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent",spellCheck:!1})]}),g.length>0&&v.jsxs("div",{className:"border-t border-gray-200 p-4 bg-gray-50",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Variables"}),v.jsx("div",{className:"space-y-3",children:g.map(({key:p})=>v.jsxs("div",{children:[v.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:p}),v.jsx("input",{type:"text",value:u[p]||"",onChange:y=>S(p,y.target.value),className:"w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",placeholder:`Enter ${p}`})]},p))})]})]})}function d0({result:e,isExecuting:t,onExecute:n}){return v.jsxs("div",{className:"w-96 bg-white flex flex-col",children:[v.jsxs("div",{className:"flex-1 overflow-y-auto p-4 border-b border-gray-200",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Response"}),v.jsx("div",{className:"bg-gray-50 rounded-lg p-4 border border-gray-200 min-h-[200px]",children:t?v.jsx("div",{className:"flex items-center justify-center h-full",children:v.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"})}):e?v.jsx("div",{className:"text-sm text-gray-800 whitespace-pre-wrap",children:e.response}):v.jsx("div",{className:"text-sm text-gray-400 text-center",children:"Click execute to see response"})})]}),e&&!t&&v.jsxs("div",{className:"p-4 bg-gray-50 border-b border-gray-200",children:[v.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Metrics"}),v.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[v.jsxs("div",{className:"bg-white p-3 rounded-lg border border-gray-200",children:[v.jsx("div",{className:"text-xs text-gray-500 mb-1",children:"Latency"}),v.jsxs("div",{className:"text-sm font-semibold text-gray-900",children:[e.latencyMs,"ms"]})]}),v.jsxs("div",{className:"bg-white p-3 rounded-lg border border-gray-200",children:[v.jsx("div",{className:"text-xs text-gray-500 mb-1",children:"Input"}),v.jsx("div",{className:"text-sm font-semibold text-gray-900",children:e.inputTokens})]}),v.jsxs("div",{className:"bg-white p-3 rounded-lg border border-gray-200",children:[v.jsx("div",{className:"text-xs text-gray-500 mb-1",children:"Output"}),v.jsx("div",{className:"text-sm font-semibold text-gray-900",children:e.outputTokens})]})]})]}),v.jsx("div",{className:"p-4",children:v.jsxs("button",{onClick:n,disabled:t,className:"w-full flex items-center justify-center gap-2 px-4 py-3 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 transition-colors disabled:bg-gray-400 disabled:cursor-not-allowed",children:[v.jsx(wg,{size:18}),t?"Executing...":"Execute"]})})]})}function p0({isOpen:e,title:t,message:n,onConfirm:r,onCancel:l}){return e?v.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:v.jsxs("div",{className:"bg-white rounded-lg shadow-xl max-w-md w-full mx-4",children:[v.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b border-gray-200",children:[v.jsx("h3",{className:"text-lg font-semibold text-gray-900",children:t}),v.jsx("button",{onClick:l,className:"text-gray-400 hover:text-gray-600 transition-colors",children:v.jsx(Sg,{size:20})})]}),v.jsx("div",{className:"px-6 py-4",children:v.jsx("p",{className:"text-gray-700",children:n})}),v.jsxs("div",{className:"flex items-center justify-end gap-3 px-6 py-4 bg-gray-50 rounded-b-lg",children:[v.jsx("button",{onClick:l,className:"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors",children:"Cancel"}),v.jsx("button",{onClick:r,className:"px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 transition-colors",children:"Confirm"})]})]})}):null}function h0({prompt:e,isFetching:t=!1}){const n=Un(),[r,l]=k.useState(e),[o,i]=k.useState([]),[s,u]=k.useState(!0),[a,c]=k.useState(e.template),[f,g]=k.useState(e.maxTokens),[S,p]=k.useState(e.model),[y,w]=k.useState({}),[h,d]=k.useState(null),[m,E]=k.useState(!1),[N,P]=k.useState({isOpen:!1,title:"",message:"",onConfirm:()=>{}}),R=k.useCallback(async()=>{try{const I=await Rd({moduleName:e.name});i(I)}catch{i([{id:e.id,name:e.name,version:e.version,status:e.status,model:e.model,createdAt:e.createdAt}])}},[e]);k.useEffect(()=>{l(e),c(e.template),g(e.maxTokens),p(e.model),d(null),w({}),R()},[e,R]);const O=I=>{n(`/admin/prompts/${I}`,{replace:!0})},B=()=>{P({isOpen:!0,title:"Save New Version",message:`"${r.name}"의 새 버전을 저장하시겠습니까?`,onConfirm:async()=>{P(I=>({...I,isOpen:!1}));try{const I=await o0({moduleName:r.name,template:a,maxTokens:f,model:S});n(`/admin/prompts/${I.id}`,{replace:!0})}catch(I){alert(I instanceof Error?I.message:"저장에 실패했습니다.")}}})},z=()=>{P({isOpen:!0,title:"Activate Version",message:`v${r.version}을 활성 버전으로 설정하시겠습니까?`,onConfirm:async()=>{P(I=>({...I,isOpen:!1}));try{await i0(r.id),await R();const I=await _d(r.id);l(I)}catch(I){alert(I instanceof Error?I.message:"활성화에 실패했습니다.")}}})},ue=async()=>{E(!0),d(null);try{const I=await s0({promptTemplate:a,maxTokens:f,modelName:S,vars:y});d(I)}catch(I){alert(I instanceof Error?I.message:"실행에 실패했습니다.")}finally{E(!1)}};return v.jsxs("div",{className:"min-h-screen bg-gray-50 flex flex-col relative",children:[v.jsx("div",{className:"bg-white border-b border-gray-200 px-6 py-4",children:v.jsxs("div",{className:"flex items-center justify-between",children:[v.jsxs("div",{className:"flex items-center gap-4",children:[v.jsxs("button",{type:"button",onClick:()=>n("/admin/prompts"),className:"flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors",children:[v.jsx(mg,{size:18}),"Back"]}),v.jsxs("div",{className:"border-l border-gray-300 pl-4",children:[v.jsx("h1",{className:"text-xl font-bold text-gray-900",children:r.name}),v.jsxs("p",{className:"text-sm text-gray-500",children:["Version ",r.version]})]})]}),v.jsxs("div",{className:"flex items-center gap-3",children:[v.jsxs("button",{onClick:B,className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors",children:[v.jsx(xg,{size:18}),"Save New Version"]}),v.jsxs("button",{onClick:z,disabled:r.status==="ACTIVE",className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-green-600 rounded-md hover:bg-green-700 transition-colors disabled:bg-gray-400 disabled:cursor-not-allowed",children:[v.jsx(gg,{size:18}),"Activate"]})]})]})}),v.jsxs("div",{className:"flex-1 flex relative",children:[t?v.jsx("div",{className:"absolute inset-0 z-20 flex items-center justify-center bg-gray-50/70 backdrop-blur-[1px]","aria-busy":"true","aria-live":"polite",children:v.jsxs("div",{className:"flex flex-col items-center gap-3 rounded-lg bg-white/90 px-6 py-4 shadow-md border border-gray-200",children:[v.jsx("div",{className:"animate-spin rounded-full h-9 w-9 border-b-2 border-blue-600"}),v.jsx("span",{className:"text-sm text-gray-600",children:"버전 불러오는 중…"})]})}):null,v.jsx(a0,{versions:o,currentPromptId:r.id,onSelectVersion:O,isOpen:s,onToggle:()=>u(!s)}),v.jsx(f0,{content:a,slots:r.slots,maxTokens:f,model:S,onContentChange:c,onMaxTokensChange:g,onModelChange:p,onVariablesChange:w}),v.jsx(d0,{result:h,isExecuting:m,onExecute:ue})]}),v.jsx(p0,{isOpen:N.isOpen,title:N.title,message:N.message,onConfirm:N.onConfirm,onCancel:()=>P(I=>({...I,isOpen:!1}))})]})}function m0(e){if(!e||typeof e!="object")throw new Error("잘못된 응답 형식입니다.");const t=e;if(t.isSuccess===!1)throw new Error(t.message??"로그인에 실패했습니다.");if(t.result&&typeof t.result=="object"&&t.result.accessToken)return{accessToken:t.result.accessToken,tokenType:t.result.tokenType};if(typeof t.accessToken=="string")return{accessToken:t.accessToken,tokenType:t.tokenType};throw new Error(t.message??"로그인에 실패했습니다.")}async function g0(e){const t=await ft.post("/api/admin/auth/login",e);return m0(t.data)}function y0(){var g,S;const e=Un(),n=((S=(g=nn().state)==null?void 0:g.from)==null?void 0:S.pathname)??"/admin/prompts",[r,l]=k.useState(""),[o,i]=k.useState(""),[s,u]=k.useState(null),[a,c]=k.useState(!1);if(mo())return v.jsx(Hl,{to:"/admin/prompts",replace:!0});const f=async p=>{p.preventDefault(),u(null),c(!0);try{const{accessToken:y,tokenType:w}=await g0({id:r.trim(),password:o});r0(y,w),e(n,{replace:!0})}catch(y){u(y instanceof Error?y.message:"로그인에 실패했습니다.")}finally{c(!1)}};return v.jsx("div",{className:"min-h-screen bg-gray-50 flex items-center justify-center p-8",children:v.jsxs("div",{className:"w-full max-w-md bg-white rounded-lg shadow-sm border border-gray-200 p-8",children:[v.jsx("h1",{className:"text-2xl font-bold text-gray-900 mb-6",children:"로그인"}),s?v.jsx("div",{className:"mb-4 px-4 py-3 bg-red-50 border border-red-200 rounded-lg text-sm text-red-700",children:s}):null,v.jsxs("form",{onSubmit:f,className:"space-y-4",children:[v.jsxs("div",{children:[v.jsx("label",{htmlFor:"login-id",className:"block text-sm font-medium text-gray-700 mb-1",children:"ID"}),v.jsx("input",{id:"login-id",type:"text",autoComplete:"username",value:r,onChange:p=>l(p.target.value),className:"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 text-sm",required:!0})]}),v.jsxs("div",{children:[v.jsx("label",{htmlFor:"login-password",className:"block text-sm font-medium text-gray-700 mb-1",children:"비밀번호"}),v.jsx("input",{id:"login-password",type:"password",autoComplete:"current-password",value:o,onChange:p=>i(p.target.value),className:"w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 text-sm",required:!0})]}),v.jsx("button",{type:"submit",disabled:a,className:"w-full py-2.5 px-4 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 disabled:bg-gray-400 disabled:cursor-not-allowed transition-colors",children:a?"로그인 중…":"로그인"})]})]})})}function v0(){const e=nn();return mo()?v.jsx(Ym,{}):v.jsx(Hl,{to:"/login",replace:!0,state:{from:e}})}function La(){return mo()?v.jsx(Hl,{to:"/admin/prompts",replace:!0}):v.jsx(Hl,{to:"/login",replace:!0})}function w0(){const[e,t]=k.useState([]),[n,r]=k.useState(!1),[l,o]=k.useState(null),i=async()=>{r(!0),o(null);try{const s=await Rd({status:"ACTIVE"});t(s)}catch(s){o(s instanceof Error?s.message:"목록을 불러오지 못했습니다.")}finally{r(!1)}};return k.useEffect(()=>{i()},[]),v.jsx(dg,{prompts:e,isLoading:n,error:l})}function x0(){const{id:e}=Im(),t=Un(),[n,r]=k.useState(null),[l,o]=k.useState(!0),[i,s]=k.useState(null),u=k.useRef(n);u.current=n,k.useEffect(()=>{const g=e!==void 0?Number(e):NaN;if(e===void 0||!Number.isFinite(g)){r(null),o(!1),s("잘못된 프롬프트 ID입니다.");return}let S=!1;return o(!0),s(null),(async()=>{try{const p=await _d(g);S||(r(p),s(null))}catch(p){if(!S){const y=p instanceof Error?p.message:"상세 정보를 불러오지 못했습니다.";s(y);const w=u.current;w&&w.id!==g&&t(`/admin/prompts/${w.id}`,{replace:!0})}}finally{S||o(!1)}})(),()=>{S=!0}},[e,t]);const a=e!==void 0?Number(e):NaN,c=l&&n===null,f=!!(n&&l&&Number.isFinite(a)&&n.id!==a);return c?v.jsx("div",{className:"min-h-screen bg-gray-50 flex items-center justify-center",children:v.jsx("div",{className:"animate-spin rounded-full h-10 w-10 border-b-2 border-blue-600"})}):i&&!n||!n?v.jsxs("div",{className:"min-h-screen bg-gray-50 p-8",children:[v.jsx("div",{className:"max-w-lg mx-auto px-4 py-3 bg-red-50 border border-red-200 rounded-lg text-sm text-red-700",children:i??"프롬프트를 찾을 수 없습니다."}),v.jsx("div",{className:"max-w-lg mx-auto mt-4",children:v.jsx(ag,{to:"/admin/prompts",className:"text-blue-600 hover:text-blue-800 text-sm font-medium",children:"목록으로 돌아가기"})})]}):v.jsx(h0,{prompt:n,isFetching:f})}function S0(){return v.jsxs(Zm,{children:[v.jsx(Mt,{path:"/",element:v.jsx(La,{})}),v.jsx(Mt,{path:"/login",element:v.jsx(y0,{})}),v.jsxs(Mt,{path:"/admin",element:v.jsx(v0,{}),children:[v.jsx(Mt,{path:"prompts",element:v.jsx(w0,{})}),v.jsx(Mt,{path:"prompts/:id",element:v.jsx(x0,{})})]}),v.jsx(Mt,{path:"*",element:v.jsx(La,{})})]})}Kf(document.getElementById("root")).render(v.jsx(k.StrictMode,{children:v.jsx(ig,{children:v.jsx(S0,{})})})); diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html index e648bab..414857b 100644 --- a/src/main/resources/static/index.html +++ b/src/main/resources/static/index.html @@ -4,7 +4,7 @@ Prompt Management Page - +