From 4366a279882b7d55abfba683a00922aae984bf55 Mon Sep 17 00:00:00 2001 From: kmk9970 Date: Sat, 8 Mar 2025 21:32:39 +0900 Subject: [PATCH] initial commit --- .gitignore | 38 + build.gradle | 64 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63375 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 248 ++ gradlew.bat | 92 + settings.gradle | 1 + src/main/java/com/example/coin/AllCoin.java | 101 + .../java/com/example/coin/Api_Client.java | 258 ++ .../java/com/example/coin/AutoTrading.java | 159 + .../java/com/example/coin/BithumbApi.java | 34 + .../com/example/coin/BoardController.java | 116 + .../com/example/coin/BoardRepository.java | 131 + .../java/com/example/coin/BoardService.java | 96 + .../com/example/coin/CoinApplication.java | 15 + src/main/java/com/example/coin/CoinInput.java | 12 + .../com/example/coin/CoinPatternMatcher.java | 145 + .../example/coin/CoinPatternMatcherDL4J.java | 113 + src/main/java/com/example/coin/Comment.java | 30 + src/main/java/com/example/coin/Content.java | 39 + .../com/example/coin/CreateMemberForm.java | 23 + .../com/example/coin/ExcelController.java | 209 ++ src/main/java/com/example/coin/GETNoArgs.java | 102 + .../java/com/example/coin/GetMyAccount.java | 45 + .../example/coin/GetTransactionHistory.java | 440 +++ .../java/com/example/coin/HttpRequest.java | 3306 +++++++++++++++++ .../java/com/example/coin/Indicators.java | 173 + .../com/example/coin/InterestRepository.java | 57 + src/main/java/com/example/coin/LoginForm.java | 15 + .../java/com/example/coin/ThreadTest.java | 176 + .../com/example/coin/TimestampConverter.java | 38 + .../com/example/coin/TradeController.java | 80 + .../com/example/coin/TradeRepository.java | 121 + .../com/example/coin/TransactionHistory.java | 24 + .../coin/TransactionHistoryController.java | 409 ++ .../coin/TransactionHistoryRepository.java | 141 + .../coin/TransactionHistoryService.java | 68 + src/main/java/com/example/coin/Util.java | 86 + .../java/com/example/coin/WebCrawler.java | 64 + .../com/example/coin/bithumb/UserAsset.java | 26 + .../com/example/coin/config/WebMvcConfig.java | 20 + .../controller/CoinCommentController.java | 44 + .../coin/controller/CoinNameController.java | 24 + .../coin/controller/CoinNewsController.java | 24 + .../coin/controller/CoinPriceController.java | 93 + .../controller/SaveCoinStateController.java | 32 + .../controller/SaveStockDataController.java | 23 + .../coin/controller/TradeCoinController.java | 36 + .../coin/controller/UserAssetController.java | 26 + src/main/java/com/example/coin/csv/stock.csv | 2832 ++++++++++++++ src/main/java/com/example/coin/designAPI.java | 173 + .../com/example/coin/dto/CoinCommentDto.java | 39 + .../com/example/coin/dto/CoinInfoDto.java | 34 + .../com/example/coin/dto/CoinNameDto.java | 19 + .../com/example/coin/dto/CoinNewsDto.java | 27 + .../com/example/coin/dto/CoinPriceDto.java | 21 + .../com/example/coin/dto/UserAssetDto.java | 22 + .../com/example/coin/entity/CoinComment.java | 41 + .../com/example/coin/entity/CoinInfo.java | 59 + .../com/example/coin/entity/CoinName.java | 26 + .../com/example/coin/entity/CoinPrice.java | 59 + .../com/example/coin/entity/InterestCoin.java | 28 + .../java/com/example/coin/entity/Kosdaq.java | 38 + .../java/com/example/coin/entity/Kospi.java | 38 + .../com/example/coin/entity/StockCode.java | 39 + .../java/com/example/coin/entity/Test.java | 6 + .../java/com/example/coin/entity/User.java | 54 + .../com/example/coin/entity/UserTrade.java | 32 + .../java/com/example/coin/getUserCash.java | 52 + src/main/java/com/example/coin/interest.java | 20 + .../com/example/coin/interestService.java | 21 + .../repository/CoinCommentRepository.java | 18 + .../coin/repository/CoinInfoRepository.java | 40 + .../coin/repository/CoinNameRepository.java | 22 + .../coin/repository/CoinPriceRepository.java | 20 + .../repository/SaveCoinStateRepository.java | 56 + .../coin/repository/StockDataRepository.java | 27 + .../coin/repository/UserRepository.java | 11 + .../coin/scheduler/CoinPriceScheduler.java | 104 + .../coin/scrapper/CoinInfoScrapper.java | 60 + .../com/example/coin/service/AutoTrading.java | 95 + .../coin/service/CoinCommentService.java | 34 + .../coin/service/CoinNameSercvice.java | 29 + .../example/coin/service/CoinNewsService.java | 22 + .../coin/service/CoinPriceScheduler.java | 18 + .../coin/service/CoinPriceService.java | 81 + .../coin/service/SaveCoinStateService.java | 215 ++ .../coin/service/SaveStockDataService.java | 62 + .../example/coin/service/TradeService.java | 83 + .../coin/service/UserAssetService.java | 47 + .../java/com/example/coin/statisticsApi.java | 42 + .../example/coin/statisticsController.java | 50 + .../java/com/example/coin/trade_history.java | 20 + .../com/example/coin/transaction_log.java | 27 + .../java/com/example/coin/user_asset.java | 24 + src/main/java/com/example/coin/user_info.java | 23 + src/main/java/com/example/coin/user_rank.java | 28 + src/main/resources/log4jdbc.log4j2.properties | 4 + .../KakaoTalk_Image_2023-12-01-01-00-09.png | Bin 0 -> 26349 bytes src/main/resources/static/style.css | 28 + src/main/resources/templates/apitest.html | 32 + src/main/resources/templates/board.html | 372 ++ src/main/resources/templates/coinGraph.html | 16 + src/main/resources/templates/coinSearch.html | 109 + src/main/resources/templates/coinTrade.html | 62 + .../resources/templates/content-page.html | 59 + .../resources/templates/createMember.html | 80 + src/main/resources/templates/excelInsert.html | 15 + src/main/resources/templates/home.html | 42 + src/main/resources/templates/loginPage.html | 88 + src/main/resources/templates/mainPage.html | 81 + src/main/resources/templates/myasset.html | 153 + .../resources/templates/showCoinGraph.html | 184 + src/main/resources/templates/statistics.html | 289 ++ src/main/resources/templates/test.html | 10 + src/main/resources/templates/write-page.html | 27 + .../example/coin/CoinApplicationTests.java | 13 + 117 files changed, 14226 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/com/example/coin/AllCoin.java create mode 100644 src/main/java/com/example/coin/Api_Client.java create mode 100644 src/main/java/com/example/coin/AutoTrading.java create mode 100644 src/main/java/com/example/coin/BithumbApi.java create mode 100644 src/main/java/com/example/coin/BoardController.java create mode 100644 src/main/java/com/example/coin/BoardRepository.java create mode 100644 src/main/java/com/example/coin/BoardService.java create mode 100644 src/main/java/com/example/coin/CoinApplication.java create mode 100644 src/main/java/com/example/coin/CoinInput.java create mode 100644 src/main/java/com/example/coin/CoinPatternMatcher.java create mode 100644 src/main/java/com/example/coin/CoinPatternMatcherDL4J.java create mode 100644 src/main/java/com/example/coin/Comment.java create mode 100644 src/main/java/com/example/coin/Content.java create mode 100644 src/main/java/com/example/coin/CreateMemberForm.java create mode 100644 src/main/java/com/example/coin/ExcelController.java create mode 100644 src/main/java/com/example/coin/GETNoArgs.java create mode 100644 src/main/java/com/example/coin/GetMyAccount.java create mode 100644 src/main/java/com/example/coin/GetTransactionHistory.java create mode 100644 src/main/java/com/example/coin/HttpRequest.java create mode 100644 src/main/java/com/example/coin/Indicators.java create mode 100644 src/main/java/com/example/coin/InterestRepository.java create mode 100644 src/main/java/com/example/coin/LoginForm.java create mode 100644 src/main/java/com/example/coin/ThreadTest.java create mode 100644 src/main/java/com/example/coin/TimestampConverter.java create mode 100644 src/main/java/com/example/coin/TradeController.java create mode 100644 src/main/java/com/example/coin/TradeRepository.java create mode 100644 src/main/java/com/example/coin/TransactionHistory.java create mode 100644 src/main/java/com/example/coin/TransactionHistoryController.java create mode 100644 src/main/java/com/example/coin/TransactionHistoryRepository.java create mode 100644 src/main/java/com/example/coin/TransactionHistoryService.java create mode 100644 src/main/java/com/example/coin/Util.java create mode 100644 src/main/java/com/example/coin/WebCrawler.java create mode 100644 src/main/java/com/example/coin/bithumb/UserAsset.java create mode 100644 src/main/java/com/example/coin/config/WebMvcConfig.java create mode 100644 src/main/java/com/example/coin/controller/CoinCommentController.java create mode 100644 src/main/java/com/example/coin/controller/CoinNameController.java create mode 100644 src/main/java/com/example/coin/controller/CoinNewsController.java create mode 100644 src/main/java/com/example/coin/controller/CoinPriceController.java create mode 100644 src/main/java/com/example/coin/controller/SaveCoinStateController.java create mode 100644 src/main/java/com/example/coin/controller/SaveStockDataController.java create mode 100644 src/main/java/com/example/coin/controller/TradeCoinController.java create mode 100644 src/main/java/com/example/coin/controller/UserAssetController.java create mode 100644 src/main/java/com/example/coin/csv/stock.csv create mode 100644 src/main/java/com/example/coin/designAPI.java create mode 100644 src/main/java/com/example/coin/dto/CoinCommentDto.java create mode 100644 src/main/java/com/example/coin/dto/CoinInfoDto.java create mode 100644 src/main/java/com/example/coin/dto/CoinNameDto.java create mode 100644 src/main/java/com/example/coin/dto/CoinNewsDto.java create mode 100644 src/main/java/com/example/coin/dto/CoinPriceDto.java create mode 100644 src/main/java/com/example/coin/dto/UserAssetDto.java create mode 100644 src/main/java/com/example/coin/entity/CoinComment.java create mode 100644 src/main/java/com/example/coin/entity/CoinInfo.java create mode 100644 src/main/java/com/example/coin/entity/CoinName.java create mode 100644 src/main/java/com/example/coin/entity/CoinPrice.java create mode 100644 src/main/java/com/example/coin/entity/InterestCoin.java create mode 100644 src/main/java/com/example/coin/entity/Kosdaq.java create mode 100644 src/main/java/com/example/coin/entity/Kospi.java create mode 100644 src/main/java/com/example/coin/entity/StockCode.java create mode 100644 src/main/java/com/example/coin/entity/Test.java create mode 100644 src/main/java/com/example/coin/entity/User.java create mode 100644 src/main/java/com/example/coin/entity/UserTrade.java create mode 100644 src/main/java/com/example/coin/getUserCash.java create mode 100644 src/main/java/com/example/coin/interest.java create mode 100644 src/main/java/com/example/coin/interestService.java create mode 100644 src/main/java/com/example/coin/repository/CoinCommentRepository.java create mode 100644 src/main/java/com/example/coin/repository/CoinInfoRepository.java create mode 100644 src/main/java/com/example/coin/repository/CoinNameRepository.java create mode 100644 src/main/java/com/example/coin/repository/CoinPriceRepository.java create mode 100644 src/main/java/com/example/coin/repository/SaveCoinStateRepository.java create mode 100644 src/main/java/com/example/coin/repository/StockDataRepository.java create mode 100644 src/main/java/com/example/coin/repository/UserRepository.java create mode 100644 src/main/java/com/example/coin/scheduler/CoinPriceScheduler.java create mode 100644 src/main/java/com/example/coin/scrapper/CoinInfoScrapper.java create mode 100644 src/main/java/com/example/coin/service/AutoTrading.java create mode 100644 src/main/java/com/example/coin/service/CoinCommentService.java create mode 100644 src/main/java/com/example/coin/service/CoinNameSercvice.java create mode 100644 src/main/java/com/example/coin/service/CoinNewsService.java create mode 100644 src/main/java/com/example/coin/service/CoinPriceScheduler.java create mode 100644 src/main/java/com/example/coin/service/CoinPriceService.java create mode 100644 src/main/java/com/example/coin/service/SaveCoinStateService.java create mode 100644 src/main/java/com/example/coin/service/SaveStockDataService.java create mode 100644 src/main/java/com/example/coin/service/TradeService.java create mode 100644 src/main/java/com/example/coin/service/UserAssetService.java create mode 100644 src/main/java/com/example/coin/statisticsApi.java create mode 100644 src/main/java/com/example/coin/statisticsController.java create mode 100644 src/main/java/com/example/coin/trade_history.java create mode 100644 src/main/java/com/example/coin/transaction_log.java create mode 100644 src/main/java/com/example/coin/user_asset.java create mode 100644 src/main/java/com/example/coin/user_info.java create mode 100644 src/main/java/com/example/coin/user_rank.java create mode 100644 src/main/resources/log4jdbc.log4j2.properties create mode 100644 src/main/resources/static/image/KakaoTalk_Image_2023-12-01-01-00-09.png create mode 100644 src/main/resources/static/style.css create mode 100644 src/main/resources/templates/apitest.html create mode 100644 src/main/resources/templates/board.html create mode 100644 src/main/resources/templates/coinGraph.html create mode 100644 src/main/resources/templates/coinSearch.html create mode 100644 src/main/resources/templates/coinTrade.html create mode 100644 src/main/resources/templates/content-page.html create mode 100644 src/main/resources/templates/createMember.html create mode 100644 src/main/resources/templates/excelInsert.html create mode 100644 src/main/resources/templates/home.html create mode 100644 src/main/resources/templates/loginPage.html create mode 100644 src/main/resources/templates/mainPage.html create mode 100644 src/main/resources/templates/myasset.html create mode 100644 src/main/resources/templates/showCoinGraph.html create mode 100644 src/main/resources/templates/statistics.html create mode 100644 src/main/resources/templates/test.html create mode 100644 src/main/resources/templates/write-page.html create mode 100644 src/test/java/com/example/coin/CoinApplicationTests.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a04fa92 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +*.yml +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..e6901b1 --- /dev/null +++ b/build.gradle @@ -0,0 +1,64 @@ +plugins { + id 'java' + //id 'org.springframework.boot' version '2.6.0' // Spring Boot 버전 업데이트 + id 'org.springframework.boot' version '3.3.1' + id 'io.spring.dependency-management' version '1.1.5' +} + +group = 'com.example' +version = '0.0.1-SNAPSHOT' + +java { + sourceCompatibility = '17' +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation group: 'xerces', name: 'xercesImpl', version: '2.11.0' + implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6' + implementation group: 'com.squareup.okhttp', name: 'okhttp', version: '2.7.5' + implementation group: 'org.json', name: 'json', version: '20090211' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation group: 'commons-codec', name: 'commons-codec', version: '1.9' + implementation group: 'org.bgee.log4jdbc-log4j2', name: 'log4jdbc-log4j2-jdbc4.1', version: '1.16' + ///implementation 'org.tensorflow:tensorflow:2.10.0' // TensorFlow 의존성 추가, 버전은 원하는 버전으로 변경 + + // Apache POI 라이브러리 (엑셀 파일 읽기 위해) + implementation 'org.apache.poi:poi:5.0.0' + implementation 'org.apache.poi:poi-ooxml:5.0.0' + implementation 'org.jsoup:jsoup:1.15.3' + + implementation 'com.auth0:java-jwt:4.2.1' + //implementation 'org.apache.httpcomponents.client5:httpclient5:5.1' + implementation 'org.apache.httpcomponents:httpclient:4.5' + + //swagger + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' + + + + + + // 스레드 관련 의존성 추가 + //implementation 'org.springframework.boot:spring-boot-starter-task' // 스케쥴링 및 스레드 풀 관리 + compileOnly 'org.projectlombok:lombok' + runtimeOnly 'com.mysql:mysql-connector-j' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..033e24c4cdf41af1ab109bc7f253b2b887023340 GIT binary patch literal 63375 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≫L+crb^Bz zc+Nw%zgpZ6>!A3%lau!Pw6`Y#WPVBtAfKSsqwYDWQK-~ zz(mx=nJ6-8t`YXB{6gaZ%G}Dmn&o500Y}2Rd?e&@=hBEmB1C=$OMBfxX__2c2O4K2#(0ksclP$SHp*8jq-1&(<6(#=6&H`Nlc2RVC4->r6U}sTY<1? zn@tv7XwUs-c>Lcmrm5AE0jHI5={WgHIow6cX=UK)>602(=arbuAPZ37;{HTJSIO%9EL`Et5%J7$u_NaC(55x zH^qX^H}*RPDx)^c46x>js=%&?y?=iFs^#_rUl@*MgLD92E5y4B7#EDe9yyn*f-|pQ zi>(!bIg6zY5fLSn@;$*sN|D2A{}we*7+2(4&EhUV%Qqo5=uuN^xt_hll7=`*mJq6s zCWUB|s$)AuS&=)T&_$w>QXHqCWB&ndQ$y4-9fezybZb0bYD^zeuZ>WZF{rc>c4s`` zgKdppTB|o>L1I1hAbnW%H%EkFt%yWC|0~+o7mIyFCTyb?@*Ho)eu(x`PuO8pLikN> z6YeI`V?AUWD(~3=8>}a6nZTu~#QCK(H0+4!ql3yS`>JX;j4+YkeG$ZTm33~PLa3L} zksw7@%e-mBM*cGfz$tS4LC^SYVdBLsR}nAprwg8h2~+Cv*W0%izK+WPVK}^SsL5R_ zpA}~G?VNhJhqx2he2;2$>7>DUB$wN9_-adL@TqVLe=*F8Vsw-yho@#mTD6*2WAr6B zjtLUh`E(;#p0-&$FVw(r$hn+5^Z~9J0}k;j$jL1;?2GN9s?}LASm?*Rvo@?E+(}F& z+=&M-n`5EIz%%F^e)nnWjkQUdG|W^~O|YeY4Fz}>qH2juEere}vN$oJN~9_Th^&b{ z%IBbET*E8%C@jLTxV~h#mxoRrJCF{!CJOghjuKOyl_!Jr?@4Upo7u>fTGtfm|CH2v z&9F+>;6aFbYXLj3{yZ~Yn1J2%!)A3~j2$`jOy{XavW@t)g}}KUVjCWG0OUc7aBc=2 zR3^u=dT47=5SmT{K1aGaVZkOx|24T-J0O$b9dfB25J|7yb6frwS6wZ1^y%EWOm}S< zc1SdYhfsdLG*FB-;!QLV3D!d~hnXTGVQVck9x%=B(Kk8c3y%f0nR95_TbY;l=obSl zEE@fp0|8Q$b3(+DXh?d0FEloGhO0#11CLQT5qtEckBLe-VN-I>9ys}PVK0r;0!jIG zH_q$;a`3Xv9P_V2ekV1SMzd#SKo<1~Dq2?M{(V;AwhH_2x@mN$=|=cG0<3o^j_0OF z7|WJ-f2G=7sA4NVGU2X5`o*D2T7(MbmZ2(oipooE{R?9!{WxX!%ofhsrPAxoIk!Kr z>I$a{Zq=%KaLrDCIL^gmA3z{2z%Wkr)b$QHcNUA^QwydWMJmxymO0QS22?mo%4(Md zgME(zE}ub--3*wGjV`3eBMCQG-@Gel1NKZDGuqobN|mAt0{@ZC9goI|BSmGBTUZ(`Xt z^e2LiMg?6E?G*yw(~K8lO(c4)RY7UWxrXzW^iCg-P41dUiE(i+gDmmAoB?XOB}+Ln z_}rApiR$sqNaT4frw69Wh4W?v(27IlK$Toy<1o)GeF+sGzYVeJ`F)3`&2WDi^_v67 zg;@ehwl3=t+}(DJtOYO!s`jHyo-}t@X|U*9^sIfaZfh;YLqEFmZ^E;$_XK}%eq;>0 zl?+}*kh)5jGA}3daJ*v1knbW0GusR1+_xD`MFPZc3qqYMXd>6*5?%O5pC7UVs!E-` zuMHc6igdeFQ`plm+3HhP)+3I&?5bt|V8;#1epCsKnz0%7m9AyBmz06r90n~9o;K30 z=fo|*`Qq%dG#23bVV9Jar*zRcV~6fat9_w;x-quAwv@BkX0{9e@y0NB(>l3#>82H6 z^US2<`=M@6zX=Pz>kb8Yt4wmeEo%TZ=?h+KP2e3U9?^Nm+OTx5+mVGDvgFee%}~~M zK+uHmj44TVs}!A}0W-A92LWE%2=wIma(>jYx;eVB*%a>^WqC7IVN9{o?iw{e4c=CG zC#i=cRJZ#v3 zF^9V+7u?W=xCY%2dvV_0dCP%5)SH*Xm|c#rXhwEl*^{Ar{NVoK*H6f5qCSy`+|85e zjGaKqB)p7zKNKI)iWe6A9qkl=rTjs@W1Crh(3G57qdT0w2ig^{*xerzm&U>YY{+fZbkQ#;^<$JniUifmAuEd^_M(&?sTrd(a*cD! zF*;`m80MrZ^> zaF{}rDhEFLeH#`~rM`o903FLO?qw#_Wyb5}13|0agjSTVkSI6Uls)xAFZifu@N~PM zQ%o?$k)jbY0u|45WTLAirUg3Zi1E&=G#LnSa89F3t3>R?RPcmkF}EL-R!OF_r1ZN` z?x-uHH+4FEy>KrOD-$KHg3$-Xl{Cf0;UD4*@eb~G{CK-DXe3xpEEls?SCj^p z$Uix(-j|9f^{z0iUKXcZQen}*`Vhqq$T?^)Ab2i|joV;V-qw5reCqbh(8N)c%!aB< zVs+l#_)*qH_iSZ_32E~}>=wUO$G_~k0h@ch`a6Wa zsk;<)^y=)cPpHt@%~bwLBy;>TNrTf50BAHUOtt#9JRq1ro{w80^sm-~fT>a$QC;<| zZIN%&Uq>8`Js_E((_1sewXz3VlX|-n8XCfScO`eL|H&2|BPZhDn}UAf_6s}|!XpmUr90v|nCutzMjb9|&}#Y7fj_)$alC zM~~D6!dYxhQof{R;-Vp>XCh1AL@d-+)KOI&5uKupy8PryjMhTpCZnSIQ9^Aq+7=Mb zCYCRvm4;H=Q8nZWkiWdGspC_Wvggg|7N`iED~Eap)Th$~wsxc(>(KI>{i#-~Dd8iQ zzonqc9DW1w4a*}k`;rxykUk+~N)|*I?@0901R`xy zN{20p@Ls<%`1G1Bx87Vm6Z#CA`QR(x@t8Wc?tpaunyV^A*-9K9@P>hAWW9Ev)E$gb z<(t?Te6GcJX2&0% z403pe>e)>m-^qlJU^kYIH)AutgOnq!J>FoMXhA-aEx-((7|(*snUyxa+5$wx8FNxS zKuVAVWArlK#kDzEM zqR?&aXIdyvxq~wF?iYPho*(h?k zD(SBpRDZ}z$A})*Qh!9&pZZRyNixD!8)B5{SK$PkVET(yd<8kImQ3ILe%jhx8Ga-1 zE}^k+Eo^?c4Y-t2_qXiVwW6i9o2qosBDj%DRPNT*UXI0=D9q{jB*22t4HHcd$T&Xi zT=Vte*Gz2E^qg%b7ev04Z&(;=I4IUtVJkg<`N6i7tjUn-lPE(Y4HPyJKcSjFnEzCH zPO(w%LmJ_=D~}PyfA91H4gCaf-qur3_KK}}>#9A}c5w@N;-#cHph=x}^mQ3`oo`Y$ope#)H9(kQK zGyt<7eNPuSAs$S%O>2ElZ{qtDIHJ!_THqTwcc-xfv<@1>IJ;YTv@!g-zDKBKAH<

Zet1e^8c}8fE97XH}+lF{qbF<`Y%dU|I!~Y`ZrVfKX82i z)(%!Tcf~eE^%2_`{WBPGPU@1NB5SCXe1sAI<4&n1IwO{&S$ThWn37heGOSW%nW7*L zxh0WK!E7zh%6yF-7%~l@I~b`2=*$;RYbi(I#zp$gL_d39U4A)KuB( zcS0bt48&%G_I~( zL(}w&2NA6#$=|g)J+-?ehHflD^lr77ngdz=dszFI;?~ZxeJv=gsm?4$$6#V==H{fa zqO!EkT>1-OQSJoX)cN}XsB;shvrHRwTH(I2^Ah4|rizn!V7T7fLh~Z<`Q+?zEMVxh z$=-x^RR*PlhkV_8mshTvs+zmZWY&Jk{9LX0Nx|+NAEq-^+Rh|ZlinVZ=e8=`WQt;e@= zPU}^1cG*O;G7l{Y#nl znp`y%CO_SC7gk0i0gY&phM04Y)~vU0!3$V$2T+h(1ZS+cCgc zaC?3M;B48^faGo>h~--#FNFauH?0BJJ6_nG5qOlr>k~%DCSJaOfl%KWHusw>tGrTxAhlEVDxc8R2C-)LCt&$Rt9IKor=ml7jirX@?WW+M z^I{b}MD5r$s>^^sN@&g`cXD~S_u09xo;{;noKZatIuzqd zW1e7oTl9>g8opPBT(p+&fo0F#!c{NFYYpIZ6u8hOB{F#{nP)@})X20$3iJtG$cO zJ$Oxl_qH{sL5d?=D$2M4C3Ajc;GN0(B-HVT;@pJ-LvIrN%|SY?t}g!J>ufQrR%hoY z!nr$tq~N%)9}^tEip93XW=MQ1@XovSvn`PTqXeT9@_7hGv4%LK1M**Q%UKi|(v@1_ zKGe*@+1%Y4v&`;5vUL`C&{tc+_7HFs7*OtjY8@Gg`C4O&#An{0xOvgNSehTHS~_1V z=daxCMzI5b_ydM5$z zZl`a{mM}i@x;=QyaqJY&{Q^R*^1Yzq!dHH~UwCCga+Us~2wk59ArIYtSw9}tEmjbo z5!JA=`=HP*Ae~Z4Pf7sC^A3@Wfa0Ax!8@H_&?WVe*)9B2y!8#nBrP!t1fqhI9jNMd zM_5I)M5z6Ss5t*f$Eh{aH&HBeh310Q~tRl3wCEcZ>WCEq%3tnoHE)eD=)XFQ7NVG5kM zaUtbnq2LQomJSWK)>Zz1GBCIHL#2E>T8INWuN4O$fFOKe$L|msB3yTUlXES68nXRX zP6n*zB+kXqqkpQ3OaMc9GqepmV?Ny!T)R@DLd`|p5ToEvBn(~aZ%+0q&vK1)w4v0* zgW44F2ixZj0!oB~^3k|vni)wBh$F|xQN>~jNf-wFstgiAgB!=lWzM&7&&OYS=C{ce zRJw|)PDQ@3koZfm`RQ$^_hEN$GuTIwoTQIDb?W&wEo@c75$dW(ER6q)qhF`{#7UTuPH&)w`F!w z0EKs}=33m}_(cIkA2rBWvApydi0HSOgc>6tu&+hmRSB%)s`v_NujJNhKLS3r6hv~- z)Hm@?PU{zd0Tga)cJWb2_!!9p3sP%Z zAFT|jy;k>4X)E>4fh^6=SxV5w6oo`mus&nWo*gJL zZH{SR!x)V)y=Qc7WEv-xLR zhD4OcBwjW5r+}pays`o)i$rcJb2MHLGPmeOmt5XJDg@(O3PCbxdDn{6qqb09X44T zh6I|s=lM6Nr#cGaA5-eq*T=LQ6SlRq*`~`b+dVi5^>el1p;#si6}kK}>w;1 z6B1dz{q_;PY{>DBQ+v@1pfXTd5a*^H9U*;qdj@XBF}MoSSQxVXeUpEM5Z0909&8$pRfR|B(t0ox&xl8{8mUNd#(zWONW{oycv$VjP1>q;jU@ z@+8E~fjz*I54OFFaQ{A5jn1w>r;l!NRlI(8q3*%&+tM?lov_G3wB`<}bQ>1=&xUht zmti5VZzV1Cx006Yzt|%Vwid>QPX8Nfa8|sue7^un@C+!3h!?-YK>lSfNIHh|0kL8v zbv_BklQ4HOqje|@Fyxn%IvL$N&?m(KN;%`I$N|muStjSsgG;gP4Smgz$2u(mG;DXP zf~uQ z212x^l6!MW>V@ORUGSFLAAjz3i5zO$=UmD_zhIk2OXUz^LkDLWjla*PW?l;`LLos> z7FBvCr)#)XBByDm(=n%{D>BcUq>0GOV9`i-(ZSI;RH1rdrAJ--f0uuAQ4odl z_^$^U_)0BBJwl@6R#&ZtJN+@a(4~@oYF)yG+G#3=)ll8O#Zv3SjV#zSXTW3h9kqn* z@AHL=vf~KMas}6{+u=}QFumr-!c=(BFP_dwvrdehzTyqco)m@xRc=6b#Dy+KD*-Bq zK=y*1VAPJ;d(b?$2cz{CUeG(0`k9_BIuUki@iRS5lp3=1#g)A5??1@|p=LOE|FNd; z-?5MLKd-5>yQ7n__5W^3C!_`hP(o%_E3BKEmo1h=H(7;{6$XRRW6{u+=oQX<((xAJ zNRY`Egtn#B1EBGHLy^eM5y}Jy0h!GAGhb7gZJoZI-9WuSRw)GVQAAcKd4Qm)pH`^3 zq6EIM}Q zxZGx%aLnNP1an=;o8p9+U^>_Bi`e23E^X|}MB&IkS+R``plrRzTE%ncmfvEW#AHJ~ znmJ`x&ez6eT21aLnoI`%pYYj zzQ?f^ob&Il;>6Fe>HPhAtTZa*B*!;;foxS%NGYmg!#X%)RBFe-acahHs3nkV61(E= zhekiPp1d@ACtA=cntbjuv+r-Zd`+lwKFdqZuYba_ey`&H<Psu;Tzwt;-LQxvv<_D5;ik7 zwETZe`+voUhk%$s2-7Rqfl`Ti_{(fydI(DAHKr<66;rYa6p8AD+NEc@Fd@%m`tiK% z=Mebzrtp=*Q%a}2UdK4J&5#tCN5PX>W=(9rUEXZ8yjRu+7)mFpKh{6;n%!bI(qA9kfyOtstGtOl zX!@*O0fly*L4k##fsm&V0j9Lj<_vu1)i?!#xTB7@2H&)$Kzt@r(GH=xRZlIimTDd_o(%9xO388LwC#;vQ?7OvRU_s< zDS@6@g}VnvQ+tn(C#sx0`J^T4WvFxYI17;uPs-Ub{R`J-NTdtBGl+Q>e81Z3#tDUr ztnVc*p{o|RNnMYts4pdw=P!uJkF@8~h)oV4dXu5F7-j0AW|=mt!QhP&ZV!!82*c7t zuOm>B*2gFtq;A8ynZ~Ms?!gEi5<{R_8tRN%aGM!saR4LJQ|?9w>Ff_61(+|ol_vL4 z-+N>fushRbkB4(e{{SQ}>6@m}s1L!-#20N&h%srA=L50?W9skMF9NGfQ5wU*+0<@> zLww8%f+E0Rc81H3e_5^DB@Dn~TWYk}3tqhO{7GDY;K7b*WIJ-tXnYM@z4rn(LGi?z z8%$wivs)fC#FiJh?(SbH-1bgdmHw&--rn7zBWe1xAhDdv#IRB@DGy}}zS%M0(F_3_ zLb-pWsdJ@xXE;=tpRAw?yj(Gz=i$;bsh&o2XN%24b6+?_gJDBeY zws3PE2u!#Cec>aFMk#ECxDlAs;|M7@LT8)Y4(`M}N6IQ{0YtcA*8e42!n^>`0$LFU zUCq2IR2(L`f++=85M;}~*E($nE&j;p{l%xchiTau*tB9bI= zn~Ygd@<+9DrXxoGPq}@vI1Q3iEfKRleuy*)_$+hg?+GOgf1r?d@Or42|s|D>XMa;ebr1uiTNUq@heusd6%WwJqyCCv!L*qou9l!B22H$bQ z)<)IA>Yo77S;|`fqBk!_PhLJEQb0wd1Z|`pCF;hol!34iQYtqu3K=$QxLW7(HFx~v>`vVRr zyqk^B4~!3F8t8Q_D|GLRrAbbQDf??D&Jd|mgw*t1YCd)CM2$76#Cqj1bD*vADwavp zS<`n@gLU4pwCqNPsIfHKl{5}gu9t-o+O< z??!fMqMrt$s}02pdBbOScUrc1T*{*-ideR6(1q4@oC6mxg8v8Y^h^^hfx6| z|Mld6Ax1CuSlmSJmHwdOix?$8emihK#&8&}u8m!#T1+c5u!H)>QW<7&R$eih)xkov zHvvEIJHbkt+2KQ<-bMR;2SYX?8SI=_<-J!GD5@P2FJ}K z5u82YFotCJF(dUeJFRX_3u8%iIYbRS??A?;iVO?84c}4Du9&jG<#urlZ_Unrcg8dR z!5I3%9F*`qwk#joKG_Q%5_xpU7|jm4h0+l$p;g%Tr>i74#3QnMXdz|1l2MQN$yw|5 zThMw15BxjWf2{KM)XtZ+e#N)ihlkxPe=5ymT9>@Ym%_LF}o z1XhCP`3E1A{iVoHA#|O|&5=w;=j*Qf`;{mBAK3={y-YS$`!0UmtrvzHBfR*s{z<0m zW>4C=%N98hZlUhwAl1X`rR)oL0&A`gv5X79??p_==g*n4$$8o5g9V<)F^u7v0Vv^n z1sp8{W@g6eWv2;A31Rhf5j?KJhITYfXWZsl^`7z`CFtnFrHUWiD?$pwU6|PQjs|7RA0o9ARk^9$f`u3&C|#Z3iYdh<0R`l2`)6+ z6tiDj@xO;Q5PDTYSxsx6n>bj+$JK8IPJ=U5#dIOS-zwyK?+t^V`zChdW|jpZuReE_ z)e~ywgFe!0q|jzsBn&(H*N`%AKpR@qM^|@qFai0};6mG_TvXjJ`;qZ{lGDZHScZk( z>pO+%icp)SaPJUwtIPo1BvGyP8E@~w2y}=^PnFJ$iHod^JH%j1>nXl<3f!nY9K$e` zq-?XYl)K`u*cVXM=`ym{N?z=dHQNR23M8uA-(vsA$6(xn+#B-yY!CB2@`Uz({}}w+ z0sni*39>rMC!Ay|1B@;al%T&xE(wCf+`3w>N)*LxZZZYi{5sqiVWgbNd>W*X?V}C- zjQ4F7e_uCUOHbtewQkq?m$*#@ZvWbu{4i$`aeKM8tc^ zL5!GL8gX}c+qNUtUIcps1S)%Gsx*MQLlQeoZz2y2OQb(A73Jc3`LmlQf0N{RTt;wa`6h|ljX1V7UugML=W5-STDbeWTiEMjPQ$({hn_s&NDXzs6?PLySp$?L`0ilH3vCUO{JS0Dp`z;Ry$6}R@1NdY7rxccbm$+;ApSe=2q!0 z()3$vYN0S$Cs)#-OBs{_2uFf}L4h$;7^2w20=l%5r9ui&pTEgg4U!FoCqyA6r2 zC5s72l}i*9y|KTjDE5gVlYe4I2gGZD)e`Py2gq7cK4at{bT~DSbQQ4Z4sl)kqXbbr zqvXtSqMrDdT2qt-%-HMoqeFEMsv~u)-NJ%Z*ipSJUm$)EJ+we|4*-Mi900K{K|e0; z1_j{X5)a%$+vM7;3j>skgrji92K1*Ip{SfM)=ob^E374JaF!C(cZ$R_E>Wv+?Iy9M z?@`#XDy#=z%3d9&)M=F8Xq5Zif%ldIT#wrlw(D_qOKo4wD(fyDHM5(wm1%7hy6euJ z%Edg!>Egs;ZC6%ktLFtyN0VvxN?*4C=*tOEw`{KQvS7;c514!FP98Nf#d#)+Y-wsl zP3N^-Pnk*{o(3~m=3DX$b76Clu=jMf9E?c^cbUk_h;zMF&EiVz*4I(rFoaHK7#5h0 zW7CQx+xhp}Ev+jw;SQ6P$QHINCxeF8_VX=F3&BWUd(|PVViKJl@-sYiUp@xLS2NuF z8W3JgUSQ&lUp@2E(7MG`sh4X!LQFa6;lInWqx}f#Q z4xhgK1%}b(Z*rZn=W{wBOe7YQ@1l|jQ|9ELiXx+}aZ(>{c7Ltv4d>PJf7f+qjRU8i%XZZFJkj&6D^s;!>`u%OwLa*V5Js9Y$b-mc!t@{C415$K38iVu zP7!{3Ff%i_e!^LzJWhBgQo=j5k<<($$b&%%Xm_f8RFC_(97&nk83KOy@I4k?(k<(6 zthO$3yl&0x!Pz#!79bv^?^85K5e7uS$ zJ33yka2VzOGUhQXeD{;?%?NTYmN3{b0|AMtr(@bCx+c=F)&_>PXgAG}4gwi>g82n> zL3DlhdL|*^WTmn;XPo62HhH-e*XIPSTF_h{#u=NY8$BUW=5@PD{P5n~g5XDg?Fzvb_u ziK&CJqod4srfY2T?+4x@)g9%3%*(Q2%YdCA3yM{s=+QD0&IM`8k8N&-6%iIL3kon> z0>p3BUe!lrz&_ZX2FiP%MeuQY-xVV%K?=bGPOM&XM0XRd7or< zy}jn_eEzuQ>t2fM9ict#ZNxD7HUycsq76IavfoNl$G1|t*qpUSX;YgpmJrr_8yOJ2 z(AwL;Ugi{gJ29@!G-mD82Z)46T`E+s86Qw|YSPO*OoooraA!8x_jQXYq5vUw!5f_x zubF$}lHjIWxFar8)tTg8z-FEz)a=xa`xL~^)jIdezZsg4%ePL$^`VN#c!c6`NHQ9QU zkC^<0f|Ksp45+YoX!Sv>+57q}Rwk*2)f{j8`d8Ctz^S~me>RSakEvxUa^Pd~qe#fb zN7rnAQc4u$*Y9p~li!Itp#iU=*D4>dvJ{Z~}kqAOBcL8ln3YjR{Sp!O`s=5yM zWRNP#;2K#+?I&?ZSLu)^z-|*$C}=0yi7&~vZE$s``IE^PY|dj^HcWI$9ZRm>3w(u` z-1%;;MJbzHFNd^!Ob!^PLO-xhhj@XrI81Y)x4@FdsI( za`o4Gy(`T$P?PB?s>o+eIOtuirMykbuAi65Y_UN1(?jTCy@J8Px`%;bcNmPm#Fr!= z5V!YViFJ!FBfEq>nJFk0^RAV1(7w+X`HRgP;nJHJdMa!}&vvduCMoslwHTes_I76|h>;(-9lbfGnt zoZomakOt759AuTX4b$)G8TzJ&m*BV8!vMs9#=e0tWa z%)84R=3?tfh72~=Rc;fXwj+x z+25xapYK@2@;}6)@8IL+F6iuJ_B{&A-0=U=U6WMbY>~ykVFp$XkH)f**b>TE5)shN z39E2L@JPCSl!?pkvFeh@6dCv9oE}|{GbbVM!XIgByN#md&tXy@>QscU0#z!I&X4;d z&B&ZA4lbrHJ!x4lCN4KC-)u#gT^cE{Xnhu`0RXVKn|j$vz8m}v^%*cQ{(h%FW8_8a zFM{$PirSI8@#*xg2T){A+EKX(eTC66Fb})w{vg%Vw)hvV-$tttI^V5wvU?a{(G}{G z@ob7Urk1@hDN&C$N!Nio9YrkiUC{5qA`KH*7CriaB;2~2Od>2l=WytBRl#~j`EYsj}jqK2xD*3 ztEUiPZzEJC??#Tj^?f)=sRXOJ_>5aO(|V#Yqro05p6)F$j5*wYr1zz|T4qz$0K(5! zr`6Pqd+)%a9Xq3aNKrY9843)O56F%=j_Yy_;|w8l&RU1+B4;pP*O_}X8!qD?IMiyT zLXBOOPg<*BZtT4LJ7DfyghK|_*mMP7a1>zS{8>?}#_XXaLoUBAz(Wi>$Q!L;oQ&cL z6O|T6%Dxq3E35$0g5areq9$2+R(911!Z9=wRPq-pju7DnN9LAfOu3%&onnfx^Px5( zT2^sU>Y)88F5#ATiVoS$jzC-M`vY8!{8#9O#3c&{7J1lo-rcNK7rlF0Zt*AKE(WN* z*o?Tv?Sdz<1v6gfCok8MG6Pzecx9?C zrQG5j^2{V556Hj=xTiU-seOCr2ni@b<&!j>GyHbv!&uBbHjH-U5Ai-UuXx0lcz$D7%=! z&zXD#Jqzro@R=hy8bv>D_CaOdqo6)vFjZldma5D+R;-)y1NGOFYqEr?h zd_mTwQ@K2veZTxh1aaV4F;YnaWA~|<8$p}-eFHashbWW6Dzj=3L=j-C5Ta`w-=QTw zA*k9!Ua~-?eC{Jc)xa;PzkUJ#$NfGJOfbiV^1au;`_Y8|{eJ(~W9pP9q?gLl5E6|e{xkT@s|Ac;yk01+twk_3nuk|lRu{7-zOjLAGe!)j?g+@-;wC_=NPIhk(W zfEpQrdRy z^Q$YBs%>$=So>PAMkrm%yc28YPi%&%=c!<}a=)sVCM51j+x#<2wz?2l&UGHhOv-iu z64x*^E1$55$wZou`E=qjP1MYz0xErcpMiNYM4+Qnb+V4MbM;*7vM_Yp^uXUuf`}-* z_2CnbQ);j5;Rz?7q)@cGmwE^P>4_u9;K|BFlOz_|c^1n~%>!uO#nA?5o4A>XLO{X2 z=8M%*n=IdnXQ}^+`DXRKM;3juVrXdgv79;E=ovQa^?d7wuw~nbu%%lsjUugE8HJ9zvZIM^nWvjLc-HKc2 zbj{paA}ub~4N4Vw5oY{wyop9SqPbWRq=i@Tbce`r?6e`?`iOoOF;~pRyJlKcIJf~G z)=BF$B>YF9>qV#dK^Ie#{0X(QPnOuu((_-u?(mxB7c9;LSS-DYJ8Wm4gz1&DPQ8;0 z=Wao(zb1RHXjwbu_Zv<=9njK28sS}WssjOL!3-E5>d17Lfnq0V$+IU84N z-4i$~!$V-%Ik;`Z3MOqYZdiZ^3nqqzIjLE+zpfQC+LlomQu-uNCStj%MsH(hsimN# z%l4vpJBs_2t7C)x@6*-k_2v0FOk<1nIRO3F{E?2DnS}w> z#%9Oa{`RB5FL5pKLkg59#x~)&I7GzfhiVC@LVFSmxZuiRUPVW*&2ToCGST0K`kRK) z02#c8W{o)w1|*YmjGSUO?`}ukX*rHIqGtFH#!5d1Jd}&%4Kc~Vz`S7_M;wtM|6PgI zNb-Dy-GI%dr3G3J?_yBX#NevuYzZgzZ!vN>$-aWOGXqX!3qzCIOzvA5PLC6GLIo|8 zQP^c)?NS29hPmk5WEP>cHV!6>u-2rR!tit#F6`_;%4{q^6){_CHGhvAs=1X8Fok+l zt&mk>{4ARXVvE-{^tCO?inl{)o}8(48az1o=+Y^r*AIe%0|{D_5_e>nUu`S%zR6|1 zu0$ov7c`pQEKr0sIIdm7hm{4K_s0V%M-_Mh;^A0*=$V9G1&lzvN9(98PEo=Zh$`Vj zXh?fZ;9$d!6sJRSjTkOhb7@jgSV^2MOgU^s2Z|w*e*@;4h?A8?;v8JaLPCoKP_1l- z=Jp0PYDf(d2Z`;O7mb6(_X_~z0O2yq?H`^c=h|8%gfywg#}wIyv&_uW{-e8e)YmGR zI0NNSDoJWa%0ztGzkwl>IYW*DesPRY?oH+ow^(>(47XUm^F`fAa0B~ja-ae$e>4-A z64lb_;|W0ppKI+ zxu2VLZzv4?Mr~mi?WlS-1L4a^5k+qb5#C)ktAYGUE1H?Vbg9qsRDHAvwJUN=w~AuT zUXYioFg2Dx-W)}w9VdFK#vpjoSc!WcvRZ_;TgHu;LSY*i7K_>Px{%C4-IL?6q?Qa_ zL7l=EEo|@X&$gX;fYP02qJF~LN9?E-OL2G(Fo4hW)G{`qnW zTIuc+-1VJvKgph0jAc(LzM);Pg$MPln?U|ek{_5nNJHfm-Y#ec+n#Yf_e>XfbLbN)eqHEDr0#?<;TskL5-0JGv|Ut{=$Xk8hlwbaMXdcI3GL zY-hykR{zX9liy$Z2F3!z346uu%9@-y6Gda`X2*ixlD_P@<}K?AoV?(%lM%* z(xNk=|A()443aGj)-~IDf3J+UA2p2lh6ei^pG*HL#SiThnIr5WZDXebI)F7X zGmP-3bH$i$+(IwqgbM7h%G5oJ@4{Z~qZ#Zs*k7eXJIqg;@0kAGV|b=F#hZs)2BYu1 zr8sj#Zd+Iu^G}|@-dR5S*U-;DqzkX3V0@q-k8&VHW?h0b0?tJ-Atqmg^J8iF7DP6k z)W{g?5~F*$5x?6W)3YKcrNu8%%(DglnzMx5rsU{#AD+WPpRBf``*<8F-x75D$$13U zcaNXYC0|;r&(F@!+E=%+;bFKwKAB$?6R%E_QG5Yn5xX#h+zeI-=mdXD5+D+lEuM`M ze+*G!zX^xbnA?~LnPI=D2`825Ax8rM()i*{G0gcV5MATV?<7mh+HDA7-f6nc@95st zzC_si${|&=$MUj@nLxl_HwEXb2PDH+V?vg zA^DJ%dn069O9TNK-jV}cQKh|$L4&Uh`?(z$}#d+{X zm&=KTJ$+KvLZv-1GaHJm{>v=zXW%NSDr8$0kSQx(DQ)6S?%sWSHUazXSEg_g3agt2@0nyD?A?B%9NYr(~CYX^&U#B4XwCg{%YMYo%e68HVJ7`9KR`mE*Wl7&5t71*R3F>*&hVIaZXaI;2a$?;{Ew{e3Hr1* zbf$&Fyhnrq7^hNC+0#%}n^U2{ma&eS)7cWH$bA@)m59rXlh96piJu@lcKl<>+!1#s zW#6L5Ov%lS(?d66-(n`A%UuiIqs|J|Ulq0RYq-m&RR0>wfA1?<34tI?MBI#a8lY{m z{F2m|A@=`DpZpwdIH#4)9$#H3zr4kn2OX!UE=r8FEUFAwq6VB?DJ8h59z$GXud$#+ zjneIq8uSi&rnG0IR8}UEn5OcZC?@-;$&Ry9hG{-1ta`8aAcOe1|82R7EH`$Qd3sf* zbrOk@G%H7R`j;hOosRVIP_2_-TuyB@rdj?(+k-qQwnhV3niH+CMl>ELX(;X3VzZVJ ztRais0C^L*lmaE(nmhvep+peCqr!#|F?iVagZcL>NKvMS_=*Yl%*OASDl3(mMOY9! z=_J$@nWpA-@><43m4olSQV8(PwhsO@+7#qs@0*1fDj70^UfQ(ORV0N?H{ceLX4<43 zEn)3CGoF&b{t2hbIz;Og+$+WiGf+x5mdWASEWIA*HQ9K9a?-Pf9f1gO6LanVTls)t z^f6_SD|>2Kx8mdQuiJwc_SmZOZP|wD7(_ti#0u=io|w~gq*Odv>@8JBblRCzMKK_4 zM-uO0Ud9>VD>J;zZzueo#+jbS7k#?W%`AF1@ZPI&q%}beZ|ThISf-ly)}HsCS~b^g zktgqOZ@~}1h&x50UQD~!xsW-$K~whDQNntLW=$oZDClUJeSr2$r3}94Wk1>co3beS zoY-7t{rGv|6T?5PNkY zj*XjF()ybvnVz5=BFnLO=+1*jG>E7F%&vm6up*QgyNcJJPD|pHoZ!H6?o3Eig0>-! zt^i-H@bJ;^!$6ZSH}@quF#RO)j>7A5kq4e+7gK=@g;POXcGV28Zv$jybL1J`g@wC# z_DW1ck}3+n@h2LFQhwVfaV@D+-kff4celZC0;0ef?pA#*PPd8Kk8sO1wza&BHQFblVU8P1=-qScHff^^fR zycH!hlHQs7iejITpc4UaBxzqTJ}Z#^lk{W(cr`qtW~Ap;HvuUf#MxgEG?tEU+B?G% znub0I(s@XvI(lva}$Z7<}Qg=rWd5n)}rX{nb+Aw;}?l9LZI-`N-*hts=c6XgjfJs ztp>-686v6ug{glEZ}K=jVG|N1WSWrU*&ue|4Q|O@;s0#L5P*U%Vx;)w7S0ZmLuvwA z@zs2Kut)n1K7qaywO#TbBR`Q~%mdr`V)D`|gN0!07C1!r3{+!PYf9*;h?;dE@#z(k z;o`g~<>P|Sy$ldHTUR3v=_X0Iw6F>3GllrFXVW?gU0q6|ocjd!glA)#f0G7i20ly>qxRljgfO2)RVpvmg#BSrN)GbGsrIb}9 z1t+r;Q>?MGLk#LI5*vR*C8?McB|=AoAjuDk&Pn`KQo z`!|mi{Cz@BGJ!TwMUUTkKXKNtS#OVNxfFI_Gfq3Kpw0`2AsJv9PZPq9x?~kNNR9BR zw#2jp%;FJNoOzW>tE#zskPICp>XSs?|B0E%DaJH)rtLA}$Y>?P+vEOvr#8=pylh zch;H3J`RE1{97O+1(1msdshZx$it^VfM$`-Gw>%NN`K|Tr$0}U`J?EBgR%bg=;et0 z_en)!x`~3so^V9-jffh3G*8Iy6sUq=uFq%=OkYvHaL~#3jHtr4sGM?&uY&U8N1G}QTMdqBM)#oLTLdKYOdOY%{5#Tgy$7QA! zWQmP!Wny$3YEm#Lt8TA^CUlTa{Cpp=x<{9W$A9fyKD0ApHfl__Dz4!HVVt(kseNzV z5Fb`|7Mo>YDTJ>g;7_MOpRi?kl>n(ydAf7~`Y6wBVEaxqK;l;}6x8(SD7}Tdhe2SR zncsdn&`eI}u}@^~_9(0^r!^wuKTKbs-MYjXy#-_#?F=@T*vUG@p4X+l^SgwF>TM}d zr2Ree{TP5x@ZtVcWd3++o|1`BCFK(ja-QP?zj6=ZOq)xf$CfSv{v;jCcNt4{r8f+m zz#dP|-~weHla%rsyYhB_&LHkwuj83RuCO0p;wyXsxW5o6{)zFAC~2%&NL? z=mA}szjHKsVSSnH#hM|C%;r0D$7)T`HQ1K5vZGOyUbgXjxD%4xbs$DAEz)-;iO?3& zXcyU*Z8zm?pP}w&9ot_5I;x#jIn^Joi5jBDOBP1)+p@G1U)pL6;SIO>Nhw?9St2UN zMedM(m(T6bNcPPD`%|9dvXAB&IS=W4?*7-tqldqALH=*UapL!4`2TM_{`W&pm*{?| z0DcsaTdGA%RN={Ikvaa&6p=Ux5ycM){F1OgOh(^Yk-T}a5zHH|=%Jk)S^vv9dY~`x zG+!=lsDjp!D}7o94RSQ-o_g#^CnBJlJ@?saH&+j0P+o=eKqrIApyR7ttQu*0 z1f;xPyH2--)F9uP2#Mw}OQhOFqXF#)W#BAxGP8?an<=JBiokg;21gKG_G8X!&Hv;7 zP9Vpzm#@;^-lf=6POs>UrGm-F>-! zm;3qp!Uw?VuXW~*Fw@LC)M%cvbe9!F(Oa^Y6~mb=8%$lg=?a0KcGtC$5y?`L5}*-j z7KcU8WT>2PpKx<58`m((l9^aYa3uP{PMb)nvu zgt;ia9=ZofxkrW7TfSrQf4(2juZRBgcE1m;WF{v1Fbm}zqsK^>sj=yN(x}v9#_{+C zR4r7abT2cS%Wz$RVt!wp;9U7FEW&>T>YAjpIm6ZSM4Q<{Gy+aN`Vb2_#Q5g@62uR_>II@eiHaay+JU$J=#>DY9jX*2A=&y8G%b zIY6gcJ@q)uWU^mSK$Q}?#Arq;HfChnkAOZ6^002J>fjPyPGz^D5p}o;h2VLNTI{HGg!obo3K!*I~a7)p-2Z3hCV_hnY?|6i`29b zoszLpkmch$mJeupLbt4_u-<3k;VivU+ww)a^ekoIRj4IW4S z{z%4_dfc&HAtm(o`d{CZ^AAIE5XCMvwQSlkzx3cLi?`4q8;iFTzuBAddTSWjfcZp* zn{@Am!pl&fv#k|kj86e$2%NK1G4kU=E~z9L^`@%2<%Dx%1TKk_hb-K>tq8A9bCDfW z@;Dc3KqLafkhN6414^46Hl8Tcv1+$q_sYjj%oHz)bsoGLEY1)ia5p=#eii(5AM|TW zA8=;pt?+U~>`|J(B85BKE0cB4n> zWrgZ)Rbu}^A=_oz65LfebZ(1xMjcj_g~eeoj74-Ex@v-q9`Q{J;M!mITVEfk6cn!u zn;Mj8C&3^8Kn%<`Di^~Y%Z$0pb`Q3TA}$TiOnRd`P1XM=>5)JN9tyf4O_z}-cN|i> zwpp9g`n%~CEa!;)nW@WUkF&<|wcWqfL35A}<`YRxV~$IpHnPQs2?+Fg3)wOHqqAA* zPv<6F6s)c^o%@YqS%P{tB%(Lxm`hsKv-Hb}MM3=U|HFgh8R-|-K(3m(eU$L@sg=uW zB$vAK`@>E`iM_rSo;Cr*?&wss@UXi19B9*0m3t3q^<)>L%4j(F85Ql$i^;{3UIP0c z*BFId*_mb>SC)d#(WM1%I}YiKoleKqQswkdhRt9%_dAnDaKM4IEJ|QK&BnQ@D;i-ame%MR5XbAfE0K1pcxt z{B5_&OhL2cx9@Sso@u2T56tE0KC`f4IXd_R3ymMZ%-!e^d}v`J?XC{nv1mAbaNJX| zXau+s`-`vAuf+&yi2bsd5%xdqyi&9o;h&fcO+W|XsKRFOD+pQw-p^pnwwYGu=hF7& z{cZj$O5I)4B1-dEuG*tU7wgYxNEhqAxH?p4Y1Naiu8Lt>FD%AxJ811`W5bveUp%*e z9H+S}!nLI;j$<*Dn~I*_H`zM^j;!rYf!Xf#X;UJW<0gic?y>NoFw}lBB6f#rl%t?k zm~}eCw{NR_%aosL*t$bmlf$u|U2hJ*_rTcTwgoi_N=wDhpimYnf5j!bj0lQ*Go`F& z6Wg+xRv55a(|?sCjOIshTEgM}2`dN-yV>)Wf$J58>lNVhjRagGZw?U9#2p!B5C3~Nc%S>p`H4PK z7vX@|Uo^*F4GXiFnMf4gwHB;Uk8X4TaLX4A>B&L?mw4&`XBnLCBrK2FYJLrA{*))0 z$*~X?2^Q0KS?Yp##T#ohH1B)y4P+rR7Ut^7(kCwS8QqgjP!aJ89dbv^XBbLhTO|=A z|3FNkH1{2Nh*j{p-58N=KA#6ZS}Ir&QWV0CU)a~{P%yhd-!ehF&~gkMh&Slo9gAT+ zM_&3ms;1Um8Uy0S|0r{{8xCB&Tg{@xotF!nU=YOpug~QlZRKR{DHGDuk(l{)d$1VD zj)3zgPeP%wb@6%$zYbD;Uhvy4(D|u{Q_R=fC+9z#sJ|I<$&j$|kkJiY?AY$ik9_|% z?Z;gOQG5I%{2{-*)Bk|Tia8n>TbrmjnK+8u*_cS%*;%>R|K|?urtIdgTM{&}Yn1;| zk`xq*Bn5HP5a`ANv`B$IKaqA4e-XC`sRn3Z{h!hN0=?x(kTP+fE1}-<3eL+QDFXN- z1JmcDt0|7lZN8sh^=$e;P*8;^33pN>?S7C0BqS)ow4{6ODm~%3018M6P^b~(Gos!k z2AYScAdQf36C)D`w&p}V89Lh1s88Dw@zd27Rv0iE7k#|U4jWDqoUP;-He5cd4V7Ql)4S+t>u9W;R-8#aee-Ct1{fPD+jv&zV(L&k z)!65@R->DB?K6Aml57?psj5r;%w9Vc3?zzGs&kTA>J9CmtMp^Wm#1a@cCG!L46h-j z8ZUL4#HSfW;2DHyGD|cXHNARk*{ql-J2W`9DMxzI0V*($9{tr|O3c;^)V4jwp^RvW z2wzIi`B8cYISb;V5lK}@xtm3NB;88)Kn}2fCH(WRH1l@3XaO7{R*Lc7{ZN1m+#&diI7_qzE z?BS+v<)xVMwt{IJ4yS2Q4(77II<>kqm$Jc3yWL42^gG6^Idg+y3)q$-(m2>E49-fV zyvsCzJ5EM4hyz1r#cOh5vgrzNGCBS}(Bupe`v6z{e z)cP*a8VCbRuhPp%BUwIRvj-$`3vrbp;V3wmAUt{?F z0OO?Mw`AS?y@>w%(pBO=0lohnxFWx`>Hs}V$j{XI2?}BtlvIl7!ZMZukDF7 z^6Rq2H*36KHxJ1xWm5uTy@%7;N0+|<>Up>MmxKhb;WbH1+=S94nOS-qN(IKDIw-yr zi`Ll^h%+%k`Yw?o3Z|ObJWtfO|AvPOc96m5AIw;4;USG|6jQKr#QP}+BLy*5%pnG2 zyN@VMHkD`(66oJ!GvsiA`UP;0kTmUST4|P>jTRfbf&Wii8~a`wMwVZoJ@waA{(t(V zwoc9l*4F>YUM8!aE1{?%{P4IM=;NUF|8YkmG0^Y_jTJtKClDV3D3~P7NSm7BO^r7& zWn!YrNc-ryEvhN$$!P%l$Y_P$s8E>cdAe3=@!Igo^0diL6`y}enr`+mQD;RC?w zb8}gXT!aC`%rdxx2_!`Qps&&w4i0F95>;6;NQ-ys;?j#Gt~HXzG^6j=Pv{3l1x{0( z4~&GNUEbH=9_^f@%o&BADqxb54EAq=8rKA~4~A!iDp9%eFHeA1L!Bb8Lz#kF(p#)X zn`CglEJ(+tr=h4bIIHlLkxP>exGw~{Oe3@L^zA)|Vx~2yNuPKtF^cV6X^5lw8hU*b zK-w6x4l&YWVB%0SmN{O|!`Sh6H45!7}oYPOc+a#a|n3f%G@eO)N>W!C|!FNXV3taFdpEK*A1TFGcRK zV$>xN%??ii7jx5D69O>W6O`$M)iQU7o!TPG*+>v6{TWI@p)Yg$;8+WyE9DVBMB=vnONSQ6k1v z;u&C4wZ_C`J-M0MV&MpOHuVWbq)2LZGR0&@A!4fZwTM^i;GaN?xA%0)q*g(F0PIB( zwGrCC#}vtILC_irDXI5{vuVO-(`&lf2Q4MvmXuU8G0+oVvzZp0Y)zf}Co0D+mUEZz zgwR+5y!d(V>s1} zji+mrd_6KG;$@Le2Ic&am6O+Rk1+QS?urB4$FQNyg2%9t%!*S5Ts{8j*&(H1+W;0~ z$frd%jJjlV;>bXD7!a-&!n52H^6Yp}2h3&v=}xyi>EXXZDtOIq@@&ljEJG{D`7Bjr zaibxip6B6Mf3t#-*Tn7p z96yx1Qv-&r3)4vg`)V~f8>>1_?E4&$bR~uR;$Nz=@U(-vyap|Jx zZ;6Ed+b#GXN+gN@ICTHx{=c@J|97TIPWs(_kjEIwZFHfc!rl8Ep-ZALBEZEr3^R-( z7ER1YXOgZ)&_=`WeHfWsWyzzF&a;AwTqzg~m1lOEJ0Su=C2<{pjK;{d#;E zr2~LgXN?ol2ua5Y*1)`(be0tpiFpKbRG+IK(`N?mIgdd9&e6vxzqxzaa`e7zKa3D_ zHi+c1`|720|dn(z4Qos^e7sn(PU%NYLv$&!|4kEse%DK;YAD06@XO3!EpKpz!^*?(?-Ip zC_Zlb(-_as+-D?0Ag9`|4?)bN)5o(J=&udAY|YgV(YuK9k=E>0z`$dSaL(wmxd!1f zME&3wwv@#{dgeMlZ4}GL!I`VZxtdQY$lmauCN_|mGXqEEj@i~du$|>5UvLjsbq!{; z@jEf;21iC1jFEmIPE^4gykHQzCMLj=2Ek4&FvlpqTlS(0YT%*W<>XgH$4ww`D`aihBGkPM(&EG};Cl&wzg8!jL z`rkqPzvH(0Kd{2n=?Bt8aAU&0IyiA+V-qnXVId^qG!SWZ7%_f&i!D{R#7Jo$%tICxY%j)ebORE>3H_c|to}c#HX;HAC?~B;2mmQrMp2;8T zmzde!k7BYg^Z1r|DUvSD3@{6S<1kndb%Qt%GA# z+sB2&F5L`R&fLRdAlpU_pVsJsYDEz{^ zKGaAz#%W+MPGT+D$+xowMY0=ipM)0p?zym&Aoi)qL(pO_weO(k?s|ELHl^W zviJiFUXRL&?`;3_;mvc02A@sbsW9}#{anvGafZ#ST;}za?XS3}ZG3B4m(SW{>w}Fh z)T5Yi*``Tstmi9SHXmuWSND@cj}qtY!`tuD29Dpu+-D3$h<5FY>jE>YJvqBmhw?oll`x7Ono(}R~P zle_eBwYy0Rr7kmf_SEt_gn4)AO-r`}^Z5Y%Rm8)K-?X>rvDL+QT?#)QwDsQ2c$tc* z&#hbgkL6}GnBDH;+lREM6MGIskRa@r>5Iq(ll2IepuhW86w@14=E{6$cz*cBDQ)CT>}v-DLM-v8)xaPBnmGBKM63RgDGqh!<*j90tSE4|G^+r@#-7g2 zs8KE8eZPZhQuN>wBU%8CmkE9LH1%O;-*ty0&K~01>F3XB>6sAm*m3535)9T&Fz}A4 zwGjZYVea@Fesd=Rv?ROE#q=}yfvQEP8*4zoEw4@^Qvw54utUfaR1T6gLmq?c9sON> z>Np6|0hdP_VURy81;`8{ZYS)EpU9-3;huFq)N3r{yP1ZBCHH7=b?Ig6OFK~%!GwtQ z3`RLKe8O&%^V`x=J4%^Oqg4ZN9rW`UQN^rslcr_Utzd-@u-Sm{rphS-y}{k41)Y4E zfzu}IC=J0JmRCV6a3E38nWl1G495grsDDc^H0Fn%^E0FZ=CSHB4iG<6jW1dY`2gUr zF>nB!y@2%rouAUe9m0VQIg$KtA~k^(f{C*Af_tOl=>vz>$>7qh+fPrSD0YVUnTt)? z;@1E0a*#AT{?oUs#bol@SPm0U5g<`AEF^=b-~&4Er)MsNnPsLb^;fL2kwp|$dwiE3 zNc5VDOQ%Q8j*d5vY##)PGXx51s8`0}2_X9u&r(k?s7|AgtW0LYbtlh!KJ;C9QZuz< zq>??uxAI1YP|JpN$+{X=97Cdu^mkwlB={`aUp+Uyu1P139=t%pSVKo7ZGi_v(0z>l zHLGxV%0w&#xvev)KCQ{7GC$nc3H?1VOsYGgjTK;Px(;o0`lerxB<+EJX9G9f8b+)VJdm(Ia)xjD&5ZL45Np?9 zB%oU;z05XN7zt{Q!#R~gcV^5~Y^gn+Lbad7C{UDX2Nznj8e{)TLH|zEc|{a#idm@z z6(zon+{a>FopmQsCXIs*4-dLGgTc)iOhO3r=l?imNUR-pWl!ktO0r_a0Nqo@bu8MzyjSq9zkqPe*`Sxz75rZ zr9X%(=PVqCRB=zfX+_u&*k4#s1k4OV11YgkCrlr6V;vz<{99HKC@qQ+H8xv5)sc63 z69;U4O&{fb5(fN``jJH#3=GHsV56@{d@7`VhA$K^;GU+R-V%%cnmjYs?>c5^6Ugv} zn<}L&i;2`zzW@(kxf$$gVH@7nh}2%G%ciQ_B?r{13?Q@=Q+6msQGtnyY%Gkjeor?g z7F*tMqLdhcq+LCCo^D;CtOACCBhXgK-M&w{*dcUdmtv@XFTofmmpcWKtCn^`#?oZC zUOm52 z7sK$hR|Vh6y&pfIUK&!`8HH*>12$nWA)Ynp+XwOj=jNLD z{QA4gezbe>wiP?`jJO;c&EId;=2u80s_r97;TX!6@*(<%WL+^bmxheMB3pKx0OpH^ zPs}knV+jpJ4TaD@r^V`mTsjf`7!z^H}eHQ#Rp z72(>Dm#QO!ZYR*O@yHic`3*T^t7jc=d`Jz6Lk@Y-bL%cOp_~=#xzIJl?`{Qu;$uC~NkePE+7wSW_FM`&V{gFN zl;lq@;FtAsl!h;tnOvj z#gYx!q$5MdZ0Jxjy=t*q)HFeeyI-vgaGdh1QNhqGRy8qS)|6S0QK7Gj9R?Co{Knh> za>xkQZ0}bBx!9@EUxRBYGm25^G}&j-`0VWX04E|J!kJ8^WoZ(jbhU_twFwWIH32fv zi=pg~(b#ajW=`)Vikwwe39lpML?|sY$?*6*kYBxku_<=#$gfTqQ_F!9F0=OkHnzBo zEwR!H_h|MNjuG$Tj6zaaouO}HYWCF8vN4C%EX-%Iu%ho;q$G#ErnafhXR*4J2Rp5* zhsi0;wlSwE*inVFO>{(8?N~82zijpt+9Y_-^>xnE%T*zk9gi|j7b@s<5{|qEquUD( zS;-%RySZOCOEh*>!kvbsQ265* z>X8*_Wy&~FB@aDHz%glyiAujXq-|2kDUjFTn9Rafsl+XNyFP%PG|l&ZGWBcEXxy=9 zeDn2PIoVuL$gX0RgVK1O$x3%pOzS7x^U5Pi;mtT)%cY;&e&M7GLM}zP+IPbqLt=^5 z7qLfri8myf;~2psc@^cA6mG&{C%e_(M$$!wC^5p^T1QzrS%I?(U{qcd+oJJkQxe10 zON{Q*?iz%F4MbEsoEc+x3E?&2wVR^v3|Q0lDaMvgS7mNjI{2w! z9|~=!83T%GW*iaChSS!`Xd^beFp9N4%K+k*j#jFumk}U?=WKL_kJAltxnxp~+lZzT zp@&&kSPTg3oSGos`rVBhK0|4NdHM_hnKuw1#0JV{gi_dKDJLB+ix~~HpU9%jD)@YY zOK)L7kgbLyN2%Dx#fuY}8swh4ACk7%BpP-n5(RhDq{gEHP*Fo4IviX{C49|B5h~SC zFr`=0)=h2^F5UpCAgt?R5u{6VvpUf#*nC zCQ`$!|C;L2lpjlG?(>T$(_$O3_YNNbPT~(?!j3aD8k=yu^ogw4bkjvgF|3BOq(hB& zG;^cPXmcUP$ox8zElCJ-zMbK9q^8{rri#8Cek5Ydr0YT-KTh@J z6^AcB9ejew8BY5kzZUZX(7Po==eW<(;uV~E7(BY5c0^xr`cuRwn)47bN?zOb!0?cw z#v}R$z66&m#+AHfo@(^V2#S~bhoUkkTArg+6w>JzZ52r96^({1W!?>4$h0l|-jDfj z>7(<+%67#(A|4hZ3>Y;hd&S?}F;`Vtqz|pK&B>NJ=Faci;gkf-+GmfQR8^zo_vul2 zB!)kfu4Dq_g)8TBBo52*sB6F`qa&JCR=_A$QWgX_K}fZm{Cb2#1q`^S3+WaS>sS#@ z-4k*G=#?z6d_e7JJ+Z8^(t0tNdL{K5F;2nfQbXgld}a(X)Gr;WojOy`^?es~AClT$ z5^lD{WJek0!p-QEH5E7n6DKQ0%_ZBZ=|jfV_MM{VmL8y-Wd|>OmeemP=C@xI@@M~1 zW2S*im@Rc=O>V886_UJ@oh1!2H$Ku&U*Hh_oxd{32)vf1$cRiepv28ricM;}#p!+k zaK{z1I=9Y%3m4|Pj*BD*Fn5Vh?O@oD^1UcjyeNh0fbhh~V6xb#4njlGW8OehUe!MnoR(wn#nsoyL1m!Rov)Nv4~&JEVl7L z#^qYdTpNI#u`N0UbVMiDmD>g2VQcG3>4D6gErgddZnSQTs){BExxRJRB?bIxTdZa z;!S8FHJPPiIDQ*FAUiWSYnjILFjDvxvSC zk z=j4Kx@Pg~&2Z?cmMDa;)#xVeorJrxDBqy{+`kG+ZPQqC@#ku-c3ucU+69$#q_*se` z-H#PFW^>-C0>++|6r=<$Z8)ZFaK=ZjwsNYXqRpl9G|yme@Eld5B-*I69Nx_TResHi z!5nm+>6zaJYQO#%D{~o-oOJ;q`fa5}l!8G*U-E$OM&7@dqciBCWtd}|SrDXz$TB($&m*=Epuolu2k`KUwO7maP3P0ok zmF57lSh0Ba@&sO1iZ5^+3s8{B8t|M;Pg&O+{tZJCiLWd6H@{b~9{CLF9s3Kn zt5)Rs9ejne?o{%f>B$Dl%X7fd~KY)I|(pxUeHj;gNsK6;ZR>`ciu;GxvhDUt!+31Knss2U(%ts8K z18)8;<2ax9RG?!|Lwdt^i5L^&O788roKmVAB)=EdK~HqR2Q=)H_VW}xY=95MP_Ov< zPEz3%DRK}+(aUBwsr83H8>`H^v~|A_t}0vPmRwKPt1{|qOY|PZu}j9+{ZhF&-H_TB zU9xWLpNTc`enI|)h9jQeqf5RfGLFk_vfX`40iMpd%KZF!lKbZTdBw$<^G6nuS+$fT zrbK)xo&;buPJcpOZ=x>n+bRXVFDs(23Xr=rDE&!)pVXZ;;A07NXGl_0m`{Z)DQIu$ zFDvY4xu-ifTe_$|n2B83eI;KUg6pVbw+N!nyLj~wnRi{4mNy{WDV)G1!6$y=+x6U{ z%4_9=Q^L!x_gAYp?J3+u5hA5cO8aHeI=6AC8^S{mzhqCBvBLYEutUC(X0>hKg|AvN zvkmJCQNA45_KjW{aEcyrBppcO6G0zTy%v1&@~+2!n?kA9?>0>AjFN|JdCnHQ8$hEU zw#mwGifHppLP?89LMb(Y3Li9iCPx7W%ek}2FgD2YSzjsR4Xj<=zN{Yo@7s7(k%mP4 znT2p&4EQ@q_chd-E z78uvD*C@oba`U3W2Iw`M#`5C8jOHv8^Li<|j^SI>>>`77Dp71Vtz=J?4Zck4SdRbd zfF}C_>Y(#)r@y!Q0`tMlG#b9>5`fAI$B&tWJfbGlYW$J4V+-s=HH!`+;1XeL@USdx zR0$G&&XBf9lQtkH5)p=U!8J!1{oc4E!N-~Abxl6E;;=3-hMYZ+44?u}zabmCE)yB?*_w91m$n1Yskp&@ z;kxeJX-#ioX^{elyLu~gzx|_KxLpX62MF%Axq3$!Z_P`pBWR?zP8OI`PV~6Aa0Oi0 zv_Ot1m&plf-ZF{e(z(Ms3*S5q$e|j;gOwGrmWsCHfLi(h8y?gc$(2H{884C1FvHQQ12tX=qFUsK~zM!W=K>;zaRsu4Xmcc@8nSs!vK+{ z?}bq}-m&p5jRSam67n>yG9ez=I^|J1O;Np8s=P~9MXYLxD+cFQK7PhG=bkjo{Naae zjp3NWWrlFWDb3Z5D07Q|WjZ=wOQ=aKA%en=O@hL$QCKpIXNZE=InFk|Fhq-&H!6&X z*MVy8=hL7Aw&pQjHrFf27C%3B<>FX{@fOLNhUoxL4*@nY}&M3G*T-p67a zo}~_&yGOB)#vbU|Q3FA8S^X)c-yBlmN(_%}`7Ha3uWFe?>9f=3hlO{^gv~$p`v?vk z_P*r43|(S{%ihs;)YH|jAMpP=-Ms7Ne75_YZZiL3CHVjSU`X1|?Ehh&gA=Xn7W7d@ zf8bM9Y>lG!`PWFDDA9G;x*{1Eh^55u66*9D+-4^dYZ{xXP@?sQLVrY%(azM;C^4FuN7CQ%$!3sr1JL=!Be& zuOZL^bLp$Qo2rL=WDzQIls%s!Go z{s}Q0b#+#8bKga|01t%^9Z=wEsevvXM_{$dCR97ed3@1kX)mtSS!JN^rtqKOj}p~> zfpCI@DX*DqcB6ZnBcl~}sGO~1s$AtfkX6fy3N8*ebvZc*KBW;dA=)?#BE&}-or74i zZUt5;{FBPnkZD8YUXDsx&2LvSziAlec3oc>&Lf1Doc3g?H9{OO_$M4B0qTat0UsWP zTlxUeQ3B;oJ%en4n?zQB6*Fb#wH7`$SQN5GI|=DnJKiYm{?-?#-H;#sIjz7kQ4&VW zN9d1(1$_W~S=<%qDD!mwRytas=eqX^iW}YSx3;wJ#)Xp_`Qk1DFiXac$-3;jQbCif zLA-T_s~5yP@Q@W>pXKl^gipQ>gp@HlBB>WDVpW199;V%?N1`U$ovLE;NI2?|_q2~5 zlg>xT9NADWkv5-*FjS~nP^7$k!N2z?dr!)&l0+4xDK7=-6Rkd$+_^`{bVx!5LgC#N z-dv-k@OlYCEvBfcr1*RsNwcV?QT0bm(q-IyJJ$hm2~mq{6zIn!D20k5)fe(+iM6DJ ze-w_*F|c%@)HREgpRrl@W5;_J5vB4c?UW8~%o0)(A4`%-yNk1(H z5CGuzH(uHQ`&j+IRmTOKoJ?#Ct$+1grR|IitpDGt!~ZdqSJ?cOtw-R=EQ+q4UvclH zdX=xlK-fhQKoKCPBoFAZ*(~11O6-tXo>i0w!T$u{lg!#itEUX3V{$S*naW!C@%rll zS{L(1t%xz(*B`{1NL!*aMc<~fE=g;gXi&Gb$HpD!P)8?JzfN;4F&wv(5HH<=c>>)n z({271)xREH89=C(5YKL{mmJJ_d>qHz;;gTvTlgM*vz9@YTTYZ#%_2A zS0G-t9oMQEpvfv(UjfQ8T$vAHi)zOj3>D*{xSRiu3acc=7cvLyD?_ZObdu$5@b*!y zaZ#u?7uF}SrHVQa=sTOhGW{6WUlq#RhPPm^GsRH#qlX8{Kq-i~98l;eq>KdCnWyKl zUu&UWBqu#Tt9jQ97U4}3)&(p2-eCLznXMEm!>i^EMpeVzPg%p;?@O;dJBQQY(vV;d z3v+-3oTPC!2LTUAx^S2t{v;S_h(EZ^0_dS5g^F*m{TEIy^Qal~%mu3h7*o`jWOH}i ztv8M)3X3a*+ry_KkYXYE4dB0?M|t}#Tp+(}6CQ zBbq;xhoHj}b@j-@koDB#XcCY~>_x&Y;i%MH|3tF^X2h{36UCVfQ-;oEA+4ZkJ`^Qi zQf^8}6eFO$Z+Dj-F1wkG##tTx>FjR2oOXFmbKFj6K3+=kePQ<4d7%z5R5cOB;zO6| zm9^m#U4lcA;7t&*=q|a-!`!)}SgYXT#i8hnxtx@kaoBF$QAS-hT7N5kH^l zB^i+})V>L;9_0Qqf-dyF%ky8Mp-dp#%!Nls3vCt}q3QLM3M-(Zs1k}1bqQ9PVU)U` ztE=?;^6=x}_VD%N@${>qhpkU*)AuUBu_cqYiY&@;O$HV*z@~#Tzh?#=CK`=KwBv+o zh%zu%0xPKYtyC)DaQ zpDW}*86g%>BH3IcWMq`g$j()0kWE(qkIL8A&A0mf&+BzxpKF}=`#jG% z&*wa!&pGFLs5_b#QTZE4Bp+})qzyPQ7B4Z7Y*&?0PSX&|FIR;WBP1|coF9ZeP*$9w z!6aJ_3%Sh=HY3FAt8V144|yfu}IAyYHr1OYKIZ51F>_uY^%N#!k~eU53at-_E-Gh?ahmM5y* z+BTIbeH;%v1}Cjo{8d%UeSMWg(nphxEU`sL< zQR~LrTq>Da(FqSP2%&^1ZL#DTo5Sbl9;&57tQ-@U&I#lj)aNSkcfEJwQD!33?anVU z?pw2q7WtMvfji493`rSFnyp7{w87cW`ak=UEYlk5PCB1K6UDVKXyozOChH4yHh~Q< zv>yvKw6WLfi!PZUx60JZcTNM7jo{ww9b8Q+S7C3WA5&llSwdwh$=Q(*(f3ofqcz=nwOmOy z(J!K=*wNoRU*${{Mbwapi9pTB(&VVKefqd-qrUb9*Eyr2E@oZ9Cgf}Mc;QP<0D)R4 zz=!*^VIG4T*7Xl=sJxrWv9hW^eJ%qYp5(d0?E6LZzJ}=7E+1{?GQA;z+!^VBD81}O z0kJ^dKy&WMw+1+aGVYY-v@i28@Gm+sX5=@U%F=Z?W)oar}2~Rc&F|+3A)n-U2GF10+QdxDb^iA@7eL$c7yhBtL z>lABrh^qy9XZ${E1}Ss5!N4;ig0-pUh6@|RPCHOWvgG{|l}2enRgJftsN%D|ck0YO zuAQd2aMPSyGuJ~jm)aY=+p~mGudw4erwE%P^)5f<*$$2C-4^I=e8-}7##ZQ!8!Tep z+Z_!}CAI~sry$|XK$ktXaxP*x<_ijCPp`2=6sNLZU<@9Sz-rz7^BCE9yh0jV4(I!Z zxmA4d;>B-!vD}Xp*&*N%`b^e&R;D97WS}{~{O-EtXeZNfdf51tw!WR6Noo4hjHPv5 z?heYYRSBPjMc}tFEU^|U8a1CxxK%)WTcn9P%`wR^I$QSeMn6=w>Z9OoVvcrl`zYlZ z2y`mAu0bV(Scc>G_EmIo_4 zm*~h`mxYZC&+U>C5G1FZH5L^U>Cq-9UDRQa35jz&NBj*0{uJKfZs5=Fn@&)Xh6aX(H3w9m9BGLePqVotxTeSPh5-mc7$# z-80t6yB0$Nx<54ohdO*QL7m_(&+#*=eoNiYDB4rE4Cag@qfyZS};Fx;Vf1;oync2k z9v#-w?d6R& zOI`CCS_d=tf3|?g3Z}b6-_Rdg3y~enQhmgkni0Cvf9m6%Ft8r;NC5|b%t&?lkl*4{ z8Ui^;Ds^gq6ti(1xB7y_$zA!i-M~#!!tl$ErTR>P~>T=Yky)8(uvPbvLmB=UfoD zrfl}8<1OQrm?8#j1!?s*T>AoectQl&m!o&*^JcIW`_&bk3tN}k^0rjl=HL$z*uIYt z?7l?^Dqr?q1210Sp$xoAy!&{2^{^Anl460 zI&7urrc&|Y{rjv04VOl{y7c82N6xzg5ueYmQ(q(zC3w_C#x*~%yf5j7MI{W`tsoxzA*PrmK)cTskU| zf2C}Bq$>S$-1JgIh0aW@LxI|-8(OGuD#^M01ghh}&#ObO>tZgSw_LW`zdf&IN$YO# z)|X_9m#JwLW5pErZB3ScggKcNzxA9(hyKkK9I#pR&79&*+SV_eu={00{HF=Bb+AEe znaSof+r1jZ!EL5XgqXWkckaFSSyEk}o!%p8XsD}O>borZ6x%X2b&q!s&1-O(>`kZ$ zB2l^5Cx9xQx9)PXN1xPM)@+LxACH_iZ8zGc(>wnFS_O|@hKsxpMjXOzLEa7OvSlM&&G9ioQw9~RsD4F zK7Q+_&|Q6{eZ^8Rx@pKL`le6kH+(fLc{=V&{b%I5=n}VHV4)X_2Y!pYxgC8wU)yP! zPF3t$?(jsC>Ge=&{kmPGUEETpaw(QTAl)m#{qR3_aq9!wK%6XHfV4C>Y^>Z|%ns7j z{Ja?^IA{+@;kR#IjHxkar%3$eJT4?xNBKUVmoO z`A8Zo-{~_;vcikZ(p}EZzU4kO6WPqkMyE{VvS?;44Z@lj zz^fKX9UL!8Wc(9VgI?P4*zpis8dzl};I>yr1>dtXU=FTAlx}Eht4-*7RACL^AflGh zyZb1hTf(~CkMo%#Q%NMgM9tE2D+)joqbtHYA89Ql1nqVTt+MxZ^*FRd&n5YlIi!8m z>$Ysd!l{+C)y;Wa(ZV-=<+NZKV;v4mt}v2m>`v$-$3b;GsLxf= zd~f(rmfpl``{0aVwN7y!>eGyJFP`L+TxHjHTOS{K^$L2`@6(Rli`{EFwpH@R%eZ6g zwf7rc43Yk!=k;{ z-Rn%~B3amGr}}SxfE$vS8FIPL=Qt57$|R#sSoFgdNUT?fYOYjPl%ZBFpi=jq=DWby7Zxm@y;B<89!9= zbgEH*Uy)~iq5kJLX$+ps$kV`#6jW#|9BGz^`ivNeid(wVbk4jl)VBpW&~;eXNi{#` zwx?{DXR~*sqQcFhY0XCfQ4-*2aN1BGX>$_swtKEqnd>j6vcZ!#0)pXRi?<{!P?tGw z2x_`RD$W)qD{?z}VDPt?+)8*rqLWFIPQ(9-VbBdf{7ff?w9CZ{sIi_gnuC$I0(+P8 zms9XB%}VQ>>pve##}jog6+cD?v~n4Pa9Vmc zg#K$|+`adO=B7`uj35Y}6EZ z{dY`x@w8;R-7zrsr1O_~Jvl*|o-x%jF=Rr1C}GXP^|IYN`1sqmG-oI@R#%X66c#5W z$$tQB)sqwiVm;Y^`Dw3mo|firP{*HsOQJre5%Dm^H@we0FN88VWJ0dja?_U38z73f zrCV!b3qNP0kM#%9T!W5`ynGcg%BL28FW1J-J1_S`BJGCaReQ!am(2%qZ3lLgzq|ns z!!fF@`0=*z)J2BwZ*hO|Yu^cI_nF$9l-Pb3jE7=P8gZ#!xiuZ7-cSa`gb`6mxGTgg z-DLdID?M!Z%+hHB#{?&0$GFRpf+_}q<_wbzX6K?w;%6szz1RbySDSr2r^h_qi$khs zXdZ9A0!_Bf)TR2-^-K~q`FQ!#1x(U4VbV%AA@Ei{%cA(EwC{XfjRi?`&9rav5;Q5% zO1`Rn@OA_ZB@N*mC#)?d3P!}Eh;=NgpIKsy{(yr`hv=aouwt@r&P&}Z3DNWo9ro30 zX52~(aTV$*HHlgB66-4GQru!_AZ|)V*I5X=WG)`N@U&D>e@@C#V@JwEL*L`7#$yes z62C^5%Qniaow2$3HrAc7U{qzpb&FA*xLI1JSWR@`RF=JCcvTI)%dH7;sWInt9JLu# z|Ao|Q?K)cDg_JKsym=joo5gR80wtv01N`um1nQ@Ms0Y*bVzxL34} zo?gizp?`=Y{*W>^Hy2%Jl)y?A+&7s1UVHFixuIy~sawXjcDCL`129cK7|ZQS0u;A} zTJC#WNmqkIrnHpAhHVcM(U^vJA~dl@jf_bs*3?i+=&vuC?Aiy_pcB~=1syDni4 zw+FLuz>F773u#$;NUQ9WDtUPY@+rA3WBhQdKFKOyzkA(URa7;4tW>3jQIfi8v0h3g zJC_HVDXS#>DWb|&se7FHnr=q&l#xg9o02}}u=b-R>@sw={Z zHF*?t2FmhqZ=|qa>x=A!*$S+0T zhO*D*M?NTf-eX`eO)9TIQu{7Dm77Acnj4b1jI9@c*ZL8wL%8kLEhd$KM8=Y!fbN@9 zC7B5#y>JM1n5M)!&im==EgHs2j+xCZG~+~QWCi?s!QyFo2kqx{%jE2n3^N*Ayz6Lp zhg5g^3# z+5FoJ@$u@9WJgPKpUWEd4}4AK9TJKU8W%ms!d0p%OIOX+bY+55zl!vIaz$XFI9Ep+ z;bL_}7PDI2Y`Ng*XY(65 zh0%`@Lve%fc;)N4_g12bNrt6gH=N#OHtxO`$lpWlw=Z6MF+E@;>GkZ#lAZTn`aHwf z&I1|aV#b_VHMIgBN*RzU9i@Z@m}0i>o?({&%fpEfaOpFeaJ7V37;m0?kzd}}Lk@9$ zL}8TEo7WZAcRi%zFZxkr6<0k#X-;lTD`Oc~cDb@olwgWCewvk{GJ}hCXbF!AdiLpd z|Cck$ZTKI?Ack{34Lva7+k=H8K2HTZiurox6F+>dy+@R9T^awxj590D$|kXUg+Ygc z(f)jlRwN(4z$#%PnOVc;#Fv{nAi{#UcXPNcmP#5O{zh_*`=q^JCeia{sN4zHjk2*y zqUVh{Ya{j>SPmP^i#Qfcq_MTqo8g52Fi^F zKBc$$HVI!xFx*4Y9l+nt)$AoZORD}%5I10oI3kx`-N30QueiwIw#0VV2E*Fb-nKW% z=+r^hos`Y-7~{cA1FVbK$_=~*z53+Q8KGjg;>ztg((H12%QTf4OYU8y)C}h5yo#$% z&Q$`vMM*g?ZcatAn2j!hFv8KuN(dw)T*}sF#THDHxo8xC^?vJ zc`U6bVo~hOr6I!8*GTZ<^D~;unKjK=!IR|GB4E>Mcvt*2GK);93jIDd<(nNjHO z4Hi@2^%Uyx=^Z~5eZ!5rO5%4H|eFoNjD#+Kcu%_57zZb4Z@Ak#X6txD^{U3wBl^r+W- zLorkK;uc;NgTj7dGxHQS+@T*T>Q*j4^Ll$ejQqWrwcHyG9y%Mk%m8nBVG5hvSaYm5 zJN^#-Q46kZG)@T8n2^QCjxIwxUVi%s>EY`E?#@_(A~njFrTiDq;8v|W-1jT|ROlNI zU$h|YoD4PVTE^&NC6_m{EAFBVqsM`P*`-AcDGWQygURzM32Xeq2xng~XQsYeTZ5v$ zQLaa2M_Iplw}4eL6fLPu`6`PYcVMysO>`{8CB~glD=TX7?JZcHfHNmykBM?QD)#D) zGp>R*<^D?WhFQKRc^}22l6F=D2RPrxaX2ZF!b1X0XF*d4%=!sbNcS1q2WOUE(7e4$ z^L8f;F)__d3>&KQFE8%$I4h^y5FYBfB&fWzn71_OSrPe-DHV{O#Q;GP z+Tw!J?eVjX19RKH?*hKQWQt8r7B#lYX8xoSHFGCW-*DSQ4EM4M3Mw%gkSYNK18@(e zfzMF}WWaCyS@1y%-~Xg0ry~tkQkUmKuI5lGAua{{vn22V!2T()AU5FpKh@Nv)s^Js zv~@VuUG;=CnLmQR{PeUBQf2;lAV!vG>^Z0N zL88rrjL-*J!43;7C=w9xhcw`yjRKq7o4L9=0SmR9PA-nX12@#h(iIu-0N_xm2OV)( zU_raT0y>$wm^oMi2|U3N;OhF9uy}`<-xVka#DV*l{O0yHzi9vUxa1Qtpi$buR*8cU zd4~lS1pT$L^!0=6qUKOpM+XPsy{f7W#1bjrEwaeN!Ik9(zySIT^pEHvHgJUneFN4) zk=k|$55(g8slmS|@+*4fr2urd3LwjIIZA**g+%l(SZNn4HwQ}y6o`vw>2&mR1X+&q zDa1Af0B;4rAMZMOlHbAqK|R_xuwJ7ANARtFE({-P2o{tJJR<>2KVp)ZK-M;)ejx zd*E~Mka<{OL7%CAhk4n|1qg?97-I!l0rOinjVi#arbgg4bi5;nY5oFL`UWtPk5&L#grSxv zE3!}=1px!ZTLT90aYc^s`~{VojjJml&<`@e41dFP+XU6D0AOkbn2rlI3>^LcqauG& zc$m3Z{!u8LvUrm^fT{qX5yD9{?r(CCiUdck%!T`KIZd2oQJz1joB&M(Teg_>;yS<2-5>BWfSPpG`Rt{!j6>kqMAvl^zk0JUEfy$HVJMkxP-GkwZuxL62me2#pj_5*ZIU zP~#C^OZLfl$HO)v;~~c&JHivn|1I9H5y_CDkt0JLLGKm(4*KLVhJ2jh2#vJuM6`b& zE==-lvME^Oj022xF&IV*? '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..93e3f59 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..096397f --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'coin' diff --git a/src/main/java/com/example/coin/AllCoin.java b/src/main/java/com/example/coin/AllCoin.java new file mode 100644 index 0000000..6bb9998 --- /dev/null +++ b/src/main/java/com/example/coin/AllCoin.java @@ -0,0 +1,101 @@ +package com.example.coin; + +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; +import com.squareup.okhttp.ResponseBody; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.*; + +public class AllCoin { //get 방식으로 api를 호출하는 클래스 + private String URL = ""; + private String data = ""; + private List ans ; + public AllCoin(String url) throws IOException, JSONException { + + + this.URL = url; + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder() + .url(this.URL) + .get() + .build(); + Response response = client.newCall(request).execute(); + ResponseBody body = response.body(); + JSONObject json = new JSONObject(body.string()); + + + this.data = json.get("data").toString(); + } + public String getData(){ + return this.data; + } + public List allCoin() throws IOException, JSONException { // + //모든 코인이름을 불러오는 함수 + JSONObject dataJson = new JSONObject(this.data); + Iterator jsonKeys= dataJson.keys(); //json에 모든 키값들을 불러오는 코드(코인 이름이 키값)-->모든 코인 이름 불러오기 + List coinName = new ArrayList<>(); + while(jsonKeys.hasNext()) + { + String cN = jsonKeys.next().toString(); + coinName.add(cN); // 키 값 저장 + } +// for(int i = 0 ; i> getAllCoinState(List cN) throws JSONException { + List> allCoinState = new ArrayList<>(); + JSONObject dataJson = new JSONObject(this.data); + String [] arr = {"opening_price","max_price","min_price","units_traded", + "fluctate_24H","fluctate_rate_24H","prev_closing_price","closing_price", + "units_traded_24H","acc_trade_value_24H","acc_trade_value"}; + for (int i =0;i temp = new ArrayList<>(); + for (int l =0;l < arr.length;l++){ + temp.add(dJO.get(arr[l]).toString()); + } + allCoinState.add(temp); + }catch (Exception e){ + + } + } + + + return allCoinState; + } + public List> getCandleStick() throws JSONException, IOException { //코인의 일별가격을 리턴하는 함수 + List> ans = new ArrayList<>(); + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder() + .url(this.URL) + .get() + .build(); + Response response = client.newCall(request).execute(); + ResponseBody body = response.body(); + JSONObject json = new JSONObject(body.string()); + JSONArray dataArray= json.getJSONArray("data"); + for(int i = 0 ; i< dataArray.length();i++) { + List tmp = new ArrayList<>(); + tmp.add(dataArray.getJSONArray(i).get(0).toString());//기준시간 + tmp.add(dataArray.getJSONArray(i).get(1).toString());//시가 + tmp.add(dataArray.getJSONArray(i).get(2).toString());//종가 + tmp.add(dataArray.getJSONArray(i).get(3).toString());//고가 + tmp.add(dataArray.getJSONArray(i).get(4).toString());//저가 + tmp.add(dataArray.getJSONArray(i).get(5).toString());//거래량 + ans.add(tmp); + } + return ans; + } + public static void main(String args[]) throws JSONException, IOException { + + } +} diff --git a/src/main/java/com/example/coin/Api_Client.java b/src/main/java/com/example/coin/Api_Client.java new file mode 100644 index 0000000..bfdc265 --- /dev/null +++ b/src/main/java/com/example/coin/Api_Client.java @@ -0,0 +1,258 @@ +package com.example.coin; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.NoSuchAlgorithmException; +import java.util.HashMap; +import java.util.concurrent.TimeUnit; + +import com.fasterxml.jackson.databind.ObjectMapper; +//import org.codehaus.jackson.map.ObjectMapper; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +import com.squareup.okhttp.*; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.binary.Hex; + + + +@SuppressWarnings("unused") +public class Api_Client { + protected String api_url = "https://api.bithumb.com"; + protected String api_key; + protected String api_secret; + + public Api_Client(String api_key, String api_secret) { + this.api_key = api_key; + this.api_secret = api_secret; + } + + /** + * ������ �ð��� ns�� �����Ѵ�.(1/1,000,000,000 ��) + * + * @return int + */ + private String usecTime() { + /* + long start = System.nanoTime(); + // do stuff + long nanoseconds = System.nanoTime(); + long microseconds = TimeUnit.NANOSECONDS.toMicros(nanoseconds); + long seconds = TimeUnit.NANOSECONDS.toSeconds(nanoseconds); + + int elapsedTime = (int) (microseconds + seconds); + + System.out.println("elapsedTime ==> " + microseconds + " : " + seconds); + */ + + return String.valueOf(System.currentTimeMillis()); + } + + private String request(String strHost, String strMemod, HashMap rgParams, HashMap httpHeaders) { + String response = ""; +// String answer = ""; +// OkHttpClient client = new OkHttpClient(); +// try { +// MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); +// RequestBody body = RequestBody.create(mediaType, "currency=BTC"); +// Request request = new Request.Builder() +// .url(strHost) +// .post(body) +// .addHeader("accept", "application/json") +// .addHeader("content-type", "application/x-www-form-urlencoded") +// .addHeader("Api-Key", httpHeaders.get("Api-Key")) +// .addHeader("Api-Nonce", httpHeaders.get("Api-Nonce")) +// .addHeader("Api-Sign", httpHeaders.get("Api-Sign")) +// .build(); +// +// Response response = client.newCall(request).execute(); +// +// answer= response.body().toString(); +// System.out.println(answer); +// }catch (Exception e){ +// System.out.println("오류 :" + e); +// } + + // SSL ���� + if (strHost.startsWith("https://")) { + HttpRequest request = HttpRequest.get(strHost); + // Accept all certificates + request.trustAllCerts(); + // Accept all hostnames + request.trustAllHosts(); + } + + if (strMemod.toUpperCase().equals("HEAD")) { + } else { + HttpRequest request = null; + + // POST/GET ���� + if (strMemod.toUpperCase().equals("POST")) { + + request = new HttpRequest(strHost, "POST"); + request.readTimeout(10000); + + System.out.println("POST ==> " + request.url()); + + if (httpHeaders != null && !httpHeaders.isEmpty()) { + httpHeaders.put("api-client-type", "2"); + request.headers(httpHeaders); + //System.out.println(httpHeaders.toString()); + } + if (rgParams != null && !rgParams.isEmpty()) { + request.form(rgParams); + //System.out.println(rgParams.toString()); + } + } else { + request = HttpRequest.get(strHost + + Util.mapToQueryString(rgParams)); + request.readTimeout(10000); + + //System.out.println("Response was: " + response); + } + + if (request.ok()) { + response = request.body(); + } else { + response = "error : " + request.code() + ", message : " + + request.body(); + } + request.disconnect(); + } + + return response; + //return answer; + } + + public static String encodeURIComponent(String s) + { + String result = null; + + try + { + result = URLEncoder.encode(s, "UTF-8") + .replaceAll("\\+", "%20") + .replaceAll("\\%21", "!") + .replaceAll("\\%27", "'") + .replaceAll("\\%28", "(") + .replaceAll("\\%29", ")") + .replaceAll("\\%26", "&") + .replaceAll("\\%3D", "=") + .replaceAll("\\%7E", "~"); + } + + // This exception should never occur. + catch (UnsupportedEncodingException e) + { + result = s; + } + + return result; + } + + private HashMap getHttpHeaders(String endpoint, HashMap rgData, String apiKey, String apiSecret) { + + String strData = Util.mapToQueryString(rgData).replace("?", ""); + String nNonce = usecTime(); + + strData = strData.substring(0, strData.length()-1); + + + //System.out.println("1 : " + strData); + + strData = encodeURIComponent(strData); + + HashMap array = new HashMap(); + + + String str = endpoint + ";" + strData + ";" + nNonce; + //String str = "/info/balance;order_currency=BTC&payment_currency=KRW&endpoint=%2Finfo%2Fbalance;272184496"; + + String encoded = asHex(hmacSha512(str, apiSecret)); + + //System.out.println("strData was: " + str); + //System.out.println("apiSecret was: " + apiSecret); + array.put("Api-Key", apiKey); + array.put("Api-Sign", encoded); + array.put("Api-Nonce", String.valueOf(nNonce)); + + return array; + + } + + private static final String DEFAULT_ENCODING = "UTF-8"; + private static final String HMAC_SHA512 = "HmacSHA512"; + + public static byte[] hmacSha512(String value, String key){ + try { + SecretKeySpec keySpec = new SecretKeySpec( + key.getBytes(DEFAULT_ENCODING), + HMAC_SHA512); + + Mac mac = Mac.getInstance(HMAC_SHA512); + mac.init(keySpec); + + final byte[] macData = mac.doFinal( value.getBytes( ) ); + byte[] hex = new Hex().encode( macData ); + + //return mac.doFinal(value.getBytes(DEFAULT_ENCODING)); + return hex; + + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } catch (InvalidKeyException e) { + throw new RuntimeException(e); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + public static String asHex(byte[] bytes){ + return new String(Base64.encodeBase64(bytes)); + } + + @SuppressWarnings("unchecked") + public String callApi(String endpoint, HashMap params) { + String rgResultDecode = ""; + HashMap rgParams = new HashMap(); + rgParams.put("endpoint", endpoint); + + if (params != null) { + rgParams.putAll(params); + } + + String api_host = api_url + endpoint; + HashMap httpHeaders = getHttpHeaders(endpoint, rgParams, api_key, api_secret); + try{ + System.out.println(api_host); + rgResultDecode = request(api_host, "POST", rgParams, httpHeaders); + }catch ( Exception e){ + System.out.println("여기"+e); + } + + if (!rgResultDecode.startsWith("error")) { + System.out.println("에러 아님"); + // json �Ľ� + HashMap result; + try { + result = new ObjectMapper().readValue(rgResultDecode, + HashMap.class); + + System.out.println("==== ��� ��� ===="); + System.out.println(result.get("status").toString()); + } catch (IOException e) { + System.out.println("오류 "+e); + } + }else{ + System.out.println("에러"); + } + return rgResultDecode; + } +} diff --git a/src/main/java/com/example/coin/AutoTrading.java b/src/main/java/com/example/coin/AutoTrading.java new file mode 100644 index 0000000..9ccb701 --- /dev/null +++ b/src/main/java/com/example/coin/AutoTrading.java @@ -0,0 +1,159 @@ +package com.example.coin; + +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; +import com.squareup.okhttp.ResponseBody; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.io.IOException; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Random; +import java.util.concurrent.*; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; + +public class AutoTrading { + + private static String key = ""; + private static String sec= ""; + + private static List userData; + private static List coinName; + public AutoTrading(List u,List cN){ + this .userData = u; + this.coinName = cN; + } + public String buy_coin(Api_Client api,String coinName) throws IOException, JSONException { + + String coinPrice = getCoinPrice(coinName); + HashMap rgParams = new HashMap(); + rgParams.put("currency", coinName); + String result1 = api.callApi("/info/balance", rgParams); + //System.out.println(result); + JSONObject json = new JSONObject(result1); + String data = json.getString("data"); //string()쓰기 + + JSONObject json1 = new JSONObject(data); + String total_krw = json1.getString("total_krw").toString(); //보유 자산 구하기 + Double unit = Double.parseDouble(total_krw)/Double.parseDouble(coinPrice)*0.69; + DecimalFormat decimalFormat = new DecimalFormat("#.####"); + + // 잘라내기 + String formattedNumber = decimalFormat.format(unit); + + HashMap rgParams1 = new HashMap(); + rgParams1.put("units", formattedNumber); //소수점 4자리 맞추기 + rgParams1.put("order_currency", coinName); //매수 하려는 코인 이름 + rgParams1.put("payment_currency", "KRW"); // 매수하려는 통화 + String result = api.callApi("/trade/market_buy", rgParams1); + System.out.println("결과"+ result); + return formattedNumber; + } + public void sell_coin(Api_Client api,String coinName,String unit) throws IOException { + try { + HashMap rgParams = new HashMap(); + rgParams.put("units", unit); //소수점 4자리 맞추기 + rgParams.put("order_currency", coinName); //매도 하려는 코인 이름 + rgParams.put("payment_currency", "KRW"); //매도하려는 통화 + String result = api.callApi("/trade/market_sell", rgParams); + }catch (Exception e){ + System.out.println("에러 "+e); + } + } + public List getAsset(Api_Client api_client){ //유저가 가진 코인 불러오기 + List myCoin = new ArrayList<>(); + for(int i= 0;i rgParams = new HashMap(); + rgParams.put("currency", coinName.get(i)); + result = api_client.callApi("/info/balance", rgParams); + //System.out.println(result); + JSONObject json = new JSONObject(result); + String data = json.getString("data"); //string()쓰기 + + JSONObject json1 = new JSONObject(data); + total_krw = json1.getString("total_krw").toString(); //보유 자산 구하기 + total_currency = json1.get("total_" + coinName.get(i).toLowerCase()).toString(); + // System.out.println(total_krw + " " + total_currency); + if (Double.valueOf(total_currency) > 0) { + System.out.println(total_krw + " " + total_currency); + myCoin.add(total_currency); + myCoin.add(coinName.get(i)); + } + } catch (Exception e) { + + } + } + return myCoin; + } + public String getCoinPrice(String coinName) throws IOException, JSONException { + String URL = "https://api.bithumb.com/public/transaction_history/"+coinName+"_KRW"; + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder() + .url(URL) + .get() + .build(); + Response response = client.newCall(request).execute(); + ResponseBody body = response.body(); + JSONObject json = new JSONObject(body.string()); + JSONArray dataArray= json.getJSONArray("data"); + + JSONObject json1 = new JSONObject(dataArray.get(dataArray.length()-1).toString()); + String coinPrice = json1.get("price").toString(); + return coinPrice; + } + public void autoTrade(String name,String key, String sec) throws IOException, JSONException, InterruptedException { + + + Api_Client api_client = new Api_Client(key,sec); + + List userAsset = getAsset(api_client); + for(int i = 0 ;i { + try { + autoTrade(userData.get(idx).getIdentity(),userData.get(idx).getApi_key(),userData.get(idx).getSec_key()); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } + } + public static void main(String[] args) throws InterruptedException { + + } +} diff --git a/src/main/java/com/example/coin/BithumbApi.java b/src/main/java/com/example/coin/BithumbApi.java new file mode 100644 index 0000000..21385ad --- /dev/null +++ b/src/main/java/com/example/coin/BithumbApi.java @@ -0,0 +1,34 @@ +package com.example.coin; + + +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; + +public class BithumbApi { + public String getResponseData(String url) throws IOException { + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder() + .url(url) + .get() + .addHeader("accept", "application/json") + .build(); + Response response = client.newCall(request).execute(); + return response.body().string(); + } + public String currentPrice(String coinName) throws IOException, JSONException { + String closingPrice = ""; + String url = "https://api.bithumb.com/public/ticker/"; + url += coinName; + url+= "_KRW"; + String responseData = getResponseData(url); + JSONObject jsonObject = new JSONObject(responseData); + JSONObject jsonObject2 = new JSONObject(jsonObject.get("data").toString()); + closingPrice = jsonObject2.get("closing_price").toString(); + return closingPrice; + } +} diff --git a/src/main/java/com/example/coin/BoardController.java b/src/main/java/com/example/coin/BoardController.java new file mode 100644 index 0000000..eae394d --- /dev/null +++ b/src/main/java/com/example/coin/BoardController.java @@ -0,0 +1,116 @@ +package com.example.coin; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.json.JSONException; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; + + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Controller +@RequiredArgsConstructor +public class BoardController { + + private final BoardService boardService; + + // 홈 화면 + @GetMapping(value = "home") + public String home(Model model) { + model.addAttribute("contents", boardService.getAllContents()); + return "home"; + } + + // 글 쓰기 화면 + @GetMapping("/content/write") + public String writePage() { + return "write-page"; + } + + // 글 쓰기 + @PostMapping("/content/write") //여기에 유저아이디 불러와야함. 코드삽입완료 + public String writeContent(Content content, HttpServletRequest request) { + HttpSession session = request.getSession(); + content.setWriter(String.valueOf(session.getAttribute("ID")));//로그인한 아이디를 글쓴이로 + LocalDateTime now = LocalDateTime.now(); + String formattedDate = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + content.setUpdateDate(formattedDate); + + boardService.writeContent(content); + return "redirect:/home"; + } + + // 글 보기 화면 + @GetMapping("/content/{id}") + public String showContent(@PathVariable int id, Model model) { + model.addAttribute("content", boardService.getContent(id)); + return "content-page"; + } + + // 글 수정 + @PostMapping("/content/{id}") + public String editContent(@PathVariable int id, Content content, HttpServletRequest request) { + HttpSession session = request.getSession(); + boardService.editContent(id, content.getTexts(), String.valueOf(session.getAttribute("ID"))); + return "redirect:/home"; + } + + // 글 삭제 + @PostMapping("/content/delete/{id}") + public String deleteContent(@PathVariable int id, Content content, HttpServletRequest request) { + HttpSession session = request.getSession(); + boardService.deleteContent(id, String.valueOf(session.getAttribute("ID"))); + return "redirect:/home"; + } + + //댓글 저장 + @PostMapping("/content/addComment/{id}") + public String addComment(@PathVariable int id, HttpServletRequest request, String commentText) { + HttpSession session = request.getSession(); + Comment comment = new Comment(); + comment.setWriter(String.valueOf(session.getAttribute("ID"))); + comment.setText(commentText); + boardService.saveComment(comment, id); + return "redirect:/content/{id}"; + } + //댓글삭제 + @PostMapping("/content/deleteComment/{id}") //comment_id를 받아서 삭제하는 함수 + public String deleteComment(@PathVariable int id, HttpServletRequest request) { + HttpSession session = request.getSession(); + boardService.deleteComment(id, String.valueOf(session.getAttribute("ID"))); + return "redirect:/content/{id}"; + } + + //좋아요 + @PostMapping("/content/like/{id}") + public String likeContent(@PathVariable int id) { + boardService.goodContent(id); + return "redirect:/content/{id}"; + } + +// @GetMapping(value = {"hello"}) +// public void dbtest(){ +// boardService.Testing(); +// Content content= new Content(); +// content=boardService.getContent(3); +// List test=content.getComments(); +// System.out.println(content.getId()+", "+content.getTitle()+", "+content.getTexts()); +// for(int i=0;i getUserTrade(String userId){ + return boardService.getUserTrade(userId); + } + +} \ No newline at end of file diff --git a/src/main/java/com/example/coin/BoardRepository.java b/src/main/java/com/example/coin/BoardRepository.java new file mode 100644 index 0000000..cfdb30f --- /dev/null +++ b/src/main/java/com/example/coin/BoardRepository.java @@ -0,0 +1,131 @@ +package com.example.coin; + +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class BoardRepository { + private final EntityManager EM; + + public void save(Content content) { +// content.setId(++sequence); +// contents.put(content.getId(), content); + EM.persist(content); + } + + public void edit(Content content) { +// contents.put(id, content); +// Content target=EM.find(Content.class,id); + + EM.merge(content); + } + + public void delete(int id) { +// contents.remove(id); + Content content = EM.find(Content.class,id); + if(content!=null){ + EM.remove(content); + } + } + + public List findAll() { +// return new ArrayList<>(contents.values()); +// return EM.createQuery("SELECT c FROM Content c", Content.class).getResultList(); + return new ArrayList<>(EM.createQuery("SELECT c FROM Content c", Content.class).getResultList()); + } + + public Content findById(int id) { +// return contents.get(id); + return EM.find(Content.class,id); + } + + public void registComment(Comment comment, Content content){ + if(content.getComments()==null){ + content.setComments(new ArrayList()); + } + comment.setContent(content); + EM.persist(comment); + + content.getComments().add(comment); + EM.merge(content); + + + +// Content content=new Content(); +// content.setWriter("kmk"); +// content.setTexts("hello this is test"); +// content.setPassword("1234"); +// content.setTitle("test"); +// EM.persist(content); +// +// List test=new ArrayList(); +// +// +// Comment comment=new Comment(); +// comment.setWriter("hello"); +// comment.setText("this is comment test"); +// comment.setContent(content); +// +// test.add(comment); +// +// content.setComments(test); +// content.getComments().add(comment); +// EM.persist(comment); + + } + + public Comment findByCommentId(int id) { +// return contents.get(id); + return EM.find(Comment.class,id); + } + + + //댓글을 삭제하는 함수 content를 받아서 commentList에서 입력받은 comment를 없애자 + public void deleteComment(int comment_id, Content content){ + Comment comment=EM.find(Comment.class,comment_id); + content.getComments().remove(comment); + EM.persist(content); + EM.remove(comment); + } + + public void excelDataSave(TransactionHistory test){ + EM.persist(test); + } + + public List getDatafromExcel(String test){ + return new ArrayList<>(EM.createQuery("SELECT e FROM TransactionHistory e WHERE e.state = :test", TransactionHistory.class) + .setParameter("test", test) + .getResultList()); + } + + public List getExcelByDate(String test,String date1,String date2){ + return new ArrayList<>(EM.createQuery("SELECT e FROM TransactionHistory e WHERE e.state = :test AND e.datetime BETWEEN :date1 AND :date2", TransactionHistory.class) + .setParameter("test", test) + .setParameter("date1", date1) + .setParameter("date2",date2) + .getResultList()); + } + //입력받은 시점까지의 사용한 금액+팔아서 번 금액을 리턴하는 함수 + public List getProfitandLoss(String date,String type){//여기서 조금더 편하게 할 수 있지 않을까? + return new ArrayList<>( + EM.createQuery("SELECT e FROM TransactionHistory e WHERE e.datetime>= :date AND e.state=:type",TransactionHistory.class) + .setParameter("date",date) + .setParameter("type",type) + .getResultList()); + } + + + + public List getUserTrade(String user_id){ + return EM.createQuery("selecet m from transcation_history where m.user=:user_id order by m.coinDate",TransactionHistory.class) + .setParameter("user_id",user_id) + .getResultList(); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/example/coin/BoardService.java b/src/main/java/com/example/coin/BoardService.java new file mode 100644 index 0000000..3a47e63 --- /dev/null +++ b/src/main/java/com/example/coin/BoardService.java @@ -0,0 +1,96 @@ +package com.example.coin; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor +public class BoardService { + private final BoardRepository boardRepository; + + public void writeContent(Content content){ + boardRepository.save(content); + } + + public void editContent(int id, String texts,String user_id){ + Content content= boardRepository.findById(id); + if(!content.getWriter().equals(user_id)){ + return; + } + + content.setTexts(texts); + + LocalDateTime now=LocalDateTime.now(); + String formattedDate=now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + content.setUpdateDate(formattedDate); + + boardRepository.edit(content); + } + + public void deleteContent(int id, String user_id) { + Content content = boardRepository.findById(id); + if(!content.getWriter().equals(user_id)) { + return; + } + boardRepository.delete(id); + } + + public List getAllContents() { + return boardRepository.findAll(); + } + + public Content getContent(int id) { + return boardRepository.findById(id); + } + + public void saveComment(Comment comment, int id){ + boardRepository.registComment(comment, boardRepository.findById(id)); + } + + public void deleteComment(int id, String user_id){ + Comment comment=boardRepository.findByCommentId(id); + if(comment.getWriter().equals(user_id)){ + boardRepository.deleteComment(id,comment.getContent()); + } + } + + public void goodContent(int id) + { + Content content = boardRepository.findById(id); + if(content != null) + { + content.setGood(content.getGood() + 1); + boardRepository.edit(content); + } + } + + + + public void excelDataSave(TransactionHistory t){ + boardRepository.excelDataSave(t); + } + + public List GetexcelData(String type){ + return boardRepository.getDatafromExcel(type); + } + + public List GetDataByDate(String type, String date1, String date2){ + return boardRepository.getExcelByDate(type,date1,date2); + } + + public List requestProftandLoss(String date,String type){ + return boardRepository.getProfitandLoss(date,type); + } + + public List getUserTrade(String user_id){ + return boardRepository.getUserTrade(user_id); + } + + +} diff --git a/src/main/java/com/example/coin/CoinApplication.java b/src/main/java/com/example/coin/CoinApplication.java new file mode 100644 index 0000000..a971383 --- /dev/null +++ b/src/main/java/com/example/coin/CoinApplication.java @@ -0,0 +1,15 @@ +package com.example.coin; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; + +@EnableAsync +@EnableScheduling +@SpringBootApplication +public class CoinApplication { + public static void main(String[] args) { + SpringApplication.run(CoinApplication.class, args); + } +} diff --git a/src/main/java/com/example/coin/CoinInput.java b/src/main/java/com/example/coin/CoinInput.java new file mode 100644 index 0000000..1bf3f74 --- /dev/null +++ b/src/main/java/com/example/coin/CoinInput.java @@ -0,0 +1,12 @@ +package com.example.coin; + +import jakarta.validation.constraints.NotEmpty; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CoinInput { + @NotEmpty(message ="코인이름") + private String coinName; +} diff --git a/src/main/java/com/example/coin/CoinPatternMatcher.java b/src/main/java/com/example/coin/CoinPatternMatcher.java new file mode 100644 index 0000000..c404aa3 --- /dev/null +++ b/src/main/java/com/example/coin/CoinPatternMatcher.java @@ -0,0 +1,145 @@ +package com.example.coin; + + +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +public class CoinPatternMatcher { + + // 변화율 계산 (여러 인자) + public List> calculateChangeRate(List> data) { + List> changeRates = new ArrayList<>(); + for (int i = 0; i < data.size() - 1; i++) { + List rate = new ArrayList<>(); + for (String key : List.of("open", "high", "low", "close", "volume")) { + rate.add(data.get(i + 1).get(key) / data.get(i).get(key)); + } + changeRates.add(rate); + } + return changeRates; + } + + // DTW 유사도 계산 + public double calculateDTWDistance(List> targetPattern, List> candidatePattern) { + int n = targetPattern.size(); + int m = candidatePattern.size(); + double[][] dtw = new double[n + 1][m + 1]; + + for (int i = 0; i <= n; i++) { + Arrays.fill(dtw[i], Double.MAX_VALUE); + } + dtw[0][0] = 0; + + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= m; j++) { + double cost = 0.0; + for (int k = 0; k < targetPattern.get(i - 1).size(); k++) { + cost += Math.abs(targetPattern.get(i - 1).get(k) - candidatePattern.get(j - 1).get(k)); + } + dtw[i][j] = cost + Math.min(dtw[i - 1][j], Math.min(dtw[i][j - 1], dtw[i - 1][j - 1])); + } + } + + return dtw[n][m]; + } + + // 데이터 필터링 + public List> filterData(List> data, String startDate, String endDate, String coinName) { + return data.stream() + .filter(entry -> entry.get("coin").equals(coinName) && + ((String) entry.get("date")).compareTo(startDate) >= 0 && + ((String) entry.get("date")).compareTo(endDate) <= 0) + .collect(Collectors.toList()); + } + + // 메인 로직 + public void findSimilarPatterns(List> data, String startDate, String endDate, String coinName) { + // 사용자 요청 데이터 필터링 + List> targetData = filterData(data, startDate, endDate, coinName); + List> targetValues = targetData.stream() + .map(entry -> Map.of( + "open", (Double) entry.get("open"), + "high", (Double) entry.get("high"), + "low", (Double) entry.get("low"), + "close", (Double) entry.get("close"), + "volume", (Double) entry.get("volume") + )) + .collect(Collectors.toList()); + List> targetPattern = calculateChangeRate(targetValues); + + // 모든 코인 데이터와 비교 + List> results = new ArrayList<>(); + Set coins = data.stream().map(entry -> (String) entry.get("coin")).collect(Collectors.toSet()); + + for (String coin : coins) { + List> coinData = data.stream() + .filter(entry -> entry.get("coin").equals(coin)) + .collect(Collectors.toList()); + + for (int i = 0; i <= coinData.size() - targetValues.size(); i++) { + List> candidateValues = coinData.subList(i, i + targetValues.size()).stream() + .map(entry -> Map.of( + "open", (Double) entry.get("open"), + "high", (Double) entry.get("high"), + "low", (Double) entry.get("low"), + "close", (Double) entry.get("close"), + "volume", (Double) entry.get("volume") + )) + .collect(Collectors.toList()); + List> candidatePattern = calculateChangeRate(candidateValues); + + // DTW 유사도 계산 + double dtwDistance = calculateDTWDistance(targetPattern, candidatePattern); + + // 결과 저장 + Map result = new HashMap<>(); + result.put("coin", coin); + result.put("startDate", coinData.get(i).get("date")); + result.put("endDate", coinData.get(i + targetValues.size() - 1).get("date")); + result.put("distance", dtwDistance); + results.add(result); + } + } + + // 결과 정렬 및 출력 (유사도가 낮은 순으로) + results.sort(Comparator.comparingDouble(r -> (Double) r.get("distance"))); + results.stream().limit(5).forEach(result -> { + System.out.printf("Coin: %s, Period: %s ~ %s, Distance: %.4f%n", + result.get("coin"), + result.get("startDate"), + result.get("endDate"), + result.get("distance")); + }); + } + + // 더미 데이터 생성 + public List> generateDummyData() { + List> data = new ArrayList<>(); + Random random = new Random(); + String[] coins = {"A", "B", "C", "D", "E"}; + LocalDate startDate = LocalDate.of(2024, 1, 1); + + for (int i = 0; i < 100; i++) { + String coin = coins[random.nextInt(coins.length)]; + LocalDate date = startDate.plusDays(random.nextInt(365)); // 2024년 내의 랜덤 날짜 + data.add(Map.of( + "coin", coin, + "date", date.toString(), + "open", random.nextDouble() * 1000 + 10, + "high", random.nextDouble() * 1000 + 20, + "low", random.nextDouble() * 1000 + 5, + "close", random.nextDouble() * 1000 + 10, + "volume", random.nextDouble() * 10000 + 100 + )); + } + return data; + } + + // 실행 예제 + public static void main(String[] args) { + CoinPatternMatcher matcher = new CoinPatternMatcher(); + List> data = matcher.generateDummyData(); + matcher.findSimilarPatterns(data, "2024-06-01", "2024-06-03", "A"); + } +} diff --git a/src/main/java/com/example/coin/CoinPatternMatcherDL4J.java b/src/main/java/com/example/coin/CoinPatternMatcherDL4J.java new file mode 100644 index 0000000..13231ed --- /dev/null +++ b/src/main/java/com/example/coin/CoinPatternMatcherDL4J.java @@ -0,0 +1,113 @@ +//package com.example.coin; +// +//import org.deeplearning4j.nn.api.OptimizationAlgorithm; +//import org.deeplearning4j.nn.conf.MultiLayerConfiguration; +//import org.deeplearning4j.nn.conf.NeuralNetConfiguration; +//import org.deeplearning4j.nn.conf.layers.LSTM; +//import org.deeplearning4j.nn.conf.layers.OutputLayer; +//import org.deeplearning4j.nn.multilayer.MultiLayerNetwork; +//import org.deeplearning4j.nn.weights.WeightInit; +//import org.deeplearning4j.optimize.api.IterationListener; +//import org.nd4j.linalg.activations.Activation; +//import org.nd4j.linalg.dataset.api.iterator.DataSetIterator; +//import org.nd4j.linalg.dataset.api.preprocessor.NormalizerMinMaxScaler; +//import org.nd4j.linalg.dataset.api.preprocessor.NormalizerStandardize; +//import org.nd4j.linalg.lossfunctions.LossFunctions; +//import org.nd4j.linalg.api.ndarray.INDArray; +//import org.nd4j.linalg.factory.Nd4j; +// +//import java.util.*; +// +//public class CoinPatternMatcherDL4J { +// +// // 데이터 준비 +// public static List generateDummyData(int numSamples, int numFeatures) { +// Random random = new Random(); +// List data = new ArrayList<>(); +// +// for (int i = 0; i < numSamples; i++) { +// double[] row = new double[numFeatures]; +// for (int j = 0; j < numFeatures; j++) { +// row[j] = random.nextDouble() * 1000; // Random values for open, high, low, close, volume +// } +// data.add(row); +// } +// return data; +// } +// +// // 모델 구성 +// public static MultiLayerConfiguration createLSTMModel(int inputSize, int outputSize) { +// return new NeuralNetConfiguration.Builder() +// +// .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) +// .weightInit(WeightInit.XAVIER) +// .updater(new org.nd4j.linalg.learning.config.Adam(0.001)) +// .list() +// .layer(0, new LSTM.Builder() +// .nIn(inputSize) +// .nOut(64) +// .activation(Activation.TANH) +// .build()) +// .layer(1, new OutputLayer.Builder(LossFunctions.LossFunction.MSE) +// .nIn(64) +// .nOut(outputSize) +// .activation(Activation.IDENTITY) +// .build()) +// .build(); +// } +// +// // 데이터 전처리 +// public static INDArray preprocessData(List data, int timeSteps) { +// int numSamples = data.size() - timeSteps; +// int numFeatures = data.get(0).length; +// +// INDArray input = Nd4j.create(numSamples, timeSteps, numFeatures); +// for (int i = 0; i < numSamples; i++) { +// for (int j = 0; j < timeSteps; j++) { +// try { +// input.putRow(i, Nd4j.create(data.get(i + j))); +// //Nd4j.create(data.get(i + j)); +// }catch (Exception e){ +// System.out.println("에러 "+e); +// } +// } +// } +// return input; +// } +// +// // 유사도 계산 +// public static double calculateCosineSimilarity(INDArray vec1, INDArray vec2) { +// double dotProduct = vec1.mul(vec2).sumNumber().doubleValue(); +// double norm1 = vec1.norm2Number().doubleValue(); +// double norm2 = vec2.norm2Number().doubleValue(); +// return dotProduct / (norm1 * norm2); +// } +// +// public static void main(String[] args) { +// int numSamples = 1000; // 데이터 샘플 수 +// int numFeatures = 5; // open, high, low, close, volume +// int timeSteps = 10; // 시계열 데이터 길이 +// +// // 1. 데이터 생성 및 전처리 +// List data = generateDummyData(numSamples, numFeatures); +// INDArray input = preprocessData(data, timeSteps); +// +// // 2. 모델 생성 +// MultiLayerConfiguration conf = createLSTMModel(numFeatures, numFeatures); +// MultiLayerNetwork model = new MultiLayerNetwork(conf); +// model.init(); +// +// // 3. 학습 +// // 학습 데이터를 구성하고 모델을 학습시키는 코드를 추가합니다. +// +// // 4. 예측 및 유사도 계산 +// INDArray targetPattern = input.getRow(0); // 예: 첫 번째 패턴을 대상으로 설정 +// INDArray predictions = model.output(input); +// +// for (int i = 0; i < predictions.rows(); i++) { +// INDArray candidatePattern = predictions.getRow(i); +// double similarity = calculateCosineSimilarity(targetPattern, candidatePattern); +// System.out.println("Similarity with pattern " + i + ": " + similarity); +// } +// } +//} diff --git a/src/main/java/com/example/coin/Comment.java b/src/main/java/com/example/coin/Comment.java new file mode 100644 index 0000000..f2ac1ea --- /dev/null +++ b/src/main/java/com/example/coin/Comment.java @@ -0,0 +1,30 @@ +package com.example.coin; + + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class Comment { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long comment_id; + + private String text; + + private String writer; + + @ManyToOne(fetch = FetchType.LAZY) //this is content_id + private Content content; + + public void update(String new_text){ + this.text=new_text; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/coin/Content.java b/src/main/java/com/example/coin/Content.java new file mode 100644 index 0000000..5d20b0c --- /dev/null +++ b/src/main/java/com/example/coin/Content.java @@ -0,0 +1,39 @@ +package com.example.coin; + +import jakarta.persistence.*; +import lombok.*; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +@Table(name = "content") +public class Content { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private int id; + + @Column(name="title") + private String title; + + @Column(name="texts") + private String texts; + + @Column(name="writer") + private String writer; + + @Column(name="updateDate") + private String updateDate; + + @OneToMany(mappedBy = "content", orphanRemoval = true) + private List comments=new ArrayList(); + + @Column(name="good") + private int good = 0; + +} diff --git a/src/main/java/com/example/coin/CreateMemberForm.java b/src/main/java/com/example/coin/CreateMemberForm.java new file mode 100644 index 0000000..1c31a73 --- /dev/null +++ b/src/main/java/com/example/coin/CreateMemberForm.java @@ -0,0 +1,23 @@ +package com.example.coin; + +import jakarta.validation.constraints.NotEmpty; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class CreateMemberForm { + @NotEmpty(message ="아이디를 입력주세요") //DB에서 NotNULL과 비슷힌 기느 + private String makeId; + + @NotEmpty(message ="비밀번호를 입력해주세요") //DB에서 NotNULL과 비슷힌 기느 + private String makePass; + + @NotEmpty(message ="비밀번호를 재입력해주세요") //DB에서 NotNULL과 비슷힌 기느 + private String confirm; + + @NotEmpty + private String api_key; + @NotEmpty + private String sec_key; +} diff --git a/src/main/java/com/example/coin/ExcelController.java b/src/main/java/com/example/coin/ExcelController.java new file mode 100644 index 0000000..09573f5 --- /dev/null +++ b/src/main/java/com/example/coin/ExcelController.java @@ -0,0 +1,209 @@ +package com.example.coin; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import lombok.RequiredArgsConstructor; +import org.apache.commons.io.FilenameUtils; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.json.JSONException; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@RequiredArgsConstructor +public class ExcelController { + private final TransactionHistoryService service; + @GetMapping("/excel") + public String main() { // 1 + return "excelInsert"; + } + + + @PostMapping("/excel/read") + public String readExcel(@RequestParam("file") MultipartFile file, Model model, HttpServletRequest request) + + throws IOException, JSONException { // 2 + + HttpSession session = request.getSession(); + String userId = String.valueOf(session.getAttribute("ID")); + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); // 3 + + if (!extension.equals("xlsx") && !extension.equals("xls")) { + throw new IOException("엑셀파일만 업로드 해주세요."); + } + + Workbook workbook = null; + + if (extension.equals("xlsx")) { + workbook = new XSSFWorkbook(file.getInputStream()); + } else if (extension.equals("xls")) { + workbook = new HSSFWorkbook(file.getInputStream()); + } + + Sheet worksheet = workbook.getSheetAt(0); + List ans = service.getUserTrade(userId); //회원의 거래기록 + Map memo = new HashMap<>();//DB 테이블에 있는 행을 저장함 + System.out.println("총 행 개수: "+worksheet.getPhysicalNumberOfRows()); + long beforeTime = System.currentTimeMillis(); //코드 실행 전에 시간 받아오기 + + for(int i = 0; i2 ; i--) { // + + //한번에 매매(같은 시간에 매매)됬지만 n번으로 분할되어 매매되었을 때 하나로 묶기 + Map > unionDuple = new HashMap<>(); //엑셀데이터에서 같은값 하나로 묶기위해 + // + while (idx >2){ + Row row = worksheet.getRow(idx--); + String coinState = row.getCell(2).getStringCellValue(); + if (coinState.length() ==4){ + if (coinState.substring(2).equals("매수")) { + coinState ="매수"; + } + else if (coinState.substring(2).equals("매도")){ + coinState ="매도"; + } + } + String hashKey = row.getCell(1).getStringCellValue()+ + coinState+ + row.getCell(0).getStringCellValue(); + List mapValues = new ArrayList<>(); + if(memo.containsKey(hashKey)){ //중복된 값이 있으면 넣지 않기 + continue; + } + String coinDate = row.getCell(0).getStringCellValue(); + String coinName = row.getCell(1).getStringCellValue(); + String tempTradeAmount = row.getCell(3).getStringCellValue(); + String tempTradePrice = row.getCell(4).getStringCellValue(); + String fee = row.getCell(6).getStringCellValue(); + String tempAfterPrice = row.getCell(7).getStringCellValue(); + + tempTradeAmount = tempTradeAmount.split(" ")[0].replace(",",""); //거래량 뒤에 krw 문자열 제외 + tempTradePrice = tempTradePrice.split(" ")[0].replace(",",""); //체결가격 뒤에 krw 문자열 제외 + tempAfterPrice = tempAfterPrice.split(" ")[0].replace(",",""); // 정산금약 뒤에 krw 문자열 제외 + mapValues.add(coinDate); //0 + mapValues.add(coinName); //1 + mapValues.add(coinState); //2 + mapValues.add(tempTradeAmount); //3 ! + mapValues.add(tempTradePrice); //4! + mapValues.add(fee); //5 + mapValues.add(tempAfterPrice); //6 ! + if(unionDuple.containsKey(hashKey)){ //중복된 값(같은 매매인데 n번 체결된것) + //값 갱신 해주기 + List temp = unionDuple.get(hashKey); + Double TradeAmount = Double.valueOf(temp.get(3))+ Double.valueOf(mapValues.get(3)); + temp.set(3,String.valueOf(TradeAmount)); + +// Double TradePrice = Double.valueOf(temp.get(4))+Double.valueOf(mapValues.get(4)); +// temp.set(4,String.valueOf(TradePrice)); + Double AfterPrice = 0.0; + if(temp.get(6).substring(0,1).equals("+")){ + + AfterPrice= Double.valueOf(temp.get(6).substring(1))+ + Double.valueOf(mapValues.get(6).substring(1)); + } + else if(temp.get(6).substring(0,1).equals("-")){ + AfterPrice= -Double.valueOf(temp.get(6).substring(1))- + Double.valueOf(mapValues.get(6).substring(1)); + } + if(AfterPrice> 0.0 ){ + temp.set(6,"+"+String.valueOf(AfterPrice)); + + }else if(AfterPrice < 0.0){ + temp.set(6,"-"+String.valueOf(AfterPrice)); + }else { + temp.set(6,"+0"); + } + continue; + } + unionDuple.put(hashKey,mapValues); + } + for(List li : unionDuple.values()){ + TransactionHistory e =new TransactionHistory(); + e.setUser(userId); + e.setCoinDate( li.get(0)); + e.setCoinName( li.get(1)); + e.setState( li.get(2)); //상태 + e.setAmount( li.get(3));//거래수량 + e.setPrice( li.get(4)); //체결가격 + e.setFee( li.get(5)); //수수료 + e.setAfterTrade(li.get(6)); //정산 금액 + service.excelDataSave(e); + } + + List tradeInfo = service.getUserTrade(userId); + List userOwnCoin = new ArrayList<>(); //사용자가 보유한 코인 + //내가 보유한 코인 불러오는 로직 + double trade_cnt = 0.0 ; // 총 매매 횟수 + double win_cnt = 0.0; + for(int indx = 0;indx < tradeInfo.size();indx++ ){ + if(tradeInfo.get(indx).getState().equals("매수")){ + userOwnCoin.add(tradeInfo.get(indx)); + trade_cnt++; + } + else if (tradeInfo.get(indx).getState().equals("매도")) { + for(int i = 0 ; iDouble.valueOf(buyPrice)){ + win_cnt++; + } + userOwnCoin.remove(i); + break; + } + } + } + } + List myCoin = new ArrayList<>(); + Double myAllAsset = 0.0; //내 총자산 (내가 보유한 모든 코인가격 누적합); + for(int i = 0 ; i< userOwnCoin.size();i++){ // + myAllAsset += Double.valueOf(userOwnCoin.get(i).getAmount()) * Double.valueOf(userOwnCoin.get(i).getPrice()); + } +// for(int i = 0 ; i< userOwnCoin.size();i++){ +// myCoin.add(userOwnCoin.get(i).getCoinName()); // +// Double coinAmount = Double.valueOf(userOwnCoin.get(i).getAmount()) * Double.valueOf(userOwnCoin.get(i).getPrice()); +// coinAmount = coinAmount/myAllAsset; +// DecimalFormat decimalFormat = new DecimalFormat("#.#"); //소수점 첫째자리까지만 짜름 +// myCoin.add(decimalFormat.format(coinAmount)); +// } + + + + System.out.println("정답: 승률: " + win_cnt/trade_cnt*100 +"%"); + List user = service.getUserData(userId); + getUserCash uC = new getUserCash(user.get(0).getApi_key(),user.get(0).getSec_key()); + String total_krw = uC.getCash(); //유저가 가진 현금량 + myAllAsset+=Double.valueOf(total_krw); + List userRank = service.getUserRank(userId); + user_rank uR = userRank.get(0); + uR.setWin_rate(String.valueOf(win_cnt/trade_cnt*100)); //승률을 넣는 코드 + uR.setUser_amount(String.valueOf(myAllAsset)); //총자산을 넣는 코드 + service.registUserRanking(uR); //승률, 총자산, 수익률 update하는 코드 + long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + long secDiffTime = (afterTime - beforeTime); //두 시간에 차 계산 + System.out.println("시간차이(m) : "+secDiffTime); + return "redirect:/login"; + } +} diff --git a/src/main/java/com/example/coin/GETNoArgs.java b/src/main/java/com/example/coin/GETNoArgs.java new file mode 100644 index 0000000..7e3da71 --- /dev/null +++ b/src/main/java/com/example/coin/GETNoArgs.java @@ -0,0 +1,102 @@ +package com.example.coin; + + +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; +import com.squareup.okhttp.ResponseBody; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class GETNoArgs { + + public static void main(String[] args) throws IOException, JSONException { + +// String url1 = "https://api.bithumb.com/v1/candles/minutes/1?market=KRW-BTC&count=200"; +// AllCoin allCoin1 = new AllCoin(url1); +// System.out.println(allCoin1.getData()); + OkHttpClient client = new OkHttpClient(); +// String url = "https://api.bithumb.com/v1/market/all?isDetails=false"; +// Request request = new Request.Builder() +// .url(url) +// .get() +// .addHeader("accept", "application/json") +// .build(); +// +// Response response = client.newCall(request).execute(); +// ResponseBody body = response.body(); +// +// JSONArray json = new JSONArray(body.string()); +// for(int i = 0 ;i< json.length();i++){ +// JSONObject jsonObject = new JSONObject(json.get(i).toString()); +// String tempParse[] = jsonObject.getString("market").split("-"); +// System.out.println("coin: "+tempParse[1]); +// } + +// String url = "https://api.bithumb.com/public/ticker/ALL_KRW"; +// AllCoin allCoin = new AllCoin(url); +// JSONArray dataJson = new JSONArray(allCoin.getData()); +// for (int i = 0; i < dataJson.length(); i++) { +// System.out.println(dataJson.get(i)); +// } + + + String state[] = {"1m","3m","5m","10m","15m","30m","1h","4h","6h","12h","24h","1w","1mm"}; + int cnt = 0; + for (String s:state) { + String url = "https://api.bithumb.com/public/candlestick/BTC_KRW/"; + Request request = new Request.Builder() + .url(url+s) + .get() + .addHeader("accept", "application/json") + .build(); + + Response response = client.newCall(request).execute(); + ResponseBody body = response.body(); + JSONObject json = new JSONObject(body.string()); + + JSONArray dataJson = new JSONArray(json.get("data").toString()); + for (int i = 0; i < dataJson.length(); i++) { + cnt ++; + JSONArray rowData = new JSONArray(dataJson.get(i).toString()); + //기준기간,시가,종가,고가,저가,거래량 + System.out.println(rowData.get(0)); + } + } + System.out.println("총개수 : "+ cnt); + + +// Response response = client.newCall(request).execute(); +// String responseBody = response.body().string(); +// JSONArray jsonArray = new JSONArray(responseBody); +// System.out.println("길이: "+jsonArray.length()); +// for (int i = 0 ;i resultMap = new HashMap<>(); +// resultMap.put("market", jsonObject.getString("market")); +// resultMap.put("candle_date_time_utc", jsonObject.getString("candle_date_time_utc")); +// resultMap.put("candle_date_time_kst", jsonObject.getString("candle_date_time_kst")); +// resultMap.put("opening_price", jsonObject.getDouble("opening_price")); +// resultMap.put("high_price", jsonObject.getDouble("high_price")); +// resultMap.put("low_price", jsonObject.getDouble("low_price")); +// resultMap.put("trade_price", jsonObject.getDouble("trade_price")); +// resultMap.put("timestamp", jsonObject.getLong("timestamp")); +// resultMap.put("candle_acc_trade_price", jsonObject.getDouble("candle_acc_trade_price")); +// resultMap.put("candle_acc_trade_volume", jsonObject.getDouble("candle_acc_trade_volume")); +// resultMap.put("unit", jsonObject.getInt("unit")); +// +// // Map 출력 +// System.out.println(resultMap); + } +} diff --git a/src/main/java/com/example/coin/GetMyAccount.java b/src/main/java/com/example/coin/GetMyAccount.java new file mode 100644 index 0000000..831391b --- /dev/null +++ b/src/main/java/com/example/coin/GetMyAccount.java @@ -0,0 +1,45 @@ +package com.example.coin; +import com.auth0.jwt.JWT; +import com.auth0.jwt.algorithms.Algorithm; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; + +import java.nio.charset.StandardCharsets; +import java.util.UUID; + + +public class GetMyAccount { + public static void main(String[] args) { + String accessKey = "e8d62d019ec15f02480fff030e52db42"; + String secretKey = "eddf5053c29a30136cc954f41d49df65"; + + String apiUrl = "https://api.bithumb.com"; + + // Generate access token + Algorithm algorithm = Algorithm.HMAC256(secretKey); + String jwtToken = JWT.create() + .withClaim("access_key", accessKey) + .withClaim("nonce", UUID.randomUUID().toString()) + .withClaim("timestamp", System.currentTimeMillis()) + .sign(algorithm); + String authenticationToken = "Bearer " + jwtToken; + + // Call API + final HttpGet httpRequest = new HttpGet(apiUrl + "/v1/accounts"); + httpRequest.addHeader("Authorization", authenticationToken); + + try (CloseableHttpClient client = HttpClients.createDefault(); + CloseableHttpResponse response = client.execute(httpRequest)) { + // handle to response + int httpStatus = response.getStatusLine().getStatusCode(); + String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); + System.out.println(httpStatus); + System.out.println(responseBody); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/example/coin/GetTransactionHistory.java b/src/main/java/com/example/coin/GetTransactionHistory.java new file mode 100644 index 0000000..d040aee --- /dev/null +++ b/src/main/java/com/example/coin/GetTransactionHistory.java @@ -0,0 +1,440 @@ +package com.example.coin; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; +import com.squareup.okhttp.ResponseBody; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.io.IOException; +import java.util.*; +import java.text.SimpleDateFormat; +import java.util.concurrent.*; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +public class GetTransactionHistory { + + static List answer = new ArrayList<>(); + static List threadList = new ArrayList<>(); + private static CountDownLatch countDownLatch; + private static boolean isLocked = false; + static Thread lockedBy = null; + static int lockedCount = 0; + + //private static Lock lock = new ReentrantLock(); + static Lock lock = new Lock() { + @Override + public synchronized void lock() { + Thread callingThread = Thread.currentThread(); + while (isLocked && lockedBy != callingThread) { + try { + wait(); // 대기 + } catch (Exception e) { + System.out.println("lock: " + e); + } + } + + isLocked = true; + lockedCount++; + lockedBy = callingThread; + } + + @Override + public void lockInterruptibly() throws InterruptedException { + // 인터럽트 가능한 락 + } + + @Override + public boolean tryLock() { + // 락 시도 + return false; + } + + @Override + public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { + // 일정 시간 동안 락 시도 + return false; + } + + @Override + public synchronized void unlock() { + if (Thread.currentThread() == lockedBy) { + lockedCount--; + + if (lockedCount == 0) { + isLocked = false; + notify(); // 락 해제 + } + } + } + + @Override + public Condition newCondition() { + return null; + } + }; + private static String key = ""; + private static String sec= ""; + private static Api_Client api; + + public GetTransactionHistory (String key,String sec,int coinSize){ + this.key = key; + this.sec = sec; + this.api = new Api_Client(key,sec); + this.countDownLatch = new CountDownLatch(coinSize); + } + //빗썸 회원정보를 알려주는 코드 + public String getCoinPrice(String coinName) throws IOException, JSONException { + String URL = "https://api.bithumb.com/public/transaction_history/"+coinName+"_KRW"; + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder() + .url(URL) + .get() + .build(); + Response response = client.newCall(request).execute(); + ResponseBody body = response.body(); + JSONObject json = new JSONObject(body.string()); + JSONArray dataArray= json.getJSONArray("data"); + + JSONObject json1 = new JSONObject(dataArray.get(dataArray.length()-1).toString()); + String coinPrice = json1.get("price").toString(); + return coinPrice; + } + public static String getUserCash (){ + String total_krw = ""; + String result=""; + String apiKey = "e8d62d019ec15f02480fff030e52db42"; + String apiSec = "eddf5053c29a30136cc954f41d49df65"; + Api_Client call_api = new Api_Client(apiKey,apiSec); + try { + + HashMap rgParams = new HashMap(); + rgParams.put("currency", String.valueOf("BTC")); + result = call_api.callApi("/info/balance", rgParams); + + JSONObject json = new JSONObject(result); + String data = json.getString("data"); //string()쓰기 + + JSONObject json1 = new JSONObject(data); + total_krw = json1.getString("total_krw").toString(); + } + catch (Exception e) { + + } + + return total_krw; + } + public static List getUserAsset(String coinName,int i) throws JSONException, IOException { + + List myCoin = new ArrayList<>(); + String result=""; + String total_krw = ""; + String total_currency =""; + try { + + HashMap rgParams = new HashMap(); + rgParams.put("currency", String.valueOf(coinName)); + result = api.callApi("/info/balance", rgParams); + //System.out.println(result); + JSONObject json = new JSONObject(result); + String data = json.getString("data"); //string()쓰기 + + JSONObject json1 = new JSONObject(data); + total_krw = json1.getString("total_krw").toString(); + total_currency = json1.get("total_" + coinName.toLowerCase()).toString(); + // lock.lock(); + }catch (Exception e) { + System.out.println(coinName+".오류" + e+" "+result); +// lock.unlock(); +// countDownLatch.countDown(); + return myCoin; + }finally{ + + if (Double.valueOf(total_currency) > 0.00001) { + //System.out.println("보유한 원화: " + total_krw + " 보유한 " + coinName + ": " + total_currency); + //String coinPrice = getCoinPrice(coinName); + answer.add(coinName); + answer.add(total_currency); + myCoin.add(total_krw); + myCoin.add(coinName); + myCoin.add(total_currency); + } + + } + + + // } + //countDownLatch.countDown(); + return myCoin; + } + public void multiThread (){ + + } + public List executeAnsConcurrently(List coinName) { + // 스레드 풀을 생성합니다. + //ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + ExecutorService executor = Executors.newFixedThreadPool(coinName.size()); + + //executor.setCorePoolSize(coinName.size()); // 스레드 풀의 크기를 설정합니다. 원하는 크기로 조절할 수 있습니다. + System.out.println("전체 코인사이즈: "+ coinName.size()); +// executor.setMaxPoolSize(coinName.size()*2); +// executor.setQueueCapacity(coinName.size()*20); + List> myAsset = new ArrayList<>(); + // 스레드 풀을 초기화합니다. + //executor.initialize(); + try{ + // for (int i = 0; i < coinName.size(); i++) + for (int i = 0; i < 140; i++) { + final String temp = coinName.get(i); + final int num = i; + executor.execute(() -> { + try { + getUserAsset(temp,num); + } catch (JSONException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } );// 함수를 별도의 스레드에서 실행합니다. + } + Thread.sleep(5000); //1초 대기 --> 빗썸 api에서 초당 요청할 수 있는 횟수가 제한적이어서 + for(int i= 140;i { + try { + getUserAsset(temp,num); + } catch (JSONException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } );// 함수를 별도의 스레드에서 실행합니다. + } + }catch (Exception e){ + + } + try { + countDownLatch.await(); // Wait for all threads to finish + } catch (Exception e) { + System.out.println(e); + } +// System.out.println("내 보유코인 " + answer.size()); +// for(int i = 0; i < answer.size();i++){ +// System.out.println(answer.get(i)); +// } + + executor.shutdown(); + return answer; + } + public static Map transactionHistory(){ + String key = "e8d62d019ec15f02480fff030e52db42"; + String sec = "eddf5053c29a30136cc954f41d49df65"; + Api_Client api = new Api_Client(key,sec); + HashMap rgParams = new HashMap(); + //order_currency=QTUM&payment_currency=KRW + rgParams.put("order_currency", "XCN"); + rgParams.put("payment_currency", "KRW"); + String amount=""; + String order_currency=""; + String price=""; + try { + String result = api.callApi("/info/user_transactions", rgParams); + + JSONObject json = new JSONObject(result); + String data = json.get("data").toString(); + //System.out.println("정답"+); + JSONObject answer = new JSONObject(data.substring(1,data.length()-1)); + String search = answer.get("search").toString(); //거래 종류구분(매수,매도 ..등등) + amount = answer.get("amount").toString();//거래금액 + order_currency = answer.get("order_currency").toString();//거래한 코인이름 + price = answer.get("price").toString(); //평단 + Long timestamp = Long.parseLong(answer.get("transfer_date").toString()); + + TimeZone timeZone = TimeZone.getTimeZone("Asia/Seoul"); + Date date = new Date(timestamp); + SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-DD HH:MM:SS"); + //dateFormat.setTimeZone(timeZone); + String formattedDate = dateFormat.format(date); + + + System.out.println(amount); + System.out.println(order_currency); + System.out.println(price); + + } catch (Exception e) { + e.printStackTrace(); + } + Map info = new HashMap(); + info.put("amount",amount); + info.put("order_currency",order_currency); + info.put("price",price); + return info; + } + public static void getUserHistory() throws JSONException, IOException { + String key = "e8d62d019ec15f02480fff030e52db42"; + String sec = "eddf5053c29a30136cc954f41d49df65"; + Api_Client api = new Api_Client(key,sec); + HashMap rgParams = new HashMap(); + ///rgParams.put("units", "1000.0000"); + rgParams.put("order_currency", "XCN"); + //rgParams.put("payment_currency","KRW"); + String result = api.callApi("/info/orders", rgParams); + //System.out.println(result); + JSONObject json = new JSONObject(result); + String data = json.get("message").toString(); + System.out.println(data); + } + public static Map userTradeHistory() throws JSONException, IOException { + String key = "e8d62d019ec15f02480fff030e52db42"; + String sec = "eddf5053c29a30136cc954f41d49df65"; + Api_Client api = new Api_Client(key,sec); + HashMap rgParams = new HashMap(); + rgParams.put("order_currency", "QTUM"); + rgParams.put("order_id", "C0110000000209048652"); + String result = api.callApi("/info/order_detail", rgParams); + System.out.println(result); + JSONObject json = new JSONObject(result); + String data = json.get("data").toString(); + + + Map info = new HashMap(); +// info.put("amount",amount); +// info.put("order_currency",order_currency); +// info.put("price",price); + return info; + } + public static void buy_coin() throws IOException { + String key = "e8d62d019ec15f02480fff030e52db42"; + String sec = "eddf5053c29a30136cc954f41d49df65"; + Api_Client api = new Api_Client(key,sec); + HashMap rgParams = new HashMap(); + rgParams.put("units", "1000.00000"); //소수점 4자리 맞추기 + rgParams.put("order_currency", "LBL"); //매매 하려는 코인 이름 + rgParams.put("payment_currency", "KRW"); // 매매하려는 통화 + String result = api.callApi("/trade/market_buy", rgParams); + System.out.println(result); + } + public static void sell_coin() throws IOException { + Api_Client api = new Api_Client(key,sec); + HashMap rgParams = new HashMap(); + rgParams.put("units", "1000.0000"); //소수점 4자리 맞추기 + rgParams.put("order_currency", "LBL"); //매매 하려는 코인 이름 + rgParams.put("payment_currency", "KRW"); //매매하려는 통화 + String result = api.callApi("/trade/market_sell", rgParams); + } + public static void threadTest() { + lock.lock(); + try { + threadList.add(1); + } finally { + lock.unlock(); + } + } + public static void main(String args[]) throws JSONException, IOException, InterruptedException { +// transactionHistory(); +// getUserHistory(); +// userTradeHistory(); + TransactionHistoryRepository transactionHistoryRepository; + String key = "e8d62d019ec15f02480fff030e52db42"; + String sec = "eddf5053c29a30136cc954f41d49df65"; + int numThreads = Runtime.getRuntime().availableProcessors(); // 사용 가능한 프로세서 수로 스레드 풀 크기 결정 + + ExecutorService executor = Executors.newFixedThreadPool(numThreads*2); //최적의 스레드 풀 개수는? + GetTransactionHistory getTransactionHistory = new GetTransactionHistory(key,sec,200); + String[] coinName = { + "ALEX", "MATIC", "STPT", "VIX", "APT", "STG", "SHIB", "IOTX", "GLM", "FRONT", + "AUDIO", "WLD", "STX", "ZBC", "ZRX", "META", "BSV", "AQT", "IOST", "BCH", + "SUI", "CAKE", "JST", "SUN", "ASTR", "GMT", "BTC", "RSR", "ARB", "GMX", + "BTG", "SEI", "SOFI", "ARK", "MIX", "BTT", "WEMIX", "XPLA", "ONG", "ANKR", + "SUSHI", "ALGO", "FLR", "BIGTIME", "ONT", "T", "CFX", "FLZ", "VELO", "XPR", + "ASM", "SFP", "ZTX", "ACE", "MANA", "JUP", "ACH", "RSS3", "BEL", "MINA", + "CSPR", "TIA", "ACS", "NMR", "STAT", "BIOT", "WOM", "MKR", "WOO", "REI", + "BLUR", "ELF", "ADA", "VALOR", "BFC", "ICX", "REQ", "STORJ", "LOOM", "DOGE", + "SXP", "HBAR", "RVN", "CHR", "ADP", "MLK", "PEPE", "WAVES", "CHZ", "XRP", + "CTSI", "JASMY", "FLOKI", "SAND", "KAVA", "C98", "OSMO", "OCEAN", "EL", "UMA", + "STRAX", "GAL", "GAS", "THETA", "ENJ", "OAS", "ORC", "XCN", "QTCON", "SIX", + "GRT", "TFUEL", "WIKEN", "MASK", "UNI", "AAVE", "FX", "NPT", "CKB", "YFI", + "XTZ", "MOC", "AGI", "EOS", "XEC", "GTC", "UOS", "ENTC", "YGG", "ZIL", + "AXS", "HOOK", "CTXC", "VRA", "FLOW", "COMP", "STEEM", "XVS", "WAXL", "HFT", + "ID", "BORA", "LEVER", "DOT", "1INCH", "CRTS", "AVAX", "FNSA", "AZIT", "MAP", + "FTM", "NCT", "POWR", "KNC", "MAV", "RLC", "ARKM", "BLY", "ATOM", "PENDLE", + "ORBS", "HIVE", "LPT", "BOBA", "WNCG", "MBL", "OBSR", "SNT", "SNX", "RLY", + "RDNT", "MBX", "CON", "COS", "API3", "PYR", "WAXP", "DAI", "SPURS", "ONIT", + "SOL", "DAO", "DAR", "FET", "ETC", "CELR", "OGN", "BNB", "ETH", "NEO", + "KLAY", "CELO", "LRC", "MANTA", "DATE", "LM", "HIGH", "VET", "MTL", "FITFI", + "BNT", "ALT", "USDT", "OXT", "FANC", "POLA", "ILV", "BOA", "GHX", "LBL", + "EDU", "TRX", "NFT", "JOE", "AERGO", "GRACY", "AMO", "ROA", "HIFI", "LSK", + "TEMCO", "MED", "SWAP", "IMX", "EGLD", "USDC", "MVC", "MEV", "PUNDIX", "GRND", + "FXS", "CRO", "PLA", "INJ", "CRV", "EVZ", "DYDX", "FLUX", "AGIX", "RPL", + "LDO", "MAGIC", "ALICE", "XLM", "LINK", "QTUM", "CYBER", "OP", "EGG", "KSM", + "STMX", "RNDR", "BAL", "GALA", "FIT", "CTC", "RAD", "BAT", "DVI", "APE", + "MXC", "SSX", "FCT2", "CTK", "ARPA", "TDROP", "APM", "COTI", "TAVA" + }; + + // Print the array to verify the contents + int idx = 0; +// try { +// CompletableFuture[] futures = Arrays.stream(coinName) +// .map(coin -> CompletableFuture.runAsync(() -> { +// try { +// getTransactionHistory.getUserAsset(coin, 1); +// } catch (Exception e) { +// System.out.println("현재 코인량 조회 중 에러: " + e); +// } +// }, executor)) +// .toArray(CompletableFuture[]::new); +// +// // 모든 작업이 완료될 때까지 기다림 +// CompletableFuture.allOf(futures).join(); +// +// } finally { +// executor.shutdown(); // 작업 완료 후 스레드 풀 종료 +// } + + + for (int i = 0 ; i<1000000;i++) { + executor.submit(() -> { + try { + threadTest(); + } catch (Exception e) { + System.out.println("스레드에러: " + e); + } + }); + + } + executor.shutdown(); + // 모든 작업이 완료될 때까지 대기(매우 매우 중요한 코드 --> 이것이 없으면 스레드 처리 씹힘) + if (executor.awaitTermination(1, java.util.concurrent.TimeUnit.MINUTES)) { + System.out.println("All tasks completed."); + } else { + System.out.println("Timeout occurred before termination."); + } + + // 결과 출력 + System.out.println(threadList.size()); +// +// // 모든 작업이 완료될 때까지 기다린 후 종료 +// executor.shutdown(); +// try { +// if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { +// executor.shutdownNow(); // 시간 초과 시 강제 종료 +// } +// } catch (InterruptedException e) { +// executor.shutdownNow(); +// } + +// for( String ans:answer){ +// System.out.println(ans); +// } + + + // buy_coin(); + //System.out.println(getUserCash()); + } +} diff --git a/src/main/java/com/example/coin/HttpRequest.java b/src/main/java/com/example/coin/HttpRequest.java new file mode 100644 index 0000000..96f0686 --- /dev/null +++ b/src/main/java/com/example/coin/HttpRequest.java @@ -0,0 +1,3306 @@ +package com.example.coin; + + +/* + * Copyright (c) 2014 Kevin Sawicki + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +import static java.net.HttpURLConnection.HTTP_BAD_REQUEST; +import static java.net.HttpURLConnection.HTTP_CREATED; +import static java.net.HttpURLConnection.HTTP_INTERNAL_ERROR; +import static java.net.HttpURLConnection.HTTP_NOT_FOUND; +import static java.net.HttpURLConnection.HTTP_NOT_MODIFIED; +import static java.net.HttpURLConnection.HTTP_NO_CONTENT; +import static java.net.HttpURLConnection.HTTP_OK; +import static java.net.Proxy.Type.HTTP; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.Closeable; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.Flushable; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintStream; +import java.io.Reader; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.MalformedURLException; +import java.net.Proxy; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetEncoder; +import java.security.AccessController; +import java.security.GeneralSecurityException; +import java.security.PrivilegedAction; +import java.security.SecureRandom; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.Callable; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; +import java.util.zip.GZIPInputStream; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +/** + * A fluid interface for making HTTP requests using an underlying + * {@link HttpURLConnection} (or sub-class). + *

+ * Each instance supports making a single request and cannot be reused for + * further requests. + */ +public class HttpRequest { + + /** + * 'UTF-8' charset name + */ + public static final String CHARSET_UTF8 = "UTF-8"; + + /** + * 'application/x-www-form-urlencoded' content type header value + */ + public static final String CONTENT_TYPE_FORM = "application/x-www-form-urlencoded"; + + /** + * 'application/json' content type header value + */ + public static final String CONTENT_TYPE_JSON = "application/json"; + + /** + * 'gzip' encoding header value + */ + public static final String ENCODING_GZIP = "gzip"; + + /** + * 'Accept' header name + */ + public static final String HEADER_ACCEPT = "Accept"; + + /** + * 'Accept-Charset' header name + */ + public static final String HEADER_ACCEPT_CHARSET = "Accept-Charset"; + + /** + * 'Accept-Encoding' header name + */ + public static final String HEADER_ACCEPT_ENCODING = "Accept-Encoding"; + + /** + * 'Authorization' header name + */ + public static final String HEADER_AUTHORIZATION = "Authorization"; + + /** + * 'Cache-Control' header name + */ + public static final String HEADER_CACHE_CONTROL = "Cache-Control"; + + /** + * 'Content-Encoding' header name + */ + public static final String HEADER_CONTENT_ENCODING = "Content-Encoding"; + + /** + * 'Content-Length' header name + */ + public static final String HEADER_CONTENT_LENGTH = "Content-Length"; + + /** + * 'Content-Type' header name + */ + public static final String HEADER_CONTENT_TYPE = "Content-Type"; + + /** + * 'Date' header name + */ + public static final String HEADER_DATE = "Date"; + + /** + * 'ETag' header name + */ + public static final String HEADER_ETAG = "ETag"; + + /** + * 'Expires' header name + */ + public static final String HEADER_EXPIRES = "Expires"; + + /** + * 'If-None-Match' header name + */ + public static final String HEADER_IF_NONE_MATCH = "If-None-Match"; + + /** + * 'Last-Modified' header name + */ + public static final String HEADER_LAST_MODIFIED = "Last-Modified"; + + /** + * 'Location' header name + */ + public static final String HEADER_LOCATION = "Location"; + + /** + * 'Proxy-Authorization' header name + */ + public static final String HEADER_PROXY_AUTHORIZATION = "Proxy-Authorization"; + + /** + * 'Referer' header name + */ + public static final String HEADER_REFERER = "Referer"; + + /** + * 'Server' header name + */ + public static final String HEADER_SERVER = "Server"; + + /** + * 'User-Agent' header name + */ + public static final String HEADER_USER_AGENT = "User-Agent"; + + /** + * 'DELETE' request method + */ + public static final String METHOD_DELETE = "DELETE"; + + /** + * 'GET' request method + */ + public static final String METHOD_GET = "GET"; + + /** + * 'HEAD' request method + */ + public static final String METHOD_HEAD = "HEAD"; + + /** + * 'OPTIONS' options method + */ + public static final String METHOD_OPTIONS = "OPTIONS"; + + /** + * 'POST' request method + */ + public static final String METHOD_POST = "POST"; + + /** + * 'PUT' request method + */ + public static final String METHOD_PUT = "PUT"; + + /** + * 'TRACE' request method + */ + public static final String METHOD_TRACE = "TRACE"; + + /** + * 'charset' header value parameter + */ + public static final String PARAM_CHARSET = "charset"; + + private static final String BOUNDARY = "00content0boundary00"; + + private static final String CONTENT_TYPE_MULTIPART = "multipart/form-data; boundary=" + + BOUNDARY; + + private static final String CRLF = "\r\n"; + + private static final String[] EMPTY_STRINGS = new String[0]; + + private static SSLSocketFactory TRUSTED_FACTORY; + + private static HostnameVerifier TRUSTED_VERIFIER; + + private static String getValidCharset(final String charset) { + if (charset != null && charset.length() > 0) + return charset; + else + return CHARSET_UTF8; + } + + private static SSLSocketFactory getTrustedFactory() + throws HttpRequestException { + if (TRUSTED_FACTORY == null) { + final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { + + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + + public void checkClientTrusted(X509Certificate[] chain, + String authType) { + // Intentionally left blank + } + + public void checkServerTrusted(X509Certificate[] chain, + String authType) { + // Intentionally left blank + } + } }; + try { + SSLContext context = SSLContext.getInstance("TLS"); + context.init(null, trustAllCerts, new SecureRandom()); + TRUSTED_FACTORY = context.getSocketFactory(); + } catch (GeneralSecurityException e) { + IOException ioException = new IOException( + "Security exception configuring SSL context"); + ioException.initCause(e); + throw new HttpRequestException(ioException); + } + } + + return TRUSTED_FACTORY; + } + + private static HostnameVerifier getTrustedVerifier() { + if (TRUSTED_VERIFIER == null) + TRUSTED_VERIFIER = new HostnameVerifier() { + + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + + return TRUSTED_VERIFIER; + } + + private static StringBuilder addPathSeparator(final String baseUrl, + final StringBuilder result) { + // Add trailing slash if the base URL doesn't have any path segments. + // + // The following test is checking for the last slash not being part of + // the protocol to host separator: '://'. + if (baseUrl.indexOf(':') + 2 == baseUrl.lastIndexOf('/')) + result.append('/'); + return result; + } + + private static StringBuilder addParamPrefix(final String baseUrl, + final StringBuilder result) { + // Add '?' if missing and add '&' if params already exist in base url + final int queryStart = baseUrl.indexOf('?'); + final int lastChar = result.length() - 1; + if (queryStart == -1) + result.append('?'); + else if (queryStart < lastChar && baseUrl.charAt(lastChar) != '&') + result.append('&'); + return result; + } + + private static StringBuilder addParam(final Object key, Object value, + final StringBuilder result) { + if (value != null && value.getClass().isArray()) + value = arrayToList(value); + + if (value instanceof Iterable) { + Iterator iterator = ((Iterable) value).iterator(); + while (iterator.hasNext()) { + result.append(key); + result.append("[]="); + Object element = iterator.next(); + if (element != null) + result.append(element); + if (iterator.hasNext()) + result.append("&"); + } + } else { + result.append(key); + result.append("="); + if (value != null) + result.append(value); + } + + return result; + } + + /** + * Creates {@link HttpURLConnection HTTP connections} for {@link URL urls}. + */ + public interface ConnectionFactory { + /** + * Open an {@link HttpURLConnection} for the specified {@link URL}. + * + * @throws IOException + */ + HttpURLConnection create(URL url) throws IOException; + + /** + * Open an {@link HttpURLConnection} for the specified {@link URL} and + * {@link Proxy}. + * + * @throws IOException + */ + HttpURLConnection create(URL url, Proxy proxy) throws IOException; + + /** + * A {@link ConnectionFactory} which uses the built-in + * {@link URL#openConnection()} + */ + ConnectionFactory DEFAULT = new ConnectionFactory() { + public HttpURLConnection create(URL url) throws IOException { + return (HttpURLConnection) url.openConnection(); + } + + public HttpURLConnection create(URL url, Proxy proxy) + throws IOException { + return (HttpURLConnection) url.openConnection(proxy); + } + }; + } + + private static ConnectionFactory CONNECTION_FACTORY = ConnectionFactory.DEFAULT; + + /** + * Specify the {@link ConnectionFactory} used to create new requests. + */ + public static void setConnectionFactory( + final ConnectionFactory connectionFactory) { + if (connectionFactory == null) + CONNECTION_FACTORY = ConnectionFactory.DEFAULT; + else + CONNECTION_FACTORY = connectionFactory; + } + + /** + * Callback interface for reporting upload progress for a request. + */ + public interface UploadProgress { + /** + * Callback invoked as data is uploaded by the request. + * + * @param uploaded + * The number of bytes already uploaded + * @param total + * The total number of bytes that will be uploaded or -1 if + * the length is unknown. + */ + void onUpload(long uploaded, long total); + + UploadProgress DEFAULT = new UploadProgress() { + public void onUpload(long uploaded, long total) { + } + }; + } + + /** + *

+ * Encodes and decodes to and from Base64 notation. + *

+ *

+ * I am placing this code in the Public Domain. Do with it as you will. This + * software comes with no guarantees or warranties but with plenty of + * well-wishing instead! Please visit http://iharder.net/base64 + * periodically to check for updates or to contribute improvements. + *

+ * + * @author Robert Harder + * @author rob@iharder.net + * @version 2.3.7 + */ + public static class Base64 { + + /** The equals sign (=) as a byte. */ + private final static byte EQUALS_SIGN = (byte) '='; + + /** Preferred encoding. */ + private final static String PREFERRED_ENCODING = "US-ASCII"; + + /** The 64 valid Base64 values. */ + private final static byte[] _STANDARD_ALPHABET = { (byte) 'A', + (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F', + (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K', + (byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O', (byte) 'P', + (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U', + (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z', + (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', + (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j', + (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o', + (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's', (byte) 't', + (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x', (byte) 'y', + (byte) 'z', (byte) '0', (byte) '1', (byte) '2', (byte) '3', + (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', + (byte) '9', (byte) '+', (byte) '/' }; + + /** Defeats instantiation. */ + private Base64() { + } + + /** + *

+ * Encodes up to three bytes of the array source and writes + * the resulting four Base64 bytes to destination. The source + * and destination arrays can be manipulated anywhere along their length + * by specifying srcOffset and destOffset. This + * method does not check to make sure your arrays are large enough to + * accomodate srcOffset + 3 for the source array + * or destOffset + 4 for the destination array. + * The actual number of significant bytes in your array is given by + * numSigBytes. + *

+ *

+ * This is the lowest level of the encoding methods with all possible + * parameters. + *

+ * + * @param source + * the array to convert + * @param srcOffset + * the index where conversion begins + * @param numSigBytes + * the number of significant bytes in your array + * @param destination + * the array to hold the conversion + * @param destOffset + * the index where output will be put + * @return the destination array + * @since 1.3 + */ + private static byte[] encode3to4(byte[] source, int srcOffset, + int numSigBytes, byte[] destination, int destOffset) { + + byte[] ALPHABET = _STANDARD_ALPHABET; + + int inBuff = (numSigBytes > 0 ? ((source[srcOffset] << 24) >>> 8) + : 0) + | (numSigBytes > 1 ? ((source[srcOffset + 1] << 24) >>> 16) + : 0) + | (numSigBytes > 2 ? ((source[srcOffset + 2] << 24) >>> 24) + : 0); + + switch (numSigBytes) { + case 3: + destination[destOffset] = ALPHABET[(inBuff >>> 18)]; + destination[destOffset + 1] = ALPHABET[(inBuff >>> 12) & 0x3f]; + destination[destOffset + 2] = ALPHABET[(inBuff >>> 6) & 0x3f]; + destination[destOffset + 3] = ALPHABET[(inBuff) & 0x3f]; + return destination; + + case 2: + destination[destOffset] = ALPHABET[(inBuff >>> 18)]; + destination[destOffset + 1] = ALPHABET[(inBuff >>> 12) & 0x3f]; + destination[destOffset + 2] = ALPHABET[(inBuff >>> 6) & 0x3f]; + destination[destOffset + 3] = EQUALS_SIGN; + return destination; + + case 1: + destination[destOffset] = ALPHABET[(inBuff >>> 18)]; + destination[destOffset + 1] = ALPHABET[(inBuff >>> 12) & 0x3f]; + destination[destOffset + 2] = EQUALS_SIGN; + destination[destOffset + 3] = EQUALS_SIGN; + return destination; + + default: + return destination; + } + } + + /** + * Encode string as a byte array in Base64 annotation. + * + * @param string + * @return The Base64-encoded data as a string + */ + public static String encode(String string) { + byte[] bytes; + try { + bytes = string.getBytes(PREFERRED_ENCODING); + } catch (UnsupportedEncodingException e) { + bytes = string.getBytes(); + } + return encodeBytes(bytes); + } + + /** + * Encodes a byte array into Base64 notation. + * + * @param source + * The data to convert + * @return The Base64-encoded data as a String + * @throws NullPointerException + * if source array is null + * @throws IllegalArgumentException + * if source array, offset, or length are invalid + * @since 2.0 + */ + public static String encodeBytes(byte[] source) { + return encodeBytes(source, 0, source.length); + } + + /** + * Encodes a byte array into Base64 notation. + * + * @param source + * The data to convert + * @param off + * Offset in array where conversion should begin + * @param len + * Length of data to convert + * @return The Base64-encoded data as a String + * @throws NullPointerException + * if source array is null + * @throws IllegalArgumentException + * if source array, offset, or length are invalid + * @since 2.0 + */ + public static String encodeBytes(byte[] source, int off, int len) { + byte[] encoded = encodeBytesToBytes(source, off, len); + try { + return new String(encoded, PREFERRED_ENCODING); + } catch (UnsupportedEncodingException uue) { + return new String(encoded); + } + } + + /** + * Similar to {@link #encodeBytes(byte[], int, int)} but returns a byte + * array instead of instantiating a String. This is more efficient if + * you're working with I/O streams and have large data sets to encode. + * + * + * @param source + * The data to convert + * @param off + * Offset in array where conversion should begin + * @param len + * Length of data to convert + * @return The Base64-encoded data as a String if there is an error + * @throws NullPointerException + * if source array is null + * @throws IllegalArgumentException + * if source array, offset, or length are invalid + * @since 2.3.1 + */ + public static byte[] encodeBytesToBytes(byte[] source, int off, int len) { + + if (source == null) + throw new NullPointerException("Cannot serialize a null array."); + + if (off < 0) + throw new IllegalArgumentException( + "Cannot have negative offset: " + off); + + if (len < 0) + throw new IllegalArgumentException( + "Cannot have length offset: " + len); + + if (off + len > source.length) + throw new IllegalArgumentException( + String.format( + "Cannot have offset of %d and length of %d with array of length %d", + off, len, source.length)); + + // Bytes needed for actual encoding + int encLen = (len / 3) * 4 + (len % 3 > 0 ? 4 : 0); + + byte[] outBuff = new byte[encLen]; + + int d = 0; + int e = 0; + int len2 = len - 2; + for (; d < len2; d += 3, e += 4) + encode3to4(source, d + off, 3, outBuff, e); + + if (d < len) { + encode3to4(source, d + off, len - d, outBuff, e); + e += 4; + } + + if (e <= outBuff.length - 1) { + byte[] finalOut = new byte[e]; + System.arraycopy(outBuff, 0, finalOut, 0, e); + return finalOut; + } else + return outBuff; + } + } + + /** + * HTTP request exception whose cause is always an {@link IOException} + */ + public static class HttpRequestException extends RuntimeException { + + private static final long serialVersionUID = -1170466989781746231L; + + /** + * Create a new HttpRequestException with the given cause + * + * @param cause + */ + public HttpRequestException(final IOException cause) { + super(cause); + } + + /** + * Get {@link IOException} that triggered this request exception + * + * @return {@link IOException} cause + */ + @Override + public IOException getCause() { + return (IOException) super.getCause(); + } + } + + /** + * Operation that handles executing a callback once complete and handling + * nested exceptions + * + * @param + */ + protected static abstract class Operation implements Callable { + + /** + * Run operation + * + * @return result + * @throws HttpRequestException + * @throws IOException + */ + protected abstract V run() throws HttpRequestException, IOException; + + /** + * Operation complete callback + * + * @throws IOException + */ + protected abstract void done() throws IOException; + + public V call() throws HttpRequestException { + boolean thrown = false; + try { + return run(); + } catch (HttpRequestException e) { + thrown = true; + throw e; + } catch (IOException e) { + thrown = true; + throw new HttpRequestException(e); + } finally { + try { + done(); + } catch (IOException e) { + if (!thrown) + throw new HttpRequestException(e); + } + } + } + } + + /** + * Class that ensures a {@link Closeable} gets closed with proper exception + * handling. + * + * @param + */ + protected static abstract class CloseOperation extends Operation { + + private final Closeable closeable; + + private final boolean ignoreCloseExceptions; + + /** + * Create closer for operation + * + * @param closeable + * @param ignoreCloseExceptions + */ + protected CloseOperation(final Closeable closeable, + final boolean ignoreCloseExceptions) { + this.closeable = closeable; + this.ignoreCloseExceptions = ignoreCloseExceptions; + } + + @Override + protected void done() throws IOException { + if (closeable instanceof Flushable) + ((Flushable) closeable).flush(); + if (ignoreCloseExceptions) + try { + closeable.close(); + } catch (IOException e) { + // Ignored + } + else + closeable.close(); + } + } + + /** + * Class that and ensures a {@link Flushable} gets flushed with proper + * exception handling. + * + * @param + */ + protected static abstract class FlushOperation extends Operation { + + private final Flushable flushable; + + /** + * Create flush operation + * + * @param flushable + */ + protected FlushOperation(final Flushable flushable) { + this.flushable = flushable; + } + + @Override + protected void done() throws IOException { + flushable.flush(); + } + } + + /** + * Request output stream + */ + public static class RequestOutputStream extends BufferedOutputStream { + + private final CharsetEncoder encoder; + + /** + * Create request output stream + * + * @param stream + * @param charset + * @param bufferSize + */ + public RequestOutputStream(final OutputStream stream, + final String charset, final int bufferSize) { + super(stream, bufferSize); + + encoder = Charset.forName(getValidCharset(charset)).newEncoder(); + } + + /** + * Write string to stream + * + * @param value + * @return this stream + * @throws IOException + */ + public RequestOutputStream write(final String value) throws IOException { + final ByteBuffer bytes = encoder.encode(CharBuffer.wrap(value)); + + super.write(bytes.array(), 0, bytes.limit()); + + return this; + } + } + + /** + * Represents array of any type as list of objects so we can easily iterate + * over it + * + * @param array + * of elements + * @return list with the same elements + */ + private static List arrayToList(final Object array) { + if (array instanceof Object[]) + return Arrays.asList((Object[]) array); + + List result = new ArrayList(); + // Arrays of the primitive types can't be cast to array of Object, so + // this: + if (array instanceof int[]) + for (int value : (int[]) array) + result.add(value); + else if (array instanceof boolean[]) + for (boolean value : (boolean[]) array) + result.add(value); + else if (array instanceof long[]) + for (long value : (long[]) array) + result.add(value); + else if (array instanceof float[]) + for (float value : (float[]) array) + result.add(value); + else if (array instanceof double[]) + for (double value : (double[]) array) + result.add(value); + else if (array instanceof short[]) + for (short value : (short[]) array) + result.add(value); + else if (array instanceof byte[]) + for (byte value : (byte[]) array) + result.add(value); + else if (array instanceof char[]) + for (char value : (char[]) array) + result.add(value); + return result; + } + + /** + * Encode the given URL as an ASCII {@link String} + *

+ * This method ensures the path and query segments of the URL are properly + * encoded such as ' ' characters being encoded to '%20' or any UTF-8 + * characters that are non-ASCII. No encoding of URLs is done by default by + * the {@link HttpRequest} constructors and so if URL encoding is needed + * this method should be called before calling the {@link HttpRequest} + * constructor. + * + * @param url + * @return encoded URL + * @throws HttpRequestException + */ + public static String encode(final CharSequence url) + throws HttpRequestException { + URL parsed; + try { + parsed = new URL(url.toString()); + } catch (IOException e) { + throw new HttpRequestException(e); + } + + String host = parsed.getHost(); + int port = parsed.getPort(); + if (port != -1) + host = host + ':' + Integer.toString(port); + + try { + String encoded = new URI(parsed.getProtocol(), host, + parsed.getPath(), parsed.getQuery(), null).toASCIIString(); + int paramsStart = encoded.indexOf('?'); + if (paramsStart > 0 && paramsStart + 1 < encoded.length()) + encoded = encoded.substring(0, paramsStart + 1) + + encoded.substring(paramsStart + 1) + .replace("+", "%2B"); + return encoded; + } catch (URISyntaxException e) { + IOException io = new IOException("Parsing URI failed"); + io.initCause(e); + throw new HttpRequestException(io); + } + } + + /** + * Append given map as query parameters to the base URL + *

+ * Each map entry's key will be a parameter name and the value's + * {@link Object#toString()} will be the parameter value. + * + * @param url + * @param params + * @return URL with appended query params + */ + public static String append(final CharSequence url, final Map params) { + final String baseUrl = url.toString(); + if (params == null || params.isEmpty()) + return baseUrl; + + final StringBuilder result = new StringBuilder(baseUrl); + + addPathSeparator(baseUrl, result); + addParamPrefix(baseUrl, result); + + Entry entry; + Iterator iterator = params.entrySet().iterator(); + entry = (Entry) iterator.next(); + addParam(entry.getKey().toString(), entry.getValue(), result); + + while (iterator.hasNext()) { + result.append('&'); + entry = (Entry) iterator.next(); + addParam(entry.getKey().toString(), entry.getValue(), result); + } + + return result.toString(); + } + + /** + * Append given name/value pairs as query parameters to the base URL + *

+ * The params argument is interpreted as a sequence of name/value pairs so + * the given number of params must be divisible by 2. + * + * @param url + * @param params + * name/value pairs + * @return URL with appended query params + */ + public static String append(final CharSequence url, final Object... params) { + final String baseUrl = url.toString(); + if (params == null || params.length == 0) + return baseUrl; + + if (params.length % 2 != 0) + throw new IllegalArgumentException( + "Must specify an even number of parameter names/values"); + + final StringBuilder result = new StringBuilder(baseUrl); + + addPathSeparator(baseUrl, result); + addParamPrefix(baseUrl, result); + + addParam(params[0], params[1], result); + + for (int i = 2; i < params.length; i += 2) { + result.append('&'); + addParam(params[i], params[i + 1], result); + } + + return result.toString(); + } + + /** + * Start a 'GET' request to the given URL + * + * @param url + * @return request + * @throws HttpRequestException + */ + public static HttpRequest get(final CharSequence url) + throws HttpRequestException { + return new HttpRequest(url, METHOD_GET); + } + + /** + * Start a 'GET' request to the given URL + * + * @param url + * @return request + * @throws HttpRequestException + */ + public static HttpRequest get(final URL url) throws HttpRequestException { + return new HttpRequest(url, METHOD_GET); + } + + /** + * Start a 'GET' request to the given URL along with the query params + * + * @param baseUrl + * @param params + * The query parameters to include as part of the baseUrl + * @param encode + * true to encode the full URL + * + * @see #append(CharSequence, Map) + * @see #encode(CharSequence) + * + * @return request + */ + public static HttpRequest get(final CharSequence baseUrl, + final Map params, final boolean encode) { + String url = append(baseUrl, params); + return get(encode ? encode(url) : url); + } + + /** + * Start a 'GET' request to the given URL along with the query params + * + * @param baseUrl + * @param encode + * true to encode the full URL + * @param params + * the name/value query parameter pairs to include as part of the + * baseUrl + * + * @see #append(CharSequence, Object...) + * @see #encode(CharSequence) + * + * @return request + */ + public static HttpRequest get(final CharSequence baseUrl, + final boolean encode, final Object... params) { + String url = append(baseUrl, params); + return get(encode ? encode(url) : url); + } + + /** + * Start a 'POST' request to the given URL + * + * @param url + * @return request + * @throws HttpRequestException + */ + public static HttpRequest post(final CharSequence url) + throws HttpRequestException { + return new HttpRequest(url, METHOD_POST); + } + + /** + * Start a 'POST' request to the given URL + * + * @param url + * @return request + * @throws HttpRequestException + */ + public static HttpRequest post(final URL url) throws HttpRequestException { + return new HttpRequest(url, METHOD_POST); + } + + /** + * Start a 'POST' request to the given URL along with the query params + * + * @param baseUrl + * @param params + * the query parameters to include as part of the baseUrl + * @param encode + * true to encode the full URL + * + * @see #append(CharSequence, Map) + * @see #encode(CharSequence) + * + * @return request + */ + public static HttpRequest post(final CharSequence baseUrl, + final Map params, final boolean encode) { + String url = append(baseUrl, params); + return post(encode ? encode(url) : url); + } + + /** + * Start a 'POST' request to the given URL along with the query params + * + * @param baseUrl + * @param encode + * true to encode the full URL + * @param params + * the name/value query parameter pairs to include as part of the + * baseUrl + * + * @see #append(CharSequence, Object...) + * @see #encode(CharSequence) + * + * @return request + */ + public static HttpRequest post(final CharSequence baseUrl, + final boolean encode, final Object... params) { + String url = append(baseUrl, params); + return post(encode ? encode(url) : url); + } + + /** + * Start a 'PUT' request to the given URL + * + * @param url + * @return request + * @throws HttpRequestException + */ + public static HttpRequest put(final CharSequence url) + throws HttpRequestException { + return new HttpRequest(url, METHOD_PUT); + } + + /** + * Start a 'PUT' request to the given URL + * + * @param url + * @return request + * @throws HttpRequestException + */ + public static HttpRequest put(final URL url) throws HttpRequestException { + return new HttpRequest(url, METHOD_PUT); + } + + /** + * Start a 'PUT' request to the given URL along with the query params + * + * @param baseUrl + * @param params + * the query parameters to include as part of the baseUrl + * @param encode + * true to encode the full URL + * + * @see #append(CharSequence, Map) + * @see #encode(CharSequence) + * + * @return request + */ + public static HttpRequest put(final CharSequence baseUrl, + final Map params, final boolean encode) { + String url = append(baseUrl, params); + return put(encode ? encode(url) : url); + } + + /** + * Start a 'PUT' request to the given URL along with the query params + * + * @param baseUrl + * @param encode + * true to encode the full URL + * @param params + * the name/value query parameter pairs to include as part of the + * baseUrl + * + * @see #append(CharSequence, Object...) + * @see #encode(CharSequence) + * + * @return request + */ + public static HttpRequest put(final CharSequence baseUrl, + final boolean encode, final Object... params) { + String url = append(baseUrl, params); + return put(encode ? encode(url) : url); + } + + /** + * Start a 'DELETE' request to the given URL + * + * @param url + * @return request + * @throws HttpRequestException + */ + public static HttpRequest delete(final CharSequence url) + throws HttpRequestException { + return new HttpRequest(url, METHOD_DELETE); + } + + /** + * Start a 'DELETE' request to the given URL + * + * @param url + * @return request + * @throws HttpRequestException + */ + public static HttpRequest delete(final URL url) throws HttpRequestException { + return new HttpRequest(url, METHOD_DELETE); + } + + /** + * Start a 'DELETE' request to the given URL along with the query params + * + * @param baseUrl + * @param params + * The query parameters to include as part of the baseUrl + * @param encode + * true to encode the full URL + * + * @see #append(CharSequence, Map) + * @see #encode(CharSequence) + * + * @return request + */ + public static HttpRequest delete(final CharSequence baseUrl, + final Map params, final boolean encode) { + String url = append(baseUrl, params); + return delete(encode ? encode(url) : url); + } + + /** + * Start a 'DELETE' request to the given URL along with the query params + * + * @param baseUrl + * @param encode + * true to encode the full URL + * @param params + * the name/value query parameter pairs to include as part of the + * baseUrl + * + * @see #append(CharSequence, Object...) + * @see #encode(CharSequence) + * + * @return request + */ + public static HttpRequest delete(final CharSequence baseUrl, + final boolean encode, final Object... params) { + String url = append(baseUrl, params); + return delete(encode ? encode(url) : url); + } + + /** + * Start a 'HEAD' request to the given URL + * + * @param url + * @return request + * @throws HttpRequestException + */ + public static HttpRequest head(final CharSequence url) + throws HttpRequestException { + return new HttpRequest(url, METHOD_HEAD); + } + + /** + * Start a 'HEAD' request to the given URL + * + * @param url + * @return request + * @throws HttpRequestException + */ + public static HttpRequest head(final URL url) throws HttpRequestException { + return new HttpRequest(url, METHOD_HEAD); + } + + /** + * Start a 'HEAD' request to the given URL along with the query params + * + * @param baseUrl + * @param params + * The query parameters to include as part of the baseUrl + * @param encode + * true to encode the full URL + * + * @see #append(CharSequence, Map) + * @see #encode(CharSequence) + * + * @return request + */ + public static HttpRequest head(final CharSequence baseUrl, + final Map params, final boolean encode) { + String url = append(baseUrl, params); + return head(encode ? encode(url) : url); + } + + /** + * Start a 'GET' request to the given URL along with the query params + * + * @param baseUrl + * @param encode + * true to encode the full URL + * @param params + * the name/value query parameter pairs to include as part of the + * baseUrl + * + * @see #append(CharSequence, Object...) + * @see #encode(CharSequence) + * + * @return request + */ + public static HttpRequest head(final CharSequence baseUrl, + final boolean encode, final Object... params) { + String url = append(baseUrl, params); + return head(encode ? encode(url) : url); + } + + /** + * Start an 'OPTIONS' request to the given URL + * + * @param url + * @return request + * @throws HttpRequestException + */ + public static HttpRequest options(final CharSequence url) + throws HttpRequestException { + return new HttpRequest(url, METHOD_OPTIONS); + } + + /** + * Start an 'OPTIONS' request to the given URL + * + * @param url + * @return request + * @throws HttpRequestException + */ + public static HttpRequest options(final URL url) + throws HttpRequestException { + return new HttpRequest(url, METHOD_OPTIONS); + } + + /** + * Start a 'TRACE' request to the given URL + * + * @param url + * @return request + * @throws HttpRequestException + */ + public static HttpRequest trace(final CharSequence url) + throws HttpRequestException { + return new HttpRequest(url, METHOD_TRACE); + } + + /** + * Start a 'TRACE' request to the given URL + * + * @param url + * @return request + * @throws HttpRequestException + */ + public static HttpRequest trace(final URL url) throws HttpRequestException { + return new HttpRequest(url, METHOD_TRACE); + } + + /** + * Set the 'http.keepAlive' property to the given value. + *

+ * This setting will apply to all requests. + * + * @param keepAlive + */ + public static void keepAlive(final boolean keepAlive) { + setProperty("http.keepAlive", Boolean.toString(keepAlive)); + } + + /** + * Set the 'http.maxConnections' property to the given value. + *

+ * This setting will apply to all requests. + * + * @param maxConnections + */ + public static void maxConnections(final int maxConnections) { + setProperty("http.maxConnections", Integer.toString(maxConnections)); + } + + /** + * Set the 'http.proxyHost' and 'https.proxyHost' properties to the given + * host value. + *

+ * This setting will apply to all requests. + * + * @param host + */ + public static void proxyHost(final String host) { + setProperty("http.proxyHost", host); + setProperty("https.proxyHost", host); + } + + /** + * Set the 'http.proxyPort' and 'https.proxyPort' properties to the given + * port number. + *

+ * This setting will apply to all requests. + * + * @param port + */ + public static void proxyPort(final int port) { + final String portValue = Integer.toString(port); + setProperty("http.proxyPort", portValue); + setProperty("https.proxyPort", portValue); + } + + /** + * Set the 'http.nonProxyHosts' property to the given host values. + *

+ * Hosts will be separated by a '|' character. + *

+ * This setting will apply to all requests. + * + * @param hosts + */ + public static void nonProxyHosts(final String... hosts) { + if (hosts != null && hosts.length > 0) { + StringBuilder separated = new StringBuilder(); + int last = hosts.length - 1; + for (int i = 0; i < last; i++) + separated.append(hosts[i]).append('|'); + separated.append(hosts[last]); + setProperty("http.nonProxyHosts", separated.toString()); + } else + setProperty("http.nonProxyHosts", null); + } + + /** + * Set property to given value. + *

+ * Specifying a null value will cause the property to be cleared + * + * @param name + * @param value + * @return previous value + */ + private static String setProperty(final String name, final String value) { + final PrivilegedAction action; + if (value != null) + action = new PrivilegedAction() { + + public String run() { + return System.setProperty(name, value); + } + }; + else + action = new PrivilegedAction() { + + public String run() { + return System.clearProperty(name); + } + }; + return AccessController.doPrivileged(action); + } + + private HttpURLConnection connection = null; + + private final URL url; + + private final String requestMethod; + + private RequestOutputStream output; + + private boolean multipart; + + private boolean form; + + private boolean ignoreCloseExceptions = true; + + private boolean uncompress = false; + + private int bufferSize = 8192; + + private long totalSize = -1; + + private long totalWritten = 0; + + private String httpProxyHost; + + private int httpProxyPort; + + private UploadProgress progress = UploadProgress.DEFAULT; + + /** + * Create HTTP connection wrapper + * + * @param url + * Remote resource URL. + * @param method + * HTTP request method (e.g., "GET", "POST"). + * @throws HttpRequestException + */ + public HttpRequest(final CharSequence url, final String method) + throws HttpRequestException { + try { + this.url = new URL(url.toString()); + } catch (MalformedURLException e) { + throw new HttpRequestException(e); + } + this.requestMethod = method; + } + + /** + * Create HTTP connection wrapper + * + * @param url + * Remote resource URL. + * @param method + * HTTP request method (e.g., "GET", "POST"). + * @throws HttpRequestException + */ + public HttpRequest(final URL url, final String method) + throws HttpRequestException { + this.url = url; + this.requestMethod = method; + } + + private Proxy createProxy() { + return new Proxy(HTTP, new InetSocketAddress(httpProxyHost, + httpProxyPort)); + } + + private HttpURLConnection createConnection() { + try { + final HttpURLConnection connection; + if (httpProxyHost != null) + connection = CONNECTION_FACTORY.create(url, createProxy()); + else + connection = CONNECTION_FACTORY.create(url); + connection.setRequestMethod(requestMethod); + return connection; + } catch (IOException e) { + throw new HttpRequestException(e); + } + } + + @Override + public String toString() { + return method() + ' ' + url(); + } + + /** + * Get underlying connection + * + * @return connection + */ + public HttpURLConnection getConnection() { + if (connection == null) + connection = createConnection(); + return connection; + } + + /** + * Set whether or not to ignore exceptions that occur from calling + * {@link Closeable#close()} + *

+ * The default value of this setting is true + * + * @param ignore + * @return this request + */ + public HttpRequest ignoreCloseExceptions(final boolean ignore) { + ignoreCloseExceptions = ignore; + return this; + } + + /** + * Get whether or not exceptions thrown by {@link Closeable#close()} are + * ignored + * + * @return true if ignoring, false if throwing + */ + public boolean ignoreCloseExceptions() { + return ignoreCloseExceptions; + } + + /** + * Get the status code of the response + * + * @return the response code + * @throws HttpRequestException + */ + public int code() throws HttpRequestException { + try { + closeOutput(); + return getConnection().getResponseCode(); + } catch (IOException e) { + throw new HttpRequestException(e); + } + } + + /** + * Set the value of the given {@link AtomicInteger} to the status code of + * the response + * + * @param output + * @return this request + * @throws HttpRequestException + */ + public HttpRequest code(final AtomicInteger output) + throws HttpRequestException { + output.set(code()); + return this; + } + + /** + * Is the response code a 200 OK? + * + * @return true if 200, false otherwise + * @throws HttpRequestException + */ + public boolean ok() throws HttpRequestException { + return HTTP_OK == code(); + } + + /** + * Is the response code a 201 Created? + * + * @return true if 201, false otherwise + * @throws HttpRequestException + */ + public boolean created() throws HttpRequestException { + return HTTP_CREATED == code(); + } + + /** + * Is the response code a 204 No Content? + * + * @return true if 204, false otherwise + * @throws HttpRequestException + */ + public boolean noContent() throws HttpRequestException { + return HTTP_NO_CONTENT == code(); + } + + /** + * Is the response code a 500 Internal Server Error? + * + * @return true if 500, false otherwise + * @throws HttpRequestException + */ + public boolean serverError() throws HttpRequestException { + return HTTP_INTERNAL_ERROR == code(); + } + + /** + * Is the response code a 400 Bad Request? + * + * @return true if 400, false otherwise + * @throws HttpRequestException + */ + public boolean badRequest() throws HttpRequestException { + return HTTP_BAD_REQUEST == code(); + } + + /** + * Is the response code a 404 Not Found? + * + * @return true if 404, false otherwise + * @throws HttpRequestException + */ + public boolean notFound() throws HttpRequestException { + return HTTP_NOT_FOUND == code(); + } + + /** + * Is the response code a 304 Not Modified? + * + * @return true if 304, false otherwise + * @throws HttpRequestException + */ + public boolean notModified() throws HttpRequestException { + return HTTP_NOT_MODIFIED == code(); + } + + /** + * Get status message of the response + * + * @return message + * @throws HttpRequestException + */ + public String message() throws HttpRequestException { + try { + closeOutput(); + return getConnection().getResponseMessage(); + } catch (IOException e) { + throw new HttpRequestException(e); + } + } + + /** + * Disconnect the connection + * + * @return this request + */ + public HttpRequest disconnect() { + getConnection().disconnect(); + return this; + } + + /** + * Set chunked streaming mode to the given size + * + * @param size + * @return this request + */ + public HttpRequest chunk(final int size) { + getConnection().setChunkedStreamingMode(size); + return this; + } + + /** + * Set the size used when buffering and copying between streams + *

+ * This size is also used for send and receive buffers created for both char + * and byte arrays + *

+ * The default buffer size is 8,192 bytes + * + * @param size + * @return this request + */ + public HttpRequest bufferSize(final int size) { + if (size < 1) + throw new IllegalArgumentException("Size must be greater than zero"); + bufferSize = size; + return this; + } + + /** + * Get the configured buffer size + *

+ * The default buffer size is 8,192 bytes + * + * @return buffer size + */ + public int bufferSize() { + return bufferSize; + } + + /** + * Set whether or not the response body should be automatically uncompressed + * when read from. + *

+ * This will only affect requests that have the 'Content-Encoding' response + * header set to 'gzip'. + *

+ * This causes all receive methods to use a {@link GZIPInputStream} when + * applicable so that higher level streams and readers can read the data + * uncompressed. + *

+ * Setting this option does not cause any request headers to be set + * automatically so {@link #acceptGzipEncoding()} should be used in + * conjunction with this setting to tell the server to gzip the response. + * + * @param uncompress + * @return this request + */ + public HttpRequest uncompress(final boolean uncompress) { + this.uncompress = uncompress; + return this; + } + + /** + * Create byte array output stream + * + * @return stream + */ + protected ByteArrayOutputStream byteStream() { + final int size = contentLength(); + if (size > 0) + return new ByteArrayOutputStream(size); + else + return new ByteArrayOutputStream(); + } + + /** + * Get response as {@link String} in given character set + *

+ * This will fall back to using the UTF-8 character set if the given charset + * is null + * + * @param charset + * @return string + * @throws HttpRequestException + */ + public String body(final String charset) throws HttpRequestException { + final ByteArrayOutputStream output = byteStream(); + try { + copy(buffer(), output); + return output.toString(getValidCharset(charset)); + } catch (IOException e) { + throw new HttpRequestException(e); + } + } + + /** + * Get response as {@link String} using character set returned from + * {@link #charset()} + * + * @return string + * @throws HttpRequestException + */ + public String body() throws HttpRequestException { + return body(charset()); + } + + /** + * Get the response body as a {@link String} and set it as the value of the + * given reference. + * + * @param output + * @return this request + * @throws HttpRequestException + */ + public HttpRequest body(final AtomicReference output) + throws HttpRequestException { + output.set(body()); + return this; + } + + /** + * Get the response body as a {@link String} and set it as the value of the + * given reference. + * + * @param output + * @param charset + * @return this request + * @throws HttpRequestException + */ + public HttpRequest body(final AtomicReference output, + final String charset) throws HttpRequestException { + output.set(body(charset)); + return this; + } + + /** + * Is the response body empty? + * + * @return true if the Content-Length response header is 0, false otherwise + * @throws HttpRequestException + */ + public boolean isBodyEmpty() throws HttpRequestException { + return contentLength() == 0; + } + + /** + * Get response as byte array + * + * @return byte array + * @throws HttpRequestException + */ + public byte[] bytes() throws HttpRequestException { + final ByteArrayOutputStream output = byteStream(); + try { + copy(buffer(), output); + } catch (IOException e) { + throw new HttpRequestException(e); + } + return output.toByteArray(); + } + + /** + * Get response in a buffered stream + * + * @see #bufferSize(int) + * @return stream + * @throws HttpRequestException + */ + public BufferedInputStream buffer() throws HttpRequestException { + return new BufferedInputStream(stream(), bufferSize); + } + + /** + * Get stream to response body + * + * @return stream + * @throws HttpRequestException + */ + public InputStream stream() throws HttpRequestException { + InputStream stream; + if (code() < HTTP_BAD_REQUEST) + try { + stream = getConnection().getInputStream(); + } catch (IOException e) { + throw new HttpRequestException(e); + } + else { + stream = getConnection().getErrorStream(); + if (stream == null) + try { + stream = getConnection().getInputStream(); + } catch (IOException e) { + if (contentLength() > 0) + throw new HttpRequestException(e); + else + stream = new ByteArrayInputStream(new byte[0]); + } + } + + if (!uncompress || !ENCODING_GZIP.equals(contentEncoding())) + return stream; + else + try { + return new GZIPInputStream(stream); + } catch (IOException e) { + throw new HttpRequestException(e); + } + } + + /** + * Get reader to response body using given character set. + *

+ * This will fall back to using the UTF-8 character set if the given charset + * is null + * + * @param charset + * @return reader + * @throws HttpRequestException + */ + public InputStreamReader reader(final String charset) + throws HttpRequestException { + try { + return new InputStreamReader(stream(), getValidCharset(charset)); + } catch (UnsupportedEncodingException e) { + throw new HttpRequestException(e); + } + } + + /** + * Get reader to response body using the character set returned from + * {@link #charset()} + * + * @return reader + * @throws HttpRequestException + */ + public InputStreamReader reader() throws HttpRequestException { + return reader(charset()); + } + + /** + * Get buffered reader to response body using the given character set r and + * the configured buffer size + * + * + * @see #bufferSize(int) + * @param charset + * @return reader + * @throws HttpRequestException + */ + public BufferedReader bufferedReader(final String charset) + throws HttpRequestException { + return new BufferedReader(reader(charset), bufferSize); + } + + /** + * Get buffered reader to response body using the character set returned + * from {@link #charset()} and the configured buffer size + * + * @see #bufferSize(int) + * @return reader + * @throws HttpRequestException + */ + public BufferedReader bufferedReader() throws HttpRequestException { + return bufferedReader(charset()); + } + + /** + * Stream response body to file + * + * @param file + * @return this request + * @throws HttpRequestException + */ + public HttpRequest receive(final File file) throws HttpRequestException { + final OutputStream output; + try { + output = new BufferedOutputStream(new FileOutputStream(file), + bufferSize); + } catch (FileNotFoundException e) { + throw new HttpRequestException(e); + } + return new CloseOperation(output, ignoreCloseExceptions) { + + @Override + protected HttpRequest run() throws HttpRequestException, + IOException { + return receive(output); + } + }.call(); + } + + /** + * Stream response to given output stream + * + * @param output + * @return this request + * @throws HttpRequestException + */ + public HttpRequest receive(final OutputStream output) + throws HttpRequestException { + try { + return copy(buffer(), output); + } catch (IOException e) { + throw new HttpRequestException(e); + } + } + + /** + * Stream response to given print stream + * + * @param output + * @return this request + * @throws HttpRequestException + */ + public HttpRequest receive(final PrintStream output) + throws HttpRequestException { + return receive((OutputStream) output); + } + + /** + * Receive response into the given appendable + * + * @param appendable + * @return this request + * @throws HttpRequestException + */ + public HttpRequest receive(final Appendable appendable) + throws HttpRequestException { + final BufferedReader reader = bufferedReader(); + return new CloseOperation(reader, ignoreCloseExceptions) { + + @Override + public HttpRequest run() throws IOException { + final CharBuffer buffer = CharBuffer.allocate(bufferSize); + int read; + while ((read = reader.read(buffer)) != -1) { + buffer.rewind(); + appendable.append(buffer, 0, read); + buffer.rewind(); + } + return HttpRequest.this; + } + }.call(); + } + + /** + * Receive response into the given writer + * + * @param writer + * @return this request + * @throws HttpRequestException + */ + public HttpRequest receive(final Writer writer) throws HttpRequestException { + final BufferedReader reader = bufferedReader(); + return new CloseOperation(reader, ignoreCloseExceptions) { + + @Override + public HttpRequest run() throws IOException { + return copy(reader, writer); + } + }.call(); + } + + /** + * Set read timeout on connection to given value + * + * @param timeout + * @return this request + */ + public HttpRequest readTimeout(final int timeout) { + getConnection().setReadTimeout(timeout); + return this; + } + + /** + * Set connect timeout on connection to given value + * + * @param timeout + * @return this request + */ + public HttpRequest connectTimeout(final int timeout) { + getConnection().setConnectTimeout(timeout); + return this; + } + + /** + * Set header name to given value + * + * @param name + * @param value + * @return this request + */ + public HttpRequest header(final String name, final String value) { + getConnection().setRequestProperty(name, value); + return this; + } + + /** + * Set header name to given value + * + * @param name + * @param value + * @return this request + */ + public HttpRequest header(final String name, final Number value) { + return header(name, value != null ? value.toString() : null); + } + + /** + * Set all headers found in given map where the keys are the header names + * and the values are the header values + * + * @param headers + * @return this request + */ + public HttpRequest headers(final Map headers) { + if (!headers.isEmpty()) + for (Entry header : headers.entrySet()) + header(header); + return this; + } + + /** + * Set header to have given entry's key as the name and value as the value + * + * @param header + * @return this request + */ + public HttpRequest header(final Entry header) { + return header(header.getKey(), header.getValue()); + } + + /** + * Get a response header + * + * @param name + * @return response header + * @throws HttpRequestException + */ + public String header(final String name) throws HttpRequestException { + closeOutputQuietly(); + return getConnection().getHeaderField(name); + } + + /** + * Get all the response headers + * + * @return map of response header names to their value(s) + * @throws HttpRequestException + */ + public Map> headers() throws HttpRequestException { + closeOutputQuietly(); + return getConnection().getHeaderFields(); + } + + /** + * Get a date header from the response falling back to returning -1 if the + * header is missing or parsing fails + * + * @param name + * @return date, -1 on failures + * @throws HttpRequestException + */ + public long dateHeader(final String name) throws HttpRequestException { + return dateHeader(name, -1L); + } + + /** + * Get a date header from the response falling back to returning the given + * default value if the header is missing or parsing fails + * + * @param name + * @param defaultValue + * @return date, default value on failures + * @throws HttpRequestException + */ + public long dateHeader(final String name, final long defaultValue) + throws HttpRequestException { + closeOutputQuietly(); + return getConnection().getHeaderFieldDate(name, defaultValue); + } + + /** + * Get an integer header from the response falling back to returning -1 if + * the header is missing or parsing fails + * + * @param name + * @return header value as an integer, -1 when missing or parsing fails + * @throws HttpRequestException + */ + public int intHeader(final String name) throws HttpRequestException { + return intHeader(name, -1); + } + + /** + * Get an integer header value from the response falling back to the given + * default value if the header is missing or if parsing fails + * + * @param name + * @param defaultValue + * @return header value as an integer, default value when missing or parsing + * fails + * @throws HttpRequestException + */ + public int intHeader(final String name, final int defaultValue) + throws HttpRequestException { + closeOutputQuietly(); + return getConnection().getHeaderFieldInt(name, defaultValue); + } + + /** + * Get all values of the given header from the response + * + * @param name + * @return non-null but possibly empty array of {@link String} header values + */ + public String[] headers(final String name) { + final Map> headers = headers(); + if (headers == null || headers.isEmpty()) + return EMPTY_STRINGS; + + final List values = headers.get(name); + if (values != null && !values.isEmpty()) + return values.toArray(new String[values.size()]); + else + return EMPTY_STRINGS; + } + + /** + * Get parameter with given name from header value in response + * + * @param headerName + * @param paramName + * @return parameter value or null if missing + */ + public String parameter(final String headerName, final String paramName) { + return getParam(header(headerName), paramName); + } + + /** + * Get all parameters from header value in response + *

+ * This will be all key=value pairs after the first ';' that are separated + * by a ';' + * + * @param headerName + * @return non-null but possibly empty map of parameter headers + */ + public Map parameters(final String headerName) { + return getParams(header(headerName)); + } + + /** + * Get parameter values from header value + * + * @param header + * @return parameter value or null if none + */ + protected Map getParams(final String header) { + if (header == null || header.length() == 0) + return Collections.emptyMap(); + + final int headerLength = header.length(); + int start = header.indexOf(';') + 1; + if (start == 0 || start == headerLength) + return Collections.emptyMap(); + + int end = header.indexOf(';', start); + if (end == -1) + end = headerLength; + + Map params = new LinkedHashMap(); + while (start < end) { + int nameEnd = header.indexOf('=', start); + if (nameEnd != -1 && nameEnd < end) { + String name = header.substring(start, nameEnd).trim(); + if (name.length() > 0) { + String value = header.substring(nameEnd + 1, end).trim(); + int length = value.length(); + if (length != 0) + if (length > 2 && '"' == value.charAt(0) + && '"' == value.charAt(length - 1)) + params.put(name, value.substring(1, length - 1)); + else + params.put(name, value); + } + } + + start = end + 1; + end = header.indexOf(';', start); + if (end == -1) + end = headerLength; + } + + return params; + } + + /** + * Get parameter value from header value + * + * @param value + * @param paramName + * @return parameter value or null if none + */ + protected String getParam(final String value, final String paramName) { + if (value == null || value.length() == 0) + return null; + + final int length = value.length(); + int start = value.indexOf(';') + 1; + if (start == 0 || start == length) + return null; + + int end = value.indexOf(';', start); + if (end == -1) + end = length; + + while (start < end) { + int nameEnd = value.indexOf('=', start); + if (nameEnd != -1 && nameEnd < end + && paramName.equals(value.substring(start, nameEnd).trim())) { + String paramValue = value.substring(nameEnd + 1, end).trim(); + int valueLength = paramValue.length(); + if (valueLength != 0) + if (valueLength > 2 && '"' == paramValue.charAt(0) + && '"' == paramValue.charAt(valueLength - 1)) + return paramValue.substring(1, valueLength - 1); + else + return paramValue; + } + + start = end + 1; + end = value.indexOf(';', start); + if (end == -1) + end = length; + } + + return null; + } + + /** + * Get 'charset' parameter from 'Content-Type' response header + * + * @return charset or null if none + */ + public String charset() { + return parameter(HEADER_CONTENT_TYPE, PARAM_CHARSET); + } + + /** + * Set the 'User-Agent' header to given value + * + * @param userAgent + * @return this request + */ + public HttpRequest userAgent(final String userAgent) { + return header(HEADER_USER_AGENT, userAgent); + } + + /** + * Set the 'Referer' header to given value + * + * @param referer + * @return this request + */ + public HttpRequest referer(final String referer) { + return header(HEADER_REFERER, referer); + } + + /** + * Set value of {@link HttpURLConnection#setUseCaches(boolean)} + * + * @param useCaches + * @return this request + */ + public HttpRequest useCaches(final boolean useCaches) { + getConnection().setUseCaches(useCaches); + return this; + } + + /** + * Set the 'Accept-Encoding' header to given value + * + * @param acceptEncoding + * @return this request + */ + public HttpRequest acceptEncoding(final String acceptEncoding) { + return header(HEADER_ACCEPT_ENCODING, acceptEncoding); + } + + /** + * Set the 'Accept-Encoding' header to 'gzip' + * + * @see #uncompress(boolean) + * @return this request + */ + public HttpRequest acceptGzipEncoding() { + return acceptEncoding(ENCODING_GZIP); + } + + /** + * Set the 'Accept-Charset' header to given value + * + * @param acceptCharset + * @return this request + */ + public HttpRequest acceptCharset(final String acceptCharset) { + return header(HEADER_ACCEPT_CHARSET, acceptCharset); + } + + /** + * Get the 'Content-Encoding' header from the response + * + * @return this request + */ + public String contentEncoding() { + return header(HEADER_CONTENT_ENCODING); + } + + /** + * Get the 'Server' header from the response + * + * @return server + */ + public String server() { + return header(HEADER_SERVER); + } + + /** + * Get the 'Date' header from the response + * + * @return date value, -1 on failures + */ + public long date() { + return dateHeader(HEADER_DATE); + } + + /** + * Get the 'Cache-Control' header from the response + * + * @return cache control + */ + public String cacheControl() { + return header(HEADER_CACHE_CONTROL); + } + + /** + * Get the 'ETag' header from the response + * + * @return entity tag + */ + public String eTag() { + return header(HEADER_ETAG); + } + + /** + * Get the 'Expires' header from the response + * + * @return expires value, -1 on failures + */ + public long expires() { + return dateHeader(HEADER_EXPIRES); + } + + /** + * Get the 'Last-Modified' header from the response + * + * @return last modified value, -1 on failures + */ + public long lastModified() { + return dateHeader(HEADER_LAST_MODIFIED); + } + + /** + * Get the 'Location' header from the response + * + * @return location + */ + public String location() { + return header(HEADER_LOCATION); + } + + /** + * Set the 'Authorization' header to given value + * + * @param authorization + * @return this request + */ + public HttpRequest authorization(final String authorization) { + return header(HEADER_AUTHORIZATION, authorization); + } + + /** + * Set the 'Proxy-Authorization' header to given value + * + * @param proxyAuthorization + * @return this request + */ + public HttpRequest proxyAuthorization(final String proxyAuthorization) { + return header(HEADER_PROXY_AUTHORIZATION, proxyAuthorization); + } + + /** + * Set the 'Authorization' header to given values in Basic authentication + * format + * + * @param name + * @param password + * @return this request + */ + public HttpRequest basic(final String name, final String password) { + return authorization("Basic " + Base64.encode(name + ':' + password)); + } + + /** + * Set the 'Proxy-Authorization' header to given values in Basic + * authentication format + * + * @param name + * @param password + * @return this request + */ + public HttpRequest proxyBasic(final String name, final String password) { + return proxyAuthorization("Basic " + + Base64.encode(name + ':' + password)); + } + + /** + * Set the 'If-Modified-Since' request header to the given value + * + * @param ifModifiedSince + * @return this request + */ + public HttpRequest ifModifiedSince(final long ifModifiedSince) { + getConnection().setIfModifiedSince(ifModifiedSince); + return this; + } + + /** + * Set the 'If-None-Match' request header to the given value + * + * @param ifNoneMatch + * @return this request + */ + public HttpRequest ifNoneMatch(final String ifNoneMatch) { + return header(HEADER_IF_NONE_MATCH, ifNoneMatch); + } + + /** + * Set the 'Content-Type' request header to the given value + * + * @param contentType + * @return this request + */ + public HttpRequest contentType(final String contentType) { + return contentType(contentType, null); + } + + /** + * Set the 'Content-Type' request header to the given value and charset + * + * @param contentType + * @param charset + * @return this request + */ + public HttpRequest contentType(final String contentType, + final String charset) { + if (charset != null && charset.length() > 0) { + final String separator = "; " + PARAM_CHARSET + '='; + return header(HEADER_CONTENT_TYPE, contentType + separator + + charset); + } else + return header(HEADER_CONTENT_TYPE, contentType); + } + + /** + * Get the 'Content-Type' header from the response + * + * @return response header value + */ + public String contentType() { + return header(HEADER_CONTENT_TYPE); + } + + /** + * Get the 'Content-Length' header from the response + * + * @return response header value + */ + public int contentLength() { + return intHeader(HEADER_CONTENT_LENGTH); + } + + /** + * Set the 'Content-Length' request header to the given value + * + * @param contentLength + * @return this request + */ + public HttpRequest contentLength(final String contentLength) { + return contentLength(Integer.parseInt(contentLength)); + } + + /** + * Set the 'Content-Length' request header to the given value + * + * @param contentLength + * @return this request + */ + public HttpRequest contentLength(final int contentLength) { + getConnection().setFixedLengthStreamingMode(contentLength); + return this; + } + + /** + * Set the 'Accept' header to given value + * + * @param accept + * @return this request + */ + public HttpRequest accept(final String accept) { + return header(HEADER_ACCEPT, accept); + } + + /** + * Set the 'Accept' header to 'application/json' + * + * @return this request + */ + public HttpRequest acceptJson() { + return accept(CONTENT_TYPE_JSON); + } + + /** + * Copy from input stream to output stream + * + * @param input + * @param output + * @return this request + * @throws IOException + */ + protected HttpRequest copy(final InputStream input, + final OutputStream output) throws IOException { + return new CloseOperation(input, ignoreCloseExceptions) { + + @Override + public HttpRequest run() throws IOException { + final byte[] buffer = new byte[bufferSize]; + int read; + while ((read = input.read(buffer)) != -1) { + output.write(buffer, 0, read); + totalWritten += read; + progress.onUpload(totalWritten, totalSize); + } + return HttpRequest.this; + } + }.call(); + } + + /** + * Copy from reader to writer + * + * @param input + * @param output + * @return this request + * @throws IOException + */ + protected HttpRequest copy(final Reader input, final Writer output) + throws IOException { + return new CloseOperation(input, ignoreCloseExceptions) { + + @Override + public HttpRequest run() throws IOException { + final char[] buffer = new char[bufferSize]; + int read; + while ((read = input.read(buffer)) != -1) { + output.write(buffer, 0, read); + totalWritten += read; + progress.onUpload(totalWritten, -1); + } + return HttpRequest.this; + } + }.call(); + } + + /** + * Set the UploadProgress callback for this request + * + * @param callback + * @return this request + */ + public HttpRequest progress(final UploadProgress callback) { + if (callback == null) + progress = UploadProgress.DEFAULT; + else + progress = callback; + return this; + } + + private HttpRequest incrementTotalSize(final long size) { + if (totalSize == -1) + totalSize = 0; + totalSize += size; + return this; + } + + /** + * Close output stream + * + * @return this request + * @throws HttpRequestException + * @throws IOException + */ + protected HttpRequest closeOutput() throws IOException { + progress(null); + if (output == null) + return this; + if (multipart) + output.write(CRLF + "--" + BOUNDARY + "--" + CRLF); + if (ignoreCloseExceptions) + try { + output.close(); + } catch (IOException ignored) { + // Ignored + } + else + output.close(); + output = null; + return this; + } + + /** + * Call {@link #closeOutput()} and re-throw a caught {@link IOException}s as + * an {@link HttpRequestException} + * + * @return this request + * @throws HttpRequestException + */ + protected HttpRequest closeOutputQuietly() throws HttpRequestException { + try { + return closeOutput(); + } catch (IOException e) { + throw new HttpRequestException(e); + } + } + + /** + * Open output stream + * + * @return this request + * @throws IOException + */ + protected HttpRequest openOutput() throws IOException { + if (output != null) + return this; + getConnection().setDoOutput(true); + final String charset = getParam( + getConnection().getRequestProperty(HEADER_CONTENT_TYPE), + PARAM_CHARSET); + output = new RequestOutputStream(getConnection().getOutputStream(), + charset, bufferSize); + return this; + } + + /** + * Start part of a multipart + * + * @return this request + * @throws IOException + */ + protected HttpRequest startPart() throws IOException { + if (!multipart) { + multipart = true; + contentType(CONTENT_TYPE_MULTIPART).openOutput(); + output.write("--" + BOUNDARY + CRLF); + } else + output.write(CRLF + "--" + BOUNDARY + CRLF); + return this; + } + + /** + * Write part header + * + * @param name + * @param filename + * @return this request + * @throws IOException + */ + protected HttpRequest writePartHeader(final String name, + final String filename) throws IOException { + return writePartHeader(name, filename, null); + } + + /** + * Write part header + * + * @param name + * @param filename + * @param contentType + * @return this request + * @throws IOException + */ + protected HttpRequest writePartHeader(final String name, + final String filename, final String contentType) throws IOException { + final StringBuilder partBuffer = new StringBuilder(); + partBuffer.append("form-data; name=\"").append(name); + if (filename != null) + partBuffer.append("\"; filename=\"").append(filename); + partBuffer.append('"'); + partHeader("Content-Disposition", partBuffer.toString()); + if (contentType != null) + partHeader(HEADER_CONTENT_TYPE, contentType); + return send(CRLF); + } + + /** + * Write part of a multipart request to the request body + * + * @param name + * @param part + * @return this request + */ + public HttpRequest part(final String name, final String part) { + return part(name, null, part); + } + + /** + * Write part of a multipart request to the request body + * + * @param name + * @param filename + * @param part + * @return this request + * @throws HttpRequestException + */ + public HttpRequest part(final String name, final String filename, + final String part) throws HttpRequestException { + return part(name, filename, null, part); + } + + /** + * Write part of a multipart request to the request body + * + * @param name + * @param filename + * @param contentType + * value of the Content-Type part header + * @param part + * @return this request + * @throws HttpRequestException + */ + public HttpRequest part(final String name, final String filename, + final String contentType, final String part) + throws HttpRequestException { + try { + startPart(); + writePartHeader(name, filename, contentType); + output.write(part); + } catch (IOException e) { + throw new HttpRequestException(e); + } + return this; + } + + /** + * Write part of a multipart request to the request body + * + * @param name + * @param part + * @return this request + * @throws HttpRequestException + */ + public HttpRequest part(final String name, final Number part) + throws HttpRequestException { + return part(name, null, part); + } + + /** + * Write part of a multipart request to the request body + * + * @param name + * @param filename + * @param part + * @return this request + * @throws HttpRequestException + */ + public HttpRequest part(final String name, final String filename, + final Number part) throws HttpRequestException { + return part(name, filename, part != null ? part.toString() : null); + } + + /** + * Write part of a multipart request to the request body + * + * @param name + * @param part + * @return this request + * @throws HttpRequestException + */ + public HttpRequest part(final String name, final File part) + throws HttpRequestException { + return part(name, null, part); + } + + /** + * Write part of a multipart request to the request body + * + * @param name + * @param filename + * @param part + * @return this request + * @throws HttpRequestException + */ + public HttpRequest part(final String name, final String filename, + final File part) throws HttpRequestException { + return part(name, filename, null, part); + } + + /** + * Write part of a multipart request to the request body + * + * @param name + * @param filename + * @param contentType + * value of the Content-Type part header + * @param part + * @return this request + * @throws HttpRequestException + */ + public HttpRequest part(final String name, final String filename, + final String contentType, final File part) + throws HttpRequestException { + final InputStream stream; + try { + stream = new BufferedInputStream(new FileInputStream(part)); + incrementTotalSize(part.length()); + } catch (IOException e) { + throw new HttpRequestException(e); + } + return part(name, filename, contentType, stream); + } + + /** + * Write part of a multipart request to the request body + * + * @param name + * @param part + * @return this request + * @throws HttpRequestException + */ + public HttpRequest part(final String name, final InputStream part) + throws HttpRequestException { + return part(name, null, null, part); + } + + /** + * Write part of a multipart request to the request body + * + * @param name + * @param filename + * @param contentType + * value of the Content-Type part header + * @param part + * @return this request + * @throws HttpRequestException + */ + public HttpRequest part(final String name, final String filename, + final String contentType, final InputStream part) + throws HttpRequestException { + try { + startPart(); + writePartHeader(name, filename, contentType); + copy(part, output); + } catch (IOException e) { + throw new HttpRequestException(e); + } + return this; + } + + /** + * Write a multipart header to the response body + * + * @param name + * @param value + * @return this request + * @throws HttpRequestException + */ + public HttpRequest partHeader(final String name, final String value) + throws HttpRequestException { + return send(name).send(": ").send(value).send(CRLF); + } + + /** + * Write contents of file to request body + * + * @param input + * @return this request + * @throws HttpRequestException + */ + public HttpRequest send(final File input) throws HttpRequestException { + final InputStream stream; + try { + stream = new BufferedInputStream(new FileInputStream(input)); + incrementTotalSize(input.length()); + } catch (FileNotFoundException e) { + throw new HttpRequestException(e); + } + return send(stream); + } + + /** + * Write byte array to request body + * + * @param input + * @return this request + * @throws HttpRequestException + */ + public HttpRequest send(final byte[] input) throws HttpRequestException { + if (input != null) + incrementTotalSize(input.length); + return send(new ByteArrayInputStream(input)); + } + + /** + * Write stream to request body + *

+ * The given stream will be closed once sending completes + * + * @param input + * @return this request + * @throws HttpRequestException + */ + public HttpRequest send(final InputStream input) + throws HttpRequestException { + try { + openOutput(); + copy(input, output); + } catch (IOException e) { + throw new HttpRequestException(e); + } + return this; + } + + /** + * Write reader to request body + *

+ * The given reader will be closed once sending completes + * + * @param input + * @return this request + * @throws HttpRequestException + */ + public HttpRequest send(final Reader input) throws HttpRequestException { + try { + openOutput(); + } catch (IOException e) { + throw new HttpRequestException(e); + } + final Writer writer = new OutputStreamWriter(output, + output.encoder.charset()); + return new FlushOperation(writer) { + + @Override + protected HttpRequest run() throws IOException { + return copy(input, writer); + } + }.call(); + } + + /** + * Write char sequence to request body + *

+ * The charset configured via {@link #contentType(String)} will be used and + * UTF-8 will be used if it is unset. + * + * @param value + * @return this request + * @throws HttpRequestException + */ + public HttpRequest send(final CharSequence value) + throws HttpRequestException { + try { + openOutput(); + output.write(value.toString()); + } catch (IOException e) { + throw new HttpRequestException(e); + } + return this; + } + + /** + * Create writer to request output stream + * + * @return writer + * @throws HttpRequestException + */ + public OutputStreamWriter writer() throws HttpRequestException { + try { + openOutput(); + return new OutputStreamWriter(output, output.encoder.charset()); + } catch (IOException e) { + throw new HttpRequestException(e); + } + } + + /** + * Write the values in the map as form data to the request body + *

+ * The pairs specified will be URL-encoded in UTF-8 and sent with the + * 'application/x-www-form-urlencoded' content-type + * + * @param values + * @return this request + * @throws HttpRequestException + */ + public HttpRequest form(final Map values) throws HttpRequestException { + return form(values, CHARSET_UTF8); + } + + /** + * Write the key and value in the entry as form data to the request body + *

+ * The pair specified will be URL-encoded in UTF-8 and sent with the + * 'application/x-www-form-urlencoded' content-type + * + * @param entry + * @return this request + * @throws HttpRequestException + */ + public HttpRequest form(final Entry entry) + throws HttpRequestException { + return form(entry, CHARSET_UTF8); + } + + /** + * Write the key and value in the entry as form data to the request body + *

+ * The pair specified will be URL-encoded and sent with the + * 'application/x-www-form-urlencoded' content-type + * + * @param entry + * @param charset + * @return this request + * @throws HttpRequestException + */ + public HttpRequest form(final Entry entry, final String charset) + throws HttpRequestException { + return form(entry.getKey(), entry.getValue(), charset); + } + + /** + * Write the name/value pair as form data to the request body + *

+ * The pair specified will be URL-encoded in UTF-8 and sent with the + * 'application/x-www-form-urlencoded' content-type + * + * @param name + * @param value + * @return this request + * @throws HttpRequestException + */ + public HttpRequest form(final Object name, final Object value) + throws HttpRequestException { + return form(name, value, CHARSET_UTF8); + } + + /** + * Write the name/value pair as form data to the request body + *

+ * The values specified will be URL-encoded and sent with the + * 'application/x-www-form-urlencoded' content-type + * + * @param name + * @param value + * @param charset + * @return this request + * @throws HttpRequestException + */ + public HttpRequest form(final Object name, final Object value, + String charset) throws HttpRequestException { + final boolean first = !form; + if (first) { + contentType(CONTENT_TYPE_FORM, charset); + form = true; + } + charset = getValidCharset(charset); + try { + openOutput(); + if (!first) + output.write('&'); + output.write(URLEncoder.encode(name.toString(), charset)); + output.write('='); + if (value != null) + output.write(URLEncoder.encode(value.toString(), charset)); + } catch (IOException e) { + throw new HttpRequestException(e); + } + return this; + } + + /** + * Write the values in the map as encoded form data to the request body + * + * @param values + * @param charset + * @return this request + * @throws HttpRequestException + */ + public HttpRequest form(final Map values, final String charset) + throws HttpRequestException { + if (!values.isEmpty()) + for (Entry entry : values.entrySet()) + form(entry, charset); + return this; + } + + /** + * Configure HTTPS connection to trust all certificates + *

+ * This method does nothing if the current request is not a HTTPS request + * + * @return this request + * @throws HttpRequestException + */ + public HttpRequest trustAllCerts() throws HttpRequestException { + final HttpURLConnection connection = getConnection(); + if (connection instanceof HttpsURLConnection) + ((HttpsURLConnection) connection) + .setSSLSocketFactory(getTrustedFactory()); + return this; + } + + /** + * Configure HTTPS connection to trust all hosts using a custom + * {@link HostnameVerifier} that always returns true for each + * host verified + *

+ * This method does nothing if the current request is not a HTTPS request + * + * @return this request + */ + public HttpRequest trustAllHosts() { + final HttpURLConnection connection = getConnection(); + if (connection instanceof HttpsURLConnection) + ((HttpsURLConnection) connection) + .setHostnameVerifier(getTrustedVerifier()); + return this; + } + + /** + * Get the {@link URL} of this request's connection + * + * @return request URL + */ + public URL url() { + return getConnection().getURL(); + } + + /** + * Get the HTTP method of this request + * + * @return method + */ + public String method() { + return getConnection().getRequestMethod(); + } + + /** + * Configure an HTTP proxy on this connection. Use { + * {@link #proxyBasic(String, String)} if this proxy requires basic + * authentication. + * + * @param proxyHost + * @param proxyPort + * @return this request + */ + public HttpRequest useProxy(final String proxyHost, final int proxyPort) { + if (connection != null) + throw new IllegalStateException( + "The connection has already been created. This method must be called before reading or writing to the request."); + + this.httpProxyHost = proxyHost; + this.httpProxyPort = proxyPort; + return this; + } + + /** + * Set whether or not the underlying connection should follow redirects in + * the response. + * + * @param followRedirects + * - true fo follow redirects, false to not. + * @return this request + */ + public HttpRequest followRedirects(final boolean followRedirects) { + getConnection().setInstanceFollowRedirects(followRedirects); + return this; + } +} + diff --git a/src/main/java/com/example/coin/Indicators.java b/src/main/java/com/example/coin/Indicators.java new file mode 100644 index 0000000..7f776c4 --- /dev/null +++ b/src/main/java/com/example/coin/Indicators.java @@ -0,0 +1,173 @@ +package com.example.coin; + + +import java.util.ArrayList; +import java.util.List; + +//보조지표 관련 함수를 가지는 클래스 +public class Indicators { + + private List closingPrices; // 종가 목록 + + // 생성자: 종가 리스트를 받아서 저장 + public Indicators(List closingPrices) { + this.closingPrices = new ArrayList<>(closingPrices); + } + public double calculateRSI( int period) { + if (closingPrices.size() < period) { + throw new IllegalArgumentException("종가 데이터가 충분하지 않습니다. (" + period + "개 필요)"); + } + + List delta = new ArrayList<>(); + List ups = new ArrayList<>(); + List downs = new ArrayList<>(); + + // 1. 가격 변화 계산 + for (int i = 1; i < closingPrices.size(); i++) { + double change = closingPrices.get(i) - closingPrices.get(i - 1); + delta.add(change); + ups.add(Math.max(change, 0)); + downs.add(Math.max(-change, 0)); + } + + // 2. EMA 계산 + double au = calculateLatestEMA(ups, period); + double ad = calculateLatestEMA(downs, period); + + // 3. RSI 계산 + if (ad == 0) { + return 100.0; // 손실이 없으면 RSI는 100 + } + + double rs = au / ad; + return 100 - (100 / (1 + rs)); + } + + private static double calculateLatestEMA(List values, int period) { + if (values.size() < period) { + throw new IllegalArgumentException("데이터가 충분하지 않습니다. (" + period + "개 필요)"); + } + + double multiplier = 2.0 / (period + 1); + double ema = 0.0; + + // 초기 EMA는 SMA로 계산 + for (int i = 0; i < period; i++) { + ema += values.get(i); + } + ema /= period; + + // 이후 EMA 계산 + for (int i = period; i < values.size(); i++) { + ema = ((values.get(i) - ema) * multiplier) + ema; + } + + return ema; + } +// public double calculateRSI(int period) { +// if (closingPrices.size() < period) { +// throw new IllegalArgumentException("종가 데이터가 충분하지 않습니다. (" + period + "개 필요)"); +// } +// +// double gainSum = 0.0; +// double lossSum = 0.0; +// +// for (int i = closingPrices.size() - period; i < closingPrices.size() - 1; i++) { +// double change = closingPrices.get(i + 1) - closingPrices.get(i); +// if (change > 0) { +// gainSum += change; +// } else { +// lossSum += Math.abs(change); +// } +// } +// +// double avgGain = gainSum / period; +// double avgLoss = lossSum / period; +// +// if (avgLoss == 0) { +// return 100.0; // 손실이 없으면 RS가 무한대 -> RSI=100(초강세) +// } +// +// double rs = avgGain / avgLoss; +// double rsi = 100.0 - (100.0 / (1.0 + rs)); +// return rsi; +// } + + + /** + * Simple Moving Average (단순 이동평균) + */ + public List calculateSMA(int period) { + if (period <= 0) { + throw new IllegalArgumentException("기간(period)은 1 이상이어야 합니다."); + } + if (period > closingPrices.size()) { + throw new IllegalArgumentException("기간(period)이 데이터 크기보다 큽니다."); + } + + List smaValues = new ArrayList<>(); + double sum = 0.0; + + for (int i = 0; i < closingPrices.size(); i++) { + sum += closingPrices.get(i); + + // period 이전까지는 누적 + if (i >= period) { + sum -= closingPrices.get(i - period); + } + + // period-1 인덱스부터가 실제 SMA 시작점 + if (i >= period - 1) { + double sma = sum / period; + smaValues.add(sma); + } + } + + return smaValues; + } + + + /** + * Bollinger Bands 최종 값 하나만 반환 + * - 여기서는 중심선(middleBand) 리스트의 "마지막 값"만 반환 + * - 실제로는 upperBand, lowerBand, 밴드폭(upper-lower) 등 원하는 값을 반환할 수도 있음 + */ + //lowerBand를 리턴하는 함수 + public double calculateBollingerBands(int period, double k) { + List smaList = calculateSMA(period); + List upperBand = new ArrayList<>(); + List lowerBand = new ArrayList<>(); + + for (int i = 0; i < smaList.size(); i++) { + int actualIndex = i + (period - 1); + + double sum = 0.0; + for (int j = actualIndex - period + 1; j <= actualIndex; j++) { + sum += closingPrices.get(j); + } + double mean = smaList.get(i); + + // 표준편차 계산 + double variance = 0.0; + for (int j = actualIndex - period + 1; j <= actualIndex; j++) { + double diff = closingPrices.get(j) - mean; + variance += diff * diff; + } + double stdev = Math.sqrt(variance / period); + + // upper, lower 계산 + upperBand.add(mean + k * stdev); + lowerBand.add(mean - k * stdev); + } + + // 3개 리스트 중 원하는 값(여기서는 middleBand의 가장 최신 값)만 반환 + if (smaList.isEmpty()) { + // 예외 상황 처리 + return 0.0; + } + // return smaList.get(smaList.size() - 1); // 마지막 middleBand를 반환 + return lowerBand.get(lowerBand.size() - 1); // 마지막 lowerBand를 반환 + + } +} + diff --git a/src/main/java/com/example/coin/InterestRepository.java b/src/main/java/com/example/coin/InterestRepository.java new file mode 100644 index 0000000..9943f86 --- /dev/null +++ b/src/main/java/com/example/coin/InterestRepository.java @@ -0,0 +1,57 @@ +package com.example.coin; + +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class InterestRepository { + private final EntityManager EM; + public void save(interest ii) { + + EM.persist(ii); + } + public List getUserInterest(String userName){ + return EM.createQuery("select m from interest m where m.userName =: userName",interest.class) + .setParameter("userName",userName) + .getResultList(); + } + public List checkDuple(String userName,String coinName){ + return EM.createQuery("select m from interest m where m.userName =: userName and m.coinName =: " + + "coinName",interest.class) + .setParameter("userName",userName).setParameter("coinName",coinName) + .getResultList(); + } + public void edit(interest i) { + EM.merge(i); + } + + public void delete(int id) { +// contents.remove(id); + interest i = EM.find(interest.class,id); + if(i!=null){ + EM.remove(i); + } + } + + public List findAll() { +// return new ArrayList<>(contents.values()); +// return EM.createQuery("SELECT c FROM Content c", Content.class).getResultList(); + return new ArrayList<>(EM.createQuery("SELECT c FROM Interest c", interest.class).getResultList()); + } + + public interest findById(int id) { +// return contents.get(id); + return EM.find(interest.class,id); + } + + public List findByCoinName(String coinName) { + return EM.createQuery("SELECT c FROM Interest c WHERE c.coinName = :coinName", interest.class) + .setParameter("coinName", coinName) + .getResultList(); + } +} diff --git a/src/main/java/com/example/coin/LoginForm.java b/src/main/java/com/example/coin/LoginForm.java new file mode 100644 index 0000000..b6212cd --- /dev/null +++ b/src/main/java/com/example/coin/LoginForm.java @@ -0,0 +1,15 @@ +package com.example.coin; + +import jakarta.validation.constraints.NotEmpty; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class LoginForm { + @NotEmpty(message ="아이디를 입력주세요") //DB에서 NotNULL과 비슷힌 기느 + private String identity; + + @NotEmpty(message ="비밀번호를 입력해주세요") //DB에서 NotNULL과 비슷힌 기느 + private String pass; +} diff --git a/src/main/java/com/example/coin/ThreadTest.java b/src/main/java/com/example/coin/ThreadTest.java new file mode 100644 index 0000000..2caccd8 --- /dev/null +++ b/src/main/java/com/example/coin/ThreadTest.java @@ -0,0 +1,176 @@ +package com.example.coin; + +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; +import com.squareup.okhttp.ResponseBody; +import lombok.RequiredArgsConstructor; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.io.IOException; +import java.time.Instant; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; + +public class ThreadTest { + + + public static double calculateAverage(List values, int period) { + if (values.size() < period) { + return 0.0; + } + + double sum = 0.0; + for (int i = values.size() - period; i < values.size(); i++) { + sum += values.get(i); + } + + return sum / period; + } + public static List AcalculateRsi(List closingPrices, int period) { + List rsiValues = new ArrayList<>(); + + for (int i = 0; i < closingPrices.size(); i++) { + if (i < period) { + rsiValues.add(null); // RSI 값이 없는 경우에 null로 표시 + continue; + } + + List closes = closingPrices.subList(i - period, i); + List changes = new ArrayList<>(); + + for (int j = 1; j < closes.size(); j++) { + double change = closes.get(j) - closes.get(j - 1); + changes.add(change); + } + + List gains = new ArrayList<>(); + List losses = new ArrayList<>(); + + for (Double change : changes) { + if (change > 0) { + gains.add(change); + losses.add(0.0); + } else { + gains.add(0.0); + losses.add(-change); + } + } + + double avgGain = calculateAverage(gains, period); + double avgLoss = calculateAverage(losses, period); + + if (avgLoss == 0.0) { + rsiValues.add(100.0); + } else { + double rs = avgGain / avgLoss; + double rsi = 100.0 - (100.0 / (1.0 + rs)); + rsiValues.add(rsi); + } + } + + return rsiValues; + } + public static double calculateRsi(List prices, int period) { + if (prices == null || prices.size() < period) { + throw new IllegalArgumentException("Invalid input data or period"); + } + + // RSI 계산을 위한 변수 초기화 + double gainSum = 0.0; + double lossSum = 0.0; + + // 가격 변동 계산 + for (int i = 1; i < period; i++) { + double priceDiff = prices.get(i) - prices.get(i - 1); + if (priceDiff > 0) { + gainSum += priceDiff; + } else { + lossSum -= priceDiff; // 음수를 양수로 바꿈 + } + } + + // 평균 수익과 평균 손실 계산 + double avgGain = gainSum / period; + double avgLoss = lossSum / period; + + // RSI 계산 + double relativeStrength = avgGain / avgLoss; + double rsi = 100 - (100 / (1 + relativeStrength)); + + return rsi; + } + public static void getCoinPrice(String coinName) { + String url = "https://api.bithumb.com/public/candlestick/"; + url+=coinName+"_KRW/24h"; + try { + + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder() + .url(url) + .get() + .addHeader("accept", "application/json") + .build(); + + Response response = client.newCall(request).execute(); + ResponseBody body = response.body(); + + + JSONObject json = new JSONObject(body.string()); + JSONArray data = json.getJSONArray("data"); + //String data = json.getString("data"); + List coinPriceList = new ArrayList<>(); + for (int x = 0;x cN = a.allCoin(); //상장된 모든 코인 이름 +// long beforeTime = System.currentTimeMillis(); //코드 실행 전에 시간 받아오기 +// for(int i =0; i"); + + }else{ + response.setStatus(HttpServletResponse.SC_OK); + response.setHeader("Location", "/login/search"); //이동할 url 경로 + response.setHeader("Content-Type", "text/html"); + response.getWriter().println(""); + + } + } + + @PostMapping("login/sellcoin") + public void WriteSellLog(String coin_name, String price, HttpServletRequest request,HttpServletResponse response) throws IOException { + HttpSession session = request.getSession(); + int success; + try { + success=service.WriteSellLog(coin_name,price,String.valueOf(session.getAttribute("ID"))); + } catch (IOException e) { + throw new RuntimeException(e); + } catch (JSONException e) { + throw new RuntimeException(e); + } + if(success==1) { + response.setStatus(HttpServletResponse.SC_OK); + response.setHeader("Location", "/login/search"); //이동할 url 경로 + response.setHeader("Content-Type", "text/html"); + response.getWriter().println(""); + + }else{ + response.setStatus(HttpServletResponse.SC_OK); + response.setHeader("Location", "/login/search"); //이동할 url 경로 + response.setHeader("Content-Type", "text/html"); + response.getWriter().println(""); + + } + } +} diff --git a/src/main/java/com/example/coin/TradeRepository.java b/src/main/java/com/example/coin/TradeRepository.java new file mode 100644 index 0000000..8889e7d --- /dev/null +++ b/src/main/java/com/example/coin/TradeRepository.java @@ -0,0 +1,121 @@ +package com.example.coin; + +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; +import com.squareup.okhttp.ResponseBody; +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.stereotype.Repository; + +import java.io.IOException; +import java.text.DecimalFormat; +import java.util.HashMap; +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class TradeRepository { + private final EntityManager EM; + public List getBuyPrice(String coin_name, String user_id){ + return EM.createQuery("select e from transaction_log e where e.user_id=:user_id and e.coin_name=:coin_name", transaction_log.class) + .setParameter("user_id",user_id) + .setParameter("coin_name",coin_name) + .getResultList(); + } + public String getCoinPrice(String coinName) throws IOException, JSONException { + String URL = "https://api.bithumb.com/public/transaction_history/"+coinName+"_KRW"; + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder() + .url(URL) + .get() + .build(); + Response response = client.newCall(request).execute(); + ResponseBody body = response.body(); + JSONObject json = new JSONObject(body.string()); + JSONArray dataArray= json.getJSONArray("data"); + + JSONObject json1 = new JSONObject(dataArray.get(dataArray.length()-1).toString()); + String coinPrice = json1.get("price").toString(); + return coinPrice; + } + public List getUserAmount(String user_id){ + return EM.createQuery("select e from transaction_log e where e.user_id=:user_id").setParameter("user_id",user_id).getResultList(); + } + public transaction_log getCoinAmount(String coin_name, String user_id){ //사용자의 아이디와 코인이름을 입력받아서 코인보유량을 얻는 함수 + List log=EM.createQuery("select e from transaction_log e where e.user_id=:user_id and e.coin_name=:coin_name", transaction_log.class) + .setParameter("user_id",user_id) + .setParameter("coin_name",coin_name) + .getResultList(); + if (!log.isEmpty()) { + return log.get(0); + } + else{ + return null; + } + } + + public void WriteLog(transaction_log log){ //보유량의 신규작성 + EM.persist(log); + } + + public void EditLog(transaction_log log){ //코인 보유량을 고치는 함수 + if(log.getAmount()<=0){ //받은 보유량이 0이하라면 삭제 + EM.remove(log); + } + else{EM.merge(log);} //아니라면 데이터베이스에 반영 + } + + public String buy_coin(Api_Client api, String coinName,double price) throws IOException, JSONException, JSONException { + String coinPrice = getCoinPrice(coinName); + HashMap rgParams = new HashMap(); + rgParams.put("currency", coinName); + String result1 = api.callApi("/info/balance", rgParams); + //System.out.println(result); + JSONObject json = new JSONObject(result1); + String data = json.getString("data"); //string()쓰기 + + JSONObject json1 = new JSONObject(data); + String total_krw = json1.getString("total_krw").toString(); //보유 자산 구하기 + + if( Double.parseDouble(total_krw)Double.parseDouble(total_krw)*0.69&Double.parseDouble(total_krw)<500){ + return "0"; + } + DecimalFormat decimalFormat = new DecimalFormat("#.####"); + + // 잘라내기 + String formattedNumber = decimalFormat.format(unit); + + HashMap rgParams1 = new HashMap(); + rgParams1.put("units", formattedNumber); //소수점 4자리 맞추기=코인수량 + rgParams1.put("order_currency", coinName); //매수 하려는 코인 이름 + rgParams1.put("payment_currency", "KRW"); // 매수하려는 통화 + String result = api.callApi("/trade/market_buy", rgParams1); + System.out.println("결과"+ result); + return formattedNumber; + } + public int sell_coin(Api_Client api,String coinName,String unit) throws IOException { + try { + HashMap rgParams = new HashMap(); + rgParams.put("units", unit); //소수점 4자리 맞추기 + rgParams.put("order_currency", coinName); //매도 하려는 코인 이름 + rgParams.put("payment_currency", "KRW"); //매도하려는 통화 + String result = api.callApi("/trade/market_sell", rgParams); + return 1; + } catch (Exception e) { + System.out.println("에러 " + e); + } + return 0; + } +} diff --git a/src/main/java/com/example/coin/TransactionHistory.java b/src/main/java/com/example/coin/TransactionHistory.java new file mode 100644 index 0000000..758a054 --- /dev/null +++ b/src/main/java/com/example/coin/TransactionHistory.java @@ -0,0 +1,24 @@ +package com.example.coin; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter +public class TransactionHistory { + @Id + @GeneratedValue//(strategy = GenerationType.AUTO) + @Column(name = "id", nullable = false) //DB칼럼이름이 what //notnull + private Long id; + private String coinDate; //거래 일자 + private String user; //거래한 회원 아이디 + private String coinName; //코인 이름 + private String amount; //코인 거래수량 + private String state;// 매수, 매도 상태 + private String price; //체결된 코인가격 + private String fee; // 수수료 + private String afterTrade; //거래후 내 자산 + +} diff --git a/src/main/java/com/example/coin/TransactionHistoryController.java b/src/main/java/com/example/coin/TransactionHistoryController.java new file mode 100644 index 0000000..cbbf29d --- /dev/null +++ b/src/main/java/com/example/coin/TransactionHistoryController.java @@ -0,0 +1,409 @@ +//package com.example.coin; +// +//import com.example.coin.entity.CoinName; +//import jakarta.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletResponse; +//import jakarta.servlet.http.HttpSession; +//import jakarta.validation.Valid; +//import lombok.RequiredArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.json.JSONException; +//import org.springframework.stereotype.Controller; +//import org.springframework.ui.Model; +//import org.springframework.validation.BindingResult; +//import org.springframework.web.bind.annotation.*; +// +//import java.io.IOException; +//import java.text.DecimalFormat; +//import java.util.ArrayList; +//import java.util.HashMap; +//import java.util.List; +//import java.util.Map; +// +//@Controller +//@Slf4j +//@RequiredArgsConstructor +//public class TransactionHistoryController { +// +// private String coinName = ""; +// private final TradeService tradeService; +// private final TransactionHistoryService service; +// @GetMapping (value = "/drills") +// public String aa(){ +// return "apitest"; +// } +// @GetMapping (value = "/") +// public String loginPage(Model model) { +// model.addAttribute("LoginForm", new LoginForm()); +// +// List userInfo = service.getUserData("조승빈"); +// for(int i =0; i idInfo = service.checkDupleId(); +//// for (int i = 0; i < idInfo.size(); i++) { +//// if (form.getMakeId().equals(idInfo.get(i).getIdentity())) { +//// return "redirect:/createMember"; +//// } +//// } +// +// //데이터 insert 코드 +// user_info u = new user_info(); //엔티티 객체 생성 +// u.setIdentity(form.getMakeId()); +// u.setPass(form.getMakePass()); +// u.setApi_key(form.getApi_key()); +// u.setSec_key(form.getSec_key()); +// service.registMember(u);//회원정보 테이블에 저장 +// +// user_rank uR = new user_rank(); +// uR.setUser_id(form.getMakeId()); +// service.registUserRanking(uR);//회원랭킹 테이블에 저장 +// return "redirect:/"; +// } +// @GetMapping(value = "/test") +// public String a (){ +// List allUser = service.getAllUserData(); +// List allCoin = service.getCoinState(); +// List coinName = new ArrayList<>(); +// for(int i = 0; i cN = a.allCoin(); // +// +// //코인 이름을 넣는 코드 +// //데이터베이스에 저장된 코인수와 api로 불러온 코인수가 다르면 갱신 +// if(service.getCoinSize() != cN.size()){ +// service.delCoinName(); +// for(int i = 0 ;i> allCoinState = a.getAllCoinState(cN); +// if(service.getCoinState().size() !=allCoinState.size()) { +// service.delCoinInfo(); +// for (int x = 0; x < allCoinState.size(); x++) { +// coin_info c = new coin_info(); +// c.setCoinName(cN.get(x)); +// c.setOpening_price(allCoinState.get(x).get(0)); +// c.setMax_price(allCoinState.get(x).get(1)); +// c.setMin_price(allCoinState.get(x).get(2)); +// c.setUnites_traded(allCoinState.get(x).get(3)); +// c.setFluctate_24H(allCoinState.get(x).get(4)); +// c.setFluctate_rate_24H(allCoinState.get(x).get(5)); +// c.setPrev_closing_price(allCoinState.get(x).get(6)); +// c.setClosing_price(allCoinState.get(x).get(7)); +// c.setUnits_traded_24H(allCoinState.get(x).get(8)); +// c.setAcc_trade_value_24H(allCoinState.get(x).get(9)); +// c.setAcc_trade_value(allCoinState.get(x).get(10)); +// service.coinStateSave(c); +// } +// } +// HttpSession session = request.getSession(); +// String userId = String.valueOf(session.getAttribute("ID")); +// List userInfo = service.getUserData(userId); +// //회원들의 코인을 출력하는 코드 +// +// List coinName = service.getCoinState(); +// GetTransactionHistory h = +// new GetTransactionHistory(userInfo.get(0).getApi_key(),userInfo.get(0).getSec_key(),coinName.size()); +// List coinN = new ArrayList<>(); +// for(int i =0;i"); +// //return "re`direct:/"; +// } +// List loginCheck =service.loginCheck(form.getIdentity(), form.getPass()); +// //로그인 확인 : 아이디,비번이 일치하면 loginCheck 사이즈가 1 , 일치하지 않으면 0 +// if(loginCheck.size() == 0 ){ +// //로그인 정보가 일치 하지 않으면 로그인 실패 +// response.setStatus(HttpServletResponse.SC_OK); +// response.setHeader("Location", "/login/search"); //이동할 url 경로 +// response.setHeader("Content-Type", "text/html"); +// response.getWriter().println(""); +// return "redirect:/"; +// } +// String identity =service.getUserData(form.getIdentity()).get(0).getIdentity(); +// HttpSession session = request.getSession(); +// session.setAttribute("ID", form.getIdentity()); //세션 +// String userId = String.valueOf(session.getAttribute("ID")); +// System.out.println("로그인 성공 : "+userId); +// return "redirect:/login"; +// } +// +// @GetMapping (value = "/login/myasset") +// public String showMyAsset(){ +// +// +// +// return "myasset"; +// } +// +// @PostMapping(value = "/login/myasset") +// @ResponseBody +// public List sendMyAsset(HttpServletRequest request) throws JSONException, IOException { +// HttpSession session = request.getSession(); +// String userId = String.valueOf(session.getAttribute("ID")); +// List tradeInfo = service.getUserTrade(userId); +// List userOwnCoin = new ArrayList<>(); //사용자가 보유한 코인 +// //내가 보유한 코인 불러오는 로직 +// double trade_cnt = 0.0 ; // 총 매매 횟수 +// double win_cnt = 0.0; +// for(int idx = 0;idx < tradeInfo.size();idx++ ){ +// if(tradeInfo.get(idx).getState().equals("매수")){ +// userOwnCoin.add(tradeInfo.get(idx)); +// trade_cnt++; +// } +// else if (tradeInfo.get(idx).getState().equals("매도")) { +// for(int i = 0 ; iDouble.valueOf(buyPrice)){ +// win_cnt++; +// } +// userOwnCoin.remove(i); +// break; +// } +// } +// } +// } +// List myCoin = new ArrayList<>(); +// List user = service.getUserData(userId); +// getUserCash uC = new getUserCash(user.get(0).getApi_key(),user.get(0).getSec_key()); +// String total_krw = uC.getCash(); //유저가 가진 현금량 +// Double myAllAsset = 0.0; //내 총자산 (내가 보유한 모든 코인가격 누적합 + 현금); +// List userAmount = tradeService.getUserAmount(userId); +// for(int i = 0;i< userAmount.size();i++){ +// myAllAsset+= Double.valueOf(userAmount.get(i).getAmount()) *Double.valueOf(userAmount.get(i).getCoin_price()); +// } +// +// for(int i = 0 ; i< userOwnCoin.size();i++){ +// myAllAsset += Double.valueOf(userOwnCoin.get(i).getAmount()) * Double.valueOf(userOwnCoin.get(i).getPrice()); +// } +// myAllAsset += Double.valueOf(total_krw); +// DecimalFormat decimalFormat = new DecimalFormat("#.#"); +// for(int i = 0 ; i< userOwnCoin.size();i++){ +// myCoin.add(userOwnCoin.get(i).getCoinName()); +// Double coinAmount = Double.valueOf(userOwnCoin.get(i).getAmount()) * Double.valueOf(userOwnCoin.get(i).getPrice()); +// coinAmount = coinAmount/myAllAsset; +// //소수점 첫째자리까지만 짜름 +// myCoin.add(decimalFormat.format(coinAmount)); +// } +// +// myCoin.add("KRW"); +// myCoin.add(decimalFormat.format(Double.valueOf(total_krw)/myAllAsset)); +// for(int i = 0;i< userAmount.size();i++){ +// myCoin.add(userAmount.get(i).getCoin_name()); +// Double tmp = Double.valueOf(userAmount.get(i).getAmount()) *Double.valueOf(userAmount.get(i).getCoin_price()); +// tmp /=myAllAsset; +// myCoin.add(String.valueOf(tmp)); +// } +// List trade_log = tradeService.getUserAmount(userId); +// for(int i = 0;i postCoinSearch(){ +// return service.getCoinState(); +// } +// +// @GetMapping (value = "/login/graph") //그래프를 보고싶은 코인이름을 입력받는 화면 +// public String getCoinGraph(Model model){ +// model.addAttribute("CoinInput", new CoinInput()); +// return "coinGraph"; +// } +// @PostMapping(value = "/login/coinPriceInsert") +// public String saveCoinPrice(@Valid CoinInput cI) throws JSONException, IOException { +// +// String url ="https://api.bithumb.com/public/candlestick/"+ cI.getCoinName()+"_KRW/24h"; +// //입력받은 코인의 일별 가격 +// AllCoin a = new AllCoin(url); +// List> coinCadle = a.getCandleStick(); +// +// this.coinName = cI.getCoinName(); +// List coinPriceInfo = service.getCoinPrice(this.coinName); +// Map verifyCoin = new HashMap<>(); +// for(int i = 0; i cpInfo = new ArrayList<>(); +// for(int i = 0; i < coinCadle.size(); i++) { +// if(!verifyCoin.containsKey(coinCadle.get(i).get(0))){ +// coin_price c = new coin_price(); +// c.setCoinName(cI.getCoinName()); +// c.setCoinDate(coinCadle.get(i).get(0)); +// c.setOpening_price(coinCadle.get(i).get(1)); +// c.setClosing_price(coinCadle.get(i).get(2)); +// c.setMax_price(coinCadle.get(i).get(3)); +// c.setMin_price(coinCadle.get(i).get(4)); +// c.setUnites_traded(coinCadle.get(i).get(5)); +// cpInfo.add(c); +// //service.dumSave(c); +// } +// } +// if(cpInfo.size()>0){ //넣을 값이 있을때만 실행 +// service.saveCoinPrice(cpInfo); //배치 인서트 코드 +// //service.bulkCoinPrice(cpInfo); //벌크 인서트 코드 +// } +// +// return "redirect:/login/showGraph"; +// } +//// @GetMapping (value = "/login/showGraph") +//// public String showGraph() {; +//// return "showCoinGraph";} +//// +//// +// @ResponseBody +// @RequestMapping (value = "/login/showGraph") +// public List coinPrice() throws JSONException, IOException { +// +// String url ="https://api.bithumb.com/public/candlestick/"+ this.coinName+"_KRW/24h"; +// //입력받은 코인의 일별 가격 +// +// AllCoin a = new AllCoin(url); +// List> coinCadle = a.getCandleStick(); +// +// +// List coinPriceInfo = service.getCoinPrice(this.coinName); +// Map verifyCoin = new HashMap<>(); +// for(int i = 0; i cpInfo = new ArrayList<>(); +// for(int i = 0; i < coinCadle.size(); i++) { +// if(!verifyCoin.containsKey(coinCadle.get(i).get(0))){ +// coin_price c = new coin_price(); +// c.setCoinName(this.coinName); +// c.setCoinDate(coinCadle.get(i).get(0)); +// c.setOpening_price(coinCadle.get(i).get(1)); +// c.setClosing_price(coinCadle.get(i).get(2)); +// c.setMax_price(coinCadle.get(i).get(3)); +// c.setMin_price(coinCadle.get(i).get(4)); +// c.setUnites_traded(coinCadle.get(i).get(5)); +// cpInfo.add(c); +// //service.dumSave(c); +// } +// } +// if(cpInfo.size()>0){ //넣을 값이 있을때만 실행 +// service.saveCoinPrice(cpInfo); //배치 인서트 코드 +// //service.bulkCoinPrice(cpInfo); //벌크 인서트 코드 +// } +// +// +// List cP = service.getCoinPrice(this.coinName); +// List ans = new ArrayList<>(); +// +// for(int i = 0; i sfsf() throws JSONException, IOException { +// +// List cP = service.getCoinPrice(this.coinName); +// List ans = new ArrayList<>(); +// +// for(int i = 0; i loginCheck (String identity, String pass){ + return em.createQuery("select m from user_info m where m.identity =: identity and m.pass =: pass", user_info.class). + setParameter("identity",identity).setParameter("pass",pass).setHint("org.hibernate.readOnly",true).getResultList(); + } + public void excelDataSave(TransactionHistory t){ + em.persist(t); + } + public void registMember(user_info u) { + em.persist(u); + } //회원가입 + public List getAllCoinName (){return em.createQuery("select m from coin_Name m",CoinName.class).getResultList();} + public List getAllUserData() { + return em.createQuery("select m from user_info m",user_info.class).getResultList(); + } + public List getUserData(String id){ //사용자의 정보를 가져오는 함수 + return em.createQuery("select m from user_info m where m.identity =: identity",user_info.class) + .setParameter("identity",id) + .getResultList(); + + } + + public int getCoinSize(){ + Long coinSize= ((Number) em.createNativeQuery("select count(*) from coin_Name ").getSingleResult()).longValue();; + + return Integer.valueOf(Math.toIntExact(coinSize)); + } + public void save(CoinName t){ + em.persist(t); + } + public void coinStateSave(CoinInfo c){ + em.persist(c); + } + public void dumSave(CoinPrice c) { + em.persist(c); + } + + public void saveCoinPrice(List c) { //상장일로부터 현재까지 코인 가격 + //배치 insert로 한번에 insert하는 코드인데 먼가 잘안됨.. + long beforeTime = System.currentTimeMillis(); //코드 실행 전에 시간 받아오기 + for(int i = 0;i c){ + long beforeTime = System.currentTimeMillis(); //코드 실행 전에 시간 받아오기 + String sql = "INSERT INTO coin_price (id,coin_name,coin_date,opening_price,closing_price,max_price,min_price,unites_traded)values"; + List a = em.createQuery("select m from coin_price m ", CoinPrice.class).getResultList(); + int idNUm = 0; + if(a.size() !=0){ + idNUm = Integer.valueOf(Math.toIntExact(a.get(a.size() - 1).getId())); + } + for(int i=0;i getCoinState(){ + return em.createQuery("select m from coin_info m ", CoinInfo.class).getResultList(); + } + public List getCoinPrice(String coinName){ + return em.createQuery("select m from coin_price m where m.coinName =: coinName", CoinPrice.class). + setParameter("coinName",coinName).getResultList(); + } + public List getUserTrade(String user){ + return em.createQuery("select m from TransactionHistory m where m.user =: user order by m.coinDate"). + setParameter("user",user).getResultList(); + } + public List coinStatistics() { // 사용자들이 매수한 코인들중에서 가장 많이 매매한 순으로 정렬해서 보여주는 함수 + Listans= em.createQuery("SELECT coinName, count(state) FROM TransactionHistory c WHERE c.state = ?1 OR c.state = ?2 GROUP BY coinName order by count(state) desc", Object[].class) + .setParameter(1, "매도") + .setParameter(2, "자동매도") + .getResultList(); + List stringList = new ArrayList<>(); + for (Object[] result : ans) { + // Assuming the coinName is a String, you may need to cast it to String if necessary + String coinName = (String) result[0]; + stringList.add(coinName); + stringList.add(String.valueOf ((Long) result[1])); + } + return stringList; + } + public List getDatafromExcel(String test){ + return new ArrayList<>(em.createQuery("SELECT e FROM TransactionHistory e WHERE e.state = :test", TransactionHistory.class) + .setParameter("test", test) + .getResultList()); + } + public void registUserRanking(user_rank uR){ + em.persist(uR); + } + public List getUserRank(String userId){ + return em.createQuery("select m from user_rank m where m.user_id =: user_id "). + setParameter("user_id",userId).getResultList(); + } + + public List getRank (){ + return em.createQuery("select m from user_rank m order by win_rate desc") + .getResultList(); + } +} diff --git a/src/main/java/com/example/coin/TransactionHistoryService.java b/src/main/java/com/example/coin/TransactionHistoryService.java new file mode 100644 index 0000000..eb2be03 --- /dev/null +++ b/src/main/java/com/example/coin/TransactionHistoryService.java @@ -0,0 +1,68 @@ +package com.example.coin; + +import com.example.coin.entity.CoinName; +import com.example.coin.entity.CoinPrice; +import com.example.coin.entity.CoinInfo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor +public class TransactionHistoryService { + private final TransactionHistoryRepository transactionReposi; + public void delCoinName(){ + transactionReposi.delCoinName(); + } + public void delCoinInfo(){ + transactionReposi.delCoinInfo(); + } + public List loginCheck (String identity, String pass){ + return transactionReposi.loginCheck(identity, pass); + } + public void excelDataSave(TransactionHistory t){ + transactionReposi.excelDataSave(t); + } + + public void registMember(user_info u){ + transactionReposi.registMember(u); + } + public List getAllCoinName() {return transactionReposi.getAllCoinName();} + public List getAllUserData() {return transactionReposi.getAllUserData();} + public List getUserData(String id){ + return transactionReposi.getUserData(id); + } + + public int getCoinSize(){ return transactionReposi.getCoinSize();} + public void save(CoinName t){ + transactionReposi.save(t); + } + public void coinStateSave(CoinInfo c){ + transactionReposi.coinStateSave(c); + } + public List getCoinState(){ + return transactionReposi.getCoinState(); + } + public void dumSave (CoinPrice c) {transactionReposi.dumSave(c);} + public void saveCoinPrice(List c){transactionReposi.saveCoinPrice(c);} + public void bulkCoinPrice (List c) {transactionReposi.bulkCoinPrice(c);} + public List getCoinPrice(String coinName){ + return transactionReposi.getCoinPrice(coinName); + } + + public List getUserTrade(String user){ + return transactionReposi.getUserTrade(user); + } + public List coinStatistics() {return transactionReposi.coinStatistics();} + + public List GetexcelData(String type){ + return transactionReposi.getDatafromExcel(type); + } + public void registUserRanking(user_rank uR){ transactionReposi.registUserRanking(uR);} + public List getUserRank(String userId) { return transactionReposi.getUserRank(userId);} + public List getRank() {return transactionReposi.getRank();} + +} diff --git a/src/main/java/com/example/coin/Util.java b/src/main/java/com/example/coin/Util.java new file mode 100644 index 0000000..9a83e0e --- /dev/null +++ b/src/main/java/com/example/coin/Util.java @@ -0,0 +1,86 @@ +package com.example.coin; + +import java.io.UnsupportedEncodingException; +import java.math.BigInteger; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.Map; +import java.util.Map.Entry; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +//import com.google.common.io.BaseEncoding; +//import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; +import org.apache.xerces.impl.dv.util.Base64; +public class Util { + + private static final String DEFAULT_ENCODING = "UTF-8"; + private static final String HMAC_SHA512 = "HmacSHA512"; + + public static String base64Encode(byte[] bytes) { + String bytesEncoded = Base64.encode(bytes); + return bytesEncoded; + } + + public static String hashToString(String data, byte[] key) { + String result = null; + Mac sha512_HMAC; + + try { + sha512_HMAC = Mac.getInstance("HmacSHA512"); + System.out.println("key : " + new String(key)); + SecretKeySpec secretkey = new SecretKeySpec(key, "HmacSHA512"); + sha512_HMAC.init(secretkey); + + byte[] mac_data = sha512_HMAC.doFinal(data.getBytes()); + System.out.println("hex : " + bin2hex(mac_data)); + result = Base64.encode(mac_data); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + public static byte[] hmacSha512(String value, String key) { + try { + SecretKeySpec keySpec = new SecretKeySpec( + key.getBytes(DEFAULT_ENCODING), HMAC_SHA512); + Mac mac = Mac.getInstance(HMAC_SHA512); + mac.init(keySpec); + return mac.doFinal(value.getBytes(DEFAULT_ENCODING)); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } catch (InvalidKeyException e) { + throw new RuntimeException(e); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + public static String asHex(byte[] bytes) { + return new String(Base64.encode(bytes)); + } + + public static String bin2hex(byte[] data) { + return String.format("%0" + (data.length * 2) + "X", new BigInteger(1, data)); + } + + public static String mapToQueryString(Map map) { + StringBuilder string = new StringBuilder(); + + if (map.size() > 0) { + string.append("?"); + } + + for (Entry entry : map.entrySet()) { + string.append(entry.getKey()); + string.append("="); + string.append(entry.getValue()); + string.append("&"); + } + + return string.toString(); + } +} + diff --git a/src/main/java/com/example/coin/WebCrawler.java b/src/main/java/com/example/coin/WebCrawler.java new file mode 100644 index 0000000..c85b6a9 --- /dev/null +++ b/src/main/java/com/example/coin/WebCrawler.java @@ -0,0 +1,64 @@ +package com.example.coin; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class WebCrawler { + public List> getStockPriceData (String url) throws IOException { + int cnt = 1; + int flag =0; + List> stockPriceList = new ArrayList<>(); + Set visit = new HashSet<>(); + // URL 설정 + while (true){ + + + // Jsoup을 이용해 HTML 코드를 가져옴 + Document document = Jsoup.connect(url+String.valueOf(cnt)).get(); + + // 태그 추출 (summary 속성을 기준으로 선택) + Element table = document.select("table[summary='외국인 기관 순매매 거래량에 관한표이며 날짜별로 정보를 제공합니다.']").first(); + + // 테이블 내에서 태그들을 추출 + Elements rows = table.select("tr"); + + // 각 행의 데이터를 출력 + for (Element row : rows) { + + Elements columns = row.select("td"); + //System.out.print(columns.size()); + if (columns.size() != 9) { + continue; + } + if (visit.contains(columns.get(0).text())){ + flag = 1; + break; + } + visit.add(columns.get(0).text()); + List stockPriceData = new ArrayList<>(); + stockPriceData.add(columns.get(0).text()); //날짜 + stockPriceData.add(columns.get(1).text()); //종가 + stockPriceData.add(columns.get(4).text()); //거래량 + stockPriceList.add(stockPriceData); + } + if(flag == 1) { + break; + } + cnt++; + } + return stockPriceList; + } + public static void main(String[] args) throws IOException { + + + + } +} diff --git a/src/main/java/com/example/coin/bithumb/UserAsset.java b/src/main/java/com/example/coin/bithumb/UserAsset.java new file mode 100644 index 0000000..8eedfe1 --- /dev/null +++ b/src/main/java/com/example/coin/bithumb/UserAsset.java @@ -0,0 +1,26 @@ +package com.example.coin.bithumb; + +import com.example.coin.Api_Client; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.HashMap; + +public class UserAsset { + private final Api_Client api ; + public UserAsset(String key, String sec){ + api= new Api_Client(key,sec); + } + //현재 사용자가 가진 현금량을 리턴 + public String getUserAsset() throws JSONException, IOException { + String coinName = "All"; + HashMap rgParams = new HashMap(); + rgParams.put("currency", coinName); + String result1 = api.callApi("/info/balance", rgParams); + JSONObject json = new JSONObject(result1); + String data = json.getString("data"); //string()쓰기 + return data; + + } +} diff --git a/src/main/java/com/example/coin/config/WebMvcConfig.java b/src/main/java/com/example/coin/config/WebMvcConfig.java new file mode 100644 index 0000000..f725f6f --- /dev/null +++ b/src/main/java/com/example/coin/config/WebMvcConfig.java @@ -0,0 +1,20 @@ +package com.example.coin.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOriginPatterns("*") // 모든 도메인 허용 (allowedOrigins("*") 대신 사용) + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") + .allowedHeaders("*") + .allowCredentials(true); + } +} + + diff --git a/src/main/java/com/example/coin/controller/CoinCommentController.java b/src/main/java/com/example/coin/controller/CoinCommentController.java new file mode 100644 index 0000000..62a43e5 --- /dev/null +++ b/src/main/java/com/example/coin/controller/CoinCommentController.java @@ -0,0 +1,44 @@ +package com.example.coin.controller; + +import com.example.coin.dto.CoinCommentDto; +import com.example.coin.service.CoinCommentService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class CoinCommentController { + //1.코인에 대한 모든 댓글 조회 ok + //2.코인에 대한 댓글 작성 ok + //아래 두개 생각하기 전에 dto에 대해서 더 고민 ㄱ + //3.코인에 대한 댓글 삭제 + //4.코인에 대한 댓글 수정 + + private final CoinCommentService commentService; + + @GetMapping(value = "/comment-list") + public ResponseEntity> getCoinCommentList(@RequestParam("coinName")String coinName){ + return ResponseEntity.ok() + .body(commentService.getCoinCommentList(coinName)); + } + + @PostMapping(value = "/save-comment") + public void saveCoinComment( //일단 리스폰스 엔티티로 받을지는 고민 + @RequestParam("coinName")String coinName, + @RequestParam("user_id")Long user_id, + @RequestParam("comment")String comment){ + commentService.saveComment(coinName,user_id,comment); + } + +// @DeleteMapping(value = "/delete-comment") +// public void deleteCoinComment( +// @RequestParam("coinName")String coinName, +// @RequestParam("") +// ) + + + +} diff --git a/src/main/java/com/example/coin/controller/CoinNameController.java b/src/main/java/com/example/coin/controller/CoinNameController.java new file mode 100644 index 0000000..aaa6f1f --- /dev/null +++ b/src/main/java/com/example/coin/controller/CoinNameController.java @@ -0,0 +1,24 @@ +package com.example.coin.controller; + + +import com.example.coin.dto.CoinNameDto; +import com.example.coin.service.CoinNameSercvice; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class CoinNameController { + private final CoinNameSercvice coinNameSercvice; + @GetMapping(value = "/coin-name-list") + public ResponseEntity> getCoinNameList(){ + + return new ResponseEntity<>(coinNameSercvice.getAllCoinName(), HttpStatus.OK); + } +} diff --git a/src/main/java/com/example/coin/controller/CoinNewsController.java b/src/main/java/com/example/coin/controller/CoinNewsController.java new file mode 100644 index 0000000..9363eed --- /dev/null +++ b/src/main/java/com/example/coin/controller/CoinNewsController.java @@ -0,0 +1,24 @@ +package com.example.coin.controller; + +import com.example.coin.service.CoinNewsService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.util.Map; + +@RestController +@RequiredArgsConstructor +public class CoinNewsController { + private final CoinNewsService newsService; + + @GetMapping(value = "/coin-news") + public ResponseEntity getCoinNews(@RequestParam("coin_name")String coin_name) throws IOException, InterruptedException { + return new ResponseEntity<>(newsService.getCoinNews(coin_name), HttpStatus.OK); + } + +} diff --git a/src/main/java/com/example/coin/controller/CoinPriceController.java b/src/main/java/com/example/coin/controller/CoinPriceController.java new file mode 100644 index 0000000..cd8adf6 --- /dev/null +++ b/src/main/java/com/example/coin/controller/CoinPriceController.java @@ -0,0 +1,93 @@ +package com.example.coin.controller; + + +import com.example.coin.CoinPatternMatcher; +import com.example.coin.TimestampConverter; +import com.example.coin.dto.CoinPriceDto; +import com.example.coin.entity.CoinInfo; +import com.example.coin.service.CoinPriceService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@RequiredArgsConstructor +@RestController +public class CoinPriceController { + private final CoinPriceService coinPriceService; + @GetMapping (value = "/coin_current_price_list") + public ResponseEntitygetCurrentPriceList(@RequestParam("state")String state, + @RequestParam("num")int num){ + return new ResponseEntity<>(coinPriceService.getCurrentPriceList(state,num),HttpStatus.OK); + } + + @GetMapping (value = "/coin_price") //어떤 기간동안 해당 코인의 가격리스트 + public ResponseEntity getCoinPrice( @RequestParam("coinName") String coinName, + @RequestParam("coinState") String coinState, + @RequestParam("startDate") String startDate, + @RequestParam("endDate") String endDate ) throws ParseException { + + if (coinName == null || coinName.isEmpty()) { + return ResponseEntity.badRequest().body("coinName parameter is missing or empty"); + } + if (coinState == null || coinState.isEmpty()) { + return ResponseEntity.badRequest().body("coinState parameter is missing or empty"); + } + if (startDate == null || startDate.isEmpty()) { + return ResponseEntity.badRequest().body("startDate parameter is missing or empty"); + } + if (endDate == null || endDate.isEmpty()) { + return ResponseEntity.badRequest().body("endDate parameter is missing or empty"); + } + return new ResponseEntity<>(coinPriceService.getCoinInfo(coinName,coinState, startDate,endDate), HttpStatus.OK); + } + + + @GetMapping(value = "/coin_price_test") + public void we(){ + List> data = new ArrayList<>(); + CoinPatternMatcher coinPatternMatcher = new CoinPatternMatcher(); + TimestampConverter timestampConverter = new TimestampConverter(); + + long startTime = System.currentTimeMillis(); + List coinPrices= coinPriceService.getCoinPrice(); + long endTime = System.currentTimeMillis(); + long totalTime = endTime - startTime; + System.out.println("조회 시간" + totalTime + " ms"); + for(CoinInfo coinPrice : coinPrices){ + String coin = coinPrice.getCoinName(); + String date = timestampConverter.stampToDate(coinPrice.getCoinDate()); + double open = Double.parseDouble(coinPrice.getOpeningPrice()); + double high = Double.parseDouble(coinPrice.getMaxPrice()); + double low = Double.parseDouble(coinPrice.getMinPrice()); + double close = Double.parseDouble(coinPrice.getClosingPrice()); + double volume = Double.parseDouble(coinPrice.getUnitsTraded()); + data.add(Map.of("coin",coin , "date", date,"open",open, + "high",high,"low",low, + "close", close,"volume",volume)); + } + long start = System.currentTimeMillis(); + +// data.add(Map.of( +// "coin", coin, +// "date", date.toString(), +// "open", open, +// "high", high, +// "low", low, +// "close", close, +// "volume", volume +// )); + + coinPatternMatcher.findSimilarPatterns(data,"2024-03-12","2024-03-12","XLM"); + long end = System.currentTimeMillis(); + long total = end - start; + System.out.println("분석 시간" + total + " ms"); + } +} diff --git a/src/main/java/com/example/coin/controller/SaveCoinStateController.java b/src/main/java/com/example/coin/controller/SaveCoinStateController.java new file mode 100644 index 0000000..a3c0c02 --- /dev/null +++ b/src/main/java/com/example/coin/controller/SaveCoinStateController.java @@ -0,0 +1,32 @@ +package com.example.coin.controller; + + +import com.example.coin.service.SaveCoinStateService; +import lombok.RequiredArgsConstructor; +import org.json.JSONException; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; + +@RestController +@RequiredArgsConstructor +public class SaveCoinStateController { + private final SaveCoinStateService saveCoinStateService; + + + @GetMapping(value = "/save-coin-name") + public void saveCoinName() throws JSONException, IOException { + saveCoinStateService.saveCoinName(); + } + + @GetMapping(value = "/save-coin-price") + public void saveCoinPrice() throws JSONException, IOException, InterruptedException { + saveCoinStateService.saveCoinPrice(); + } + + @GetMapping(value = "findMaxId") + public void findMaxId(){ + saveCoinStateService.findMaxId(); + } +} diff --git a/src/main/java/com/example/coin/controller/SaveStockDataController.java b/src/main/java/com/example/coin/controller/SaveStockDataController.java new file mode 100644 index 0000000..ae1bb3f --- /dev/null +++ b/src/main/java/com/example/coin/controller/SaveStockDataController.java @@ -0,0 +1,23 @@ +package com.example.coin.controller; + + +import com.example.coin.service.SaveStockDataService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; + +@RestController +@RequiredArgsConstructor +public class SaveStockDataController { + private final SaveStockDataService saveStockDataService; + @GetMapping(value = "/insert-stock-code") + public void insertStockCode(){ + saveStockDataService.insertStockCode(); + } + @GetMapping(value = "/insert-stock-price") + public void insertStockPrice() throws IOException { + saveStockDataService.insertStockPrice(); + } +} diff --git a/src/main/java/com/example/coin/controller/TradeCoinController.java b/src/main/java/com/example/coin/controller/TradeCoinController.java new file mode 100644 index 0000000..c7e1cd1 --- /dev/null +++ b/src/main/java/com/example/coin/controller/TradeCoinController.java @@ -0,0 +1,36 @@ +package com.example.coin.controller; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class TradeCoinController { + @PostMapping (value = "/buy-coin") + public ResponseEntity buyCoin( + HttpServletRequest request, + @RequestParam("coinName")String coinName, + @RequestParam("coinPrice")String coinPrice, + @RequestParam("amount") String amount){// 매수 할 금액(krw) + HttpSession session = request.getSession(); + String userId = String.valueOf(session.getAttribute("ID")); + + return new ResponseEntity<>("buy success",HttpStatus.OK); + } + + + @PostMapping (value = "/sell-coin") + public ResponseEntity sellCoin(HttpServletRequest request , + @RequestParam("coinName")String coinName, + @RequestParam("amount") String amount){//매도 할 금액(krw) + + return new ResponseEntity<>("sell success",HttpStatus.OK); + } +} diff --git a/src/main/java/com/example/coin/controller/UserAssetController.java b/src/main/java/com/example/coin/controller/UserAssetController.java new file mode 100644 index 0000000..9a77211 --- /dev/null +++ b/src/main/java/com/example/coin/controller/UserAssetController.java @@ -0,0 +1,26 @@ +package com.example.coin.controller; + + +import com.example.coin.bithumb.UserAsset; +import com.example.coin.dto.UserAssetDto; +import com.example.coin.getUserCash; +import com.example.coin.service.UserAssetService; +import lombok.RequiredArgsConstructor; +import org.json.JSONException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class UserAssetController { + private final UserAssetService userAssetService; + @GetMapping(value = "/get-user-cash") + public ResponseEntity getUSerCash () throws JSONException, IOException { + return new ResponseEntity<>(userAssetService.getUserAsset(), HttpStatus.OK); + } +} diff --git a/src/main/java/com/example/coin/csv/stock.csv b/src/main/java/com/example/coin/csv/stock.csv new file mode 100644 index 0000000..5cbec8b --- /dev/null +++ b/src/main/java/com/example/coin/csv/stock.csv @@ -0,0 +1,2832 @@ +ڵ,,屸,ҼӺ,,,,ð,,,ŷ,ŷ,ðѾ,ֽļ +"060310","3S","KOSDAQ","߰߱","1957","-58","-2.88","1994","2015","1920","274934","537827274","99972644394","51084642" +"095570","AJƮ","KOSPI",,"4420","-55","-1.23","4475","4495","4370","57938","255663225","200017194780","45252759" +"006840","AKȦ","KOSPI",,"12940","-60","-0.46","12990","13060","12700","1823","23448020","171423439340","13247561" +"054620","APS","KOSDAQ","߰߱","5340","-130","-2.38","5600","5630","5210","23867","126316890","106235140140","19894221" +"265520","APý","KOSDAQ","췮","16470","-760","-4.41","17200","17200","16370","275297","4556071000","251685003870","15281421" +"211270","AP","KOSDAQ","ó","10030","-260","-2.53","10240","10350","9980","84245","847679840","151275509120","15082304" +"109960","APコɾ","KOSDAQ","߰߱","625","-31","-4.73","649","660","625","74048","47105314","71345730625","114153169" +"139050","BF","KOSDAQ","(ҼӺξ)","2805","0","0.00","0","0","0","0","0","24247965555","8644551" +"027410","BGF","KOSPI",,"3440","-15","-0.43","3445","3470","3420","57626","197704235","329265761040","95716791" +"282330","BGF","KOSPI",,"118200","-2300","-1.91","121000","121000","117600","37420","4446635500","2042957689200","17283906" +"126600","BGFڸƼ","KOSDAQ","췮","3800","-5","-0.13","3810","3810","3700","63194","236263010","238514216200","62766899" +"138930","BNK","KOSPI",,"9930","-20","-0.20","10000","10000","9890","602778","5989480550","3181936699110","320436727" +"001460","BYC","KOSPI",,"33550","-250","-0.74","33850","34050","33350","298","9983350","209558332500","6246150" +"001465","BYC","KOSPI",,"13400","150","1.13","13250","13410","12950","9304","121076290","28861590000","2153850" +"013720","CBI","KOSDAQ","߰߱","1161","-1","-0.09","1162","1182","1149","148177","171404872","51813265896","44628136" +"083790","CGι","KOSDAQ","ó","2325","-55","-2.31","2380","2380","2255","95788","219474315","178778973150","76894182" +"001040","CJ","KOSPI",,"117000","2400","2.09","114600","117600","112200","93472","10836445700","3413708766000","29176998" +"079160","CJ CGV","KOSPI",,"6730","20","0.30","6760","6880","6540","927089","6268379330","1114351636740","165579738" +"035760","CJ ENM","KOSDAQ GLOBAL","߰߱","74100","-1900","-2.50","76000","76000","74100","29390","2193591700","1624950311400","21929154" +"311690","CJ ̿̾","KOSDAQ","","11850","-200","-1.66","12050","12060","11790","3242","38544840","107983148700","9112502" +"00104K","CJ4(ȯ)","KOSPI",,"91500","2600","2.92","88500","91500","85900","16500","1471558700","386725848000","4226512" +"000120","CJ","KOSPI",,"100800","3400","3.49","97400","102500","97100","229007","23041874400","2299484275200","22812344" +"011150","CJǪ","KOSPI",,"3220","-40","-1.23","3240","3285","3150","247535","791866570","115697089060","35930773" +"011155","CJǪ1","KOSPI",,"17500","-1120","-6.02","18620","18620","17310","1255","22011120","3500000000","200000" +"001045","CJ","KOSPI",,"60100","600","1.01","59400","60500","59000","8400","501683900","135839402300","2260223" +"097950","CJ","KOSPI",,"307000","-3500","-1.13","313000","313000","306000","13637","4197718000","4621635102000","15054186" +"097955","CJ ","KOSPI",,"136300","-700","-0.51","137400","137400","134600","2875","389754100","180929117900","1327433" +"051500","CJÿ","KOSDAQ","췮","17700","-420","-2.32","18130","18250","17690","16432","292816000","210127072200","11871586" +"058820","CMG","KOSDAQ","췮","2080","-40","-1.89","2100","2115","2065","299603","622862955","288895867520","138892244" +"023460","CNH","KOSDAQ","ȯ(ҼӺξ)","430","-43","-9.09","476","478","426","2569351","1148023568","15996000000","37200000" +"056730","CNT85","KOSDAQ","߰߱","789","3","0.38","786","798","763","30771","24003236","58473725754","74111186" +"000480","CRȦ","KOSPI",,"5590","-30","-0.53","5610","5690","5550","12100","67462420","262117839100","46890490" +"065770","CS","KOSDAQ","ó","1035","-15","-1.43","1050","1050","1034","14516","15148278","20090519550","19411130" +"083660","CSA ڽ","KOSDAQ","߰߱","980","2","0.20","967","1016","959","63741","62181158","60022237380","61247181" +"000590","CSȦ","KOSPI",,"66500","-100","-0.15","66600","67500","66000","1329","88961000","76773053000","1154482" +"012030","DB","KOSPI",,"1275","-57","-4.28","1332","1530","1274","17607326","24800168937","256496764575","201173933" +"456440","DB11ȣ","KOSDAQ","SPAC(ҼӺξ)","2205","-25","-1.12","2260","2260","2200","27059","59819975","11719575000","5315000" +"477760","DB12ȣ","KOSDAQ","SPAC(ҼӺξ)","2060","5","0.24","2070","2070","2055","4177","8602580","12030400000","5840000" +"016610","DB","KOSPI",,"5900","1040","21.40","5160","6280","5050","8072729","47173203130","250433695100","42446389" +"005830","DBغ","KOSPI",,"117800","-300","-0.25","118000","118200","116400","73076","8588604500","8340240000000","70800000" +"000990","DB","KOSPI",,"36500","-900","-2.41","37350","37900","36500","231226","8529667600","1620548462000","44398588" +"139130","DGB","KOSPI",,"8210","-60","-0.73","8330","8330","8150","269139","2214735760","1388687288930","169145833" +"099520","DGI","KOSDAQ","(ҼӺξ)","1284","0","0.00","0","0","0","0","0","58141862016","45281824" +"060900","DGP","KOSDAQ","߰߱","1006","-14","-1.37","1008","1029","991","95493","95860587","25409778374","25258229" +"290120","DH丮","KOSDAQ","췮","2660","-60","-2.21","2735","2735","2585","20577","54933740","41270267080","15515138" +"025440","DH","KOSDAQ","߰߱","232","-6","-2.52","240","240","230","140231","32726120","35706219840","153906120" +"001530","DI","KOSPI",,"30950","50","0.16","30900","31050","30450","76251","2349045250","780425048400","25215672" +"000210","DL","KOSPI",,"42100","-1050","-2.43","43000","43000","41550","80684","3400418600","882242716400","20955884" +"000215","DL","KOSPI",,"22500","-1250","-5.26","24250","24250","22350","8175","184292350","37937587500","1686115" +"375500","DL̾ؾ","KOSPI",,"30150","-400","-1.31","30600","30600","29800","140029","4215018150","1166612733450","38693623" +"37550L","DL̾ؾ2(ȯ)","KOSPI",,"20700","-550","-2.59","21500","21500","20650","2604","54173650","43717385700","2111951" +"37550K","DL̾ؾ","KOSPI",,"15610","-260","-1.64","15700","16020","15600","5613","87887510","32997744850","2113885" +"068790","DMS","KOSDAQ","췮","5630","-180","-3.10","5700","5810","5610","37562","212856960","138346333430","24573061" +"007340","DNƼ","KOSPI",,"90400","-1500","-1.63","91400","92400","90300","10657","973988000","903458052000","9994005" +"004840","DRB","KOSPI",,"4590","-90","-1.92","4630","4665","4580","21763","100270850","91478700000","19930000" +"241520","DSCκƮƮ","KOSDAQ","߰߱","2890","-90","-3.02","2995","3005","2870","58937","171519090","79463801250","27496125" +"155660","DSR","KOSPI",,"3870","-55","-1.40","3940","3940","3800","16257","62547670","61920000000","16000000" +"069730","DSR","KOSPI",,"3775","-120","-3.08","3895","3895","3760","22101","84000075","54360000000","14400000" +"017860","DSܼ","KOSPI",,"71600","-5000","-6.53","76900","77300","71600","123667","9072771100","419676526400","5861404" +"180400","DXVX","KOSDAQ","߰߱","2510","-320","-11.31","2930","3015","2510","2051022","5672697585","75850774320","30219432" +"017940","E1","KOSPI",,"73100","-1700","-2.27","75400","75400","72600","17307","1267172000","501466000000","6860000" +"245620","EDGC","KOSDAQ","(ҼӺξ)","415","0","0.00","0","0","0","0","0","57474989665","138493951" +"037370","EG","KOSDAQ","߰߱","7190","-210","-2.84","7400","7400","7120","41540","298503830","62013548680","8624972" +"278990","EMB","KONEX","Ϲݱ","6190","90","1.48","6190","6190","6190","1","6190","29721786390","4801581" +"365550","ESR˴޽","KOSPI",,"5090","0","0.00","5090","5210","5090","431754","2225270170","1084623010000","213089000" +"050120","ESť","KOSDAQ","߰߱","2090","-40","-1.88","2130","2400","1965","885630","1938891512","28348939740","13564086" +"383220","F&F","KOSPI",,"56000","-2600","-4.44","59100","59500","55800","67458","3817501900","2145196200000","38307075" +"007700","F&FȦ","KOSPI",,"13200","-140","-1.05","13340","13540","13120","7232","95613180","516309644400","39114367" +"214270","FSN","KOSDAQ","߰߱","1741","-48","-2.68","1910","2140","1740","6187441","12328479560","57889056083","33250463" +"130500","GHż","KOSDAQ","췮","3105","35","1.14","3070","3200","3010","156204","484236525","45162386460","14545052" +"114090","GKL","KOSPI",,"11620","-450","-3.73","12230","12250","11570","305513","3581690290","718762885400","61855670" +"900290","GRT","KOSDAQ","ܱ(ҼӺξ)","3925","-105","-2.61","4025","4080","3825","107442","424265110","264446875000","67375000" +"078930","GS","KOSPI",,"46650","-800","-1.69","48000","48000","46150","70417","3302981850","4334502383700","92915378" +"083450","GST","KOSDAQ","췮","13770","-820","-5.62","14520","14650","13750","561209","7856731760","256373440200","18618260" +"006360","GSǼ","KOSPI",,"18250","-550","-2.93","18910","18980","18080","821503","14996049550","1561862192500","85581490" +"001250","GS۷ι","KOSPI",,"3275","-130","-3.82","3355","3405","3170","3158141","10297949320","270298077100","82533764" +"007070","GS","KOSPI",,"22550","0","0.00","22750","22750","22200","215201","4849365450","2361389141100","104717922" +"078935","GS","KOSPI",,"43300","400","0.93","42600","44150","42050","29098","1257061750","77282965800","1784826" +"297890","HBַ","KOSDAQ","췮","4015","-175","-4.18","4150","4200","3990","948159","3836514145","293660769710","73140914" +"440290","HBκƮƮ","KOSDAQ","߰߱","1959","-41","-2.05","2000","2010","1951","45265","89244588","53102632590","27107010" +"078150","HBũ","KOSDAQ","췮","2320","-80","-3.33","2415","2425","2270","1573834","3639258420","215100925120","92715916" +"012630","HDC","KOSPI",,"10830","-130","-1.19","10960","11050","10740","140721","1531664390","647002838430","59741721" +"039570","HDC","KOSPI",,"8090","-110","-1.34","8120","8220","8080","11241","91442850","209996992090","25957601" +"089470","HDCEP","KOSPI",,"4380","-10","-0.23","4350","5390","4305","5340745","26217052815","139722000000","31900000" +"294870","HDC","KOSPI",,"24750","-650","-2.56","25300","25500","24100","615386","15239752450","1631206417500","65907330" +"009540","HDѱؾ","KOSPI",,"170500","2500","1.49","168000","171700","163100","359721","60468308400","12066816278000","70773116" +"267250","HD","KOSPI",,"77400","800","1.04","77200","77600","75800","87988","6770471600","6114064779000","78993085" +"267270","HDǼ","KOSPI",,"46850","-2050","-4.19","48900","48900","46450","199008","9381400600","882986447600","18847096" +"443060","HD븶ַ","KOSPI",,"102900","-500","-0.48","103500","105700","102100","117797","12144730500","4573905000000","44450000" +"071970","HD븶","KOSPI",,"16260","-210","-1.28","16320","16360","15660","472699","7590544990","551495932140","33917339" +"010620","HD","KOSPI",,"94600","-1800","-1.87","96400","97400","93200","219654","20794128700","3778527295400","39942149" +"322000","HD뿡ַ","KOSPI",,"23050","-650","-2.74","23600","23950","22900","120794","2804361250","258160000000","11200000" +"042670","HDھ","KOSPI",,"6650","-50","-0.75","6680","6730","6530","718901","4746654960","1281161515550","192655867" +"267260","HDϷƮ","KOSPI",,"239000","-6000","-2.45","245000","245500","228500","691238","164171532500","8615265265000","36047135" +"329180","HD߰","KOSPI",,"175900","-3000","-1.68","179700","179700","172300","197549","34558131800","15615191104400","88773116" +"097230","HJ߰","KOSPI",,"2710","-75","-2.69","2780","2830","2700","85944","233947905","225673301510","83274281" +"195940","HK̳뿣","KOSDAQ GLOBAL","߰߱","44550","-100","-0.22","44000","45200","43250","384735","17086691450","1262096644050","28329891" +"014790","HL D&I","KOSPI",,"2565","-35","-1.35","2600","2640","2540","89009","227622050","97107311565","37858601" +"028300","HLB","KOSDAQ","߰߱","85400","-2100","-2.40","87800","87900","84100","816811","69621262300","11177610085600","130885364" +"003580","HLB۷ι","KOSPI",,"5030","-90","-1.76","5140","5140","4975","133687","669314930","238872642730","47489591" +"278650","HLB̿","KOSDAQ","췮","2380","-55","-2.26","2500","2500","2375","156731","375155785","206418801820","86730589" +"343090","HLB̾","KONEX","Ϲݱ","2185","-5","-0.23","2275","2275","2120","657","1407330","35922289295","16440407" +"067630","HLB","KOSDAQ","߰߱","11180","-130","-1.15","11310","11310","10970","397085","4412111920","1326767180960","118673272" +"024850","HLB̳뺣̼","KOSDAQ","߰߱","3210","-190","-5.59","3400","3420","3190","678932","2204770100","289381333080","90149948" +"047920","HLB","KOSDAQ","","26250","-600","-2.23","26950","26950","25700","203650","5327266950","834749842500","31799994" +"115450","HLB׶ǻƽ","KOSDAQ","߰߱","8690","-210","-2.36","8900","8900","8500","326260","2809688040","696416017770","80139933" +"046210","HLBij","KOSDAQ","ó","3310","0","0.00","3345","3415","3230","76202","249317810","139657214720","42192512" +"204320","HL","KOSPI",,"32100","50","0.16","32050","32300","31600","160127","5130174950","1507323552000","46957120" +"060980","HLȦ","KOSPI",,"34600","-100","-0.29","34750","34850","34350","12146","420461500","351861586000","10169410" +"011200","HMM","KOSPI",,"16270","-530","-3.15","16710","16870","16220","761044","12518367070","12186872599920","749039496" +"403870","HPSP","KOSDAQ GLOBAL","߰߱","24550","-750","-2.96","25200","25350","24300","638938","15692301350","2036033235200","82934144" +"036640","HRS","KOSDAQ","췮","5230","275","5.55","4955","5450","4855","975505","5125700970","85535604000","16354800" +"035000","HSֵ","KOSPI",,"6340","-40","-0.63","6380","6380","6340","4376","27784220","105037373060","16567409" +"002460","HSȭ","KOSPI",,"8830","-80","-0.90","8880","8910","8800","7092","62683960","89624500000","10150000" +"487570","HSȿ","KOSPI",,"41900","-1050","-2.44","42800","43150","40800","11878","500684600","156116341300","3725927" +"439730","IBKS20ȣ","KOSDAQ","SPAC(ҼӺξ)","2260","20","0.89","2275","2275","2230","1596","3576025","9740600000","4310000" +"442770","IBKS21ȣ","KOSDAQ","SPAC(ҼӺξ)","2225","-15","-0.67","2240","2240","2205","763","1688435","9367250000","4210000" +"448760","IBKS22ȣ","KOSDAQ","SPAC(ҼӺξ)","2200","-15","-0.68","2210","2210","2185","1722","3775115","9746000000","4430000" +"467930","IBKS23ȣ","KOSDAQ","SPAC(ҼӺξ)","2170","0","0.00","2155","2170","2145","4404","9469550","9179100000","4230000" +"469480","IBKS24ȣ","KOSDAQ","SPAC(ҼӺξ)","2190","-5","-0.23","2195","2195","2175","10949","23888575","9263700000","4230000" +"003560","IHQ","KOSPI",,"10760","0","0.00","0","0","0","0","0","62107613080","5772083" +"095340","ISC","KOSDAQ","췮","46800","-1900","-3.90","48150","48350","46700","105672","4976438650","992022314400","21197058" +"175330","JB","KOSPI",,"14410","-80","-0.55","14610","14610","14130","208769","2993920840","2811148883180","195083198" +"950170","JTC","KOSDAQ","ܱ(ҼӺξ)","4240","-80","-1.85","4300","4375","4140","39626","166372220","219404515520","51746348" +"234080","JW","KOSPI",,"10980","-90","-0.81","11150","11150","10920","17384","190351970","173863402920","15834554" +"067290","JWž","KOSDAQ","߰߱","1518","-23","-1.49","1528","1550","1482","129607","194313487","77177400036","50841502" +"001060","JW߿","KOSPI",,"27000","-800","-2.88","27400","27850","26650","113200","3061762450","628720110000","23285930" +"001067","JW߿2B","KOSPI",,"57700","300","0.52","56500","57700","56500","45","2587300","12115442100","209973" +"001065","JW߿","KOSPI",,"31150","300","0.97","30450","31150","30050","450","13771200","10651773650","341951" +"096760","JWȦ","KOSPI",,"3020","-40","-1.31","3045","3060","3000","38742","117164580","223253324840","73924942" +"035900","JYP Ent.","KOSDAQ GLOBAL","췮","44450","-1250","-2.74","45700","46100","44450","295499","13264270350","1579419269400","35532492" +"318000","KBG","KOSDAQ","ó","6040","-310","-4.88","6300","6470","5980","147203","901402900","52790946920","8740223" +"024840","KBIŻ","KOSDAQ","߰߱","2670","-55","-2.02","2685","2735","2610","760600","2019192895","93207561330","34909199" +"105560","KB","KOSPI",,"83300","-1300","-1.54","84000","84400","82500","707380","59000290300","32780917635900","393528423" +"432320","KBŸ","KOSPI",,"4405","30","0.69","4375","4405","4335","65628","287620735","446729925425","101414285" +"024120","KBý","KOSDAQ","߰߱","3600","-90","-2.44","3630","3665","3600","19843","71795260","41400000000","11500000" +"455250","KB25ȣ","KOSDAQ","SPAC(ҼӺξ)","2640","0","0.00","0","0","0","0","0","11365200000","4305000" +"458320","KB26ȣ","KOSDAQ","SPAC(ҼӺξ)","2485","0","0.00","0","0","0","0","0","13679925000","5505000" +"464680","KB27ȣ","KOSDAQ","SPAC(ҼӺξ)","1999","1","0.05","1999","2000","1985","6438","12850480","25797095000","12905000" +"476470","KB28ȣ","KOSDAQ","SPAC(ҼӺξ)","2110","-20","-0.94","2100","2120","2100","1650","3467280","11615550000","5505000" +"478390","KB29ȣ","KOSDAQ","SPAC(ҼӺξ)","2055","5","0.24","2050","2055","2045","16206","33205150","12782100000","6220000" +"002380","KCC","KOSPI",,"298500","-1500","-0.50","301500","308500","297500","33606","10177401000","2652611593500","8886471" +"021320","KCCǼ","KOSDAQ","췮","4410","-90","-2.00","4500","4500","4370","11286","49650820","94374000000","21400000" +"344820","KCC۶","KOSPI",,"39750","-550","-1.36","40250","40300","39700","17600","701423400","634827852000","15970512" +"036670","KCI","KOSDAQ","췮","7300","-80","-1.08","7300","7430","7190","10824","78548890","82271000000","11270000" +"009070","KCTC","KOSPI",,"5580","-220","-3.79","5760","6410","5500","9709859","58594656300","167400000000","30000000" +"009440","KC׸Ȧ","KOSPI",,"1086","250","29.90","1030","1086","986","1732411","1842156909","24364388280","22434980" +"112190","KC","KONEX","Ϲݱ","1389","-9","-0.64","1498","1498","1334","1499","2003486","9896976417","7125253" +"119650","KCƮ","KOSPI",,"523","120","29.78","498","523","484","1347614","697369413","33299037101","63669287" +"044180","KD","KOSDAQ","ȯ(ҼӺξ)","472","20","4.42","448","472","436","202950","91181619","12610801128","26717799" +"092220","KEC","KOSPI",,"998","0","0.00","1001","1048","986","2177010","2194472677","200361614718","200763141" +"046440","KG","KOSDAQ","췮","4390","-55","-1.24","4405","4440","4355","26144","114594745","170444243520","38825568" +"003620","KGƼ","KOSPI",,"5560","-120","-2.11","5730","5730","5540","375403","2094918810","1091787020320","196364572" +"016380","KGƿ","KOSPI",,"5790","-50","-0.86","5850","5890","5630","236235","1365284400","579051513630","100008897" +"151860","KGڼַ","KOSDAQ","췮","5480","-90","-1.62","5510","5600","5410","98011","537464150","271824450960","49603002" +"035600","KG̴Ͻý","KOSDAQ","췮","9360","-160","-1.68","9540","9580","9330","116722","1097804550","261185502240","27904434" +"001390","KGɹĮ","KOSPI",,"4050","-155","-3.69","4160","4215","4045","189494","774507620","277299612000","68469040" +"226360","KH Ǽ","KOSDAQ","ȯ(ҼӺξ)","2555","0","0.00","0","0","0","0","0","60698450260","23756732" +"111870","KH ̷","KOSDAQ","(ҼӺξ)","8910","0","0.00","0","0","0","0","0","43928518590","4930249" +"033180","KH ʷ轺","KOSPI",,"6630","0","0.00","0","0","0","0","0","125330728770","18903579" +"060720","KH","KOSDAQ","췮","9900","-70","-0.70","9940","10070","9800","106625","1053999270","234406675800","23677442" +"015590","KIB÷׿","KOSPI",,"440","3","0.69","437","451","425","545420","235641029","104271879360","236981544" +"001940","KISCOȦ","KOSPI",,"18580","-360","-1.90","18670","18880","18560","3548","66114050","300557140400","16176380" +"058400","KNN","KOSDAQ","췮","732","-28","-3.68","753","764","732","140919","104929386","96938555040","132429720" +"025000","KPXɹĮ","KOSPI",,"46450","-750","-1.59","47250","47300","43950","6709","310546250","224818000000","4840000" +"092230","KPXȦ","KOSPI",,"55400","-500","-0.89","56400","56500","55400","1373","76632600","234045388400","4224646" +"000040","KRͽ","KOSPI",,"557","-5","-0.89","562","564","535","130437","71332764","33494007476","60132868" +"044450","KSSؿ","KOSPI",,"8990","-80","-0.88","9100","9100","8940","38936","350659990","207542061200","23085880" +"101000","KSδƮ","KOSDAQ","߰߱","2295","60","2.68","2220","2330","2220","92942","211406660","69193375605","30149619" +"030200","KT","KOSPI",,"41200","0","0.00","41200","41800","40950","991964","41074791700","10383293422000","252021685" +"033780","KT&G","KOSPI",,"111400","2500","2.30","110000","113500","109200","720222","80577949700","14517926165800","130322497" +"058850","KTcs","KOSPI",,"2420","-85","-3.39","2500","2505","2400","323690","786941375","103297700000","42685000" +"058860","KTis","KOSPI",,"2440","-25","-1.01","2450","2460","2415","39368","95675620","84916880000","34802000" +"122450","KX","KOSDAQ","췮","3635","-175","-4.59","3775","3830","3600","65581","239976390","164796229140","45335964" +"052900","KX","KOSDAQ","췮","994","-13","-1.29","1003","1014","985","45857","45576287","54776871898","55107517" +"376190","LB","KOSDAQ","߰߱","4500","-20","-0.44","4430","4595","4430","10841","48748455","110700000000","24600000" +"061970","LB","KOSDAQ","췮","4095","-170","-3.99","4220","4300","4085","150915","625383010","179297904240","43784592" +"309960","LBκƮƮ","KOSDAQ","߰߱","3800","-115","-2.94","3915","3915","3645","61123","230168005","88225508200","23217239" +"093050","LF","KOSPI",,"14190","0","0.00","14190","14220","14000","26654","376382880","414915600000","29240000" +"003550","LG","KOSPI",,"84600","-1200","-1.40","86000","86300","84600","130210","11108175300","13307664007800","157300993" +"034220","LG÷","KOSPI",,"10690","0","0.00","10750","10890","10530","785030","8404797210","5345000000000","500000000" +"051900","LGȰǰ","KOSPI",,"339000","-5000","-1.45","344000","344500","338500","39272","13381455500","5294568783000","15618197" +"051905","LGȰǰ","KOSPI",,"155500","-3800","-2.39","159600","165000","149800","2530","394237400","326502883500","2099697" +"373220","LGַ","KOSPI",,"395000","-15000","-3.66","412000","412500","392500","419682","168861466500","92430000000000","234000000" +"003555","LG","KOSPI",,"60800","0","0.00","61200","61500","60500","6854","418544400","183714496000","3021620" +"032640","LG÷","KOSPI",,"9890","0","0.00","9910","9930","9850","1041844","10312780570","4318086360290","436611361" +"011070","LG̳","KOSPI",,"231500","-7000","-2.94","240000","243000","229000","184530","43146865000","5478935270500","23667107" +"066570","LG","KOSPI",,"100800","-3300","-3.17","104400","104400","100800","655369","66819626300","16495699651200","163647814" +"066575","LGڿ","KOSPI",,"48750","-300","-0.61","49000","49100","48400","38255","1867748200","837817110000","17185992" +"037560","LGκ","KOSPI",,"2540","-90","-3.42","2610","2645","2540","169253","434709505","196715037100","77446865" +"051910","LGȭ","KOSPI",,"311500","-10000","-3.11","321500","323500","308500","274201","85941609500","21989514844500","70592343" +"051915","LGȭп","KOSPI",,"202000","-9500","-4.49","213500","214000","201500","14583","2992280500","1553137600000","7688800" +"079550","LIGؽ","KOSPI",,"175000","-7200","-3.95","181600","182000","173700","201305","35427366000","3850000000000","22000000" +"225190","LK","KOSDAQ","߰߱","2085","480","29.91","1605","2085","1549","39110286","74972076038","105810497400","50748440" +"006260","LS","KOSPI",,"97800","-3200","-3.17","100500","101000","95400","349639","33931691700","3149160000000","32200000" +"010120","LS ELECTRIC","KOSPI",,"133000","-2900","-2.13","136100","136400","129300","427153","56565124700","3990000000000","30000000" +"000680","LSƮ","KOSPI",,"3235","-65","-1.97","3305","3330","3160","117295","378324470","254927756760","78803016" +"060370","LSַ","KOSDAQ","߰߱","16640","-610","-3.54","17200","17200","16460","197555","3320733180","477680835840","28706781" +"417200","LSƮ","KOSDAQ","߰߱","16660","-890","-5.07","17400","17600","16660","329090","5559285790","1127093298940","67652659" +"229640","LSڿ","KOSPI",,"22900","-1050","-4.38","24000","24100","22900","145931","3374212050","701309729100","30624879" +"078020","LS","KOSDAQ","췮","4555","10","0.22","4550","4610","4320","49742","223493945","252716820450","55481190" +"108320","LX","KOSPI",,"61200","-2000","-3.16","63600","63700","60700","60038","3684307700","995375160000","16264300" +"001120","LXͳų","KOSPI",,"29900","100","0.34","29950","29950","29450","129880","3863064300","1158924000000","38760000" +"108670","LXϿý","KOSPI",,"39350","-250","-0.63","39400","40300","38950","19848","779335750","352877814500","8967670" +"108675","LXϿý","KOSPI",,"22900","500","2.23","22450","23000","22400","11416","261188450","23640357000","1032330" +"383800","LXȦ","KOSPI",,"6920","-60","-0.86","6980","6980","6880","70017","484888760","527862374800","76280690" +"38380K","LXȦ1","KOSPI",,"8770","-90","-1.02","8910","8910","8660","654","5739060","12850549450","1465285" +"476080","M83","KOSDAQ","߰߱","22800","-3300","-12.64","26300","27750","22800","2013877","50353999400","177498000000","7785000" +"086960","MDSũ","KOSDAQ","߰߱","1037","-41","-3.80","1068","1083","1037","346644","363188275","90915644156","87671788" +"023150","MHź","KOSPI",,"6090","10","0.16","6100","6150","5950","9201","55673090","44935223340","7378526" +"038340","MIT","KOSDAQ","(ҼӺξ)","1233","0","0.00","0","0","0","0","0","39979891836","32424892" +"035420","NAVER","KOSPI",,"157200","-2600","-1.63","160200","160600","157100","649137","102694316300","25275324657600","160784508" +"160550","NEW","KOSDAQ","߰߱","2155","-80","-3.58","2220","2265","2105","120153","257404580","60137658430","27906106" +"053290","NEɷ","KOSDAQ","췮","3365","-110","-3.17","3440","3500","3300","126791","426632825","55611023055","16526307" +"181710","NHN","KOSPI",,"17980","-1270","-6.60","19240","19250","17910","145001","2641305060","607114891540","33766123" +"060250","NHN KCP","KOSDAQ GLOBAL","췮","7470","-90","-1.19","7500","7560","7450","185124","1388820520","299999764170","40160611" +"104200","NHN","KOSDAQ","߰߱","3420","-95","-2.70","3485","3590","3410","36163","124353035","50710221000","14827550" +"400760","NHÿ","KOSPI",,"3725","-5","-0.13","3765","3765","3675","26438","98001105","157195000000","42200000" +"005940","NH","KOSPI",,"13770","-70","-0.51","13820","13890","13620","469672","6473156690","4509568957230","327492299" +"005945","NHǿ","KOSPI",,"11870","-50","-0.42","11920","11920","11780","69230","819793260","223998390160","18870968" +"338100","NHӸ","KOSPI",,"4515","0","0.00","4515","4515","4500","14314","64593575","84249900000","18660000" +"034310","NICE","KOSPI",,"11010","-250","-2.22","11250","11250","11010","13101","145586910","412913281770","37503477" +"030190","NICE","KOSPI",,"9810","60","0.62","9830","9890","9700","102097","998416670","589656242700","60107670" +"008260","NIƿ","KOSPI",,"3975","-10","-0.25","3945","3985","3890","40762","160435175","113685465075","28600117" +"004250","NPC","KOSPI",,"4700","-65","-1.36","4820","4820","4560","80597","380813180","172584000000","36720000" +"004255","NPC","KOSPI",,"2525","-55","-2.13","2545","2585","2455","6950","17437295","13332000000","5280000" +"222160","NPX","KOSDAQ","(ҼӺξ)","8040","0","0.00","0","0","0","0","0","79551289560","9894439" +"456040","OCI","KOSPI",,"78600","-1600","-2.00","80300","80300","77600","13899","1092957900","703666107000","8952495" +"010060","OCIȦ","KOSPI",,"67600","-200","-0.29","67500","68400","66900","28581","1930024500","1322525250800","19563983" +"178920","PI÷ܼ","KOSPI",,"23050","-1100","-4.55","24450","24450","23000","52461","1226390800","676893722100","29366322" +"024940","PNdz","KOSDAQ","ó","4090","-210","-4.88","4300","4300","4090","53248","221717045","40900000000","10000000" +"005490","POSCOȦ","KOSPI",,"330000","-12500","-3.65","342500","346500","327500","343578","114468207500","27266044410000","82624377" +"218410","RFHIC","KOSDAQ","췮","11140","-160","-1.42","11160","11490","10950","87370","968555740","295036683880","26484442" +"327260","RFƮ","KOSDAQ","ó","6580","-400","-5.73","6850","6950","6550","68578","457240720","55490659980","8433231" +"091340","S&K","KOSDAQ","߰߱","2690","10","0.37","2680","2690","2585","29360","77430510","31483009490","11703721" +"010950","S-Oil","KOSPI",,"59000","0","0.00","58900","59400","58700","133724","7893474200","6642384728000","112582792" +"010955","S-Oil","KOSPI",,"42000","-450","-1.06","42650","42650","41950","10919","459533050","168920934000","4021927" +"419530","SAMG","KOSDAQ","","12010","-300","-2.44","12310","12340","11870","63448","766146240","103177069300","8590930" +"019550","SBIκƮƮ","KOSDAQ","߰߱","710","-48","-6.33","756","756","708","340825","246374061","115067268250","162066575" +"950110","SBIũַ","KOSDAQ","ܱ(ҼӺξ)","2360","0","0.00","2410","2410","2265","7480","17427045","56763994400","24052540" +"034120","SBS","KOSPI",,"15330","30","0.20","15420","15460","15250","33469","513094990","284390478540","18551238" +"036120","SCI","KOSDAQ","߰߱","2920","45","1.57","2820","3025","2810","1870692","5505501430","103660000000","35500000" +"246960","SCL̾","KOSDAQ","","9110","-60","-0.65","9040","9400","9040","4494","41084500","66351783110","7283401" +"099220","SDN","KOSDAQ","߰߱","1215","-51","-4.03","1265","1269","1210","401235","492892232","68248750365","56171811" +"036540","SFAݵü","KOSDAQ","췮","3445","-115","-3.23","3540","3565","3425","676755","2353457950","566565743835","164460303" +"255220","SG","KOSDAQ","߰߱","2600","0","0.00","2565","2665","2460","3056261","7846232255","241741331000","92977435" +"040610","SG&G","KOSDAQ","߰߱","1548","-11","-0.71","1559","1565","1535","33042","50938609","52766979408","34087196" +"049470","SGA","KOSDAQ","߰߱","376","-19","-4.81","395","398","366","498034","187977346","22132205624","58862249" +"184230","SGAַ","KOSDAQ","ó","486","-33","-6.36","519","525","486","383439","191590319","30423192246","62599161" +"016250","SGC E&C","KOSDAQ","췮","15260","-460","-2.93","16140","16140","15240","8405","129447720","49497107100","3243585" +"005090","SGC","KOSPI",,"27100","-300","-1.09","27300","27400","26600","23241","626308650","390492924300","14409333" +"001380","SG۷ι","KOSPI",,"2460","45","1.86","2420","2580","2380","438804","1086648080","110611791780","44964143" +"004060","SG蹰","KOSPI",,"348","-3","-0.85","348","352","340","985630","340558011","70443886080","202424960" +"001770","SHD","KOSPI",,"15560","-330","-2.08","15890","15890","15550","1317","20768300","18903501680","1214878" +"002360","SHȭ","KOSPI",,"504","-14","-2.70","510","517","504","402053","205116950","56011399920","111133730" +"009160","SIMPAC","KOSPI",,"3975","5","0.13","3940","4050","3935","55235","218735960","260082326100","65429516" +"123700","SJM","KOSPI",,"3195","-70","-2.14","3265","3270","3180","34379","110402410","49857649110","15604898" +"025530","SJMȦ","KOSPI",,"3385","-10","-0.29","3395","3440","3370","7615","25765360","50551617080","14934008" +"034730","SK","KOSPI",,"140900","-1400","-0.98","142700","143500","140000","92661","13063683400","10215630852700","72502703" +"011790","SKC","KOSPI",,"109100","-7800","-6.67","116300","117200","108500","363314","40450742400","4131431311800","37868298" +"018670","SK","KOSPI",,"167400","-1000","-0.59","167500","168600","165100","6914","1154351200","1545142845600","9230244" +"001740","SKƮ","KOSPI",,"4920","-35","-0.71","4985","4985","4820","476618","2324938195","1088687277840","221277902" +"006120","SKĿ","KOSPI",,"33950","-500","-1.45","34400","34400","33950","18457","628828050","637779777250","18785855" +"006125","SKĿ","KOSPI",,"31850","-450","-1.39","32400","32400","31850","1624","51932600","43266791750","1358455" +"210980","SKص","KOSPI",,"9090","-110","-1.20","9120","9200","8850","71663","645161400","169232002380","18617382" +"395400","SK","KOSPI",,"5400","120","2.27","5280","5470","5260","667402","3590934070","1458945955800","270175177" +"302440","SK̿̾","KOSPI",,"51800","-300","-0.58","52100","52600","51500","63886","3312392700","3979677450000","76827750" +"326030","SK̿","KOSPI",,"104100","100","0.10","104000","105800","100500","273737","28322153900","8152409325000","78313250" +"402340","SK","KOSPI",,"70800","-2000","-2.75","73100","73100","70400","275919","19651672200","9540297168000","134749960" +"260870","SKñ׳","KONEX","Ϲݱ","21350","-250","-1.16","21750","21750","20400","8052","167304500","131035838500","6137510" +"361610","SKũ","KOSPI",,"31750","-2750","-7.97","34400","34450","31750","443770","14520388400","2263698546000","71297592" +"100090","SK÷Ʈ","KOSPI",,"13730","-620","-4.32","14240","14350","13730","156513","2191531400","812755148640","59195568" +"03473K","SK","KOSPI",,"121500","-2400","-1.94","123100","124000","120600","3070","373604500","68785402500","566135" +"096770","SK̳뺣̼","KOSPI",,"107200","-200","-0.19","107400","108800","106200","274679","29535454800","10262855248000","95735590" +"096775","SK̳뺣̼ǿ","KOSPI",,"77200","-400","-0.52","77600","78100","77000","2174","168250600","96378487200","1248426" +"475150","SKʹн","KOSPI",,"14350","-700","-4.65","15000","15140","14350","260161","3804245680","402922184350","28078201" +"001510","SK","KOSPI",,"513","-14","-2.66","526","530","509","3437111","1772104646","242438757723","472590171" +"001515","SKǿ","KOSPI",,"2185","-135","-5.82","2290","2290","2090","214317","460200800","8548843090","3912514" +"285130","SKɹĮ","KOSPI",,"47250","-700","-1.46","47900","47900","47000","19611","925575150","815241246750","17253783" +"28513K","SKɹĮ","KOSPI",,"22600","-400","-1.74","22600","23100","22600","4256","96470800","47808695400","2115429" +"017670","SKڷ","KOSPI",,"57800","600","1.05","57400","58800","57200","1322629","76896637829","12414865063400","214790053" +"000660","SK̴н","KOSPI",,"156400","-3000","-1.88","157100","158200","154900","3459914","540878643790","113859569886000","728002365" +"048550","SM C&C","KOSDAQ","߰߱","1646","-41","-2.43","1678","1718","1635","303261","503604294","159192264520","96714620" +"063440","SM Life Design","KOSDAQ","߰߱","1300","-3","-0.23","1291","1314","1261","100034","128131756","59837900200","46029154" +"003570","SNT̳ͽ","KOSPI",,"19900","-250","-1.24","20000","20300","19290","88052","1735583110","661728670300","33252697" +"064960","SNTƼ","KOSPI",,"45150","750","1.69","44600","45350","43800","18563","828946600","660234590400","14623136" +"100840","SNT","KOSPI",,"12750","-580","-4.35","13380","13410","12550","125273","1616920750","263679983250","20680783" +"036530","SNTȦ","KOSPI",,"21900","150","0.69","21900","21950","21550","8524","185081350","357055103400","16303886" +"067160","SOOP","KOSDAQ GLOBAL","췮","97800","-2500","-2.49","101300","101300","97100","57705","5661726000","1124188212600","11494767" +"005610","SPC︳","KOSPI",,"50500","-600","-1.17","51300","52500","50000","7042","354967100","435764954500","8629009" +"011810","STX","KOSPI",,"5170","-250","-4.61","5420","5490","5150","144491","755709470","160362682590","31017927" +"465770","STX׸","KOSPI",,"9330","-670","-6.70","9800","10180","9330","211460","2055270700","66905728560","7171032" +"077970","STX","KOSPI",,"17550","-690","-3.78","18010","18180","17140","243314","4283259920","403806265200","23008904" +"002820","SUN&L","KOSPI",,"3460","170","5.17","3290","3490","3130","37608","122506660","43623641940","12607989" +"289080","SVκƮƮ","KOSDAQ","߰߱","1648","-32","-1.90","1651","1668","1639","131767","217151977","87729632000","53234000" +"084870","TBH۷ι","KOSPI",,"1349","-21","-1.53","1364","1440","1324","23703","32394435","28135848831","20856819" +"002710","TCCƿ","KOSPI",,"31100","-2700","-7.99","33400","34200","30900","275091","8754819800","815245976700","26213697" +"089230","THE E&M","KOSDAQ","߰߱","1350","-27","-1.96","1377","1422","1332","79299","106685717","29541986550","21882953" +"032540","TJ̵","KOSDAQ","췮","5200","0","0.00","5180","5510","5130","15518","80945800","72444366800","13931609" +"022220","TKGְ","KOSDAQ","췮","1213","162","15.41","1065","1320","1065","28619626","35866805403","62826824327","51794579" +"069260","TKGͽ","KOSPI",,"18200","-50","-0.27","18410","18410","18040","29285","530969960","743990301600","40878588" +"007980","TP","KOSPI",,"1290","-25","-1.90","1320","1328","1279","214402","277604335","66015917700","51175130" +"048770","TPC","KOSDAQ","ó","2620","-110","-4.03","2685","2740","2590","37138","97697105","41128736420","15697991" +"246690","TSκƮƮ","KOSDAQ","߰߱","996","-33","-3.21","1025","1035","995","220351","222230887","41311950552","41477862" +"317240","TSƮ","KOSDAQ","(ҼӺξ)","314","0","0.00","0","0","0","0","0","33673649508","107240922" +"002900","TYM","KOSPI",,"2990","-45","-1.48","3010","3080","2965","83724","250239780","134702358440","45050956" +"024070","WISCOM","KOSPI",,"2080","-70","-3.26","2110","2170","2065","9985","21041615","31878991040","15326438" +"057030","YBM","KOSDAQ","߰߱","3220","-115","-3.45","3325","3350","3170","57055","183109020","52526884340","16312697" +"037270","YG PLUS","KOSPI",,"2435","-45","-1.81","2470","2515","2420","109728","268817385","154450613350","63429410" +"040300","YTN","KOSDAQ","췮","2970","0","0.00","2940","3470","2935","3712154","12118023470","124740000000","42000000" +"051390","YW","KOSDAQ","ó","3625","-50","-1.36","3690","3800","3605","19982","74218470","41163209000","11355368" +"052220","iMBC","KOSDAQ","߰߱","2600","-20","-0.76","2585","2665","2540","205822","532268140","59800000000","23000000" +"079940","","KOSDAQ","췮","12950","-440","-3.29","13280","13480","12940","20665","269302770","175287107800","13535684" +"078890","±׷","KOSDAQ","߰߱","3905","-55","-1.39","3920","4000","3795","59271","228817710","67986663085","17410157" +"000500","","KOSPI",,"29800","-1400","-4.49","30850","31200","29800","106341","3209405500","219266790800","7357946" +"399720","Ĩ","KOSDAQ","ó","39650","-2400","-5.71","41850","42200","39400","182388","7309200050","455511888000","11488320" +"296520","̾۷̼","KONEX","Ϲݱ","1631","-269","-14.16","1631","1631","1631","2","3262","7611890048","4667008" +"036620","۷̼","KOSDAQ","췮","3155","25","0.80","3135","3200","3000","636275","1970479425","286300134260","90744892" +"000860","","KOSPI",,"25350","-550","-2.12","26100","26100","25350","18939","485754500","164775000000","6500000" +"198440","ؿ","KOSDAQ","߰߱","1551","-54","-3.36","1618","1618","1551","97626","152975843","94505370696","60931896" +"217730","۹̿","KOSDAQ","","1444","-94","-6.11","1512","1523","1434","475728","696681665","80942191156","56054149" +"035250","","KOSPI",,"17080","-650","-3.67","17780","17820","16980","4050101","70157944190","3654103740000","213940500" +"114190","","KOSDAQ","췮","10750","-730","-6.36","11480","11690","10740","123712","1360973240","280822658500","26123038" +"094480","þƸӴƮ","KOSDAQ","߰߱","8300","-220","-2.58","8700","8900","8200","4239604","36272332350","325607655400","39229838" +"011420","þƿ","KOSPI",,"2530","-70","-2.69","2730","2835","2460","16884076","44934257620","69700599320","27549644" +"039240","泲ƿ","KOSDAQ","췮","2745","-25","-0.90","2745","2815","2730","34625","95018650","74059012980","26979604" +"053950","泲","KOSDAQ","߰߱","805","-6","-0.74","797","818","797","231826","187030247","28652688610","35593402" +"002100","","KOSPI",,"8970","-90","-0.99","9060","9180","8970","33753","304002700","175117497750","19522575" +"009450","浿","KOSPI",,"65000","2500","4.00","62200","66400","62200","69033","4450741400","946958480000","14568592" +"267290","浿ð","KOSPI",,"18640","-80","-0.43","18710","18890","18570","12701","236723680","109890367840","5895406" +"012320","浿κƮ","KOSPI",,"79800","-6300","-7.32","85500","86000","79800","30853","2535135000","188728835400","2365023" +"011040","浿","KOSDAQ","߰߱","6150","-70","-1.13","6220","6240","6080","64631","396198560","189227910900","30768766" +"000050","","KOSPI",,"5840","-220","-3.63","6180","6230","5830","33098","198218990","160105176800","27415270" +"214390","溸","KOSPI",,"7440","0","0.00","0","0","0","0","0","177867038400","23906860" +"012610","ξ","KOSPI",,"3115","-55","-1.74","3200","3205","3050","135447","420846775","129634976975","41616365" +"009140","","KOSPI",,"20600","-300","-1.44","20800","20800","20150","7480","152442500","32358418200","1570797" +"024910","â","KOSDAQ","췮","2175","45","2.11","2100","2395","2100","2325074","5261599595","77906335875","35819005" +"013580","Ǽ","KOSPI",,"13850","-100","-0.72","13870","13950","13610","26319","361133700","123693061950","8930907" +"012200","","KOSPI",,"1481","-24","-1.59","1503","1504","1469","31934","47144742","40317009749","27222829" +"012205","","KOSPI",,"3800","-50","-1.30","3850","3850","3440","2630","9704620","4442500200","1169079" +"002140","","KOSPI",,"2385","-95","-3.83","2485","2485","2370","80555","193256895","59480528625","24939425" +"049720","ſ","KOSDAQ","췮","10320","-30","-0.29","10320","10450","10250","30413","313410830","147576000000","14300000" +"010130","ƿ","KOSPI",,"531000","-8000","-1.48","544000","551000","529000","20376","10967377000","10993443273000","20703283" +"002240","","KOSPI",,"18940","-200","-1.04","19090","19400","18790","43889","834878560","473500000000","25000000" +"014570","","KOSDAQ","췮","4880","-260","-5.06","5110","5130","4875","45280","223194630","53680000000","11000000" +"348150","̿","KOSDAQ","","6200","-270","-4.17","6470","6470","6190","102243","641000800","120117870000","19373850" +"950190","ƮƩ","KOSDAQ","ܱ(ҼӺξ)","10190","-160","-1.55","10350","10390","10100","8918","90834060","138379099480","13579892" +"098460","","KOSDAQ","췮","9750","-170","-1.71","9870","10000","9670","299951","2929911500","669383861250","68654755" +"035290","ؿ","KOSDAQ","߰߱","401","-27","-6.31","424","428","399","332732","134683369","19118268480","47676480" +"900280","缾","KOSDAQ","(ҼӺξ)","97","0","0.00","0","0","0","0","0","19924215936","205404288" +"215000","","KOSDAQ GLOBAL","췮","66500","-400","-0.60","66800","66900","65900","18049","1196844800","417315097500","6275415" +"121440","Ȧ","KOSDAQ","췮","4095","225","5.81","3870","4220","3870","710597","2896525810","175416769710","42836818" +"366030","","KOSDAQ","߰߱","4925","-335","-6.37","5200","5640","4830","1912817","10211733910","111570211250","22653850" +"076340","ǻ","KONEX","Ϲݱ","5920","-70","-1.17","5600","5970","5600","11","63440","28839043200","4871460" +"009290","","KOSPI",,"5650","-140","-2.42","5780","5820","5650","170238","968576220","296177808150","52420851" +"086220","コ̿","KONEX","Ϲݱ","1999","-1","-0.05","2090","2090","1802","74","146880","21137156135","10573865" +"014200","","KOSDAQ","(ҼӺξ)","1006","0","0.00","0","0","0","0","0","91250936176","90706696" +"017040","","KOSPI",,"1608","-37","-2.25","1623","1644","1601","254784","411923946","69686884920","43337615" +"029480","","KOSDAQ","߰߱","3380","-200","-5.59","3520","3645","3370","420619","1436809710","163839189540","48473133" +"017900","","KOSPI",,"1871","-33","-1.73","1904","1920","1862","127749","239749988","108412780573","57943763" +"037710","ֽż","KOSPI",,"29400","-100","-0.34","29450","29650","29250","2595","76268800","233941386000","7957190" +"026910","Ǿ","KOSDAQ","߰߱","2630","-125","-4.54","2810","2880","2550","93422","250231890","16846215150","6405405" +"421800","12ȣ","KOSDAQ","SPAC(ҼӺξ)","2240","0","0.00","2280","2285","2215","36561","81756345","13395200000","5980000" +"440790","13ȣ","KOSDAQ","SPAC(ҼӺξ)","2225","15","0.68","2215","2240","2210","2102","4677125","9011250000","4050000" +"456490","14ȣ","KOSDAQ","SPAC(ҼӺξ)","2185","0","0.00","2185","2190","2155","3616","7859075","9177000000","4200000" +"465320","15ȣ","KOSDAQ","SPAC(ҼӺξ)","2135","-10","-0.47","2150","2155","2125","2221","4733665","8134350000","3810000" +"482520","16ȣ","KOSDAQ","SPAC(ҼӺξ)","2050","-5","-0.24","2050","2055","2045","61590","126282600","12505000000","6100000" +"030610","","KOSPI",,"5200","90","1.76","5110","5210","5080","50292","259711800","592607397200","113962961" +"339770","̿غ","KOSPI",,"7860","-210","-2.60","8230","8230","7830","24035","190198050","196362764400","24982540" +"053270","ũ","KOSDAQ","췮","2350","15","0.64","2335","2400","2270","87830","202519475","64414451750","27410405" +"007690","ȭ","KOSPI",,"32300","-650","-1.97","32750","33250","31300","32679","1042936200","291042896800","9010616" +"005320","","KOSPI",,"477","27","6.00","450","543","445","3876350","1919866373","32115406869","67327897" +"001140","","KOSPI",,"2110","0","0.00","0","0","0","0","0","33456978680","15856388" +"066620","","KOSDAQ","췮","16270","-110","-0.67","16380","16700","16100","2741","44637630","122025000000","7500000" +"043650","","KOSDAQ","췮","4640","-105","-2.21","4795","4885","4575","117427","546442740","82862530560","17858304" +"006050","ؿ","KOSDAQ","߰߱","1710","0","0.00","1710","1750","1678","388117","662072436","59670865530","34895243" +"060480","Ͻŵ","KOSDAQ","߰߱","2085","45","2.21","2020","2085","1987","14274","28903481","23122650000","11090000" +"078130","","KOSDAQ","(ҼӺξ)","800","0","0.00","0","0","0","0","0","901924696800","1127405871" +"307750","ǰ","KOSDAQ","췮","4225","165","4.06","4035","4225","4015","189802","776597815","207317661525","49069269" +"002720","ǰ","KOSPI",,"5090","-10","-0.20","5110","5170","5010","246537","1248316100","107703544880","21159832" +"243870","¼","KONEX","Ϲݱ","8600","-240","-2.71","8820","8840","7600","605","5133860","24876626600","2892631" +"035080","׷Ʈ","KOSDAQ","췮","11270","-620","-5.21","11780","11820","11260","20788","236258790","163725871680","14527584" +"453450","׸","KOSDAQ","ó","24200","-2850","-10.54","29400","30650","24200","2080124","59097397550","192214550000","7942750" +"204020","׸Ƽ","KOSDAQ","ó","2700","-10","-0.37","2665","2720","2580","97137","254644080","54398061000","20147430" +"402490","׸ҽ","KOSDAQ","","15260","-800","-4.98","16060","16290","15240","142690","2208113670","126138305440","8265944" +"114450","׸","KOSDAQ","߰߱","2120","-40","-1.85","2160","2230","2060","185923","392036260","42400000000","20000000" +"083420","׸ɹĮ","KOSPI",,"6170","-140","-2.22","6310","6600","6100","67084","416447950","148080000000","24000000" +"186230","׸÷","KOSDAQ","ó","8710","-60","-0.68","8690","8990","8670","50589","444253980","94243837480","10820188" +"014530","صȭ","KOSPI",,"3670","-15","-0.41","3665","3685","3655","130867","479444480","127970771400","34869420" +"900070","۷ι","KOSDAQ","ܱ(ҼӺξ)","424","-20","-4.50","439","444","424","115822","50229531","22787442432","53743968" +"204620","۷ιؽ","KOSDAQ","߰߱","3260","-10","-0.31","3250","3345","3215","237208","777193635","199238274100","61116035" +"019660","۷κ","KOSDAQ","ȯ(ҼӺξ)","564","-7","-1.23","571","593","564","106172","61625150","19621980744","34790746" +"014280","ݰ","KOSPI",,"4070","-270","-6.22","4265","4365","4065","159422","661045425","119370482990","29329357" +"014285","ݰ","KOSPI",,"7940","-10","-0.13","7990","7990","7600","895","6848090","4683607500","589875" +"053260","ݰö","KOSDAQ","췮","4690","-40","-0.85","4755","4755","4645","17926","84030985","87796800000","18720000" +"008870","ݺ","KOSPI",,"58100","-400","-0.68","58200","58600","57600","3059","177634900","58100000000","1000000" +"001570","ݾ","KOSPI",,"41900","-2000","-4.56","43400","44400","41400","446321","18841444450","2432296550300","58050037" +"282720","ݾ׸Ŀ","KOSDAQ","߰߱","9740","-60","-0.61","9800","10050","9560","61456","597334600","118043930000","12119500" +"002990","ȣǼ","KOSPI",,"3290","-55","-1.64","3345","3355","3265","24003","78953060","121577327550","36953595" +"002995","ȣǼ","KOSPI",,"9560","-300","-3.04","9860","9860","9470","194","1843690","2794062960","292266" +"011780","ȣ","KOSPI",,"140200","-3400","-2.37","143600","144900","139500","51830","7311912400","3879709595800","27672679" +"011785","ȣ","KOSPI",,"64800","-1200","-1.82","66300","66300","64200","5301","343890400","195921892800","3023486" +"214330","ȣġƼ","KOSPI",,"577","-4","-0.69","582","586","572","211831","122516891","123428453587","213914131" +"001210","ȣ","KOSPI",,"708","5","0.71","703","710","693","53328","37450640","27758358468","39206721" +"073240","ȣŸ̾","KOSPI",,"4270","25","0.59","4275","4280","4180","364024","1542591865","1226601425490","287260287" +"036190","ȭǿ","KOSDAQ","췮","26350","150","0.57","26600","26750","25800","7057","184125050","158100000000","6000000" +"049080","Ⱑ","KOSDAQ","ó","692","-26","-3.62","708","720","678","342862","239695153","58739276124","84883347" +"420770","Ⱑ","KOSDAQ","߰߱","33050","-3300","-9.08","35900","36350","33000","125745","4245550850","418933801900","12675758" +"035460","ڷ","KOSDAQ","ó","1748","-28","-1.58","1763","1795","1724","7990","13952033","25481190320","14577340" +"092440","","KOSPI",,"2530","-25","-0.98","2565","2575","2505","63465","160546395","73876000000","29200000" +"000270","","KOSPI",,"100000","-700","-0.70","100300","101600","98500","1130536","113255610800","39985841700000","399858417" +"024110","","KOSPI",,"13880","-20","-0.14","13960","13960","13790","620176","8604870580","11068271061720","797425869" +"456700","汳̾ؾ","KONEX","Ϲݱ","19950","0","0.00","0","0","0","0","0","17955000000","900000" +"013700","̾ؾ","KOSPI",,"1368","-12","-0.87","1360","1395","1330","22442","30490011","61768319040","45152280" +"308100","ڹ","KOSDAQ","߰߱","3420","225","7.04","3315","3855","3205","1813414","6481052890","22656586860","6624733" +"004540","ѳ","KOSPI",,"2145","-40","-1.83","2175","2200","2120","50203","107707600","79881286485","37240693" +"004545","ѳ","KOSPI",,"13140","-240","-1.79","13380","13380","13140","22","290400","4811342400","366160" +"407400","޺","KOSDAQ","ó","6470","-170","-2.56","6580","6730","6340","81765","530543230","79318796780","12259474" +"187790","","KOSDAQ","(ҼӺξ)","1025","0","0.00","0","0","0","0","0","31611850750","30840830" +"286750","긯","KOSDAQ","","1883","-29","-1.52","1889","1890","1865","34224","64177992","38967854597","20694559" +"121600","ż","KOSDAQ","췮","82800","-4700","-5.37","87500","88200","81300","70432","5914884400","1009835258400","12196078" +"247660","뾾","KOSDAQ","","8800","-100","-1.12","8640","8940","8570","19552","169386270","38226496000","4343920" +"039860","뿣","KOSDAQ","߰߱","3025","-75","-2.42","3100","3145","2990","199582","604968595","97132998050","32110082" +"091970","ķ","KOSDAQ","߰߱","607","-3","-0.49","606","607","572","40675","24199312","22712418251","37417493" +"417010","","KOSDAQ","ó","10810","-970","-8.23","12450","12800","10810","705280","8417644940","213219985680","19724328" +"244880","ũ","KONEX","Ϲݱ","2595","25","0.97","2595","2595","2595","1","2595","13026900000","5020000" +"405920","󼿶","KOSDAQ","߰߱","3690","-5","-0.14","3695","3835","3660","29842","111627160","47520100440","12878076" +"288490","Ʈ","KONEX","Ϲݱ","73","-11","-13.10","83","84","72","118319","8572500","1275425121","17471577" +"051490","󿥾ص","KOSDAQ","췮","4360","-40","-0.91","4425","4470","4330","42949","189319430","61912000000","14200000" +"137080","","KOSDAQ","ó","3800","-100","-2.56","3900","3920","3730","21222","80231950","42025803600","11059422" +"190510","","KOSDAQ","췮","12390","-280","-2.21","12850","13060","12260","128871","1623050010","201515717760","16264384" +"242040","","KOSDAQ","","1578","-22","-1.38","1585","1616","1563","53432","84396763","54608684592","34606264" +"089600","̵","KOSDAQ","췮","15350","-470","-2.97","15920","15920","15290","36002","554937690","177571302050","11568163" +"293580","IB","KOSDAQ","߰߱","951","-19","-1.96","990","990","934","198031","187589161","91077270000","95770000" +"257990","ڽ","KONEX","Ϲݱ","5070","20","0.40","5100","5150","5070","118","600640","29869357440","5891392" +"138610","̺","KOSDAQ","","15650","-300","-1.88","15910","16220","15600","51088","802480220","161067029950","10291823" +"130580","̽غ","KOSDAQ","췮","5000","5","0.10","5030","5100","4725","7102","34968140","77000000000","15400000" +"036800","̽","KOSDAQ","췮","19030","-190","-0.99","19230","19230","19020","1143","21794090","190300000000","10000000" +"267320","ũ","KOSDAQ","ó","2415","-120","-4.73","2495","2515","2410","206611","505898320","105448811160","43664104" +"001260","","KOSPI",,"6280","-80","-1.26","6300","6310","6200","10618","66230090","61748552160","9832572" +"008350","˹̴","KOSPI",,"1297","-34","-2.55","1321","1339","1289","287524","373179701","167415579730","129079090" +"008355","˹̿","KOSPI",,"17430","-170","-0.97","17450","17450","16800","382","6546240","5366522700","307890" +"004270","","KOSPI",,"1332","-19","-1.41","1338","1444","1329","320937","442952340","48234597120","36212160" +"003920","","KOSPI",,"471000","-2000","-0.42","473000","480000","467000","806","379006000","339120000000","720000" +"003925","","KOSPI",,"297000","-3000","-1.00","300000","300000","291500","199","58993500","59400000000","200000" +"025860","ȭ","KOSPI",,"6390","-130","-1.99","6450","6520","6340","148764","952407300","317447806770","49678843" +"111710","ȭ","KOSDAQ","߰߱","4680","-100","-2.09","4825","4920","4600","8310","39325160","96351840000","20588000" +"091590","ȭ","KOSDAQ","췮","3975","-70","-1.73","4070","4070","3885","5667","22255455","46666500000","11740000" +"168330","򷲿","KOSDAQ","ó","1853","-42","-2.22","1950","1950","1851","17769","33135663","58841829700","31754900" +"094860","׿","KOSDAQ","ó","1356","-34","-2.45","1366","1385","1341","27194","36812917","29017815564","21399569" +"253590","׿","KOSDAQ","췮","7720","-200","-2.53","7890","7980","7580","564357","4341376650","338669946080","43869164" +"212560","׿","KOSDAQ","췮","8400","110","1.33","8230","8520","8040","62716","510771360","66149689200","7874963" +"095660","׿","KOSDAQ","췮","21300","-500","-2.29","21850","22000","21200","115493","2479017300","469318214700","22033719" +"042420","׿Ȧ","KOSDAQ","߰߱","18400","-200","-1.08","18500","18790","18110","10821","199838400","162966334400","8856866" +"950220","׿̹","KOSDAQ","ܱ(ҼӺξ)","1343","-57","-4.07","1401","1424","1343","374184","510331573","132779005495","98867465" +"311390","׿ũ","KOSDAQ","ó","6370","0","0.00","6390","6400","6250","24851","157004620","69937166390","10979147" +"085910","׿Ƽ","KOSDAQ","߰߱","3270","-60","-1.80","3350","3360","3270","16373","53895220","45566854860","13934818" +"092730","׿","KOSDAQ","췮","21000","-400","-1.87","21400","21550","20800","21527","451684100","172354581000","8207361" +"290660","׿Ʈ","KOSDAQ","","934","-16","-1.68","950","969","930","19731","18479025","38979796038","41734257" +"306620","׿ũ","KOSDAQ","ó","1709","-63","-3.56","1773","1780","1700","65238","113150040","72817326641","42608149" +"153460","̺","KOSDAQ","ó","6150","50","0.82","6350","6350","5850","1399","8531010","40159586100","6530014" +"007390","ó","KOSDAQ","߰߱","9560","-250","-2.55","9910","9910","9470","179172","1720158240","615254411360","64357156" +"033640","н","KOSDAQ","߰߱","8630","-290","-3.25","8900","9000","8570","68070","591186730","199000913260","23059202" +"330860","нũ","KOSDAQ","췮","12840","-570","-4.25","13250","13380","12820","61204","797232660","156443137800","12184045" +"005720","ؼ","KOSPI",,"4530","-45","-0.98","4600","4670","4475","18451","83537425","242554215810","53543977" +"005725","ؼ","KOSPI",,"3050","30","0.99","2960","3050","2960","1989","6052250","10981830000","3600600" +"002350","ؼŸ̾","KOSPI",,"7500","-40","-0.53","7490","7540","7400","33852","252331040","732509077500","97667877" +"002355","ؼŸ̾1B","KOSPI",,"3155","-50","-1.56","3155","3215","3135","8093","25478025","20507500000","6500000" +"089140","ؽϹ̿","KOSDAQ","ó","2900","165","6.03","2780","2900","2730","27824","77896155","32719618300","11282627" +"389650","ؽƮ̿޵","KOSDAQ","","30150","-1250","-3.98","32150","34300","29300","2521489","79866029750","241443189900","8008066" +"137940","ؽƮ","KOSDAQ","߰߱","384","-15","-3.76","399","402","381","375805","145699282","30075260928","78320992" +"396270","ؽƮĨ","KOSDAQ","","7550","190","2.58","7360","8750","7360","1016756","8311294630","136571497000","18088940" +"348210","ؽƾ","KOSDAQ GLOBAL","췮","41650","-1200","-2.80","42150","42900","41200","61637","2558726350","434711462500","10437250" +"092790","ؽƿ","KOSPI",,"7470","-360","-4.60","7770","7940","7430","370885","2812957920","194234940000","26002000" +"225570","ؽ","KOSDAQ","췮","15270","-880","-5.45","16100","16180","15200","1621260","25174908380","1005562696980","65852174" +"217270","ƪ","KOSDAQ","߰߱","5810","-160","-2.68","6020","6370","5810","181563","1107548960","270816591500","46612150" +"251270","ݸ","KOSPI",,"57000","-1500","-2.56","58600","59700","56700","89087","5129268400","4899349614000","85953502" +"317860","̽","KONEX","Ϲݱ","6500","-100","-1.52","6400","6500","6400","219","1418100","28793147500","4429715" +"104620","dz","KOSDAQ","߰߱","5190","-130","-2.44","5310","5310","5170","28217","147019980","82220633940","15842126" +"090350","Ʈ","KOSPI",,"8500","-170","-1.96","8670","8750","8490","47952","409955070","170000000000","20000000" +"090355","Ʈ","KOSPI",,"13580","-370","-2.65","13600","13630","13550","867","11792080","6289251080","463126" +"000320","Ȧ","KOSPI",,"12830","-10","-0.08","12800","12990","12670","53268","678053620","170525467330","13291151" +"000325","Ȧ","KOSPI",,"30250","-150","-0.49","30400","30400","29550","98","2930050","7367659750","243559" +"194700","ٷ","KOSDAQ","췮","9700","-300","-3.00","9910","10090","9700","68847","675663600","181922025600","18754848" +"285490","","KOSDAQ","췮","11760","-500","-4.08","11960","12270","11730","32015","380483140","124371772560","10575831" +"283100","뺸ͽ","KONEX","Ϲݱ","664","34","5.40","630","664","616","647","400726","4359092936","6564899" +"145170","귣","KOSDAQ","߰߱","14900","-890","-5.64","15650","17500","14900","1997815","33192439040","135289526600","9079834" +"229500","Ÿĸ","KONEX","Ϲݱ","5090","190","3.88","5100","5200","4505","1620","7871740","56450380320","11090448" +"106520","غ","KOSDAQ","ȯ(ҼӺξ)","411","0","0.00","0","0","0","0","0","15904036272","38695952" +"376930","","KOSDAQ","","1922","-78","-3.90","2030","2030","1915","163876","319408728","71012249320","36947060" +"006280","","KOSPI",,"145800","-2700","-1.82","148000","148000","142000","69343","10027542300","1703897240400","11686538" +"142280","ڿ","KOSDAQ","߰߱","3865","-105","-2.64","3910","4025","3840","298457","1162231065","84032543990","21741926" +"234690","","KOSDAQ","췮","8270","-100","-1.19","8320","8530","7900","173162","1399193650","146811322520","17752276" +"005250","Ȧ","KOSPI",,"14370","-490","-3.30","14990","14990","14300","53529","773991530","675795377700","47028210" +"005257","Ȧ2","KOSPI",,"24700","-500","-1.98","25100","25100","24300","274","6745550","20895953000","845990" +"004370","","KOSPI",,"369500","-8000","-2.12","376000","380000","366500","32822","12169505500","2247536219000","6082642" +"072710","Ȧ","KOSPI",,"65800","-200","-0.30","66000","66500","65100","3912","256366200","305166582000","4637790" +"054050","̿","KOSDAQ","췮","7190","-90","-1.24","7300","7300","7050","20001","142549580","115259733590","16030561" +"069140","÷","KOSDAQ","ó","1355","11","0.82","1331","1428","1287","107215","141772645","17754216765","13102743" +"040160","÷","KOSDAQ","췮","2665","0","0.00","2680","2680","2565","2011","5280375","32128000775","12055535" +"332290","","KOSDAQ","ó","1160","-22","-1.86","1182","1209","1155","30253","35314037","38726371480","33384803" +"348340","θī","KOSDAQ","","21950","-950","-4.15","22900","23050","21750","35667","786331000","231554281500","10549170" +"060260","","KOSDAQ","ó","1584","-43","-2.64","1627","1669","1570","56371","90203383","13166222256","8312009" +"123840","","KOSDAQ","(ҼӺξ)","256","5","1.99","252","257","242","405350","100694071","74846747648","292370108" +"012340","","KOSDAQ","ó","580","-13","-2.19","588","593","575","69561","40559088","29526153960","50907162" +"214870","ĸ","KOSDAQ","ȯ(ҼӺξ)","6920","0","0.00","0","0","0","0","0","64765809320","9359221" +"270870","Ʈ","KOSDAQ","췮","10610","-250","-2.30","10840","10850","10220","107855","1134231200","97614376640","9200224" +"144960","Ŀ","KOSDAQ","췮","5010","-190","-3.65","5160","5210","5000","84917","428732330","218900046240","43692624" +"085670","","KOSDAQ","췮","4540","-75","-1.63","4565","4625","4395","186803","839209005","111006454940","24450761" +"064260","ٳ","KOSDAQ","췮","3150","-100","-3.08","3215","3300","3125","552632","1751538220","217189476000","68949040" +"340360","ٺũ","KOSDAQ","߰߱","2100","50","2.44","2005","2115","1980","425825","870541100","91115245200","43388212" +"039560","ٻƮ","KOSDAQ","췮","3120","-110","-3.41","3230","3265","3100","234842","737282420","123258660720","39505981" +"154040","ٻַ翡Ÿ","KOSDAQ","߰߱","1400","-4","-0.28","1387","1407","1384","12410","17279675","25130131600","17950094" +"058730","ٽ","KOSPI",,"3090","-80","-2.52","3150","3185","3040","189009","584225175","58082547690","18796941" +"030210","ٿ","KOSPI",,"3075","-65","-2.07","3110","3125","3070","71950","222855985","187301650950","60911106" +"023590","ٿ","KOSPI",,"17400","-320","-1.81","17740","17740","17350","49522","863380240","780679135800","44866617" +"032190","ٿ쵥Ÿ","KOSDAQ","췮","10280","-160","-1.53","10340","10430","10280","40865","422283150","393724000000","38300000" +"323350","ٿؽ","KOSDAQ","","6990","-310","-4.25","7120","7240","6940","24666","173002200","53096815890","7596111" +"068240","ٿý","KOSDAQ","߰߱","10160","20","0.20","10140","10220","9910","100006","1003895490","387740519920","38163437" +"145210","̳͵","KOSPI",,"5360","60","1.13","5250","5480","5120","234636","1235595850","92733858480","17301093" +"019680","뱳","KOSPI",,"2100","-15","-0.71","2085","2125","2085","24655","51805420","177875985000","84702850" +"019685","뱳B","KOSPI",,"1372","1","0.07","1352","1381","1352","27553","37894709","26653830280","19426990" +"006370","뱸ȭ","KOSPI",,"7300","1130","18.31","6370","7690","6250","1112859","7945606760","78997760300","10821611" +"008060","","KOSPI",,"6170","0","0.00","6190","6250","6120","32432","200044850","209102225500","33890150" +"00806K","1","KOSPI",,"6400","-90","-1.39","6600","6600","6400","905","5803090","7759084800","1212357" +"353200","","KOSPI",,"17520","-510","-2.83","18030","18150","17500","229743","4043272920","865784526000","49416925" +"35320K","1","KOSPI",,"8290","-100","-1.19","8390","8440","8190","2499","20580380","17371852510","2095519" +"000490","뵿","KOSPI",,"8130","-270","-3.21","8320","8390","8130","109130","895381890","208459606440","25640788" +"178600","뵿","KONEX","Ϲݱ","2800","115","4.28","3000","3000","2525","3","8325","12458880000","4449600" +"020400","뵿ݼ","KOSDAQ","߰߱","6400","-180","-2.74","6580","6580","6390","4926","31767080","20410662400","3189166" +"008830","뵿","KOSDAQ","췮","6980","-220","-3.06","7020","7530","6950","30640","217248370","62732889600","8987520" +"048470","뵿ƿ","KOSDAQ","߰߱","3650","-100","-2.67","3715","3770","3625","29073","106940105","36500000000","10000000" +"008110","뵿","KOSPI",,"15040","0","0.00","0","0","0","0","0","157776322880","10490447" +"004780","","KOSDAQ","췮","3990","-60","-1.48","4020","4065","3970","16911","67637570","63453764010","15903199" +"005750","븲B&Co","KOSPI",,"3405","-35","-1.02","3440","3440","3380","9485","32309010","56768977200","16672240" +"017650","븲","KOSDAQ","췮","7350","0","0.00","7430","7430","7110","2330","16896620","66150000000","9000000" +"006570","븲","KOSPI",,"2880","-60","-2.04","2940","2955","2840","5195","14958135","43848000000","15225000" +"007720","ҳ","KOSDAQ","߰߱","637","6","0.95","631","640","616","220682","137859562","64209886650","100800450" +"389260","","KOSDAQ","߰߱","11980","480","4.17","11300","12300","11230","52279","614574620","204259000000","17050000" +"317850","","KOSDAQ","ó","9150","-340","-3.58","9410","9470","8960","205274","1877176720","76168443000","8324420" +"290670","뺸׳ƽ","KOSDAQ","췮","15750","-730","-4.43","16190","16650","15750","17639","281620430","123758145000","7857660" +"078140","","KOSDAQ","췮","17210","-410","-2.33","17640","19120","16670","7324497","132319050520","190800024590","11086579" +"065150","F&B","KOSDAQ","(ҼӺξ)","145","0","0.00","0","0","0","0","0","18165948725","125282405" +"001680","","KOSPI",,"20100","-300","-1.47","20400","20450","20000","93713","1886854250","696425302500","34648025" +"001685","","KOSPI",,"15840","-390","-2.40","16230","16400","15800","11964","190924260","21704332320","1370223" +"084690","Ȧ","KOSPI",,"8140","-270","-3.21","8310","8400","8100","101405","831752680","294770059320","36212538" +"084695","Ȧ","KOSPI",,"18570","-730","-3.78","19060","19060","18570","5515","103202140","16963360740","913482" +"036480","뼺̻","KOSDAQ","߰߱","9620","-100","-1.03","9720","9720","9580","5488","52894120","36556000000","3800000" +"128820","뼺","KOSPI",,"3370","-30","-0.88","3395","3420","3335","70810","237671040","152443560860","45235478" +"117580","뼺","KOSPI",,"8850","-120","-1.34","8800","9130","8800","282505","2522563220","243375000000","27500000" +"027830","뼺â","KOSDAQ","߰߱","1471","-60","-3.92","1506","1524","1471","255257","379189973","79434000000","54000000" +"104040","뼺","KOSDAQ","ó","986","2","0.20","989","1007","980","75845","74917812","35422599202","35925557" +"129920","뼺","KOSDAQ","ó","3755","-225","-5.65","3935","3975","3755","168109","640498300","51500024015","13715053" +"016710","뼺Ȧ","KOSPI",,"7720","-100","-1.28","7790","7850","7720","6798","52754520","124210623480","16089459" +"438220","Ź뷱13ȣ","KOSDAQ","SPAC(ҼӺξ)","2205","-25","-1.12","2245","2250","2175","23606","51934080","12436200000","5640000" +"442310","Ź뷱14ȣ","KOSDAQ","SPAC(ҼӺξ)","2280","15","0.66","2290","2290","2260","6187","14110155","15298800000","6710000" +"457390","Ź뷱15ȣ","KOSDAQ","SPAC(ҼӺξ)","2350","-15","-0.63","2365","2390","2350","27467","65332910","16532250000","7035000" +"457630","Ź뷱16ȣ","KOSDAQ","SPAC(ҼӺξ)","2290","50","2.23","2235","2290","2235","26921","60916970","16739900000","7310000" +"471050","Ź뷱17ȣ","KOSDAQ","SPAC(ҼӺξ)","2130","0","0.00","2130","2130","2120","3164","6724535","12907800000","6060000" +"478780","Ź뷱18ȣ","KOSDAQ","SPAC(ҼӺξ)","2040","0","0.00","2040","2040","2035","52776","107467370","16136400000","7910000" +"020180","","KOSDAQ","߰߱","857","-13","-1.49","861","870","845","223488","189766923","32933580155","38428915" +"003540","","KOSPI",,"16670","-160","-0.95","16830","16940","16450","66791","1109593020","846392578000","50773400" +"003547","2B","KOSPI",,"14850","-140","-0.93","14990","15000","14800","27214","404175390","148500000000","10000000" +"003545","ǿ","KOSPI",,"15450","-150","-0.96","15600","15650","15370","74013","1144485970","401700000000","26000000" +"045390","Ƽ","KOSDAQ","췮","2465","-60","-2.38","2505","2545","2450","296028","732853750","173716874305","70473377" +"009190","ݼ","KOSPI",,"1822","-28","-1.51","1799","2000","1700","537768","984413505","72321229040","39693320" +"108380","","KOSDAQ","췮","11080","-280","-2.46","11290","11470","11040","22577","251197180","106006049640","9567333" +"014160","뿵","KOSPI",,"1007","-21","-2.04","1025","1035","995","162356","163696950","109153310843","108394549" +"047040","Ǽ","KOSPI",,"3850","-10","-0.26","3860","3880","3760","1035570","3976509415","1600147156300","415622638" +"009320","ǰ","KOSPI",,"1134","6","0.53","1125","1143","1105","27579","31090156","55905939180","49299770" +"003090","","KOSPI",,"23550","-300","-1.26","24050","24100","23300","54475","1287360650","1369243629000","58141980" +"069620","","KOSPI",,"130100","-2100","-1.59","132100","132700","127700","35342","4587642000","1507413407500","11586575" +"007680","","KOSDAQ","ó","4125","-110","-2.60","4195","4265","4115","7547","31375710","55466705250","13446474" +"000430","","KOSPI",,"4005","-105","-2.55","4105","4120","4000","118188","477568365","248310000000","62000000" +"048910","̵","KOSDAQ","췮","8600","-220","-2.49","8690","8820","8430","34722","296046060","108178935600","12578946" +"005710","","KOSDAQ","췮","5880","10","0.17","5870","5940","5750","9989","58157790","117821088000","20037600" +"006340","","KOSPI",,"2660","-75","-2.74","2735","2750","2620","1292917","3451392335","199444605500","74979175" +"006345","","KOSPI",,"3700","-60","-1.60","3920","3920","3600","26667","98457255","9698440000","2621200" +"003220","","KOSPI",,"14100","-100","-0.70","14100","14260","14050","135549","1913084910","316228920300","22427583" +"024890","ȭ","KOSPI",,"1197","-91","-7.07","1287","1287","1161","83111","100413195","49375234944","41249152" +"290380","","KOSDAQ","(ҼӺξ)","2300","0","0.00","0","0","0","0","0","56841307600","24713612" +"002880","","KOSPI",,"1027","-29","-2.75","1056","1056","972","104312","106716060","48006108540","46744020" +"000300","÷","KOSPI",,"241","0","0.00","0","0","0","0","0","30475633069","126454909" +"120240","ȭ","KOSDAQ","췮","14050","-420","-2.90","14330","14470","14000","15502","218648650","101024993550","7190391" +"003310","ֻ","KOSDAQ","췮","1355","-15","-1.09","1365","1384","1344","66700","90578373","47956634250","35392350" +"114920","̿Ƽ","KONEX","Ϲݱ","2490","-210","-7.78","2650","2650","2295","830","1905550","8639055000","3469500" +"078600","","KOSDAQ","췮","92900","-8100","-8.02","100700","101800","92500","421202","40051568800","1438147089700","15480593" +"012800","â","KOSPI",,"1222","-15","-1.21","1235","1250","1209","225863","275745281","111373689778","91140499" +"015230","â","KOSPI",,"4840","-105","-2.12","4900","4940","4800","51589","249690070","138289593200","28572230" +"096350","âַ","KOSDAQ","ó","392","-6","-1.51","398","403","389","397212","155679305","64194315528","163761009" +"140520","âƿ","KOSDAQ","췮","2270","-10","-0.44","2295","2295","2210","14912","33596985","47917981610","21109243" +"131220","Ѱ","KOSDAQ","ó","4725","-75","-1.56","4760","4825","4685","33156","156862685","35222465250","7454490" +"010170","ѱ","KOSDAQ","߰߱","936","-28","-2.90","954","956","924","146931","137619412","69742451376","74511166" +"054670","Ѵ","KOSDAQ","췮","8250","-160","-1.90","8410","8570","8200","62285","516897240","118428090000","14354920" +"001070","ѹ","KOSPI",,"5770","-70","-1.20","5840","5840","5730","2276","13146920","30581000000","5300000" +"023910","Ѿǰ","KOSDAQ","췮","25700","0","0.00","25700","26500","25450","9555","244583650","154200000000","6000000" +"006650","ȭ","KOSPI",,"97100","-3300","-3.29","100000","100600","97100","36305","3565460700","631150000000","6500000" +"001440","","KOSPI",,"10680","-320","-2.91","11090","11120","10610","1365813","14684291250","1991257164000","186447300" +"084010","","KOSPI",,"12960","10","0.08","13050","13080","12710","56797","734754780","303450585120","23414397" +"001790","","KOSPI",,"2755","-120","-4.17","2830","2860","2755","296387","824832475","247114077900","89696580" +"001795","","KOSPI",,"2460","-65","-2.57","2520","2545","2460","22552","56286980","15947589600","6482760" +"001130","","KOSPI",,"138600","-400","-0.29","140000","140000","137600","917","126565900","234234000000","1690000" +"003490","װ","KOSPI",,"22250","-200","-0.89","22700","22700","22000","896456","19949924100","8192909707250","368220661" +"003495","װ","KOSPI",,"22550","-250","-1.10","22800","22850","22550","507","11481600","25048404700","1110794" +"005880","ؿ","KOSPI",,"1796","-45","-2.44","1844","1850","1796","1962421","3546438054","573242718160","319177460" +"003830","ȭ","KOSPI",,"98800","300","0.30","99000","99000","97700","3916","382650300","131206400000","1328000" +"016090","","KOSPI",,"1827","-10","-0.54","1849","1849","1814","95943","174908586","80903780370","44282310" +"069460","ȣ̿","KOSPI",,"1049","-20","-1.87","1057","1068","1023","240762","250981865","70854595904","67544896" +"021040","ȣƯ","KOSDAQ","߰߱","3650","0","0.00","0","0","0","0","0","39611212550","10852387" +"021045","ȣƯ","KOSDAQ","߰߱","7580","0","0.00","0","0","0","0","0","3215784680","424246" +"067080","ȭ","KOSDAQ","߰߱","9600","-290","-2.93","9790","10100","9530","98500","950114900","178719840000","18616650" +"298540","Ȧ","KOSDAQ","췮","10630","-40","-0.37","10480","10700","10480","72236","766355850","156961049280","14765856" +"032860","","KOSDAQ","ȯ(ҼӺξ)","3640","0","0.00","0","0","0","0","0","147040941320","40395863" +"192080","","KOSPI",,"49400","-900","-1.79","50400","50600","49100","49922","2481436500","1061897756400","21495906" +"393890","","KOSDAQ GLOBAL","","17710","-1280","-6.74","18790","18980","17710","339317","6129648260","596765333780","33696518" +"299170","","KOSDAQ","߰߱","1575","-2","-0.13","1544","1579","1538","24507","38170572","47294041725","30027963" +"012510","","KOSPI",,"53900","-2600","-4.60","56800","56800","53400","294908","16017802200","1637632057600","30382784" +"224060","ڵ","KOSDAQ","߰߱","5030","20","0.40","5010","5180","5000","3145","15799420","23884441940","4748398" +"302920","","KONEX","Ϲݱ","7000","0","0.00","0","0","0","0","0","31866513000","4552359" +"043090","ũ","KOSDAQ","ȯ(ҼӺξ)","600","-4","-0.66","593","704","545","6391990","3952425209","42607651200","71012752" +"213420","׿轺","KOSDAQ GLOBAL","췮","33650","-350","-1.03","34000","34350","33450","90150","3049508250","835569173350","24831179" +"317330","Ǿ","KOSDAQ","췮","39250","-2600","-6.21","41050","42050","39000","280312","11125190350","803030822000","20459384" +"077360","̸Ż","KOSDAQ","췮","4780","-130","-2.65","4870","4985","4750","89986","431680100","217188869560","45437002" +"004830","","KOSPI",,"6320","-280","-4.24","6560","6660","6320","194688","1251041410","99097600000","15680000" +"004835","","KOSPI",,"9860","-230","-2.28","9900","9930","9850","11063","109320640","13725120000","1392000" +"090410","Ǿ","KOSDAQ","췮","1376","-54","-3.78","1426","1435","1376","318127","442606696","63411714720","46084095" +"024900","","KOSPI",,"3645","-30","-0.82","3635","3805","3550","215551","791396365","118699352100","32564980" +"263600","","KOSDAQ","췮","5940","-100","-1.66","6150","6150","5900","31367","187268820","94626041400","15930310" +"194480","ý","KOSDAQ","ó","37050","-550","-1.46","37400","38050","36900","39555","1477212450","445914534000","12035480" +"263800","Ÿַ","KOSDAQ","߰߱","3995","-170","-4.08","4140","4170","3900","42209","169257325","64784438100","16216380" +"199150","ͽƮ","KONEX","Ϲݱ","3750","-50","-1.32","3750","3750","3750","1","3750","16007298750","4268613" +"206560","","KOSDAQ","","6580","-410","-5.87","7000","7060","6410","939580","6400738940","167209222880","25411736" +"261200","Ƽ","KOSDAQ","ó","7370","-100","-1.34","7320","7470","7240","28634","209221620","116517489000","15809700" +"145720","Ƽ","KOSPI",,"70700","-2100","-2.88","72700","72700","70300","79882","5659016000","782566281000","11068830" +"227420","θũ","KONEX","Ϲݱ","1808","0","0.00","0","0","0","0","0","29731674080","16444510" +"067990","ġͽ","KOSDAQ","췮","4815","-40","-0.82","4850","4850","4780","52713","253480340","145324163250","30181550" +"002150","ȭϾ","KOSPI",,"6740","-50","-0.74","6740","6830","6660","56330","377482530","227272800000","33720000" +"006620","̿","KOSDAQ","췮","5580","-170","-2.96","5710","5770","5470","203513","1134416050","158834655360","28464992" +"100130","S&C","KOSDAQ","߰߱","2575","-80","-3.01","2655","2660","2545","208840","540998445","147143225000","57143000" +"005160","","KOSDAQ","췮","5640","-270","-4.57","5910","5980","5630","201823","1152951900","305938878480","54244482" +"460850","","KOSPI",,"6840","-70","-1.01","6890","6990","6730","82489","564965050","204506807040","29898656" +"075970","˾ؿ","KOSDAQ","߰߱","2360","-115","-4.65","2450","2470","2360","61819","148103445","43424000000","18400000" +"460860","","KOSPI",,"8060","-50","-0.62","8120","8150","8000","142882","1153004530","399840617020","49608017" +"086450","","KOSDAQ GLOBAL","췮","16660","-250","-1.48","16900","16980","16590","114923","1918403230","740703600000","44460000" +"001230","Ȧ","KOSPI",,"7760","-10","-0.13","7720","7830","7680","38763","299111830","246771748080","31800483" +"023450","ռ","KOSPI",,"33000","-200","-0.60","33250","33950","32800","2059","68712000","115500000000","3500000" +"004140","","KOSPI",,"2730","-15","-0.55","2700","2965","2695","10138251","29021503510","130962921180","47971766" +"099410","漱","KOSDAQ","߰߱","2525","0","0.00","2510","2580","2480","43494","109323730","35350000000","14000000" +"007590","Ʊ׷","KOSPI",,"6100","-20","-0.33","6120","6130","6070","9449","57687570","83067219700","13617577" +"005960","ΰǼ","KOSPI",,"4400","-110","-2.44","4570","4570","4375","35125","155283105","100963918000","22946345" +"005965","ΰǼ","KOSPI",,"22500","-300","-1.32","22850","22850","22500","193","4355250","5078970000","225732" +"026960","","KOSPI",,"18120","-180","-0.98","18300","18360","18060","56029","1016319140","1806564000000","99700000" +"002210","","KOSPI",,"4495","-60","-1.32","4550","4550","4460","52383","234927835","117323860150","26100970" +"102260","ɹ","KOSPI",,"4345","-15","-0.34","4380","4415","4270","107638","463119515","215901868160","49689728" +"033500","ȭ","KOSDAQ","췮","11000","-190","-1.70","11250","11250","10800","222363","2430892450","329884434000","29989494" +"025950","ŰǼ","KOSDAQ","췮","19410","660","3.52","18750","19680","18580","27482","530767890","163044000000","8400000" +"000640","ƽÿȦ","KOSPI",,"117200","-5800","-4.72","121800","123400","115600","12421","1465559000","744092603600","6348913" +"170900","ƿƼ","KOSPI",,"71300","200","0.28","70100","71500","68500","28487","1991313300","629956890000","8835300" +"088130","ƿ","KOSDAQ","߰߱","6900","-370","-5.09","7390","7390","6820","44702","310289230","73574272200","10662938" +"028100","","KOSPI",,"12230","-270","-2.16","12550","12550","12180","40252","493003430","171863860580","14052646" +"282690","Ÿ̾","KOSPI",,"13500","0","0.00","0","0","0","0","0","185395702500","13733015" +"041930","ȭ","KOSDAQ","췮","6410","-160","-2.44","6650","6660","6080","34520","221490230","101278000000","15800000" +"001520","","KOSPI",,"795","-21","-2.57","812","815","792","224887","179826086","189753830085","238684063" +"001527","2B","KOSPI",,"9110","-190","-2.04","9200","9290","9110","1613","14894900","2811063590","308569" +"084670","","KOSPI",,"8790","-100","-1.12","8890","9290","8720","11099","99714400","25452051510","2895569" +"082640","","KOSPI",,"6050","-150","-2.42","6110","6200","6010","218934","1330474600","976219439250","161358585" +"060380","翡","KOSDAQ","췮","1548","-111","-6.69","1660","1674","1518","146221","230355175","30495600000","19700000" +"001525","","KOSPI",,"4645","45","0.98","4670","4670","4610","2511","11579745","2869360495","617731" +"079960","̿","KOSDAQ","췮","18940","-50","-0.26","18990","19010","18530","16009","298942380","148868400000","7860000" +"008970","ö","KOSPI",,"859","-47","-5.19","904","904","853","2512436","2183163344","125653874891","146279249" +"228340","","KOSDAQ","췮","2010","-30","-1.47","2045","2045","1996","26447","52997189","40200000000","20000000" +"092780","ǽ","KOSPI",,"6000","-120","-1.96","6060","6160","5850","15456","91930790","79010760000","13168460" +"088910","̺","KOSDAQ","췮","2000","-10","-0.50","2010","2020","1965","54148","107403573","51663528000","25831764" +"094170","Ƴ","KOSDAQ","ó","17700","450","2.61","17170","17860","16750","368968","6413940230","337489581600","19067208" +"049770","F&B","KOSPI",,"32150","-600","-1.83","32800","33200","31200","37550","1194367400","620354183000","19295620" +"013120","","KOSDAQ","췮","2595","-55","-2.08","2680","2680","2580","48631","126606545","235647019500","90808100" +"018500","ݼ","KOSPI",,"1386","-19","-1.35","1391","1428","1369","53841","74378057","64802337138","46754933" +"006040","","KOSPI",,"29850","50","0.17","29850","30100","29450","20028","593828900","1075253565750","36021895" +"030720","","KOSPI",,"5870","-120","-2.00","5950","5980","5820","9235","54380670","27317835350","4653805" +"014820","ý","KOSPI",,"38800","-3050","-7.29","41500","42050","38300","60954","2407911800","1124861741600","28991282" +"014825","ý","KOSPI",,"21950","-800","-3.52","22600","22600","21950","523","11581900","5797236450","264111" +"111380","α⿬","KOSPI",,"18160","-140","-0.77","18200","18250","17620","52953","947832040","111284480000","6128000" +"163560","ϰƮ","KOSPI",,"7220","-270","-3.60","7450","7490","7220","45328","331028070","100358000000","13900000" +"109860","ϱݼ","KOSDAQ","췮","8930","-140","-1.54","9070","9070","8930","2616","23425920","81263000000","9100000" +"032960","ϱ⿬","KOSDAQ","߰߱","11120","-50","-0.45","11110","11200","11050","6474","71844740","44327911760","3986323" +"004890","ϻ","KOSPI",,"41400","100","0.24","41300","41650","41050","1178","48620450","100403901000","2425215" +"002690","","KOSPI",,"1509","-4","-0.26","1520","1600","1509","13403","20757667","30633243240","20300360" +"023790","ö","KOSDAQ","(ҼӺξ)","1210","-8","-0.66","1218","1218","1192","4193","5035426","25218015350","20841335" +"005290","","KOSDAQ","췮","27550","-650","-2.30","28050","28350","27250","330760","9120230050","1416469309700","51414494" +"025900","ȭ","KOSDAQ","߰߱","10960","-700","-6.00","11460","11660","10920","167320","1864689380","554107843600","50557285" +"000020","ȭǰ","KOSPI",,"7640","-160","-2.05","7800","7800","7600","46993","360613490","213396430800","27931470" +"000150","λ","KOSPI",,"138900","-2500","-1.77","141500","141700","138700","95611","13329162700","2295160681500","16523835" +"000157","λ2B","KOSPI",,"73100","-1300","-1.75","75400","75400","72300","997","72876400","65281077800","893038" +"454910","λκƽ","KOSPI",,"63600","-400","-0.63","63900","65400","61900","200565","12696266400","4122550728000","64819980" +"241560","λĹ","KOSPI",,"41250","-100","-0.24","41000","41800","40100","585215","24010469900","4135278097500","100249166" +"034020","λ꿡ʺƼ","KOSPI",,"16570","-50","-0.30","16620","16890","16490","2141879","35726585530","10614098189220","640561146" +"000155","λ","KOSPI",,"72400","-2000","-2.69","75300","75300","72400","9187","672154900","289343848800","3996462" +"131970","λ׽","KOSDAQ GLOBAL","췮","28450","-600","-2.07","28950","29350","28200","138803","3958457150","483836802700","17006566" +"336260","λǻ","KOSPI",,"17120","-530","-3.00","17670","17800","17070","185093","3198573800","1121252589120","65493726" +"33626K","λǻ1","KOSPI",,"5320","-180","-3.27","5410","5470","5280","17231","91822980","71097544000","13364200" +"33626L","λǻ2B","KOSPI",,"9060","-230","-2.48","9290","9290","8970","946","8553740","27055878000","2986300" +"016740","ο","KOSPI",,"3050","-110","-3.48","3155","3155","3030","58045","178245660","97803374000","32066680" +"073190","","KOSDAQ","߰߱","2085","-95","-4.36","2185","2290","2085","63800","137704170","24953363400","11968040" +"176750","͹̿","KONEX","Ϲݱ","12810","-440","-3.32","13000","13380","12800","20688","267508890","346193068200","27025220" +"030350","巡ö","KOSDAQ","߰߱","396","-19","-4.58","416","429","393","915424","369910018","27478033308","69388973" +"203650","帲ťƼ","KOSDAQ","췮","3115","70","2.30","3045","3115","2950","1019416","3216007720","157636923710","50605754" +"223250","帲̿","KOSDAQ","ó","3440","-165","-4.58","3575","3670","3395","320274","1115323795","81869674560","23799324" +"060570","帲۴","KOSDAQ","߰߱","1734","-104","-5.66","1800","1840","1705","90747","160060468","131127807582","75621573" +"362990","帲λƮ","KOSDAQ","ó","1833","-52","-2.76","1915","1915","1802","25923","47983553","30795452142","16800574" +"192650","帲","KOSPI",,"7960","-270","-3.28","8190","8270","7950","298852","2398685330","548309579480","68883113" +"217620","̾ؿ","KOSDAQ","(ҼӺξ)","381","0","0.00","0","0","0","0","0","22001687010","57747210" +"016670","","KOSDAQ","߰߱","4925","-255","-4.92","5100","5140","4925","11051","55345630","24338591550","4941846" +"187870","̽̿","KOSDAQ","췮","14150","-40","-0.28","14400","14400","13800","4671","65798770","99568017350","7036609" +"024090","𾾿","KOSPI",,"12000","-170","-1.40","12050","12160","11960","27080","325947600","136800000000","11400000" +"003160","","KOSPI",,"11320","-600","-5.03","11950","12070","11250","396200","4549613680","320356000000","28300000" +"092200","̾","KOSPI",,"3800","-50","-1.30","3790","3895","3725","165082","627275395","147776562200","38888569" +"110990","Ƽ","KOSDAQ","췮","13450","-770","-5.41","13980","14460","13290","130556","1762667890","254205000000","18900000" +"263690","","KOSDAQ","췮","8080","-50","-0.62","7990","8140","7970","4056","32712940","91510928800","11325610" +"214680","","KOSDAQ","췮","2765","-160","-5.47","2930","2955","2760","1050667","2963862380","203855453620","73727108" +"347850","صĸ","KOSDAQ","","30650","-500","-1.61","31100","31450","29900","143983","4411249300","323012043850","10538729" +"377190","ص÷","KOSPI",,"3740","5","0.13","3735","3745","3720","46462","173547235","240856000000","64400000" +"263720","ؾ̵","KOSDAQ","췮","16750","-1000","-5.63","17510","17680","16750","50411","856478920","209784922750","12524473" +"376300","","KOSDAQ","","18290","-720","-3.79","19000","19250","18200","62072","1149055320","434175445740","23738406" +"109740","𿡽","KOSDAQ","ó","5050","-150","-2.88","5150","5180","4995","40294","202938405","129837469500","25710390" +"196490","ũ","KOSDAQ","ȯ(ҼӺξ)","203","0","0.00","0","0","0","0","0","34390100080","169409360" +"066900","","KOSDAQ","췮","2010","-135","-6.29","2140","2140","2000","25605","52179595","45716451030","22744503" +"127120","𿣿̸ũ","KOSDAQ","ó","3115","-15","-0.48","3130","3130","2950","92684","278123040","59456615540","19087196" +"092070","𿣿","KOSDAQ","췮","11890","-750","-5.93","12530","12640","11840","44104","532065140","137589391620","11571858" +"039840","","KOSDAQ","췮","16040","-260","-1.60","16160","16250","15550","50454","796455530","254743350200","15881755" +"013570","","KOSPI",,"4545","-35","-0.76","4550","4630","4480","30538","138563670","119622731985","26319633" +"219550","̵","KOSDAQ","ȯ(ҼӺξ)","240","4","1.69","236","242","232","431024","101310435","18840189840","78500791" +"310870","̾","KOSDAQ","ó","1075","-27","-2.45","1102","1102","1060","40043","42906254","22238816325","20687271" +"210540","Ŀ","KOSPI",,"12070","-80","-0.66","12150","12150","11990","25312","305288200","133273415560","11041708" +"104460","ǿ","KOSDAQ","߰߱","12000","-70","-0.58","12000","12040","11750","41967","499602540","128563500000","10713625" +"079810","̿Ƽ","KOSDAQ","߰߱","7420","-500","-6.31","8030","8030","7420","125757","955772190","163448457480","22028094" +"113810","","KOSDAQ","߰߱","825","-5","-0.60","821","830","802","66506","54100274","26918142075","32628051" +"043360","","KOSDAQ","ó","2240","-45","-1.97","2285","2285","2185","8654","19422310","20160000000","9000000" +"197140","ĸ","KOSDAQ","ó","2760","-175","-5.96","2885","2980","2755","177630","498915810","35916305040","13013154" +"068930","д뼺","KOSDAQ","췮","6650","-40","-0.60","6690","6720","6630","7932","52695800","184041024300","27675342" +"033130","Ʋ","KOSDAQ","߰߱","1510","-29","-1.88","1520","1539","1510","32503","49205290","56044053170","37115267" +"105740","̶","KOSDAQ","췮","7570","-410","-5.14","7940","8020","7570","119084","915477260","76884803410","10156513" +"263020","̾ص","KOSDAQ","ó","3660","-290","-7.34","3850","3850","3520","731776","2671167630","55155581460","15069831" +"290550","Ƽ","KOSDAQ","췮","11060","-50","-0.45","11020","11180","10710","127165","1397388740","220887466520","19971742" +"066670","Ƽ","KOSDAQ","췮","3400","-85","-2.44","3460","3480","3310","66723","223886505","63552521200","18691918" +"187220","Ƽؾ","KOSDAQ","ó","2840","-55","-1.90","2895","2905","2825","21695","61780875","33222379640","11698021" +"383930","Ƽؾ˿","KOSDAQ","߰߱","6360","-90","-1.40","6400","6500","6220","67151","424679320","81220456320","12770512" +"131180","","KOSDAQ","ó","975","-17","-1.71","992","992","922","47820","45437800","28616250000","29350000" +"315640","̵","KOSDAQ","","4945","-275","-5.27","5190","5190","4825","183243","902200225","110873170260","22421268" +"223310","ε","KOSDAQ","߰߱","2835","-70","-2.41","2900","2960","2815","27133","78060615","64749628125","22839375" +"317120","н","KOSDAQ","","3865","205","5.60","3810","4750","3660","5578946","24010123625","37335900000","9660000" +"462510","޵","KOSDAQ","","15000","-1760","-10.50","17000","18930","14860","5750711","100240730400","129761025000","8650735" +"042510","½ť","KOSDAQ","ó","2160","-40","-1.82","2200","2275","2125","1691557","3701057055","121015881360","56025871" +"232680","ũ","KOSDAQ","","6900","-90","-1.29","7010","7070","6740","25551","174672210","86486214600","12534234" +"418420","","KOSDAQ","","3680","40","1.10","3705","3745","3565","81686","297584815","110799033440","30108433" +"300120","","KOSDAQ","ó","4210","-155","-3.55","4205","4450","4200","53348","225491385","87820650520","20860012" +"171120","̿","KOSDAQ","߰߱","2110","30","1.44","2080","2110","2025","32784","67212190","75752713600","35901760" +"388790","","KOSDAQ","ó","3395","-290","-7.87","3940","4215","3395","18612229","73216783545","101557792350","29913930" +"347700","øƽ","KOSDAQ","","3055","-100","-3.17","3155","3280","2950","251299","772984745","50902461935","16662017" +"214260","Ľ","KOSDAQ","","16300","-1720","-9.54","18020","18020","16040","238192","3948997390","145272690500","8912435" +"403360","ġ","KONEX","Ϲݱ","9550","-950","-9.05","10000","10000","9030","1679","15679880","32942285700","3449454" +"115390","ض","KOSPI",,"8750","0","0.00","8750","8760","8750","74369","650733510","379106096250","43326411" +"200350","","KOSDAQ","","10130","-630","-5.86","10640","10820","10130","72602","751757740","101259733250","9996025" +"171010","ũ","KOSDAQ","ó","4085","-10","-0.24","4055","4095","3935","55975","223052835","58410401920","14298752" +"084650","ͽ","KOSDAQ","췮","2700","-125","-4.42","2805","2835","2695","2424439","6623394030","200447973000","74239990" +"217500","","KOSDAQ","ó","1795","-70","-3.75","1821","1863","1795","60865","109854913","57102540000","31812000" +"092590","Ǿ","KONEX","Ϲݱ","949","87","10.09","949","949","949","1","949","6919252002","7291098" +"038390","ĸ","KOSDAQ","췮","15710","-30","-0.19","15700","15930","15520","2411","37759740","134940730800","8589480" +"294140","","KOSDAQ","߰߱","4420","-275","-5.86","4730","4745","4400","298889","1360329205","92820000000","21000000" +"443250","۷̼","KOSDAQ","ó","8160","-390","-4.56","8550","8590","8130","33283","276455980","92039789760","11279386" +"228670","","KOSDAQ","߰߱","7970","-430","-5.12","8400","8470","7960","137615","1110716630","123497174380","15495254" +"228850","̾","KOSDAQ","췮","7130","-70","-0.97","7290","7290","6950","10666","75466270","118293929820","16591014" +"412350","","KOSDAQ","","5770","-370","-6.03","6070","6130","5750","77844","457583650","50354628440","8726972" +"199550","","KOSDAQ","ó","7650","-280","-3.53","7870","8000","7610","38350","295921640","89175644550","11656947" +"281740","ũƼ","KOSDAQ","췮","15760","-1390","-8.10","17150","17620","15710","547800","9053110360","1035913436480","65730548" +"277810","κκƽ","KOSDAQ","","130700","-4000","-2.97","133500","134200","130400","70858","9331973400","2535561440600","19399858" +"215100","κκ","KOSDAQ","ó","3360","-100","-2.89","3400","3480","3335","46989","158203700","68370805440","20348454" +"090360","κŸ","KOSDAQ","߰߱","21750","-800","-3.55","22450","22700","21550","23709","518165800","212062500000","9750000" +"238500","κ̾","KONEX","Ϲݱ","414","-3","-0.72","422","422","392","114924","46464012","17395560468","42018262" +"108490","κƼ","KOSDAQ","","17770","-500","-2.74","18100","18270","17670","31132","554303620","231931232340","13051842" +"900260","ν","KOSDAQ","ܱ(ҼӺξ)","682","3","0.44","685","699","645","94511","64187277","24573338416","36031288" +"223220","","KONEX","Ϲݱ","699","50","7.70","552","699","552","11","6219","32189772024","46051176" +"067730","ý","KOSDAQ","߰߱","2440","-90","-3.56","2480","2490","2440","4101","10113520","23604369680","9673922" +"071280","üý","KOSDAQ","췮","13740","90","0.66","13650","13770","13010","35627","478681820","210175325220","15296603" +"032350","Ե","KOSPI",,"9210","-310","-3.26","9530","9550","9150","338167","3131469780","701766845430","76196183" +"089860","ԵŻ","KOSPI",,"30600","-900","-2.86","31500","31500","29400","83691","2542372700","1121002327800","36634063" +"330590","Ե","KOSPI",,"3790","20","0.53","3760","3805","3735","430669","1628144650","920852070360","242968884" +"000400","Եغ","KOSPI",,"2530","-50","-1.94","2585","2600","2495","377068","954723440","785150889600","310336320" +"023530","Ե","KOSPI",,"62700","-900","-1.42","64000","64100","62400","42368","2663245200","1773704938500","28288755" +"020150","ԵƼ","KOSPI",,"39750","-3250","-7.56","43000","43950","39750","455364","18747013900","1832905691250","46110835" +"280360","ԵǪ","KOSPI",,"129600","-3400","-2.56","134300","134600","129000","16207","2103376300","1222720790400","9434574" +"286940","Ե̳뺣Ʈ","KOSPI",,"23100","-600","-2.53","23550","23950","23100","90890","2124178750","349488377700","15129367" +"004000","Եȭ","KOSPI",,"49250","-1350","-2.67","50800","50800","49100","44338","2200579700","1270650000000","25800000" +"004990","Ե","KOSPI",,"24000","-250","-1.03","24450","24450","23750","100176","2399391550","2517821688000","104909237" +"00499K","Եֿ","KOSPI",,"32450","-200","-0.61","32700","32700","31700","218","7028600","26141817350","805603" +"005300","Եĥ","KOSPI",,"128400","-1100","-0.85","130200","130200","127200","8650","1108661800","1191408705600","9278884" +"005305","Եĥ","KOSPI",,"66300","-400","-0.60","66900","67100","66100","1675","111336800","51403053000","775310" +"011170","ԵɹĮ","KOSPI",,"79000","-1500","-1.86","81200","81300","79000","102511","8142407500","3379258101000","42775419" +"071840","Ե̸Ʈ","KOSPI",,"8310","-40","-0.48","8270","8390","8140","19514","160849800","196180086720","23607712" +"328130","","KOSDAQ","","35850","-1750","-4.65","37300","37550","35450","295044","10627393250","1035102499200","28873152" +"038060","ེ","KOSDAQ","߰߱","1034","24","2.38","1014","1034","1007","23255","23558805","49738573346","48103069" +"162120","ũ","KONEX","Ϲݱ","4665","0","0.00","4690","4690","4630","368","1711320","52045548330","11156602" +"253610","Ʈ","KONEX","Ϲݱ","1139","-50","-4.21","1150","1150","1024","12431","13009906","11508803395","10104305" +"141080","͹̿","KOSDAQ GLOBAL","","83200","-800","-0.95","83500","84300","79400","736845","60337819300","3042403353600","36567348" +"058470","","KOSDAQ GLOBAL","췮","173600","-3500","-1.98","177700","178900","171300","88664","15417911300","2646075432000","15242370" +"016100","ڽƽ","KOSDAQ","߰߱","2780","0","0.00","2750","2820","2740","5889","16249390","53100485320","19100894" +"012700","","KOSDAQ","췮","4480","-20","-0.44","4550","4550","4465","19175","85990370","118478684800","26446135" +"302550","޵","KOSDAQ","","2890","-85","-2.86","2975","2975","2885","47922","139317620","88544051200","30638080" +"073570","Ƭ","KOSDAQ","߰߱","2735","-160","-5.53","2880","2890","2665","1357663","3686949225","98978274295","36189497" +"377450","","KOSDAQ","߰߱","12560","-390","-3.01","12900","12950","12360","94216","1191270660","217664800000","17330000" +"277070","վƽþ","KOSDAQ","߰߱","4260","-290","-6.37","4450","4550","4245","44479","192865155","58327920000","13692000" +"042500","Ʈ","KOSDAQ","췮","4520","-170","-3.62","4670","4765","4490","73223","332477230","86197005680","19070134" +"193250","ũ","KOSDAQ","߰߱","490","-15","-2.97","505","506","490","145888","71800513","31028454730","63323377" +"219420","ũϽý","KOSDAQ","","4595","-130","-2.75","4615","4680","4500","40354","184820045","52702384665","11469507" +"439090","","KOSDAQ","߰߱","19230","-870","-4.33","20000","20200","19150","270093","5251991130","314953939800","16378260" +"027740","Ŀ","KOSPI",,"949","-31","-3.16","984","984","948","177043","170014702","60272155372","63511228" +"195500","Ŀ","KOSDAQ","߰߱","2760","-75","-2.65","2835","2875","2725","85884","238856595","44099280000","15978000" +"357430","̾","KOSPI",,"2315","5","0.22","2325","2335","2280","50951","116982190","61532700000","26580000" +"377480","AI","KOSDAQ","","10610","-370","-3.37","10980","10980","10450","25209","267059710","66198400060","6239246" +"305090","ũεŻ","KOSDAQ","","13370","-210","-1.55","13900","14540","12760","474404","6372724580","211294466250","15803625" +"448780","ũο","KONEX","Ϲݱ","1930","-315","-14.03","2375","2375","1930","2","4305","5167922400","2677680" +"098120","ũؼ","KOSDAQ","߰߱","5250","-90","-1.69","5350","5400","5080","61867","321255490","43642021500","8312766" +"424980","ũ","KOSDAQ","","5810","-450","-7.19","6160","6220","5800","54626","322807990","34388750900","5918890" +"038290","ũ","KOSDAQ","߰߱","17190","-250","-1.43","17320","17430","16960","49081","838233630","186363666000","10841400" +"001080","ȣ","KOSPI",,"47150","0","0.00","0","0","0","0","0","195672500000","4150000" +"267980","","KOSDAQ","췮","39600","150","0.38","39500","39600","39200","5739","226216100","310608064800","7843638" +"005990","Ȧ","KOSDAQ","췮","8200","20","0.24","8190","8430","8180","9176","75833110","112490092800","13718304" +"093520","Ŀ","KOSDAQ","췮","8440","-320","-3.65","8690","8780","8440","61932","530056260","136416496480","16163092" +"377030","ƽƮ","KOSDAQ","","2350","-50","-2.08","2375","2400","2320","84963","199309545","45991572700","19570882" +"088980","","KOSPI",,"11920","-140","-1.16","12070","12070","11880","798310","9532605280","5194513751600","435781355" +"094800","ʽƼ1","KOSPI",,"4500","30","0.67","4490","4500","4430","16302","72796100","417754489500","92834331" +"179720","ӴϹ","KONEX","Ϲݱ","11500","-1970","-14.63","12500","12990","11500","35","407730","25825711000","2245714" +"100590","ť","KOSDAQ","췮","3405","-85","-2.44","3490","3490","3395","19093","65286785","53901228315","15830023" +"067280","Ƽķ۽","KOSDAQ","췮","29900","-550","-1.81","30450","30450","29900","4138","124326300","177210692100","5926779" +"072870","ް͵","KOSDAQ","췮","11220","-30","-0.27","11260","11290","11160","11267","126260370","133753159980","11920959" +"215200","ް͵","KOSDAQ GLOBAL","췮","47900","-800","-1.64","49400","49400","47500","26327","1260668600","549027644500","11461955" +"133750","ް","KOSDAQ","߰߱","2060","-50","-2.37","2100","2135","2050","122924","255877730","48218578620","23407077" +"446540","ްġ","KOSDAQ","߰߱","3685","-175","-4.53","3860","3880","3535","123240","453817365","76541135000","20771000" +"235980","޵","KOSDAQ","","6310","-260","-3.96","6570","6740","6310","174400","1116754640","211894185450","33580695" +"200580","޵","KONEX","Ϲݱ","9990","-30","-0.30","10500","10500","9990","53","529990","37223529210","3726079" +"041920","޵Ƴ","KOSDAQ","췮","4850","-140","-2.81","4905","5030","4795","61814","301069945","90201381550","18598223" +"233250","޵ȵ뽺ƽ","KONEX","Ϲݱ","14480","-10","-0.07","0","0","0","0","0","25289812320","1746534" +"014100","޵ӽ","KOSDAQ","߰߱","2145","-50","-2.28","2180","2235","2145","9260","20109005","25311000000","11800000" +"236340","޵޸ɾ","KONEX","Ϲݱ","3885","85","2.24","3890","3890","3885","58","225335","11711903595","3014647" +"054180","޵۽","KOSDAQ","ȯ(ҼӺξ)","436","-23","-5.01","459","472","430","460786","203098687","25670931388","58878283" +"086900","޵彺","KOSDAQ","췮","171300","-3900","-2.23","176200","178200","171200","50495","8761547100","1250232536100","7298497" +"078160","޵Ʈ","KOSDAQ","ó","5630","-110","-1.92","5630","5810","5620","30358","171561720","192646129550","34217785" +"138040","޸","KOSPI",,"89700","-1400","-1.54","91200","91200","88400","262047","23593094700","17107594225800","190720114" +"408920","޽̻","KOSDAQ","ó","2090","-65","-3.02","2155","2170","2090","13396","28427195","90355830950","43232455" +"021880","̽ijŻ","KOSDAQ","߰߱","332","-2","-0.60","332","337","329","385905","127834619","50525223456","152184408" +"140410","","KOSDAQ","߰߱","30700","-1200","-3.76","31900","31900","30700","68860","2138174000","919063382600","29936918" +"241770","ī","KOSDAQ","ó","7800","0","0.00","7900","7900","7740","899","7023890","79502592000","10192640" +"090370","Ÿ","KOSPI",,"1599","-1","-0.06","1600","1640","1450","48438","76398209","39822597711","24904689" +"059210","Ÿ̿޵","KOSDAQ","췮","3700","25","0.68","3655","3740","3595","217102","795808800","88290698700","23862351" +"118000","Ÿɾ","KOSPI",,"380","-6","-1.55","386","390","365","240449","90387807","62615398320","164777364" +"058110","߾̾","KOSDAQ","","2365","-85","-3.47","2420","2450","2350","57923","137534835","37959503450","16050530" +"017180","","KOSPI",,"1999","-61","-2.96","2040","2060","1981","238339","478071689","67872954546","33953454" +"009900","Ż","KOSPI",,"11230","160","1.45","11290","11440","10850","166694","1867984750","589239593590","52470133" +"012690","𳪸","KOSPI",,"3055","-70","-2.24","3090","3115","3015","314964","958318830","111725184025","36571255" +"005360","𳪹","KOSPI",,"2450","-30","-1.21","2495","2495","2415","25376","61919165","46298402150","18897307" +"070960","𳪿","KOSPI",,"4890","-200","-3.93","5050","5120","4855","477185","2370006485","235371998370","48133333" +"434480","ͷ","KOSDAQ","","5160","-360","-6.52","5750","5870","5050","8018675","43982801700","63227028000","12253300" +"080420","̳Ĩ","KOSDAQ","߰߱","1894","-13","-0.68","1903","1935","1890","8474","16134537","150992752068","79721622" +"417970","𵨼ַ","KOSDAQ","߰߱","9450","-300","-3.08","9530","9800","9280","10875","102044140","60448815000","6396700" +"080160","","KOSDAQ","췮","11190","-60","-0.53","11270","11410","11050","36160","401738800","211491000000","18900000" +"087260","Ͼö̾","KOSDAQ","ó","2300","-25","-1.08","2385","2570","2255","6492611","15817034565","74871580300","32552861" +"101330","̽","KOSDAQ","췮","3230","30","0.94","3260","3280","3185","74088","238764875","74764903670","23147029" +"012860","̽","KOSDAQ","췮","1747","-17","-0.96","1777","1829","1742","245256","433939354","127938849379","73233457" +"363260","","KOSDAQ","ó","1750","-64","-3.53","1800","1825","1738","128306","225512404","56286595750","32163769" +"348030","񸯽","KOSDAQ","췮","4400","-75","-1.68","4410","4475","4235","25891","112570050","42256720000","9603800" +"250060","","KOSDAQ","","2450","-70","-2.78","2520","2545","2440","172180","423964310","78819719300","32171314" +"288980","ƵŸ","KOSDAQ","","1411","-53","-3.62","1440","1462","1392","229584","325026405","48759308982","34556562" +"142760","ƶ÷","KOSDAQ","","1610","-33","-2.01","1645","1645","1575","93968","149435759","60753045710","37734811" +"033200","","KOSDAQ","ȯ(ҼӺξ)","3250","-120","-3.56","3370","3375","3230","21550","70394995","46576351250","14331185" +"333050","ڿý","KOSDAQ","ó","1280","-36","-2.74","1289","1316","1280","23459","30189559","31288737280","24444326" +"009680","","KOSPI",,"8500","-10","-0.12","8520","8520","8440","8683","73498690","280500000000","33000000" +"118990","Ʈ","KOSDAQ","췮","10820","-340","-3.05","11830","12270","10810","2731860","31913978300","269006731800","24861990" +"006920","","KOSDAQ","ó","2750","-55","-1.96","2805","2820","2530","46303","123750215","30030000000","10920000" +"009580","P&P","KOSPI",,"2900","-25","-0.85","2900","2980","2855","55004","158616060","180868139600","62368324" +"001810","SP","KOSDAQ","߰߱","1683","-67","-3.83","1732","1760","1683","17298","29918010","37257412500","22137500" +"009200","","KOSPI",,"2070","-40","-1.90","2105","2105","2050","108116","223497025","86131271700","41609310" +"322970","޵","KONEX","Ϲݱ","1655","68","4.28","1600","1739","1560","10931","17946309","16636023590","10051978" +"033920","","KOSPI",,"6060","-120","-1.94","6280","6280","6000","32253","195440410","172710000000","28500000" +"008420","ö","KOSPI",,"2270","-125","-5.22","2360","2385","2270","86855","200584665","46542956350","20503505" +"279600","̵","KOSDAQ","","10220","-250","-2.39","10490","10490","10220","1429","14711330","47878461820","4684781" +"095500","̷","KOSDAQ","췮","10050","-550","-5.19","10510","10860","10020","270554","2758493300","311650489950","31009999" +"254490","̷ݵü","KOSDAQ","߰߱","11970","-240","-1.97","11920","12400","11630","37551","443895310","172822860000","14438000" +"025560","̷","KOSPI",,"1245","-40","-3.11","1285","1285","1232","178542","222377928","38802746925","31166865" +"218150","̷ڿ","KOSDAQ","ó","3855","-60","-1.53","3880","3930","3785","112385","432355520","78702916710","20415802" +"007120","̷̾","KOSPI",,"1164","19","1.66","1134","1164","1103","227721","257717999","33614699712","28878608" +"396690","̷±۷ι","KOSPI",,"3035","-35","-1.14","3070","3070","3025","42763","129845780","120204027900","39605940" +"442900","̷µ帲1ȣ","KOSDAQ","SPAC(ҼӺξ)","9900","-20","-0.20","9950","9950","9850","62470","616691370","76032000000","7680000" +"357250","̷¸ʽ","KOSPI",,"3140","10","0.32","3170","3170","3100","46842","146692850","78484629700","24995105" +"100790","̷ºó","KOSDAQ","췮","4710","-140","-2.89","4795","4880","4710","33275","158652180","250217026140","53124634" +"412930","̷º1ȣ","KOSDAQ","SPAC(ҼӺξ)","2620","0","0.00","0","0","0","0","0","16181120000","6176000" +"446190","̷º2ȣ","KOSDAQ","SPAC(ҼӺξ)","2315","-10","-0.43","2360","2360","2310","10017","23278175","11459250000","4950000" +"448830","̷º3ȣ","KOSDAQ","SPAC(ҼӺξ)","2165","20","0.93","2170","2170","2125","4809","10379960","10651800000","4920000" +"477380","̷º4ȣ","KOSDAQ","SPAC(ҼӺξ)","2025","-5","-0.25","2030","2035","2025","26330","53382920","16402500000","8100000" +"477470","̷º5ȣ","KOSDAQ","SPAC(ҼӺξ)","2065","0","0.00","2065","2075","2060","9909","20484660","11316200000","5480000" +"478440","̷º6ȣ","KOSDAQ","SPAC(ҼӺξ)","2030","0","0.00","2035","2035","2030","11989","24344295","14067900000","6930000" +"085620","̷»","KOSPI",,"5190","-10","-0.19","5180","5300","5150","30006","156480310","918714020910","177016189" +"006800","̷","KOSPI",,"8300","-150","-1.78","8450","8490","8240","750555","6246482410","4941126186400","595316408" +"00680K","̷2B","KOSPI",,"3900","20","0.52","3885","3910","3865","332025","1291405185","546000000000","140000000" +"006805","̷ǿ","KOSPI",,"4160","-20","-0.48","4180","4180","4135","30293","125817755","58555120000","14075750" +"208890","̷Ʈ","KONEX","Ϲݱ","1200","0","0.00","0","0","0","0","0","4806624000","4005520" +"049950","̷۴","KOSDAQ","췮","17130","-770","-4.30","17760","17900","17000","48345","837187810","151050352920","8817884" +"207760","̽ͺ","KOSDAQ","߰߱","1243","-48","-3.72","1280","1315","1239","238517","300435507","103268170269","83079783" +"002840","̿","KOSPI",,"201500","-5500","-2.66","207000","208000","201500","3775","775895500","957125000000","4750000" +"268280","̿","KOSPI",,"131900","400","0.30","136600","136600","130800","1180","155152700","659500000000","5000000" +"107590","̿Ȧ","KOSPI",,"82700","300","0.36","82900","82900","82000","73","6030700","191864000000","2320000" +"134380","̿ȭ","KOSPI",,"80400","300","0.37","80500","80500","80200","1740","139996200","176821147200","2199268" +"351020","","KONEX","Ϲݱ","5700","690","13.77","5700","5700","5700","3","17100","11827500000","2075000" +"003650","â","KOSPI",,"88400","-400","-0.45","88800","89800","87800","816","72030500","153787004800","1739672" +"059090","","KOSDAQ","߰߱","9240","-270","-2.84","9430","9610","9100","277706","2568029300","308771028720","33416778" +"214610","ڹ̿޵","KOSDAQ","","2195","-50","-2.23","2185","2370","2115","1895681","4236888670","95633834275","43568945" +"201490","","KOSDAQ","췮","2160","-30","-1.37","2190","2200","2125","152071","327163685","67516783200","31257770" +"452200","ũ","KOSDAQ","","7750","50","0.65","8900","9230","7630","13244589","114341495680","170076075000","21945300" +"418470","иǼ","KOSDAQ","ó","14300","-690","-4.60","14990","15160","14200","71355","1027943210","121539832700","8499289" +"206640","ٵظ޵","KOSDAQ","췮","16780","-270","-1.58","16920","17070","16540","122913","2065750640","394104476800","23486560" +"018700","ٸ","KOSDAQ","߰߱","1132","-32","-2.75","1195","1195","1132","36125","41803696","39755564924","35119757" +"035620","ٸ̾ؿ","KOSDAQ","߰߱","490","-9","-1.80","499","499","487","80010","39373743","36475440750","74439675" +"354390","ٽĭ̿","KONEX","Ϲݱ","5350","-190","-3.43","5200","5400","5200","506","2635430","37547621450","7018247" +"053030","̳ؽ","KOSDAQ","췮","20800","400","1.96","20150","21100","19180","1870507","37673470340","660629798400","31761048" +"301300","̺۴","KOSDAQ","","4200","-30","-0.71","4230","4370","4085","15108","62808370","52058416200","12394861" +"377740","̿Ʈ","KOSPI",,"4535","20","0.44","4480","4575","4420","192364","864276540","462824177680","102056048" +"064550","̿Ͼ","KOSDAQ","췮","25100","-100","-0.40","24950","25700","24600","179770","4508805550","647838304100","25810291" +"314930","̿","KOSDAQ","","13280","-450","-3.28","13730","13880","13150","188756","2517090140","395267287840","29764103" +"208710","̿α׵̽","KOSDAQ","߰߱","474","-1","-0.21","473","485","454","109426","50778779","29672558316","62600334" +"086820","ַ̿","KOSDAQ","","12800","-440","-3.32","13200","13400","12580","17632","226874210","104235852800","8143426" +"038460","̿Ʈ","KOSDAQ","췮","3380","-65","-1.89","3370","3430","3325","308004","1037705645","80894270080","23933216" +"251120","̿𿣾","KOSDAQ","","14440","-450","-3.02","15000","15000","14310","25848","375855720","125565908000","8695700" +"199730","̿","KOSDAQ","ó","7670","-80","-1.03","7730","7790","7500","4301","32741760","37309694890","4864367" +"266470","̿","KONEX","Ϲݱ","286","-14","-4.67","300","345","282","1342","382900","4034558242","14106847" +"289170","̿","KONEX","Ϲݱ","3915","410","11.70","3990","3990","3480","433","1568640","13747557735","3511509" +"086040","̿彺","KOSDAQ","ó","4415","-70","-1.56","4445","4510","4210","29986","130261080","70455660505","15958247" +"199290","̿ũ","KONEX","Ϲݱ","604","29","5.04","550","604","550","2","1154","9860415968","16325192" +"099430","̿÷","KOSDAQ","߰߱","5050","-150","-2.88","5110","5180","4855","714341","3529593925","292550863200","57930864" +"032980","̿","KOSDAQ","߰߱","948","8","0.85","930","973","920","174376","164110841","42449534520","44777990" +"308080","","KOSDAQ","","3700","-180","-4.64","3725","3835","3600","128974","477638985","71275838000","19263740" +"043150","","KOSDAQ","췮","23100","-300","-1.28","23550","23550","22750","16334","375700400","343133313600","14854256" +"323990","ڼ̿","KOSDAQ","","13870","-260","-1.84","13830","14110","13600","142689","1967088610","318915684000","22993200" +"003610","渲","KOSPI",,"2730","-95","-3.36","2820","2820","2700","105045","288366530","115517465700","42314090" +"267790","跲","KOSDAQ","߰߱","4400","-40","-0.90","4410","4520","4390","15295","67816635","34709400000","7888500" +"001340","鱤","KOSPI",,"7740","-310","-3.85","7870","8030","7700","283797","2210224860","347668470180","44918407" +"046310","T&A","KOSDAQ","߰߱","2265","-45","-1.95","2320","2320","2235","65882","149015595","37188221865","16418641" +"035150","","KOSPI",,"12680","10","0.08","12530","12890","12430","64981","819807560","272620000000","21500000" +"331520","","KOSDAQ","߰߱","729","-6","-0.82","734","735","713","87563","63293307","37080140310","50864390" +"199480","ũ۷ι","KOSDAQ","","8220","-680","-7.64","9110","9120","8210","788778","6675345800","82208121360","10000988" +"438700","Ʈ","KOSDAQ","","3540","-170","-4.58","3710","3830","3525","43531","158355485","39452910600","11144890" +"066410","ŶƩ","KOSDAQ","(ҼӺξ)","1153","0","0.00","0","0","0","0","0","96978744678","84109926" +"002410","ǿ","KOSPI",,"1178","7","0.60","1177","1205","1150","53913","63410085","29252074796","24831982" +"382900","ǻ","KOSDAQ","ó","15510","-270","-1.71","15850","16230","15340","28517","446869130","135883110000","8761000" +"206400","Ƽؾ","KOSDAQ","߰߱","2800","-10","-0.36","2795","3015","2760","28348","79584720","87957800000","31413500" +"019010","","KOSDAQ","췮","2270","-5","-0.22","2285","2290","2215","31958","72051390","109414000000","48200000" +"177350","","KOSDAQ","ȯ(ҼӺξ)","254","-7","-2.68","261","263","248","245655","62361738","22700498922","89372043" +"424760","ũ","KOSDAQ","ó","1039","-31","-2.90","1090","1090","1030","67884","70807498","20431937078","19665002" +"007210","","KOSPI",,"1998","-52","-2.54","2035","2070","1992","369384","740632676","134984880000","67560000" +"225530","","KOSDAQ","췮","4415","-5","-0.11","4380","4530","4380","41578","184789090","160435479705","36338727" +"250000","Ƽ","KOSDAQ","췮","9610","-310","-3.13","9790","9920","9440","31722","304416440","64874544130","6750733" +"002760","","KOSPI",,"1044","0","0.00","1046","1055","1009","187430","191980257","62535600000","59900000" +"003850","","KOSPI",,"10080","-230","-2.23","10310","10390","10000","210352","2123823620","692395200000","68690000" +"310210","γ","KOSDAQ","","78700","-1300","-1.63","79500","80400","74500","281371","21780061700","1423984421000","18093830" +"006910","Ŀ","KOSDAQ","߰߱","2740","-65","-2.32","2760","2820","2710","262568","721265155","134615717760","49129824" +"000890","ؾ","KOSPI",,"429","-6","-1.38","430","435","426","224518","96342297","59682535341","139120129" +"226340","","KOSDAQ","߰߱","1770","-52","-2.85","1807","1835","1757","471651","839510290","74255783400","41952420" +"206950","","KONEX","Ϲݱ","2170","170","8.50","2290","2290","2170","2","4460","30547665050","14077265" +"003000","αǰ","KOSPI",,"4685","-115","-2.40","4755","4800","4660","149567","701585630","320710133635","68454671" +"001270","α","KOSPI",,"27700","-50","-0.18","27750","27750","27200","4727","129752750","287245842200","10369886" +"001275","αǿ","KOSPI",,"21650","-50","-0.23","21600","21650","21550","1066","23053100","64950000000","3000000" +"026940","αö","KOSPI",,"2440","-30","-1.21","2470","2475","2430","62862","153668075","48800000000","20000000" +"014470","ι","KOSDAQ","߰߱","1558","-44","-2.75","1601","1610","1556","112040","175293485","93561421080","60052260" +"011390","λ","KOSPI",,"49350","-500","-1.00","49750","49950","48950","2797","138318800","52113600000","1056000" +"005030","λְ","KOSPI",,"486","0","0.00","0","0","0","0","0","38288532168","78782988" +"008470","νŸ","KOSDAQ","߰߱","4025","0","0.00","4025","4025","3825","3975","15484725","33829320000","8404800" +"338220","","KOSDAQ","","31000","250","0.81","30500","31800","28850","413578","12559255150","430534727000","13888217" +"100120","","KOSDAQ","췮","25750","-250","-0.96","26400","26400","25500","4411","113483300","257548023750","10001865" +"406820","ƼŲ","KOSDAQ","߰߱","14260","-790","-5.25","15240","15240","14160","60999","882203760","50395410400","3534040" +"337930","귣忢۷̼","KOSDAQ","췮","9360","-100","-1.06","9420","9550","8850","654291","6003742980","274356079920","29311547" +"099390","극۴","KOSDAQ","ó","6180","-180","-2.83","6250","6400","6050","12331","76265970","50727188940","8208283" +"064480","긮","KOSDAQ","ó","6260","-440","-6.57","6660","6750","6200","449774","2868783100","74822650000","11952500" +"288330","긴̿׶ǻƽ","KOSDAQ","","3490","-320","-8.40","3840","3900","3355","2871778","10090298175","159877510750","45810175" +"365900","̾","KOSDAQ","ó","3670","10","0.27","3610","3950","3565","13579","51122970","26828801000","7310300" +"089970","̿","KOSDAQ","췮","9350","-450","-4.59","9710","9810","9250","55412","520379930","225106813250","24075595" +"251630","̿","KOSDAQ","췮","4650","-175","-3.63","4770","4820","4650","37021","173781840","74134419900","15942886" +"018290","Ƽ","KOSDAQ","췮","30800","1350","4.58","30000","31500","28500","918095","27813426800","1102578615600","35798007" +"439580","翥","KOSDAQ","","19050","-1000","-4.99","19810","20050","18560","1437021","27592964380","207351420450","10884589" +"033560","","KOSDAQ","߰߱","3530","10","0.28","3525","3620","3455","66012","235086650","60363000000","17100000" +"191600","ž","KONEX","Ϲݱ","9600","0","0.00","9700","9700","9600","2","19300","27360000000","2850000" +"369370","̽Ʃ","KOSDAQ","ó","1700","-3","-0.18","1696","1709","1667","6527","11046721","84782248700","49871911" +"126340","","KOSDAQ","췮","37050","-550","-1.46","36850","38400","36350","16385","604488000","225453621900","6085118" +"121800","Ʈ","KOSDAQ","(ҼӺξ)","3320","0","0.00","0","0","0","0","0","256309348520","77201611" +"082800"," ","KOSDAQ","߰߱","3530","-70","-1.94","3600","3600","3390","211960","737227540","170297666450","48242965" +"318410","","KOSDAQ","߰߱","9340","30","0.32","9260","9410","9170","6214","57905760","51885969620","5555243" +"002070","","KOSPI",,"852","-19","-2.18","915","915","845","35592","30549915","25384479480","29793990" +"100220","","KOSPI",,"4450","-145","-3.16","4590","4625","4450","19437","87625210","57835497450","12996741" +"419540","佺","KOSDAQ","ó","2005","-150","-6.96","2180","2190","1999","822132","1681544071","46099984555","22992511" +"146320","񾾿","KOSDAQ","ó","12260","-400","-3.16","12830","12830","12180","46100","566585510","156841235980","12792923" +"200780","񾾿","KOSDAQ","߰߱","5010","-50","-0.99","5090","5090","4850","9648","48271210","44550843840","8892384" +"413640","̸Ʈ","KOSDAQ","ó","7890","0","0.00","7780","7970","7630","22222","171657180","56862756600","7206940" +"141000","Ʈ","KOSDAQ","췮","6640","-130","-1.92","6720","6820","6520","27701","182480700","80441674400","12114710" +"090460","ġ","KOSPI",,"19280","-1170","-5.72","20550","20650","19160","829146","16282830210","664473227120","34464379" +"083650","ġ","KOSDAQ","߰߱","7350","-250","-3.29","7530","7600","7330","195900","1453802910","227441156250","30944375" +"445360","1ȣ","KOSDAQ","SPAC(ҼӺξ)","2095","-10","-0.48","2095","2110","2085","2476","5194310","9029450000","4310000" +"473370","2ȣ","KOSDAQ","SPAC(ҼӺξ)","2030","-10","-0.49","2040","2040","2030","2453","4991905","8546300000","4210000" +"065170","","KOSDAQ","߰߱","443","21","4.98","422","490","420","982781","452539581","39413957637","88970559" +"086670","Ƽ","KOSDAQ","췮","9250","-260","-2.73","9590","9590","9060","22539","206809350","84407859500","9125174" +"335890","","KOSDAQ","ó","8140","-190","-2.28","8330","8410","7900","838366","6791393790","475531677500","58419125" +"230980","ũ","KOSDAQ","(ҼӺξ)","229","0","0.00","0","0","0","0","0","21370407553","93320557" +"138580","Ͻ","KOSDAQ","ó","15850","120","0.76","15820","15860","15810","483733","7666501060","357515183550","22556163" +"082920","μ","KOSDAQ","췮","17860","-280","-1.54","18040","18200","17740","79297","1416319320","408497724180","22872213" +"054220","νý","KOSDAQ","ó","461","1","0.22","460","462","448","193379","87499634","22663036139","49160599" +"042370","ũ","KOSDAQ","췮","6610","-140","-2.07","6640","6760","6540","124336","821316560","173182165250","26200025" +"050090","Ȧ","KOSDAQ","߰߱","831","0","0.00","831","845","819","30136","25020063","16441114785","19784735" +"148780","ťAI","KOSDAQ","","975","-46","-4.51","1020","1021","973","161172","159164547","30659581875","31445725" +"307870","","KOSDAQ","ó","2295","-115","-4.77","2435","2455","2145","1096277","2495650335","103958632305","45297879" +"357880","Ʈ","KOSDAQ","","3460","10","0.29","3500","3545","3200","164340","555711115","36136087760","10443956" +"032850","Ʈǻ","KOSDAQ","ó","5050","-120","-2.32","5150","5210","5040","129708","658784785","83947629650","16623293" +"238200","ǵ","KOSDAQ","(ҼӺξ)","4545","0","0.00","0","0","0","0","0","37178100000","8180000" +"093190","ַ","KOSDAQ","췮","4815","-110","-2.23","4920","4940","4800","13189","63760195","92635327575","19238905" +"065450","","KOSDAQ","ó","4565","-80","-1.72","4625","4685","4515","491539","2253548510","130800032000","28652800" +"210120","","KOSDAQ","߰߱","12200","1000","8.93","11050","12800","10990","147961","1793109500","38364242000","3144610" +"044480","","KOSDAQ","߰߱","699","-21","-2.92","715","720","680","238591","165919978","28423945872","40663728" +"005180","׷","KOSPI",,"60600","-600","-0.98","61100","61700","59800","45960","2788660400","596985204600","9851241" +"069540","","KOSDAQ","ó","1490","-26","-1.72","1497","1545","1391","588392","862700759","63213257450","42425005" +"072950","","KOSDAQ","췮","3925","-150","-3.68","4050","4100","3925","53471","213228750","31606494250","8052610" +"266170","Ѹ","KONEX","Ϲݱ","600","14","2.39","600","600","600","1","600","3955360200","6592267" +"451250","߾","KOSDAQ","߰߱","14440","760","5.56","13430","14700","12880","2837651","40405585100","139810780280","9682187" +"143240","","KOSDAQ","췮","15890","90","0.57","16180","16180","15770","2628","41520270","186060189070","11709263" +"003960","븲","KOSPI",,"53400","-400","-0.74","53800","54200","52300","50310","2675665500","489382537800","9164467" +"008040","ƿ","KOSPI",,"980","-12","-1.21","991","997","975","534411","524665217","138321708000","141144600" +"007160","","KOSPI",,"62800","400","0.64","62400","62800","60100","16777","1028291100","314000000000","5000000" +"014710","Ǫ","KOSPI",,"6070","0","0.00","6070","6220","5900","103742","626965520","104516556010","17218543" +"006090","","KOSPI",,"9600","-150","-1.54","9730","9730","9510","22329","213848430","90458294400","9422739" +"452430","ǿݵü","KOSDAQ","","11430","-200","-1.72","11740","12050","11300","62596","724993870","92542469220","8096454" +"419120","굹","KOSDAQ","߰߱","6690","-250","-3.60","6900","6940","6650","19056","128177840","52010240940","7774326" +"062040","","KOSPI",,"29650","-2350","-7.34","31500","31750","29400","651165","19562857150","902700180000","30445200" +"122350","","KOSDAQ","߰߱","1458","-42","-2.80","1500","1500","1440","35034","50915699","55898886024","38339428" +"419050","̺","KOSDAQ","߰߱","1996","-89","-4.27","2145","2180","1990","611122","1248709562","114163695040","57196240" +"014970","︢","KOSDAQ","߰߱","3740","-25","-0.66","3775","3775","3695","10795","40027655","56567500000","15125000" +"018310","񿡽","KOSDAQ","췮","18900","-100","-0.53","18900","19170","18690","21145","398487080","277830000000","14700000" +"012210","̱ݼ","KONEX","Ϲݱ","2880","330","12.94","2880","2880","2880","1","2880","102527668800","35599885" +"053700","ﺸͽ","KOSDAQ","췮","4475","-30","-0.67","4500","4575","4430","39352","176903830","102375425250","22877190" +"009620","ﺸ","KOSDAQ","߰߱","403","-4","-0.98","415","415","397","214961","86494890","29735718506","73785902" +"023600","ﺸ","KOSDAQ","췮","9190","-80","-0.86","9270","9270","9150","5413","49682670","148602300000","16170000" +"001470","","KOSPI",,"458","-26","-5.37","485","507","458","7376627","3501000713","102414215392","223611824" +"028050","ZE&A","KOSPI",,"23900","-100","-0.42","24000","24200","23750","407996","9750746950","4684400000000","196000000" +"448730","ZFN","KOSPI",,"4895","40","0.82","4875","4895","4850","59951","292271905","378383500000","77300000" +"006400","ZSDI","KOSPI",,"343000","-22500","-6.16","367500","370500","341000","587735","206301133500","23586233790000","68764530" +"006405","ZSDI","KOSPI",,"214500","-11000","-4.88","225500","229500","214000","2303","502423500","347038692000","1617896" +"006660","Z","KOSPI",,"12980","-1010","-7.22","13850","14210","12710","422522","5621808120","105479555720","8126314" +"028260","Z","KOSPI",,"146700","-3200","-2.13","151000","151000","144000","204080","29850853400","26080928496900","177784107" +"02826K","ZB","KOSPI",,"107200","-1800","-1.65","110100","110100","105700","2708","288803700","157325648000","1467590" +"207940","Z̿","KOSPI",,"965000","30000","3.21","935000","973000","929000","123527","117359177000","68682910000000","71174000" +"032830","Z","KOSPI",,"96400","-1700","-1.73","98000","98100","95500","181128","17483046600","19280000000000","200000000" +"425290","Z6ȣ","KOSDAQ","SPAC(ҼӺξ)","2150","-10","-0.46","2180","2180","2140","65907","141817360","11868000000","5520000" +"439250","Z7ȣ","KOSDAQ","SPAC(ҼӺξ)","10260","0","0.00","10250","10260","10240","15964","163622590","35930520000","3502000" +"448740","Z8ȣ","KOSDAQ","SPAC(ҼӺξ)","9990","0","0.00","9990","10000","9980","18394","183635390","46593360000","4664000" +"468510","Z9ȣ","KOSDAQ","SPAC(ҼӺξ)","2050","5","0.24","2050","2055","2035","46560","95335685","22652500000","11050000" +"018260","Z𿡽","KOSPI",,"151500","-6800","-4.30","158800","158800","151500","142499","21867754000","11722736700000","77377800" +"009150","Z","KOSPI",,"130400","-3300","-2.47","133700","134000","129800","410012","53649127800","9740057958400","74693696" +"009155","Z","KOSPI",,"63500","-1100","-1.70","64600","64700","62000","6270","397337900","184593484000","2906984" +"005930","Z","KOSPI",,"68900","-100","-0.14","69100","69700","68000","19022299","1309833642247","411318017695000","5969782550" +"005935","Zڿ","KOSPI",,"56100","100","0.18","56000","56500","55300","1261039","70638330904","46163943870000","822886700" +"001360","Z","KOSPI",,"1503","-27","-1.76","1530","1532","1499","301504","453608857","141525604737","94162079" +"010140","Z߰","KOSPI",,"9610","-210","-2.14","9820","9910","9530","5048487","48673322420","8456800000000","880000000" +"016360","Z","KOSPI",,"46650","50","0.11","46850","47350","45900","264779","12376006450","4165845000000","89300000" +"068290","Zǻ","KOSPI",,"14110","-390","-2.69","14310","14600","13530","13012","182977100","141100000000","10000000" +"029780","Zī","KOSPI",,"44600","0","0.00","44900","44900","43450","87192","3867479600","5167306538600","115858891" +"000810","Zȭ","KOSPI",,"352000","-7000","-1.95","361000","361500","349000","57387","20275387000","16675942624000","47374837" +"000815","Zȭ","KOSPI",,"281000","-2000","-0.71","281500","283000","275000","11225","3126433000","896952000000","3192000" +"006110","ƾ˹̴","KOSPI",,"42700","-3300","-7.17","47000","47000","42350","57607","2509395000","628198813200","14711916" +"009300","","KOSDAQ","췮","21250","-400","-1.85","21450","21650","20750","49031","1031466050","135362500000","6370000" +"145990","","KOSPI",,"47800","-700","-1.44","48200","48750","47450","9630","460018450","492982862200","10313449" +"145995","","KOSPI",,"29800","-50","-0.17","30550","30550","29650","412","12276050","11028086000","370070" +"003230","ǰ","KOSPI",,"470000","-11000","-2.29","481000","484000","458000","70010","32796304000","3540517050000","7533015" +"002170","","KOSPI",,"45650","-650","-1.40","45850","47500","45500","3733","171116650","136950000000","3000000" +"272550","Ű¡","KOSPI",,"17570","-70","-0.40","17640","17820","17240","17999","313286930","277406949470","15788671" +"000070","Ȧ","KOSPI",,"71100","0","0.00","71400","71600","70600","1640","116575400","608919668100","8564271" +"000075","Ȧ","KOSPI",,"54400","0","0.00","55300","55300","54200","324","17623300","16540755200","304058" +"003720","￵","KOSPI",,"4415","-90","-2.00","4580","4615","4300","767119","3406857550","150110000000","34000000" +"002810","￵","KOSPI",,"12640","0","0.00","12640","12670","12510","11712","147255280","233422222720","18466948" +"361670","￵ؾ","KOSDAQ","","5420","-140","-2.52","5560","5560","5170","35216","188822000","30718706360","5667658" +"054540","￵","KOSDAQ","߰߱","3910","-70","-1.76","3980","4025","3850","155464","610268570","50830000000","13000000" +"065570","￵̿","KOSDAQ","ó","1445","9","0.63","1436","1450","1406","91488","130297114","19306082895","13360611" +"005680","￵","KOSPI",,"8410","-60","-0.71","8500","8500","8340","31348","262682580","168200000000","20000000" +"023000","","KOSPI",,"2470","-50","-1.98","2545","2545","2450","60182","149287175","98800000000","40000000" +"004380","THK","KOSPI",,"9420","-380","-3.88","9730","9890","9410","47608","454234280","197820000000","21000000" +"002450",";DZ","KOSPI",,"1055","15","1.44","1044","1065","1034","202865","211720033","95510115325","90530915" +"032280","","KOSDAQ","߰߱","1588","-16","-1.00","1590","1627","1571","6446","10203068","25747180920","16213590" +"002290","ϱ","KOSDAQ","߰߱","2795","-60","-2.10","2850","2850","2795","40095","112881135","34658000000","12400000" +"004440","Ͼ","KOSPI",,"4045","-90","-2.18","4135","4140","4040","13766","56012230","51500725615","12731947" +"000520","","KOSPI",,"9820","-210","-2.09","10000","10090","9580","402253","3921475250","212084494180","21597199" +"009770","","KOSPI",,"25850","150","0.58","25650","25900","25300","1052","26837400","64624250350","2499971" +"037460","","KOSDAQ","췮","8560","-90","-1.04","8650","8750","8420","27587","234910010","139686548320","16318522" +"032750","","KOSDAQ","췮","4225","-70","-1.63","4295","4380","4040","24720","104134880","38156490450","9031122" +"054090","ص","KOSDAQ","߰߱","1017","-30","-2.87","1036","1042","1005","112328","114105814","25383538944","24959232" +"005500","","KOSPI",,"17910","-260","-1.43","17930","18130","17500","12264","217591140","248949000000","13900000" +"000250","õ","KOSDAQ","߰߱","132500","-9200","-6.49","140000","140900","128400","802488","106496243300","3108115040000","23457472" +"004690","õ","KOSPI",,"87400","-900","-1.02","88300","88300","87200","5467","478482600","354409185000","4055025" +"024950","õ","KOSDAQ","߰߱","4055","-140","-3.34","4125","4165","4055","20928","85550050","53824354735","13273577" +"038500","ǥøƮ","KOSDAQ","췮","2955","-75","-2.48","3010","3045","2950","342813","1021720510","318892684230","107916306" +"437730","","KOSDAQ","","21350","0","0.00","21350","21600","20650","18061","381836500","225652185150","10569189" +"017480","ö","KOSDAQ","췮","4565","-15","-0.33","4580","4625","4465","11629","52652435","71683692850","15702890" +"010960","ȣ","KOSPI",,"3250","-10","-0.31","3290","3300","3225","23647","76696245","81250000000","25000000" +"046390","ȭƮ","KOSDAQ","߰߱","1350","-40","-2.88","1376","1390","1350","41043","55997195","58283459550","43172933" +"004450","ȭհ","KOSPI",,"31350","-750","-2.34","32000","32000","31050","826","25815350","67539781650","2154379" +"009470","ȭ","KOSPI",,"36400","-2350","-6.06","38550","38600","35500","141877","5147605150","240743048000","6613820" +"011230","ȭ","KOSPI",,"2955","-45","-1.50","2990","3050","2950","31378","93684415","49947478500","16902700" +"001820","ȭܵ","KOSPI",,"33700","-400","-1.17","34150","35000","33300","44033","1481583650","350311500000","10395000" +"000390","ȭƮ","KOSPI",,"6550","-120","-1.80","6640","6720","6520","79097","521010570","178182721950","27203469" +"027580","","KOSDAQ","췮","1225","-37","-2.93","1254","1273","1225","318967","395901424","72497066775","59181279" +"038540","","KOSDAQ","췮","1846","-14","-0.75","1860","1869","1840","77353","143216121","102136065798","55328313" +"415580","3ȣ","KOSDAQ","SPAC(ҼӺξ)","2090","0","0.00","2090","2095","2080","18349","38295445","11097900000","5310000" +"452670","4ȣ","KOSDAQ","SPAC(ҼӺξ)","2010","0","0.00","2010","2015","2010","1172","2355750","10492200000","5220000" +"001290","","KOSPI",,"455","-5","-1.09","461","462","454","46817","21420662","49293389600","108337120" +"041650","ź극ũ","KOSPI",,"3340","-55","-1.62","3395","3515","3305","83930","282385885","71714643000","21471450" +"091580","̵","KOSDAQ","췮","10400","-600","-5.45","11000","11050","10050","112037","1170930690","139653477600","13428219" +"263810","","KOSDAQ","߰߱","3050","-5","-0.16","3010","3120","2900","58363","175430185","43446389900","14244718" +"089980","ũ","KOSDAQ","췮","21600","-600","-2.70","21950","22150","21150","42834","919533900","345363199200","15989037" +"042940","Ǽ","KOSDAQ","߰߱","2295","-95","-3.97","2385","2385","2285","25406","58707960","27414793980","11945444" +"042600","δн","KOSDAQ","췮","11930","-390","-3.17","12320","12570","11470","22420","262590240","148213237820","12423574" +"075180","пƼ","KOSPI",,"3935","65","1.68","3870","3935","3775","3787","14501755","75552000000","19200000" +"107600","","KOSDAQ","ó","23000","-2000","-8.00","24600","25000","23000","20684","487413900","113540535000","4936545" +"411080","","KOSDAQ","","8320","-800","-8.77","8910","9060","7940","2057025","17030868610","126868668160","15248638" +"252990","","KOSDAQ","","5080","-200","-3.79","5240","5300","5020","323774","1649210630","296611360040","58388063" +"007540","ǥ","KOSPI",,"45350","50","0.11","45750","45750","44800","2447","110607050","130417530000","2875800" +"248170","ǥǰ","KOSPI",,"27350","-450","-1.62","27500","27850","27050","8692","237498600","124942622100","4568286" +"378800","","KOSDAQ","","3055","290","10.49","2765","3115","2560","20376317","59261381805","92086959705","30143031" +"294630","","KOSDAQ","","3305","-35","-1.05","3300","3350","3210","125804","411491895","79252111995","23979459" +"038070","̿","KOSDAQ","췮","7520","30","0.40","7460","7540","7340","56072","416873980","66933083520","8900676" +"006730","T&D","KOSDAQ","췮","5790","-210","-3.50","5970","5970","5770","148860","865124450","384611884170","66426923" +"079650","","KOSDAQ","߰߱","1193","-29","-2.37","1238","1267","1193","14549","17697564","23860000000","20000000" +"100660","ϱ","KOSDAQ","߰߱","3730","-130","-3.37","3810","3850","3690","50007","187428495","46998000000","12600000" +"007860","","KOSPI",,"6930","-190","-2.67","7090","7090","6820","80281","554281440","162715318920","23479844" +"200880","ȭ","KOSPI",,"12850","-210","-1.61","12990","13090","12640","170829","2194916460","347315415450","27028437" +"019770","žŻ","KOSDAQ","췮","3650","-90","-2.41","3710","3735","3600","27154","98914810","42522500000","11650000" +"017390","ﰡ","KOSPI",,"52700","-500","-0.94","53300","53400","52500","3849","202897200","263500000000","5000000" +"043710","︮","KOSDAQ","߰߱","738","14","1.93","724","747","716","121584","89018737","37046773440","50198880" +"092190","̿ý","KOSDAQ","߰߱","3770","-45","-1.18","3815","3900","3700","33151","123947160","172923803910","45868383" +"046890","ݵü","KOSDAQ GLOBAL","췮","9180","-230","-2.44","9420","9430","9060","141017","1292000030","535243572000","58305400" +"004410","ǰ","KOSPI",,"164","-2","-1.20","166","167","163","663412","109080953","61459911676","374755559" +"004415","ǰ","KOSPI",,"1356","12","0.89","1345","1357","1345","5972","8032636","3016422000","2224500" +"063170","","KOSDAQ","췮","7070","-590","-7.70","7770","7850","7020","615862","4502024280","125664067690","17774267" +"027040","","KOSDAQ","߰߱","279","-8","-2.79","288","298","278","480716","137364730","19415288313","69588847" +"018680","","KOSDAQ","ó","3570","-115","-3.12","3675","3685","3510","41408","147390380","41623768830","11659319" +"021050","","KOSPI",,"1226","-25","-2.00","1247","1259","1210","81624","100038119","58203847340","47474590" +"093920","","KOSDAQ","췮","5600","-10","-0.18","5640","5640","5560","18150","101254820","104160000000","18600000" +"189860","","KOSDAQ","ó","4255","-220","-4.92","4575","4575","4120","85528","367398530","41268308900","9698780" +"178320","ý","KOSDAQ","췮","23800","-450","-1.86","24800","24900","23500","537109","12958826250","1335663021000","56120295" +"122690","Ƽ","KOSDAQ","췮","2400","-15","-0.62","2410","2410","2335","16074","37962740","52426584000","21844410" +"140070","÷۷ι","KOSDAQ","췮","2920","-20","-0.68","2915","2940","2890","42660","123721405","108004960000","36988000" +"011370","","KOSDAQ","췮","808","-16","-1.94","824","834","808","131670","107152292","81523050920","100894865" +"065710","ȣ","KOSDAQ","췮","19300","0","0.00","19580","19580","19210","5927","114482870","99395000000","5150000" +"008490","","KOSPI",,"16540","-160","-0.96","16610","16830","16500","7636","126487480","191353129020","11569113" +"035890","Ǽ","KOSDAQ","췮","1474","16","1.10","1463","1484","1460","674185","994419820","338737665618","229808457" +"357550","濡Ƽ","KOSDAQ","","44700","-500","-1.11","44800","45700","44200","7342","327400300","243838500000","5455000" +"003100","","KOSDAQ","췮","16130","-70","-0.43","16190","16330","15950","9898","159210760","106458000000","6600000" +"007610","","KOSPI",,"3000","0","0.00","0","0","0","0","0","54000000000","18000000" +"067370","̿","KOSDAQ","","6960","0","0.00","6900","7070","6810","9799","67586310","85702342800","12313555" +"171090","ͽý","KOSDAQ","߰߱","48200","-1800","-3.60","50100","50100","47500","117703","5713340350","457630321000","9494405" +"136490","","KOSPI",,"6880","-190","-2.69","7100","7100","6860","32841","227244040","163603675520","23779604" +"086710","Ƽ̾","KOSDAQ","߰߱","9800","-500","-4.85","10120","10300","9600","150742","1484218780","119592144000","12203280" +"014620","","KOSDAQ","췮","14020","-450","-3.11","14400","14600","13920","398565","5628341910","400972000000","28600000" +"037350","̿","KOSDAQ","췮","4830","30","0.63","4795","4830","4590","126438","591679290","74720100000","15470000" +"014910","","KOSPI",,"1188","-8","-0.67","1196","1205","1185","61939","73893094","26683650180","22460985" +"014915","ڿ","KOSPI",,"5020","-40","-0.79","5000","5090","5000","260","1301980","3012000000","600000" +"003080","ȭ","KOSPI",,"2575","-85","-3.20","2640","2660","2570","129550","337672050","51551500000","20020000" +"004980","žȸ","KOSPI",,"8100","-90","-1.10","8200","8220","8070","64399","521773600","198580191300","24516073" +"004985","žȸ","KOSPI",,"11500","90","0.79","11490","11600","11200","529","6021570","8459917500","735645" +"011300","ȸƼ","KOSPI",,"904","-5","-0.55","910","913","886","108609","97433358","66257783232","73294008" +"081580","","KOSDAQ","췮","3455","10","0.29","3445","3555","3295","141260","486508380","53580634065","15508143" +"045300","ũ","KOSDAQ","߰߱","2710","-75","-2.69","2785","2800","2680","20523","55713845","27510789930","10151583" +"015750","","KOSDAQ","췮","6310","-150","-2.32","6440","6500","6250","411955","2618825890","504800000000","80000000" +"365340","","KOSDAQ","","52900","-1500","-2.76","54100","55400","52800","19017","1016659800","642065656300","12137347" +"000180","â","KOSPI",,"1625","0","0.00","1602","1633","1600","13030","20960786","113346350000","69751600" +"080470","â","KOSDAQ","߰߱","3750","-240","-6.02","3950","3970","3750","3933","15120900","27375000000","7300000" +"043260","ȣ","KOSDAQ","췮","1538","-34","-2.16","1557","1585","1523","255636","392271339","92724363574","60288923" +"148150","ũ","KOSDAQ","췮","5590","-170","-2.95","5720","5820","5530","352485","1973562780","200459798110","35860429" +"002420","","KOSPI",,"5950","-240","-3.88","6140","6140","5890","28469","170206190","33075145600","5558848" +"188260","","KOSDAQ","","3000","-190","-5.96","3120","3190","2935","195357","590947940","21685410000","7228470" +"053060","","KOSDAQ","߰߱","1096","-29","-2.58","1113","1117","1095","34995","38683522","19352531224","17657419" +"340440","B&G","KOSDAQ","ó","1323","-13","-0.97","1323","1325","1304","25283","33279402","37544575572","28378364" +"017510","","KOSDAQ","߰߱","5070","-190","-3.61","5250","5290","5040","352765","1807735620","77297220000","15246000" +"004360","","KOSPI",,"12970","-120","-0.92","13090","13090","12700","57949","744567270","250433709300","19308690" +"004365","","KOSPI",,"7800","80","1.04","7850","7870","7620","8382","65196780","28776150000","3689250" +"004490","","KOSPI",,"84600","-2800","-3.20","87400","87400","83700","93918","7975422500","1184400000000","14000000" +"011560","̾","KOSDAQ","췮","9750","-190","-1.91","9860","9960","9670","37340","363243690","102667500000","10530000" +"267080","̸","KONEX","Ϲݱ","2485","25","1.02","2550","2550","2485","8","20010","29500448880","11871408" +"396300","Ƹīн","KOSDAQ","ó","2750","-140","-4.84","2890","2900","2735","79400","219883190","72846125000","26489500" +"001430","ƺƿ","KOSPI",,"18910","-590","-3.03","19680","19680","18900","71762","1369123670","678152670290","35862119" +"306200","","KOSPI",,"112000","-1200","-1.06","113400","115500","111700","6021","674835600","317665600000","2836300" +"003030","","KOSPI",,"177500","1000","0.57","178900","179800","172100","3522","615828800","735144117500","4141657" +"019440","Ư","KOSPI",,"13550","-70","-0.51","13620","13620","13490","7347","99433090","116123500000","8570000" +"058650","Ȧ","KOSPI",,"103500","-3400","-3.18","106000","106000","102000","177","18259900","414000000000","4000000" +"013000","۷ι","KOSPI",,"1296","-22","-1.67","1319","1350","1296","18880","24610745","37201720176","28705031" +"100700","޵Į","KOSDAQ","췮","2725","-5","-0.18","2730","2750","2700","47941","130362075","119355000000","43800000" +"024830","","KOSDAQ","췮","6450","120","1.90","6330","6550","6300","2296","14813170","53857500000","8350000" +"091090","̾ؾ","KOSPI",,"1270","0","0.00","0","0","0","0","0","54838923850","43180255" +"021820","","KOSPI",,"8270","100","1.22","8460","8480","8130","5901","48365360","82700000000","10000000" +"067830","̺I&C","KOSPI",,"2070","-5","-0.24","2070","2120","2040","94223","195046635","84954652650","41040895" +"258830","޵Į","KOSDAQ","(ҼӺξ)","412","0","0.00","0","0","0","0","0","22983976612","55786351" +"036630","ڷ","KOSDAQ","췮","517","-4","-0.77","521","521","512","56334","28984136","103400000000","200000000" +"039310","","KOSDAQ","߰߱","1514","-11","-0.72","1500","1564","1500","18344","27836608","27436203838","18121667" +"075580","߰","KOSPI",,"7150","-40","-0.56","7150","7160","6890","335312","2355978710","406473610400","56849456" +"067770","Ƽ","KOSDAQ","߰߱","2460","-40","-1.60","2500","2555","2460","14982","37513580","20655618780","8396593" +"053450","ڴн","KOSDAQ","췮","5140","-20","-0.39","5120","5400","5010","78687","403957100","76035007420","14792803" +"222810","Ǿ","KOSDAQ","(ҼӺξ)","1080","0","0.00","0","0","0","0","0","81712098000","75659350" +"252500","ȭǾؾ","KOSDAQ","߰߱","980","-35","-3.45","1000","1015","974","296812","293283477","40656662200","41486390" +"321370","","KOSDAQ","","2815","-95","-3.26","2910","2970","2815","67549","192596175","74157642175","26343745" +"347000","","KOSDAQ","","2245","55","2.51","2175","2700","2175","8630106","21560225855","74096171120","33004976" +"331920","ͽ","KOSDAQ","","4450","-255","-5.42","4465","4690","4430","147062","659792245","36330458600","8164148" +"049180","޵","KOSDAQ","ó","3250","750","30.00","2685","3250","2500","48868606","143672137210","160011943000","49234444" +"299660","","KOSDAQ","","4995","-305","-5.75","5320","5340","4915","1065888","5373717240","105409370115","21102977" +"268600","","KOSDAQ","(ҼӺξ)","6680","0","0.00","0","0","0","0","0","248090837960","37139347" +"108860","ٽAI","KOSDAQ","췮","12660","-570","-4.31","13230","13320","12550","326454","4166742270","340741241400","26914790" +"208370","ٽコɾ","KOSDAQ","ó","4010","-140","-3.37","4185","4205","3985","262947","1064292485","103219661640","25740564" +"318160","̿޸","KOSDAQ","ó","3075","60","1.99","2965","3075","2965","6323","18903895","28477270575","9260901" +"068270","Ʈ","KOSPI",,"191200","3200","1.70","188100","192500","185500","661187","125313766000","41494451528000","217021190" +"068760","Ʈ","KOSDAQ","췮","66800","1100","1.67","65000","67000","65000","94136","6226639200","2778905851600","41600387" +"068940","DZ۷ι","KOSDAQ","(ҼӺξ)","778","0","0.00","0","0","0","0","0","29766744466","38260597" +"060230","Ҵϵ","KOSDAQ","߰߱","1174","0","0.00","0","0","0","0","0","47383754126","40360949" +"290690","ҷ轺","KOSDAQ","߰߱","8610","470","5.77","8150","8700","8150","254534","2139072260","392308967400","45564340" +"950200","Ҹ","KOSDAQ","ܱ(ҼӺξ)","4120","-35","-0.84","4160","4185","4050","33032","135181350","79252538360","19236053" +"032680","Ʈ","KOSDAQ","߰߱","462","-8","-1.70","463","471","440","1141670","522232539","48782932968","105590764" +"032685","Ʈ","KOSDAQ","߰߱","7810","-10","-0.13","7820","7820","7760","1461","11422650","2789279020","357142" +"258790","Ʈķ","KOSDAQ","ó","955","-27","-2.75","973","979","949","27111","26043527","23866676220","24991284" +"066910","տ","KOSDAQ","߰߱","1640","14","0.86","1609","1715","1609","67010","109498896","55406184760","33784259" +"336370","ַ罺÷ܼ","KOSPI",,"11610","-490","-4.05","12060","12170","11600","286326","3364498600","815223363840","70217344" +"33637K","ַ罺÷ܼ1","KOSPI",,"2515","-20","-0.79","2530","2540","2495","10775","26977085","42525546490","16908766" +"33637L","ַ罺÷ܼ2B","KOSPI",,"6010","-90","-1.48","6030","6120","5870","5837","34923770","22707558960","3778296" +"248070","ַ翥","KOSPI",,"20250","150","0.75","20350","20500","19510","332307","6663267810","1012612407750","50005551" +"035610","ֺ","KOSDAQ","췮","3720","-70","-1.85","3750","3780","3650","24179","89083665","101727108840","27345997" +"357780","ֺ극","KOSDAQ","췮","215500","-1000","-0.46","216500","218000","211500","18065","3861409500","1676280973000","7778566" +"036830","ֺ극Ȧ","KOSDAQ GLOBAL","췮","46700","-2200","-4.50","48500","48850","46050","134228","6286766550","979021415200","20964056" +"304100","Ʈ轺","KOSDAQ","","13100","-190","-1.43","13300","13680","13100","49766","657247560","158910440800","12130568" +"328380","Ʈ","KOSDAQ","ó","926","-24","-2.53","948","975","925","91558","85990246","31727332428","34262778" +"004430","ۿ","KOSPI",,"10700","-140","-1.29","10710","10830","10600","41226","440929080","256800000000","24000000" +"086980","ڽ","KOSDAQ","߰߱","3640","-150","-3.96","3765","3780","3640","347522","1278635170","228002320000","62638000" +"050960","̾Ƽ","KOSDAQ","ó","9870","-70","-0.70","10120","10120","9800","8442","83232620","66632370000","6751000" +"126720","δƮ","KOSPI",,"20250","-100","-0.49","20350","20450","19870","26330","527757200","289291500000","14286000" +"017550","߰","KOSPI",,"1662","-43","-2.52","1696","1715","1657","220223","367586263","103707354060","62399130" +"084180","","KOSDAQ","߰߱","532","-21","-3.80","557","557","522","102519","54487783","62494291636","117470473" +"253840","","KOSDAQ","췮","6030","-210","-3.37","6150","6280","5930","292080","1769857540","100961496000","16743200" +"185190","","KONEX","Ϲݱ","994","17","1.74","994","994","994","1","994","9183193250","9238625" +"298830","Ʈũ","KOSDAQ","ó","4740","-165","-3.36","5090","5390","4740","6526989","33434025055","249414349140","52619061" +"236200","","KOSDAQ","췮","25350","-650","-2.50","26000","26150","25000","51129","1296763950","182349470550","7193273" +"094840","ġť","KOSDAQ","ó","5790","-140","-2.36","5880","6010","5790","42113","245946000","60631953600","10471840" +"192440","ǰڸ","KOSDAQ","췮","23600","-500","-2.07","24250","24250","23500","10600","251177150","146706166800","6216363" +"424960","Ʈ̴ý","KOSDAQ","","7190","370","5.43","6880","8740","6880","2112583","16747312500","112288674600","15617340" +"099440","","KOSDAQ","췮","2815","-90","-3.10","2860","2905","2790","313100","883572785","113285154110","40243394" +"053210","ī̶","KOSPI",,"4835","-15","-0.31","4825","4890","4800","14495","69943935","229773487425","47522955" +"276040","ڳ","KOSDAQ","","3125","-175","-5.30","3390","3390","3065","45320","141953710","39232731250","12554474" +"159910","ŲؽŲ","KOSDAQ","߰߱","780","-25","-3.11","811","833","765","200784","156704286","28399876440","36410098" +"204210","Ÿ","KOSPI",,"2710","-10","-0.37","2720","2820","2690","34860","95019765","21210668650","7826815" +"060240","Ÿڸũ","KOSDAQ","߰߱","1025","-46","-4.30","1069","1069","991","154962","157627644","31914731075","31136323" +"115570","Ÿ÷","KOSDAQ","߰߱","2830","-105","-3.58","2930","2930","2790","30505","86249155","22596157640","7984508" +"330730","긴ó","KOSDAQ","߰߱","3580","-70","-1.92","3650","3670","3525","88066","315562715","64979971400","18150830" +"352090","ũ","KOSDAQ","߰߱","3765","-5","-0.13","3870","3870","3765","31007","118016530","50588418735","13436499" +"253450","Ʃ巡","KOSDAQ GLOBAL","췮","34900","-450","-1.27","35550","35650","34750","35603","1246480100","1049041580200","30058498" +"408900","Ʃ̸","KOSDAQ","ó","2330","-85","-3.52","2385","2395","2250","159598","366227025","76205292220","32706134" +"204630","ƩŸŬν","KOSDAQ","(ҼӺξ)","4650","0","0.00","0","0","0","0","0","19045962900","4095906" +"415380","Ʃ","KOSDAQ","߰߱","8860","-120","-1.34","8900","9100","8680","26116","230505470","37437912280","4225498" +"026890","ƽκƮƮ","KOSPI",,"7940","-360","-4.34","8320","8390","7940","148612","1197584790","330924709500","41678175" +"013810","","KOSDAQ","߰߱","3240","-150","-4.42","3350","3390","3195","357852","1167857310","47483722800","14655470" +"203690","ǾĿ","KOSDAQ","ó","6000","250","4.35","5750","6000","5550","45824","265017680","80027100000","13337850" +"049830","","KOSDAQ","߰߱","6860","-270","-3.79","7130","7130","6860","2728","18850940","42066288320","6132112" +"020710","ðũ","KOSDAQ","췮","3890","-55","-1.39","3905","4030","3810","103985","407108625","77986603300","20047970" +"033170","ñ׳ƽ","KOSDAQ","췮","928","-26","-2.73","944","957","915","306886","285951518","79555880032","85728319" +"048870","ó̳뺣̼","KOSDAQ","췮","3260","30","0.93","3220","3380","3140","11371803","37233793070","269629201440","82708344" +"025320","ó彺","KOSDAQ","췮","6930","-190","-2.67","7120","7240","6900","1487155","10422365710","580858296480","83817936" +"134790","õ","KOSPI",,"27500","-200","-0.72","27800","27800","27050","1547","42393250","55000000000","2000000" +"269620","ý","KOSDAQ","(ҼӺξ)","889","0","0.00","0","0","0","0","0","132090012299","148582691" +"429270","Ʈδн","KOSDAQ","","7100","-260","-3.53","7410","7410","7080","31144","222913310","31994375000","4506250" +"418250","ť","KOSDAQ","ȯ(ҼӺξ)","6550","0","0.00","0","0","0","0","0","52279100100","7981542" +"131090","ť","KOSDAQ","ó","849","-11","-1.28","862","864","787","103410","85745317","37356000000","44000000" +"232830","ť","KOSDAQ","ó","2215","-95","-4.11","2345","2360","2120","225192","497907430","25932050480","11707472" +"462870","Ʈ","KOSPI",,"58000","-2500","-4.13","60900","61000","58000","219278","12895210500","3383413760000","58334720" +"016590","Ŵ","KOSPI",,"5490","-100","-1.79","5600","5600","5450","66352","367312660","221235031800","40297820" +"290520","ŵ⿬","KOSDAQ","ó","2035","-125","-5.79","2120","2175","2035","36320","75558230","32416251670","15929362" +"029530","ŵ","KOSPI",,"37800","50","0.13","37750","38000","37550","3445","129725200","381025096200","10080029" +"004970","Ŷ󱳿","KOSPI",,"9180","-50","-0.54","9230","9250","9100","17489","160416750","146880000000","16000000" +"001000","Ŷ","KOSDAQ","߰߱","1348","49","3.77","1290","1636","1257","15228033","22083256626","32726123920","24277540" +"025870","Ŷ󿡽","KOSDAQ","߰߱","6010","-110","-1.80","6110","6200","6010","5545","33618580","24040000000","4000000" +"215600","Ŷ","KOSDAQ","߰߱","2700","-65","-2.35","2735","2780","2680","643047","1739981925","370891237500","137367125" +"065350","żŸũ","KOSDAQ","췮","42300","-2350","-5.26","44850","45250","42300","240789","10398703550","1162571000400","27483948" +"416180","żƼ","KOSDAQ","߰߱","25050","-700","-2.72","26100","26450","24850","77494","1958622150","226446438900","9039778" +"011930","ż̿","KOSPI",,"1562","-40","-2.50","1595","1602","1561","578936","913859317","321534811862","205848151" +"005390","ż","KOSPI",,"2175","-30","-1.36","2205","2205","2160","78612","170843945","312565748250","143708390" +"004170","ż","KOSPI",,"156800","-700","-0.44","157700","158500","155300","25719","4036907000","1543724380800","9845181" +"035510","ż I&C","KOSPI",,"9140","-110","-1.19","9310","9390","9050","22229","203136780","157208000000","17200000" +"034300","żǼ","KOSPI",,"12700","-110","-0.86","12750","12750","12490","2732","34349540","98559035800","7760554" +"031430","żͳų","KOSPI",,"12900","-390","-2.93","13140","13270","12880","47955","620897250","460530000000","35700000" +"031440","żǪ","KOSPI",,"35650","-50","-0.14","36450","36450","35200","2865","101710450","138053912000","3872480" +"006880","żȦ","KOSPI",,"6140","-140","-2.23","6230","6340","6070","28287","174062860","72629188120","11828858" +"162300","Žƿ","KOSDAQ","߰߱","2330","-145","-5.86","2435","2485","2330","168949","401195215","96628320060","41471382" +"290560","Žÿ","KOSDAQ","ó","7280","-580","-7.38","8070","8590","7170","489303","3898646410","28231636160","3877972" +"002800","Ž","KOSDAQ","߰߱","6160","-320","-4.94","6370","6420","6090","255734","1577838720","93450280000","15170500" +"472220","ſ10ȣ","KOSDAQ","SPAC(ҼӺξ)","2140","0","0.00","2145","2150","2130","15128","32290170","10036600000","4690000" +"430220","ſ8ȣ","KOSDAQ","SPAC(ҼӺξ)","2210","0","0.00","2250","2250","2200","6899","15239835","14939600000","6760000" +"445970","ſ9ȣ","KOSDAQ","SPAC(ҼӺξ)","2225","-5","-0.22","2235","2235","2210","498","1101230","11926000000","5360000" +"005800","ſڷ","KOSPI",,"9190","-150","-1.61","9340","9340","9050","3530","32717030","82710000000","9000000" +"001720","ſ","KOSPI",,"82000","0","0.00","82000","82800","81000","4417","361442300","1348080000000","16440000" +"009270","ſ","KOSPI",,"1170","-20","-1.68","1183","1204","1164","260526","305936839","120026036520","102586356" +"017000","ſհ","KOSDAQ","췮","3675","-85","-2.26","3700","3910","3620","139423","515042610","42879999225","11668027" +"002700","","KOSPI",,"1409","-29","-2.02","1423","1435","1407","216789","306265428","100105957089","71047521" +"012790","","KOSDAQ","췮","7150","-10","-0.14","7130","7240","7000","40504","285615930","85702867250","11986415" +"138070","","KOSDAQ","췮","2435","-55","-2.21","2490","2525","2380","189119","459684985","42620301740","17503204" +"226330","ī̿","KOSDAQ","","5710","-250","-4.19","5860","6000","5660","63518","366531510","87125892250","15258475" +"002870","dz","KOSPI",,"1771","125","7.59","1651","1799","1651","1958547","3390003621","61911857700","34958700" +"019170","dz","KOSPI",,"12130","-170","-1.38","12330","12410","12000","157299","1901743190","642707928700","52984990" +"019175","dz","KOSPI",,"19200","-140","-0.72","19900","19900","19100","4170","80591140","42240000000","2200000" +"481850","ѱ۷ιƼ긮","KOSPI",,"2525","50","2.02","2485","2535","2470","116610","291516140","109781101600","43477664" +"404990","ѼƼ","KOSPI",,"3695","0","0.00","3720","3725","3635","112837","415802560","206756991380","55955884" +"293940","Ѿĸ","KOSPI",,"6260","80","1.29","6200","6270","6140","187614","1160802270","551506769980","88100123" +"418210","10ȣ","KOSDAQ","SPAC(ҼӺξ)","2205","-20","-0.90","2300","2300","2150","28963","63604945","8070300000","3660000" +"452980","11ȣ","KOSDAQ","SPAC(ҼӺξ)","1947","0","0.00","1956","1956","1946","11335","22075345","36808035000","18905000" +"474660","12ȣ","KOSDAQ","SPAC(ҼӺξ)","2115","0","0.00","2110","2115","2110","2148","4538095","11674800000","5520000" +"474930","13ȣ","KOSDAQ","SPAC(ҼӺξ)","2160","-5","-0.23","2165","2185","2160","849","1837265","7819200000","3620000" +"055550","","KOSPI",,"57100","900","1.60","56700","57500","56300","1189794","67646242500","29086352519400","509393214" +"056700","ȭ","KOSDAQ","߰߱","1720","-7","-0.41","1711","1735","1660","34952","59345945","50112356520","29135091" +"187270","ȭ","KOSDAQ","ó","3340","-110","-3.19","3425","3465","3315","53061","178595050","33880442300","10143845" +"004080","","KOSPI",,"14300","0","0.00","14230","14440","14210","3340","47656490","135850000000","9500000" +"243840","£̾","KOSDAQ","췮","7850","-540","-6.44","8390","8490","7840","308645","2496414700","305514424750","38919035" +"257720","Ǹ","KOSDAQ","ó","39400","-1000","-2.48","40400","40600","38300","1268395","49847564800","2398405419600","60873234" +"222800","","KOSDAQ GLOBAL","췮","17580","-710","-3.88","18210","18420","17380","288380","5084061350","559995833940","31854143" +"036710","Ȧ","KOSDAQ","߰߱","1724","-21","-1.20","1705","1742","1666","156873","265111439","83355649980","48350145" +"160980","̸ƽ","KOSDAQ","췮","10710","-300","-2.72","10820","11000","10540","46158","494280280","116998642530","10924243" +"356890","̹","KOSDAQ","ó","2955","-115","-3.75","3095","3125","2945","80158","239567525","35212740375","11916325" +"217330","","KOSDAQ","","6690","-290","-4.15","6980","7200","6550","30030","200131660","150010552380","22423102" +"102280","ֹ","KOSPI",,"269","0","0.00","0","0","0","0","0","70637282701","262592129" +"010280","ֿ","KOSDAQ","ȯ(ҼӺξ)","605","-3","-0.49","601","649","591","106575","65233572","39399890530","65123786" +"004770","","KOSPI",,"1558","-22","-1.39","1580","1580","1504","68441","105913399","57183093272","36702884" +"217320","ũ","KONEX","Ϲݱ","3195","0","0.00","0","0","0","0","0","3354750000","1050000" +"208640","濡","KOSDAQ","߰߱","283","-10","-3.41","302","302","283","209023","60244097","39404991882","139240254" +"222420","","KOSDAQ","߰߱","747","-23","-2.99","770","771","745","64010","48481281","33958792557","45460231" +"037760","Ʈ","KOSDAQ","췮","1495","-9","-0.60","1509","1509","1473","14577","21536647","50580216895","33832921" +"099320","Ʈ","KOSDAQ","췮","32900","-800","-2.37","33600","33800","32600","46313","1525375300","360297046200","10951278" +"049960","̿","KOSDAQ","췮","13470","-320","-2.32","13660","13780","13200","20254","270581170","126618000000","9400000" +"088280","н","KOSDAQ","","2315","-35","-1.49","2350","2395","2315","25323","59075820","40064524350","17306490" +"403550","ī","KOSPI",,"19000","10","0.05","18990","19100","18660","5772","108994330","623293138000","32804902" +"050890","򸮵","KOSDAQ","췮","4150","-80","-1.89","4220","4255","4100","310305","1288216530","254069806000","61221640" +"109670","Ʈ","KOSDAQ","߰߱","11650","-900","-7.17","12230","13170","11640","367976","4605584900","67996413300","5836602" +"066790","","KOSDAQ","ȯ(ҼӺξ)","1600","-18","-1.11","1619","1669","1575","878989","1410947929","104243262400","65152039" +"222080","̿","KOSDAQ","췮","9340","-640","-6.41","9980","10050","9330","760948","7315825400","669951914180","71729327" +"004920","ũ","KOSPI",,"1170","-46","-3.78","1205","1208","1100","251874","290202669","58576977810","50065793" +"236030","Ǫ","KONEX","Ϲݱ","585","-14","-2.34","687","687","550","512","296787","1189499220","2033332" +"103660","","KONEX","Ϲݱ","1243","-219","-14.98","1243","1243","1243","13","16159","7479716453","6017471" +"352480","ؾͳų","KOSDAQ","ó","92700","-1300","-1.38","94100","95700","89800","117810","10973859700","928292330700","10013941" +"245450","ؿũ","KONEX","Ϲݱ","1395","-104","-6.94","1395","1395","1275","12","15540","2204044200","1579960" +"264660","ũ","KOSDAQ","췮","12820","-480","-3.61","13160","13490","12220","43655","563921380","123429626720","9627896" +"352700","","KOSDAQ","췮","2885","-65","-2.20","2920","2965","2860","66330","191833080","78693853615","27276899" +"458870","ũ","KOSDAQ","","13410","-580","-4.15","14230","14230","13220","193879","2654525620","168318028800","12551680" +"297090","","KOSDAQ","߰߱","5210","-120","-2.25","5290","5370","5160","130037","681777370","142076700000","27270000" +"112610","","KOSPI",,"56900","-800","-1.39","57700","59700","56400","290308","16694269700","2399552830700","42171403" +"900120","","KOSDAQ","ܱ(ҼӺξ)","82","-3","-3.53","84","85","82","578020","47985791","23635037612","288232166" +"359090","˸ġ","KOSDAQ","߰߱","1129","-32","-2.76","1160","1167","1114","228794","258049876","63733055939","56450891" +"286000","Ƽ帲","KONEX","Ϲݱ","3050","0","0.00","0","0","0","0","0","18773924250","6155385" +"115530","÷","KOSDAQ","߰߱","600","1","0.17","599","614","540","459039","268873049","40777800000","67963000" +"115480","޵Į","KOSDAQ","߰߱","727","7","0.97","707","735","700","134737","97134895","35059253666","48224558" +"340810","ڽ","KOSDAQ","","3350","-335","-9.09","3640","3665","3300","246773","837023350","35502841050","10597863" +"376290","ũ","KOSDAQ","߰߱","3090","60","1.98","3160","3160","3035","9768","30116225","54561675000","17657500" +"189330","̷","KOSDAQ","","6540","-310","-4.53","6990","8410","6320","375890","2873117510","39843537360","6092284" +"096530","","KOSDAQ","췮","25000","-150","-0.60","25300","25300","24600","387584","9632407400","1305649850000","52225994" +"101240","ť","KOSDAQ","ó","5250","-100","-1.87","5400","5400","5190","43270","226866020","54289971750","10340947" +"060590","Ƽ̿","KOSDAQ","߰߱","6860","200","3.00","6600","7220","6600","204046","1419379190","165881797200","24181020" +"308170","Ƽ˸Ƽ","KOSPI",,"5550","-90","-1.60","5640","5660","5530","11644","65063000","47785500000","8610000" +"260930","Ƽ","KOSDAQ","߰߱","5740","-10","-0.17","5890","5890","5500","52780","297648910","111020732340","19341591" +"052300","ƼƼ","KOSDAQ","߰߱","362","-9","-2.43","367","371","360","105343","38311485","48019817660","132651430" +"413630","ǽý","KOSDAQ","ó","2680","-175","-6.13","2795","2805","2600","148316","395384895","103725179000","38703425" +"013990","ư۴","KOSDAQ","췮","4030","-95","-2.30","4105","4160","4000","315111","1276717050","132536770080","32887536" +"123860","Ƴн","KOSDAQ","ó","19200","-680","-3.42","19880","19970","19110","70730","1368919930","232769568000","12123415" +"025980","ƳƼ","KOSDAQ","췮","5090","0","0.00","5100","5120","5000","241763","1221319050","451124043020","88629478" +"008700","Ƴ","KOSPI",,"1200","-26","-2.12","1215","1232","1176","342026","409889374","92549784000","77124820" +"125210","Ƹ׸","KOSDAQ","췮","7080","-280","-3.80","7320","7500","7010","143550","1030334090","116797273200","16496790" +"002790","ƸG","KOSPI",,"24600","-500","-1.99","25150","25150","24350","178404","4401262400","2028471228000","82458180" +"00279K","ƸG3(ȯ)","KOSPI",,"18980","-60","-0.32","19100","19190","18930","2931","55656240","134609956000","7092200" +"002795","ƸG","KOSPI",,"9500","-160","-1.66","9450","9690","9420","1730","16400430","61215815000","6443770" +"090430","Ƹ۽","KOSPI",,"130900","1500","1.16","128500","132500","128300","385445","50376247400","7656702153100","58492759" +"090435","Ƹ۽ȿ","KOSPI",,"36650","-300","-0.81","36800","37400","35850","45193","1646984850","386944469500","10557830" +"357580","Ƹ𼾽","KOSDAQ","","7340","-510","-6.50","7790","7890","7340","83279","627721910","82356737760","11220264" +"052710","Ƹ","KOSDAQ","߰߱","4005","-150","-3.61","4170","4175","4005","31096","126029865","58533511545","14615109" +"074430","ƹ̳","KOSDAQ","߰߱","1130","-37","-3.17","1169","1177","1127","189667","215867383","99244333720","87826844" +"092040","ƹ","KOSDAQ","","4680","-205","-4.20","4800","4815","4650","244778","1152999420","257485863960","55018347" +"083930","ƹ","KOSDAQ","췮","13030","-40","-0.31","13030","14260","12870","117754","1562355100","194313757940","14912798" +"149950","ƹ","KOSDAQ","߰߱","11030","-350","-3.08","11380","11500","11000","24054","268423150","172150725000","15607500" +"036010","ƺ","KOSDAQ","췮","5020","-200","-3.83","5210","5310","4985","172074","892324300","66730528680","13292934" +"002030","Ƽ","KOSPI",,"253500","-500","-0.20","253500","254500","250500","1070","270861500","536316768000","2115648" +"183190","ƼƽøƮ","KOSPI",,"10940","-150","-1.35","11210","11210","10750","57020","621286710","421210632840","38501886" +"002310","Ƽ","KOSPI",,"7710","-100","-1.28","7800","7880","7660","90069","694803060","345273152100","44782510" +"050860","Ƽ","KOSDAQ","췮","2100","0","0.00","2100","2110","2070","17724","36944040","47250000000","22500000" +"012170","Ƽ","KOSPI",,"642","-19","-2.87","662","675","632","879635","571527603","66491611296","103569488" +"136410","Ƽ","KOSDAQ","ó","6680","-60","-0.89","6700","6760","6430","52741","349020180","73607628080","11019106" +"246720","ƽŸ","KOSDAQ","ó","5040","-80","-1.56","5120","5120","4950","13983","69950785","67386312000","13370300" +"067390","ƽƮ","KOSDAQ","ȯ(ҼӺξ)","557","-17","-2.96","574","577","557","245502","138025604","190521766450","342049850" +"159010","ƽ÷","KOSDAQ","ó","7190","-130","-1.78","7320","7320","7000","16040","114894790","95876773410","13334739" +"127710","ƽþư","KOSDAQ","췮","1293","-14","-1.07","1317","1329","1291","39242","51271221","45130978026","34904082" +"267850","ƽþƳIDT","KOSPI",,"14650","-340","-2.27","14730","14870","14370","14357","208662360","162615000000","11100000" +"020560","ƽþƳװ","KOSPI",,"9400","-120","-1.26","9530","9590","9370","60156","565817370","699470581600","74411764" +"154030","ƽþ","KOSDAQ","ó","2630","-50","-1.87","2715","2800","2515","558458","1458149760","30485255760","11591352" +"227610","ƿǻĽ","KOSDAQ","߰߱","1700","4","0.24","1734","1734","1689","57666","97712857","59796129800","35174194" +"143160","̵","KOSDAQ","췮","14700","-300","-2.00","14840","14940","14610","13655","201498100","157530933000","10716390" +"054800","̵Ȧ","KOSDAQ","췮","9750","80","0.83","9660","9770","9650","16649","161356700","100890621000","10347756" +"332370","̵","KOSDAQ","߰߱","3610","-40","-1.10","3625","3670","3470","23909","86051025","47918150860","13273726" +"122900","̸ڸ","KOSPI",,"8550","-50","-0.58","8570","8600","8520","41200","353040855","285816582000","33428840" +"339950","̺迵","KOSDAQ","߰߱","1719","-21","-1.21","1730","1757","1713","67072","115728852","77263299945","44946655" +"469750","̺","KOSDAQ","ó","3250","-345","-9.60","3595","3650","3055","13092403","43349751855","110048909750","33861203" +"460470","̺ũ","KOSDAQ","","7000","-1010","-12.61","7910","8010","7000","1035114","7670854390","104759340000","14965620" +"099190","̼","KOSDAQ","췮","15090","-440","-2.83","15340","15520","15020","141111","2137830500","417046449570","27637273" +"461300","̽ũ̵","KOSDAQ","߰߱","17510","-1310","-6.96","19070","19250","17510","706523","12781973990","228740711830","13063433" +"289010","̽ũ","KOSDAQ","߰߱","2600","-50","-1.89","2650","2650","2525","25750","66065415","33446496200","12864037" +"214430","̾ý","KOSDAQ","췮","30400","-500","-1.62","30800","30950","29950","26634","806381050","216045504000","7106760" +"040910","̾","KOSDAQ","߰߱","5960","-140","-2.30","6000","6220","5920","22629","135237380","110702679000","18574275" +"368600","̾ġ","KOSDAQ","","3855","-75","-1.91","3830","3950","3735","72094","277919475","67610323830","17538346" +"456010","̾Ƽ","KOSDAQ","","10810","-730","-6.33","11770","12000","10300","9986846","111038480590","142827081760","13212496" +"052860","̾ؾ","KOSDAQ","ó","1592","-42","-2.57","1642","1659","1574","100973","160715229","28437663568","17862854" +"010780","̿","KOSPI",,"21800","-900","-3.96","22700","22900","21800","50125","1101633900","658076076800","30186976" +"069920","̿Ŀӽ","KOSDAQ","߰߱","1793","70","4.06","1722","1867","1693","188389","335419784","63103049988","35194116" +"038880","̿","KOSDAQ","߰߱","218","-9","-3.96","229","230","218","553403","122452529","68742965036","315334702" +"307180","̿̾","KOSDAQ","ó","3220","-60","-1.83","3310","3340","3205","312005","1019398280","85979467560","26701698" +"101390","̿","KOSDAQ","ȯ(ҼӺξ)","2940","-40","-1.34","2980","3065","2835","99524","289720315","31011369900","10548085" +"461030","̿𿢽","KOSDAQ","","16820","-340","-1.98","17140","17150","15810","763583","12518780790","235778555000","14017750" +"456570","̿Ƽ","KONEX","Ϲݱ","12500","-290","-2.27","12970","12970","12000","279","3401790","61793562500","4943485" +"451220","̿Ƽ","KOSDAQ","","8200","-500","-5.75","8620","8700","8120","79721","658600340","64571810200","7874611" +"447690","̿̿","KONEX","Ϲݱ","3435","-35","-1.01","3465","3465","3435","2","6900","8807570145","2564067" +"090150","","KOSDAQ","߰߱","1083","-9","-0.82","1066","1092","1057","106007","112924366","45350942319","41875293" +"123010","÷","KOSDAQ","","825","-25","-2.94","845","845","821","18029","14881338","26943297150","32658542" +"031310","","KOSDAQ","췮","1728","-57","-3.19","1776","1799","1720","94829","166319500","43778251008","25334636" +"185490","","KOSDAQ","ó","3120","-160","-4.88","3250","3255","3105","79559","252770635","84332926080","27029784" +"059100","Ʈ","KOSDAQ","ó","4300","-55","-1.26","4355","4480","4295","4714","20447895","30404698000","7070860" +"149010","̼","KONEX","Ϲݱ","8090","-50","-0.61","7800","8150","7430","546","4107280","25240800000","3120000" +"262840","Ʈ","KOSDAQ","ó","2065","-85","-3.95","2110","2150","2025","67641","140640955","39833850000","19290000" +"175250","ť","KOSDAQ","","1927","-45","-2.28","1972","1987","1884","205167","391281987","72374975136","37558368" +"052460","ũƮ","KOSDAQ","߰߱","2360","-70","-2.88","2395","2420","2330","154671","365428560","34474728960","14607936" +"119830","","KOSDAQ","߰߱","5750","110","1.95","5600","5840","5370","272538","1512495290","123247207750","21434297" +"052770","","KOSDAQ","߰߱","1320","0","0.00","1320","1385","1268","49881","64958294","64241028720","48667446" +"124500","Ƽ","KOSDAQ","ȯ(ҼӺξ)","4580","-55","-1.19","4635","4655","4450","184690","832808615","106276733660","23204527" +"372800","Ƽ","KOSDAQ","ó","6520","-40","-0.61","6540","6740","6310","15517","99832390","39295974800","6026990" +"084850","Ƽݵü","KOSDAQ GLOBAL","߰߱","19830","200","1.02","19630","19980","18890","40909","799826020","449802581220","22682934" +"114840","йи","KOSDAQ","ó","19970","-630","-3.06","20550","20950","19560","357338","7138430850","343922221680","17221944" +"027360","IB","KOSDAQ","췮","1947","-88","-4.32","2015","2025","1937","663178","1302422611","235480705482","120945406" +"139990","ֽƿ","KOSPI",,"5030","-90","-1.76","5120","5140","5000","22387","112617490","133054510670","26452189" +"032080","WB","KOSDAQ","߰߱","1120","-12","-1.06","1118","1132","1103","34100","38108350","24069952480","21491029" +"013310","","KOSDAQ","췮","2995","-30","-0.99","3005","3050","2965","87743","263092090","116225713090","38806582" +"059120","","KOSDAQ","ó","7730","-370","-4.57","8000","8290","7730","56693","446012370","75356647080","9748596" +"158430","","KOSDAQ","ó","3695","-135","-3.52","3820","3840","3610","249882","924226230","83516141430","22602474" +"321820","ƼƮƼ","KOSDAQ","","13300","-450","-3.27","13750","13760","13000","107050","1433446750","177773918000","13366460" +"149300","ǻ","KONEX","Ϲݱ","328","-17","-4.93","390","390","301","21690","6660461","14263490656","43486252" +"102950","","KONEX","Ϲݱ","3990","0","0.00","0","0","0","0","0","52356392970","13121903" +"001540","ȱǰ","KOSDAQ","췮","7050","0","0.00","7050","7060","6920","23445","163578520","91949061000","13042420" +"053800","ȷ","KOSDAQ","췮","52500","-600","-1.13","53600","53700","52300","18632","981038000","525727387500","10013855" +"251280","","KONEX","Ϲݱ","7790","440","5.99","7000","7800","6660","3474","23900580","23289591620","2989678" +"065660","Ʈ","KOSDAQ","","13990","-360","-2.51","14200","14260","13980","8677","122124300","136141908270","9731373" +"297570","˷̽","KOSDAQ","ó","893","-37","-3.98","930","935","886","83898","75964754","30916747674","34621218" +"001780","˷","KOSPI",,"2270","-40","-1.73","2300","2320","2260","249337","565953430","219804399640","96830132" +"260660","˸","KOSDAQ","췮","3960","-110","-2.70","4040","4100","3930","68405","272588620","60695003160","15327021" +"354320","˸","KOSDAQ","","27150","-1050","-3.72","27900","28550","27000","15160","416636950","173525994150","6391381" +"361570","˺","KOSDAQ","߰߱","2375","-75","-3.06","2430","2470","2360","164823","397399270","68008816125","28635291" +"131370","˼Ʈ","KOSDAQ","췮","2915","-85","-2.83","2980","3020","2905","119838","350357255","155273546945","53267083" +"140670","˿̼","KOSDAQ","ó","10810","-630","-5.51","11340","11490","10780","84979","934802170","100566943400","9303140" +"096610","˿","KOSDAQ","ȯ(ҼӺξ)","2965","0","0.00","0","0","0","0","0","51550708615","17386411" +"061040","˿","KOSDAQ","췮","3160","10","0.32","3115","3160","2965","83744","254998165","101402058440","32089259" +"148250","˿ũ","KOSDAQ","ó","4240","90","2.17","4150","4300","4045","5462","23075115","31338628640","7391186" +"347860","ü","KOSDAQ","ȯ(ҼӺξ)","2430","-125","-4.89","2560","2635","2420","111434","274472420","53507793240","22019668" +"196170","׿","KOSDAQ GLOBAL","","301000","-6000","-1.95","300500","306500","292500","612317","183766752500","15997706928000","53148528" +"123750","","KOSDAQ","ȯ(ҼӺξ)","1608","-12","-0.74","1617","1617","1599","11817","19005799","20496045576","12746297" +"085810","ƼijƮ","KOSDAQ","߰߱","1024","-18","-1.73","1046","1150","1002","1770189","1911517019","30398227456","29685769" +"043100","ij콺","KOSDAQ","ó","300","0","0.00","0","0","0","0","0","23927762400","79759208" +"117670","Ȧ","KOSDAQ","(ҼӺξ)","945","0","0.00","0","0","0","0","0","37743429465","39940137" +"314140","ǹ̿","KOSDAQ","߰߱","6250","-60","-0.95","6350","6350","6100","7388","45688480","54164756250","8666361" +"291650","Ÿӻ̾","KOSDAQ","","2160","60","2.86","2125","2550","2000","2518480","5807011575","36677344320","16980252" +"293780","Ÿ̿","KOSDAQ","","8880","-690","-7.21","9570","9660","8880","148904","1364643710","198013930080","22298866" +"018250","ְ","KOSPI",,"16230","-370","-2.23","16680","16690","16200","31857","520252740","428633245050","26409935" +"161000","ְɹĮ","KOSPI",,"10570","-620","-5.54","11180","11440","10570","389715","4246969210","514216854130","48648709" +"390110","ִϸ޵ַ","KONEX","Ϲݱ","1650","-50","-2.94","0","0","0","0","0","14994040050","9087297" +"196300","ִ","KOSDAQ","","12500","400","3.31","12400","12590","12140","44608","551718440","75042337500","6003387" +"310200","ִ÷","KOSDAQ","췮","3190","0","0.00","3155","3225","3110","312135","989849985","145211923010","45520979" +"299910","ִ","KOSDAQ","(ҼӺξ)","6880","0","0.00","0","0","0","0","0","32483121920","4721384" +"179530","ֵ̿","KOSDAQ","","3310","-145","-4.20","3420","3425","3275","44798","148431980","30254869640","9140444" +"900100","ָӸ","KOSDAQ","ܱ(ҼӺξ)","1751","-158","-8.28","1881","1909","1750","459716","827495674","73888521149","42197899" +"205500","׼ǽ","KOSDAQ","߰߱","1322","-15","-1.12","1337","1337","1309","18213","23984821","68648974640","51928120" +"052790","Ʈ","KOSDAQ","췮","6850","0","0.00","6790","6850","6670","6067","40878250","77614870300","11330638" +"290740","Ʈ","KOSDAQ","ó","5900","-190","-3.12","6130","6130","5800","16521","97453260","59383564900","10065011" +"238090","ص","KOSDAQ","ó","4535","50","1.11","4485","4780","4445","113725","514396060","106759809105","23541303" +"092600","ؾ","KOSDAQ","ó","1074","-1","-0.09","1064","1098","1061","30367","32690993","26939697258","25083517" +"129890","","KOSDAQ","ó","1087","-3","-0.28","1115","1115","1061","122731","131937791","55049386670","50643410" +"174900","Ŭ","KOSDAQ","","14440","-40","-0.28","14760","14890","14410","80691","1174757030","248630548080","17218182" +"255440","߽","KOSDAQ","ó","6950","-400","-5.44","7200","7390","6950","35885","254820380","90753100000","13058000" +"030960","","KOSDAQ","߰߱","9990","20","0.20","9970","10960","9850","939521","9765462690","159640200000","15980000" +"102120","ݵü","KOSDAQ","췮","10680","-400","-3.61","11030","11120","10550","169912","1828245430","189898442040","17780753" +"263540","ؿν̽","KOSDAQ","(ҼӺξ)","5950","0","0.00","0","0","0","0","0","85049841450","14294091" +"238120","ε","KOSDAQ","","3005","-15","-0.50","3040","3040","2905","47016","138756110","43208582480","14378896" +"224810","Ͽ콺","KONEX","Ϲݱ","2310","-5","-0.22","0","0","0","0","0","9702000000","4200000" +"019990","ũ","KOSDAQ","߰߱","5820","-260","-4.28","6040","6330","5700","416956","2474747680","56780432160","9756088" +"011090","ؽ","KOSPI",,"575","-4","-0.69","576","594","555","92270","52359281","34495193575","59991641" +"270660","긮","KOSDAQ","ó","15970","-630","-3.80","16600","16730","15820","75594","1215391780","195334531740","12231342" +"038680","","KOSDAQ","߰߱","3830","-120","-3.04","3955","3970","3715","44445","171309910","74875262910","19549677" +"137310","̿","KOSPI",,"9430","-190","-1.98","9520","9600","9340","292924","2755828940","1173821438790","124477353" +"217480","","KOSDAQ","(ҼӺξ)","499","0","0.00","0","0","0","0","0","54756837359","109733141" +"121890","ý","KOSDAQ","߰߱","1489","-88","-5.58","1577","1695","1442","80268","121253595","19790963094","13291446" +"304360","̿޵","KOSDAQ","ȯ(ҼӺξ)","30850","-2100","-6.37","33550","33900","30500","213455","6856984650","353987584600","11474476" +"389500","ũ","KOSDAQ","","16920","-3130","-15.61","20500","20500","16500","323959","5616436430","104479375680","6174904" +"042110","","KOSDAQ","췮","1370","-19","-1.37","1375","1388","1340","111129","151456415","66211502680","48329564" +"298060","","KOSDAQ","","2105","-40","-1.86","2100","2145","2050","71782","149841330","43083557040","20467248" +"065420","̸ҽ","KOSDAQ","߰߱","224","-20","-8.20","244","256","224","1379841","317329081","16033314976","71577299" +"270210","˹̿","KONEX","Ϲݱ","8070","250","3.20","8000","8200","7820","2276","18311080","13357504350","1655205" +"103230","ش","KOSDAQ","ó","3460","-135","-3.76","3560","3590","3400","25578","89208570","24912000000","7200000" +"260970","ص","KOSDAQ","ó","30850","200","0.65","30150","31350","29500","25839","783738750","89241460900","2892754" +"101490","ؿ","KOSDAQ","췮","23250","-1300","-5.30","24200","24600","23150","168811","3963228700","498746142750","21451447" +"095910","","KOSDAQ","߰߱","1628","-32","-1.93","1700","1700","1620","46788","76604555","31753330884","19504503" +"275630","","KOSDAQ","ó","3640","-5","-0.14","3550","3725","3490","8755","31032180","21905479960","6017989" +"031330","̿Ƽ","KOSDAQ","췮","3165","-25","-0.78","3180","3220","3110","327685","1032919265","316484387055","99995067" +"060540","Ƽ","KOSDAQ","췮","1596","-45","-2.74","1624","1680","1580","219196","353102401","41708756376","26133306" +"351320","Ƽ̿","KOSDAQ","ó","1497","-34","-2.22","1565","1565","1469","51958","78218863","32957781342","22015886" +"056190","","KOSDAQ GLOBAL","췮","23500","-300","-1.26","24000","24100","23500","149872","3572713700","843855860000","35908760" +"080000","","KOSDAQ","췮","1819","-76","-4.01","1877","1890","1805","67168","122547502","62433300530","34322870" +"005850","","KOSPI",,"31050","-300","-0.96","31350","31500","30700","65646","2036862450","1442226546000","46448520" +"214310","","KOSDAQ","ȯ(ҼӺξ)","6120","0","0.00","0","0","0","0","0","22516275600","3679130" +"246250","̿","KOSDAQ","","3575","-190","-5.05","3770","3770","3500","271455","977498285","54869836450","15348206" +"258540","׶ǻƽ","KONEX","Ϲݱ","1173","1","0.09","1199","1199","1100","17","19998","12173533587","10378119" +"041510","","KOSDAQ","췮","56300","-2800","-4.74","59400","59400","56300","130510","7436654000","1328090088600","23589522" +"010580","","KOSPI",,"1230","6","0.49","1230","1255","1209","9680","11833428","136839664800","111251760" +"007820","ھ","KOSDAQ","߰߱","4260","-40","-0.93","4260","4350","4100","49770","208248575","85344609960","20033946" +"464080","","KOSDAQ","","7440","-380","-4.86","8260","9380","7370","31749237","272767337200","130416801600","17529140" +"109610","","KOSDAQ","߰߱","3850","5","0.13","3825","3910","3740","407888","1563024285","188293490000","48907400" +"365330","̽ƿ","KOSDAQ","߰߱","4215","95","2.31","4055","4275","3840","3029037","12400846565","129021150000","30610000" +"012750","","KOSPI",,"58600","900","1.56","58200","59100","57700","39065","2290045800","2226751830800","37999178" +"031860","Ȧ","KOSDAQ","ȯ(ҼӺξ)","1206","-52","-4.13","1269","1269","1205","64303","78660279","18121785336","15026356" +"306040","̱׷","KOSDAQ","췮","6240","-110","-1.73","6350","6460","6220","41179","259126710","61562766720","9865828" +"033530","","KOSPI",,"4720","-205","-4.16","4900","4900","4685","76897","364996870","131314935920","27820961" +"217910","","KONEX","Ϲݱ","429","14","3.37","360","476","353","14326","5111036","6001933938","13990522" +"457940","10ȣ","KOSDAQ","SPAC(ҼӺξ)","2125","-5","-0.23","2125","2145","2115","13218","28019805","7033750000","3310000" +"472230","11ȣ","KOSDAQ","SPAC(ҼӺξ)","2095","10","0.48","2100","2100","2080","5552","11575460","8704725000","4155000" +"473000","12ȣ","KOSDAQ","SPAC(ҼӺξ)","2100","-5","-0.24","2105","2105","2090","2761","5784680","6951000000","3310000" +"473950","13ȣ","KOSDAQ","SPAC(ҼӺξ)","2050","-5","-0.24","2055","2055","2045","27104","55465650","9061000000","4420000" +"435870","8ȣ","KOSDAQ","SPAC(ҼӺξ)","2110","0","0.00","2110","2115","2110","484","1021245","7849200000","3720000" +"455910","9ȣ","KOSDAQ","SPAC(ҼӺξ)","2115","5","0.24","2105","2115","2090","16668","35160600","10617300000","5020000" +"096630","ڳ","KOSDAQ","߰߱","825","-65","-7.30","860","882","821","1311538","1106505888","65218069125","79052205" +"069510","","KOSDAQ","߰߱","10350","-100","-0.96","10420","10500","10130","8099","83008680","112918500000","10910000" +"234300","Ʈ","KOSDAQ","췮","3765","150","4.15","3645","3945","3630","890010","3379563390","103658891130","27532242" +"039440","Ƽ","KOSDAQ","췮","19400","-850","-4.20","20000","20150","19200","281427","5483560740","307102000000","15830000" +"098660","Ƽ","KOSDAQ","߰߱","3000","70","2.39","2900","3095","2780","54559","159671590","37502928000","12500976" +"052020","Ƽť","KOSDAQ","(ҼӺξ)","5170","-30","-0.58","5250","5300","5100","86725","450690780","241409267330","46694249" +"237690","Ƽ","KOSDAQ GLOBAL","췮","99900","500","0.50","99000","101900","95900","611211","60700270200","1979346272400","19813276" +"050760","","KOSDAQ","߰߱","1633","-24","-1.45","1652","1674","1633","27825","45661452","26674529174","16334678" +"288620","ǻ","KOSDAQ","ó","12450","-210","-1.66","13050","13550","12440","48691","624244840","86892484200","6979316" +"443670","ǼƮ","KOSDAQ","ó","8780","-700","-7.38","9310","9540","8750","873387","7928165310","212488221760","24201392" +"317830","ǽý۽","KOSDAQ","ó","5300","-250","-4.50","5430","5580","5260","69713","373934660","57101235400","10773818" +"058610","","KOSDAQ","췮","23300","-600","-2.51","23900","24050","22750","220571","5116565650","516732488000","22177360" +"043340","ũ","KOSDAQ","߰߱","494","-7","-1.40","498","505","494","4392","2189431","46930000000","95000000" +"023960","Ͼ","KOSPI",,"1546","1","0.06","1555","1570","1510","95729","147819905","50818998880","32871280" +"298690","λ","KOSPI",,"2400","-15","-0.62","2480","2480","2335","107836","256616520","279936000000","116640000" +"187660","̵ڸ","KOSDAQ","߰߱","2995","-45","-1.48","3070","3095","2990","73073","220504010","65399568750","21836250" +"054630","̵Ĩ","KOSDAQ","(ҼӺξ)","158","0","0.00","0","0","0","0","0","12594094838","79709461" +"200710","̵ũ","KOSDAQ","߰߱","20050","250","1.26","19890","20600","19650","383052","7709248120","269488481100","13440822" +"096690","̷Ʈ","KOSDAQ","ȯ(ҼӺξ)","1356","-6","-0.44","1355","1359","1320","21698","29239849","45395068284","33477189" +"140910","̸","KOSPI",,"3130","0","0.00","0","0","0","0","0","13969290160","4463032" +"078520","̺","KOSPI",,"6870","-210","-2.97","7080","7150","6850","91285","632432630","178717286070","26014161" +"298380","̺񿤹̿","KOSDAQ","","28900","1350","4.90","27050","29600","26300","2775895","78095203250","1388581102100","48047789" +"203400","̺","KOSDAQ","","7960","-70","-0.87","8050","8050","7690","68266","532948820","200789185120","25224772" +"195990","̺ι̿","KOSDAQ","߰߱","437","-3","-0.68","441","446","435","331098","145026857","124409408077","284689721" +"003800","̽ħ","KOSDAQ","췮","26400","-200","-0.75","26750","26750","26050","2012","52835800","292776000000","11090000" +"088800","̽ũ","KOSDAQ","ȯ(ҼӺξ)","657","-14","-2.09","688","688","649","137305","90610684","45941429961","69926073" +"241840","̽丮","KOSDAQ","췮","6520","-230","-3.41","6680","6790","6450","25907","169943390","62200760880","9539994" +"311960","̴̾Ʈ","KONEX","Ϲݱ","3400","-100","-2.86","3500","3500","3200","19","65000","10413057600","3062664" +"453860","̿","KOSDAQ","ó","25550","-1150","-4.31","26950","27300","24850","65480","1690363150","144541843250","5657215" +"312610","̿","KOSDAQ","߰߱","1843","-4","-0.22","1849","1849","1800","10620","19193477","37333444584","20256888" +"015260","̿","KOSPI",,"684","-27","-3.80","727","727","679","128660","88475513","30859955496","45116894" +"172670","̿Ƽ","KOSDAQ","ó","9000","-550","-5.76","9380","9550","8930","63454","573665960","80642331000","8960259" +"234070","̿","KONEX","Ϲݱ","992","-19","-1.88","992","993","860","573","493178","6882974144","6938482" +"445090","","KOSDAQ","ó","25800","-1400","-5.15","27050","27250","25500","101994","2663625000","275502823200","10678404" +"295310","ġ̿","KOSDAQ","","12500","-700","-5.30","13100","13130","12390","183200","2327459540","148774137500","11901931" +"072990","ġƼ","KOSDAQ","췮","10110","90","0.90","10090","10330","9810","52279","530892570","73675017510","7287341" +"044990","ġ","KONEX","Ϲݱ","26450","-400","-1.49","26900","26900","26050","4542","120307000","198667642800","7511064" +"239610","ġ̾","KOSDAQ","췮","11180","-650","-5.49","11850","12070","11180","21921","251759260","60283845700","5392115" +"462020","ġ6ȣ","KOSDAQ","SPAC(ҼӺξ)","2060","10","0.49","2050","2060","2035","7845","16048360","8950700000","4345000" +"477340","ġ7ȣ","KOSDAQ","SPAC(ҼӺξ)","2005","0","0.00","2005","2005","2000","11406","22827845","15057550000","7510000" +"148930","ġƼ","KOSDAQ","߰߱","4775","-150","-3.05","4875","4925","4750","39811","191766460","48586642075","10175213" +"044780","ġ","KOSDAQ","ó","1267","-40","-3.06","1294","1306","1261","54054","68795662","23446832129","18505787" +"357230","ġǿ","KOSDAQ","߰߱","2860","10","0.35","2850","2900","2795","62705","177647890","120375932820","42089487" +"355690","","KOSDAQ","","8680","-120","-1.36","8810","8860","8550","12556","109180470","46915226400","5404980" +"071670","ũַ","KOSDAQ","췮","6450","-70","-1.07","6600","7110","6450","124613","852439660","64500000000","10000000" +"045660","","KOSDAQ","췮","14680","690","4.93","14230","14920","14160","94307","1373645290","121256800000","8260000" +"224110","ظƼ","KOSDAQ","߰߱","13420","-60","-0.45","13480","13530","13230","12581","168237850","71662800000","5340000" +"021080","ƼκƮ","KOSDAQ","췮","2300","-40","-1.71","2350","2390","2265","78753","180696765","110400000000","48000000" +"200470","Ʈ","KOSDAQ","ó","3215","-265","-7.61","3480","3490","3215","547041","1812279465","136194128995","42362093" +"207490","彺","KONEX","Ϲݱ","7200","-400","-5.26","7200","7200","7200","5","36000","25920000000","3600000" +"262260","","KOSDAQ","췮","7170","-290","-3.89","7400","7540","7100","38332","276436050","103736649840","14468152" +"007460","","KOSPI",,"1403","-74","-5.01","1458","1473","1400","3682002","5242172274","396304916144","282469648" +"003060","̿","KOSPI",,"953","7","0.74","937","954","921","1124519","1056974131","189082676285","198407845" +"397030","̿","KOSDAQ","","19880","-620","-3.02","20300","20500","19100","815558","16125778500","435710278080","21917016" +"244920","÷","KOSPI",,"4005","-65","-1.60","4070","4070","3990","31389","125563570","90543810465","22607693" +"278470","Ǿ","KOSPI",,"284500","-1500","-0.52","283000","290500","276000","124947","35334078000","2167940641000","7620178" +"230240","ġ","KOSDAQ","췮","7460","-190","-2.48","7650","7700","7280","38545","286539860","99285140000","13309000" +"230360","ڸ","KOSDAQ","췮","11130","680","6.51","10370","11500","10050","348682","3824847980","350239162770","31468029" +"038870","ڹ̿","KOSDAQ","߰߱","3995","-110","-2.68","4065","4130","3960","46535","185456980","55989721255","14014949" +"097780","ںƮ","KOSDAQ","߰߱","942","-9","-0.95","961","961","932","68121","64044534","63801978396","67730338" +"448280","ھ","KOSDAQ","߰߱","20350","-50","-0.25","20200","20700","20000","13954","280613690","200997825050","9877043" +"101360","ھص帲","KOSDAQ","ó","30000","-2100","-6.54","32200","32400","29900","418572","12763346750","533583420000","17786114" +"128540","ĸ","KOSDAQ","ó","1430","-59","-3.96","1495","1498","1429","46395","67154877","38167357800","26690460" +"086520","","KOSDAQ","췮","77900","-5800","-6.93","84200","85000","77800","1651299","132766483400","10371476686000","133138340" +"450080","θƼ","KOSPI",,"90800","-1800","-1.94","94600","97400","90500","1340518","126116953400","6271610298400","69070598" +"247540","κ","KOSDAQ GLOBAL","췮","158100","-9000","-5.39","168500","169700","157500","733467","118587318700","15462392486400","97801344" +"383310","οġ","KOSDAQ GLOBAL","߰߱","38650","-550","-1.40","39300","40450","38400","205463","8064240700","591535621800","15304932" +"038110","öƽ","KOSDAQ","췮","2995","-40","-1.32","3020","3035","2955","210344","626972620","123302263150","41169370" +"073540","","KOSDAQ","ȯ(ҼӺξ)","1230","-54","-4.21","1267","1282","1224","24344","30455592","14022000000","11400000" +"064850","ذ̵","KOSDAQ","ó","14440","1040","7.76","13420","14730","11770","871640","12053666120","163894000000","11350000" +"036810","Ƽ","KOSDAQ","췮","23000","-950","-3.97","23950","24300","23000","184991","4310179550","500406147000","21756789" +"173940","","KOSDAQ","߰߱","3315","20","0.61","3265","3320","3200","4162","13640030","51027158520","15392808" +"083500","ũ","KOSDAQ","ó","9520","-290","-2.96","9830","9920","9430","45009","435691160","81640873440","8575722" +"446440","ǹ̿","KONEX","Ϲݱ","10500","0","0.00","10500","10500","10490","3","31490","24123792000","2297504" +"054940","̿","KOSDAQ","߰߱","780","-1","-0.13","781","790","774","86868","67793511","25875367440","33173548" +"950130","̿","KOSDAQ","ܱ(ҼӺξ)","6410","-100","-1.54","6470","6540","6260","312095","1996798700","241835403120","37727832" +"373110","ǻƽ","KOSDAQ","","5770","-580","-9.13","6310","7290","5700","10323531","69811603540","62999525740","10918462" +"205100","","KOSDAQ","췮","1690","-46","-2.65","1720","1745","1675","348263","590788877","121618198390","71963431" +"356680","Ʈ","KOSDAQ","ó","4595","-305","-6.22","4910","5150","4525","4206676","20341533845","131157345740","28543492" +"070300","ť","KOSDAQ","ó","5920","90","1.54","5830","5950","5530","77335","445757440","49441578560","8351618" +"317770","丯","KOSDAQ","ó","2995","-90","-2.92","3010","3120","2870","180176","534031860","68702023470","22938906" +"373200","÷","KOSDAQ","ȯ(ҼӺξ)","688","-7","-1.01","694","709","678","618551","426845036","52085492016","75705657" +"092870","","KOSDAQ","췮","10400","-420","-3.88","10720","10900","10300","144223","1507200300","135728288800","13050797" +"317870","̿Ͼ","KOSDAQ","","17900","-140","-0.78","18040","18120","17500","16162","288197240","152270825000","8506750" +"067570","̿ġڸ","KOSDAQ","췮","2440","-45","-1.81","2465","2490","2410","133125","324929700","102894800000","42170000" +"236810","Ƽ","KOSDAQ","","3360","-160","-4.55","3505","3535","3360","102032","347063035","57037431360","16975426" +"140610","ֹ̿̾","KONEX","Ϲݱ","6500","30","0.46","6500","6520","6200","8356","52644060","70380791000","10827814" +"333620","ý","KOSDAQ","ó","10880","-760","-6.53","11890","11890","10710","126534","1413855160","114853022720","10556344" +"101400","Ʈ","KOSDAQ","߰߱","466","-12","-2.51","478","483","461","128831","60379456","28967684458","62162413" +"036570","Ʈ","KOSPI",,"180100","-3600","-1.96","184400","189100","179400","57941","10596909400","3953919362200","21954022" +"238170","","KONEX","Ϲݱ","816","16","2.00","817","817","680","22","15233","16952142144","20774684" +"078860","̿","KOSDAQ","߰߱","7760","-120","-1.52","7880","8400","7520","18638","145463040","71270028320","9184282" +"224760","۴","KONEX","Ϲݱ","3645","-100","-2.67","0","0","0","0","0","14360206500","3939700" +"422040","ġ23ȣ","KOSDAQ","SPAC(ҼӺξ)","2090","0","0.00","2090","2095","2090","1492","3118370","14964400000","7160000" +"437780","ġ24ȣ","KOSDAQ","SPAC(ҼӺξ)","2105","5","0.24","2100","2115","2095","36056","75725060","10588150000","5030000" +"438580","ġ25ȣ","KOSDAQ","SPAC(ҼӺξ)","2235","30","1.36","2255","2265","2200","18652","41675840","6749700000","3020000" +"439410","ġ26ȣ","KOSDAQ","SPAC(ҼӺξ)","2075","0","0.00","2070","2075","2070","1299","2688960","18260000000","8800000" +"440820","ġ27ȣ","KOSDAQ","SPAC(ҼӺξ)","2110","5","0.24","2115","2115","2100","1016","2133810","16458000000","7800000" +"451700","ġ29ȣ","KOSDAQ","SPAC(ҼӺξ)","2015","-10","-0.49","2025","2025","2015","21888","44164290","28915250000","14350000" +"466910","ġ30ȣ","KOSDAQ","SPAC(ҼӺξ)","2020","0","0.00","2035","2035","2015","20445","41277885","18382000000","9100000" +"481890","ġ31ȣ","KOSDAQ","SPAC(ҼӺξ)","2025","5","0.25","2020","2025","2015","69949","141354620","12848625000","6345000" +"265740","","KOSDAQ","߰߱","6190","-260","-4.03","6450","6480","6160","26156","163429700","55287842000","8931800" +"354200","̿","KOSDAQ","","2350","-110","-4.47","2470","2480","2340","50990","121508445","30289683450","12889227" +"455900","κƽ","KOSDAQ","","22400","-1550","-6.47","23850","24050","22400","126691","2891286450","334776534400","14945381" +"419080","","KOSDAQ","","10730","-460","-4.11","11000","11190","10690","22148","240168420","112856176410","10517817" +"093510","̾","KONEX","Ϲݱ","7990","-10","-0.13","7990","7990","7990","1","7990","48099800000","6020000" +"208860","ũη","KOSDAQ","ȯ(ҼӺξ)","2205","0","0.00","0","0","0","0","0","41831348265","18971133" +"183490","ͻ","KOSDAQ","","1460","-38","-2.54","1498","1499","1453","131445","193501691","124195720520","85065562" +"085310","","KOSPI",,"780","-15","-1.89","795","795","765","354533","274731676","62387014560","79983352" +"182400","̸ƽ","KOSDAQ","(ҼӺξ)","2020","0","0.00","0","0","0","0","0","172748038620","85518831" +"348370","","KOSDAQ","ó","165500","-14500","-8.06","176200","181100","165500","524920","89423166600","3440235756500","20786923" +"069410","ڽ","KOSDAQ","ó","3030","-225","-6.91","3260","3260","3030","41365","127703695","31041816720","10244824" +"227950","","KOSDAQ","߰߱","494","-6","-1.20","500","500","482","227535","111993204","51166311820","103575530" +"291230","","KOSDAQ","߰߱","2085","-75","-3.47","2165","2235","2055","265216","562135900","91939690875","44095775" +"198080","ǵ","KOSDAQ","߰߱","2570","-60","-2.28","2615","2650","2545","138148","355742795","55345425450","21535185" +"048830","","KOSDAQ","߰߱","1158","-20","-1.70","1177","1177","1147","31295","36244281","21682302834","18723923" +"096870","Ƽ","KOSDAQ","ó","2255","-70","-3.01","2320","2320","2185","64618","144785645","15059792000","6678400" +"276240","","KONEX","Ϲݱ","485","-85","-14.91","485","485","485","2","970","5050371930","10413138" +"900140","̿Ȧ","KOSPI",,"2305","-25","-1.07","2325","2370","2270","575865","1334397975","395511287355","171588411" +"290650","ؾ̿","KOSDAQ","췮","17050","-70","-0.41","16830","17270","16530","144414","2421792070","386777391550","22684891" +"066970","ؿ","KOSPI",,"86800","-5600","-6.06","93300","94700","86600","230007","20571542500","3150522138400","36296338" +"156100","̹̿","KOSDAQ","ó","6210","-170","-2.66","6370","6400","6060","61184","379268430","123807174030","19936743" +"311060","Ƽ","KONEX","Ϲݱ","4985","-5","-0.10","4985","4985","4985","2377","11849345","37757057990","7574134" +"073110","","KOSDAQ","ó","6400","70","1.11","6360","6430","6110","20615","129081360","56932832000","8895755" +"083310","ƼŨ","KOSDAQ","췮","10040","-290","-2.81","10340","10450","10030","88140","890746140","178812731320","17810033" +"037950","","KOSDAQ","߰߱","1265","-2","-0.16","1263","1314","1254","2408282","3079652824","106826111535","84447519" +"170920","Ƽ","KOSDAQ","ó","9300","80","0.87","9210","9560","8860","75096","692443760","91192266000","9805620" +"058630","","KOSDAQ","췮","5520","-90","-1.60","5600","5660","5450","105121","580122970","107882201040","19543877" +"058970","","KOSDAQ","","43050","-3450","-7.42","46000","46500","42750","100466","4389397150","510302559900","11853718" +"019590","ó","KOSDAQ","(ҼӺξ)","921","0","0.00","0","0","0","0","0","104963185182","113966542" +"169330","극","KOSDAQ","߰߱","2005","-155","-7.18","2160","2215","2005","29159","61549850","36605120590","18256918" +"097520","ؽ","KOSPI",,"17750","-500","-2.74","18200","18350","17700","53528","954998870","319104743000","17977732" +"373170","ťַ","KOSDAQ","ó","7580","-90","-1.17","7630","8060","7480","2526","19167090","38187509400","5037930" +"179290","","KOSDAQ","췮","6650","-220","-3.20","6870","6870","6600","98391","658306060","215231758700","32365678" +"009780","","KOSDAQ","췮","4955","-35","-0.70","5060","5060","4930","49021","243292480","87208000000","17600000" +"123040","","KOSDAQ","췮","3225","-30","-0.92","3255","3310","3185","75181","242468465","223080386925","69172213" +"323230","ڸ","KOSDAQ","(ҼӺξ)","161","0","0.00","0","0","0","0","0","6967193212","43274492" +"032790","ַ","KOSDAQ","ó","1538","78","5.34","1456","1745","1456","3372518","5419841897","65824603616","42798832" +"033160","","KOSDAQ","߰߱","7430","-200","-2.62","7610","7680","7340","90155","673525190","163952839330","22066331" +"347890","","KOSDAQ","ó","5690","-60","-1.04","5760","5780","5530","49789","280201560","96236130760","16913204" +"033310","","KOSDAQ","߰߱","2130","-70","-3.18","2220","2220","2115","33269","71148540","85928952030","40342231" +"259630","÷","KOSDAQ","߰߱","10600","40","0.38","10530","10730","10360","84214","884007000","130193461200","12282402" +"105550","Ŀ帮","KOSDAQ","߰߱","2250","25","1.12","2205","2260","2175","52565","115913340","128530993500","57124886" +"060850","Ʈ","KOSDAQ","ó","7290","-190","-2.54","7470","7520","7290","3195","23443180","59274990000","8131000" +"014440","ȭ","KOSPI",,"3340","25","0.75","3320","3350","3265","30616","101414685","66800000000","20000000" +"143540","𿡽","KOSDAQ","ó","762","-30","-3.79","791","792","755","44152","33920858","33985119990","44599895" +"111770","","KOSPI",,"36150","-1100","-2.95","37250","37250","36050","76780","2793446100","1601859568200","44311468" +"009970","Ȧ","KOSPI",,"83100","-300","-0.36","84700","84700","82400","4719","392728000","1133117695200","13635592" +"003520","ǰ","KOSPI",,"2280","-20","-0.87","2275","2300","2235","183335","414080865","416995426680","182892731" +"000670","dz","KOSPI",,"295500","-3500","-1.17","302000","302000","291000","1330","392516000","544322820000","1842040" +"036560","dz","KOSDAQ","췮","9340","-30","-0.32","9310","9390","9230","21361","198313030","147105000000","15750000" +"006740","dz","KOSPI",,"1250","-28","-2.19","1278","1289","1245","171863","215920013","58102685000","46482148" +"012280","ȭݼ","KOSPI",,"797","-2","-0.25","810","814","797","25428","20312235","41176610485","51664505" +"265560","ȭũ","KOSDAQ","췮","7750","-230","-2.88","7980","7980","7740","14255","111236900","82848895000","10690180" +"012160","","KOSPI",,"472","-6","-1.26","478","480","472","47156","22391998","47818495584","101310372" +"036000","","KOSDAQ","߰߱","1659","-9","-0.54","1679","1689","1650","11250","18633947","38213865543","23034277" +"250930","ũ","KOSDAQ","ó","569","15","2.71","554","582","554","90717","51232024","18777250360","33000440" +"053280","24","KOSDAQ","췮","5380","0","0.00","5480","5710","5340","3387766","18738611450","134500000000","25000000" +"015360","Ȧ","KOSPI",,"45550","-150","-0.33","45250","46100","44500","8862","402725150","273300000000","6000000" +"122640","Ƽ","KOSDAQ","ó","15380","-880","-5.41","16500","16500","15380","104979","1639921120","321905061040","20930108" +"900300","Ƽڽƽ","KOSDAQ","ܱ(ҼӺξ)","62","-1","-1.59","63","64","61","4701502","291771781","30261730474","488092427" +"212310","ǿ","KONEX","Ϲݱ","1169","41","3.63","1200","1200","1000","56827","58544787","12169133354","10409866" +"045060","","KOSDAQ","췮","2700","-10","-0.37","2760","2770","2680","11466","31021830","45743329800","16941974" +"080520","","KOSDAQ","ó","3525","-90","-2.49","3610","3615","3475","29509","103986950","41406796725","11746609" +"007310","ѱ","KOSPI",,"394500","-8000","-1.99","402000","402000","394500","2392","947232500","1581088935000","4007830" +"039830","ζ","KOSDAQ","췮","5210","-240","-4.40","5500","5500","5210","16035","85291750","56074656900","10762890" +"322310","νũ","KOSDAQ","ó","15640","-690","-4.23","16330","16330","15530","48827","765401590","146492716880","9366542" +"046120","","KOSDAQ","߰߱","2185","-40","-1.80","2220","2220","2130","100269","216358370","59977126910","27449486" +"014940","Ż","KOSDAQ","췮","3805","-105","-2.69","3855","3905","3695","377851","1427517055","173407780105","45573661" +"002630","Ʈ̿","KOSPI",,"463","-3","-0.64","470","472","459","75429","34964241","54903931315","118583005" +"065500","Ʈ","KOSDAQ","߰߱","1131","11","0.98","1121","1142","1103","49988","56066927","35901233472","31742912" +"271560","","KOSPI",,"88100","-600","-0.68","88500","89400","87400","105714","9315346900","3483133229200","39536132" +"001800","Ȧ","KOSPI",,"15420","20","0.13","15450","15450","15240","40625","624200330","965992407240","62645422" +"010470","","KOSDAQ","췮","5800","-250","-4.13","6050","6050","5780","35400","206885340","69455290000","11975050" +"417860","","KOSDAQ","","9990","140","1.42","9900","10430","9530","19561","193233520","44050295610","4409439" +"352910","","KOSDAQ","","6200","60","0.98","6190","6580","6080","31794","199324490","78354372400","12637802" +"053980","̿","KOSDAQ","췮","3770","-40","-1.05","3765","3815","3715","90013","337212875","71565091910","18982783" +"036220","コɾ","KOSDAQ","ó","12930","-360","-2.71","13110","13300","12880","45289","587759310","187348148880","14489416" +"052420","÷ܼ","KOSDAQ","߰߱","2045","-35","-1.68","2055","2100","1995","4780756","9712548012","173935033270","85053806" +"039200","","KOSDAQ","ó","33900","-1650","-4.64","34900","35650","32850","913270","30870194450","1296477566400","38244176" +"226400","׿","KOSDAQ","","5010","-240","-4.57","5250","5350","4960","189588","960996475","103514621010","20661601" +"031510","","KOSDAQ","߰߱","1314","65","5.20","1249","1370","1249","763116","1015396710","36792000000","28000000" +"368970","","KOSDAQ","ó","3185","-240","-7.01","3425","3425","3170","62474","201483470","29767519600","9346160" +"138080","ַ̼","KOSDAQ","ó","10710","-40","-0.37","10570","10970","10380","25178","268149930","113784057450","10624095" +"080580","Ų","KOSDAQ","췮","5170","-240","-4.44","5380","5380","5110","78721","407831600","91401970660","17679298" +"067170","","KOSDAQ","߰߱","3525","-135","-3.69","3625","3660","3480","24652","87189465","54255407625","15391605" +"353590","","KOSDAQ","߰߱","6480","1280","24.62","5280","6740","5270","14266935","88482245210","83433693600","12875570" +"173130","Ľ","KOSDAQ","췮","5990","-150","-2.44","6080","6180","5920","86747","519222500","78148373270","13046473" +"440320","³","KOSDAQ","","4015","-115","-2.78","4135","4170","3955","22783","91958760","39367075000","9805000" +"049480","º̽","KOSDAQ","췮","2440","-130","-5.06","2620","2640","2405","2330737","5901602240","76670614520","31422383" +"394280","¿ũ","KOSDAQ","","12130","-620","-4.86","12730","12760","12050","200332","2450148880","265050531510","21850827" +"309930","Ӿ۴","KOSDAQ","߰߱","2100","-100","-4.55","2165","2235","2025","101081","213672800","44711079000","21290990" +"244460","øн","KOSDAQ","(ҼӺξ)","816","26","3.29","777","856","720","3007831","2420330627","29367500544","35989584" +"226950","ø","KOSDAQ","","17060","1550","9.99","15720","17290","15150","682039","11241791930","289572976820","16973797" +"057540","ȴϽý","KOSDAQ","߰߱","791","-13","-1.62","797","804","789","110423","87647449","48606439805","61449355" +"131030","","KOSDAQ","췮","6240","-300","-4.59","6470","6560","6220","95368","600963810","100795730880","16153162" +"082210","Ʈ","KOSDAQ","߰߱","2130","-130","-5.75","2300","2300","2125","105786","229465705","60846725940","28566538" +"109080","Ƽý","KOSDAQ","ó","7140","-220","-2.99","7290","7400","7000","5069","35991380","40241040000","5636000" +"380540","Ƽھ","KOSDAQ","ó","1013","-19","-1.84","1031","1038","1006","221610","224956085","30166730748","29779596" +"153710","Ƽ","KOSDAQ","","5500","-200","-3.51","5700","5700","5330","37802","205240600","80684769000","14669958" +"432430","̷","KOSDAQ","","4950","-240","-4.62","5190","5250","4940","146540","733013245","81290484000","16422320" +"338840","̹̿","KOSDAQ","","11100","1460","15.15","9640","11760","9360","2487807","27168882620","163941627600","14769516" +"122990","̼","KOSDAQ","췮","6520","-20","-0.31","6540","6590","6350","31230","201637650","183778855320","28186941" +"232140","̾","KOSDAQ","췮","11380","-1050","-8.45","12430","12480","11270","2010901","23271623460","933676083000","82045350" +"112290","̾","KOSDAQ","","12750","-1000","-7.27","13590","13850","12700","126366","1642526470","128909448750","10110545" +"065530","̾","KOSDAQ","߰߱","1427","-35","-2.39","1452","1478","1421","51690","74056763","75431220000","52860000" +"067900","̿","KOSDAQ","췮","6290","-60","-0.94","6350","6410","6220","29556","185798200","114475855110","18199659" +"007530","̿","KOSDAQ","߰߱","2700","-20","-0.74","2770","2770","2610","3555","9654405","51771020400","19174452" +"155650","̿","KOSDAQ","췮","4045","-35","-0.86","4080","4100","3940","73451","294749660","78773778110","19474358" +"273640","̿","KOSDAQ","ó","11160","-450","-3.88","11900","12510","11100","236566","2790838710","122380560000","10966000" +"251370","̿Ƽ","KOSDAQ","ó","8780","30","0.34","8680","9200","8440","39082","338406610","143240993920","16314464" +"066430","̿","KOSDAQ","ȯ(ҼӺξ)","550","-2","-0.36","555","561","543","79598","43758872","21534411800","39153476" +"273060","","KOSDAQ","߰߱","850","-30","-3.41","875","880","850","224060","192984366","42890644700","50459582" +"019210","-","KOSDAQ","췮","5030","0","0.00","5030","5030","4965","68022","338799070","168876309570","33573819" +"122870","θƮ","KOSDAQ GLOBAL","췮","30800","-1000","-3.14","31600","32000","30800","92687","2883106050","575684309200","18691049" +"011690","ַ","KOSPI",,"3400","-65","-1.88","3465","3945","3360","8160096","29913499310","124352939600","36574394" +"332570","","KOSDAQ","ó","2565","-105","-3.93","2640","2665","2550","96951","250118165","108329825250","42233850" +"079000","佺ڸ","KOSDAQ","߰߱","5090","-10","-0.20","5160","5160","5050","17668","89487660","36648000000","7200000" +"403490","","KOSDAQ","ó","1800","-70","-3.74","1870","2070","1800","5736565","11223979872","81382435200","45212464" +"316140","츮","KOSPI",,"15970","-80","-0.50","16060","16060","15800","1518681","24249128750","11859186270970","742591501" +"032820","츮","KOSDAQ","췮","2060","-85","-3.96","2145","2190","2055","8560136","18055264605","327249638880","158859048" +"041190","츮","KOSDAQ","췮","6480","-170","-2.56","6540","6640","6450","421262","2745695000","544320000000","84000000" +"115440","츮","KOSDAQ","ó","6960","-190","-2.66","7280","7280","6880","87143","615048570","74849503440","10754239" +"046970","츮","KOSDAQ","߰߱","1107","-69","-5.87","1185","1193","1107","683748","776149977","48514273893","43824999" +"082850","츮̿","KOSDAQ","췮","3860","-75","-1.91","3885","3915","3705","2324516","8839434705","187042391080","48456578" +"215360","츮","KOSDAQ","ó","12010","-90","-0.74","12070","12190","11850","8388","100268220","109677277630","9132163" +"072470","츮Ȧ","KOSDAQ","߰߱","2930","-50","-1.68","2950","2990","2905","10247","30039520","55339909130","18887341" +"073560","츮տ","KOSDAQ","췮","1264","-24","-1.86","1273","1290","1256","62688","79363278","87516380752","69237643" +"037400","츮","KOSDAQ","췮","1327","-38","-2.78","1346","1360","1325","59973","80160720","34798380142","26223346" +"153490","츮̾ؿ","KOSDAQ","췮","810","-2","-0.25","812","822","790","151220","121951344","41698800000","51480000" +"101170","츲Ƽ","KOSDAQ","췮","5560","-130","-2.28","5620","5790","5430","89417","495661000","75060000000","13500000" +"006980","켺","KOSPI",,"15000","-660","-4.21","15530","15670","15000","769","11722600","46350000000","3090000" +"066590","AMS","KOSDAQ","߰߱","3030","0","0.00","3040","3065","2995","133551","403282480","118391505120","39073104" +"017370","Žý","KOSPI",,"5920","-280","-4.52","6140","6260","5850","52120","309821490","108419199680","18314054" +"103840","","KOSDAQ","߰߱","4215","-115","-2.66","4255","4320","4155","195554","827319090","68984494020","16366428" +"046940","","KOSDAQ","߰߱","2595","-10","-0.38","2580","2620","2500","108180","277933215","46902938250","18074350" +"215380","̿","KOSDAQ","ó","1991","-134","-6.31","2090","2125","1983","407083","823019290","31616235816","15879576" +"065680","ϷƮ","KOSDAQ","췮","14200","-310","-2.14","14510","14540","14030","20760","296907410","135326000000","9530000" +"105840","","KOSPI",,"7670","0","0.00","7600","7730","7460","123442","934278450","155882119380","20323614" +"018620","","KOSDAQ","߰߱","1013","0","0.00","1001","1033","1001","20917","21119497","29264853809","28889293" +"010400","̿","KOSPI",,"3350","-125","-3.60","3340","3695","3340","6903","23693750","25533700000","7622000" +"457550","","KOSDAQ","߰߱","15550","-1290","-7.66","16560","16760","15400","434194","6881600800","144169321450","9271339" +"049800","ö","KOSPI",,"2180","-60","-2.68","2220","2230","2170","19521","42867825","43600000000","20000000" +"016880","","KOSPI",,"925","-32","-3.34","952","956","925","146794","136991573","73932549000","79927080" +"095720","ũ","KOSPI",,"1675","-34","-1.99","1680","1719","1673","154203","259495636","193472524875","115505985" +"396470","Ʈ","KOSDAQ","߰߱","9380","-520","-5.25","9810","9880","9340","247764","2356068320","151205600000","16120000" +"005820","","KOSPI",,"15540","-240","-1.52","15690","15690","15530","386","6017300","35710453800","2297970" +"307280","̿","KOSDAQ","ó","1362","-22","-1.59","1383","1390","1355","41598","56757636","50338175706","36959013" +"032940","","KOSDAQ","췮","3875","-50","-1.27","3925","3925","3775","159638","612528170","70498766250","18193230" +"240810","IPS","KOSDAQ GLOBAL","췮","30900","200","0.65","30650","31200","30050","221326","6811206350","1516692540900","49083901" +"074600","QnC","KOSDAQ GLOBAL","췮","24450","-650","-2.59","25100","25150","24150","177942","4355308850","642741600000","26288000" +"104830","͸Ʈ","KOSDAQ","췮","26150","-650","-2.43","26600","27200","26150","27652","730291400","329699200000","12608000" +"014190","ť","KOSDAQ","췮","1530","-20","-1.29","1542","1554","1480","141861","215803695","54161856180","35399906" +"217820","Ǿ","KOSDAQ","췮","2945","-100","-3.28","3025","3045","2935","82552","244391215","139753676255","47454559" +"030530","Ȧ","KOSDAQ","췮","2395","-70","-2.84","2450","2480","2385","243607","588170155","184984964495","77237981" +"012620","Ư","KOSDAQ","췮","7400","200","2.78","7200","7420","7020","20228","143935930","32560000000","4400000" +"382840","","KOSDAQ","߰߱","10230","-410","-3.85","10500","10830","10030","85076","879691970","156228273630","15271581" +"336570","","KOSDAQ","","6510","-160","-2.40","6710","6720","6370","1352847","8800953950","581607429690","89340619" +"376980","Ƽ左","KOSDAQ","","4610","-160","-3.35","4765","4765","4550","21514","99381145","44970522340","9754994" +"122830","","KONEX","Ϲݱ","3030","30","1.00","3285","3285","2550","4042","11542475","99238514550","32751985" +"008370","dz","KOSDAQ","췮","4490","-10","-0.22","4460","4520","4430","27911","124346080","53880000000","12000000" +"008290","dz","KOSDAQ","߰߱","528","-21","-3.83","549","549","525","76988","41265043","21486262512","40693679" +"101160","","KOSDAQ","췮","19690","-710","-3.48","20200","20350","19610","386637","7647130800","325101452170","16510993" +"336060","̹","KOSDAQ","ó","1597","-120","-6.99","1671","1717","1564","3155792","5099309745","76903854400","48155200" +"095270","̺ϷƮ","KOSDAQ","ó","4735","-65","-1.35","4845","4845","4390","42543","198013425","70888897160","14971256" +"010600","̿","KOSPI",,"545","0","0.00","0","0","0","0","0","49553256815","90923407" +"065950","ũ","KOSDAQ","߰߱","2275","-5","-0.22","2260","2305","2235","323160","730543255","64226212050","28231302" +"076080","ũ","KOSDAQ","߰߱","1535","-45","-2.85","1564","1589","1526","40704","62972192","34682029460","22594156" +"043590","ŵ","KOSDAQ","߰߱","831","-94","-10.16","912","953","831","811761","723139945","22550649222","27136762" +"196700","","KOSDAQ","ó","1304","-63","-4.61","1355","1361","1260","106523","137728262","18730843776","14364144" +"069080","","KOSDAQ GLOBAL","췮","17100","-220","-1.27","17250","17540","17050","106402","1840327580","597660116400","34950884" +"053580","ɽ","KOSDAQ","췮","6890","-110","-1.57","7070","7070","6860","8878","61418490","93953748720","13636248" +"071460","Ͼ","KOSDAQ","(ҼӺξ)","613","0","0.00","0","0","0","0","0","22047951835","35967295" +"377460","Ͼƿ̵","KOSDAQ","ȯ(ҼӺξ)","1691","0","0.00","0","0","0","0","0","26030247855","15393405" +"044340","н","KOSDAQ","췮","6170","-130","-2.06","6110","6430","6110","20312","125234640","110279032250","17873425" +"330350","","KOSDAQ","췮","6970","-150","-2.11","7120","7190","6920","47702","333065150","92018908830","13202139" +"348350","","KOSDAQ","췮","8300","-300","-3.49","8450","8950","8230","30288","257488100","84523880000","10183600" +"112040","̵","KOSDAQ","߰߱","33100","-1400","-4.06","34500","34750","32800","176282","5869021300","1123694787300","33948483" +"101730","̵ƽ","KOSDAQ","췮","9820","-170","-1.70","9760","9970","9500","241000","2352095460","326959767440","33295292" +"123420","̵÷","KOSDAQ","췮","8250","-320","-3.73","8590","8650","8170","47172","391963210","94626196500","11469842" +"065370","","KOSDAQ","ó","4520","-400","-8.13","4800","4800","4395","37316","170059275","33375472080","7383954" +"140660","","KONEX","Ϲݱ","1199","0","0.00","0","0","0","0","0","2982215148","2487252" +"038620","","KOSDAQ","ó","597","-7","-1.16","597","603","589","92371","54851940","39728239605","66546465" +"299900","Ʃ","KOSDAQ","췮","1231","-60","-4.65","1278","1305","1229","711056","887553221","210561176204","171048884" +"036090","Ʈ","KOSDAQ","߰߱","649","-13","-1.96","662","666","645","298067","193900623","76836592316","118392284" +"136540","","KOSDAQ","췮","12670","0","0.00","12620","12730","12480","9036","113592740","172871532540","13644162" +"097800","","KOSDAQ","߰߱","1414","-61","-4.14","1473","1475","1405","1859695","2657215323","164660623806","116450229" +"192390","","KOSDAQ","ó","3575","-25","-0.69","3600","3605","3460","25002","88485275","39056842825","10924991" +"008600","","KOSPI",,"424","-27","-5.99","447","450","424","46344","20289631","28508080536","67236039" +"335870","Dz","KOSDAQ","߰߱","1161","-38","-3.17","1180","1180","1128","48300","55587715","19367130942","16681422" +"900340","Ǫ","KOSDAQ","ܱ(ҼӺξ)","1807","-57","-3.06","1878","1878","1797","417002","758407532","86687984396","47973428" +"033270","Ƽ","KOSPI",,"20900","-250","-1.18","21000","21200","20500","55879","1162665000","341376879800","16333822" +"014830","ϵ","KOSPI",,"74600","-3800","-4.85","77900","79000","74600","16836","1277038500","504862960000","6767600" +"446070","ϵƼ÷","KOSPI",,"4200","-75","-1.75","4270","4270","4125","7238","30115395","44567103000","10611215" +"036200","ϼ","KOSDAQ","췮","6380","-250","-3.77","6610","6710","6330","382058","2447374010","195637742740","30664223" +"018000","Ͻ","KOSDAQ","߰߱","713","-4","-0.56","717","820","680","1807026","1364176582","120063185132","168391564" +"000910","Ͽ","KOSPI",,"3920","-130","-3.21","4000","4070","3905","48662","191945520","61197546480","15611619" +"047400","Ͽ¸Ƽ","KOSPI",,"2010","-55","-2.66","2055","2080","1999","148542","299129876","84420000000","42000000" +"203450","ϿĿ´Ƽ","KOSDAQ","ó","2495","-35","-1.38","2530","2535","2430","23080","57316370","35127122465","14079007" +"011330","","KOSPI",,"1235","-91","-6.86","1340","1373","1235","126926","161816362","119644536245","96878167" +"077500","Ʈ","KOSPI",,"4600","-250","-5.15","4795","4885","4565","125243","582243140","100252469000","21794015" +"011320","ũ","KOSDAQ","췮","4350","0","0.00","4310","4355","4175","45861","196295510","84045023250","19320695" +"086390","׽Ʈ","KOSDAQ","߰߱","8800","-350","-3.83","9150","9190","8690","109853","973207560","185980308800","21134126" +"241690","ũ","KOSDAQ","췮","4365","15","0.34","4360","4850","4355","1884987","8608816645","106814631690","24470706" +"142210","Ʈ","KOSDAQ","췮","4975","-95","-1.87","5110","5380","4975","197744","1020042915","95749307700","19246092" +"121060","Ʈ","KONEX","Ϲݱ","694","-45","-6.09","681","737","680","17605","11981192","4151278980","5981670" +"088340","Ŭ","KOSDAQ","ó","13620","-1500","-9.92","15460","15580","13620","1277147","18374011490","58975526160","4330068" +"048430","ũ","KOSDAQ","췮","6170","-130","-2.06","6240","6300","6100","20103","123386200","71078400000","11520000" +"206650","̿","KOSDAQ","","9830","-240","-2.38","10080","10160","9790","164376","1628588660","359132237810","36534307" +"089850","񺧷Ͻ","KOSDAQ","췮","6880","-10","-0.15","6770","6930","6700","25062","170924800","101343769120","14730199" +"084440","","KOSDAQ","","790","-30","-3.66","820","821","790","76505","61180373","15573112000","19712800" +"032620","ɾ","KOSDAQ","췮","3925","-75","-1.88","3965","4020","3860","246007","963897465","204873770575","52197139" +"264450","","KOSDAQ","췮","12470","-130","-1.03","12410","12620","12160","19691","242759450","127763953820","10245706" +"078070","Ȧ","KOSDAQ","췮","10030","-10","-0.10","10100","10100","9830","13770","137029070","182051521000","18150700" +"002920","","KOSPI",,"2205","-5","-0.23","2235","2235","2185","18656","41089155","57214237500","25947500" +"024800","Ƽ","KOSDAQ","췮","2000","-25","-1.23","2010","2010","1951","35777","71108274","74103624000","37051812" +"000700","Ȧ","KOSPI",,"5240","40","0.77","5230","5290","5110","7693","39707780","136459094880","26041812" +"054930","","KOSDAQ","췮","21100","-1150","-5.17","22050","22300","20850","26451","563275750","63300000000","3000000" +"069330","̵","KOSDAQ","ó","1252","-8","-0.63","1254","1260","1242","22908","28551682","17767245932","14191091" +"049520","̿","KOSDAQ","߰߱","5090","-110","-2.12","5200","5240","4985","134492","681427375","110885324240","21784936" +"435380","Ÿ10ȣ","KOSDAQ","SPAC(ҼӺξ)","2115","5","0.24","2095","2120","2095","4139","8702865","12118950000","5730000" +"444920","Ÿ11ȣ","KOSDAQ","SPAC(ҼӺξ)","2135","0","0.00","2150","2150","2130","1946","4145180","11187400000","5240000" +"446150","Ÿ12ȣ","KOSDAQ","SPAC(ҼӺξ)","2380","0","0.00","0","0","0","0","0","11352600000","4770000" +"449020","Ÿ13ȣ","KOSDAQ","SPAC(ҼӺξ)","2035","-5","-0.25","2055","2055","2035","1354","2755545","19800550000","9730000" +"450940","Ÿ14ȣ","KOSDAQ","SPAC(ҼӺξ)","2095","-15","-0.71","2110","2110","2095","3662","7696405","9511300000","4540000" +"473050","Ÿ15ȣ","KOSDAQ","SPAC(ҼӺξ)","2015","0","0.00","2020","2025","2015","7330","14813165","14125150000","7010000" +"474490","Ÿ16ȣ","KOSDAQ","SPAC(ҼӺξ)","2025","-5","-0.25","2030","2030","2025","21662","43865780","11157750000","5510000" +"430700","Ÿ9ȣ","KOSDAQ","SPAC(ҼӺξ)","2120","-10","-0.47","2125","2125","2110","4681","9889330","11108800000","5240000" +"003470","Ÿ","KOSPI",,"2925","-15","-0.51","2920","2960","2890","135252","395275270","583819984800","199596576" +"003475","Ÿǿ","KOSPI",,"2950","-45","-1.50","3005","3005","2880","169861","494096515","38091025400","12912212" +"263770","Ƽ","KOSDAQ","췮","2110","0","0.00","2115","2125","2075","21496","45062645","50007362920","23700172" +"337840","","KONEX","Ϲݱ","12500","-180","-1.42","12600","12600","12100","2731","33323040","46350512500","3708041" +"072130","","KOSPI",,"3500","220","6.71","3280","3600","3270","576750","2000299140","46184089000","13195454" +"000220","","KOSPI",,"4445","-120","-2.63","4550","4565","4405","112634","500927500","75708800195","17032351" +"000225","1","KOSPI",,"4860","-130","-2.61","4915","4995","4795","3901","18896195","11017279800","2266930" +"000227","2B","KOSPI",,"10480","-260","-2.42","10500","10500","10200","700","7271850","3411868800","325560" +"388720","Ϸκƽ","KOSDAQ","ó","28450","-350","-1.22","28900","29350","28100","54538","1564881100","325850197300","11453434" +"340930","Ͽũ","KOSDAQ","ó","2740","-170","-5.84","2855","2890","2715","304699","842783060","93720193000","34204450" +"023410","","KOSDAQ","췮","3365","-5","-0.15","3370","3380","3290","141839","473940500","260151053995","77310863" +"056080","κ","KOSDAQ","߰߱","5580","-210","-3.63","5780","5780","5550","80881","453539750","209317808160","37512152" +"468760","10ȣ","KOSDAQ","SPAC(ҼӺξ)","2135","-10","-0.47","2180","2180","2130","831","1774700","9052400000","4240000" +"442130","9ȣ","KOSDAQ","SPAC(ҼӺξ)","2175","-30","-1.36","2265","2265","2170","4642","10211095","7525500000","3460000" +"084370","ũ","KOSDAQ","췮","37550","0","0.00","37500","37900","37050","114419","4273176150","860497377100","22916042" +"240600","ũ","KOSDAQ","߰߱","7350","-340","-4.42","7670","8150","7320","124929","953132850","50921909850","6928151" +"001200","","KOSPI",,"4375","-45","-1.02","4420","4425","4230","433393","1873785895","423790578750","96866418" +"221800","̿","KOSDAQ","","2915","-115","-3.80","2990","3125","2885","94578","277350920","32902176340","11287196" +"179900","Ƽ","KOSDAQ","ó","21100","-1350","-6.01","22650","22650","20950","42240","900018000","343653484500","16286895" +"263050","ƿ","KOSDAQ","","2450","-120","-4.67","2640","2640","2410","175101","431440085","90157202100","36798858" +"000100","Ѿ","KOSPI",,"125600","-5000","-3.83","129000","131500","122500","4801007","606948907600","10074258438400","80209064" +"000105","Ѿ","KOSPI",,"177900","11400","6.85","160400","182500","148700","605666","102390326400","210089226000","1180940" +"003460","ȭ","KOSPI",,"2200","-5","-0.23","2200","2210","2175","5828","12747225","124745313000","56702415" +"003465","ȭǿ","KOSPI",,"2145","-55","-2.50","2125","2160","2125","375","799695","37486931625","17476425" +"191410","Ͼ","KOSDAQ","߰߱","1797","-7","-0.39","1804","1904","1797","102362","188916915","20134046235","11204255" +"372170","ؾ","KOSDAQ","","45500","-3150","-6.47","48050","48600","45500","36703","1701884150","363046684000","7979048" +"146060","","KOSDAQ","߰߱","1309","-29","-2.17","1337","1337","1295","38669","50504278","31436413855","24015595" +"008730","ȭ","KOSPI",,"21300","-1100","-4.91","22600","22600","21200","57010","1225177600","528240000000","24800000" +"072770","ȣ","KOSDAQ","߰߱","1925","5","0.26","1958","1958","1810","182525","348392648","133061382300","69122796" +"008250","̰ǻ","KOSPI",,"5090","-130","-2.49","5220","5500","5080","21849","114916770","55748912150","10952635" +"039020","̰Ȧ","KOSDAQ","߰߱","2955","-35","-1.17","2990","3000","2895","87183","254497415","66737815095","22584709" +"025820","̱","KOSPI",,"3990","-85","-2.09","4080","4100","3975","143785","577027540","133433580000","33442000" +"067920","̱۷","KOSDAQ","췮","5080","-60","-1.17","5140","5160","4985","25471","127885445","55860284520","10996119" +"044960","̱ۺ","KOSDAQ","߰߱","4800","-30","-0.62","4855","4875","4720","25345","120795710","60681038400","12641883" +"303530","̳뵪","KOSDAQ","ó","7920","200","2.59","7720","8410","7320","177166","1416631700","58127248080","7339299" +"296640","̳꽺","KOSDAQ","ó","5600","-290","-4.92","5740","5810","5560","19338","109409270","28998211200","5178252" +"302430","̳Ʈ","KOSDAQ","췮","10000","-380","-3.66","10210","10560","10000","43312","439716750","98332080000","9833208" +"279060","̳뺤","KONEX","Ϲݱ","2185","-15","-0.68","2190","2190","2100","254","545020","19829041060","9075076" +"214320","̳","KOSPI",,"19200","-90","-0.47","19370","19370","18980","38853","743725640","768000000000","40000000" +"462350","̳뽺̽","KOSDAQ","","16610","-1110","-6.26","17850","17860","16450","105081","1771844400","155730277340","9375694" +"274400","̳ùķ̼","KOSDAQ","","5780","-120","-2.03","5960","6700","5770","333011","2089553680","45198594280","7819826" +"056090","̳ý","KOSDAQ","߰߱","1431","-86","-5.67","1492","1498","1430","543461","791650267","134635241475","94084725" +"073490","̳̾","KOSDAQ","췮","16010","-480","-2.91","16300","16470","15250","43500","698355170","121737574460","7603846" +"215790","̳νƮƮ","KOSDAQ","ó","543","-9","-1.63","552","554","536","64601","35254150","21873749907","40283149" +"344860","̳","KOSDAQ","","1834","-45","-2.39","1855","1879","1834","24763","45742604","22063020000","12030000" +"088390","̳콺","KOSDAQ","췮","11780","-510","-4.15","12290","12380","11780","27417","326649220","110565242320","9385844" +"272290","̳콺÷ܼ","KOSDAQ GLOBAL","췮","26100","-950","-3.51","27000","27450","26100","168381","4430705850","527941873800","20227658" +"053350","̴","KOSDAQ","߰߱","3240","-20","-0.61","3295","3295","3235","9275","30245885","64122567840","19790916" +"452400","̴н","KOSDAQ","ó","13200","-1250","-8.65","15020","15900","13170","1147909","17009873120","119742849600","9071428" +"264850","̷ý","KOSDAQ","췮","5250","-530","-9.17","5920","5920","5150","1105940","6001987100","159046713000","30294612" +"054210","̷","KOSDAQ","췮","5660","-310","-5.19","5970","6000","5660","209283","1206916810","143148248600","25291210" +"009730","̷","KOSDAQ","߰߱","1268","-83","-6.14","1354","1393","1265","1561775","2035838271","58399989432","46056774" +"164060","̷","KOSDAQ","ó","6760","240","3.68","6550","6840","6450","63405","421297590","143318313840","21200934" +"065440","̷","KOSDAQ","ó","1247","-56","-4.30","1287","1303","1242","105186","132627918","34011949940","27275020" +"088260","̸ũ","KOSPI",,"5290","0","0.00","5300","5340","5230","57792","305597330","335077011100","63341590" +"139480","̸Ʈ","KOSPI",,"63300","-2000","-3.06","65500","65500","63200","169946","10898201800","1764539342700","27875819" +"115610","̹","KOSDAQ","ó","1973","-32","-1.60","2005","2030","1939","48838","95906368","31092497135","15758995" +"478110","̺Ʈ6ȣ","KOSDAQ","SPAC(ҼӺξ)","2025","-5","-0.25","2030","2035","2025","12042","24445465","10165500000","5020000" +"131400","̺÷ܼ","KOSDAQ","ó","2505","-130","-4.93","2590","2630","2470","1089215","2745425450","149272654410","59589882" +"419700","̺ŷ","KONEX","Ϲݱ","528","-1","-0.19","510","565","510","85608","45366440","9116799648","17266666" +"208850","̺ũ","KONEX","Ϲݱ","5400","-190","-3.40","5590","5590","5200","7","36990","15229350000","2820250" +"351330","̻迣Ͼ","KOSDAQ","ó","9020","-420","-4.45","9310","9410","8500","75685","687748410","74762450400","8288520" +"080010","̻Ʈ","KOSDAQ","췮","5290","-50","-0.94","5340","5350","5220","5656","29877810","52027525590","9835071" +"379390","̼","KONEX","Ϲݱ","9800","0","0.00","0","0","0","0","0","27846308000","2841460" +"457190","̼Ƽɹ","KOSPI",,"48750","-5450","-10.06","53300","54400","48000","846502","43242435900","1472653650000","30208280" +"086890","̼","KOSDAQ","","6020","30","0.50","6030","6040","5910","83788","500850230","215856719960","35856598" +"007660","̼Ÿý","KOSPI",,"33150","-1100","-3.21","34050","34400","32500","1762581","58161222550","2096618789850","63246419" +"005950","̼ȭ","KOSPI",,"8500","-400","-4.49","8900","9070","8500","136539","1188000040","193143281500","22722739" +"015020","̽Ÿ","KOSPI",,"602","-8","-1.31","610","614","598","107086","64798750","25796663200","42851600" +"047560","̽ƮƮ","KOSDAQ","ó","13100","-1350","-9.34","14150","14350","13020","300427","4019496000","152012295200","11603992" +"900110","̽ƮƽþȦ","KOSDAQ","ܱ(ҼӺξ)","67","-4","-5.63","71","71","67","8261867","566920707","28939447350","431932050" +"239340","̽Ʈ̵","KOSDAQ","߰߱","1738","-74","-4.08","1749","1782","1734","19192","33554428","46890603892","26979634" +"067010","̾","KOSDAQ","ó","2860","10","0.35","2850","2940","2805","22677","64447290","35160840000","12294000" +"093230","̵̾","KOSPI",,"1392","0","0.00","0","0","0","0","0","354103029120","254384360" +"341310","̾ؿġ","KONEX","Ϲݱ","830","-84","-9.19","898","898","777","14","11171","14353522000","17293400" +"418620","̿Ʈ","KOSDAQ","","11560","-420","-3.51","11980","11990","11320","26243","302888110","111559514120","9650477" +"456070","̿","KOSDAQ","","25150","-3700","-12.82","28850","28850","24700","1034094","27416166000","235151343100","9349954" +"102710","̿ũ","KOSDAQ","췮","23200","-800","-3.33","23900","24150","23200","69704","1634550450","331477795200","14287836" +"074610","̿÷","KOSPI",,"1641","-72","-4.20","1710","1753","1601","1461486","2432430366","120407930289","73374729" +"041520","̿","KOSDAQ","߰߱","5470","-190","-3.36","5700","5700","5400","11382","62541300","66672353100","12188730" +"063760","̿","KOSDAQ","ó","2410","-40","-1.63","2430","2475","2385","9479","22867815","22473563300","9325130" +"123570","̿","KOSDAQ","߰߱","2475","-95","-3.70","2570","2570","2440","52217","130037380","55133293050","22276078" +"083470","̿ؾ","KOSDAQ","߰߱","1461","-31","-2.08","1495","1537","1443","12372","18118709","31178220669","21340329" +"095190","̿ڸ","KOSDAQ","߰߱","2065","-35","-1.67","2080","2140","2045","82025","169772055","93585329180","45319772" +"091120","̿","KOSDAQ","췮","22950","-1350","-5.56","24200","24400","22800","284159","6589718800","393200881200","17132936" +"232530","̿Ƽ","KONEX","Ϲݱ","4330","-70","-1.59","4480","4480","4260","855","3688290","110909936320","25614304" +"102460","̿","KOSPI",,"12850","-340","-2.58","13130","13170","12770","24026","309639850","238840521350","18586811" +"039030","̿ũн","KOSDAQ GLOBAL","췮","140100","-7200","-4.89","145900","146900","137900","135968","19177462100","1725968955000","12319550" +"294090","̿÷ο","KOSDAQ","","6890","-220","-3.09","7140","7200","6830","404557","2813177190","209701690510","30435659" +"088290","̿","KOSDAQ","߰߱","1338","-11","-0.82","1369","1369","1290","38679","51490499","41921773122","31331669" +"084680","̿","KOSPI",,"1670","-4","-0.24","1651","1670","1596","622832","1012609407","236816342310","141806193" +"353810","̿","KOSDAQ","췮","3855","-45","-1.15","3900","3950","3815","159801","616808450","131809080600","34191720" +"350520","","KOSPI",,"4000","-20","-0.50","4055","4055","3960","46062","184238545","113434468000","28358617" +"334890","","KOSPI",,"5170","-20","-0.39","5140","5190","5130","47045","242154750","265962734730","51443469" +"099750","ɾ","KOSDAQ","ó","15540","-110","-0.70","15510","16030","14900","10959","168721110","106212419040","6834776" +"377330","Ʈδн","KOSDAQ","","5670","-270","-4.55","5840","5980","5650","41916","241699300","46153539180","8139954" +"035810","Ȧ","KOSDAQ","췮","2550","-35","-1.35","2570","2590","2525","143951","366607595","166121904750","65145845" +"160600","ť","KOSDAQ","(ҼӺξ)","3100","0","0.00","0","0","0","0","0","106895911200","34482552" +"092130","ũ","KOSDAQ","߰߱","12540","-160","-1.26","12740","12740","12480","4745","59594970","151026744000","12043600" +"096040","Ʈ","KOSDAQ","ȯ(ҼӺξ)","271","0","0.00","0","0","0","0","0","245561580945","906131295" +"134060","ǻ","KOSDAQ","ó","4215","-30","-0.71","4245","4335","4215","5122","21914200","20102388750","4769250" +"001840","ȭ","KOSDAQ","߰߱","2535","-115","-4.34","2605","2700","2535","135358","349086730","50207601600","19805760" +"000760","ȭ","KOSPI",,"12940","240","1.89","12700","13300","12450","2163","27537340","36232000000","2800000" +"024810","ȭ","KOSDAQ","(ҼӺξ)","899","0","0.00","0","0","0","0","0","196834827360","218948640" +"014990","ε","KOSPI",,"630","23","3.79","615","633","591","459061","281369528","47321186850","75112995" +"041830","ιٵ","KOSDAQ","췮","23500","-200","-0.84","23600","23950","23300","26562","623240500","321568877000","13683782" +"352940","ι̿","KOSDAQ","ó","2220","-15","-0.67","2230","2325","2165","32405","72248655","24126360600","10867730" +"101140","ι̿","KOSPI",,"9340","0","0.00","0","0","0","0","0","93812977440","10044216" +"216400","ι̿ھ","KONEX","Ϲݱ","6330","-200","-3.06","6580","6580","6060","6118","38505220","48812623950","7711315" +"079950","κϾ","KOSDAQ","߰߱","766","-26","-3.28","792","840","766","43681","34532268","17771200000","23200000" +"389470","κƼ","KOSDAQ","","13940","-1760","-11.21","15560","15700","13940","661519","9556364560","135030967020","9686583" +"277410","λ갡","KOSDAQ","ó","1415","-60","-4.07","1450","1485","1405","238185","341747704","54274856435","38356789" +"060150","μ̿Ƽ","KOSDAQ","췮","5730","-130","-2.22","5760","5980","5680","60488","347734750","266809496760","46563612" +"033230","μ","KOSDAQ","߰߱","2390","-75","-3.04","2480","2500","2350","1800589","4334688600","120731758200","50515380" +"450520","ν̺ý","KOSDAQ","ó","3630","-50","-1.36","3600","4070","3600","215491","826920430","53377618140","14704578" +"006490","νں","KOSPI",,"1269","68","5.66","1210","1282","1174","935929","1148939033","151479258462","119368998" +"037330","÷","KOSDAQ","췮","1621","-9","-0.55","1618","1705","1611","87192","145185291","71137948104","43885224" +"100030","Ʈ","KOSDAQ","߰߱","17180","-670","-3.75","17690","18290","16780","28342","483444580","56414206520","3283714" +"023800","Ʈѽ","KOSPI",,"6020","-120","-1.95","6180","6190","5970","28685","172180990","95171365940","15809197" +"034590","õð","KOSPI",,"25400","-50","-0.20","25500","25500","25300","2035","51659050","111118751600","4374754" +"211050","ī","KOSDAQ","","4300","0","0.00","4360","4430","4220","212864","909812465","220933140000","51379800" +"083640","","KOSDAQ","ó","347","-10","-2.80","357","357","342","116383","40560457","26968961797","77720351" +"064090","ũ","KOSDAQ","߰߱","4450","45","1.02","4500","4630","4415","149313","676105650","221355215250","49742745" +"216050","ũν","KOSDAQ","췮","6340","-200","-3.06","6540","6560","6280","29664","188101320","81426027480","12843222" +"049070","ž","KOSDAQ","췮","21450","-1050","-4.67","22950","23050","21200","230931","4982953450","368940000000","17200000" +"119610","ͷ","KOSDAQ","(ҼӺξ)","24900","0","0.00","0","0","0","0","0","329090302200","13216478" +"017250","Ϳ","KOSDAQ","߰߱","1064","-6","-0.56","1068","1069","1043","28229","29847290","22392376888","21045467" +"129260","","KOSPI",,"2145","-40","-1.83","2205","2205","2145","57368","124013670","63809189730","29747874" +"051370","÷","KOSDAQ","췮","11040","-180","-1.60","11100","11280","10850","93513","1033881440","257535290880","23327472" +"064290","÷","KOSDAQ","췮","13390","-440","-3.18","13800","13990","13100","88462","1184655720","172248451180","12863962" +"189300","ڸũ","KOSDAQ","췮","48500","-2000","-3.96","50000","50700","48400","48772","2391570200","520566699000","10733334" +"150840","Ʈθ޵","KOSDAQ","(ҼӺξ)","5850","0","0.00","0","0","0","0","0","251537720850","42997901" +"048530","Ʈй̿","KOSDAQ","","5740","-60","-1.03","5760","5840","5660","60174","344383280","196025373880","34150762" +"023810","","KOSPI",,"7270","0","0.00","7200","7380","7150","3805","27454400","72700000000","10000000" +"115310","","KOSDAQ","ó","20450","100","0.49","20750","20750","20100","4563","92531650","65294457350","3192883" +"039290","ũ","KOSDAQ","췮","7040","50","0.72","7070","8380","7000","2358740","18271294540","61205605120","8693978" +"071200","ǴƮコɾ","KOSDAQ","췮","4130","-200","-4.62","4300","4300","4010","74442","309682385","100757371540","24396458" +"101930","ȭ","KOSDAQ","߰߱","20300","350","1.75","19950","21400","19690","117987","2436453680","195199379900","9615733" +"249420","ϵ","KOSPI",,"13610","-380","-2.72","14000","14070","13500","77059","1050478900","381930638610","28062501" +"000230","ϵȦ","KOSPI",,"7770","-230","-2.88","8000","8000","7680","16389","127324770","89668908000","11540400" +"013360","ϼǼ","KOSPI",,"1335","-52","-3.75","1353","1365","1332","50123","67339856","72123214800","54024880" +"003120","ϼ̿","KOSPI",,"16820","-310","-1.81","17130","17130","16800","5076","86130420","223706000000","13300000" +"333430","Ͻ","KOSDAQ","߰߱","2960","-80","-2.63","3000","3025","2900","43080","127637965","90951171120","30726747" +"068330","ϽŹ̿","KOSDAQ","߰߱","1314","-16","-1.20","1330","1333","1300","171435","224896527","58100007960","44216140" +"003200","ϽŹ","KOSPI",,"8000","-30","-0.37","8030","8060","7910","33116","263415660","186240000000","23280000" +"007110","Ͻż","KOSPI",,"1460","38","2.67","1440","1557","1390","9795830","14461969063","113086650600","77456610" +"007570","Ͼǰ","KOSPI",,"13060","-80","-0.61","13010","13140","12940","34883","454943400","249258771840","19085664" +"007575","Ͼǰ","KOSPI",,"12190","-110","-0.89","12040","12190","12040","221","2671040","5425525200","445080" +"178780","Ͽ","KOSDAQ","(ҼӺξ)","8650","0","0.00","0","0","0","0","0","124120536750","14349195" +"008500","Ǿ","KOSPI",,"12300","-400","-3.15","12720","13100","12300","1543","19600290","14760000000","1200000" +"019540","ũ","KOSDAQ","췮","4250","-85","-1.96","4375","4375","4215","28097","120515810","57432375000","13513500" +"081000","̾","KOSPI",,"12500","-350","-2.72","12740","13120","12450","15047","189086820","177537187500","14202975" +"020760","","KOSPI",,"997","-20","-1.97","1012","1036","997","56191","56438983","51359199777","51513741" +"103590","","KOSPI",,"17200","-310","-1.77","17510","17530","16660","529984","9089154120","820188708000","47685390" +"094820","Ŀ","KOSDAQ","췮","8830","-180","-2.00","8920","9070","8710","39335","347821340","133145000470","15078709" +"271940","ַ̼罺","KOSPI",,"19830","-270","-1.34","20000","20050","19600","27187","536816480","720090557700","36313190" +"015860","Ȧ","KOSPI",,"3690","-30","-0.81","3685","3720","3620","45639","166865935","182092212270","49347483" +"226320","Ѻ","KOSPI",,"11370","-270","-2.32","11650","11690","11300","16348","187113590","249336311550","21929315" +"950140","ױۿ左","KOSDAQ","ܱ(ҼӺξ)","11480","-400","-3.37","11830","12000","11300","140681","1619027630","228083101680","19867866" +"049550","ũũ","KOSDAQ","췮","3910","-70","-1.76","3980","4005","3855","29016","113194420","76660543070","19606277" +"389020","ڶũ","KOSDAQ","","31650","-1950","-5.80","33300","33600","31050","87939","2806031150","196158154500","6197730" +"254120","ں","KOSDAQ","","2040","-95","-4.45","2150","2150","2025","165119","340146450","62738710800","30754270" +"043910","ڿȯ","KOSDAQ","ó","666","-29","-4.17","695","697","663","592877","398630335","75518710362","113391457" +"234920","̱","KOSDAQ","ó","4795","-5","-0.10","4800","5020","4510","24617","117089595","64880713450","13530910" +"289220","̾Ʈ","KOSDAQ","","5950","-250","-4.03","6200","6290","5920","43702","261795060","131624382750","22121745" +"317400","̿ص","KOSPI",,"4030","-25","-0.62","4070","4085","4005","30948","124617500","156293555600","38782520" +"033240","ȭ","KOSPI",,"18220","-560","-2.98","18800","18950","18220","81275","1489865030","403679951400","22155870" +"174880","ũ","KOSDAQ","(ҼӺξ)","2650","0","0.00","0","0","0","0","0","11610352250","4381265" +"049630","翵ַ","KOSDAQ","߰߱","622","-17","-2.66","633","638","617","291410","181694722","52028746866","83647503" +"417840","","KOSDAQ","ó","7330","-410","-5.30","7590","7730","7330","36675","274152300","53136452750","7249175" +"000950","","KOSPI",,"18430","-110","-0.59","18440","19200","18400","1264","23378360","30962400000","1680000" +"079900","Ǽκ","KOSPI",,"16630","-1160","-6.52","18250","18260","16610","366580","6346646470","255446345620","15360574" +"110020","̿","KOSDAQ","","2835","-90","-3.08","2895","3010","2790","45271","130047820","25681590270","9058762" +"208140","ٿ","KOSDAQ","췮","2420","-10","-0.41","2430","2440","2395","104169","251597575","79095875320","32684246" +"040420","̿","KOSDAQ","췮","6420","-30","-0.47","6450","6450","6420","14232","91500550","100649883840","15677552" +"045510","ý","KOSDAQ","߰߱","904","-6","-0.66","900","913","890","8122","7368784","29117199968","32209292" +"217190","ʼ","KOSDAQ","췮","7800","-460","-5.57","8260","8290","7610","71672","558586850","68399557200","8769174" +"095700","ؽ","KOSDAQ","","6080","-190","-3.03","6280","6350","6080","95536","585871460","252384411520","41510594" +"072520","ٹ̿","KOSDAQ","(ҼӺξ)","389","0","0.00","0","0","0","0","0","28849482466","74163194" +"122310","뷹","KOSDAQ","췮","5970","-10","-0.17","5980","6010","5880","42982","255201430","86886448680","14553844" +"361390","","KOSDAQ","췮","12310","-400","-3.15","12490","12730","12090","29505","362286810","92334712590","7500789" +"066830","","KONEX","Ϲݱ","1497","0","0.00","0","0","0","0","0","8483768460","5667180" +"187420","Ŀ","KOSDAQ","","3245","-10","-0.31","3225","3270","3160","72718","232072255","76366528755","23533599" +"225220","","KOSDAQ","ó","2850","-150","-5.00","2950","3045","2835","296325","858486435","54691559850","19190021" +"123330","","KOSDAQ","ó","10720","600","5.93","10550","11600","10000","1205040","13103587610","85424249600","7968680" +"159580","","KOSDAQ","߰߱","3915","-85","-2.13","3955","4010","3855","72225","282695570","78427769940","20032636" +"147830","","KOSDAQ","ó","6100","-180","-2.87","6170","6220","5990","385872","2347074530","122000000000","20000000" +"033100","","KOSDAQ","췮","44750","-2200","-4.69","46700","47000","43850","561578","25274097000","718792802750","16062409" +"079370","콺","KOSDAQ","췮","13130","-690","-4.99","13750","13810","12980","384475","5062889460","407253078700","31016990" +"054950","̺̿","KOSDAQ","췮","19850","-400","-1.98","20100","20500","19720","72520","1441510620","239984356200","12089892" +"023440","̽Ȧ","KOSDAQ","߰߱","1280","-29","-2.22","1309","1309","1262","120917","154148240","75120012800","58687510" +"090470","̽","KOSDAQ","췮","4915","155","3.26","4810","4940","4515","87047","414502170","85897459510","17476594" +"287410","̽ý޵Į","KOSDAQ GLOBAL","췮","12900","0","0.00","12880","12900","12860","54075","697300320","990307599900","76768031" +"137950","̾ɹĮ","KOSDAQ","췮","4925","-185","-3.62","5160","5160","4845","72740","357966785","109668983950","22267814" +"033320","̾ý","KOSDAQ","췮","2920","-100","-3.31","2990","3035","2855","110949","326375050","55814141440","19114432" +"417500","̾ũ","KOSDAQ","ó","3655","70","1.95","3560","3670","3560","99256","360892815","119828239320","32784744" +"348950","̾˱۷ι","KOSPI",,"3620","30","0.84","3600","3620","3580","453822","1628556880","714501120000","197376000" +"204270","̾Ƽ","KOSDAQ","߰߱","15780","-1210","-7.12","16900","16920","15600","773101","12362620060","912848793480","57848466" +"194370","̿۷̼","KOSPI",,"13600","-230","-1.66","13780","13960","13410","31210","424517740","181364173600","13335601" +"026040","̿Ƽ","KOSDAQ","߰߱","1678","-46","-2.67","1724","1725","1678","6707","11399172","27693359620","16503790" +"452160","̿","KOSDAQ","߰߱","6580","-420","-6.00","7000","7050","6470","65896","435997700","63283327660","9617527" +"126880","̱̿۷ι","KOSDAQ","췮","3495","-5","-0.14","3505","3560","3455","80534","281091720","81101135985","23204903" +"322510","̿","KOSDAQ","","11060","-100","-0.90","11060","11400","10570","192755","2091899010","179124574720","16195712" +"254160","̿Ƽ","KONEX","Ϲݱ","2400","100","4.35","2400","2400","2400","10","24000","12384000000","5160000" +"033050","̿","KOSDAQ","߰߱","861","-9","-1.03","861","875","851","29981","25939910","28050813462","32579342" +"094970","̿Ƽ","KOSDAQ","췮","3480","-170","-4.66","3670","3670","3450","148058","517439295","58283875200","16748240" +"418550","̿","KOSDAQ","","15950","-750","-4.49","16700","16730","15820","114309","1836721740","506767754350","31772273" +"025620","ڽƽ","KOSPI",,"5070","-50","-0.98","5120","5120","4955","11419","57281950","22738169220","4484846" +"420570","̹̿","KOSDAQ","ó","17310","-1010","-5.51","18070","18470","16710","49510","862268120","96487930650","5574115" +"089790","Ƽ","KOSDAQ","ó","5330","-200","-3.62","5530","5580","5180","47895","252507180","54981684290","10315513" +"030000","ϱȹ","KOSPI",,"18570","-140","-0.75","18720","18720","18460","250130","4644098710","2136315548250","115041225" +"052670","Ϲ̿","KOSDAQ","(ҼӺξ)","2080","0","0.00","0","0","0","0","0","60588453120","29129064" +"271980","Ͼǰ","KOSPI",,"13690","-320","-2.28","13940","14090","13670","27208","376042360","201309697680","14704872" +"412540","Ͽؿ","KOSDAQ","","10120","-370","-3.53","10490","10920","10110","111614","1159555200","208478729800","20600665" +"001560","Ͽ","KOSPI",,"8440","150","1.81","8490","8490","8210","1554","12913880","83556000000","9900000" +"199820","ϷƮ","KOSDAQ","췮","6630","-360","-5.15","7250","7520","6570","693989","4832697070","147318600000","22220000" +"038010","ũ뽺","KOSDAQ","췮","6370","-320","-4.78","6600","6680","6360","63174","407307810","57330000000","9000000" +"002620","ĸȦ","KOSPI",,"8200","-100","-1.20","8230","8370","8150","4892","40186780","130981511000","15973355" +"276730","ָ","KOSDAQ","","3380","410","13.80","2975","3760","2970","2634839","9092565395","40176724900","11886605" +"080220","ֹݵü","KOSDAQ","췮","11780","-320","-2.64","12100","12140","11610","297705","3510762870","405736572740","34442833" +"006220","","KOSPI",,"8540","-340","-3.83","8750","9070","8540","426866","3743730210","274379729960","32128774" +"089590","װ","KOSPI",,"8960","-80","-0.88","9160","9160","8850","100057","890160950","722543225600","80640985" +"216080","׸","KOSDAQ","","16050","-130","-0.80","16180","16430","15780","25429","405650900","286633081950","17858759" +"229000","ť","KOSDAQ","","2780","-185","-6.24","3140","3320","2675","1150434","3427171185","42378333900","15244005" +"082270","齺","KOSDAQ","ó","10360","50","0.48","10270","10430","10000","172136","1755425340","414339642640","39994174" +"044060","ILI","KOSDAQ","(ҼӺξ)","732","0","0.00","0","0","0","0","0","70075958688","95732184" +"004910","Ʈ","KOSPI",,"6370","140","2.25","6300","6580","6170","33075","206661410","81536000000","12800000" +"004700","","KOSPI",,"56300","600","1.08","56400","56400","54200","807","44503200","374346469400","6649138" +"001550","","KOSPI",,"11110","-220","-1.94","11380","11380","11020","5129","57337190","57685775290","5192239" +"462520","ȭ","KOSPI",,"15990","-290","-1.78","16170","16570","15960","7113","114246770","189564136320","11855168" +"120030","","KOSPI",,"91800","-900","-0.97","92700","93000","90600","1842","169415300","115452361800","1257651" +"034940","","KOSDAQ","߰߱","1379","-20","-1.43","1399","1410","1361","8622","11911373","42721181433","30979827" +"067000","̽Ƽ","KOSDAQ","췮","1677","-61","-3.51","1740","1744","1670","81375","138182713","117228078942","69903446" +"018470","Ͼ˹̴","KOSPI",,"1541","-39","-2.47","1564","1586","1539","321388","498431060","195139482061","126631721" +"002600","","KOSPI",,"176800","1800","1.03","175000","177800","171600","146","25487800","106080000000","600000" +"185750","ٴ","KOSPI",,"110600","-2100","-1.86","112700","114300","109900","38919","4329363600","1457090852000","13174420" +"063160","ٴ̿","KOSPI",,"29800","-1150","-3.72","30850","30900","29400","41189","1223368050","163481667600","5485962" +"001630","ٴȦ","KOSPI",,"55800","-1400","-2.45","57200","57200","55300","1257","69893500","279550243800","5009861" +"033340","","KOSDAQ","߰߱","751","-21","-2.72","763","781","730","283586","212780765","72809869058","96950558" +"036930","ּϾ","KOSDAQ GLOBAL","췮","22800","-550","-2.36","23300","23550","22550","320534","7327636550","1077717718800","47268321" +"109070","ּ۷̼","KOSPI",,"4100","0","0.00","0","0","0","0","0","216521943000","52810230" +"044380","ֿũ","KOSPI",,"384","-1","-0.26","388","390","370","117608","44774794","22732509696","59199244" +"072020","߾ӹ","KOSDAQ","ó","10160","-190","-1.84","10230","10420","10120","25214","257648130","98132259920","9658687" +"000440","߾ӿʺ","KOSDAQ","߰߱","19500","-100","-0.51","19200","19890","19150","71669","1402371860","121429035000","6227130" +"051980","߾÷ܼ","KOSDAQ","߰߱","10140","-470","-4.43","10560","10610","9870","2089164","21242580260","1013109920940","99912221" +"228760","Ʈ","KOSDAQ","","15560","-740","-4.54","16160","16250","15460","172100","2703788740","379077901480","24362333" +"314130","۴","KOSDAQ","","3580","-120","-3.24","3690","3730","3540","195013","698283530","109443721760","30570872" +"013890","","KOSPI",,"18580","10","0.05","18470","18830","18130","176242","3250534600","385260090320","20735204" +"389030","ϳʽ","KOSDAQ","","1525","42","2.83","1482","1534","1453","114180","172044892","50861563625","33351845" +"043610","Ϲ","KOSDAQ","췮","2145","-55","-2.50","2180","2200","2090","82359","175430605","124657614510","58115438" +"263860","Ͼ","KOSDAQ","ó","9710","-290","-2.90","9830","10020","9600","38263","373522600","91707066000","9444600" +"303030","ƽ","KOSDAQ","ó","1322","-69","-4.96","1391","1400","1322","222100","301176495","47255773096","35745668" +"036180","","KOSDAQ","߰߱","550","42","8.27","510","560","510","2701379","1444465370","51405488200","93464524" +"208350","ťƼ","KOSDAQ","ó","3135","155","5.20","3050","3335","3050","151827","486975975","27708851115","8838549" +"289860","","KONEX","Ϲݱ","7400","-100","-1.33","7400","7400","7400","110","814000","128238884600","17329579" +"144510","","KOSDAQ","췮","30600","-400","-1.29","30750","31100","30200","29058","885243750","483490526400","15800344" +"358570","̳뺣̼","KOSDAQ","","12800","-600","-4.48","13400","13400","12320","660634","8432747750","565987980800","44217811" +"382480","","KOSDAQ","ó","2445","-195","-7.39","2640","2650","2425","358648","896038855","96228207300","39357140" +"382800","غ񿡽 ","KOSDAQ","ó","3335","-165","-4.71","3485","3530","3335","191470","651291480","105489521735","31631041" +"299480","コɾ","KONEX","Ϲݱ","489","0","0.00","0","0","0","0","0","5428263327","11100743" +"051160","Ʈ","KOSDAQ","췮","10320","-380","-3.55","10750","10780","10240","73664","763430300","159696117600","15474430" +"053050","","KOSDAQ","췮","3440","-60","-1.71","3495","3565","3430","945426","3300845915","103157333680","29987597" +"388610","","KONEX","Ϲݱ","16500","390","2.42","0","0","0","0","0","50895537000","3084578" +"119850","","KOSDAQ","췮","5310","-170","-3.10","5480","5570","5260","98819","525745770","87343706790","16448909" +"065060","","KOSDAQ","߰߱","338","-6","-1.74","344","346","330","138157","46103845","36506718872","108008044" +"204840","","KOSDAQ","","1011","-1","-0.10","1001","1032","1001","84991","85914882","77543087334","76699394" +"013870","ڸ","KOSPI",,"3900","75","1.96","3825","4035","3825","38797","152249420","74381892000","19072280" +"071320","","KOSPI",,"49650","-1350","-2.65","51200","51200","48750","12210","603126450","574884639600","11578744" +"270520","","KOSDAQ","ó","1250","-35","-2.72","1285","1320","1235","988871","1243531519","198488482500","158790786" +"311320","Ʈ","KOSDAQ","","6940","-300","-4.14","7250","7250","6860","27780","193452920","87545046400","12614560" +"388050","Ŀ","KOSDAQ","߰߱","6120","-170","-2.70","6240","6330","6030","165806","1021692410","114501754440","18709437" +"088790","","KOSPI",,"1892","64","3.50","1809","2010","1804","346506","668758137","23551131648","12447744" +"018120","ιȿ","KOSDAQ","췮","17240","-160","-0.92","17400","17400","17070","2165","37221360","114148108800","6621120" +"109820","Ʈ","KOSDAQ","","2840","-135","-4.54","2945","2995","2815","268839","771287930","57917937600","20393640" +"086060","̿","KOSDAQ","߰߱","3380","-120","-3.43","3520","3520","3355","75764","258380860","29103784060","8610587" +"036890","Ƽ̾","KOSDAQ","췮","7910","-70","-0.88","7900","8060","7730","45880","361228510","177834739880","22482268" +"363250","ý","KOSDAQ","","9340","-460","-4.69","9740","9890","9260","60507","575281050","65440625940","7006491" +"003780","","KOSPI",,"6290","60","0.96","6230","6390","6140","37791","234467650","81770000000","13000000" +"007370","","KOSDAQ","췮","5120","-120","-2.29","5190","5250","5030","185040","949190490","63138001920","12331641" +"010640","","KOSPI",,"6200","10","0.16","6180","6230","6100","11744","72101110","62000000000","10000000" +"100250","Ȧ","KOSPI",,"3160","-5","-0.16","3175","3175","3125","17558","55140145","176629122720","55895292" +"051630","ȭ","KOSPI",,"2785","-45","-1.59","2935","2935","2770","15773","44281935","44003000000","15800000" +"272450","","KOSPI",,"10230","-280","-2.66","10510","10600","10180","98918","1014406390","534006000000","52200000" +"285800","","KOSDAQ","ó","2365","-115","-4.64","2445","2470","2325","92349","217763910","41333743550","17477270" +"011000","","KOSPI",,"2510","-75","-2.90","2640","2640","2480","339792","851333975","200897977850","80039035" +"250030","ڽ","KONEX","Ϲݱ","4200","200","5.00","4200","4300","4000","160","645990","10875215400","2589337" +"002780","","KOSPI",,"824","-6","-0.72","836","838","820","65397","54108989","119868717880","145471745" +"002787","2B","KOSPI",,"11680","-50","-0.43","11680","11680","11410","98","1130670","3443357440","294808" +"002785","B","KOSPI",,"4030","-170","-4.05","4200","4200","4010","1105","4453390","3454588540","857218" +"233990","","KONEX","Ϲݱ","444","-6","-1.33","465","465","400","17524","7060458","6555614712","14764898" +"085660","̿","KOSDAQ","߰߱","16120","-390","-2.36","16370","16430","15750","260650","4176182960","907788821160","56314443" +"261780","ſ","KOSDAQ","","4050","-80","-1.94","4055","4085","3940","100711","403092935","108640229400","26824748" +"009310","Ͼ","KOSPI",,"397","-4","-1.00","407","407","389","113109","44922180","33692365343","84867419" +"094850","","KOSDAQ","߰߱","5000","-120","-2.34","5070","5140","4990","18437","92480355","70000000000","14000000" +"004650","âؿź","KOSDAQ","߰߱","9320","-90","-0.96","9400","9400","9250","9680","90093620","85659048200","9190885" +"278280","õ","KOSDAQ","췮","55300","-3400","-5.79","59700","59700","55000","23647","1332691900","553000000000","10000000" +"000650","õϰ","KOSPI",,"41400","-100","-0.24","41400","43050","41100","717","29917200","59169708000","1429220" +"362320","û۷ι","KOSDAQ","߰߱","6060","-270","-4.27","6280","6360","5950","201416","1223535450","124540817400","20551290" +"012600","ûȣICT","KOSPI",,"2490","0","0.00","0","0","0","0","0","116119947330","46634517" +"066360","üη","KOSDAQ","߰߱","828","-15","-1.78","843","843","820","44122","36506554","39704268420","47952015" +"033250","üý","KOSPI",,"1202","-16","-1.31","1218","1229","1199","87634","106004034","38464000000","32000000" +"047820","ʷϹ̵","KOSDAQ","(ҼӺξ)","5400","0","0.00","0","0","0","0","0","132051222000","24453930" +"094360","Ĩع̵","KOSDAQ","ó","13560","-320","-2.31","13760","14350","13510","187855","2606455430","282361561440","20823124" +"016920","ī","KOSDAQ","߰߱","1200","-22","-1.80","1201","1240","1196","21179","25628393","31792245600","26493538" +"284620","ī̳뽺޵","KOSDAQ","","3900","15","0.39","3970","3970","3800","41133","158830035","109905092700","28180793" +"446600","ī̹̿","KONEX","Ϲݱ","6340","0","0.00","0","0","0","0","0","6221321540","981281" +"035720","īī","KOSPI",,"34000","-450","-1.31","34450","34700","33850","1105965","37715576000","15078722662000","443491843" +"293490","īī","KOSDAQ GLOBAL","췮","16900","-190","-1.11","17120","18150","16900","411696","7161682390","1397072164800","82666992" +"323410","īīũ","KOSPI",,"20250","-250","-1.22","20500","20650","20150","410138","8339579150","9658513649250","476963637" +"377300","īī","KOSPI",,"23100","-350","-1.49","23400","23500","22650","173180","3976991000","3109311720900","134602239" +"140430","īƼ","KOSDAQ","ó","4350","-5","-0.11","4380","4650","4140","2468969","10916473285","77964819450","17922947" +"042000","ī24","KOSDAQ","","28000","-450","-1.58","28450","28800","27200","374472","10470357750","679085512000","24253054" +"006380","ī","KOSPI",,"3660","0","0.00","0","0","0","0","0","618539985360","168999996" +"313760","ij","KOSDAQ","ȯ(ҼӺξ)","5290","360","7.30","4720","5870","4635","652918","3438698120","38558180490","7288881" +"317530","ijƮ","KOSDAQ","","3080","-75","-2.38","3155","3190","3005","17945","55017710","21471283680","6971196" +"071850","ijڸ","KOSDAQ","߰߱","2105","-100","-4.54","2205","2250","2040","47738","101494290","51633940740","24529188" +"050110","ķý","KOSDAQ","߰߱","1060","41","4.02","1000","1214","1000","10818453","12300842002","78253565080","73824118" +"452300","ĸƮʽ","KOSDAQ","߰߱","2930","-70","-2.33","3000","3025","2890","126205","370057360","41302393400","14096380" +"119860","ĿƮ̺","KOSDAQ","췮","18000","0","0.00","0","0","0","0","0","811186632000","45065924" +"451760","","KOSDAQ","","7820","-320","-3.93","8030","8200","7720","63965","503268510","116834522320","14940476" +"900310","÷","KOSDAQ","ܱ(ҼӺξ)","644","-4","-0.62","641","652","632","35501","22752804","41242838700","64041675" +"078340","","KOSDAQ GLOBAL","췮","36700","-200","-0.54","36700","37100","36450","40062","1473286100","467475608500","12737755" +"063080","Ȧ","KOSDAQ","߰߱","21200","-1550","-6.81","22400","23000","20650","48269","1055865800","139818070400","6595192" +"307930","۴","KOSDAQ","߰߱","4840","-80","-1.63","4900","4975","4755","56894","275244205","75552400000","15610000" +"079190","ɽǿ","KOSDAQ","ó","583","5","0.87","578","586","547","331454","187116521","22361264662","38355514" +"263700","ɾ","KOSDAQ","߰߱","3045","-45","-1.46","2980","3140","2945","69501","208437785","59116239000","19414200" +"214370","ɾ","KOSDAQ","ó","15850","-610","-3.71","16620","16620","15760","98412","1570841950","851382750000","53715000" +"221980","̵","KOSDAQ","췮","12860","-170","-1.30","12960","13020","12720","954","12213940","51887528000","4034800" +"038530","̹̿","KOSDAQ","߰߱","257","-11","-4.10","269","271","255","792043","206532635","29738587179","115714347" +"001620","̵̺Ǿ","KOSPI",,"566","1","0.18","562","566","550","239695","132714390","62991855546","111293031" +"424140","̺21ȣ","KOSDAQ","SPAC(ҼӺξ)","2165","0","0.00","0","0","0","0","0","16692150000","7710000" +"192250","̻","KOSDAQ","ó","994","-48","-4.61","1042","1064","993","438285","442039567","70247229458","70671257" +"431190","̾","KOSDAQ","","8130","-140","-1.69","8500","9060","8100","933732","8008546780","60864773460","7486442" +"029460","̾","KOSPI",,"17050","-280","-1.62","17400","17400","16690","27790","469424540","231096450200","13554044" +"115500","̾","KOSDAQ","߰߱","5760","-340","-5.57","6170","6170","5730","205063","1212477350","69120000000","12000000" +"281820","̾","KOSPI",,"30450","-450","-1.46","30350","31000","29550","161041","4848586150","635234380200","20861556" +"089150","̾Ƽ","KOSDAQ","߰߱","2015","-55","-2.66","2070","2085","1998","30696","61682969","34557250000","17150000" +"025880","̾ǵ","KOSDAQ","߰߱","2390","-40","-1.65","2405","2435","2350","33394","79544400","39950900620","16715858" +"093320","̾̿","KOSDAQ","췮","66600","-1300","-1.91","67300","69700","66200","9308","623074600","325008000000","4880000" +"093640","̾˿","KOSDAQ","ó","5320","-190","-3.45","5670","5700","5300","49098","264722290","173069415400","32531845" +"073010","̿","KOSDAQ","췮","3500","-160","-4.37","3625","3710","3355","1346956","4674307690","140669375000","40191250" +"105330","̿","KOSDAQ","췮","4940","-150","-2.95","5120","5130","4730","44076","213644425","79336538320","16060028" +"053080","̿","KOSDAQ","췮","16250","-860","-5.03","17320","18120","16250","761588","12967144340","211246863750","12999807" +"199430","̿˽ý","KOSDAQ","","7950","-560","-6.58","8440","8570","7950","58684","476593140","86398318350","10867713" +"432470","̿","KOSDAQ","ó","14140","-680","-4.59","14800","15000","14080","60902","879330630","122658221840","8674556" +"272110","̿","KOSDAQ","췮","14270","-650","-4.36","14810","15670","14210","62211","897061230","114236986650","8005395" +"039420","̿","KOSDAQ","߰߱","2595","-30","-1.14","2625","2645","2555","35335","91919140","62681524350","24154730" +"083550","̿","KOSDAQ","췮","3180","-170","-5.07","3440","3440","3180","146790","482015275","39350038680","12374226" +"032500","̿","KOSDAQ","߰߱","6860","-340","-4.72","7150","7160","6790","178168","1233784230","273171257380","39820883" +"225430","̿","KOSDAQ","ó","757","-6","-0.79","763","763","752","14121","10666410","21110496850","27887050" +"102370","̿","KOSDAQ","","4525","225","5.23","4565","4700","4125","4895287","21689068255","123212175250","27229210" +"068100","̿","KOSDAQ","","4490","-145","-3.13","4600","4600","4300","245060","1083656705","44628866860","9939614" +"381970","ī","KOSPI",,"13050","-140","-1.06","13200","13230","12940","45366","592208380","628776052650","48182073" +"145270","ž","KOSPI",,"1024","0","0.00","1030","1030","1000","250484","253062713","49214232576","48060774" +"036030","Ƽ","KOSDAQ","췮","3730","-120","-3.12","3805","3850","3700","94929","355132990","182841925590","49019283" +"064820","","KOSDAQ","췮","4500","-100","-2.17","4555","4665","4460","112641","511840510","139057776000","30901728" +"256940","ǿ","KOSDAQ","ó","5400","-160","-2.88","5510","5580","5270","61439","330078670","101242753200","18748658" +"024880","ǿ","KOSDAQ","췮","4000","-125","-3.03","4150","4150","3950","167559","669144095","82731192000","20682798" +"042040","ǿũ","KOSDAQ","߰߱","307","-5","-1.60","312","314","304","119529","36714419","53559501519","174460917" +"054410","Ƽ","KOSDAQ","ó","4195","-35","-0.83","4190","4225","4185","2928","12264685","24022432580","5726444" +"258610","Ϸ","KOSDAQ","߰߱","1830","-64","-3.38","1880","1885","1804","196699","361246205","49020453390","26787133" +"274090","ھƿν̽","KOSDAQ","","11040","-90","-0.81","11130","11180","10770","43678","479549410","142562015040","12913226" +"402420","̽","KONEX","Ϲݱ","11990","620","5.45","11990","11990","11990","3","35970","26696214600","2226540" +"089010","Ʈδн","KOSDAQ","췮","20300","-550","-2.64","20700","20900","20050","122142","2484960850","311287223800","15334346" +"220260","Ʈν","KOSDAQ","췮","4940","-190","-3.70","5090","5240","4895","81602","409561705","131198036580","26558307" +"176590","ڳ","KONEX","Ϲݱ","9280","80","0.87","9330","9330","9200","3746","34555320","54040530240","5823333" +"052400","ڳ","KOSDAQ","췮","14950","-200","-1.32","15160","15190","14740","14340","213781420","222754985050","14899999" +"402030","ڳũ","KOSDAQ","","13140","-610","-4.44","13760","13990","12950","16915","223208270","150080980320","11421688" +"391710","ڴп̼","KOSDAQ","߰߱","2155","-115","-5.07","2225","2265","2135","174877","380910925","89439443410","41503222" +"046070","ڴ","KOSDAQ","(ҼӺξ)","257","0","0.00","0","0","0","0","0","10996016392","42786056" +"047770","ڵĹ","KOSDAQ","߰߱","1425","-75","-5.00","1504","1723","1413","11976745","18996879906","53925707850","37842602" +"080530","ڵ","KOSDAQ","ó","1548","-155","-9.10","1702","1702","1542","147980","233794367","67029060996","43300427" +"417310","ڶڴ","KOSPI",,"5100","60","1.19","5120","5120","5030","17160","86819370","206040000000","40400000" +"357120","ڶڶ","KOSPI",,"4705","45","0.97","4660","4705","4615","208066","968027165","416554700170","88534474" +"104540","ڷ","KOSDAQ","","6500","-300","-4.41","6790","6790","6480","9915","64935690","83107310000","12785740" +"027050","ڸƳ","KOSDAQ","߰߱","2605","-95","-3.52","2660","2705","2580","375182","981715925","104200000000","40000000" +"007815","ڸƽ","KOSPI",,"5820","-120","-2.02","5940","5940","5610","2954","16756120","17254495800","2964690" +"007810","ڸƽŰƮ","KOSPI",,"10200","-280","-2.67","10400","10540","10070","79979","816820700","240931660200","23620751" +"00781K","ڸƽŰƮ2B","KOSPI",,"5900","-200","-3.28","6100","6100","5810","1950","11500520","4623824100","783699" +"190650","ڸƿ","KOSDAQ","췮","5960","-180","-2.93","6160","6270","5960","58587","358013720","38072480000","6388000" +"123410","ڸƿƼ","KOSDAQ","췮","5850","-420","-6.70","6210","6220","5750","1175640","6955708410","162870224400","27841064" +"003690","ڸȸ","KOSPI",,"8470","-120","-1.40","8530","8580","8460","84694","718512340","1400662945220","165367526" +"036690","ڸƽ","KOSDAQ","(ҼӺξ)","2885","0","0.00","0","0","0","0","0","45885746130","15904938" +"049430","ڸ޷","KOSDAQ","췮","9320","40","0.43","9190","9340","9060","21635","198476510","84327360000","9048000" +"183300","ڹ","KOSDAQ GLOBAL","췮","56500","100","0.18","56000","56800","54700","100351","5597547600","591028646000","10460684" +"041960","ڹ","KOSDAQ","ó","3975","-45","-1.12","4035","4050","3920","46036","182046940","280723376175","70622233" +"089890","ڼ","KOSDAQ","췮","8840","-160","-1.78","8950","9080","8690","111524","985652260","146611064080","16584962" +"360350","ڼ","KOSDAQ","","8340","-660","-7.33","9200","9300","8280","211193","1827807280","47304229800","5671970" +"189350","ڼ","KONEX","Ϲݱ","1897","247","14.97","1403","1897","1403","11","15927","9105600000","4800000" +"082660","ڽ","KOSDAQ","ȯ(ҼӺξ)","480","0","0.00","0","0","0","0","0","47827617120","99640869" +"192820","ڽƽ","KOSPI",,"118900","-1400","-1.16","120700","121500","117300","81132","9659390600","1349456620100","11349509" +"044820","ڽƽƼ","KOSPI",,"8650","-150","-1.70","8800","8800","8530","4383","37834220","83073916650","9603921" +"222040","ڽƽƼ","KOSDAQ","߰߱","2965","-85","-2.79","3085","3170","2930","66489","200524785","61162020000","20628000" +"241710","ڽīڸ","KOSDAQ","췮","81800","-1200","-1.45","83000","83200","77900","193287","15504846400","873624000000","10680000" +"005070","ڽż","KOSPI",,"103400","-8400","-7.51","111100","113200","102800","219139","23285829700","3361612170400","32510756" +"005420","ڽȭ","KOSPI",,"18660","-1140","-5.76","19800","19900","18600","179687","3418637420","716697534480","38408228" +"355150","ڽؽý","KOSDAQ","ó","8290","-190","-2.24","8260","8370","8100","17412","143010650","64640031500","7797350" +"169670","ڽؽý","KONEX","Ϲݱ","11840","-50","-0.42","11790","12020","11410","318","3695410","33961867840","2868401" +"071950","ھƽ","KOSPI",,"1070","0","0.00","0","0","0","0","0","35210713630","32907209" +"166480","ھƽͿ","KOSDAQ","ó","10630","-370","-3.36","10870","11050","10350","106718","1141468040","349412096880","32870376" +"045970","ھƽþ","KOSDAQ","߰߱","5350","-350","-6.14","5790","5790","5330","189365","1029063580","140784586600","26314876" +"196450","ھƽþƾ","KOSDAQ","߰߱","1100","-24","-2.14","1167","1167","1100","29898","33343174","49851540200","45319582" +"384470","ھμƮ","KOSDAQ","","7000","-350","-4.76","7350","7350","6950","45798","322894090","89824448000","12832064" +"029960","ڿ","KOSDAQ","췮","7180","-30","-0.42","7210","7230","7070","53221","379435210","359000000000","50000000" +"002020","ڿ","KOSPI",,"14700","-170","-1.14","14860","14950","14530","20935","306763730","185608462200","12626426" +"138490","ڿENP","KOSPI",,"5790","-30","-0.52","5800","5880","5660","37004","212713590","220020000000","38000000" +"003070","ڿձ۷ι","KOSPI",,"9500","-460","-4.62","9800","9960","9500","60122","578632920","179860773500","18932713" +"003075","ڿձ۷ι","KOSPI",,"16560","-1130","-6.39","17110","17110","16560","18702","312732810","12266604720","740737" +"450140","ڿոƼ׷","KOSPI",,"2420","-100","-3.97","2460","2520","2415","80540","196677550","151920945000","62777250" +"45014K","ڿոƼ׷","KOSPI",,"4125","-45","-1.08","4170","4290","4085","1035","4257275","10131495000","2456120" +"102940","ڿջ","KOSDAQ","߰߱","18740","-600","-3.10","19610","19610","18500","20049","377477490","232814272380","12423387" +"002025","ڿտ","KOSPI",,"12790","-20","-0.16","13280","13280","12630","1518","19339740","13767028100","1076390" +"120110","ڿδ","KOSPI",,"32550","-1050","-3.13","33400","33500","32550","79424","2609393900","895746412050","27519091" +"120115","ڿδ","KOSPI",,"21400","-200","-0.93","21550","21550","21300","2090","44694500","59232204000","2767860" +"950160","ڿƼ","KOSDAQ","ܱ(ҼӺξ)","13890","-370","-2.59","14190","14220","13430","176631","2422645190","1103788434900","79466410" +"021240","ڿ","KOSPI",,"66200","500","0.76","66400","66800","64500","307400","20305257630","4885534777800","73799619" +"033290","м","KOSDAQ","췮","2045","-50","-2.39","2135","2135","2035","78906","162133535","114839635545","56156301" +"056360","","KOSDAQ","췮","4585","-115","-2.45","4700","4800","4560","29092","134526255","44918328000","9796800" +"282880","ũ","KOSDAQ","췮","13500","-480","-3.43","13980","14120","13500","38776","528451810","150414394500","11141807" +"121850","","KOSDAQ","ó","820","-34","-3.98","845","859","815","115110","95469803","25103623500","30614175" +"448710","ũ","KOSDAQ","ó","16420","-790","-4.59","17150","17150","16420","62751","1044823410","84826852980","5166069" +"126730","Ĩ","KOSDAQ","ó","11000","-850","-7.17","11820","11990","11000","61112","695648430","93538060000","8503460" +"015710","","KOSDAQ","߰߱","3345","-55","-1.62","3435","3435","3320","14317","47909625","58639522500","17530500" +"052330","","KOSDAQ","췮","7330","-170","-2.27","7470","7530","7300","54610","402751930","114161466160","15574552" +"322780","۽ڸ","KOSDAQ","߰߱","694","-6","-0.86","693","774","661","1936410","1384297576","26325233422","37932613" +"036420","Ʈ߾","KOSPI",,"9590","-240","-2.44","9880","9940","9590","17865","172517770","184725533720","19262308" +"200130","ݸؿġ","KOSDAQ GLOBAL","췮","14620","-430","-2.86","15200","15200","14620","73109","1076837690","430055457960","29415558" +"024720","ݸȦ","KOSPI",,"7520","-180","-2.34","7680","7780","7440","88204","666345390","257907867680","34296259" +"031820","ؽý","KOSPI",,"547","-22","-3.87","564","567","547","399577","222696386","66215151902","121051466" +"294570","","KOSDAQ","ó","14560","-770","-5.02","15070","15310","14300","37651","550429820","149308213600","10254685" +"192400","Ȧ","KOSPI",,"24600","-350","-1.40","24700","24950","24200","21030","514943000","874829751000","35562185" +"284740","Ȩý","KOSPI",,"21350","-650","-2.95","21950","22100","21100","22462","481071100","479036995500","22437330" +"317690","ŸƮ","KOSDAQ","","9610","-690","-6.70","10130","10220","9400","795906","7727047180","158924519710","16537411" +"078940","ŸǾ","KOSDAQ","(ҼӺξ)","2855","0","0.00","0","0","0","0","0","151584163690","53094278" +"227100","ҿ","KOSDAQ","ȯ(ҼӺξ)","730","-102","-12.26","815","839","709","1883567","1461082787","11446848220","15680614" +"432720","Ÿݵü","KOSDAQ","","8890","-540","-5.73","9430","9430","8840","150889","1358108240","121071060880","13618792" +"456190","ť","KONEX","Ϲݱ","16800","0","0.00","0","0","0","0","0","29472004800","1754286" +"365270","ťŬ","KOSDAQ","","5410","-200","-3.57","5700","5710","5310","71421","386156650","75058166880","13873968" +"348080","ťƼ","KOSDAQ","ȯ(ҼӺξ)","820","-29","-3.42","884","884","797","405714","331355502","34564648200","42152010" +"086460","ť","KONEX","Ϲݱ","3845","105","2.81","4280","4280","3180","5","18765","11301993000","2939400" +"060280","ť","KOSDAQ","߰߱","7050","-290","-3.95","7380","7380","6840","160825","1136577390","289684429500","41089990" +"372320","ťμ","KOSDAQ","","28400","-100","-0.35","28700","29100","27550","62550","1758435100","400159550000","14090125" +"051780","ťȦ","KOSDAQ","ȯ(ҼӺξ)","227","-4","-1.73","232","235","221","123991","28383204","30967896150","136422450" +"115180","ťƮ","KOSDAQ","ó","4140","70","1.72","4070","4160","3885","95263","383494070","133691657940","32292671" +"445680","ť̿ý","KOSDAQ","","18660","-1010","-5.13","19600","19600","18250","253096","4725106000","299806264080","16066788" +"182360","ť꿣","KOSDAQ","췮","13800","-150","-1.08","13950","14030","13700","72138","995792510","201087486600","14571557" +"405100","ťƼ","KOSDAQ","ó","12960","-540","-4.00","13410","13540","12950","62610","823737510","159269340960","12289301" +"066310","ť","KOSDAQ","߰߱","6980","-100","-1.41","7010","7110","6850","21184","147858810","64715914580","9271621" +"136660","ť","KONEX","Ϲݱ","649","1","0.15","700","700","551","117","66142","6129026200","9443800" +"016600","ťijŻ","KOSDAQ","߰߱","291","-2","-0.68","294","294","287","148593","42965341","51869909592","178247112" +"355390","ũ","KOSDAQ","","12750","0","0.00","12750","13100","12110","34970","435016590","52939275000","4152100" +"264900","ũ","KOSPI",,"8300","-140","-1.66","8330","8440","8250","34700","288753190","103947955000","12523850" +"26490K","ũ","KOSPI",,"9840","10","0.10","9810","10010","9710","2305","22675950","7611830400","773560" +"005740","ũȦ","KOSPI",,"5700","-60","-1.04","5720","5780","5650","28218","160739000","84629877900","14847347" +"005745","ũȦ","KOSPI",,"9100","-50","-0.55","9250","9250","8010","706","6094920","5466606600","600726" +"259960","ũ","KOSPI",,"323000","-1000","-0.31","327000","334500","319000","101574","32959967704","15469769106000","47894022" +"096240","ũ","KOSDAQ","췮","15150","-200","-1.30","15430","15450","15000","31120","472189190","168743427000","11138180" +"040350","ũ","KOSDAQ","߰߱","817","-7","-0.85","824","837","785","262233","211572035","119776638761","146605433" +"215570","ũγؽ","KONEX","Ϲݱ","598","2","0.34","600","600","543","842","460264","3036678086","5078057" +"110790","ũؾ","KOSDAQ","췮","6740","0","0.00","6700","7010","6480","26193","173327410","157924670400","23430960" +"900250","ũŻż","KOSDAQ","ܱ(ҼӺξ)","844","-31","-3.54","875","879","842","349811","298339701","110260163376","130640004" +"045520","ũػ̾","KOSDAQ","߰߱","5130","-140","-2.66","5200","5270","5120","4838","25018560","33345000000","6500000" +"036170","Ŭ忡","KOSDAQ","߰߱","940","-3","-0.32","943","948","899","50367","45885613","57683688440","61365626" +"214150","Ŭý","KOSDAQ GLOBAL","췮","53400","2000","3.89","51000","54200","51000","323933","17200303700","3417574314600","63999519" +"352770","Ŭͽ","KOSDAQ","","1008","-37","-3.54","1015","1050","984","252590","252412575","39197201904","38886113" +"237880","Ŭ","KOSDAQ","췮","30000","-1050","-3.38","30900","31100","30000","56062","1700846400","542140590000","18071353" +"139670","Ű׸","KOSDAQ","߰߱","2660","-185","-6.50","2820","2860","2550","43723","118701170","37556034600","14118810" +"020120","ŰٸƩ","KOSPI",,"3355","-40","-1.18","3365","3420","3290","77008","255788850","124348934930","37063766" +"413600","Ű6ȣ","KOSDAQ","SPAC(ҼӺξ)","2685","-105","-3.76","2755","2800","2560","497179","1332040715","9209550000","3430000" +"433530","Ű7ȣ","KOSDAQ","SPAC(ҼӺξ)","2460","0","0.00","0","0","0","0","0","10098300000","4105000" +"446840","Ű8ȣ","KOSDAQ","SPAC(ҼӺξ)","2185","0","0.00","2190","2190","2160","193","418485","12847800000","5880000" +"039490","Ű","KOSPI",,"131900","-2700","-2.01","136000","136000","131500","50624","6735912500","3366972521400","25526706" +"054780","Ű̽Ʈ","KOSDAQ","߰߱","4425","-95","-2.10","4500","4570","4405","22088","98180360","86498984025","19547793" +"336040","Ÿ","KONEX","Ϲݱ","4580","-800","-14.87","5360","5360","4580","3042","14199655","19300600900","4214105" +"219130","Ÿ̰Ϸ","KOSDAQ","߰߱","18690","-810","-4.15","19160","19370","18110","84155","1552463460","118014080100","6314290" +"346010","Ÿ̵","KONEX","Ϲݱ","2000","100","5.26","2000","2000","2000","10","20000","9720124000","4860062" +"318660","Ÿӱ","KONEX","Ϲݱ","3000","-295","-8.95","3295","3295","3000","1431","4481485","6456303000","2152101" +"434190","Żν","KONEX","Ϲݱ","5550","160","2.97","5600","5600","5200","19","104840","40900358700","7369434" +"360070","žƼ","KOSDAQ","ó","36450","-1200","-3.19","37600","38400","36250","28129","1042026950","294397282350","8076743" +"180060","ž","KONEX","Ϲݱ","7990","0","0.00","7980","8000","7900","254","2026140","74687851340","9347666" +"065130","žϾ","KOSDAQ","߰߱","4025","-155","-3.71","4130","4180","4025","34637","140862780","69189677550","17189982" +"134580","žڹ̵","KOSDAQ","߰߱","2220","5","0.23","2205","2225","2170","12259","26991915","48897202740","22025767" +"014580","°","KOSPI",,"4235","-145","-3.31","4380","4395","4215","79959","340453880","116814428500","27583100" +"015890","°","KOSPI",,"5140","-100","-1.91","5270","5280","5100","19236","99170390","150235775000","29228750" +"006890","°ɹ","KOSPI",,"10260","-380","-3.57","10650","10700","10000","25828","266732590","119016000000","11600000" +"023160","±","KOSDAQ","췮","12990","-170","-1.29","12960","13280","12670","353994","4588959870","344235000000","26500000" +"003240","±","KOSPI",,"584000","-4000","-0.68","588000","589000","581000","549","320897000","650225600000","1113400" +"011280","¸","KOSPI",,"2225","-65","-2.84","2300","2310","2225","38497","86692280","157543216500","70805940" +"323280","¼","KOSDAQ","߰߱","17450","890","5.37","17770","18430","16800","1523786","26788492900","450571738500","25820730" +"053620","¾","KOSDAQ","(ҼӺξ)","6050","-50","-0.82","6150","6150","5950","5430","32491480","52030000000","8600000" +"052960","¾3C","KONEX","Ϲݱ","3900","100","2.63","3900","3900","3900","1","3900","19059604200","4887078" +"004100","¾ݼ","KOSPI",,"2895","-20","-0.69","2890","2965","2840","317838","921629085","106246500000","36700000" +"004105","¾ݼӿ","KOSPI",,"4520","0","0.00","4520","4520","4480","13727","61934865","14916000000","3300000" +"116100","¾","KONEX","Ϲݱ","1675","-13","-0.77","1435","1675","1435","195","280065","10451976550","6239986" +"009410","¿Ǽ","KOSPI",,"4620","0","0.00","0","0","0","0","0","1318870272720","285469756" +"009415","¿Ǽ","KOSPI",,"7130","0","0.00","0","0","0","0","0","4634314620","649974" +"044490","¿","KOSDAQ","췮","12900","-400","-3.01","13400","13400","12800","86433","1117319930","258095214900","20007381" +"124560","¿","KOSDAQ","췮","2915","-65","-2.18","2965","3015","2915","167405","491952160","111984342360","38416584" +"001420","¿","KOSPI",,"3640","-50","-1.36","3610","3645","3585","3711","13399695","27664000000","7600000" +"191420","װ̾","KOSDAQ","ó","15580","-440","-2.75","15950","16490","15380","16975","263572400","126335633720","8108834" +"073640","׶̾","KOSDAQ","(ҼӺξ)","654","0","0.00","0","0","0","0","0","62514162216","95587404" +"066700","׶ؽ","KOSDAQ","췮","3365","-85","-2.46","3470","3485","3330","88735","299479535","109276473775","32474435" +"095610","׽","KOSDAQ","췮","16380","-360","-2.15","16670","16840","16200","113082","1852382630","323803541880","19768226" +"055490","ѽ","KOSPI",,"17460","-720","-3.96","18100","18350","16910","19256","337903320","83278089000","4769650" +"308700","ũ","KONEX","Ϲݱ","199","0","0.00","0","0","0","0","0","796000000","4000000" +"064520","ũ","KOSDAQ","߰߱","2610","-80","-2.97","2690","2690","2570","14886","38690895","58336271820","22351062" +"089030","ũ","KOSDAQ","췮","31700","-1500","-4.52","32700","33000","30900","1027687","32730488750","1184110546500","37353645" +"258050","ũƮ","KONEX","Ϲݱ","599","0","0.00","599","599","599","1","599","5986550958","9994242" +"054450","ڷĨ","KOSDAQ","췮","12670","-370","-2.84","12990","13780","12650","201005","2629228520","191877432110","15144233" +"078000","ڿ","KOSPI",,"9780","10","0.10","9890","9890","9700","3426","33310560","90367953060","9240077" +"200230","RF","KOSDAQ","߰߱","614","-10","-1.60","624","626","601","181400","110432635","73833644290","120250235" +"214420","ϸ","KOSPI",,"8270","-410","-4.72","8560","8700","8140","227109","1889690730","198933187730","24054799" +"393210","丶ý","KOSDAQ","","5990","-460","-7.13","6400","6520","5920","382805","2334096220","93531118560","15614544" +"215480","ڽڸ","KOSDAQ","߰߱","2785","-20","-0.71","2805","2815","2720","10973","30133940","26179000000","9400000" +"051360","","KOSDAQ","ó","18910","840","4.65","18760","19350","18190","262792","4938956140","305719066780","16167058" +"045340","ŻƮ","KOSDAQ","ó","4695","5","0.11","4690","4730","4605","12260","56950595","40179997800","8558040" +"108230","","KOSDAQ","ó","5960","-10","-0.17","6080","6100","5880","41493","245310150","226618540200","38023245" +"079970","Ʈ","KOSDAQ","ȯ(ҼӺξ)","1349","-16","-1.17","1365","1395","1334","57859","78190967","12532884500","9290500" +"199800","","KOSDAQ","","54400","-6400","-10.53","60000","60000","52900","156717","8725741000","432307443200","7946828" +"417790","Ʈ翣","KOSDAQ","ó","8980","-300","-3.23","9280","9280","8910","15380","138362860","98776857000","10999650" +"290090","Ʈ","KOSDAQ","ó","7910","-320","-3.89","8270","8280","7910","3658","29279680","58757599880","7428268" +"026150","ƯǼ","KOSDAQ","߰߱","5680","-100","-1.73","5730","5810","5640","50442","286827090","99663160080","17546331" +"464280","Ƽ𿡽","KOSDAQ","߰߱","30750","-2300","-6.96","33400","34700","30300","716374","23094977900","170047500000","5530000" +"322180","Ƽ","KOSDAQ","߰߱","5110","-140","-2.67","5320","5470","5060","68679","354601330","84414517250","16519475" +"117730","Ƽκƽ","KOSDAQ","ó","7950","-500","-5.92","8370","8440","7950","87455","704753220","141804627000","17837060" +"033830","Ƽ","KOSDAQ","߰߱","700","-15","-2.10","715","715","697","84019","58841071","70000000000","100000000" +"057680","Ƽ̾Ƽ","KOSDAQ","ó","880","-22","-2.44","880","899","862","72158","63198436","62698680880","71248501" +"204610","Ƽ","KOSDAQ","ó","1185","16","1.37","1170","1189","1142","294870","344425730","75664288200","63851720" +"064760","Ƽ","KOSDAQ GLOBAL","췮","90300","-900","-0.99","92200","92200","89400","48748","4395164000","1054252500000","11675000" +"246710","Ƽؾ˹̿","KOSDAQ","","6110","-210","-3.32","6500","6500","5990","44177","271877650","131651119080","21546828" +"340570","Ƽؿ","KOSDAQ","췮","64200","-400","-0.62","64000","65000","62500","83428","5303831500","521817600000","8128000" +"043220","Ƽؽ","KOSDAQ","߰߱","500","-18","-3.47","524","524","492","323333","160970346","70127831000","140255662" +"277880","Ƽ","KOSDAQ","","6490","-310","-4.56","6950","6950","6420","51897","340774780","130843799680","20160832" +"131290","Ƽ","KOSDAQ","췮","41500","-1450","-3.38","43000","43000","41250","69224","2895218550","459049303500","11061429" +"019180","Ƽġ","KOSPI",,"3270","0","0.00","3270","3285","3200","75805","244984035","58860000000","18000000" +"425420","Ƽ","KOSDAQ","ó","15200","-600","-3.80","16000","16000","14730","93331","1403881720","172991200000","11381000" +"131100","ƼθƮ","KOSDAQ","߰߱","1544","-19","-1.22","1563","1563","1526","78946","120971963","43306501088","28048252" +"356860","Ƽ","KOSDAQ","췮","11890","-430","-3.49","12250","12390","11820","102416","1225065680","116909970700","9832630" +"062860","Ƽ","KOSDAQ","(ҼӺξ)","5800","0","0.00","0","0","0","0","0","57261776000","9872720" +"413300","ƼϾ","KONEX","Ϲݱ","1718","218","14.53","1700","1720","1275","20","31867","2242874770","1305515" +"363280","ƼȦ","KOSPI",,"3545","-25","-0.70","3530","3570","3410","49554","172934545","178771755060","50429268" +"36328K","ƼȦ","KOSPI",,"4595","-90","-1.92","4915","4920","4440","3526","16292830","5711649330","1243014" +"321550","Ƽ̿","KOSDAQ","","5620","-10","-0.18","5630","5660","5470","33939","187462940","146263270660","26025493" +"091810","Ƽװ","KOSPI",,"2815","0","0.00","2810","2825","2715","1595297","4408818415","606291817440","215378976" +"004870","ƼȦ","KOSPI",,"532","-2","-0.37","533","553","519","53861","28441484","59377420676","111611693" +"425040","Ƽ̿","KOSDAQ","","9680","-90","-0.92","9700","9770","9410","110264","1056347200","206339480160","21316062" +"241790","Ƽ̿","KOSDAQ","췮","6500","-190","-2.84","6580","6750","6400","30238","196511220","65017121000","10002634" +"104480","ƼɹĮ","KOSDAQ","췮","1348","-26","-1.89","1357","1387","1345","56295","76321226","122527045032","90895434" +"081150","Ƽ÷","KOSDAQ","췮","2675","-40","-1.47","2695","2765","2650","119125","323086490","64917975350","24268402" +"130740","ƼǾ۷ι","KOSDAQ","߰߱","2030","-45","-2.17","2055","2075","2030","7684","15740600","22891658370","11276679" +"217880","ƿ","KONEX","Ϲݱ","2970","15","0.51","2920","3000","2810","6645","19163550","31860051300","10727290" +"084730","ũ","KOSDAQ","췮","11290","210","1.90","11010","11870","11010","182486","2096257270","125425396960","11109424" +"440110","ĵ","KOSDAQ","","12130","-910","-6.98","12960","13040","12080","260002","3221239540","598426708680","49334436" +"034230","Ķ̽","KOSPI",,"11490","-160","-1.37","11720","11800","11390","413087","4769058270","1054455948270","91771623" +"033540","Ķ","KOSDAQ","߰߱","2310","532","29.92","1854","2310","1787","10779381","23819891359","87204955530","37751063" +"388870","ķν̹̿","KOSDAQ","","9880","-660","-6.26","10540","10620","9800","209402","2105430790","127639344560","12918962" +"043200","ķ","KOSDAQ","ó","545","-12","-2.15","553","557","544","41957","22991555","22783351675","41804315" +"214450","ĸġ","KOSDAQ GLOBAL","췮","186600","8600","4.83","189000","197800","176800","1456259","273113752700","1952610763200","10464152" +"217950","ĸġ̿","KONEX","Ϲݱ","32850","1650","5.29","31300","32950","31300","4738","153495000","133515244350","4064391" +"208340","ĸ","KOSDAQ","(ҼӺξ)","2915","0","0.00","0","0","0","0","0","233786229820","80201108" +"005690","Ĺ̼","KOSPI",,"5070","-170","-3.24","5200","5300","5030","675036","3453688290","304286007480","60016964" +"177830","Ĺ","KOSDAQ","췮","3260","-30","-0.91","3290","3310","3120","81312","263691930","46581334780","14288753" +"037070","ļ","KOSDAQ","췮","5580","-100","-1.76","5630","5700","5470","65213","360940440","111600000000","20000000" +"150900","ļ","KOSDAQ","ó","5360","-570","-9.61","5810","5990","5360","432716","2415069640","62585621920","11676422" +"037030","Ŀ","KOSDAQ","߰߱","2290","-120","-4.98","2410","2410","2290","54398","126702165","50102850460","21878974" +"047310","Ŀ","KOSDAQ","߰߱","5120","-270","-5.01","5390","5410","5120","169907","881722320","187447065600","36610755" +"266870","ĿǮ","KONEX","Ϲݱ","799","0","0.00","0","0","0","0","0","5120535320","6408680" +"368770","̹","KOSDAQ","ó","3510","-70","-1.96","3520","3770","3465","491529","1766671680","115318329750","32854225" +"170790","̿ũ","KOSDAQ","췮","8040","-10","-0.12","8080","8080","7890","8488","67490220","55124893200","6856330" +"049120","εؾ","KOSDAQ","ó","1167","-80","-6.42","1248","1248","1151","98388","116455560","50784342501","43517003" +"038950","ε","KOSDAQ","߰߱","3810","-90","-2.31","3920","3920","3730","8545","32459970","38903014650","10210765" +"441270","ο","KOSDAQ","߰߱","5400","-230","-4.09","5620","5680","5350","421424","2294054940","199734665400","36987901" +"106240","ũн","KOSDAQ","췮","1131","-39","-3.33","1170","1200","1131","28261","32658484","18008977467","15923057" +"131760","","KOSDAQ","߰߱","741","-13","-1.72","754","758","741","46192","34476959","32182803003","43431583" +"065690","Ŀ","KOSDAQ","ȯ(ҼӺξ)","1007","-42","-4.00","1049","1192","982","120852","130569371","14147676317","14049331" +"140860","ũý۽","KOSDAQ","췮","171500","2700","1.60","167000","173700","165200","26252","4464005000","1197165868500","6980559" +"091700","Ʈ","KOSDAQ GLOBAL","췮","7470","-10","-0.13","7510","7510","7400","107672","801903390","440119058580","58918214" +"202960","ǵƼ","KONEX","Ϲݱ","884","-20","-2.21","945","945","880","173","152928","10533374488","11915582" +"032800","Ÿ","KOSDAQ","߰߱","156","-7","-4.29","163","167","150","2514772","395974828","35846505864","229785294" +"318010","ʽ","KOSDAQ","߰߱","5240","-130","-2.42","5380","5500","5240","6047","32421320","41549731120","7929338" +"036580","ʽ","KOSPI",,"2245","-85","-3.65","2300","2360","2230","78364","177984470","82454232035","36727943" +"027710","ʽ丮","KOSDAQ","췮","1309","-21","-1.58","1323","1334","1301","164083","214451470","145844329400","111416600" +"004720","̾","KOSPI",,"4655","-100","-2.10","4755","4755","4595","82078","381590540","84621033875","18178525" +"266350","νī","KONEX","Ϲݱ","1079","132","13.94","1086","1086","805","4","4049","8518758950","7895050" +"225590","м÷","KOSDAQ","췮","875","-27","-2.99","902","902","858","44680","39663543","23307123875","26636713" +"054300","ҽŸ","KOSDAQ","ó","502","1","0.20","501","506","485","161017","79540133","33626919290","66985895" +"068050","ҿθƮ","KOSDAQ","췮","2020","-30","-1.46","2030","2040","1982","35770","71609493","55942033520","27694076" +"028670","ҿ","KOSPI",,"3380","-160","-4.52","3490","3505","3365","2711733","9213885765","1806844950560","534569512" +"222110","","KOSDAQ","","3920","65","1.69","3855","3920","3855","3121","12092745","44745557360","11414683" +"271830","","KOSDAQ","ó","2315","5","0.22","2285","2315","2215","81155","182563610","68269817630","29490202" +"010820","۽","KOSPI",,"2665","-70","-2.56","2690","2765","2660","190467","511010375","129977214770","48771938" +"016800","۽ý","KOSPI",,"42750","-550","-1.27","43300","44500","41650","1349","57367550","491625000000","11500000" +"263750","޾","KOSDAQ GLOBAL","췮","33700","600","1.81","33200","34350","33200","294437","9929211500","2165152713500","64247855" +"251970","ڸ","KOSDAQ","췮","34150","-150","-0.44","34700","34700","32700","60194","2024344150","423460000000","12400000" +"001020","ڸ","KOSPI",,"755","-10","-1.31","773","773","738","36819","27362378","134377401315","177983313" +"327610","̿޵","KONEX","Ϲݱ","7000","-190","-2.64","7200","7200","6980","1094","7678950","58808904000","8401272" +"168360","Ʈ","KOSDAQ","ó","3255","-120","-3.56","3375","3380","3155","167288","538555500","69293364420","21288284" +"087010","Ʈ","KOSDAQ","","42450","-2550","-5.67","44000","44750","42000","413477","17726372900","876904507500","20657350" +"090080","ȭ","KOSPI",,"994","1","0.10","993","1067","940","76999","77425533","54572845446","54902259" +"010770","ȭȦ","KOSPI",,"2780","5","0.18","2770","2835","2735","6992","19358115","40658795480","14625466" +"064800","ϸũ","KOSDAQ","߰߱","1295","0","0.00","1295","1340","1193","1206571","1515981177","165510450910","127807298" +"119500","Ż","KOSDAQ","߰߱","2625","-30","-1.13","2630","2655","2550","56840","147155995","31098984000","11847232" +"389140","","KOSDAQ","ó","5610","-310","-5.24","5900","5980","5610","58745","333614810","62342443350","11112735" +"105760","ũ","KOSDAQ","ó","6980","-220","-3.06","7160","7200","6830","102013","709447510","66030695300","9459985" +"022100","DX","KOSPI",,"25800","-2050","-7.36","27850","28600","25800","974304","26114960150","3922496008200","152034729" +"058430","ڽƿ","KOSPI",,"37300","-1100","-2.86","38150","38950","37300","17169","647553450","223800000000","6000000" +"009520","ڿ","KOSDAQ GLOBAL","췮","16250","-950","-5.52","17190","17520","16130","416403","6932120410","676693923750","41642703" +"047050","ͳų","KOSPI",,"50100","-3800","-7.05","53500","54800","49950","1436452","73812895450","8813731678800","175922788" +"003670","ǻó","KOSPI",,"216000","-18500","-7.89","235500","239500","215000","543988","121937301000","16732055520000","77463220" +"189690","ÿ","KOSDAQ","ó","2295","-65","-2.75","2365","2375","2275","77430","177759235","62703918855","27321969" +"318020","Ʈ","KOSDAQ","߰߱","4010","-65","-1.60","4020","4090","3895","21191","84287675","50775710720","12662272" +"256630","ƮϾ","KOSDAQ","ó","1458","-15","-1.02","1470","1470","1416","62285","89283025","84559730976","57997072" +"331380","Ŀġ","KOSDAQ","ó","3375","-190","-5.33","3745","3745","3255","203823","699405555","65562547500","19425940" +"472850","׷","KOSDAQ","߰߱","5290","0","0.00","5310","5310","5170","119283","629197380","171099405570","32343933" +"039980","󸮽AI","KOSDAQ","߰߱","2405","-225","-8.56","2595","2625","2405","2236146","5543901035","173527428685","72152777" +"041910","󸮽AIĸ","KOSDAQ","߰߱","6560","-350","-5.07","6910","6920","6490","55143","364491980","83300605280","12698263" +"234100","󸮽","KOSDAQ","췮","1283","-67","-4.96","1325","1347","1280","162401","210613992","69812152279","54413213" +"041020","󸮽ǽ","KOSDAQ","췮","4840","-380","-7.28","5160","5220","4830","1014194","5006963270","240671410320","49725498" +"114630","󸮽","KOSDAQ","췮","551","-19","-3.33","565","570","544","147351","80952259","42844408948","77757548" +"290720","Ǫ峪","KOSDAQ","߰߱","3730","85","2.33","3645","3960","3645","110963","418258695","49993406340","13403058" +"005670","Ǫ","KOSDAQ","췮","4880","-60","-1.21","4910","4910","4795","13991","67686400","48800000000","10000000" +"094940","Ǫ","KOSDAQ","ó","6280","-40","-0.63","6250","6350","6090","29592","181773960","52509504080","8361386" +"057880","Ǫҳ","KOSDAQ","(ҼӺξ)","8790","0","0.00","0","0","0","0","0","216061434720","24580368" +"007330","Ǫ","KOSDAQ","췮","8540","-90","-1.04","8550","8640","8500","12919","110267900","128807112000","15082800" +"017810","Ǯ","KOSPI",,"10270","-170","-1.63","10450","10500","10200","96818","995697870","391497966340","38120542" +"093380","dz","KOSDAQ","췮","3300","5","0.15","3320","3410","3285","6323","20987285","32601732900","9879313" +"023900","dz","KOSDAQ","췮","10080","-190","-1.85","10100","10350","10000","15956","160881140","127008000000","12600000" +"103140","dz","KOSPI",,"61600","-2200","-3.45","63900","64500","61200","281392","17467058700","1726295524800","28024278" +"005810","dzȦ","KOSPI",,"26150","-350","-1.32","26300","26650","26000","20310","532900950","377012185800","14417292" +"371950","dz","KOSDAQ","","10900","-520","-4.55","11650","12130","10830","208041","2365344580","229341319200","21040488" +"370090","ǻƼ","KOSDAQ","","17800","3370","23.35","14870","18750","14870","2829373","51601235050","145636574000","8181830" +"445180","ǻ","KOSDAQ","߰߱","6730","-30","-0.44","6750","6870","6550","44664","297586340","112856635240","16769188" +"151910","ǻóھ","KOSDAQ","(ҼӺξ)","640","0","0.00","0","0","0","0","0","121645902080","190071722" +"341170","ǻĸ޵","KONEX","Ϲݱ","2275","-165","-6.76","2300","2380","2205","6321","14116275","23963041375","10533205" +"220100","ǻ","KOSDAQ","","21600","100","0.47","21900","22850","20500","642688","13856122000","477406548000","22102155" +"035200","ĽƮ","KOSDAQ","ó","2625","-25","-0.94","2625","2740","2550","78642","206548175","25542798750","9730590" +"334970","Ƽ̿","KOSDAQ","","5540","-50","-0.89","5630","5690","5320","305428","1664188610","340718138260","61501469" +"950210","Ƽ̿ĸ","KOSPI",,"12790","-360","-2.74","13080","13160","12500","83334","1062316020","768629822450","60096155" +"321260","õ","KOSDAQ","ó","2215","-60","-2.64","2270","2285","2175","137128","304437180","62445466060","28192084" +"296160","","KONEX","Ϲݱ","6900","-30","-0.43","6810","7040","6800","1570","10789970","80448673200","11659228" +"053610","","KOSDAQ","췮","23700","-1100","-4.44","24450","24750","23500","40917","979853700","260700000000","11000000" +"303360","Ƽ","KOSDAQ","","2680","10","0.37","2665","2700","2650","2290","6096715","34510936200","12877215" +"377220","ҹ̿","KOSDAQ","","2115","-215","-9.23","2360","2360","2065","668787","1466302555","59875650000","28310000" +"335810","̿","KOSDAQ","","3210","-200","-5.87","3405","3415","3150","41617","135066715","37282628460","11614526" +"053160","","KOSDAQ","߰߱","9250","20","0.22","9500","9500","8910","44253","407329730","55500000000","6000000" +"405000","ö","KOSDAQ","ȯ(ҼӺξ)","1885","-66","-3.38","1951","2010","1853","49640","94592483","49154850940","26076844" +"041590","÷ũ","KOSDAQ","(ҼӺξ)","789","0","0.00","0","0","0","0","0","103917099150","131707350" +"367000","÷Ƽ","KOSDAQ","ó","5150","10","0.19","5130","5400","5090","15963","82571680","43199266050","8388207" +"075130","÷Ƽ","KOSDAQ","ó","2710","-395","-12.72","3140","3150","2580","2550663","7053560680","45046487200","16622320" +"222670","÷λ","KONEX","Ϲݱ","5360","0","0.00","5370","5370","5070","546","2864190","16293810400","3039890" +"009810","÷̱׷","KOSPI",,"363","-3","-0.82","364","366","353","463988","166381368","55135162500","151887500" +"237820","÷̵","KOSDAQ","߰߱","4825","-275","-5.39","5040","5100","4815","120999","594532425","61890950500","12827140" +"023770","÷","KOSDAQ","߰߱","7860","-160","-2.00","8020","8340","7720","113598","902948690","68907205200","8766820" +"019570","÷佺","KOSDAQ","߰߱","541","-42","-7.20","585","598","515","2056711","1134516069","28386291640","52470040" +"300080","ø","KOSDAQ","","15910","-840","-5.01","16750","16890","15910","22321","359454990","87533908470","5501817" +"033790","dz","KOSDAQ","߰߱","11170","250","2.29","10920","11630","10410","344736","3868171090","254930676000","22822800" +"032580","ǵ","KOSDAQ","߰߱","1071","-20","-1.83","1090","1100","1043","154178","164994449","35484440544","33132064" +"051380","ǾƮ","KOSDAQ","߰߱","2220","-90","-3.90","2310","2325","2215","45146","101195645","34054959840","15340072" +"241820","Ǿ","KOSDAQ","ó","1244","-15","-1.19","1259","1287","1210","269808","334392436","70505740160","56676640" +"237750","Ǿؾũ","KOSDAQ","ó","4495","-110","-2.39","4510","4540","4450","24549","110144340","29202217000","6496600" +"460940","Ǿؿijн","KOSDAQ","","14780","-260","-1.73","15100","17120","14330","3339723","52597182890","95652317200","6471740" +"319660","ǿ","KOSDAQ GLOBAL","췮","21700","-550","-2.47","22300","22500","21500","303695","6612002150","628577693800","28966714" +"031980","ǿȦ","KOSDAQ","췮","38300","-2200","-5.43","40150","40300","38000","498597","19286790800","825839728500","21562395" +"002230","ǿ","KOSDAQ","߰߱","3845","-105","-2.66","3950","4010","3845","7701","29935805","74480237685","19370673" +"043370","ǿġ","KOSDAQ","췮","9800","-100","-1.01","9810","9970","9640","50589","495798680","205800000000","21000000" +"239890","ǿġũ","KOSDAQ","","8960","-70","-0.78","9150","9280","8850","98299","882079790","89024364800","9935755" +"347740","ǿǺӻ󿬱Ÿ","KOSDAQ","߰߱","2365","-85","-3.47","2455","2490","2365","126455","302677420","70975012240","30010576" +"137400","ǿƼ","KOSDAQ GLOBAL","췮","47700","-2800","-5.54","50400","50800","47450","463980","22479495300","1132545202200","23743086" +"257370","ǿƼ","KOSDAQ","(ҼӺξ)","9210","0","0.00","0","0","0","0","0","115169769810","12504861" +"147760","ǿƼ","KOSDAQ","ó","3200","-10","-0.31","3210","3245","3065","21357","67129140","34623571200","10819866" +"128660","̸Ż","KOSDAQ","췮","2950","-70","-2.32","3020","3040","2895","84510","248458420","73169938550","24803369" +"006140","","KOSDAQ","췮","4960","-370","-6.94","5220","5350","4960","55596","280433610","74400000000","15000000" +"376180","ڱ׷","KOSDAQ","ó","2520","-115","-4.36","2590","2620","2515","67033","170933340","46598272560","18491378" +"304840","ù̿","KOSDAQ","","3595","295","8.94","3300","3595","3270","383142","1343848490","75816623080","21089464" +"062970","Ǿ","KOSDAQ","߰߱","3070","335","12.25","2735","3515","2530","26080346","79643171010","30296015630","9868409" +"087600","ȼ÷","KOSDAQ","ó","6900","-120","-1.71","7020","7220","6820","10669","73557980","56349250200","8166558" +"291810","","KOSDAQ","","2380","-210","-8.11","2575","2575","2370","139575","336379000","27031354560","11357712" +"378340","ʿ","KOSDAQ","߰߱","16670","-830","-4.74","17500","18150","16610","456465","7806897100","354835652940","21285882" +"161580","ʿƽ","KOSDAQ","߰߱","14250","-270","-1.86","14460","14610","13890","195894","2767672320","325515315000","22843180" +"347770","˽","KOSDAQ","߰߱","2410","80","3.43","2355","2750","2200","477191","1192085110","55085471220","22857042" +"163730","ΰ","KOSDAQ","ó","9060","-670","-6.89","9460","10640","8790","5697207","55101280200","84807108480","9360608" +"417180","ΰŽ丮","KOSDAQ","߰߱","2335","-55","-2.30","2350","2405","2300","36057","84062920","39086510675","16739405" +"446750","ϳ26ȣ","KOSDAQ","SPAC(ҼӺξ)","2150","-10","-0.46","2130","2155","2125","970","2065390","12964500000","6030000" +"448370","ϳ27ȣ","KOSDAQ","SPAC(ҼӺξ)","2120","-5","-0.24","2115","2140","2115","3891","8248770","11914400000","5620000" +"454750","ϳ28ȣ","KOSDAQ","SPAC(ҼӺξ)","2125","-5","-0.23","2130","2130","2105","348","733600","15304250000","7202000" +"454640","ϳ29ȣ","KOSDAQ","SPAC(ҼӺξ)","2135","-5","-0.23","2100","2140","2100","2125","4497420","11531135000","5401000" +"469880","ϳ30ȣ","KOSDAQ","SPAC(ҼӺξ)","2050","-5","-0.24","2060","2060","2045","2640","5432440","14975250000","7305000" +"469900","ϳ31ȣ","KOSDAQ","SPAC(ҼӺξ)","2070","0","0.00","2055","2070","2050","5113","10531225","11602350000","5605000" +"475240","ϳ32ȣ","KOSDAQ","SPAC(ҼӺξ)","2160","0","0.00","2160","2160","2145","1744","3744470","6912000000","3200000" +"475250","ϳ33ȣ","KOSDAQ","SPAC(ҼӺξ)","2130","-10","-0.47","2140","2140","2120","11246","23880585","7881000000","3700000" +"406760","ϳ21ȣ","KOSDAQ","SPAC(ҼӺξ)","2125","-30","-1.39","2160","2165","2105","43172","91311160","15746250000","7410000" +"418170","ϳ22ȣ","KOSDAQ","SPAC(ҼӺξ)","2135","15","0.71","2105","2140","2100","20674","43711535","12831350000","6010000" +"435620","ϳ25ȣ","KOSDAQ","SPAC(ҼӺξ)","10250","0","0.00","10250","10260","10250","12844","131651470","44095500000","4302000" +"086790","ϳ","KOSPI",,"62900","0","0.00","63000","63200","61700","565149","35447996100","18067451352000","287240880" +"299030","ϳ","KOSDAQ","ó","27200","-1350","-4.73","28550","28800","27100","40449","1113615800","217461552000","7994910" +"067310","ϳũ","KOSDAQ","췮","11140","-290","-2.54","11450","11580","10980","730596","8155981890","732398141440","65744896" +"166090","ϳƼ","KOSDAQ GLOBAL","췮","29850","-600","-1.97","30250","30650","29250","196935","5852068800","590363568900","19777674" +"293480","ϳ","KOSPI",,"10990","-100","-0.90","11080","11090","10850","17227","188240470","195324676540","17772946" +"039130","ϳ","KOSPI",,"49200","-500","-1.01","50000","50000","48500","43970","2155810150","789127902000","16039185" +"136480","ϸ","KOSDAQ","췮","2750","-20","-0.72","2765","2775","2740","318657","875872670","292076680500","106209702" +"003380","ϸ","KOSDAQ GLOBAL","췮","5090","-140","-2.68","5260","5270","5090","227205","1166600970","570108610890","112005621" +"450330","Ͻ","KOSDAQ","","11390","-430","-3.64","11850","11950","11290","155187","1777638600","89252142510","7836009" +"101670","̵θƬ","KOSDAQ","ó","3065","0","0.00","3010","3140","2975","573605","1736774665","156579601450","51086330" +"365590","̵","KOSDAQ","","915","-27","-2.87","906","965","880","128365","118520983","132169287735","144447309" +"149980","̷δ","KOSDAQ","ó","8500","350","4.29","8350","8610","8100","791974","6999354970","158026585500","18591363" +"013030","̷ڸ","KOSDAQ","췮","24750","-50","-0.20","24800","25150","24000","43401","1061763650","318187237500","12856050" +"352820","̺","KOSPI",,"165600","-6200","-3.61","171300","173300","165500","134534","22583917500","6897587263200","41652097" +"126700","̺ý","KOSDAQ","췮","16980","-280","-1.62","17110","17830","16980","215708","3713573200","253717061760","14942112" +"106080","̼Ҵ","KOSDAQ","߰߱","3915","-120","-2.97","4045","4105","3905","31370","125786435","61604345475","15735465" +"071090","̽ƿ","KOSPI",,"3045","-65","-2.09","3080","3125","2995","128119","389448090","61483029195","20191471" +"450050","8ȣ","KOSDAQ","SPAC(ҼӺξ)","2125","0","0.00","2135","2140","2110","1683","3568695","10654750000","5014000" +"160190","˾ؿ","KOSDAQ","߰߱","10780","-500","-4.43","11150","12070","10510","736247","8397337900","332972640000","30888000" +"221840","װ","KOSDAQ","߰߱","1819","-21","-1.14","1835","1868","1813","15102","27555899","34016320459","18700561" +"106190","","KOSDAQ","췮","13620","-310","-2.23","14200","14200","13210","72813","983452200","144823816260","10633173" +"019490","Ʈ","KOSPI",,"954","48","5.30","898","970","898","248049","238299334","26341107696","27611224" +"000080","Ʈ","KOSPI",,"20500","50","0.24","20300","20600","20050","232393","4734425300","1437739025500","70133611" +"000087","Ʈ2B","KOSPI",,"16150","-110","-0.68","16290","16290","16000","1727","27934310","18251728700","1130138" +"000140","ƮȦ","KOSPI",,"9340","210","2.30","9140","9380","9140","26910","249259430","216751185100","23206765" +"000145","ƮȦ","KOSPI",,"11590","-360","-3.01","11940","11950","11400","1338","15459100","5456687900","470810" +"065650","۷̼","KOSDAQ","߰߱","1307","-2","-0.15","1309","1309","1280","111483","144339617","138502295954","105969622" +"066130","","KOSDAQ","췮","4840","-190","-3.78","4965","5060","4840","50578","247990315","61952000000","12800000" +"152550","ѱANKOR","KOSPI",,"395","-3","-0.75","396","406","394","2051623","818446362","27657900000","70020000" +"004590","ѱ","KOSDAQ","췮","3625","-30","-0.82","3660","3675","3605","15736","56922730","54375000000","15000000" +"036460","ѱ","KOSPI",,"44900","-3550","-7.33","47650","48300","44400","2907257","132360371200","4144853700000","92313000" +"039340","ѱTV","KOSDAQ","췮","5630","140","2.55","5500","5650","5400","59847","327074800","129490000000","23000000" +"005430","ѱ","KOSPI",,"47750","-950","-1.95","48250","49000","47400","14161","677549700","151193451250","3166355" +"071050","ѱ","KOSPI",,"70600","-1000","-1.40","72200","72200","69600","108690","7690751200","3934255035200","55725992" +"071055","ѱֿ","KOSPI",,"50800","-100","-0.20","50900","51500","49600","12230","621955000","297599150800","5858251" +"034950","ѱ","KOSDAQ","췮","84800","100","0.12","84700","85000","84000","3095","260335100","385035587200","4540514" +"010040","ѱȭ","KOSPI",,"2135","-35","-1.61","2200","2200","2130","25230","54425190","87678177370","41067062" +"025540","ѱ","KOSPI",,"66000","-600","-0.90","66800","67300","65700","19416","1283351300","687390000000","10415000" +"222980","ѱƳƼ","KOSDAQ","ó","3735","-120","-3.11","3830","3875","3695","21718","81167970","41202589005","11031483" +"010100","ѱؽ","KOSPI",,"3555","-10","-0.28","3520","3680","3395","131525","459095420","108251243100","30450420" +"331660","ѱ̶Ŭû","KONEX","Ϲݱ","15100","0","0.00","0","0","0","0","0","16610000000","1100000" +"256840","ѱ񿣾","KOSDAQ","ó","5150","-250","-4.63","5330","5430","5150","655811","3434055410","349749081450","67912443" +"219750","ѱƼ","KOSDAQ","(ҼӺξ)","967","0","0.00","0","0","0","0","0","63267797795","65426885" +"004090","ѱ","KOSPI",,"16700","-90","-0.54","16500","17650","16450","844486","14463224600","211991804000","12694120" +"025550","ѱ","KOSDAQ","췮","2835","-90","-3.08","2915","2935","2835","49447","142145600","66055500000","23300000" +"002200","ѱ","KOSPI",,"2450","-40","-1.61","2460","2515","2435","68583","169079145","98000000000","40000000" +"002960","ѱ","KOSPI",,"314000","-11000","-3.38","321500","323500","313000","4837","1529877500","408200000000","1300000" +"017890","ѱ","KOSDAQ","췮","9250","-20","-0.22","9230","9290","9100","34599","317960130","199853280000","21605760" +"000240","ѱ۴","KOSPI",,"16540","210","1.29","16350","16650","16200","49072","807990380","1570228869600","94935240" +"080720","ѱϿ","KOSDAQ","ó","4585","-95","-2.03","4560","4700","4465","22656","102695870","36280316380","7912828" +"123890","ѱڻŹ","KOSPI",,"2905","-5","-0.17","2915","2930","2895","120963","351222050","360155369560","123977752" +"015760","ѱ","KOSPI",,"21900","-400","-1.79","22300","22500","21850","1854198","40945240000","14059013286300","641964077" +"063570","ѱڱ","KOSDAQ","췮","4635","-35","-0.75","4670","4715","4600","68560","317478720","158274719280","34147728" +"041460","ѱ","KOSDAQ","߰߱","3350","-105","-3.04","3430","3460","3350","63609","214727530","63650000000","19000000" +"006200","ѱȦ","KOSPI",,"787","0","0.00","804","804","782","20171","15853407","36834068032","46803136" +"101680","ѱб","KOSDAQ","߰߱","2380","-15","-0.63","2375","2395","2375","4118","9828095","20001520000","8404000" +"039740","ѱ","KOSDAQ","߰߱","2535","-45","-1.74","2580","2580","2525","9337","23796925","20326636395","8018397" +"053300","ѱ","KOSDAQ","췮","4000","-245","-5.77","4305","4310","3910","762053","3081750450","169765444000","42441361" +"025770","ѱ","KOSDAQ","췮","8280","-60","-0.72","8340","8340","8140","11623","95895090","310038563880","37444271" +"436610","ѱ11ȣ","KOSDAQ","SPAC(ҼӺξ)","3375","0","0.00","0","0","0","0","0","20317500000","6020000" +"458610","ѱ12ȣ","KOSDAQ","SPAC(ҼӺξ)","2190","-10","-0.45","2210","2210","2165","805","1747000","9263700000","4230000" +"464440","ѱ13ȣ","KOSDAQ","SPAC(ҼӺξ)","2150","0","0.00","2160","2160","2130","2957","6365535","9288000000","4320000" +"477530","ѱ14ȣ","KOSDAQ","SPAC(ҼӺξ)","2110","-15","-0.71","2125","2125","2110","3417","7225580","10149100000","4810000" +"479880","ѱ15ȣ","KOSDAQ","SPAC(ҼӺξ)","2040","0","0.00","2035","2050","2035","8498","17303915","14014800000","6870000" +"027970","ѱ","KOSPI",,"1071","-19","-1.74","1083","1083","1057","60122","64063579","203680891827","190178237" +"023350","ѱձ","KOSPI",,"4570","-120","-2.56","4730","4780","4545","34427","159162465","50041500000","10950000" +"025890","ѱְ","KOSPI",,"1960","-11","-0.56","1971","1973","1949","7248","14168757","22166147640","11309259" +"000970","ѱö","KOSPI",,"6470","-80","-1.22","6530","6570","6470","17389","112971930","147519235000","22800500" +"104700","ѱö","KOSPI",,"8500","-90","-1.05","8590","8740","8490","21600","184022860","360825000000","42450000" +"017960","ѱī","KOSPI",,"10720","-120","-1.11","10840","11000","10540","214927","2305131040","556458605440","51908452" +"023760","ѱijŻ","KOSDAQ","췮","571","0","0.00","575","575","569","68372","38988341","180213067896","315609576" +"054040","ѱǻ","KOSDAQ","췮","5130","-40","-0.77","5140","5180","5010","68999","349689540","82445717700","16071290" +"161890","ѱݸ","KOSPI",,"70400","400","0.57","70900","71300","68300","371835","26143695200","1661797420800","23605077" +"021650","ѱť","KOSDAQ","췮","2360","0","0.00","2340","2375","2300","22241","51682910","38587328680","16350563" +"161390","ѱŸ̾ũ","KOSPI",,"40000","-350","-0.87","40650","40650","39700","186481","7477239650","4955002760000","123875069" +"053590","ѱũ","KOSDAQ","ȯ(ҼӺξ)","334","0","0.00","0","0","0","0","0","52484809098","157140147" +"034830","ѱŹ","KOSPI",,"1059","-10","-0.94","1052","1067","1044","232306","244687502","267386094570","252489230" +"007280","ѱƯ","KOSPI",,"1518","-33","-2.13","1577","1577","1489","16163","24576453","92314606098","60813311" +"032300","ѱĸ","KOSDAQ","߰߱","15550","-320","-2.02","15810","16050","15510","26069","408652220","169599200550","10906701" +"168490","ѱз","KOSPI",,"213","-2","-0.93","215","217","212","171486","36725189","17044260000","80020000" +"037230","ѱŰ","KOSDAQ","߰߱","1887","-8","-0.42","1904","1904","1855","5588","10502950","56233217049","29800327" +"448900","ѱǾ̿","KONEX","Ϲݱ","31200","0","0.00","0","0","0","0","0","158541864000","5081470" +"047810","ѱװ","KOSPI",,"51000","-1100","-2.11","52100","52200","50500","427910","21826326300","4971230457000","97475107" +"123690","ѱȭǰ","KOSPI",,"7210","-180","-2.44","7310","7370","7170","66401","479604870","115850280000","16068000" +"003350","ѱȭǰ","KOSPI",,"78100","-200","-0.26","79500","79900","73600","149172","11451886700","353949200000","4532000" +"030520","ѱ۰ǻ","KOSDAQ","췮","17360","-1330","-7.12","18790","18850","17280","538414","9503951470","419760355840","24179744" +"052600","ѳƮ","KOSDAQ","߰߱","3645","-100","-2.67","3765","3765","3640","17516","64137245","42149686500","11563700" +"011500","ѳȭ","KOSPI",,"18980","-2670","-12.33","21150","21450","18600","2586806","52474023540","296791057160","15637042" +"002390","ѵ","KOSPI",,"13800","-250","-1.78","13910","14080","13600","48298","663034130","189936755400","13763533" +"256150","ѵũ","KOSDAQ","ó","6880","0","0.00","6870","6960","6790","7913","54083710","57757600000","8395000" +"092460","ѶIMS","KOSDAQ","췮","6190","-70","-1.12","6260","6270","6050","37547","230678430","105908919200","17109680" +"053690","ѹ̱۷ι","KOSPI",,"14120","-520","-3.55","14600","14680","14120","79426","1134745260","154720606000","10957550" +"042700","ѹ̹ݵü","KOSPI",,"96500","-3300","-3.31","99400","99800","95100","983019","95069336400","9359885681000","96993634" +"008930","ѹ̻̾","KOSPI",,"32650","1700","5.49","30950","33050","30500","283860","9086489450","2232984107500","68391550" +"128940","ѹ̾ǰ","KOSPI",,"315500","25500","8.79","292000","318000","291000","165365","50821267500","4041867660500","12810991" +"452190","Ѻ","KOSDAQ","ó","5740","-320","-5.28","6370","6930","5740","17785313","115550392220","132954225180","23162757" +"047080","ѺƮ","KOSDAQ","߰߱","1689","-144","-7.86","1849","1849","1640","899540","1534955545","41924969418","24822362" +"009240","ѻ","KOSPI",,"54000","-1400","-2.53","55900","55900","54000","19527","1064142300","1270832112000","23533928" +"452280","ѼϾ","KOSDAQ","߰߱","11660","-1270","-9.82","12710","12830","11570","1340275","16083843400","198249150000","17002500" +"020000","Ѽ","KOSPI",,"15940","-270","-1.67","16220","16250","15820","29816","474760760","372972090000","23398500" +"003680","Ѽ","KOSPI",,"5110","-70","-1.35","5180","5200","5050","25494","130158570","31730621650","6209515" +"066980","Ѽũ","KOSDAQ","췮","1742","-27","-1.53","1748","1775","1698","279747","482819877","90470987750","51935125" +"105630","ѼǾ","KOSPI",,"14860","-480","-3.13","15230","15340","14850","93817","1405776850","594400000000","40000000" +"069640","Ѽ","KOSPI",,"2305","150","6.96","2355","2800","2200","6220209","15756655815","69395487110","30106502" +"016450","Ѽ24Ȧ","KOSPI",,"4510","-70","-1.53","4625","4690","4485","44262","201036595","180400000000","40000000" +"010420","ѼPNS","KOSPI",,"1008","-28","-2.70","1031","1034","1006","32217","32691141","20656956096","20493012" +"009180","Ѽַƽ","KOSPI",,"2375","45","1.93","2330","2400","2285","251225","584469995","66635434375","28057025" +"114810","Ѽ־̿","KOSDAQ","߰߱","8000","-300","-3.61","8470","8470","7900","265503","2122718030","232905392000","29113174" +"070590","ѼƼť","KOSDAQ","߰߱","1108","-1","-0.09","1109","1112","1098","29822","32969522","15378509268","13879521" +"213500","Ѽ","KOSPI",,"9580","-90","-0.93","9660","9670","9550","57047","546871240","228009518080","23800576" +"014680","ѼɹĮ","KOSPI",,"128900","-2100","-1.60","131000","131000","127700","48845","6293999500","1461106635500","11335195" +"004710","Ѽũн","KOSPI",,"4550","-150","-3.19","4640","4700","4550","48793","224392495","146099944900","32109878" +"004150","ѼȦ","KOSPI",,"2480","-20","-0.80","2510","2510","2460","29682","73485725","104181270960","42008577" +"025750","ѼȨ","KOSPI",,"693","-10","-1.42","690","703","683","146312","100535244","55831648257","80565149" +"226440","Ѽ۳׿","KOSDAQ","(ҼӺξ)","1530","0","0.00","0","0","0","0","0","100580954580","65739186" +"042520","ѽ̿޵","KOSDAQ","ó","9110","-340","-3.60","9360","9440","9040","23814","217623770","123225203370","13526367" +"004960","ѽŰ","KOSPI",,"6850","-80","-1.15","7000","7020","6720","11537","78461180","79259308700","11570702" +"011700","ѽű","KOSPI",,"3135","-130","-3.98","3210","3285","3135","189608","604033385","101718683385","32446151" +"430690","ѽ","KOSDAQ","ó","6540","-830","-11.26","7260","7340","6430","924221","6233481590","71255438580","10895327" +"078350","Ѿ","KOSDAQ","췮","12470","-270","-2.12","12700","12840","12170","156657","1948082980","190097443540","15244382" +"045100","Ѿ̿","KOSDAQ","췮","16960","-190","-1.11","17030","17170","16930","30932","525530910","305280000000","18000000" +"001750","Ѿ","KOSPI",,"15930","10","0.06","15650","16190","15650","158700","2536885840","202765546620","12728534" +"001755","Ѿǿ","KOSPI",,"23900","200","0.84","23450","24400","23450","14166","340280250","12547500000","525000" +"018880","ѿ½ý","KOSPI",,"4095","-75","-1.80","4170","4210","4025","1675353","6902974180","2185911000000","533800000" +"009420","ѿù̿ĸ","KOSPI",,"36900","1900","5.43","36600","38150","36000","1113421","41097877700","1927679542200","52240638" +"320000","ѿݵü","KOSDAQ","߰߱","2705","-50","-1.81","2745","2780","2520","379017","999627665","75647021035","27965627" +"091440","ѿ","KOSDAQ","ó","6270","-50","-0.79","6660","6730","6210","55379","357647910","91583827170","14606671" +"014130","ͽ","KOSPI",,"3465","-145","-4.02","3600","3630","3425","100383","349490745","41580000000","12000000" +"024740","ϴ","KOSDAQ","߰߱","1830","-41","-2.19","1855","1871","1815","98781","180764324","57704559180","31532546" +"005860","ϻ","KOSDAQ","췮","3950","-105","-2.59","4010","4045","3930","225746","894389895","155644555750","39403685" +"300720","ϽøƮ","KOSPI",,"14310","-350","-2.39","14690","14690","14160","92960","1330708120","991132637400","69261540" +"002220","ö","KOSPI",,"1995","-60","-2.92","2035","2085","1995","21091","42532437","53261432700","26697460" +"006390","øƮ","KOSPI",,"13550","-290","-2.10","13800","14030","13500","19262","263384000","261889955600","19327672" +"003300","Ȧ","KOSPI",,"14170","-90","-0.63","14270","14400","14060","12523","177454440","436901966280","30832884" +"007770","ȭ","KOSDAQ","췮","11260","-530","-4.50","11780","11780","10810","5826","65614020","39522600000","3510000" +"051600","KPS","KOSPI",,"41050","-50","-0.12","41100","41600","40900","202628","8338428350","1847250000000","45000000" +"052690","","KOSPI",,"63600","-900","-1.40","64600","64900","63300","154624","9881794100","2430792000000","38220000" +"130660","","KOSPI",,"14350","140","0.99","14100","15180","13400","9088091","132124676490","467810000000","32600000" +"198940","ֶƮŻ","KOSDAQ","߰߱","1002","-20","-1.96","1000","1010","986","182188","180743012","39000823956","38922978" +"058450","ֿ̾Ƽ","KOSDAQ","߰߱","2020","25","1.25","2050","2050","1940","16618","32950006","29193987380","14452469" +"107640","߿ÿ","KOSDAQ","","44500","200","0.45","45100","47750","44400","478851","22099956050","389439347000","8751446" +"002320","","KOSPI",,"19200","-110","-0.57","19220","19320","18980","12942","247593350","286994457600","14947628" +"003480","߰Ȧ","KOSPI",,"3450","-30","-0.86","3485","3485","3395","16998","58038430","101877851400","29529812" +"180640","Į","KOSPI",,"67300","-900","-1.32","68500","69300","66400","30022","2028743400","4493101376700","66762279" +"18064K","Į","KOSPI",,"23050","0","0.00","23250","23800","22700","327","7474850","12372456300","536766" +"005110","â","KOSPI",,"1254","0","0.00","0","0","0","0","0","23332434378","18606407" +"079170","â","KOSDAQ","߰߱","7480","-360","-4.59","7860","8040","7480","40040","306695110","38896000000","5200000" +"009460","â","KOSPI",,"817","-11","-1.33","833","838","815","55813","46010008","48748336062","59667486" +"372910","Ķɾ","KOSPI",,"4325","595","15.95","3765","4590","3650","37883298","162597504270","119691805950","27674406" +"054920","","KOSDAQ","췮","2860","-130","-4.35","3470","3485","2750","9130274","28004107290","80700851660","28217081" +"002680","ž","KOSDAQ","ȯ(ҼӺξ)","710","-21","-2.87","722","737","701","55827","40306883","22944927290","32316799" +"000880","ȭ","KOSPI",,"28000","-500","-1.75","28650","28650","27800","92480","2602118400","2098844580000","74958735" +"00088K","ȭ3B","KOSPI",,"15190","-20","-0.13","15200","15280","15090","10937","165541080","341349680000","22472000" +"452260","ȭ","KOSPI",,"1539","30","1.99","1508","1544","1508","6202528","9475968254","298349939790","193859610" +"45226K","ȭƿ","KOSPI",,"2920","190","6.96","2730","3040","2730","49283","144296630","8481052400","2904470" +"451800","ȭ","KOSPI",,"4900","-25","-0.51","4925","4965","4865","45995","224963555","345940000000","70600000" +"088350","ȭ","KOSPI",,"2940","-10","-0.34","2945","2945","2880","1332893","3885847085","2553478200000","868530000" +"000370","ȭغ","KOSPI",,"5510","-220","-3.84","5730","5730","5470","272379","1512929590","643231421650","116738915" +"009830","ȭַ","KOSPI",,"23350","-300","-1.27","23750","23800","23300","329628","7740697150","4013690715600","171892536" +"009835","ȭַǿ","KOSPI",,"20400","-300","-1.45","20700","20700","20150","2092","42551050","52537119600","2575349" +"272210","ȭý","KOSPI",,"17210","-550","-3.10","17840","17890","17200","1131001","19623910690","3251302684690","188919389" +"012450","ȭν̽","KOSPI",,"290000","0","0.00","0","0","0","0","0","14682700000000","50630000" +"082740","ȭ","KOSPI",,"11960","-50","-0.42","12010","12090","11510","634660","7496186670","998027818320","83447142" +"042660","ȭ","KOSPI",,"30650","-1450","-4.52","32100","32150","30550","1461425","45448088850","9391570526100","306413394" +"000885","ȭ","KOSPI",,"41150","600","1.48","40600","41150","40600","1339","54913200","19722948100","479294" +"003530","ȭ","KOSPI",,"3290","-220","-6.27","3510","3535","3270","2548682","8602563730","705862179750","214547775" +"003535","ȭǿ","KOSPI",,"6400","-60","-0.93","6330","6400","6260","7330","46464450","30720000000","4800000" +"430460","ȭ÷3ȣ","KOSDAQ","SPAC(ҼӺξ)","2145","-10","-0.46","2155","2155","2115","72437","154454025","12698400000","5920000" +"455310","ȭ÷4ȣ","KOSDAQ","SPAC(ҼӺξ)","2120","0","0.00","2130","2130","2100","4319","9134005","10727200000","5060000" +"195870","ؼ𿡽","KOSPI",,"26350","-600","-2.23","26900","27000","26050","69348","1830517800","447950000000","17000000" +"034810","ؼ","KOSDAQ","췮","6360","-110","-1.70","6500","6530","6340","24100","153780480","207061610520","32556857" +"03481K","ؼ1","KOSDAQ","췮","7600","-190","-2.44","7800","7800","7600","1167","8958040","10555807200","1388922" +"059270","ؼκƽ","KOSDAQ","","8960","-190","-2.08","9070","9200","8590","178120","1574315610","99821559040","11140799" +"076610","ؼƽ","KOSDAQ","߰߱","1188","-21","-1.74","1209","1209","1179","41553","49703512","30238399224","25453198" +"101530","ǰ","KOSPI",,"5440","-150","-2.68","5560","5590","5400","70449","384457990","158395511680","29116822" +"220180","ڵƮ","KOSDAQ","ó","3500","-90","-2.51","3590","3590","3395","20632","71406170","67928000000","19408000" +"143210","۷̼","KOSPI",,"2090","-55","-2.56","2185","2185","1985","34568","71775760","45720311230","21875747" +"900270","ͱ׷","KOSDAQ","ܱ(ҼӺξ)","222","-1","-0.45","223","225","219","377927","83473193","33806678592","152282336" +"214180","̳뺣̼","KOSDAQ","췮","12860","-190","-1.46","12960","13190","12810","9946","128094750","170487399100","13257185" +"234340","̳","KOSDAQ","췮","18250","690","3.93","17300","18380","17300","96911","1736744580","172517250000","9453000" +"084990","︯̽","KOSDAQ","","3315","-85","-2.50","3480","3480","3305","109425","364363020","152797622055","46092797" +"000720","Ǽ","KOSPI",,"30150","-350","-1.15","30500","30650","30000","288918","8738910700","3357376314750","111355765" +"000725","Ǽ","KOSPI",,"46550","-500","-1.06","47000","47100","45500","1553","71759250","49095959150","1054693" +"170030","","KOSDAQ","췮","5700","-200","-3.39","5850","5890","5620","50166","288300570","87438000000","15340000" +"453340","׸Ǫ","KOSPI",,"11850","-20","-0.17","11800","11980","11710","21360","252150030","401488830900","33880914" +"086280","۷κ","KOSPI",,"109400","-1300","-1.17","111800","111800","107100","162803","17802491600","8205000000000","75000000" +"064350","","KOSPI",,"49450","-1350","-2.66","50900","50900","48400","1683851","82924095500","5397086388850","109142293" +"079430","븮Ʈ","KOSPI",,"7810","-190","-2.38","7960","8040","7800","36397","286938010","160380552420","20535282" +"012330","","KOSPI",,"214000","2500","1.18","213000","218500","212000","191717","41301193000","19900950116000","92995094" +"319400","빫","KOSDAQ","췮","2840","30","1.07","2795","2860","2770","248404","698982065","334384604720","117741058" +"048410","̿","KOSDAQ","߰߱","19780","-30","-0.15","19820","19870","19380","150756","2957927000","787671406240","39821608" +"052260","̿","KOSDAQ","߰߱","5100","-340","-6.25","5400","5550","5010","245668","1281794760","153000000000","30000000" +"069960","ȭ","KOSPI",,"47850","-750","-1.54","49300","49300","47600","35366","1698868300","1119806801850","23402441" +"004560","ƿ","KOSPI",,"12760","-680","-5.06","13440","13440","12700","76017","978734250","192405628360","15078811" +"016790","","KOSDAQ","(ҼӺξ)","994","0","0.00","0","0","0","0","0","187340898626","188471729" +"004310","ǰ","KOSPI",,"4330","-75","-1.70","4370","4445","4225","334259","1437080550","138560000000","32000000" +"041440","뿡","KOSDAQ","߰߱","7550","-160","-2.08","7660","7770","7330","508496","3830277750","135265377200","17915944" +"039010","뿡ġƼ","KOSDAQ","췮","5690","-180","-3.07","5810","5840","5690","26203","149933180","49076250000","8625000" +"017800","뿤","KOSPI",,"41600","-450","-1.07","42300","42300","40750","54901","2278991050","1626243216000","39092385" +"307950","信","KOSPI",,"153000","-2200","-1.42","157100","161400","152400","155332","24432517500","4195869246000","27423982" +"011210","","KOSPI",,"49300","500","1.02","49000","49650","48250","64778","3178732400","1340717591900","27195083" +"090850","","KOSDAQ","췮","5410","-110","-1.99","5500","5550","5370","23811","128787380","128467813010","23746361" +"004020","ö","KOSPI",,"24450","-150","-0.61","24650","24850","24300","250551","6149628350","3262749443250","133445785" +"005440","Ȧ","KOSPI",,"4920","-130","-2.57","5040","5040","4770","626243","3058482505","767049160920","155904301" +"005380","","KOSPI",,"227500","-1500","-0.66","228000","230500","223000","710077","161217190500","47642183452500","209416191" +"005387","2B","KOSPI",,"169500","-1000","-0.59","171000","172000","165800","162496","27494226100","6061216774500","35759391" +"005389","3B","KOSPI",,"165500","-1700","-1.02","167100","167600","162800","20536","3387816400","393956862000","2380404" +"005385","","KOSPI",,"166000","-1700","-1.01","168200","168200","163500","74785","12391319600","3962750008000","23871988" +"001500","","KOSPI",,"9090","390","4.48","8710","9160","8650","163212","1461173770","288267188580","31712562" +"011760","۷̼","KOSPI",,"17950","-240","-1.32","18140","18230","17720","44716","802231240","237459939700","13228966" +"227840","۷̼Ȧ","KOSPI",,"10480","-90","-0.85","10470","10530","10390","13414","139967900","95376761280","9100836" +"126560","ǻó","KOSPI",,"4000","-10","-0.25","3970","4030","3950","158410","632288220","440811780000","110202945" +"001450","ػ","KOSPI",,"34550","-450","-1.29","35050","35050","34250","257506","8898257650","3088770000000","89400000" +"057050","Ȩ","KOSPI",,"48150","-750","-1.53","48600","48900","47750","10543","506467800","577800000000","12000000" +"460930","","KOSDAQ","߰߱","10780","-400","-3.58","11100","11180","10780","109957","1198741230","380252329380","35273871" +"092300","","KOSDAQ","췮","2855","-65","-2.23","2890","2935","2835","43738","125495035","53310889680","18672816" +"138360","","KOSDAQ","߰߱","792","-6","-0.75","820","820","791","41549","33021835","38291812416","48348248" +"011080","I&C","KOSDAQ","߰߱","560","-8","-1.41","568","580","560","61701","35021676","14281883840","25503364" +"093240","Ʈ","KOSPI",,"1180","13","1.11","1170","1198","1154","325006","381895074","36762661640","31154798" +"003010","","KOSPI",,"4720","-70","-1.46","4745","4795","4605","99165","465530905","60004165840","12712747" +"111110","ȣǾ","KOSPI",,"7340","20","0.27","7310","7350","7190","37621","273268440","71564882560","9749984" +"008770","ȣڽŶ","KOSPI",,"45350","-1150","-2.47","46800","46800","45300","169141","7707213000","1779902287350","39248121" +"008775","ȣڽŶ","KOSPI",,"38000","-350","-0.91","38200","38450","37950","738","28065900","28571402000","751879" +"060560","ȨŸȦ","KOSDAQ","췮","1000","-2","-0.20","990","1088","983","4748810","4962194217","127669525000","127669525" +"064240","ȨijƮ","KOSDAQ","췮","2725","-125","-4.39","2770","2820","2700","97387","266632430","95478582700","35038012" +"039610","ȭ","KOSDAQ","췮","10630","-770","-6.75","11200","11370","10460","1293554","13890721970","110662552000","10410400" +"378850","ȭ¾˾ؿ","KOSPI",,"3790","-130","-3.32","3880","3895","3770","58667","223708600","71985831170","18993623" +"241590","ȭ¿","KOSPI",,"7330","-160","-2.14","7490","7500","7180","251151","1829091870","444119393080","60589276" +"006060","ȭδ","KOSPI",,"3750","-95","-2.47","3810","3845","3690","133173","495037955","207450000000","55320000" +"013520","ȭ۷̼","KOSPI",,"1790","-29","-1.59","1800","1828","1767","76441","137123280","89591741080","50051252" +"010690","ȭ","KOSPI",,"8190","-200","-2.38","8320","8450","8100","121011","993084650","285998157900","34920410" +"126640","ȭ","KOSDAQ","췮","1325","-14","-1.05","1352","1352","1290","25440","33643604","48195400275","36373887" +"133820","ȭκƿ","KOSPI",,"836","-32","-3.69","884","884","835","42286","35848334","25770634648","30826118" +"127980","ȭνŰƮ","KOSDAQ","߰߱","6640","-310","-4.46","6880","6940","6610","14534","97317160","78622141760","11840684" +"061250","ȭϾǰ","KOSDAQ","߰߱","1511","-53","-3.39","1541","1552","1484","938113","1419649906","116162132172","76877652" +"010660","ȭõ","KOSPI",,"2655","-100","-3.63","2735","2760","2650","125088","336342220","58410000000","22000000" +"000850","ȭõ","KOSPI",,"27900","-550","-1.93","28350","28350","27500","751","20962100","61380000000","2200000" +"016580","ȯ","KOSPI",,"13070","-70","-0.53","13000","13250","12970","11735","153041550","243102914900","18600070" +"032560","ȲݿƼ","KOSPI",,"5240","-90","-1.69","5330","5340","5180","15196","79701940","89080000000","17000000" +"004800","ȿ","KOSPI",,"48400","-250","-0.51","49100","49100","46650","16198","778315950","810235698800","16740407" +"094280","ȿITX","KOSPI",,"12870","-110","-0.85","13000","13000","12850","8237","106169090","148754034000","11558200" +"097870","ȿغ","KOSDAQ","߰߱","6350","-200","-3.05","6510","6580","6350","31257","201275140","53911500000","8490000" +"298040","ȿ߰","KOSPI",,"248500","-8500","-3.31","255000","256000","242500","88607","21990188000","2317150178000","9324548" +"298050","ȿ÷ܼ","KOSPI",,"265500","-2500","-0.93","266500","267000","260000","14297","3762353000","1189426194000","4479948" +"298020","ȿƼؾ","KOSPI",,"279500","-4500","-1.58","284000","285000","278500","9968","2798789000","1209587119000","4327682" +"298000","ȿȭ","KOSPI",,"43000","-750","-1.71","43750","43750","42250","5655","240869100","163047873000","3791811" +"093370","ļ","KOSPI",,"6210","-510","-7.59","6710","6760","6200","391394","2504039000","666055599300","107255330" +"081660","ٶȦ","KOSPI",,"41700","-1550","-3.58","43650","43650","41600","114251","4797125900","2505996486300","60095839" +"290270","޳׽ÿ","KOSDAQ","ó","3830","-35","-0.91","3865","3885","3690","15950","59945955","36797383760","9607672" +"005870","޴ϵ","KOSPI",,"6950","-100","-1.42","7020","7200","6820","338980","2358728480","98106304250","14116015" +"353190","޷","KOSDAQ","߰߱","844","-57","-6.33","880","894","839","226338","193169115","33235386480","39378420" +"192410","޸Ʈ","KOSDAQ","߰߱","18920","0","0.00","0","0","0","0","0","53867245520","2847106" +"090710","޸κ","KOSDAQ","߰߱","1327","-47","-3.42","1385","1387","1313","1222791","1630711601","145469939955","109623165" +"078590","޸","KOSDAQ","߰߱","629","3","0.48","634","645","623","167357","105398767","34098303231","54210339" +"205470","޸ý","KOSDAQ","췮","1597","-62","-3.74","1645","1662","1596","2301355","3718716446","206611889373","129375009" +"115160","޸ƽ","KOSDAQ","߰߱","1716","-56","-3.16","1772","1810","1713","121595","212156585","75452732784","43970124" +"028080","޸ƽȦ","KOSDAQ","߰߱","2545","-105","-3.96","2575","2750","2515","64897","168184235","32009752770","12577506" +"175140","޸ũ","KOSDAQ","ȯ(ҼӺξ)","6160","10","0.16","6190","6190","6000","64324","390877190","132534198720","21515292" +"200670","޸޵","KOSDAQ","췮","31100","150","0.48","30750","31250","29800","75875","2328840000","349250823000","11229930" +"079980","޺","KOSPI",,"2975","-50","-1.65","3025","3055","2975","41464","124421645","102637500000","34500000" +"065510","޺","KOSDAQ","췮","9600","-250","-2.54","9810","9930","9530","32486","313601890","116729961600","12159371" +"215090","޼","KOSDAQ","(ҼӺξ)","1505","0","0.00","0","0","0","0","0","149972154360","99649272" +"005010","޽ƿ","KOSPI",,"3985","-45","-1.12","4010","4055","3955","305903","1218362230","223909478875","56188075" +"263920","޿ؾ","KOSDAQ","ó","1038","-24","-2.26","1064","1064","1031","41051","42646803","50908849092","49045134" +"243070","޿½","KOSDAQ GLOBAL","췮","27550","-250","-0.90","28000","28600","27100","49588","1370876250","330039770750","11979665" +"084110","޿½۷ι","KOSDAQ","߰߱","23850","50","0.21","23800","23950","23050","35395","830168300","301022584200","12621492" +"145020","","KOSDAQ GLOBAL","췮","242500","5000","2.11","235000","243500","235000","102847","24567820000","3056478002500","12604033" +"024060","ﱸ","KOSDAQ","߰߱","14550","210","1.46","14070","15720","14070","4503098","67721323030","218250000000","15000000" +"010240","ﱹ","KOSDAQ","췮","4805","-30","-0.62","4850","4850","4705","7409","35394770","59210554280","12322696" +"189980","ﱹ","KOSDAQ","췮","1712","-63","-3.55","1774","1775","1696","157753","271587493","68715959824","40137827" +"000540","ﱹȭ","KOSPI",,"3645","-50","-1.35","3705","3725","3615","89281","326229955","234164441025","64242645" +"000545","ﱹȭ","KOSPI",,"5460","-140","-2.50","5690","5690","5450","3022","16503840","4193280000","768000" +"003280","ؿ","KOSPI",,"1960","-80","-3.92","2005","2060","1960","2479042","4952815296","471232802040","240424899" +"037440","","KOSDAQ","췮","4875","-155","-3.08","5000","5040","4835","134118","658640260","67872065625","13922475" +"238490","","KOSDAQ","ó","4170","-35","-0.83","4100","4205","4070","14990","61588590","47172024120","11312236" \ No newline at end of file diff --git a/src/main/java/com/example/coin/designAPI.java b/src/main/java/com/example/coin/designAPI.java new file mode 100644 index 0000000..8419fb2 --- /dev/null +++ b/src/main/java/com/example/coin/designAPI.java @@ -0,0 +1,173 @@ +package com.example.coin; + +import com.example.coin.service.TradeService; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import lombok.RequiredArgsConstructor; +import org.json.JSONException; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequiredArgsConstructor +public class designAPI { //마이페이지 api + private final interestService interestService; + private final TradeService tradeService; + private final TransactionHistoryService service; + private Map> myPage; + private String userId =""; +// @GetMapping(value = "/drill") +// public String test(){ +// return "test"; +// + + @GetMapping (value = "/myPageApi") + public Map> adas(HttpServletRequest request) throws JSONException, IOException { + HttpSession session = request.getSession(); + userId = String.valueOf(session.getAttribute("ID")); + //userId= "조승빈"; + List tradeInfo = service.getUserTrade(userId); + double trade_cnt = 0.0 ; // 총 매매 횟수 + double win_cnt = 0.0; + myPage = new HashMap<>(); + //service. + List userOwnCoin= new ArrayList<>(); +// for(int i= 0;iDouble.valueOf(buyPrice)){ + win_cnt++; + } + userOwnCoin.remove(i); + break; + } + } + } + } + + List myCoin = new ArrayList<>(); + List user = service.getUserData(userId); + getUserCash uC = new getUserCash(user.get(0).getApi_key(),user.get(0).getSec_key()); + String total_krw = uC.getCash(); //유저가 가진 현금량 + Double myAllAsset = 0.0; //내 총자산 (내가 보유한 모든 코인가격 누적합 + 현금); + List userAmount = tradeService.getUserAmount(userId); + for(int i = 0;i< userAmount.size();i++){ + myAllAsset+= Double.valueOf(userAmount.get(i).getAmount()) *Double.valueOf(userAmount.get(i).getCoin_price()); + } + + for(int i = 0 ; i< userOwnCoin.size();i++){ + myAllAsset += Double.valueOf(userOwnCoin.get(i).getAmount()) * Double.valueOf(userOwnCoin.get(i).getPrice()); + } + myAllAsset += Double.valueOf(total_krw); + DecimalFormat decimalFormat = new DecimalFormat("#.#"); + for(int i = 0 ; i< userOwnCoin.size();i++){ + myCoin.add(userOwnCoin.get(i).getCoinName()); + Double coinAmount = Double.valueOf(userOwnCoin.get(i).getAmount()) * Double.valueOf(userOwnCoin.get(i).getPrice()); + coinAmount = coinAmount/myAllAsset; + //소수점 첫째자리까지만 짜름 + myCoin.add(decimalFormat.format(coinAmount)); + } + + myCoin.add("KRW"); + myCoin.add(decimalFormat.format(Double.valueOf(total_krw)/myAllAsset)); + for(int i = 0;i< userAmount.size();i++){ + myCoin.add(userAmount.get(i).getCoin_name()); + Double tmp = Double.valueOf(userAmount.get(i).getAmount()) *Double.valueOf(userAmount.get(i).getCoin_price()); + tmp /=myAllAsset; + myCoin.add(String.valueOf(tmp)); + } + + myPage.put("coinList",myCoin); + List win_rate = new ArrayList<>(); + win_rate.add(String.valueOf(win_cnt/trade_cnt*100)); + myPage.put("win_rate",win_rate); + List trade_rate = new ArrayList<>(); + myPage.put("trade_rate",trade_rate); + List user_amount = new ArrayList<>(); + user_amount.add(service.getUserRank(userId).get(0).getUser_amount()); + myPage.put("user_amount",user_amount); + System.out.println("정답: 수익률: "+ getProfit()); + List interests = interestService.getUserInterest(userId); + List userInterest = new ArrayList<>(); + for(int i=0; i userCash = new ArrayList<>(); + userCash.add(total_krw); + myPage.put("userCash",userCash); //유저가 가진 현금량 + return myPage; + } + public void insertValue(List e,HashMap h){ //해시테이블도 하나 받아와야함 + String temp; + for(int i=0;i buy=new HashMap(); //매수 + HashMap sell=new HashMap(); //매도 + insertValue(service.GetexcelData("매수"),buy);//state가 매수인 애들만 불러오기 + insertValue(service.GetexcelData("매도"),sell); //state가 매도인 애들만 불러오기 + List key=new ArrayList(buy.keySet()); + Double total_profit=0.0; + Double total_invest=0.0; + for (int i=0;i interestCoins = new ArrayList<>(); + + public void addInterestCoin(InterestCoin coin) { + interestCoins.add(coin); + coin.setUser(this); + } + + public void removeInterestCoin(InterestCoin coin) { + interestCoins.remove(coin); + coin.setUser(null); + } + +} diff --git a/src/main/java/com/example/coin/entity/UserTrade.java b/src/main/java/com/example/coin/entity/UserTrade.java new file mode 100644 index 0000000..b3e09d6 --- /dev/null +++ b/src/main/java/com/example/coin/entity/UserTrade.java @@ -0,0 +1,32 @@ +package com.example.coin.entity; + + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor +@Builder +@AllArgsConstructor +public class UserTrade { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column + private String userId; // 유저 아이디 + + @Column + private String coinName; // 매매한 코인 이름 + + @Column + private String state; // 매수*매도 상태 + + @Column + private String tradePrice ; // 체결 가격 + +} diff --git a/src/main/java/com/example/coin/getUserCash.java b/src/main/java/com/example/coin/getUserCash.java new file mode 100644 index 0000000..9df311a --- /dev/null +++ b/src/main/java/com/example/coin/getUserCash.java @@ -0,0 +1,52 @@ +package com.example.coin; + +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; +import com.squareup.okhttp.ResponseBody; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.HashMap; + +public class getUserCash { //유저가 보유한 현금을 구하는 클래스 + private Api_Client api ; + public getUserCash(String key, String sec){ + api= new Api_Client(key,sec); + } + + //현재 사용자가 가진 현금량을 리턴 + public String getCash() throws JSONException, IOException { + String coinName = "BTC"; + String coinPrice = getCoinPrice(coinName); + HashMap rgParams = new HashMap(); + rgParams.put("currency", coinName); + String result1 = api.callApi("/info/balance", rgParams); + System.out.println("여기: "+result1); + JSONObject json = new JSONObject(result1); + String data = json.getString("data"); //string()쓰기 + + JSONObject json1 = new JSONObject(data); + String total_krw = json1.getString("total_krw").toString(); //보유 자산 구하기 + return total_krw; + } + //코인의 현재 가격을 불러오는 함수 + public String getCoinPrice(String coinName) throws IOException, JSONException { + String URL = "https://api.bithumb.com/public/transaction_history/"+coinName+"_KRW"; + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder() + .url(URL) + .get() + .build(); + Response response = client.newCall(request).execute(); + ResponseBody body = response.body(); + JSONObject json = new JSONObject(body.string()); + JSONArray dataArray= json.getJSONArray("data"); + + JSONObject json1 = new JSONObject(dataArray.get(dataArray.length()-1).toString()); + String coinPrice = json1.get("price").toString(); + return coinPrice; + } +} diff --git a/src/main/java/com/example/coin/interest.java b/src/main/java/com/example/coin/interest.java new file mode 100644 index 0000000..31a9d58 --- /dev/null +++ b/src/main/java/com/example/coin/interest.java @@ -0,0 +1,20 @@ +package com.example.coin; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + + +@Entity +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class interest { + @Id + private String userName; + @Id + private String coinName; +} diff --git a/src/main/java/com/example/coin/interestService.java b/src/main/java/com/example/coin/interestService.java new file mode 100644 index 0000000..5716b7b --- /dev/null +++ b/src/main/java/com/example/coin/interestService.java @@ -0,0 +1,21 @@ +package com.example.coin; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor +public class interestService { + private final InterestRepository interestRepository; + public void save(interest i){interestRepository.save(i);} + public List getUserInterest(String id) { + return interestRepository.getUserInterest(id); + } + public List checkDuple(String userName,String coinName){ + return interestRepository.checkDuple(userName,coinName); + } +} diff --git a/src/main/java/com/example/coin/repository/CoinCommentRepository.java b/src/main/java/com/example/coin/repository/CoinCommentRepository.java new file mode 100644 index 0000000..75d2880 --- /dev/null +++ b/src/main/java/com/example/coin/repository/CoinCommentRepository.java @@ -0,0 +1,18 @@ +package com.example.coin.repository; + +import com.example.coin.entity.CoinComment; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Transactional +@Repository +public interface CoinCommentRepository extends JpaRepository { + + @Query("SELECT c FROM CoinComment c WHERE c.coinName = :coinName") + List findAllByCoinName(@Param("coinName") String coinName); +} diff --git a/src/main/java/com/example/coin/repository/CoinInfoRepository.java b/src/main/java/com/example/coin/repository/CoinInfoRepository.java new file mode 100644 index 0000000..9165170 --- /dev/null +++ b/src/main/java/com/example/coin/repository/CoinInfoRepository.java @@ -0,0 +1,40 @@ +package com.example.coin.repository; +import com.example.coin.entity.CoinInfo; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CoinInfoRepository extends JpaRepository { + + // state와 coinName으로 검색 + List findByStateAndCoinName(String state, String coinName); + // state, coinName, 그리고 타임스탬프 범위로 검색 + @Query("SELECT c FROM CoinInfo c WHERE c.state = :state AND c.coinName = :coinName AND c.coinDate BETWEEN :startDate AND :endDate") + List findByStateAndCoinNameAndTimestampBetween( + @Param("state") String state, + @Param("coinName") String coinName, + @Param("startDate") String startDate, + @Param("endDate") String endDate + ); + + //코인 이름과 상태로 검색후 page table 만큼 최신값에서 가져오는 로직 + + @Query("SELECT CAST(c.closingPrice AS double) FROM CoinInfo c WHERE c.coinName = :coinName AND c.state = :state ORDER BY c.coinDate DESC") + List findClosingPricesByCoinNameAndState( + @Param("coinName") String coinName, + @Param("state") String state, + Pageable pageable); + + @Query(value = "select exists (select 1 from coin_info where coin_date =:coin_date and coin_name =:coin_name)" ,nativeQuery = true) + int checkDuplicated(@Param("coin_date")String coin_date, + @Param("coin_name")String coin_name + ); + //인덱스 만드는 명령어 + //CREATE INDEX idx_coin_info_coinname_state_coindate ON coin_info(coin_name, state, coin_date DESC); + + //List findByStateAndCoinNameAndTimestampBetween(String state, String coinName, String startTimestamp, String endTimestamp); +} diff --git a/src/main/java/com/example/coin/repository/CoinNameRepository.java b/src/main/java/com/example/coin/repository/CoinNameRepository.java new file mode 100644 index 0000000..a1eec3f --- /dev/null +++ b/src/main/java/com/example/coin/repository/CoinNameRepository.java @@ -0,0 +1,22 @@ +package com.example.coin.repository; + +import com.example.coin.entity.CoinName; +import jakarta.transaction.Transactional; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + + +@Transactional +@Repository +public interface CoinNameRepository extends JpaRepository { + // 모든 데이터를 가져오는 메서드 (기본 제공 메서드) + List findAll(); + Optional findByCoinName(String coinName); + void deleteByCoinName(String coinName); +} diff --git a/src/main/java/com/example/coin/repository/CoinPriceRepository.java b/src/main/java/com/example/coin/repository/CoinPriceRepository.java new file mode 100644 index 0000000..3644453 --- /dev/null +++ b/src/main/java/com/example/coin/repository/CoinPriceRepository.java @@ -0,0 +1,20 @@ +package com.example.coin.repository; + + +import com.example.coin.entity.CoinInfo; +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class CoinPriceRepository { + private final EntityManager em; + public List getCoinPrice(){ + return em.createQuery("select m from coin_info m where m.state =:state", CoinInfo.class). + setParameter("state","24h").getResultList(); + } + +} diff --git a/src/main/java/com/example/coin/repository/SaveCoinStateRepository.java b/src/main/java/com/example/coin/repository/SaveCoinStateRepository.java new file mode 100644 index 0000000..f8363f6 --- /dev/null +++ b/src/main/java/com/example/coin/repository/SaveCoinStateRepository.java @@ -0,0 +1,56 @@ +package com.example.coin.repository; + + +import com.example.coin.entity.CoinInfo; +import com.example.coin.entity.CoinName; +import com.example.coin.entity.CoinPrice; +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashSet; +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class SaveCoinStateRepository { + private final EntityManager em; + + public void saveCoinName(CoinName coinName){ + em.persist(coinName); + } + public List getAllCoinName(){ + return em.createQuery("select m.coinName from CoinName m",String.class).getResultList(); + } + public CoinName getCoinNameEntity(String coinName) { + return em.createQuery("select m.coinName from CoinName m where m.coinName =:coinName",CoinName.class). + setParameter("coinName",coinName). + getSingleResult(); + } + + @Transactional(readOnly = true) + public List getCoinInfo( ){ + return em.createQuery("select m from coin_info m ", CoinInfo.class).getResultList(); + } + @Transactional + public void saveCoinPrice(CoinPrice coinPrice){ + em.persist(coinPrice); + } + + @Transactional + public void saveCoinInfo(String sql){ + try { + em.createNativeQuery(sql).executeUpdate(); + }catch (Exception e) { + System.out.println("벌크 인서트 중 에러: "); + //System.out.println("벌크 인서트 쿼리 : "+sql); + } + } + @Transactional(readOnly = true) + public Long findMaxId() { + String jpql = "SELECT MAX(c.id) FROM coin_info c"; + return em.createQuery(jpql, Long.class).getSingleResult(); + } + +} diff --git a/src/main/java/com/example/coin/repository/StockDataRepository.java b/src/main/java/com/example/coin/repository/StockDataRepository.java new file mode 100644 index 0000000..1303645 --- /dev/null +++ b/src/main/java/com/example/coin/repository/StockDataRepository.java @@ -0,0 +1,27 @@ +package com.example.coin.repository; + + +import com.example.coin.entity.Kosdaq; +import com.example.coin.entity.StockCode; +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class StockDataRepository { + private final EntityManager em; + + public void insertStockCode(StockCode stockCode){ + em.persist(stockCode); + } + public List getStockCode(){ + return em.createQuery("select m from StockCode m",StockCode.class).getResultList(); + } + + public void insertKosdaq(Kosdaq kosdaq){ + em.persist(kosdaq); + } +} diff --git a/src/main/java/com/example/coin/repository/UserRepository.java b/src/main/java/com/example/coin/repository/UserRepository.java new file mode 100644 index 0000000..00d3ec2 --- /dev/null +++ b/src/main/java/com/example/coin/repository/UserRepository.java @@ -0,0 +1,11 @@ +package com.example.coin.repository; + +import com.example.coin.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +@Repository +public interface UserRepository extends JpaRepository { +} diff --git a/src/main/java/com/example/coin/scheduler/CoinPriceScheduler.java b/src/main/java/com/example/coin/scheduler/CoinPriceScheduler.java new file mode 100644 index 0000000..5a5a132 --- /dev/null +++ b/src/main/java/com/example/coin/scheduler/CoinPriceScheduler.java @@ -0,0 +1,104 @@ +package com.example.coin.scheduler; + +import com.example.coin.repository.CoinInfoRepository; +import com.example.coin.repository.CoinNameRepository; +import com.example.coin.repository.SaveCoinStateRepository; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; +import com.squareup.okhttp.ResponseBody; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.scheduling.annotation.Scheduled; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicLong; + +public class CoinPriceScheduler { + AtomicLong idNum; + OkHttpClient client = new OkHttpClient(); + CoinNameRepository coinNameRepository; + CoinInfoRepository coinInfoRepository;; + String url = "https://api.bithumb.com/public/candlestick/"; + List coinNameList; + String state; + SaveCoinStateRepository repository; + + public CoinPriceScheduler(SaveCoinStateRepository repository, String state, AtomicLong idNum,CoinInfoRepository coinInfoRepository,CoinNameRepository coinNameRepository) { + this.coinNameList=repository.getAllCoinName(); + this.state=state; + this.repository=repository; + this.idNum=idNum; + this.coinInfoRepository = coinInfoRepository; + this.coinNameRepository = coinNameRepository; + } + + public void saveCoinPrice(ExecutorService executor) throws InterruptedException { + System.out.println(state + " insert start"); + long startTime = System.currentTimeMillis(); + + String sqlTemplate = "INSERT INTO coin_info (id, coin_date, opening_price, closing_price, max_price, min_price, units_traded, coin_name, state) VALUES "; + + List> futures = new ArrayList<>(); + + for (String c : coinNameList) { + CompletableFuture future = CompletableFuture.runAsync(() -> { + try { + StringBuilder localSql = new StringBuilder(sqlTemplate); + + Request request = new Request.Builder() + .url(url + c + "_KRW/" + state) + .get() + .addHeader("accept", "application/json") + .build(); + + Response response = client.newCall(request).execute(); + + ResponseBody body = response.body(); + JSONObject json = new JSONObject(body.string()); + JSONArray dataJson = new JSONArray(json.get("data").toString()); + + for (int i = 0; i < dataJson.length(); i++) { + JSONArray rowData = dataJson.getJSONArray(i); + String coin_date = rowData.get(0).toString(); + if (coinInfoRepository.checkDuplicated(coin_date, c) == 1) { + continue; + } + long currentId = idNum.getAndIncrement(); + localSql.append("(") + .append(currentId).append(", '") + .append(rowData.get(0).toString()).append("', '") + .append(rowData.get(1).toString()).append("', '") + .append(rowData.get(2).toString()).append("', '") + .append(rowData.get(3).toString()).append("', '") + .append(rowData.get(4).toString()).append("', '") + .append(rowData.get(5).toString()).append("', '") + .append(c).append("', '") + .append(state) + .append("'),"); + } + + if (localSql.length() > sqlTemplate.length()) { + String finalSql = localSql.substring(0, localSql.length() - 1); + repository.saveCoinInfo(finalSql); + } + } catch (Exception e) { + coinNameRepository.deleteByCoinName(c); + e.printStackTrace(); + } + }, executor); + + futures.add(future); + } + + // 모든 작업이 완료될 때까지 대기 + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); + + long endTime = System.currentTimeMillis(); + long totalTime = endTime - startTime; + System.out.println("Total time for " + state + " inserts: " + totalTime + " ms"); + } + +} diff --git a/src/main/java/com/example/coin/scrapper/CoinInfoScrapper.java b/src/main/java/com/example/coin/scrapper/CoinInfoScrapper.java new file mode 100644 index 0000000..3a6ae4f --- /dev/null +++ b/src/main/java/com/example/coin/scrapper/CoinInfoScrapper.java @@ -0,0 +1,60 @@ +package com.example.coin.scrapper; + +import com.example.coin.dto.CoinNewsDto; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.io.IOException; +import java.util.*; + +public class CoinInfoScrapper { //네이버에서 뉴스 기사를 최신순으로 긁어온다. + private static final String url = "https://search.naver.com/search.naver?where=news&query="; + //
  • 에서 sp_nws5까지 읽자(지금은 10개 읽어오고 있음) + //class="news_tit"인 a 태그에서 링크와 제목을 읽을 수 있다. + public List getCoinNews(String coin) throws IOException, InterruptedException { + List NewsList = new ArrayList<>(); + + Document document = Jsoup.connect(url + coin+"&=tab_opt&sort=1") + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36") + .timeout(10000) + .get(); + Elements group_news = document.select("div.group_news"); + Elements newsList = group_news.select("li"); + + for(Element li : newsList){ //이대로 작동시키면 가장 최근 10개의 뉴스기사를 읽어온다. + String newspaper = li.selectFirst("div.news_info .info_group > a.info.press").ownText().trim(); //신문사 + Element NewsImage = li.selectFirst("div.news_contents .dsc_thumb > img.thumb"); + String image="None"; + if (NewsImage != null) { + image = NewsImage.attr("data-lazysrc"); // 이미지 링크 + } + Element newsContentsDiv = li.select("div.news_contents").first(); + if (newsContentsDiv != null) { + Element content = newsContentsDiv.select("a").eq(1).first(); + if (content != null) { + String link = content.attr("href"); // 링크 + String title = content.attr("title"); // 텍스트 + NewsList.add(new CoinNewsDto(title, link, newspaper, image)); + } + } + } + return NewsList; + } + + public void TestScarap(String coin) throws IOException { + Document document = Jsoup.connect(url + coin+"&=tab_opt&sort=1") + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36") + .timeout(10000) + .get(); + System.out.print(document); + } + + public static void main(String[] args) throws IOException, InterruptedException { + CoinInfoScrapper scrapper = new CoinInfoScrapper(); +// scrapper.TestScarap("비트코인"); + scrapper.getCoinNews("비트코인"); + } + +} diff --git a/src/main/java/com/example/coin/service/AutoTrading.java b/src/main/java/com/example/coin/service/AutoTrading.java new file mode 100644 index 0000000..06c384c --- /dev/null +++ b/src/main/java/com/example/coin/service/AutoTrading.java @@ -0,0 +1,95 @@ +//package com.example.coin.service; +// +//import com.example.coin.BithumbApi; +//import com.example.coin.Indicators; +//import com.example.coin.service.TradeService; +//import com.example.coin.entity.CoinName; +//import com.example.coin.repository.CoinNameRepository; +//import com.squareup.okhttp.OkHttpClient; +//import com.squareup.okhttp.Request; +//import com.squareup.okhttp.Response; +//import com.squareup.okhttp.ResponseBody; +//import lombok.RequiredArgsConstructor; +//import org.json.JSONArray; +//import org.json.JSONException; +//import org.json.JSONObject; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.scheduling.annotation.Scheduled; +//import org.springframework.stereotype.Service; +//import org.springframework.transaction.annotation.Transactional; +// +//import java.io.IOException; +//import java.text.DecimalFormat; +//import java.util.ArrayList; +//import java.util.List; +/// +//@Service +//@Transactional +//@RequiredArgsConstructor +//public class AutoTrading { +// +// private final TradeService tradeService; +// private final CoinNameRepository coinNameRepository; +// +// @Scheduled(fixedRate = 1000000000) //1초에 한번씩 +// public void autoTradingSystem() throws IOException, JSONException { +// BithumbApi bithumbApi = new BithumbApi(); +// List coinNameList = coinNameRepository.findAll(); +// while (true) { +// String buyCoinName = ""; +// String units = ""; +// double buyPrice = 0.0; +// while (buyCoinName.equals("")) { +// int stopFlag = 0; +// +// for (CoinName coinName : coinNameList) { +// if (stopFlag == 1) { +// break; +// } +// List closingPrices = new ArrayList<>(); +// String url = "https://api.bithumb.com/public/candlestick/"; +// url += coinName.getCoinName(); +// url += "_KRW/1m"; +// OkHttpClient client = new OkHttpClient(); +// Request request = new Request.Builder() +// .url(url) +// .get() +// .addHeader("accept", "application/json") +// .build(); +// Response response = client.newCall(request).execute(); +// +// String responseData = response.body().string(); +// JSONObject jsonObject = new JSONObject(responseData); +// JSONArray jsonArray = new JSONArray(jsonObject.get("data").toString()); +// +// for (int i = 0; i < jsonArray.length(); i++) { +// JSONArray rowData = jsonArray.getJSONArray(i); +// closingPrices.add(Double.parseDouble(rowData.get(2).toString())); +// } +// Indicators indicators = new Indicators(closingPrices); +// double RSI = indicators.calculateRSI(14); +// double lowerBand = indicators.calculateBollingerBands(20, 2); +// // if ((RSI<30)&&(closingPrices.get(closingPrices.size()-1)= buyPrice * 1.015) || (currentPrice <= buyPrice * 0.97)) { +// tradeService.sellCoin(buyCoinName, units); +// buyCoinName = ""; +// break; +// } +// } +// } +// } +//} diff --git a/src/main/java/com/example/coin/service/CoinCommentService.java b/src/main/java/com/example/coin/service/CoinCommentService.java new file mode 100644 index 0000000..885decc --- /dev/null +++ b/src/main/java/com/example/coin/service/CoinCommentService.java @@ -0,0 +1,34 @@ +package com.example.coin.service; + +import com.example.coin.dto.CoinCommentDto; +import com.example.coin.entity.CoinComment; +import com.example.coin.repository.CoinCommentRepository; +import com.example.coin.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class CoinCommentService { + + private final CoinCommentRepository commentRepository; + private final UserRepository userRepository; + + public List getCoinCommentList(String coinName) { + List commentDto = commentRepository.findAllByCoinName(coinName) + .stream() + .map(CoinCommentDto::new) + .toList(); + return commentDto; + } + + public void saveComment(String coinName, Long userId, String comment) { + commentRepository.save(CoinComment.builder() + .user(userRepository.findById(userId).get()) + .comment(comment) + .coinName(coinName) + .build()); + } +} diff --git a/src/main/java/com/example/coin/service/CoinNameSercvice.java b/src/main/java/com/example/coin/service/CoinNameSercvice.java new file mode 100644 index 0000000..a88616b --- /dev/null +++ b/src/main/java/com/example/coin/service/CoinNameSercvice.java @@ -0,0 +1,29 @@ +package com.example.coin.service; + + +import com.example.coin.dto.CoinNameDto; +import com.example.coin.entity.CoinName; +import com.example.coin.repository.CoinNameRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Transactional(readOnly = true) +@Service +@RequiredArgsConstructor +public class CoinNameSercvice { + private final CoinNameRepository coinNameRepository; + public List getAllCoinName(){ + return coinNameRepository.findAll().stream() + .map(coinName -> CoinNameDto.builder() + .coinCode(coinName.getCoinName()) + .englishName(coinName.getEnglishName()) + .koreanName(coinName.getKoreanName()) + .build()) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/example/coin/service/CoinNewsService.java b/src/main/java/com/example/coin/service/CoinNewsService.java new file mode 100644 index 0000000..de6c65e --- /dev/null +++ b/src/main/java/com/example/coin/service/CoinNewsService.java @@ -0,0 +1,22 @@ +package com.example.coin.service; + +import com.example.coin.dto.CoinNewsDto; +import com.example.coin.scrapper.CoinInfoScrapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class CoinNewsService { + + private final CoinInfoScrapper scrapper = new CoinInfoScrapper(); + + public List getCoinNews(String coin_name) throws IOException, InterruptedException { + return scrapper.getCoinNews(coin_name); + } +} diff --git a/src/main/java/com/example/coin/service/CoinPriceScheduler.java b/src/main/java/com/example/coin/service/CoinPriceScheduler.java new file mode 100644 index 0000000..0b711fe --- /dev/null +++ b/src/main/java/com/example/coin/service/CoinPriceScheduler.java @@ -0,0 +1,18 @@ +package com.example.coin.service; + +import com.example.coin.repository.CoinPriceRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +@RequiredArgsConstructor +public class CoinPriceScheduler { + private final CoinPriceRepository coinPriceRepository; +// @Scheduled(fixedRate = 1000) //1초에 한번씩 +// public void fetchAndSaveCoinPrices() { +// +// } +} diff --git a/src/main/java/com/example/coin/service/CoinPriceService.java b/src/main/java/com/example/coin/service/CoinPriceService.java new file mode 100644 index 0000000..6ed1cf0 --- /dev/null +++ b/src/main/java/com/example/coin/service/CoinPriceService.java @@ -0,0 +1,81 @@ +package com.example.coin.service; + + +import com.example.coin.Indicators; +import com.example.coin.TimestampConverter; +import com.example.coin.dto.CoinPriceDto; +import com.example.coin.entity.CoinInfo; +import com.example.coin.dto.CoinInfoDto; +import com.example.coin.entity.CoinName; +import com.example.coin.repository.CoinInfoRepository; +import com.example.coin.repository.CoinNameRepository; +import com.example.coin.repository.CoinPriceRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collector; +import java.util.stream.Collectors; + +@Transactional(readOnly = true) +@Service +@RequiredArgsConstructor +public class CoinPriceService { + private final CoinPriceRepository coinPriceRepository; + private final CoinInfoRepository coinInfoRepository; + private final CoinNameRepository coinNameRepository; + public List getCoinPrice(){ + return coinPriceRepository.getCoinPrice(); + } + public ListgetCurrentPriceList(String state, int num){ + List coinPriceDtos = new ArrayList<>(); + List coinNameList = coinNameRepository.findAll(); + Pageable pageable = PageRequest.of(0, num+1); // 첫 번째 페이지, num 개만큼 가져옴 + for(CoinName coinName:coinNameList){ + + List closingPriceList = coinInfoRepository.findClosingPricesByCoinNameAndState(coinName.getCoinName(), state, pageable); + // 값이 num보다 적은 경우 예외 처리 + if (closingPriceList.size() < num ||closingPriceList.size() < 14) { + continue; +// throw new IllegalArgumentException("Insufficient data for coin: " + coinName.getCoinName() + +// ". Expected at least " + num + " closing prices, but found " + closingPriceList.size()); + } + Indicators indicators = new Indicators(closingPriceList); + Double rsi = indicators.calculateRSI(num); + String currentPrice = String.valueOf(closingPriceList.get(0)); + CoinPriceDto coinPriceDto = CoinPriceDto.builder(). + currentPrice(currentPrice). + coinName(coinName.getKoreanName()). + state(state). + rsi(rsi). + build(); + + coinPriceDtos.add(coinPriceDto); + + } + return coinPriceDtos.stream().sorted(Comparator.comparing(CoinPriceDto::getRsi).reversed()).collect(Collectors.toList()); + + } + public List getCoinInfo(String coinName, String coinState,String starDate,String endDate) throws ParseException { + TimestampConverter timestampConverter = new TimestampConverter(); + return coinInfoRepository. + findByStateAndCoinNameAndTimestampBetween(coinState,coinName,timestampConverter.dateToStamp(starDate),timestampConverter.dateToStamp(endDate)) + .stream().map(coinInfo -> CoinInfoDto.builder(). + coinDate(coinInfo.getCoinDate()). + coinName(coinName). + closingPrice(coinInfo.getClosingPrice()). + maxPrice(coinInfo.getMaxPrice()). + minPrice(coinInfo.getMinPrice()). + openingPrice(coinInfo.getOpeningPrice()). + unitsTraded(coinInfo.getUnitsTraded()). + build()). + collect(Collectors.toList()); + + } +} diff --git a/src/main/java/com/example/coin/service/SaveCoinStateService.java b/src/main/java/com/example/coin/service/SaveCoinStateService.java new file mode 100644 index 0000000..f4800d3 --- /dev/null +++ b/src/main/java/com/example/coin/service/SaveCoinStateService.java @@ -0,0 +1,215 @@ +package com.example.coin.service; + + +import com.example.coin.entity.CoinName; +import com.example.coin.repository.CoinInfoRepository; +import com.example.coin.repository.CoinNameRepository; +import com.example.coin.repository.SaveCoinStateRepository; +import com.example.coin.scheduler.CoinPriceScheduler; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; +import com.squareup.okhttp.ResponseBody; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.IOException; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicLong; + + +@Service +@RequiredArgsConstructor +public class SaveCoinStateService { + private final SaveCoinStateRepository saveCoinStateRepository; + private final CoinInfoRepository coinInfoRepository; + private final CoinNameRepository coinNameRepository; + public static final AtomicLong idNum = new AtomicLong(1); //얘는 공유객체 필요없네. + + ExecutorService executor; + private CoinPriceScheduler oneM; + private CoinPriceScheduler threeM; + private CoinPriceScheduler fiveM; + private CoinPriceScheduler daily; + @PostConstruct //bean 주입이 다 끝나고 동작하게 만드는 어노테이션 + public void createScheduler(){ //스케줄러 객체 생성을 위한 함수. + //스레드 풀을 공유객체로 만듦. 이제 executor을 조작해서 스레드를 독점하지 못하게 해야함. + int numThreads = Runtime.getRuntime().availableProcessors()*2; + executor = Executors.newFixedThreadPool(numThreads); + oneM = new CoinPriceScheduler(saveCoinStateRepository,"1m",idNum,coinInfoRepository,coinNameRepository); + threeM=new CoinPriceScheduler(saveCoinStateRepository,"3m",idNum,coinInfoRepository,coinNameRepository);// 스케줄러 객체 + fiveM=new CoinPriceScheduler(saveCoinStateRepository,"5m",idNum,coinInfoRepository,coinNameRepository); + daily=new CoinPriceScheduler(saveCoinStateRepository,"24h",idNum,coinInfoRepository,coinNameRepository); + } + + @Transactional + public void saveCoinName() throws JSONException, IOException { + OkHttpClient client = new OkHttpClient(); + String url = "https://api.bithumb.com/v1/market/all?isDetails=false"; + Request request = new Request.Builder() + .url(url) + .get() + .addHeader("accept", "application/json") + .build(); + + Response response = client.newCall(request).execute(); + ResponseBody body = response.body(); + + JSONArray json = new JSONArray(body.string()); + long startTime = System.currentTimeMillis(); + for(int i =0;i< json.length();i++){ + JSONObject jsonObject = new JSONObject(json.get(i).toString()); + + String tempParse[] = jsonObject.getString("market").split("-"); + Optional existingCoinName = coinNameRepository.findByCoinName(tempParse[1]); + + String englishName = jsonObject.getString("english_name"); + String koreanName = jsonObject.getString("korean_name"); + if (!existingCoinName.isPresent()) { //중복된 값이 아니면 + CoinName coinName = CoinName.builder(). + coinName(tempParse[1]). + englishName(englishName). + koreanName(koreanName). + build(); + saveCoinStateRepository.saveCoinName(coinName); + } + } + long endTime = System.currentTimeMillis(); + long totalTime = endTime - startTime; + + System.out.println("Total time for inserts: " + totalTime + " ms"); + + } + + + public void saveCoinPrice() throws InterruptedException { + OkHttpClient client = new OkHttpClient(); + String[] state = {"1m", "3m", "5m", "10m", "15m", "30m", "1h", "4h", "6h", "12h", "24h", "1w", "1mm"}; + String url = "https://api.bithumb.com/public/candlestick/"; + + List coinNameList = saveCoinStateRepository.getAllCoinName(); + long startTime = System.currentTimeMillis(); + + String sqlTemplate = "INSERT INTO coin_info (id, coin_date, opening_price, closing_price, max_price, min_price, units_traded, coin_name, state) VALUES "; + + int numThreads = Runtime.getRuntime().availableProcessors() * 2; + + ExecutorService executor = Executors.newFixedThreadPool(numThreads); + + for (String s : state) { + executor.submit(() -> { + // = getInitialIdNum(); // Method to get initial idNum + StringBuilder localSql = new StringBuilder(); + localSql.append(sqlTemplate); + + for (String c : coinNameList) { + try { + Request request = new Request.Builder() + .url(url + c + "_KRW/" + s) + .get() + .addHeader("accept", "application/json") + .build(); + + Response response = client.newCall(request).execute(); + + ResponseBody body = response.body(); + JSONObject json = new JSONObject(body.string()); + JSONArray dataJson = new JSONArray(json.get("data").toString()); + + for (int i = 0; i < dataJson.length(); i++) { + + JSONArray rowData = dataJson.getJSONArray(i); + long currentId = idNum.getAndIncrement(); // Atom + localSql.append("("); + localSql.append(currentId).append(", '"); + localSql.append(rowData.get(0).toString()).append("', '"); + localSql.append(rowData.get(1).toString()).append("', '"); + localSql.append(rowData.get(2).toString()).append("', '"); + localSql.append(rowData.get(3).toString()).append("', '"); + localSql.append(rowData.get(4).toString()).append("', '"); + localSql.append(rowData.get(5).toString()).append("', '"); + localSql.append(c).append("', '"); + localSql.append(s); + localSql.append("'),"); + } + + // After processing, insert into the database + if (localSql.length() > sqlTemplate.length()) { + // Remove the last comma + String finalSql = localSql.substring(0, localSql.length() - 1); + saveCoinStateRepository.saveCoinInfo(finalSql); + + // Reset localSql for the next batch + localSql.setLength(0); + localSql.append(sqlTemplate); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + executor.shutdown(); + if (executor.awaitTermination(10, TimeUnit.MINUTES)) { + System.out.println("All tasks completed."); + } else { + System.out.println("Timeout occurred before termination."); + } + + long endTime = System.currentTimeMillis(); + long totalTime = endTime - startTime; + System.out.println("Total time for inserts: " + totalTime + " ms"); + } + +// private synchronized int getInitialIdNum() { +// // Synchronize this method if idNum needs to be unique across threads +// // Alternatively, use an AtomicInteger for thread-safe increments +// return idNum++; +// } + + + public void findMaxId(){ + Long id = saveCoinStateRepository.findMaxId(); + if(id==null){ + System.out.println("null"); + } + + System.out.println(id); + } + //1분짜리 +// @Async +// @Scheduled(fixedRate = 60000) +// public synchronized void OneMinute() throws InterruptedException{ +// //synchronized 사용하면 이전작업이 끝나기 전까지 록 걸어서 대기 시킨다함. +// oneM.saveCoinPrice(executor); +// } +// //3분짜리 +// @Async +// @Scheduled(fixedRate = 180000) +// public void ThreeMinute() throws InterruptedException{ +// threeM.saveCoinPrice(executor); +// } +// //5분짜리 +// @Async +// @Scheduled(fixedRate = 300000) +// public void FiveMinute() throws InterruptedException{ +// fiveM.saveCoinPrice(executor); +// } +// //24시간짜리 +// @Async +// @Scheduled(fixedRate = 86400000) +// public void Daily() throws InterruptedException{ +// daily.saveCoinPrice(executor); +// } + +} \ No newline at end of file diff --git a/src/main/java/com/example/coin/service/SaveStockDataService.java b/src/main/java/com/example/coin/service/SaveStockDataService.java new file mode 100644 index 0000000..340b30c --- /dev/null +++ b/src/main/java/com/example/coin/service/SaveStockDataService.java @@ -0,0 +1,62 @@ +package com.example.coin.service; + + +import com.example.coin.WebCrawler; +import com.example.coin.entity.Kosdaq; +import com.example.coin.entity.StockCode; +import com.example.coin.repository.StockDataRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.*; +import java.nio.charset.Charset; +import java.util.List; + + +@RequiredArgsConstructor +@Service +@Transactional +public class SaveStockDataService { + private final StockDataRepository saveStockDataRepository; + + public void insertStockCode(){ + String filePath = "/Users/joseungbin/Downloads/coin 21-04-19-055/src/main/java/com/example/coin/csv/stock.csv"; // 파일 경로 + + try (BufferedReader br = new BufferedReader( + new InputStreamReader(new FileInputStream(filePath), Charset.forName("EUC-KR")))) { + String line; + int cnt = 0; + br.readLine(); + while ((line = br.readLine()) != null) { + // CSV 파일의 각 줄을 ,(콤마)로 분리 + String[] values = line.split(","); + StockCode stockCode = StockCode.builder(). + code(values[0].substring(1,values[0].length()-1)). + name(values[1].substring(1,values[1].length()-1)). + state(values[2].substring(1,values[2].length()-1)). + stockNum(values[13].substring(1,values[13].length()-1)). + build(); + saveStockDataRepository.insertStockCode(stockCode); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + public void insertStockPrice() throws IOException { + //List stockCodes = saveStockDataRepository.getStockCode(); + + String url = "https://finance.naver.com/item/frgn.naver?code=089030&page="; + WebCrawler webCrawler = new WebCrawler(); + List> stockPriceList = webCrawler.getStockPriceData(url); + for (List stockPrice:stockPriceList){ + Kosdaq kosdaq = Kosdaq.builder(). + code("089030"). + coinDate(stockPrice.get(0)). + price(stockPrice.get(1)). + volume(stockPrice.get(2)). + build(); + saveStockDataRepository.insertKosdaq(kosdaq); + } + } +} diff --git a/src/main/java/com/example/coin/service/TradeService.java b/src/main/java/com/example/coin/service/TradeService.java new file mode 100644 index 0000000..727cf78 --- /dev/null +++ b/src/main/java/com/example/coin/service/TradeService.java @@ -0,0 +1,83 @@ +package com.example.coin.service; + +import com.example.coin.*; +import lombok.RequiredArgsConstructor; +import org.json.JSONException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.IOException; +import java.text.DecimalFormat; +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor +public class TradeService { + private final TradeRepository tradeRepository; + private final TransactionHistoryRepository transactionReposi; + Api_Client api=new Api_Client("e8d62d019ec15f02480fff030e52db42","eddf5053c29a30136cc954f41d49df65"); + public void buyCoin(String coinName, String price) throws JSONException, IOException { + + tradeRepository.buy_coin(api,coinName,Double.parseDouble(price)); + } + public void sellCoin(String coinName, String units) throws IOException { + tradeRepository.sell_coin(api,coinName,units); + } + public int WritePurchaseLog(String coin_name, String price,String user_id) throws JSONException, IOException { + List user=transactionReposi.getUserData(user_id); //유저찾기 + Api_Client api=new Api_Client(user.get(0).getApi_key(),user.get(0).getSec_key()); + transaction_log log=new transaction_log(); + transaction_log past_log=tradeRepository.getCoinAmount(log.getCoin_name(), log.getUser_id()); + log.setAmount(Double.parseDouble(tradeRepository.buy_coin(api,coin_name,Integer.parseInt(price)))); + if(log.getAmount()!=0){ + if(past_log==null) {//만약 코인보유량이 없으면 새로생성 + log.setCoin_name(coin_name); + log.setUser_id(user.get(0).getIdentity()); + log.setCoin_price(tradeRepository.getCoinPrice(coin_name)); + tradeRepository.WriteLog(log); + } + else{//있다면 보유량을 더해서 업데이트 + past_log.setAmount(past_log.getAmount()+log.getAmount()); + past_log.setCoin_price(tradeRepository.getCoinPrice(coin_name)); + tradeRepository.EditLog(past_log); + } + return 1; //구매 성공시 1리턴 + } + return 0; //구매 실패시 0리턴 + } + + public int WriteSellLog(String coin_name, String price,String user_id) throws IOException, JSONException { + List user=transactionReposi.getUserData(user_id); //유저찾기 + transaction_log log=new transaction_log(); //로그객체 생성 + Api_Client api=new Api_Client(user.get(0).getApi_key(),user.get(0).getSec_key()); //api생성 + DecimalFormat decimalFormat = new DecimalFormat("#.####"); //구매를 위한 수량 포맷 맞추기 + //String coinPrice=tradeRepository.getCoinPrice(coin_name); //코인가격 받아오기// 이거 고치기 + //코인가격이 현재 실시간 가격이 아니라 매수 했을 때 가격을 불러와야함 + String coinPrice = tradeRepository.getBuyPrice(coin_name,user_id).get(0).getCoin_price(); + String amount=decimalFormat.format(Double.valueOf(price)*0.68/Double.parseDouble(coinPrice)); //판매할 수량 결정 + System.out.println("팔 현금량 " +Double.valueOf(price)); + System.out.println("현재 코인가격 " +Double.parseDouble(coinPrice)); + System.out.println("현재 팔 량"+amount); + + log.setAmount(Double.parseDouble(amount)); + //log.setCoin_price(tradeRepository.getCoinPrice(coin_name)); + transaction_log past_log=tradeRepository.getCoinAmount(coin_name,user.get(0).getIdentity()); //테이블에서 코인기록 불러오기 + System.out.println("현재 보유량"+past_log.getAmount()); + if(past_log.getAmount() getUserAmount(String user_id){ return tradeRepository.getUserAmount(user_id);} + +} \ No newline at end of file diff --git a/src/main/java/com/example/coin/service/UserAssetService.java b/src/main/java/com/example/coin/service/UserAssetService.java new file mode 100644 index 0000000..9754345 --- /dev/null +++ b/src/main/java/com/example/coin/service/UserAssetService.java @@ -0,0 +1,47 @@ +package com.example.coin.service; + +import com.example.coin.bithumb.UserAsset; +import com.example.coin.dto.UserAssetDto; +import com.example.coin.entity.CoinName; +import com.example.coin.repository.CoinNameRepository; +import lombok.RequiredArgsConstructor; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class UserAssetService { + String apiKey = "e8d62d019ec15f02480fff030e52db42"; + String apiSec = "eddf5053c29a30136cc954f41d49df65"; + UserAsset cash = new UserAsset(apiKey,apiSec); + private final CoinNameRepository coinNameRepository; + public List getUserAsset() throws JSONException, IOException { + String userAsset = cash.getUserAsset(); + JSONObject json = new JSONObject(userAsset); + List coinNameList =coinNameRepository.findAll(); + List userAssetDtoList = new ArrayList<>(); + String query ="total_"; + String userCash = json.getString("total_krw" ); + for (CoinName coinName: coinNameList){ + String coin= coinName.getCoinName(); + Double amount = Double.parseDouble(json.getString(query+coin.toLowerCase()).toString()); //보유 자산 구하기 + // + if(amount>0.0){ + UserAssetDto userAssetDto = UserAssetDto.builder(). + coinAmount(String.valueOf(amount)). + //tradePrice(). + coinName(coin). + cash(userCash). + build(); + //System.out.println(coinName.getKoreanName()); + userAssetDtoList.add(userAssetDto); + } + } + return userAssetDtoList; + } +} diff --git a/src/main/java/com/example/coin/statisticsApi.java b/src/main/java/com/example/coin/statisticsApi.java new file mode 100644 index 0000000..a4eb50a --- /dev/null +++ b/src/main/java/com/example/coin/statisticsApi.java @@ -0,0 +1,42 @@ +package com.example.coin; + + +import com.example.coin.service.TradeService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequiredArgsConstructor +public class statisticsApi { + private String userId =""; + private final TradeService tradeService; + private final TransactionHistoryService service; + Map> api = new HashMap<>(); + @GetMapping(value = "/login/statisticsApi") + public Map> makeAPI(){ + + //사용자들이 매매한 코인중 누적 매매량을 보여줌 + List coinCount = service.coinStatistics(); + + api.put("coinStatistics",coinCount); + List userRank = service.getRank(); + List userRankAPI = new ArrayList<>(); + for(int i = 0;i3){ + winR = winR.substring(0,4); + } + userRankAPI.add(winR); + } + api.put("userRank",userRankAPI); + return api; + } + +} diff --git a/src/main/java/com/example/coin/statisticsController.java b/src/main/java/com/example/coin/statisticsController.java new file mode 100644 index 0000000..481110d --- /dev/null +++ b/src/main/java/com/example/coin/statisticsController.java @@ -0,0 +1,50 @@ +package com.example.coin; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; + +import java.io.IOException; +import java.util.List; + +@Controller +@Slf4j +@RequiredArgsConstructor +public class statisticsController { + private final interestService service; + @GetMapping (value ="/login/statistics") + public String userRank() + { + return "statistics" ; + } + @GetMapping(value = "login/coinInterest/{id}") + public void esfj(@PathVariable String id, HttpServletRequest request,HttpServletResponse response) throws IOException { + System.out.println("get"); + HttpSession session = request.getSession(); + String userId = String.valueOf(session.getAttribute("ID")); + //중복 처리해보기 + List check = service.checkDuple(userId,id); //중복값 체크 + if(check.size() == 0){ //DB에 관심종목이 없을 때 추가 + interest i = new interest(); + i.setCoinName(id); + i.setUserName(userId); + service.save(i); + } + + + response.setStatus(HttpServletResponse.SC_OK); + response.setHeader("Location", "/login/search"); //이동할 url 경로 + response.setHeader("Content-Type", "text/html"); + response.getWriter().println(""); + + + } + + +} diff --git a/src/main/java/com/example/coin/trade_history.java b/src/main/java/com/example/coin/trade_history.java new file mode 100644 index 0000000..ff93f12 --- /dev/null +++ b/src/main/java/com/example/coin/trade_history.java @@ -0,0 +1,20 @@ +package com.example.coin; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +public class trade_history { + @Id + @GeneratedValue + @Column(name = "id", nullable = false) //DB칼럼이름이 what //notnull + private Long id; + + +} diff --git a/src/main/java/com/example/coin/transaction_log.java b/src/main/java/com/example/coin/transaction_log.java new file mode 100644 index 0000000..66205bb --- /dev/null +++ b/src/main/java/com/example/coin/transaction_log.java @@ -0,0 +1,27 @@ +package com.example.coin; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class transaction_log { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id", nullable = false) //DB칼럼이름이 what //notnull + private Long id; + + private String coin_name; //체결한 코인 이름 + + private double amount; // 보유중인 코인 수 + + private String user_id; //유저 이름 + + private String coin_price; //체결 당시 코인 가격 +} diff --git a/src/main/java/com/example/coin/user_asset.java b/src/main/java/com/example/coin/user_asset.java new file mode 100644 index 0000000..2479910 --- /dev/null +++ b/src/main/java/com/example/coin/user_asset.java @@ -0,0 +1,24 @@ +package com.example.coin; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jdk.jfr.Enabled; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter +public class user_asset { + @Id + @GeneratedValue//(strategy = GenerationType.AUTO) + @Column(name = "id", nullable = false) //DB칼럼이름이 what //notnull + private Long id; + + private String total_currency; + private String total_krw; + private String available_currency; + private String available_krw; +} diff --git a/src/main/java/com/example/coin/user_info.java b/src/main/java/com/example/coin/user_info.java new file mode 100644 index 0000000..4916ea6 --- /dev/null +++ b/src/main/java/com/example/coin/user_info.java @@ -0,0 +1,23 @@ +package com.example.coin; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter +public class user_info { + @Id + @GeneratedValue//(strategy = GenerationType.AUTO) + @Column(name = "id", nullable = false) //DB칼럼이름이 what //notnull + private Long id; + + private String identity; + private String pass; + private String api_key; + private String sec_key; +} diff --git a/src/main/java/com/example/coin/user_rank.java b/src/main/java/com/example/coin/user_rank.java new file mode 100644 index 0000000..d744b93 --- /dev/null +++ b/src/main/java/com/example/coin/user_rank.java @@ -0,0 +1,28 @@ +package com.example.coin; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter +public class user_rank { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id", nullable = false) + private Long id; + + @Column(name = "user_id", nullable = false) + private String user_id; //유저 id + + @Column + private String win_rate; //유저 승률 + + @Column + private String profit_rate; //유저 수익률 + + @Column + private String user_amount; //유저의 총자산(코인 + 현금) + +} diff --git a/src/main/resources/log4jdbc.log4j2.properties b/src/main/resources/log4jdbc.log4j2.properties new file mode 100644 index 0000000..842abb8 --- /dev/null +++ b/src/main/resources/log4jdbc.log4j2.properties @@ -0,0 +1,4 @@ +log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator +log4jdbc.dump.sql.maxlinelength=0 +log4jdbc.auto.load.popular.drivers=false +log4jdbc.drivers=com.mysql.cj.jdbc.Driver \ No newline at end of file diff --git a/src/main/resources/static/image/KakaoTalk_Image_2023-12-01-01-00-09.png b/src/main/resources/static/image/KakaoTalk_Image_2023-12-01-01-00-09.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9e302d8dcead4899844b3e01a45639029ded68 GIT binary patch literal 26349 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 BSLXl# literal 0 HcmV?d00001 diff --git a/src/main/resources/static/style.css b/src/main/resources/static/style.css new file mode 100644 index 0000000..e5565c2 --- /dev/null +++ b/src/main/resources/static/style.css @@ -0,0 +1,28 @@ +nav { + text-align: center; + font-size: x-large; + font-weight: bold; + background-color: orange; + padding-top: 25px; + height: 50px; +} + +button { + height: 50px; + width: 100px; + font-size: large; +} + +.form-group { + padding: 20px; + margin-bottom: 30px; + border-width: medium; + border-color: black; + border-style: solid; + width: 800px; +} + +textarea { + width: 800px; + height: 300px; +} diff --git a/src/main/resources/templates/apitest.html b/src/main/resources/templates/apitest.html new file mode 100644 index 0000000..4b6d10a --- /dev/null +++ b/src/main/resources/templates/apitest.html @@ -0,0 +1,32 @@ + + + + + + + + + + + + +
    +

    승빈

    +
    + + + diff --git a/src/main/resources/templates/board.html b/src/main/resources/templates/board.html new file mode 100644 index 0000000..34da47c --- /dev/null +++ b/src/main/resources/templates/board.html @@ -0,0 +1,372 @@ + + + + + + + + Bithigh 게시판 + + + + +

    게시판

    +
    +
    +

    게시물

    +
    +
    + +
      +
    • 번호
    • +
    • 제목
    • +
    • 작성자
    • +
    • 작성일
    • +
    • 조회
    • +
    + +
    + + +
    + +
    +
    +

    나의 게시물

    +
    +
    +
      +
    • 선택
    • +
    • 제목
    • +
    +
    + +
    + + + \ No newline at end of file diff --git a/src/main/resources/templates/coinGraph.html b/src/main/resources/templates/coinGraph.html new file mode 100644 index 0000000..958f6bf --- /dev/null +++ b/src/main/resources/templates/coinGraph.html @@ -0,0 +1,16 @@ + + + + + Title + + +
    + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/coinSearch.html b/src/main/resources/templates/coinSearch.html new file mode 100644 index 0000000..60d2782 --- /dev/null +++ b/src/main/resources/templates/coinSearch.html @@ -0,0 +1,109 @@ + + + + + + + + + + + +
    +
    +

    코인

    +
    +
    + +
      + +
    +
    +
    +

    승빈

    +
    +
    + + \ No newline at end of file diff --git a/src/main/resources/templates/coinTrade.html b/src/main/resources/templates/coinTrade.html new file mode 100644 index 0000000..2c2430e --- /dev/null +++ b/src/main/resources/templates/coinTrade.html @@ -0,0 +1,62 @@ + + + + CoinTrade + + + + + + +
    +
    매매
    + +
    + + +
    + + +
    +
    + + +
    + +
    + + \ No newline at end of file diff --git a/src/main/resources/templates/content-page.html b/src/main/resources/templates/content-page.html new file mode 100644 index 0000000..fb29f56 --- /dev/null +++ b/src/main/resources/templates/content-page.html @@ -0,0 +1,59 @@ + + + + + + 게시판 + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    + +

    + +
    +
    + +
    + + +
    +
    + 댓글 내용 +
    + + + + +
  • + + + + + + + + + + + + + + +
    유저댓글버튼
    + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/createMember.html b/src/main/resources/templates/createMember.html new file mode 100644 index 0000000..c3fae3a --- /dev/null +++ b/src/main/resources/templates/createMember.html @@ -0,0 +1,80 @@ + + + + + + Title + + + + +
    +
    + Image +
    + +
    +
    + 아이디 +
    + + 비밀번호 : +
    + + 비밀번호 확인: +
    + + API KEY: +
    + + SEC KEY: +
    + + +
    +
    +
    + + + diff --git a/src/main/resources/templates/excelInsert.html b/src/main/resources/templates/excelInsert.html new file mode 100644 index 0000000..82876b9 --- /dev/null +++ b/src/main/resources/templates/excelInsert.html @@ -0,0 +1,15 @@ + + + + 엑셀 업로드 + + + +
    + + +
    + + + \ No newline at end of file diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html new file mode 100644 index 0000000..d2247b9 --- /dev/null +++ b/src/main/resources/templates/home.html @@ -0,0 +1,42 @@ + + + + + + 게시판 + + + +
    +
    +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + +
    #제목작성자최근 수정일글 보기/수정/삭제
    +
    + + \ No newline at end of file diff --git a/src/main/resources/templates/loginPage.html b/src/main/resources/templates/loginPage.html new file mode 100644 index 0000000..5ae433e --- /dev/null +++ b/src/main/resources/templates/loginPage.html @@ -0,0 +1,88 @@ + + + + + + + + + + + + +
    +
    +

    CoinHigh

    +
    + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/templates/mainPage.html b/src/main/resources/templates/mainPage.html new file mode 100644 index 0000000..8d553e2 --- /dev/null +++ b/src/main/resources/templates/mainPage.html @@ -0,0 +1,81 @@ + + + + + + Bithigh + + + + + + + + +
    +

    Bithigh

    +
    + + +
    +
    + +
    아이디:
    +
    로그아웃
    +
    마이페이지
    + +
    + + + + +
    + Image +
    + +
    + + + + diff --git a/src/main/resources/templates/myasset.html b/src/main/resources/templates/myasset.html new file mode 100644 index 0000000..d104329 --- /dev/null +++ b/src/main/resources/templates/myasset.html @@ -0,0 +1,153 @@ + + + + + + Google Charts Tutorial + + + + + + + + + +
    +
    +

    Browser Market Share

    +
    +
    +

    Performance

    +

    User Cash

    +

    Win Rate

    +

    Total Asset

    +

    +

    Interest Coin

    +
      +
      +
      + + + + diff --git a/src/main/resources/templates/showCoinGraph.html b/src/main/resources/templates/showCoinGraph.html new file mode 100644 index 0000000..791337c --- /dev/null +++ b/src/main/resources/templates/showCoinGraph.html @@ -0,0 +1,184 @@ + + + + + + + CoinTrade + + + + + + + + + +
      +

      CoinTrade

      +
      +
      + + +
      +
      매매
      + +
      + + +
      + + +
      +
      + + +
      +
      +
      + +
      +
      + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/statistics.html b/src/main/resources/templates/statistics.html new file mode 100644 index 0000000..7bbc4a5 --- /dev/null +++ b/src/main/resources/templates/statistics.html @@ -0,0 +1,289 @@ + + + + + + + + + + 통계 페이지 + + + + + + + +
      +

      통계

      +
      + +
      +

      회원순위

      +
      + + +
      +
      + + + + + + +
      +

      코인리스트

      +
        + +
        + +
        +
        + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/test.html b/src/main/resources/templates/test.html new file mode 100644 index 0000000..b727d0f --- /dev/null +++ b/src/main/resources/templates/test.html @@ -0,0 +1,10 @@ + + + + + Title + + +dsfsd + + \ No newline at end of file diff --git a/src/main/resources/templates/write-page.html b/src/main/resources/templates/write-page.html new file mode 100644 index 0000000..0e06fde --- /dev/null +++ b/src/main/resources/templates/write-page.html @@ -0,0 +1,27 @@ + + + + + + 게시판 + + + +
        +
        +
        +
        +
        + + +

        + +

        + +
        + +
        +
        +
        + + \ No newline at end of file diff --git a/src/test/java/com/example/coin/CoinApplicationTests.java b/src/test/java/com/example/coin/CoinApplicationTests.java new file mode 100644 index 0000000..329c602 --- /dev/null +++ b/src/test/java/com/example/coin/CoinApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.coin; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CoinApplicationTests { + + @Test + void contextLoads() { + } + +}