repomix-output.xml 3.8 MB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896328973289832899329003290132902329033290432905329063290732908329093291032911329123291332914329153291632917329183291932920329213292232923329243292532926329273292832929329303293132932329333293432935329363293732938329393294032941329423294332944329453294632947329483294932950329513295232953329543295532956329573295832959329603296132962329633296432965329663296732968329693297032971329723297332974329753297632977329783297932980329813298232983329843298532986329873298832989329903299132992329933299432995329963299732998329993300033001330023300333004330053300633007330083300933010330113301233013330143301533016330173301833019330203302133022330233302433025330263302733028330293303033031330323303333034330353303633037330383303933040330413304233043330443304533046330473304833049330503305133052330533305433055330563305733058330593306033061330623306333064330653306633067330683306933070330713307233073330743307533076330773307833079330803308133082330833308433085330863308733088330893309033091330923309333094330953309633097330983309933100331013310233103331043310533106331073310833109331103311133112331133311433115331163311733118331193312033121331223312333124331253312633127331283312933130331313313233133331343313533136331373313833139331403314133142331433314433145331463314733148331493315033151331523315333154331553315633157331583315933160331613316233163331643316533166331673316833169331703317133172331733317433175331763317733178331793318033181331823318333184331853318633187331883318933190331913319233193331943319533196331973319833199332003320133202332033320433205332063320733208332093321033211332123321333214332153321633217332183321933220332213322233223332243322533226332273322833229332303323133232332333323433235332363323733238332393324033241332423324333244332453324633247332483324933250332513325233253332543325533256332573325833259332603326133262332633326433265332663326733268332693327033271332723327333274332753327633277332783327933280332813328233283332843328533286332873328833289332903329133292332933329433295332963329733298332993330033301333023330333304333053330633307333083330933310333113331233313333143331533316333173331833319333203332133322333233332433325333263332733328333293333033331333323333333334333353333633337333383333933340333413334233343333443334533346333473334833349333503335133352333533335433355333563335733358333593336033361333623336333364333653336633367333683336933370333713337233373333743337533376333773337833379333803338133382333833338433385333863338733388333893339033391333923339333394333953339633397333983339933400334013340233403334043340533406334073340833409334103341133412334133341433415334163341733418334193342033421334223342333424334253342633427334283342933430334313343233433334343343533436334373343833439334403344133442334433344433445334463344733448334493345033451334523345333454334553345633457334583345933460334613346233463334643346533466334673346833469334703347133472334733347433475334763347733478334793348033481334823348333484334853348633487334883348933490334913349233493334943349533496334973349833499335003350133502335033350433505335063350733508335093351033511335123351333514335153351633517335183351933520335213352233523335243352533526335273352833529335303353133532335333353433535335363353733538335393354033541335423354333544335453354633547335483354933550335513355233553335543355533556335573355833559335603356133562335633356433565335663356733568335693357033571335723357333574335753357633577335783357933580335813358233583335843358533586335873358833589335903359133592335933359433595335963359733598335993360033601336023360333604336053360633607336083360933610336113361233613336143361533616336173361833619336203362133622336233362433625336263362733628336293363033631336323363333634336353363633637336383363933640336413364233643336443364533646336473364833649336503365133652336533365433655336563365733658336593366033661336623366333664336653366633667336683366933670336713367233673336743367533676336773367833679336803368133682336833368433685336863368733688336893369033691336923369333694336953369633697336983369933700337013370233703337043370533706337073370833709337103371133712337133371433715337163371733718337193372033721337223372333724337253372633727337283372933730337313373233733337343373533736337373373833739337403374133742337433374433745337463374733748337493375033751337523375333754337553375633757337583375933760337613376233763337643376533766337673376833769337703377133772337733377433775337763377733778337793378033781337823378333784337853378633787337883378933790337913379233793337943379533796337973379833799338003380133802338033380433805338063380733808338093381033811338123381333814338153381633817338183381933820338213382233823338243382533826338273382833829338303383133832338333383433835338363383733838338393384033841338423384333844338453384633847338483384933850338513385233853338543385533856338573385833859338603386133862338633386433865338663386733868338693387033871338723387333874338753387633877338783387933880338813388233883338843388533886338873388833889338903389133892338933389433895338963389733898338993390033901339023390333904339053390633907339083390933910339113391233913339143391533916339173391833919339203392133922339233392433925339263392733928339293393033931339323393333934339353393633937339383393933940339413394233943339443394533946339473394833949339503395133952339533395433955339563395733958339593396033961339623396333964339653396633967339683396933970339713397233973339743397533976339773397833979339803398133982339833398433985339863398733988339893399033991339923399333994339953399633997339983399934000340013400234003340043400534006340073400834009340103401134012340133401434015340163401734018340193402034021340223402334024340253402634027340283402934030340313403234033340343403534036340373403834039340403404134042340433404434045340463404734048340493405034051340523405334054340553405634057340583405934060340613406234063340643406534066340673406834069340703407134072340733407434075340763407734078340793408034081340823408334084340853408634087340883408934090340913409234093340943409534096340973409834099341003410134102341033410434105341063410734108341093411034111341123411334114341153411634117341183411934120341213412234123341243412534126341273412834129341303413134132341333413434135341363413734138341393414034141341423414334144341453414634147341483414934150341513415234153341543415534156341573415834159341603416134162341633416434165341663416734168341693417034171341723417334174341753417634177341783417934180341813418234183341843418534186341873418834189341903419134192341933419434195341963419734198341993420034201342023420334204342053420634207342083420934210342113421234213342143421534216342173421834219342203422134222342233422434225342263422734228342293423034231342323423334234342353423634237342383423934240342413424234243342443424534246342473424834249342503425134252342533425434255342563425734258342593426034261342623426334264342653426634267342683426934270342713427234273342743427534276342773427834279342803428134282342833428434285342863428734288342893429034291342923429334294342953429634297342983429934300343013430234303343043430534306343073430834309343103431134312343133431434315343163431734318343193432034321343223432334324343253432634327343283432934330343313433234333343343433534336343373433834339343403434134342343433434434345343463434734348343493435034351343523435334354343553435634357343583435934360343613436234363343643436534366343673436834369343703437134372343733437434375343763437734378343793438034381343823438334384343853438634387343883438934390343913439234393343943439534396343973439834399344003440134402344033440434405344063440734408344093441034411344123441334414344153441634417344183441934420344213442234423344243442534426344273442834429344303443134432344333443434435344363443734438344393444034441344423444334444344453444634447344483444934450344513445234453344543445534456344573445834459344603446134462344633446434465344663446734468344693447034471344723447334474344753447634477344783447934480344813448234483344843448534486344873448834489344903449134492344933449434495344963449734498344993450034501345023450334504345053450634507345083450934510345113451234513345143451534516345173451834519345203452134522345233452434525345263452734528345293453034531345323453334534345353453634537345383453934540345413454234543345443454534546345473454834549345503455134552345533455434555345563455734558345593456034561345623456334564345653456634567345683456934570345713457234573345743457534576345773457834579345803458134582345833458434585345863458734588345893459034591345923459334594345953459634597345983459934600346013460234603346043460534606346073460834609346103461134612346133461434615346163461734618346193462034621346223462334624346253462634627346283462934630346313463234633346343463534636346373463834639346403464134642346433464434645346463464734648346493465034651346523465334654346553465634657346583465934660346613466234663346643466534666346673466834669346703467134672346733467434675346763467734678346793468034681346823468334684346853468634687346883468934690346913469234693346943469534696346973469834699347003470134702347033470434705347063470734708347093471034711347123471334714347153471634717347183471934720347213472234723347243472534726347273472834729347303473134732347333473434735347363473734738347393474034741347423474334744347453474634747347483474934750347513475234753347543475534756347573475834759347603476134762347633476434765347663476734768347693477034771347723477334774347753477634777347783477934780347813478234783347843478534786347873478834789347903479134792347933479434795347963479734798347993480034801348023480334804348053480634807348083480934810348113481234813348143481534816348173481834819348203482134822348233482434825348263482734828348293483034831348323483334834348353483634837348383483934840348413484234843348443484534846348473484834849348503485134852348533485434855348563485734858348593486034861348623486334864348653486634867348683486934870348713487234873348743487534876348773487834879348803488134882348833488434885348863488734888348893489034891348923489334894348953489634897348983489934900349013490234903349043490534906349073490834909349103491134912349133491434915349163491734918349193492034921349223492334924349253492634927349283492934930349313493234933349343493534936349373493834939349403494134942349433494434945349463494734948349493495034951349523495334954349553495634957349583495934960349613496234963349643496534966349673496834969349703497134972349733497434975349763497734978349793498034981349823498334984349853498634987349883498934990349913499234993349943499534996349973499834999350003500135002350033500435005350063500735008350093501035011350123501335014350153501635017350183501935020350213502235023350243502535026350273502835029350303503135032350333503435035350363503735038350393504035041350423504335044350453504635047350483504935050350513505235053350543505535056350573505835059350603506135062350633506435065350663506735068350693507035071350723507335074350753507635077350783507935080350813508235083350843508535086350873508835089350903509135092350933509435095350963509735098350993510035101351023510335104351053510635107351083510935110351113511235113351143511535116351173511835119351203512135122351233512435125351263512735128351293513035131351323513335134351353513635137351383513935140351413514235143351443514535146351473514835149351503515135152351533515435155351563515735158351593516035161351623516335164351653516635167351683516935170351713517235173351743517535176351773517835179351803518135182351833518435185351863518735188351893519035191351923519335194351953519635197351983519935200352013520235203352043520535206352073520835209352103521135212352133521435215352163521735218352193522035221352223522335224352253522635227352283522935230352313523235233352343523535236352373523835239352403524135242352433524435245352463524735248352493525035251352523525335254352553525635257352583525935260352613526235263352643526535266352673526835269352703527135272352733527435275352763527735278352793528035281352823528335284352853528635287352883528935290352913529235293352943529535296352973529835299353003530135302353033530435305353063530735308353093531035311353123531335314353153531635317353183531935320353213532235323353243532535326353273532835329353303533135332353333533435335353363533735338353393534035341353423534335344353453534635347353483534935350353513535235353353543535535356353573535835359353603536135362353633536435365353663536735368353693537035371353723537335374353753537635377353783537935380353813538235383353843538535386353873538835389353903539135392353933539435395353963539735398353993540035401354023540335404354053540635407354083540935410354113541235413354143541535416354173541835419354203542135422354233542435425354263542735428354293543035431354323543335434354353543635437354383543935440354413544235443354443544535446354473544835449354503545135452354533545435455354563545735458354593546035461354623546335464354653546635467354683546935470354713547235473354743547535476354773547835479354803548135482354833548435485354863548735488354893549035491354923549335494354953549635497354983549935500355013550235503355043550535506355073550835509355103551135512355133551435515355163551735518355193552035521355223552335524355253552635527355283552935530355313553235533355343553535536355373553835539355403554135542355433554435545355463554735548355493555035551355523555335554355553555635557355583555935560355613556235563355643556535566355673556835569355703557135572355733557435575355763557735578355793558035581355823558335584355853558635587355883558935590355913559235593355943559535596355973559835599356003560135602356033560435605356063560735608356093561035611356123561335614356153561635617356183561935620356213562235623356243562535626356273562835629356303563135632356333563435635356363563735638356393564035641356423564335644356453564635647356483564935650356513565235653356543565535656356573565835659356603566135662356633566435665356663566735668356693567035671356723567335674356753567635677356783567935680356813568235683356843568535686356873568835689356903569135692356933569435695356963569735698356993570035701357023570335704357053570635707357083570935710357113571235713357143571535716357173571835719357203572135722357233572435725357263572735728357293573035731357323573335734357353573635737357383573935740357413574235743357443574535746357473574835749357503575135752357533575435755357563575735758357593576035761357623576335764357653576635767357683576935770357713577235773357743577535776357773577835779357803578135782357833578435785357863578735788357893579035791357923579335794357953579635797357983579935800358013580235803358043580535806358073580835809358103581135812358133581435815358163581735818358193582035821358223582335824358253582635827358283582935830358313583235833358343583535836358373583835839358403584135842358433584435845358463584735848358493585035851358523585335854358553585635857358583585935860358613586235863358643586535866358673586835869358703587135872358733587435875358763587735878358793588035881358823588335884358853588635887358883588935890358913589235893358943589535896358973589835899359003590135902359033590435905359063590735908359093591035911359123591335914359153591635917359183591935920359213592235923359243592535926359273592835929359303593135932359333593435935359363593735938359393594035941359423594335944359453594635947359483594935950359513595235953359543595535956359573595835959359603596135962359633596435965359663596735968359693597035971359723597335974359753597635977359783597935980359813598235983359843598535986359873598835989359903599135992359933599435995359963599735998359993600036001360023600336004360053600636007360083600936010360113601236013360143601536016360173601836019360203602136022360233602436025360263602736028360293603036031360323603336034360353603636037360383603936040360413604236043360443604536046360473604836049360503605136052360533605436055360563605736058360593606036061360623606336064360653606636067360683606936070360713607236073360743607536076360773607836079360803608136082360833608436085360863608736088360893609036091360923609336094360953609636097360983609936100361013610236103361043610536106361073610836109361103611136112361133611436115361163611736118361193612036121361223612336124361253612636127361283612936130361313613236133361343613536136361373613836139361403614136142361433614436145361463614736148361493615036151361523615336154361553615636157361583615936160361613616236163361643616536166361673616836169361703617136172361733617436175361763617736178361793618036181361823618336184361853618636187361883618936190361913619236193361943619536196361973619836199362003620136202362033620436205362063620736208362093621036211362123621336214362153621636217362183621936220362213622236223362243622536226362273622836229362303623136232362333623436235362363623736238362393624036241362423624336244362453624636247362483624936250362513625236253362543625536256362573625836259362603626136262362633626436265362663626736268362693627036271362723627336274362753627636277362783627936280362813628236283362843628536286362873628836289362903629136292362933629436295362963629736298362993630036301363023630336304363053630636307363083630936310363113631236313363143631536316363173631836319363203632136322363233632436325363263632736328363293633036331363323633336334363353633636337363383633936340363413634236343363443634536346363473634836349363503635136352363533635436355363563635736358363593636036361363623636336364363653636636367363683636936370363713637236373363743637536376363773637836379363803638136382363833638436385363863638736388363893639036391363923639336394363953639636397363983639936400364013640236403364043640536406364073640836409364103641136412364133641436415364163641736418364193642036421364223642336424364253642636427364283642936430364313643236433364343643536436364373643836439364403644136442364433644436445364463644736448364493645036451364523645336454364553645636457364583645936460364613646236463364643646536466364673646836469364703647136472364733647436475364763647736478364793648036481364823648336484364853648636487364883648936490364913649236493364943649536496364973649836499365003650136502365033650436505365063650736508365093651036511365123651336514365153651636517365183651936520365213652236523365243652536526365273652836529365303653136532365333653436535365363653736538365393654036541365423654336544365453654636547365483654936550365513655236553365543655536556365573655836559365603656136562365633656436565365663656736568365693657036571365723657336574365753657636577365783657936580365813658236583365843658536586365873658836589365903659136592365933659436595365963659736598365993660036601366023660336604366053660636607366083660936610366113661236613366143661536616366173661836619366203662136622366233662436625366263662736628366293663036631366323663336634366353663636637366383663936640366413664236643366443664536646366473664836649366503665136652366533665436655366563665736658366593666036661366623666336664366653666636667366683666936670366713667236673366743667536676366773667836679366803668136682366833668436685366863668736688366893669036691366923669336694366953669636697366983669936700367013670236703367043670536706367073670836709367103671136712367133671436715367163671736718367193672036721367223672336724367253672636727367283672936730367313673236733367343673536736367373673836739367403674136742367433674436745367463674736748367493675036751367523675336754367553675636757367583675936760367613676236763367643676536766367673676836769367703677136772367733677436775367763677736778367793678036781367823678336784367853678636787367883678936790367913679236793367943679536796367973679836799368003680136802368033680436805368063680736808368093681036811368123681336814368153681636817368183681936820368213682236823368243682536826368273682836829368303683136832368333683436835368363683736838368393684036841368423684336844368453684636847368483684936850368513685236853368543685536856368573685836859368603686136862368633686436865368663686736868368693687036871368723687336874368753687636877368783687936880368813688236883368843688536886368873688836889368903689136892368933689436895368963689736898368993690036901369023690336904369053690636907369083690936910369113691236913369143691536916369173691836919369203692136922369233692436925369263692736928369293693036931369323693336934369353693636937369383693936940369413694236943369443694536946369473694836949369503695136952369533695436955369563695736958369593696036961369623696336964369653696636967369683696936970369713697236973369743697536976369773697836979369803698136982369833698436985369863698736988369893699036991369923699336994369953699636997369983699937000370013700237003370043700537006370073700837009370103701137012370133701437015370163701737018370193702037021370223702337024370253702637027370283702937030370313703237033370343703537036370373703837039370403704137042370433704437045370463704737048370493705037051370523705337054370553705637057370583705937060370613706237063370643706537066370673706837069370703707137072370733707437075370763707737078370793708037081370823708337084370853708637087370883708937090370913709237093370943709537096370973709837099371003710137102371033710437105371063710737108371093711037111371123711337114371153711637117371183711937120371213712237123371243712537126371273712837129371303713137132371333713437135371363713737138371393714037141371423714337144371453714637147371483714937150371513715237153371543715537156371573715837159371603716137162371633716437165371663716737168371693717037171371723717337174371753717637177371783717937180371813718237183371843718537186371873718837189371903719137192371933719437195371963719737198371993720037201372023720337204372053720637207372083720937210372113721237213372143721537216372173721837219372203722137222372233722437225372263722737228372293723037231372323723337234372353723637237372383723937240372413724237243372443724537246372473724837249372503725137252372533725437255372563725737258372593726037261372623726337264372653726637267372683726937270372713727237273372743727537276372773727837279372803728137282372833728437285372863728737288372893729037291372923729337294372953729637297372983729937300373013730237303373043730537306373073730837309373103731137312373133731437315373163731737318373193732037321373223732337324373253732637327373283732937330373313733237333373343733537336373373733837339373403734137342373433734437345373463734737348373493735037351373523735337354373553735637357373583735937360373613736237363373643736537366373673736837369373703737137372373733737437375373763737737378373793738037381373823738337384373853738637387373883738937390373913739237393373943739537396373973739837399374003740137402374033740437405374063740737408374093741037411374123741337414374153741637417374183741937420374213742237423374243742537426374273742837429374303743137432374333743437435374363743737438374393744037441374423744337444374453744637447374483744937450374513745237453374543745537456374573745837459374603746137462374633746437465374663746737468374693747037471374723747337474374753747637477374783747937480374813748237483374843748537486374873748837489374903749137492374933749437495374963749737498374993750037501375023750337504375053750637507375083750937510375113751237513375143751537516375173751837519375203752137522375233752437525375263752737528375293753037531375323753337534375353753637537375383753937540375413754237543375443754537546375473754837549375503755137552375533755437555375563755737558375593756037561375623756337564375653756637567375683756937570375713757237573375743757537576375773757837579375803758137582375833758437585375863758737588375893759037591375923759337594375953759637597375983759937600376013760237603376043760537606376073760837609376103761137612376133761437615376163761737618376193762037621376223762337624376253762637627376283762937630376313763237633376343763537636376373763837639376403764137642376433764437645376463764737648376493765037651376523765337654376553765637657376583765937660376613766237663376643766537666376673766837669376703767137672376733767437675376763767737678376793768037681376823768337684376853768637687376883768937690376913769237693376943769537696376973769837699377003770137702377033770437705377063770737708377093771037711377123771337714377153771637717377183771937720377213772237723377243772537726377273772837729377303773137732377333773437735377363773737738377393774037741377423774337744377453774637747377483774937750377513775237753377543775537756377573775837759377603776137762377633776437765377663776737768377693777037771377723777337774377753777637777377783777937780377813778237783377843778537786377873778837789377903779137792377933779437795377963779737798377993780037801378023780337804378053780637807378083780937810378113781237813378143781537816378173781837819378203782137822378233782437825378263782737828378293783037831378323783337834378353783637837378383783937840378413784237843378443784537846378473784837849378503785137852378533785437855378563785737858378593786037861378623786337864378653786637867378683786937870378713787237873378743787537876378773787837879378803788137882378833788437885378863788737888378893789037891378923789337894378953789637897378983789937900379013790237903379043790537906379073790837909379103791137912379133791437915379163791737918379193792037921379223792337924379253792637927379283792937930379313793237933379343793537936379373793837939379403794137942379433794437945379463794737948379493795037951379523795337954379553795637957379583795937960379613796237963379643796537966379673796837969379703797137972379733797437975379763797737978379793798037981379823798337984379853798637987379883798937990379913799237993379943799537996379973799837999380003800138002380033800438005380063800738008380093801038011380123801338014380153801638017380183801938020380213802238023380243802538026380273802838029380303803138032380333803438035380363803738038380393804038041380423804338044380453804638047380483804938050380513805238053380543805538056380573805838059380603806138062380633806438065380663806738068380693807038071380723807338074380753807638077380783807938080380813808238083380843808538086380873808838089380903809138092380933809438095380963809738098380993810038101381023810338104381053810638107381083810938110381113811238113381143811538116381173811838119381203812138122381233812438125381263812738128381293813038131381323813338134381353813638137381383813938140381413814238143381443814538146381473814838149381503815138152381533815438155381563815738158381593816038161381623816338164381653816638167381683816938170381713817238173381743817538176381773817838179381803818138182381833818438185381863818738188381893819038191381923819338194381953819638197381983819938200382013820238203382043820538206382073820838209382103821138212382133821438215382163821738218382193822038221382223822338224382253822638227382283822938230382313823238233382343823538236382373823838239382403824138242382433824438245382463824738248382493825038251382523825338254382553825638257382583825938260382613826238263382643826538266382673826838269382703827138272382733827438275382763827738278382793828038281382823828338284382853828638287382883828938290382913829238293382943829538296382973829838299383003830138302383033830438305383063830738308383093831038311383123831338314383153831638317383183831938320383213832238323383243832538326383273832838329383303833138332383333833438335383363833738338383393834038341383423834338344383453834638347383483834938350383513835238353383543835538356383573835838359383603836138362383633836438365383663836738368383693837038371383723837338374383753837638377383783837938380383813838238383383843838538386383873838838389383903839138392383933839438395383963839738398383993840038401384023840338404384053840638407384083840938410384113841238413384143841538416384173841838419384203842138422384233842438425384263842738428384293843038431384323843338434384353843638437384383843938440384413844238443384443844538446384473844838449384503845138452384533845438455384563845738458384593846038461384623846338464384653846638467384683846938470384713847238473384743847538476384773847838479384803848138482384833848438485384863848738488384893849038491384923849338494384953849638497384983849938500385013850238503385043850538506385073850838509385103851138512385133851438515385163851738518385193852038521385223852338524385253852638527385283852938530385313853238533385343853538536385373853838539385403854138542385433854438545385463854738548385493855038551385523855338554385553855638557385583855938560385613856238563385643856538566385673856838569385703857138572385733857438575385763857738578385793858038581385823858338584385853858638587385883858938590385913859238593385943859538596385973859838599386003860138602386033860438605386063860738608386093861038611386123861338614386153861638617386183861938620386213862238623386243862538626386273862838629386303863138632386333863438635386363863738638386393864038641386423864338644386453864638647386483864938650386513865238653386543865538656386573865838659386603866138662386633866438665386663866738668386693867038671386723867338674386753867638677386783867938680386813868238683386843868538686386873868838689386903869138692386933869438695386963869738698386993870038701387023870338704387053870638707387083870938710387113871238713387143871538716387173871838719387203872138722387233872438725387263872738728387293873038731387323873338734387353873638737387383873938740387413874238743387443874538746387473874838749387503875138752387533875438755387563875738758387593876038761387623876338764387653876638767387683876938770387713877238773387743877538776387773877838779387803878138782387833878438785387863878738788387893879038791387923879338794387953879638797387983879938800388013880238803388043880538806388073880838809388103881138812388133881438815388163881738818388193882038821388223882338824388253882638827388283882938830388313883238833388343883538836388373883838839388403884138842388433884438845388463884738848388493885038851388523885338854388553885638857388583885938860388613886238863388643886538866388673886838869388703887138872388733887438875388763887738878388793888038881388823888338884388853888638887388883888938890388913889238893388943889538896388973889838899389003890138902389033890438905389063890738908389093891038911389123891338914389153891638917389183891938920389213892238923389243892538926389273892838929389303893138932389333893438935389363893738938389393894038941389423894338944389453894638947389483894938950389513895238953389543895538956389573895838959389603896138962389633896438965389663896738968389693897038971389723897338974389753897638977389783897938980389813898238983389843898538986389873898838989389903899138992389933899438995389963899738998389993900039001390023900339004390053900639007390083900939010390113901239013390143901539016390173901839019390203902139022390233902439025390263902739028390293903039031390323903339034390353903639037390383903939040390413904239043390443904539046390473904839049390503905139052390533905439055390563905739058390593906039061390623906339064390653906639067390683906939070390713907239073390743907539076390773907839079390803908139082390833908439085390863908739088390893909039091390923909339094390953909639097390983909939100391013910239103391043910539106391073910839109391103911139112391133911439115391163911739118391193912039121391223912339124391253912639127391283912939130391313913239133391343913539136391373913839139391403914139142391433914439145391463914739148391493915039151391523915339154391553915639157391583915939160391613916239163391643916539166391673916839169391703917139172391733917439175391763917739178391793918039181391823918339184391853918639187391883918939190391913919239193391943919539196391973919839199392003920139202392033920439205392063920739208392093921039211392123921339214392153921639217392183921939220392213922239223392243922539226392273922839229392303923139232392333923439235392363923739238392393924039241392423924339244392453924639247392483924939250392513925239253392543925539256392573925839259392603926139262392633926439265392663926739268392693927039271392723927339274392753927639277392783927939280392813928239283392843928539286392873928839289392903929139292392933929439295392963929739298392993930039301393023930339304393053930639307393083930939310393113931239313393143931539316393173931839319393203932139322393233932439325393263932739328393293933039331393323933339334393353933639337393383933939340393413934239343393443934539346393473934839349393503935139352393533935439355393563935739358393593936039361393623936339364393653936639367393683936939370393713937239373393743937539376393773937839379393803938139382393833938439385393863938739388393893939039391393923939339394393953939639397393983939939400394013940239403394043940539406394073940839409394103941139412394133941439415394163941739418394193942039421394223942339424394253942639427394283942939430394313943239433394343943539436394373943839439394403944139442394433944439445394463944739448394493945039451394523945339454394553945639457394583945939460394613946239463394643946539466394673946839469394703947139472394733947439475394763947739478394793948039481394823948339484394853948639487394883948939490394913949239493394943949539496394973949839499395003950139502395033950439505395063950739508395093951039511395123951339514395153951639517395183951939520395213952239523395243952539526395273952839529395303953139532395333953439535395363953739538395393954039541395423954339544395453954639547395483954939550395513955239553395543955539556395573955839559395603956139562395633956439565395663956739568395693957039571395723957339574395753957639577395783957939580395813958239583395843958539586395873958839589395903959139592395933959439595395963959739598395993960039601396023960339604396053960639607396083960939610396113961239613396143961539616396173961839619396203962139622396233962439625396263962739628396293963039631396323963339634396353963639637396383963939640396413964239643396443964539646396473964839649396503965139652396533965439655396563965739658396593966039661396623966339664396653966639667396683966939670396713967239673396743967539676396773967839679396803968139682396833968439685396863968739688396893969039691396923969339694396953969639697396983969939700397013970239703397043970539706397073970839709397103971139712397133971439715397163971739718397193972039721397223972339724397253972639727397283972939730397313973239733397343973539736397373973839739397403974139742397433974439745397463974739748397493975039751397523975339754397553975639757397583975939760397613976239763397643976539766397673976839769397703977139772397733977439775397763977739778397793978039781397823978339784397853978639787397883978939790397913979239793397943979539796397973979839799398003980139802398033980439805398063980739808398093981039811398123981339814398153981639817398183981939820398213982239823398243982539826398273982839829398303983139832398333983439835398363983739838398393984039841398423984339844398453984639847398483984939850398513985239853398543985539856398573985839859398603986139862398633986439865398663986739868398693987039871398723987339874398753987639877398783987939880398813988239883398843988539886398873988839889398903989139892398933989439895398963989739898398993990039901399023990339904399053990639907399083990939910399113991239913399143991539916399173991839919399203992139922399233992439925399263992739928399293993039931399323993339934399353993639937399383993939940399413994239943399443994539946399473994839949399503995139952399533995439955399563995739958399593996039961399623996339964399653996639967399683996939970399713997239973399743997539976399773997839979399803998139982399833998439985399863998739988399893999039991399923999339994399953999639997399983999940000400014000240003400044000540006400074000840009400104001140012400134001440015400164001740018400194002040021400224002340024400254002640027400284002940030400314003240033400344003540036400374003840039400404004140042400434004440045400464004740048400494005040051400524005340054400554005640057400584005940060400614006240063400644006540066400674006840069400704007140072400734007440075400764007740078400794008040081400824008340084400854008640087400884008940090400914009240093400944009540096400974009840099401004010140102401034010440105401064010740108401094011040111401124011340114401154011640117401184011940120401214012240123401244012540126401274012840129401304013140132401334013440135401364013740138401394014040141401424014340144401454014640147401484014940150401514015240153401544015540156401574015840159401604016140162401634016440165401664016740168401694017040171401724017340174401754017640177401784017940180401814018240183401844018540186401874018840189401904019140192401934019440195401964019740198401994020040201402024020340204402054020640207402084020940210402114021240213402144021540216402174021840219402204022140222402234022440225402264022740228402294023040231402324023340234402354023640237402384023940240402414024240243402444024540246402474024840249402504025140252402534025440255402564025740258402594026040261402624026340264402654026640267402684026940270402714027240273402744027540276402774027840279402804028140282402834028440285402864028740288402894029040291402924029340294402954029640297402984029940300403014030240303403044030540306403074030840309403104031140312403134031440315403164031740318403194032040321403224032340324403254032640327403284032940330403314033240333403344033540336403374033840339403404034140342403434034440345403464034740348403494035040351403524035340354403554035640357403584035940360403614036240363403644036540366403674036840369403704037140372403734037440375403764037740378403794038040381403824038340384403854038640387403884038940390403914039240393403944039540396403974039840399404004040140402404034040440405404064040740408404094041040411404124041340414404154041640417404184041940420404214042240423404244042540426404274042840429404304043140432404334043440435404364043740438404394044040441404424044340444404454044640447404484044940450404514045240453404544045540456404574045840459404604046140462404634046440465404664046740468404694047040471404724047340474404754047640477404784047940480404814048240483404844048540486404874048840489404904049140492404934049440495404964049740498404994050040501405024050340504405054050640507405084050940510405114051240513405144051540516405174051840519405204052140522405234052440525405264052740528405294053040531405324053340534405354053640537405384053940540405414054240543405444054540546405474054840549405504055140552405534055440555405564055740558405594056040561405624056340564405654056640567405684056940570405714057240573405744057540576405774057840579405804058140582405834058440585405864058740588405894059040591405924059340594405954059640597405984059940600406014060240603406044060540606406074060840609406104061140612406134061440615406164061740618406194062040621406224062340624406254062640627406284062940630406314063240633406344063540636406374063840639406404064140642406434064440645406464064740648406494065040651406524065340654406554065640657406584065940660406614066240663406644066540666406674066840669406704067140672406734067440675406764067740678406794068040681406824068340684406854068640687406884068940690406914069240693406944069540696406974069840699407004070140702407034070440705407064070740708407094071040711407124071340714407154071640717407184071940720407214072240723407244072540726407274072840729407304073140732407334073440735407364073740738407394074040741407424074340744407454074640747407484074940750407514075240753407544075540756407574075840759407604076140762407634076440765407664076740768407694077040771407724077340774407754077640777407784077940780407814078240783407844078540786407874078840789407904079140792407934079440795407964079740798407994080040801408024080340804408054080640807408084080940810408114081240813408144081540816408174081840819408204082140822408234082440825408264082740828408294083040831408324083340834408354083640837408384083940840408414084240843408444084540846408474084840849408504085140852408534085440855408564085740858408594086040861408624086340864408654086640867408684086940870408714087240873408744087540876408774087840879408804088140882408834088440885408864088740888408894089040891408924089340894408954089640897408984089940900409014090240903409044090540906409074090840909409104091140912409134091440915409164091740918409194092040921409224092340924409254092640927409284092940930409314093240933409344093540936409374093840939409404094140942409434094440945409464094740948409494095040951409524095340954409554095640957409584095940960409614096240963409644096540966409674096840969409704097140972409734097440975409764097740978409794098040981409824098340984409854098640987409884098940990409914099240993409944099540996409974099840999410004100141002410034100441005410064100741008410094101041011410124101341014410154101641017410184101941020410214102241023410244102541026410274102841029410304103141032410334103441035410364103741038410394104041041410424104341044410454104641047410484104941050410514105241053410544105541056410574105841059410604106141062410634106441065410664106741068410694107041071410724107341074410754107641077410784107941080410814108241083410844108541086410874108841089410904109141092410934109441095410964109741098410994110041101411024110341104411054110641107411084110941110411114111241113411144111541116411174111841119411204112141122411234112441125411264112741128411294113041131411324113341134411354113641137411384113941140411414114241143411444114541146411474114841149411504115141152411534115441155411564115741158411594116041161411624116341164411654116641167411684116941170411714117241173411744117541176411774117841179411804118141182411834118441185411864118741188411894119041191411924119341194411954119641197411984119941200412014120241203412044120541206412074120841209412104121141212412134121441215412164121741218412194122041221412224122341224412254122641227412284122941230412314123241233412344123541236412374123841239412404124141242412434124441245412464124741248412494125041251412524125341254412554125641257412584125941260412614126241263412644126541266412674126841269412704127141272412734127441275412764127741278412794128041281412824128341284412854128641287412884128941290412914129241293412944129541296412974129841299413004130141302413034130441305413064130741308413094131041311413124131341314413154131641317413184131941320413214132241323413244132541326413274132841329413304133141332413334133441335413364133741338413394134041341413424134341344413454134641347413484134941350413514135241353413544135541356413574135841359413604136141362413634136441365413664136741368413694137041371413724137341374413754137641377413784137941380413814138241383413844138541386413874138841389413904139141392413934139441395413964139741398413994140041401414024140341404414054140641407414084140941410414114141241413414144141541416414174141841419414204142141422414234142441425414264142741428414294143041431414324143341434414354143641437414384143941440414414144241443414444144541446414474144841449414504145141452414534145441455414564145741458414594146041461414624146341464414654146641467414684146941470414714147241473414744147541476414774147841479414804148141482414834148441485414864148741488414894149041491414924149341494414954149641497414984149941500415014150241503415044150541506415074150841509415104151141512415134151441515415164151741518415194152041521415224152341524415254152641527415284152941530415314153241533415344153541536415374153841539415404154141542415434154441545415464154741548415494155041551415524155341554415554155641557415584155941560415614156241563415644156541566415674156841569415704157141572415734157441575415764157741578415794158041581415824158341584415854158641587415884158941590415914159241593415944159541596415974159841599416004160141602416034160441605416064160741608416094161041611416124161341614416154161641617416184161941620416214162241623416244162541626416274162841629416304163141632416334163441635416364163741638416394164041641416424164341644416454164641647416484164941650416514165241653416544165541656416574165841659416604166141662416634166441665416664166741668416694167041671416724167341674416754167641677416784167941680416814168241683416844168541686416874168841689416904169141692416934169441695416964169741698416994170041701417024170341704417054170641707417084170941710417114171241713417144171541716417174171841719417204172141722417234172441725417264172741728417294173041731417324173341734417354173641737417384173941740417414174241743417444174541746417474174841749417504175141752417534175441755417564175741758417594176041761417624176341764417654176641767417684176941770417714177241773417744177541776417774177841779417804178141782417834178441785417864178741788417894179041791417924179341794417954179641797417984179941800418014180241803418044180541806418074180841809418104181141812418134181441815418164181741818418194182041821418224182341824418254182641827418284182941830418314183241833418344183541836418374183841839418404184141842418434184441845418464184741848418494185041851418524185341854418554185641857418584185941860418614186241863418644186541866418674186841869418704187141872418734187441875418764187741878418794188041881418824188341884418854188641887418884188941890418914189241893418944189541896418974189841899419004190141902419034190441905419064190741908419094191041911419124191341914419154191641917419184191941920419214192241923419244192541926419274192841929419304193141932419334193441935419364193741938419394194041941419424194341944419454194641947419484194941950419514195241953419544195541956419574195841959419604196141962419634196441965419664196741968419694197041971419724197341974419754197641977419784197941980419814198241983419844198541986419874198841989419904199141992419934199441995419964199741998419994200042001420024200342004420054200642007420084200942010420114201242013420144201542016420174201842019420204202142022420234202442025420264202742028420294203042031420324203342034420354203642037420384203942040420414204242043420444204542046420474204842049420504205142052420534205442055420564205742058420594206042061420624206342064420654206642067420684206942070420714207242073420744207542076420774207842079420804208142082420834208442085420864208742088420894209042091420924209342094420954209642097420984209942100421014210242103421044210542106421074210842109421104211142112421134211442115421164211742118421194212042121421224212342124421254212642127421284212942130421314213242133421344213542136421374213842139421404214142142421434214442145421464214742148421494215042151421524215342154421554215642157421584215942160421614216242163421644216542166421674216842169421704217142172421734217442175421764217742178421794218042181421824218342184421854218642187421884218942190421914219242193421944219542196421974219842199422004220142202422034220442205422064220742208422094221042211422124221342214422154221642217422184221942220422214222242223422244222542226422274222842229422304223142232422334223442235422364223742238422394224042241422424224342244422454224642247422484224942250422514225242253422544225542256422574225842259422604226142262422634226442265422664226742268422694227042271422724227342274422754227642277422784227942280422814228242283422844228542286422874228842289422904229142292422934229442295422964229742298422994230042301423024230342304423054230642307423084230942310423114231242313423144231542316423174231842319423204232142322423234232442325423264232742328423294233042331423324233342334423354233642337423384233942340423414234242343423444234542346423474234842349423504235142352423534235442355423564235742358423594236042361423624236342364423654236642367423684236942370423714237242373423744237542376423774237842379423804238142382423834238442385423864238742388423894239042391423924239342394423954239642397423984239942400424014240242403424044240542406424074240842409424104241142412424134241442415424164241742418424194242042421424224242342424424254242642427424284242942430424314243242433424344243542436424374243842439424404244142442424434244442445424464244742448424494245042451424524245342454424554245642457424584245942460424614246242463424644246542466424674246842469424704247142472424734247442475424764247742478424794248042481424824248342484424854248642487424884248942490424914249242493424944249542496424974249842499425004250142502425034250442505425064250742508425094251042511425124251342514425154251642517425184251942520425214252242523425244252542526425274252842529425304253142532425334253442535425364253742538425394254042541425424254342544425454254642547425484254942550425514255242553425544255542556425574255842559425604256142562425634256442565425664256742568425694257042571425724257342574425754257642577425784257942580425814258242583425844258542586425874258842589425904259142592425934259442595425964259742598425994260042601426024260342604426054260642607426084260942610426114261242613426144261542616426174261842619426204262142622426234262442625426264262742628426294263042631426324263342634426354263642637426384263942640426414264242643426444264542646426474264842649426504265142652426534265442655426564265742658426594266042661426624266342664426654266642667426684266942670426714267242673426744267542676426774267842679426804268142682426834268442685426864268742688426894269042691426924269342694426954269642697426984269942700427014270242703427044270542706427074270842709427104271142712427134271442715427164271742718427194272042721427224272342724427254272642727427284272942730427314273242733427344273542736427374273842739427404274142742427434274442745427464274742748427494275042751427524275342754427554275642757427584275942760427614276242763427644276542766427674276842769427704277142772427734277442775427764277742778427794278042781427824278342784427854278642787427884278942790427914279242793427944279542796427974279842799428004280142802428034280442805428064280742808428094281042811428124281342814428154281642817428184281942820428214282242823428244282542826428274282842829428304283142832428334283442835428364283742838428394284042841428424284342844428454284642847428484284942850428514285242853428544285542856428574285842859428604286142862428634286442865428664286742868428694287042871428724287342874428754287642877428784287942880428814288242883428844288542886428874288842889428904289142892428934289442895428964289742898428994290042901429024290342904429054290642907429084290942910429114291242913429144291542916429174291842919429204292142922429234292442925429264292742928429294293042931429324293342934429354293642937429384293942940429414294242943429444294542946429474294842949429504295142952429534295442955429564295742958429594296042961429624296342964429654296642967429684296942970429714297242973429744297542976429774297842979429804298142982429834298442985429864298742988429894299042991429924299342994429954299642997429984299943000430014300243003430044300543006430074300843009430104301143012430134301443015430164301743018430194302043021430224302343024430254302643027430284302943030430314303243033430344303543036430374303843039430404304143042430434304443045430464304743048430494305043051430524305343054430554305643057430584305943060430614306243063430644306543066430674306843069430704307143072430734307443075430764307743078430794308043081430824308343084430854308643087430884308943090430914309243093430944309543096430974309843099431004310143102431034310443105431064310743108431094311043111431124311343114431154311643117431184311943120431214312243123431244312543126431274312843129431304313143132431334313443135431364313743138431394314043141431424314343144431454314643147431484314943150431514315243153431544315543156431574315843159431604316143162431634316443165431664316743168431694317043171431724317343174431754317643177431784317943180431814318243183431844318543186431874318843189431904319143192431934319443195431964319743198431994320043201432024320343204432054320643207432084320943210432114321243213432144321543216432174321843219432204322143222432234322443225432264322743228432294323043231432324323343234432354323643237432384323943240432414324243243432444324543246432474324843249432504325143252432534325443255432564325743258432594326043261432624326343264432654326643267432684326943270432714327243273432744327543276432774327843279432804328143282432834328443285432864328743288432894329043291432924329343294432954329643297432984329943300433014330243303433044330543306433074330843309433104331143312433134331443315433164331743318433194332043321433224332343324433254332643327433284332943330433314333243333433344333543336433374333843339433404334143342433434334443345433464334743348433494335043351433524335343354433554335643357433584335943360433614336243363433644336543366433674336843369433704337143372433734337443375433764337743378433794338043381433824338343384433854338643387433884338943390433914339243393433944339543396433974339843399434004340143402434034340443405434064340743408434094341043411434124341343414434154341643417434184341943420434214342243423434244342543426434274342843429434304343143432434334343443435434364343743438434394344043441434424344343444434454344643447434484344943450434514345243453434544345543456434574345843459434604346143462434634346443465434664346743468434694347043471434724347343474434754347643477434784347943480434814348243483434844348543486434874348843489434904349143492434934349443495434964349743498434994350043501435024350343504435054350643507435084350943510435114351243513435144351543516435174351843519435204352143522435234352443525435264352743528435294353043531435324353343534435354353643537435384353943540435414354243543435444354543546435474354843549435504355143552435534355443555435564355743558435594356043561435624356343564435654356643567435684356943570435714357243573435744357543576435774357843579435804358143582435834358443585435864358743588435894359043591435924359343594435954359643597435984359943600436014360243603436044360543606436074360843609436104361143612436134361443615436164361743618436194362043621436224362343624436254362643627436284362943630436314363243633436344363543636436374363843639436404364143642436434364443645436464364743648436494365043651436524365343654436554365643657436584365943660436614366243663436644366543666436674366843669436704367143672436734367443675436764367743678436794368043681436824368343684436854368643687436884368943690436914369243693436944369543696436974369843699437004370143702437034370443705437064370743708437094371043711437124371343714437154371643717437184371943720437214372243723437244372543726437274372843729437304373143732437334373443735437364373743738437394374043741437424374343744437454374643747437484374943750437514375243753437544375543756437574375843759437604376143762437634376443765437664376743768437694377043771437724377343774437754377643777437784377943780437814378243783437844378543786437874378843789437904379143792437934379443795437964379743798437994380043801438024380343804438054380643807438084380943810438114381243813438144381543816438174381843819438204382143822438234382443825438264382743828438294383043831438324383343834438354383643837438384383943840438414384243843438444384543846438474384843849438504385143852438534385443855438564385743858438594386043861438624386343864438654386643867438684386943870438714387243873438744387543876438774387843879438804388143882438834388443885438864388743888438894389043891438924389343894438954389643897438984389943900439014390243903439044390543906439074390843909439104391143912439134391443915439164391743918439194392043921439224392343924439254392643927439284392943930439314393243933439344393543936439374393843939439404394143942439434394443945439464394743948439494395043951439524395343954439554395643957439584395943960439614396243963439644396543966439674396843969439704397143972439734397443975439764397743978439794398043981439824398343984439854398643987439884398943990439914399243993439944399543996439974399843999440004400144002440034400444005440064400744008440094401044011440124401344014440154401644017440184401944020440214402244023440244402544026440274402844029440304403144032440334403444035440364403744038440394404044041440424404344044440454404644047440484404944050440514405244053440544405544056440574405844059440604406144062440634406444065440664406744068440694407044071440724407344074440754407644077440784407944080440814408244083440844408544086440874408844089440904409144092440934409444095440964409744098440994410044101441024410344104441054410644107441084410944110441114411244113441144411544116441174411844119441204412144122441234412444125441264412744128441294413044131441324413344134441354413644137441384413944140441414414244143441444414544146441474414844149441504415144152441534415444155441564415744158441594416044161441624416344164441654416644167441684416944170441714417244173441744417544176441774417844179441804418144182441834418444185441864418744188441894419044191441924419344194441954419644197441984419944200442014420244203442044420544206442074420844209442104421144212442134421444215442164421744218442194422044221442224422344224442254422644227442284422944230442314423244233442344423544236442374423844239442404424144242442434424444245442464424744248442494425044251442524425344254442554425644257442584425944260442614426244263442644426544266442674426844269442704427144272442734427444275442764427744278442794428044281442824428344284442854428644287442884428944290442914429244293442944429544296442974429844299443004430144302443034430444305443064430744308443094431044311443124431344314443154431644317443184431944320443214432244323443244432544326443274432844329443304433144332443334433444335443364433744338443394434044341443424434344344443454434644347443484434944350443514435244353443544435544356443574435844359443604436144362443634436444365443664436744368443694437044371443724437344374443754437644377443784437944380443814438244383443844438544386443874438844389443904439144392443934439444395443964439744398443994440044401444024440344404444054440644407444084440944410444114441244413444144441544416444174441844419444204442144422444234442444425444264442744428444294443044431444324443344434444354443644437444384443944440444414444244443444444444544446444474444844449444504445144452444534445444455444564445744458444594446044461444624446344464444654446644467444684446944470444714447244473444744447544476444774447844479444804448144482444834448444485444864448744488444894449044491444924449344494444954449644497444984449944500445014450244503445044450544506445074450844509445104451144512445134451444515445164451744518445194452044521445224452344524445254452644527445284452944530445314453244533445344453544536445374453844539445404454144542445434454444545445464454744548445494455044551445524455344554445554455644557445584455944560445614456244563445644456544566445674456844569445704457144572445734457444575445764457744578445794458044581445824458344584445854458644587445884458944590445914459244593445944459544596445974459844599446004460144602446034460444605446064460744608446094461044611446124461344614446154461644617446184461944620446214462244623446244462544626446274462844629446304463144632446334463444635446364463744638446394464044641446424464344644446454464644647446484464944650446514465244653446544465544656446574465844659446604466144662446634466444665446664466744668446694467044671446724467344674446754467644677446784467944680446814468244683446844468544686446874468844689446904469144692446934469444695446964469744698446994470044701447024470344704447054470644707447084470944710447114471244713447144471544716447174471844719447204472144722447234472444725447264472744728447294473044731447324473344734447354473644737447384473944740447414474244743447444474544746447474474844749447504475144752447534475444755447564475744758447594476044761447624476344764447654476644767447684476944770447714477244773447744477544776447774477844779447804478144782447834478444785447864478744788447894479044791447924479344794447954479644797447984479944800448014480244803448044480544806448074480844809448104481144812448134481444815448164481744818448194482044821448224482344824448254482644827448284482944830448314483244833448344483544836448374483844839448404484144842448434484444845448464484744848448494485044851448524485344854448554485644857448584485944860448614486244863448644486544866448674486844869448704487144872448734487444875448764487744878448794488044881448824488344884448854488644887448884488944890448914489244893448944489544896448974489844899449004490144902449034490444905449064490744908449094491044911449124491344914449154491644917449184491944920449214492244923449244492544926449274492844929449304493144932449334493444935449364493744938449394494044941449424494344944449454494644947449484494944950449514495244953449544495544956449574495844959449604496144962449634496444965449664496744968449694497044971449724497344974449754497644977449784497944980449814498244983449844498544986449874498844989449904499144992449934499444995449964499744998449994500045001450024500345004450054500645007450084500945010450114501245013450144501545016450174501845019450204502145022450234502445025450264502745028450294503045031450324503345034450354503645037450384503945040450414504245043450444504545046450474504845049450504505145052450534505445055450564505745058450594506045061450624506345064450654506645067450684506945070450714507245073450744507545076450774507845079450804508145082450834508445085450864508745088450894509045091450924509345094450954509645097450984509945100451014510245103451044510545106451074510845109451104511145112451134511445115451164511745118451194512045121451224512345124451254512645127451284512945130451314513245133451344513545136451374513845139451404514145142451434514445145451464514745148451494515045151451524515345154451554515645157451584515945160451614516245163451644516545166451674516845169451704517145172451734517445175451764517745178451794518045181451824518345184451854518645187451884518945190451914519245193451944519545196451974519845199452004520145202452034520445205452064520745208452094521045211452124521345214452154521645217452184521945220452214522245223452244522545226452274522845229452304523145232452334523445235452364523745238452394524045241452424524345244452454524645247452484524945250452514525245253452544525545256452574525845259452604526145262452634526445265452664526745268452694527045271452724527345274452754527645277452784527945280452814528245283452844528545286452874528845289452904529145292452934529445295452964529745298452994530045301453024530345304453054530645307453084530945310453114531245313453144531545316453174531845319453204532145322453234532445325453264532745328453294533045331453324533345334453354533645337453384533945340453414534245343453444534545346453474534845349453504535145352453534535445355453564535745358453594536045361453624536345364453654536645367453684536945370453714537245373453744537545376453774537845379453804538145382453834538445385453864538745388453894539045391453924539345394453954539645397453984539945400454014540245403454044540545406454074540845409454104541145412454134541445415454164541745418454194542045421454224542345424454254542645427454284542945430454314543245433454344543545436454374543845439454404544145442454434544445445454464544745448454494545045451454524545345454454554545645457454584545945460454614546245463454644546545466454674546845469454704547145472454734547445475454764547745478454794548045481454824548345484454854548645487454884548945490454914549245493454944549545496454974549845499455004550145502455034550445505455064550745508455094551045511455124551345514455154551645517455184551945520455214552245523455244552545526455274552845529455304553145532455334553445535455364553745538455394554045541455424554345544455454554645547455484554945550455514555245553455544555545556455574555845559455604556145562455634556445565455664556745568455694557045571455724557345574455754557645577455784557945580455814558245583455844558545586455874558845589455904559145592455934559445595455964559745598455994560045601456024560345604456054560645607456084560945610456114561245613456144561545616456174561845619456204562145622456234562445625456264562745628456294563045631456324563345634456354563645637456384563945640456414564245643456444564545646456474564845649456504565145652456534565445655456564565745658456594566045661456624566345664456654566645667456684566945670456714567245673456744567545676456774567845679456804568145682456834568445685456864568745688456894569045691456924569345694456954569645697456984569945700457014570245703457044570545706457074570845709457104571145712457134571445715457164571745718457194572045721457224572345724457254572645727457284572945730457314573245733457344573545736457374573845739457404574145742457434574445745457464574745748457494575045751457524575345754457554575645757457584575945760457614576245763457644576545766457674576845769457704577145772457734577445775457764577745778457794578045781457824578345784457854578645787457884578945790457914579245793457944579545796457974579845799458004580145802458034580445805458064580745808458094581045811458124581345814458154581645817458184581945820458214582245823458244582545826458274582845829458304583145832458334583445835458364583745838458394584045841458424584345844458454584645847458484584945850458514585245853458544585545856458574585845859458604586145862458634586445865458664586745868458694587045871458724587345874458754587645877458784587945880458814588245883458844588545886458874588845889458904589145892458934589445895458964589745898458994590045901459024590345904459054590645907459084590945910459114591245913459144591545916459174591845919459204592145922459234592445925459264592745928459294593045931459324593345934459354593645937459384593945940459414594245943459444594545946459474594845949459504595145952459534595445955459564595745958459594596045961459624596345964459654596645967459684596945970459714597245973459744597545976459774597845979459804598145982459834598445985459864598745988459894599045991459924599345994459954599645997459984599946000460014600246003460044600546006460074600846009460104601146012460134601446015460164601746018460194602046021460224602346024460254602646027460284602946030460314603246033460344603546036460374603846039460404604146042460434604446045460464604746048460494605046051460524605346054460554605646057460584605946060460614606246063460644606546066460674606846069460704607146072460734607446075460764607746078460794608046081460824608346084460854608646087460884608946090460914609246093460944609546096460974609846099461004610146102461034610446105461064610746108461094611046111461124611346114461154611646117461184611946120461214612246123461244612546126461274612846129461304613146132461334613446135461364613746138461394614046141461424614346144461454614646147461484614946150461514615246153461544615546156461574615846159461604616146162461634616446165461664616746168461694617046171461724617346174461754617646177461784617946180461814618246183461844618546186461874618846189461904619146192461934619446195461964619746198461994620046201462024620346204462054620646207462084620946210462114621246213462144621546216462174621846219462204622146222462234622446225462264622746228462294623046231462324623346234462354623646237462384623946240462414624246243462444624546246462474624846249462504625146252462534625446255462564625746258462594626046261462624626346264462654626646267462684626946270462714627246273462744627546276462774627846279462804628146282462834628446285462864628746288462894629046291462924629346294462954629646297462984629946300463014630246303463044630546306463074630846309463104631146312463134631446315463164631746318463194632046321463224632346324463254632646327463284632946330463314633246333463344633546336463374633846339463404634146342463434634446345463464634746348463494635046351463524635346354463554635646357463584635946360463614636246363463644636546366463674636846369463704637146372463734637446375463764637746378463794638046381463824638346384463854638646387463884638946390463914639246393463944639546396463974639846399464004640146402464034640446405464064640746408464094641046411464124641346414464154641646417464184641946420464214642246423464244642546426464274642846429464304643146432464334643446435464364643746438464394644046441464424644346444464454644646447464484644946450464514645246453464544645546456464574645846459464604646146462464634646446465464664646746468464694647046471464724647346474464754647646477464784647946480464814648246483464844648546486464874648846489464904649146492464934649446495464964649746498464994650046501465024650346504465054650646507465084650946510465114651246513465144651546516465174651846519465204652146522465234652446525465264652746528465294653046531465324653346534465354653646537465384653946540465414654246543465444654546546465474654846549465504655146552465534655446555465564655746558465594656046561465624656346564465654656646567465684656946570465714657246573465744657546576465774657846579465804658146582465834658446585465864658746588465894659046591465924659346594465954659646597465984659946600466014660246603466044660546606466074660846609466104661146612466134661446615466164661746618466194662046621466224662346624466254662646627466284662946630466314663246633466344663546636466374663846639466404664146642466434664446645466464664746648466494665046651466524665346654466554665646657466584665946660466614666246663466644666546666466674666846669466704667146672466734667446675466764667746678466794668046681466824668346684466854668646687466884668946690466914669246693466944669546696466974669846699467004670146702467034670446705467064670746708467094671046711467124671346714467154671646717467184671946720467214672246723467244672546726467274672846729467304673146732467334673446735467364673746738467394674046741467424674346744467454674646747467484674946750467514675246753467544675546756467574675846759467604676146762467634676446765467664676746768467694677046771467724677346774467754677646777467784677946780467814678246783467844678546786467874678846789467904679146792467934679446795467964679746798467994680046801468024680346804468054680646807468084680946810468114681246813468144681546816468174681846819468204682146822468234682446825468264682746828468294683046831468324683346834468354683646837468384683946840468414684246843468444684546846468474684846849468504685146852468534685446855468564685746858468594686046861468624686346864468654686646867468684686946870468714687246873468744687546876468774687846879468804688146882468834688446885468864688746888468894689046891468924689346894468954689646897468984689946900469014690246903469044690546906469074690846909469104691146912469134691446915469164691746918469194692046921469224692346924469254692646927469284692946930469314693246933469344693546936469374693846939469404694146942469434694446945469464694746948469494695046951469524695346954469554695646957469584695946960469614696246963469644696546966469674696846969469704697146972469734697446975469764697746978469794698046981469824698346984469854698646987469884698946990469914699246993469944699546996469974699846999470004700147002470034700447005470064700747008470094701047011470124701347014470154701647017470184701947020470214702247023470244702547026470274702847029470304703147032470334703447035470364703747038470394704047041470424704347044470454704647047470484704947050470514705247053470544705547056470574705847059470604706147062470634706447065470664706747068470694707047071470724707347074470754707647077470784707947080470814708247083470844708547086470874708847089470904709147092470934709447095470964709747098470994710047101471024710347104471054710647107471084710947110471114711247113471144711547116471174711847119471204712147122471234712447125471264712747128471294713047131471324713347134471354713647137471384713947140471414714247143471444714547146471474714847149471504715147152471534715447155471564715747158471594716047161471624716347164471654716647167471684716947170471714717247173471744717547176471774717847179471804718147182471834718447185471864718747188471894719047191471924719347194471954719647197471984719947200472014720247203472044720547206472074720847209472104721147212472134721447215472164721747218472194722047221472224722347224472254722647227472284722947230472314723247233472344723547236472374723847239472404724147242472434724447245472464724747248472494725047251472524725347254472554725647257472584725947260472614726247263472644726547266472674726847269472704727147272472734727447275472764727747278472794728047281472824728347284472854728647287472884728947290472914729247293472944729547296472974729847299473004730147302473034730447305473064730747308473094731047311473124731347314473154731647317473184731947320473214732247323473244732547326473274732847329473304733147332473334733447335473364733747338473394734047341473424734347344473454734647347473484734947350473514735247353473544735547356473574735847359473604736147362473634736447365473664736747368473694737047371473724737347374473754737647377473784737947380473814738247383473844738547386473874738847389473904739147392473934739447395473964739747398473994740047401474024740347404474054740647407474084740947410474114741247413474144741547416474174741847419474204742147422474234742447425474264742747428474294743047431474324743347434474354743647437474384743947440474414744247443474444744547446474474744847449474504745147452474534745447455474564745747458474594746047461474624746347464474654746647467474684746947470474714747247473474744747547476474774747847479474804748147482474834748447485474864748747488474894749047491474924749347494474954749647497474984749947500475014750247503475044750547506475074750847509475104751147512475134751447515475164751747518475194752047521475224752347524475254752647527475284752947530475314753247533475344753547536475374753847539475404754147542475434754447545475464754747548475494755047551475524755347554475554755647557475584755947560475614756247563475644756547566475674756847569475704757147572475734757447575475764757747578475794758047581475824758347584475854758647587475884758947590475914759247593475944759547596475974759847599476004760147602476034760447605476064760747608476094761047611476124761347614476154761647617476184761947620476214762247623476244762547626476274762847629476304763147632476334763447635476364763747638476394764047641476424764347644476454764647647476484764947650476514765247653476544765547656476574765847659476604766147662476634766447665476664766747668476694767047671476724767347674476754767647677476784767947680476814768247683476844768547686476874768847689476904769147692476934769447695476964769747698476994770047701477024770347704477054770647707477084770947710477114771247713477144771547716477174771847719477204772147722477234772447725477264772747728477294773047731477324773347734477354773647737477384773947740477414774247743477444774547746477474774847749477504775147752477534775447755477564775747758477594776047761477624776347764477654776647767477684776947770477714777247773477744777547776477774777847779477804778147782477834778447785477864778747788477894779047791477924779347794477954779647797477984779947800478014780247803478044780547806478074780847809478104781147812478134781447815478164781747818478194782047821478224782347824478254782647827478284782947830478314783247833478344783547836478374783847839478404784147842478434784447845478464784747848478494785047851478524785347854478554785647857478584785947860478614786247863478644786547866478674786847869478704787147872478734787447875478764787747878478794788047881478824788347884478854788647887478884788947890478914789247893478944789547896478974789847899479004790147902479034790447905479064790747908479094791047911479124791347914479154791647917479184791947920479214792247923479244792547926479274792847929479304793147932479334793447935479364793747938479394794047941479424794347944479454794647947479484794947950479514795247953479544795547956479574795847959479604796147962479634796447965479664796747968479694797047971479724797347974479754797647977479784797947980479814798247983479844798547986479874798847989479904799147992479934799447995479964799747998479994800048001480024800348004480054800648007480084800948010480114801248013480144801548016480174801848019480204802148022480234802448025480264802748028480294803048031480324803348034480354803648037480384803948040480414804248043480444804548046480474804848049480504805148052480534805448055480564805748058480594806048061480624806348064480654806648067480684806948070480714807248073480744807548076480774807848079480804808148082480834808448085480864808748088480894809048091480924809348094480954809648097480984809948100481014810248103481044810548106481074810848109481104811148112481134811448115481164811748118481194812048121481224812348124481254812648127481284812948130481314813248133481344813548136481374813848139481404814148142481434814448145481464814748148481494815048151481524815348154481554815648157481584815948160481614816248163481644816548166481674816848169481704817148172481734817448175481764817748178481794818048181481824818348184481854818648187481884818948190481914819248193481944819548196481974819848199482004820148202482034820448205482064820748208482094821048211482124821348214482154821648217482184821948220482214822248223482244822548226482274822848229482304823148232482334823448235482364823748238482394824048241482424824348244482454824648247482484824948250482514825248253482544825548256482574825848259482604826148262482634826448265482664826748268482694827048271482724827348274482754827648277482784827948280482814828248283482844828548286482874828848289482904829148292482934829448295482964829748298482994830048301483024830348304483054830648307483084830948310483114831248313483144831548316483174831848319483204832148322483234832448325483264832748328483294833048331483324833348334483354833648337483384833948340483414834248343483444834548346483474834848349483504835148352483534835448355483564835748358483594836048361483624836348364483654836648367483684836948370483714837248373483744837548376483774837848379483804838148382483834838448385483864838748388483894839048391483924839348394483954839648397483984839948400484014840248403484044840548406484074840848409484104841148412484134841448415484164841748418484194842048421484224842348424484254842648427484284842948430484314843248433484344843548436484374843848439484404844148442484434844448445484464844748448484494845048451484524845348454484554845648457484584845948460484614846248463484644846548466484674846848469484704847148472484734847448475484764847748478484794848048481484824848348484484854848648487484884848948490484914849248493484944849548496484974849848499485004850148502485034850448505485064850748508485094851048511485124851348514485154851648517485184851948520485214852248523485244852548526485274852848529485304853148532485334853448535485364853748538485394854048541485424854348544485454854648547485484854948550485514855248553485544855548556485574855848559485604856148562485634856448565485664856748568485694857048571485724857348574485754857648577485784857948580485814858248583485844858548586485874858848589485904859148592485934859448595485964859748598485994860048601486024860348604486054860648607486084860948610486114861248613486144861548616486174861848619486204862148622486234862448625486264862748628486294863048631486324863348634486354863648637486384863948640486414864248643486444864548646486474864848649486504865148652486534865448655486564865748658486594866048661486624866348664486654866648667486684866948670486714867248673486744867548676486774867848679486804868148682486834868448685486864868748688486894869048691486924869348694486954869648697486984869948700487014870248703487044870548706487074870848709487104871148712487134871448715487164871748718487194872048721487224872348724487254872648727487284872948730487314873248733487344873548736487374873848739487404874148742487434874448745487464874748748487494875048751487524875348754487554875648757487584875948760487614876248763487644876548766487674876848769487704877148772487734877448775487764877748778487794878048781487824878348784487854878648787487884878948790487914879248793487944879548796487974879848799488004880148802488034880448805488064880748808488094881048811488124881348814488154881648817488184881948820488214882248823488244882548826488274882848829488304883148832488334883448835488364883748838488394884048841488424884348844488454884648847488484884948850488514885248853488544885548856488574885848859488604886148862488634886448865488664886748868488694887048871488724887348874488754887648877488784887948880488814888248883488844888548886488874888848889488904889148892488934889448895488964889748898488994890048901489024890348904489054890648907489084890948910489114891248913489144891548916489174891848919489204892148922489234892448925489264892748928489294893048931489324893348934489354893648937489384893948940489414894248943489444894548946489474894848949489504895148952489534895448955489564895748958489594896048961489624896348964489654896648967489684896948970489714897248973489744897548976489774897848979489804898148982489834898448985489864898748988489894899048991489924899348994489954899648997489984899949000490014900249003490044900549006490074900849009490104901149012490134901449015490164901749018490194902049021490224902349024490254902649027490284902949030490314903249033490344903549036490374903849039490404904149042490434904449045490464904749048490494905049051490524905349054490554905649057490584905949060490614906249063490644906549066490674906849069490704907149072490734907449075490764907749078490794908049081490824908349084490854908649087490884908949090490914909249093490944909549096490974909849099491004910149102491034910449105491064910749108491094911049111491124911349114491154911649117491184911949120491214912249123491244912549126491274912849129491304913149132491334913449135491364913749138491394914049141491424914349144491454914649147491484914949150491514915249153491544915549156491574915849159491604916149162491634916449165491664916749168491694917049171491724917349174491754917649177491784917949180491814918249183491844918549186491874918849189491904919149192491934919449195491964919749198491994920049201492024920349204492054920649207492084920949210492114921249213492144921549216492174921849219492204922149222492234922449225492264922749228492294923049231492324923349234492354923649237492384923949240492414924249243492444924549246492474924849249492504925149252492534925449255492564925749258492594926049261492624926349264492654926649267492684926949270492714927249273492744927549276492774927849279492804928149282492834928449285492864928749288492894929049291492924929349294492954929649297492984929949300493014930249303493044930549306493074930849309493104931149312493134931449315493164931749318493194932049321493224932349324493254932649327493284932949330493314933249333493344933549336493374933849339493404934149342493434934449345493464934749348493494935049351493524935349354493554935649357493584935949360493614936249363493644936549366493674936849369493704937149372493734937449375493764937749378493794938049381493824938349384493854938649387493884938949390493914939249393493944939549396493974939849399494004940149402494034940449405494064940749408494094941049411494124941349414494154941649417494184941949420494214942249423494244942549426494274942849429494304943149432494334943449435494364943749438494394944049441494424944349444494454944649447494484944949450494514945249453494544945549456494574945849459494604946149462494634946449465494664946749468494694947049471494724947349474494754947649477494784947949480494814948249483494844948549486494874948849489494904949149492494934949449495494964949749498494994950049501495024950349504495054950649507495084950949510495114951249513495144951549516495174951849519495204952149522495234952449525495264952749528495294953049531495324953349534495354953649537495384953949540495414954249543495444954549546495474954849549495504955149552495534955449555495564955749558495594956049561495624956349564495654956649567495684956949570495714957249573495744957549576495774957849579495804958149582495834958449585495864958749588495894959049591495924959349594495954959649597495984959949600496014960249603496044960549606496074960849609496104961149612496134961449615496164961749618496194962049621496224962349624496254962649627496284962949630496314963249633496344963549636496374963849639496404964149642496434964449645496464964749648496494965049651496524965349654496554965649657496584965949660496614966249663496644966549666496674966849669496704967149672496734967449675496764967749678496794968049681496824968349684496854968649687496884968949690496914969249693496944969549696496974969849699497004970149702497034970449705497064970749708497094971049711497124971349714497154971649717497184971949720497214972249723497244972549726497274972849729497304973149732497334973449735497364973749738497394974049741497424974349744497454974649747497484974949750497514975249753497544975549756497574975849759497604976149762497634976449765497664976749768497694977049771497724977349774497754977649777497784977949780497814978249783497844978549786497874978849789497904979149792497934979449795497964979749798497994980049801498024980349804498054980649807498084980949810498114981249813498144981549816498174981849819498204982149822498234982449825498264982749828498294983049831498324983349834498354983649837498384983949840498414984249843498444984549846498474984849849498504985149852498534985449855498564985749858498594986049861498624986349864498654986649867498684986949870498714987249873498744987549876498774987849879498804988149882498834988449885498864988749888498894989049891498924989349894498954989649897498984989949900499014990249903499044990549906499074990849909499104991149912499134991449915499164991749918499194992049921499224992349924499254992649927499284992949930499314993249933499344993549936499374993849939499404994149942499434994449945499464994749948499494995049951499524995349954499554995649957499584995949960499614996249963499644996549966499674996849969499704997149972499734997449975499764997749978499794998049981499824998349984499854998649987499884998949990499914999249993499944999549996499974999849999500005000150002500035000450005500065000750008500095001050011500125001350014500155001650017500185001950020500215002250023500245002550026500275002850029500305003150032500335003450035500365003750038500395004050041500425004350044500455004650047500485004950050500515005250053500545005550056500575005850059500605006150062500635006450065500665006750068500695007050071500725007350074500755007650077500785007950080500815008250083500845008550086500875008850089500905009150092500935009450095500965009750098500995010050101501025010350104501055010650107501085010950110501115011250113501145011550116501175011850119501205012150122501235012450125501265012750128501295013050131501325013350134501355013650137501385013950140501415014250143501445014550146501475014850149501505015150152501535015450155501565015750158501595016050161501625016350164501655016650167501685016950170501715017250173501745017550176501775017850179501805018150182501835018450185501865018750188501895019050191501925019350194501955019650197501985019950200502015020250203502045020550206502075020850209502105021150212502135021450215502165021750218502195022050221502225022350224502255022650227502285022950230502315023250233502345023550236502375023850239502405024150242502435024450245502465024750248502495025050251502525025350254502555025650257502585025950260502615026250263502645026550266502675026850269502705027150272502735027450275502765027750278502795028050281502825028350284502855028650287502885028950290502915029250293502945029550296502975029850299503005030150302503035030450305503065030750308503095031050311503125031350314503155031650317503185031950320503215032250323503245032550326503275032850329503305033150332503335033450335503365033750338503395034050341503425034350344503455034650347503485034950350503515035250353503545035550356503575035850359503605036150362503635036450365503665036750368503695037050371503725037350374503755037650377503785037950380503815038250383503845038550386503875038850389503905039150392503935039450395503965039750398503995040050401504025040350404504055040650407504085040950410504115041250413504145041550416504175041850419504205042150422504235042450425504265042750428504295043050431504325043350434504355043650437504385043950440504415044250443504445044550446504475044850449504505045150452504535045450455504565045750458504595046050461504625046350464504655046650467504685046950470504715047250473504745047550476504775047850479504805048150482504835048450485504865048750488504895049050491504925049350494504955049650497504985049950500505015050250503505045050550506505075050850509505105051150512505135051450515505165051750518505195052050521505225052350524505255052650527505285052950530505315053250533505345053550536505375053850539505405054150542505435054450545505465054750548505495055050551505525055350554505555055650557505585055950560505615056250563505645056550566505675056850569505705057150572505735057450575505765057750578505795058050581505825058350584505855058650587505885058950590505915059250593505945059550596505975059850599506005060150602506035060450605506065060750608506095061050611506125061350614506155061650617506185061950620506215062250623506245062550626506275062850629506305063150632506335063450635506365063750638506395064050641506425064350644506455064650647506485064950650506515065250653506545065550656506575065850659506605066150662506635066450665506665066750668506695067050671506725067350674506755067650677506785067950680506815068250683506845068550686506875068850689506905069150692506935069450695506965069750698506995070050701507025070350704507055070650707507085070950710507115071250713507145071550716507175071850719507205072150722507235072450725507265072750728507295073050731507325073350734507355073650737507385073950740507415074250743507445074550746507475074850749507505075150752507535075450755507565075750758507595076050761507625076350764507655076650767507685076950770507715077250773507745077550776507775077850779507805078150782507835078450785507865078750788507895079050791507925079350794507955079650797507985079950800508015080250803508045080550806508075080850809508105081150812508135081450815508165081750818508195082050821508225082350824508255082650827508285082950830508315083250833508345083550836508375083850839508405084150842508435084450845508465084750848508495085050851508525085350854508555085650857508585085950860508615086250863508645086550866508675086850869508705087150872508735087450875508765087750878508795088050881508825088350884508855088650887508885088950890508915089250893508945089550896508975089850899509005090150902509035090450905509065090750908509095091050911509125091350914509155091650917509185091950920509215092250923509245092550926509275092850929509305093150932509335093450935509365093750938509395094050941509425094350944509455094650947509485094950950509515095250953509545095550956509575095850959509605096150962509635096450965509665096750968509695097050971509725097350974509755097650977509785097950980509815098250983509845098550986509875098850989509905099150992509935099450995509965099750998509995100051001510025100351004510055100651007510085100951010510115101251013510145101551016510175101851019510205102151022510235102451025510265102751028510295103051031510325103351034510355103651037510385103951040510415104251043510445104551046510475104851049510505105151052510535105451055510565105751058510595106051061510625106351064510655106651067510685106951070510715107251073510745107551076510775107851079510805108151082510835108451085510865108751088510895109051091510925109351094510955109651097510985109951100511015110251103511045110551106511075110851109511105111151112511135111451115511165111751118511195112051121511225112351124511255112651127511285112951130511315113251133511345113551136511375113851139511405114151142511435114451145511465114751148511495115051151511525115351154511555115651157511585115951160511615116251163511645116551166511675116851169511705117151172511735117451175511765117751178511795118051181511825118351184511855118651187511885118951190511915119251193511945119551196511975119851199512005120151202512035120451205512065120751208512095121051211512125121351214512155121651217512185121951220512215122251223512245122551226512275122851229512305123151232512335123451235512365123751238512395124051241512425124351244512455124651247512485124951250512515125251253512545125551256512575125851259512605126151262512635126451265512665126751268512695127051271512725127351274512755127651277512785127951280512815128251283512845128551286512875128851289512905129151292512935129451295512965129751298512995130051301513025130351304513055130651307513085130951310513115131251313513145131551316513175131851319513205132151322513235132451325513265132751328513295133051331513325133351334513355133651337513385133951340513415134251343513445134551346513475134851349513505135151352513535135451355513565135751358513595136051361513625136351364513655136651367513685136951370513715137251373513745137551376513775137851379513805138151382513835138451385513865138751388513895139051391513925139351394513955139651397513985139951400514015140251403514045140551406514075140851409514105141151412514135141451415514165141751418514195142051421514225142351424514255142651427514285142951430514315143251433514345143551436514375143851439514405144151442514435144451445514465144751448514495145051451514525145351454514555145651457514585145951460514615146251463514645146551466514675146851469514705147151472514735147451475514765147751478514795148051481514825148351484514855148651487514885148951490514915149251493514945149551496514975149851499515005150151502515035150451505515065150751508515095151051511515125151351514515155151651517515185151951520515215152251523515245152551526515275152851529515305153151532515335153451535515365153751538515395154051541515425154351544515455154651547515485154951550515515155251553515545155551556515575155851559515605156151562515635156451565515665156751568515695157051571515725157351574515755157651577515785157951580515815158251583515845158551586515875158851589515905159151592515935159451595515965159751598515995160051601516025160351604516055160651607516085160951610516115161251613516145161551616516175161851619516205162151622516235162451625516265162751628516295163051631516325163351634516355163651637516385163951640516415164251643516445164551646516475164851649516505165151652516535165451655516565165751658516595166051661516625166351664516655166651667516685166951670516715167251673516745167551676516775167851679516805168151682516835168451685516865168751688516895169051691516925169351694516955169651697516985169951700517015170251703517045170551706517075170851709517105171151712517135171451715517165171751718517195172051721517225172351724517255172651727517285172951730517315173251733517345173551736517375173851739517405174151742517435174451745517465174751748517495175051751517525175351754517555175651757517585175951760517615176251763517645176551766517675176851769517705177151772517735177451775517765177751778517795178051781517825178351784517855178651787517885178951790517915179251793517945179551796517975179851799518005180151802518035180451805518065180751808518095181051811518125181351814518155181651817518185181951820518215182251823518245182551826518275182851829518305183151832518335183451835518365183751838518395184051841518425184351844518455184651847518485184951850518515185251853518545185551856518575185851859518605186151862518635186451865518665186751868518695187051871518725187351874518755187651877518785187951880518815188251883518845188551886518875188851889518905189151892518935189451895518965189751898518995190051901519025190351904519055190651907519085190951910519115191251913519145191551916519175191851919519205192151922519235192451925519265192751928519295193051931519325193351934519355193651937519385193951940519415194251943519445194551946519475194851949519505195151952519535195451955519565195751958519595196051961519625196351964519655196651967519685196951970519715197251973519745197551976519775197851979519805198151982519835198451985519865198751988519895199051991519925199351994519955199651997519985199952000520015200252003520045200552006520075200852009520105201152012520135201452015520165201752018520195202052021520225202352024520255202652027520285202952030520315203252033520345203552036520375203852039520405204152042520435204452045520465204752048520495205052051520525205352054520555205652057520585205952060520615206252063520645206552066520675206852069520705207152072520735207452075520765207752078520795208052081520825208352084520855208652087520885208952090520915209252093520945209552096520975209852099521005210152102521035210452105521065210752108521095211052111521125211352114521155211652117521185211952120521215212252123521245212552126521275212852129521305213152132521335213452135521365213752138521395214052141521425214352144521455214652147521485214952150521515215252153521545215552156521575215852159521605216152162521635216452165521665216752168521695217052171521725217352174521755217652177521785217952180521815218252183521845218552186521875218852189521905219152192521935219452195521965219752198521995220052201522025220352204522055220652207522085220952210522115221252213522145221552216522175221852219522205222152222522235222452225522265222752228522295223052231522325223352234522355223652237522385223952240522415224252243522445224552246522475224852249522505225152252522535225452255522565225752258522595226052261522625226352264522655226652267522685226952270522715227252273522745227552276522775227852279522805228152282522835228452285522865228752288522895229052291522925229352294522955229652297522985229952300523015230252303523045230552306523075230852309523105231152312523135231452315523165231752318523195232052321523225232352324523255232652327523285232952330523315233252333523345233552336523375233852339523405234152342523435234452345523465234752348523495235052351523525235352354523555235652357523585235952360523615236252363523645236552366523675236852369523705237152372523735237452375523765237752378523795238052381523825238352384523855238652387523885238952390523915239252393523945239552396523975239852399524005240152402524035240452405524065240752408524095241052411524125241352414524155241652417524185241952420524215242252423524245242552426524275242852429524305243152432524335243452435524365243752438524395244052441524425244352444524455244652447524485244952450524515245252453524545245552456524575245852459524605246152462524635246452465524665246752468524695247052471524725247352474524755247652477524785247952480524815248252483524845248552486524875248852489524905249152492524935249452495524965249752498524995250052501525025250352504525055250652507525085250952510525115251252513525145251552516525175251852519525205252152522525235252452525525265252752528525295253052531525325253352534525355253652537525385253952540525415254252543525445254552546525475254852549525505255152552525535255452555525565255752558525595256052561525625256352564525655256652567525685256952570525715257252573525745257552576525775257852579525805258152582525835258452585525865258752588525895259052591525925259352594525955259652597525985259952600526015260252603526045260552606526075260852609526105261152612526135261452615526165261752618526195262052621526225262352624526255262652627526285262952630526315263252633526345263552636526375263852639526405264152642526435264452645526465264752648526495265052651526525265352654526555265652657526585265952660526615266252663526645266552666526675266852669526705267152672526735267452675526765267752678526795268052681526825268352684526855268652687526885268952690526915269252693526945269552696526975269852699527005270152702527035270452705527065270752708527095271052711527125271352714527155271652717527185271952720527215272252723527245272552726527275272852729527305273152732527335273452735527365273752738527395274052741527425274352744527455274652747527485274952750527515275252753527545275552756527575275852759527605276152762527635276452765527665276752768527695277052771527725277352774527755277652777527785277952780527815278252783527845278552786527875278852789527905279152792527935279452795527965279752798527995280052801528025280352804528055280652807528085280952810528115281252813528145281552816528175281852819528205282152822528235282452825528265282752828528295283052831528325283352834528355283652837528385283952840528415284252843528445284552846528475284852849528505285152852528535285452855528565285752858528595286052861528625286352864528655286652867528685286952870528715287252873528745287552876528775287852879528805288152882528835288452885528865288752888528895289052891528925289352894528955289652897528985289952900529015290252903529045290552906529075290852909529105291152912529135291452915529165291752918529195292052921529225292352924529255292652927529285292952930529315293252933529345293552936529375293852939529405294152942529435294452945529465294752948529495295052951529525295352954529555295652957529585295952960529615296252963529645296552966529675296852969529705297152972529735297452975529765297752978529795298052981529825298352984529855298652987529885298952990529915299252993529945299552996529975299852999530005300153002530035300453005530065300753008530095301053011530125301353014530155301653017530185301953020530215302253023530245302553026530275302853029530305303153032530335303453035530365303753038530395304053041530425304353044530455304653047530485304953050530515305253053530545305553056530575305853059530605306153062530635306453065530665306753068530695307053071530725307353074530755307653077530785307953080530815308253083530845308553086530875308853089530905309153092530935309453095530965309753098530995310053101531025310353104531055310653107531085310953110531115311253113531145311553116531175311853119531205312153122531235312453125531265312753128531295313053131531325313353134531355313653137531385313953140531415314253143531445314553146531475314853149531505315153152531535315453155531565315753158531595316053161531625316353164531655316653167531685316953170531715317253173531745317553176531775317853179531805318153182531835318453185531865318753188531895319053191531925319353194531955319653197531985319953200532015320253203532045320553206532075320853209532105321153212532135321453215532165321753218532195322053221532225322353224532255322653227532285322953230532315323253233532345323553236532375323853239532405324153242532435324453245532465324753248532495325053251532525325353254532555325653257532585325953260532615326253263532645326553266532675326853269532705327153272532735327453275532765327753278532795328053281532825328353284532855328653287532885328953290532915329253293532945329553296532975329853299533005330153302533035330453305533065330753308533095331053311533125331353314533155331653317533185331953320533215332253323533245332553326533275332853329533305333153332533335333453335533365333753338533395334053341533425334353344533455334653347533485334953350533515335253353533545335553356533575335853359533605336153362533635336453365533665336753368533695337053371533725337353374533755337653377533785337953380533815338253383533845338553386533875338853389533905339153392533935339453395533965339753398533995340053401534025340353404534055340653407534085340953410534115341253413534145341553416534175341853419534205342153422534235342453425534265342753428534295343053431534325343353434534355343653437534385343953440534415344253443534445344553446534475344853449534505345153452534535345453455534565345753458534595346053461534625346353464534655346653467534685346953470534715347253473534745347553476534775347853479534805348153482534835348453485534865348753488534895349053491534925349353494534955349653497534985349953500535015350253503535045350553506535075350853509535105351153512535135351453515535165351753518535195352053521535225352353524535255352653527535285352953530535315353253533535345353553536535375353853539535405354153542535435354453545535465354753548535495355053551535525355353554535555355653557535585355953560535615356253563535645356553566535675356853569535705357153572535735357453575535765357753578535795358053581535825358353584535855358653587535885358953590535915359253593535945359553596535975359853599536005360153602536035360453605536065360753608536095361053611536125361353614536155361653617536185361953620536215362253623536245362553626536275362853629536305363153632536335363453635536365363753638536395364053641536425364353644536455364653647536485364953650536515365253653536545365553656536575365853659536605366153662536635366453665536665366753668536695367053671536725367353674536755367653677536785367953680536815368253683536845368553686536875368853689536905369153692536935369453695536965369753698536995370053701537025370353704537055370653707537085370953710537115371253713537145371553716537175371853719537205372153722537235372453725537265372753728537295373053731537325373353734537355373653737537385373953740537415374253743537445374553746537475374853749537505375153752537535375453755537565375753758537595376053761537625376353764537655376653767537685376953770537715377253773537745377553776537775377853779537805378153782537835378453785537865378753788537895379053791537925379353794537955379653797537985379953800538015380253803538045380553806538075380853809538105381153812538135381453815538165381753818538195382053821538225382353824538255382653827538285382953830538315383253833538345383553836538375383853839538405384153842538435384453845538465384753848538495385053851538525385353854538555385653857538585385953860538615386253863538645386553866538675386853869538705387153872538735387453875538765387753878538795388053881538825388353884538855388653887538885388953890538915389253893538945389553896538975389853899539005390153902539035390453905539065390753908539095391053911539125391353914539155391653917539185391953920539215392253923539245392553926539275392853929539305393153932539335393453935539365393753938539395394053941539425394353944539455394653947539485394953950539515395253953539545395553956539575395853959539605396153962539635396453965539665396753968539695397053971539725397353974539755397653977539785397953980539815398253983539845398553986539875398853989539905399153992539935399453995539965399753998539995400054001540025400354004540055400654007540085400954010540115401254013540145401554016540175401854019540205402154022540235402454025540265402754028540295403054031540325403354034540355403654037540385403954040540415404254043540445404554046540475404854049540505405154052540535405454055540565405754058540595406054061540625406354064540655406654067540685406954070540715407254073540745407554076540775407854079540805408154082540835408454085540865408754088540895409054091540925409354094540955409654097540985409954100541015410254103541045410554106541075410854109541105411154112541135411454115541165411754118541195412054121541225412354124541255412654127541285412954130541315413254133541345413554136541375413854139541405414154142541435414454145541465414754148541495415054151541525415354154541555415654157541585415954160541615416254163541645416554166541675416854169541705417154172541735417454175541765417754178541795418054181541825418354184541855418654187541885418954190541915419254193541945419554196541975419854199542005420154202542035420454205542065420754208542095421054211542125421354214542155421654217542185421954220542215422254223542245422554226542275422854229542305423154232542335423454235542365423754238542395424054241542425424354244542455424654247542485424954250542515425254253542545425554256542575425854259542605426154262542635426454265542665426754268542695427054271542725427354274542755427654277542785427954280542815428254283542845428554286542875428854289542905429154292542935429454295542965429754298542995430054301543025430354304543055430654307543085430954310543115431254313543145431554316543175431854319543205432154322543235432454325543265432754328543295433054331543325433354334543355433654337543385433954340543415434254343543445434554346543475434854349543505435154352543535435454355543565435754358543595436054361543625436354364543655436654367543685436954370543715437254373543745437554376543775437854379543805438154382543835438454385543865438754388543895439054391543925439354394543955439654397543985439954400544015440254403544045440554406544075440854409544105441154412544135441454415544165441754418544195442054421544225442354424544255442654427544285442954430544315443254433544345443554436544375443854439544405444154442544435444454445544465444754448544495445054451544525445354454544555445654457544585445954460544615446254463544645446554466544675446854469544705447154472544735447454475544765447754478544795448054481544825448354484544855448654487544885448954490544915449254493544945449554496544975449854499545005450154502545035450454505545065450754508545095451054511545125451354514545155451654517545185451954520545215452254523545245452554526545275452854529545305453154532545335453454535545365453754538545395454054541545425454354544545455454654547545485454954550545515455254553545545455554556545575455854559545605456154562545635456454565545665456754568545695457054571545725457354574545755457654577545785457954580545815458254583545845458554586545875458854589545905459154592545935459454595545965459754598545995460054601546025460354604546055460654607546085460954610546115461254613546145461554616546175461854619546205462154622546235462454625546265462754628546295463054631546325463354634546355463654637546385463954640546415464254643546445464554646546475464854649546505465154652546535465454655546565465754658546595466054661546625466354664546655466654667546685466954670546715467254673546745467554676546775467854679546805468154682546835468454685546865468754688546895469054691546925469354694546955469654697546985469954700547015470254703547045470554706547075470854709547105471154712547135471454715547165471754718547195472054721547225472354724547255472654727547285472954730547315473254733547345473554736547375473854739547405474154742547435474454745547465474754748547495475054751547525475354754547555475654757547585475954760547615476254763547645476554766547675476854769547705477154772547735477454775547765477754778547795478054781547825478354784547855478654787547885478954790547915479254793547945479554796547975479854799548005480154802548035480454805548065480754808548095481054811548125481354814548155481654817548185481954820548215482254823548245482554826548275482854829548305483154832548335483454835548365483754838548395484054841548425484354844548455484654847548485484954850548515485254853548545485554856548575485854859548605486154862548635486454865548665486754868548695487054871548725487354874548755487654877548785487954880548815488254883548845488554886548875488854889548905489154892548935489454895548965489754898548995490054901549025490354904549055490654907549085490954910549115491254913549145491554916549175491854919549205492154922549235492454925549265492754928549295493054931549325493354934549355493654937549385493954940549415494254943549445494554946549475494854949549505495154952549535495454955549565495754958549595496054961549625496354964549655496654967549685496954970549715497254973549745497554976549775497854979549805498154982549835498454985549865498754988549895499054991549925499354994549955499654997549985499955000550015500255003550045500555006550075500855009550105501155012550135501455015550165501755018550195502055021550225502355024550255502655027550285502955030550315503255033550345503555036550375503855039550405504155042550435504455045550465504755048550495505055051550525505355054550555505655057550585505955060550615506255063550645506555066550675506855069550705507155072550735507455075550765507755078550795508055081550825508355084550855508655087550885508955090550915509255093550945509555096550975509855099551005510155102551035510455105551065510755108551095511055111551125511355114551155511655117551185511955120551215512255123551245512555126551275512855129551305513155132551335513455135551365513755138551395514055141551425514355144551455514655147551485514955150551515515255153551545515555156551575515855159551605516155162551635516455165551665516755168551695517055171551725517355174551755517655177551785517955180551815518255183551845518555186551875518855189551905519155192551935519455195551965519755198551995520055201552025520355204552055520655207552085520955210552115521255213552145521555216552175521855219552205522155222552235522455225552265522755228552295523055231552325523355234552355523655237552385523955240552415524255243552445524555246552475524855249552505525155252552535525455255552565525755258552595526055261552625526355264552655526655267552685526955270552715527255273552745527555276552775527855279552805528155282552835528455285552865528755288552895529055291552925529355294552955529655297552985529955300553015530255303553045530555306553075530855309553105531155312553135531455315553165531755318553195532055321553225532355324553255532655327553285532955330553315533255333553345533555336553375533855339553405534155342553435534455345553465534755348553495535055351553525535355354553555535655357553585535955360553615536255363553645536555366553675536855369553705537155372553735537455375553765537755378553795538055381553825538355384553855538655387553885538955390553915539255393553945539555396553975539855399554005540155402554035540455405554065540755408554095541055411554125541355414554155541655417554185541955420554215542255423554245542555426554275542855429554305543155432554335543455435554365543755438554395544055441554425544355444554455544655447554485544955450554515545255453554545545555456554575545855459554605546155462554635546455465554665546755468554695547055471554725547355474554755547655477554785547955480554815548255483554845548555486554875548855489554905549155492554935549455495554965549755498554995550055501555025550355504555055550655507555085550955510555115551255513555145551555516555175551855519555205552155522555235552455525555265552755528555295553055531555325553355534555355553655537555385553955540555415554255543555445554555546555475554855549555505555155552555535555455555555565555755558555595556055561555625556355564555655556655567555685556955570555715557255573555745557555576555775557855579555805558155582555835558455585555865558755588555895559055591555925559355594555955559655597555985559955600556015560255603556045560555606556075560855609556105561155612556135561455615556165561755618556195562055621556225562355624556255562655627556285562955630556315563255633556345563555636556375563855639556405564155642556435564455645556465564755648556495565055651556525565355654556555565655657556585565955660556615566255663556645566555666556675566855669556705567155672556735567455675556765567755678556795568055681556825568355684556855568655687556885568955690556915569255693556945569555696556975569855699557005570155702557035570455705557065570755708557095571055711557125571355714557155571655717557185571955720557215572255723557245572555726557275572855729557305573155732557335573455735557365573755738557395574055741557425574355744557455574655747557485574955750557515575255753557545575555756557575575855759557605576155762557635576455765557665576755768557695577055771557725577355774557755577655777557785577955780557815578255783557845578555786557875578855789557905579155792557935579455795557965579755798557995580055801558025580355804558055580655807558085580955810558115581255813558145581555816558175581855819558205582155822558235582455825558265582755828558295583055831558325583355834558355583655837558385583955840558415584255843558445584555846558475584855849558505585155852558535585455855558565585755858558595586055861558625586355864558655586655867558685586955870558715587255873558745587555876558775587855879558805588155882558835588455885558865588755888558895589055891558925589355894558955589655897558985589955900559015590255903559045590555906559075590855909559105591155912559135591455915559165591755918559195592055921559225592355924559255592655927559285592955930559315593255933559345593555936559375593855939559405594155942559435594455945559465594755948559495595055951559525595355954559555595655957559585595955960559615596255963559645596555966559675596855969559705597155972559735597455975559765597755978559795598055981559825598355984559855598655987559885598955990559915599255993559945599555996559975599855999560005600156002560035600456005560065600756008560095601056011560125601356014560155601656017560185601956020560215602256023560245602556026560275602856029560305603156032560335603456035560365603756038560395604056041560425604356044560455604656047560485604956050560515605256053560545605556056560575605856059560605606156062560635606456065560665606756068560695607056071560725607356074560755607656077560785607956080560815608256083560845608556086560875608856089560905609156092560935609456095560965609756098560995610056101561025610356104561055610656107561085610956110561115611256113561145611556116561175611856119561205612156122561235612456125561265612756128561295613056131561325613356134561355613656137561385613956140561415614256143561445614556146561475614856149561505615156152561535615456155561565615756158561595616056161561625616356164561655616656167561685616956170561715617256173561745617556176561775617856179561805618156182561835618456185561865618756188561895619056191561925619356194561955619656197561985619956200562015620256203562045620556206562075620856209562105621156212562135621456215562165621756218562195622056221562225622356224562255622656227562285622956230562315623256233562345623556236562375623856239562405624156242562435624456245562465624756248562495625056251562525625356254562555625656257562585625956260562615626256263562645626556266562675626856269562705627156272562735627456275562765627756278562795628056281562825628356284562855628656287562885628956290562915629256293562945629556296562975629856299563005630156302563035630456305563065630756308563095631056311563125631356314563155631656317563185631956320563215632256323563245632556326563275632856329563305633156332563335633456335563365633756338563395634056341563425634356344563455634656347563485634956350563515635256353563545635556356563575635856359563605636156362563635636456365563665636756368563695637056371563725637356374563755637656377563785637956380563815638256383563845638556386563875638856389563905639156392563935639456395563965639756398563995640056401564025640356404564055640656407564085640956410564115641256413564145641556416564175641856419564205642156422564235642456425564265642756428564295643056431564325643356434564355643656437564385643956440564415644256443564445644556446564475644856449564505645156452564535645456455564565645756458564595646056461564625646356464564655646656467564685646956470564715647256473564745647556476564775647856479564805648156482564835648456485564865648756488564895649056491564925649356494564955649656497564985649956500565015650256503565045650556506565075650856509565105651156512565135651456515565165651756518565195652056521565225652356524565255652656527565285652956530565315653256533565345653556536565375653856539565405654156542565435654456545565465654756548565495655056551565525655356554565555655656557565585655956560565615656256563565645656556566565675656856569565705657156572565735657456575565765657756578565795658056581565825658356584565855658656587565885658956590565915659256593565945659556596565975659856599566005660156602566035660456605566065660756608566095661056611566125661356614566155661656617566185661956620566215662256623566245662556626566275662856629566305663156632566335663456635566365663756638566395664056641566425664356644566455664656647566485664956650566515665256653566545665556656566575665856659566605666156662566635666456665566665666756668566695667056671566725667356674566755667656677566785667956680566815668256683566845668556686566875668856689566905669156692566935669456695566965669756698566995670056701567025670356704567055670656707567085670956710567115671256713567145671556716567175671856719567205672156722567235672456725567265672756728567295673056731567325673356734567355673656737567385673956740567415674256743567445674556746567475674856749567505675156752567535675456755567565675756758567595676056761567625676356764567655676656767567685676956770567715677256773567745677556776567775677856779567805678156782567835678456785567865678756788567895679056791567925679356794567955679656797567985679956800568015680256803568045680556806568075680856809568105681156812568135681456815568165681756818568195682056821568225682356824568255682656827568285682956830568315683256833568345683556836568375683856839568405684156842568435684456845568465684756848568495685056851568525685356854568555685656857568585685956860568615686256863568645686556866568675686856869568705687156872568735687456875568765687756878568795688056881568825688356884568855688656887568885688956890568915689256893568945689556896568975689856899569005690156902569035690456905569065690756908569095691056911569125691356914569155691656917569185691956920569215692256923569245692556926569275692856929569305693156932569335693456935569365693756938569395694056941569425694356944569455694656947569485694956950569515695256953569545695556956569575695856959569605696156962569635696456965569665696756968569695697056971569725697356974569755697656977569785697956980569815698256983569845698556986569875698856989569905699156992569935699456995569965699756998569995700057001570025700357004570055700657007570085700957010570115701257013570145701557016570175701857019570205702157022570235702457025570265702757028570295703057031570325703357034570355703657037570385703957040570415704257043570445704557046570475704857049570505705157052570535705457055570565705757058570595706057061570625706357064570655706657067570685706957070570715707257073570745707557076570775707857079570805708157082570835708457085570865708757088570895709057091570925709357094570955709657097570985709957100571015710257103571045710557106571075710857109571105711157112571135711457115571165711757118571195712057121571225712357124571255712657127571285712957130571315713257133571345713557136571375713857139571405714157142571435714457145571465714757148571495715057151571525715357154571555715657157571585715957160571615716257163571645716557166571675716857169571705717157172571735717457175571765717757178571795718057181571825718357184571855718657187571885718957190571915719257193571945719557196571975719857199572005720157202572035720457205572065720757208572095721057211572125721357214572155721657217572185721957220572215722257223572245722557226572275722857229572305723157232572335723457235572365723757238572395724057241572425724357244572455724657247572485724957250572515725257253572545725557256572575725857259572605726157262572635726457265572665726757268572695727057271572725727357274572755727657277572785727957280572815728257283572845728557286572875728857289572905729157292572935729457295572965729757298572995730057301573025730357304573055730657307573085730957310573115731257313573145731557316573175731857319573205732157322573235732457325573265732757328573295733057331573325733357334573355733657337573385733957340573415734257343573445734557346573475734857349573505735157352573535735457355573565735757358573595736057361573625736357364573655736657367573685736957370573715737257373573745737557376573775737857379573805738157382573835738457385573865738757388573895739057391573925739357394573955739657397573985739957400574015740257403574045740557406574075740857409574105741157412574135741457415574165741757418574195742057421574225742357424574255742657427574285742957430574315743257433574345743557436574375743857439574405744157442574435744457445574465744757448574495745057451574525745357454574555745657457574585745957460574615746257463574645746557466574675746857469574705747157472574735747457475574765747757478574795748057481574825748357484574855748657487574885748957490574915749257493574945749557496574975749857499575005750157502575035750457505575065750757508575095751057511575125751357514575155751657517575185751957520575215752257523575245752557526575275752857529575305753157532575335753457535575365753757538575395754057541575425754357544575455754657547575485754957550575515755257553575545755557556575575755857559575605756157562575635756457565575665756757568575695757057571575725757357574575755757657577575785757957580575815758257583575845758557586575875758857589575905759157592575935759457595575965759757598575995760057601576025760357604576055760657607576085760957610576115761257613576145761557616576175761857619576205762157622576235762457625576265762757628576295763057631576325763357634576355763657637576385763957640576415764257643576445764557646576475764857649576505765157652576535765457655576565765757658576595766057661576625766357664576655766657667576685766957670576715767257673576745767557676576775767857679576805768157682576835768457685576865768757688576895769057691576925769357694576955769657697576985769957700577015770257703577045770557706577075770857709577105771157712577135771457715577165771757718577195772057721577225772357724577255772657727577285772957730577315773257733577345773557736577375773857739577405774157742577435774457745577465774757748577495775057751577525775357754577555775657757577585775957760577615776257763577645776557766577675776857769577705777157772577735777457775577765777757778577795778057781577825778357784577855778657787577885778957790577915779257793577945779557796577975779857799578005780157802578035780457805578065780757808578095781057811578125781357814578155781657817578185781957820578215782257823578245782557826578275782857829578305783157832578335783457835578365783757838578395784057841578425784357844578455784657847578485784957850578515785257853578545785557856578575785857859578605786157862578635786457865578665786757868578695787057871578725787357874578755787657877578785787957880578815788257883578845788557886578875788857889578905789157892578935789457895578965789757898578995790057901579025790357904579055790657907579085790957910579115791257913579145791557916579175791857919579205792157922579235792457925579265792757928579295793057931579325793357934579355793657937579385793957940579415794257943579445794557946579475794857949579505795157952579535795457955579565795757958579595796057961579625796357964579655796657967579685796957970579715797257973579745797557976579775797857979579805798157982579835798457985579865798757988579895799057991579925799357994579955799657997579985799958000580015800258003580045800558006580075800858009580105801158012580135801458015580165801758018580195802058021580225802358024580255802658027580285802958030580315803258033580345803558036580375803858039580405804158042580435804458045580465804758048580495805058051580525805358054580555805658057580585805958060580615806258063580645806558066580675806858069580705807158072580735807458075580765807758078580795808058081580825808358084580855808658087580885808958090580915809258093580945809558096580975809858099581005810158102581035810458105581065810758108581095811058111581125811358114581155811658117581185811958120581215812258123581245812558126581275812858129581305813158132581335813458135581365813758138581395814058141581425814358144581455814658147581485814958150581515815258153581545815558156581575815858159581605816158162581635816458165581665816758168581695817058171581725817358174581755817658177581785817958180581815818258183581845818558186581875818858189581905819158192581935819458195581965819758198581995820058201582025820358204582055820658207582085820958210582115821258213582145821558216582175821858219582205822158222582235822458225582265822758228582295823058231582325823358234582355823658237582385823958240582415824258243582445824558246582475824858249582505825158252582535825458255582565825758258582595826058261582625826358264582655826658267582685826958270582715827258273582745827558276582775827858279582805828158282582835828458285582865828758288582895829058291582925829358294582955829658297582985829958300583015830258303583045830558306583075830858309583105831158312583135831458315583165831758318583195832058321583225832358324583255832658327583285832958330583315833258333583345833558336583375833858339583405834158342583435834458345583465834758348583495835058351583525835358354583555835658357583585835958360583615836258363583645836558366583675836858369583705837158372583735837458375583765837758378583795838058381583825838358384583855838658387583885838958390583915839258393583945839558396583975839858399584005840158402584035840458405584065840758408584095841058411584125841358414584155841658417584185841958420584215842258423584245842558426584275842858429584305843158432584335843458435584365843758438584395844058441584425844358444584455844658447584485844958450584515845258453584545845558456584575845858459584605846158462584635846458465584665846758468584695847058471584725847358474584755847658477584785847958480584815848258483584845848558486584875848858489584905849158492584935849458495584965849758498584995850058501585025850358504585055850658507585085850958510585115851258513585145851558516585175851858519585205852158522585235852458525585265852758528585295853058531585325853358534585355853658537585385853958540585415854258543585445854558546585475854858549585505855158552585535855458555585565855758558585595856058561585625856358564585655856658567585685856958570585715857258573585745857558576585775857858579585805858158582585835858458585585865858758588585895859058591585925859358594585955859658597585985859958600586015860258603586045860558606586075860858609586105861158612586135861458615586165861758618586195862058621586225862358624586255862658627586285862958630586315863258633586345863558636586375863858639586405864158642586435864458645586465864758648586495865058651586525865358654586555865658657586585865958660586615866258663586645866558666586675866858669586705867158672586735867458675586765867758678586795868058681586825868358684586855868658687586885868958690586915869258693586945869558696586975869858699587005870158702587035870458705587065870758708587095871058711587125871358714587155871658717587185871958720587215872258723587245872558726587275872858729587305873158732587335873458735587365873758738587395874058741587425874358744587455874658747587485874958750587515875258753587545875558756587575875858759587605876158762587635876458765587665876758768587695877058771587725877358774587755877658777587785877958780587815878258783587845878558786587875878858789587905879158792587935879458795587965879758798587995880058801588025880358804588055880658807588085880958810588115881258813588145881558816588175881858819588205882158822588235882458825588265882758828588295883058831588325883358834588355883658837588385883958840588415884258843588445884558846588475884858849588505885158852588535885458855588565885758858588595886058861588625886358864588655886658867588685886958870588715887258873588745887558876588775887858879588805888158882588835888458885588865888758888588895889058891588925889358894588955889658897588985889958900589015890258903589045890558906589075890858909589105891158912589135891458915589165891758918589195892058921589225892358924589255892658927589285892958930589315893258933589345893558936589375893858939589405894158942589435894458945589465894758948589495895058951589525895358954589555895658957589585895958960589615896258963589645896558966589675896858969589705897158972589735897458975589765897758978589795898058981589825898358984589855898658987589885898958990589915899258993589945899558996589975899858999590005900159002590035900459005590065900759008590095901059011590125901359014590155901659017590185901959020590215902259023590245902559026590275902859029590305903159032590335903459035590365903759038590395904059041590425904359044590455904659047590485904959050590515905259053590545905559056590575905859059590605906159062590635906459065590665906759068590695907059071590725907359074590755907659077590785907959080590815908259083590845908559086590875908859089590905909159092590935909459095590965909759098590995910059101591025910359104591055910659107591085910959110591115911259113591145911559116591175911859119591205912159122591235912459125591265912759128591295913059131591325913359134591355913659137591385913959140591415914259143591445914559146591475914859149591505915159152591535915459155591565915759158591595916059161591625916359164591655916659167591685916959170591715917259173591745917559176591775917859179591805918159182591835918459185591865918759188591895919059191591925919359194591955919659197591985919959200592015920259203592045920559206592075920859209592105921159212592135921459215592165921759218592195922059221592225922359224592255922659227592285922959230592315923259233592345923559236592375923859239592405924159242592435924459245592465924759248592495925059251592525925359254592555925659257592585925959260592615926259263592645926559266592675926859269592705927159272592735927459275592765927759278592795928059281592825928359284592855928659287592885928959290592915929259293592945929559296592975929859299593005930159302593035930459305593065930759308593095931059311593125931359314593155931659317593185931959320593215932259323593245932559326593275932859329593305933159332593335933459335593365933759338593395934059341593425934359344593455934659347593485934959350593515935259353593545935559356593575935859359593605936159362593635936459365593665936759368593695937059371593725937359374593755937659377593785937959380593815938259383593845938559386593875938859389593905939159392593935939459395593965939759398593995940059401594025940359404594055940659407594085940959410594115941259413594145941559416594175941859419594205942159422594235942459425594265942759428594295943059431594325943359434594355943659437594385943959440594415944259443594445944559446594475944859449594505945159452594535945459455594565945759458594595946059461594625946359464594655946659467594685946959470594715947259473594745947559476594775947859479594805948159482594835948459485594865948759488594895949059491594925949359494594955949659497594985949959500595015950259503595045950559506595075950859509595105951159512595135951459515595165951759518595195952059521595225952359524595255952659527595285952959530595315953259533595345953559536595375953859539595405954159542595435954459545595465954759548595495955059551595525955359554595555955659557595585955959560595615956259563595645956559566595675956859569595705957159572595735957459575595765957759578595795958059581595825958359584595855958659587595885958959590595915959259593595945959559596595975959859599596005960159602596035960459605596065960759608596095961059611596125961359614596155961659617596185961959620596215962259623596245962559626596275962859629596305963159632596335963459635596365963759638596395964059641596425964359644596455964659647596485964959650596515965259653596545965559656596575965859659596605966159662596635966459665596665966759668596695967059671596725967359674596755967659677596785967959680596815968259683596845968559686596875968859689596905969159692596935969459695596965969759698596995970059701597025970359704597055970659707597085970959710597115971259713597145971559716597175971859719597205972159722597235972459725597265972759728597295973059731597325973359734597355973659737597385973959740597415974259743597445974559746597475974859749597505975159752597535975459755597565975759758597595976059761597625976359764597655976659767597685976959770597715977259773597745977559776597775977859779597805978159782597835978459785597865978759788597895979059791597925979359794597955979659797597985979959800598015980259803598045980559806598075980859809598105981159812598135981459815598165981759818598195982059821598225982359824598255982659827598285982959830598315983259833598345983559836598375983859839598405984159842598435984459845598465984759848598495985059851598525985359854598555985659857598585985959860598615986259863598645986559866598675986859869598705987159872598735987459875598765987759878598795988059881598825988359884598855988659887598885988959890598915989259893598945989559896598975989859899599005990159902599035990459905599065990759908599095991059911599125991359914599155991659917599185991959920599215992259923599245992559926599275992859929599305993159932599335993459935599365993759938599395994059941599425994359944599455994659947599485994959950599515995259953599545995559956599575995859959599605996159962599635996459965599665996759968599695997059971599725997359974599755997659977599785997959980599815998259983599845998559986599875998859989599905999159992599935999459995599965999759998599996000060001600026000360004600056000660007600086000960010600116001260013600146001560016600176001860019600206002160022600236002460025600266002760028600296003060031600326003360034600356003660037600386003960040600416004260043600446004560046600476004860049600506005160052600536005460055600566005760058600596006060061600626006360064600656006660067600686006960070600716007260073600746007560076600776007860079600806008160082600836008460085600866008760088600896009060091600926009360094600956009660097600986009960100601016010260103601046010560106601076010860109601106011160112601136011460115601166011760118601196012060121601226012360124601256012660127601286012960130601316013260133601346013560136601376013860139601406014160142601436014460145601466014760148601496015060151601526015360154601556015660157601586015960160601616016260163601646016560166601676016860169601706017160172601736017460175601766017760178601796018060181601826018360184601856018660187601886018960190601916019260193601946019560196601976019860199602006020160202602036020460205602066020760208602096021060211602126021360214602156021660217602186021960220602216022260223602246022560226602276022860229602306023160232602336023460235602366023760238602396024060241602426024360244602456024660247602486024960250602516025260253602546025560256602576025860259602606026160262602636026460265602666026760268602696027060271602726027360274602756027660277602786027960280602816028260283602846028560286602876028860289602906029160292602936029460295602966029760298602996030060301603026030360304603056030660307603086030960310603116031260313603146031560316603176031860319603206032160322603236032460325603266032760328603296033060331603326033360334603356033660337603386033960340603416034260343603446034560346603476034860349603506035160352603536035460355603566035760358603596036060361603626036360364603656036660367603686036960370603716037260373603746037560376603776037860379603806038160382603836038460385603866038760388603896039060391603926039360394603956039660397603986039960400604016040260403604046040560406604076040860409604106041160412604136041460415604166041760418604196042060421604226042360424604256042660427604286042960430604316043260433604346043560436604376043860439604406044160442604436044460445604466044760448604496045060451604526045360454604556045660457604586045960460604616046260463604646046560466604676046860469604706047160472604736047460475604766047760478604796048060481604826048360484604856048660487604886048960490604916049260493604946049560496604976049860499605006050160502605036050460505605066050760508605096051060511605126051360514605156051660517605186051960520605216052260523605246052560526605276052860529605306053160532605336053460535605366053760538605396054060541605426054360544605456054660547605486054960550605516055260553605546055560556605576055860559605606056160562605636056460565605666056760568605696057060571605726057360574605756057660577605786057960580605816058260583605846058560586605876058860589605906059160592605936059460595605966059760598605996060060601606026060360604606056060660607606086060960610606116061260613606146061560616606176061860619606206062160622606236062460625606266062760628606296063060631606326063360634606356063660637606386063960640606416064260643606446064560646606476064860649606506065160652606536065460655606566065760658606596066060661606626066360664606656066660667606686066960670606716067260673606746067560676606776067860679606806068160682606836068460685606866068760688606896069060691606926069360694606956069660697606986069960700607016070260703607046070560706607076070860709607106071160712607136071460715607166071760718607196072060721607226072360724607256072660727607286072960730607316073260733607346073560736607376073860739607406074160742607436074460745607466074760748607496075060751607526075360754607556075660757607586075960760607616076260763607646076560766607676076860769607706077160772607736077460775607766077760778607796078060781607826078360784607856078660787607886078960790607916079260793607946079560796607976079860799608006080160802608036080460805608066080760808608096081060811608126081360814608156081660817608186081960820608216082260823608246082560826608276082860829608306083160832608336083460835608366083760838608396084060841608426084360844608456084660847608486084960850608516085260853608546085560856608576085860859608606086160862608636086460865608666086760868608696087060871608726087360874608756087660877608786087960880608816088260883608846088560886608876088860889608906089160892608936089460895608966089760898608996090060901609026090360904609056090660907609086090960910609116091260913609146091560916609176091860919609206092160922609236092460925609266092760928609296093060931609326093360934609356093660937609386093960940609416094260943609446094560946609476094860949609506095160952609536095460955609566095760958609596096060961609626096360964609656096660967609686096960970609716097260973609746097560976609776097860979609806098160982609836098460985609866098760988609896099060991609926099360994609956099660997609986099961000610016100261003610046100561006610076100861009610106101161012610136101461015610166101761018610196102061021610226102361024610256102661027610286102961030610316103261033610346103561036610376103861039610406104161042610436104461045610466104761048610496105061051610526105361054610556105661057610586105961060610616106261063610646106561066610676106861069610706107161072610736107461075610766107761078610796108061081610826108361084610856108661087610886108961090610916109261093610946109561096610976109861099611006110161102611036110461105611066110761108611096111061111611126111361114611156111661117611186111961120611216112261123611246112561126611276112861129611306113161132611336113461135611366113761138611396114061141611426114361144611456114661147611486114961150611516115261153611546115561156611576115861159611606116161162611636116461165611666116761168611696117061171611726117361174611756117661177611786117961180611816118261183611846118561186611876118861189611906119161192611936119461195611966119761198611996120061201612026120361204612056120661207612086120961210612116121261213612146121561216612176121861219612206122161222612236122461225612266122761228612296123061231612326123361234612356123661237612386123961240612416124261243612446124561246612476124861249612506125161252612536125461255612566125761258612596126061261612626126361264612656126661267612686126961270612716127261273612746127561276612776127861279612806128161282612836128461285612866128761288612896129061291612926129361294612956129661297612986129961300613016130261303613046130561306613076130861309613106131161312613136131461315613166131761318613196132061321613226132361324613256132661327613286132961330613316133261333613346133561336613376133861339613406134161342613436134461345613466134761348613496135061351613526135361354613556135661357613586135961360613616136261363613646136561366613676136861369613706137161372613736137461375613766137761378613796138061381613826138361384613856138661387613886138961390613916139261393613946139561396613976139861399614006140161402614036140461405614066140761408614096141061411614126141361414614156141661417614186141961420614216142261423614246142561426614276142861429614306143161432614336143461435614366143761438614396144061441614426144361444614456144661447614486144961450614516145261453614546145561456614576145861459614606146161462614636146461465614666146761468614696147061471614726147361474614756147661477614786147961480614816148261483614846148561486614876148861489614906149161492614936149461495614966149761498614996150061501615026150361504615056150661507615086150961510615116151261513615146151561516615176151861519615206152161522615236152461525615266152761528615296153061531615326153361534615356153661537615386153961540615416154261543615446154561546615476154861549615506155161552615536155461555615566155761558615596156061561615626156361564615656156661567615686156961570615716157261573615746157561576615776157861579615806158161582615836158461585615866158761588615896159061591615926159361594615956159661597615986159961600616016160261603616046160561606616076160861609616106161161612616136161461615616166161761618616196162061621616226162361624616256162661627616286162961630616316163261633616346163561636616376163861639616406164161642616436164461645616466164761648616496165061651616526165361654616556165661657616586165961660616616166261663616646166561666616676166861669616706167161672616736167461675616766167761678616796168061681616826168361684616856168661687616886168961690616916169261693616946169561696616976169861699617006170161702617036170461705617066170761708617096171061711617126171361714617156171661717617186171961720617216172261723617246172561726617276172861729617306173161732617336173461735617366173761738617396174061741617426174361744617456174661747617486174961750617516175261753617546175561756617576175861759617606176161762617636176461765617666176761768617696177061771617726177361774617756177661777617786177961780617816178261783617846178561786617876178861789617906179161792617936179461795617966179761798617996180061801618026180361804618056180661807618086180961810618116181261813618146181561816618176181861819618206182161822618236182461825618266182761828618296183061831618326183361834618356183661837618386183961840618416184261843618446184561846618476184861849618506185161852618536185461855618566185761858618596186061861618626186361864618656186661867618686186961870618716187261873618746187561876618776187861879618806188161882618836188461885618866188761888618896189061891618926189361894618956189661897618986189961900619016190261903619046190561906619076190861909619106191161912619136191461915619166191761918619196192061921619226192361924619256192661927619286192961930619316193261933619346193561936619376193861939619406194161942619436194461945619466194761948619496195061951619526195361954619556195661957619586195961960619616196261963619646196561966619676196861969619706197161972619736197461975619766197761978619796198061981619826198361984619856198661987619886198961990619916199261993619946199561996619976199861999620006200162002620036200462005620066200762008620096201062011620126201362014620156201662017620186201962020620216202262023620246202562026620276202862029620306203162032620336203462035620366203762038620396204062041620426204362044620456204662047620486204962050620516205262053620546205562056620576205862059620606206162062620636206462065620666206762068620696207062071620726207362074620756207662077620786207962080620816208262083620846208562086620876208862089620906209162092620936209462095620966209762098620996210062101621026210362104621056210662107621086210962110621116211262113621146211562116621176211862119621206212162122621236212462125621266212762128621296213062131621326213362134621356213662137621386213962140621416214262143621446214562146621476214862149621506215162152621536215462155621566215762158621596216062161621626216362164621656216662167621686216962170621716217262173621746217562176621776217862179621806218162182621836218462185621866218762188621896219062191621926219362194621956219662197621986219962200622016220262203622046220562206622076220862209622106221162212622136221462215622166221762218622196222062221622226222362224622256222662227622286222962230622316223262233622346223562236622376223862239622406224162242622436224462245622466224762248622496225062251622526225362254622556225662257622586225962260622616226262263622646226562266622676226862269622706227162272622736227462275622766227762278622796228062281622826228362284622856228662287622886228962290622916229262293622946229562296622976229862299623006230162302623036230462305623066230762308623096231062311623126231362314623156231662317623186231962320623216232262323623246232562326623276232862329623306233162332623336233462335623366233762338623396234062341623426234362344623456234662347623486234962350623516235262353623546235562356623576235862359623606236162362623636236462365623666236762368623696237062371623726237362374623756237662377623786237962380623816238262383623846238562386623876238862389623906239162392623936239462395623966239762398623996240062401624026240362404624056240662407624086240962410624116241262413624146241562416624176241862419624206242162422624236242462425624266242762428624296243062431624326243362434624356243662437624386243962440624416244262443624446244562446624476244862449624506245162452624536245462455624566245762458624596246062461624626246362464624656246662467624686246962470624716247262473624746247562476624776247862479624806248162482624836248462485624866248762488624896249062491624926249362494624956249662497624986249962500625016250262503625046250562506625076250862509625106251162512625136251462515625166251762518625196252062521625226252362524625256252662527625286252962530625316253262533625346253562536625376253862539625406254162542625436254462545625466254762548625496255062551625526255362554625556255662557625586255962560625616256262563625646256562566625676256862569625706257162572625736257462575625766257762578625796258062581625826258362584625856258662587625886258962590625916259262593625946259562596625976259862599626006260162602626036260462605626066260762608626096261062611626126261362614626156261662617626186261962620626216262262623626246262562626626276262862629626306263162632626336263462635626366263762638626396264062641626426264362644626456264662647626486264962650626516265262653626546265562656626576265862659626606266162662626636266462665626666266762668626696267062671626726267362674626756267662677626786267962680626816268262683626846268562686626876268862689626906269162692626936269462695626966269762698626996270062701627026270362704627056270662707627086270962710627116271262713627146271562716627176271862719627206272162722627236272462725627266272762728627296273062731627326273362734627356273662737627386273962740627416274262743627446274562746627476274862749627506275162752627536275462755627566275762758627596276062761627626276362764627656276662767627686276962770627716277262773627746277562776627776277862779627806278162782627836278462785627866278762788627896279062791627926279362794627956279662797627986279962800628016280262803628046280562806628076280862809628106281162812628136281462815628166281762818628196282062821628226282362824628256282662827628286282962830628316283262833628346283562836628376283862839628406284162842628436284462845628466284762848628496285062851628526285362854628556285662857628586285962860628616286262863628646286562866628676286862869628706287162872628736287462875628766287762878628796288062881628826288362884628856288662887628886288962890628916289262893628946289562896628976289862899629006290162902629036290462905629066290762908629096291062911629126291362914629156291662917629186291962920629216292262923629246292562926629276292862929629306293162932629336293462935629366293762938629396294062941629426294362944629456294662947629486294962950629516295262953629546295562956629576295862959629606296162962629636296462965629666296762968629696297062971629726297362974629756297662977629786297962980629816298262983629846298562986629876298862989629906299162992629936299462995629966299762998629996300063001630026300363004630056300663007630086300963010630116301263013630146301563016630176301863019630206302163022630236302463025630266302763028630296303063031630326303363034630356303663037630386303963040630416304263043630446304563046630476304863049630506305163052630536305463055630566305763058630596306063061630626306363064630656306663067630686306963070630716307263073630746307563076630776307863079630806308163082630836308463085630866308763088630896309063091630926309363094630956309663097630986309963100631016310263103631046310563106631076310863109631106311163112631136311463115631166311763118631196312063121631226312363124631256312663127631286312963130631316313263133631346313563136631376313863139631406314163142631436314463145631466314763148631496315063151631526315363154631556315663157631586315963160631616316263163631646316563166631676316863169631706317163172631736317463175631766317763178631796318063181631826318363184631856318663187631886318963190631916319263193631946319563196631976319863199632006320163202632036320463205632066320763208632096321063211632126321363214632156321663217632186321963220632216322263223632246322563226632276322863229632306323163232632336323463235632366323763238632396324063241632426324363244632456324663247632486324963250632516325263253632546325563256632576325863259632606326163262632636326463265632666326763268632696327063271632726327363274632756327663277632786327963280632816328263283632846328563286632876328863289632906329163292632936329463295632966329763298632996330063301633026330363304633056330663307633086330963310633116331263313633146331563316633176331863319633206332163322633236332463325633266332763328633296333063331633326333363334633356333663337633386333963340633416334263343633446334563346633476334863349633506335163352633536335463355633566335763358633596336063361633626336363364633656336663367633686336963370633716337263373633746337563376633776337863379633806338163382633836338463385633866338763388633896339063391633926339363394633956339663397633986339963400634016340263403634046340563406634076340863409634106341163412634136341463415634166341763418634196342063421634226342363424634256342663427634286342963430634316343263433634346343563436634376343863439634406344163442634436344463445634466344763448634496345063451634526345363454634556345663457634586345963460634616346263463634646346563466634676346863469634706347163472634736347463475634766347763478634796348063481634826348363484634856348663487634886348963490634916349263493634946349563496634976349863499635006350163502635036350463505635066350763508635096351063511635126351363514635156351663517635186351963520635216352263523635246352563526635276352863529635306353163532635336353463535635366353763538635396354063541635426354363544635456354663547635486354963550635516355263553635546355563556635576355863559635606356163562635636356463565635666356763568635696357063571635726357363574635756357663577635786357963580635816358263583635846358563586635876358863589635906359163592635936359463595635966359763598635996360063601636026360363604636056360663607636086360963610636116361263613636146361563616636176361863619636206362163622636236362463625636266362763628636296363063631636326363363634636356363663637636386363963640636416364263643636446364563646636476364863649636506365163652636536365463655636566365763658636596366063661636626366363664636656366663667636686366963670636716367263673636746367563676636776367863679636806368163682636836368463685636866368763688636896369063691636926369363694636956369663697636986369963700637016370263703637046370563706637076370863709637106371163712637136371463715637166371763718637196372063721637226372363724637256372663727637286372963730637316373263733637346373563736637376373863739637406374163742637436374463745637466374763748637496375063751637526375363754637556375663757637586375963760637616376263763637646376563766637676376863769637706377163772637736377463775637766377763778637796378063781637826378363784637856378663787637886378963790637916379263793637946379563796637976379863799638006380163802638036380463805638066380763808638096381063811638126381363814638156381663817638186381963820638216382263823638246382563826638276382863829638306383163832638336383463835638366383763838638396384063841638426384363844638456384663847638486384963850638516385263853638546385563856638576385863859638606386163862638636386463865638666386763868638696387063871638726387363874638756387663877638786387963880638816388263883638846388563886638876388863889638906389163892638936389463895638966389763898638996390063901639026390363904639056390663907639086390963910639116391263913639146391563916639176391863919639206392163922639236392463925639266392763928639296393063931639326393363934639356393663937639386393963940639416394263943639446394563946639476394863949639506395163952639536395463955639566395763958639596396063961639626396363964639656396663967639686396963970639716397263973639746397563976639776397863979639806398163982639836398463985639866398763988639896399063991639926399363994639956399663997639986399964000640016400264003640046400564006640076400864009640106401164012640136401464015640166401764018640196402064021640226402364024640256402664027640286402964030640316403264033640346403564036640376403864039640406404164042640436404464045640466404764048640496405064051640526405364054640556405664057640586405964060640616406264063640646406564066640676406864069640706407164072640736407464075640766407764078640796408064081640826408364084640856408664087640886408964090640916409264093640946409564096640976409864099641006410164102641036410464105641066410764108641096411064111641126411364114641156411664117641186411964120641216412264123641246412564126641276412864129641306413164132641336413464135641366413764138641396414064141641426414364144641456414664147641486414964150641516415264153641546415564156641576415864159641606416164162641636416464165641666416764168641696417064171641726417364174641756417664177641786417964180641816418264183641846418564186641876418864189641906419164192641936419464195641966419764198641996420064201642026420364204642056420664207642086420964210642116421264213642146421564216642176421864219642206422164222642236422464225642266422764228642296423064231642326423364234642356423664237642386423964240642416424264243642446424564246642476424864249642506425164252642536425464255642566425764258642596426064261642626426364264642656426664267642686426964270642716427264273642746427564276642776427864279642806428164282642836428464285642866428764288642896429064291642926429364294642956429664297642986429964300643016430264303643046430564306643076430864309643106431164312643136431464315643166431764318643196432064321643226432364324643256432664327643286432964330643316433264333643346433564336643376433864339643406434164342643436434464345643466434764348643496435064351643526435364354643556435664357643586435964360643616436264363643646436564366643676436864369643706437164372643736437464375643766437764378643796438064381643826438364384643856438664387643886438964390643916439264393643946439564396643976439864399644006440164402644036440464405644066440764408644096441064411644126441364414644156441664417644186441964420644216442264423644246442564426644276442864429644306443164432644336443464435644366443764438644396444064441644426444364444644456444664447644486444964450644516445264453644546445564456644576445864459644606446164462644636446464465644666446764468644696447064471644726447364474644756447664477644786447964480644816448264483644846448564486644876448864489644906449164492644936449464495644966449764498644996450064501645026450364504645056450664507645086450964510645116451264513645146451564516645176451864519645206452164522645236452464525645266452764528645296453064531645326453364534645356453664537645386453964540645416454264543645446454564546645476454864549645506455164552645536455464555645566455764558645596456064561645626456364564645656456664567645686456964570645716457264573645746457564576645776457864579645806458164582645836458464585645866458764588645896459064591645926459364594645956459664597645986459964600646016460264603646046460564606646076460864609646106461164612646136461464615646166461764618646196462064621646226462364624646256462664627646286462964630646316463264633646346463564636646376463864639646406464164642646436464464645646466464764648646496465064651646526465364654646556465664657646586465964660646616466264663646646466564666646676466864669646706467164672646736467464675646766467764678646796468064681646826468364684646856468664687646886468964690646916469264693646946469564696646976469864699647006470164702647036470464705647066470764708647096471064711647126471364714647156471664717647186471964720647216472264723647246472564726647276472864729647306473164732647336473464735647366473764738647396474064741647426474364744647456474664747647486474964750647516475264753647546475564756647576475864759647606476164762647636476464765647666476764768647696477064771647726477364774647756477664777647786477964780647816478264783647846478564786647876478864789647906479164792647936479464795647966479764798647996480064801648026480364804648056480664807648086480964810648116481264813648146481564816648176481864819648206482164822648236482464825648266482764828648296483064831648326483364834648356483664837648386483964840648416484264843648446484564846648476484864849648506485164852648536485464855648566485764858648596486064861648626486364864648656486664867648686486964870648716487264873648746487564876648776487864879648806488164882648836488464885648866488764888648896489064891648926489364894648956489664897648986489964900649016490264903649046490564906649076490864909649106491164912649136491464915649166491764918649196492064921649226492364924649256492664927649286492964930649316493264933649346493564936649376493864939649406494164942649436494464945649466494764948649496495064951649526495364954649556495664957649586495964960649616496264963649646496564966649676496864969649706497164972649736497464975649766497764978649796498064981649826498364984649856498664987649886498964990649916499264993649946499564996649976499864999650006500165002650036500465005650066500765008650096501065011650126501365014650156501665017650186501965020650216502265023650246502565026650276502865029650306503165032650336503465035650366503765038650396504065041650426504365044650456504665047650486504965050650516505265053650546505565056650576505865059650606506165062650636506465065650666506765068650696507065071650726507365074650756507665077650786507965080650816508265083650846508565086650876508865089650906509165092650936509465095650966509765098650996510065101651026510365104651056510665107651086510965110651116511265113651146511565116651176511865119651206512165122651236512465125651266512765128651296513065131651326513365134651356513665137651386513965140651416514265143651446514565146651476514865149651506515165152651536515465155651566515765158651596516065161651626516365164651656516665167651686516965170651716517265173651746517565176651776517865179651806518165182651836518465185651866518765188651896519065191651926519365194651956519665197651986519965200652016520265203652046520565206652076520865209652106521165212652136521465215652166521765218652196522065221652226522365224652256522665227652286522965230652316523265233652346523565236652376523865239652406524165242652436524465245652466524765248652496525065251652526525365254652556525665257652586525965260652616526265263652646526565266652676526865269652706527165272652736527465275652766527765278652796528065281652826528365284652856528665287652886528965290652916529265293652946529565296652976529865299653006530165302653036530465305653066530765308653096531065311653126531365314653156531665317653186531965320653216532265323653246532565326653276532865329653306533165332653336533465335653366533765338653396534065341653426534365344653456534665347653486534965350653516535265353653546535565356653576535865359653606536165362653636536465365653666536765368653696537065371653726537365374653756537665377653786537965380653816538265383653846538565386653876538865389653906539165392653936539465395653966539765398653996540065401654026540365404654056540665407654086540965410654116541265413654146541565416654176541865419654206542165422654236542465425654266542765428654296543065431654326543365434654356543665437654386543965440654416544265443654446544565446654476544865449654506545165452654536545465455654566545765458654596546065461654626546365464654656546665467654686546965470654716547265473654746547565476654776547865479654806548165482654836548465485654866548765488654896549065491654926549365494654956549665497654986549965500655016550265503655046550565506655076550865509655106551165512655136551465515655166551765518655196552065521655226552365524655256552665527655286552965530655316553265533655346553565536655376553865539655406554165542655436554465545655466554765548655496555065551655526555365554655556555665557655586555965560655616556265563655646556565566655676556865569655706557165572655736557465575655766557765578655796558065581655826558365584655856558665587655886558965590655916559265593655946559565596655976559865599656006560165602656036560465605656066560765608656096561065611656126561365614656156561665617656186561965620656216562265623656246562565626656276562865629656306563165632656336563465635656366563765638656396564065641656426564365644656456564665647656486564965650656516565265653656546565565656656576565865659656606566165662656636566465665656666566765668656696567065671656726567365674656756567665677656786567965680656816568265683656846568565686656876568865689656906569165692656936569465695656966569765698656996570065701657026570365704657056570665707657086570965710657116571265713657146571565716657176571865719657206572165722657236572465725657266572765728657296573065731657326573365734657356573665737657386573965740657416574265743657446574565746657476574865749657506575165752657536575465755657566575765758657596576065761657626576365764657656576665767657686576965770657716577265773657746577565776657776577865779657806578165782657836578465785657866578765788657896579065791657926579365794657956579665797657986579965800658016580265803658046580565806658076580865809658106581165812658136581465815658166581765818658196582065821658226582365824658256582665827658286582965830658316583265833658346583565836658376583865839658406584165842658436584465845658466584765848658496585065851658526585365854658556585665857658586585965860658616586265863658646586565866658676586865869658706587165872658736587465875658766587765878658796588065881658826588365884658856588665887658886588965890658916589265893658946589565896658976589865899659006590165902659036590465905659066590765908659096591065911659126591365914659156591665917659186591965920659216592265923659246592565926659276592865929659306593165932659336593465935659366593765938659396594065941659426594365944659456594665947659486594965950659516595265953659546595565956659576595865959659606596165962659636596465965659666596765968659696597065971659726597365974659756597665977659786597965980659816598265983659846598565986659876598865989659906599165992659936599465995659966599765998659996600066001660026600366004660056600666007660086600966010660116601266013660146601566016660176601866019660206602166022660236602466025660266602766028660296603066031660326603366034660356603666037660386603966040660416604266043660446604566046660476604866049660506605166052660536605466055660566605766058660596606066061660626606366064660656606666067660686606966070660716607266073660746607566076660776607866079660806608166082660836608466085660866608766088660896609066091660926609366094660956609666097660986609966100661016610266103661046610566106661076610866109661106611166112661136611466115661166611766118661196612066121661226612366124661256612666127661286612966130661316613266133661346613566136661376613866139661406614166142661436614466145661466614766148661496615066151661526615366154661556615666157661586615966160661616616266163661646616566166661676616866169661706617166172661736617466175661766617766178661796618066181661826618366184661856618666187661886618966190661916619266193661946619566196661976619866199662006620166202662036620466205662066620766208662096621066211662126621366214662156621666217662186621966220662216622266223662246622566226662276622866229662306623166232662336623466235662366623766238662396624066241662426624366244662456624666247662486624966250662516625266253662546625566256662576625866259662606626166262662636626466265662666626766268662696627066271662726627366274662756627666277662786627966280662816628266283662846628566286662876628866289662906629166292662936629466295662966629766298662996630066301663026630366304663056630666307663086630966310663116631266313663146631566316663176631866319663206632166322663236632466325663266632766328663296633066331663326633366334663356633666337663386633966340663416634266343663446634566346663476634866349663506635166352663536635466355663566635766358663596636066361663626636366364663656636666367663686636966370663716637266373663746637566376663776637866379663806638166382663836638466385663866638766388663896639066391663926639366394663956639666397663986639966400664016640266403664046640566406664076640866409664106641166412664136641466415664166641766418664196642066421664226642366424664256642666427664286642966430664316643266433664346643566436664376643866439664406644166442664436644466445664466644766448664496645066451664526645366454664556645666457664586645966460664616646266463664646646566466664676646866469664706647166472664736647466475664766647766478664796648066481664826648366484664856648666487664886648966490664916649266493664946649566496664976649866499665006650166502665036650466505665066650766508665096651066511665126651366514665156651666517665186651966520665216652266523665246652566526665276652866529665306653166532665336653466535665366653766538665396654066541665426654366544665456654666547665486654966550665516655266553665546655566556665576655866559665606656166562665636656466565665666656766568665696657066571665726657366574665756657666577665786657966580665816658266583665846658566586665876658866589665906659166592665936659466595665966659766598665996660066601666026660366604666056660666607666086660966610666116661266613666146661566616666176661866619666206662166622666236662466625666266662766628666296663066631666326663366634666356663666637666386663966640666416664266643666446664566646666476664866649666506665166652666536665466655666566665766658666596666066661666626666366664666656666666667666686666966670666716667266673666746667566676666776667866679666806668166682666836668466685666866668766688666896669066691666926669366694666956669666697666986669966700667016670266703667046670566706667076670866709667106671166712667136671466715667166671766718667196672066721667226672366724667256672666727667286672966730667316673266733667346673566736667376673866739667406674166742667436674466745667466674766748667496675066751667526675366754667556675666757667586675966760667616676266763667646676566766667676676866769667706677166772667736677466775667766677766778667796678066781667826678366784667856678666787667886678966790667916679266793667946679566796667976679866799668006680166802668036680466805668066680766808668096681066811668126681366814668156681666817668186681966820668216682266823668246682566826668276682866829668306683166832668336683466835668366683766838668396684066841668426684366844668456684666847668486684966850668516685266853668546685566856668576685866859668606686166862668636686466865668666686766868668696687066871668726687366874668756687666877668786687966880668816688266883668846688566886668876688866889668906689166892668936689466895668966689766898668996690066901669026690366904669056690666907669086690966910669116691266913669146691566916669176691866919669206692166922669236692466925669266692766928669296693066931669326693366934669356693666937669386693966940669416694266943669446694566946669476694866949669506695166952669536695466955669566695766958669596696066961669626696366964669656696666967669686696966970669716697266973669746697566976669776697866979669806698166982669836698466985669866698766988669896699066991669926699366994669956699666997669986699967000670016700267003670046700567006670076700867009670106701167012670136701467015670166701767018670196702067021670226702367024670256702667027670286702967030670316703267033670346703567036670376703867039670406704167042670436704467045670466704767048670496705067051670526705367054670556705667057670586705967060670616706267063670646706567066670676706867069670706707167072670736707467075670766707767078670796708067081670826708367084670856708667087670886708967090670916709267093670946709567096670976709867099671006710167102671036710467105671066710767108671096711067111671126711367114671156711667117671186711967120671216712267123671246712567126671276712867129671306713167132671336713467135671366713767138671396714067141671426714367144671456714667147671486714967150671516715267153671546715567156671576715867159671606716167162671636716467165671666716767168671696717067171671726717367174671756717667177671786717967180671816718267183671846718567186671876718867189671906719167192671936719467195671966719767198671996720067201672026720367204672056720667207672086720967210672116721267213672146721567216672176721867219672206722167222672236722467225672266722767228672296723067231672326723367234672356723667237672386723967240672416724267243672446724567246672476724867249672506725167252672536725467255672566725767258672596726067261672626726367264672656726667267672686726967270672716727267273672746727567276672776727867279672806728167282672836728467285672866728767288672896729067291672926729367294672956729667297672986729967300673016730267303673046730567306673076730867309673106731167312673136731467315673166731767318673196732067321673226732367324673256732667327673286732967330673316733267333673346733567336673376733867339673406734167342673436734467345673466734767348673496735067351673526735367354673556735667357673586735967360673616736267363673646736567366673676736867369673706737167372673736737467375673766737767378673796738067381673826738367384673856738667387673886738967390673916739267393673946739567396673976739867399674006740167402674036740467405674066740767408674096741067411674126741367414674156741667417674186741967420674216742267423674246742567426674276742867429674306743167432674336743467435674366743767438674396744067441674426744367444674456744667447674486744967450674516745267453674546745567456674576745867459674606746167462674636746467465674666746767468674696747067471674726747367474674756747667477674786747967480674816748267483674846748567486674876748867489674906749167492674936749467495674966749767498674996750067501675026750367504675056750667507675086750967510675116751267513675146751567516675176751867519675206752167522675236752467525675266752767528675296753067531675326753367534675356753667537675386753967540675416754267543675446754567546675476754867549675506755167552675536755467555675566755767558675596756067561675626756367564675656756667567675686756967570675716757267573675746757567576675776757867579675806758167582675836758467585675866758767588675896759067591675926759367594675956759667597675986759967600676016760267603676046760567606676076760867609676106761167612676136761467615676166761767618676196762067621676226762367624676256762667627676286762967630676316763267633676346763567636676376763867639676406764167642676436764467645676466764767648676496765067651676526765367654676556765667657676586765967660676616766267663676646766567666676676766867669676706767167672676736767467675676766767767678676796768067681676826768367684676856768667687676886768967690676916769267693676946769567696676976769867699677006770167702677036770467705677066770767708677096771067711677126771367714677156771667717677186771967720677216772267723677246772567726677276772867729677306773167732677336773467735677366773767738677396774067741677426774367744677456774667747677486774967750677516775267753677546775567756677576775867759677606776167762677636776467765677666776767768677696777067771677726777367774677756777667777677786777967780677816778267783677846778567786677876778867789677906779167792677936779467795677966779767798677996780067801678026780367804678056780667807678086780967810678116781267813678146781567816678176781867819678206782167822678236782467825678266782767828678296783067831678326783367834678356783667837678386783967840678416784267843678446784567846678476784867849678506785167852678536785467855678566785767858678596786067861678626786367864678656786667867678686786967870678716787267873678746787567876678776787867879678806788167882678836788467885678866788767888678896789067891678926789367894678956789667897678986789967900679016790267903679046790567906679076790867909679106791167912679136791467915679166791767918679196792067921679226792367924679256792667927679286792967930679316793267933679346793567936679376793867939679406794167942679436794467945679466794767948679496795067951679526795367954679556795667957679586795967960679616796267963679646796567966679676796867969679706797167972679736797467975679766797767978679796798067981679826798367984679856798667987679886798967990679916799267993679946799567996679976799867999680006800168002680036800468005680066800768008680096801068011680126801368014680156801668017680186801968020680216802268023680246802568026680276802868029680306803168032680336803468035680366803768038680396804068041680426804368044680456804668047680486804968050680516805268053680546805568056680576805868059680606806168062680636806468065680666806768068680696807068071680726807368074680756807668077680786807968080680816808268083680846808568086680876808868089680906809168092680936809468095680966809768098680996810068101681026810368104681056810668107681086810968110681116811268113681146811568116681176811868119681206812168122681236812468125681266812768128681296813068131681326813368134681356813668137681386813968140681416814268143681446814568146681476814868149681506815168152681536815468155681566815768158681596816068161681626816368164681656816668167681686816968170681716817268173681746817568176681776817868179681806818168182681836818468185681866818768188681896819068191681926819368194681956819668197681986819968200682016820268203682046820568206682076820868209682106821168212682136821468215682166821768218682196822068221682226822368224682256822668227682286822968230682316823268233682346823568236682376823868239682406824168242682436824468245682466824768248682496825068251682526825368254682556825668257682586825968260682616826268263682646826568266682676826868269682706827168272682736827468275682766827768278682796828068281682826828368284682856828668287682886828968290682916829268293682946829568296682976829868299683006830168302683036830468305683066830768308683096831068311683126831368314683156831668317683186831968320683216832268323683246832568326683276832868329683306833168332683336833468335683366833768338683396834068341683426834368344683456834668347683486834968350683516835268353683546835568356683576835868359683606836168362683636836468365683666836768368683696837068371683726837368374683756837668377683786837968380683816838268383683846838568386683876838868389683906839168392683936839468395683966839768398683996840068401684026840368404684056840668407684086840968410684116841268413684146841568416684176841868419684206842168422684236842468425684266842768428684296843068431684326843368434684356843668437684386843968440684416844268443684446844568446684476844868449684506845168452684536845468455684566845768458684596846068461684626846368464684656846668467684686846968470684716847268473684746847568476684776847868479684806848168482684836848468485684866848768488684896849068491684926849368494684956849668497684986849968500685016850268503685046850568506685076850868509685106851168512685136851468515685166851768518685196852068521685226852368524685256852668527685286852968530685316853268533685346853568536685376853868539685406854168542685436854468545685466854768548685496855068551685526855368554685556855668557685586855968560685616856268563685646856568566685676856868569685706857168572685736857468575685766857768578685796858068581685826858368584685856858668587685886858968590685916859268593685946859568596685976859868599686006860168602686036860468605686066860768608686096861068611686126861368614686156861668617686186861968620686216862268623686246862568626686276862868629686306863168632686336863468635686366863768638686396864068641686426864368644686456864668647686486864968650686516865268653686546865568656686576865868659686606866168662686636866468665686666866768668686696867068671686726867368674686756867668677686786867968680686816868268683686846868568686686876868868689686906869168692686936869468695686966869768698686996870068701687026870368704687056870668707687086870968710687116871268713687146871568716687176871868719687206872168722687236872468725687266872768728687296873068731687326873368734687356873668737687386873968740687416874268743687446874568746687476874868749687506875168752687536875468755687566875768758687596876068761687626876368764687656876668767687686876968770687716877268773687746877568776687776877868779687806878168782687836878468785687866878768788687896879068791687926879368794687956879668797687986879968800688016880268803688046880568806688076880868809688106881168812688136881468815688166881768818688196882068821688226882368824688256882668827688286882968830688316883268833688346883568836688376883868839688406884168842688436884468845688466884768848688496885068851688526885368854688556885668857688586885968860688616886268863688646886568866688676886868869688706887168872688736887468875688766887768878688796888068881688826888368884688856888668887688886888968890688916889268893688946889568896688976889868899689006890168902689036890468905689066890768908689096891068911689126891368914689156891668917689186891968920689216892268923689246892568926689276892868929689306893168932689336893468935689366893768938689396894068941689426894368944689456894668947689486894968950689516895268953689546895568956689576895868959689606896168962689636896468965689666896768968689696897068971689726897368974689756897668977689786897968980689816898268983689846898568986689876898868989689906899168992689936899468995689966899768998689996900069001690026900369004690056900669007690086900969010690116901269013690146901569016690176901869019690206902169022690236902469025690266902769028690296903069031690326903369034690356903669037690386903969040690416904269043690446904569046690476904869049690506905169052690536905469055690566905769058690596906069061690626906369064690656906669067690686906969070690716907269073690746907569076690776907869079690806908169082690836908469085690866908769088690896909069091690926909369094690956909669097690986909969100691016910269103691046910569106691076910869109691106911169112691136911469115691166911769118691196912069121691226912369124691256912669127691286912969130691316913269133691346913569136691376913869139691406914169142691436914469145691466914769148691496915069151691526915369154691556915669157691586915969160691616916269163691646916569166691676916869169691706917169172691736917469175691766917769178691796918069181691826918369184691856918669187691886918969190691916919269193691946919569196691976919869199692006920169202692036920469205692066920769208692096921069211692126921369214692156921669217692186921969220692216922269223692246922569226692276922869229692306923169232692336923469235692366923769238692396924069241692426924369244692456924669247692486924969250692516925269253692546925569256692576925869259692606926169262692636926469265692666926769268692696927069271692726927369274692756927669277692786927969280692816928269283692846928569286692876928869289692906929169292692936929469295692966929769298692996930069301693026930369304693056930669307693086930969310693116931269313693146931569316693176931869319693206932169322693236932469325693266932769328693296933069331693326933369334693356933669337693386933969340693416934269343693446934569346693476934869349693506935169352693536935469355693566935769358693596936069361693626936369364693656936669367693686936969370693716937269373693746937569376693776937869379693806938169382693836938469385693866938769388693896939069391693926939369394693956939669397693986939969400694016940269403694046940569406694076940869409694106941169412694136941469415694166941769418694196942069421694226942369424694256942669427694286942969430694316943269433694346943569436694376943869439694406944169442694436944469445694466944769448694496945069451694526945369454694556945669457694586945969460694616946269463694646946569466694676946869469694706947169472694736947469475694766947769478694796948069481694826948369484694856948669487694886948969490694916949269493694946949569496694976949869499695006950169502695036950469505695066950769508695096951069511695126951369514695156951669517695186951969520695216952269523695246952569526695276952869529695306953169532695336953469535695366953769538695396954069541695426954369544695456954669547695486954969550695516955269553695546955569556695576955869559695606956169562695636956469565695666956769568695696957069571695726957369574695756957669577695786957969580695816958269583695846958569586695876958869589695906959169592695936959469595695966959769598695996960069601696026960369604696056960669607696086960969610696116961269613696146961569616696176961869619696206962169622696236962469625696266962769628696296963069631696326963369634696356963669637696386963969640696416964269643696446964569646696476964869649696506965169652696536965469655696566965769658696596966069661696626966369664696656966669667696686966969670696716967269673696746967569676696776967869679696806968169682696836968469685696866968769688696896969069691696926969369694696956969669697696986969969700697016970269703697046970569706697076970869709697106971169712697136971469715697166971769718697196972069721697226972369724697256972669727697286972969730697316973269733697346973569736697376973869739697406974169742697436974469745697466974769748697496975069751697526975369754697556975669757697586975969760697616976269763697646976569766697676976869769697706977169772697736977469775697766977769778697796978069781697826978369784697856978669787697886978969790697916979269793697946979569796697976979869799698006980169802698036980469805698066980769808698096981069811698126981369814698156981669817698186981969820698216982269823698246982569826698276982869829698306983169832698336983469835698366983769838698396984069841698426984369844698456984669847698486984969850698516985269853698546985569856698576985869859698606986169862698636986469865698666986769868698696987069871698726987369874698756987669877698786987969880698816988269883698846988569886698876988869889698906989169892698936989469895698966989769898698996990069901699026990369904699056990669907699086990969910699116991269913699146991569916699176991869919699206992169922699236992469925699266992769928699296993069931699326993369934699356993669937699386993969940699416994269943699446994569946699476994869949699506995169952699536995469955699566995769958699596996069961699626996369964699656996669967699686996969970699716997269973699746997569976699776997869979699806998169982699836998469985699866998769988699896999069991699926999369994699956999669997699986999970000700017000270003700047000570006700077000870009700107001170012700137001470015700167001770018700197002070021700227002370024700257002670027700287002970030700317003270033700347003570036700377003870039700407004170042700437004470045700467004770048700497005070051700527005370054700557005670057700587005970060700617006270063700647006570066700677006870069700707007170072700737007470075700767007770078700797008070081700827008370084700857008670087700887008970090700917009270093700947009570096700977009870099701007010170102701037010470105701067010770108701097011070111701127011370114701157011670117701187011970120701217012270123701247012570126701277012870129701307013170132701337013470135701367013770138701397014070141701427014370144701457014670147701487014970150701517015270153701547015570156701577015870159701607016170162701637016470165701667016770168701697017070171701727017370174701757017670177701787017970180701817018270183701847018570186701877018870189701907019170192701937019470195701967019770198701997020070201702027020370204702057020670207702087020970210702117021270213702147021570216702177021870219702207022170222702237022470225702267022770228702297023070231702327023370234702357023670237702387023970240702417024270243702447024570246702477024870249702507025170252702537025470255702567025770258702597026070261702627026370264702657026670267702687026970270702717027270273702747027570276702777027870279702807028170282702837028470285702867028770288702897029070291702927029370294702957029670297702987029970300703017030270303703047030570306703077030870309703107031170312703137031470315703167031770318703197032070321703227032370324703257032670327703287032970330703317033270333703347033570336703377033870339703407034170342703437034470345703467034770348703497035070351703527035370354703557035670357703587035970360703617036270363703647036570366703677036870369703707037170372703737037470375703767037770378703797038070381703827038370384703857038670387703887038970390703917039270393703947039570396703977039870399704007040170402704037040470405704067040770408704097041070411704127041370414704157041670417704187041970420704217042270423704247042570426704277042870429704307043170432704337043470435704367043770438704397044070441704427044370444704457044670447704487044970450704517045270453704547045570456704577045870459704607046170462704637046470465704667046770468704697047070471704727047370474704757047670477704787047970480704817048270483704847048570486704877048870489704907049170492704937049470495704967049770498704997050070501705027050370504705057050670507705087050970510705117051270513705147051570516705177051870519705207052170522705237052470525705267052770528705297053070531705327053370534705357053670537705387053970540705417054270543705447054570546705477054870549705507055170552705537055470555705567055770558705597056070561705627056370564705657056670567705687056970570705717057270573705747057570576705777057870579705807058170582705837058470585705867058770588705897059070591705927059370594705957059670597705987059970600706017060270603706047060570606706077060870609706107061170612706137061470615706167061770618706197062070621706227062370624706257062670627706287062970630706317063270633706347063570636706377063870639706407064170642706437064470645706467064770648706497065070651706527065370654706557065670657706587065970660706617066270663706647066570666706677066870669706707067170672706737067470675706767067770678706797068070681706827068370684706857068670687706887068970690706917069270693706947069570696706977069870699707007070170702707037070470705707067070770708707097071070711707127071370714707157071670717707187071970720707217072270723707247072570726707277072870729707307073170732707337073470735707367073770738707397074070741707427074370744707457074670747707487074970750707517075270753707547075570756707577075870759707607076170762707637076470765707667076770768707697077070771707727077370774707757077670777707787077970780707817078270783707847078570786707877078870789707907079170792707937079470795707967079770798707997080070801708027080370804708057080670807708087080970810708117081270813708147081570816708177081870819708207082170822708237082470825708267082770828708297083070831708327083370834708357083670837708387083970840708417084270843708447084570846708477084870849708507085170852708537085470855708567085770858708597086070861708627086370864708657086670867708687086970870708717087270873708747087570876708777087870879708807088170882708837088470885708867088770888708897089070891708927089370894708957089670897708987089970900709017090270903709047090570906709077090870909709107091170912709137091470915709167091770918709197092070921709227092370924709257092670927709287092970930709317093270933709347093570936709377093870939709407094170942709437094470945709467094770948709497095070951709527095370954709557095670957709587095970960709617096270963709647096570966709677096870969709707097170972709737097470975709767097770978709797098070981709827098370984709857098670987709887098970990709917099270993709947099570996709977099870999710007100171002710037100471005710067100771008710097101071011710127101371014710157101671017710187101971020710217102271023710247102571026710277102871029710307103171032710337103471035710367103771038710397104071041710427104371044710457104671047710487104971050710517105271053710547105571056710577105871059710607106171062710637106471065710667106771068710697107071071710727107371074710757107671077710787107971080710817108271083710847108571086710877108871089710907109171092710937109471095710967109771098710997110071101711027110371104711057110671107711087110971110711117111271113711147111571116711177111871119711207112171122711237112471125711267112771128711297113071131711327113371134711357113671137711387113971140711417114271143711447114571146711477114871149711507115171152711537115471155711567115771158711597116071161711627116371164711657116671167711687116971170711717117271173711747117571176711777117871179711807118171182711837118471185711867118771188711897119071191711927119371194711957119671197711987119971200712017120271203712047120571206712077120871209712107121171212712137121471215712167121771218712197122071221712227122371224712257122671227712287122971230712317123271233712347123571236712377123871239712407124171242712437124471245712467124771248712497125071251712527125371254712557125671257712587125971260712617126271263712647126571266712677126871269712707127171272712737127471275712767127771278712797128071281712827128371284712857128671287712887128971290712917129271293712947129571296712977129871299713007130171302713037130471305713067130771308713097131071311713127131371314713157131671317713187131971320713217132271323713247132571326713277132871329713307133171332713337133471335713367133771338713397134071341713427134371344713457134671347713487134971350713517135271353713547135571356713577135871359713607136171362713637136471365713667136771368713697137071371713727137371374713757137671377713787137971380713817138271383713847138571386713877138871389713907139171392713937139471395713967139771398713997140071401
  1. This file is a merged representation of the entire codebase, combined into a single document by Repomix.
  2. <file_summary>
  3. This section contains a summary of this file.
  4. <purpose>
  5. This file contains a packed representation of the entire repository's contents.
  6. It is designed to be easily consumable by AI systems for analysis, code review,
  7. or other automated processes.
  8. </purpose>
  9. <file_format>
  10. The content is organized as follows:
  11. 1. This summary section
  12. 2. Repository information
  13. 3. Directory structure
  14. 4. Repository files (if enabled)
  15. 5. Multiple file entries, each consisting of:
  16. - File path as an attribute
  17. - Full contents of the file
  18. </file_format>
  19. <usage_guidelines>
  20. - This file should be treated as read-only. Any changes should be made to the
  21. original repository files, not this packed version.
  22. - When processing this file, use the file path to distinguish
  23. between different files in the repository.
  24. - Be aware that this file may contain sensitive information. Handle it with
  25. the same level of security as you would the original repository.
  26. </usage_guidelines>
  27. <notes>
  28. - Some files may have been excluded based on .gitignore rules and Repomix's configuration
  29. - Binary files are not included in this packed representation. Please refer to the Repository Structure section for a complete list of file paths, including binary files
  30. - Files matching patterns in .gitignore are excluded
  31. - Files matching default ignore patterns are excluded
  32. - Files are sorted by Git change count (files with more changes are at the bottom)
  33. </notes>
  34. </file_summary>
  35. <directory_structure>
  36. .cursor/
  37. rules/
  38. api-rule.mdc
  39. code-style-consistency.mdc
  40. concise-answer.mdc
  41. context-limitation.mdc
  42. cursor-rule.mdc
  43. db-structure-rules.mdc
  44. mariadb-ddl-rules.mdc
  45. minimal-comments.mdc
  46. safe-development-practice.mdc
  47. sql-rules.mdc
  48. vite-rule.mdc
  49. vooster__architecture.mdc
  50. vooster__clean-code.mdc
  51. vooster__guideline.mdc
  52. vooster__prd.mdc
  53. vooster__step-by-step.mdc
  54. vooster__tdd.mdc
  55. vue-rule.mdc
  56. .vooster/
  57. tasks/
  58. T-001.txt
  59. T-002.txt
  60. T-003.txt
  61. T-004.txt
  62. T-005.txt
  63. T-006.txt
  64. T-007.txt
  65. T-008.txt
  66. T-009.txt
  67. T-010.txt
  68. T-011.txt
  69. T-012.txt
  70. T-013.txt
  71. T-014.txt
  72. T-015.txt
  73. T-016.txt
  74. T-017.txt
  75. T-018.txt
  76. T-019.txt
  77. T-020.txt
  78. T-021.txt
  79. project.json
  80. rules.json
  81. tasks.json
  82. assets/
  83. img/
  84. bg_login.svg
  85. bg_popup.svg
  86. bg_tab_off.svg
  87. bg_tab_on.svg
  88. bg_tooltip.svg
  89. bg_tooltip2.svg
  90. bg_tooltip3.svg
  91. bg_tooltip4.svg
  92. btn_app_store.svg
  93. btn_goolge_play.svg
  94. db_set_list01.svg
  95. db_set_list02.svg
  96. db_set_list03.svg
  97. head_flip_btn.svg
  98. ic_add.svg
  99. ic_allview.svg
  100. ic_arrow_right_chv.svg
  101. ic_avg01.svg
  102. ic_avg02.svg
  103. ic_avg03.svg
  104. ic_avg04.svg
  105. ic_card_nodata.svg
  106. ic_card_off.svg
  107. ic_card_on.svg
  108. ic_chv_arrow.svg
  109. ic_chv.svg
  110. ic_close.svg
  111. ic_drop_down_on.svg
  112. ic_drop_down.svg
  113. ic_ds.svg
  114. ic_end_close_cl.svg
  115. ic_end_close_x.svg
  116. ic_end_close.svg
  117. ic_end_red.svg
  118. ic_equip01.svg
  119. ic_equip02.svg
  120. ic_equip03.svg
  121. ic_equip04.svg
  122. ic_excel_green.svg
  123. ic_excel.svg
  124. ic_gear.svg
  125. ic_google.svg
  126. ic_home_arrow.svg
  127. ic_info.svg
  128. ic_issue_flag.svg
  129. ic_kakao.svg
  130. ic_list_off.svg
  131. ic_list_on.svg
  132. ic_map_card.svg
  133. ic_map_pin.svg
  134. ic_mapt_chv.svg
  135. ic_more_btn.svg
  136. ic_more_plust_gray.svg
  137. ic_naver.svg
  138. ic_no_img.svg
  139. ic_no_tree.svg
  140. ic_preview_nw.svg
  141. ic_radio_off.svg
  142. ic_radio_on.svg
  143. ic_sch_nw.svg
  144. ic_sts.svg
  145. ic_tab01.svg
  146. ic_tab02.svg
  147. ic_tab03.svg
  148. ic_tab04.svg
  149. ic_tack_off.svg
  150. ic_tack_on.svg
  151. ic_tenant_small_white.svg
  152. ic_tenant_small.svg
  153. ic_tenant01.svg
  154. ic_tenant02.svg
  155. ic_tenant03.svg
  156. ic_tenant04.svg
  157. ic_wifi_dis.svg
  158. ic_wifi.svg
  159. ic_x_btn.svg
  160. ic_x_btn2.svg
  161. ic_xcircle.svg
  162. ico_alarm_blue.svg
  163. ico_alarm_gray.svg
  164. ico_alarm_green.svg
  165. ico_alarm_red.svg
  166. ico_alarm1.svg
  167. ico_alarm2.svg
  168. ico_alarm3.svg
  169. ico_alarm4.svg
  170. ico_all_pop.svg
  171. ico_arrow_next.svg
  172. ico_arrow_prev.svg
  173. ico_backup1.svg
  174. ico_backup2.svg
  175. ico_backup3.svg
  176. ico_backup4.svg
  177. ico_ban.svg
  178. ico_bar.svg
  179. ico_black_pin.svg
  180. ico_blue_pin.svg
  181. ico_btn1.svg
  182. ico_btn2.svg
  183. ico_btn3.svg
  184. ico_cal_dis.svg
  185. ico_cal.svg
  186. ico_calendar.svg
  187. ico_cancel_disabled.svg
  188. ico_cancel.svg
  189. ico_cate.svg
  190. ico_certify_n.svg
  191. ico_certify_y.svg
  192. ico_certify_y2.svg
  193. ico_certify_y3.svg
  194. ico_check_indeterminate.svg
  195. ico_chk_circle_disabled.svg
  196. ico_chk_circle.svg
  197. ico_chk_off.svg
  198. ico_chk_off2.svg
  199. ico_chk_on.svg
  200. ico_chk.svg
  201. ico_close_gray.svg
  202. ico_close.svg
  203. ico_core_alarm1.svg
  204. ico_core_alarm2.svg
  205. ico_date_pic.svg
  206. ico_del_disabled.svg
  207. ico_del_disabled2.svg
  208. ico_del.svg
  209. ico_del2.svg
  210. ico_download.svg
  211. ico_end.svg
  212. ico_equip.svg
  213. ico_eraser.svg
  214. ico_eraser2.svg
  215. ico_error.svg
  216. ico_event_pop.svg
  217. ico_event_view_black.svg
  218. ico_event_view_down.svg
  219. ico_event_view.svg
  220. ico_excel_d.svg
  221. ico_excel.svg
  222. ico_excel2.svg
  223. ico_eye.svg
  224. ico_eye2.svg
  225. ico_gray_pin.svg
  226. ico_grid_sort.svg
  227. ico_grid_sort2.svg
  228. ico_id_off.svg
  229. ico_id_on.svg
  230. ico_info.svg
  231. ico_lang_english.svg
  232. ico_lang_korea.svg
  233. ico_lang_korea2.svg
  234. ico_link.svg
  235. ico_list_white.svg
  236. ico_list.svg
  237. ico_location_arr.svg
  238. ico_location_home.svg
  239. ico_logo.svg
  240. ico_logout.svg
  241. ico_map.svg
  242. ico_menu_arr.svg
  243. ico_menu_arr2.svg
  244. ico_menu_minus.svg
  245. ico_menu_nodata.svg
  246. ico_menu_plus.svg
  247. ico_menu.svg
  248. ico_minus.svg
  249. ico_mod_disabled.svg
  250. ico_mod.svg
  251. ico_mod2.svg
  252. ico_mode_dark.svg
  253. ico_mode_white.svg
  254. ico_mode_white2.svg
  255. ico_ne_add.svg
  256. ico_ne_del_d.svg
  257. ico_ne_del.svg
  258. ico_no_data_nw.svg
  259. ico_no_data.svg
  260. ico_no_data2.svg
  261. ico_no_table_dt.svg
  262. ico_not_excel.svg
  263. ico_otp_step1.svg
  264. ico_otp_step2.svg
  265. ico_otp_step3.svg
  266. ico_otp_step4.svg
  267. ico_otp_step5.svg
  268. ico_paging_more.svg
  269. ico_paging_next.svg
  270. ico_paging_next1.svg
  271. ico_paging_next2.svg
  272. ico_paging_prev.svg
  273. ico_paging_prev1.svg
  274. ico_paging_prev2.svg
  275. ico_performance1.svg
  276. ico_performance2.svg
  277. ico_pin_off.svg
  278. ico_pin_on.svg
  279. ico_pip.svg
  280. ico_pip2.svg
  281. ico_plus.svg
  282. ico_pop_close.svg
  283. ico_pos.svg
  284. ico_ran_arrow_gray.svg
  285. ico_ran_arrow_white.svg
  286. ico_red_pin.svg
  287. ico_refresh_dis.svg
  288. ico_refresh.svg
  289. ico_reg_disabled.svg
  290. ico_reg.svg
  291. ico_save_disabled.svg
  292. ico_save.svg
  293. ico_search.svg
  294. ico_set_blue.svg
  295. ico_set.svg
  296. ico_setting.svg
  297. ico_slt.svg
  298. ico_slt2.svg
  299. ico_sort.svg
  300. ico_square.svg
  301. ico_state1.svg
  302. ico_state2.svg
  303. ico_state3.svg
  304. ico_status1.svg
  305. ico_status2.svg
  306. ico_status3.svg
  307. ico_step_arr.svg
  308. ico_step_arr2.svg
  309. ico_tenant1.svg
  310. ico_tenant2.svg
  311. ico_tenant3.svg
  312. ico_tenant4.svg
  313. ico_time_disabled.svg
  314. ico_time.svg
  315. ico_tit_arr.svg
  316. ico_tool.svg
  317. ico_trash_nw.svg
  318. ico_tree_add.svg
  319. ico_tree_arr.svg
  320. ico_tree_save.svg
  321. ico_tree1.svg
  322. ico_tree2.svg
  323. ico_tree3_core.svg
  324. ico_tree3_ran.svg
  325. ico_tree3.svg
  326. ico_trend.svg
  327. ico_view_del.svg
  328. ico_view_list.svg
  329. ico_view_list2.svg
  330. ico_wifi.svg
  331. ico-arrow-right.svg
  332. ico-check-on.svg
  333. img_mode_dark.svg
  334. img_mode_white.svg
  335. img_popup.svg
  336. img_qr.svg
  337. img_system.svg
  338. is_disconnect.svg
  339. logo_foot.svg
  340. logo_foot2.svg
  341. logo_login.svg
  342. logo_new.svg
  343. logo_sams_sds.svg
  344. logo_sams.svg
  345. map_kangwon.svg
  346. pf_sample.svg
  347. scss/
  348. default.scss
  349. main.scss
  350. mode-w-m.scss
  351. roulette.scss
  352. sample.scss
  353. style.scss
  354. backend/
  355. app/
  356. Config/
  357. Routes.php
  358. Routes2.php
  359. Controllers/
  360. Alimtalk.php
  361. Auth.php
  362. BaseController.php
  363. DebugController.php
  364. Deli.php
  365. Home.php
  366. InfluencerController.php
  367. InfluencerControllerV2.php
  368. Mng.php
  369. PartnershipController.php
  370. Roulette.php
  371. VendorController.php
  372. VendorControllerV2.php
  373. VendorInfluencerTerminate.php
  374. Winner.php
  375. Models/
  376. InfluencerModel.php
  377. InfluencerPartnershipModel.php
  378. LoginModel.php
  379. UserListModel.php
  380. UserModel.php
  381. VendorAddressModel.php
  382. VendorBusinessAreaModel.php
  383. VendorCategoryModel.php
  384. VendorContactModel.php
  385. VendorInfluencerMappingModel.php
  386. VendorInfluencerPartnershipModel.php
  387. VendorInfluencerReapply.php
  388. VendorInfluencerStatusHistoryModel.php
  389. VendorModel.php
  390. VendorPartnershipModel.php
  391. VendorProductModel.php
  392. README.md
  393. components/
  394. cellRenderer/
  395. customActionTypeTextColor.vue
  396. customBackUpBtn.vue
  397. customBackUpBtnR.vue
  398. customButtonSms.vue
  399. customHeaderText.vue
  400. customInhibitSelect.vue
  401. customIpConnTextColor.vue
  402. customIpNotConnTextColor.vue
  403. customLicenseBtn.vue
  404. customLogLevelSelect.vue
  405. customNullValue.vue
  406. customRadio.vue
  407. customResultTextDivBg.vue
  408. customSessionSetTextField.vue
  409. customStatusBox.vue
  410. customTextColor.vue
  411. customTextDivSession.vue
  412. customUseYNTextColor.vue
  413. chat/
  414. ClaudeChat.vue
  415. common/
  416. footer/
  417. eventDetailView.vue
  418. header/
  419. modal/
  420. myInfoUpdate.vue
  421. passwordCheck.vue
  422. privacyPop.vue
  423. confirmDialog.vue
  424. customLoading.vue
  425. excelUpload.vue
  426. footer.vue
  427. header.vue
  428. leftMenu.vue
  429. location.vue
  430. pagination.vue
  431. topologyPop.vue
  432. topologyPopMgmt.vue
  433. home/
  434. dashboard/
  435. common/
  436. map/
  437. mapBusan.vue
  438. mapChungbuk.vue
  439. mapChungnam.vue
  440. mapDaegu.vue
  441. mapDaejeon.vue
  442. mapGwangju.vue
  443. mapGyeongbuk.vue
  444. mapGyeonggido.vue
  445. mapGyeongnam.vue
  446. mapIncheon.vue
  447. mapJeju.vue
  448. mapJeonbuk.vue
  449. mapJeonnam.vue
  450. mapKangwon.vue
  451. mapSejong.vue
  452. mapSeoul.vue
  453. mapUlsan.vue
  454. coreDetailModal.vue
  455. pagination.vue
  456. ranCardGroupDetailModal.vue
  457. ranMapGroupDetailModal.vue
  458. ranMapNeDetailModal.vue
  459. layout01/
  460. core/
  461. layout01Core.vue
  462. layout01CoreWidgetM.vue
  463. layout01CoreWidgetS.vue
  464. ran/
  465. layout01Ran.vue
  466. user/
  467. layout01User.vue
  468. layout01UserWidgetM.vue
  469. layout01UserWidgetS.vue
  470. layout01UserWidgetT.vue
  471. layout01.vue
  472. layout02/
  473. core/
  474. layout02Core.vue
  475. layout02CoreWidgetM.vue
  476. layout02CoreWidgetS.vue
  477. ran/
  478. layout02Ran.vue
  479. user/
  480. layout02User.vue
  481. layout02UserWidgetM.vue
  482. layout02UserWidgetS.vue
  483. layout02UserWidgetT.vue
  484. layout02.vue
  485. layout03/
  486. core/
  487. layout03Core.vue
  488. layout03CoreWidgetM.vue
  489. layout03CoreWidgetS.vue
  490. ran/
  491. layout03Ran.vue
  492. ranMapComponent.vue
  493. user/
  494. layout03User.vue
  495. layout03UserWidgetM.vue
  496. layout03UserWidgetS.vue
  497. layout03.vue
  498. settingModal.vue
  499. test.json
  500. jobNoti/
  501. jobNotiModal.vue
  502. tenant/
  503. chart/
  504. doughnut.vue
  505. trendBar.vue
  506. userDoughnut.vue
  507. common/
  508. ranGroupDetailModal.vue
  509. tenantRan.vue
  510. tenantTrend.vue
  511. tenantUser.vue
  512. trend/
  513. headerChart.vue
  514. login/
  515. privacyPop.vue
  516. search/
  517. searchModules.vue
  518. sunEdt.vue
  519. composables/
  520. useApi.js
  521. useAxios.js
  522. useChart.js
  523. useClaude.js
  524. useEnumCode.js
  525. useEnumCodeEn.js
  526. useEnumCodeKr.js
  527. useErrorHandler.js
  528. useHangul.js
  529. useLogout.js
  530. useMenuConstants.js
  531. useToastEditor.ts
  532. useUrlHandler.js
  533. useUtil.js
  534. useValid.js
  535. useWatchFocusValidate.js
  536. database/
  537. migrations/
  538. create_vendor_influencer_mapping.sql
  539. url.md
  540. ddl/
  541. 014_complete_reset_design.sql
  542. 015_fix_unique_constraint.sql
  543. 016_fix_data_and_model.sql
  544. 016_fix_terminated_status.sql
  545. 017_clean_start.sql
  546. 018_check_current_state.sql
  547. 019_redesign_partnership_table.sql
  548. README.md
  549. lang/
  550. en.js
  551. kr.js
  552. layouts/
  553. default.vue
  554. designdefault.vue
  555. designloginlayout.vue
  556. loginlayout.vue
  557. roulette.vue
  558. samplelayout.vue
  559. md/
  560. 2024-12-20-기존기능-안전성-체크.md
  561. 2024-12-20-오류해결-가이드.md
  562. 2024-12-20-히스토리테이블-마이그레이션-가이드.md
  563. 2024-12-20-API-라우팅-가이드.md
  564. 2024-12-20.md
  565. 2024-12-22-백엔드-프론트엔드-완전통합-가이드.md
  566. README.md
  567. middleware/
  568. auth.global.js
  569. pages/
  570. auth/
  571. join.vue
  572. popupClose.vue
  573. view/
  574. common/
  575. cs/
  576. financial.vue
  577. index.vue
  578. deli/
  579. detail.vue
  580. index.vue
  581. index2.vue
  582. item/
  583. add.vue
  584. index.vue
  585. settle/
  586. curationAdd.vue
  587. curationList.vue
  588. index.vue
  589. irAdd.vue
  590. mediaAdd.vue
  591. mediaList.vue
  592. newsAdd.vue
  593. newsList.vue
  594. influencer/
  595. [id].vue
  596. search.vue
  597. log/
  598. .htaccess
  599. logList.vue
  600. vendor/
  601. dashboard/
  602. index.vue
  603. influencer-requests.vue
  604. [id].vue
  605. index.vue
  606. vendors.vue
  607. chat.vue
  608. index.vue
  609. plugins/
  610. fontawesome.js
  611. i18n.js
  612. log.js
  613. mitt.js
  614. toast.js
  615. userAgent.js
  616. vue-cool-lightbox.js
  617. vue3-editor.js
  618. vuetify.js
  619. public/
  620. js/
  621. jquery-3.7.1.min.js
  622. stores/
  623. auth.js
  624. detail.js
  625. lang.js
  626. loading.js
  627. tenantMgmt.js
  628. vendors.js
  629. .env.development
  630. .gitignore
  631. app.vue
  632. error.vue
  633. nuxt.config.ts
  634. package.json
  635. README.md
  636. toast-editor.d.ts
  637. tsconfig.json
  638. vite-plugin-sri.d.ts
  639. </directory_structure>
  640. <files>
  641. This section contains the contents of the repository's files.
  642. <file path="ddl/015_fix_unique_constraint.sql">
  643. -- MariaDB 호환 DDL
  644. -- 기존 제약조건 확인 및 삭제
  645. SET @constraint_name = (
  646. SELECT CONSTRAINT_NAME
  647. FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
  648. WHERE TABLE_SCHEMA = DATABASE()
  649. AND TABLE_NAME = 'VENDOR_INFLUENCER_PARTNERSHIP'
  650. AND COLUMN_NAME = 'VENDOR_SEQ'
  651. AND REFERENCED_TABLE_NAME IS NULL
  652. AND CONSTRAINT_NAME != 'PRIMARY'
  653. LIMIT 1
  654. );
  655. SET @sql = IF(@constraint_name IS NOT NULL,
  656. CONCAT('ALTER TABLE VENDOR_INFLUENCER_PARTNERSHIP DROP INDEX ', @constraint_name),
  657. 'SELECT "No unique constraint found to drop"'
  658. );
  659. PREPARE stmt FROM @sql;
  660. EXECUTE stmt;
  661. DEALLOCATE PREPARE stmt;
  662. -- 새로운 제약조건 추가
  663. ALTER TABLE VENDOR_INFLUENCER_PARTNERSHIP
  664. ADD CONSTRAINT unique_active_partnership
  665. UNIQUE KEY (VENDOR_SEQ, INFLUENCER_SEQ, IS_ACTIVE);
  666. -- 기존 데이터 정리 (선택적)
  667. -- 1. 각 벤더-인플루언서 조합에 대해 가장 최근의 비활성 레코드만 남기고 삭제
  668. DELETE p1 FROM VENDOR_INFLUENCER_PARTNERSHIP p1
  669. INNER JOIN VENDOR_INFLUENCER_PARTNERSHIP p2
  670. WHERE p1.VENDOR_SEQ = p2.VENDOR_SEQ
  671. AND p1.INFLUENCER_SEQ = p2.INFLUENCER_SEQ
  672. AND p1.IS_ACTIVE = 'N'
  673. AND p2.IS_ACTIVE = 'N'
  674. AND p1.SEQ < p2.SEQ;
  675. </file>
  676. <file path="ddl/016_fix_data_and_model.sql">
  677. -- 1. 잘못된 데이터 정리 (TERMINATED 상태인데 IS_ACTIVE='Y'인 레코드 수정)
  678. UPDATE VENDOR_INFLUENCER_PARTNERSHIP
  679. SET IS_ACTIVE = 'N'
  680. WHERE STATUS = 'TERMINATED';
  681. -- 2. 제약조건 재정의
  682. ALTER TABLE VENDOR_INFLUENCER_PARTNERSHIP
  683. DROP INDEX unique_active_partnership;
  684. -- 3. 새로운 복합 제약조건 추가
  685. ALTER TABLE VENDOR_INFLUENCER_PARTNERSHIP
  686. ADD CONSTRAINT chk_status_active CHECK (
  687. (STATUS = 'TERMINATED' AND IS_ACTIVE = 'N') OR
  688. (STATUS IN ('PENDING', 'APPROVED', 'REJECTED') AND IS_ACTIVE IN ('Y', 'N'))
  689. );
  690. ALTER TABLE VENDOR_INFLUENCER_PARTNERSHIP
  691. ADD CONSTRAINT unique_active_partnership
  692. UNIQUE KEY (VENDOR_SEQ, INFLUENCER_SEQ, IS_ACTIVE);
  693. -- 4. 데이터 정리 (각 벤더-인플루언서 조합에 대해 하나의 활성 레코드만 유지)
  694. CREATE TEMPORARY TABLE tmp_latest_active AS
  695. SELECT MAX(SEQ) as max_seq
  696. FROM VENDOR_INFLUENCER_PARTNERSHIP
  697. WHERE IS_ACTIVE = 'Y'
  698. GROUP BY VENDOR_SEQ, INFLUENCER_SEQ;
  699. UPDATE VENDOR_INFLUENCER_PARTNERSHIP
  700. SET IS_ACTIVE = 'N'
  701. WHERE IS_ACTIVE = 'Y'
  702. AND SEQ NOT IN (SELECT max_seq FROM tmp_latest_active);
  703. DROP TEMPORARY TABLE IF EXISTS tmp_latest_active;
  704. </file>
  705. <file path="ddl/016_fix_terminated_status.sql">
  706. -- 1. 기존 제약조건 삭제
  707. SET @constraint_name = (
  708. SELECT CONSTRAINT_NAME
  709. FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
  710. WHERE TABLE_SCHEMA = DATABASE()
  711. AND TABLE_NAME = 'VENDOR_INFLUENCER_PARTNERSHIP'
  712. AND COLUMN_NAME = 'VENDOR_SEQ'
  713. AND REFERENCED_TABLE_NAME IS NULL
  714. AND CONSTRAINT_NAME = 'unique_active_partnership'
  715. LIMIT 1
  716. );
  717. SET @sql = IF(@constraint_name IS NOT NULL,
  718. CONCAT('ALTER TABLE VENDOR_INFLUENCER_PARTNERSHIP DROP INDEX ', @constraint_name),
  719. 'SELECT "No constraint found to drop"'
  720. );
  721. PREPARE stmt FROM @sql;
  722. EXECUTE stmt;
  723. DEALLOCATE PREPARE stmt;
  724. -- 2. 데이터 정리
  725. -- 2.1 TERMINATED 상태인 레코드는 모두 비활성화
  726. UPDATE VENDOR_INFLUENCER_PARTNERSHIP
  727. SET IS_ACTIVE = 'N'
  728. WHERE STATUS = 'TERMINATED';
  729. -- 2.2 각 벤더-인플루언서 조합에 대해 가장 최근의 비활성 레코드만 남기고 삭제
  730. DELETE p1 FROM VENDOR_INFLUENCER_PARTNERSHIP p1
  731. INNER JOIN VENDOR_INFLUENCER_PARTNERSHIP p2
  732. WHERE p1.VENDOR_SEQ = p2.VENDOR_SEQ
  733. AND p1.INFLUENCER_SEQ = p2.INFLUENCER_SEQ
  734. AND p1.IS_ACTIVE = 'N'
  735. AND p2.IS_ACTIVE = 'N'
  736. AND p1.SEQ < p2.SEQ;
  737. -- 3. 데이터 상태 확인
  738. SELECT SEQ, VENDOR_SEQ, INFLUENCER_SEQ, STATUS, IS_ACTIVE, REQUEST_TYPE,
  739. REQUEST_DATE, RESPONSE_DATE, PARTNERSHIP_START_DATE, PARTNERSHIP_END_DATE
  740. FROM VENDOR_INFLUENCER_PARTNERSHIP
  741. WHERE VENDOR_SEQ = 8 AND INFLUENCER_SEQ = 23
  742. ORDER BY SEQ DESC;
  743. -- 4. 새로운 제약조건 추가
  744. ALTER TABLE VENDOR_INFLUENCER_PARTNERSHIP
  745. ADD CONSTRAINT unique_active_partnership
  746. UNIQUE KEY (VENDOR_SEQ, INFLUENCER_SEQ, IS_ACTIVE);
  747. </file>
  748. <file path="ddl/017_clean_start.sql">
  749. -- 1. 제약조건 삭제
  750. SET @constraint_name = (
  751. SELECT CONSTRAINT_NAME
  752. FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
  753. WHERE TABLE_SCHEMA = DATABASE()
  754. AND TABLE_NAME = 'VENDOR_INFLUENCER_PARTNERSHIP'
  755. AND COLUMN_NAME = 'VENDOR_SEQ'
  756. AND REFERENCED_TABLE_NAME IS NULL
  757. AND CONSTRAINT_NAME = 'unique_active_partnership'
  758. LIMIT 1
  759. );
  760. SET @sql = IF(@constraint_name IS NOT NULL,
  761. CONCAT('ALTER TABLE VENDOR_INFLUENCER_PARTNERSHIP DROP INDEX ', @constraint_name),
  762. 'SELECT "No constraint found to drop"'
  763. );
  764. PREPARE stmt FROM @sql;
  765. EXECUTE stmt;
  766. DEALLOCATE PREPARE stmt;
  767. -- 2. 특정 벤더-인플루언서 조합의 데이터만 삭제
  768. DELETE FROM VENDOR_INFLUENCER_PARTNERSHIP
  769. WHERE VENDOR_SEQ = 8 AND INFLUENCER_SEQ = 23;
  770. -- 3. 새로운 제약조건 추가
  771. ALTER TABLE VENDOR_INFLUENCER_PARTNERSHIP
  772. ADD CONSTRAINT unique_active_partnership
  773. UNIQUE KEY (VENDOR_SEQ, INFLUENCER_SEQ, IS_ACTIVE);
  774. -- 4. 데이터 삭제 확인
  775. SELECT COUNT(*) as count
  776. FROM VENDOR_INFLUENCER_PARTNERSHIP
  777. WHERE VENDOR_SEQ = 8 AND INFLUENCER_SEQ = 23;
  778. </file>
  779. <file path="ddl/018_check_current_state.sql">
  780. -- 현재 파트너십 상태 확인
  781. SELECT SEQ, VENDOR_SEQ, INFLUENCER_SEQ, STATUS, IS_ACTIVE, REQUEST_TYPE,
  782. REQUEST_DATE, RESPONSE_DATE, PARTNERSHIP_START_DATE, PARTNERSHIP_END_DATE,
  783. PROCESSED_BY, REQUESTED_BY
  784. FROM VENDOR_INFLUENCER_PARTNERSHIP
  785. WHERE VENDOR_SEQ = 8 AND INFLUENCER_SEQ = 23
  786. ORDER BY SEQ DESC;
  787. </file>
  788. <file path="ddl/019_redesign_partnership_table.sql">
  789. -- 기존 제약조건 삭제
  790. DROP INDEX IF EXISTS unique_active_partnership ON VENDOR_INFLUENCER_PARTNERSHIP;
  791. -- 파트너십 테이블 재설계
  792. ALTER TABLE VENDOR_INFLUENCER_PARTNERSHIP
  793. ADD COLUMN PARTNERSHIP_CYCLE INT NOT NULL DEFAULT 1 COMMENT '파트너십 사이클 (1: 최초, 2: 첫 재승인, 3: 두번째 재승인 ...)',
  794. ADD COLUMN PREVIOUS_STATUS VARCHAR(20) NULL COMMENT '이전 상태 (재승인시 사용)',
  795. ADD COLUMN PREVIOUS_END_DATE DATETIME NULL COMMENT '이전 종료일 (재승인시 사용)';
  796. -- 새로운 복합 유니크 키 추가 (벤더-인플루언서-사이클 별로 활성 파트너십은 하나만 존재)
  797. ALTER TABLE VENDOR_INFLUENCER_PARTNERSHIP
  798. ADD CONSTRAINT unique_partnership_cycle
  799. UNIQUE KEY (VENDOR_SEQ, INFLUENCER_SEQ, PARTNERSHIP_CYCLE, IS_ACTIVE);
  800. -- 상태 체크 제약조건 추가
  801. ALTER TABLE VENDOR_INFLUENCER_PARTNERSHIP
  802. ADD CONSTRAINT chk_status_values
  803. CHECK (STATUS IN ('PENDING', 'APPROVED', 'REJECTED', 'TERMINATED'));
  804. -- 활성 상태 체크 제약조건 추가
  805. ALTER TABLE VENDOR_INFLUENCER_PARTNERSHIP
  806. ADD CONSTRAINT chk_status_active
  807. CHECK ((STATUS = 'TERMINATED' AND IS_ACTIVE = 'N') OR
  808. (STATUS IN ('PENDING', 'APPROVED', 'REJECTED') AND IS_ACTIVE IN ('Y', 'N')));
  809. -- 파트너십 사이클 체크 제약조건 추가
  810. ALTER TABLE VENDOR_INFLUENCER_PARTNERSHIP
  811. ADD CONSTRAINT chk_partnership_cycle
  812. CHECK (PARTNERSHIP_CYCLE > 0);
  813. -- 인덱스 추가
  814. CREATE INDEX idx_vendor_influencer_status ON VENDOR_INFLUENCER_PARTNERSHIP(VENDOR_SEQ, INFLUENCER_SEQ, STATUS, IS_ACTIVE);
  815. CREATE INDEX idx_partnership_cycle ON VENDOR_INFLUENCER_PARTNERSHIP(PARTNERSHIP_CYCLE);
  816. </file>
  817. <file path="md/2024-12-20-기존기능-안전성-체크.md">
  818. # 기존 기능 안전성 체크리스트
  819. **작성일**: 2024-12-20
  820. **목적**: 재승인 요청 기능 추가 후 기존 기능들의 정상 작동 확인
  821. ## ✅ 테스트 체크리스트
  822. ### 1. 인플루언서 기본 기능
  823. - [ ] **신규 승인 요청** (`/api/influencer/create-request`)
  824. - 벤더사 선택 → 승인 요청 → PENDING 상태로 생성
  825. - 중복 요청 방지 로직 정상 작동
  826. - [ ] **벤더사 검색** (`/api/influencer/search-vendors`)
  827. - 검색 조건별 필터링 정상 작동
  828. - 페이징 처리 정상 작동
  829. - [ ] **본인 파트너십 목록** (`/api/influencer/my-partnerships`)
  830. - 상태별 필터링 (전체, 대기, 승인, 거부, 해지)
  831. - 데이터 정확성
  832. ### 2. 벤더사 기본 기능
  833. - [ ] **인플루언서 요청 목록** (`/api/vendor/influencer-requests`)
  834. - 요청 목록 조회 정상 작동
  835. - 통계 데이터 정확성 (대기, 승인, 거부 수)
  836. - [ ] **승인/거부 처리** (`/api/vendor/process-request`)
  837. - 승인 처리 → APPROVED 상태 변경
  838. - 거부 처리 → REJECTED 상태 변경
  839. - 이미 처리된 요청 중복 처리 방지
  840. - [ ] **파트너십 해지** (`/api/vendor/terminate`)
  841. - 해지 처리 → TERMINATED 상태 변경
  842. ### 3. 공통 기능
  843. - [ ] **데이터베이스 일관성**
  844. - UNIQUE 제약조건 정상 작동
  845. - 외래키 제약조건 정상 작동
  846. - 타임스탬프 필드 정상 업데이트
  847. - [ ] **API 응답 형식**
  848. - 성공: `{success: true, message: "...", data: {...}}`
  849. - 실패: `{success: false, message: "...", error: "..."}`
  850. ### 4. 프론트엔드 기능
  851. - [ ] **인플루언서 검색 페이지** (`/view/influencer/search`)
  852. - 벤더사 검색 및 필터링
  853. - 승인 요청 모달 정상 작동
  854. - 거부된 벤더사 탭 및 재승인 요청
  855. - [ ] **벤더사 대시보드** (`/view/vendor/dashboard/influencer-requests`)
  856. - 요청 목록 표시
  857. - 승인/거부 버튼 정상 작동
  858. - 재승인 요청 구분 표시
  859. ## 🔍 주요 검증 포인트
  860. ### 데이터베이스 상태 확인
  861. ```sql
  862. -- 활성 레코드 확인
  863. SELECT VENDOR_SEQ, INFLUENCER_SEQ, STATUS, IS_ACT, REG_DATE
  864. FROM VENDOR_INFLUENCER_MAPPING
  865. WHERE IS_ACT = 'Y'
  866. ORDER BY REG_DATE DESC;
  867. -- 중복 레코드 확인
  868. SELECT VENDOR_SEQ, INFLUENCER_SEQ, STATUS, COUNT(*) as cnt
  869. FROM VENDOR_INFLUENCER_MAPPING
  870. WHERE IS_ACT = 'Y'
  871. GROUP BY VENDOR_SEQ, INFLUENCER_SEQ, STATUS
  872. HAVING COUNT(*) > 1;
  873. ```
  874. ### API 응답 확인
  875. ```javascript
  876. // 정상적인 승인 요청
  877. POST /api/influencer/create-request
  878. // 응답: {success: true, message: "승인 요청이 성공적으로 생성되었습니다."}
  879. // 승인 처리
  880. POST /api/vendor/process-request
  881. // 응답: {success: true, message: "요청이 성공적으로 처리되었습니다."}
  882. ```
  883. ## ⚠️ 주의사항
  884. 1. **재승인 요청은 별도 API**이므로 기존 승인 요청과 분리됨
  885. 2. **기존 데이터 무결성** 유지 - 아카이브된 레코드는 IS_ACT='N' 상태
  886. 3. **UNIQUE 제약조건** - 활성 레코드만 제약조건 적용
  887. 4. **트랜잭션 안전성** - 재승인 요청만 트랜잭션 적용
  888. ## 📝 테스트 완료 후 체크
  889. - [ ] 모든 기존 API 정상 작동 확인
  890. - [ ] 데이터베이스 무결성 확인
  891. - [ ] 프론트엔드 UI 정상 작동 확인
  892. - [ ] 로그 파일에서 오류 없음 확인
  893. **✅ 기존 기능 안전성 검증 완료일**: ___________
  894. </file>
  895. <file path="md/2024-12-20-오류해결-가이드.md">
  896. # STATUS 컬럼 애매모호 오류 해결 가이드
  897. **작성일**: 2024-12-20
  898. **오류**: `Column 'STATUS' in field list is ambiguous`
  899. ## 🔧 문제 원인
  900. 1. **STATUS 컬럼 중복**: 여러 테이블에 STATUS 컬럼이 있어서 SQL에서 애매모호
  901. 2. **DDL 미실행**: 히스토리 테이블이 생성되지 않았거나 기존 STATUS 컬럼이 제거되지 않음
  902. ## ✅ 해결 방법
  903. ### 1단계: DDL 실행 상태 확인
  904. ```sql
  905. -- 히스토리 테이블 존재 확인
  906. SHOW TABLES LIKE 'VENDOR_INFLUENCER_STATUS_HISTORY';
  907. -- 메인 테이블의 STATUS 컬럼 확인
  908. DESCRIBE VENDOR_INFLUENCER_MAPPING;
  909. ```
  910. ### 2단계: DDL 실행 (필요시)
  911. ```bash
  912. # MariaDB 호환 DDL 실행
  913. mysql -u root -p influence < ddl/011_mariadb_safe_dynamic.sql
  914. # 또는 STATUS 컬럼만 제거 (수동)
  915. mysql -u root -p influence -e "ALTER TABLE VENDOR_INFLUENCER_MAPPING DROP COLUMN STATUS;"
  916. ```
  917. ### 3단계: 코드 수정 사항
  918. #### VendorInfluencerStatusHistoryModel.php ✅
  919. ```php
  920. // 기존 (애매모호)
  921. ->select('STATUS, COUNT(*) as count')
  922. ->groupBy('STATUS')
  923. // 수정 (명확함)
  924. ->select('VENDOR_INFLUENCER_STATUS_HISTORY.STATUS, COUNT(*) as count')
  925. ->groupBy('VENDOR_INFLUENCER_STATUS_HISTORY.STATUS')
  926. ```
  927. #### VendorControllerV2.php ✅
  928. ```php
  929. // 히스토리 테이블이 없을 경우 안전장치 추가
  930. try {
  931. $stats = $this->statusHistoryModel->getStatusStatsByVendor($vendorSeq);
  932. } catch (\Exception $statsError) {
  933. log_message('warning', '통계 조회 실패: ' . $statsError->getMessage());
  934. // 기본값 사용
  935. }
  936. ```
  937. ### 4단계: 현재 상태 확인
  938. 다음 명령으로 현재 테이블 상태를 확인하세요:
  939. ```sql
  940. -- 1. 히스토리 테이블 확인
  941. SELECT COUNT(*) FROM VENDOR_INFLUENCER_STATUS_HISTORY;
  942. -- 2. 메인 테이블에 STATUS 컬럼이 있는지 확인
  943. SHOW COLUMNS FROM VENDOR_INFLUENCER_MAPPING LIKE 'STATUS';
  944. -- 3. 테스트 쿼리
  945. SELECT
  946. VIM.SEQ,
  947. VISH.STATUS as CURRENT_STATUS
  948. FROM VENDOR_INFLUENCER_MAPPING VIM
  949. LEFT JOIN VENDOR_INFLUENCER_STATUS_HISTORY VISH
  950. ON VISH.MAPPING_SEQ = VIM.SEQ AND VISH.IS_CURRENT = 'Y'
  951. WHERE VIM.IS_ACT = 'Y'
  952. LIMIT 1;
  953. ```
  954. ## 🚨 예상되는 시나리오별 해결책
  955. ### 시나리오 1: 히스토리 테이블이 없음
  956. ```bash
  957. # 히스토리 테이블 생성
  958. mysql -u root -p influence < ddl/007_create_status_history_table.sql
  959. ```
  960. ### 시나리오 2: STATUS 컬럼이 메인 테이블에 남아있음
  961. ```sql
  962. -- STATUS 컬럼 수동 제거
  963. ALTER TABLE VENDOR_INFLUENCER_MAPPING DROP COLUMN STATUS;
  964. ```
  965. ### 시나리오 3: 데이터 마이그레이션 미완료
  966. ```sql
  967. -- 기존 데이터를 히스토리 테이블로 이전 (예시)
  968. INSERT INTO VENDOR_INFLUENCER_STATUS_HISTORY
  969. (MAPPING_SEQ, STATUS, CHANGED_BY, IS_CURRENT)
  970. SELECT SEQ, 'PENDING', REQUESTED_BY, 'Y'
  971. FROM VENDOR_INFLUENCER_MAPPING
  972. WHERE IS_ACT = 'Y'
  973. AND SEQ NOT IN (
  974. SELECT MAPPING_SEQ FROM VENDOR_INFLUENCER_STATUS_HISTORY
  975. WHERE IS_CURRENT = 'Y'
  976. );
  977. ```
  978. ## 🔍 테스트 방법
  979. ### 1. API 테스트
  980. ```bash
  981. curl -X POST http://localhost/api/vendor-influencer/requests \
  982. -H "Content-Type: application/json" \
  983. -d '{"vendorSeq": 1, "page": 1, "size": 10}'
  984. ```
  985. ### 2. 로그 확인
  986. ```bash
  987. tail -f backend/writable/logs/log-$(date +%Y-%m-%d).php
  988. ```
  989. ### 3. 응답 확인
  990. ```json
  991. {
  992. "success": true,
  993. "data": {
  994. "items": [],
  995. "total": 0,
  996. "stats": {
  997. "pending": 0,
  998. "approved": 0,
  999. "rejected": 0,
  1000. "total": 0
  1001. }
  1002. }
  1003. }
  1004. ```
  1005. ## ✅ 최종 체크리스트
  1006. - [ ] 히스토리 테이블 생성됨
  1007. - [ ] 메인 테이블에서 STATUS 컬럼 제거됨
  1008. - [ ] 테이블 별칭 명확히 지정됨
  1009. - [ ] 안전장치 코드 적용됨
  1010. - [ ] API 정상 응답 확인됨
  1011. **이제 STATUS 컬럼 애매모호 오류가 완전히 해결되었습니다!** ✅
  1012. </file>
  1013. <file path="md/2024-12-20-히스토리테이블-마이그레이션-가이드.md">
  1014. # 히스토리 테이블 기반 STATUS 관리 시스템 구축 가이드
  1015. **작성일**: 2024-12-20
  1016. **목적**: UNIQUE 제약조건 문제 근본 해결을 위한 히스토리 테이블 분리 시스템 구축
  1017. ## 🎯 목표
  1018. - **근본 문제 해결**: `unique_vendor_influencer_status` 중복 키 오류 완전 해결
  1019. - **확장 가능한 설계**: 상태 변경 이력 완전 추적 가능
  1020. - **기존 기능 보호**: 모든 기존 API 정상 작동 보장
  1021. - **데이터 무결성**: 트랜잭션 기반 안전한 상태 관리
  1022. ## 📋 구현 단계
  1023. ### 1단계: 데이터베이스 스키마 변경
  1024. #### 1.1 히스토리 테이블 생성
  1025. ```sql
  1026. -- DDL 실행
  1027. mysql -u root -p influence < ddl/007_create_status_history_table.sql
  1028. ```
  1029. #### 1.2 기존 데이터 마이그레이션
  1030. ```sql
  1031. -- 기존 STATUS 데이터를 히스토리 테이블로 이전
  1032. INSERT INTO VENDOR_INFLUENCER_STATUS_HISTORY
  1033. (MAPPING_SEQ, STATUS, STATUS_MESSAGE, CHANGED_BY, CHANGED_DATE, IS_CURRENT)
  1034. SELECT
  1035. SEQ as MAPPING_SEQ,
  1036. COALESCE(STATUS, 'PENDING') as STATUS,
  1037. COALESCE(REQUEST_MESSAGE, '') as STATUS_MESSAGE,
  1038. REQUESTED_BY as CHANGED_BY,
  1039. REG_DATE as CHANGED_DATE,
  1040. 'Y' as IS_CURRENT
  1041. FROM VENDOR_INFLUENCER_MAPPING
  1042. WHERE IS_ACT = 'Y';
  1043. ```
  1044. #### 1.3 메인 테이블에서 STATUS 컬럼 제거
  1045. ```sql
  1046. -- STATUS 컬럼 제거 (백업 후 실행)
  1047. ALTER TABLE VENDOR_INFLUENCER_MAPPING DROP COLUMN STATUS;
  1048. ```
  1049. ### 2단계: 새로운 모델 및 컨트롤러 배포
  1050. #### 2.1 새 모델 파일 배포
  1051. - ✅ `VendorInfluencerStatusHistoryModel.php` - 상태 히스토리 관리
  1052. - ✅ `VendorInfluencerMappingModel.php` - STATUS 컬럼 제거된 메인 모델
  1053. #### 2.2 새 컨트롤러 배포
  1054. - ✅ `InfluencerControllerV2.php` - 히스토리 테이블 기반 새 컨트롤러
  1055. ### 3단계: 라우팅 설정 변경
  1056. #### 3.1 새 API 엔드포인트 추가
  1057. ```php
  1058. // app/Config/Routes.php에 추가
  1059. $routes->group('api/v2', function($routes) {
  1060. $routes->group('influencer', function($routes) {
  1061. $routes->post('search-vendors', 'InfluencerControllerV2::searchVendors');
  1062. $routes->post('create-request', 'InfluencerControllerV2::createApprovalRequest');
  1063. $routes->post('reapply-request', 'InfluencerControllerV2::createReapplyRequest');
  1064. $routes->post('my-partnerships', 'InfluencerControllerV2::getMyPartnerships');
  1065. $routes->post('terminate', 'InfluencerControllerV2::terminatePartnership');
  1066. });
  1067. });
  1068. ```
  1069. #### 3.2 기존 API를 새 컨트롤러로 점진적 이전
  1070. ```php
  1071. // 기존 API를 새 컨트롤러로 리다이렉트 (점진적 이전)
  1072. $routes->post('vendor-influencer/reapply-request', 'InfluencerControllerV2::createReapplyRequest');
  1073. ```
  1074. ### 4단계: 프론트엔드 연동
  1075. #### 4.1 API 엔드포인트 변경
  1076. ```javascript
  1077. // 재승인 요청 API 변경
  1078. const endpoint = requestModal.value.isReapply
  1079. ? "/api/v2/influencer/reapply-request" // 새 엔드포인트
  1080. : "/api/v2/influencer/create-request";
  1081. ```
  1082. #### 4.2 응답 데이터 구조 업데이트
  1083. ```javascript
  1084. // 상태 정보는 CURRENT_STATUS 필드로 변경
  1085. vendor.PARTNERSHIP_STATUS = response.CURRENT_STATUS;
  1086. vendor.PARTNERSHIP_MESSAGE = response.CURRENT_STATUS_MESSAGE;
  1087. ```
  1088. ## 🔧 주요 개선사항
  1089. ### 1. 완전한 UNIQUE 제약조건 해결
  1090. ```sql
  1091. -- 기존 문제: (VENDOR_SEQ, INFLUENCER_SEQ, STATUS) 중복 불가
  1092. -- 해결책: STATUS를 별도 테이블로 분리, 메인 테이블에는 매핑 정보만
  1093. -- 히스토리 테이블 UNIQUE 제약조건
  1094. UNIQUE INDEX unique_current_mapping (MAPPING_SEQ, IS_CURRENT)
  1095. -- 하나의 매핑에 대해 하나의 현재 상태만 존재
  1096. ```
  1097. ### 2. 완전한 상태 변경 이력 추적
  1098. ```sql
  1099. -- 모든 상태 변경이 히스토리로 기록됨
  1100. SELECT
  1101. STATUS,
  1102. PREVIOUS_STATUS,
  1103. STATUS_MESSAGE,
  1104. CHANGED_BY,
  1105. CHANGED_DATE
  1106. FROM VENDOR_INFLUENCER_STATUS_HISTORY
  1107. WHERE MAPPING_SEQ = 1
  1108. ORDER BY CHANGED_DATE DESC;
  1109. ```
  1110. ### 3. 트랜잭션 기반 안전한 상태 관리
  1111. ```php
  1112. // VendorInfluencerStatusHistoryModel::changeStatus()
  1113. // 1. 기존 현재 상태를 이전 상태로 변경 (IS_CURRENT = 'N')
  1114. // 2. 새로운 상태 히스토리 추가 (IS_CURRENT = 'Y')
  1115. // 3. 메인 테이블 MOD_DATE 업데이트
  1116. // 모든 과정이 트랜잭션으로 보장됨
  1117. ```
  1118. ### 4. 기존 API 호환성 유지
  1119. ```php
  1120. // 기존 코드에서 STATUS 조회하던 부분
  1121. $partnership['STATUS'] // 기존 방식
  1122. // 새로운 방식 (JOIN으로 현재 상태 조회)
  1123. $partnership['CURRENT_STATUS'] // 히스토리 테이블 JOIN
  1124. ```
  1125. ## 🧪 테스트 시나리오
  1126. ### 1. 기본 기능 테스트
  1127. - [ ] **새 승인 요청**: PENDING 상태로 정상 생성
  1128. - [ ] **중복 요청 방지**: 동일 조합에서 PENDING 상태 중복 방지
  1129. - [ ] **승인/거부 처리**: 상태 변경 시 히스토리 정상 기록
  1130. - [ ] **재승인 요청**: REJECTED/TERMINATED → PENDING 정상 처리
  1131. ### 2. 상태 히스토리 테스트
  1132. - [ ] **이력 추적**: 모든 상태 변경이 히스토리에 기록됨
  1133. - [ ] **현재 상태 조회**: IS_CURRENT='Y'인 레코드만 조회됨
  1134. - [ ] **이전 상태 보존**: 변경 전 상태가 PREVIOUS_STATUS에 기록됨
  1135. ### 3. 데이터 무결성 테스트
  1136. - [ ] **트랜잭션 보장**: 상태 변경 중 오류 시 롤백 정상 작동
  1137. - [ ] **외래키 제약조건**: 매핑 삭제 시 히스토리도 연쇄 삭제
  1138. - [ ] **UNIQUE 제약조건**: 동일 매핑에 현재 상태 중복 불가
  1139. ### 4. 성능 테스트
  1140. - [ ] **조회 성능**: JOIN 쿼리 성능 확인
  1141. - [ ] **인덱스 효과**: 상태별, 매핑별 조회 성능 확인
  1142. - [ ] **대용량 데이터**: 히스토리 데이터 증가 시 성능 영향 확인
  1143. ## 🚨 주의사항
  1144. ### 1. 데이터 백업
  1145. ```bash
  1146. # 마이그레이션 전 필수 백업
  1147. mysqldump -u root -p influence > backup_before_migration_$(date +%Y%m%d_%H%M%S).sql
  1148. ```
  1149. ### 2. 점진적 배포
  1150. ```bash
  1151. # 1단계: 히스토리 테이블 생성 (기존 시스템 영향 없음)
  1152. # 2단계: 새 API 배포 (기존 API와 병행 운영)
  1153. # 3단계: 프론트엔드 점진적 이전
  1154. # 4단계: 기존 API 제거 (충분한 검증 후)
  1155. ```
  1156. ### 3. 모니터링
  1157. ```sql
  1158. -- 상태 불일치 모니터링
  1159. SELECT
  1160. MAPPING_SEQ,
  1161. COUNT(*) as current_status_count
  1162. FROM VENDOR_INFLUENCER_STATUS_HISTORY
  1163. WHERE IS_CURRENT = 'Y'
  1164. GROUP BY MAPPING_SEQ
  1165. HAVING COUNT(*) > 1;
  1166. -- 결과가 0이어야 정상
  1167. ```
  1168. ### 4. 성능 최적화
  1169. ```sql
  1170. -- 자주 사용되는 조회 패턴에 대한 복합 인덱스
  1171. CREATE INDEX idx_mapping_current_status
  1172. ON VENDOR_INFLUENCER_STATUS_HISTORY (MAPPING_SEQ, IS_CURRENT, STATUS);
  1173. -- 파티셔닝 고려 (대용량 히스토리 데이터 시)
  1174. -- 월별 또는 연도별 파티셔닝 검토
  1175. ```
  1176. ## 📈 예상 효과
  1177. ### 1. 문제 해결
  1178. - ✅ **중복 키 오류 완전 해결**: 더 이상 `unique_vendor_influencer_status` 오류 발생하지 않음
  1179. - ✅ **재승인 요청 안정성**: 모든 상태에서 재승인 요청 가능
  1180. - ✅ **데이터 일관성**: 트랜잭션 기반 상태 관리로 데이터 무결성 보장
  1181. ### 2. 기능 향상
  1182. - 📊 **완전한 이력 추적**: 모든 상태 변경 이력 추적 가능
  1183. - 🔄 **유연한 상태 관리**: 복잡한 상태 변경 시나리오 지원
  1184. - 📈 **확장성**: 새로운 상태 추가 시 기존 코드 영향 최소화
  1185. ### 3. 운영 개선
  1186. - 🐛 **디버깅 향상**: 상태 변경 이력으로 문제 원인 추적 용이
  1187. - 📊 **분석 기능**: 상태 변경 패턴 분석 가능
  1188. - 🛠️ **유지보수성**: 명확한 책임 분리로 코드 유지보수 용이
  1189. ## 🎉 배포 완료 체크리스트
  1190. - [ ] 데이터베이스 백업 완료
  1191. - [ ] DDL 스크립트 실행 완료
  1192. - [ ] 새 모델/컨트롤러 배포 완료
  1193. - [ ] 라우팅 설정 업데이트 완료
  1194. - [ ] 기존 기능 회귀 테스트 완료
  1195. - [ ] 새 기능 테스트 완료
  1196. - [ ] 성능 테스트 완료
  1197. - [ ] 모니터링 설정 완료
  1198. - [ ] 문서 업데이트 완료
  1199. **✅ 히스토리 테이블 기반 STATUS 관리 시스템 구축 완료**
  1200. </file>
  1201. <file path="md/2024-12-20-API-라우팅-가이드.md">
  1202. # API 라우팅 가이드
  1203. **작성일**: 2024-12-20
  1204. **목적**: 프론트엔드에서 사용 가능한 모든 API 엔드포인트 정리
  1205. ## 🎯 사용 가능한 API 엔드포인트
  1206. ### 1. 벤더사 관련 API
  1207. #### 인플루언서 요청 목록 조회
  1208. ```
  1209. POST /api/vendor-influencer/requests
  1210. POST /api/vendor/influencer-requests
  1211. POST /api/v2/vendor/influencer-requests
  1212. ```
  1213. #### 승인/거절 처리
  1214. ```
  1215. POST /api/vendor-influencer/process-request
  1216. POST /api/vendor/process-request
  1217. POST /api/v2/vendor/process-request
  1218. POST /vendor-influencer/process-request
  1219. ```
  1220. #### 파트너십 해지
  1221. ```
  1222. POST /api/vendor-influencer/terminate
  1223. POST /api/v2/vendor/terminate
  1224. ```
  1225. #### 상태 통계
  1226. ```
  1227. POST /api/vendor-influencer/status-stats
  1228. POST /api/v2/vendor/status-stats
  1229. ```
  1230. ### 2. 인플루언서 관련 API
  1231. #### 벤더사 검색
  1232. ```
  1233. POST /api/vendor-influencer/search-vendors
  1234. POST /api/influencer/search-vendors
  1235. POST /api/v2/influencer/search-vendors
  1236. ```
  1237. #### 승인 요청 생성
  1238. ```
  1239. POST /api/vendor-influencer/create-request
  1240. POST /api/influencer/create-request
  1241. POST /api/v2/influencer/create-request
  1242. ```
  1243. #### 재승인 요청
  1244. ```
  1245. POST /api/vendor-influencer/reapply-request
  1246. POST /api/influencer/reapply-request
  1247. POST /api/v2/influencer/reapply-request
  1248. POST /vendor-influencer/reapply-request
  1249. ```
  1250. #### 내 파트너십 목록
  1251. ```
  1252. POST /api/vendor-influencer/my-partnerships
  1253. POST /api/influencer/my-partnerships
  1254. POST /api/v2/influencer/my-partnerships
  1255. ```
  1256. #### 파트너십 해지
  1257. ```
  1258. POST /api/vendor-influencer/terminate
  1259. POST /api/influencer/terminate
  1260. POST /api/v2/influencer/terminate
  1261. ```
  1262. ## 🚀 권장 사용법
  1263. ### 1. 우선순위 (권장 순서)
  1264. 1. **V2 API** (가장 안정적)
  1265. ```
  1266. /api/v2/vendor/...
  1267. /api/v2/influencer/...
  1268. ```
  1269. 2. **호환성 API** (기존 코드용)
  1270. ```
  1271. /api/vendor-influencer/...
  1272. /api/vendor/...
  1273. /api/influencer/...
  1274. ```
  1275. 3. **레거시 API** (점진적 제거 예정)
  1276. ```
  1277. /vendor-influencer/...
  1278. ```
  1279. ### 2. 요청 예시
  1280. #### 벤더사: 인플루언서 요청 목록 조회
  1281. ```javascript
  1282. // 방법 1: V2 API (권장)
  1283. POST /api/v2/vendor/influencer-requests
  1284. {
  1285. "vendorSeq": 123,
  1286. "status": "PENDING",
  1287. "page": 1,
  1288. "size": 20
  1289. }
  1290. // 방법 2: 호환성 API
  1291. POST /api/vendor-influencer/requests
  1292. {
  1293. "vendorSeq": 123,
  1294. "status": "PENDING",
  1295. "page": 1,
  1296. "size": 20
  1297. }
  1298. ```
  1299. #### 벤더사: 승인/거절 처리
  1300. ```javascript
  1301. // 방법 1: V2 API (권장)
  1302. POST /api/v2/vendor/process-request
  1303. {
  1304. "mappingSeq": 456,
  1305. "action": "approve", // 또는 "reject"
  1306. "processedBy": 789,
  1307. "responseMessage": "승인합니다"
  1308. }
  1309. // 방법 2: 호환성 API
  1310. POST /api/vendor-influencer/process-request
  1311. {
  1312. "mappingSeq": 456,
  1313. "action": "approve",
  1314. "processedBy": 789,
  1315. "responseMessage": "승인합니다"
  1316. }
  1317. ```
  1318. #### 인플루언서: 재승인 요청
  1319. ```javascript
  1320. // 방법 1: V2 API (권장)
  1321. POST /api/v2/influencer/reapply-request
  1322. {
  1323. "vendorSeq": 123,
  1324. "influencerSeq": 456,
  1325. "requestMessage": "재승인 요청합니다",
  1326. "requestedBy": 456
  1327. }
  1328. // 방법 2: 호환성 API
  1329. POST /api/vendor-influencer/reapply-request
  1330. {
  1331. "vendorSeq": 123,
  1332. "influencerSeq": 456,
  1333. "requestMessage": "재승인 요청합니다",
  1334. "requestedBy": 456
  1335. }
  1336. ```
  1337. ## 🔧 응답 형식
  1338. ### 성공 응답
  1339. ```json
  1340. {
  1341. "success": true,
  1342. "message": "요청이 성공적으로 처리되었습니다.",
  1343. "data": {
  1344. // 응답 데이터
  1345. }
  1346. }
  1347. ```
  1348. ### 실패 응답
  1349. ```json
  1350. {
  1351. "success": false,
  1352. "message": "오류 메시지",
  1353. "error": "상세 오류 정보"
  1354. }
  1355. ```
  1356. ## 🚨 주의사항
  1357. ### 1. 히스토리 테이블 기반 (V2)
  1358. - 모든 상태 변경이 이력으로 기록됨
  1359. - 중복 키 오류 완전 해결
  1360. - 트랜잭션 기반 안전한 처리
  1361. ### 2. 호환성 라우팅
  1362. - 기존 프론트엔드 코드와 호환
  1363. - V2 컨트롤러로 자동 연결
  1364. - 점진적 이전 가능
  1365. ### 3. 파라미터 검증
  1366. - 모든 필수 파라미터 검증
  1367. - action 값 검증 ('approve', 'reject')
  1368. - 상태 전환 규칙 검증
  1369. ## 📈 마이그레이션 가이드
  1370. ### 기존 코드 → V2 API 이전
  1371. #### 1단계: 엔드포인트 변경
  1372. ```javascript
  1373. // 기존
  1374. const endpoint = '/api/vendor-influencer/requests';
  1375. // 변경
  1376. const endpoint = '/api/v2/vendor/influencer-requests';
  1377. ```
  1378. #### 2단계: 응답 필드 확인
  1379. ```javascript
  1380. // 기존
  1381. vendor.PARTNERSHIP_STATUS = response.STATUS;
  1382. // 변경 (V2)
  1383. vendor.PARTNERSHIP_STATUS = response.CURRENT_STATUS;
  1384. vendor.PARTNERSHIP_MESSAGE = response.CURRENT_STATUS_MESSAGE;
  1385. ```
  1386. #### 3단계: 테스트 및 검증
  1387. ```javascript
  1388. // V2 API 응답 확인
  1389. console.log('현재 상태:', response.CURRENT_STATUS);
  1390. console.log('상태 메시지:', response.CURRENT_STATUS_MESSAGE);
  1391. console.log('상태 변경일:', response.STATUS_CHANGED_DATE);
  1392. ```
  1393. **✅ 모든 API 엔드포인트가 정상적으로 작동합니다!**
  1394. </file>
  1395. <file path="md/2024-12-22-백엔드-프론트엔드-완전통합-가이드.md">
  1396. # 백엔드-프론트엔드 완전 통합 가이드
  1397. ## 📋 개요
  1398. 프론트엔드 페이지 분석을 통해 백엔드 API 구조를 완전히 프론트엔드 요구사항에 맞게 수정하는 작업입니다.
  1399. ## 🔍 발견된 문제점
  1400. ### 1. 데이터베이스 스키마 문제
  1401. - `USER_LIST` 테이블에 `RATING` 컬럼이 없어 SQL 오류 발생
  1402. - 여러 모델에서 `u.RATING` 필드를 참조하고 있음
  1403. ### 2. API 엔드포인트 불일치
  1404. - 프론트엔드: `/api/vendor-influencer/approve` 호출
  1405. - 백엔드: 해당 엔드포인트 없음 (기존에는 `process-request` 사용)
  1406. ### 3. 응답 데이터 구조 불일치
  1407. - 프론트엔드에서 기대하는 응답 구조와 백엔드 실제 응답 구조 차이
  1408. ## 🛠️ 작업 순서
  1409. ### 1단계: 데이터베이스 스키마 수정 ⚠️ **먼저 실행 필요**
  1410. ```sql
  1411. -- ddl/012_add_rating_column.sql 실행
  1412. -- USER_LIST 테이블에 RATING 컬럼 추가
  1413. ```
  1414. **실행 명령:**
  1415. ```bash
  1416. mysql -h [DB_HOST] -u [DB_USER] -p [DB_NAME] < ddl/012_add_rating_column.sql
  1417. ```
  1418. **확인 방법:**
  1419. ```sql
  1420. DESC USER_LIST;
  1421. -- RATING DECIMAL(3,1) DEFAULT 0.0 컬럼이 있는지 확인
  1422. ```
  1423. ### 2단계: 백엔드 API 구조 수정 ✅ **완료됨**
  1424. #### 2-1. 라우팅 추가
  1425. - [x] `backend/app/Config/Routes.php`에 `/api/vendor-influencer/approve` 엔드포인트 추가
  1426. - [x] 기존 라우팅 정리 및 그룹화
  1427. #### 2-2. 컨트롤러 메서드 추가
  1428. - [x] `VendorController::approveInfluencerRequest()` 메서드 추가
  1429. - [x] 프론트엔드 파라미터 형식에 맞춤 (`action`: 'APPROVE'/'REJECT')
  1430. ### 3단계: 테스트 및 검증
  1431. #### 3-1. 기본 기능 테스트
  1432. ```bash
  1433. # 1. 벤더사 로그인 후 인플루언서 요청 목록 확인
  1434. curl -X POST http://localhost:8080/api/vendor-influencer/requests \
  1435. -H "Content-Type: application/json" \
  1436. -d '{"vendorSeq": 1, "page": 1, "size": 20}'
  1437. # 2. 승인 처리 테스트
  1438. curl -X POST http://localhost:8080/api/vendor-influencer/approve \
  1439. -H "Content-Type: application/json" \
  1440. -d '{
  1441. "mappingSeq": 1,
  1442. "action": "APPROVE",
  1443. "processedBy": 1,
  1444. "responseMessage": "승인합니다"
  1445. }'
  1446. ```
  1447. #### 3-2. 프론트엔드 페이지 테스트
  1448. 1. **벤더사 대시보드 테스트**
  1449. - URL: `http://localhost:3000/view/vendor/dashboard/influencer-requests`
  1450. - 확인사항:
  1451. - 인플루언서 요청 목록 로딩
  1452. - 통계 카드 표시
  1453. - 승인/거부 버튼 동작
  1454. 2. **인플루언서 검색 페이지 테스트**
  1455. - URL: `http://localhost:3000/view/influencer/search`
  1456. - 확인사항:
  1457. - 벤더사 목록 로딩
  1458. - 승인요청 기능
  1459. - 재승인요청 기능
  1460. ## 📁 수정된 파일 목록
  1461. ### DDL 스크립트
  1462. - `ddl/012_add_rating_column.sql` ✨ **신규생성**
  1463. ### 백엔드 파일
  1464. - `backend/app/Config/Routes.php` ✏️ **수정완료**
  1465. - `backend/app/Controllers/VendorController.php` ✏️ **수정완료**
  1466. ### 프론트엔드 파일 (이미 존재)
  1467. - `pages/view/vendor/dashboard/influencer-requests.vue`
  1468. - `pages/view/vendor/dashboard/index.vue`
  1469. - `pages/view/influencer/search.vue`
  1470. - `pages/view/influencer/[id].vue`
  1471. ## 🚨 주의사항
  1472. ### 1. 데이터베이스 작업 순서
  1473. **반드시 DDL 스크립트를 먼저 실행한 후 백엔드 서버를 재시작하세요.**
  1474. ```bash
  1475. # 1. DDL 실행
  1476. mysql -h [HOST] -u [USER] -p [DATABASE] < ddl/012_add_rating_column.sql
  1477. # 2. 백엔드 서버 재시작
  1478. cd backend
  1479. php spark serve --host=0.0.0.0 --port=8080
  1480. ```
  1481. ### 2. 기존 기능 안전성 보장
  1482. - 기존 API 엔드포인트는 그대로 유지
  1483. - 새로운 엔드포인트 추가 방식으로 구현
  1484. - 호환성 라우팅을 통해 점진적 이전 가능
  1485. ### 3. 에러 처리 강화
  1486. - 모든 API에서 상세한 에러 로깅
  1487. - 프론트엔드 친화적인 에러 메시지
  1488. - 상태 코드 표준화
  1489. ## 🔄 롤백 방법
  1490. 만약 문제가 발생할 경우:
  1491. ### 데이터베이스 롤백
  1492. ```sql
  1493. -- RATING 컬럼 제거 (필요시)
  1494. ALTER TABLE USER_LIST DROP COLUMN RATING;
  1495. DROP INDEX idx_user_rating ON USER_LIST;
  1496. ```
  1497. ### 백엔드 롤백
  1498. ```bash
  1499. git checkout HEAD~1 backend/app/Config/Routes.php
  1500. git checkout HEAD~1 backend/app/Controllers/VendorController.php
  1501. ```
  1502. ## ✅ 검증 체크리스트
  1503. ### 필수 확인사항
  1504. - [ ] DDL 스크립트 실행 완료
  1505. - [ ] 백엔드 서버 정상 시작
  1506. - [ ] 프론트엔드 컴파일 오류 없음
  1507. - [ ] 벤더사 대시보드 정상 로딩
  1508. - [ ] 인플루언서 검색 페이지 정상 로딩
  1509. - [ ] 승인/거부 기능 정상 동작
  1510. ### 성능 확인사항
  1511. - [ ] API 응답 시간 300ms 이하
  1512. - [ ] 대량 데이터 처리 성능 이상 없음
  1513. - [ ] 메모리 사용량 급증 없음
  1514. ## 📞 문제 발생 시 대응
  1515. 1. **DDL 실행 오류**
  1516. - 테이블 권한 확인
  1517. - 데이터베이스 연결 상태 확인
  1518. - 기존 RATING 컬럼 존재 여부 확인
  1519. 2. **API 호출 오류**
  1520. - 라우팅 설정 재확인
  1521. - 컨트롤러 메서드 존재 확인
  1522. - 로그 파일에서 상세 에러 확인
  1523. 3. **프론트엔드 연동 오류**
  1524. - 브라우저 개발자 도구 네트워크 탭 확인
  1525. - API 응답 데이터 구조 확인
  1526. - CORS 설정 확인
  1527. ---
  1528. **작업 완료 예상 시간:** 30분 (DDL 실행 5분 + 테스트 25분)
  1529. **리스크 레벨:** 낮음 (기존 기능 유지하며 추가만 진행)
  1530. **우선순위:** 높음 (프론트엔드 오류 해결 필수)
  1531. </file>
  1532. <file path=".cursor/rules/code-style-consistency.mdc">
  1533. ---
  1534. description: 프로젝트 전체에서 일관된 코드 스타일을 유지합니다.
  1535. alwaysApply: true
  1536. ---
  1537. - 변수명과 함수명은 snake_case를 사용합니다.
  1538. - 클래스명은 PascalCase를 사용합니다.
  1539. - 코드 포맷팅은 [Prettier 또는 Black 등 프로젝트에서 사용하는 포맷터 이름] 규칙을 따릅니다.
  1540. - 특정 코드 패턴이나 라이브러리 사용법에 대한 예시를 제공하여 AI가 다른 방식을 시도하지 않도록 합니다. (예: 데이터 페칭에는 항상 `axios`를 사용) [1]
  1541. </file>
  1542. <file path=".cursor/rules/concise-answer.mdc">
  1543. ---
  1544. description: AI가 간결하고 핵심적인 답변만 생성하도록 유도합니다.
  1545. alwaysApply: true
  1546. ---
  1547. - 답변은 항상 간결하게, 핵심만 요약해서 제공해주세요.
  1548. - 코드에 대한 설명은 요청할 때만 추가하고, 기본적으로는 코드만 생성해주세요.
  1549. - 불필요한 인사나 서론, 결론은 생략해주세요.
  1550. </file>
  1551. <file path=".cursor/rules/context-limitation.mdc">
  1552. ---
  1553. description: AI가 불필요한 파일을 컨텍스트에 포함하지 않도록 합니다.
  1554. globs:
  1555. - "!**/node_modules/**"
  1556. - "!**/*.log"
  1557. - "!**/dist/**"
  1558. - "!**/build/**"
  1559. alwaysApply: false
  1560. ---
  1561. - 현재 작업과 직접적으로 관련된 파일만 참고해주세요.
  1562. - 특히 `node_modules`, 로그 파일, 빌드 결과물은 컨텍스트에서 제외해주세요.
  1563. </file>
  1564. <file path=".cursor/rules/cursor-rule.mdc">
  1565. ---
  1566. alwaysApply: true
  1567. ---
  1568. - 항상 2setp의 문서 여백을 제공하여 코드를 보기좋게 정렬
  1569. - css는 항상 scss, sass 문법을 유지하며 중복되는 css는 정리하여 하나로 정의
  1570. - 코드 작성시 반응형 대응을 고려하여 생성
  1571. </file>
  1572. <file path=".cursor/rules/mariadb-ddl-rules.mdc">
  1573. # MariaDB 호환 DDL 스크립트 작성 규칙
  1574. ## 📋 기본 원칙
  1575. **모든 DDL 스크립트는 MariaDB 호환성을 최우선으로 작성한다.**
  1576. ## 🔧 MariaDB 전용 구문 규칙
  1577. ### 1. 컬럼 삭제 (DROP COLUMN)
  1578. #### ❌ 사용 금지 (MySQL 8.0+ 전용)
  1579. ```sql
  1580. ALTER TABLE table_name DROP COLUMN IF EXISTS column_name;
  1581. ```
  1582. #### ❌ 문제 있는 동적 SQL (MariaDB에서 불안정)
  1583. ```sql
  1584. -- 이 방식은 MariaDB에서 PREPARE/EXECUTE 오류 발생 가능
  1585. SET @sql = (SELECT IF(...));
  1586. PREPARE stmt FROM @sql;
  1587. EXECUTE stmt;
  1588. DEALLOCATE PREPARE stmt;
  1589. ```
  1590. #### ✅ MariaDB 안전 방식 (권장)
  1591. ```sql
  1592. -- 1. 컬럼 존재 여부 확인 (정보성)
  1593. SELECT COUNT(*) as column_exists
  1594. FROM INFORMATION_SCHEMA.COLUMNS
  1595. WHERE TABLE_SCHEMA = 'database_name'
  1596. AND TABLE_NAME = 'table_name'
  1597. AND COLUMN_NAME = 'column_name';
  1598. -- 2. 사용자 안내 메시지 제공
  1599. SELECT
  1600. CASE
  1601. WHEN COUNT(*) > 0 THEN '⚠️ 컬럼이 존재합니다. 다음 명령을 별도로 실행하세요: ALTER TABLE table_name DROP COLUMN column_name;'
  1602. ELSE '✅ 컬럼이 존재하지 않습니다.'
  1603. END as column_check
  1604. FROM INFORMATION_SCHEMA.COLUMNS
  1605. WHERE TABLE_SCHEMA = 'database_name'
  1606. AND TABLE_NAME = 'table_name'
  1607. AND COLUMN_NAME = 'column_name';
  1608. -- 3. 주석으로 수동 실행 명령 제공
  1609. -- ALTER TABLE `table_name` DROP COLUMN `column_name`;
  1610. ```
  1611. ### 2. 인덱스 생성
  1612. #### ✅ 권장 방식
  1613. ```sql
  1614. -- MariaDB에서 지원하는 안전한 인덱스 생성
  1615. CREATE INDEX IF NOT EXISTS `index_name` ON `table_name` (`column1`, `column2`);
  1616. ```
  1617. #### ❌ 주의사항
  1618. ```sql
  1619. -- MariaDB 오래된 버전에서는 IF NOT EXISTS 미지원할 수 있음
  1620. -- 이 경우 DROP INDEX IF EXISTS 후 CREATE INDEX 사용
  1621. DROP INDEX IF EXISTS `index_name` ON `table_name`;
  1622. CREATE INDEX `index_name` ON `table_name` (`column1`, `column2`);
  1623. ```
  1624. ### 3. 외래키 제약조건
  1625. #### ✅ 안전한 외래키 처리
  1626. ```sql
  1627. -- 외래키 체크 임시 비활성화 (TRUNCATE 시 필요)
  1628. SET FOREIGN_KEY_CHECKS = 0;
  1629. -- 작업 수행
  1630. TRUNCATE TABLE `child_table`;
  1631. TRUNCATE TABLE `parent_table`;
  1632. -- 외래키 체크 재활성화
  1633. SET FOREIGN_KEY_CHECKS = 1;
  1634. ```
  1635. ### 4. 테이블 수정 (ALTER TABLE)
  1636. #### ✅ 단계별 안전한 수정
  1637. ```sql
  1638. -- 1. 백업 테이블 생성
  1639. CREATE TABLE IF NOT EXISTS `table_backup_YYYYMMDD` AS
  1640. SELECT * FROM `original_table`;
  1641. -- 2. 컬럼 추가
  1642. ALTER TABLE `original_table`
  1643. ADD COLUMN IF NOT EXISTS `new_column` varchar(50) DEFAULT NULL;
  1644. -- 3. 컬럼 수정 (MariaDB 호환)
  1645. ALTER TABLE `original_table`
  1646. MODIFY COLUMN `existing_column` varchar(100) NOT NULL;
  1647. ```
  1648. ### 5. 데이터 타입
  1649. #### ✅ MariaDB 호환 데이터 타입
  1650. ```sql
  1651. -- 문자열
  1652. varchar(255) COLLATE utf8mb4_unicode_ci
  1653. text COLLATE utf8mb4_unicode_ci
  1654. -- 숫자
  1655. bigint(20)
  1656. int(11)
  1657. decimal(10,2)
  1658. -- 날짜/시간
  1659. datetime DEFAULT current_timestamp()
  1660. timestamp DEFAULT current_timestamp() ON UPDATE current_timestamp()
  1661. -- 불린
  1662. char(1) DEFAULT 'N' -- 'Y'/'N' 방식 권장
  1663. ```
  1664. ## 📝 DDL 스크립트 템플릿
  1665. ### 기본 구조
  1666. ```sql
  1667. -- ============================================================================
  1668. -- [작업 설명]
  1669. -- 작성일: YYYY-MM-DD
  1670. -- 목적: [목적 설명]
  1671. -- 호환성: MariaDB 10.x+
  1672. -- ============================================================================
  1673. USE database_name;
  1674. -- 1. 백업 생성 (필수)
  1675. CREATE TABLE IF NOT EXISTS `backup_table_YYYYMMDD` AS
  1676. SELECT * FROM `original_table`;
  1677. -- 2. 외래키 체크 비활성화 (필요시)
  1678. SET FOREIGN_KEY_CHECKS = 0;
  1679. -- 3. 작업 수행
  1680. -- ... DDL 작업 ...
  1681. -- 4. 외래키 체크 재활성화 (필요시)
  1682. SET FOREIGN_KEY_CHECKS = 1;
  1683. -- 5. 컬럼 존재 확인 및 안내 (필요시)
  1684. SELECT
  1685. CASE
  1686. WHEN COUNT(*) > 0 THEN '⚠️ 추가 작업이 필요합니다: [수동 명령]'
  1687. ELSE '✅ 모든 작업이 완료되었습니다.'
  1688. END as manual_check
  1689. FROM INFORMATION_SCHEMA.COLUMNS
  1690. WHERE TABLE_SCHEMA = 'database_name'
  1691. AND TABLE_NAME = 'table_name'
  1692. AND COLUMN_NAME = 'column_name';
  1693. -- 6. 테이블 구조 확인
  1694. DESCRIBE `modified_table`;
  1695. -- 7. 완료 메시지
  1696. SELECT '작업 완료' as message;
  1697. SELECT '백업 테이블: backup_table_YYYYMMDD' as backup_info;
  1698. ```
  1699. ## 🚨 주의사항
  1700. ### 1. 백업 필수
  1701. - 모든 DDL 작업 전 백업 테이블 생성
  1702. - 백업 테이블명: `원본테이블명_BACKUP_YYYYMMDD` 형식
  1703. ### 2. 동적 SQL 제한
  1704. - MariaDB에서 PREPARE/EXECUTE 구문은 불안정할 수 있음
  1705. - 가능하면 정적 SQL 사용하고, 필요시 수동 실행 안내
  1706. ### 3. 트랜잭션 제한
  1707. - DDL은 자동 커밋되므로 롤백 불가
  1708. - 중요한 작업은 단계별로 분리하여 실행
  1709. ### 4. 외래키 처리
  1710. - TRUNCATE 전 반드시 외래키 체크 비활성화
  1711. - 작업 완료 후 즉시 재활성화
  1712. ### 5. 컬럼/인덱스 존재 확인
  1713. - 중복 생성 방지를 위해 존재 여부 확인
  1714. - INFORMATION_SCHEMA 활용하여 확인 후 안내
  1715. ## ✅ 검증 체크리스트
  1716. DDL 스크립트 작성 시 다음 사항을 확인:
  1717. - [ ] MariaDB 호환 구문 사용
  1718. - [ ] 동적 SQL 대신 정적 SQL + 수동 안내 방식 사용
  1719. - [ ] 백업 테이블 생성 포함
  1720. - [ ] 외래키 처리 포함 (필요시)
  1721. - [ ] 컬럼 존재 확인 및 안내 메시지 포함
  1722. - [ ] 테이블 구조 확인 포함
  1723. - [ ] 완료 메시지 포함
  1724. - [ ] 주석으로 작업 내용 명시
  1725. ## 🔍 테스트 방법
  1726. ```sql
  1727. -- 1. 구문 검사
  1728. -- DDL 스크립트를 테스트 DB에서 먼저 실행
  1729. -- 2. 백업 확인
  1730. SELECT COUNT(*) FROM backup_table_YYYYMMDD;
  1731. -- 3. 구조 확인
  1732. DESCRIBE modified_table;
  1733. -- 4. 제약조건 확인
  1734. SHOW CREATE TABLE modified_table;
  1735. -- 5. 수동 작업 확인
  1736. -- 스크립트 실행 후 안내 메시지에 따라 추가 작업 수행
  1737. ```
  1738. **모든 DDL 스크립트는 이 규칙을 준수하여 MariaDB 호환성을 보장한다.**
  1739. description:
  1740. globs:
  1741. alwaysApply: false
  1742. ---
  1743. </file>
  1744. <file path=".cursor/rules/minimal-comments.mdc">
  1745. ---
  1746. description: 코드에 꼭 필요한 경우를 제외하고 주석 생성을 최소화합니다.
  1747. alwaysApply: true
  1748. ---
  1749. - 명백한 코드에는 주석을 달지 마세요. 코드는 자체적으로 설명 가능해야 합니다(self-documenting code).
  1750. - 복잡한 로직이나 "왜(why)"에 대한 설명이 필요한 경우에만 주석을 추가해주세요. [8]
  1751. - 함수나 클래스에 대한 설명은 docstring 형식으로 요청 시에만 작성해주세요.
  1752. </file>
  1753. <file path=".cursor/rules/safe-development-practice.mdc">
  1754. # 🛡️ 안전한 개발 실천 규칙 (Safe Development Practice)
  1755. ## 핵심 원칙: "기존 기능 우선 보호"
  1756. **모든 기능 수정, 추가, 버그 픽스 시 기존 정상 기능들이 영향받지 않도록 사전 체크 및 안전장치 적용이 최우선**
  1757. ---
  1758. ## 📋 필수 체크리스트
  1759. ### Phase 1: 사전 영향도 분석 (Pre-Impact Analysis)
  1760. - [ ] **기존 기능 매핑**: 수정할 영역과 연관된 모든 기존 기능 식별
  1761. - [ ] **API 의존성 분석**: 기존 API 엔드포인트, 요청/응답 형식 확인
  1762. - [ ] **데이터베이스 스키마 확인**: 테이블, 제약조건, 인덱스 영향도 분석
  1763. - [ ] **프론트엔드 연동 확인**: 컴포넌트, 라우팅, 상태관리 영향도 분석
  1764. ### Phase 2: 안전한 설계 (Safe Design)
  1765. - [ ] **독립적 구조**: 새 기능은 기존 기능과 분리된 독립적 구조로 설계
  1766. - [ ] **하위 호환성**: 기존 API 스펙, 데이터 형식 유지
  1767. - [ ] **점진적 적용**: 한 번에 여러 영역 수정하지 않고 단계별 적용
  1768. - [ ] **롤백 계획**: 문제 발생 시 즉시 이전 상태로 복구 가능한 계획 수립
  1769. ### Phase 3: 구현 중 안전장치 (Implementation Safeguards)
  1770. - [ ] **새로운 API 엔드포인트**: 기존 API 수정 대신 새 엔드포인트 생성
  1771. - [ ] **별도 메서드/함수**: 기존 로직 수정 대신 새 메서드 생성
  1772. - [ ] **데이터 아카이브**: 기존 데이터 삭제 대신 비활성화 또는 아카이브
  1773. - [ ] **조건부 활성화**: 플래그나 설정을 통한 새 기능 조건부 활성화
  1774. ### Phase 4: 테스트 및 검증 (Testing & Validation)
  1775. - [ ] **기존 기능 회귀 테스트**: 모든 기존 기능 정상 작동 확인
  1776. - [ ] **API 응답 검증**: 기존 API 응답 형식 및 데이터 정확성 확인
  1777. - [ ] **데이터 무결성 검증**: 데이터베이스 제약조건, 관계 정상 확인
  1778. - [ ] **UI/UX 검증**: 기존 화면 및 사용자 플로우 정상 작동 확인
  1779. ---
  1780. ## 🚫 금지사항 (Never Do)
  1781. ### 기존 코드 직접 수정 금지
  1782. ```javascript
  1783. // ❌ 기존 함수 직접 수정
  1784. function existingFunction() {
  1785. // 기존 로직
  1786. // 새로운 로직 추가 - 위험!
  1787. }
  1788. // ✅ 새로운 함수 생성
  1789. function newFeatureFunction() {
  1790. // 새로운 로직
  1791. }
  1792. ```
  1793. ### 기존 API 스펙 변경 금지
  1794. ```javascript
  1795. // ❌ 기존 API 응답 형식 변경
  1796. {
  1797. "success": true,
  1798. "data": [], // 기존 구조 변경 - 위험!
  1799. "newField": "새 필드 추가" // 브레이킹 체인지
  1800. }
  1801. // ✅ 새로운 API 엔드포인트
  1802. POST /api/new-feature
  1803. {
  1804. "success": true,
  1805. "data": {
  1806. "newStructure": "새 구조"
  1807. }
  1808. }
  1809. ```
  1810. ### 데이터베이스 파괴적 변경 금지
  1811. ```sql
  1812. -- ❌ 기존 테이블/컬럼 삭제
  1813. DROP TABLE existing_table;
  1814. ALTER TABLE users DROP COLUMN important_field;
  1815. -- ✅ 새로운 테이블/컬럼 추가
  1816. CREATE TABLE new_feature_table (...);
  1817. ALTER TABLE users ADD COLUMN new_optional_field VARCHAR(255);
  1818. ```
  1819. ---
  1820. ## 🔧 안전한 수정 패턴
  1821. ### 1. 기능 확장 패턴
  1822. ```javascript
  1823. // 기존 기능 유지하면서 확장
  1824. class OriginalService {
  1825. existingMethod() {
  1826. // 기존 로직 그대로 유지
  1827. }
  1828. newMethod() {
  1829. // 새로운 기능 추가
  1830. }
  1831. }
  1832. ```
  1833. ### 2. 조건부 분기 패턴
  1834. ```javascript
  1835. function processRequest(type) {
  1836. if (type === 'existing') {
  1837. return existingLogic(); // 기존 로직
  1838. } else if (type === 'new') {
  1839. return newLogic(); // 새 로직
  1840. }
  1841. }
  1842. ```
  1843. ### 3. 데코레이터/래퍼 패턴
  1844. ```javascript
  1845. function enhancedFunction(originalFunction) {
  1846. return function(...args) {
  1847. // 새로운 전처리
  1848. const result = originalFunction(...args); // 기존 로직
  1849. // 새로운 후처리
  1850. return result;
  1851. };
  1852. }
  1853. ```
  1854. ---
  1855. ## 📊 영향도 매트릭스
  1856. | 수정 영역 | 기존 기능 영향도 | 안전장치 |
  1857. |-----------|------------------|----------|
  1858. | 새 API 추가 | 🟢 낮음 | 독립적 엔드포인트 |
  1859. | 기존 API 수정 | 🔴 높음 | 하위 호환성 보장 |
  1860. | 새 DB 테이블 | 🟢 낮음 | 독립적 스키마 |
  1861. | 기존 DB 수정 | 🟡 중간 | 비파괴적 변경만 |
  1862. | 새 UI 컴포넌트 | 🟢 낮음 | 별도 컴포넌트 |
  1863. | 기존 UI 수정 | 🟡 중간 | 조건부 렌더링 |
  1864. ---
  1865. ## 🚨 긴급 상황 대응
  1866. ### 기존 기능 장애 발생 시
  1867. 1. **즉시 롤백**: 새 기능 비활성화 또는 이전 버전 복구
  1868. 2. **원인 분석**: 어떤 변경이 기존 기능에 영향을 주었는지 분석
  1869. 3. **긴급 패치**: 기존 기능 복구를 최우선으로 처리
  1870. 4. **재설계**: 안전한 방식으로 새 기능 재구현
  1871. ### 롤백 절차
  1872. ```bash
  1873. # 1. 즉시 이전 상태로 복구
  1874. git revert HEAD
  1875. git push origin main
  1876. # 2. 데이터베이스 복구 (필요시)
  1877. mysql -u root -p < backup_before_change.sql
  1878. # 3. 캐시 클리어
  1879. redis-cli FLUSHALL
  1880. ```
  1881. ---
  1882. ## 📝 체크리스트 템플릿
  1883. ### 기능 수정 전 체크
  1884. ```markdown
  1885. ## 기능 수정 안전성 체크리스트
  1886. **수정 날짜**: ___________
  1887. **수정자**: ___________
  1888. **수정 내용**: ___________
  1889. ### Phase 1: 영향도 분석
  1890. - [ ] 관련 기존 기능 목록 작성
  1891. - [ ] API 의존성 확인
  1892. - [ ] 데이터베이스 영향도 확인
  1893. - [ ] 프론트엔드 영향도 확인
  1894. ### Phase 2: 안전한 설계
  1895. - [ ] 독립적 구조 설계
  1896. - [ ] 하위 호환성 보장
  1897. - [ ] 롤백 계획 수립
  1898. ### Phase 3: 구현
  1899. - [ ] 새로운 엔드포인트/메서드 사용
  1900. - [ ] 기존 코드 직접 수정 없음
  1901. - [ ] 조건부 활성화 적용
  1902. ### Phase 4: 테스트
  1903. - [ ] 기존 기능 회귀 테스트 완료
  1904. - [ ] 새 기능 정상 작동 확인
  1905. - [ ] 데이터 무결성 확인
  1906. ```
  1907. ---
  1908. ## 💡 베스트 프랙티스
  1909. 1. **"기존 기능 우선"** 마인드셋 유지
  1910. 2. **점진적 개발**: 작은 단위로 나누어 안전하게 구현
  1911. 3. **충분한 테스트**: 새 기능과 기존 기능 모두 테스트
  1912. 4. **문서화**: 변경사항과 안전장치 상세 기록
  1913. 5. **팀 공유**: 변경사항을 팀원들과 사전 공유 및 리뷰
  1914. **"새로운 기능을 추가하되, 기존의 가치를 지켜라"**
  1915. description:
  1916. globs:
  1917. alwaysApply: false
  1918. ---
  1919. </file>
  1920. <file path=".cursor/rules/vite-rule.mdc">
  1921. ---
  1922. alwaysApply: true
  1923. ---
  1924. You are an expert in Laravel, Vue.js, and modern full-stack web development technologies.
  1925. Key Principles
  1926. - Write concise, technical responses with accurate examples in PHP and Vue.js.
  1927. - Follow Laravel and Vue.js best practices and conventions.
  1928. - Use object-oriented programming with a focus on SOLID principles.
  1929. - Favor iteration and modularization over duplication.
  1930. - Use descriptive and meaningful names for variables, methods, and files.
  1931. - Adhere to Laravel's directory structure conventions (e.g., app/Http/Controllers).
  1932. - Prioritize dependency injection and service containers.
  1933. Laravel
  1934. - Leverage PHP 8.2+ features (e.g., readonly properties, match expressions).
  1935. - Apply strict typing: declare(strict_types=1).
  1936. - Follow PSR-12 coding standards for PHP.
  1937. - Use Laravel's built-in features and helpers (e.g., `Str::` and `Arr::`).
  1938. - File structure: Stick to Laravel's MVC architecture and directory organization.
  1939. - Implement error handling and logging:
  1940. - Use Laravel's exception handling and logging tools.
  1941. - Create custom exceptions when necessary.
  1942. - Apply try-catch blocks for predictable errors.
  1943. - Use Laravel's request validation and middleware effectively.
  1944. - Implement Eloquent ORM for database modeling and queries.
  1945. - Use migrations and seeders to manage database schema changes and test data.
  1946. Vue.js
  1947. - Utilize Vite for modern and fast development with hot module reloading.
  1948. - Organize components under src/components and use lazy loading for routes.
  1949. - Apply Vue Router for SPA navigation and dynamic routing.
  1950. - Implement Pinia for state management in a modular way.
  1951. - Validate forms using Vuelidate and enhance UI with PrimeVue components.
  1952. Dependencies
  1953. - Laravel (latest stable version)
  1954. - Composer for dependency management
  1955. - TailwindCSS for styling and responsive design
  1956. - Vite for asset bundling and Vue integration
  1957. Best Practices
  1958. - Use Eloquent ORM and Repository patterns for data access.
  1959. - Secure APIs with Laravel Passport and ensure proper CSRF protection.
  1960. - Leverage Laravel’s caching mechanisms for optimal performance.
  1961. - Use Laravel’s testing tools (PHPUnit, Dusk) for unit and feature testing.
  1962. - Apply API versioning for maintaining backward compatibility.
  1963. - Ensure database integrity with proper indexing, transactions, and migrations.
  1964. - Use Laravel's localization features for multi-language support.
  1965. - Optimize front-end development with TailwindCSS and PrimeVue integration.
  1966. Key Conventions
  1967. 1. Follow Laravel's MVC architecture.
  1968. 2. Use routing for clean URL and endpoint definitions.
  1969. 3. Implement request validation with Form Requests.
  1970. 4. Build reusable Vue components and modular state management.
  1971. 5. Use Laravel's Blade engine or API resources for efficient views.
  1972. 6. Manage database relationships using Eloquent's features.
  1973. 7. Ensure code decoupling with Laravel's events and listeners.
  1974. 8. Implement job queues and background tasks for better scalability.
  1975. 9. Use Laravel's built-in scheduling for recurring processes.
  1976. 10. Employ Laravel Mix or Vite for asset optimization and bundling.
  1977. </file>
  1978. <file path=".cursor/rules/vooster__architecture.mdc">
  1979. ---
  1980. description:
  1981. globs:
  1982. alwaysApply: true
  1983. ---
  1984. # Technical Requirements Document (TRD)
  1985. ## 1. Executive Technical Summary
  1986. - **프로젝트 개요**
  1987. 인플루언서와 벤더사 간 수·발주, 배송, 정산, 알림을 웹 기반으로 자동화하는 통합 플랫폼. 오프라인 문서 교환 제거, 실시간 상태 관리, 파트너 매칭 기능 제공.
  1988. - **핵심 기술 스택**
  1989. Frontend: Vue 3 + Nuxt3, Vuetify, TypeScript
  1990. Backend: CodeIgniter4 REST API + Node.js BFF
  1991. DB: MySQL(RDS), Redis 캐시
  1992. 배포: Docker, Kubernetes, GitHub Actions CI/CD
  1993. OCR: Google Cloud Vision API
  1994. 모니터링: ELK 스택, Grafana
  1995. - **주요 기술 목표**
  1996. 평균 응답시간 300ms 이하, 동시 5,000 사용자 처리, 가용성 99.9%, 서버 오류율 <1%
  1997. - **주요 가정**
  1998. - 초기 규모: 월 거래액 10억, DAU 1,000+
  1999. - 클라우드 인프라(AWS/GCP) 사용
  2000. - 외부 택배사·ERP API 연동 가능성 상시 고려
  2001. ## 2. Tech Stack
  2002. | Category | Technology / Library | Reasoning (선택 이유) |
  2003. | ------------------ | ------------------------------ | ----------------------------------------------------------------- |
  2004. | Frontend Framework | Vue 3 + Nuxt3 | SSR/SSG 지원으로 초기 로딩 최적화, SEO 강화 |
  2005. | UI Library | Vuetify | 머티리얼 디자인 기반, 빠른 UI 컴포넌트 구성 |
  2006. | Language | TypeScript | 정적 타입 검사로 코드 안정성 및 가독성 확보 |
  2007. | State Management | Pinia | Composition API 친화적, 러닝 커브 완만 |
  2008. | HTTP Client | Axios | Promise 기반, 요청/응답 인터셉터 활용 용이 |
  2009. | Backend Framework | CodeIgniter 4 | 경량 PHP 프레임워크, 빠른 개발 및 유지보수 |
  2010. | API Layer (BFF) | Node.js + Express | 프론트엔드 맞춤형 API 어댑터, 비즈니스 로직 경량 분리 |
  2011. | Database | MySQL (RDS) | 관계형 데이터 안정성·확장성, RDS 관리 편의성 |
  2012. | Cache | Redis | 세션 관리, 빈번한 조회 데이터 캐싱으로 응답 속도 개선 |
  2013. | Containerization | Docker | 환경 일관성 확보, 배포 자동화 |
  2014. | Orchestration | Kubernetes | 자동 스케일링, 자가 복구, 클러스터 관리 |
  2015. | CI/CD | GitHub Actions | 코드 푸시 시 빌드·테스트·배포 자동화 |
  2016. | OCR | Google Cloud Vision API | 높은 정확도, 이미지→텍스트 자동 변환 |
  2017. | Monitoring | ELK (Elasticsearch, Logstash, Kibana), Grafana | 로그 집계·시각화, 메트릭 모니터링 |
  2018. | Authentication | JWT, OAuth2 (Google/Kakao/Naver) | 보안성 높은 인증, SNS 간편 로그인 지원 |
  2019. | Real-time | WebSocket (Socket.IO) | 실시간 알림(주문 상태, 승인 결과) |
  2020. | Integration | Courier API, ERP REST API | 택배사 송장 조회, 회계 시스템 자동 연동 |
  2021. ## 3. System Architecture Design
  2022. ### Top-Level building blocks
  2023. - Frontend (Nuxt3): SSR 페이지, 컴포넌트, 인증/알림 UI
  2024. - BFF (Node.js + Express): Frontend 전용 경량 API 어댑터, 실시간 채널 관리
  2025. - Backend API (CI4): 핵심 비즈니스 로직, DB CRUD, 권한 관리
  2026. - Database & Cache: MySQL RDS, Redis 캐시 서버
  2027. - External Integrations: Google Vision OCR, 택배사 API, ERP API
  2028. - Monitoring & Logging: ELK 스택, Grafana 알림
  2029. ### Top-Level Component Interaction Diagram
  2030. ```mermaid
  2031. graph TD
  2032. F[Nuxt3 Frontend] --> BFF(BFF: Node.js)
  2033. BFF --> API[Backend API: CI4]
  2034. API --> DB[MySQL(RDS)]
  2035. API --> Cache[Redis]
  2036. API --> OCR[Google Vision API]
  2037. API --> Courier[택배사 API]
  2038. API --> ERP[ERP API]
  2039. Monitoring --> API
  2040. Monitoring --> BFF
  2041. ```
  2042. - Nuxt3 프론트엔드가 BFF로 요청 전달
  2043. - BFF는 세션/인증 관리 후 CI4 API 호출
  2044. - CI4 API는 MySQL/Redis, 외부 OCR·택배·ERP 연동
  2045. - ELK·Grafana로 전체 서비스 상태 모니터링
  2046. ### Code Organization & Convention
  2047. **Domain-Driven Organization Strategy**
  2048. - **도메인 분리**: 사용자, 주문, 배송, 정산, 매칭 등 비즈니스 도메인별 모듈
  2049. - **레이어 아키텍처**: Presentation, Application, Domain, Infrastructure
  2050. - **기능 기반 모듈화**: 각 도메인 기능을 독립 패키지로 관리
  2051. - **공유 컴포넌트**: Utils, Types, 공통 미들웨어, 인터셉터
  2052. **Universal File & Folder Structure**
  2053. ```
  2054. /
  2055. ├── app.vue
  2056. ├── assets
  2057. │ ├── font
  2058. │ │ ├── Inter-Medium.woff
  2059. │ │ ├── NotoSansKR-Black.otf
  2060. │ │ ├── NotoSansKR-Black.woff
  2061. │ │ ├── NotoSansKR-Black.woff2
  2062. │ │ ├── NotoSansKR-Bold.otf
  2063. │ │ ├── NotoSansKR-Bold.woff
  2064. │ │ ├── NotoSansKR-Bold.woff2
  2065. │ │ ├── NotoSansKR-DemiLight.otf
  2066. │ │ ├── NotoSansKR-DemiLight.woff
  2067. │ │ ├── NotoSansKR-DemiLight.woff2
  2068. │ │ ├── NotoSansKR-Light.otf
  2069. │ │ ├── NotoSansKR-Light.woff
  2070. │ │ ├── NotoSansKR-Light.woff2
  2071. │ │ ├── NotoSansKR-Medium.otf
  2072. │ │ ├── NotoSansKR-Medium.woff
  2073. │ │ ├── NotoSansKR-Medium.woff2
  2074. │ │ ├── NotoSansKR-Regular.otf
  2075. │ │ ├── NotoSansKR-Regular.woff
  2076. │ │ ├── NotoSansKR-Regular.woff2
  2077. │ │ ├── NotoSansKR-Regular(1).woff
  2078. │ │ ├── NotoSansKR-Thin.otf
  2079. │ │ ├── NotoSansKR-Thin.woff
  2080. │ │ └── NotoSansKR-Thin.woff2
  2081. │ ├── img
  2082. │ │ ├── bg_login.svg
  2083. │ │ ├── bg_otp_reg.png
  2084. │ │ ├── bg_popup.svg
  2085. │ │ ├── bg_tab_off.svg
  2086. │ │ ├── bg_tab_on.svg
  2087. │ │ ├── bg_tooltip.svg
  2088. │ │ ├── bg_tooltip2.svg
  2089. │ │ ├── bg_tooltip3.svg
  2090. │ │ ├── bg_tooltip4.svg
  2091. │ │ ├── btn_app_store.svg
  2092. │ │ ├── btn_goolge_play.svg
  2093. │ │ ├── btn.png
  2094. │ │ ├── caution_bg.jpg
  2095. │ │ ├── db_set_list01.svg
  2096. │ │ ├── db_set_list02.svg
  2097. │ │ ├── db_set_list03.svg
  2098. │ │ ├── head_flip_btn.svg
  2099. │ │ ├── ic_add.svg
  2100. │ │ ├── ic_allview.svg
  2101. │ │ ├── ic_arrow_right_chv.svg
  2102. │ │ ├── ic_avg01.svg
  2103. │ │ ├── ic_avg02.svg
  2104. │ │ ├── ic_avg03.svg
  2105. │ │ ├── ic_avg04.svg
  2106. │ │ ├── ic_card_nodata.svg
  2107. │ │ ├── ic_card_off.svg
  2108. │ │ ├── ic_card_on.svg
  2109. │ │ ├── ic_chv_arrow.svg
  2110. │ │ ├── ic_chv.svg
  2111. │ │ ├── ic_close.svg
  2112. │ │ ├── ic_drop_down_on.svg
  2113. │ │ ├── ic_drop_down.svg
  2114. │ │ ├── ic_ds.svg
  2115. │ │ ├── ic_end_close_cl.svg
  2116. │ │ ├── ic_end_close_x.svg
  2117. │ │ ├── ic_end_close.png
  2118. │ │ ├── ic_end_close.svg
  2119. │ │ ├── ic_end_red.svg
  2120. │ │ ├── ic_equip01.svg
  2121. │ │ ├── ic_equip02.svg
  2122. │ │ ├── ic_equip03.svg
  2123. │ │ ├── ic_equip04.svg
  2124. │ │ ├── ic_excel_green.svg
  2125. │ │ ├── ic_excel.svg
  2126. │ │ ├── ic_gear.svg
  2127. │ │ ├── ic_google.svg
  2128. │ │ ├── ic_grid_box.png
  2129. │ │ ├── ic_home_arrow.svg
  2130. │ │ ├── ic_info.svg
  2131. │ │ ├── ic_issue_flag.svg
  2132. │ │ ├── ic_kakao.svg
  2133. │ │ ├── ic_list_off.svg
  2134. │ │ ├── ic_list_on.svg
  2135. │ │ ├── ic_map_card.svg
  2136. │ │ ├── ic_map_pin.svg
  2137. │ │ ├── ic_mapt_chv.svg
  2138. │ │ ├── ic_more_btn.svg
  2139. │ │ ├── ic_more_plust_gray.svg
  2140. │ │ ├── ic_naver.svg
  2141. │ │ ├── ic_no_img.svg
  2142. │ │ ├── ic_no_tree.svg
  2143. │ │ ├── ic_preview_nw.svg
  2144. │ │ ├── ic_radio_off.svg
  2145. │ │ ├── ic_radio_on.svg
  2146. │ │ ├── ic_sch_nw.svg
  2147. │ │ ├── ic_sts.svg
  2148. │ │ ├── ic_tab01.svg
  2149. │ │ ├── ic_tab02.svg
  2150. │ │ ├── ic_tab03.svg
  2151. │ │ ├── ic_tab04.svg
  2152. │ │ ├── ic_tack_off.svg
  2153. │ │ ├── ic_tack_on.svg
  2154. │ │ ├── ic_tenant_small_white.svg
  2155. │ │ ├── ic_tenant_small.svg
  2156. │ │ ├── ic_tenant01.svg
  2157. │ │ ├── ic_tenant02.svg
  2158. │ │ ├── ic_tenant03.svg
  2159. │ │ ├── ic_tenant04.svg
  2160. │ │ ├── ic_wifi_dis.svg
  2161. │ │ ├── ic_wifi.svg
  2162. │ │ ├── ic_x_btn.svg
  2163. │ │ ├── ic_x_btn2.svg
  2164. │ │ ├── ic_xcircle.svg
  2165. │ │ ├── ico_alarm_blue.svg
  2166. │ │ ├── ico_alarm_gray.svg
  2167. │ │ ├── ico_alarm_green.svg
  2168. │ │ ├── ico_alarm_red.svg
  2169. │ │ ├── ico_alarm1.svg
  2170. │ │ ├── ico_alarm2.svg
  2171. │ │ ├── ico_alarm3.svg
  2172. │ │ ├── ico_alarm4.svg
  2173. │ │ ├── ico_all_pop.svg
  2174. │ │ ├── ico_arrow_next.svg
  2175. │ │ ├── ico_arrow_prev.svg
  2176. │ │ ├── ico_backup1.svg
  2177. │ │ ├── ico_backup2.svg
  2178. │ │ ├── ico_backup3.svg
  2179. │ │ ├── ico_backup4.svg
  2180. │ │ ├── ico_ban.svg
  2181. │ │ ├── ico_bar.svg
  2182. │ │ ├── ico_black_pin.svg
  2183. │ │ ├── ico_blue_pin.svg
  2184. │ │ ├── ico_btn1.svg
  2185. │ │ ├── ico_btn2.svg
  2186. │ │ ├── ico_btn3.svg
  2187. │ │ ├── ico_cal_dis.svg
  2188. │ │ ├── ico_cal.svg
  2189. │ │ ├── ico_calendar.svg
  2190. │ │ ├── ico_cancel_disabled.svg
  2191. │ │ ├── ico_cancel.svg
  2192. │ │ ├── ico_cate.svg
  2193. │ │ ├── ico_certify_n.svg
  2194. │ │ ├── ico_certify_y.svg
  2195. │ │ ├── ico_certify_y2.svg
  2196. │ │ ├── ico_certify_y3.svg
  2197. │ │ ├── ico_check_indeterminate.svg
  2198. │ │ ├── ico_chk_circle_disabled.svg
  2199. │ │ ├── ico_chk_circle.svg
  2200. │ │ ├── ico_chk_off.svg
  2201. │ │ ├── ico_chk_off2.svg
  2202. │ │ ├── ico_chk_on.svg
  2203. │ │ ├── ico_chk.svg
  2204. │ │ ├── ico_close_gray.svg
  2205. │ │ ├── ico_close.svg
  2206. │ │ ├── ico_core_alarm1.svg
  2207. │ │ ├── ico_core_alarm2.svg
  2208. │ │ ├── ico_date_pic.svg
  2209. │ │ ├── ico_del_disabled.svg
  2210. │ │ ├── ico_del_disabled2.svg
  2211. │ │ ├── ico_del.svg
  2212. │ │ ├── ico_del2.svg
  2213. │ │ ├── ico_download.svg
  2214. │ │ ├── ico_end.svg
  2215. │ │ ├── ico_equip.svg
  2216. │ │ ├── ico_eraser.svg
  2217. │ │ ├── ico_eraser2.svg
  2218. │ │ ├── ico_error.svg
  2219. │ │ ├── ico_event_pop.svg
  2220. │ │ ├── ico_event_view_black.png
  2221. │ │ ├── ico_event_view_black.svg
  2222. │ │ ├── ico_event_view_down.svg
  2223. │ │ ├── ico_event_view.svg
  2224. │ │ ├── ico_excel_d.svg
  2225. │ │ ├── ico_excel.svg
  2226. │ │ ├── ico_excel2.svg
  2227. │ │ ├── ico_eye.svg
  2228. │ │ ├── ico_eye2.svg
  2229. │ │ ├── ico_gray_pin.svg
  2230. │ │ ├── ico_grid_sort.svg
  2231. │ │ ├── ico_grid_sort2.svg
  2232. │ │ ├── ico_id_off.svg
  2233. │ │ ├── ico_id_on.svg
  2234. │ │ ├── ico_info.svg
  2235. │ │ ├── ico_lang_english.svg
  2236. │ │ ├── ico_lang_korea.svg
  2237. │ │ ├── ico_lang_korea2.svg
  2238. │ │ ├── ico_link.svg
  2239. │ │ ├── ico_list_white.svg
  2240. │ │ ├── ico_list.svg
  2241. │ │ ├── ico_location_arr.svg
  2242. │ │ ├── ico_location_home.svg
  2243. │ │ ├── ico_logo.svg
  2244. │ │ ├── ico_logout.svg
  2245. │ │ ├── ico_map.svg
  2246. │ │ ├── ico_menu_arr.svg
  2247. │ │ ├── ico_menu_arr2.svg
  2248. │ │ ├── ico_menu_minus.svg
  2249. │ │ ├── ico_menu_nodata.svg
  2250. │ │ ├── ico_menu_plus.svg
  2251. │ │ ├── ico_menu.svg
  2252. │ │ ├── ico_minus.svg
  2253. │ │ ├── ico_mod_disabled.svg
  2254. │ │ ├── ico_mod.svg
  2255. │ │ ├── ico_mod2.svg
  2256. │ │ ├── ico_mode_dark.svg
  2257. │ │ ├── ico_mode_white.svg
  2258. │ │ ├── ico_mode_white2.svg
  2259. │ │ ├── ico_ne_add.svg
  2260. │ │ ├── ico_ne_del_d.svg
  2261. │ │ ├── ico_ne_del.svg
  2262. │ │ ├── ico_no_data_nw.svg
  2263. │ │ ├── ico_no_data.svg
  2264. │ │ ├── ico_no_data2.svg
  2265. │ │ ├── ico_no_table_dt.svg
  2266. │ │ ├── ico_not_excel.svg
  2267. │ │ ├── ico_otp_step1.svg
  2268. │ │ ├── ico_otp_step2.svg
  2269. │ │ ├── ico_otp_step3.svg
  2270. │ │ ├── ico_otp_step4.svg
  2271. │ │ ├── ico_otp_step5.svg
  2272. │ │ ├── ico_paging_more.svg
  2273. │ │ ├── ico_paging_next.svg
  2274. │ │ ├── ico_paging_next1.svg
  2275. │ │ ├── ico_paging_next2.svg
  2276. │ │ ├── ico_paging_prev.svg
  2277. │ │ ├── ico_paging_prev1.svg
  2278. │ │ ├── ico_paging_prev2.svg
  2279. │ │ ├── ico_performance1.svg
  2280. │ │ ├── ico_performance2.svg
  2281. │ │ ├── ico_pin_off.svg
  2282. │ │ ├── ico_pin_on.svg
  2283. │ │ ├── ico_pip.svg
  2284. │ │ ├── ico_pip2.svg
  2285. │ │ ├── ico_plus.svg
  2286. │ │ ├── ico_pop_close.svg
  2287. │ │ ├── ico_pos.svg
  2288. │ │ ├── ico_ran_arrow_gray.svg
  2289. │ │ ├── ico_ran_arrow_white.svg
  2290. │ │ ├── ico_red_pin.svg
  2291. │ │ ├── ico_refresh_dis.svg
  2292. │ │ ├── ico_refresh.svg
  2293. │ │ ├── ico_reg_disabled.svg
  2294. │ │ ├── ico_reg.svg
  2295. │ │ ├── ico_save_disabled.svg
  2296. │ │ ├── ico_save.svg
  2297. │ │ ├── ico_search.svg
  2298. │ │ ├── ico_set_blue.svg
  2299. │ │ ├── ico_set.svg
  2300. │ │ ├── ico_setting.svg
  2301. │ │ ├── ico_slt.svg
  2302. │ │ ├── ico_slt2.svg
  2303. │ │ ├── ico_sort.svg
  2304. │ │ ├── ico_square.svg
  2305. │ │ ├── ico_state1.svg
  2306. │ │ ├── ico_state2.svg
  2307. │ │ ├── ico_state3.svg
  2308. │ │ ├── ico_status1.svg
  2309. │ │ ├── ico_status2.svg
  2310. │ │ ├── ico_status3.svg
  2311. │ │ ├── ico_step_arr.svg
  2312. │ │ ├── ico_step_arr2.svg
  2313. │ │ ├── ico_tenant1.svg
  2314. │ │ ├── ico_tenant2.svg
  2315. │ │ ├── ico_tenant3.svg
  2316. │ │ ├── ico_tenant4.svg
  2317. │ │ ├── ico_time_disabled.svg
  2318. │ │ ├── ico_time.svg
  2319. │ │ ├── ico_tit_arr.svg
  2320. │ │ ├── ico_tool.svg
  2321. │ │ ├── ico_trash_nw.svg
  2322. │ │ ├── ico_tree_add.svg
  2323. │ │ ├── ico_tree_arr.svg
  2324. │ │ ├── ico_tree_save.svg
  2325. │ │ ├── ico_tree1.svg
  2326. │ │ ├── ico_tree2.svg
  2327. │ │ ├── ico_tree3_core.svg
  2328. │ │ ├── ico_tree3_ran.svg
  2329. │ │ ├── ico_tree3.svg
  2330. │ │ ├── ico_trend.svg
  2331. │ │ ├── ico_view_del.svg
  2332. │ │ ├── ico_view_list.svg
  2333. │ │ ├── ico_view_list2.svg
  2334. │ │ ├── ico_wifi.svg
  2335. │ │ ├── ico-arrow-right.svg
  2336. │ │ ├── ico-check-on.svg
  2337. │ │ ├── img_mode_dark.svg
  2338. │ │ ├── img_mode_white.svg
  2339. │ │ ├── img_popup.svg
  2340. │ │ ├── img_qr.svg
  2341. │ │ ├── img_system.svg
  2342. │ │ ├── inf_bg.png
  2343. │ │ ├── is_disconnect.svg
  2344. │ │ ├── logo_foot.svg
  2345. │ │ ├── logo_foot2.svg
  2346. │ │ ├── logo_login.svg
  2347. │ │ ├── logo_new.svg
  2348. │ │ ├── logo_sams_sds.svg
  2349. │ │ ├── logo_sams.svg
  2350. │ │ ├── mail_logo1.png
  2351. │ │ ├── mail_logo2.png
  2352. │ │ ├── map_kangwon.svg
  2353. │ │ ├── pf_sample.svg
  2354. │ │ ├── pin.png
  2355. │ │ ├── rlt_bg.png
  2356. │ │ ├── round.png
  2357. │ │ └── ven_bg.png
  2358. │ └── scss
  2359. │ ├── default.scss
  2360. │ ├── main.scss
  2361. │ ├── mode-w-m.scss
  2362. │ ├── roulette.scss
  2363. │ ├── sample.scss
  2364. │ └── style.scss
  2365. ├── components
  2366. │ ├── cellRenderer
  2367. │ │ ├── customActionTypeTextColor.vue
  2368. │ │ ├── customBackUpBtn.vue
  2369. │ │ ├── customBackUpBtnR.vue
  2370. │ │ ├── customButtonSms.vue
  2371. │ │ ├── customHeaderText.vue
  2372. │ │ ├── customInhibitSelect.vue
  2373. │ │ ├── customIpConnTextColor.vue
  2374. │ │ ├── customIpNotConnTextColor.vue
  2375. │ │ ├── customLicenseBtn.vue
  2376. │ │ ├── customLogLevelSelect.vue
  2377. │ │ ├── customNullValue.vue
  2378. │ │ ├── customRadio.vue
  2379. │ │ ├── customResultTextDivBg.vue
  2380. │ │ ├── customSessionSetTextField.vue
  2381. │ │ ├── customStatusBox.vue
  2382. │ │ ├── customTextColor.vue
  2383. │ │ ├── customTextDivSession.vue
  2384. │ │ └── customUseYNTextColor.vue
  2385. │ ├── common
  2386. │ │ ├── confirmDialog.vue
  2387. │ │ ├── customLoading.vue
  2388. │ │ ├── excelUpload.vue
  2389. │ │ ├── footer
  2390. │ │ │ └── eventDetailView.vue
  2391. │ │ ├── footer.vue
  2392. │ │ ├── header
  2393. │ │ │ └── modal
  2394. │ │ │ ├── myInfoUpdate.vue
  2395. │ │ │ ├── passwordCheck.vue
  2396. │ │ │ └── privacyPop.vue
  2397. │ │ ├── header.vue
  2398. │ │ ├── leftMenu.vue
  2399. │ │ ├── location.vue
  2400. │ │ ├── pagination.vue
  2401. │ │ ├── topologyPop.vue
  2402. │ │ └── topologyPopMgmt.vue
  2403. │ ├── home
  2404. │ │ ├── dashboard
  2405. │ │ │ ├── common
  2406. │ │ │ │ ├── coreDetailModal.vue
  2407. │ │ │ │ ├── map
  2408. │ │ │ │ │ ├── mapBusan.vue
  2409. │ │ │ │ │ ├── mapChungbuk.vue
  2410. │ │ │ │ │ ├── mapChungnam.vue
  2411. │ │ │ │ │ ├── mapDaegu.vue
  2412. │ │ │ │ │ ├── mapDaejeon.vue
  2413. │ │ │ │ │ ├── mapGwangju.vue
  2414. │ │ │ │ │ ├── mapGyeongbuk.vue
  2415. │ │ │ │ │ ├── mapGyeonggido.vue
  2416. │ │ │ │ │ ├── mapGyeongnam.vue
  2417. │ │ │ │ │ ├── mapIncheon.vue
  2418. │ │ │ │ │ ├── mapJeju.vue
  2419. │ │ │ │ │ ├── mapJeonbuk.vue
  2420. │ │ │ │ │ ├── mapJeonnam.vue
  2421. │ │ │ │ │ ├── mapKangwon.vue
  2422. │ │ │ │ │ ├── mapSejong.vue
  2423. │ │ │ │ │ ├── mapSeoul.vue
  2424. │ │ │ │ │ └── mapUlsan.vue
  2425. │ │ │ │ ├── pagination.vue
  2426. │ │ │ │ ├── ranCardGroupDetailModal.vue
  2427. │ │ │ │ ├── ranMapGroupDetailModal.vue
  2428. │ │ │ │ └── ranMapNeDetailModal.vue
  2429. │ │ │ ├── layout01
  2430. │ │ │ │ ├── core
  2431. │ │ │ │ │ ├── layout01Core.vue
  2432. │ │ │ │ │ ├── layout01CoreWidgetM.vue
  2433. │ │ │ │ │ └── layout01CoreWidgetS.vue
  2434. │ │ │ │ ├── layout01.vue
  2435. │ │ │ │ ├── ran
  2436. │ │ │ │ │ └── layout01Ran.vue
  2437. │ │ │ │ └── user
  2438. │ │ │ │ ├── layout01User.vue
  2439. │ │ │ │ ├── layout01UserWidgetM.vue
  2440. │ │ │ │ ├── layout01UserWidgetS.vue
  2441. │ │ │ │ └── layout01UserWidgetT.vue
  2442. │ │ │ ├── layout02
  2443. │ │ │ │ ├── core
  2444. │ │ │ │ │ ├── layout02Core.vue
  2445. │ │ │ │ │ ├── layout02CoreWidgetM.vue
  2446. │ │ │ │ │ └── layout02CoreWidgetS.vue
  2447. │ │ │ │ ├── layout02.vue
  2448. │ │ │ │ ├── ran
  2449. │ │ │ │ │ └── layout02Ran.vue
  2450. │ │ │ │ └── user
  2451. │ │ │ │ ├── layout02User.vue
  2452. │ │ │ │ ├── layout02UserWidgetM.vue
  2453. │ │ │ │ ├── layout02UserWidgetS.vue
  2454. │ │ │ │ └── layout02UserWidgetT.vue
  2455. │ │ │ ├── layout03
  2456. │ │ │ │ ├── core
  2457. │ │ │ │ │ ├── layout03Core.vue
  2458. │ │ │ │ │ ├── layout03CoreWidgetM.vue
  2459. │ │ │ │ │ └── layout03CoreWidgetS.vue
  2460. │ │ │ │ ├── layout03.vue
  2461. │ │ │ │ ├── ran
  2462. │ │ │ │ │ ├── layout03Ran.vue
  2463. │ │ │ │ │ └── ranMapComponent.vue
  2464. │ │ │ │ └── user
  2465. │ │ │ │ ├── layout03User.vue
  2466. │ │ │ │ ├── layout03UserWidgetM.vue
  2467. │ │ │ │ └── layout03UserWidgetS.vue
  2468. │ │ │ ├── settingModal.vue
  2469. │ │ │ └── test.json
  2470. │ │ ├── jobNoti
  2471. │ │ │ └── jobNotiModal.vue
  2472. │ │ ├── tenant
  2473. │ │ │ ├── chart
  2474. │ │ │ │ ├── doughnut.vue
  2475. │ │ │ │ ├── trendBar.vue
  2476. │ │ │ │ └── userDoughnut.vue
  2477. │ │ │ ├── common
  2478. │ │ │ │ └── ranGroupDetailModal.vue
  2479. │ │ │ ├── tenantRan.vue
  2480. │ │ │ ├── tenantTrend.vue
  2481. │ │ │ └── tenantUser.vue
  2482. │ │ └── trend
  2483. │ │ └── headerChart.vue
  2484. │ ├── login
  2485. │ │ └── privacyPop.vue
  2486. │ ├── search
  2487. │ │ └── searchModules.vue
  2488. │ └── sunEdt.vue
  2489. ├── composables
  2490. │ ├── useApi.js
  2491. │ ├── useAxios.js
  2492. │ ├── useChart.js
  2493. │ ├── useEnumCode.js
  2494. │ ├── useEnumCodeEn.js
  2495. │ ├── useEnumCodeKr.js
  2496. │ ├── useErrorHandler.js
  2497. │ ├── useHangul.js
  2498. │ ├── useMenuConstants.js
  2499. │ ├── useSunEditor.js
  2500. │ ├── useToastEditor.ts
  2501. │ ├── useUrlHandler.js
  2502. │ ├── useUtil.js
  2503. │ ├── useValid.js
  2504. │ └── useWatchFocusValidate.js
  2505. ├── error.vue
  2506. ├── lang
  2507. │ ├── en.js
  2508. │ └── kr.js
  2509. ├── layouts
  2510. │ ├── default.vue
  2511. │ ├── designdefault.vue
  2512. │ ├── designloginlayout.vue
  2513. │ ├── loginlayout.vue
  2514. │ ├── roulette.vue
  2515. │ └── samplelayout.vue
  2516. ├── middleware
  2517. │ └── auth.global.js
  2518. ├── nuxt.config.ts
  2519. ├── package-lock.json
  2520. ├── package.json
  2521. ├── pages
  2522. │ ├── auth
  2523. │ │ ├── join.vue
  2524. │ │ └── popupClose.vue
  2525. │ ├── index.vue
  2526. │ └── view
  2527. │ ├── cs
  2528. │ │ ├── financial.vue
  2529. │ │ └── index.vue
  2530. │ ├── deli
  2531. │ │ ├── index.vue
  2532. │ │ ├── mngAdd.vue
  2533. │ │ └── mngListDeleted.vue
  2534. │ ├── item
  2535. │ │ ├── add.vue
  2536. │ │ ├── evtListClosed.vue
  2537. │ │ ├── evtListOngoing.vue
  2538. │ │ ├── evtListPending.vue
  2539. │ │ └── index.vue
  2540. │ ├── log
  2541. │ │ └── logList.vue
  2542. │ ├── order
  2543. │ │ └── index.vue
  2544. │ ├── settle
  2545. │ │ ├── curationAdd.vue
  2546. │ │ ├── curationList.vue
  2547. │ │ ├── index.vue
  2548. │ │ ├── irAdd.vue
  2549. │ │ ├── mediaAdd.vue
  2550. │ │ ├── mediaList.vue
  2551. │ │ ├── newsAdd.vue
  2552. │ │ └── newsList.vue
  2553. │ └── vendor
  2554. │ ├── dashboard
  2555. │ │ └── index.vue
  2556. │ └── index.vue
  2557. ├── plugins
  2558. │ ├── fontawesome.js
  2559. │ ├── i18n.js
  2560. │ ├── log.js
  2561. │ ├── mitt.js
  2562. │ ├── toast.js
  2563. │ ├── userAgent.js
  2564. │ ├── vue-cool-lightbox.js
  2565. │ ├── vue3-editor.js
  2566. │ └── vuetify.js
  2567. ├── public
  2568. │ ├── favicon.ico
  2569. │ ├── ft_logo.png
  2570. │ ├── js
  2571. │ │ └── jquery-3.7.1.min.js
  2572. │ └── logo.png
  2573. ├── README.md
  2574. ├── server
  2575. │ └── tsconfig.json
  2576. ├── stores
  2577. │ ├── auth.js
  2578. │ ├── detail.js
  2579. │ ├── lang.js
  2580. │ ├── loading.js
  2581. │ └── tenantMgmt.js
  2582. ├── toast-editor.d.ts
  2583. ├── tsconfig.json
  2584. └── vite-plugin-sri.d.ts
  2585. ```
  2586. ### Data Flow & Communication Patterns
  2587. - **Client-Server 통신**: RESTful API, JWT 인증 헤더, Axios 인터셉터
  2588. - **Database 상호작용**: CI4 Query Builder/Model, 트랜잭션 관리, Redis 캐시 사용
  2589. - **외부 서비스 연동**: 비동기 메시지 큐 없이 HTTP 호출, 에러 리트라이 로직
  2590. - **실시간 통신**: Socket.IO 기반 WebSocket 연결, 주문·승인 알림
  2591. - **데이터 동기화**: 캐시 무효화 패턴, 이벤트 기반 상태 업데이트
  2592. ## 4. Performance & Optimization Strategy
  2593. - HTTP 응답 캐싱: Redis로 빈번 조회 데이터 캐싱
  2594. - DB 인덱싱 및 쿼리 튜닝: 주요 조회 쿼리 Explain 분석
  2595. - 코드 스플리팅·지연 로딩: Nuxt3 동적 import 활용
  2596. - 로드 밸런싱: Kubernetes HPA 기반 자동 스케일링
  2597. ## 5. Implementation Roadmap & Milestones
  2598. ### Phase 1: Foundation (MVP Implementation)
  2599. - Core Infrastructure: Docker/K8s 환경, CI/CD 파이프라인
  2600. - Essential Features: 로그인·회원가입, 상품 조회·발주, 주문 승인, 송장 엑셀 업로드
  2601. - Basic Security: JWT 인증, HTTPS, OAuth2 SNS 로그인
  2602. - Development Setup: 로컬 개발 환경, 코드 린팅·테스트 프레임워크
  2603. - Timeline: M+2
  2604. ### Phase 2: Feature Enhancement
  2605. - Advanced Features: 정산 모듈, 파트너 매칭 시스템, 알림 센터
  2606. - Performance Optimization: 캐시 전략, DB 튜닝
  2607. - Enhanced Security: 권한 관리 강화, OWASP 점검
  2608. - Monitoring Implementation: ELK 대시보드, Grafana 알림
  2609. - Timeline: M+4
  2610. ### Phase 3: Scaling & Optimization
  2611. - Scalability Implementation: HPA/Cluster Autoscaler, DB 리드 리플리카
  2612. - Advanced Integrations: ERP 연동, 다중 택배사 API 연결
  2613. - Enterprise Features: 서브계정 관리, 대시보드
  2614. - Compliance & Auditing: GDPR, 데이터 암호화 심화
  2615. - Timeline: M+6
  2616. ## 6. Risk Assessment & Mitigation Strategies
  2617. ### Technical Risk Analysis
  2618. - **기술 리스크**: OCR 인식률 저하 → 수동 검증 UI 제공
  2619. - **성능 리스크**: 동시 사용자 증가 시 DB 병목 → 읽기/쓰기 분리, 캐시 활용
  2620. - **보안 리스크**: 토큰 탈취 → 짧은 만료, 리프레시 토큰 설계
  2621. - **통합 리스크**: 외부 API 변경 → 버전 관리, 어댑터 패턴 적용
  2622. - **Mitigation**: 대체 흐름, 로깅·모니터링 알림, 자동 테스트
  2623. ### Project Delivery Risks
  2624. - **일정 리스크**: 기능 지연 → MVP 단계별 우선순위 조정
  2625. - **자원 리스크**: 전문 인력 부족 → 외부 컨설팅·아웃소싱 검토
  2626. - **품질 리스크**: 테스트 커버리지 부족 → CI/CD 자동화 테스트 강화
  2627. - **배포 리스크**: 프로덕션 오류 → 블루/그린 배포 전략 채택
  2628. - **Contingency**: 페이즈별 핵심 기능 최소화, 백업 환경 준비
  2629. ---
  2630. *본 문서는 PRD 기반 최소 기능 중심으로 설계되었으며, 차후 요구사항 변화에 따라 단계별 확장이 가능합니다.*
  2631. </file>
  2632. <file path=".cursor/rules/vooster__clean-code.mdc">
  2633. ---
  2634. description:
  2635. globs:
  2636. alwaysApply: true
  2637. ---
  2638. # Clean Code Guidelines
  2639. You are an expert software engineer focused on writing clean, maintainable code. Follow these principles rigorously:
  2640. ## Core Principles
  2641. - **DRY** - Eliminate duplication ruthlessly
  2642. - **KISS** - Simplest solution that works
  2643. - **YAGNI** - Build only what's needed now
  2644. - **SOLID** - Apply all five principles consistently
  2645. - **Boy Scout Rule** - Leave code cleaner than found
  2646. ## Naming Conventions
  2647. - Use **intention-revealing** names
  2648. - Avoid abbreviations except well-known ones (e.g., URL, API)
  2649. - Classes: **nouns**, Methods: **verbs**, Booleans: **is/has/can** prefix
  2650. - Constants: UPPER_SNAKE_CASE
  2651. - No magic numbers - use named constants
  2652. ## Functions & Methods
  2653. - **Single Responsibility** - one reason to change
  2654. - Maximum 20 lines (prefer under 10)
  2655. - Maximum 3 parameters (use objects for more)
  2656. - No side effects in pure functions
  2657. - Early returns over nested conditions
  2658. ## Code Structure
  2659. - **Cyclomatic complexity** < 10
  2660. - Maximum nesting depth: 3 levels
  2661. - Organize by feature, not by type
  2662. - Dependencies point inward (Clean Architecture)
  2663. - Interfaces over implementations
  2664. ## Comments & Documentation
  2665. - Code should be self-documenting
  2666. - Comments explain **why**, not what
  2667. - Update comments with code changes
  2668. - Delete commented-out code immediately
  2669. - Document public APIs thoroughly
  2670. ## Error Handling
  2671. - Fail fast with clear messages
  2672. - Use exceptions over error codes
  2673. - Handle errors at appropriate levels
  2674. - Never catch generic exceptions
  2675. - Log errors with context
  2676. ## Testing
  2677. - **TDD** when possible
  2678. - Test behavior, not implementation
  2679. - One assertion per test
  2680. - Descriptive test names: `should_X_when_Y`
  2681. - **AAA pattern**: Arrange, Act, Assert
  2682. - Maintain test coverage > 80%
  2683. ## Performance & Optimization
  2684. - Profile before optimizing
  2685. - Optimize algorithms before micro-optimizations
  2686. - Cache expensive operations
  2687. - Lazy load when appropriate
  2688. - Avoid premature optimization
  2689. ## Security
  2690. - Never trust user input
  2691. - Sanitize all inputs
  2692. - Use parameterized queries
  2693. - Follow **principle of least privilege**
  2694. - Keep dependencies updated
  2695. - No secrets in code
  2696. ## Version Control
  2697. - Atomic commits - one logical change
  2698. - Imperative mood commit messages
  2699. - Reference issue numbers
  2700. - Branch names: `type/description`
  2701. - Rebase feature branches before merging
  2702. ## Code Reviews
  2703. - Review for correctness first
  2704. - Check edge cases
  2705. - Verify naming clarity
  2706. - Ensure consistent style
  2707. - Suggest improvements constructively
  2708. ## Refactoring Triggers
  2709. - Duplicate code (Rule of Three)
  2710. - Long methods/classes
  2711. - Feature envy
  2712. - Data clumps
  2713. - Divergent change
  2714. - Shotgun surgery
  2715. ## Final Checklist
  2716. Before committing, ensure:
  2717. - [ ] All tests pass
  2718. - [ ] No linting errors
  2719. - [ ] No console logs
  2720. - [ ] No commented code
  2721. - [ ] No TODOs without tickets
  2722. - [ ] Performance acceptable
  2723. - [ ] Security considered
  2724. - [ ] Documentation updated
  2725. Remember: **Clean code reads like well-written prose**. Optimize for readability and maintainability over cleverness.
  2726. </file>
  2727. <file path=".cursor/rules/vooster__guideline.mdc">
  2728. ---
  2729. description:
  2730. globs:
  2731. alwaysApply: true
  2732. ---
  2733. # Code Guidelines for Influencer–Vendor Automation Platform
  2734. ## 1. Project Overview
  2735. A unified web platform to automate ordering, shipping, settlement, and notifications between influencers and vendors.
  2736. Key architectural decisions:
  2737. - Frontend: Vue 3 + Nuxt 3 (SSR/SSG), Composition API, TypeScript, Pinia, Vuetify, Axios
  2738. - BFF: Node.js + Express (ES Modules), Socket.IO for real-time
  2739. - Backend API: CodeIgniter 4 RESTful controllers, MySQL (RDS), Redis cache
  2740. - Deployment: Docker → Kubernetes, CI/CD via GitHub Actions
  2741. - Integrations: Google Cloud Vision OCR, Courier & ERP REST APIs, JWT/OAuth2 authentication
  2742. ---
  2743. ## 2. Core Principles
  2744. 1. Single Responsibility: each function/module addresses one concern; max 200 lines.
  2745. 2. Strong Typing: avoid `any`; define interfaces for props, DTOs, API responses.
  2746. 3. Consistent Error Handling: centralize and standardize error responses and logs.
  2747. 4. DRY & Reusable: extract shared logic into composables, services, or utilities.
  2748. 5. Domain-Driven Modules: group files by business domain (order, shipping, finance).
  2749. ---
  2750. ## 3. Language-Specific Guidelines
  2751. ### 3.1 Vue 3 + Nuxt 3 + TypeScript
  2752. - File Organization:
  2753. - `/pages` → route pages
  2754. - `/components/{domain}` → feature components
  2755. - `/composables` → reusable logic hooks (prefixed `useXxx`)
  2756. - `/stores/{domain}` → Pinia modules (one per domain)
  2757. - `/plugins`, `/middleware`, `/assets`, `/layouts`
  2758. - Imports & Aliases:
  2759. - Use Nuxt aliases: `import X from '~/components/order/OrderList.vue'`
  2760. - Group imports: external packages → aliased aliases → relative (sorted alphabetically)
  2761. - Error Handling:
  2762. - Global error plugin `~/plugins/error.ts` to catch and display Axios errors
  2763. - In composable:
  2764. ```ts
  2765. export async function useFetchOrders() {
  2766. try {
  2767. const { data } = await $axios.get<Order[]>('/api/orders')
  2768. return data
  2769. } catch (error: unknown) {
  2770. throw new ApiError(error)
  2771. }
  2772. }
  2773. ```
  2774. ### 3.2 Node.js + Express (BFF)
  2775. - Folder Structure:
  2776. ```
  2777. /src
  2778. /controllers
  2779. /services
  2780. /routes
  2781. /middlewares
  2782. /utils
  2783. app.js
  2784. ```
  2785. - Dependency Management:
  2786. - Use ES Modules (`"type": "module"`) or TypeScript.
  2787. - Version-lock in `package.json`; run `npm audit` in CI.
  2788. - Error Handling:
  2789. - Create `HttpError` class in `/utils/HttpError.js`
  2790. - Middleware `errorHandler.js` at the end:
  2791. ```js
  2792. app.use((err, req, res, next) => {
  2793. logger.error(err)
  2794. res.status(err.statusCode || 500).json({
  2795. success: false,
  2796. message: err.message || 'Internal Server Error'
  2797. })
  2798. })
  2799. ```
  2800. ### 3.3 CodeIgniter 4 (REST API)
  2801. - Controllers: one per resource, extend `ResourceController`
  2802. - Models: use Entities and Query Builder; keep business logic in Services
  2803. - Validation & Responses:
  2804. ```php
  2805. public function create()
  2806. {
  2807. $rules = ['order_id' => 'required|integer', /* ... */];
  2808. if (! $this->validate($rules)) {
  2809. return $this->fail($this->validator->getErrors());
  2810. }
  2811. $entity = new OrderEntity($this->request->getPost());
  2812. $this->orderService->save($entity);
  2813. return $this->respondCreated($entity);
  2814. }
  2815. ```
  2816. - Error Handling: use `HTTPException` for 404/403, global logging in `app/Filters`.
  2817. ---
  2818. ## 4. Code Style Rules
  2819. ### 4.1 MUST Follow
  2820. - **Use Strict Typescript**
  2821. Rationale: catch errors at compile time.
  2822. ```jsonc
  2823. // tsconfig.json
  2824. {
  2825. "compilerOptions": {
  2826. "strict": true,
  2827. "noImplicitAny": true,
  2828. "forceConsistentCasingInFileNames": true
  2829. }
  2830. }
  2831. ```
  2832. - **One Component per File**
  2833. Rationale: clarity, reusability, smaller diffs.
  2834. - **Composition API & `<script setup>`**
  2835. Rationale: simpler syntax and tree-shaking.
  2836. ```vue
  2837. <script setup lang="ts">
  2838. import { ref } from 'vue'
  2839. const count = ref(0)
  2840. function increment() { count.value++ }
  2841. </script>
  2842. ```
  2843. - **Pinia Stores for State**
  2844. Rationale: predictable global state with actions, getters.
  2845. ```ts
  2846. import { defineStore } from 'pinia'
  2847. export const useOrderStore = defineStore('order', {
  2848. state: () => ({ list: [] as Order[] }),
  2849. actions: {
  2850. async fetch() { this.list = await fetchOrders() }
  2851. }
  2852. })
  2853. ```
  2854. - **RESTful API Design**
  2855. Rationale: consistency and predictability.
  2856. - Use resource paths: `/vendors/{id}/orders`
  2857. - HTTP verbs: GET/POST/PUT/DELETE
  2858. - Standard response envelope:
  2859. ```json
  2860. { "success": true, "data": {...}, "error": null }
  2861. ```
  2862. - **Centralized Error Handler**
  2863. Rationale: unified logging and client messages.
  2864. ### 4.2 MUST NOT Do
  2865. - **Avoid `any` or disabling lint rules**
  2866. Rationale: loses type-safety.
  2867. - **No Large “God” Modules**
  2868. Rationale: hard to test and maintain.
  2869. - **No Inline Styles or Scripts**
  2870. Rationale: separates concerns; use Vuetify theme or SCSS.
  2871. - **No Nested Callbacks (Callback Hell)**
  2872. Rationale: use async/await or Promises.
  2873. - **No Direct DOM Manipulation**
  2874. Rationale: Vue manages DOM; use refs or directives.
  2875. ---
  2876. ## 5. Architecture Patterns
  2877. ### 5.1 Component & Module Structure
  2878. - Domain-Driven Folders:
  2879. ```
  2880. /components/order
  2881. /components/shipping
  2882. /composables/order
  2883. /stores/order
  2884. /services/api/order.ts
  2885. ```
  2886. - Layers in BFF:
  2887. - **Routes** → **Controllers** → **Services** → **Data Access**
  2888. ### 5.2 Data Flow
  2889. - **Frontend**: Props ↓, Events ↑, Store (Pinia) for shared state, Composables for side-effects.
  2890. - **API Calls**: Axios interceptors attach JWT, handle 401 globally, retry logic for idempotent GETs.
  2891. - **Real-time**: Socket.IO client in plugin; update Pinia store on events.
  2892. ### 5.3 State Management
  2893. - Local state in component for UI-only values (`ref`, `reactive`).
  2894. - Global state in Pinia: one store per domain; expose typed actions/getters.
  2895. - Keep store actions async, commit minimal state changes.
  2896. ### 5.4 API Design Standards
  2897. - Base URL per domain: `/api/v1/orders`, `/api/v1/vendors`
  2898. - Pagination: standard query `?page=1&limit=20`, return `{ items, total, page, limit }`.
  2899. - Filtering & Sorting: query params `?status=shipped&sort=-date`.
  2900. - Consistent Error Payload:
  2901. ```json
  2902. {
  2903. "success": false,
  2904. "error": {
  2905. "code": "VALIDATION_FAILED",
  2906. "message": "Invalid field: quantity"
  2907. }
  2908. }
  2909. ```
  2910. ---
  2911. ## 6. Example Code Snippets
  2912. ### 6.1 Vue Composition & API Call
  2913. ```ts
  2914. // MUST: composable with typed response and error handling
  2915. import { ref } from 'vue'
  2916. import { Order } from '~/types'
  2917. import { useApi } from '~/composables/useApi'
  2918. export function useOrders() {
  2919. const list = ref<Order[]>([])
  2920. const error = ref<string | null>(null)
  2921. async function fetchOrders() {
  2922. try {
  2923. const res = await useApi().get<Order[]>('/orders')
  2924. list.value = res.data
  2925. } catch (e) {
  2926. error.value = e.message
  2927. }
  2928. }
  2929. return { list, error, fetchOrders }
  2930. }
  2931. ```
  2932. ```ts
  2933. // MUST NOT: direct Axios calls in component, untyped any
  2934. setup() {
  2935. axios.get('/orders').then(res => {
  2936. this.orders = res.data
  2937. })
  2938. }
  2939. ```
  2940. ### 6.2 Node.js Express Route & Error
  2941. ```js
  2942. // MUST: clean controller and error propagation
  2943. // src/routes/order.js
  2944. import { Router } from 'express'
  2945. import { listOrders } from '../controllers/order.js'
  2946. const router = Router()
  2947. router.get('/', listOrders)
  2948. export default router
  2949. // src/controllers/order.js
  2950. export async function listOrders(req, res, next) {
  2951. try {
  2952. const orders = await OrderService.fetchAll()
  2953. res.json({ success: true, data: orders })
  2954. } catch (err) {
  2955. next(new HttpError(500, 'Failed to fetch orders'))
  2956. }
  2957. }
  2958. ```
  2959. ```js
  2960. // MUST NOT: catch without forwarding or unstructured response
  2961. app.get('/orders', async (req, res) => {
  2962. try {
  2963. const orders = await OrderService.fetchAll()
  2964. res.send(orders)
  2965. } catch (err) {
  2966. res.status(500).send('Error')
  2967. }
  2968. })
  2969. ```
  2970. ### 6.3 CodeIgniter4 Controller
  2971. ```php
  2972. // MUST: validate, use entity, consistent response
  2973. class OrderController extends ResourceController
  2974. {
  2975. public function create()
  2976. {
  2977. $rules = ['vendor_id'=>'required|integer', 'items'=>'required|array'];
  2978. if (! $this->validate($rules)) {
  2979. return $this->failValidationErrors($this->validator->getErrors());
  2980. }
  2981. $order = new OrderEntity($this->request->getPost());
  2982. $this->orderService->create($order);
  2983. return $this->respondCreated(['order' => $order]);
  2984. }
  2985. }
  2986. ```
  2987. ```php
  2988. // MUST NOT: raw SQL in controller, no validation
  2989. class OrderController extends BaseController
  2990. {
  2991. public function create()
  2992. {
  2993. $db->query("INSERT INTO orders ..."); // anti-pattern
  2994. }
  2995. }
  2996. ```
  2997. ---
  2998. End of Guidelines.
  2999. Follow these rules as the single source of truth for code quality, maintainability, and consistency.
  3000. </file>
  3001. <file path=".cursor/rules/vooster__prd.mdc">
  3002. ---
  3003. description:
  3004. globs:
  3005. alwaysApply: true
  3006. ---
  3007. # 제품 요구사항 문서 (PRD)
  3008. ## 1. 개요
  3009. 인플루언서와 벤더사가 문서 교환 없이 웹 기반으로 수·발주 및 정산을 수행할 수 있는 통합 플랫폼 구축. 배송·정산·고객응대 전 과정을 자동화해 거래 속도와 신뢰도를 향상시킨다.
  3010. ## 2. 문제 정의
  3011. - 엑셀·PDF 등 오프라인 문서 교환으로 인한 오류·지연
  3012. - 송장번호 수기 입력, 재고·배송 상태 불일치
  3013. - 계약·정산 내역 확인이 어렵고 가시성 부족
  3014. - 인플루언서 파트너 탐색 과정의 비효율
  3015. ## 3. 목표 및 목적
  3016. - 1차 목표: 발주·승인·송장·정산 전 프로세스 웹 자동화
  3017. - 2차 목표: 파트너 매칭, 서브계정 관리, OCR 기반 송장 인식
  3018. - 성공지표
  3019. - 발주 승인 평균 소요시간 50% 단축
  3020. - 송장 입력 오류율 90% ↓
  3021. - 월간 활성 인플루언서 수 1,000명
  3022. - 거래액 월 10억 원
  3023. ## 4. 타깃 사용자
  3024. ### 주요 사용자
  3025. - 인플루언서: SNS 영향력 보유, 공동구매 운영, 재고·배송 부담 최소화 희망
  3026. - 벤더사: 상품 공급, 재고·배송·정산 자동화 필요
  3027. ### 부차 사용자
  3028. - 통합 벤더사/유통업체, CS 담당자, 회계팀
  3029. ## 5. 사용자 스토리
  3030. - “인플루언서로서 벤더사 제품을 조회·발주해 판매 준비를 간편히 하고 싶다.”
  3031. - “벤더사 담당자로서 인플루언서 요청을 클릭 한 번에 승인·거절하고 싶다.”
  3032. - “CS 담당자로서 주문 상태를 실시간 파악해 문의에 즉시 대응하고 싶다.”
  3033. - “벤더사 마스터로서 서브계정을 생성해 팀별 권한을 차등 부여하고 싶다.”
  3034. ## 6. 기능 요구사항
  3035. ### 핵심 기능
  3036. 1. 벤더사 포털
  3037. - 상품 등록/수정/상태관리(배송중, 품절 등)
  3038. Acceptance: 상품 등록 시 필수 필드 검증, 상태 변경시 실시간 알림
  3039. - 주문 관리: 인플루언서 수주 승인/거절, 일괄처리
  3040. - 배송 관리
  3041. - 송장번호 엑셀 업로드·다운로드
  3042. - 송장 사진 OCR → 자동 입력
  3043. - 정산 관리: 월간 계약·정산 내역 확인, CSV 다운로드
  3044. - 인플루언서 승인 및 제안: 가입 요청 승인 및 파트너 제안 발송
  3045. 2. 인플루언서 포털
  3046. - SNS 간편 로그인(Google, Kakao, Naver)
  3047. - 벤더사 가입 요청 및 제안 수락
  3048. - 연결된 벤더사 상품 리스트 조회
  3049. - 상품 수주 요청, 송장번호 엑셀 다운로드
  3050. 3. 매칭 시스템
  3051. - 벤더사 조건(카테고리·팔로워 수) 기반 추천 알고리즘
  3052. 4. 알림 센터
  3053. - 이메일·푸시·웹 소켓 알림: 주문 상태, 승인 결과, 정산 완료
  3054. ### 보조 기능
  3055. - 벤더사 서브계정 관리(역할·권한 설정)
  3056. - 고객센터 게시판(FAQ, 1:1 문의)
  3057. - 대시보드(매출, 주문, 정산 현황)
  3058. ## 7. 비기능 요구사항
  3059. - 성능: 평균 응답 300ms 이하, 동시 5,000사용자
  3060. - 보안: JWT 인증, OAuth2 SNS 로그인, HTTPS, 데이터 암호화
  3061. - 사용성: 반응형 UI, 접근성 WCAG 2.1 AA
  3062. - 확장성: 모듈화된 Micro Frontend, RESTful API
  3063. - 호환성: 최신 크롬·사파리·엣지, 모바일 브라우저
  3064. ## 8. 기술 고려사항
  3065. - 프론트엔드: Vue3 + Composition API, Nuxt3, Vuetify, TypeScript, Axios
  3066. - 백엔드: CodeIgniter4 + Node.js BFF
  3067. - DB: MySQL(RDS), Redis 캐시
  3068. - 배포: Docker, K8s, GitHub Actions CI/CD
  3069. - OCR: Google Cloud Vision API
  3070. - 통합: 택배사 API(송장 추적), 회계 시스템 ERP 연동
  3071. - 로깅·모니터링: ELK, Grafana
  3072. ## 9. 성공 지표(KPI)
  3073. - DAU / MAU, 유입·활성률
  3074. - 주문 승인 건수, 배송 완료율
  3075. - 거래 총액, 재구매율
  3076. - 서버 오류율 <1%, 가용성 99.9%
  3077. ## 10. 일정 및 마일스톤
  3078. - Phase 1 (M+2): 로그인, 상품·주문·배송 기본, MVP 런칭
  3079. - Phase 2 (M+4): 정산 모듈, 매칭 시스템, 알림 센터
  3080. - Phase 3 (M+6): OCR, 서브계정, 대시보드, 모바일 최적화
  3081. - Phase 4 (M+9): AI 수요 예측, 글로벌 배송 연동
  3082. ## 11. 위험 및 대응
  3083. - 데이터 정확도: OCR 오류 → 수동 검증 UI 제공
  3084. - 사용 미정착: 온보딩 튜토리얼, FAQ 운영
  3085. - 벤더사 API 변경: 버전 관리, 어댑터 패턴
  3086. - 개인정보 유출: 정기 보안 점검, 침투 테스트
  3087. ## 12. 향후 고려사항
  3088. - 인플루언서 커미션 자동 분배, 블록체인 정산
  3089. - 다국어 지원, 환율 자동 적용
  3090. - 모바일 앱(iOS/Android) 출시
  3091. - AI 기반 악성 주문 탐지, 인플루언서 등급제 도입
  3092. </file>
  3093. <file path=".cursor/rules/vooster__step-by-step.mdc">
  3094. ---
  3095. description:
  3096. globs:
  3097. alwaysApply: true
  3098. ---
  3099. ## Core Directive
  3100. You are a senior software engineer AI assistant. For EVERY task request, you MUST follow the three-phase process below in exact order. Each phase must be completed with expert-level precision and detail.
  3101. ## Guiding Principles
  3102. - **Minimalistic Approach**: Implement high-quality, clean solutions while avoiding unnecessary complexity
  3103. - **Expert-Level Standards**: Every output must meet professional software engineering standards
  3104. - **Concrete Results**: Provide specific, actionable details at each step
  3105. ---
  3106. ## Phase 1: Codebase Exploration & Analysis
  3107. **REQUIRED ACTIONS:**
  3108. 1. **Systematic File Discovery**
  3109. - List ALL potentially relevant files, directories, and modules
  3110. - Search for related keywords, functions, classes, and patterns
  3111. - Examine each identified file thoroughly
  3112. 2. **Convention & Style Analysis**
  3113. - Document coding conventions (naming, formatting, architecture patterns)
  3114. - Identify existing code style guidelines
  3115. - Note framework/library usage patterns
  3116. - Catalog error handling approaches
  3117. **OUTPUT FORMAT:**
  3118. ```
  3119. ### Codebase Analysis Results
  3120. **Relevant Files Found:**
  3121. - [file_path]: [brief description of relevance]
  3122. **Code Conventions Identified:**
  3123. - Naming: [convention details]
  3124. - Architecture: [pattern details]
  3125. - Styling: [format details]
  3126. **Key Dependencies & Patterns:**
  3127. - [library/framework]: [usage pattern]
  3128. ```
  3129. ---
  3130. ## Phase 2: Implementation Planning
  3131. **REQUIRED ACTIONS:**
  3132. Based on Phase 1 findings, create a detailed implementation roadmap.
  3133. **OUTPUT FORMAT:**
  3134. ```markdown
  3135. ## Implementation Plan
  3136. ### Module: [Module Name]
  3137. **Summary:** [1-2 sentence description of what needs to be implemented]
  3138. **Tasks:**
  3139. - [ ] [Specific implementation task]
  3140. - [ ] [Specific implementation task]
  3141. **Acceptance Criteria:**
  3142. - [ ] [Measurable success criterion]
  3143. - [ ] [Measurable success criterion]
  3144. - [ ] [Performance/quality requirement]
  3145. ### Module: [Next Module Name]
  3146. [Repeat structure above]
  3147. ```
  3148. ---
  3149. ## Phase 3: Implementation Execution
  3150. **REQUIRED ACTIONS:**
  3151. 1. Implement each module following the plan from Phase 2
  3152. 2. Verify ALL acceptance criteria are met before proceeding
  3153. 3. Ensure code adheres to conventions identified in Phase 1
  3154. **QUALITY GATES:**
  3155. - [ ] All acceptance criteria validated
  3156. - [ ] Code follows established conventions
  3157. - [ ] Minimalistic approach maintained
  3158. - [ ] Expert-level implementation standards met
  3159. ---
  3160. ## Success Validation
  3161. Before completing any task, confirm:
  3162. - ✅ All three phases completed sequentially
  3163. - ✅ Each phase output meets specified format requirements
  3164. - ✅ Implementation satisfies all acceptance criteria
  3165. - ✅ Code quality meets professional standards
  3166. ## Response Structure
  3167. Always structure your response as:
  3168. 1. **Phase 1 Results**: [Codebase analysis findings]
  3169. 2. **Phase 2 Plan**: [Implementation roadmap]
  3170. 3. **Phase 3 Implementation**: [Actual code with validation]
  3171. </file>
  3172. <file path=".cursor/rules/vooster__tdd.mdc">
  3173. ---
  3174. description:
  3175. globs:
  3176. alwaysApply: true
  3177. ---
  3178. # TDD Process Guidelines - Cursor Rules
  3179. ## ⚠️ MANDATORY: Follow these rules for EVERY implementation and modification
  3180. **This document defines the REQUIRED process for all code changes. No exceptions without explicit team approval.**
  3181. ## Core Cycle: Red → Green → Refactor
  3182. ### 1. RED Phase
  3183. - Write a failing test FIRST
  3184. - Test the simplest scenario
  3185. - Verify test fails for the right reason
  3186. - One test at a time
  3187. ### 2. GREEN Phase
  3188. - Write MINIMAL code to pass
  3189. - "Fake it till you make it" is OK
  3190. - YAGNI principle
  3191. ### 3. REFACTOR Phase
  3192. - Remove duplication
  3193. - Improve naming
  3194. - Simplify structure
  3195. - Keep tests passing
  3196. ## Test Quality: FIRST Principles
  3197. - **Fast**: Milliseconds, not seconds
  3198. - **Independent**: No shared state
  3199. - **Repeatable**: Same result every time
  3200. - **Self-validating**: Pass/fail, no manual checks
  3201. - **Timely**: Written just before code
  3202. ## Test Structure: AAA Pattern
  3203. ```
  3204. // Arrange
  3205. Set up test data and dependencies
  3206. // Act
  3207. Execute the function/method
  3208. // Assert
  3209. Verify expected outcome
  3210. ```
  3211. ## Implementation Flow
  3212. 1. **List scenarios** before coding
  3213. 2. **Pick one scenario** → Write test
  3214. 3. **Run test** → See it fail (Red)
  3215. 4. **Implement** → Make it pass (Green)
  3216. 5. **Refactor** → Clean up (Still Green)
  3217. 6. **Commit** → Small, frequent commits
  3218. 7. **Repeat** → Next scenario
  3219. ## Test Pyramid Strategy
  3220. - **Unit Tests** (70%): Fast, isolated, numerous
  3221. - **Integration Tests** (20%): Module boundaries
  3222. - **Acceptance Tests** (10%): User scenarios
  3223. ## Outside-In vs Inside-Out
  3224. - **Outside-In**: Start with user-facing test → Mock internals → Implement details
  3225. - **Inside-Out**: Start with core logic → Build outward → Integrate components
  3226. ## Common Anti-patterns to Avoid
  3227. - Testing implementation details
  3228. - Fragile tests tied to internals
  3229. - Missing assertions
  3230. - Slow, environment-dependent tests
  3231. - Ignored failing tests
  3232. ## When Tests Fail
  3233. 1. **Identify**: Regression, flaky test, or spec change?
  3234. 2. **Isolate**: Narrow down the cause
  3235. 3. **Fix**: Code bug or test bug
  3236. 4. **Learn**: Add missing test cases
  3237. ## Team Practices
  3238. - CI/CD integration mandatory
  3239. - No merge without tests
  3240. - Test code = Production code quality
  3241. - Pair programming for complex tests
  3242. - Regular test refactoring
  3243. ## Pragmatic Exceptions
  3244. - UI/Graphics: Manual + snapshot tests
  3245. - Performance: Benchmark suites
  3246. - Exploratory: Spike then test
  3247. - Legacy: Test on change
  3248. ## Remember
  3249. - Tests are living documentation
  3250. - Test behavior, not implementation
  3251. - Small steps, fast feedback
  3252. - When in doubt, write a test
  3253. </file>
  3254. <file path=".cursor/rules/vue-rule.mdc">
  3255. ---
  3256. alwaysApply: true
  3257. ---
  3258. You are an expert in Laravel, Vue.js, and modern full-stack web development technologies.
  3259. Key Principles
  3260. - Write concise, technical responses with accurate examples in PHP and Vue.js.
  3261. - Follow Laravel and Vue.js best practices and conventions.
  3262. - Use object-oriented programming with a focus on SOLID principles.
  3263. - Favor iteration and modularization over duplication.
  3264. - Use descriptive and meaningful names for variables, methods, and files.
  3265. - Adhere to Laravel's directory structure conventions (e.g., app/Http/Controllers).
  3266. - Prioritize dependency injection and service containers.
  3267. Laravel
  3268. - Leverage PHP 8.2+ features (e.g., readonly properties, match expressions).
  3269. - Apply strict typing: declare(strict_types=1).
  3270. - Follow PSR-12 coding standards for PHP.
  3271. - Use Laravel's built-in features and helpers (e.g., `Str::` and `Arr::`).
  3272. - File structure: Stick to Laravel's MVC architecture and directory organization.
  3273. - Implement error handling and logging:
  3274. - Use Laravel's exception handling and logging tools.
  3275. - Create custom exceptions when necessary.
  3276. - Apply try-catch blocks for predictable errors.
  3277. - Use Laravel's request validation and middleware effectively.
  3278. - Implement Eloquent ORM for database modeling and queries.
  3279. - Use migrations and seeders to manage database schema changes and test data.
  3280. Vue.js
  3281. - Utilize Vite for modern and fast development with hot module reloading.
  3282. - Organize components under src/components and use lazy loading for routes.
  3283. - Apply Vue Router for SPA navigation and dynamic routing.
  3284. - Implement Pinia for state management in a modular way.
  3285. - Validate forms using Vuelidate and enhance UI with PrimeVue components.
  3286. Dependencies
  3287. - Laravel (latest stable version)
  3288. - Composer for dependency management
  3289. - TailwindCSS for styling and responsive design
  3290. - Vite for asset bundling and Vue integration
  3291. Best Practices
  3292. - Use Eloquent ORM and Repository patterns for data access.
  3293. - Secure APIs with Laravel Passport and ensure proper CSRF protection.
  3294. - Leverage Laravel’s caching mechanisms for optimal performance.
  3295. - Use Laravel’s testing tools (PHPUnit, Dusk) for unit and feature testing.
  3296. - Apply API versioning for maintaining backward compatibility.
  3297. - Ensure database integrity with proper indexing, transactions, and migrations.
  3298. - Use Laravel's localization features for multi-language support.
  3299. - Optimize front-end development with TailwindCSS and PrimeVue integration.
  3300. Key Conventions
  3301. 1. Follow Laravel's MVC architecture.
  3302. 2. Use routing for clean URL and endpoint definitions.
  3303. 3. Implement request validation with Form Requests.
  3304. 4. Build reusable Vue components and modular state management.
  3305. 5. Use Laravel's Blade engine or API resources for efficient views.
  3306. 6. Manage database relationships using Eloquent's features.
  3307. 7. Ensure code decoupling with Laravel's events and listeners.
  3308. 8. Implement job queues and background tasks for better scalability.
  3309. 9. Use Laravel's built-in scheduling for recurring processes.
  3310. 10. Employ Laravel Mix or Vite for asset optimization and bundling.
  3311. </file>
  3312. <file path=".vooster/tasks/T-001.txt">
  3313. # 공통 인증 및 권한 관리 모듈 설계 및 구현
  3314. **Task ID:** T-001
  3315. **Status:** BACKLOG
  3316. **Importance:** MUST
  3317. **Complexity:** 5/10
  3318. **Urgency:** 7/10
  3319. **Dependencies:** None
  3320. ## Description
  3321. # 설명
  3322. 프로젝트 전반에서 재사용될 JWT 인증(JWT) 및 OAuth2 SNS 로그인(Google, Kakao, Naver), 역할기반 권한 관리 미들웨어를 설계하고 구현합니다.
  3323. ## 구현 상세
  3324. 1. Backend (CodeIgniter4)
  3325. - `AuthController` 생성 및 JWT 발급/검증 서비스 구현
  3326. - OAuth2 라이브러리(league/oauth2-client)로 Google/Kakao/Naver 전략 설정
  3327. - CI4 Migration으로 user, roles, permissions, user_roles, role_permissions 테이블 설계
  3328. 2. BFF (Node.js + Express)
  3329. - 로그인·토큰 갱신 API 작성, Axios 인터셉터로 JWT 검증 미들웨어 연동
  3330. 3. Frontend (Nuxt3 + Vue3)
  3331. - `auth.plugin.ts`로 JWT 토큰 관리 플러그인 작성
  3332. - Axios 요청/응답 인터셉터로 토큰 자동 갱신 처리
  3333. - Pinia auth store 구현, `middleware/auth.global.js`에서 경로별 권한 체크 로직 추가
  3334. 4. CI/CD 및 배포
  3335. - GitHub Actions에 lint, test, build, deploy 파이프라인 구성
  3336. - Dockerfile, Kubernetes Deployment/Service 정의
  3337. ## 테스트 전략
  3338. - Backend 유닛 테스트: JWT 발급·검증 성공/실패 케이스 커버리지 90% 이상
  3339. - BFF 통합 테스트: 로그인->토큰 갱신->인증 미들웨어 흐름 E2E 검증
  3340. - Frontend E2E(Cypress): SNS 로그인 버튼 클릭, 리디렉션, 토큰 저장 및 보호된 라우트 접근 제어
  3341. ---
  3342. **Created:** 2025-07-17T02:02:42.157Z
  3343. **Updated:** 2025-07-17T02:02:42.157Z
  3344. </file>
  3345. <file path=".vooster/tasks/T-002.txt">
  3346. # 서브계정 및 권한 관리 기능 개발
  3347. **Task ID:** T-002
  3348. **Status:** BACKLOG
  3349. **Importance:** MUST
  3350. **Complexity:** 6/10
  3351. **Urgency:** 7/10
  3352. **Dependencies:** T-001
  3353. ## Description
  3354. # 설명
  3355. 벤더사 마스터 계정 아래 팀원용 서브계정을 생성·초대·삭제하고 업무별 읽기/쓰기/관리자 권한을 설정해 UI와 API 접근을 제어합니다.
  3356. ## 구현 상세
  3357. 1. DB 설계 및 Migration(CI4)
  3358. - `sub_accounts`, `sub_account_invites`, `sub_account_roles` 테이블 추가
  3359. - 외래키, 인덱스 구성 및 Redis 캐시 전략 설계
  3360. 2. Backend API(CI4)
  3361. - SubAccountController에 CRUD, 초대 발송, 초대 수락/거절 메서드 구현
  3362. - RoleController로 역할 생성/조회/수정/삭제 기능 구현
  3363. - 미들웨어에서 권한 체크 로직 추가 (JWT 기반, role_permissions 활용)
  3364. 3. BFF (Node.js)
  3365. - 프론트엔드 전용 엔드포인트 정의 및 Node-level 권한 유효성 검사 추가
  3366. 4. Frontend(Nuxt3 + Vuetify)
  3367. - 서브계정 관리 UI 페이지 및 모달 컴포넌트 개발(excelUpload, confirmDialog 활용)
  3368. - 초대 이메일 발송 로직, 역할별 UI 컴포넌트 활성화/비활성화 구현
  3369. - Pinia store로 서브계정 상태 관리, middleware/auth.global.js에 권한 분기 추가
  3370. 5. 알림 연동(WebSocket)
  3371. - Socket.IO로 초대·역할 변경 알림 실시간 수신 처리
  3372. ## 테스트 전략
  3373. - Backend 단위 테스트: API 엔드포인트 입출력, 권한 미들링 성공/실패 케이스 검증
  3374. - Frontend 유닛 테스트: 컴포넌트 렌더링, 버튼 활성화/비활성화 로직 커버리지 80% 이상
  3375. - E2E(Cypress): 서브계정 초대 이메일 링크 클릭, 계정 생성 후 UI 기능 접근 제어 검증
  3376. ---
  3377. **Created:** 2025-07-17T02:02:42.157Z
  3378. **Updated:** 2025-07-17T02:02:42.157Z
  3379. </file>
  3380. <file path=".vooster/tasks/T-003.txt">
  3381. # 파트너 매칭 시스템 구축
  3382. **Task ID:** T-003
  3383. **Status:** BACKLOG
  3384. **Importance:** MUST
  3385. **Complexity:** 7/10
  3386. **Urgency:** 8/10
  3387. **Dependencies:** T-001, T-002
  3388. ## Description
  3389. # 설명
  3390. 벤더사가 설정한 카테고리·팔로워 수 등 조건에 따라 인플루언서를 추천하고, 제안·수락·거절 플로우와 알림을 구현합니다.
  3391. ## 구현 상세
  3392. 1. DB 설계 및 Migration(CI4)
  3393. - `matching_requests`, `matching_rules`, `influencer_profiles` 테이블 추가
  3394. - 주요 조회 컬럼 인덱스 구축 및 Redis 캐싱 전략 수립
  3395. 2. 백엔드 매칭 알고리즘(CI4 Service)
  3396. - 조건 필터링 로직 구현(PHP pseudo-code):
  3397. ```php
  3398. $query = $this->influencerModel->whereIn('category', $rules->categories)
  3399. ->where('followers >=', $rules->min_followers)
  3400. ->limit(50)
  3401. ->findAll();
  3402. ```
  3403. - BFF(Node.js)로 프론트엔드 전용 `GET /matches` API 작성
  3404. 3. Frontend(Nuxt3)
  3405. - 검색 UI 및 추천 리스트 컴포넌트 구현, Vuetify DataTable로 페이징/필터링 처리
  3406. - 제안·수락·거절 버튼 클릭 시 Socket.IO를 통해 실시간 알림 발송/수신 처리
  3407. 4. 알림 센터 연동
  3408. - 주문/승인 알림과 동일한 WebSocket 채널 사용, Subscription 이벤트 등록
  3409. 5. 확장성 고려
  3410. - 향후 AI 추천 모듈 연동을 위한 추상화 인터페이스 정의
  3411. ## 테스트 전략
  3412. - 매칭 알고리즘 유닛 테스트: 다양한 조건 조합 테스트 커버리지 90% 이상
  3413. - API 통합 테스트: `GET /matches`, `POST /requests`, `PATCH /requests/:id` 흐름 검증
  3414. - Frontend E2E: 검색 필터, 제안·수락·거절 플로우, 실시간 알림 수신 검증
  3415. ---
  3416. **Created:** 2025-07-17T02:02:42.157Z
  3417. **Updated:** 2025-07-17T02:02:42.157Z
  3418. </file>
  3419. <file path=".vooster/tasks/T-004.txt">
  3420. # 대시보드(매출·주문·정산) 개발
  3421. **Task ID:** T-004
  3422. **Status:** DONE
  3423. **Importance:** MUST
  3424. **Complexity:** 6/10
  3425. **Urgency:** 6/10
  3426. **Dependencies:** T-001, T-002
  3427. ## Description
  3428. # 설명
  3429. 벤더사 및 인플루언서 거래 현황(매출, 주문 수, 정산 완료율)을 집계하고, 차트·기간별 필터링 UI로 시각화합니다.
  3430. ## 구현 상세
  3431. 1. DB 집계 쿼리(CI4)
  3432. - 월별/일별 매출, 주문 수, 정산 완료율 계산용 뷰 또는 Stored Procedure 작성
  3433. - Redis 캐싱으로 조회 성능 최적화
  3434. 2. Backend API(CI4)
  3435. - `DashboardController`에서 `getMetrics(filterParams)` 메서드 구현
  3436. - BFF(Node.js)로 `GET /dashboard/metrics` 엔드포인트 작성, 캐시 미들기 및 파라미터 검증 추가
  3437. 3. Frontend(Nuxt3 + Chart.js 또는 Vuetify Chart)
  3438. - 대시보드 페이지 컴포넌트 개발, Chart.js 플러그인(useChart composable) 활용
  3439. - 기간/파트너별 드롭다운 필터링, 로딩 상태, 에러 핸들링 UI 구현
  3440. - 코드 스플리팅(dynamically import)으로 초기 로드 최적화
  3441. 4. 반응형 디자인 및 접근성(WCAG 2.1 AA) 적용
  3442. ## 테스트 전략
  3443. - Backend 단위 테스트: 집계 로직 정확성, 캐시 사용 검증
  3444. - API 부하 테스트: 평균 응답 300ms 이하, 동시 1,000 요청 상황에서 95 Percentile 만족 여부 측정
  3445. - Frontend Snapshot 테스트: 차트 렌더링, 필터링 동작 검증
  3446. - E2E(Cypress): 대시보드 필터링, 데이터 일관성, 반응형 레이아웃 검증
  3447. ---
  3448. **Created:** 2025-07-17T02:02:42.157Z
  3449. **Updated:** 2025-07-21T06:34:50.862Z
  3450. </file>
  3451. <file path=".vooster/tasks/T-005.txt">
  3452. # 벤더사 대시보드 페이지 기본 구조 설계 및 라우팅
  3453. **Task ID:** T-005
  3454. **Status:** DONE
  3455. **Importance:** MUST
  3456. **Complexity:** 5/10
  3457. **Urgency:** 8/10
  3458. **Dependencies:** None
  3459. ## Description
  3460. # 설명
  3461. 벤더사 전용 메인 대시보드 페이지의 기본 레이아웃과 로그인 후 라우팅을 설정합니다.
  3462. # 구현 세부사항
  3463. 1. Nuxt3 라우터 파일에 `'/vendor/dashboard'` 경로 추가
  3464. 2. 로그인 완료 후 `router.push('/vendor/dashboard')` 호출 로직 구현
  3465. 3. v-header, v-menu, Container 컴포넌트로 레이아웃 구조 정의
  3466. # 테스트 전략
  3467. - 인증되지 않은 상태에서 `/vendor/dashboard` 접근 시 로그인 페이지로 리다이렉트 확인
  3468. - 로그인 후 자동 진입 및 레이아웃 요소 렌더링 검증
  3469. ---
  3470. **Created:** 2025-07-17T02:18:17.743Z
  3471. **Updated:** 2025-07-21T06:40:17.764Z
  3472. </file>
  3473. <file path=".vooster/tasks/T-006.txt">
  3474. # 주문 데이터 API 연동 및 상태별 분류 로직 구현
  3475. **Task ID:** T-006
  3476. **Status:** BACKLOG
  3477. **Importance:** MUST
  3478. **Complexity:** 6/10
  3479. **Urgency:** 8/10
  3480. **Dependencies:** T-005
  3481. ## Description
  3482. # 설명
  3483. 백엔드에서 주문 데이터를 받아와 상태별로 분류 및 전처리 로직을 구현합니다.
  3484. # 구현 세부사항
  3485. 1. Axios로 주문 데이터 API(`GET /api/orders`) 호출
  3486. 2. 응답 데이터에서 상태값(`status`) 기준으로 신규주문, 배송중, 배송완료 배열 분리
  3487. 3. 각 배열별 필요한 필드만 매핑(id, influencerName, productName, amount, contact, email, status, requestDate)
  3488. 4. Vuex 또는 Pinia 스토어에 상태별 배열 저장
  3489. # 테스트 전략
  3490. - Mock API 응답으로 상태별 배열 분리 로직 단위 테스트
  3491. - 잘못된 상태값 처리 예외 케이스 테스트
  3492. - 스토어에 저장된 데이터 구조 및 값 검증
  3493. ---
  3494. **Created:** 2025-07-17T02:18:17.743Z
  3495. **Updated:** 2025-07-17T02:18:17.743Z
  3496. </file>
  3497. <file path=".vooster/tasks/T-007.txt">
  3498. # 공통 그리드 컴포넌트 활용 리스트 뷰 구현
  3499. **Task ID:** T-007
  3500. **Status:** BACKLOG
  3501. **Importance:** MUST
  3502. **Complexity:** 6/10
  3503. **Urgency:** 7/10
  3504. **Dependencies:** T-006
  3505. ## Description
  3506. # 설명
  3507. 공통 그리드 컴포넌트를 활용해 상태별 주문 리스트를 구현합니다.
  3508. # 구현 세부사항
  3509. 1. 공통 DataGrid 컴포넌트 import 및 props 바인딩
  3510. 2. 신규주문, 배송중, 배송완료 탭 또는 섹션별로 DataGrid 호출
  3511. 3. 컬럼 정의
  3512. - 신규주문: `influencerName`, `productName`, `amount`, `contact`, `email`, `status`, `requestDate`
  3513. - 배송중: `influencerName`, `item`, `manager`, `contact`, `email`, `status`, `requestDate`
  3514. - 배송완료: 캡틴과 협의한 컬럼 설정
  3515. 4. 스토어에서 상태별 데이터 전달 및 로딩/오류 처리
  3516. # 테스트 전략
  3517. - 각각의 그리드가 올바른 컬럼으로 렌더링되는지 테스트
  3518. - 데이터 바인딩 후 행(row) 개수 및 값 검증
  3519. - 로딩 상태 및 에러 메시지 표시 테스트
  3520. ---
  3521. **Created:** 2025-07-17T02:18:17.743Z
  3522. **Updated:** 2025-07-17T02:18:17.743Z
  3523. </file>
  3524. <file path=".vooster/tasks/T-008.txt">
  3525. # 대시보드 요약 정보 위젯/카드 구현
  3526. **Task ID:** T-008
  3527. **Status:** BACKLOG
  3528. **Importance:** SHOULD
  3529. **Complexity:** 4/10
  3530. **Urgency:** 6/10
  3531. **Dependencies:** T-007
  3532. ## Description
  3533. # 설명
  3534. 대시보드 상단에 상태별 주문 건수를 표시하는 요약 위젯을 구현합니다.
  3535. # 구현 세부사항
  3536. 1. Vue 컴포넌트(`SummaryCard`) 생성
  3537. 2. 스토어 또는 API에서 상태별 건수 계산(fetchSummaryCount API 또는 캐시 활용)
  3538. 3. 카드 레이아웃에 아이콘, 레이블, 건수 표시
  3539. 4. 클릭 시 해당 리스트 섹션으로 스크롤 또는 필터 토글 구현
  3540. # 테스트 전략
  3541. - 상태별 건수가 올바르게 계산되어 표시되는지 확인
  3542. - 카드 클릭 시 스크롤/필터링 기능 동작 검증
  3543. - 반응형에서 카드 레이아웃 이상 유무 테스트
  3544. ---
  3545. **Created:** 2025-07-17T02:18:17.743Z
  3546. **Updated:** 2025-07-17T02:18:17.743Z
  3547. </file>
  3548. <file path=".vooster/tasks/T-009.txt">
  3549. # 반응형 UI 및 접근성 검증
  3550. **Task ID:** T-009
  3551. **Status:** BACKLOG
  3552. **Importance:** SHOULD
  3553. **Complexity:** 4/10
  3554. **Urgency:** 5/10
  3555. **Dependencies:** T-007, T-008
  3556. ## Description
  3557. # 설명
  3558. 대시보드의 반응형 디자인 및 접근성(WCAG 2.1 AA) 준수를 검증 및 개선합니다.
  3559. # 구현 세부사항
  3560. 1. CSS 미디어 쿼리로 데스크탑, 태블릿, 모바일 레이아웃 조정
  3561. 2. Vuetify 또는 custom style로 접근성 속성(aria-label, tabindex) 추가
  3562. 3. 키보드 네비게이션 및 화면 리더 검증
  3563. # 테스트 전략
  3564. - Chrome DevTools 디바이스 모드에서 각 화면 크기 테스트
  3565. - axe-core 또는 Lighthouse 접근성 자동 검증
  3566. - 키보드만으로 네비게이션 테스트 및 스크린리더 읽기 확인
  3567. ---
  3568. **Created:** 2025-07-17T02:18:17.743Z
  3569. **Updated:** 2025-07-17T02:18:17.743Z
  3570. </file>
  3571. <file path=".vooster/tasks/T-010.txt">
  3572. # 제품 등록 기능 구현
  3573. **Task ID:** T-010
  3574. **Status:** BACKLOG
  3575. **Importance:** MUST
  3576. **Complexity:** 6/10
  3577. **Urgency:** 8/10
  3578. **Dependencies:** T-001
  3579. ## Description
  3580. ### 설명
  3581. 벤더사 전용 제품 등록 UI와 API를 구현합니다.
  3582. ### 구현 상세
  3583. 1. Authorization 미들웨어(T-001) 적용 및 JWT role 검증
  3584. 2. 프론트엔드(Vue3/Nuxt3) 등록 폼 컴포넌트 작성(제품명, 공급가, 판매가, 배송비, 소타이틀, 상세내용, 파일첨부, 상태, 노출상태, 업데이트 내역 필드)
  3585. 3. 파일 업로드 기능 구현(Axios + FormData, 확장자/용량 제한)
  3586. 4. 백엔드(CodeIgniter4) 컨트롤러 및 모델 생성 및 라우팅 설정(`POST /api/products`)
  3587. 5. DB 저장 로직 작성(MySQL(RDS) products 테이블, 업로드 파일 메타정보 저장)
  3588. ### 테스트 전략
  3589. - 유닛 테스트: 입력 필드 유효성 검증 로직 테스트
  3590. - 통합 테스트: API 요청 시 정상 저장 및 에러 응답 테스트
  3591. - E2E 테스트: 실제 파일 업로드 포함된 등록 흐름 테스트
  3592. ---
  3593. **Created:** 2025-07-17T07:44:43.699Z
  3594. **Updated:** 2025-07-17T07:44:43.699Z
  3595. </file>
  3596. <file path=".vooster/tasks/T-011.txt">
  3597. # 제품 수정 및 소프트 삭제 기능 구현
  3598. **Task ID:** T-011
  3599. **Status:** BACKLOG
  3600. **Importance:** MUST
  3601. **Complexity:** 6/10
  3602. **Urgency:** 7/10
  3603. **Dependencies:** T-010
  3604. ## Description
  3605. ### 설명
  3606. 벤더 전용 제품 수정 및 소프트 삭제 기능을 구현합니다.
  3607. ### 구현 상세
  3608. 1. 기존 제품 정보 조회 API(`GET /api/products/{id}`) 및 모델 fetch 로직 작성
  3609. 2. 수정 폼 컴포넌트 작성 및 기존값 바인딩
  3610. 3. 수정 API 구현(`PUT /api/products/{id}`), 업데이트 내역 필수 입력 로직 적용
  3611. 4. 파일 재첨부/삭제 처리 로직 구현
  3612. 5. 소프트 삭제 API 구현(`DELETE /api/products/{id}`), 노출상태를 비노출로 전환
  3613. ### 테스트 전략
  3614. - 유닛 테스트: 필드별 검증 및 업데이트 내역 필수 체크 테스트
  3615. - 통합 테스트: 수정 및 삭제 API 정상 동작 테스트
  3616. - E2E 테스트: UI상에서 수정/삭제 플로우 시나리오 검증
  3617. ---
  3618. **Created:** 2025-07-17T07:44:43.699Z
  3619. **Updated:** 2025-07-17T07:44:43.699Z
  3620. </file>
  3621. <file path=".vooster/tasks/T-012.txt">
  3622. # 제품 상태·노출 변경 및 인플루언서 노출 제어
  3623. **Task ID:** T-012
  3624. **Status:** BACKLOG
  3625. **Importance:** MUST
  3626. **Complexity:** 5/10
  3627. **Urgency:** 8/10
  3628. **Dependencies:** T-011
  3629. ## Description
  3630. ### 설명
  3631. 제품의 상태(판매중/품절) 및 노출(노출/비노출) 변경과 인플루언서 포털에서의 노출 제어를 구현합니다.
  3632. ### 구현 상세
  3633. 1. 상태·노출 변경 UI(select) 컴포넌트 작성
  3634. 2. API 구현(`PATCH /api/products/{id}/status`), 노출 변경 로직 반영
  3635. 3. 인플루언서 포털 API 조회 시 비노출 상품 필터링(BFF Node.js, MySQL)
  3636. 4. 상태 변경 후 UI 실시간 리로드/갱신 처리
  3637. ### 테스트 전략
  3638. - 단위 테스트: 상태 변경 로직 및 필터링 로직 검증
  3639. - 통합 테스트: API 호출 후 상태·노출 반영 및 필터링 확인
  3640. - E2E 테스트: 인플루언서 포털 상품 리스트에 비노출 상품 미노출 확인
  3641. ---
  3642. **Created:** 2025-07-17T07:44:43.699Z
  3643. **Updated:** 2025-07-17T07:44:43.699Z
  3644. </file>
  3645. <file path=".vooster/tasks/T-013.txt">
  3646. # 제품 변경 이력 기록 기능 구현
  3647. **Task ID:** T-013
  3648. **Status:** BACKLOG
  3649. **Importance:** SHOULD
  3650. **Complexity:** 4/10
  3651. **Urgency:** 5/10
  3652. **Dependencies:** T-011
  3653. ## Description
  3654. ### 설명
  3655. 제품 정보 수정 및 상태·노출 변경 시 변경 이력을 기록하는 기능을 구현합니다.
  3656. ### 구현 상세
  3657. 1. 변경 이력 테이블(product_history) 마이그레이션 스크립트 작성
  3658. 2. 수정/상태 변경 API 후킹 지점에 이력 저장 로직 삽입(Who, When, What)
  3659. 3. 서비스 계층에 이력 저장 메서드 구현
  3660. 4. 이력 조회 UI/이력 리스트 컴포넌트 목업 작성
  3661. ### 테스트 전략
  3662. - 유닛 테스트: 이력 저장 메서드 동작 테스트
  3663. - 통합 테스트: 수정 API 호출 시 history 레코드 생성 확인
  3664. - DB 테스트: 마이그레이션 및 데이터 적재 확인
  3665. ---
  3666. **Created:** 2025-07-17T07:44:43.699Z
  3667. **Updated:** 2025-07-17T07:44:43.699Z
  3668. </file>
  3669. <file path=".vooster/tasks/T-014.txt">
  3670. # 상태·노출 변경 알림 기능 연동
  3671. **Task ID:** T-014
  3672. **Status:** BACKLOG
  3673. **Importance:** SHOULD
  3674. **Complexity:** 5/10
  3675. **Urgency:** 6/10
  3676. **Dependencies:** T-012
  3677. ## Description
  3678. ### 설명
  3679. 제품 상태 또는 노출 변경 시 관계자에게 웹/이메일/실시간 알림을 전송하는 기능을 연동합니다.
  3680. ### 구현 상세
  3681. 1. 알림센터 연동 모듈 구성(웹소켓, 이메일 서비스, 내부 알림센터 API)
  3682. 2. 상태·노출 변경 이벤트 발생 시 알림 트리거 로직 작성(구독자 분기: 벤더, 인플루언서)
  3683. 3. 알림 API 호출 또는 웹소켓 메시지 전송 구현
  3684. 4. 프론트엔드 알림 컴포넌트와 연동해 실시간 표시 처리
  3685. ### 테스트 전략
  3686. - 단위 테스트: 이벤트 핸들러 및 알림 모듈 동작 검증
  3687. - 통합 테스트: 알림센터/이메일 모의(Mock) 연동 테스트
  3688. - E2E 테스트: 상태 변경 시 웹소켓 알림 표시 확인
  3689. ---
  3690. **Created:** 2025-07-17T07:44:43.699Z
  3691. **Updated:** 2025-07-17T07:44:43.699Z
  3692. </file>
  3693. <file path=".vooster/tasks/T-015.txt">
  3694. # 벤더사 검색 및 탐색 기능 구현
  3695. **Task ID:** T-015
  3696. **Status:** IN_PROGRESS
  3697. **Importance:** MUST
  3698. **Complexity:** 5/10
  3699. **Urgency:** 8/10
  3700. **Dependencies:** None
  3701. ## Description
  3702. #### 설명
  3703. 인플루언서가 벤더사를 조건(이름, 카테고리 등)으로 검색하고, 프로필/정보를 확인할 수 있는 리스트 뷰 및 검색 필터 기능을 구현합니다.
  3704. #### 구현 세부사항
  3705. 1. API 설계 및 연동: GET /vendors?name=&category=&page=&size= 엔드포인트 구현 및 Axios 연동
  3706. 2. 검색/필터 UI: Vue3 Composition API와 Vuetify의 v-text-field, v-select, v-data-table 컴포넌트 사용하여 조건 입력 및 결과 리스트 렌더링
  3707. 3. 페이징: 서버 응답에서 totalCount, currentPage, pageSize 반환 후 UI에 v-pagination 적용
  3708. 4. 상세 조회: 리스트 아이템 클릭 시 라우터 네비게이션으로 /vendors/:id 페이지 이동, GET /vendors/{id} 호출하여 데이터 표시
  3709. 5. 상태 관리: Pinia store modules.vendors에 검색조건, 결과, 로딩/에러 상태 관리
  3710. #### 테스트 전략
  3711. - 단위 테스트: Vitest와 Axios mock adapter를 활용하여 API 호출 및 상태 관리 로직 검증
  3712. - E2E 테스트: Cypress로 검색 필드에 조건 입력 후 결과 리스트 및 페이징 동작 검증
  3713. - UI 테스트: Vuetify 컴포넌트 렌더링 및 사용자 인터랙션(검색, 페이지 이동) 테스트
  3714. ---
  3715. **Created:** 2025-07-21T06:24:11.558Z
  3716. **Updated:** 2025-07-21T06:41:11.982Z
  3717. </file>
  3718. <file path=".vooster/tasks/T-016.txt">
  3719. # 벤더사-인플루언서 승인 매핑용 중계 테이블 및 API 설계/구현
  3720. **Task ID:** T-016
  3721. **Status:** BACKLOG
  3722. **Importance:** MUST
  3723. **Complexity:** 7/10
  3724. **Urgency:** 8/10
  3725. **Dependencies:** None
  3726. ## Description
  3727. # 설명
  3728. - vendor_influencer_mapping 중계 테이블 및 approval_status 컬럼 설계 및 관련 API 구현
  3729. ## 구현 단계
  3730. 1. MySQL Migration 생성: vendor_influencer_mapping 테이블 정의(id, vendor_id, influencer_id, approval_status enum(PENDING,APPROVED,REJECTED), created_at, updated_at)
  3731. 2. CodeIgniter4 Model 및 Migration 클래스 작성
  3732. 3. Node.js BFF(Express)에서 RESTful 라우터 추가: POST /api/approval/request, POST /api/approval/handle, GET /api/approval/status
  3733. 4. Service 레이어 구현: 요청 생성, 승인/거부 상태 변경, 상태 조회 로직 작성
  3734. 5. Controller 계층 JWT 인증 및 입력 유효성 검증, 예외 처리 로직 추가
  3735. 6. OpenAPI 스펙 문서화 및 API 문서 업데이트
  3736. ## 테스트 전략
  3737. - Migration 테스트: 테이블 생성 및 스키마 검증
  3738. - 단위 테스트: Model CRUD 및 Service 상태 전이 시나리오 검증
  3739. - 통합 테스트: API 호출 후 DB 반영 확인, 중복 요청 및 예외 케이스 검증
  3740. ---
  3741. **Created:** 2025-07-22T01:48:43.838Z
  3742. **Updated:** 2025-07-22T01:48:43.838Z
  3743. </file>
  3744. <file path=".vooster/tasks/T-017.txt">
  3745. # 인플루언서 벤더사 검색 및 승인요청 UI/로직 구현
  3746. **Task ID:** T-017
  3747. **Status:** BACKLOG
  3748. **Importance:** MUST
  3749. **Complexity:** 6/10
  3750. **Urgency:** 8/10
  3751. **Dependencies:** T-016
  3752. ## Description
  3753. # 설명
  3754. - pages/view/vendor/index.vue 또는 기존 그리드 페이지를 활용해 벤더사 목록 조회 및 승인요청 기능 구현
  3755. ## 구현 단계
  3756. 1. pages/view/vendor/index.vue 컴포넌트 생성/수정: 공통 그리드 컴포넌트 활용
  3757. 2. Axios GET /api/vendors API 연동해 벤더사 목록 불러오기
  3758. 3. 그리드 마지막 컬럼에 요청 상태(대기, 승인 완료) 표시 및 승인요청 버튼 배치
  3759. 4. 승인요청 버튼 클릭 이벤트: axios.post('/api/approval/request',{vendorId}) 호출 후 버튼 비활성화
  3760. 5. 요청 완료 또는 실패 시 toast/confirmDialog 컴포넌트로 피드백 제공
  3761. 6. 응답에 따라 그리드 데이터 갱신
  3762. ## 테스트 전략
  3763. - 단위 테스트: 컴포넌트 렌더링, 버튼 상태 변경, API 호출 모킹
  3764. - E2E 테스트: 실제 API 응답 시나리오(성공/오류) 시 그리드 업데이트 및 토스트 표시 확인
  3765. ---
  3766. **Created:** 2025-07-22T01:48:43.838Z
  3767. **Updated:** 2025-07-22T01:48:43.838Z
  3768. </file>
  3769. <file path=".vooster/tasks/T-018.txt">
  3770. # 벤더사 인플루언서 승인요청 리스트/승인처리 UI/로직 구현
  3771. **Task ID:** T-018
  3772. **Status:** BACKLOG
  3773. **Importance:** MUST
  3774. **Complexity:** 6/10
  3775. **Urgency:** 8/10
  3776. **Dependencies:** T-016
  3777. ## Description
  3778. # 설명
  3779. - pages/view/vendor/dashboard/index.vue 또는 공통 그리드 페이지를 활용해 인플루언서 승인 요청 관리 기능 구현
  3780. ## 구현 단계
  3781. 1. pages/view/vendor/dashboard/index.vue 컴포넌트 생성/수정: 공통 그리드 활용
  3782. 2. Axios GET /api/approval/requests?vendorId API 연동해 요청 리스트 조회
  3783. 3. 그리드 각 행에 승인/거부 버튼 추가
  3784. 4. 승인/거부 클릭 시 confirmDialog 호출 후 axios.post('/api/approval/handle',{mappingId,action}) 실행
  3785. 5. 요청 성공 시 그리드 해당 행 상태 업데이트 및 toast 피드백 제공
  3786. 6. 오류 발생 시 오류 토스트 표시 및 롤백 처리
  3787. ## 테스트 전략
  3788. - 단위 테스트: 그리드 렌더링, 버튼 클릭 후 confirmDialog, API 모킹 테스트
  3789. - 통합 테스트: 승인/거부 시나리오 전반 검증(상태 변경, UI 반영, 피드백)
  3790. ---
  3791. **Created:** 2025-07-22T01:48:43.838Z
  3792. **Updated:** 2025-07-22T01:48:43.838Z
  3793. </file>
  3794. <file path=".vooster/tasks/T-019.txt">
  3795. # 인플루언서 승인 상태에 따른 벤더사 제품 접근 제어
  3796. **Task ID:** T-019
  3797. **Status:** BACKLOG
  3798. **Importance:** MUST
  3799. **Complexity:** 7/10
  3800. **Urgency:** 7/10
  3801. **Dependencies:** T-016
  3802. ## Description
  3803. # 설명
  3804. - 승인된 인플루언서만 벤더사 제품 페이지에 접근하도록 제어 구현
  3805. ## 구현 단계
  3806. 1. Nuxt3 미들웨어 또는 라우트 가드 설정: /vendor/:id/products 접근 시 실행
  3807. 2. composables/useValid.js 또는 stores/auth.js 패턴 참고해 GET /api/approval/status?vendorId API 호출
  3808. 3. approval_status가 APPROVED가 아니면 "승인 필요" 메시지 또는 승인 요청 페이지로 리다이렉트
  3809. 4. APPROVED면 기존 벤더사 제품 리스트 컴포넌트 렌더링
  3810. 5. UI 컴포넌트 조건부 렌더링으로 접근 제어
  3811. ## 테스트 전략
  3812. - 유닛 테스트: composable 및 미들웨어 로직 검증
  3813. - 통합 테스트: 승인 전/후 상태에 따른 접근 결과 및 메시지 확인
  3814. ---
  3815. **Created:** 2025-07-22T01:48:43.838Z
  3816. **Updated:** 2025-07-22T01:48:43.838Z
  3817. </file>
  3818. <file path=".vooster/tasks/T-020.txt">
  3819. # 승인요청 및 처리 내역/상태 조회 기능 추가
  3820. **Task ID:** T-020
  3821. **Status:** BACKLOG
  3822. **Importance:** SHOULD
  3823. **Complexity:** 5/10
  3824. **Urgency:** 6/10
  3825. **Dependencies:** T-016, T-017, T-018
  3826. ## Description
  3827. # 설명
  3828. - 인플루언서 마이페이지 및 벤더사 관리페이지에 승인 이력 조회 탭 추가
  3829. ## 구현 단계
  3830. 1. 인플루언서 마이페이지에 "나의 승인요청" 탭 추가, 공통 그리드 컴포넌트 활용
  3831. 2. Axios GET /api/approval/requests?userId API 연동해 요청 이력 조회(대기/완료/거부 필터링)
  3832. 3. 벤더사 관리페이지에도 "승인 처리 이력" 탭 추가, 동일 그리드 활용
  3833. 4. 상태별 색상 표기 및 정렬 기능 추가
  3834. 5. API 호출 실패 시 오류 메시지 처리
  3835. ## 테스트 전략
  3836. - 단위 테스트: 탭 전환, API 응답 모킹, 그리드 데이터 렌더링 검증
  3837. - E2E 테스트: 필터링, 정렬, 페이지 내비게이션 검증
  3838. ---
  3839. **Created:** 2025-07-22T01:48:43.838Z
  3840. **Updated:** 2025-07-22T01:48:43.838Z
  3841. </file>
  3842. <file path=".vooster/tasks/T-021.txt">
  3843. # 승인요청, 승인처리 시 실시간 피드백 및 알림 처리
  3844. **Task ID:** T-021
  3845. **Status:** BACKLOG
  3846. **Importance:** SHOULD
  3847. **Complexity:** 4/10
  3848. **Urgency:** 5/10
  3849. **Dependencies:** T-017, T-018
  3850. ## Description
  3851. # 설명
  3852. - 승인요청 및 승인처리 시 toast/confirmDialog 외 웹소켓 기반 실시간 알림 연동 보강
  3853. ## 구현 단계
  3854. 1. 공통 toast 및 confirmDialog 컴포넌트 재사용해 기본 피드백 구현 확인
  3855. 2. 웹소켓(socket.io) 클라이언트 설정: Nuxt3 plugin에 등록
  3856. 3. 서버에서 approvalStatusChanged 이벤트 발행, 클라이언트 구독 로직 작성
  3857. 4. 알림센터 컴포넌트에 수신된 이벤트 표시(UI 배지, 목록 추가)
  3858. 5. 필요 시 푸시 알림 센터 API 연동
  3859. ## 테스트 전략
  3860. - 유닛 테스트: socket 연결, 이벤트 핸들러 로직 검증
  3861. - 통합 테스트: 서버 이벤트 시뮬레이션, 클라이언트 알림 수신 및 UI 업데이트 확인
  3862. ---
  3863. **Created:** 2025-07-22T01:48:43.838Z
  3864. **Updated:** 2025-07-22T01:48:43.838Z
  3865. </file>
  3866. <file path=".vooster/project.json">
  3867. {
  3868. "uid": "WOM0",
  3869. "name": "인플루언서와 벤더사간에 수발주를 원할하게 하는 시스템을 구축하려고 합니다.",
  3870. "description": "인플루언서와 벤더사간에 수발주를 원할하게 하는 시스템을 구축하려고 합니다.",
  3871. "connectedAt": "2025-07-17T02:08:34.585Z"
  3872. }
  3873. </file>
  3874. <file path=".vooster/rules.json">
  3875. {
  3876. "rules": [
  3877. {
  3878. "type": "prd",
  3879. "content": "# 제품 요구사항 문서 (PRD)\n\n## 1. 개요\n인플루언서와 벤더사가 문서 교환 없이 웹 기반으로 수·발주 및 정산을 수행할 수 있는 통합 플랫폼 구축. 배송·정산·고객응대 전 과정을 자동화해 거래 속도와 신뢰도를 향상시킨다.\n\n## 2. 문제 정의\n- 엑셀·PDF 등 오프라인 문서 교환으로 인한 오류·지연\n- 송장번호 수기 입력, 재고·배송 상태 불일치\n- 계약·정산 내역 확인이 어렵고 가시성 부족\n- 인플루언서 파트너 탐색 과정의 비효율\n\n## 3. 목표 및 목적\n- 1차 목표: 발주·승인·송장·정산 전 프로세스 웹 자동화\n- 2차 목표: 파트너 매칭, 서브계정 관리, OCR 기반 송장 인식\n- 성공지표\n - 발주 승인 평균 소요시간 50% 단축\n - 송장 입력 오류율 90% ↓\n - 월간 활성 인플루언서 수 1,000명\n - 거래액 월 10억 원\n\n## 4. 타깃 사용자\n### 주요 사용자\n- 인플루언서: SNS 영향력 보유, 공동구매 운영, 재고·배송 부담 최소화 희망\n- 벤더사: 상품 공급, 재고·배송·정산 자동화 필요\n### 부차 사용자\n- 통합 벤더사/유통업체, CS 담당자, 회계팀\n\n## 5. 사용자 스토리\n- “인플루언서로서 벤더사 제품을 조회·발주해 판매 준비를 간편히 하고 싶다.”\n- “벤더사 담당자로서 인플루언서 요청을 클릭 한 번에 승인·거절하고 싶다.”\n- “CS 담당자로서 주문 상태를 실시간 파악해 문의에 즉시 대응하고 싶다.”\n- “벤더사 마스터로서 서브계정을 생성해 팀별 권한을 차등 부여하고 싶다.”\n\n## 6. 기능 요구사항\n### 핵심 기능\n1. 벤더사 포털 \n - 상품 등록/수정/상태관리(배송중, 품절 등) \n Acceptance: 상품 등록 시 필수 필드 검증, 상태 변경시 실시간 알림 \n - 주문 관리: 인플루언서 수주 승인/거절, 일괄처리 \n - 배송 관리 \n - 송장번호 엑셀 업로드·다운로드 \n - 송장 사진 OCR → 자동 입력 \n - 정산 관리: 월간 계약·정산 내역 확인, CSV 다운로드 \n - 인플루언서 승인 및 제안: 가입 요청 승인 및 파트너 제안 발송 \n2. 인플루언서 포털 \n - SNS 간편 로그인(Google, Kakao, Naver) \n - 벤더사 가입 요청 및 제안 수락 \n - 연결된 벤더사 상품 리스트 조회 \n - 상품 수주 요청, 송장번호 엑셀 다운로드 \n3. 매칭 시스템 \n - 벤더사 조건(카테고리·팔로워 수) 기반 추천 알고리즘 \n4. 알림 센터 \n - 이메일·푸시·웹 소켓 알림: 주문 상태, 승인 결과, 정산 완료 \n### 보조 기능\n- 벤더사 서브계정 관리(역할·권한 설정)\n- 고객센터 게시판(FAQ, 1:1 문의)\n- 대시보드(매출, 주문, 정산 현황)\n\n## 7. 비기능 요구사항\n- 성능: 평균 응답 300ms 이하, 동시 5,000사용자\n- 보안: JWT 인증, OAuth2 SNS 로그인, HTTPS, 데이터 암호화\n- 사용성: 반응형 UI, 접근성 WCAG 2.1 AA\n- 확장성: 모듈화된 Micro Frontend, RESTful API\n- 호환성: 최신 크롬·사파리·엣지, 모바일 브라우저\n\n## 8. 기술 고려사항\n- 프론트엔드: Vue3 + Composition API, Nuxt3, Vuetify, TypeScript, Axios\n- 백엔드: CodeIgniter4 + Node.js BFF\n- DB: MySQL(RDS), Redis 캐시\n- 배포: Docker, K8s, GitHub Actions CI/CD\n- OCR: Google Cloud Vision API\n- 통합: 택배사 API(송장 추적), 회계 시스템 ERP 연동\n- 로깅·모니터링: ELK, Grafana\n\n## 9. 성공 지표(KPI)\n- DAU / MAU, 유입·활성률\n- 주문 승인 건수, 배송 완료율\n- 거래 총액, 재구매율\n- 서버 오류율 <1%, 가용성 99.9%\n\n## 10. 일정 및 마일스톤\n- Phase 1 (M+2): 로그인, 상품·주문·배송 기본, MVP 런칭\n- Phase 2 (M+4): 정산 모듈, 매칭 시스템, 알림 센터\n- Phase 3 (M+6): OCR, 서브계정, 대시보드, 모바일 최적화\n- Phase 4 (M+9): AI 수요 예측, 글로벌 배송 연동\n\n## 11. 위험 및 대응\n- 데이터 정확도: OCR 오류 → 수동 검증 UI 제공\n- 사용 미정착: 온보딩 튜토리얼, FAQ 운영\n- 벤더사 API 변경: 버전 관리, 어댑터 패턴\n- 개인정보 유출: 정기 보안 점검, 침투 테스트\n\n## 12. 향후 고려사항\n- 인플루언서 커미션 자동 분배, 블록체인 정산\n- 다국어 지원, 환율 자동 적용\n- 모바일 앱(iOS/Android) 출시\n- AI 기반 악성 주문 탐지, 인플루언서 등급제 도입",
  3880. "writedAt": "2025-07-21T06:38:01.005Z"
  3881. },
  3882. {
  3883. "type": "architecture",
  3884. "content": "# Technical Requirements Document (TRD)\n\n## 1. Executive Technical Summary\n- **프로젝트 개요** \n 인플루언서와 벤더사 간 수·발주, 배송, 정산, 알림을 웹 기반으로 자동화하는 통합 플랫폼. 오프라인 문서 교환 제거, 실시간 상태 관리, 파트너 매칭 기능 제공.\n- **핵심 기술 스택** \n Frontend: Vue 3 + Nuxt3, Vuetify, TypeScript \n Backend: CodeIgniter4 REST API + Node.js BFF \n DB: MySQL(RDS), Redis 캐시 \n 배포: Docker, Kubernetes, GitHub Actions CI/CD \n OCR: Google Cloud Vision API \n 모니터링: ELK 스택, Grafana \n- **주요 기술 목표** \n 평균 응답시간 300ms 이하, 동시 5,000 사용자 처리, 가용성 99.9%, 서버 오류율 <1%\n- **주요 가정** \n - 초기 규모: 월 거래액 10억, DAU 1,000+ \n - 클라우드 인프라(AWS/GCP) 사용 \n - 외부 택배사·ERP API 연동 가능성 상시 고려 \n\n## 2. Tech Stack\n\n| Category | Technology / Library | Reasoning (선택 이유) |\n| ------------------ | ------------------------------ | ----------------------------------------------------------------- |\n| Frontend Framework | Vue 3 + Nuxt3 | SSR/SSG 지원으로 초기 로딩 최적화, SEO 강화 |\n| UI Library | Vuetify | 머티리얼 디자인 기반, 빠른 UI 컴포넌트 구성 |\n| Language | TypeScript | 정적 타입 검사로 코드 안정성 및 가독성 확보 |\n| State Management | Pinia | Composition API 친화적, 러닝 커브 완만 |\n| HTTP Client | Axios | Promise 기반, 요청/응답 인터셉터 활용 용이 |\n| Backend Framework | CodeIgniter 4 | 경량 PHP 프레임워크, 빠른 개발 및 유지보수 |\n| API Layer (BFF) | Node.js + Express | 프론트엔드 맞춤형 API 어댑터, 비즈니스 로직 경량 분리 |\n| Database | MySQL (RDS) | 관계형 데이터 안정성·확장성, RDS 관리 편의성 |\n| Cache | Redis | 세션 관리, 빈번한 조회 데이터 캐싱으로 응답 속도 개선 |\n| Containerization | Docker | 환경 일관성 확보, 배포 자동화 |\n| Orchestration | Kubernetes | 자동 스케일링, 자가 복구, 클러스터 관리 |\n| CI/CD | GitHub Actions | 코드 푸시 시 빌드·테스트·배포 자동화 |\n| OCR | Google Cloud Vision API | 높은 정확도, 이미지→텍스트 자동 변환 |\n| Monitoring | ELK (Elasticsearch, Logstash, Kibana), Grafana | 로그 집계·시각화, 메트릭 모니터링 |\n| Authentication | JWT, OAuth2 (Google/Kakao/Naver) | 보안성 높은 인증, SNS 간편 로그인 지원 |\n| Real-time | WebSocket (Socket.IO) | 실시간 알림(주문 상태, 승인 결과) |\n| Integration | Courier API, ERP REST API | 택배사 송장 조회, 회계 시스템 자동 연동 |\n\n## 3. System Architecture Design\n\n### Top-Level building blocks\n- Frontend (Nuxt3): SSR 페이지, 컴포넌트, 인증/알림 UI \n- BFF (Node.js + Express): Frontend 전용 경량 API 어댑터, 실시간 채널 관리 \n- Backend API (CI4): 핵심 비즈니스 로직, DB CRUD, 권한 관리 \n- Database & Cache: MySQL RDS, Redis 캐시 서버 \n- External Integrations: Google Vision OCR, 택배사 API, ERP API \n- Monitoring & Logging: ELK 스택, Grafana 알림\n\n### Top-Level Component Interaction Diagram\n```mermaid\ngraph TD\n F[Nuxt3 Frontend] --> BFF(BFF: Node.js)\n BFF --> API[Backend API: CI4]\n API --> DB[MySQL(RDS)]\n API --> Cache[Redis]\n API --> OCR[Google Vision API]\n API --> Courier[택배사 API]\n API --> ERP[ERP API]\n Monitoring --> API\n Monitoring --> BFF\n```\n- Nuxt3 프론트엔드가 BFF로 요청 전달 \n- BFF는 세션/인증 관리 후 CI4 API 호출 \n- CI4 API는 MySQL/Redis, 외부 OCR·택배·ERP 연동 \n- ELK·Grafana로 전체 서비스 상태 모니터링 \n\n### Code Organization & Convention\n**Domain-Driven Organization Strategy** \n- **도메인 분리**: 사용자, 주문, 배송, 정산, 매칭 등 비즈니스 도메인별 모듈 \n- **레이어 아키텍처**: Presentation, Application, Domain, Infrastructure \n- **기능 기반 모듈화**: 각 도메인 기능을 독립 패키지로 관리 \n- **공유 컴포넌트**: Utils, Types, 공통 미들웨어, 인터셉터\n\n**Universal File & Folder Structure**\n```\n/\n├── app.vue\n├── assets\n│ ├── font\n│ │ ├── Inter-Medium.woff\n│ │ ├── NotoSansKR-Black.otf\n│ │ ├── NotoSansKR-Black.woff\n│ │ ├── NotoSansKR-Black.woff2\n│ │ ├── NotoSansKR-Bold.otf\n│ │ ├── NotoSansKR-Bold.woff\n│ │ ├── NotoSansKR-Bold.woff2\n│ │ ├── NotoSansKR-DemiLight.otf\n│ │ ├── NotoSansKR-DemiLight.woff\n│ │ ├── NotoSansKR-DemiLight.woff2\n│ │ ├── NotoSansKR-Light.otf\n│ │ ├── NotoSansKR-Light.woff\n│ │ ├── NotoSansKR-Light.woff2\n│ │ ├── NotoSansKR-Medium.otf\n│ │ ├── NotoSansKR-Medium.woff\n│ │ ├── NotoSansKR-Medium.woff2\n│ │ ├── NotoSansKR-Regular.otf\n│ │ ├── NotoSansKR-Regular.woff\n│ │ ├── NotoSansKR-Regular.woff2\n│ │ ├── NotoSansKR-Regular(1).woff\n│ │ ├── NotoSansKR-Thin.otf\n│ │ ├── NotoSansKR-Thin.woff\n│ │ └── NotoSansKR-Thin.woff2\n│ ├── img\n│ │ ├── bg_login.svg\n│ │ ├── bg_otp_reg.png\n│ │ ├── bg_popup.svg\n│ │ ├── bg_tab_off.svg\n│ │ ├── bg_tab_on.svg\n│ │ ├── bg_tooltip.svg\n│ │ ├── bg_tooltip2.svg\n│ │ ├── bg_tooltip3.svg\n│ │ ├── bg_tooltip4.svg\n│ │ ├── btn_app_store.svg\n│ │ ├── btn_goolge_play.svg\n│ │ ├── btn.png\n│ │ ├── caution_bg.jpg\n│ │ ├── db_set_list01.svg\n│ │ ├── db_set_list02.svg\n│ │ ├── db_set_list03.svg\n│ │ ├── head_flip_btn.svg\n│ │ ├── ic_add.svg\n│ │ ├── ic_allview.svg\n│ │ ├── ic_arrow_right_chv.svg\n│ │ ├── ic_avg01.svg\n│ │ ├── ic_avg02.svg\n│ │ ├── ic_avg03.svg\n│ │ ├── ic_avg04.svg\n│ │ ├── ic_card_nodata.svg\n│ │ ├── ic_card_off.svg\n│ │ ├── ic_card_on.svg\n│ │ ├── ic_chv_arrow.svg\n│ │ ├── ic_chv.svg\n│ │ ├── ic_close.svg\n│ │ ├── ic_drop_down_on.svg\n│ │ ├── ic_drop_down.svg\n│ │ ├── ic_ds.svg\n│ │ ├── ic_end_close_cl.svg\n│ │ ├── ic_end_close_x.svg\n│ │ ├── ic_end_close.png\n│ │ ├── ic_end_close.svg\n│ │ ├── ic_end_red.svg\n│ │ ├── ic_equip01.svg\n│ │ ├── ic_equip02.svg\n│ │ ├── ic_equip03.svg\n│ │ ├── ic_equip04.svg\n│ │ ├── ic_excel_green.svg\n│ │ ├── ic_excel.svg\n│ │ ├── ic_gear.svg\n│ │ ├── ic_google.svg\n│ │ ├── ic_grid_box.png\n│ │ ├── ic_home_arrow.svg\n│ │ ├── ic_info.svg\n│ │ ├── ic_issue_flag.svg\n│ │ ├── ic_kakao.svg\n│ │ ├── ic_list_off.svg\n│ │ ├── ic_list_on.svg\n│ │ ├── ic_map_card.svg\n│ │ ├── ic_map_pin.svg\n│ │ ├── ic_mapt_chv.svg\n│ │ ├── ic_more_btn.svg\n│ │ ├── ic_more_plust_gray.svg\n│ │ ├── ic_naver.svg\n│ │ ├── ic_no_img.svg\n│ │ ├── ic_no_tree.svg\n│ │ ├── ic_preview_nw.svg\n│ │ ├── ic_radio_off.svg\n│ │ ├── ic_radio_on.svg\n│ │ ├── ic_sch_nw.svg\n│ │ ├── ic_sts.svg\n│ │ ├── ic_tab01.svg\n│ │ ├── ic_tab02.svg\n│ │ ├── ic_tab03.svg\n│ │ ├── ic_tab04.svg\n│ │ ├── ic_tack_off.svg\n│ │ ├── ic_tack_on.svg\n│ │ ├── ic_tenant_small_white.svg\n│ │ ├── ic_tenant_small.svg\n│ │ ├── ic_tenant01.svg\n│ │ ├── ic_tenant02.svg\n│ │ ├── ic_tenant03.svg\n│ │ ├── ic_tenant04.svg\n│ │ ├── ic_wifi_dis.svg\n│ │ ├── ic_wifi.svg\n│ │ ├── ic_x_btn.svg\n│ │ ├── ic_x_btn2.svg\n│ │ ├── ic_xcircle.svg\n│ │ ├── ico_alarm_blue.svg\n│ │ ├── ico_alarm_gray.svg\n│ │ ├── ico_alarm_green.svg\n│ │ ├── ico_alarm_red.svg\n│ │ ├── ico_alarm1.svg\n│ │ ├── ico_alarm2.svg\n│ │ ├── ico_alarm3.svg\n│ │ ├── ico_alarm4.svg\n│ │ ├── ico_all_pop.svg\n│ │ ├── ico_arrow_next.svg\n│ │ ├── ico_arrow_prev.svg\n│ │ ├── ico_backup1.svg\n│ │ ├── ico_backup2.svg\n│ │ ├── ico_backup3.svg\n│ │ ├── ico_backup4.svg\n│ │ ├── ico_ban.svg\n│ │ ├── ico_bar.svg\n│ │ ├── ico_black_pin.svg\n│ │ ├── ico_blue_pin.svg\n│ │ ├── ico_btn1.svg\n│ │ ├── ico_btn2.svg\n│ │ ├── ico_btn3.svg\n│ │ ├── ico_cal_dis.svg\n│ │ ├── ico_cal.svg\n│ │ ├── ico_calendar.svg\n│ │ ├── ico_cancel_disabled.svg\n│ │ ├── ico_cancel.svg\n│ │ ├── ico_cate.svg\n│ │ ├── ico_certify_n.svg\n│ │ ├── ico_certify_y.svg\n│ │ ├── ico_certify_y2.svg\n│ │ ├── ico_certify_y3.svg\n│ │ ├── ico_check_indeterminate.svg\n│ │ ├── ico_chk_circle_disabled.svg\n│ │ ├── ico_chk_circle.svg\n│ │ ├── ico_chk_off.svg\n│ │ ├── ico_chk_off2.svg\n│ │ ├── ico_chk_on.svg\n│ │ ├── ico_chk.svg\n│ │ ├── ico_close_gray.svg\n│ │ ├── ico_close.svg\n│ │ ├── ico_core_alarm1.svg\n│ │ ├── ico_core_alarm2.svg\n│ │ ├── ico_date_pic.svg\n│ │ ├── ico_del_disabled.svg\n│ │ ├── ico_del_disabled2.svg\n│ │ ├── ico_del.svg\n│ │ ├── ico_del2.svg\n│ │ ├── ico_download.svg\n│ │ ├── ico_end.svg\n│ │ ├── ico_equip.svg\n│ │ ├── ico_eraser.svg\n│ │ ├── ico_eraser2.svg\n│ │ ├── ico_error.svg\n│ │ ├── ico_event_pop.svg\n│ │ ├── ico_event_view_black.png\n│ │ ├── ico_event_view_black.svg\n│ │ ├── ico_event_view_down.svg\n│ │ ├── ico_event_view.svg\n│ │ ├── ico_excel_d.svg\n│ │ ├── ico_excel.svg\n│ │ ├── ico_excel2.svg\n│ │ ├── ico_eye.svg\n│ │ ├── ico_eye2.svg\n│ │ ├── ico_gray_pin.svg\n│ │ ├── ico_grid_sort.svg\n│ │ ├── ico_grid_sort2.svg\n│ │ ├── ico_id_off.svg\n│ │ ├── ico_id_on.svg\n│ │ ├── ico_info.svg\n│ │ ├── ico_lang_english.svg\n│ │ ├── ico_lang_korea.svg\n│ │ ├── ico_lang_korea2.svg\n│ │ ├── ico_link.svg\n│ │ ├── ico_list_white.svg\n│ │ ├── ico_list.svg\n│ │ ├── ico_location_arr.svg\n│ │ ├── ico_location_home.svg\n│ │ ├── ico_logo.svg\n│ │ ├── ico_logout.svg\n│ │ ├── ico_map.svg\n│ │ ├── ico_menu_arr.svg\n│ │ ├── ico_menu_arr2.svg\n│ │ ├── ico_menu_minus.svg\n│ │ ├── ico_menu_nodata.svg\n│ │ ├── ico_menu_plus.svg\n│ │ ├── ico_menu.svg\n│ │ ├── ico_minus.svg\n│ │ ├── ico_mod_disabled.svg\n│ │ ├── ico_mod.svg\n│ │ ├── ico_mod2.svg\n│ │ ├── ico_mode_dark.svg\n│ │ ├── ico_mode_white.svg\n│ │ ├── ico_mode_white2.svg\n│ │ ├── ico_ne_add.svg\n│ │ ├── ico_ne_del_d.svg\n│ │ ├── ico_ne_del.svg\n│ │ ├── ico_no_data_nw.svg\n│ │ ├── ico_no_data.svg\n│ │ ├── ico_no_data2.svg\n│ │ ├── ico_no_table_dt.svg\n│ │ ├── ico_not_excel.svg\n│ │ ├── ico_otp_step1.svg\n│ │ ├── ico_otp_step2.svg\n│ │ ├── ico_otp_step3.svg\n│ │ ├── ico_otp_step4.svg\n│ │ ├── ico_otp_step5.svg\n│ │ ├── ico_paging_more.svg\n│ │ ├── ico_paging_next.svg\n│ │ ├── ico_paging_next1.svg\n│ │ ├── ico_paging_next2.svg\n│ │ ├── ico_paging_prev.svg\n│ │ ├── ico_paging_prev1.svg\n│ │ ├── ico_paging_prev2.svg\n│ │ ├── ico_performance1.svg\n│ │ ├── ico_performance2.svg\n│ │ ├── ico_pin_off.svg\n│ │ ├── ico_pin_on.svg\n│ │ ├── ico_pip.svg\n│ │ ├── ico_pip2.svg\n│ │ ├── ico_plus.svg\n│ │ ├── ico_pop_close.svg\n│ │ ├── ico_pos.svg\n│ │ ├── ico_ran_arrow_gray.svg\n│ │ ├── ico_ran_arrow_white.svg\n│ │ ├── ico_red_pin.svg\n│ │ ├── ico_refresh_dis.svg\n│ │ ├── ico_refresh.svg\n│ │ ├── ico_reg_disabled.svg\n│ │ ├── ico_reg.svg\n│ │ ├── ico_save_disabled.svg\n│ │ ├── ico_save.svg\n│ │ ├── ico_search.svg\n│ │ ├── ico_set_blue.svg\n│ │ ├── ico_set.svg\n│ │ ├── ico_setting.svg\n│ │ ├── ico_slt.svg\n│ │ ├── ico_slt2.svg\n│ │ ├── ico_sort.svg\n│ │ ├── ico_square.svg\n│ │ ├── ico_state1.svg\n│ │ ├── ico_state2.svg\n│ │ ├── ico_state3.svg\n│ │ ├── ico_status1.svg\n│ │ ├── ico_status2.svg\n│ │ ├── ico_status3.svg\n│ │ ├── ico_step_arr.svg\n│ │ ├── ico_step_arr2.svg\n│ │ ├── ico_tenant1.svg\n│ │ ├── ico_tenant2.svg\n│ │ ├── ico_tenant3.svg\n│ │ ├── ico_tenant4.svg\n│ │ ├── ico_time_disabled.svg\n│ │ ├── ico_time.svg\n│ │ ├── ico_tit_arr.svg\n│ │ ├── ico_tool.svg\n│ │ ├── ico_trash_nw.svg\n│ │ ├── ico_tree_add.svg\n│ │ ├── ico_tree_arr.svg\n│ │ ├── ico_tree_save.svg\n│ │ ├── ico_tree1.svg\n│ │ ├── ico_tree2.svg\n│ │ ├── ico_tree3_core.svg\n│ │ ├── ico_tree3_ran.svg\n│ │ ├── ico_tree3.svg\n│ │ ├── ico_trend.svg\n│ │ ├── ico_view_del.svg\n│ │ ├── ico_view_list.svg\n│ │ ├── ico_view_list2.svg\n│ │ ├── ico_wifi.svg\n│ │ ├── ico-arrow-right.svg\n│ │ ├── ico-check-on.svg\n│ │ ├── img_mode_dark.svg\n│ │ ├── img_mode_white.svg\n│ │ ├── img_popup.svg\n│ │ ├── img_qr.svg\n│ │ ├── img_system.svg\n│ │ ├── inf_bg.png\n│ │ ├── is_disconnect.svg\n│ │ ├── logo_foot.svg\n│ │ ├── logo_foot2.svg\n│ │ ├── logo_login.svg\n│ │ ├── logo_new.svg\n│ │ ├── logo_sams_sds.svg\n│ │ ├── logo_sams.svg\n│ │ ├── mail_logo1.png\n│ │ ├── mail_logo2.png\n│ │ ├── map_kangwon.svg\n│ │ ├── pf_sample.svg\n│ │ ├── pin.png\n│ │ ├── rlt_bg.png\n│ │ ├── round.png\n│ │ └── ven_bg.png\n│ └── scss\n│ ├── default.scss\n│ ├── main.scss\n│ ├── mode-w-m.scss\n│ ├── roulette.scss\n│ ├── sample.scss\n│ └── style.scss\n├── components\n│ ├── cellRenderer\n│ │ ├── customActionTypeTextColor.vue\n│ │ ├── customBackUpBtn.vue\n│ │ ├── customBackUpBtnR.vue\n│ │ ├── customButtonSms.vue\n│ │ ├── customHeaderText.vue\n│ │ ├── customInhibitSelect.vue\n│ │ ├── customIpConnTextColor.vue\n│ │ ├── customIpNotConnTextColor.vue\n│ │ ├── customLicenseBtn.vue\n│ │ ├── customLogLevelSelect.vue\n│ │ ├── customNullValue.vue\n│ │ ├── customRadio.vue\n│ │ ├── customResultTextDivBg.vue\n│ │ ├── customSessionSetTextField.vue\n│ │ ├── customStatusBox.vue\n│ │ ├── customTextColor.vue\n│ │ ├── customTextDivSession.vue\n│ │ └── customUseYNTextColor.vue\n│ ├── common\n│ │ ├── confirmDialog.vue\n│ │ ├── customLoading.vue\n│ │ ├── excelUpload.vue\n│ │ ├── footer\n│ │ │ └── eventDetailView.vue\n│ │ ├── footer.vue\n│ │ ├── header\n│ │ │ └── modal\n│ │ │ ├── myInfoUpdate.vue\n│ │ │ ├── passwordCheck.vue\n│ │ │ └── privacyPop.vue\n│ │ ├── header.vue\n│ │ ├── leftMenu.vue\n│ │ ├── location.vue\n│ │ ├── pagination.vue\n│ │ ├── topologyPop.vue\n│ │ └── topologyPopMgmt.vue\n│ ├── home\n│ │ ├── dashboard\n│ │ │ ├── common\n│ │ │ │ ├── coreDetailModal.vue\n│ │ │ │ ├── map\n│ │ │ │ │ ├── mapBusan.vue\n│ │ │ │ │ ├── mapChungbuk.vue\n│ │ │ │ │ ├── mapChungnam.vue\n│ │ │ │ │ ├── mapDaegu.vue\n│ │ │ │ │ ├── mapDaejeon.vue\n│ │ │ │ │ ├── mapGwangju.vue\n│ │ │ │ │ ├── mapGyeongbuk.vue\n│ │ │ │ │ ├── mapGyeonggido.vue\n│ │ │ │ │ ├── mapGyeongnam.vue\n│ │ │ │ │ ├── mapIncheon.vue\n│ │ │ │ │ ├── mapJeju.vue\n│ │ │ │ │ ├── mapJeonbuk.vue\n│ │ │ │ │ ├── mapJeonnam.vue\n│ │ │ │ │ ├── mapKangwon.vue\n│ │ │ │ │ ├── mapSejong.vue\n│ │ │ │ │ ├── mapSeoul.vue\n│ │ │ │ │ └── mapUlsan.vue\n│ │ │ │ ├── pagination.vue\n│ │ │ │ ├── ranCardGroupDetailModal.vue\n│ │ │ │ ├── ranMapGroupDetailModal.vue\n│ │ │ │ └── ranMapNeDetailModal.vue\n│ │ │ ├── layout01\n│ │ │ │ ├── core\n│ │ │ │ │ ├── layout01Core.vue\n│ │ │ │ │ ├── layout01CoreWidgetM.vue\n│ │ │ │ │ └── layout01CoreWidgetS.vue\n│ │ │ │ ├── layout01.vue\n│ │ │ │ ├── ran\n│ │ │ │ │ └── layout01Ran.vue\n│ │ │ │ └── user\n│ │ │ │ ├── layout01User.vue\n│ │ │ │ ├── layout01UserWidgetM.vue\n│ │ │ │ ├── layout01UserWidgetS.vue\n│ │ │ │ └── layout01UserWidgetT.vue\n│ │ │ ├── layout02\n│ │ │ │ ├── core\n│ │ │ │ │ ├── layout02Core.vue\n│ │ │ │ │ ├── layout02CoreWidgetM.vue\n│ │ │ │ │ └── layout02CoreWidgetS.vue\n│ │ │ │ ├── layout02.vue\n│ │ │ │ ├── ran\n│ │ │ │ │ └── layout02Ran.vue\n│ │ │ │ └── user\n│ │ │ │ ├── layout02User.vue\n│ │ │ │ ├── layout02UserWidgetM.vue\n│ │ │ │ ├── layout02UserWidgetS.vue\n│ │ │ │ └── layout02UserWidgetT.vue\n│ │ │ ├── layout03\n│ │ │ │ ├── core\n│ │ │ │ │ ├── layout03Core.vue\n│ │ │ │ │ ├── layout03CoreWidgetM.vue\n│ │ │ │ │ └── layout03CoreWidgetS.vue\n│ │ │ │ ├── layout03.vue\n│ │ │ │ ├── ran\n│ │ │ │ │ ├── layout03Ran.vue\n│ │ │ │ │ └── ranMapComponent.vue\n│ │ │ │ └── user\n│ │ │ │ ├── layout03User.vue\n│ │ │ │ ├── layout03UserWidgetM.vue\n│ │ │ │ └── layout03UserWidgetS.vue\n│ │ │ ├── settingModal.vue\n│ │ │ └── test.json\n│ │ ├── jobNoti\n│ │ │ └── jobNotiModal.vue\n│ │ ├── tenant\n│ │ │ ├── chart\n│ │ │ │ ├── doughnut.vue\n│ │ │ │ ├── trendBar.vue\n│ │ │ │ └── userDoughnut.vue\n│ │ │ ├── common\n│ │ │ │ └── ranGroupDetailModal.vue\n│ │ │ ├── tenantRan.vue\n│ │ │ ├── tenantTrend.vue\n│ │ │ └── tenantUser.vue\n│ │ └── trend\n│ │ └── headerChart.vue\n│ ├── login\n│ │ └── privacyPop.vue\n│ ├── search\n│ │ └── searchModules.vue\n│ └── sunEdt.vue\n├── composables\n│ ├── useApi.js\n│ ├── useAxios.js\n│ ├── useChart.js\n│ ├── useEnumCode.js\n│ ├── useEnumCodeEn.js\n│ ├── useEnumCodeKr.js\n│ ├── useErrorHandler.js\n│ ├── useHangul.js\n│ ├── useMenuConstants.js\n│ ├── useSunEditor.js\n│ ├── useToastEditor.ts\n│ ├── useUrlHandler.js\n│ ├── useUtil.js\n│ ├── useValid.js\n│ └── useWatchFocusValidate.js\n├── error.vue\n├── lang\n│ ├── en.js\n│ └── kr.js\n├── layouts\n│ ├── default.vue\n│ ├── designdefault.vue\n│ ├── designloginlayout.vue\n│ ├── loginlayout.vue\n│ ├── roulette.vue\n│ └── samplelayout.vue\n├── middleware\n│ └── auth.global.js\n├── nuxt.config.ts\n├── package-lock.json\n├── package.json\n├── pages\n│ ├── auth\n│ │ ├── join.vue\n│ │ └── popupClose.vue\n│ ├── index.vue\n│ └── view\n│ ├── cs\n│ │ ├── financial.vue\n│ │ └── index.vue\n│ ├── deli\n│ │ ├── index.vue\n│ │ ├── mngAdd.vue\n│ │ └── mngListDeleted.vue\n│ ├── item\n│ │ ├── add.vue\n│ │ ├── evtListClosed.vue\n│ │ ├── evtListOngoing.vue\n│ │ ├── evtListPending.vue\n│ │ └── index.vue\n│ ├── log\n│ │ └── logList.vue\n│ ├── order\n│ │ └── index.vue\n│ ├── settle\n│ │ ├── curationAdd.vue\n│ │ ├── curationList.vue\n│ │ ├── index.vue\n│ │ ├── irAdd.vue\n│ │ ├── mediaAdd.vue\n│ │ ├── mediaList.vue\n│ │ ├── newsAdd.vue\n│ │ └── newsList.vue\n│ └── vendor\n│ ├── dashboard\n│ │ └── index.vue\n│ └── index.vue\n├── plugins\n│ ├── fontawesome.js\n│ ├── i18n.js\n│ ├── log.js\n│ ├── mitt.js\n│ ├── toast.js\n│ ├── userAgent.js\n│ ├── vue-cool-lightbox.js\n│ ├── vue3-editor.js\n│ └── vuetify.js\n├── public\n│ ├── favicon.ico\n│ ├── ft_logo.png\n│ ├── js\n│ │ └── jquery-3.7.1.min.js\n│ └── logo.png\n├── README.md\n├── server\n│ └── tsconfig.json\n├── stores\n│ ├── auth.js\n│ ├── detail.js\n│ ├── lang.js\n│ ├── loading.js\n│ └── tenantMgmt.js\n├── toast-editor.d.ts\n├── tsconfig.json\n└── vite-plugin-sri.d.ts\n```\n\n### Data Flow & Communication Patterns\n- **Client-Server 통신**: RESTful API, JWT 인증 헤더, Axios 인터셉터 \n- **Database 상호작용**: CI4 Query Builder/Model, 트랜잭션 관리, Redis 캐시 사용 \n- **외부 서비스 연동**: 비동기 메시지 큐 없이 HTTP 호출, 에러 리트라이 로직 \n- **실시간 통신**: Socket.IO 기반 WebSocket 연결, 주문·승인 알림 \n- **데이터 동기화**: 캐시 무효화 패턴, 이벤트 기반 상태 업데이트 \n\n## 4. Performance & Optimization Strategy\n- HTTP 응답 캐싱: Redis로 빈번 조회 데이터 캐싱 \n- DB 인덱싱 및 쿼리 튜닝: 주요 조회 쿼리 Explain 분석 \n- 코드 스플리팅·지연 로딩: Nuxt3 동적 import 활용 \n- 로드 밸런싱: Kubernetes HPA 기반 자동 스케일링 \n\n## 5. Implementation Roadmap & Milestones\n\n### Phase 1: Foundation (MVP Implementation)\n- Core Infrastructure: Docker/K8s 환경, CI/CD 파이프라인 \n- Essential Features: 로그인·회원가입, 상품 조회·발주, 주문 승인, 송장 엑셀 업로드 \n- Basic Security: JWT 인증, HTTPS, OAuth2 SNS 로그인 \n- Development Setup: 로컬 개발 환경, 코드 린팅·테스트 프레임워크 \n- Timeline: M+2\n\n### Phase 2: Feature Enhancement\n- Advanced Features: 정산 모듈, 파트너 매칭 시스템, 알림 센터 \n- Performance Optimization: 캐시 전략, DB 튜닝 \n- Enhanced Security: 권한 관리 강화, OWASP 점검 \n- Monitoring Implementation: ELK 대시보드, Grafana 알림 \n- Timeline: M+4\n\n### Phase 3: Scaling & Optimization\n- Scalability Implementation: HPA/Cluster Autoscaler, DB 리드 리플리카 \n- Advanced Integrations: ERP 연동, 다중 택배사 API 연결 \n- Enterprise Features: 서브계정 관리, 대시보드 \n- Compliance & Auditing: GDPR, 데이터 암호화 심화 \n- Timeline: M+6\n\n## 6. Risk Assessment & Mitigation Strategies\n\n### Technical Risk Analysis\n- **기술 리스크**: OCR 인식률 저하 → 수동 검증 UI 제공 \n- **성능 리스크**: 동시 사용자 증가 시 DB 병목 → 읽기/쓰기 분리, 캐시 활용 \n- **보안 리스크**: 토큰 탈취 → 짧은 만료, 리프레시 토큰 설계 \n- **통합 리스크**: 외부 API 변경 → 버전 관리, 어댑터 패턴 적용 \n- **Mitigation**: 대체 흐름, 로깅·모니터링 알림, 자동 테스트\n\n### Project Delivery Risks\n- **일정 리스크**: 기능 지연 → MVP 단계별 우선순위 조정 \n- **자원 리스크**: 전문 인력 부족 → 외부 컨설팅·아웃소싱 검토 \n- **품질 리스크**: 테스트 커버리지 부족 → CI/CD 자동화 테스트 강화 \n- **배포 리스크**: 프로덕션 오류 → 블루/그린 배포 전략 채택 \n- **Contingency**: 페이즈별 핵심 기능 최소화, 백업 환경 준비 \n\n--- \n*본 문서는 PRD 기반 최소 기능 중심으로 설계되었으며, 차후 요구사항 변화에 따라 단계별 확장이 가능합니다.*",
  3885. "writedAt": "2025-07-21T06:38:01.005Z"
  3886. },
  3887. {
  3888. "type": "guideline",
  3889. "content": "# Code Guidelines for Influencer–Vendor Automation Platform\n\n## 1. Project Overview \nA unified web platform to automate ordering, shipping, settlement, and notifications between influencers and vendors. \nKey architectural decisions: \n- Frontend: Vue 3 + Nuxt 3 (SSR/SSG), Composition API, TypeScript, Pinia, Vuetify, Axios \n- BFF: Node.js + Express (ES Modules), Socket.IO for real-time \n- Backend API: CodeIgniter 4 RESTful controllers, MySQL (RDS), Redis cache \n- Deployment: Docker → Kubernetes, CI/CD via GitHub Actions \n- Integrations: Google Cloud Vision OCR, Courier & ERP REST APIs, JWT/OAuth2 authentication \n\n---\n\n## 2. Core Principles \n1. Single Responsibility: each function/module addresses one concern; max 200 lines. \n2. Strong Typing: avoid `any`; define interfaces for props, DTOs, API responses. \n3. Consistent Error Handling: centralize and standardize error responses and logs. \n4. DRY & Reusable: extract shared logic into composables, services, or utilities. \n5. Domain-Driven Modules: group files by business domain (order, shipping, finance). \n\n---\n\n## 3. Language-Specific Guidelines \n\n### 3.1 Vue 3 + Nuxt 3 + TypeScript \n- File Organization: \n - `/pages` → route pages \n - `/components/{domain}` → feature components \n - `/composables` → reusable logic hooks (prefixed `useXxx`) \n - `/stores/{domain}` → Pinia modules (one per domain) \n - `/plugins`, `/middleware`, `/assets`, `/layouts` \n- Imports & Aliases: \n - Use Nuxt aliases: `import X from '~/components/order/OrderList.vue'` \n - Group imports: external packages → aliased aliases → relative (sorted alphabetically) \n- Error Handling: \n - Global error plugin `~/plugins/error.ts` to catch and display Axios errors \n - In composable: \n ```ts\n export async function useFetchOrders() {\n try {\n const { data } = await $axios.get<Order[]>('/api/orders')\n return data\n } catch (error: unknown) {\n throw new ApiError(error)\n }\n }\n ``` \n\n### 3.2 Node.js + Express (BFF) \n- Folder Structure: \n ```\n /src\n /controllers\n /services\n /routes\n /middlewares\n /utils\n app.js\n ```\n- Dependency Management: \n - Use ES Modules (`\"type\": \"module\"`) or TypeScript. \n - Version-lock in `package.json`; run `npm audit` in CI. \n- Error Handling: \n - Create `HttpError` class in `/utils/HttpError.js` \n - Middleware `errorHandler.js` at the end: \n ```js\n app.use((err, req, res, next) => {\n logger.error(err)\n res.status(err.statusCode || 500).json({\n success: false,\n message: err.message || 'Internal Server Error'\n })\n })\n ``` \n\n### 3.3 CodeIgniter 4 (REST API) \n- Controllers: one per resource, extend `ResourceController` \n- Models: use Entities and Query Builder; keep business logic in Services \n- Validation & Responses: \n ```php\n public function create()\n {\n $rules = ['order_id' => 'required|integer', /* ... */];\n if (! $this->validate($rules)) {\n return $this->fail($this->validator->getErrors());\n }\n $entity = new OrderEntity($this->request->getPost());\n $this->orderService->save($entity);\n return $this->respondCreated($entity);\n }\n ```\n- Error Handling: use `HTTPException` for 404/403, global logging in `app/Filters`. \n\n---\n\n## 4. Code Style Rules \n\n### 4.1 MUST Follow \n- **Use Strict Typescript** \n Rationale: catch errors at compile time. \n ```jsonc\n // tsconfig.json\n {\n \"compilerOptions\": {\n \"strict\": true,\n \"noImplicitAny\": true,\n \"forceConsistentCasingInFileNames\": true\n }\n }\n ``` \n- **One Component per File** \n Rationale: clarity, reusability, smaller diffs. \n- **Composition API & `<script setup>`** \n Rationale: simpler syntax and tree-shaking. \n ```vue\n <script setup lang=\"ts\">\n import { ref } from 'vue'\n const count = ref(0)\n function increment() { count.value++ }\n </script>\n ``` \n- **Pinia Stores for State** \n Rationale: predictable global state with actions, getters. \n ```ts\n import { defineStore } from 'pinia'\n export const useOrderStore = defineStore('order', {\n state: () => ({ list: [] as Order[] }),\n actions: {\n async fetch() { this.list = await fetchOrders() }\n }\n })\n ``` \n- **RESTful API Design** \n Rationale: consistency and predictability. \n - Use resource paths: `/vendors/{id}/orders` \n - HTTP verbs: GET/POST/PUT/DELETE \n - Standard response envelope: \n ```json\n { \"success\": true, \"data\": {...}, \"error\": null }\n ``` \n- **Centralized Error Handler** \n Rationale: unified logging and client messages. \n\n### 4.2 MUST NOT Do \n- **Avoid `any` or disabling lint rules** \n Rationale: loses type-safety. \n- **No Large “God” Modules** \n Rationale: hard to test and maintain. \n- **No Inline Styles or Scripts** \n Rationale: separates concerns; use Vuetify theme or SCSS. \n- **No Nested Callbacks (Callback Hell)** \n Rationale: use async/await or Promises. \n- **No Direct DOM Manipulation** \n Rationale: Vue manages DOM; use refs or directives. \n\n---\n\n## 5. Architecture Patterns \n\n### 5.1 Component & Module Structure \n- Domain-Driven Folders: \n ```\n /components/order\n /components/shipping\n /composables/order\n /stores/order\n /services/api/order.ts\n ``` \n- Layers in BFF: \n - **Routes** → **Controllers** → **Services** → **Data Access** \n\n### 5.2 Data Flow \n- **Frontend**: Props ↓, Events ↑, Store (Pinia) for shared state, Composables for side-effects. \n- **API Calls**: Axios interceptors attach JWT, handle 401 globally, retry logic for idempotent GETs. \n- **Real-time**: Socket.IO client in plugin; update Pinia store on events. \n\n### 5.3 State Management \n- Local state in component for UI-only values (`ref`, `reactive`). \n- Global state in Pinia: one store per domain; expose typed actions/getters. \n- Keep store actions async, commit minimal state changes. \n\n### 5.4 API Design Standards \n- Base URL per domain: `/api/v1/orders`, `/api/v1/vendors` \n- Pagination: standard query `?page=1&limit=20`, return `{ items, total, page, limit }`. \n- Filtering & Sorting: query params `?status=shipped&sort=-date`. \n- Consistent Error Payload: \n ```json\n {\n \"success\": false,\n \"error\": {\n \"code\": \"VALIDATION_FAILED\",\n \"message\": \"Invalid field: quantity\"\n }\n }\n ``` \n\n---\n\n## 6. Example Code Snippets \n\n### 6.1 Vue Composition & API Call \n```ts\n// MUST: composable with typed response and error handling\nimport { ref } from 'vue'\nimport { Order } from '~/types'\nimport { useApi } from '~/composables/useApi'\n\nexport function useOrders() {\n const list = ref<Order[]>([])\n const error = ref<string | null>(null)\n async function fetchOrders() {\n try {\n const res = await useApi().get<Order[]>('/orders')\n list.value = res.data\n } catch (e) {\n error.value = e.message\n }\n }\n return { list, error, fetchOrders }\n}\n```\n\n```ts\n// MUST NOT: direct Axios calls in component, untyped any\nsetup() {\n axios.get('/orders').then(res => {\n this.orders = res.data\n })\n}\n```\n\n### 6.2 Node.js Express Route & Error \n```js\n// MUST: clean controller and error propagation\n// src/routes/order.js\nimport { Router } from 'express'\nimport { listOrders } from '../controllers/order.js'\nconst router = Router()\nrouter.get('/', listOrders)\nexport default router\n\n// src/controllers/order.js\nexport async function listOrders(req, res, next) {\n try {\n const orders = await OrderService.fetchAll()\n res.json({ success: true, data: orders })\n } catch (err) {\n next(new HttpError(500, 'Failed to fetch orders'))\n }\n}\n```\n\n```js\n// MUST NOT: catch without forwarding or unstructured response\napp.get('/orders', async (req, res) => {\n try {\n const orders = await OrderService.fetchAll()\n res.send(orders)\n } catch (err) {\n res.status(500).send('Error')\n }\n})\n```\n\n### 6.3 CodeIgniter4 Controller \n```php\n// MUST: validate, use entity, consistent response\nclass OrderController extends ResourceController\n{\n public function create()\n {\n $rules = ['vendor_id'=>'required|integer', 'items'=>'required|array'];\n if (! $this->validate($rules)) {\n return $this->failValidationErrors($this->validator->getErrors());\n }\n $order = new OrderEntity($this->request->getPost());\n $this->orderService->create($order);\n return $this->respondCreated(['order' => $order]);\n }\n}\n```\n\n```php\n// MUST NOT: raw SQL in controller, no validation\nclass OrderController extends BaseController\n{\n public function create()\n {\n $db->query(\"INSERT INTO orders ...\"); // anti-pattern\n }\n}\n```\n\n---\n\nEnd of Guidelines. \nFollow these rules as the single source of truth for code quality, maintainability, and consistency.",
  3890. "writedAt": "2025-07-21T06:38:01.005Z"
  3891. },
  3892. {
  3893. "type": "step-by-step",
  3894. "content": "\n## Core Directive\nYou are a senior software engineer AI assistant. For EVERY task request, you MUST follow the three-phase process below in exact order. Each phase must be completed with expert-level precision and detail.\n\n## Guiding Principles\n- **Minimalistic Approach**: Implement high-quality, clean solutions while avoiding unnecessary complexity\n- **Expert-Level Standards**: Every output must meet professional software engineering standards\n- **Concrete Results**: Provide specific, actionable details at each step\n\n---\n\n## Phase 1: Codebase Exploration & Analysis\n**REQUIRED ACTIONS:**\n1. **Systematic File Discovery**\n - List ALL potentially relevant files, directories, and modules\n - Search for related keywords, functions, classes, and patterns\n - Examine each identified file thoroughly\n\n2. **Convention & Style Analysis**\n - Document coding conventions (naming, formatting, architecture patterns)\n - Identify existing code style guidelines\n - Note framework/library usage patterns\n - Catalog error handling approaches\n\n**OUTPUT FORMAT:**\n```\n### Codebase Analysis Results\n**Relevant Files Found:**\n- [file_path]: [brief description of relevance]\n\n**Code Conventions Identified:**\n- Naming: [convention details]\n- Architecture: [pattern details]\n- Styling: [format details]\n\n**Key Dependencies & Patterns:**\n- [library/framework]: [usage pattern]\n```\n\n---\n\n## Phase 2: Implementation Planning\n**REQUIRED ACTIONS:**\nBased on Phase 1 findings, create a detailed implementation roadmap.\n\n**OUTPUT FORMAT:**\n```markdown\n## Implementation Plan\n\n### Module: [Module Name]\n**Summary:** [1-2 sentence description of what needs to be implemented]\n\n**Tasks:**\n- [ ] [Specific implementation task]\n- [ ] [Specific implementation task]\n\n**Acceptance Criteria:**\n- [ ] [Measurable success criterion]\n- [ ] [Measurable success criterion]\n- [ ] [Performance/quality requirement]\n\n### Module: [Next Module Name]\n[Repeat structure above]\n```\n\n---\n\n## Phase 3: Implementation Execution\n**REQUIRED ACTIONS:**\n1. Implement each module following the plan from Phase 2\n2. Verify ALL acceptance criteria are met before proceeding\n3. Ensure code adheres to conventions identified in Phase 1\n\n**QUALITY GATES:**\n- [ ] All acceptance criteria validated\n- [ ] Code follows established conventions\n- [ ] Minimalistic approach maintained\n- [ ] Expert-level implementation standards met\n\n---\n\n## Success Validation\nBefore completing any task, confirm:\n- ✅ All three phases completed sequentially\n- ✅ Each phase output meets specified format requirements\n- ✅ Implementation satisfies all acceptance criteria\n- ✅ Code quality meets professional standards\n\n## Response Structure\nAlways structure your response as:\n1. **Phase 1 Results**: [Codebase analysis findings]\n2. **Phase 2 Plan**: [Implementation roadmap] \n3. **Phase 3 Implementation**: [Actual code with validation]\n",
  3895. "writedAt": "2025-07-21T06:38:01.005Z"
  3896. },
  3897. {
  3898. "type": "tdd",
  3899. "content": "\n# TDD Process Guidelines - Cursor Rules\n\n## ⚠️ MANDATORY: Follow these rules for EVERY implementation and modification\n\n**This document defines the REQUIRED process for all code changes. No exceptions without explicit team approval.**\n\n## Core Cycle: Red → Green → Refactor\n\n### 1. RED Phase\n- Write a failing test FIRST\n- Test the simplest scenario\n- Verify test fails for the right reason\n- One test at a time\n\n### 2. GREEN Phase \n- Write MINIMAL code to pass\n- \"Fake it till you make it\" is OK\n\n- YAGNI principle\n\n### 3. REFACTOR Phase\n- Remove duplication\n- Improve naming\n- Simplify structure\n- Keep tests passing\n\n## Test Quality: FIRST Principles\n- **Fast**: Milliseconds, not seconds\n- **Independent**: No shared state\n- **Repeatable**: Same result every time\n- **Self-validating**: Pass/fail, no manual checks\n- **Timely**: Written just before code\n\n## Test Structure: AAA Pattern\n```\n// Arrange\nSet up test data and dependencies\n\n// Act\nExecute the function/method\n\n// Assert\nVerify expected outcome\n```\n\n## Implementation Flow\n1. **List scenarios** before coding\n2. **Pick one scenario** → Write test\n3. **Run test** → See it fail (Red)\n4. **Implement** → Make it pass (Green)\n5. **Refactor** → Clean up (Still Green)\n6. **Commit** → Small, frequent commits\n7. **Repeat** → Next scenario\n\n## Test Pyramid Strategy\n- **Unit Tests** (70%): Fast, isolated, numerous\n- **Integration Tests** (20%): Module boundaries\n- **Acceptance Tests** (10%): User scenarios\n\n## Outside-In vs Inside-Out\n- **Outside-In**: Start with user-facing test → Mock internals → Implement details\n- **Inside-Out**: Start with core logic → Build outward → Integrate components\n\n## Common Anti-patterns to Avoid\n- Testing implementation details\n- Fragile tests tied to internals \n- Missing assertions\n- Slow, environment-dependent tests\n- Ignored failing tests\n\n## When Tests Fail\n1. **Identify**: Regression, flaky test, or spec change?\n2. **Isolate**: Narrow down the cause\n3. **Fix**: Code bug or test bug\n4. **Learn**: Add missing test cases\n\n## Team Practices\n- CI/CD integration mandatory\n- No merge without tests\n- Test code = Production code quality\n- Pair programming for complex tests\n- Regular test refactoring\n\n## Pragmatic Exceptions\n- UI/Graphics: Manual + snapshot tests\n- Performance: Benchmark suites\n- Exploratory: Spike then test\n- Legacy: Test on change\n\n## Remember\n- Tests are living documentation\n- Test behavior, not implementation\n- Small steps, fast feedback\n- When in doubt, write a test\n",
  3900. "writedAt": "2025-07-21T06:38:01.005Z"
  3901. },
  3902. {
  3903. "type": "clean-code",
  3904. "content": "\n# Clean Code Guidelines\n\nYou are an expert software engineer focused on writing clean, maintainable code. Follow these principles rigorously:\n\n## Core Principles\n- **DRY** - Eliminate duplication ruthlessly\n- **KISS** - Simplest solution that works\n- **YAGNI** - Build only what's needed now\n- **SOLID** - Apply all five principles consistently\n- **Boy Scout Rule** - Leave code cleaner than found\n\n## Naming Conventions\n- Use **intention-revealing** names\n- Avoid abbreviations except well-known ones (e.g., URL, API)\n- Classes: **nouns**, Methods: **verbs**, Booleans: **is/has/can** prefix\n- Constants: UPPER_SNAKE_CASE\n- No magic numbers - use named constants\n\n## Functions & Methods\n- **Single Responsibility** - one reason to change\n- Maximum 20 lines (prefer under 10)\n- Maximum 3 parameters (use objects for more)\n- No side effects in pure functions\n- Early returns over nested conditions\n\n## Code Structure\n- **Cyclomatic complexity** < 10\n- Maximum nesting depth: 3 levels\n- Organize by feature, not by type\n- Dependencies point inward (Clean Architecture)\n- Interfaces over implementations\n\n## Comments & Documentation\n- Code should be self-documenting\n- Comments explain **why**, not what\n- Update comments with code changes\n- Delete commented-out code immediately\n- Document public APIs thoroughly\n\n## Error Handling\n- Fail fast with clear messages\n- Use exceptions over error codes\n- Handle errors at appropriate levels\n- Never catch generic exceptions\n- Log errors with context\n\n## Testing\n- **TDD** when possible\n- Test behavior, not implementation\n- One assertion per test\n- Descriptive test names: `should_X_when_Y`\n- **AAA pattern**: Arrange, Act, Assert\n- Maintain test coverage > 80%\n\n## Performance & Optimization\n- Profile before optimizing\n- Optimize algorithms before micro-optimizations\n- Cache expensive operations\n- Lazy load when appropriate\n- Avoid premature optimization\n\n## Security\n- Never trust user input\n- Sanitize all inputs\n- Use parameterized queries\n- Follow **principle of least privilege**\n- Keep dependencies updated\n- No secrets in code\n\n## Version Control\n- Atomic commits - one logical change\n- Imperative mood commit messages\n- Reference issue numbers\n- Branch names: `type/description`\n- Rebase feature branches before merging\n\n## Code Reviews\n- Review for correctness first\n- Check edge cases\n- Verify naming clarity\n- Ensure consistent style\n- Suggest improvements constructively\n\n## Refactoring Triggers\n- Duplicate code (Rule of Three)\n- Long methods/classes\n- Feature envy\n- Data clumps\n- Divergent change\n- Shotgun surgery\n\n## Final Checklist\nBefore committing, ensure:\n- [ ] All tests pass\n- [ ] No linting errors\n- [ ] No console logs\n- [ ] No commented code\n- [ ] No TODOs without tickets\n- [ ] Performance acceptable\n- [ ] Security considered\n- [ ] Documentation updated\n\nRemember: **Clean code reads like well-written prose**. Optimize for readability and maintainability over cleverness.\n",
  3905. "writedAt": "2025-07-21T06:38:01.005Z"
  3906. }
  3907. ]
  3908. }
  3909. </file>
  3910. <file path="assets/img/bg_login.svg">
  3911. <svg width="639" height="698" viewBox="0 0 639 698" fill="none" xmlns="http://www.w3.org/2000/svg">
  3912. <g clip-path="url(#clip0_234_211)">
  3913. <path d="M944 363.76H943.505C943.505 349.037 937.194 333.547 924.744 317.761C912.591 302.32 894.598 286.633 871.307 271.143C824.8 240.188 757.874 210.52 677.731 185.33C667.386 182.064 652.882 177.932 636.101 173.107C595.98 161.601 541.033 145.863 493.437 128.27C467.474 118.67 446.114 109.415 430.001 100.73C411.191 90.6099 398.791 80.9102 393.098 71.9033C378.346 48.5449 372.876 22.0687 376.861 -6.78288C380.029 -29.8444 389.212 -54.4895 404.137 -79.9759C429.506 -123.377 463.217 -154.678 463.563 -155L463.91 -154.629C463.563 -154.307 429.902 -123.031 404.533 -79.7037C389.633 -54.2668 380.475 -29.6959 377.332 -6.68391C373.371 22.044 378.817 48.4212 393.519 71.6806C399.162 80.6132 411.512 90.2634 430.249 100.334C446.361 108.995 467.672 118.249 493.635 127.85C541.206 145.418 596.153 161.18 636.274 172.661C653.055 177.462 667.559 181.619 677.929 184.885C758.122 210.099 825.097 239.792 871.629 270.747C894.969 286.286 912.987 301.999 925.189 317.464C937.639 333.349 944 348.913 944 363.76Z" fill="url(#paint0_linear_234_211)"/>
  3914. <path d="M936.698 365.591H936.203C936.302 351.067 930.214 335.775 918.061 320.161C906.206 304.894 888.608 289.33 865.788 273.915C820.296 243.182 754.632 213.539 675.925 188.176C665.158 184.663 649.936 180.184 632.289 175.012C553.062 151.728 420.447 112.756 396.291 74.7989C381.391 51.4157 375.649 24.7663 379.237 -4.40698C382.108 -27.7159 390.92 -52.6827 405.424 -78.5898C430.15 -122.684 463.217 -154.678 463.563 -155L463.91 -154.653C463.588 -154.331 430.546 -122.362 405.894 -78.3423C391.415 -52.4847 382.628 -27.5922 379.757 -4.33273C376.168 24.7168 381.886 51.2425 396.736 74.5267C420.769 112.311 553.285 151.258 632.438 174.518C650.085 179.714 665.331 184.192 676.098 187.681C754.855 213.069 820.543 242.737 866.085 273.469C888.954 288.909 906.577 304.498 918.482 319.815C930.659 335.577 936.798 350.943 936.698 365.591Z" fill="url(#paint1_linear_234_211)"/>
  3915. <path d="M929.422 367.397H928.927C929.125 353.095 923.234 338.026 911.379 322.611C899.82 307.566 882.618 292.175 860.243 276.883C815.915 246.572 751.563 216.879 674.143 191.046C663.351 187.458 648.08 182.856 630.358 177.536C592.044 166.03 539.598 150.243 494.7 132.947C470.246 123.52 450.099 114.439 434.828 105.927C417.056 96.0289 405.176 86.5272 399.533 77.7183C384.485 54.2857 378.47 27.4631 381.688 -1.98238C384.262 -25.5388 392.702 -50.8272 406.785 -77.1549C430.744 -121.942 463.192 -154.653 463.514 -154.975L463.86 -154.629C463.538 -154.307 431.14 -121.67 407.206 -76.9322C393.147 -50.6788 384.732 -25.4398 382.158 -1.95764C378.94 27.3888 384.93 54.0877 399.929 77.4214C405.547 86.1808 417.354 95.6083 435.05 105.481C450.297 113.968 470.419 123.049 494.848 132.477C539.721 149.773 592.168 165.535 630.458 177.041C648.179 182.361 663.45 186.963 674.242 190.576C751.687 216.434 816.088 246.127 860.466 276.463C882.89 291.804 900.142 307.22 911.725 322.314C923.68 337.828 929.62 352.996 929.422 367.397Z" fill="url(#paint2_linear_234_211)"/>
  3916. <path d="M922.12 369.229H921.625C921.922 355.149 916.23 340.278 904.696 325.036C893.434 310.189 876.628 294.947 854.699 279.729C811.46 249.74 748.395 220.047 672.36 193.892C661.396 190.131 645.778 185.306 627.661 179.739C590.262 168.233 539.053 152.446 495.467 135.298C471.731 125.97 452.178 116.963 437.303 108.525C420.027 98.7264 408.418 89.3484 402.775 80.6137C387.554 57.1563 381.292 30.1605 384.138 0.393356C386.415 -23.4105 394.509 -49.0206 408.171 -75.7442C431.437 -121.273 463.241 -154.653 463.563 -155L463.91 -154.653C463.588 -154.331 431.833 -121.001 408.617 -75.571C394.979 -48.8969 386.935 -23.3362 384.658 0.393356C381.811 30.0368 388.049 56.9336 403.221 80.292C408.815 88.9525 420.373 98.3057 437.575 108.055C452.425 116.468 471.954 125.475 495.665 134.779C539.226 151.926 590.435 167.688 627.809 179.219C645.927 184.786 661.544 189.611 672.534 193.397C748.618 219.576 811.732 249.294 854.996 279.309C876.95 294.551 893.806 309.818 905.092 324.714C916.7 340.055 922.442 355.026 922.12 369.229Z" fill="url(#paint3_linear_234_211)"/>
  3917. <path d="M914.844 371.035L914.349 371.01C914.769 357.154 909.275 342.48 898.013 327.411C887.073 312.738 870.639 297.644 849.18 282.55C828.068 267.704 802.104 252.832 771.982 238.357C741.96 223.931 707.853 209.926 670.578 196.688C659.465 192.754 643.526 187.706 625.062 181.891C586.55 169.742 538.607 154.598 496.308 137.599C473.29 128.345 454.282 119.412 439.827 111.074C423.046 101.399 411.661 92.0948 406.042 83.4344C390.672 59.9522 384.138 32.7832 386.613 2.69441C388.593 -21.3568 396.315 -47.3134 409.557 -74.4329C432.08 -120.63 463.241 -154.678 463.563 -155.024L463.934 -154.678C463.613 -154.332 432.501 -120.333 410.003 -74.2102C396.786 -47.1402 389.088 -21.2331 387.108 2.74391C384.633 32.709 391.142 59.7543 406.438 83.1622C412.032 91.7484 423.343 100.978 440.05 110.628C454.504 118.967 473.463 127.875 496.457 137.104C538.756 154.104 586.673 169.247 625.186 181.396C643.65 187.236 659.589 192.259 670.727 196.218C708.002 209.431 742.133 223.461 772.18 237.887C802.327 252.362 828.315 267.258 849.452 282.129C870.961 297.248 887.42 312.391 898.384 327.089C909.72 342.282 915.24 357.055 914.844 371.035Z" fill="url(#paint4_linear_234_211)"/>
  3918. <path d="M907.542 372.866L907.047 372.841C907.567 359.182 902.27 344.707 891.33 329.836C880.688 315.361 864.649 300.415 843.66 285.42C823.043 270.698 797.624 255.876 768.121 241.401C738.767 226.999 705.353 212.92 668.821 199.558C657.56 195.426 641.348 190.18 622.562 184.118C585.015 171.969 538.286 156.85 497.199 139.974C474.874 130.794 456.435 121.961 442.352 113.696C426.016 104.12 414.903 94.9155 409.285 86.354C393.766 62.8224 386.96 35.5049 389.063 5.11917C390.746 -19.1795 398.097 -45.4577 410.918 -72.9979C432.724 -119.888 463.241 -154.629 463.538 -154.975L463.91 -154.653C463.613 -154.307 433.144 -119.616 411.364 -72.8C398.568 -45.3093 391.241 -19.0805 389.558 5.14394C387.455 35.406 394.236 62.6492 409.681 86.0818C415.25 94.5691 426.313 103.724 442.575 113.276C456.633 121.515 475.072 130.349 497.348 139.529C538.385 156.405 585.114 171.523 622.661 183.673C641.447 189.76 657.659 195.005 668.945 199.113C705.502 212.475 738.94 226.579 768.294 240.98C797.847 255.48 823.291 270.302 843.908 285.049C864.946 300.069 881.009 315.064 891.702 329.588C902.741 344.509 908.062 359.083 907.542 372.866Z" fill="url(#paint5_linear_234_211)"/>
  3919. <path d="M900.265 374.672L899.77 374.648C900.389 361.212 895.291 346.934 884.648 332.236C874.302 317.959 858.659 303.137 838.116 288.241C817.994 273.642 793.144 258.895 764.211 244.395C735.549 230.043 702.829 215.89 667.014 202.379C655.629 198.074 639.17 192.63 620.112 186.296C546.924 162.047 436.387 125.351 412.527 89.2246C396.86 65.6683 389.781 38.1528 391.514 7.47017C392.9 -17.076 399.88 -43.6759 412.28 -71.6367C433.367 -119.22 463.241 -154.653 463.538 -155L463.91 -154.678C463.613 -154.331 433.788 -118.947 412.725 -71.4387C400.35 -43.5521 393.395 -17.0017 392.009 7.47017C390.276 38.0539 397.33 65.4456 412.923 88.903C418.492 97.316 429.308 106.372 445.124 115.825C458.811 123.99 476.706 132.749 498.313 141.831C538.137 158.558 583.679 173.676 620.26 185.801C639.318 192.135 655.778 197.579 667.188 201.884C703.051 215.395 735.772 229.548 764.433 243.925C793.392 258.425 818.266 273.197 838.413 287.796C858.981 302.717 874.673 317.563 885.044 331.89C895.761 346.761 900.884 361.137 900.265 374.672Z" fill="url(#paint6_linear_234_211)"/>
  3920. <path d="M892.964 376.503L892.469 376.479C893.187 363.265 888.311 349.186 877.94 334.661C867.891 320.557 852.62 305.908 832.572 291.112C812.945 276.636 788.64 261.938 760.325 247.438C732.332 233.111 700.329 218.908 665.208 205.25C653.698 200.771 637.041 195.104 617.736 188.523C546.775 164.372 439.555 127.875 415.745 92.1195C399.904 68.5384 392.578 40.8498 393.939 9.87018C395.028 -14.8987 401.662 -41.845 413.616 -70.2017C433.986 -118.477 463.217 -154.579 463.514 -154.95L463.91 -154.629C463.613 -154.282 434.432 -118.205 414.086 -70.0037C402.132 -41.6965 395.523 -14.8244 394.434 9.89493C393.073 40.7756 400.375 68.3405 416.141 91.8473C439.852 127.479 546.973 163.927 617.884 188.052C637.19 194.634 653.872 200.301 665.381 204.779C700.527 218.438 732.53 232.641 760.547 246.993C788.887 261.518 813.217 276.216 832.869 290.691C852.967 305.513 868.287 320.211 878.361 334.364C888.781 348.988 893.682 363.166 892.964 376.503Z" fill="url(#paint7_linear_234_211)"/>
  3921. <path d="M885.687 378.31L885.192 378.285C886.009 365.27 881.331 351.413 871.282 337.037C861.531 323.131 846.655 308.606 827.053 293.908C807.92 279.556 784.184 264.932 756.439 250.432C729.139 236.13 697.829 221.902 663.426 208.071C651.842 203.419 635.012 197.554 615.558 190.725C546.775 166.674 442.822 130.349 419.012 94.99C403.072 71.3347 395.499 43.4728 396.513 12.1468C397.305 -12.8942 403.567 -40.1622 415.101 -68.9148C434.729 -117.859 463.266 -154.628 463.538 -155L463.935 -154.703C463.638 -154.331 435.174 -117.611 415.547 -68.7416C404.038 -40.0385 397.801 -12.82 396.984 12.1468C395.994 43.3491 403.518 71.112 419.408 94.6684C443.119 129.879 546.998 166.204 615.706 190.23C635.185 197.035 652.015 202.924 663.599 207.576C698.027 221.383 729.337 235.635 756.662 249.938C784.407 264.462 808.193 279.111 827.325 293.462C846.977 308.185 861.877 322.735 871.654 336.715C881.801 351.215 886.504 365.195 885.687 378.31Z" fill="url(#paint8_linear_234_211)"/>
  3922. <path d="M878.386 380.141L877.891 380.116C878.807 367.323 874.327 353.64 864.575 339.461C855.145 325.728 840.641 311.352 821.509 296.753C802.871 282.525 779.68 267.976 752.553 253.451C725.921 239.198 695.329 224.896 661.643 210.941C649.986 206.115 633.007 200.028 613.355 192.976C579.619 180.876 537.642 165.807 501.333 149.476C458.613 130.25 432.748 113.399 422.254 97.9342C406.166 74.2294 398.345 46.1944 398.964 14.5961C399.459 -10.6923 405.349 -38.282 416.462 -67.4553C435.372 -117.092 463.241 -154.53 463.538 -154.901L463.934 -154.604C463.662 -154.233 435.818 -116.82 416.933 -67.2573C405.844 -38.1582 399.979 -10.6181 399.459 14.6209C398.84 46.1201 406.636 74.0809 422.65 97.6868C433.095 113.078 458.91 129.879 501.531 149.056C537.84 165.387 579.817 180.456 613.528 192.556C633.18 199.608 650.159 205.695 661.841 210.545C695.552 224.5 726.169 238.827 752.8 253.08C779.952 267.604 803.168 282.203 821.83 296.431C841.012 311.08 855.541 325.481 865.02 339.239C874.822 353.442 879.326 367.224 878.386 380.141Z" fill="url(#paint9_linear_234_211)"/>
  3923. <path d="M871.084 381.947L870.589 381.898C871.604 369.328 867.347 355.842 857.892 341.837C848.759 328.277 834.651 314.074 815.964 299.549C797.822 285.445 775.175 270.945 748.667 256.42C722.728 242.193 692.829 227.841 659.861 213.762C648.13 208.739 631.027 202.454 611.251 195.154C578.481 183.079 537.667 168.035 502.471 151.827C461.162 132.799 435.966 116.097 425.497 100.78C409.26 77.0505 401.167 48.8423 401.439 16.9224C401.637 -8.58875 407.181 -36.5248 417.849 -66.094C436.04 -116.423 463.266 -154.554 463.539 -154.925L463.935 -154.628C463.662 -154.257 436.461 -116.176 418.294 -65.8961C407.627 -36.3764 402.107 -8.51451 401.909 16.9472C401.637 48.7681 409.706 76.8773 425.893 100.533C436.313 115.775 461.435 132.428 502.669 151.407C537.84 167.614 578.63 182.634 611.4 194.733C631.2 202.033 648.278 208.343 660.035 213.341C693.027 227.445 722.926 241.797 748.89 256.025C775.423 270.574 798.094 285.099 816.261 299.203C834.973 313.752 849.106 328.005 858.288 341.59C867.817 355.669 872.124 369.253 871.084 381.947Z" fill="url(#paint10_linear_234_211)"/>
  3924. <path d="M863.807 383.778L863.312 383.729C865.54 359.282 847.744 331.915 810.445 302.395C775.299 274.583 724.04 245.706 658.079 216.607C646.273 211.411 629.096 204.903 609.197 197.356C577.367 185.306 537.741 170.286 503.659 154.203C463.712 135.372 439.184 118.818 428.739 103.65C412.354 79.896 403.988 51.4898 403.889 19.273C403.79 -6.48564 408.963 -34.7681 419.235 -64.7332C436.709 -115.756 463.291 -154.579 463.563 -154.95L463.959 -154.678C463.687 -154.282 437.154 -115.533 419.705 -64.56C409.458 -34.6444 404.31 -6.43616 404.409 19.273C404.508 51.3908 412.849 79.698 429.184 103.378C439.604 118.472 464.033 134.952 503.907 153.757C537.964 169.816 577.59 184.836 609.419 196.886C629.319 204.433 646.521 210.941 658.327 216.137C724.312 245.261 775.621 274.137 810.816 301.974C848.19 331.618 866.06 359.133 863.807 383.778Z" fill="url(#paint11_linear_234_211)"/>
  3925. <path d="M856.506 385.584L856.011 385.535C858.437 361.533 841.235 334.513 804.901 305.191C770.819 277.7 720.823 248.848 656.273 219.428C644.442 214.034 627.19 207.303 607.217 199.534C576.328 187.508 537.865 172.513 504.872 156.578C466.261 137.921 442.401 121.54 431.957 106.52C415.423 82.7167 406.785 54.162 406.315 21.6235C405.919 -4.38255 410.72 -32.9867 420.571 -63.3725C437.327 -115.088 463.266 -154.579 463.514 -154.975L463.935 -154.703C463.687 -154.307 437.773 -114.865 421.041 -63.1993C411.215 -32.863 406.439 -4.33307 406.81 21.6235C407.28 54.063 415.893 82.5187 432.353 106.248C442.748 121.218 466.533 137.525 505.07 156.157C538.038 172.092 576.476 187.062 607.39 199.088C627.364 206.858 644.615 213.588 656.471 218.982C721.045 248.403 771.091 277.279 805.198 304.795C841.705 334.24 858.956 361.409 856.506 385.584Z" fill="url(#paint12_linear_234_211)"/>
  3926. <path d="M849.229 387.391L848.734 387.341C851.358 363.81 834.75 337.111 799.381 307.987C766.364 280.818 717.63 251.966 654.491 222.273C642.61 216.681 625.334 209.753 605.311 201.736C543.459 176.942 458.737 143.018 435.199 109.416C418.517 85.5871 409.631 56.8345 408.765 23.9991C408.072 -2.25439 412.502 -31.1803 421.932 -61.9619C437.971 -114.37 463.241 -154.554 463.514 -154.95L463.935 -154.678C463.687 -154.282 438.416 -114.147 422.403 -61.8134C412.997 -31.0813 408.592 -2.20491 409.26 23.9991C410.102 56.7355 418.962 85.3892 435.595 109.119C459.034 142.598 543.681 176.497 605.484 201.266C625.507 209.283 642.808 216.211 654.689 221.803C717.852 251.521 766.636 280.397 799.678 307.591C835.196 336.839 851.878 363.686 849.229 387.391Z" fill="url(#paint13_linear_234_211)"/>
  3927. <path d="M841.928 389.222L841.433 389.172C844.254 366.086 828.241 339.734 793.837 310.808C761.884 283.96 714.412 255.134 652.708 225.119C640.803 219.329 623.503 212.203 603.454 203.938C543.706 179.293 461.905 145.567 438.441 112.311C421.611 88.4327 412.453 59.5316 411.215 26.3992C410.25 -0.1017 414.309 -29.3492 423.294 -60.5515C438.639 -113.677 463.266 -154.53 463.514 -154.95L463.934 -154.703C463.687 -154.307 439.085 -113.479 423.789 -60.4525C414.804 -29.2997 410.745 -0.101685 411.735 26.3497C412.948 59.3831 422.081 88.21 438.862 111.989C462.251 145.121 543.978 178.848 603.652 203.443C623.701 211.708 641.001 218.859 652.931 224.649C714.66 254.688 762.181 283.54 794.159 310.412C828.711 339.437 844.774 365.962 841.928 389.222Z" fill="url(#paint14_linear_234_211)"/>
  3928. <path d="M834.651 391.028L834.156 390.954C837.176 368.313 821.756 342.282 788.318 313.579C757.429 287.053 711.194 258.226 650.926 227.94C639.021 221.952 621.72 214.603 601.697 206.091C544.053 181.619 465.098 148.066 441.708 115.156C424.729 91.2534 415.299 62.179 413.69 28.725C412.428 1.97667 416.116 -27.6173 424.68 -59.2155C439.283 -113.009 463.266 -154.554 463.514 -154.975L463.934 -154.728C463.687 -154.307 439.728 -112.811 425.15 -59.0917C416.586 -27.543 412.898 2.00142 414.161 28.6755C415.745 62.0306 425.15 91.0059 442.08 114.834C465.395 147.645 544.275 181.149 601.846 205.596C621.894 214.108 639.195 221.457 651.124 227.445C711.442 257.756 757.701 286.608 788.615 313.158C822.202 342.059 837.696 368.239 834.651 391.028Z" fill="url(#paint15_linear_234_211)"/>
  3929. <path d="M827.35 392.859L826.855 392.785C828.488 381.502 825.444 369.179 817.771 356.188C810.42 343.717 798.639 330.331 782.774 316.375C752.924 290.171 707.977 261.369 649.12 230.785C637.215 224.599 619.939 217.028 599.94 208.293C571.328 195.773 538.929 181.569 510.119 166.179C476.607 148.264 455.272 132.527 444.926 118.051C427.774 94.1238 418.096 64.8515 416.141 31.1006C414.582 4.10481 417.898 -25.8108 426.066 -57.8049C439.951 -112.291 463.291 -154.53 463.514 -154.95L463.935 -154.703C463.712 -154.282 440.372 -112.093 426.511 -57.6812C418.368 -25.7118 415.052 4.12956 416.611 31.0759C418.566 64.7278 428.219 93.9012 445.322 117.754C468.588 150.219 544.622 183.524 600.138 207.823C620.137 216.582 637.413 224.129 649.342 230.34C708.224 260.948 753.221 289.775 783.095 316.004C799.01 329.984 810.816 343.421 818.192 355.941C825.939 369.031 829.008 381.452 827.35 392.859Z" fill="url(#paint16_linear_234_211)"/>
  3930. <path d="M820.073 394.666L819.578 394.591C826.112 352.774 768.171 298.609 647.338 233.631C635.432 227.222 618.206 219.453 598.282 210.471C570.635 198 539.325 183.846 511.53 168.579C479.231 150.837 458.489 135.249 448.168 120.947C430.868 96.9695 420.918 67.5488 418.591 33.4762C416.735 6.23297 419.705 -24.0043 427.427 -56.4191C440.595 -111.598 463.291 -154.505 463.514 -154.925L463.959 -154.703C463.736 -154.282 441.065 -111.425 427.922 -56.2953C420.2 -23.9301 417.23 6.25771 419.111 33.4515C421.437 67.4251 431.363 96.7468 448.614 120.65C458.885 134.902 479.577 150.442 511.802 168.134C539.573 183.376 570.907 197.53 598.529 210.001C618.453 219.007 635.68 226.777 647.61 233.186C768.616 298.287 826.657 352.625 820.073 394.666Z" fill="url(#paint17_linear_234_211)"/>
  3931. <path d="M812.771 396.497L812.276 396.423C814.108 385.56 811.46 373.633 804.406 360.964C797.649 348.84 786.635 335.701 771.71 321.968C743.94 296.382 701.492 267.63 645.555 236.477C633.65 229.845 616.523 221.878 596.697 212.623C570.016 200.202 539.771 186.098 512.966 170.979C481.854 153.436 461.732 137.995 451.411 123.817C433.961 99.8151 423.739 70.2212 421.041 35.8516C418.863 8.36096 421.487 -22.198 428.788 -55.0334C441.238 -110.906 463.291 -154.505 463.514 -154.925L463.959 -154.703C463.736 -154.257 441.708 -110.732 429.283 -54.9097C421.982 -22.1485 419.383 8.38571 421.561 35.8269C424.259 70.0975 434.456 99.6171 451.856 123.545C462.128 137.649 482.2 153.04 513.238 170.558C540.018 185.677 570.264 199.757 596.92 212.178C616.77 221.432 633.898 229.4 645.828 236.031C701.814 267.184 744.286 295.986 772.081 321.596C787.055 335.379 798.094 348.543 804.876 360.717C811.955 373.485 814.628 385.51 812.771 396.497Z" fill="url(#paint18_linear_234_211)"/>
  3932. <path d="M805.495 398.303L805 398.204C806.93 387.539 804.48 375.811 797.748 363.315C791.288 351.364 780.67 338.373 766.215 324.714C739.485 299.45 698.275 270.698 643.798 239.298C631.918 232.443 614.889 224.253 595.163 214.751C569.447 202.379 540.266 188.325 514.451 173.355C484.502 155.984 464.974 140.717 454.678 126.687C437.08 102.636 426.586 72.8688 423.517 38.2023C421.041 10.4642 423.294 -20.4412 430.174 -53.6725C441.882 -110.213 463.291 -154.48 463.514 -154.925L463.959 -154.703C463.736 -154.257 442.352 -110.04 430.645 -53.524C423.764 -20.3422 421.536 10.5137 423.987 38.2023C427.056 72.7946 437.525 102.463 455.074 126.44C465.296 140.42 484.799 155.638 514.674 172.959C540.489 187.929 569.645 201.959 595.361 214.331C615.087 223.832 632.141 232.023 644.021 238.877C670.554 254.169 694.116 268.941 714.016 282.723C735.079 297.322 752.751 311.328 766.537 324.368C781.041 338.076 791.684 351.091 798.169 363.117C804.975 375.687 807.45 387.539 805.495 398.303Z" fill="url(#paint19_linear_234_211)"/>
  3933. <path d="M798.193 400.134L797.698 400.035C799.728 389.593 797.5 378.038 791.04 365.715C784.853 353.912 774.631 341.07 760.671 327.486C747.38 314.594 730.302 300.663 709.858 286.064C690.627 272.331 667.782 257.534 641.967 242.143C630.111 235.066 613.206 226.653 593.628 216.904C568.853 204.582 540.761 190.601 515.911 175.755C487.126 158.582 468.142 143.464 457.895 129.582C440.124 105.506 429.382 75.5659 425.942 40.5778C423.17 12.617 425.051 -18.6348 431.511 -52.262C442.5 -109.52 463.291 -154.48 463.489 -154.925L463.934 -154.727C463.736 -154.282 442.971 -109.371 431.981 -52.1631C425.521 -18.5853 423.665 12.617 426.412 40.5283C429.853 75.4175 440.57 105.284 458.291 129.285C468.489 143.117 487.423 158.186 516.159 175.334C541.008 190.156 569.076 204.136 593.851 216.459C613.454 226.208 630.359 234.621 642.239 241.723C668.054 257.138 690.899 271.935 710.155 285.668C730.599 300.267 747.727 314.223 761.018 327.139C775.051 340.748 785.298 353.64 791.486 365.492C797.995 377.914 800.248 389.568 798.193 400.134Z" fill="url(#paint20_linear_234_211)"/>
  3934. <path d="M790.917 401.94L790.422 401.841C792.55 391.597 790.521 380.24 784.382 368.09C778.492 356.461 768.666 343.742 755.152 330.257C730.079 305.24 692.483 277.354 640.209 244.988C628.403 237.689 611.622 229.053 592.193 219.032C544.053 194.238 484.131 163.382 461.162 132.477C443.243 108.376 432.229 78.2627 428.392 42.9776C425.323 14.7693 426.858 -16.8041 432.897 -50.852C443.169 -108.803 463.316 -154.455 463.514 -154.901L463.959 -154.703C463.761 -154.258 443.639 -108.654 433.367 -50.753C427.328 -16.7546 425.818 14.7694 428.887 42.9281C432.699 78.1142 443.688 108.154 461.558 132.18C484.478 163.011 544.325 193.842 592.44 218.611C611.87 228.608 628.651 237.268 640.482 244.568C692.805 276.958 730.426 304.869 755.523 329.91C769.062 343.42 778.937 356.188 784.828 367.868C791.016 380.141 793.07 391.597 790.917 401.94Z" fill="url(#paint21_linear_234_211)"/>
  3935. <path d="M783.615 403.771L783.12 403.672C785.348 393.651 783.516 382.467 777.675 370.49C772.081 359.034 762.651 346.414 749.608 333.028C725.55 308.309 689.166 280.447 638.378 247.834C626.621 240.287 609.989 231.429 590.757 221.16C544.647 196.564 487.25 165.956 464.355 135.372C446.287 111.222 435.001 80.9351 430.793 45.3531C427.427 16.8974 428.59 -14.9978 434.209 -49.4663C443.787 -108.11 463.266 -154.455 463.464 -154.901L463.91 -154.703C463.712 -154.233 444.258 -107.961 434.704 -49.3673C429.085 -14.973 427.947 16.8974 431.288 45.3036C435.471 80.8114 446.733 110.999 464.751 135.075C487.571 165.585 544.919 196.168 590.98 220.739C610.236 231.008 626.844 239.866 638.625 247.438C689.439 280.051 725.847 307.937 749.929 332.706C762.998 346.142 772.477 358.787 778.071 370.293C784.036 382.368 785.892 393.626 783.615 403.771Z" fill="url(#paint22_linear_234_211)"/>
  3936. <path d="M776.338 405.578L775.868 405.454C778.219 395.63 776.586 384.669 771.042 372.816C765.745 361.508 756.686 349.037 744.138 335.75C721.07 311.327 685.924 283.49 636.645 250.655C624.938 242.836 608.479 233.755 589.445 223.238C545.34 198.841 490.467 168.504 467.647 138.242C449.431 114.067 437.872 83.6074 433.293 47.7037C429.63 19.0006 430.422 -13.241 435.62 -48.0806C444.48 -107.417 463.316 -154.455 463.514 -154.901L463.984 -154.703C463.786 -154.233 444.975 -107.269 436.139 -47.9817C430.942 -13.1667 430.174 19.0253 433.813 47.679C438.367 83.4837 449.901 113.869 468.068 137.97C490.814 168.133 545.637 198.469 589.718 222.842C608.751 233.383 625.21 242.465 636.942 250.284C686.246 283.144 721.441 310.981 744.509 335.453C757.107 348.79 766.191 361.31 771.487 372.668C777.056 384.57 778.69 395.655 776.338 405.578Z" fill="url(#paint23_linear_234_211)"/>
  3937. <path d="M769.037 407.409L768.567 407.285C771.017 397.684 769.582 386.896 764.359 375.217C759.359 364.082 750.697 351.734 738.618 338.521C716.541 314.371 682.607 286.558 634.863 253.525C623.206 245.458 606.944 236.13 588.134 225.317C546.033 201.142 493.611 171.053 470.889 141.137C452.5 116.938 440.694 86.3045 435.743 50.1039C431.783 21.1533 432.204 -11.4099 436.981 -46.6702C445.124 -106.699 463.316 -154.406 463.489 -154.901L463.959 -154.728C463.786 -154.258 445.594 -106.6 437.476 -46.6207C432.699 -11.4099 432.278 21.1038 436.238 50.0297C441.164 86.156 452.945 116.69 471.285 140.816C493.932 170.657 546.305 200.721 588.381 224.871C607.192 235.685 623.453 245.013 635.135 253.104C682.904 286.163 716.887 314 738.99 338.175C751.093 351.437 759.78 363.81 764.805 375.019C770.077 386.797 771.512 397.684 769.037 407.409Z" fill="url(#paint24_linear_234_211)"/>
  3938. <path d="M761.736 409.24L761.265 409.116C763.815 399.713 762.602 389.123 757.652 377.592C752.949 366.606 744.682 354.382 733.074 341.268C711.962 317.39 679.241 289.602 633.032 256.371C621.423 248.032 604.618 237.986 586.822 227.371C546.676 203.418 496.704 173.602 474.107 144.032C455.569 119.808 443.49 89.0016 438.169 52.4793C433.912 23.2813 433.986 -9.60358 438.342 -45.2846C445.767 -106.007 463.316 -154.406 463.489 -154.901L463.959 -154.728C463.786 -154.258 446.238 -105.908 438.837 -45.2103C434.481 -9.57883 434.432 23.2566 438.664 52.4051C443.961 88.8284 456.014 119.561 474.503 143.711C497.051 173.206 546.973 202.998 587.069 226.925C604.865 237.54 621.696 247.587 633.304 255.95C679.538 289.206 712.308 316.994 733.421 340.921C745.054 354.085 753.345 366.358 758.072 377.394C763.097 388.999 764.31 399.713 761.736 409.24Z" fill="url(#paint25_linear_234_211)"/>
  3939. <path d="M754.459 411.046L753.989 410.898C756.637 401.718 755.622 391.276 750.994 379.918C746.588 369.08 738.717 356.98 727.604 343.94C707.457 320.31 675.949 292.571 631.274 259.142C619.74 250.506 603.157 240.213 585.609 229.301C566.427 217.374 544.696 203.889 525.316 189.958C503.09 173.973 487.398 159.869 477.374 146.853C458.687 122.58 446.312 91.6246 440.644 54.8055C436.09 25.36 435.793 -7.84659 439.728 -43.9482C446.436 -105.388 463.34 -154.455 463.514 -154.95L463.984 -154.777C463.811 -154.282 446.906 -105.264 440.223 -43.874C436.288 -7.84659 436.61 25.3352 441.139 54.7312C446.807 91.4514 459.133 122.357 477.77 146.557C487.769 159.522 503.412 173.602 525.613 189.562C544.968 203.493 566.7 216.978 585.881 228.905C603.43 239.817 620.037 250.111 631.596 258.771C676.296 292.2 707.828 319.963 728 343.643C739.138 356.708 747.058 368.857 751.489 379.745C756.117 391.226 757.132 401.742 754.459 411.046Z" fill="url(#paint26_linear_234_211)"/>
  3940. <path d="M747.157 412.877L746.687 412.729C749.434 403.746 748.618 393.502 744.311 382.293C740.202 371.604 732.728 359.628 722.085 346.687C702.878 323.303 672.583 295.59 629.468 262.012C617.983 253.08 601.648 242.489 584.372 231.305C566.106 219.477 545.414 206.066 526.925 192.308C505.739 176.521 490.591 162.615 480.617 149.773C461.756 125.474 449.134 94.3463 443.07 57.2055C438.218 27.5126 437.55 -6.04042 441.065 -42.5132C447.054 -104.646 463.316 -154.406 463.489 -154.901L463.959 -154.752C463.786 -154.258 447.525 -104.547 441.56 -42.4637C438.045 -6.01569 438.713 27.4878 443.565 57.1312C449.604 94.1731 462.202 125.227 481.013 149.451C490.962 162.269 506.06 176.15 527.222 191.912C545.686 205.67 566.378 219.057 584.644 230.884C601.945 242.093 618.28 252.659 629.789 261.616C672.93 295.219 703.249 322.932 722.481 346.365C733.148 359.356 740.648 371.381 744.781 382.095C749.137 393.428 749.929 403.771 747.157 412.877Z" fill="url(#paint27_linear_234_211)"/>
  3941. <path d="M739.881 414.683L739.41 414.535C745.004 397.263 737.554 375.959 716.615 349.408C698.349 326.248 669.242 298.584 627.71 264.858C616.275 255.579 600.212 244.716 583.184 233.21C547.048 208.788 506.085 181.099 483.859 152.643C464.85 128.32 451.955 96.9939 445.52 59.5809C440.372 29.6405 439.332 -4.23412 442.426 -41.1276C447.698 -103.953 463.341 -154.406 463.489 -154.901L463.959 -154.752C463.811 -154.258 448.168 -103.829 442.921 -41.0781C439.827 -4.23412 440.867 29.6158 445.99 59.5067C452.401 96.8455 465.271 128.073 484.23 152.346C506.407 180.728 547.32 208.392 583.431 232.789C600.46 244.296 616.548 255.183 627.983 264.462C669.564 298.213 698.671 325.877 716.961 349.087C738.049 375.786 745.524 397.239 739.881 414.683Z" fill="url(#paint28_linear_234_211)"/>
  3942. <path d="M732.579 416.514L732.109 416.341C737.9 399.491 731.044 378.483 711.095 352.106C693.745 329.143 665.851 301.529 625.879 267.679C614.518 258.053 598.702 246.869 581.946 235.041C547.815 210.916 509.129 183.574 487.076 155.539C467.919 131.19 454.752 99.6911 447.945 61.9563C442.5 31.7933 441.114 -2.42778 443.787 -39.7419C448.341 -103.26 463.34 -154.406 463.489 -154.901L463.959 -154.752C463.811 -154.233 448.812 -103.136 444.282 -39.6924C441.609 -2.42776 443.02 31.7438 448.44 61.8821C455.222 99.5426 468.365 130.943 487.472 155.242C509.501 183.227 548.136 210.545 582.243 234.645C598.999 246.498 614.815 257.682 626.2 267.308C666.197 301.182 694.116 328.821 711.491 351.809C731.539 378.31 738.445 399.491 732.579 416.514Z" fill="url(#paint29_linear_234_211)"/>
  3943. <path d="M725.302 418.321L724.832 418.148C730.822 401.693 724.535 380.982 705.626 354.803C689.166 332.013 662.51 304.449 624.097 270.524C612.785 260.528 597.217 248.997 580.733 236.798C548.607 212.994 512.174 186.023 490.319 158.434C470.988 134.036 457.549 102.388 450.396 64.3567C444.654 33.9462 442.896 -0.596573 445.149 -38.3313C448.985 -102.542 463.34 -154.356 463.489 -154.876L463.959 -154.752C463.811 -154.233 449.455 -102.443 445.644 -38.2818C443.391 -0.596573 445.149 33.8967 450.891 64.2824C458.044 102.24 471.459 133.813 490.715 158.137C512.545 185.677 548.929 212.648 581.055 236.427C597.539 248.626 613.107 260.157 624.443 270.178C662.856 304.127 689.562 331.741 706.046 354.531C725.055 380.834 731.342 401.718 725.302 418.321Z" fill="url(#paint30_linear_234_211)"/>
  3944. <path d="M718.001 420.152L717.531 419.979C723.718 403.92 718.026 383.506 700.156 357.525C684.587 334.909 659.119 307.393 622.314 273.395C611.028 262.978 595.707 251.051 579.496 238.456C549.349 215.024 515.193 188.448 493.561 161.329C474.082 136.906 460.37 105.086 452.821 66.757C446.782 36.0991 444.654 1.2099 446.485 -36.896C449.604 -101.8 463.316 -154.307 463.464 -154.851L463.934 -154.727C463.786 -154.208 450.074 -101.726 446.98 -36.8713C445.149 1.2099 447.277 36.0496 453.292 66.658C460.816 104.912 474.503 136.659 493.932 161.032C515.54 188.102 549.671 214.652 579.793 238.06C596.004 250.68 611.325 262.582 622.636 273.024C659.465 307.047 684.959 334.612 700.552 357.253C718.545 383.358 724.263 403.945 718.001 420.152Z" fill="url(#paint31_linear_234_211)"/>
  3945. <path d="M710.699 421.958L710.229 421.76C716.615 406.122 711.541 385.98 694.661 360.197C679.959 337.729 655.703 310.263 620.508 276.191C609.246 265.303 594.173 252.981 578.209 239.941C550.042 216.904 518.114 190.824 496.779 164.174C477.102 139.752 463.093 107.783 455.173 69.157C448.837 38.2516 446.337 3.0408 447.772 -35.4857C450.198 -101.107 463.34 -154.356 463.464 -154.876L463.935 -154.752C463.811 -154.233 450.668 -101.008 448.242 -35.461C446.807 3.04082 449.307 38.2021 455.643 69.0828C463.563 107.634 477.523 139.529 497.15 163.877C518.436 190.477 550.364 216.558 578.506 239.57C594.47 252.61 609.543 264.957 620.829 275.844C656.075 309.917 680.355 337.432 695.057 359.925C712.061 385.857 717.159 406.147 710.699 421.958Z" fill="url(#paint32_linear_234_211)"/>
  3946. <path d="M703.423 423.789L702.977 423.591C709.586 408.349 705.081 388.48 689.241 362.894C675.405 340.55 652.362 313.134 618.75 279.061C607.464 267.605 592.564 254.787 576.798 241.178C550.661 218.636 521.034 193.1 500.046 167.069C480.196 142.622 465.939 110.48 457.648 71.5325C451.015 40.3797 448.143 4.84714 449.158 -34.1001C450.866 -100.414 463.365 -154.332 463.489 -154.876L463.959 -154.752C463.835 -154.208 451.361 -100.315 449.653 -34.0753C448.638 4.84714 451.51 40.3302 458.143 71.4335C466.434 110.306 480.666 142.375 500.442 166.748C521.381 192.729 551.008 218.265 577.12 240.782C592.886 254.391 607.786 267.233 619.097 278.69C652.733 312.787 675.801 340.253 689.661 362.622C705.576 388.381 710.081 408.374 703.423 423.789Z" fill="url(#paint33_linear_234_211)"/>
  3947. <path d="M696.121 425.596L695.676 425.398C702.482 410.527 698.596 390.954 683.795 365.567C670.826 343.322 648.971 315.955 616.968 281.882C605.583 269.758 590.782 256.272 575.14 241.995C551.082 220.071 523.831 195.204 503.313 169.965C483.314 145.493 468.786 113.177 460.123 73.9328C453.193 42.5325 449.975 6.67834 450.544 -32.6895C451.534 -99.6965 463.39 -154.307 463.514 -154.851L464.009 -154.752C463.885 -154.208 452.054 -99.647 451.064 -32.6648C450.47 6.65359 453.688 42.483 460.618 73.8338C469.281 113.004 483.785 145.245 503.709 169.668C524.203 194.882 551.428 219.725 575.486 241.648C591.153 255.926 605.93 269.411 617.34 281.56C649.367 315.658 671.247 343.049 684.241 365.344C699.116 390.88 703.002 410.576 696.121 425.596Z" fill="url(#paint34_linear_234_211)"/>
  3948. <path d="M688.845 427.427L688.399 427.204C695.404 412.729 692.136 393.428 678.375 368.239C666.247 346.068 645.58 318.751 615.186 284.703C603.553 271.687 588.728 257.336 573.011 242.143C551.156 221.011 526.405 197.059 506.555 172.835C486.408 148.313 471.607 115.849 462.573 76.2833C455.346 44.6604 451.757 8.43501 451.93 -31.3287C452.203 -99.0286 463.415 -154.332 463.514 -154.876L464.009 -154.777C463.885 -154.233 452.698 -98.9791 452.425 -31.304C452.277 8.43501 455.841 44.5861 463.068 76.1843C472.102 115.676 486.854 148.091 506.951 172.538C526.777 196.762 551.527 220.69 573.358 241.821C589.074 257.014 603.925 271.39 615.558 284.406C645.976 318.478 666.668 345.821 678.821 368.041C692.631 393.354 695.923 412.803 688.845 427.427Z" fill="url(#paint35_linear_234_211)"/>
  3949. <path d="M681.543 429.258L681.098 429.035C688.325 414.931 685.652 395.928 672.93 370.936C661.668 348.815 642.189 321.547 613.38 287.573C601.276 273.296 586.055 257.633 569.942 241.054C549.597 220.146 528.559 198.495 509.798 175.73C489.502 151.184 474.429 118.522 464.999 78.6589C457.475 46.7885 453.514 10.2415 453.267 -29.9182C452.821 -98.3108 463.39 -154.307 463.489 -154.851L463.984 -154.752C463.885 -154.183 453.316 -98.2613 453.762 -29.8934C454.034 10.2415 457.97 46.739 465.494 78.5847C474.899 118.373 489.923 150.961 510.169 175.433C528.93 198.198 549.943 219.799 570.288 240.733C586.401 257.311 601.648 272.974 613.751 287.276C642.585 321.275 662.089 348.592 673.351 370.738C686.171 395.853 688.845 415.005 681.543 429.258Z" fill="url(#paint36_linear_234_211)"/>
  3950. <path d="M674.242 431.064L673.796 430.817C681.246 417.108 679.192 398.377 667.485 373.583C657.065 351.487 638.774 324.269 611.573 290.369C598.381 273.939 581.971 255.975 564.621 236.947C547.518 218.191 529.821 198.816 513.015 178.575C492.546 154.004 477.226 121.169 467.424 81.0094C459.603 48.8916 455.296 12.0229 454.603 -28.5574C453.44 -97.6429 463.365 -154.307 463.464 -154.876L463.959 -154.802C463.86 -154.233 453.96 -97.6182 455.123 -28.5574C455.816 11.9982 460.123 48.8174 467.919 80.9104C477.696 120.996 492.992 153.757 513.386 178.278C530.192 198.494 547.864 217.894 564.967 236.625C582.342 255.653 598.752 273.617 611.944 290.072C639.17 323.996 657.485 351.24 667.93 373.385C679.712 398.328 681.766 417.207 674.242 431.064Z" fill="url(#paint37_linear_234_211)"/>
  3951. <path d="M666.965 432.895L666.544 432.648C670.43 425.893 671.965 417.653 671.123 408.102C670.331 398.922 667.287 388.232 662.114 376.281C652.535 354.184 635.432 327.015 609.815 293.24C593.48 271.712 573.061 247.958 551.453 222.818C539.969 209.456 528.113 195.649 516.282 181.495C495.665 156.875 480.072 123.891 469.899 83.4098C461.781 51.0445 457.103 13.8541 455.989 -27.1468C454.108 -96.9251 463.39 -154.282 463.489 -154.851L463.984 -154.777C463.885 -154.208 454.628 -96.9004 456.509 -27.1468C457.623 13.8047 462.276 50.9703 470.394 83.2861C480.542 123.693 496.11 156.628 516.654 181.174C528.484 195.327 540.365 209.134 551.824 222.472C573.432 247.636 593.851 271.391 610.187 292.918C635.853 326.718 652.981 353.937 662.559 376.058C667.757 388.059 670.801 398.823 671.593 408.052C672.435 417.702 670.876 426.066 666.965 432.895Z" fill="url(#paint38_linear_234_211)"/>
  3952. <path d="M659.663 434.701L659.243 434.454C662.287 429.431 664.069 423.492 664.465 416.812C664.861 410.304 663.995 402.856 661.916 394.69C657.881 379.003 649.392 360.543 636.002 338.224C613.355 300.514 577.417 253.08 519.525 184.366C498.759 159.72 482.894 126.539 472.35 85.7603C463.934 53.1476 458.885 15.6108 457.376 -25.786C454.777 -96.2572 463.415 -154.307 463.489 -154.876L463.984 -154.802C463.885 -154.233 455.272 -96.2325 457.871 -25.786C459.405 15.5861 464.429 53.0734 472.845 85.6366C483.364 126.341 499.18 159.448 519.896 184.044C577.813 252.758 613.751 300.242 636.422 337.977C649.862 360.346 658.352 378.854 662.411 394.567C664.515 402.782 665.381 410.254 664.985 416.836C664.539 423.591 662.757 429.629 659.663 434.701Z" fill="url(#paint39_linear_234_211)"/>
  3953. <path d="M532.445 853C531.454 853 530.464 853 529.45 852.975C508.535 852.777 487.398 850.476 466.608 846.146C444.654 841.568 422.972 834.689 402.181 825.707C333.696 796.113 240.188 728.488 183.632 574.431C168.386 532.935 146.036 498.318 117.127 471.57C94.0098 450.166 66.7097 433.711 35.9693 422.675C8.61967 412.852 -16.4776 409.215 -32.6893 407.878C-50.2624 406.443 -61.4992 407.359 -61.5982 407.359L-61.6477 406.864C-61.524 406.864 -50.2624 405.948 -32.6398 407.384C-16.4033 408.72 8.71868 412.357 36.1425 422.205C66.9572 433.266 94.3315 449.77 117.473 471.199C146.432 497.996 168.831 532.688 184.102 574.258C240.584 728.141 333.968 795.693 402.379 825.237C423.12 834.194 444.777 841.073 466.706 845.651C487.472 849.981 508.585 852.282 529.45 852.48C568.927 852.851 606.895 845.775 639.269 831.967L639.467 832.413C607.835 845.923 570.907 853 532.445 853Z" fill="#7DB4EA"/>
  3954. <path d="M530.465 843.473C510.318 843.473 489.948 841.519 469.875 837.634C448.144 833.452 426.66 826.994 406.043 818.457C360.674 799.676 319.563 771.047 283.873 733.412C243.727 691.099 210.858 637.652 186.182 574.629C170.019 533.356 146.902 499.11 117.523 472.832C94.0098 451.824 66.4375 435.839 35.5733 425.348C8.12469 415.995 -16.923 412.827 -33.0853 411.788C-50.6088 410.675 -61.7467 411.788 -61.8704 411.788L-61.9199 411.293C-61.8209 411.293 -50.6088 410.18 -33.0605 411.293C-16.8736 412.332 8.22371 415.524 35.7218 424.878C66.6355 435.394 94.2821 451.403 117.82 472.461C147.273 498.788 170.415 533.084 186.602 574.431C211.279 637.405 244.098 690.778 284.195 733.065C319.86 770.652 360.897 799.231 406.216 817.987C426.808 826.524 448.267 832.957 469.974 837.139C490.022 840.999 510.367 842.954 530.465 842.954C530.935 842.954 531.405 842.954 531.9 842.954C570.66 842.781 607.91 835.357 639.615 821.501L639.813 821.946C608.033 835.828 570.734 843.276 531.9 843.449C531.405 843.473 530.935 843.473 530.465 843.473Z" fill="#7DB4EA"/>
  3955. <path d="M528.361 834.021C509.971 834.021 491.383 832.388 473.043 829.147C451.534 825.336 430.224 819.298 409.73 811.182C364.857 793.416 323.919 765.95 288.105 729.527C247.811 688.551 214.348 636.489 188.632 574.802C171.529 533.752 147.694 499.852 117.795 474.069C93.886 453.457 66.0661 437.943 35.103 427.995C7.55538 419.137 -17.4429 416.39 -33.5556 415.673C-51.0049 414.881 -62.0932 416.192 -62.217 416.192L-62.2665 415.698C-62.1675 415.673 -51.0544 414.361 -33.5556 415.153C-17.4181 415.896 7.62964 418.617 35.2267 427.501C66.2642 437.472 94.1335 453.012 118.117 473.673C148.065 499.506 171.95 533.455 189.102 574.579C214.793 636.217 248.207 688.229 288.476 729.156C324.241 765.53 365.105 792.971 409.928 810.712C430.397 818.804 451.658 824.841 473.142 828.652C493.413 832.24 513.98 833.848 534.276 833.477C572.343 832.759 608.875 824.99 639.937 811.059L640.135 811.504C609.023 825.46 572.417 833.229 534.276 833.972C532.296 833.996 530.341 834.021 528.361 834.021Z" fill="#7DB4EA"/>
  3956. <path d="M526.133 824.643C509.501 824.643 492.72 823.307 476.137 820.635C454.826 817.22 433.689 811.578 413.319 803.883C368.916 787.131 328.201 760.779 292.313 725.593C251.895 685.977 217.862 635.277 191.181 574.975C173.113 534.123 148.536 500.595 118.142 475.306C93.8117 455.066 65.7444 440.046 34.6822 430.643C7.03558 422.28 -17.8884 419.978 -33.9517 419.558C-51.3514 419.088 -62.3408 420.597 -62.4398 420.622L-62.514 420.127C-62.415 420.102 -51.3762 418.593 -33.9517 419.063C-17.8637 419.508 7.10983 421.785 34.8059 430.173C65.9424 439.6 94.084 454.67 118.463 474.935C148.932 500.273 173.559 533.875 191.651 574.802C218.308 635.079 252.291 685.705 292.684 725.271C328.548 760.408 369.189 786.711 413.517 803.462C433.838 811.133 454.95 816.775 476.236 820.189C496.284 823.406 516.579 824.693 536.603 824C574.001 822.713 609.865 814.647 640.259 800.617L640.457 801.062C609.989 815.117 574.075 823.233 536.603 824.495C533.113 824.569 529.623 824.643 526.133 824.643Z" fill="#7DB4EA"/>
  3957. <path d="M523.732 815.339C508.882 815.339 493.908 814.275 479.107 812.123C457.97 809.079 436.981 803.858 416.735 796.583C372.827 780.821 332.335 755.607 296.347 721.633C255.805 683.354 221.253 634.064 193.632 575.124C174.598 534.494 149.253 501.312 118.364 476.494C93.6385 456.649 65.2989 442.099 34.1377 433.241C6.41687 425.348 -18.4576 423.517 -34.4466 423.393C-51.7721 423.244 -62.6872 424.977 -62.7862 424.977L-62.8605 424.482C-62.7615 424.457 -51.8216 422.725 -34.4714 422.873C-18.4576 423.022 6.46637 424.853 34.2615 432.746C65.4969 441.629 93.886 456.204 118.662 476.098C149.649 500.941 175.019 534.197 194.102 574.901C221.699 633.767 256.201 683.008 296.694 721.262C332.607 755.186 373.05 780.376 416.908 796.113C437.129 803.363 458.069 808.584 479.181 811.628C499.006 814.473 519.079 815.438 538.83 814.449C575.585 812.617 610.756 804.204 640.556 790.076L640.779 790.521C610.929 804.675 575.709 813.112 538.88 814.943C533.855 815.216 528.806 815.339 523.732 815.339Z" fill="#7DB4EA"/>
  3958. <path d="M521.208 806.159C509.03 806.159 496.779 805.442 484.626 804.006C464.009 801.557 443.49 797.029 423.615 790.521C379.534 776.095 338.621 752.093 302.015 719.233C260.657 682.092 225.04 633.668 196.156 575.346C176.133 534.914 150.045 502.079 118.612 477.78C93.4652 458.332 64.8781 444.252 33.6179 435.938C5.79809 428.54 -19.0022 427.179 -34.9169 427.327C-52.1682 427.5 -62.9842 429.43 -63.0832 429.455L-63.1823 428.96C-63.0832 428.936 -52.2424 427.005 -34.9416 426.832C-19.0022 426.684 5.87234 428.045 33.7417 435.468C65.0514 443.807 93.7127 457.911 118.909 477.384C150.392 501.757 176.529 534.642 196.602 575.124C225.461 633.396 261.053 681.746 302.362 718.862C338.894 751.697 379.757 775.65 423.789 790.051C443.614 796.534 464.108 801.062 484.7 803.512C504.006 805.813 523.534 806.283 542.716 804.922C578.258 802.398 612.216 793.663 640.927 779.658L641.15 780.104C612.389 794.134 578.382 802.893 542.766 805.417C535.588 805.912 528.41 806.159 521.208 806.159Z" fill="#7DB4EA"/>
  3959. <path d="M518.51 797.053C508.412 797.053 498.264 796.559 488.166 795.569C467.796 793.565 447.5 789.482 427.823 783.494C384.039 770.132 343.2 747.318 306.421 715.621C264.79 679.766 228.53 632.629 198.681 575.495C177.643 535.286 150.788 502.797 118.86 478.968C93.3168 459.915 64.4574 446.306 33.123 438.536C5.22887 431.633 -19.4971 430.717 -35.3624 431.163C-52.5394 431.657 -63.2317 433.81 -63.3555 433.81L-63.4545 433.315C-63.3555 433.291 -52.6136 431.138 -35.4119 430.643C-19.5466 430.198 5.25362 431.113 33.1972 438.017C64.6059 445.786 93.5148 459.42 119.132 478.523C151.135 502.401 178.039 534.939 199.102 575.223C228.926 632.307 265.161 679.395 306.743 715.2C343.473 746.848 384.262 769.637 427.972 782.974C447.624 788.962 467.895 793.02 488.215 795.024C507.248 796.905 526.455 797.004 545.29 795.346C580.065 792.253 613.231 783.197 641.199 769.117L641.422 769.563C613.404 783.667 580.189 792.748 545.34 795.841C536.454 796.658 527.495 797.053 518.51 797.053Z" fill="#7DB4EA"/>
  3960. <path d="M515.639 788.096C507.644 788.096 499.65 787.774 491.68 787.156C471.582 785.572 451.485 781.984 431.981 776.491C388.494 764.218 347.705 742.542 310.752 712.057C268.849 677.49 231.97 631.614 201.156 575.668C179.103 535.657 151.481 503.539 119.008 480.18C93.0444 461.499 63.9376 448.384 32.5041 441.159C4.53574 434.726 -20.116 434.28 -35.8822 435.023C-52.9603 435.839 -63.5536 438.19 -63.6526 438.214L-63.7516 437.72C-63.6526 437.695 -53.0098 435.319 -35.8822 434.528C-20.0913 433.785 4.63474 434.231 32.6526 440.664C64.1356 447.889 93.3167 461.053 119.33 479.76C151.852 503.143 179.548 535.335 201.626 575.396C232.416 631.268 269.245 677.119 311.099 711.637C348.002 742.072 388.742 763.723 432.154 775.971C451.633 781.465 471.681 785.052 491.754 786.636C510.491 788.096 529.4 787.849 547.938 785.844C581.946 782.182 614.345 772.779 641.571 758.675L641.793 759.121C614.518 773.274 582.07 782.677 547.988 786.339C537.271 787.502 526.48 788.096 515.639 788.096Z" fill="#7DB4EA"/>
  3961. <path d="M512.619 779.238C506.803 779.238 500.986 779.064 495.17 778.743C475.32 777.604 455.445 774.487 436.115 769.488C392.925 758.304 352.185 737.791 315.059 708.494C272.883 675.213 235.411 630.6 203.68 575.866C180.613 536.077 152.199 504.306 119.206 481.442C92.8217 463.157 63.4674 450.512 31.9597 443.831C3.91706 437.893 -20.6604 437.893 -36.3524 438.932C-53.3562 440.07 -63.8505 442.619 -63.9495 442.644L-64.0732 442.174C-63.9742 442.149 -53.4304 439.575 -36.4019 438.437C-20.6852 437.398 3.94181 437.398 32.0339 443.337C63.6159 450.017 93.0197 462.686 119.478 481.022C152.521 503.91 181.009 535.731 204.126 575.618C235.832 630.303 273.255 674.892 315.38 708.123C352.457 737.371 393.123 757.859 436.263 769.043C455.569 774.041 475.394 777.159 495.219 778.297C513.683 779.361 532.296 778.718 550.488 776.417C583.753 772.185 615.36 762.461 641.843 748.283L642.066 748.728C615.508 762.931 583.852 772.68 550.537 776.912C538.038 778.446 525.341 779.238 512.619 779.238Z" fill="#7DB4EA"/>
  3962. <path d="M509.476 770.528C505.862 770.528 502.249 770.454 498.66 770.33C479.032 769.612 459.38 766.989 440.223 762.486C397.305 752.39 356.64 733.041 319.341 704.931C276.893 672.937 238.826 629.585 206.205 576.015C182.098 536.424 152.867 505.024 119.354 482.655C92.5494 464.765 62.9475 452.591 31.3656 446.454C3.27346 441.011 -21.2298 441.456 -36.8227 442.792C-53.7275 444.252 -64.1228 447.024 -64.2218 447.048L-64.3456 446.578C-64.2466 446.553 -53.8265 443.757 -36.8722 442.322C-21.2545 440.986 3.29822 440.516 31.4646 445.984C63.1208 452.121 92.7722 464.32 119.652 482.259C153.238 504.677 182.518 536.127 206.65 575.792C239.247 629.289 277.264 672.615 319.662 704.56C356.912 732.62 397.528 751.97 440.372 762.041C459.504 766.544 479.131 769.167 498.709 769.884C516.901 770.528 535.192 769.538 553.111 766.89C585.634 762.115 616.449 752.044 642.214 737.791L642.462 738.237C616.647 752.514 585.782 762.61 553.186 767.385C538.756 769.464 524.104 770.528 509.476 770.528Z" fill="#7DB4EA"/>
  3963. <path d="M506.184 761.966C504.823 761.966 503.461 761.966 502.1 761.942C482.72 761.669 463.266 759.517 444.282 755.508C401.637 746.526 361.021 728.314 323.573 701.393C280.853 670.685 242.217 628.571 208.729 576.188C183.558 536.82 153.535 505.766 119.478 483.892C92.2524 466.398 62.3783 454.694 30.7468 449.102C2.58045 444.128 -21.8238 445.044 -37.3177 446.677C-54.1235 448.434 -64.3951 451.428 -64.4941 451.453L-64.6426 450.983C-64.5436 450.958 -54.2225 447.964 -37.392 446.182C-21.8485 444.549 2.58046 443.634 30.8211 448.607C62.5268 454.199 92.4504 465.928 119.751 483.447C153.857 505.37 183.954 536.473 209.15 575.891C242.613 628.224 281.2 670.289 323.87 700.947C361.293 727.819 401.835 746.006 444.406 754.988C463.365 758.997 482.794 761.15 502.15 761.422C520.069 761.669 538.088 760.284 555.685 757.339C587.465 751.994 617.513 741.602 642.561 727.275L642.808 727.696C617.711 742.047 587.614 752.465 555.784 757.834C539.424 760.581 522.792 761.966 506.184 761.966Z" fill="#7DB4EA"/>
  3964. <path d="M502.793 753.578C484.552 753.578 466.236 751.896 448.292 748.555C405.919 740.662 365.352 723.613 327.731 697.879C284.739 668.458 245.534 627.581 211.205 576.386C184.969 537.24 154.129 506.558 119.553 485.179C91.8812 468.081 61.7843 456.847 30.0786 451.799C1.86271 447.32 -22.4425 448.657 -37.8375 450.587C-54.5443 452.665 -64.6921 455.857 -64.7911 455.882L-64.9396 455.412C-64.8406 455.387 -54.6433 452.195 -37.9118 450.092C-22.4673 448.162 1.88746 446.801 30.1528 451.304C61.9328 456.352 92.1039 467.611 119.825 484.734C154.476 506.162 185.365 536.894 211.65 576.113C245.955 627.259 285.11 668.112 328.053 697.483C365.625 723.192 406.117 740.216 448.416 748.085C467.202 751.574 486.433 753.281 505.54 753.083C523.188 752.91 540.909 751.178 558.21 747.887C589.272 741.973 618.552 731.259 642.858 716.833L643.105 717.254C618.75 731.68 589.421 742.443 558.309 748.357C540.984 751.648 523.237 753.405 505.565 753.553C504.6 753.553 503.684 753.578 502.793 753.578Z" fill="#7DB4EA"/>
  3965. <path d="M499.279 745.363C483.611 745.363 467.919 744.101 452.302 741.577C410.176 734.797 369.659 718.887 331.889 694.341C288.625 666.207 248.875 626.566 213.729 576.509C186.404 537.612 154.748 507.275 119.627 486.391C91.5347 469.664 61.1903 458.925 29.4103 454.422C1.14495 450.413 -23.0613 452.22 -38.3573 454.422C-54.9403 456.822 -64.9891 460.212 -65.0881 460.237L-65.2366 459.767C-65.1376 459.742 -55.064 456.327 -38.4315 453.927C-23.086 451.7 1.14494 449.894 29.4846 453.902C61.3388 458.406 91.7574 469.169 119.899 485.921C155.095 506.855 186.8 537.216 214.175 576.188C249.296 626.195 288.996 665.786 332.211 693.87C369.931 718.392 410.374 734.277 452.425 741.033C488.512 746.847 524.97 745.932 560.784 738.311C591.129 731.853 619.641 720.767 643.204 706.292L643.452 706.713C619.815 721.237 591.277 732.323 560.858 738.806C540.439 743.185 519.871 745.363 499.279 745.363Z" fill="#7DB4EA"/>
  3966. <path d="M495.591 737.321C482.473 737.321 469.33 736.43 456.237 734.649C414.359 728.982 373.891 714.235 335.973 690.852C292.437 664.004 252.142 625.577 216.204 576.682C187.766 538.007 155.268 508.042 119.602 487.653C91.0644 471.322 60.4725 461.053 28.643 457.094C0.328117 453.581 -23.7544 455.808 -38.9513 458.332C-55.4106 461.053 -65.3109 464.617 -65.4099 464.666L-65.5831 464.196C-65.4841 464.171 -55.5591 460.558 -39.0256 457.837C-23.7791 455.337 0.328133 453.086 28.7172 456.599C60.621 460.558 91.2872 470.852 119.874 487.208C155.59 507.646 188.162 537.636 216.625 576.386C252.538 625.23 292.783 663.608 336.27 690.431C374.114 713.789 414.507 728.487 456.336 734.154C492.051 739.004 528.039 737.222 563.259 728.883C583.926 723.984 614.617 714.284 643.476 695.875L643.749 696.295C627.784 706.49 600.88 720.495 563.383 729.378C540.984 734.674 518.312 737.321 495.591 737.321Z" fill="#7DB4EA"/>
  3967. <path d="M491.804 729.477C481.26 729.477 470.716 728.908 460.172 727.745C418.542 723.192 378.124 709.608 340.082 687.388C296.298 661.802 255.459 624.637 218.729 576.856C189.176 538.428 155.837 508.859 119.652 488.965C90.6931 473.03 59.8537 463.231 27.95 459.816C-0.414398 456.773 -24.3731 459.445 -39.4711 462.241C-55.8313 465.26 -65.6079 469.046 -65.7069 469.095L-65.8801 468.625C-65.7811 468.576 -55.9798 464.79 -39.5701 461.771C-24.4474 458.975 -0.43914 456.278 27.9995 459.346C59.9527 462.786 90.8664 472.609 119.899 488.544C156.159 508.488 189.572 538.107 219.15 576.584C255.83 624.29 296.619 661.456 340.354 686.992C378.346 709.187 418.69 722.722 460.271 727.275C495.64 731.135 531.133 728.512 565.784 719.431C585.956 714.161 615.879 703.966 643.823 685.433L644.095 685.854C628.651 696.098 602.539 710.35 565.908 719.926C541.479 726.285 516.678 729.477 491.804 729.477Z" fill="#7DB4EA"/>
  3968. <path d="M487.893 721.856C479.948 721.856 472.003 721.534 464.058 720.866C422.65 717.451 382.282 705.03 344.091 683.973C300.035 659.674 258.676 623.696 221.204 577.054C190.538 538.898 156.357 509.7 119.602 490.301C90.1982 474.786 59.1112 465.433 27.1828 462.538C-1.23109 459.964 -25.0661 463.082 -40.0403 466.151C-56.2768 469.466 -65.9296 473.45 -66.0286 473.5L-66.2266 473.054C-66.1276 473.005 -56.45 469.021 -40.1888 465.68C-25.1651 462.612 -1.30534 459.494 27.1828 462.068C59.2102 464.938 90.3714 474.291 119.825 489.831C156.654 509.279 190.884 538.502 221.6 576.732C259.048 623.325 300.357 659.253 344.339 683.527C382.455 704.56 422.749 716.957 464.108 720.371C499.105 723.266 534.152 719.753 568.234 709.954C603.925 699.685 629.17 685.259 644.095 674.941L644.367 675.337C629.443 685.655 604.123 700.131 568.383 710.424C541.974 718.021 514.995 721.856 487.893 721.856Z" fill="#7DB4EA"/>
  3969. <path d="M483.884 714.433C478.587 714.433 473.266 714.285 467.944 713.988C426.759 711.686 386.44 700.453 348.126 680.534C303.797 657.522 261.944 622.756 223.704 577.202C191.899 539.319 156.852 510.517 119.553 491.613C89.7279 476.494 58.3687 467.611 26.3907 465.26C-2.04789 463.157 -25.7591 466.695 -40.6343 470.036C-56.747 473.648 -66.2513 477.83 -66.3503 477.88L-66.5483 477.434C-66.4493 477.385 -56.9203 473.203 -40.7581 469.566C-25.8581 466.225 -2.12214 462.662 26.3907 464.765C58.4429 467.141 89.8517 476.024 119.751 491.167C157.124 510.096 192.221 538.948 224.075 576.905C262.265 622.385 304.069 657.126 348.324 680.113C386.588 699.983 426.833 711.216 467.944 713.518C502.595 715.448 537.172 711.068 570.709 700.502C605.534 689.541 630.012 674.867 644.392 664.475L644.689 664.871C630.284 675.263 605.756 689.986 570.858 700.972C542.444 709.93 513.238 714.433 483.884 714.433Z" fill="#7DB4EA"/>
  3970. <path d="M479.775 707.257C477.127 707.257 474.454 707.208 471.805 707.133C430.843 705.995 390.573 695.9 352.135 677.144C307.559 655.393 265.186 621.841 226.228 577.375C193.26 539.764 157.347 511.358 119.503 492.949C89.2329 478.226 57.6509 469.838 25.6235 467.982C-2.86464 466.349 -26.4274 470.308 -41.1788 473.92C-57.1678 477.83 -66.5236 482.21 -66.6226 482.234L-66.8453 481.789C-66.7463 481.739 -57.3658 477.36 -41.3273 473.425C-26.5511 469.788 -2.9389 465.829 25.5987 467.462C57.6757 469.293 89.3319 477.706 119.676 492.454C157.594 510.888 193.557 539.344 226.575 577.004C265.483 621.395 307.807 654.923 352.333 676.649C390.722 695.38 430.917 705.451 471.805 706.589C506.11 707.554 540.216 702.308 573.209 690.975C599.742 681.87 625.136 668.731 644.714 653.934L645.011 654.329C625.384 669.151 599.94 682.315 573.358 691.446C542.914 701.987 511.456 707.257 479.775 707.257Z" fill="#7DB4EA"/>
  3971. <path d="M475.617 700.329C434.877 700.329 394.682 691.396 356.095 673.778C311.247 653.315 268.404 620.925 228.728 577.549C194.597 540.234 157.817 512.249 119.404 494.334C88.6883 480.007 56.8588 472.089 24.8066 470.778C-3.70626 469.615 -27.1205 473.995 -41.7482 477.879C-57.5886 482.086 -66.8207 486.639 -66.8949 486.688L-67.1177 486.243C-67.0187 486.193 -57.7866 481.64 -41.8967 477.409C-27.2442 473.5 -3.78052 469.12 24.8066 470.283C56.9331 471.594 88.812 479.537 119.602 493.889C158.065 511.828 194.919 539.863 229.099 577.227C268.725 620.554 311.544 652.894 356.318 673.333C394.83 690.901 434.976 699.834 475.617 699.834H475.642C509.6 699.834 543.285 693.697 575.709 681.597C601.598 671.947 626.225 658.437 645.06 643.541L645.357 643.937C626.473 658.858 601.796 672.417 575.857 682.068C543.384 694.167 509.649 700.329 475.617 700.329Z" fill="#7DB4EA"/>
  3972. <path d="M471.533 693.648C433.689 693.648 396.241 685.853 360.056 670.463C314.96 651.261 271.621 620.084 231.228 577.746C195.909 540.754 158.263 513.164 119.305 495.769C88.1438 481.863 56.0668 474.39 23.9898 473.599C-4.54777 472.881 -27.8135 477.681 -42.3174 481.838C-58.0341 486.342 -67.0929 491.068 -67.1919 491.117L-67.4147 490.672C-67.3157 490.622 -58.2321 485.872 -42.4659 481.368C-27.9372 477.211 -4.62202 472.386 23.9898 473.104C56.1411 473.895 88.2676 481.368 119.503 495.299C158.535 512.719 196.255 540.333 231.599 577.4C271.943 619.663 315.207 650.816 360.254 669.992C398.889 686.447 438.986 694.192 479.453 693.029C513.089 692.064 546.305 685.037 578.184 672.17C603.454 661.975 627.314 648.069 645.382 633.074L645.704 633.445C627.586 648.49 603.677 662.396 578.357 672.615C546.429 685.507 513.164 692.534 479.453 693.499C476.83 693.598 474.181 693.648 471.533 693.648Z" fill="#7DB4EA"/>
  3973. <path d="M467.474 687.214C432.501 687.214 397.751 680.484 364.016 667.147C318.672 649.232 274.839 619.193 233.777 577.92C197.295 541.249 158.733 514.08 119.206 497.204C87.5993 483.694 55.2748 476.716 23.1731 476.419C22.4801 476.419 21.8118 476.419 21.1435 476.419C-6.47829 476.419 -28.853 481.492 -42.8619 485.797C-58.4301 490.573 -67.3404 495.497 -67.4394 495.547L-67.6869 495.126C-67.5879 495.076 -58.6529 490.152 -43.0351 485.352C-28.9767 481.022 -6.55254 475.949 21.1435 475.949C21.8118 475.949 22.4801 475.949 23.1731 475.949C55.3491 476.246 87.7231 483.249 119.404 496.759C159.005 513.659 197.592 540.853 234.148 577.598C275.16 618.822 318.945 648.811 364.238 666.726C402.998 682.043 443.07 688.625 483.29 686.299C516.604 684.369 549.374 676.475 580.684 662.792C605.36 652.028 628.453 637.776 645.753 622.657L646.075 623.028C628.75 638.172 605.583 652.474 580.882 663.262C549.523 676.945 516.678 684.864 483.314 686.794C477.993 687.066 472.721 687.214 467.474 687.214Z" fill="#7DB4EA"/>
  3974. <path d="M463.415 681.029C431.239 681.029 399.211 675.288 367.902 663.856C322.286 647.203 277.982 618.352 236.228 578.093C198.532 541.744 159.104 515.02 119.008 498.665C87.4508 485.798 55.4234 479.265 23.7919 479.265C23.2721 479.265 22.7524 479.265 22.2326 479.265C-6.35452 479.463 -29.3232 485.055 -43.5549 489.732C-58.9746 494.78 -67.7364 499.877 -67.8354 499.927L-68.0829 499.506C-67.9839 499.456 -59.1974 494.359 -43.7281 489.287C-29.4717 484.61 -6.45353 478.993 22.2078 478.795C54.4333 478.572 87.0301 485.105 119.157 498.219C159.302 514.6 198.804 541.373 236.549 577.747C278.254 617.956 322.484 646.783 368.05 663.411C406.933 677.614 446.955 683.033 486.977 679.519C557.096 673.383 615.087 640.696 645.976 612.166L646.323 612.537C629.789 627.804 607.415 642.477 583.283 653.81C552.468 668.31 520.094 677.119 487.027 680.014C479.181 680.682 471.285 681.029 463.415 681.029Z" fill="#7DB4EA"/>
  3975. <path d="M459.405 675.114C429.976 675.114 400.647 670.265 371.812 660.59C325.949 645.199 281.175 617.51 238.752 578.241C199.844 542.263 159.525 515.985 118.859 500.124C86.337 487.455 53.5422 481.393 21.391 482.11C-7.22085 482.754 -30.0163 488.742 -44.1242 493.666C-59.3954 498.986 -68.0087 504.256 -68.0829 504.306L-68.3304 503.885C-68.2562 503.836 -59.5934 498.565 -44.2975 493.221C-30.1648 488.296 -7.31984 482.259 21.3663 481.616C53.5917 480.898 86.4607 486.96 119.033 499.654C159.748 515.515 200.141 541.843 239.099 577.87C281.472 617.065 326.196 644.753 371.985 660.095C410.993 673.184 450.965 677.44 490.789 672.739C523.485 668.879 555.388 659.179 585.56 643.887C617.315 627.804 637.264 610.508 646.347 601.624L646.694 601.971C637.586 610.879 617.587 628.224 585.782 644.333C555.537 659.649 523.608 669.374 490.838 673.234C480.369 674.496 469.875 675.114 459.405 675.114Z" fill="#7DB4EA"/>
  3976. <path d="M455.47 669.473C428.764 669.473 402.058 665.439 375.723 657.373C329.612 643.269 284.368 616.694 241.252 578.439C201.131 542.832 159.896 517 118.661 501.683C85.6935 489.435 52.6512 483.842 20.4752 485.055C-8.16139 486.144 -30.7836 492.528 -44.743 497.699C-59.841 503.291 -68.281 508.71 -68.38 508.76L-68.6522 508.339C-68.578 508.29 -60.0885 502.846 -44.9163 497.229C-30.9321 492.058 -8.23564 485.649 20.4505 484.56C52.7007 483.348 85.7925 488.94 118.835 501.213C160.119 516.554 201.428 542.412 241.574 578.068C284.615 616.298 329.81 642.823 375.847 656.903C414.977 668.879 454.9 671.972 494.502 666.083C511.481 663.559 528.46 659.352 544.993 653.612C559.72 648.465 574.199 642.056 587.985 634.559C619.023 617.683 638.056 600.164 646.644 591.232L646.991 591.578C638.378 600.536 619.295 618.104 588.208 635.004C574.397 642.526 559.918 648.935 545.142 654.082C528.583 659.847 511.58 664.054 494.576 666.578C481.582 668.508 468.513 669.473 455.47 669.473Z" fill="#7DB4EA"/>
  3977. <path d="M451.609 664.079C427.551 664.079 403.468 660.763 379.609 654.156C333.226 641.314 287.536 615.902 243.752 578.588C202.418 543.352 160.267 518.014 118.488 503.217C85.0747 491.39 51.7849 486.243 19.5842 487.95C-9.0524 489.46 -31.5261 496.24 -45.337 501.634C-60.3112 507.498 -68.6027 513.066 -68.677 513.115L-68.9492 512.694C-68.875 512.645 -60.534 507.053 -45.535 501.164C-31.6993 495.745 -9.17616 488.965 19.5347 487.431C51.8097 485.723 85.149 490.87 118.637 502.698C160.49 517.519 202.69 542.907 244.073 578.167C287.783 615.407 333.424 640.819 379.732 653.637C419.012 664.524 458.885 666.429 498.264 659.353C566.873 647.005 621.25 609.271 646.966 580.691L647.337 581.013C621.572 609.642 567.096 647.475 498.363 659.823C482.844 662.693 467.226 664.079 451.609 664.079Z" fill="#7DB4EA"/>
  3978. <path d="M447.847 658.957C426.388 658.957 404.879 656.309 383.519 650.989C336.889 639.409 290.729 615.11 246.301 578.761C203.73 543.946 160.688 519.054 118.315 504.801C84.4312 493.394 50.9187 488.717 18.718 490.92C-9.94339 492.874 -32.2438 500.001 -45.9062 505.642C-60.7072 511.754 -68.8502 517.47 -68.9244 517.544L-69.2214 517.148C-69.1472 517.099 -60.9794 511.334 -46.129 505.197C-32.4418 499.531 -10.0671 492.38 18.6437 490.425C50.9187 488.223 84.5055 492.899 118.464 504.331C160.886 518.608 204.002 543.526 246.623 578.39C291.001 614.69 337.112 638.964 383.643 650.519C423.046 660.293 462.87 661.06 502.051 652.771C518.757 649.232 535.39 644.011 551.478 637.281C565.784 631.293 579.719 624.068 592.911 615.803C614.592 602.243 634.418 585.665 647.313 570.299L647.684 570.62C634.764 586.011 614.889 602.639 593.158 616.224C579.941 624.488 565.982 631.738 551.651 637.726C535.538 644.482 518.856 649.702 502.125 653.241C484.131 657.051 465.989 658.957 447.847 658.957Z" fill="#7DB4EA"/>
  3979. <path d="M444.233 654.057C419.21 654.057 394.088 650.42 369.189 643.17C328.523 631.342 288.031 609.716 248.801 578.91C205.017 544.515 161.035 520.118 118.092 506.385C83.7629 495.398 50.0029 491.192 17.7774 493.864C-10.8839 496.24 -33.0359 503.737 -46.5498 509.601C-61.2022 515.961 -69.1719 521.85 -69.2462 521.899L-69.5432 521.503C-69.469 521.454 -61.4745 515.54 -46.7725 509.156C-33.2091 503.267 -11.0324 495.745 17.7032 493.369C50.0029 490.697 83.8124 494.903 118.216 505.89C161.208 519.623 205.24 544.07 249.098 578.489C288.278 609.246 328.721 630.847 369.312 642.65C404.557 652.894 440.273 655.913 475.468 651.608C495.64 649.133 515.763 644.234 535.266 637.033C552.394 630.724 569.125 622.632 584.941 612.982C598.653 604.643 611.424 595.315 622.933 585.269C632.759 576.683 641.298 567.849 647.61 559.733L648.006 560.03C641.67 568.171 633.106 577.029 623.255 585.64C611.721 595.711 598.925 605.039 585.213 613.403C569.348 623.053 552.592 631.169 535.439 637.504C515.886 644.704 495.739 649.628 475.543 652.103C465.122 653.439 454.678 654.057 444.233 654.057Z" fill="#7DB4EA"/>
  3980. <path d="M440.644 649.455C418.071 649.455 395.375 646.485 372.802 640.522C331.914 629.758 291.026 609.097 251.276 579.107C206.254 545.158 161.357 521.256 117.845 508.067C83.0452 497.526 49.0624 493.765 16.8121 496.907C-11.874 499.704 -33.8279 507.547 -47.1933 513.659C-61.6725 520.266 -69.4937 526.279 -69.568 526.353L-69.865 525.957C-69.7907 525.908 -61.9448 519.845 -47.4161 513.214C-34.0012 507.102 -11.9977 499.233 16.7379 496.413C49.0376 493.245 83.0947 497.006 117.968 507.572C161.53 520.761 206.477 544.713 251.573 578.687C291.273 608.627 332.112 629.264 372.926 640.003C408.319 649.331 444.035 651.335 479.107 645.991C499.204 642.922 519.203 637.404 538.558 629.61C555.512 622.756 571.996 614.145 587.54 604.025C612.414 587.793 634.987 567.354 647.931 549.315L648.328 549.612C635.358 567.7 612.736 588.188 587.812 604.445C572.244 614.59 555.735 623.226 538.756 630.08C519.376 637.899 499.353 643.417 479.206 646.51C466.434 648.465 453.564 649.455 440.644 649.455Z" fill="#7DB4EA"/>
  3981. <path d="M437.204 645.075C417.057 645.075 396.81 642.7 376.614 637.924C335.453 628.224 294.144 608.479 253.801 579.281C207.517 545.777 161.703 522.394 117.647 509.75C82.4016 499.629 48.1713 496.338 15.9211 499.951C-12.765 503.168 -34.5457 511.358 -47.7873 517.693C-62.118 524.547 -69.766 530.708 -69.8402 530.757L-70.162 530.362C-70.0877 530.287 -62.415 524.101 -48.0348 517.247C-34.7684 510.913 -12.9383 502.698 15.8221 499.456C48.1466 495.819 82.4264 499.135 117.746 509.255C161.876 521.899 207.764 545.332 254.098 578.86C294.392 608.033 335.651 627.73 376.738 637.404C412.329 645.793 448.094 646.783 483.067 640.349C503.09 636.662 522.94 630.526 542.073 622.088C558.829 614.714 575.041 605.584 590.262 594.968C614.741 577.895 636.422 556.912 648.278 538.849L648.699 539.121C636.818 557.234 615.087 578.266 590.559 595.389C575.313 606.029 559.076 615.16 542.295 622.558C523.138 630.996 503.239 637.157 483.191 640.844C467.969 643.665 452.623 645.075 437.204 645.075Z" fill="#7DB4EA"/>
  3982. <path d="M433.887 640.918C416.19 640.918 398.395 639.062 380.599 635.376C339.116 626.74 297.288 607.934 256.3 579.454C208.779 546.445 162.05 523.557 117.399 511.457C81.6839 501.782 47.2308 498.937 14.9558 503.02C-13.755 506.657 -35.3624 515.194 -48.4308 521.726C-62.5882 528.803 -70.063 535.088 -70.1372 535.162L-70.459 534.791C-70.3847 534.717 -62.8853 528.407 -48.6783 521.305C-35.5852 514.748 -13.9035 506.187 14.8569 502.549C47.1813 498.467 81.7086 501.287 117.498 510.987C162.223 523.087 209.002 546 256.573 579.058C297.51 607.489 339.265 626.295 380.673 634.906C416.487 642.353 452.351 642.279 487.274 634.732C507.174 630.427 526.826 623.647 545.711 614.591C562.244 606.672 578.159 597.022 593.01 585.937C605.855 576.361 617.538 565.968 627.76 555.106C636.571 545.728 643.749 536.523 648.55 528.456L648.971 528.704C644.169 536.795 636.942 546.049 628.106 555.452C617.884 566.34 606.152 576.732 593.282 586.333C578.407 597.443 562.443 607.093 545.909 615.036C526.975 624.117 507.298 630.897 487.349 635.227C469.751 639.013 451.881 640.918 433.887 640.918Z" fill="#7DB4EA"/>
  3983. <path d="M627.784 842.88C627.116 842.88 626.473 842.855 625.804 842.83C612.761 842.088 598.826 834.021 581.971 817.418C566.6 802.275 550.265 781.663 531.355 757.81C508.783 729.304 483.166 697.013 452.45 665.588C416.883 629.239 381.193 601.056 343.299 579.405C321.048 566.686 297.708 556.145 273.923 548.029C248.034 539.196 220.758 532.96 192.839 529.496C162.817 525.76 131.136 525.116 98.6628 527.566C64.0365 530.189 27.4797 536.399 -10.0177 546.05L-10.1415 545.58C27.3807 535.929 63.9623 529.694 98.6133 527.096C131.136 524.646 162.841 525.289 192.889 529.026C220.832 532.49 248.157 538.75 274.071 547.584C297.882 555.7 321.246 566.29 343.522 579.009C381.44 600.66 417.18 628.893 452.772 665.267C483.512 696.692 509.129 729.008 531.727 757.513C550.636 781.366 566.947 801.978 582.292 817.096C599.049 833.601 612.884 841.643 625.804 842.385C637.313 843.053 648.352 837.906 659.564 826.672L659.911 827.019C649.293 837.659 638.749 842.88 627.784 842.88Z" fill="url(#paint40_linear_234_211)"/>
  3984. <path d="M627.71 836.521C626.869 836.521 626.002 836.496 625.161 836.422C612.241 835.506 598.603 827.638 582.268 811.653C567.368 797.079 551.651 777.358 533.459 754.519C504.476 718.12 468.39 672.838 422.353 633.57C395.919 611.028 369.931 592.816 342.903 577.92C312.163 560.97 280.952 548.747 247.464 540.482C211.13 531.55 172.049 527.566 131.26 528.655C87.2528 529.842 39.5581 536.969 -10.4879 549.836L-10.6117 549.365C39.4591 536.474 87.1785 529.347 131.235 528.16C172.074 527.071 211.205 531.055 247.588 540.012C281.125 548.277 312.386 560.525 343.151 577.5C370.203 592.42 396.216 610.632 422.675 633.198C468.761 672.492 504.847 717.798 533.855 754.197C552.047 777.011 567.739 796.732 582.614 811.282C598.876 827.167 612.414 835.011 625.21 835.902C636.818 836.719 648.08 831.844 659.639 820.981L659.985 821.353C649.144 831.547 638.576 836.521 627.71 836.521Z" fill="url(#paint41_linear_234_211)"/>
  3985. <path d="M627.611 830.186C626.547 830.186 625.483 830.137 624.418 830.038C611.573 828.924 598.133 821.204 582.169 805.689C567.615 791.561 552.394 772.532 534.771 750.51C504.823 713.072 467.548 666.504 418.641 627.136C391.019 604.891 364.214 587.273 336.74 573.219C306.124 557.556 275.086 546.545 241.846 539.517C168.732 524.077 85.9905 528.704 -11.1067 553.696L-11.2305 553.225C85.941 528.234 168.757 523.582 241.945 539.047C275.21 546.074 306.297 557.11 336.963 572.798C364.461 586.853 391.291 604.52 418.938 626.765C467.895 666.158 505.169 712.775 535.142 750.213C552.765 772.235 567.962 791.239 582.491 805.343C598.381 820.783 611.696 828.479 624.443 829.568C636.2 830.582 647.684 825.955 659.564 815.414L659.886 815.785C649.021 825.435 638.403 830.186 627.611 830.186Z" fill="url(#paint42_linear_234_211)"/>
  3986. <path d="M627.537 823.876C626.25 823.876 624.963 823.802 623.676 823.678C610.83 822.391 597.539 814.721 581.847 799.552C567.566 785.745 552.74 767.261 535.563 745.883C504.798 707.554 466.533 659.847 415.002 620.653C386.192 598.729 358.595 581.656 330.602 568.467C300.134 554.091 269.295 544.292 236.302 538.502C201.502 532.415 164.995 530.881 124.701 533.826C83.0452 536.869 38.4691 544.614 -11.5769 557.506L-11.7007 557.036C38.3948 544.144 82.9957 536.399 124.676 533.356C165.02 530.411 201.577 531.945 236.401 538.032C269.443 543.822 300.332 553.646 330.85 568.022C358.843 581.235 386.489 598.334 415.324 620.282C466.88 659.526 505.194 707.232 535.959 745.586C553.111 766.965 567.937 785.424 582.194 799.206C597.811 814.3 611.003 821.921 623.725 823.208C635.63 824.396 647.362 820.016 659.614 809.797L659.936 810.168C648.897 819.372 638.254 823.876 627.537 823.876Z" fill="url(#paint43_linear_234_211)"/>
  3987. <path d="M627.463 817.591C618.181 817.591 608.8 814.35 598.826 807.693C579.298 794.703 559.2 769.711 535.934 740.81C504.476 701.715 465.296 653.043 411.413 614.195C381.415 592.568 352.977 576.064 324.464 563.717C294.169 550.602 263.503 542.016 230.733 537.488C164.03 528.283 86.8814 535.855 -12.072 561.292L-12.1958 560.822C59.8784 542.288 120.394 533.232 173.757 533.232C193.706 533.232 212.615 534.494 230.782 536.993C263.602 541.521 294.317 550.107 324.637 563.247C353.175 575.619 381.663 592.148 411.661 613.774C465.593 652.672 504.798 701.368 536.281 740.488C559.522 769.365 579.595 794.332 599.073 807.273C609.295 814.077 618.874 817.294 628.329 817.071C638.6 816.849 648.847 812.618 659.614 804.155L659.911 804.551C649.07 813.088 638.724 817.344 628.354 817.566C628.057 817.591 627.76 817.591 627.463 817.591Z" fill="url(#paint44_linear_234_211)"/>
  3988. <path d="M627.388 811.356C617.859 811.356 608.281 808.09 598.133 801.359C578.629 788.418 558.804 763.872 535.86 735.416C503.758 695.628 463.835 646.115 407.75 607.737C344.982 564.806 288.65 542.833 225.065 536.498C162.074 530.238 88.7625 539.047 -12.5918 565.127L-12.7156 564.657C88.713 538.577 162.049 529.719 225.114 536.004C288.798 542.338 345.205 564.336 408.022 607.341C464.157 645.744 504.13 695.306 536.231 735.119C559.15 763.525 578.951 788.072 598.38 800.963C608.454 807.644 617.934 810.886 627.364 810.886C627.512 810.886 627.636 810.886 627.784 810.886C638.18 810.787 648.6 806.753 659.614 798.613L659.911 799.009C648.823 807.224 638.303 811.282 627.809 811.381C627.661 811.356 627.512 811.356 627.388 811.356Z" fill="url(#paint45_linear_234_211)"/>
  3989. <path d="M627.314 805.12C627.289 805.12 627.24 805.12 627.215 805.12C617.414 805.096 607.637 801.755 597.316 794.951C577.763 782.034 558.185 757.785 535.489 729.725C502.843 689.318 462.202 639.038 404.112 601.279C371.763 580.246 341.616 564.855 311.94 554.265C282.041 543.575 251.746 537.439 219.372 535.509C188.236 533.653 154.055 535.632 114.875 541.546C79.3325 546.916 38.667 555.626 -13.0868 568.938L-13.2106 568.468C38.568 555.156 79.2335 546.446 114.8 541.051C154.03 535.113 188.261 533.133 219.422 534.989C251.845 536.919 282.165 543.08 312.138 553.77C341.839 564.385 372.035 579.776 404.409 600.833C462.548 638.642 503.214 688.972 535.91 729.379C558.581 757.414 578.159 781.638 597.638 794.505C607.885 801.285 617.587 804.576 627.289 804.601C627.314 804.601 627.364 804.601 627.388 804.601C637.907 804.601 648.476 800.79 659.688 792.921L659.96 793.317C648.6 801.285 637.932 805.12 627.314 805.12Z" fill="url(#paint46_linear_234_211)"/>
  3990. <path d="M627.289 798.934C627.067 798.934 626.819 798.934 626.596 798.934C616.671 798.786 606.796 795.371 596.4 788.542C576.773 775.6 557.344 751.599 534.845 723.836C501.679 682.884 460.395 631.936 400.449 594.82C366.887 574.035 335.849 559.238 305.604 549.539C275.903 540.037 245.831 535.113 213.63 534.519C183.533 533.95 151.085 537.018 111.533 544.12C70.9173 551.419 25.4749 562.702 -13.6313 572.748L-13.755 572.278C55.9431 554.339 88.6389 547.732 111.459 543.625C151.06 536.498 183.533 533.43 213.655 533.999C245.905 534.593 276.027 539.517 305.777 549.044C336.072 558.743 367.134 573.565 400.746 594.375C460.742 631.516 502.051 682.513 535.266 723.489C557.74 751.228 577.169 775.205 596.722 788.096C607.019 794.876 616.795 798.266 626.646 798.415C637.363 798.588 648.154 794.95 659.688 787.329L659.96 787.75C648.55 795.272 637.883 798.934 627.289 798.934Z" fill="url(#paint47_linear_234_211)"/>
  3991. <path d="M627.265 792.773C626.819 792.773 626.374 792.773 625.928 792.748C615.855 792.476 605.855 788.987 595.41 782.108C575.659 769.093 556.354 745.314 533.979 717.749C517.149 697.013 498.066 673.506 475.741 650.94C450.074 625.008 424.259 604.544 396.81 588.337C362.456 568.072 330.949 553.943 300.48 545.183C271.299 536.795 241.821 532.96 210.363 533.504C149.253 534.543 83.7877 551.394 -6.80006 574.703L-14.151 576.584L-14.2748 576.113L-6.92381 574.233C83.6887 550.899 149.179 534.048 210.338 533.009C241.871 532.465 271.398 536.3 300.604 544.713C331.097 553.497 362.654 567.626 397.058 587.916C424.531 604.124 450.396 624.637 476.087 650.593C498.437 673.16 517.52 696.691 534.375 717.427C556.725 744.942 576.006 768.721 595.683 781.687C606.053 788.517 615.929 791.981 625.928 792.253C636.818 792.55 647.833 789.111 659.639 781.762L659.911 782.182C648.501 789.284 637.808 792.773 627.265 792.773Z" fill="url(#paint48_linear_234_211)"/>
  3992. <path d="M627.215 786.636C594.074 786.636 567.145 753.554 532.964 711.538C515.911 690.555 496.556 666.801 473.835 644.135C447.723 618.104 421.338 597.74 393.172 581.879C360.551 563.519 330.825 550.677 302.238 542.635C275.21 535.014 248.405 531.5 220.313 531.846C166.109 532.539 109.132 547.658 37.0335 566.835C20.5743 571.214 3.54575 575.743 -14.6708 580.419L-14.7946 579.949C3.39725 575.272 20.4258 570.744 36.885 566.364C109.033 547.188 166.01 532.069 220.288 531.376C248.43 531.03 275.284 534.544 302.362 542.19C330.973 550.256 360.749 563.098 393.395 581.483C421.611 597.369 448.02 617.758 474.157 643.813C496.903 666.479 516.233 690.258 533.311 711.241C577.838 765.95 610.013 805.491 659.614 776.17L659.861 776.59C648.154 783.519 637.388 786.636 627.215 786.636Z" fill="url(#paint49_linear_234_211)"/>
  3993. <path d="M627.289 780.475C626.374 780.475 625.458 780.45 624.517 780.401C614.097 779.856 603.875 776.194 593.257 769.192C573.184 755.978 554.002 732.447 531.752 705.179C514.476 683.998 494.873 659.971 471.805 637.256C445.272 611.151 418.368 590.91 389.509 575.396C328.845 542.783 278.279 528.679 225.56 529.644C175.959 530.56 126.953 544.515 64.8781 562.183C39.8798 569.309 14.0401 576.658 -15.1906 584.18L-15.3143 583.71C13.9411 576.188 39.7561 568.839 64.7543 561.712C126.854 544.02 175.91 530.065 225.56 529.149C278.378 528.184 329.018 542.313 389.757 574.951C418.641 590.49 445.594 610.73 472.152 636.885C495.269 659.625 514.847 683.651 532.148 704.857C554.349 732.076 573.531 755.607 593.529 768.771C604.073 775.724 614.221 779.361 624.542 779.906C635.828 780.5 647.288 777.431 659.639 770.528L659.886 770.949C648.476 777.357 637.784 780.475 627.289 780.475Z" fill="url(#paint50_linear_234_211)"/>
  3994. <path d="M627.339 774.388C626.151 774.388 624.988 774.338 623.8 774.264C613.206 773.571 602.836 769.81 592.119 762.758C571.848 749.421 552.666 725.964 530.465 698.795C512.966 677.391 493.14 653.167 469.726 630.377C442.797 604.198 415.398 584.106 385.895 568.962C355.006 553.077 327.063 542.066 300.505 535.286C275.829 528.976 252.019 526.279 227.738 527.046C181.355 528.506 137.918 542.066 82.9214 559.263C54.0868 568.27 21.4158 578.489 -15.7104 588.04L-15.8341 587.57C21.2673 578.019 53.9383 567.824 82.7729 558.793C137.794 541.595 181.256 528.011 227.713 526.551C252.043 525.784 275.903 528.481 300.629 534.816C327.211 541.595 355.18 552.631 386.118 568.517C415.646 583.685 443.094 603.802 470.048 630.006C493.512 652.82 513.337 677.069 530.836 698.473C553.012 725.617 572.194 749.05 592.391 762.337C603.058 769.365 613.33 773.101 623.849 773.769C635.333 774.512 647.041 771.616 659.663 764.936L659.886 765.381C648.476 771.419 637.784 774.388 627.339 774.388Z" fill="url(#paint51_linear_234_211)"/>
  3995. <path d="M627.413 768.301C625.953 768.301 624.493 768.252 623.057 768.128C612.29 767.311 601.771 763.451 590.931 756.3C570.462 742.815 551.255 719.407 529.029 692.312C511.332 670.735 491.284 646.263 467.523 623.424C440.248 597.22 412.354 577.277 382.257 562.504C351.64 547.46 324.093 537.142 298.005 530.931C273.923 525.19 250.954 522.963 227.763 524.102C183.657 526.279 142.348 540.631 94.5295 557.259C62.6258 568.344 26.4897 580.914 -16.2053 591.876L-16.3291 591.406C26.3412 580.419 62.4773 567.874 94.3562 556.789C142.224 540.161 183.558 525.784 227.738 523.607C250.979 522.469 273.997 524.695 298.129 530.461C324.241 536.696 351.838 547.039 382.48 562.084C412.626 576.906 440.545 596.849 467.87 623.103C491.655 645.942 511.728 670.438 529.425 692.015C551.626 719.085 570.783 742.468 591.203 755.904C601.994 763.006 612.414 766.841 623.107 767.658C634.789 768.549 646.768 765.827 659.688 759.368L659.911 759.814C648.476 765.48 637.808 768.276 627.413 768.301Z" fill="url(#paint52_linear_234_211)"/>
  3996. <path d="M627.512 762.214C625.755 762.214 624.022 762.139 622.29 761.991C611.325 761.051 600.658 757.067 589.693 749.817C568.977 736.183 549.77 712.8 527.519 685.73C509.624 663.955 489.353 639.285 465.271 616.422C437.624 590.193 409.285 570.422 378.619 555.996C348.051 541.62 320.628 531.871 294.763 526.205C271.027 520.984 248.628 519.227 226.228 520.81C183.781 523.829 145.739 538.601 101.732 555.724C68.071 568.814 29.9053 583.636 -16.7003 595.637L-16.8241 595.166C29.7568 583.19 67.8977 568.344 101.559 555.279C145.615 538.156 183.682 523.359 226.204 520.34C248.652 518.757 271.126 520.513 294.887 525.734C320.776 531.426 348.225 541.175 378.841 555.576C409.557 570.026 437.946 589.822 465.642 616.1C489.749 638.988 510.045 663.658 527.94 685.433C550.166 712.478 569.373 735.837 590.015 749.421C600.93 756.597 611.523 760.556 622.389 761.496C634.294 762.535 646.521 759.987 659.713 753.726L659.936 754.172C648.501 759.566 637.858 762.214 627.512 762.214Z" fill="url(#paint53_linear_234_211)"/>
  3997. <path d="M627.636 756.152C614.246 756.152 601.375 751.896 588.406 743.384C567.467 729.577 548.186 706.218 525.885 679.148C507.793 657.2 487.299 632.332 462.92 609.469C434.951 583.215 406.166 563.618 374.931 549.563C344.19 535.731 316.717 526.477 290.927 521.33C267.389 516.604 245.311 515.342 223.481 517.421C182.221 521.38 146.778 536.82 105.742 554.685C71.1895 569.73 32.0338 586.803 -17.2945 599.497L-17.4182 599.027C31.8605 586.358 71.0162 569.284 105.544 554.24C146.63 536.35 182.098 520.91 223.431 516.926C245.311 514.823 267.413 516.109 291.001 520.836C316.816 526.007 344.314 535.261 375.104 549.118C406.389 563.197 435.223 582.819 463.217 609.122C487.621 632.011 508.139 656.903 526.232 678.851C548.508 705.872 567.764 729.23 588.653 742.988C599.717 750.263 610.459 754.321 621.522 755.41C633.65 756.597 646.125 754.222 659.639 748.159L659.837 748.605C648.649 753.628 637.982 756.152 627.636 756.152Z" fill="url(#paint54_linear_234_211)"/>
  3998. <path d="M627.809 750.114C613.874 750.114 600.559 745.734 587.144 736.901C565.932 722.945 546.602 699.562 524.227 672.492C505.936 650.396 485.22 625.33 460.568 602.441C432.278 576.188 403.072 556.764 371.317 543.08C312.386 517.668 264.295 508.389 219.966 513.858C179.598 518.831 146.259 535.088 107.647 553.918C72.7983 570.893 33.3208 590.144 -17.7895 603.283L-17.9132 602.813C33.1476 589.674 72.5755 570.447 107.4 553.473C146.036 534.618 179.425 518.361 219.892 513.363C264.32 507.894 312.485 517.198 371.515 542.635C403.345 556.343 432.575 575.792 460.915 602.095C485.616 625.008 506.332 650.074 524.623 672.195C546.973 699.24 566.279 722.574 587.416 736.505C610.558 751.747 633.502 753.653 659.688 742.518L659.886 742.963C648.674 747.739 638.081 750.114 627.809 750.114Z" fill="url(#paint55_linear_234_211)"/>
  3999. <path d="M627.982 744.101C613.503 744.101 599.692 739.573 585.832 730.467C564.348 716.314 544.968 692.93 522.495 665.86C504.031 643.591 483.091 618.352 458.143 595.463C429.531 569.21 399.954 549.984 367.654 536.647C307.856 511.952 259.567 503.564 215.684 510.27C197.542 513.041 179.92 518.287 160.243 526.823C142.694 534.42 125.74 543.674 107.771 553.473C90.0001 563.148 71.635 573.144 51.0672 582.498C27.7024 593.088 5.03076 601.155 -18.2844 607.167L-18.4082 606.697C33.6921 593.286 72.9221 571.907 107.548 553.052C125.517 543.253 142.496 533.999 160.069 526.403C179.771 517.866 197.443 512.596 215.635 509.824C259.617 503.119 307.98 511.507 367.877 536.251C400.226 549.613 429.877 568.888 458.514 595.167C483.487 618.08 504.427 643.343 522.915 665.613C545.364 692.658 564.744 716.017 586.154 730.121C609.617 745.561 632.982 747.763 659.738 737L659.911 737.47C648.748 741.85 638.18 744.101 627.982 744.101Z" fill="url(#paint56_linear_234_211)"/>
  4000. <path d="M628.156 738.088C586.401 738.088 556.626 702.283 520.713 659.13C502.051 636.712 480.913 611.299 455.692 588.411C426.784 562.182 396.81 543.129 364.016 530.139C303.154 506.063 254.494 498.565 210.883 506.558C171.603 513.758 140.071 532.91 106.682 553.176C89.1338 563.816 70.9915 574.827 50.5721 584.922C27.4302 596.354 4.73374 604.866 -18.8042 610.928L-18.928 610.458C4.58523 604.396 27.2569 595.909 50.3494 584.502C70.744 574.431 88.8863 563.42 106.41 552.78C139.848 532.49 171.43 513.313 210.784 506.112C254.494 498.095 303.228 505.617 364.189 529.718C397.033 542.709 427.081 561.811 456.039 588.065C481.285 610.978 502.447 636.415 521.109 658.833C543.657 685.928 563.111 709.311 584.792 723.588C608.578 739.251 632.388 741.726 659.688 731.308L659.861 731.778C648.476 736.109 637.982 738.088 628.156 738.088Z" fill="url(#paint57_linear_234_211)"/>
  4001. <path d="M628.329 732.125C585.411 732.125 555.265 696.023 518.881 652.449C500.046 629.883 478.686 604.297 453.193 581.409C424.012 555.205 393.618 536.325 360.353 523.706C327.558 511.284 298.699 503.688 272.116 500.496C248.157 497.625 226.402 498.417 205.611 502.896C166.678 511.284 136.507 531.624 104.578 553.176C87.3766 564.781 69.5808 576.782 49.5079 587.57C26.7867 599.794 4.26356 608.677 -19.3487 614.739L-19.4724 614.269C4.0903 608.207 26.564 599.324 49.2604 587.125C69.3333 576.336 87.1043 564.36 104.306 552.755C136.284 531.178 166.48 510.814 205.512 502.401C226.352 497.898 248.157 497.131 272.166 500.001C298.798 503.193 327.682 510.789 360.526 523.236C393.865 535.88 424.284 554.784 453.539 581.038C479.057 603.951 500.417 629.536 519.277 652.127C563.804 705.476 598.975 747.615 659.688 725.716L659.861 726.187C648.55 730.245 638.106 732.125 628.329 732.125Z" fill="url(#paint58_linear_234_211)"/>
  4002. <path d="M628.7 726.137C612.414 726.137 597.094 721.164 581.822 711.093C559.497 696.395 539.82 672.888 517.05 645.694C498.016 622.979 476.458 597.245 450.693 574.357C421.215 548.178 390.474 529.471 356.714 517.223C323.177 505.024 293.773 497.823 266.795 495.126C242.564 492.726 220.709 494.062 200.017 499.209C161.307 508.859 132.373 530.461 101.757 553.349C67.7492 578.761 32.6032 605.04 -19.8684 618.525L-19.9922 618.055C32.3804 604.594 67.5017 578.341 101.46 552.953C132.126 530.04 161.084 508.389 199.893 498.714C220.659 493.543 242.564 492.207 266.844 494.607C293.847 497.279 323.301 504.529 356.888 516.728C390.722 529.026 421.512 547.732 451.039 573.961C476.83 596.874 498.388 622.633 517.446 645.348C540.216 672.517 559.868 695.999 582.119 710.647C606.598 726.78 631.274 729.775 659.713 720.05L659.861 720.52C648.996 724.281 638.675 726.137 628.7 726.137Z" fill="url(#paint59_linear_234_211)"/>
  4003. <path d="M629.022 720.173C612.117 720.173 596.227 715.027 580.461 704.634C557.864 689.738 537.122 665.068 515.169 638.939C495.962 616.075 474.181 590.168 448.168 567.329C418.418 541.175 387.306 522.666 353.076 510.739C318.722 498.763 288.699 491.909 261.3 489.756C236.747 487.826 214.769 489.732 194.102 495.596C155.54 506.533 127.77 529.495 98.3411 553.794C65.4969 580.938 31.5389 608.998 -20.3882 622.36L-20.512 621.89C31.2914 608.553 65.2246 580.518 98.0194 553.423C127.473 529.075 155.293 506.088 193.953 495.126C214.67 489.237 236.723 487.332 261.325 489.286C288.749 491.464 318.821 498.318 353.224 510.319C387.529 522.27 418.69 540.804 448.49 567.008C474.528 589.896 496.308 615.803 515.54 638.691C537.469 664.796 558.185 689.441 580.733 704.288C605.583 720.644 630.68 723.91 659.688 714.532L659.837 715.002C649.095 718.441 638.873 720.173 629.022 720.173Z" fill="url(#paint60_linear_234_211)"/>
  4004. <path d="M629.368 714.235C611.795 714.235 595.386 708.94 579.1 698.201C556.205 683.107 535.34 658.388 513.263 632.208C492.918 608.083 471.904 583.166 445.644 560.302C415.621 534.172 384.163 515.862 349.462 504.281C314.217 492.528 283.551 486.02 255.682 484.362C230.782 482.902 208.63 485.402 187.988 491.984C170.49 497.576 154.377 505.939 137.299 518.287C122.226 529.199 108.786 541.447 94.5542 554.438C62.9723 583.24 30.326 613.007 -20.8338 626.171L-20.9575 625.701C30.0785 612.562 62.6753 582.844 94.2077 554.067C108.439 541.076 121.904 528.803 137.002 517.891C154.129 505.519 170.267 497.13 187.84 491.513C208.531 484.907 230.758 482.383 255.731 483.867C283.625 485.501 314.341 492.033 349.635 503.811C384.41 515.416 415.918 533.776 445.99 559.931C472.275 582.794 494.279 608.875 513.683 631.887C535.736 658.041 556.576 682.761 579.421 697.805C604.618 714.408 630.161 717.922 659.762 708.89L659.911 709.36C649.219 712.602 639.12 714.235 629.368 714.235Z" fill="url(#paint61_linear_234_211)"/>
  4005. <path d="M629.74 708.321C611.498 708.321 594.519 702.853 577.689 691.792C554.497 676.525 533.509 651.731 511.283 625.478C490.764 601.229 469.528 576.138 443.02 553.324C412.725 527.244 380.896 509.107 345.75 497.848C309.564 486.268 278.18 480.131 249.816 479.018C224.52 478.028 202.17 481.146 181.528 488.495C164.302 494.631 147.917 503.96 131.458 517.025C116.756 528.679 103.266 542.239 90.2228 555.328C75.1744 570.447 59.6061 586.085 41.7608 599.323C21.7127 614.195 1.04586 624.241 -21.4773 630.031L-21.6011 629.561C0.847857 623.795 21.4652 613.774 41.4638 598.952C59.2596 585.739 74.8279 570.125 89.8516 555.007C102.895 541.892 116.409 528.333 131.136 516.653C147.62 503.589 164.054 494.211 181.33 488.049C202.047 480.676 224.421 477.558 249.791 478.523C278.205 479.612 309.613 485.798 345.849 497.378C381.069 508.636 412.948 526.823 443.292 552.953C469.825 575.817 491.061 600.907 511.604 625.181C533.806 651.41 554.77 676.179 577.912 691.396C603.479 708.222 629.443 712.008 659.639 703.323L659.787 703.793C649.367 706.787 639.368 708.296 629.74 708.321Z" fill="url(#paint62_linear_234_211)"/>
  4006. <path d="M630.16 702.383C611.226 702.383 593.678 696.766 576.328 685.334C552.814 669.869 531.702 645.001 509.352 618.673C488.636 594.276 467.226 569.062 440.446 546.247C409.879 520.192 377.728 502.228 342.111 491.34C304.936 479.958 272.809 474.168 243.925 473.624C218.209 473.153 195.661 476.865 174.994 485.031C157.768 491.835 141.605 501.906 125.517 515.837C111.187 528.283 98.2421 542.561 85.743 556.393C71.338 572.303 56.4628 588.758 39.3353 602.491C20.1287 617.882 0.0806026 628.126 -21.9723 633.792L-22.0961 633.322C-0.117401 627.68 19.8565 617.461 39.0135 602.095C56.1163 588.387 70.9915 571.957 85.3717 556.046C97.8956 542.214 110.815 527.912 125.196 515.441C141.308 501.461 157.545 491.365 174.796 484.536C195.513 476.345 218.135 472.609 243.925 473.104C272.859 473.648 305.01 479.463 342.235 490.845C377.901 501.758 410.126 519.771 440.743 545.852C467.523 568.69 488.957 593.929 509.699 618.327C532.024 644.63 553.111 669.448 576.575 684.889C602.514 701.962 628.923 706.02 659.688 697.657L659.812 698.127C649.516 700.972 639.665 702.383 630.16 702.383Z" fill="url(#paint63_linear_234_211)"/>
  4007. <path d="M630.631 696.493C611.003 696.493 592.836 690.703 574.942 678.925C551.131 663.262 529.895 638.32 507.397 611.943C486.482 587.422 464.875 562.059 437.872 539.27C407.057 513.264 374.535 495.473 338.498 484.907C300.382 473.722 267.562 468.303 238.208 468.303C238.133 468.303 238.034 468.303 237.96 468.303C211.799 468.328 189.028 472.708 168.336 481.69C129.948 498.343 105.123 528.531 81.1146 557.729C67.4027 574.406 53.2205 591.628 36.8356 605.831C28.0243 613.477 19.2625 619.663 10.0552 624.76C-0.265827 630.476 -10.8839 634.707 -22.4178 637.677L-22.5415 637.207C-11.0572 634.262 -0.488583 630.056 9.80773 624.34C18.9903 619.242 27.7273 613.081 36.5138 605.46C52.874 591.306 67.0315 574.084 80.7434 557.432C104.801 528.184 129.676 497.947 168.163 481.245C188.904 472.238 211.749 467.858 237.985 467.809C238.059 467.809 238.158 467.809 238.232 467.809C267.661 467.809 300.505 473.252 338.671 484.437C374.782 495.027 407.354 512.843 438.243 538.898C465.271 561.712 486.903 587.075 507.818 611.621C530.291 637.974 551.503 662.891 575.263 678.505C601.573 695.825 628.428 700.131 659.762 692.089L659.886 692.559C649.664 695.157 639.987 696.493 630.631 696.493Z" fill="url(#paint64_linear_234_211)"/>
  4008. <path d="M631.126 690.58C610.756 690.58 591.995 684.616 573.556 672.467C549.448 656.606 528.064 631.614 505.417 605.138C463.811 556.491 416.661 501.361 334.859 478.424C314.935 472.832 296.025 468.699 278.601 466.151C262.043 463.726 246.301 462.637 231.847 462.959C205.215 463.503 182.221 468.551 161.505 478.374C123.117 496.586 99.2817 528.432 76.2387 559.238C62.6258 577.425 49.7802 594.572 34.1625 609.196C25.7472 617.04 17.3567 623.375 8.49593 628.571C-1.42912 634.361 -11.7254 638.592 -22.9375 641.487L-23.0613 641.017C-11.8739 638.147 -1.65188 633.94 8.24842 628.15C17.0844 623.003 25.4502 616.669 33.8407 608.85C49.4337 594.276 62.2793 577.128 75.8675 558.966C98.9599 528.11 122.82 496.215 161.307 477.954C182.098 468.105 205.165 463.033 231.847 462.488C246.351 462.192 262.092 463.256 278.7 465.705C296.124 468.254 315.083 472.386 335.008 477.978C416.958 500.99 464.157 556.17 505.813 604.866C528.435 631.317 549.795 656.284 573.853 672.096C600.534 689.639 627.834 694.217 659.762 686.497L659.886 686.967C649.862 689.367 640.333 690.58 631.126 690.58Z" fill="url(#paint65_linear_234_211)"/>
  4009. <path d="M631.67 684.715C610.558 684.715 591.178 678.579 572.145 666.058C547.716 649.999 526.183 624.934 503.412 598.383C461.484 549.538 413.963 494.186 331.196 471.966C310.703 466.472 291.273 462.489 273.403 460.138C256.449 457.911 240.361 457.07 225.609 457.664C198.507 458.752 175.266 464.493 154.525 475.182C116.137 494.978 93.3167 528.531 71.239 560.97C58.3934 579.85 46.2655 597.666 31.4151 612.66C23.4206 620.702 15.4013 627.161 6.88709 632.406C-2.64195 638.271 -12.567 642.477 -23.4821 645.273L-23.6058 644.803C21.49 633.198 45.4487 597.987 70.843 560.698C92.9454 528.209 115.815 494.606 154.303 474.762C175.118 464.023 198.433 458.282 225.609 457.169C240.386 456.575 256.474 457.416 273.477 459.643C291.347 461.994 310.826 465.977 331.32 471.495C414.235 493.765 461.806 549.192 503.783 598.061C526.554 624.587 548.062 649.628 572.417 665.638C599.47 683.429 627.215 688.254 659.713 680.855L659.812 681.325C650.06 683.577 640.704 684.715 631.67 684.715Z" fill="url(#paint66_linear_234_211)"/>
  4010. <path d="M632.339 678.826C625.037 678.826 617.934 678.109 610.954 676.698C597.093 673.902 583.951 668.31 570.734 659.625C546.008 643.368 524.326 618.228 501.382 591.604C459.133 542.561 411.265 486.986 327.508 465.483C306.421 460.064 286.447 456.229 268.131 454.101C250.756 452.072 234.322 451.478 219.298 452.393C191.726 454.051 168.212 460.485 147.422 472.09C109.033 493.543 87.2033 528.803 66.1156 562.925C42.3549 601.427 19.8565 637.825 -24.0019 649.109L-24.1256 648.639C19.5347 637.405 41.9836 601.105 65.7444 562.678C86.8815 528.531 108.712 493.196 147.224 471.669C168.064 460.014 191.651 453.556 219.298 451.898C234.346 451.008 250.806 451.577 268.205 453.606C286.546 455.758 306.52 459.594 327.632 465.013C411.512 486.565 459.455 542.19 501.754 591.282C524.673 617.882 546.305 642.997 571.006 659.229C598.43 677.243 626.621 682.34 659.713 675.263L659.812 675.758C650.258 677.812 641.15 678.826 632.339 678.826Z" fill="url(#paint67_linear_234_211)"/>
  4011. <path d="M632.982 672.962C575.585 672.962 539.895 631.689 499.402 584.848C456.831 535.632 408.592 479.835 323.895 459.049C302.188 453.729 281.67 450.043 262.909 448.113C245.113 446.281 228.307 445.96 212.987 447.172C184.894 449.399 161.134 456.575 140.343 469.12C123.166 479.488 107.92 493.691 93.7622 512.521C81.2136 529.199 70.9668 547.46 61.0665 565.103C38.865 604.668 17.8764 642.032 -24.5216 652.944L-24.6454 652.474C-14.4728 649.851 -5.3398 645.719 3.32296 639.805C11.0947 634.51 18.3219 627.878 25.4254 619.54C38.6918 603.951 49.3346 584.972 60.6209 564.88C70.546 547.213 80.7928 528.952 93.3414 512.249C107.548 493.345 122.844 479.117 140.071 468.724C160.936 456.13 184.771 448.954 212.937 446.702C228.283 445.49 245.113 445.811 262.934 447.642C281.719 449.572 302.263 453.259 323.994 458.604C408.839 479.439 457.153 535.286 499.749 584.576C522.816 611.25 544.597 636.465 569.595 652.87C582.911 661.629 596.202 667.296 610.211 670.216C625.73 673.457 641.917 673.284 659.688 669.721L659.787 670.216C650.357 672.047 641.422 672.962 632.982 672.962Z" fill="url(#paint68_linear_234_211)"/>
  4012. <path d="M633.601 667.122C574.645 667.122 538.484 625.428 497.373 578.093C454.504 528.679 405.894 472.683 320.232 452.591C297.882 447.345 276.819 443.832 257.563 442.124C239.321 440.491 222.144 440.466 206.551 442.001C177.964 444.821 153.931 452.739 133.116 466.25C115.939 477.385 100.915 492.478 87.1537 512.397C74.9764 529.991 65.2988 549.068 55.9183 567.503C45.3992 588.164 35.4742 607.687 22.9751 623.548C16.2676 632.06 9.38689 638.79 1.93691 644.135C-6.35459 650.098 -15.1906 654.231 -25.0414 656.755L-25.1652 656.284C-6.6021 651.509 8.5701 640.993 22.579 623.226C35.0534 607.39 44.9785 587.892 55.4728 567.255C64.8533 548.796 74.5556 529.718 86.7577 512.101C100.569 492.132 115.642 477.013 132.868 465.829C153.758 452.269 177.841 444.326 206.527 441.506C222.169 439.972 239.346 440.021 257.637 441.629C276.918 443.337 298.005 446.875 320.38 452.121C406.191 472.238 454.851 528.308 497.769 577.796C544.523 631.664 584.891 678.208 659.738 664.128L659.837 664.623C650.58 666.281 641.868 667.122 633.601 667.122Z" fill="url(#paint69_linear_234_211)"/>
  4013. <path d="M634.343 661.283C625.433 661.283 616.869 660.367 608.479 658.511C593.975 655.319 580.263 649.406 566.526 640.399C540.86 623.548 518.757 598.161 495.343 571.289C473.315 546 450.544 519.846 422.13 497.205C389.781 471.446 355.254 454.719 316.593 446.083C293.6 440.937 271.943 437.571 252.217 436.087C233.53 434.676 215.981 434.924 200.067 436.78C185.117 438.537 171.133 441.803 158.51 446.455C146.778 450.785 135.789 456.501 125.864 463.404C108.712 475.331 93.8859 491.34 80.5453 512.323C68.7639 530.857 59.6309 550.751 50.7701 570.002C41.0431 591.158 31.8606 611.151 20.1287 627.235C6.96131 645.298 -7.56739 655.889 -25.5612 660.516L-25.6849 660.046C-7.79014 655.443 6.63954 644.927 19.7327 626.963C31.4398 610.929 40.5976 590.96 50.3246 569.804C59.1854 550.553 68.3184 530.634 80.1245 512.076C93.5147 491.019 108.365 474.985 125.592 463.008C135.566 456.08 146.58 450.339 158.362 446.009C171.034 441.333 185.068 438.066 200.042 436.31C215.981 434.429 233.554 434.206 252.266 435.617C272.017 437.101 293.724 440.467 316.717 445.613C355.477 454.274 390.053 471.05 422.452 496.834C450.916 519.499 473.711 545.654 495.739 570.967C519.129 597.814 541.206 623.177 566.823 639.978C580.486 648.936 594.173 654.849 608.603 658.017C624.616 661.53 641.348 661.679 659.738 658.437L659.812 658.932C650.976 660.516 642.536 661.283 634.343 661.283Z" fill="url(#paint70_linear_234_211)"/>
  4014. <path d="M-26.081 664.376L-26.2047 663.906C-9.02769 659.476 4.68422 648.985 16.8863 630.848C27.8014 614.615 36.2414 594.251 45.1765 572.649C53.4927 552.582 62.0812 531.822 73.4666 512.323C86.4112 490.177 101.064 473.178 118.241 460.386C128.215 452.962 139.279 446.801 151.184 442.05C164.005 436.953 178.212 433.291 193.483 431.212C209.719 428.985 227.689 428.466 246.87 429.653C267.116 430.915 289.417 434.107 313.079 439.155C352.259 447.519 387.182 464.097 419.853 489.856C448.564 512.497 471.533 538.775 493.759 564.212C517.297 591.158 539.523 616.595 565.462 633.594C579.298 642.675 593.158 648.688 607.811 651.979C624.072 655.641 641.076 655.938 659.762 652.87L659.837 653.365C641.076 656.458 624.022 656.161 607.687 652.474C592.985 649.158 579.075 643.121 565.165 634.015C539.177 616.966 516.926 591.504 493.363 564.558C471.162 539.146 448.193 512.868 419.532 490.252C386.935 464.543 352.086 447.989 312.98 439.65C289.318 434.602 267.067 431.41 246.846 430.148C227.688 428.961 209.769 429.48 193.557 431.707C178.335 433.786 164.153 437.423 151.382 442.52C139.526 447.246 128.487 453.383 118.562 460.781C101.435 473.525 86.832 490.474 73.9368 512.571C62.5515 532.044 53.9877 552.78 45.6715 572.847C36.7365 594.449 28.2717 614.863 17.3319 631.12C5.00599 649.331 -8.78018 659.922 -26.081 664.376Z" fill="url(#paint71_linear_234_211)"/>
  4015. <path d="M-26.6007 668.186L-26.7245 667.716C-10.2405 663.485 2.7289 652.993 14.04 634.757C24.1878 618.401 31.91 597.641 40.053 575.668C47.8 554.784 55.8193 533.182 66.8086 512.719C79.283 489.435 93.6879 471.495 110.84 457.837C154.996 422.725 219.941 414.485 309.391 432.672C349.017 440.738 384.262 457.144 417.18 482.853C446.114 505.469 469.281 531.896 491.705 557.432C515.391 584.452 537.791 609.988 564.026 627.16C578.035 636.34 592.094 642.477 606.969 645.892C623.478 649.702 640.754 650.123 659.737 647.228L659.812 647.723C640.754 650.643 623.428 650.197 606.845 646.387C591.92 642.947 577.813 636.786 563.754 627.581C537.444 610.359 515.045 584.799 491.333 557.753C468.934 532.217 445.792 505.815 416.883 483.249C384.039 457.589 348.843 441.209 309.316 433.167C220.016 415.005 155.194 423.195 111.162 458.233C94.0839 471.817 79.7037 489.732 67.2541 512.942C56.2895 533.38 48.295 554.957 40.548 575.841C32.3803 597.839 24.6828 618.624 14.4855 635.004C3.07542 653.364 -9.99298 663.905 -26.6007 668.186Z" fill="url(#paint72_linear_234_211)"/>
  4016. <path d="M-27.1205 671.997L-27.2443 671.527C7.28304 662.644 20.1287 623.82 35.0039 578.885C49.1366 536.226 65.1255 487.901 103.415 455.412C147.57 417.949 213.754 408.398 305.752 426.214C345.799 433.959 381.391 450.216 414.557 475.875C443.738 498.467 467.078 525.017 489.675 550.677C513.535 577.796 536.058 603.382 562.64 620.777C576.823 630.081 591.054 636.316 606.152 639.854C622.908 643.814 640.457 644.383 659.762 641.636L659.837 642.131C640.482 644.878 622.884 644.308 606.053 640.349C590.906 636.786 576.625 630.526 562.393 621.197C535.786 603.778 513.213 578.143 489.329 550.998C466.756 525.339 443.416 498.813 414.284 476.271C381.193 450.661 345.675 434.429 305.703 426.709C274.938 420.746 247.959 418.048 224.248 418.048C88.812 418.048 59.6556 506.137 35.5237 579.033C20.5494 624.117 7.6543 663.064 -27.1205 671.997Z" fill="url(#paint73_linear_234_211)"/>
  4017. <path d="M-27.6402 675.808L-27.7639 675.337C5.20408 666.85 16.6884 627.68 29.9796 582.3C42.9985 537.909 57.7499 487.579 95.9403 453.111C140.096 413.248 207.517 402.336 302.089 419.731C323.499 423.665 343.992 430.148 362.951 438.982C379.98 446.9 395.969 456.674 411.908 468.897C441.312 491.464 464.875 518.138 487.646 543.922C511.654 571.115 534.35 596.8 561.23 614.393C575.585 623.795 590.015 630.155 605.311 633.817C622.339 637.9 640.135 638.642 659.738 636.044L659.812 636.539C640.16 639.137 622.29 638.394 605.212 634.287C589.866 630.6 575.387 624.216 560.957 614.789C534.029 597.171 511.307 571.462 487.274 544.243C464.504 518.46 440.966 491.81 411.611 469.293C378.272 443.708 342.433 427.674 302.015 420.226C273.081 414.906 246.697 412.233 222.738 412.233C168.534 412.233 126.805 425.917 96.2868 453.482C58.2202 487.851 43.4687 538.107 30.4746 582.448C17.1092 627.952 5.6001 667.271 -27.6402 675.808Z" fill="url(#paint74_linear_234_211)"/>
  4018. <path d="M-28.1599 679.643L-28.2837 679.173C-13.9035 675.486 -3.11218 665.217 5.67433 646.882C13.6193 630.353 19.1635 608.776 25.0542 585.962C36.9345 539.814 50.4237 487.48 88.4408 450.983C98.3164 441.506 109.578 433.415 121.904 426.981C135.245 420.028 150.293 414.733 166.653 411.269C184.127 407.557 203.705 405.775 224.793 405.998C247.143 406.221 271.918 408.695 298.426 413.322C320.058 417.108 340.75 423.443 359.907 432.202C377.084 440.046 393.222 449.77 409.26 461.969C438.911 484.511 462.647 511.284 485.616 537.216C509.798 564.509 532.643 590.267 559.819 608.058C574.348 617.56 588.975 624.043 604.494 627.829C621.77 632.06 639.838 632.926 659.738 630.501L659.787 630.996C639.813 633.421 621.696 632.555 604.37 628.299C588.802 624.488 574.15 618.005 559.547 608.454C532.296 590.638 509.451 564.855 485.245 537.538C462.301 511.655 438.565 484.857 408.963 462.365C392.949 450.191 376.837 440.467 359.684 432.647C340.577 423.938 319.935 417.578 298.327 413.817C271.844 409.19 247.093 406.716 224.768 406.493C203.705 406.27 184.177 408.052 166.727 411.763C150.392 415.228 135.393 420.498 122.102 427.451C109.825 433.86 98.5887 441.902 88.7379 451.354C50.8445 487.728 37.4048 539.963 25.5244 586.061C19.6338 608.9 14.0896 630.501 6.11984 647.08C-2.74092 665.564 -13.6312 675.907 -28.1599 679.643Z" fill="url(#paint75_linear_234_211)"/>
  4019. <path d="M-28.6797 683.453L-28.8035 682.983C-15.1163 679.47 -5.04275 669.325 2.95174 651.039C10.179 634.51 15.0301 612.784 20.1783 589.797C25.3264 566.76 31.1676 540.655 40.3006 516.159C50.7454 488.124 64.0366 466.151 80.9166 448.929C90.7674 438.883 102.054 430.321 114.479 423.418C127.918 415.97 143.189 410.229 159.847 406.394C177.643 402.262 197.616 400.158 219.224 400.109C219.496 400.109 219.768 400.109 220.016 400.109C242.688 400.109 267.859 402.361 294.813 406.839C316.692 410.452 337.582 416.687 356.887 425.348C374.213 433.118 390.499 442.817 406.661 454.991C436.535 477.508 460.469 504.405 483.611 530.436C507.941 557.803 530.935 583.661 558.458 601.65C573.159 611.25 587.96 617.832 603.702 621.766C621.225 626.121 639.541 627.161 659.762 624.884L659.812 625.379C639.541 627.656 621.151 626.616 603.578 622.237C587.787 618.302 572.937 611.696 558.185 602.045C530.638 584.032 507.62 558.149 483.24 530.758C460.098 504.752 436.189 477.855 406.364 455.362C390.227 443.213 373.99 433.538 356.689 425.793C337.409 417.158 316.568 410.947 294.738 407.334C267.81 402.88 242.688 400.604 220.041 400.604C219.768 400.604 219.496 400.604 219.249 400.604C197.691 400.653 177.766 402.757 159.995 406.889C143.388 410.724 128.166 416.44 114.751 423.863C102.351 430.717 91.1139 439.279 81.2879 449.275C64.4574 466.448 51.2157 488.371 40.7956 516.332C31.6874 540.779 25.8462 566.884 20.698 589.896C15.5499 612.933 10.674 634.658 3.44676 651.237C-4.64674 669.646 -14.844 679.89 -28.6797 683.453Z" fill="url(#paint76_linear_234_211)"/>
  4020. <path d="M-29.1995 687.264L-29.3232 686.794C-16.3538 683.453 -6.94856 673.432 0.278656 655.27C6.81285 638.79 10.9957 616.966 15.4261 593.83C19.9803 570.027 25.1532 543.031 33.7664 517.495C43.642 488.223 56.5866 465.186 73.3676 446.999C83.1689 436.384 94.48 427.303 107.004 419.954C120.567 411.986 136.037 405.8 152.966 401.569C171.084 397.041 191.478 394.566 213.581 394.245C237.02 393.898 263.132 395.952 291.149 400.356C313.252 403.82 334.34 409.932 353.843 418.494C371.342 426.189 387.752 435.839 404.038 447.989C434.135 470.481 458.267 497.502 481.607 523.656C506.11 551.122 529.252 577.054 557.072 595.216C571.947 604.94 586.946 611.621 602.885 615.679C620.631 620.183 639.244 621.346 659.762 619.243L659.812 619.737C639.244 621.841 620.582 620.678 602.761 616.15C586.772 612.092 571.724 605.386 556.799 595.637C528.93 577.45 505.763 551.469 481.235 523.978C457.92 497.848 433.813 470.828 403.741 448.385C387.479 436.235 371.094 426.61 353.645 418.939C334.191 410.402 313.153 404.291 291.075 400.827C263.057 396.422 236.995 394.368 213.581 394.715C191.528 395.036 171.158 397.511 153.09 402.039C136.21 406.27 120.79 412.431 107.251 420.374C94.777 427.699 83.4907 436.78 73.7389 447.345C57.0074 465.458 44.0875 488.47 34.2367 517.643C25.6234 543.13 20.4753 570.101 15.9211 593.905C11.4907 617.04 7.30787 638.914 0.748919 655.418C-6.55255 673.779 -16.0568 683.874 -29.1995 687.264Z" fill="url(#paint77_linear_234_211)"/>
  4021. <path d="M-29.7193 691.075L-29.843 690.605C-17.5419 687.437 -8.82963 677.565 -2.36969 659.526C3.49624 643.146 7.01085 621.247 10.7235 598.062C14.6836 573.466 19.1387 545.604 27.2322 519.029C36.5137 488.52 49.1119 464.369 65.7691 445.218C75.4962 434.033 86.832 424.408 99.4549 416.564C113.142 408.077 128.785 401.421 146.011 396.793C164.45 391.82 185.266 388.999 207.863 388.38C231.871 387.737 258.652 389.568 287.462 393.849C309.811 397.165 331.097 403.153 350.749 411.615C368.397 419.236 384.955 428.837 401.365 440.986C431.709 463.454 456.014 490.598 479.527 516.876C504.204 544.441 527.494 570.472 555.636 588.808C570.684 598.631 585.881 605.436 602.019 609.593C620.013 614.244 638.897 615.556 659.713 613.601L659.762 614.096C638.897 616.051 619.963 614.739 601.895 610.063C585.683 605.881 570.462 599.052 555.364 589.203C527.173 570.819 503.857 544.763 479.156 517.173C455.668 490.92 431.362 463.776 401.068 441.358C384.683 429.233 368.174 419.657 350.551 412.06C330.924 403.598 309.688 397.635 287.387 394.319C258.602 390.038 231.847 388.207 207.863 388.851C185.29 389.444 164.525 392.265 146.11 397.239C128.933 401.866 113.315 408.497 99.6776 416.96C87.1043 424.754 75.7932 434.355 66.1156 445.514C49.5079 464.592 36.9345 488.693 27.6777 519.128C19.609 545.679 15.1291 573.516 11.1937 598.087C7.45636 621.297 3.94176 643.22 -1.92417 659.65C-8.40886 677.911 -17.2449 687.883 -29.7193 691.075Z" fill="url(#paint78_linear_234_211)"/>
  4022. <path d="M-30.239 694.91L-30.3628 694.44C-18.7547 691.446 -10.686 681.746 -4.96853 663.881C0.229126 647.624 2.97646 626.74 6.14456 602.54C14.2381 540.952 24.2869 464.32 83.1689 419.508C93.391 411.714 104.925 405.083 117.449 399.763C130.715 394.121 145.516 389.815 161.406 386.92C178.113 383.877 196.577 382.343 216.254 382.343C216.303 382.343 216.353 382.343 216.402 382.343C237.094 382.343 259.79 384.05 283.798 387.415C306.693 390.607 327.583 396.323 347.705 404.835C365.501 412.382 382.207 421.933 398.741 434.058C429.308 456.501 453.811 483.769 477.523 510.171C502.348 537.81 525.811 563.94 554.25 582.473C569.472 592.395 584.842 599.324 601.202 603.604C619.443 608.38 638.6 609.84 659.713 608.058L659.762 608.553C638.6 610.335 619.394 608.875 601.078 604.099C584.644 599.794 569.249 592.865 553.978 582.918C525.49 564.336 502.001 538.206 477.151 510.542C453.465 484.165 428.986 456.897 398.444 434.503C381.935 422.403 365.278 412.852 347.507 405.33C327.434 396.843 306.594 391.152 283.724 387.96C259.716 384.594 237.069 382.887 216.377 382.887C216.328 382.887 216.278 382.887 216.229 382.887C196.577 382.887 178.162 384.421 161.455 387.44C145.59 390.31 130.839 394.641 117.597 400.257C105.123 405.553 93.6385 412.184 83.4411 419.929C24.7076 464.617 14.6588 541.15 6.59007 602.639C3.42197 626.864 0.674643 647.773 -4.54777 664.079C-10.2652 682.068 -18.4577 691.867 -30.239 694.91Z" fill="url(#paint79_linear_234_211)"/>
  4023. <path d="M-30.7588 698.72L-30.8826 698.25C-7.0476 692.114 -3.18648 654.651 1.68942 607.192C4.95652 575.52 8.64438 539.641 19.0149 505.667C31.0191 466.349 49.8049 437.027 76.4367 415.994C86.7082 407.878 98.3411 400.925 110.989 395.333C124.404 389.395 139.403 384.792 155.54 381.674C172.569 378.383 191.379 376.602 211.477 376.429C232.564 376.231 255.682 377.765 280.185 381.006C303.327 384.05 324.414 389.642 344.685 398.055C362.654 405.528 379.485 415.029 396.142 427.154C426.957 449.572 451.658 476.964 475.542 503.465C500.541 531.203 524.153 557.407 552.889 576.138C568.284 586.184 583.852 593.187 600.435 597.591C618.924 602.515 638.328 604.099 659.762 602.466L659.812 602.961C638.328 604.594 618.874 602.985 600.336 598.061C583.703 593.632 568.11 586.605 552.666 576.534C523.856 557.778 500.219 531.549 475.221 503.786C451.361 477.31 426.685 449.919 395.919 427.525C379.287 415.425 362.506 405.948 344.562 398.476C324.315 390.063 303.253 384.495 280.185 381.452C255.706 378.235 232.614 376.676 211.551 376.874C191.478 377.072 172.692 378.829 155.713 382.12C139.601 385.237 124.651 389.84 111.261 395.754C98.6629 401.346 87.0547 408.274 76.8079 416.366C50.2504 437.324 31.5388 466.596 19.5595 505.791C9.1889 539.715 5.50103 575.594 2.23393 607.217C-2.71622 654.874 -6.57733 692.51 -30.7588 698.72Z" fill="url(#paint80_linear_234_211)"/>
  4024. <path d="M-31.2786 702.531L-31.4023 702.061C-9.02766 696.296 -6.20608 659.13 -2.64197 612.042C-0.166893 579.256 2.6547 542.115 12.5055 506.608C23.9156 465.434 42.6272 434.652 69.7045 412.481C80.0255 404.019 91.7574 396.744 104.554 390.88C118.117 384.644 133.314 379.745 149.699 376.38C166.975 372.816 186.107 370.812 206.551 370.441C228.01 370.045 251.548 371.406 276.546 374.499C299.911 377.394 321.222 382.862 341.666 391.201C359.783 398.6 376.762 408.077 393.543 420.152C424.581 442.545 449.48 470.061 473.538 496.685C498.685 524.522 522.445 550.801 551.527 569.73C567.096 579.875 582.837 587.001 599.643 591.529C618.379 596.577 638.056 598.334 659.762 596.849L659.787 597.344C638.006 598.829 618.28 597.072 599.494 592C582.639 587.447 566.873 580.296 551.255 570.126C522.123 551.172 498.363 524.869 473.167 497.007C449.109 470.407 424.259 442.892 393.246 420.548C376.49 408.473 359.561 399.02 341.468 391.647C321.048 383.333 299.787 377.864 276.472 374.994C251.499 371.901 227.986 370.54 206.551 370.936C186.132 371.332 167.024 373.311 149.773 376.874C133.413 380.24 118.265 385.114 104.727 391.35C91.9801 397.214 80.2978 404.464 70.0015 412.902C42.9984 434.998 24.3363 465.706 12.951 506.781C3.12496 542.239 0.30337 579.355 -2.17171 612.117C-5.73581 659.353 -8.5574 696.692 -31.2786 702.531Z" fill="url(#paint81_linear_234_211)"/>
  4025. <path d="M-31.7984 706.342L-31.9221 705.872C-22.3188 703.397 -16.1311 694.291 -12.4433 677.218C-9.07717 661.555 -8.03764 640.968 -6.87436 617.115C-5.19131 583.215 -3.2855 544.812 5.97128 507.746C16.7379 464.666 35.3752 432.375 62.9228 409.042C73.2933 400.257 85.1242 392.661 98.0441 386.475C111.756 379.918 127.151 374.771 143.783 371.134C161.307 367.298 180.761 365.071 201.576 364.477C223.407 363.859 247.39 365.046 272.883 368.016C296.496 370.762 318.004 376.107 338.621 384.347C356.912 391.671 374.015 401.099 390.92 413.174C422.205 435.542 447.277 463.182 471.533 489.93C496.853 517.841 520.762 544.218 550.141 563.346C565.883 573.59 581.822 580.84 598.826 585.492C617.81 590.688 637.734 592.568 659.762 591.257L659.787 591.752C637.71 593.063 617.736 591.183 598.678 585.987C581.624 581.335 565.66 574.06 549.869 563.791C520.44 544.639 496.506 518.237 471.162 490.301C446.931 463.577 421.883 435.938 390.623 413.619C373.743 401.569 356.689 392.141 338.423 384.842C317.831 376.602 296.372 371.257 272.809 368.535C247.365 365.591 223.407 364.403 201.576 364.997C180.786 365.591 161.381 367.818 143.882 371.628C127.299 375.241 111.954 380.388 98.2668 386.945C85.3717 393.106 73.5903 400.678 63.2445 409.437C35.7712 432.697 17.2081 464.914 6.4663 507.869C-2.79048 544.887 -4.69629 583.289 -6.37934 617.139C-7.56738 641.017 -8.58216 661.629 -11.973 677.317C-15.6856 694.613 -21.9723 703.818 -31.7984 706.342Z" fill="url(#paint82_linear_234_211)"/>
  4026. <path d="M-32.3181 710.177L-32.4419 709.707C-23.4821 707.406 -17.8884 698.523 -14.8194 681.796C-11.9978 666.405 -11.5028 646.016 -10.9335 622.41C-10.092 587.397 -9.12668 547.732 -0.463921 509.057C9.63438 464.023 28.148 430.198 56.1906 405.652C66.6106 396.521 78.5405 388.603 91.6089 382.145C105.469 375.291 121.062 369.822 137.918 365.962C155.713 361.879 175.464 359.38 196.626 358.613C218.852 357.796 243.281 358.786 269.245 361.607C293.105 364.205 314.811 369.426 335.602 377.592C354.041 384.842 371.292 394.22 388.321 406.295C419.829 428.639 445.099 456.402 469.528 483.274C519.698 538.428 567.096 590.539 659.762 585.714L659.787 586.209C655.778 586.407 651.817 586.531 647.956 586.531C562.739 586.531 517.223 536.473 469.157 483.62C444.753 456.773 419.482 429.01 388.024 406.716C371.045 394.665 353.818 385.312 335.404 378.087C314.638 369.921 292.981 364.725 269.171 362.127C243.232 359.306 218.828 358.316 196.626 359.133C175.489 359.924 155.763 362.399 137.992 366.482C121.161 370.366 105.618 375.785 91.7821 382.64C78.7632 389.098 66.8829 396.966 56.4875 406.072C28.5687 430.445 10.0799 464.196 0.0310936 509.131C-8.63167 547.757 -9.5722 587.422 -10.4137 622.41C-10.983 646.04 -11.478 666.454 -14.2996 681.87C-17.4182 698.82 -23.1356 707.802 -32.3181 710.177Z" fill="url(#paint83_linear_234_211)"/>
  4027. <path d="M-32.8379 713.987L-32.9617 713.517C-24.6454 711.365 -19.5963 702.754 -17.1212 686.398C-14.8441 671.329 -14.8441 651.187 -14.8689 627.903C-14.8936 557.234 -14.9431 460.435 49.4088 402.261C59.8784 392.784 71.9073 384.545 85.0994 377.79C99.1083 370.614 114.899 364.873 132.002 360.741C150.045 356.386 170.118 353.664 191.651 352.674C214.249 351.635 239.123 352.452 265.582 355.124C289.689 357.549 311.594 362.671 332.557 370.762C351.17 377.938 368.545 387.291 385.697 399.317C417.452 421.636 442.896 449.523 467.523 476.518C518.089 531.92 565.833 584.254 659.762 580.072L659.787 580.567C656.223 580.716 652.758 580.815 649.318 580.815C561.997 580.815 515.886 530.263 467.152 476.865C442.55 449.894 417.106 422.032 385.4 399.738C368.297 387.712 350.947 378.383 332.359 371.232C311.42 363.166 289.565 358.069 265.508 355.619C239.074 352.946 214.224 352.13 191.651 353.169C170.143 354.159 150.12 356.881 132.101 361.236C115.023 365.368 99.2816 371.084 85.2974 378.235C72.13 384.965 60.1507 393.18 49.7058 402.633C-14.4729 460.682 -14.4481 557.333 -14.3986 627.903C-14.3986 651.236 -14.3739 671.378 -16.6757 686.472C-19.126 703.051 -24.2742 711.785 -32.8379 713.987Z" fill="url(#paint84_linear_234_211)"/>
  4028. <path d="M-33.3577 717.798L-33.4814 717.328C-25.784 715.348 -21.3041 706.985 -19.3735 691.05C-17.5915 676.327 -18.0865 656.507 -18.6557 633.594C-19.522 598.21 -20.5863 554.165 -13.2601 512.15C-9.22571 489.113 -3.21128 469.169 5.12973 451.23C14.6093 430.841 27.2074 413.248 42.6024 398.896C53.1214 389.073 65.2245 380.511 78.5652 373.459C92.7226 365.962 108.712 359.949 126.062 355.545C144.377 350.917 164.747 347.948 186.652 346.736C209.645 345.474 234.94 346.117 261.894 348.641C286.249 350.917 308.351 355.916 329.488 363.933C348.249 371.034 365.773 380.338 383.049 392.364C415.027 414.658 440.693 442.669 465.494 469.763C514.797 523.631 561.452 574.629 650.704 574.629C653.674 574.629 656.669 574.579 659.713 574.456L659.738 574.95C656.668 575.074 653.649 575.124 650.704 575.124C561.23 575.124 514.525 524.077 465.122 470.11C440.347 443.04 414.705 415.029 382.777 392.76C365.55 380.759 348.051 371.455 329.315 364.378C308.203 356.386 286.125 351.412 261.845 349.136C234.916 346.612 209.62 345.969 186.676 347.231C164.822 348.418 144.452 351.388 126.186 356.015C108.86 360.394 92.9206 366.407 78.788 373.88C65.4968 380.907 53.4184 389.444 42.9241 399.243C27.5787 413.545 15.03 431.113 5.57524 451.428C-2.76577 469.343 -8.75544 489.237 -12.7898 512.224C-20.116 554.19 -19.0518 598.21 -18.1855 633.569C-17.6162 656.532 -17.146 676.352 -18.9033 691.099C-20.8091 707.282 -25.4127 715.769 -33.3577 717.798Z" fill="url(#paint85_linear_234_211)"/>
  4029. <path d="M-33.8773 721.609L-34.0011 721.139C-26.8976 719.308 -22.9623 711.241 -21.5515 695.751C-20.2644 681.424 -21.1802 661.976 -22.2692 639.483C-24.0018 603.06 -26.1799 557.704 -19.5714 513.956C-15.9331 489.93 -10.1661 469.145 -1.89937 450.364C7.48116 429.035 20.1783 410.576 35.8208 395.531C46.3893 385.361 58.5915 376.478 72.0806 369.105C86.3866 361.285 102.574 354.976 120.171 350.299C138.734 345.375 159.451 342.183 181.702 340.773C205.066 339.288 230.832 339.733 258.281 342.109C282.858 344.237 305.183 349.111 326.518 357.029C345.453 364.057 363.1 373.311 380.5 385.337C412.725 407.606 438.565 435.74 463.538 462.959C489.502 491.241 514.03 517.965 544.647 537.835C561.081 548.499 577.738 556.17 595.584 561.292C615.533 567.033 636.521 569.482 659.738 568.765L659.762 569.259C636.497 569.952 615.459 567.503 595.46 561.762C577.565 556.615 560.858 548.92 544.374 538.255C513.708 518.361 489.156 491.613 463.167 463.305C438.194 436.112 412.379 407.977 380.203 385.757C362.852 373.756 345.23 364.527 326.32 357.5C305.035 349.606 282.759 344.732 258.206 342.604C230.782 340.228 205.042 339.783 181.702 341.267C159.476 342.678 138.809 345.87 120.27 350.794C102.697 355.446 86.5598 361.756 72.3034 369.55C58.8637 376.899 46.7111 385.757 36.1673 395.902C20.5743 410.922 7.90192 429.307 -1.45386 450.587C-9.69586 469.318 -15.4628 490.078 -19.0764 514.031C-25.6848 557.729 -23.5315 603.035 -21.7742 639.458C-19.5962 684.79 -18.0369 717.551 -33.8773 721.609Z" fill="url(#paint86_linear_234_211)"/>
  4030. <path d="M-34.3971 725.444L-34.5209 724.974C-20.3634 721.337 -22.6158 689.59 -25.7344 645.645C-28.3827 608.182 -31.6745 561.539 -25.8334 516.035C-22.6653 491.365 -16.9726 469.046 -8.95335 449.721C0.303432 427.402 13.0748 408.077 29.0143 392.29C39.6324 381.774 51.9335 372.544 65.5464 364.873C80.0008 356.733 96.3858 350.126 114.231 345.202C133.066 340.006 154.08 336.541 176.702 334.908C200.463 333.201 226.674 333.473 254.617 335.675C279.442 337.655 301.99 342.43 323.474 350.25C342.582 357.203 360.377 366.432 377.876 378.433C410.324 400.678 436.362 428.936 461.534 456.278C487.67 484.659 512.347 511.482 543.285 531.525C559.893 542.288 576.748 550.058 594.792 555.304C614.988 561.168 636.249 563.766 659.738 563.222V563.717C636.175 564.261 614.889 561.663 594.643 555.799C576.55 550.553 559.646 542.734 543.013 531.945C512.025 511.853 487.324 485.031 461.162 456.624C410.374 401.445 357.853 344.41 254.568 336.17C226.649 333.943 200.463 333.696 176.727 335.403C154.129 337.036 133.141 340.476 114.355 345.672C96.5343 350.596 80.1989 357.203 65.7939 365.294C52.2057 372.94 39.9541 382.12 29.3608 392.611C13.4708 408.349 0.748943 427.624 -8.48308 449.869C-16.5023 469.17 -22.1702 491.439 -25.3383 516.06C-31.1795 561.539 -27.8877 608.132 -25.2393 645.57C-22.096 689.763 -19.8437 721.683 -34.3971 725.444Z" fill="url(#paint87_linear_234_211)"/>
  4031. <path d="M-34.9169 729.255L-35.0406 728.784C-22.1703 725.469 -25.0413 694.662 -29.0015 652.004C-36.1544 575.371 -46.9458 459.593 22.2078 389.048C32.8754 378.161 45.2508 368.609 59.0122 360.642C73.6151 352.179 90.1982 345.251 108.291 340.055C127.374 334.586 148.734 330.85 171.727 329.019C195.884 327.089 222.54 327.138 251.004 329.217C355.501 336.838 408.419 394.145 459.603 449.572C485.888 478.053 510.738 504.949 541.974 525.19C558.755 536.053 575.783 543.946 594.049 549.291C614.493 555.304 636.002 558.025 659.812 557.63V558.124C635.952 558.52 614.394 555.799 593.901 549.761C575.585 544.391 558.507 536.473 541.701 525.586C510.416 505.321 485.567 478.399 459.232 449.894C408.122 394.541 355.279 337.308 250.954 329.712C222.54 327.633 195.884 327.584 171.752 329.514C148.783 331.345 127.473 335.056 108.415 340.525C90.3467 345.696 73.8131 352.625 59.2597 361.063C45.5478 369.005 33.1972 378.532 22.5543 389.395C-46.4507 459.791 -35.6594 575.445 -28.5064 651.979C-26.5016 673.407 -24.7938 691.916 -25.1898 705.401C-25.6601 720.075 -28.754 727.671 -34.9169 729.255Z" fill="url(#paint88_linear_234_211)"/>
  4032. <path d="M-35.4119 733.065L-35.5357 732.595C-23.8781 729.601 -27.3184 699.809 -32.0706 658.61C-36.6247 619.119 -42.2926 569.977 -38.1097 520.761C-35.8327 494.013 -30.7588 469.788 -22.987 448.706C-14.0025 424.309 -1.08261 403.152 15.4014 385.831C26.1185 374.598 38.5928 364.7 52.478 356.411C67.2295 347.627 84.0105 340.401 102.351 334.933C121.706 329.167 143.363 325.184 166.727 323.13C191.28 320.952 218.407 320.829 247.365 322.759C352.903 329.737 406.142 387.242 457.623 442.867C484.082 471.446 509.08 498.417 540.612 518.856C557.567 529.817 574.768 537.81 593.257 543.303C613.949 549.439 635.705 552.31 659.812 552.062V552.557C635.68 552.805 613.85 549.934 593.109 543.773C574.595 538.28 557.319 530.263 540.34 519.276C508.733 498.813 483.735 471.817 457.252 443.213C405.82 387.663 352.655 330.231 247.316 323.278C218.382 321.373 191.28 321.497 166.777 323.65C143.437 325.703 121.805 329.687 102.499 335.428C84.1837 340.871 67.4522 348.097 52.7503 356.856C38.8899 365.121 26.465 374.994 15.7726 386.203C-0.66185 403.474 -13.557 424.556 -22.5168 448.904C-30.2637 469.937 -35.3376 494.136 -37.6147 520.835C-41.7976 570.002 -36.1297 619.119 -31.5755 658.586C-29.1747 679.371 -27.0956 697.31 -27.1451 710.276C-27.1946 724.38 -29.8182 731.63 -35.4119 733.065Z" fill="url(#paint89_linear_234_211)"/>
  4033. <path d="M-35.9317 736.876L-36.0555 736.406C-25.6107 733.709 -29.5213 705.08 -34.9664 665.44C-40.5106 624.983 -47.4408 574.629 -44.1737 523.508C-42.3917 495.696 -37.6395 470.432 -30.041 448.459C-21.2298 422.948 -8.23562 400.827 8.54539 382.714C19.2872 371.109 31.8606 360.865 45.8943 352.279C60.7942 343.148 77.7732 335.626 96.361 329.861C115.988 323.798 137.967 319.567 161.703 317.291C186.652 314.89 214.224 314.569 243.702 316.326C350.279 322.685 403.84 380.363 455.643 436.161C482.25 464.84 507.397 491.91 539.251 512.497C556.354 523.557 573.753 531.673 592.44 537.266C613.355 543.526 635.408 546.545 659.787 546.446V546.941C635.333 547.04 613.28 544.021 592.292 537.736C573.555 532.119 556.131 524.003 538.979 512.917C507.075 492.281 481.904 465.186 455.272 436.483C403.543 380.759 350.031 323.13 243.653 316.796C214.199 315.039 186.652 315.361 161.728 317.761C138.017 320.037 116.063 324.268 96.4848 330.331C77.9217 336.071 60.9922 343.594 46.1418 352.675C32.1576 361.261 19.609 371.455 8.89189 383.036C-7.83962 401.099 -20.7843 423.171 -29.5955 448.607C-37.194 470.556 -41.9214 495.77 -43.7035 523.533C-46.9706 574.604 -40.0651 624.934 -34.4962 665.366C-31.7488 685.408 -29.3728 702.729 -29.051 715.151C-28.8778 721.708 -29.2985 726.607 -30.2885 730.096C-31.4023 733.981 -33.2586 736.208 -35.9317 736.876Z" fill="url(#paint90_linear_234_211)"/>
  4034. <path d="M-36.4515 740.711L-36.5752 740.241C-32.3181 739.152 -30.6351 732.768 -31.3281 720.174C-31.9716 708.371 -34.6199 691.767 -37.6643 672.541C-43.9015 633.322 -52.4405 579.602 -50.1634 526.526C-48.9259 497.601 -44.5202 471.298 -37.095 448.36C-28.457 421.71 -15.4133 398.575 1.66467 379.621C12.456 367.645 25.1036 357.054 39.2611 348.146C54.3095 338.669 71.4865 330.825 90.3218 324.813C110.221 318.453 132.522 313.95 156.629 311.451C181.974 308.803 210.016 308.283 240.014 309.867C265.854 311.253 289.219 315.558 311.42 323.056C331.171 329.737 349.536 338.768 367.555 350.72C400.969 372.866 427.749 401.643 453.638 429.455C480.418 458.208 505.714 485.377 537.865 506.162C555.141 517.322 572.739 525.537 591.623 531.252C612.785 537.661 635.086 540.804 659.762 540.853V541.348C635.036 541.299 612.686 538.131 591.475 531.723C572.541 526.007 554.918 517.767 537.593 506.583C505.392 485.773 478.884 457.317 453.267 429.777C427.378 401.989 400.622 373.237 367.258 351.115C349.289 339.189 330.973 330.157 311.247 323.501C289.07 316.004 265.755 311.698 239.965 310.337C209.992 308.754 181.974 309.273 156.654 311.921C132.571 314.445 110.296 318.923 90.4456 325.283C71.635 331.295 54.5075 339.139 39.5086 348.567C25.3759 357.45 12.753 368.016 2.01118 379.967C-15.0173 398.872 -28.0115 421.933 -36.6247 448.533C-44.0252 471.421 -48.4308 497.675 -49.6684 526.576C-51.9454 579.627 -43.4312 633.297 -37.194 672.492C-30.8826 712.033 -26.7244 738.212 -36.4515 740.711Z" fill="url(#paint91_linear_234_211)"/>
  4035. <path d="M-36.9712 744.522L-37.095 744.052C-33.3328 743.087 -32.0458 737.099 -33.0358 725.222C-33.9516 714.037 -36.8227 698.201 -40.1393 679.866C-47.3665 639.805 -57.2916 584.923 -56.054 529.793C-55.361 499.704 -51.3514 472.312 -44.1242 448.41C-35.7089 420.548 -22.6158 396.373 -5.24074 376.553C5.57534 364.205 18.322 353.244 32.6279 344.014C47.8001 334.191 65.1999 326.025 84.2827 319.716C104.43 313.059 127.077 308.284 151.58 305.537C177.321 302.642 205.858 301.925 236.376 303.36C262.463 304.597 286.051 308.779 308.425 316.202C328.35 322.809 346.839 331.815 364.981 343.742C398.617 365.863 425.596 394.764 451.683 422.7C477.448 450.29 504.08 478.82 536.528 499.778C553.978 511.062 571.749 519.376 590.832 525.19C612.241 531.723 634.789 534.989 659.762 535.212V535.707C634.739 535.484 612.142 532.218 590.708 525.661C571.575 519.821 553.755 511.482 536.281 500.199C503.758 479.191 477.102 450.637 451.336 423.047C425.274 395.136 398.32 366.259 364.733 344.163C346.641 332.261 328.177 323.279 308.302 316.672C285.952 309.274 262.439 305.067 236.376 303.855C205.883 302.419 177.37 303.162 151.654 306.032C127.201 308.779 104.578 313.53 84.456 320.186C65.3979 326.471 48.0724 334.636 32.9249 344.435C18.6685 353.664 5.94659 364.577 -4.84473 376.899C-22.1703 396.67 -35.2386 420.795 -43.6292 448.583C-50.8564 472.461 -54.8412 499.778 -55.5343 529.842C-56.7718 584.923 -46.8715 639.78 -39.6443 679.816C-32.8378 717.427 -28.3579 742.295 -36.9712 744.522Z" fill="url(#paint92_linear_234_211)"/>
  4036. <path d="M-37.491 748.333L-37.6148 747.862C-34.3725 747.021 -33.4072 741.454 -34.6447 730.344C-35.808 719.852 -38.8276 704.857 -42.3422 687.487C-50.6089 646.61 -61.9448 590.639 -61.7963 533.405C-61.722 502.129 -58.1332 473.624 -51.1287 448.682C-42.9362 419.558 -29.8183 394.294 -12.1215 373.559C-1.25595 360.815 11.5649 349.507 25.9946 339.931C41.3154 329.762 58.9131 321.274 78.2435 314.668C98.6628 307.715 121.632 302.667 146.531 299.673C172.692 296.53 201.7 295.59 232.738 296.852C259.097 297.941 282.858 302.023 305.431 309.348C325.528 315.88 344.166 324.837 362.407 336.764C396.291 358.861 423.442 387.885 449.727 415.945C475.642 443.634 502.422 472.238 535.192 493.394C552.814 504.776 570.759 513.189 590.064 519.128C611.696 525.784 634.517 529.199 659.787 529.57V530.065C634.467 529.694 611.622 526.279 589.94 519.598C570.585 513.635 552.616 505.197 534.944 493.815C502.125 472.634 475.32 443.98 449.381 416.292C423.145 388.257 395.994 359.257 362.159 337.185C343.943 325.283 325.33 316.35 305.282 309.818C282.759 302.494 259.023 298.411 232.713 297.347C201.675 296.085 172.717 297.025 146.58 300.143C121.731 303.112 98.7866 308.16 78.392 315.113C59.0864 321.695 41.5381 330.182 26.2421 340.327C11.8372 349.879 -0.958942 361.162 -11.775 373.856C-29.4223 394.542 -42.5154 419.756 -50.6832 448.805C-57.6877 473.698 -61.2765 502.154 -61.3508 533.405C-61.4745 590.564 -50.1634 646.535 -41.8967 687.388C-38.3821 704.758 -35.3625 719.753 -34.1744 730.269C-32.8874 741.85 -33.9022 747.417 -37.491 748.333Z" fill="url(#paint93_linear_234_211)"/>
  4037. <path d="M-38.0108 752.168L-38.1345 751.698C-35.3624 750.98 -34.7437 745.858 -36.1544 735.54C-37.5157 725.766 -40.6591 711.711 -44.3222 695.43C-53.6532 653.81 -66.4246 596.8 -67.4889 537.439C-68.0582 504.9 -64.9396 475.232 -58.1579 449.226C-50.2376 418.791 -37.095 392.364 -19.0764 370.688C-8.18609 357.574 4.7338 345.895 19.2872 335.972C34.7565 325.456 52.5523 316.622 72.1301 309.719C92.8217 302.444 116.137 297.124 141.407 293.907C167.965 290.517 197.468 289.354 229.075 290.468C255.682 291.383 279.665 295.367 302.436 302.642C322.682 309.1 341.468 318.033 359.858 329.935C393.989 352.031 421.338 381.155 447.772 409.338C473.835 437.101 500.788 465.829 533.855 487.159C551.651 498.64 569.769 507.152 589.272 513.214C611.152 520.019 634.22 523.557 659.762 524.077V524.572C634.145 524.052 611.053 520.489 589.124 513.684C569.571 507.622 551.404 499.06 533.583 487.579C500.467 466.2 473.488 437.472 447.401 409.685C420.967 381.526 393.642 352.402 359.585 330.355C341.245 318.478 322.484 309.57 302.287 303.137C279.591 295.887 255.632 291.928 229.075 290.987C197.517 289.899 168.039 291.037 141.506 294.427C116.261 297.644 92.995 302.964 72.3281 310.214C52.775 317.092 35.0287 325.901 19.5843 336.393C5.05556 346.29 -7.81483 357.92 -18.6804 371.01C-36.6495 392.636 -49.7426 419.013 -57.6628 449.374C-64.4198 475.331 -67.5631 504.974 -66.9691 537.439C-65.9048 596.775 -53.1582 653.736 -43.8272 695.331C-36.1297 729.7 -31.4766 750.485 -38.0108 752.168Z" fill="url(#paint94_linear_234_211)"/>
  4038. <path d="M-38.5305 755.979L-38.6543 755.508C-36.3277 754.915 -35.9812 750.238 -37.5653 740.786C-39.0751 731.779 -42.1194 719.357 -46.0053 703.62C-55.8313 663.708 -70.657 603.431 -73.0083 541.794C-74.2954 507.969 -71.647 477.063 -65.1623 449.944C-57.5391 418.123 -44.3717 390.484 -26.0562 367.793C-15.1411 354.283 -2.14695 342.208 12.555 331.964C28.1727 321.076 46.1418 311.896 66.0166 304.696C86.9805 297.099 110.642 291.483 136.309 288.018C163.287 284.381 193.285 282.995 225.436 283.936C252.291 284.703 276.497 288.587 299.441 295.763C319.86 302.147 338.795 311.03 357.283 322.932C391.637 345.004 419.185 374.252 445.817 402.559C472.028 430.421 499.155 459.223 532.519 480.75C550.463 492.33 568.779 500.966 588.505 507.127C610.632 514.056 633.947 517.743 659.787 518.411L659.762 518.905C633.873 518.237 610.508 514.551 588.332 507.597C568.581 501.411 550.216 492.751 532.222 481.171C498.808 459.619 471.657 430.792 445.421 402.905C418.814 374.623 391.291 345.375 356.986 323.353C338.522 311.5 319.638 302.617 299.243 296.258C276.348 289.107 252.192 285.247 225.362 284.455C193.235 283.515 163.287 284.901 136.309 288.538C110.667 292.002 87.0548 297.594 66.1156 305.191C46.2903 312.367 28.346 321.522 12.7778 332.385C-1.89944 342.604 -14.8441 354.629 -25.7344 368.115C-44.0252 390.756 -57.1431 418.321 -64.7416 450.067C-71.2263 477.137 -73.8746 507.993 -72.5876 541.769C-70.2363 603.332 -55.4106 663.609 -45.6093 703.496C-37.7138 735.317 -32.9864 754.543 -38.5305 755.979Z" fill="url(#paint95_linear_234_211)"/>
  4039. <path d="M-39.0503 759.789L-39.174 759.319C-38.8027 759.22 -38.5057 758.973 -38.2582 758.577C-35.9812 754.667 -40.7581 736.827 -47.3913 712.132C-58.2568 671.7 -74.6666 610.582 -78.4039 546.644C-80.4583 511.458 -78.3544 479.29 -72.1668 450.983C-64.89 417.702 -51.7226 388.776 -33.0606 365.022C-22.1207 351.091 -9.05235 338.645 5.7981 328.03C21.5643 316.771 39.7314 307.244 59.8537 299.747C81.0899 291.829 105.098 285.915 131.161 282.203C158.584 278.294 189.077 276.71 221.773 277.453C248.9 278.071 273.329 281.832 296.421 288.934C317.014 295.244 336.072 304.102 354.709 315.979C389.311 338.026 417.032 367.422 443.862 395.828C470.221 423.789 497.496 452.69 531.182 474.391C549.3 486.07 567.789 494.805 587.713 501.09C610.063 508.142 633.65 511.977 659.787 512.769L659.762 513.264C633.576 512.447 609.964 508.612 587.564 501.56C567.591 495.25 549.077 486.515 530.91 474.811C497.175 453.086 469.899 424.16 443.515 396.175C416.71 367.769 389.014 338.397 354.462 316.4C335.874 304.547 316.841 295.738 296.298 289.429C273.23 282.352 248.85 278.591 221.773 277.972C189.077 277.205 158.634 278.814 131.235 282.723C105.197 286.435 81.2384 292.324 60.027 300.242C39.9541 307.739 21.8118 317.216 6.07037 328.475C-8.73058 339.065 -21.7742 351.462 -32.6893 365.368C-51.3019 389.048 -64.4198 417.9 -71.6965 451.131C-77.8842 479.389 -79.9632 511.532 -77.9089 546.644C-74.1716 610.533 -57.7866 671.601 -46.921 712.033C-40.0155 737.767 -35.4614 754.741 -37.8375 758.849C-38.1345 759.344 -38.5552 759.665 -39.0503 759.789Z" fill="url(#paint96_linear_234_211)"/>
  4040. <path d="M-39.5701 763.6L-39.6939 763.13C-39.4464 763.055 -39.2236 762.907 -39.0751 762.61C-37.2435 759.418 -41.6987 744.126 -48.4556 721.015C-54.3711 700.75 -61.722 675.535 -68.4047 646.56C-76.325 612.215 -81.2999 581.31 -83.6264 552.062C-86.5223 515.466 -85.0372 481.913 -79.1961 452.369C-72.2906 417.504 -59.1727 387.217 -40.1641 362.35C-29.1995 347.998 -16.0569 335.156 -1.0827 324.194C14.8073 312.54 33.1971 302.667 53.5917 294.848C75.1249 286.583 99.4548 280.372 125.938 276.413C153.783 272.232 184.795 270.425 218.085 270.994C245.46 271.464 270.111 275.127 293.402 282.129C314.168 288.389 333.374 297.174 352.135 309.051C386.96 331.073 414.878 360.593 441.881 389.147C468.414 417.182 495.838 446.183 529.821 468.081C548.112 479.859 566.774 488.693 586.896 495.102C609.494 502.302 633.328 506.261 659.738 507.201L659.713 507.696C633.229 506.731 609.37 502.772 586.723 495.572C566.551 489.163 547.839 480.305 529.524 468.502C495.492 446.578 468.043 417.554 441.51 389.494C414.532 360.964 386.638 331.469 351.863 309.496C333.151 297.668 313.97 288.884 293.253 282.649C270.012 275.646 245.41 272.009 218.06 271.539C184.795 270.945 153.807 272.776 125.988 276.958C99.5291 280.917 75.2239 287.127 53.7402 295.367C33.3951 303.162 15.0548 313.035 -0.810432 324.664C-15.7351 335.601 -28.853 348.419 -39.7929 362.721C-58.7519 387.539 -71.8451 417.752 -78.7258 452.542C-84.567 482.037 -86.052 515.54 -83.1562 552.087C-80.8544 581.31 -75.8795 612.191 -67.9592 646.511C-61.2765 675.486 -53.9255 700.676 -48.0101 720.941C-41.2284 744.176 -36.7485 759.517 -38.6791 762.907C-38.8771 763.253 -39.1988 763.501 -39.5701 763.6Z" fill="url(#paint97_linear_234_211)"/>
  4041. <path d="M-40.0898 767.435L-40.2135 766.965C-40.065 766.915 -39.9413 766.816 -39.8423 766.643C-38.4562 764.144 -42.6886 750.683 -49.1238 730.343C-73.5033 653.068 -130.628 472.139 -47.2675 359.875C-36.2782 345.078 -23.0613 331.84 -7.96329 320.482C8.07519 308.432 26.663 298.188 47.3051 290.022C69.1105 281.411 93.8118 274.904 120.716 270.672C149.031 266.219 180.563 264.165 214.447 264.585C242.094 264.907 266.943 268.446 290.432 275.374C311.371 281.56 330.701 290.319 349.586 302.147C384.658 324.144 412.775 353.788 439.951 382.466C466.632 410.6 494.205 439.699 528.484 461.771C546.949 473.648 565.784 482.606 586.129 489.113C608.949 496.438 633.032 500.52 659.762 501.634L659.738 502.129C632.982 501.015 608.85 496.908 585.98 489.583C565.611 483.051 546.726 474.094 528.237 462.192C493.908 440.095 466.311 410.971 439.605 382.813C412.453 354.159 384.361 324.54 349.339 302.568C330.503 290.74 311.173 282.005 290.308 275.844C266.869 268.916 242.069 265.402 214.472 265.08C180.613 264.684 149.105 266.738 120.815 271.167C93.9355 275.399 69.2838 281.906 47.5031 290.492C26.9105 298.633 8.34744 308.853 -7.6663 320.878C-22.7148 332.211 -35.9069 345.424 -46.8467 360.172C-130.059 472.238 -73.0083 653.018 -48.6288 730.195C-41.9461 751.401 -37.887 764.193 -39.3968 766.89C-39.57 767.163 -39.7928 767.361 -40.0898 767.435Z" fill="url(#paint98_linear_234_211)"/>
  4042. <path d="M-40.6096 771.246L-40.7334 770.776C-40.6839 770.776 -40.6096 770.726 -40.5601 770.602C-39.5701 768.771 -43.6787 756.721 -49.3466 740.068C-55.7323 721.362 -64.4693 695.727 -72.7856 665.613C-82.6116 630.031 -89.5171 596.256 -93.304 565.276C-98.1551 525.537 -98.1056 488.99 -93.1307 456.674C-87.2153 418.247 -74.1964 384.867 -54.47 357.475C-43.4807 342.233 -30.1896 328.549 -14.9678 316.821C1.19439 304.349 20.005 293.71 40.9194 285.222C63.0218 276.24 88.0943 269.411 115.444 264.907C144.204 260.157 176.306 257.88 210.833 258.103C238.752 258.276 263.825 261.691 287.486 268.545C308.574 274.657 328.078 283.366 347.086 295.194C382.405 317.167 410.696 346.959 438.045 375.736C464.875 403.969 492.621 433.167 527.197 455.412C545.81 467.388 564.843 476.445 585.386 483.076C608.454 490.524 632.784 494.755 659.787 496.017L659.762 496.512C632.71 495.25 608.33 491.019 585.213 483.546C564.645 476.89 545.562 467.834 526.925 455.833C492.299 433.538 464.528 404.34 437.674 376.083C410.324 347.305 382.059 317.563 346.789 295.615C327.83 283.812 308.376 275.102 287.313 269.015C263.701 262.186 238.678 258.771 210.809 258.598C176.306 258.375 144.254 260.651 115.518 265.402C88.218 269.906 63.1703 276.735 41.1174 285.692C20.2525 294.18 1.4914 304.77 -14.6461 317.241C-29.8183 328.945 -43.0847 342.604 -54.0493 357.797C-73.7509 385.114 -86.7203 418.42 -92.6357 456.773C-97.6106 489.039 -97.6601 525.537 -92.809 565.226C-89.0221 596.206 -82.1166 629.932 -72.3153 665.49C-63.9991 695.578 -55.2621 721.213 -48.8764 739.92C-42.7382 757.933 -39.0256 768.821 -40.1146 770.85C-40.2384 771.048 -40.4116 771.196 -40.6096 771.246Z" fill="url(#paint99_linear_234_211)"/>
  4043. <path d="M-41.1293 775.056L-41.2531 774.586C-41.2531 774.586 -41.2283 774.561 -41.2283 774.536C-40.5848 773.324 -44.1489 763.674 -49.0743 750.337C-55.3857 733.238 -64.9148 707.381 -74.0973 676.822C-85.0371 640.423 -92.9574 605.658 -97.66 573.515C-111.001 481.937 -98.9223 408.497 -61.7714 355.297C-50.7821 339.585 -37.4414 325.431 -22.096 313.282C-5.78524 300.365 13.2233 289.329 34.41 280.471C56.8094 271.118 82.2532 263.942 110.048 259.142C139.304 254.094 171.975 251.57 207.146 251.619C235.312 251.644 260.607 254.96 284.467 261.715C305.728 267.752 325.38 276.438 344.512 288.241C380.079 310.213 408.542 340.104 436.09 369.005C463.068 397.337 490.962 426.61 525.861 449.052C544.647 461.128 563.853 470.283 584.594 477.038C607.885 484.61 632.487 488.989 659.787 490.375L659.762 490.87C632.413 489.46 607.786 485.105 584.446 477.508C563.68 470.753 544.424 461.573 525.589 449.473C490.665 427.005 462.746 397.708 435.743 369.352C408.221 340.451 379.757 310.585 344.265 288.661C325.182 276.858 305.579 268.198 284.343 262.185C260.533 255.43 235.287 252.139 207.17 252.089C206.898 252.089 206.626 252.089 206.353 252.089C171.529 252.089 139.155 254.613 110.147 259.612C82.3769 264.387 56.9827 271.563 34.608 280.892C13.4708 289.725 -5.51299 300.736 -21.7742 313.628C-37.0702 325.753 -50.3861 339.857 -61.3507 355.545C-98.4273 408.67 -110.481 481.987 -97.1403 573.441C-92.4624 605.559 -84.5421 640.3 -73.6023 676.698C-64.4198 707.232 -54.8907 733.065 -48.5793 750.188C-42.6391 766.272 -40.065 773.447 -40.758 774.808C-40.8818 774.957 -41.0303 775.031 -41.1293 775.056Z" fill="url(#paint100_linear_234_211)"/>
  4044. <path d="M-41.6492 778.867L-41.7729 778.396C-41.8224 778.396 -41.8472 778.446 -41.8472 778.446C-41.5502 777.728 -44.2975 770.825 -48.1339 761.249C-54.1978 746.081 -64.3456 720.718 -74.4439 689.912C-86.6213 652.771 -95.7048 617.016 -101.422 583.636C-108.872 540.111 -110.778 499.926 -107.041 464.221C-104.887 443.634 -100.828 424.16 -94.9375 406.394C-88.5766 387.118 -79.9138 369.327 -69.2215 353.466C-58.2569 337.209 -44.8668 322.586 -29.4223 309.991C-12.9878 296.58 6.24354 285.098 27.7024 275.869C50.4236 266.095 76.2634 258.548 104.554 253.475C134.329 248.131 167.618 245.335 203.507 245.186C231.946 245.062 257.464 248.254 281.497 254.96C302.931 260.923 322.731 269.559 341.987 281.362C377.777 303.31 406.463 333.324 434.184 362.374C461.311 390.78 489.378 420.176 524.549 442.792C543.508 454.966 562.888 464.221 583.827 471.1C607.365 478.82 632.215 483.298 659.787 484.857L659.762 485.352C632.141 483.793 607.241 479.29 583.679 471.57C562.69 464.691 543.261 455.437 524.277 443.213C489.056 420.572 460.964 391.151 433.813 362.721C406.117 333.696 377.455 303.706 341.715 281.783C322.509 270.004 302.757 261.393 281.373 255.43C257.389 248.749 231.921 245.557 203.532 245.681C167.668 245.829 134.403 248.626 104.653 253.97C76.4119 259.043 50.5969 266.565 27.9004 276.339C6.46629 285.568 -12.7155 297.025 -29.1253 310.387C-44.545 322.957 -57.9104 337.556 -68.8255 353.763C-79.4931 369.575 -88.1311 387.366 -94.4673 406.592C-100.333 424.333 -104.392 443.757 -106.546 464.32C-110.283 500.001 -108.377 540.136 -100.927 583.611C-95.2098 616.917 -86.151 652.647 -73.9736 689.763C-63.8753 720.57 -53.7275 745.907 -47.6883 761.076C-42.7134 773.522 -41.0056 777.877 -41.4264 778.693C-41.4511 778.768 -41.5502 778.842 -41.6492 778.867Z" fill="url(#paint101_linear_234_211)"/>
  4045. <path d="M-42.1689 782.702L-42.2926 782.232C-42.3916 782.257 -42.4411 782.356 -42.4411 782.405C-42.4411 781.96 -44.0747 778.224 -46.327 773.052C-51.8464 760.482 -62.0932 737.099 -73.1321 706.416C-86.6955 668.756 -97.1403 632.035 -104.17 597.295C-113.451 551.345 -116.743 508.81 -113.971 470.828C-110.58 424.754 -98.1551 384.817 -77.0427 352.18C-66.1276 335.329 -52.7127 320.136 -37.1445 307.022C-20.5862 293.066 -1.13214 281.065 20.6485 271.39C43.6915 261.146 70.0015 253.203 98.8114 247.784C129.181 242.069 163.188 239 199.869 238.679C228.58 238.406 254.296 241.499 278.527 248.106C300.134 253.995 320.058 262.606 339.438 274.384C375.475 296.308 404.335 326.471 432.253 355.619C459.529 384.124 487.745 413.619 523.237 436.409C542.345 448.682 561.923 458.06 583.06 465.013C606.82 472.857 631.918 477.484 659.787 479.166L659.762 479.661C631.844 477.979 606.721 473.327 582.911 465.483C561.725 458.505 542.122 449.127 522.965 436.805C487.423 413.966 459.207 384.471 431.882 355.941C403.988 326.792 375.154 296.679 339.191 274.78C319.86 263.002 299.961 254.441 278.403 248.552C254.221 241.97 228.555 238.877 199.893 239.149C163.238 239.495 129.255 242.563 98.9104 248.255C70.1253 253.674 43.8647 261.592 20.8465 271.836C-0.884636 281.486 -20.2892 293.462 -36.8227 307.393C-52.3414 320.483 -65.7316 335.626 -76.6219 352.452C-97.6848 385.015 -110.11 424.853 -113.476 470.852C-116.273 508.76 -112.981 551.271 -103.699 597.171C-96.6948 631.887 -86.25 668.582 -72.6866 706.218C-61.6477 736.901 -51.4009 760.259 -45.8815 772.829C-42.4164 780.747 -41.7976 782.183 -41.9956 782.529C-42.0204 782.628 -42.0946 782.677 -42.1689 782.702Z" fill="url(#paint102_linear_234_211)"/>
  4046. <path d="M-42.9609 786.389C-43.06 786.216 -51.9207 769.266 -63.4793 741.85C-74.1469 716.536 -89.3933 676.872 -101.323 631.615C-114.738 580.766 -121.347 533.381 -120.975 490.771C-120.505 437.497 -109.021 391.622 -86.844 354.382C-76.1764 336.467 -62.8605 320.26 -47.2428 306.255C-30.5856 291.309 -10.884 278.467 11.3174 268.05C34.8554 257.014 61.8585 248.403 91.5594 242.464C122.894 236.204 158.114 232.765 196.23 232.22C225.213 231.8 251.152 234.769 275.556 241.301C297.337 247.116 317.41 255.678 336.914 267.456C353.2 277.279 369.411 289.627 386.465 305.166C401.686 319.047 416.264 334.24 430.348 348.913C457.796 377.518 486.161 407.087 521.925 430.074C541.206 442.446 560.957 451.923 582.292 459C606.301 466.967 631.645 471.743 659.812 473.574L659.787 474.069C631.596 472.238 606.202 467.462 582.144 459.47C560.759 452.368 540.984 442.891 521.653 430.495C485.814 407.483 457.425 377.889 429.976 349.26C415.893 334.587 401.34 319.394 386.118 305.537C369.09 289.998 352.903 277.7 336.666 267.876C317.212 256.123 297.164 247.586 275.433 241.771C251.078 235.264 225.164 232.294 196.255 232.715C158.188 233.26 122.993 236.699 91.6831 242.959C62.007 248.873 35.0534 257.484 11.5402 268.495C-10.6117 278.888 -30.2886 291.73 -46.8963 306.626C-62.4645 320.606 -75.7804 336.739 -86.4233 354.629C-108.55 391.795 -120.01 437.596 -120.48 490.771C-120.876 533.331 -114.268 580.667 -100.853 631.466C-94.2692 656.433 -82.3641 695.801 -63.0338 741.627C-51.4752 769.043 -42.6144 785.968 -42.5402 786.141L-42.9609 786.389Z" fill="url(#paint103_linear_234_211)"/>
  4047. <path d="M252.934 797.474C225.758 764.861 195.166 738.88 162.025 720.248C135.492 705.352 107.276 695.133 78.1445 689.813C52.2305 685.087 30.3756 685.235 16.5894 686.2C1.66468 687.239 -7.2456 689.417 -7.31985 689.441L-7.4436 688.971C-7.3446 688.947 1.59043 686.769 16.5399 685.73C30.3508 684.765 52.2305 684.616 78.2188 689.343C107.4 694.638 135.69 704.907 162.248 719.827C195.463 738.46 226.104 764.49 253.306 797.177L252.934 797.474Z" fill="url(#paint104_linear_234_211)"/>
  4048. <path d="M246.945 801.433C220.709 769.39 191.008 743.68 158.683 725.023C132.819 710.103 105.222 699.636 76.6594 693.895C51.2404 688.798 29.7568 688.476 16.2181 689.12C1.54093 689.812 -7.24559 691.718 -7.34459 691.743L-7.4436 691.248C-7.3446 691.223 1.46667 689.318 16.1686 688.625C29.7568 687.981 51.2652 688.303 76.7337 693.4C105.346 699.141 132.992 709.633 158.906 724.578C191.28 743.26 221.031 769.018 247.316 801.111L246.945 801.433Z" fill="url(#paint105_linear_234_211)"/>
  4049. <path d="M240.98 805.392C215.66 773.918 186.85 748.481 155.342 729.774C130.146 714.804 103.167 704.115 75.1744 697.954C50.2751 692.485 29.1628 691.693 15.8221 692.015C1.39241 692.361 -7.27034 693.994 -7.34459 694.019L-7.4436 693.524C-7.36935 693.5 1.34291 691.842 15.8221 691.52C29.1875 691.198 50.3494 691.99 75.2981 697.459C103.341 703.62 130.369 714.334 155.614 729.329C187.172 748.06 216.031 773.547 241.376 805.071L240.98 805.392Z" fill="url(#paint106_linear_234_211)"/>
  4050. <path d="M235.015 809.352C210.635 778.446 182.716 753.281 152.05 734.55C127.522 719.555 101.163 708.618 73.7635 702.036C49.3593 696.172 28.6182 694.935 15.5003 694.935C15.426 694.935 15.3518 694.935 15.2775 694.935C1.21909 694.935 -7.24566 696.296 -7.31992 696.321L-7.39417 695.826C-7.31991 695.801 1.1696 694.44 15.3023 694.44C15.3765 694.44 15.4508 694.44 15.525 694.44C28.6677 694.465 49.4583 695.702 73.8873 701.566C101.361 708.148 127.745 719.11 152.347 734.129C183.063 752.91 211.031 778.124 235.46 809.079L235.015 809.352Z" fill="url(#paint107_linear_234_211)"/>
  4051. <path d="M229.05 813.31C205.586 782.974 178.558 758.081 148.709 739.301C124.824 724.281 99.1084 713.097 72.2538 706.094C48.3694 699.859 27.9748 698.151 15.1044 697.83C1.14494 697.458 -7.27031 698.597 -7.34457 698.597L-7.41882 698.102C-7.34457 698.102 1.12019 696.963 15.1291 697.335C28.049 697.681 48.4684 699.388 72.4024 705.624C99.3064 712.651 125.072 723.836 148.981 738.88C178.88 757.71 205.957 782.652 229.446 813.013L229.05 813.31Z" fill="url(#paint108_linear_234_211)"/>
  4052. </g>
  4053. <defs>
  4054. <linearGradient id="paint0_linear_234_211" x1="375.56" y1="104.386" x2="943.992" y2="104.386" gradientUnits="userSpaceOnUse">
  4055. <stop stop-color="#7DB4EA"/>
  4056. <stop offset="1" stop-color="#807EE8"/>
  4057. </linearGradient>
  4058. <linearGradient id="paint1_linear_234_211" x1="378.222" y1="105.296" x2="936.704" y2="105.296" gradientUnits="userSpaceOnUse">
  4059. <stop stop-color="#7DB4EA"/>
  4060. <stop offset="1" stop-color="#807EE8"/>
  4061. </linearGradient>
  4062. <linearGradient id="paint2_linear_234_211" x1="380.866" y1="106.207" x2="929.419" y2="106.207" gradientUnits="userSpaceOnUse">
  4063. <stop stop-color="#7DB4EA"/>
  4064. <stop offset="1" stop-color="#807EE8"/>
  4065. </linearGradient>
  4066. <linearGradient id="paint3_linear_234_211" x1="383.491" y1="107.117" x2="922.136" y2="107.117" gradientUnits="userSpaceOnUse">
  4067. <stop stop-color="#7DB4EA"/>
  4068. <stop offset="1" stop-color="#807EE8"/>
  4069. </linearGradient>
  4070. <linearGradient id="paint4_linear_234_211" x1="386.098" y1="108.028" x2="914.856" y2="108.028" gradientUnits="userSpaceOnUse">
  4071. <stop stop-color="#7DB4EA"/>
  4072. <stop offset="1" stop-color="#807EE8"/>
  4073. </linearGradient>
  4074. <linearGradient id="paint5_linear_234_211" x1="388.685" y1="108.938" x2="907.579" y2="108.938" gradientUnits="userSpaceOnUse">
  4075. <stop stop-color="#7DB4EA"/>
  4076. <stop offset="1" stop-color="#807EE8"/>
  4077. </linearGradient>
  4078. <linearGradient id="paint6_linear_234_211" x1="391.252" y1="109.85" x2="900.306" y2="109.85" gradientUnits="userSpaceOnUse">
  4079. <stop stop-color="#7DB4EA"/>
  4080. <stop offset="1" stop-color="#807EE8"/>
  4081. </linearGradient>
  4082. <linearGradient id="paint7_linear_234_211" x1="393.798" y1="110.76" x2="893.035" y2="110.76" gradientUnits="userSpaceOnUse">
  4083. <stop stop-color="#7DB4EA"/>
  4084. <stop offset="1" stop-color="#807EE8"/>
  4085. </linearGradient>
  4086. <linearGradient id="paint8_linear_234_211" x1="396.414" y1="111.671" x2="885.769" y2="111.671" gradientUnits="userSpaceOnUse">
  4087. <stop stop-color="#7DB4EA"/>
  4088. <stop offset="1" stop-color="#807EE8"/>
  4089. </linearGradient>
  4090. <linearGradient id="paint9_linear_234_211" x1="398.924" y1="112.582" x2="878.506" y2="112.582" gradientUnits="userSpaceOnUse">
  4091. <stop stop-color="#7DB4EA"/>
  4092. <stop offset="1" stop-color="#807EE8"/>
  4093. </linearGradient>
  4094. <linearGradient id="paint10_linear_234_211" x1="401.41" y1="113.493" x2="871.247" y2="113.493" gradientUnits="userSpaceOnUse">
  4095. <stop stop-color="#7DB4EA"/>
  4096. <stop offset="1" stop-color="#807EE8"/>
  4097. </linearGradient>
  4098. <linearGradient id="paint11_linear_234_211" x1="403.871" y1="114.404" x2="863.995" y2="114.404" gradientUnits="userSpaceOnUse">
  4099. <stop stop-color="#7DB4EA"/>
  4100. <stop offset="1" stop-color="#807EE8"/>
  4101. </linearGradient>
  4102. <linearGradient id="paint12_linear_234_211" x1="406.306" y1="115.315" x2="856.744" y2="115.315" gradientUnits="userSpaceOnUse">
  4103. <stop stop-color="#7DB4EA"/>
  4104. <stop offset="1" stop-color="#807EE8"/>
  4105. </linearGradient>
  4106. <linearGradient id="paint13_linear_234_211" x1="408.714" y1="116.226" x2="849.498" y2="116.226" gradientUnits="userSpaceOnUse">
  4107. <stop stop-color="#7DB4EA"/>
  4108. <stop offset="1" stop-color="#807EE8"/>
  4109. </linearGradient>
  4110. <linearGradient id="paint14_linear_234_211" x1="411.094" y1="117.137" x2="842.257" y2="117.137" gradientUnits="userSpaceOnUse">
  4111. <stop stop-color="#7DB4EA"/>
  4112. <stop offset="1" stop-color="#807EE8"/>
  4113. </linearGradient>
  4114. <linearGradient id="paint15_linear_234_211" x1="413.444" y1="118.048" x2="835.021" y2="118.048" gradientUnits="userSpaceOnUse">
  4115. <stop stop-color="#7DB4EA"/>
  4116. <stop offset="1" stop-color="#807EE8"/>
  4117. </linearGradient>
  4118. <linearGradient id="paint16_linear_234_211" x1="415.764" y1="118.96" x2="827.79" y2="118.96" gradientUnits="userSpaceOnUse">
  4119. <stop stop-color="#7DB4EA"/>
  4120. <stop offset="1" stop-color="#807EE8"/>
  4121. </linearGradient>
  4122. <linearGradient id="paint17_linear_234_211" x1="418.052" y1="119.871" x2="820.571" y2="119.871" gradientUnits="userSpaceOnUse">
  4123. <stop stop-color="#7DB4EA"/>
  4124. <stop offset="1" stop-color="#807EE8"/>
  4125. </linearGradient>
  4126. <linearGradient id="paint18_linear_234_211" x1="420.307" y1="120.782" x2="813.349" y2="120.782" gradientUnits="userSpaceOnUse">
  4127. <stop stop-color="#7DB4EA"/>
  4128. <stop offset="1" stop-color="#807EE8"/>
  4129. </linearGradient>
  4130. <linearGradient id="paint19_linear_234_211" x1="422.527" y1="121.694" x2="806.139" y2="121.694" gradientUnits="userSpaceOnUse">
  4131. <stop stop-color="#7DB4EA"/>
  4132. <stop offset="1" stop-color="#807EE8"/>
  4133. </linearGradient>
  4134. <linearGradient id="paint20_linear_234_211" x1="424.711" y1="122.605" x2="798.935" y2="122.605" gradientUnits="userSpaceOnUse">
  4135. <stop stop-color="#7DB4EA"/>
  4136. <stop offset="1" stop-color="#807EE8"/>
  4137. </linearGradient>
  4138. <linearGradient id="paint21_linear_234_211" x1="426.858" y1="123.516" x2="791.74" y2="123.516" gradientUnits="userSpaceOnUse">
  4139. <stop stop-color="#7DB4EA"/>
  4140. <stop offset="1" stop-color="#807EE8"/>
  4141. </linearGradient>
  4142. <linearGradient id="paint22_linear_234_211" x1="428.965" y1="124.428" x2="784.554" y2="124.428" gradientUnits="userSpaceOnUse">
  4143. <stop stop-color="#7DB4EA"/>
  4144. <stop offset="1" stop-color="#807EE8"/>
  4145. </linearGradient>
  4146. <linearGradient id="paint23_linear_234_211" x1="431.032" y1="125.339" x2="777.377" y2="125.339" gradientUnits="userSpaceOnUse">
  4147. <stop stop-color="#7DB4EA"/>
  4148. <stop offset="1" stop-color="#807EE8"/>
  4149. </linearGradient>
  4150. <linearGradient id="paint24_linear_234_211" x1="433.056" y1="126.251" x2="770.21" y2="126.251" gradientUnits="userSpaceOnUse">
  4151. <stop stop-color="#7DB4EA"/>
  4152. <stop offset="1" stop-color="#807EE8"/>
  4153. </linearGradient>
  4154. <linearGradient id="paint25_linear_234_211" x1="435.036" y1="127.163" x2="763.055" y2="127.163" gradientUnits="userSpaceOnUse">
  4155. <stop stop-color="#7DB4EA"/>
  4156. <stop offset="1" stop-color="#807EE8"/>
  4157. </linearGradient>
  4158. <linearGradient id="paint26_linear_234_211" x1="436.97" y1="128.074" x2="755.911" y2="128.074" gradientUnits="userSpaceOnUse">
  4159. <stop stop-color="#7DB4EA"/>
  4160. <stop offset="1" stop-color="#807EE8"/>
  4161. </linearGradient>
  4162. <linearGradient id="paint27_linear_234_211" x1="438.856" y1="128.986" x2="748.781" y2="128.986" gradientUnits="userSpaceOnUse">
  4163. <stop stop-color="#7DB4EA"/>
  4164. <stop offset="1" stop-color="#807EE8"/>
  4165. </linearGradient>
  4166. <linearGradient id="paint28_linear_234_211" x1="440.692" y1="129.898" x2="741.694" y2="129.898" gradientUnits="userSpaceOnUse">
  4167. <stop stop-color="#7DB4EA"/>
  4168. <stop offset="1" stop-color="#807EE8"/>
  4169. </linearGradient>
  4170. <linearGradient id="paint29_linear_234_211" x1="442.474" y1="130.809" x2="734.594" y2="130.809" gradientUnits="userSpaceOnUse">
  4171. <stop stop-color="#7DB4EA"/>
  4172. <stop offset="1" stop-color="#807EE8"/>
  4173. </linearGradient>
  4174. <linearGradient id="paint30_linear_234_211" x1="444.203" y1="131.721" x2="727.512" y2="131.721" gradientUnits="userSpaceOnUse">
  4175. <stop stop-color="#7DB4EA"/>
  4176. <stop offset="1" stop-color="#807EE8"/>
  4177. </linearGradient>
  4178. <linearGradient id="paint31_linear_234_211" x1="445.874" y1="132.633" x2="720.45" y2="132.633" gradientUnits="userSpaceOnUse">
  4179. <stop stop-color="#7DB4EA"/>
  4180. <stop offset="1" stop-color="#807EE8"/>
  4181. </linearGradient>
  4182. <linearGradient id="paint32_linear_234_211" x1="447.407" y1="133.545" x2="713.411" y2="133.545" gradientUnits="userSpaceOnUse">
  4183. <stop stop-color="#7DB4EA"/>
  4184. <stop offset="1" stop-color="#807EE8"/>
  4185. </linearGradient>
  4186. <linearGradient id="paint33_linear_234_211" x1="448.967" y1="134.457" x2="706.397" y2="134.457" gradientUnits="userSpaceOnUse">
  4187. <stop stop-color="#7DB4EA"/>
  4188. <stop offset="1" stop-color="#807EE8"/>
  4189. </linearGradient>
  4190. <linearGradient id="paint34_linear_234_211" x1="450.463" y1="135.369" x2="699.412" y2="135.369" gradientUnits="userSpaceOnUse">
  4191. <stop stop-color="#7DB4EA"/>
  4192. <stop offset="1" stop-color="#807EE8"/>
  4193. </linearGradient>
  4194. <linearGradient id="paint35_linear_234_211" x1="451.892" y1="136.28" x2="692.461" y2="136.28" gradientUnits="userSpaceOnUse">
  4195. <stop stop-color="#7DB4EA"/>
  4196. <stop offset="1" stop-color="#807EE8"/>
  4197. </linearGradient>
  4198. <linearGradient id="paint36_linear_234_211" x1="453.251" y1="137.193" x2="685.546" y2="137.193" gradientUnits="userSpaceOnUse">
  4199. <stop stop-color="#7DB4EA"/>
  4200. <stop offset="1" stop-color="#807EE8"/>
  4201. </linearGradient>
  4202. <linearGradient id="paint37_linear_234_211" x1="454.537" y1="138.104" x2="678.676" y2="138.104" gradientUnits="userSpaceOnUse">
  4203. <stop stop-color="#7DB4EA"/>
  4204. <stop offset="1" stop-color="#807EE8"/>
  4205. </linearGradient>
  4206. <linearGradient id="paint38_linear_234_211" x1="455.747" y1="139.017" x2="671.827" y2="139.017" gradientUnits="userSpaceOnUse">
  4207. <stop stop-color="#7DB4EA"/>
  4208. <stop offset="1" stop-color="#807EE8"/>
  4209. </linearGradient>
  4210. <linearGradient id="paint39_linear_234_211" x1="456.878" y1="139.929" x2="665.061" y2="139.929" gradientUnits="userSpaceOnUse">
  4211. <stop stop-color="#7DB4EA"/>
  4212. <stop offset="1" stop-color="#807EE8"/>
  4213. </linearGradient>
  4214. <linearGradient id="paint40_linear_234_211" x1="-10.1241" y1="684.244" x2="659.948" y2="684.244" gradientUnits="userSpaceOnUse">
  4215. <stop stop-color="#7DB4EA"/>
  4216. <stop offset="1" stop-color="#807EE8"/>
  4217. </linearGradient>
  4218. <linearGradient id="paint41_linear_234_211" x1="-10.6427" y1="682.258" x2="659.943" y2="682.258" gradientUnits="userSpaceOnUse">
  4219. <stop stop-color="#7DB4EA"/>
  4220. <stop offset="1" stop-color="#807EE8"/>
  4221. </linearGradient>
  4222. <linearGradient id="paint42_linear_234_211" x1="-11.1617" y1="680.145" x2="659.937" y2="680.145" gradientUnits="userSpaceOnUse">
  4223. <stop stop-color="#7DB4EA"/>
  4224. <stop offset="1" stop-color="#807EE8"/>
  4225. </linearGradient>
  4226. <linearGradient id="paint43_linear_234_211" x1="-11.6806" y1="677.871" x2="659.931" y2="677.871" gradientUnits="userSpaceOnUse">
  4227. <stop stop-color="#7DB4EA"/>
  4228. <stop offset="1" stop-color="#807EE8"/>
  4229. </linearGradient>
  4230. <linearGradient id="paint44_linear_234_211" x1="-12.1994" y1="675.413" x2="659.926" y2="675.413" gradientUnits="userSpaceOnUse">
  4231. <stop stop-color="#7DB4EA"/>
  4232. <stop offset="1" stop-color="#807EE8"/>
  4233. </linearGradient>
  4234. <linearGradient id="paint45_linear_234_211" x1="-12.7183" y1="672.704" x2="659.92" y2="672.704" gradientUnits="userSpaceOnUse">
  4235. <stop stop-color="#7DB4EA"/>
  4236. <stop offset="1" stop-color="#807EE8"/>
  4237. </linearGradient>
  4238. <linearGradient id="paint46_linear_234_211" x1="-13.237" y1="669.725" x2="659.915" y2="669.725" gradientUnits="userSpaceOnUse">
  4239. <stop stop-color="#7DB4EA"/>
  4240. <stop offset="1" stop-color="#807EE8"/>
  4241. </linearGradient>
  4242. <linearGradient id="paint47_linear_234_211" x1="-13.7559" y1="666.44" x2="659.909" y2="666.44" gradientUnits="userSpaceOnUse">
  4243. <stop stop-color="#7DB4EA"/>
  4244. <stop offset="1" stop-color="#807EE8"/>
  4245. </linearGradient>
  4246. <linearGradient id="paint48_linear_234_211" x1="-14.2748" y1="662.851" x2="659.904" y2="662.851" gradientUnits="userSpaceOnUse">
  4247. <stop stop-color="#7DB4EA"/>
  4248. <stop offset="1" stop-color="#807EE8"/>
  4249. </linearGradient>
  4250. <linearGradient id="paint49_linear_234_211" x1="-14.7935" y1="658.971" x2="659.899" y2="658.971" gradientUnits="userSpaceOnUse">
  4251. <stop stop-color="#7DB4EA"/>
  4252. <stop offset="1" stop-color="#807EE8"/>
  4253. </linearGradient>
  4254. <linearGradient id="paint50_linear_234_211" x1="-15.3125" y1="654.802" x2="659.894" y2="654.802" gradientUnits="userSpaceOnUse">
  4255. <stop stop-color="#7DB4EA"/>
  4256. <stop offset="1" stop-color="#807EE8"/>
  4257. </linearGradient>
  4258. <linearGradient id="paint51_linear_234_211" x1="-15.8312" y1="650.398" x2="659.889" y2="650.398" gradientUnits="userSpaceOnUse">
  4259. <stop stop-color="#7DB4EA"/>
  4260. <stop offset="1" stop-color="#807EE8"/>
  4261. </linearGradient>
  4262. <linearGradient id="paint52_linear_234_211" x1="-16.3501" y1="645.786" x2="659.884" y2="645.786" gradientUnits="userSpaceOnUse">
  4263. <stop stop-color="#7DB4EA"/>
  4264. <stop offset="1" stop-color="#807EE8"/>
  4265. </linearGradient>
  4266. <linearGradient id="paint53_linear_234_211" x1="-16.869" y1="640.994" x2="659.879" y2="640.994" gradientUnits="userSpaceOnUse">
  4267. <stop stop-color="#7DB4EA"/>
  4268. <stop offset="1" stop-color="#807EE8"/>
  4269. </linearGradient>
  4270. <linearGradient id="paint54_linear_234_211" x1="-17.3878" y1="636.045" x2="659.874" y2="636.045" gradientUnits="userSpaceOnUse">
  4271. <stop stop-color="#7DB4EA"/>
  4272. <stop offset="1" stop-color="#807EE8"/>
  4273. </linearGradient>
  4274. <linearGradient id="paint55_linear_234_211" x1="-17.9068" y1="630.988" x2="659.87" y2="630.988" gradientUnits="userSpaceOnUse">
  4275. <stop stop-color="#7DB4EA"/>
  4276. <stop offset="1" stop-color="#807EE8"/>
  4277. </linearGradient>
  4278. <linearGradient id="paint56_linear_234_211" x1="-18.4255" y1="625.815" x2="659.865" y2="625.815" gradientUnits="userSpaceOnUse">
  4279. <stop stop-color="#7DB4EA"/>
  4280. <stop offset="1" stop-color="#807EE8"/>
  4281. </linearGradient>
  4282. <linearGradient id="paint57_linear_234_211" x1="-18.9444" y1="620.548" x2="659.861" y2="620.548" gradientUnits="userSpaceOnUse">
  4283. <stop stop-color="#7DB4EA"/>
  4284. <stop offset="1" stop-color="#807EE8"/>
  4285. </linearGradient>
  4286. <linearGradient id="paint58_linear_234_211" x1="-19.4633" y1="615.218" x2="659.857" y2="615.218" gradientUnits="userSpaceOnUse">
  4287. <stop stop-color="#7DB4EA"/>
  4288. <stop offset="1" stop-color="#807EE8"/>
  4289. </linearGradient>
  4290. <linearGradient id="paint59_linear_234_211" x1="-19.982" y1="609.815" x2="659.853" y2="609.815" gradientUnits="userSpaceOnUse">
  4291. <stop stop-color="#7DB4EA"/>
  4292. <stop offset="1" stop-color="#807EE8"/>
  4293. </linearGradient>
  4294. <linearGradient id="paint60_linear_234_211" x1="-20.5009" y1="604.362" x2="659.849" y2="604.362" gradientUnits="userSpaceOnUse">
  4295. <stop stop-color="#7DB4EA"/>
  4296. <stop offset="1" stop-color="#807EE8"/>
  4297. </linearGradient>
  4298. <linearGradient id="paint61_linear_234_211" x1="-21.0199" y1="598.862" x2="659.845" y2="598.862" gradientUnits="userSpaceOnUse">
  4299. <stop stop-color="#7DB4EA"/>
  4300. <stop offset="1" stop-color="#807EE8"/>
  4301. </linearGradient>
  4302. <linearGradient id="paint62_linear_234_211" x1="-21.5387" y1="593.321" x2="659.841" y2="593.321" gradientUnits="userSpaceOnUse">
  4303. <stop stop-color="#7DB4EA"/>
  4304. <stop offset="1" stop-color="#807EE8"/>
  4305. </linearGradient>
  4306. <linearGradient id="paint63_linear_234_211" x1="-22.0576" y1="587.745" x2="659.838" y2="587.745" gradientUnits="userSpaceOnUse">
  4307. <stop stop-color="#7DB4EA"/>
  4308. <stop offset="1" stop-color="#807EE8"/>
  4309. </linearGradient>
  4310. <linearGradient id="paint64_linear_234_211" x1="-22.5762" y1="582.137" x2="659.835" y2="582.137" gradientUnits="userSpaceOnUse">
  4311. <stop stop-color="#7DB4EA"/>
  4312. <stop offset="1" stop-color="#807EE8"/>
  4313. </linearGradient>
  4314. <linearGradient id="paint65_linear_234_211" x1="-23.0952" y1="576.502" x2="659.831" y2="576.502" gradientUnits="userSpaceOnUse">
  4315. <stop stop-color="#7DB4EA"/>
  4316. <stop offset="1" stop-color="#807EE8"/>
  4317. </linearGradient>
  4318. <linearGradient id="paint66_linear_234_211" x1="-23.6142" y1="570.842" x2="659.828" y2="570.842" gradientUnits="userSpaceOnUse">
  4319. <stop stop-color="#7DB4EA"/>
  4320. <stop offset="1" stop-color="#807EE8"/>
  4321. </linearGradient>
  4322. <linearGradient id="paint67_linear_234_211" x1="-24.1329" y1="565.157" x2="659.825" y2="565.157" gradientUnits="userSpaceOnUse">
  4323. <stop stop-color="#7DB4EA"/>
  4324. <stop offset="1" stop-color="#807EE8"/>
  4325. </linearGradient>
  4326. <linearGradient id="paint68_linear_234_211" x1="-24.6518" y1="559.447" x2="659.822" y2="559.447" gradientUnits="userSpaceOnUse">
  4327. <stop stop-color="#7DB4EA"/>
  4328. <stop offset="1" stop-color="#807EE8"/>
  4329. </linearGradient>
  4330. <linearGradient id="paint69_linear_234_211" x1="-25.1705" y1="553.73" x2="659.819" y2="553.73" gradientUnits="userSpaceOnUse">
  4331. <stop stop-color="#7DB4EA"/>
  4332. <stop offset="1" stop-color="#807EE8"/>
  4333. </linearGradient>
  4334. <linearGradient id="paint70_linear_234_211" x1="-25.6895" y1="547.999" x2="659.816" y2="547.999" gradientUnits="userSpaceOnUse">
  4335. <stop stop-color="#7DB4EA"/>
  4336. <stop offset="1" stop-color="#807EE8"/>
  4337. </linearGradient>
  4338. <linearGradient id="paint71_linear_234_211" x1="-26.2084" y1="546.699" x2="659.813" y2="546.699" gradientUnits="userSpaceOnUse">
  4339. <stop stop-color="#7DB4EA"/>
  4340. <stop offset="1" stop-color="#807EE8"/>
  4341. </linearGradient>
  4342. <linearGradient id="paint72_linear_234_211" x1="-26.7271" y1="545.744" x2="659.81" y2="545.744" gradientUnits="userSpaceOnUse">
  4343. <stop stop-color="#7DB4EA"/>
  4344. <stop offset="1" stop-color="#807EE8"/>
  4345. </linearGradient>
  4346. <linearGradient id="paint73_linear_234_211" x1="-27.2461" y1="544.771" x2="659.808" y2="544.771" gradientUnits="userSpaceOnUse">
  4347. <stop stop-color="#7DB4EA"/>
  4348. <stop offset="1" stop-color="#807EE8"/>
  4349. </linearGradient>
  4350. <linearGradient id="paint74_linear_234_211" x1="-27.7647" y1="543.78" x2="659.805" y2="543.78" gradientUnits="userSpaceOnUse">
  4351. <stop stop-color="#7DB4EA"/>
  4352. <stop offset="1" stop-color="#807EE8"/>
  4353. </linearGradient>
  4354. <linearGradient id="paint75_linear_234_211" x1="-28.2836" y1="542.787" x2="659.803" y2="542.787" gradientUnits="userSpaceOnUse">
  4355. <stop stop-color="#7DB4EA"/>
  4356. <stop offset="1" stop-color="#807EE8"/>
  4357. </linearGradient>
  4358. <linearGradient id="paint76_linear_234_211" x1="-28.8026" y1="541.768" x2="659.8" y2="541.768" gradientUnits="userSpaceOnUse">
  4359. <stop stop-color="#7DB4EA"/>
  4360. <stop offset="1" stop-color="#807EE8"/>
  4361. </linearGradient>
  4362. <linearGradient id="paint77_linear_234_211" x1="-29.3213" y1="540.733" x2="659.798" y2="540.733" gradientUnits="userSpaceOnUse">
  4363. <stop stop-color="#7DB4EA"/>
  4364. <stop offset="1" stop-color="#807EE8"/>
  4365. </linearGradient>
  4366. <linearGradient id="paint78_linear_234_211" x1="-29.8403" y1="539.683" x2="659.796" y2="539.683" gradientUnits="userSpaceOnUse">
  4367. <stop stop-color="#7DB4EA"/>
  4368. <stop offset="1" stop-color="#807EE8"/>
  4369. </linearGradient>
  4370. <linearGradient id="paint79_linear_234_211" x1="-30.359" y1="538.617" x2="659.794" y2="538.617" gradientUnits="userSpaceOnUse">
  4371. <stop stop-color="#7DB4EA"/>
  4372. <stop offset="1" stop-color="#807EE8"/>
  4373. </linearGradient>
  4374. <linearGradient id="paint80_linear_234_211" x1="-30.8779" y1="537.538" x2="659.792" y2="537.538" gradientUnits="userSpaceOnUse">
  4375. <stop stop-color="#7DB4EA"/>
  4376. <stop offset="1" stop-color="#807EE8"/>
  4377. </linearGradient>
  4378. <linearGradient id="paint81_linear_234_211" x1="-31.3969" y1="536.446" x2="659.79" y2="536.446" gradientUnits="userSpaceOnUse">
  4379. <stop stop-color="#7DB4EA"/>
  4380. <stop offset="1" stop-color="#807EE8"/>
  4381. </linearGradient>
  4382. <linearGradient id="paint82_linear_234_211" x1="-31.9156" y1="535.339" x2="659.788" y2="535.339" gradientUnits="userSpaceOnUse">
  4383. <stop stop-color="#7DB4EA"/>
  4384. <stop offset="1" stop-color="#807EE8"/>
  4385. </linearGradient>
  4386. <linearGradient id="paint83_linear_234_211" x1="-32.4345" y1="534.219" x2="659.786" y2="534.219" gradientUnits="userSpaceOnUse">
  4387. <stop stop-color="#7DB4EA"/>
  4388. <stop offset="1" stop-color="#807EE8"/>
  4389. </linearGradient>
  4390. <linearGradient id="paint84_linear_234_211" x1="-32.9533" y1="533.086" x2="659.784" y2="533.086" gradientUnits="userSpaceOnUse">
  4391. <stop stop-color="#7DB4EA"/>
  4392. <stop offset="1" stop-color="#807EE8"/>
  4393. </linearGradient>
  4394. <linearGradient id="paint85_linear_234_211" x1="-33.4722" y1="531.941" x2="659.782" y2="531.941" gradientUnits="userSpaceOnUse">
  4395. <stop stop-color="#7DB4EA"/>
  4396. <stop offset="1" stop-color="#807EE8"/>
  4397. </linearGradient>
  4398. <linearGradient id="paint86_linear_234_211" x1="-33.991" y1="530.783" x2="659.781" y2="530.783" gradientUnits="userSpaceOnUse">
  4399. <stop stop-color="#7DB4EA"/>
  4400. <stop offset="1" stop-color="#807EE8"/>
  4401. </linearGradient>
  4402. <linearGradient id="paint87_linear_234_211" x1="-34.5098" y1="529.612" x2="659.779" y2="529.612" gradientUnits="userSpaceOnUse">
  4403. <stop stop-color="#7DB4EA"/>
  4404. <stop offset="1" stop-color="#807EE8"/>
  4405. </linearGradient>
  4406. <linearGradient id="paint88_linear_234_211" x1="-35.0287" y1="528.429" x2="659.777" y2="528.429" gradientUnits="userSpaceOnUse">
  4407. <stop stop-color="#7DB4EA"/>
  4408. <stop offset="1" stop-color="#807EE8"/>
  4409. </linearGradient>
  4410. <linearGradient id="paint89_linear_234_211" x1="-39.597" y1="527.234" x2="659.775" y2="527.234" gradientUnits="userSpaceOnUse">
  4411. <stop stop-color="#7DB4EA"/>
  4412. <stop offset="1" stop-color="#807EE8"/>
  4413. </linearGradient>
  4414. <linearGradient id="paint90_linear_234_211" x1="-45.0304" y1="526.027" x2="659.774" y2="526.027" gradientUnits="userSpaceOnUse">
  4415. <stop stop-color="#7DB4EA"/>
  4416. <stop offset="1" stop-color="#807EE8"/>
  4417. </linearGradient>
  4418. <linearGradient id="paint91_linear_234_211" x1="-50.5399" y1="524.807" x2="659.774" y2="524.807" gradientUnits="userSpaceOnUse">
  4419. <stop stop-color="#7DB4EA"/>
  4420. <stop offset="1" stop-color="#807EE8"/>
  4421. </linearGradient>
  4422. <linearGradient id="paint92_linear_234_211" x1="-56.1469" y1="523.577" x2="659.775" y2="523.577" gradientUnits="userSpaceOnUse">
  4423. <stop stop-color="#7DB4EA"/>
  4424. <stop offset="1" stop-color="#807EE8"/>
  4425. </linearGradient>
  4426. <linearGradient id="paint93_linear_234_211" x1="-61.8197" y1="522.335" x2="659.777" y2="522.335" gradientUnits="userSpaceOnUse">
  4427. <stop stop-color="#7DB4EA"/>
  4428. <stop offset="1" stop-color="#807EE8"/>
  4429. </linearGradient>
  4430. <linearGradient id="paint94_linear_234_211" x1="-67.5513" y1="521.081" x2="659.778" y2="521.081" gradientUnits="userSpaceOnUse">
  4431. <stop stop-color="#7DB4EA"/>
  4432. <stop offset="1" stop-color="#807EE8"/>
  4433. </linearGradient>
  4434. <linearGradient id="paint95_linear_234_211" x1="-73.3341" y1="519.817" x2="659.779" y2="519.817" gradientUnits="userSpaceOnUse">
  4435. <stop stop-color="#7DB4EA"/>
  4436. <stop offset="1" stop-color="#807EE8"/>
  4437. </linearGradient>
  4438. <linearGradient id="paint96_linear_234_211" x1="-79.1643" y1="518.542" x2="659.78" y2="518.542" gradientUnits="userSpaceOnUse">
  4439. <stop stop-color="#7DB4EA"/>
  4440. <stop offset="1" stop-color="#807EE8"/>
  4441. </linearGradient>
  4442. <linearGradient id="paint97_linear_234_211" x1="-85.0377" y1="517.255" x2="659.782" y2="517.255" gradientUnits="userSpaceOnUse">
  4443. <stop stop-color="#7DB4EA"/>
  4444. <stop offset="1" stop-color="#807EE8"/>
  4445. </linearGradient>
  4446. <linearGradient id="paint98_linear_234_211" x1="-90.9595" y1="515.958" x2="659.783" y2="515.958" gradientUnits="userSpaceOnUse">
  4447. <stop stop-color="#7DB4EA"/>
  4448. <stop offset="1" stop-color="#807EE8"/>
  4449. </linearGradient>
  4450. <linearGradient id="paint99_linear_234_211" x1="-96.9" y1="514.651" x2="659.784" y2="514.651" gradientUnits="userSpaceOnUse">
  4451. <stop stop-color="#7DB4EA"/>
  4452. <stop offset="1" stop-color="#807EE8"/>
  4453. </linearGradient>
  4454. <linearGradient id="paint100_linear_234_211" x1="-102.896" y1="513.333" x2="659.786" y2="513.333" gradientUnits="userSpaceOnUse">
  4455. <stop stop-color="#7DB4EA"/>
  4456. <stop offset="1" stop-color="#807EE8"/>
  4457. </linearGradient>
  4458. <linearGradient id="paint101_linear_234_211" x1="-108.896" y1="512.007" x2="659.787" y2="512.007" gradientUnits="userSpaceOnUse">
  4459. <stop stop-color="#7DB4EA"/>
  4460. <stop offset="1" stop-color="#807EE8"/>
  4461. </linearGradient>
  4462. <linearGradient id="paint102_linear_234_211" x1="-114.936" y1="510.676" x2="659.788" y2="510.676" gradientUnits="userSpaceOnUse">
  4463. <stop stop-color="#7DB4EA"/>
  4464. <stop offset="1" stop-color="#807EE8"/>
  4465. </linearGradient>
  4466. <linearGradient id="paint103_linear_234_211" x1="-121" y1="509.278" x2="659.789" y2="509.278" gradientUnits="userSpaceOnUse">
  4467. <stop stop-color="#7DB4EA"/>
  4468. <stop offset="1" stop-color="#807EE8"/>
  4469. </linearGradient>
  4470. <linearGradient id="paint104_linear_234_211" x1="-7.44883" y1="741.335" x2="253.305" y2="741.335" gradientUnits="userSpaceOnUse">
  4471. <stop stop-color="#7DB4EA"/>
  4472. <stop offset="1" stop-color="#807EE8"/>
  4473. </linearGradient>
  4474. <linearGradient id="paint105_linear_234_211" x1="-7.44254" y1="744.912" x2="247.337" y2="744.912" gradientUnits="userSpaceOnUse">
  4475. <stop stop-color="#7DB4EA"/>
  4476. <stop offset="1" stop-color="#807EE8"/>
  4477. </linearGradient>
  4478. <linearGradient id="paint106_linear_234_211" x1="-7.43625" y1="748.431" x2="241.37" y2="748.431" gradientUnits="userSpaceOnUse">
  4479. <stop stop-color="#7DB4EA"/>
  4480. <stop offset="1" stop-color="#807EE8"/>
  4481. </linearGradient>
  4482. <linearGradient id="paint107_linear_234_211" x1="-7.42956" y1="751.888" x2="235.403" y2="751.888" gradientUnits="userSpaceOnUse">
  4483. <stop stop-color="#7DB4EA"/>
  4484. <stop offset="1" stop-color="#807EE8"/>
  4485. </linearGradient>
  4486. <linearGradient id="paint108_linear_234_211" x1="-7.42268" y1="755.28" x2="229.437" y2="755.28" gradientUnits="userSpaceOnUse">
  4487. <stop stop-color="#7DB4EA"/>
  4488. <stop offset="1" stop-color="#807EE8"/>
  4489. </linearGradient>
  4490. <clipPath id="clip0_234_211">
  4491. <rect width="639" height="698" fill="white"/>
  4492. </clipPath>
  4493. </defs>
  4494. </svg>
  4495. </file>
  4496. <file path="assets/img/bg_popup.svg">
  4497. <svg width="475" height="120" viewBox="0 0 475 120" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  4498. <g clip-path="url(#clip0_1016_12745)">
  4499. <rect width="475" height="120" fill="#E4F1FF"/>
  4500. <rect width="79" height="91" fill="url(#pattern0_1016_12745)" fill-opacity="0.5"/>
  4501. <rect x="481" y="120" width="79" height="91" transform="rotate(180 481 120)" fill="url(#pattern1_1016_12745)" fill-opacity="0.5"/>
  4502. <rect x="230" width="111" height="72" fill="url(#pattern2_1016_12745)" fill-opacity="0.7"/>
  4503. </g>
  4504. <defs>
  4505. <pattern id="pattern0_1016_12745" patternContentUnits="objectBoundingBox" width="1" height="1">
  4506. <use xlink:href="#image0_1016_12745" transform="scale(0.00076691 0.000665779)"/>
  4507. </pattern>
  4508. <pattern id="pattern1_1016_12745" patternContentUnits="objectBoundingBox" width="1" height="1">
  4509. <use xlink:href="#image0_1016_12745" transform="scale(0.00076691 0.000665779)"/>
  4510. </pattern>
  4511. <pattern id="pattern2_1016_12745" patternContentUnits="objectBoundingBox" width="1" height="1">
  4512. <use xlink:href="#image1_1016_12745" transform="matrix(0.000597833 0 0 0.000921659 -0.000983933 0)"/>
  4513. </pattern>
  4514. <clipPath id="clip0_1016_12745">
  4515. <rect width="475" height="120" fill="white"/>
  4516. </clipPath>
  4517. <image id="image0_1016_12745" width="1304" height="1502" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABRgAAAXeCAYAAAAEqUO0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACkBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAxOS0xMS0yN1QxMDo0OTozOCswOTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNC0wOC0wN1QxNzoyMzo1NSswOTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjQtMDgtMDdUMTc6MjM6NTUrMDk6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjYzMzIyQUIyNTQ5NjExRUY5MkYwOTAyM0Y1QzA2M0Y5IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjYzMzIyQUIzNTQ5NjExRUY5MkYwOTAyM0Y1QzA2M0Y5IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MjZGNUMyMkJCODEwRUExMUE5MkZERDFEMkU1REQ1RkQiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjI2RjVDMjJCQjgxMEVBMTFBOTJGREQxRDJFNURENUZEIiBzdEV2dDp3aGVuPSIyMDE5LTExLTI3VDEwOjQ5OjM4KzA5OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MjhGNUMyMkJCODEwRUExMUE5MkZERDFEMkU1REQ1RkQiIHN0RXZ0OndoZW49IjIwMTktMTEtMjdUMTA6NTk6MTIrMDk6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MTc3RTY2MEJGMTBFQTExQTkyRkREMUQyRTVERDVGRCIgc3RFdnQ6d2hlbj0iMjAxOS0xMS0yN1QxMTo0Nzo0NiswOTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjUxNzdFNjYwQkYxMEVBMTFBOTJGREQxRDJFNURENUZEIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjI2RjVDMjJCQjgxMEVBMTFBOTJGREQxRDJFNURENUZEIi8+IDxwaG90b3Nob3A6VGV4dExheWVycz4gPHJkZjpCYWc+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0iISIgcGhvdG9zaG9wOkxheWVyVGV4dD0iISIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9InRvbmdybyBtYWxsIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSJ0b25ncm8gbWFsbCIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IuyEnOuyhOygkOqygOyViOuCtCIgcGhvdG9zaG9wOkxheWVyVGV4dD0i7ISc67KE7KCQ6rKA7JWI64K0Ii8+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0iMTAuOCAgICAgIOyDiOuyvSAy7IucIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSIxMC44ICAgICAg7IOI67K9IDLsi5wiLz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSLshJzrsoTsoJDqsoDsnLzroZwg7J247ZWY7JesIOuqqOuToCDshJzruYTsiqTqsIAg7KSR64uo65CY7Jik64uIIOyCrOydtO2KuCDsnbTsmqnsl5Ag7LC46rOg67aA7YOB65Oc66a964uI64ukLiDruaDrpbgg7Iuc6rCE64K07JeQIOygleyDgeyEnOu5hOyKpOqwgCDqsIDriqXtlZjrj4TroZ0iIHBob3Rvc2hvcDpMYXllclRleHQ9IuyEnOuyhOygkOqygOycvOuhnCDsnbjtlZjsl6wg66qo65OgIOyEnOu5hOyKpOqwgCDspJHri6jrkJjsmKTri4gg7IKs7J207Yq4IOydtOyaqeyXkCDssLjqs6DrtoDtg4Hrk5zrpr3ri4jri6QuIOu5oOuluCDsi5zqsITrgrTsl5Ag7KCV7IOB7ISc67mE7Iqk6rCAIOqwgOuKpe2VmOuPhOuhnSDrhbjroKXtlZjqsqDsirXri4jri6QuIi8+IDwvcmRmOkJhZz4gPC9waG90b3Nob3A6VGV4dExheWVycz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIi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"/>
  4518. <image id="image1_1016_12745" width="1676" height="1085" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABowAAAQ9CAYAAABjrG++AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACkBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAxOS0xMS0yN1QxMDo0OTozOCswOTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNC0wOC0wN1QxNzoyNDo1MCswOTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjQtMDgtMDdUMTc6MjQ6NTArMDk6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjgzRjBCNkRFNTQ5NjExRUY4MEQ1QTRGNDVEMDRDRjU1IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjgzRjBCNkRGNTQ5NjExRUY4MEQ1QTRGNDVEMDRDRjU1IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MjZGNUMyMkJCODEwRUExMUE5MkZERDFEMkU1REQ1RkQiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjI2RjVDMjJCQjgxMEVBMTFBOTJGREQxRDJFNURENUZEIiBzdEV2dDp3aGVuPSIyMDE5LTExLTI3VDEwOjQ5OjM4KzA5OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MjhGNUMyMkJCODEwRUExMUE5MkZERDFEMkU1REQ1RkQiIHN0RXZ0OndoZW49IjIwMTktMTEtMjdUMTA6NTk6MTIrMDk6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MTc3RTY2MEJGMTBFQTExQTkyRkREMUQyRTVERDVGRCIgc3RFdnQ6d2hlbj0iMjAxOS0xMS0yN1QxMTo0Nzo0NiswOTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjUxNzdFNjYwQkYxMEVBMTFBOTJGREQxRDJFNURENUZEIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjI2RjVDMjJCQjgxMEVBMTFBOTJGREQxRDJFNURENUZEIi8+IDxwaG90b3Nob3A6VGV4dExheWVycz4gPHJkZjpCYWc+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0iISIgcGhvdG9zaG9wOkxheWVyVGV4dD0iISIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9InRvbmdybyBtYWxsIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSJ0b25ncm8gbWFsbCIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IuyEnOuyhOygkOqygOyViOuCtCIgcGhvdG9zaG9wOkxheWVyVGV4dD0i7ISc67KE7KCQ6rKA7JWI64K0Ii8+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0iMTAuOCAgICAgIOyDiOuyvSAy7IucIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSIxMC44ICAgICAg7IOI67K9IDLsi5wiLz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSLshJzrsoTsoJDqsoDsnLzroZwg7J247ZWY7JesIOuqqOuToCDshJzruYTsiqTqsIAg7KSR64uo65CY7Jik64uIIOyCrOydtO2KuCDsnbTsmqnsl5Ag7LC46rOg67aA7YOB65Oc66a964uI64ukLiDruaDrpbgg7Iuc6rCE64K07JeQIOygleyDgeyEnOu5hOyKpOqwgCDqsIDriqXtlZjrj4TroZ0iIHBob3Rvc2hvcDpMYXllclRleHQ9IuyEnOuyhOygkOqygOycvOuhnCDsnbjtlZjsl6wg66qo65OgIOyEnOu5hOyKpOqwgCDspJHri6jrkJjsmKTri4gg7IKs7J207Yq4IOydtOyaqeyXkCDssLjqs6DrtoDtg4Hrk5zrpr3ri4jri6QuIOu5oOuluCDsi5zqsITrgrTsl5Ag7KCV7IOB7ISc67mE7Iqk6rCAIOqwgOuKpe2VmOuPhOuhnSDrhbjroKXtlZjqsqDsirXri4jri6QuIi8+IDwvcmRmOkJhZz4gPC9waG90b3Nob3A6VGV4dExheWVycz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIi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TmEEAAAAAADQOYURAAAAAABA5xRGAAAAAAAAnVMYAQAAAAAAdE5hBAAAAAAA0DmFEQAAAAAAQOcURgAAAAAAAJ1TGAEAAAAAAHROYQQAAAAAANA5hREAAAAAAEDnFEYAAAAAAACdUxgBAAAAAAB0TmEEAAAAAADQOYURAAAAAABA5xRGAAAAAAAAnVMYAQAAAAAAdE5hBAAAAAAA0DmFEQAAAAAAQOcURgAAAAAAAJ1TGAEAAAAAAHROYQQAAAAAANA5hREAAAAAAEDnFEYAAAAAAACdUxgBAAAAAAB0TmEEAAAAAADQOYURAAAAAABA5xRGAAAAAAAAnVMYAQAAAAAAdE5hBAAAAAAA0DmFEQAAAAAAQOcURgAAAAAAAJ1TGAEAAAAAAHROYQQAAAAAANA5hREAAAAAAEDnFEYAAAAAAACdUxgBAAAAAAB0TmEEAAAAAADQOYURAAAAAABA5xRGAAAAAAAAnVMYAQAAAAAAdE5hBAAAAAAA0DmFEQAAAAAAQOcURgAAAAAAAJ1TGAEAAAAAAHROYQQAAAAAANA5hREAAAAAAEDnFEYAAAAAAACdUxgBAAAAAAB0TmEEAAAAAADQOYURAAAAAABA5xRGAAAAAAAAnVMYAQAAAAAAdE5hBAAAAAAA0DmFEQAAAAAAQOcURgAAAAAAAJ1TGAEAAAAAAHROYQQAAAAAANA5hREAAAAAAEDnFEYAAAAAAACdUxgBAAAAAAB0TmEEAAAAAADQOYURAAAAAABA5xRGAAAAAAAAnVMYAQAAAAAAdE5hBAAAAAAA0DmFEQAAAAAAQOcURgAAAAAAAJ1TGAEAAAAAAHROYQQAAAAAANA5hREAAAAAAEDnFEYAAAAAAACdUxgBAAAAAAB0TmEEAAAAAADQOYURAAAAAABA5xRGAAAAAAAAnVMYAQAAAAAAdE5hBAAAAAAA0DmFEQAAAAAAQOcURgAAAAAAAJ1TGAEAAAAAAHROYQQAAAAAANA5hREAAAAAAEDnFEYAAAAAAACdUxgBAAAAAAB0TmEEAAAAAADQOYURAAAAAABA5xRGAAAAAAAAnVMYAQAAAAAAdE5hBAAAAAAA0DmFEQAAAAAAQOcURgAAAAAAAJ1TGAEAAAAAAHROYQQAAAAAANA5hREAAAAAAEDnFEYAAAAAAACdUxgBAAAAAAB0TmEEAAAAAADQOYUR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"/>
  4519. </defs>
  4520. </svg>
  4521. </file>
  4522. <file path="assets/img/bg_tab_off.svg">
  4523. <svg width="211" height="56" viewBox="0 0 211 56" fill="none" xmlns="http://www.w3.org/2000/svg">
  4524. <path id="Rectangle 54" d="M0 10C0 4.47715 4.47715 0 10 0H183.392C188.533 0 193.103 3.2747 194.755 8.1428L211 56H0V10Z" fill="#E8EAEE"/>
  4525. </svg>
  4526. </file>
  4527. <file path="assets/img/bg_tab_on.svg">
  4528. <svg width="222" height="56" viewBox="0 0 222 56" fill="none" xmlns="http://www.w3.org/2000/svg">
  4529. <path id="Rectangle 54" d="M0 10C0 4.47715 4.47715 0 10 0H193.543C198.615 0 203.139 3.18805 204.844 7.96396L222 56H0V10Z" fill="white"/>
  4530. </svg>
  4531. </file>
  4532. <file path="assets/img/bg_tooltip.svg">
  4533. <svg width="140" height="71" viewBox="0 0 140 71" fill="none" xmlns="http://www.w3.org/2000/svg">
  4534. <g filter="url(#filter0_d_560_2659)">
  4535. <path fill-rule="evenodd" clip-rule="evenodd" d="M70.5 1L64 12L15 12C9.47715 12 5 16.4772 5 22V52C5 57.5228 9.47715 62 15 62H125C130.523 62 135 57.5228 135 52V22C135 16.4772 130.523 12 125 12L77 12L70.5 1Z" fill="white"/>
  4536. <path d="M64 12V12.5H64.2853L64.4305 12.2544L64 12ZM70.5 1L70.9305 0.745635L70.5 0.017159L70.0695 0.745635L70.5 1ZM15 12V11.5V12ZM125 12V11.5V12ZM77 12L76.5695 12.2544L76.7147 12.5H77V12ZM64.4305 12.2544L70.9305 1.25436L70.0695 0.745635L63.5695 11.7456L64.4305 12.2544ZM15 12.5L64 12.5V11.5L15 11.5V12.5ZM5.5 22C5.5 16.7533 9.75329 12.5 15 12.5V11.5C9.20101 11.5 4.5 16.201 4.5 22H5.5ZM5.5 52V22H4.5V52H5.5ZM15 61.5C9.75329 61.5 5.5 57.2467 5.5 52H4.5C4.5 57.799 9.20101 62.5 15 62.5V61.5ZM125 61.5H15V62.5H125V61.5ZM134.5 52C134.5 57.2467 130.247 61.5 125 61.5V62.5C130.799 62.5 135.5 57.799 135.5 52H134.5ZM134.5 22V52H135.5V22H134.5ZM125 12.5C130.247 12.5 134.5 16.7533 134.5 22H135.5C135.5 16.201 130.799 11.5 125 11.5V12.5ZM77 12.5L125 12.5V11.5L77 11.5V12.5ZM70.0695 1.25436L76.5695 12.2544L77.4305 11.7456L70.9305 0.745635L70.0695 1.25436Z" fill="#DDDDDD"/>
  4537. </g>
  4538. <defs>
  4539. <filter id="filter0_d_560_2659" x="0.5" y="0.0170898" width="139" height="70.4829" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
  4540. <feFlood flood-opacity="0" result="BackgroundImageFix"/>
  4541. <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
  4542. <feOffset dy="4"/>
  4543. <feGaussianBlur stdDeviation="2"/>
  4544. <feComposite in2="hardAlpha" operator="out"/>
  4545. <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
  4546. <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_560_2659"/>
  4547. <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_560_2659" result="shape"/>
  4548. </filter>
  4549. </defs>
  4550. </svg>
  4551. </file>
  4552. <file path="assets/img/bg_tooltip2.svg">
  4553. <svg width="202" height="156" viewBox="0 0 202 156" fill="none" xmlns="http://www.w3.org/2000/svg">
  4554. <g filter="url(#filter0_d_571_2516)">
  4555. <path fill-rule="evenodd" clip-rule="evenodd" d="M101.5 1L95 12L15 12C9.47715 12 5 16.4772 5 22V137C5 142.523 9.47715 147 15 147H187C192.523 147 197 142.523 197 137V22C197 16.4772 192.523 12 187 12L108 12L101.5 1Z" fill="white"/>
  4556. <path d="M95 12V12.5H95.2853L95.4305 12.2544L95 12ZM101.5 1L101.93 0.745635L101.5 0.017159L101.07 0.745635L101.5 1ZM15 12V11.5V12ZM187 12V11.5V12ZM108 12L107.57 12.2544L107.715 12.5H108V12ZM95.4305 12.2544L101.93 1.25436L101.07 0.745635L94.5695 11.7456L95.4305 12.2544ZM15 12.5L95 12.5V11.5L15 11.5V12.5ZM5.5 22C5.5 16.7533 9.7533 12.5 15 12.5V11.5C9.20101 11.5 4.5 16.201 4.5 22H5.5ZM5.5 137V22H4.5V137H5.5ZM15 146.5C9.75329 146.5 5.5 142.247 5.5 137H4.5C4.5 142.799 9.20101 147.5 15 147.5V146.5ZM187 146.5H15V147.5H187V146.5ZM196.5 137C196.5 142.247 192.247 146.5 187 146.5V147.5C192.799 147.5 197.5 142.799 197.5 137H196.5ZM196.5 22V137H197.5V22H196.5ZM187 12.5C192.247 12.5 196.5 16.7533 196.5 22H197.5C197.5 16.201 192.799 11.5 187 11.5V12.5ZM108 12.5L187 12.5V11.5L108 11.5V12.5ZM101.07 1.25436L107.57 12.2544L108.43 11.7456L101.93 0.745635L101.07 1.25436Z" fill="#DDDDDD"/>
  4557. </g>
  4558. <defs>
  4559. <filter id="filter0_d_571_2516" x="0.5" y="0.0170898" width="201" height="155.483" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
  4560. <feFlood flood-opacity="0" result="BackgroundImageFix"/>
  4561. <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
  4562. <feOffset dy="4"/>
  4563. <feGaussianBlur stdDeviation="2"/>
  4564. <feComposite in2="hardAlpha" operator="out"/>
  4565. <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
  4566. <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_571_2516"/>
  4567. <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_571_2516" result="shape"/>
  4568. </filter>
  4569. </defs>
  4570. </svg>
  4571. </file>
  4572. <file path="assets/img/bg_tooltip3.svg">
  4573. <svg width="156" height="117" viewBox="0 0 156 117" fill="none" xmlns="http://www.w3.org/2000/svg">
  4574. <g filter="url(#filter0_d_571_1467)">
  4575. <path fill-rule="evenodd" clip-rule="evenodd" d="M78.5 1L72 12L15 12C9.47715 12 5 16.4772 5 22V98C5 103.523 9.47715 108 15 108H141C146.523 108 151 103.523 151 98V22C151 16.4772 146.523 12 141 12L85 12L78.5 1Z" fill="white"/>
  4576. <path d="M72 12V12.5H72.2853L72.4305 12.2544L72 12ZM78.5 1L78.9305 0.745635L78.5 0.017159L78.0695 0.745635L78.5 1ZM15 12V11.5V12ZM141 12V11.5V12ZM85 12L84.5695 12.2544L84.7147 12.5H85V12ZM72.4305 12.2544L78.9305 1.25436L78.0695 0.745635L71.5695 11.7456L72.4305 12.2544ZM15 12.5L72 12.5V11.5L15 11.5V12.5ZM5.5 22C5.5 16.7533 9.7533 12.5 15 12.5V11.5C9.20101 11.5 4.5 16.201 4.5 22H5.5ZM5.5 98V22H4.5V98H5.5ZM15 107.5C9.75329 107.5 5.5 103.247 5.5 98H4.5C4.5 103.799 9.20101 108.5 15 108.5V107.5ZM141 107.5H15V108.5H141V107.5ZM150.5 98C150.5 103.247 146.247 107.5 141 107.5V108.5C146.799 108.5 151.5 103.799 151.5 98H150.5ZM150.5 22V98H151.5V22H150.5ZM141 12.5C146.247 12.5 150.5 16.7533 150.5 22H151.5C151.5 16.201 146.799 11.5 141 11.5V12.5ZM85 12.5L141 12.5V11.5L85 11.5V12.5ZM78.0695 1.25436L84.5695 12.2544L85.4305 11.7456L78.9305 0.745635L78.0695 1.25436Z" fill="#DDDDDD"/>
  4577. </g>
  4578. <defs>
  4579. <filter id="filter0_d_571_1467" x="0.5" y="0.0170898" width="155" height="116.483" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
  4580. <feFlood flood-opacity="0" result="BackgroundImageFix"/>
  4581. <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
  4582. <feOffset dy="4"/>
  4583. <feGaussianBlur stdDeviation="2"/>
  4584. <feComposite in2="hardAlpha" operator="out"/>
  4585. <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
  4586. <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_571_1467"/>
  4587. <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_571_1467" result="shape"/>
  4588. </filter>
  4589. </defs>
  4590. </svg>
  4591. </file>
  4592. <file path="assets/img/bg_tooltip4.svg">
  4593. <svg width="190" height="196" viewBox="0 0 190 196" fill="none" xmlns="http://www.w3.org/2000/svg">
  4594. <g filter="url(#filter0_d_571_2917)">
  4595. <path fill-rule="evenodd" clip-rule="evenodd" d="M95.5 1L89 12L15 12C9.47715 12 5 16.4772 5 22V177C5 182.523 9.47716 187 15 187H175C180.523 187 185 182.523 185 177V22C185 16.4772 180.523 12 175 12L102 12L95.5 1Z" fill="white"/>
  4596. <path d="M89 12V12.5H89.2853L89.4305 12.2544L89 12ZM95.5 1L95.9305 0.745635L95.5 0.017159L95.0695 0.745635L95.5 1ZM15 12V11.5V12ZM175 12V11.5V12ZM102 12L101.57 12.2544L101.715 12.5H102V12ZM89.4305 12.2544L95.9305 1.25436L95.0695 0.745635L88.5695 11.7456L89.4305 12.2544ZM15 12.5L89 12.5V11.5L15 11.5V12.5ZM5.5 22C5.5 16.7533 9.75329 12.5 15 12.5V11.5C9.20101 11.5 4.5 16.201 4.5 22H5.5ZM5.5 177V22H4.5V177H5.5ZM15 186.5C9.7533 186.5 5.5 182.247 5.5 177H4.5C4.5 182.799 9.20102 187.5 15 187.5V186.5ZM175 186.5H15V187.5H175V186.5ZM184.5 177C184.5 182.247 180.247 186.5 175 186.5V187.5C180.799 187.5 185.5 182.799 185.5 177H184.5ZM184.5 22V177H185.5V22H184.5ZM175 12.5C180.247 12.5 184.5 16.7533 184.5 22H185.5C185.5 16.201 180.799 11.5 175 11.5V12.5ZM102 12.5L175 12.5V11.5L102 11.5V12.5ZM95.0695 1.25436L101.57 12.2544L102.43 11.7456L95.9305 0.745635L95.0695 1.25436Z" fill="#DDDDDD"/>
  4597. </g>
  4598. <defs>
  4599. <filter id="filter0_d_571_2917" x="0.5" y="0.0170898" width="189" height="195.483" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
  4600. <feFlood flood-opacity="0" result="BackgroundImageFix"/>
  4601. <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
  4602. <feOffset dy="4"/>
  4603. <feGaussianBlur stdDeviation="2"/>
  4604. <feComposite in2="hardAlpha" operator="out"/>
  4605. <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
  4606. <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_571_2917"/>
  4607. <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_571_2917" result="shape"/>
  4608. </filter>
  4609. </defs>
  4610. </svg>
  4611. </file>
  4612. <file path="assets/img/btn_app_store.svg">
  4613. <svg width="141" height="40" viewBox="0 0 141 40" fill="none" xmlns="http://www.w3.org/2000/svg">
  4614. <g clip-path="url(#clip0_173_15439)">
  4615. <path d="M141 36.0825C141 38.3505 139.123 40 137.037 40H4.1716C1.87722 40 0 38.1443 0 36.0825V3.91753C0 1.85567 1.87722 0 4.1716 0H137.037C139.331 0 141 1.85567 141 3.91753V36.0825Z" fill="black"/>
  4616. <path d="M30.8701 19.7937C30.8701 16.4947 33.5816 14.8452 33.7902 14.639C32.1216 12.371 29.6186 11.9586 28.7843 11.9586C26.6985 11.7525 24.6127 13.1958 23.5698 13.1958C22.5269 13.1958 20.8583 11.9586 19.1896 11.9586C16.8953 11.9586 14.8095 13.1958 13.558 15.2576C11.055 19.3813 12.9322 25.3607 15.2266 28.6597C16.4781 30.3092 17.7296 32.1648 19.3982 31.9586C21.0669 31.9586 21.6926 30.9277 23.7784 30.9277C25.8642 30.9277 26.4899 31.9586 28.1586 31.9586C30.0358 31.9586 31.0787 30.3092 32.3302 28.6597C33.5816 26.804 34.2074 24.9483 34.2074 24.9483C34.6245 25.1545 31.0787 23.9174 30.8701 19.7937Z" fill="white"/>
  4617. <path d="M27.5325 9.89679C28.3669 8.65968 28.9926 7.21638 28.9926 5.56689C27.7411 5.56689 26.0725 6.39164 25.0296 7.62875C24.1953 8.65968 23.3609 10.3092 23.5695 11.7525C25.0296 11.7525 26.6982 10.9277 27.5325 9.89679Z" fill="white"/>
  4618. <path d="M55.8998 31.9586H53.3968L52.1454 27.8349H47.5566L46.3051 31.9586H44.0107L48.5995 17.938H51.311L55.8998 31.9586ZM51.7282 26.1854L50.4767 22.6803C50.2681 22.2679 50.0596 21.4431 49.851 19.9998C49.6424 20.6184 49.4338 21.4431 49.2252 22.6803L47.9738 26.1854H51.7282Z" fill="white"/>
  4619. <path d="M67.5806 26.8041C67.5806 28.4535 67.1634 29.8968 66.1205 30.9278C65.2862 31.7525 64.2433 32.1649 62.9918 32.1649C61.7404 32.1649 60.6975 31.7525 60.0717 30.7216V36.0824H57.7773V25.1546C57.7773 24.1236 57.7773 22.8865 57.7773 21.8556H59.8631L60.0717 23.5051C60.906 22.268 61.9489 21.6494 63.409 21.6494C64.6605 21.6494 65.7034 22.0618 66.3291 23.0927C67.1634 24.1236 67.5806 25.3608 67.5806 26.8041ZM65.2862 27.0102C65.2862 25.9793 65.0776 25.1546 64.6605 24.536C64.2433 23.9175 63.6176 23.5051 62.7833 23.5051C62.1575 23.5051 61.7404 23.7113 61.3232 24.1236C60.906 24.536 60.4889 24.9484 60.4889 25.5669C60.4889 25.7731 60.2803 25.9793 60.2803 26.1855V27.835C60.2803 28.6597 60.4889 29.2783 60.906 29.6907C61.3232 30.103 61.9489 30.5154 62.5747 30.5154C63.409 30.5154 64.0347 30.103 64.6605 29.4845C65.0776 28.8659 65.2862 28.0412 65.2862 27.0102Z" fill="white"/>
  4620. <path d="M79.2603 26.8041C79.2603 28.4535 78.8431 29.8968 77.8002 30.9278C76.9659 31.7525 75.923 32.1649 74.6715 32.1649C73.42 32.1649 72.3772 31.7525 71.7514 30.7216V36.0824H69.457V25.1546C69.457 24.1236 69.457 22.8865 69.457 21.8556H71.5428L71.7514 23.5051C72.5857 22.268 73.6286 21.6494 75.0887 21.6494C76.3402 21.6494 77.3831 22.0618 78.0088 23.0927C78.8431 24.1236 79.2603 25.3608 79.2603 26.8041ZM76.9659 27.0102C76.9659 25.9793 76.7573 25.1546 76.3402 24.536C75.923 23.9175 75.2973 23.5051 74.463 23.5051C73.8372 23.5051 73.4201 23.7113 73.0029 24.1236C72.5857 24.536 72.1686 24.9484 72.1686 25.5669C72.1686 25.7731 72.1686 25.9793 72.1686 26.1855V27.835C72.1686 28.6597 72.3772 29.2783 72.7943 29.6907C73.2115 30.103 73.8372 30.5154 74.463 30.5154C75.2973 30.5154 75.923 30.103 76.5487 29.4845C76.7573 28.8659 76.9659 28.0412 76.9659 27.0102Z" fill="white"/>
  4621. <path d="M92.401 28.2471C92.401 29.4842 91.9838 30.309 91.1495 31.1337C90.3152 31.9585 88.8551 32.3708 87.3951 32.3708C85.935 32.3708 84.6835 32.1647 83.6406 31.5461L84.2664 29.6904C85.3093 30.309 86.3522 30.5152 87.6036 30.5152C88.438 30.5152 89.0637 30.309 89.6894 29.8966C90.1066 29.4842 90.3152 29.0719 90.3152 28.4533C90.3152 27.8348 90.1066 27.4224 89.6894 27.01C89.2723 26.5977 88.6465 26.1853 87.8122 25.9791C85.3093 25.1544 84.0578 23.7111 84.0578 22.0616C84.0578 20.8245 84.475 19.9997 85.3093 19.175C86.1436 18.3502 87.3951 18.144 88.8551 18.144C90.1066 18.144 91.1495 18.3502 91.9838 18.7626L91.3581 20.6183C90.5238 20.2059 89.6894 19.9997 88.6465 19.9997C87.8122 19.9997 87.1865 20.2059 86.7693 20.6183C86.3522 21.0306 86.1436 21.443 86.1436 21.8554C86.1436 22.4739 86.3522 22.8863 86.7693 23.2987C87.1865 23.7111 87.8122 23.9172 88.8551 24.3296C90.1066 24.742 90.9409 25.3605 91.5667 25.9791C91.9838 26.3915 92.401 27.2162 92.401 28.2471Z" fill="white"/>
  4622. <path d="M99.7017 23.7111H97.1988V28.6596C97.1988 29.8967 97.6159 30.5152 98.4503 30.5152C98.8674 30.5152 99.2846 30.5152 99.4932 30.5152V32.1647C99.076 32.3709 98.4503 32.3709 97.8245 32.3709C96.9902 32.3709 96.1559 32.1647 95.7387 31.5462C95.3216 30.9276 94.9044 30.1029 94.9044 28.8658V23.7111H93.4443V22.0616H94.9044V20.206L97.1988 19.5874V22.0616H99.7017V23.7111Z" fill="white"/>
  4623. <path d="M110.965 27.0102C110.965 28.4535 110.548 29.8968 109.714 30.7216C108.88 31.7525 107.628 32.1649 105.959 32.1649C104.499 32.1649 103.248 31.7525 102.414 30.7216C101.579 29.6907 101.162 28.4535 101.162 27.0102C101.162 25.3608 101.579 24.1236 102.622 23.0927C103.456 22.0618 104.708 21.6494 106.377 21.6494C107.837 21.6494 109.088 22.0618 109.922 23.0927C110.548 24.1236 110.965 25.3608 110.965 27.0102ZM108.671 27.0102C108.671 26.1855 108.462 25.3608 108.045 24.536C107.628 23.7113 106.794 23.2989 105.959 23.2989C105.125 23.2989 104.291 23.7113 103.874 24.536C103.456 25.1546 103.248 25.9793 103.248 27.0102C103.248 27.835 103.456 28.6597 103.874 29.4845C104.291 30.3092 105.125 30.7216 105.959 30.7216C106.794 30.7216 107.42 30.3092 108.045 29.4845C108.462 28.6597 108.671 28.0412 108.671 27.0102Z" fill="white"/>
  4624. <path d="M118.265 23.9173C118.056 23.9173 117.848 23.9173 117.639 23.9173C116.805 23.9173 116.179 24.1235 115.762 24.7421C115.345 25.3606 115.136 25.9792 115.136 26.8039V32.1647H112.842V25.3606C112.842 24.1235 112.842 23.0926 112.842 22.2678H114.719V24.1235C114.928 23.505 115.345 22.8864 115.762 22.474C116.179 22.0617 116.805 21.8555 117.431 21.8555C117.639 21.8555 117.848 21.8555 118.056 21.8555V23.9173H118.265Z" fill="white"/>
  4625. <path d="M128.485 26.5977C128.485 27.0101 128.485 27.4225 128.485 27.6287H121.811C121.811 28.6596 122.228 29.2781 122.854 29.8967C123.479 30.3091 124.105 30.5153 125.148 30.5153C126.191 30.5153 127.025 30.3091 127.86 30.1029L128.277 31.7524C127.234 32.1647 126.191 32.3709 124.94 32.3709C123.271 32.3709 122.228 31.9586 121.185 30.9276C120.351 30.1029 119.934 28.8658 119.934 27.2163C119.934 25.773 120.351 24.5359 121.185 23.505C122.019 22.474 123.271 21.8555 124.731 21.8555C126.191 21.8555 127.234 22.474 128.068 23.505C128.068 24.3297 128.485 25.3606 128.485 26.5977ZM126.4 25.9792C126.4 25.3606 126.191 24.7421 125.982 24.3297C125.565 23.7111 124.94 23.2988 124.105 23.2988C123.271 23.2988 122.854 23.505 122.228 24.1235C121.811 24.5359 121.602 25.1544 121.602 25.773H126.4V25.9792Z" fill="white"/>
  4626. <path d="M51.1024 9.48452C51.1024 10.7216 50.6852 11.5464 50.0595 12.1649C49.4337 12.7835 48.3908 12.9897 47.1393 12.9897C46.5136 12.9897 45.8879 12.9897 45.4707 12.9897V6.39173C45.8879 6.18555 46.5136 6.18555 47.1393 6.18555C48.3908 6.18555 49.2251 6.39173 49.8509 7.01029C50.6852 7.62885 51.1024 8.45359 51.1024 9.48452ZM49.8509 9.48452C49.8509 8.65977 49.6423 8.04122 49.2251 7.62885C48.808 7.21647 48.1822 7.01029 47.3479 7.01029C46.9308 7.01029 46.7222 7.01029 46.5136 7.01029V12.3711C46.7222 12.3711 46.9308 12.3711 47.3479 12.3711C48.1822 12.3711 48.808 12.1649 49.2251 11.7526C49.6423 11.134 49.8509 10.5154 49.8509 9.48452Z" fill="white"/>
  4627. <path d="M57.1509 10.7218C57.1509 11.5465 56.9423 12.1651 56.5251 12.5775C56.108 12.9898 55.4822 13.4022 54.6479 13.4022C53.8136 13.4022 53.3964 13.196 52.9793 12.7836C52.5621 12.3713 52.3535 11.7527 52.3535 10.928C52.3535 10.1032 52.5621 9.48467 52.9793 9.0723C53.3964 8.65993 54.0222 8.24756 54.8565 8.24756C55.6908 8.24756 56.108 8.45374 56.5251 8.86612C56.9423 9.27849 57.1509 9.89704 57.1509 10.7218ZM56.108 10.7218C56.108 10.3094 56.108 9.89704 55.8994 9.48467C55.6908 9.0723 55.2736 8.86612 54.8565 8.86612C54.4393 8.86612 54.0222 9.0723 53.8136 9.48467C53.605 9.89704 53.605 10.3094 53.605 10.7218C53.605 11.1342 53.605 11.5465 53.8136 11.9589C54.0222 12.1651 54.2307 12.3713 54.8565 12.3713C55.2736 12.3713 55.6908 12.1651 55.8994 11.7527C55.8994 11.5465 56.108 11.1342 56.108 10.7218Z" fill="white"/>
  4628. <path d="M65.4941 8.24756L64.034 13.196H62.9911L62.3654 11.1342C62.1568 10.5156 62.1568 10.1032 61.9482 9.48467C61.9482 10.1032 61.7396 10.5156 61.531 11.1342L60.9053 13.196H59.8624L58.4023 8.24756H59.4452L60.071 10.5156C60.2796 11.1342 60.2796 11.5465 60.4881 12.1651C60.4881 11.7527 60.6967 11.1342 60.9053 10.5156L61.531 8.24756H62.3654L62.9911 10.5156C63.1997 11.1342 63.1997 11.5465 63.4083 12.1651C63.4083 11.7527 63.6168 11.1342 63.8254 10.5156L64.4512 8.24756H65.4941Z" fill="white"/>
  4629. <path d="M71.3347 13.1961H70.2918V10.3095C70.2918 9.4848 69.8746 9.07243 69.2489 9.07243C68.8317 9.07243 68.6231 9.27862 68.4146 9.4848C68.206 9.69099 68.206 10.1034 68.206 10.3095V13.1961H67.1631V9.69099C67.1631 9.27862 67.1631 8.86625 67.1631 8.24769H68.206V9.07243C68.4146 8.86625 68.6231 8.66006 68.8317 8.45387C68.8317 8.24769 69.2489 8.0415 69.4575 8.0415C69.8746 8.0415 70.2918 8.24769 70.7089 8.45387C71.1261 8.86625 71.3347 9.27862 71.3347 10.1034V13.1961Z" fill="white"/>
  4630. <path d="M74.2548 13.196H73.2119V5.97949H74.2548V13.196Z" fill="white"/>
  4631. <path d="M80.9292 10.7219C80.9292 11.5467 80.7206 12.1652 80.3034 12.5776C79.8863 12.99 79.2605 13.4023 78.4262 13.4023C77.5919 13.4023 77.1747 13.1961 76.7576 12.7838C76.3404 12.3714 76.1318 11.7528 76.1318 10.9281C76.1318 10.1034 76.3404 9.4848 76.7576 9.07243C77.1747 8.24769 77.8005 8.0415 78.4262 8.0415C79.2605 8.0415 79.6777 8.24769 80.0949 8.66006C80.7206 9.27862 80.9292 9.89717 80.9292 10.7219ZM79.6777 10.7219C79.6777 10.3095 79.6777 9.89717 79.4691 9.4848C79.2605 9.07243 78.8434 8.86625 78.4262 8.86625C78.0091 8.86625 77.5919 9.07243 77.3833 9.4848C77.1747 9.89717 77.1747 10.3095 77.1747 10.7219C77.1747 11.1343 77.1747 11.5467 77.3833 11.959C77.5919 12.1652 78.0091 12.3714 78.4262 12.3714C78.8434 12.3714 79.2605 12.1652 79.4691 11.7528C79.6777 11.5467 79.6777 11.1343 79.6777 10.7219Z" fill="white"/>
  4632. <path d="M86.3527 13.196H85.3098V12.5775C84.8926 12.9898 84.4754 13.196 83.8497 13.196C83.4325 13.196 83.0154 12.9898 82.8068 12.7836C82.5982 12.5775 82.3896 12.1651 82.3896 11.7527C82.3896 11.1342 82.5982 10.7218 83.224 10.3094C83.6411 9.89704 84.4755 9.89704 85.3098 9.89704C85.3098 9.27849 84.8926 8.86612 84.2669 8.86612C83.8497 8.86612 83.4325 9.0723 83.0154 9.27849L82.8068 8.65993C83.224 8.45374 83.8497 8.24756 84.4754 8.24756C85.7269 8.24756 86.3527 8.86612 86.3527 10.3094V12.1651C86.1441 12.3713 86.1441 12.7836 86.3527 13.196ZM85.1012 11.3403V10.7218C83.8497 10.7218 83.224 11.1342 83.224 11.7527C83.224 11.9589 83.224 12.1651 83.4325 12.3713C83.6411 12.3713 83.8497 12.3713 84.0583 12.3713C84.2669 12.3713 84.4754 12.3713 84.684 12.1651C84.8926 11.9589 85.1012 11.9589 85.1012 11.3403C85.1012 11.5465 85.1012 11.5465 85.1012 11.3403Z" fill="white"/>
  4633. <path d="M92.6098 13.196H91.5669V12.3712C91.1498 12.9898 90.7326 13.196 89.8983 13.196C89.2726 13.196 88.8554 12.9898 88.4382 12.5774C88.0211 12.1651 87.8125 11.5465 87.8125 10.7218C87.8125 9.89702 88.0211 9.27846 88.4382 8.86609C88.8554 8.45372 89.2726 8.24753 89.8983 8.24753C90.524 8.24753 90.9412 8.45372 91.3584 8.86609V5.97949H92.4013V11.7527C92.6098 12.3712 92.6098 12.7836 92.6098 13.196ZM91.3584 11.1341V10.3094C91.3584 10.1032 91.3584 10.1032 91.3584 9.89702C91.3584 9.69083 91.1498 9.48465 90.9412 9.27846C90.7326 9.07228 90.524 9.07228 90.1069 9.07228C89.6897 9.07228 89.2726 9.27846 89.064 9.48465C88.8554 9.89702 88.6468 10.3094 88.6468 10.7218C88.6468 11.1341 88.8554 11.5465 89.064 11.9589C89.4811 12.1651 89.8983 12.3712 90.3155 12.3712C90.7326 12.3712 90.9412 12.1651 91.1498 11.9589C91.3584 11.7527 91.3584 11.3403 91.3584 11.1341Z" fill="white"/>
  4634. <path d="M101.996 10.7218C101.996 11.5465 101.787 12.1651 101.37 12.5775C100.953 12.9898 100.327 13.4022 99.4926 13.4022C98.6583 13.4022 98.2411 13.196 97.824 12.7836C97.4068 12.3713 97.1982 11.7527 97.1982 10.928C97.1982 10.1032 97.4068 9.48467 97.824 9.0723C98.2411 8.65993 98.8669 8.24756 99.7012 8.24756C100.536 8.24756 100.953 8.45374 101.37 8.86612C101.787 9.27849 101.996 9.89704 101.996 10.7218ZM100.953 10.7218C100.953 10.3094 100.953 9.89704 100.744 9.48467C100.536 9.0723 100.118 8.86612 99.7012 8.86612C99.284 8.86612 98.8669 9.0723 98.6583 9.48467C98.4497 9.89704 98.4497 10.3094 98.4497 10.7218C98.4497 11.1342 98.4497 11.5465 98.6583 11.9589C98.8669 12.1651 99.0755 12.3713 99.7012 12.3713C100.118 12.3713 100.536 12.1651 100.744 11.7527C100.744 11.5465 100.953 11.1342 100.953 10.7218Z" fill="white"/>
  4635. <path d="M108.045 13.1961H107.002V10.3095C107.002 9.4848 106.585 9.07243 105.959 9.07243C105.542 9.07243 105.333 9.27862 105.125 9.4848C104.916 9.69099 104.916 10.1034 104.916 10.3095V13.1961H103.873V9.69099C103.873 9.27862 103.873 8.86625 103.873 8.24769H104.916V9.07243C105.125 8.86625 105.333 8.66006 105.542 8.45387C105.542 8.24769 105.959 8.0415 106.376 8.0415C106.793 8.0415 107.21 8.24769 107.627 8.45387C108.045 8.86625 108.253 9.27862 108.253 10.1034V13.1961H108.045Z" fill="white"/>
  4636. <path d="M115.553 9.07224H114.302V11.5465C114.302 12.165 114.51 12.3712 114.927 12.3712C115.136 12.3712 115.345 12.3712 115.345 12.3712V13.196C115.136 13.196 114.927 13.4021 114.51 13.4021C114.093 13.4021 113.676 13.196 113.467 12.9898C113.259 12.7836 113.05 12.3712 113.05 11.7527V9.07224H112.216V8.2475H113.05V7.21657L114.093 6.8042V8.2475H115.345V9.07224H115.553Z" fill="white"/>
  4637. <path d="M121.394 13.196H120.351V10.3094C120.351 9.48465 119.934 9.07228 119.308 9.07228C118.891 9.07228 118.474 9.27846 118.266 9.89702C118.266 10.1032 118.266 10.1032 118.266 10.3094V13.196H117.223V5.97949H118.266V8.86609C118.683 8.24753 119.1 8.04135 119.726 8.04135C120.143 8.04135 120.56 8.24753 120.769 8.45372C121.186 8.86609 121.394 9.27846 121.394 10.1032V13.196Z" fill="white"/>
  4638. <path d="M127.443 10.5157C127.443 10.7219 127.443 10.9281 127.443 10.9281H124.105C124.105 11.3405 124.314 11.7528 124.523 11.959C124.94 12.3714 125.148 12.3714 125.565 12.3714C125.983 12.3714 126.608 12.3714 126.817 12.1652L127.234 12.99C126.817 13.1961 126.191 13.1961 125.565 13.1961C124.731 13.1961 124.105 12.99 123.688 12.5776C123.271 12.1652 123.062 11.5467 123.062 10.7219C123.062 9.89717 123.271 9.27862 123.688 8.86625C124.105 8.24769 124.731 8.0415 125.357 8.0415C125.983 8.0415 126.608 8.24769 127.026 8.86625C127.234 9.27862 127.443 9.89717 127.443 10.5157ZM126.4 10.1034C126.4 9.69099 126.4 9.4848 126.191 9.27862C125.983 9.07243 125.774 8.86625 125.357 8.86625C124.94 8.86625 124.731 9.07243 124.523 9.27862C124.314 9.4848 124.314 9.89717 124.105 10.1034H126.4Z" fill="white"/>
  4639. </g>
  4640. <defs>
  4641. <clipPath id="clip0_173_15439">
  4642. <rect width="141" height="40" fill="white"/>
  4643. </clipPath>
  4644. </defs>
  4645. </svg>
  4646. </file>
  4647. <file path="assets/img/btn_goolge_play.svg">
  4648. <svg width="132" height="40" viewBox="0 0 132 40" fill="none" xmlns="http://www.w3.org/2000/svg">
  4649. <g clip-path="url(#clip0_173_15406)">
  4650. <path d="M127.172 39.9999H4.81711C2.11953 39.9999 0 37.6354 0 35.0738V4.9261C0 2.16748 2.11953 0 4.81711 0H127.172C129.869 0 131.989 2.16748 131.989 4.9261V34.8768C132.181 37.6354 129.869 39.9999 127.172 39.9999Z" fill="black"/>
  4651. <path d="M46.4361 10.2462C46.4361 11.0344 46.2434 11.8226 45.6654 12.2167C45.0873 12.8078 44.3166 13.2019 43.5458 13.2019C42.7751 13.2019 42.0044 12.8078 41.4263 12.2167C40.8483 11.6255 40.4629 10.8374 40.4629 10.0492C40.4629 9.06397 40.8483 8.47284 41.4263 7.8817C42.0044 7.29057 42.7751 6.89648 43.5458 6.89648C43.9312 6.89648 44.3166 6.89649 44.7019 7.09353C45.0873 7.29057 45.4727 7.48762 45.6654 7.68466L45.0873 8.27579C44.7019 7.8817 44.1239 7.48762 43.5458 7.48762C42.9678 7.48762 42.3897 7.68466 42.0044 8.07875C41.619 8.47284 41.2336 9.06397 41.2336 9.85214C41.2336 10.6403 41.4263 11.2314 42.0044 11.6255C42.3897 12.2167 42.9678 12.4137 43.5458 12.4137C44.1239 12.4137 44.7019 12.2167 45.28 11.8226C45.4727 11.6255 45.6654 11.0344 45.858 10.6403H43.7385V9.85214H46.6288C46.4361 9.85214 46.4361 10.0492 46.4361 10.2462Z" fill="white"/>
  4652. <path d="M46.4374 10.2462C46.2447 11.0344 46.052 11.6255 45.6666 12.2167C45.0886 12.8078 44.5105 13.0048 43.5471 13.0048C42.7764 13.0048 42.0056 12.8078 41.4276 12.2167C40.8495 11.6255 40.6569 10.8374 40.6569 10.0492C40.6569 9.26101 40.8495 8.47284 41.4276 7.8817C42.0056 7.29057 42.7764 7.09353 43.5471 7.09353C43.9325 7.09353 44.3179 7.09353 44.7032 7.29057C45.0886 7.48762 45.2813 7.68466 45.6666 7.8817L45.0886 8.47284C44.7032 7.8817 44.1252 7.68466 43.3544 7.68466C42.7764 7.68466 42.1983 7.8817 41.6203 8.47284C41.2349 8.86692 40.8495 9.45806 40.8495 10.2462C40.8495 11.0344 41.0422 11.6255 41.6203 12.0196C42.391 12.2167 42.9691 12.4137 43.5471 12.4137C44.3179 12.4137 44.8959 12.2167 45.2813 11.6255C45.6666 11.2314 45.6666 10.8374 45.8593 10.4433V10.2462H43.7398V9.85214H46.4374H46.2447C46.2447 9.85214 46.2447 10.0492 46.4374 10.2462C46.6301 10.0492 46.4374 9.85214 46.4374 9.85214H43.3544V10.8374H45.6666V10.4433H45.474C45.474 11.0344 45.2813 11.2314 45.0886 11.6255C44.7032 12.0196 44.1252 12.2167 43.5471 12.2167C42.9691 12.2167 42.391 12.0196 42.0056 11.6255C41.6203 11.2314 41.4276 10.6403 41.4276 10.0492C41.4276 9.45806 41.6203 8.86692 42.0056 8.47284C42.391 8.07875 42.9691 7.8817 43.5471 7.8817C44.1252 7.8817 44.7032 8.07875 45.0886 8.47284L45.6666 7.8817C45.474 7.68466 45.0886 7.29057 44.7032 7.09353C44.3179 6.89649 43.9325 6.89648 43.5471 6.89648C42.5837 6.89648 42.0056 7.29057 41.2349 7.8817C40.6569 8.47284 40.2715 9.26101 40.2715 10.2462C40.2715 11.2315 40.6569 12.0196 41.2349 12.6108C41.813 13.2019 42.5837 13.596 43.5471 13.596C44.5105 13.596 45.2813 13.2019 45.8593 12.6108C46.2447 11.8226 46.4374 11.0344 46.4374 10.2462Z" fill="white"/>
  4653. <path d="M50.8687 7.68466H48.1711V9.6551H50.676V10.2462H48.1711V12.2167H50.8687V13.0048H47.4004V6.89648H50.8687V7.68466Z" fill="white"/>
  4654. <path d="M50.8687 7.68466H48.1711V9.6551H50.4833V10.2462H48.1711V12.4137H50.8687V12.8078H47.5931V7.09353H50.8687V7.68466H51.0614V6.89648H47.4004V13.0048H51.0614V12.2167H48.3638V10.4433H50.676V9.45806H48.3638V7.8817H51.0614V7.68466H50.8687Z" fill="white"/>
  4655. <path d="M54.1436 13.0048H53.3728V7.68466H51.6387V6.89648H55.685V7.68466H54.1436V13.0048Z" fill="white"/>
  4656. <path d="M54.1436 13.0048V12.8078H53.3728V7.68466H51.8314V7.09353H55.685V7.68466H53.9509V13.0048H54.1436V12.8078V13.0048V7.8817H55.8777V6.89648H51.6387V7.8817H53.1801V13.0048H54.1436Z" fill="white"/>
  4657. <path d="M59.3469 6.89648H58.5762V12.8078H59.3469V6.89648Z" fill="white"/>
  4658. <path d="M58.5762 13.0048H58.7689V7.09353H59.3469V12.8078H58.5762V13.0048H58.7689H58.5762H59.5396V6.89648H58.5762V13.0048Z" fill="white"/>
  4659. <path d="M62.8145 13.0048H62.0437V7.68466H60.3096V6.89648H64.3559V7.68466H62.8145V13.0048Z" fill="white"/>
  4660. <path d="M62.8145 13.0048V12.8078H62.0437V7.68466H60.5023V7.09353H64.3559V7.68466H62.6218V13.0048H62.8145V12.8078V13.0048V7.8817H64.5486V6.89648H60.3096V7.8817H61.851V13.0048H62.8145Z" fill="white"/>
  4661. <path d="M72.0645 12.2167C71.4864 12.8078 70.7157 13.2019 69.945 13.2019C69.1742 13.2019 68.4035 12.8078 67.8254 12.2167C67.2474 11.6255 67.0547 10.8374 67.0547 10.0492C67.0547 9.26101 67.2474 8.47284 67.8254 7.8817C68.4035 7.29057 69.1742 6.89648 69.945 6.89648C70.7157 6.89648 71.4864 7.29057 72.0645 7.8817C72.6425 8.47284 73.0279 9.26101 73.0279 10.0492C72.8352 10.8374 72.6425 11.6255 72.0645 12.2167ZM68.2108 11.6255C68.7889 12.2167 69.1742 12.4137 69.945 12.4137C70.523 12.4137 71.1011 12.2167 71.4864 11.8226C71.8718 11.4285 72.0645 10.8374 72.0645 10.0492C72.0645 9.26101 71.8718 8.86692 71.4864 8.27579C71.1011 7.8817 70.523 7.68466 69.945 7.68466C69.3669 7.68466 68.7888 7.8817 68.4035 8.27579C68.0181 8.66988 67.8254 9.26101 67.8254 10.0492C67.8254 10.8374 67.8254 11.2314 68.2108 11.6255Z" fill="white"/>
  4662. <path d="M72.0634 12.2164C71.4854 12.8076 70.7146 13.0046 69.9439 13.0046C69.1732 13.0046 68.4024 12.8076 67.8244 12.2164C67.2463 11.6253 67.0536 10.8371 67.0536 10.049C67.0536 9.26079 67.2463 8.47261 67.8244 7.88148C68.4024 7.29035 68.9805 7.09331 69.9439 7.09331C70.7146 7.09331 71.4854 7.29035 72.0634 7.88148C72.6415 8.47261 72.8342 9.26079 72.8342 10.049C72.8342 10.8371 72.4488 11.6253 72.0634 12.2164C72.6415 11.6253 73.0269 10.8371 73.0269 10.049C73.0269 9.06375 72.6415 8.47261 72.0634 7.68444C71.4854 7.09331 70.7146 6.69922 69.7512 6.69922C68.7878 6.69922 68.2097 7.09331 67.439 7.68444C66.861 8.27557 66.4756 9.06375 66.4756 10.049C66.4756 11.0342 66.861 11.6253 67.439 12.4135C68.0171 13.0046 68.7878 13.3987 69.7512 13.3987C70.7146 13.2017 71.4854 12.8076 72.0634 12.2164ZM68.2097 11.6253C68.5951 12.2164 69.1732 12.4135 69.9439 12.4135C70.522 12.4135 71.1 12.2164 71.6781 11.6253C72.0634 11.2312 72.4488 10.6401 72.4488 9.85192C72.4488 9.06375 72.2561 8.47261 71.6781 8.07853C71.2927 7.68444 70.7146 7.29035 69.9439 7.29035C69.3658 7.29035 68.7878 7.48739 68.2097 8.07853C67.8244 8.66966 67.439 9.26079 67.439 10.049C67.439 10.6401 67.8244 11.2312 68.2097 11.6253C67.8244 11.0342 67.6317 10.6401 67.6317 9.85192C67.6317 9.26079 67.8244 8.66966 68.2097 8.27557C68.5951 7.88148 69.1732 7.68444 69.7512 7.68444C70.3293 7.68444 70.9073 7.88148 71.2927 8.27557C71.6781 8.66966 71.8707 9.26079 71.8707 9.85192C71.8707 10.4431 71.6781 11.0342 71.2927 11.4283C70.9073 11.8224 70.3293 12.0194 69.7512 12.0194C69.3659 12.2164 68.7878 12.0194 68.2097 11.6253Z" fill="white"/>
  4663. <path d="M73.9922 13.0048V6.89648H74.9556L77.6532 11.6255H77.8459L77.6532 10.4433V6.89648H78.4239V13.0048H77.6532L74.7629 8.07875V9.26101V13.0048H73.9922Z" fill="white"/>
  4664. <path d="M73.9896 13.0048V7.09353H74.7603L77.6506 11.8226H77.8433V10.4433V7.09353H78.4213V12.8078H77.6506L74.7603 7.8817H74.5676V9.26101V12.8078H73.9896V13.0048H74.7603V9.26101V8.07875H74.5676L77.6506 13.0048H78.614V6.89648H77.6506V10.4433V11.6255H77.8433H77.6506H77.8433L74.953 6.89648H73.7969V13.0048H73.9896Z" fill="white"/>
  4665. <path d="M66.6676 21.675C64.3554 21.675 62.4285 23.4484 62.4285 26.01C62.4285 28.3745 64.3554 30.345 66.6676 30.345C68.9798 30.345 70.9066 28.5716 70.9066 26.01C70.9066 23.4484 68.9798 21.675 66.6676 21.675ZM66.6676 28.5716C65.3188 28.5716 64.3554 27.5863 64.3554 26.01C64.3554 24.4336 65.5115 23.4484 66.6676 23.4484C67.8237 23.4484 68.9798 24.4336 68.9798 26.01C68.9798 27.5863 68.0164 28.5716 66.6676 28.5716ZM57.6114 21.675C55.2992 21.675 53.3724 23.4484 53.3724 26.01C53.3724 28.3745 55.2992 30.345 57.6114 30.345C59.9236 30.345 61.8505 28.5716 61.8505 26.01C61.6578 23.4484 59.9236 21.675 57.6114 21.675ZM57.6114 28.5716C56.2626 28.5716 55.2992 27.5863 55.2992 26.01C55.2992 24.4336 56.4553 23.4484 57.6114 23.4484C58.9602 23.4484 59.9236 24.4336 59.9236 26.01C59.9236 27.5863 58.7675 28.5716 57.6114 28.5716ZM46.6284 23.0543V24.8277H50.8675C50.6748 25.813 50.4821 26.6011 49.904 27.1923C49.326 27.7834 48.3626 28.5716 46.6284 28.5716C44.1235 28.5716 42.004 26.4041 42.004 23.8425C42.004 21.0839 44.1235 19.1135 46.6284 19.1135C47.9772 19.1135 49.1333 19.7046 49.904 20.4928L51.0602 19.3105C50.0967 18.3253 48.5553 17.5371 46.6284 17.5371C43.1601 17.5371 40.0771 20.4928 40.0771 24.2366C40.0771 27.7834 43.1601 30.9361 46.6284 30.9361C48.5553 30.9361 50.0967 30.345 51.0602 29.1627C52.2163 27.9804 52.6016 26.207 52.6016 25.0248C52.6016 24.6307 52.6016 24.2366 52.6016 23.8425H46.6284V23.0543ZM91.1385 24.4336C90.7531 23.4484 89.7897 21.675 87.6702 21.675C85.5506 21.675 83.8165 23.4484 83.8165 26.01C83.8165 28.3745 85.5506 30.345 87.8629 30.345C89.7897 30.345 90.9458 29.1627 91.3312 28.3745L89.9824 27.3893C89.597 28.1775 88.8263 28.5716 87.8629 28.5716C86.8994 28.5716 86.3214 28.1775 85.936 27.1923L91.5239 24.8277L91.1385 24.4336ZM85.358 25.813C85.358 24.2366 86.5141 23.2514 87.4775 23.2514C88.2482 23.2514 88.8263 23.6455 89.019 24.2366L85.358 25.813ZM80.9262 29.9509H82.6604V17.5371H80.9262V29.9509ZM77.8433 22.6602C77.4579 22.0691 76.4945 21.675 75.5311 21.675C73.4115 21.675 71.4847 23.4484 71.4847 26.01C71.4847 28.3745 73.4115 30.345 75.5311 30.345C76.4945 30.345 77.2652 29.9509 77.6506 29.3597V29.9509C77.6506 31.5272 76.8798 32.5124 75.3384 32.5124C74.1823 32.5124 73.6042 31.7243 73.2188 30.9361L71.6774 31.5272C72.0627 32.7095 73.4115 34.0888 75.3384 34.0888C77.4579 34.0888 79.3847 32.7095 79.3847 29.7538V22.0691H77.6506V22.6602H77.8433ZM75.7237 28.5716C74.375 28.5716 73.4115 27.5863 73.4115 26.01C73.4115 24.4336 74.375 23.4484 75.7237 23.4484C76.8798 23.4484 78.036 24.6307 78.036 26.01C78.036 27.3893 77.0725 28.5716 75.7237 28.5716ZM99.6166 17.5371H95.1849V29.9509H96.919V25.2218H99.4239C101.543 25.2218 103.47 23.6455 103.47 21.2809C103.663 18.9164 101.736 17.5371 99.6166 17.5371ZM99.6166 23.4484H97.1117V19.1135H99.6166C100.965 19.1135 101.736 20.2957 101.736 21.2809C101.736 22.2662 100.965 23.4484 99.6166 23.4484ZM110.985 21.675C109.636 21.675 108.287 22.2662 107.709 23.6455L109.251 24.4336C109.636 23.6455 110.214 23.4484 110.985 23.4484C111.948 23.4484 112.912 24.0396 112.912 25.0248V25.2218C112.526 25.0248 111.948 24.8277 110.985 24.8277C109.251 24.8277 107.517 25.813 107.517 27.5863C107.517 29.3597 108.865 30.345 110.6 30.345C111.756 30.345 112.526 29.7538 112.912 29.1627V30.1479H114.646V25.4189C114.646 22.8573 113.104 21.675 110.985 21.675ZM110.792 28.5716C110.214 28.5716 109.443 28.1775 109.443 27.5863C109.443 26.6011 110.407 26.207 111.37 26.207C112.141 26.207 112.526 26.4041 113.104 26.6011C112.719 27.7834 111.756 28.5716 110.792 28.5716ZM121.005 22.0691L118.885 27.5863L116.765 22.0691H114.839L118.114 29.5568L116.187 33.6947H118.114L123.124 21.8721H121.005V22.0691ZM104.626 29.9509H106.361V17.5371H104.626V29.9509Z" fill="white"/>
  4666. <path d="M10.2115 7.48779C10.0189 7.88188 9.82617 8.27597 9.82617 8.8671V30.936C9.82617 31.5271 10.0189 32.1183 10.2115 32.3153L22.3507 19.9016V19.7045L10.2115 7.48779Z" fill="#5AC9F4"/>
  4667. <mask id="mask0_173_15406" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="22" y="15" width="11" height="10">
  4668. <path d="M26.394 24.2361L22.3477 20.0981V19.9011L26.394 15.7632L31.2111 18.5218C32.5599 19.31 32.5599 20.6893 31.2111 21.4775L26.394 24.2361Z" fill="white"/>
  4669. </mask>
  4670. <g mask="url(#mask0_173_15406)">
  4671. <path d="M32.5599 15.7632H22.3477V24.2361H32.5599V15.7632Z" fill="url(#paint0_linear_173_15406)"/>
  4672. </g>
  4673. <mask id="mask1_173_15406" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="10" y="20" width="17" height="13">
  4674. <path d="M26.5898 24.2361L22.5434 20.0981L10.4043 32.5119C10.7897 32.906 11.5604 33.103 12.5238 32.5119L26.5898 24.2361Z" fill="white"/>
  4675. </mask>
  4676. <g mask="url(#mask1_173_15406)">
  4677. <path d="M32.9479 26.4033L18.3039 41.3786L3.85254 26.4033L18.3039 11.625L32.9479 26.4033Z" fill="url(#paint1_linear_173_15406)"/>
  4678. </g>
  4679. <mask id="mask2_173_15406" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="10" y="7" width="17" height="13">
  4680. <path d="M26.5901 15.7638L12.3314 7.48795C11.5607 7.09386 10.79 7.09386 10.2119 7.48795L22.351 19.9017L26.5901 15.7638Z" fill="white"/>
  4681. </mask>
  4682. <g mask="url(#mask2_173_15406)">
  4683. <path d="M18.3058 -1.37891L32.9498 13.3994L18.3058 28.3747L3.85449 13.3994L18.3058 -1.37891Z" fill="url(#paint2_linear_173_15406)"/>
  4684. </g>
  4685. </g>
  4686. <defs>
  4687. <linearGradient id="paint0_linear_173_15406" x1="30.4183" y1="19.9704" x2="6.76239" y2="19.9704" gradientUnits="userSpaceOnUse">
  4688. <stop stop-color="#FEE000"/>
  4689. <stop offset="0.1707" stop-color="#FCD107"/>
  4690. <stop offset="0.5375" stop-color="#FAB416"/>
  4691. <stop offset="0.8265" stop-color="#F9A21A"/>
  4692. <stop offset="1" stop-color="#F99B1B"/>
  4693. </linearGradient>
  4694. <linearGradient id="paint1_linear_173_15406" x1="23.3859" y1="21.3481" x2="0.634332" y2="43.5963" gradientUnits="userSpaceOnUse">
  4695. <stop stop-color="#EF4547"/>
  4696. <stop offset="1" stop-color="#C6176D"/>
  4697. </linearGradient>
  4698. <linearGradient id="paint2_linear_173_15406" x1="1.03255" y1="-4.25973" x2="19.6088" y2="13.9055" gradientUnits="userSpaceOnUse">
  4699. <stop stop-color="#269E6F"/>
  4700. <stop offset="0.3166" stop-color="#4DAB6D"/>
  4701. <stop offset="0.7397" stop-color="#6ABA6A"/>
  4702. <stop offset="1" stop-color="#74C168"/>
  4703. </linearGradient>
  4704. <clipPath id="clip0_173_15406">
  4705. <rect width="132" height="40" fill="white"/>
  4706. </clipPath>
  4707. </defs>
  4708. </svg>
  4709. </file>
  4710. <file path="assets/img/db_set_list01.svg">
  4711. <svg width="260" height="145" viewBox="0 0 260 145" fill="none" xmlns="http://www.w3.org/2000/svg">
  4712. <rect x="0.5" y="0.5" width="259" height="144" rx="9.5" fill="white"/>
  4713. <rect x="0.5" y="0.5" width="259" height="144" rx="9.5" stroke="#E1E1E1"/>
  4714. <rect x="10" y="10" width="115" height="58" rx="5" fill="#6CA0F0"/>
  4715. <path d="M57.5845 44.154C55.5275 44.154 53.8665 42.68 53.8665 39.963C53.8665 37.279 55.5825 35.717 57.6505 35.717C58.6845 35.717 59.5095 36.201 60.0375 36.751L59.1795 37.796C58.7615 37.389 58.2995 37.114 57.6725 37.114C56.4515 37.114 55.5275 38.17 55.5275 39.908C55.5275 41.69 56.3525 42.746 57.6505 42.746C58.3435 42.746 58.8935 42.416 59.3225 41.943L60.1805 42.966C59.5095 43.747 58.6405 44.154 57.5845 44.154ZM64.2321 44.154C62.0651 44.154 60.5911 42.548 60.5911 39.897C60.5911 37.246 62.0651 35.717 64.2321 35.717C66.3881 35.717 67.8621 37.257 67.8621 39.897C67.8621 42.548 66.3881 44.154 64.2321 44.154ZM64.2321 42.746C65.4421 42.746 66.2121 41.635 66.2121 39.897C66.2121 38.159 65.4421 37.114 64.2321 37.114C63.0111 37.114 62.2521 38.159 62.2521 39.897C62.2521 41.635 63.0111 42.746 64.2321 42.746ZM69.4629 44V35.86H72.2899C73.9949 35.86 75.3479 36.454 75.3479 38.324C75.3479 40.139 73.9949 40.931 72.2899 40.931H71.0909V44H69.4629ZM71.0909 39.644H72.1359C73.1919 39.644 73.7639 39.193 73.7639 38.324C73.7639 37.455 73.1919 37.158 72.1359 37.158H71.0909V39.644ZM73.8849 44L71.9929 40.513L73.1259 39.49L75.6999 44H73.8849ZM76.961 44V35.86H81.955V37.213H78.589V39.094H81.438V40.469H78.589V42.636H82.076V44H76.961Z" fill="white"/>
  4716. <rect x="10" y="78" width="115" height="57" rx="5" fill="#6CA0F0"/>
  4717. <path d="M59.2733 101.782H60.7473V111.968H59.2733V101.782ZM60.3623 105.676H62.1553V106.875H60.3623V105.676ZM56.6003 102.838H58.0303C58.0303 105.896 56.8643 108.514 53.4763 110.219L52.6623 109.108C55.3353 107.722 56.6003 105.852 56.6003 103.091V102.838ZM53.2233 102.838H57.3483V104.015H53.2233V102.838ZM69.8764 101.793H71.3504V107.271H69.8764V101.793ZM64.5744 107.711H66.0154V108.657H69.8984V107.711H71.3504V111.869H64.5744V107.711ZM66.0154 109.779V110.703H69.8984V109.779H66.0154ZM65.8064 102.211C67.3904 102.211 68.5674 103.212 68.5674 104.62C68.5674 106.028 67.3904 107.029 65.8064 107.029C64.2224 107.029 63.0344 106.028 63.0344 104.62C63.0344 103.212 64.2224 102.211 65.8064 102.211ZM65.8064 103.421C65.0254 103.421 64.4644 103.872 64.4644 104.62C64.4644 105.379 65.0254 105.819 65.8064 105.819C66.5764 105.819 67.1374 105.379 67.1374 104.62C67.1374 103.872 66.5764 103.421 65.8064 103.421ZM75.2876 103.399H76.4426V104.543C76.4426 106.842 75.4746 109.185 73.6046 110.065L72.7796 108.91C74.4626 108.118 75.2876 106.215 75.2876 104.543V103.399ZM75.5956 103.399H76.7506V104.543C76.7506 106.083 77.5426 107.887 79.2146 108.657L78.4116 109.812C76.5416 108.943 75.5956 106.71 75.5956 104.543V103.399ZM73.1756 102.772H78.7636V103.971H73.1756V102.772ZM79.5116 101.793H80.9856V111.979H79.5116V101.793ZM80.6556 105.676H82.4596V106.886H80.6556V105.676Z" fill="white"/>
  4718. <rect x="135" y="10" width="115" height="125" rx="5" fill="#6B91CB"/>
  4719. <path d="M182.184 77V68.86H185.011C186.716 68.86 188.069 69.454 188.069 71.324C188.069 73.139 186.716 73.931 185.011 73.931H183.812V77H182.184ZM183.812 72.644H184.857C185.913 72.644 186.485 72.193 186.485 71.324C186.485 70.455 185.913 70.158 184.857 70.158H183.812V72.644ZM186.606 77L184.714 73.513L185.847 72.49L188.421 77H186.606ZM188.487 77L191.094 68.86H193.008L195.615 77H193.91L192.744 72.765C192.502 71.918 192.271 70.972 192.04 70.103H191.996C191.776 70.983 191.545 71.918 191.303 72.765L190.137 77H188.487ZM190.104 74.91V73.656H193.976V74.91H190.104ZM196.579 77V68.86H198.229L200.594 73.205L201.419 74.965H201.474C201.386 74.118 201.254 73.029 201.254 72.105V68.86H202.805V77H201.144L198.79 72.644L197.965 70.906H197.91C197.987 71.775 198.119 72.798 198.119 73.744V77H196.579Z" fill="white"/>
  4720. </svg>
  4721. </file>
  4722. <file path="assets/img/db_set_list02.svg">
  4723. <svg width="260" height="145" viewBox="0 0 260 145" fill="none" xmlns="http://www.w3.org/2000/svg">
  4724. <rect x="0.5" y="0.5" width="259" height="144" rx="9.5" fill="white"/>
  4725. <rect x="0.5" y="0.5" width="259" height="144" rx="9.5" stroke="#E1E1E1"/>
  4726. <rect x="10" y="10" width="115" height="58" rx="5" fill="#6CA0F0"/>
  4727. <path d="M57.5845 44.154C55.5275 44.154 53.8665 42.68 53.8665 39.963C53.8665 37.279 55.5825 35.717 57.6505 35.717C58.6845 35.717 59.5095 36.201 60.0375 36.751L59.1795 37.796C58.7615 37.389 58.2995 37.114 57.6725 37.114C56.4515 37.114 55.5275 38.17 55.5275 39.908C55.5275 41.69 56.3525 42.746 57.6505 42.746C58.3435 42.746 58.8935 42.416 59.3225 41.943L60.1805 42.966C59.5095 43.747 58.6405 44.154 57.5845 44.154ZM64.2321 44.154C62.0651 44.154 60.5911 42.548 60.5911 39.897C60.5911 37.246 62.0651 35.717 64.2321 35.717C66.3881 35.717 67.8621 37.257 67.8621 39.897C67.8621 42.548 66.3881 44.154 64.2321 44.154ZM64.2321 42.746C65.4421 42.746 66.2121 41.635 66.2121 39.897C66.2121 38.159 65.4421 37.114 64.2321 37.114C63.0111 37.114 62.2521 38.159 62.2521 39.897C62.2521 41.635 63.0111 42.746 64.2321 42.746ZM69.4629 44V35.86H72.2899C73.9949 35.86 75.3479 36.454 75.3479 38.324C75.3479 40.139 73.9949 40.931 72.2899 40.931H71.0909V44H69.4629ZM71.0909 39.644H72.1359C73.1919 39.644 73.7639 39.193 73.7639 38.324C73.7639 37.455 73.1919 37.158 72.1359 37.158H71.0909V39.644ZM73.8849 44L71.9929 40.513L73.1259 39.49L75.6999 44H73.8849ZM76.961 44V35.86H81.955V37.213H78.589V39.094H81.438V40.469H78.589V42.636H82.076V44H76.961Z" fill="white"/>
  4728. <rect x="135" y="10" width="115" height="58" rx="5" fill="#6CA0F0"/>
  4729. <path d="M185.273 34.782H186.747V44.968H185.273V34.782ZM186.362 38.676H188.155V39.875H186.362V38.676ZM182.6 35.838H184.03C184.03 38.896 182.864 41.514 179.476 43.219L178.662 42.108C181.335 40.722 182.6 38.852 182.6 36.091V35.838ZM179.223 35.838H183.348V37.015H179.223V35.838ZM195.876 34.793H197.35V40.271H195.876V34.793ZM190.574 40.711H192.015V41.657H195.898V40.711H197.35V44.869H190.574V40.711ZM192.015 42.779V43.703H195.898V42.779H192.015ZM191.806 35.211C193.39 35.211 194.567 36.212 194.567 37.62C194.567 39.028 193.39 40.029 191.806 40.029C190.222 40.029 189.034 39.028 189.034 37.62C189.034 36.212 190.222 35.211 191.806 35.211ZM191.806 36.421C191.025 36.421 190.464 36.872 190.464 37.62C190.464 38.379 191.025 38.819 191.806 38.819C192.576 38.819 193.137 38.379 193.137 37.62C193.137 36.872 192.576 36.421 191.806 36.421ZM201.288 36.399H202.443V37.543C202.443 39.842 201.475 42.185 199.605 43.065L198.78 41.91C200.463 41.118 201.288 39.215 201.288 37.543V36.399ZM201.596 36.399H202.751V37.543C202.751 39.083 203.543 40.887 205.215 41.657L204.412 42.812C202.542 41.943 201.596 39.71 201.596 37.543V36.399ZM199.176 35.772H204.764V36.971H199.176V35.772ZM205.512 34.793H206.986V44.979H205.512V34.793ZM206.656 38.676H208.46V39.886H206.656V38.676Z" fill="white"/>
  4730. <rect x="10" y="78" width="240" height="57" rx="5" fill="#6B91CB"/>
  4731. <path d="M119.184 111V102.86H122.011C123.716 102.86 125.069 103.454 125.069 105.324C125.069 107.139 123.716 107.931 122.011 107.931H120.812V111H119.184ZM120.812 106.644H121.857C122.913 106.644 123.485 106.193 123.485 105.324C123.485 104.455 122.913 104.158 121.857 104.158H120.812V106.644ZM123.606 111L121.714 107.513L122.847 106.49L125.421 111H123.606ZM125.487 111L128.094 102.86H130.008L132.615 111H130.91L129.744 106.765C129.502 105.918 129.271 104.972 129.04 104.103H128.996C128.776 104.983 128.545 105.918 128.303 106.765L127.137 111H125.487ZM127.104 108.91V107.656H130.976V108.91H127.104ZM133.579 111V102.86H135.229L137.594 107.205L138.419 108.965H138.474C138.386 108.118 138.254 107.029 138.254 106.105V102.86H139.805V111H138.144L135.79 106.644L134.965 104.906H134.91C134.987 105.775 135.119 106.798 135.119 107.744V111H133.579Z" fill="white"/>
  4732. </svg>
  4733. </file>
  4734. <file path="assets/img/db_set_list03.svg">
  4735. <svg width="260" height="145" viewBox="0 0 260 145" fill="none" xmlns="http://www.w3.org/2000/svg">
  4736. <rect x="0.5" y="0.5" width="259" height="144" rx="9.5" fill="white"/>
  4737. <rect x="0.5" y="0.5" width="259" height="144" rx="9.5" stroke="#E1E1E1"/>
  4738. <rect x="10" y="10" width="65" height="125" rx="5" fill="#6CA0F0"/>
  4739. <path d="M32.5845 78.154C30.5275 78.154 28.8665 76.68 28.8665 73.963C28.8665 71.279 30.5825 69.717 32.6505 69.717C33.6845 69.717 34.5095 70.201 35.0375 70.751L34.1795 71.796C33.7615 71.389 33.2995 71.114 32.6725 71.114C31.4515 71.114 30.5275 72.17 30.5275 73.908C30.5275 75.69 31.3525 76.746 32.6505 76.746C33.3435 76.746 33.8935 76.416 34.3225 75.943L35.1805 76.966C34.5095 77.747 33.6405 78.154 32.5845 78.154ZM39.2321 78.154C37.0651 78.154 35.5911 76.548 35.5911 73.897C35.5911 71.246 37.0651 69.717 39.2321 69.717C41.3881 69.717 42.8621 71.257 42.8621 73.897C42.8621 76.548 41.3881 78.154 39.2321 78.154ZM39.2321 76.746C40.4421 76.746 41.2121 75.635 41.2121 73.897C41.2121 72.159 40.4421 71.114 39.2321 71.114C38.0111 71.114 37.2521 72.159 37.2521 73.897C37.2521 75.635 38.0111 76.746 39.2321 76.746ZM44.4629 78V69.86H47.2899C48.9949 69.86 50.3479 70.454 50.3479 72.324C50.3479 74.139 48.9949 74.931 47.2899 74.931H46.0909V78H44.4629ZM46.0909 73.644H47.1359C48.1919 73.644 48.7639 73.193 48.7639 72.324C48.7639 71.455 48.1919 71.158 47.1359 71.158H46.0909V73.644ZM48.8849 78L46.9929 74.513L48.1259 73.49L50.6999 78H48.8849ZM51.961 78V69.86H56.955V71.213H53.589V73.094H56.438V74.469H53.589V76.636H57.076V78H51.961Z" fill="white"/>
  4740. <rect x="85" y="10" width="91" height="125" rx="5" fill="#6B91CB"/>
  4741. <path d="M120.184 77V68.86H123.011C124.716 68.86 126.069 69.454 126.069 71.324C126.069 73.139 124.716 73.931 123.011 73.931H121.812V77H120.184ZM121.812 72.644H122.857C123.913 72.644 124.485 72.193 124.485 71.324C124.485 70.455 123.913 70.158 122.857 70.158H121.812V72.644ZM124.606 77L122.714 73.513L123.847 72.49L126.421 77H124.606ZM126.487 77L129.094 68.86H131.008L133.615 77H131.91L130.744 72.765C130.502 71.918 130.271 70.972 130.04 70.103H129.996C129.776 70.983 129.545 71.918 129.303 72.765L128.137 77H126.487ZM128.104 74.91V73.656H131.976V74.91H128.104ZM134.579 77V68.86H136.229L138.594 73.205L139.419 74.965H139.474C139.386 74.118 139.254 73.029 139.254 72.105V68.86H140.805V77H139.144L136.79 72.644L135.965 70.906H135.91C135.987 71.775 136.119 72.798 136.119 73.744V77H134.579Z" fill="white"/>
  4742. <path d="M185 15C185 12.2386 187.239 10 190 10H245C247.761 10 250 12.2386 250 15V130C250 132.761 247.761 135 245 135H190C187.239 135 185 132.761 185 130V15Z" fill="#6CA0F0"/>
  4743. <path d="M210.273 68.782H211.747V78.968H210.273V68.782ZM211.362 72.676H213.155V73.875H211.362V72.676ZM207.6 69.838H209.03C209.03 72.896 207.864 75.514 204.476 77.219L203.662 76.108C206.335 74.722 207.6 72.852 207.6 70.091V69.838ZM204.223 69.838H208.348V71.015H204.223V69.838ZM220.876 68.793H222.35V74.271H220.876V68.793ZM215.574 74.711H217.015V75.657H220.898V74.711H222.35V78.869H215.574V74.711ZM217.015 76.779V77.703H220.898V76.779H217.015ZM216.806 69.211C218.39 69.211 219.567 70.212 219.567 71.62C219.567 73.028 218.39 74.029 216.806 74.029C215.222 74.029 214.034 73.028 214.034 71.62C214.034 70.212 215.222 69.211 216.806 69.211ZM216.806 70.421C216.025 70.421 215.464 70.872 215.464 71.62C215.464 72.379 216.025 72.819 216.806 72.819C217.576 72.819 218.137 72.379 218.137 71.62C218.137 70.872 217.576 70.421 216.806 70.421ZM226.288 70.399H227.443V71.543C227.443 73.842 226.475 76.185 224.605 77.065L223.78 75.91C225.463 75.118 226.288 73.215 226.288 71.543V70.399ZM226.596 70.399H227.751V71.543C227.751 73.083 228.543 74.887 230.215 75.657L229.412 76.812C227.542 75.943 226.596 73.71 226.596 71.543V70.399ZM224.176 69.772H229.764V70.971H224.176V69.772ZM230.512 68.793H231.986V78.979H230.512V68.793ZM231.656 72.676H233.46V73.886H231.656V72.676Z" fill="white"/>
  4744. </svg>
  4745. </file>
  4746. <file path="assets/img/head_flip_btn.svg">
  4747. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  4748. <g id="chevron-left">
  4749. <path id="Vector" d="M11.5 15L6.5 10L11.5 5" stroke="#0B318B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  4750. </g>
  4751. </svg>
  4752. </file>
  4753. <file path="assets/img/ic_add.svg">
  4754. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  4755. <g id="ico / plus">
  4756. <g id="Group">
  4757. <path id="Vector" d="M9.00009 16.875C6.89634 16.875 4.91916 16.056 3.43191 14.5682C1.00078 12.1376 0.423658 8.45156 1.99528 5.39719C2.1376 5.121 2.47622 5.01244 2.75297 5.15419C3.02916 5.29594 3.13828 5.63513 2.99597 5.91188C1.64878 8.53031 2.14322 11.6893 4.22728 13.7728C5.50191 15.048 7.19672 15.75 9.00009 15.75C10.8029 15.75 12.4983 15.048 13.7729 13.7728C15.0475 12.4976 15.7501 10.8028 15.7501 9C15.7501 7.19662 15.0481 5.50181 13.7729 4.22719C12.4977 2.95256 10.8035 2.25 9.00009 2.25C7.19672 2.25 5.50191 2.95256 4.22728 4.22719C4.00735 4.44712 3.65184 4.44712 3.43191 4.22719C3.21197 4.00725 3.21197 3.65175 3.43191 3.43181C4.91916 1.94456 6.89634 1.125 9.00009 1.125C11.1038 1.125 13.0816 1.94456 14.5683 3.43181C16.0561 4.91906 16.8751 6.89625 16.8751 9C16.8751 11.1032 16.0561 13.0809 14.5683 14.5682C13.0816 16.056 11.1038 16.875 9.00009 16.875Z" fill="white"/>
  4758. </g>
  4759. <g id="Group_2">
  4760. <path id="Vector_2" d="M9 12.375C8.6895 12.375 8.4375 12.1236 8.4375 11.8125V6.1875C8.4375 5.877 8.6895 5.625 9 5.625C9.3105 5.625 9.5625 5.877 9.5625 6.1875V11.8125C9.5625 12.1236 9.3105 12.375 9 12.375Z" fill="white"/>
  4761. </g>
  4762. <g id="Group_3">
  4763. <path id="Vector_3" d="M11.8125 9.5625H6.1875C5.877 9.5625 5.625 9.3105 5.625 9C5.625 8.6895 5.877 8.4375 6.1875 8.4375H11.8125C12.1236 8.4375 12.375 8.6895 12.375 9C12.375 9.3105 12.1236 9.5625 11.8125 9.5625Z" fill="white"/>
  4764. </g>
  4765. </g>
  4766. </svg>
  4767. </file>
  4768. <file path="assets/img/ic_allview.svg">
  4769. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  4770. <g id="search">
  4771. <path id="Vector" d="M6.41667 11.0833C8.994 11.0833 11.0833 8.994 11.0833 6.41667C11.0833 3.83934 8.994 1.75 6.41667 1.75C3.83934 1.75 1.75 3.83934 1.75 6.41667C1.75 8.994 3.83934 11.0833 6.41667 11.0833Z" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  4772. <path id="Vector_2" d="M12.2484 12.2504L9.71094 9.71289" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  4773. </g>
  4774. </svg>
  4775. </file>
  4776. <file path="assets/img/ic_arrow_right_chv.svg">
  4777. <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
  4778. <g id="chevron-right">
  4779. <path id="Vector" d="M5.625 11.25L9.375 7.5L5.625 3.75" stroke="#6780A8" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  4780. </g>
  4781. </svg>
  4782. </file>
  4783. <file path="assets/img/ic_avg01.svg">
  4784. <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
  4785. <rect width="40" height="40" rx="20" fill="#F5F5F5"/>
  4786. <g clip-path="url(#clip0_112_28940)">
  4787. <path d="M27.3125 21.125H26.1875V18.875H27.3125C27.4617 18.875 27.6048 18.8157 27.7102 18.7102C27.8157 18.6048 27.875 18.4617 27.875 18.3125C27.875 18.1633 27.8157 18.0202 27.7102 17.9148C27.6048 17.8093 27.4617 17.75 27.3125 17.75H26.1875V14.9375C26.1875 14.6391 26.069 14.353 25.858 14.142C25.647 13.931 25.3609 13.8125 25.0625 13.8125H22.25V12.6875C22.25 12.5383 22.1907 12.3952 22.0852 12.2898C21.9798 12.1843 21.8367 12.125 21.6875 12.125C21.5383 12.125 21.3952 12.1843 21.2898 12.2898C21.1843 12.3952 21.125 12.5383 21.125 12.6875V13.8125H18.875V12.6875C18.875 12.5383 18.8157 12.3952 18.7102 12.2898C18.6048 12.1843 18.4617 12.125 18.3125 12.125C18.1633 12.125 18.0202 12.1843 17.9148 12.2898C17.8093 12.3952 17.75 12.5383 17.75 12.6875V13.8125H14.9375C14.6391 13.8125 14.353 13.931 14.142 14.142C13.931 14.353 13.8125 14.6391 13.8125 14.9375V17.75H12.6875C12.5383 17.75 12.3952 17.8093 12.2898 17.9148C12.1843 18.0202 12.125 18.1633 12.125 18.3125C12.125 18.4617 12.1843 18.6048 12.2898 18.7102C12.3952 18.8157 12.5383 18.875 12.6875 18.875H13.8125V21.125H12.6875C12.5383 21.125 12.3952 21.1843 12.2898 21.2898C12.1843 21.3952 12.125 21.5383 12.125 21.6875C12.125 21.8367 12.1843 21.9798 12.2898 22.0852C12.3952 22.1907 12.5383 22.25 12.6875 22.25H13.8125V25.0625C13.8125 25.3609 13.931 25.647 14.142 25.858C14.353 26.069 14.6391 26.1875 14.9375 26.1875H17.75V27.3125C17.75 27.4617 17.8093 27.6048 17.9148 27.7102C18.0202 27.8157 18.1633 27.875 18.3125 27.875C18.4617 27.875 18.6048 27.8157 18.7102 27.7102C18.8157 27.6048 18.875 27.4617 18.875 27.3125V26.1875H21.125V27.3125C21.125 27.4617 21.1843 27.6048 21.2898 27.7102C21.3952 27.8157 21.5383 27.875 21.6875 27.875C21.8367 27.875 21.9798 27.8157 22.0852 27.7102C22.1907 27.6048 22.25 27.4617 22.25 27.3125V26.1875H25.0625C25.3609 26.1875 25.647 26.069 25.858 25.858C26.069 25.647 26.1875 25.3609 26.1875 25.0625V22.25H27.3125C27.4617 22.25 27.6048 22.1907 27.7102 22.0852C27.8157 21.9798 27.875 21.8367 27.875 21.6875C27.875 21.5383 27.8157 21.3952 27.7102 21.2898C27.6048 21.1843 27.4617 21.125 27.3125 21.125ZM22.5312 21.9688C22.5312 22.1179 22.472 22.261 22.3665 22.3665C22.261 22.472 22.1179 22.5312 21.9688 22.5312H18.0312C17.8821 22.5312 17.739 22.472 17.6335 22.3665C17.528 22.261 17.4688 22.1179 17.4688 21.9688V18.0312C17.4688 17.8821 17.528 17.739 17.6335 17.6335C17.739 17.528 17.8821 17.4688 18.0312 17.4688H21.9688C22.1179 17.4688 22.261 17.528 22.3665 17.6335C22.472 17.739 22.5312 17.8821 22.5312 18.0312V21.9688ZM18.5938 18.5938H21.4062V21.4062H18.5938V18.5938Z" fill="#9DA9BB"/>
  4788. </g>
  4789. <defs>
  4790. <clipPath id="clip0_112_28940">
  4791. <rect width="18" height="18" fill="white" transform="translate(11 11)"/>
  4792. </clipPath>
  4793. </defs>
  4794. </svg>
  4795. </file>
  4796. <file path="assets/img/ic_avg02.svg">
  4797. <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
  4798. <rect width="40" height="40" rx="20" fill="#F5F5F5"/>
  4799. <path d="M22.25 12.5H15.5C14.6727 12.5 14 13.1727 14 14V26C14 26.8272 14.6727 27.5 15.5 27.5H24.5C25.3273 27.5 26 26.8272 26 26V16.25L22.25 12.5ZM17.75 18.5H16.25V15.5H17.75V18.5ZM20 18.5H18.5V15.5H20V18.5ZM22.25 18.5H20.75V15.5H22.25V18.5Z" fill="#9DA9BB"/>
  4800. </svg>
  4801. </file>
  4802. <file path="assets/img/ic_avg03.svg">
  4803. <svg width="20" height="18" viewBox="0 0 20 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  4804. <path d="M16.5344 5.03438L13.9125 2.4125C13.6969 2.1975 13.2219 2 12.8781 2H5C3.89531 2 3 2.89531 3 4V14C3 15.1047 3.89531 16 5 16H15C16.1047 16 17 15.1047 17 14V6.12187C17 5.77812 16.8031 5.30313 16.5344 5.03438ZM10 14C8.89563 14 8 13.1044 8 12C8 10.8956 8.89563 10 10 10C11.1044 10 12 10.8956 12 12C12 13.1044 11.1031 14 10 14ZM13 7.5C13 7.775 12.775 8 12.5 8H5.5C5.22375 8 5 7.775 5 7.5V4.5C5 4.225 5.22375 4 5.5 4H12.5C12.775 4 13 4.225 13 4.5V7.5Z" fill="#9DA9BB"/>
  4805. </svg>
  4806. </file>
  4807. <file path="assets/img/ic_avg04.svg">
  4808. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  4809. <path d="M14.0397 15.0325C14.1147 15.1178 14.1626 15.2227 14.1774 15.3342C14.1922 15.4458 14.1732 15.5591 14.1228 15.6603C14.075 15.7619 13.9982 15.848 13.9017 15.9082C13.8052 15.9685 13.693 16.0003 13.5784 16H0.603863C0.489327 16.0003 0.377114 15.9685 0.280594 15.9082C0.184075 15.848 0.10732 15.7619 0.0594757 15.6603C0.00907797 15.5591 -0.00990203 15.4458 0.00487766 15.3342C0.0196573 15.2227 0.06755 15.1178 0.142646 15.0325C1.24751 13.736 2.71272 12.7793 4.36165 12.2778C3.41594 11.6992 2.68867 10.8356 2.28963 9.8177C1.8906 8.79974 1.84148 7.68261 2.14969 6.63499C2.45789 5.58737 3.10669 4.66613 3.99812 4.01039C4.88955 3.35465 5.9752 3 7.09115 3C8.2071 3 9.29275 3.35465 10.1842 4.01039C11.0756 4.66613 11.7244 5.58737 12.0326 6.63499C12.3408 7.68261 12.2917 8.79974 11.8927 9.8177C11.4936 10.8356 10.7664 11.6992 9.82065 12.2778C11.4696 12.7793 12.9348 13.736 14.0397 15.0325ZM17.9184 12.012C17.8649 12.1026 17.7877 12.1776 17.6947 12.2295C17.6017 12.2814 17.4962 12.3083 17.3892 12.3074C17.2826 12.3082 17.1779 12.2801 17.0867 12.2261L16.7389 12.0267C16.5695 12.1686 16.3747 12.2788 16.1643 12.3517V12.7505C16.1643 12.9072 16.1006 13.0575 15.9871 13.1683C15.8737 13.2791 15.7198 13.3413 15.5594 13.3413C15.399 13.3413 15.2451 13.2791 15.1317 13.1683C15.0183 13.0575 14.9545 12.9072 14.9545 12.7505V12.3517C14.7442 12.2788 14.5493 12.1686 14.3799 12.0267L14.0321 12.2261C13.9409 12.2801 13.8362 12.3082 13.7297 12.3074C13.5972 12.3066 13.4686 12.2633 13.3637 12.1843C13.2589 12.1052 13.1835 11.9947 13.1491 11.8697C13.1148 11.7448 13.1234 11.6122 13.1736 11.4925C13.2239 11.3728 13.313 11.2724 13.4272 11.207L13.775 11.0076C13.7347 10.7927 13.7347 10.5725 13.775 10.3577L13.4272 10.1583C13.3575 10.1206 13.2962 10.0698 13.2469 10.0087C13.1976 9.94755 13.1614 9.87743 13.1402 9.80243C13.1191 9.72742 13.1135 9.64905 13.1239 9.57191C13.1342 9.49477 13.1602 9.42043 13.2004 9.35327C13.2824 9.21797 13.4156 9.11965 13.5713 9.07957C13.7269 9.03949 13.8925 9.06087 14.0321 9.13909L14.3799 9.33849C14.5493 9.19658 14.7442 9.08642 14.9545 9.01354V8.61474C14.9545 8.45804 15.0183 8.30777 15.1317 8.19697C15.2451 8.08617 15.399 8.02392 15.5594 8.02392C15.7198 8.02392 15.8737 8.08617 15.9871 8.19697C16.1006 8.30777 16.1643 8.45804 16.1643 8.61474V9.01354C16.3747 9.08642 16.5695 9.19658 16.7389 9.33849L17.0867 9.13909C17.2263 9.06087 17.3919 9.03949 17.5475 9.07957C17.7032 9.11965 17.8364 9.21797 17.9184 9.35327C17.9586 9.42043 17.9846 9.49477 17.995 9.57191C18.0053 9.64905 17.9997 9.72742 17.9786 9.80243C17.9575 9.87743 17.9212 9.94755 17.8719 10.0087C17.8226 10.0698 17.7613 10.1206 17.6916 10.1583L17.3438 10.3577C17.3841 10.5725 17.3841 10.7927 17.3438 11.0076L17.6916 11.207C17.7613 11.2446 17.8226 11.2955 17.8719 11.3566C17.9212 11.4177 17.9575 11.4878 17.9786 11.5628C17.9997 11.6378 18.0053 11.7162 17.995 11.7933C17.9846 11.8705 17.9586 11.9448 17.9184 12.012ZM15.5594 11.2734C15.679 11.2734 15.796 11.2388 15.8955 11.1739C15.9949 11.1089 16.0725 11.0167 16.1182 10.9087C16.164 10.8008 16.176 10.682 16.1527 10.5673C16.1293 10.4527 16.0717 10.3475 15.9871 10.2648C15.9025 10.1822 15.7947 10.1259 15.6774 10.1031C15.5601 10.0803 15.4385 10.092 15.3279 10.1368C15.2174 10.1815 15.1229 10.2572 15.0565 10.3544C14.99 10.4515 14.9545 10.5658 14.9545 10.6826C14.9545 10.8393 15.0183 10.9896 15.1317 11.1004C15.2451 11.2112 15.399 11.2734 15.5594 11.2734Z" fill="#9DA9BB"/>
  4810. </svg>
  4811. </file>
  4812. <file path="assets/img/ic_card_nodata.svg">
  4813. <svg width="21" height="21" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg">
  4814. <g id="note-remove">
  4815. <path id="Line" d="M6.33398 12.166H10.5007" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
  4816. <path id="Line_2" d="M6.33398 5.4668L3.20898 2.3418" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
  4817. <path id="Line_3" d="M6.30078 2.375L3.17578 5.5" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
  4818. <path id="Line_4" d="M6.33398 8.83398H13.0007" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
  4819. <path id="Vector" d="M8.83398 2.16602H13.834C16.609 2.31602 18.0007 3.34102 18.0007 7.15768V13.8327" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
  4820. <path id="Vector_2" d="M3 8.00781V13.8161C3 17.1578 3.83333 18.8328 8 18.8328H10.5C10.6417 18.8328 12.8667 18.8328 13 18.8328" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
  4821. <path id="Vector_3" d="M18 13.834L13 18.834V16.334C13 14.6673 13.8333 13.834 15.5 13.834H18Z" stroke="#292D32" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  4822. </g>
  4823. </svg>
  4824. </file>
  4825. <file path="assets/img/ic_card_off.svg">
  4826. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  4827. <g id="ico / &#236;&#185;&#180;&#235;&#147;&#156;&#237;&#152;&#149;&#236;&#139;&#157;" clip-path="url(#clip0_232_39718)">
  4828. <g id="Square Menu">
  4829. <path id="Vector" d="M4 4.75H1.5C1.30109 4.75 1.11032 4.67098 0.96967 4.53033C0.829018 4.38968 0.75 4.19891 0.75 4V1.5C0.75 1.30109 0.829018 1.11032 0.96967 0.96967C1.11032 0.829018 1.30109 0.75 1.5 0.75H4C4.19891 0.75 4.38968 0.829018 4.53033 0.96967C4.67098 1.11032 4.75 1.30109 4.75 1.5V4C4.75 4.19891 4.67098 4.38968 4.53033 4.53033C4.38968 4.67098 4.19891 4.75 4 4.75Z" stroke="#8A8A8A" stroke-width="1.5"/>
  4830. <path id="Vector_2" d="M10.5 4.75H8C7.80109 4.75 7.61032 4.67098 7.46967 4.53033C7.32902 4.38968 7.25 4.19891 7.25 4V1.5C7.25 1.30109 7.32902 1.11032 7.46967 0.96967C7.61032 0.829018 7.80109 0.75 8 0.75H10.5C10.6989 0.75 10.8897 0.829018 11.0303 0.96967C11.171 1.11032 11.25 1.30109 11.25 1.5V4C11.25 4.19891 11.171 4.38968 11.0303 4.53033C10.8897 4.67098 10.6989 4.75 10.5 4.75Z" stroke="#8A8A8A" stroke-width="1.5"/>
  4831. <path id="Vector_3" d="M4 11.25H1.5C1.30109 11.25 1.11032 11.171 0.96967 11.0303C0.829018 10.8897 0.75 10.6989 0.75 10.5V8C0.75 7.80109 0.829018 7.61032 0.96967 7.46967C1.11032 7.32902 1.30109 7.25 1.5 7.25H4C4.19891 7.25 4.38968 7.32902 4.53033 7.46967C4.67098 7.61032 4.75 7.80109 4.75 8V10.5C4.75 10.6989 4.67098 10.8897 4.53033 11.0303C4.38968 11.171 4.19891 11.25 4 11.25Z" stroke="#8A8A8A" stroke-width="1.5"/>
  4832. <path id="Vector_4" d="M10.5 11.25H8C7.80109 11.25 7.61032 11.171 7.46967 11.0303C7.32902 10.8897 7.25 10.6989 7.25 10.5V8C7.25 7.80109 7.32902 7.61032 7.46967 7.46967C7.61032 7.32902 7.80109 7.25 8 7.25H10.5C10.6989 7.25 10.8897 7.32902 11.0303 7.46967C11.171 7.61032 11.25 7.80109 11.25 8V10.5C11.25 10.6989 11.171 10.8897 11.0303 11.0303C10.8897 11.171 10.6989 11.25 10.5 11.25Z" stroke="#8A8A8A" stroke-width="1.5"/>
  4833. </g>
  4834. </g>
  4835. <defs>
  4836. <clipPath id="clip0_232_39718">
  4837. <rect width="12" height="12" fill="white"/>
  4838. </clipPath>
  4839. </defs>
  4840. </svg>
  4841. </file>
  4842. <file path="assets/img/ic_card_on.svg">
  4843. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  4844. <g id="ico / &#236;&#185;&#180;&#235;&#147;&#156;&#237;&#152;&#149;&#236;&#139;&#157;" clip-path="url(#clip0_232_39755)">
  4845. <g id="Square Menu">
  4846. <path id="Vector" d="M4 4.75H1.5C1.30109 4.75 1.11032 4.67098 0.96967 4.53033C0.829018 4.38968 0.75 4.19891 0.75 4V1.5C0.75 1.30109 0.829018 1.11032 0.96967 0.96967C1.11032 0.829018 1.30109 0.75 1.5 0.75H4C4.19891 0.75 4.38968 0.829018 4.53033 0.96967C4.67098 1.11032 4.75 1.30109 4.75 1.5V4C4.75 4.19891 4.67098 4.38968 4.53033 4.53033C4.38968 4.67098 4.19891 4.75 4 4.75Z" stroke="white" stroke-width="1.5"/>
  4847. <path id="Vector_2" d="M10.5 4.75H8C7.80109 4.75 7.61032 4.67098 7.46967 4.53033C7.32902 4.38968 7.25 4.19891 7.25 4V1.5C7.25 1.30109 7.32902 1.11032 7.46967 0.96967C7.61032 0.829018 7.80109 0.75 8 0.75H10.5C10.6989 0.75 10.8897 0.829018 11.0303 0.96967C11.171 1.11032 11.25 1.30109 11.25 1.5V4C11.25 4.19891 11.171 4.38968 11.0303 4.53033C10.8897 4.67098 10.6989 4.75 10.5 4.75Z" stroke="white" stroke-width="1.5"/>
  4848. <path id="Vector_3" d="M4 11.25H1.5C1.30109 11.25 1.11032 11.171 0.96967 11.0303C0.829018 10.8897 0.75 10.6989 0.75 10.5V8C0.75 7.80109 0.829018 7.61032 0.96967 7.46967C1.11032 7.32902 1.30109 7.25 1.5 7.25H4C4.19891 7.25 4.38968 7.32902 4.53033 7.46967C4.67098 7.61032 4.75 7.80109 4.75 8V10.5C4.75 10.6989 4.67098 10.8897 4.53033 11.0303C4.38968 11.171 4.19891 11.25 4 11.25Z" stroke="white" stroke-width="1.5"/>
  4849. <path id="Vector_4" d="M10.5 11.25H8C7.80109 11.25 7.61032 11.171 7.46967 11.0303C7.32902 10.8897 7.25 10.6989 7.25 10.5V8C7.25 7.80109 7.32902 7.61032 7.46967 7.46967C7.61032 7.32902 7.80109 7.25 8 7.25H10.5C10.6989 7.25 10.8897 7.32902 11.0303 7.46967C11.171 7.61032 11.25 7.80109 11.25 8V10.5C11.25 10.6989 11.171 10.8897 11.0303 11.0303C10.8897 11.171 10.6989 11.25 10.5 11.25Z" stroke="white" stroke-width="1.5"/>
  4850. </g>
  4851. </g>
  4852. <defs>
  4853. <clipPath id="clip0_232_39755">
  4854. <rect width="12" height="12" fill="white"/>
  4855. </clipPath>
  4856. </defs>
  4857. </svg>
  4858. </file>
  4859. <file path="assets/img/ic_chv_arrow.svg">
  4860. <svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
  4861. <g id="chevron-right">
  4862. <path id="Vector" d="M6 12.5L10 8.5L6 4.5" stroke="#6780A8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  4863. </g>
  4864. </svg>
  4865. </file>
  4866. <file path="assets/img/ic_chv.svg">
  4867. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  4868. <g id="chevron-left">
  4869. <path id="Vector" d="M8.75 10.5L5.25 7L8.75 3.5" stroke="#A3A3A3" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  4870. </g>
  4871. </svg>
  4872. </file>
  4873. <file path="assets/img/ic_close.svg">
  4874. <svg width="84" height="84" viewBox="0 0 84 84" fill="none" xmlns="http://www.w3.org/2000/svg">
  4875. <g filter="url(#filter0_dddd_204_2198)">
  4876. <circle cx="42" cy="42" r="28" fill="#484D5A"/>
  4877. </g>
  4878. <path d="M48.5 35.5L35.5 48.5" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  4879. <path d="M35.5 35.5L48.5 48.5" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  4880. <defs>
  4881. <filter id="filter0_dddd_204_2198" x="0" y="0" width="84" height="84" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
  4882. <feFlood flood-opacity="0" result="BackgroundImageFix"/>
  4883. <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
  4884. <feOffset dy="-4"/>
  4885. <feGaussianBlur stdDeviation="5"/>
  4886. <feComposite in2="hardAlpha" operator="out"/>
  4887. <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/>
  4888. <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_204_2198"/>
  4889. <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
  4890. <feOffset dy="4"/>
  4891. <feGaussianBlur stdDeviation="5"/>
  4892. <feComposite in2="hardAlpha" operator="out"/>
  4893. <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/>
  4894. <feBlend mode="normal" in2="effect1_dropShadow_204_2198" result="effect2_dropShadow_204_2198"/>
  4895. <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
  4896. <feOffset dx="4" dy="4"/>
  4897. <feGaussianBlur stdDeviation="5"/>
  4898. <feComposite in2="hardAlpha" operator="out"/>
  4899. <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/>
  4900. <feBlend mode="normal" in2="effect2_dropShadow_204_2198" result="effect3_dropShadow_204_2198"/>
  4901. <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
  4902. <feOffset dx="-4" dy="4"/>
  4903. <feGaussianBlur stdDeviation="5"/>
  4904. <feComposite in2="hardAlpha" operator="out"/>
  4905. <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/>
  4906. <feBlend mode="normal" in2="effect3_dropShadow_204_2198" result="effect4_dropShadow_204_2198"/>
  4907. <feBlend mode="normal" in="SourceGraphic" in2="effect4_dropShadow_204_2198" result="shape"/>
  4908. </filter>
  4909. </defs>
  4910. </svg>
  4911. </file>
  4912. <file path="assets/img/ic_drop_down_on.svg">
  4913. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  4914. <path d="M3 7.5L6 4.5L9 7.5" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  4915. </svg>
  4916. </file>
  4917. <file path="assets/img/ic_drop_down.svg">
  4918. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  4919. <g id="chevron-down">
  4920. <path id="Vector" d="M3 4.5L6 7.5L9 4.5" stroke="#B5B5B5" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  4921. </g>
  4922. </svg>
  4923. </file>
  4924. <file path="assets/img/ic_ds.svg">
  4925. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  4926. <g id="ico / &#234;&#184;&#136;&#236;&#167;&#128;" clip-path="url(#clip0_248_36090)">
  4927. <path id="Vector" d="M7 0.21875C3.25484 0.21875 0.21875 3.25481 0.21875 7C0.21875 10.7452 3.25484 13.7812 7 13.7812C10.7452 13.7812 13.7812 10.7452 13.7812 7C13.7812 3.25484 10.7452 0.21875 7 0.21875ZM10.5576 3.44236C12.3472 5.23195 12.4717 7.96723 11.123 9.88556L4.11441 2.877C6.03405 1.52742 8.76903 1.65378 10.5576 3.44236ZM3.44236 10.5576C1.65277 8.76805 1.5283 6.03277 2.87697 4.11444L9.88559 11.123C7.96597 12.4726 5.23097 12.3463 3.44236 10.5576Z" fill="#E1473D"/>
  4928. </g>
  4929. <defs>
  4930. <clipPath id="clip0_248_36090">
  4931. <rect width="14" height="14" fill="white"/>
  4932. </clipPath>
  4933. </defs>
  4934. </svg>
  4935. </file>
  4936. <file path="assets/img/ic_end_close_cl.svg">
  4937. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  4938. <path d="M8 0C6.41775 0 4.87103 0.469192 3.55544 1.34824C2.23985 2.22729 1.21447 3.47672 0.608967 4.93853C0.00346624 6.40034 -0.15496 8.00887 0.153721 9.56072C0.462403 11.1126 1.22433 12.538 2.34315 13.6569C3.46197 14.7757 4.88743 15.5376 6.43928 15.8463C7.99113 16.155 9.59966 15.9965 11.0615 15.391C12.5233 14.7855 13.7727 13.7602 14.6518 12.4446C15.5308 11.129 16 9.58225 16 8C15.9973 5.8791 15.1536 3.84585 13.6539 2.34614C12.1542 0.84644 10.1209 0.00271388 8 0ZM10.281 9.41128C10.3963 9.52667 10.461 9.68307 10.461 9.84615C10.461 10.0092 10.3963 10.1656 10.281 10.281C10.1656 10.3963 10.0092 10.461 9.84616 10.461C9.68308 10.461 9.52667 10.3963 9.41128 10.281L8 8.86974L6.58872 10.281C6.47334 10.3963 6.31693 10.461 6.15385 10.461C5.99077 10.461 5.83436 10.3963 5.71898 10.281C5.60374 10.1656 5.53901 10.0092 5.53901 9.84615C5.53901 9.68307 5.60374 9.52667 5.71898 9.41128L7.13026 8L5.71898 6.58872C5.61028 6.47206 5.5511 6.31777 5.55391 6.15834C5.55672 5.99891 5.62131 5.8468 5.73406 5.73405C5.84681 5.6213 5.99892 5.55672 6.15834 5.55391C6.31777 5.55109 6.47206 5.61027 6.58872 5.71897L8 7.13025L9.41128 5.71897C9.52794 5.61027 9.68223 5.55109 9.84166 5.55391C10.0011 5.55672 10.1532 5.6213 10.2659 5.73405C10.3787 5.8468 10.4433 5.99891 10.4461 6.15834C10.4489 6.31777 10.3897 6.47206 10.281 6.58872L8.86975 8L10.281 9.41128Z" fill="#EC4242"/>
  4939. </svg>
  4940. </file>
  4941. <file path="assets/img/ic_end_close_x.svg">
  4942. <svg width="6" height="6" viewBox="0 0 6 6" fill="none" xmlns="http://www.w3.org/2000/svg">
  4943. <rect y="4.24219" width="6" height="1.1" rx="0.55" transform="rotate(-45 0 4.24219)" fill="#E1473D"/>
  4944. <rect x="4.24268" y="5.01953" width="6" height="1.1" rx="0.55" transform="rotate(-135 4.24268 5.01953)" fill="#E1473D"/>
  4945. </svg>
  4946. </file>
  4947. <file path="assets/img/ic_end_close.svg">
  4948. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  4949. <g id="ico / &#236;&#162;&#133;&#235;&#163;&#140;" clip-path="url(#clip0_75_16268)">
  4950. <path id="Vector" d="M7.78589 0.5C6.30253 0.5 4.85248 0.939867 3.61911 1.76398C2.38575 2.58809 1.42445 3.75943 0.856795 5.12987C0.289138 6.50032 0.140613 8.00832 0.430002 9.46318C0.719391 10.918 1.4337 12.2544 2.48259 13.3033C3.53148 14.3522 4.86786 15.0665 6.32271 15.3559C7.77757 15.6453 9.28557 15.4968 10.656 14.9291C12.0265 14.3614 13.1978 13.4001 14.0219 12.1668C14.846 10.9334 15.2859 9.48336 15.2859 8C15.2833 6.01166 14.4924 4.10548 13.0864 2.69951C11.6804 1.29354 9.77423 0.502544 7.78589 0.5ZM9.92435 9.32308C10.0324 9.43125 10.0931 9.57788 10.0931 9.73077C10.0931 9.88365 10.0324 10.0303 9.92435 10.1385C9.81618 10.2465 9.66954 10.3072 9.51666 10.3072C9.36377 10.3072 9.21714 10.2465 9.10897 10.1385L7.78589 8.81538L6.46281 10.1385C6.35464 10.2465 6.20801 10.3072 6.05512 10.3072C5.90224 10.3072 5.7556 10.2465 5.64743 10.1385C5.53939 10.0303 5.47871 9.88365 5.47871 9.73077C5.47871 9.57788 5.53939 9.43125 5.64743 9.32308L6.97051 8L5.64743 6.67692C5.54552 6.56756 5.49004 6.42291 5.49268 6.27344C5.49532 6.12398 5.55586 5.98138 5.66157 5.87567C5.76727 5.76997 5.90987 5.70942 6.05934 5.70679C6.2088 5.70415 6.35345 5.75963 6.46281 5.86154L7.78589 7.18461L9.10897 5.86154C9.21833 5.75963 9.36298 5.70415 9.51245 5.70679C9.66191 5.70942 9.80451 5.76997 9.91021 5.87567C10.0159 5.98138 10.0765 6.12398 10.0791 6.27344C10.0817 6.42291 10.0263 6.56756 9.92435 6.67692L8.60128 8L9.92435 9.32308Z" fill="white"/>
  4951. </g>
  4952. <defs>
  4953. <clipPath id="clip0_75_16268">
  4954. <rect width="15" height="15" fill="white" transform="translate(0.285889 0.5)"/>
  4955. </clipPath>
  4956. </defs>
  4957. </svg>
  4958. </file>
  4959. <file path="assets/img/ic_end_red.svg">
  4960. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  4961. <g id="ico / &#236;&#162;&#133;&#235;&#163;&#140;">
  4962. <path id="Vector" d="M9 1C7.41775 1 5.87103 1.46919 4.55544 2.34824C3.23985 3.22729 2.21447 4.47672 1.60897 5.93853C1.00347 7.40034 0.84504 9.00887 1.15372 10.5607C1.4624 12.1126 2.22433 13.538 3.34315 14.6569C4.46197 15.7757 5.88743 16.5376 7.43928 16.8463C8.99113 17.155 10.5997 16.9965 12.0615 16.391C13.5233 15.7855 14.7727 14.7602 15.6518 13.4446C16.5308 12.129 17 10.5822 17 9C16.9973 6.8791 16.1536 4.84585 14.6539 3.34614C13.1542 1.84644 11.1209 1.00271 9 1ZM11.281 10.4113C11.3963 10.5267 11.461 10.6831 11.461 10.8462C11.461 11.0092 11.3963 11.1656 11.281 11.281C11.1656 11.3963 11.0092 11.461 10.8462 11.461C10.6831 11.461 10.5267 11.3963 10.4113 11.281L9 9.86974L7.58872 11.281C7.47334 11.3963 7.31693 11.461 7.15385 11.461C6.99077 11.461 6.83436 11.3963 6.71898 11.281C6.60374 11.1656 6.53901 11.0092 6.53901 10.8462C6.53901 10.6831 6.60374 10.5267 6.71898 10.4113L8.13026 9L6.71898 7.58872C6.61028 7.47206 6.5511 7.31777 6.55391 7.15834C6.55672 6.99891 6.62131 6.8468 6.73406 6.73405C6.84681 6.6213 6.99892 6.55672 7.15834 6.55391C7.31777 6.55109 7.47206 6.61027 7.58872 6.71897L9 8.13025L10.4113 6.71897C10.5279 6.61027 10.6822 6.55109 10.8417 6.55391C11.0011 6.55672 11.1532 6.6213 11.2659 6.73405C11.3787 6.8468 11.4433 6.99891 11.4461 7.15834C11.4489 7.31777 11.3897 7.47206 11.281 7.58872L9.86975 9L11.281 10.4113Z" fill="#EC4242"/>
  4963. </g>
  4964. </svg>
  4965. </file>
  4966. <file path="assets/img/ic_equip01.svg">
  4967. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  4968. <g id="ico">
  4969. <path id="Vector" d="M14.6173 4.17813C15.2097 4.94013 15.5624 5.89762 15.5624 6.93751C15.5624 8.64997 14.6059 10.139 13.1979 10.8995C12.7111 11.1625 12.1253 11.0004 11.734 10.6091L7.39078 6.26588C6.99951 5.8746 6.83745 5.28886 7.10042 4.80199C7.8609 3.39406 9.34995 2.43751 11.0624 2.43751C12.1023 2.43751 13.0599 2.79025 13.8219 3.38262L15.5398 1.66475C15.7594 1.44508 16.1155 1.44508 16.3352 1.66475C16.5549 1.88442 16.5549 2.24058 16.3352 2.46025L14.6173 4.17813ZM2.46025 16.3352L4.17804 14.6174C4.94005 15.2098 5.89754 15.5625 6.93742 15.5625C8.6499 15.5625 10.1389 14.6059 10.8994 13.198C11.1624 12.7111 11.0003 12.1254 10.609 11.7341L6.26578 7.39086C5.87451 6.99958 5.28876 6.83752 4.8019 7.1005C3.39396 7.86097 2.43742 9.35002 2.43742 11.0625C2.43742 12.1024 2.79016 13.06 3.38254 13.822L1.66475 15.5398C1.44508 15.7594 1.44508 16.1155 1.66475 16.3352C1.88442 16.5549 2.24058 16.5549 2.46025 16.3352Z" fill="#438DFF"/>
  4970. </g>
  4971. </svg>
  4972. </file>
  4973. <file path="assets/img/ic_equip02.svg">
  4974. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  4975. <g id="ico">
  4976. <path id="Vector" d="M11.8077 3.375C12.7636 3.375 13.5385 2.61949 13.5385 1.6875C13.5385 0.755508 12.7636 0 11.8077 0C10.8518 0 10.0769 0.755508 10.0769 1.6875C10.0769 2.61949 10.8518 3.375 11.8077 3.375ZM6.0994 11.1611L5.56575 12.3746H3.15385C2.51671 12.3746 2 12.8784 2 13.4996C2 14.1209 2.51671 14.6246 3.15385 14.6246H5.94651C6.64062 14.6246 7.2655 14.2225 7.53702 13.602L7.85397 12.8805L7.46923 12.6591C6.84471 12.2994 6.38534 11.7671 6.0994 11.1611ZM15.8462 7.87465H14.2585L13.3189 6.00258C12.8681 5.10434 12.0406 4.44762 11.0912 4.21172L8.52825 3.46852C7.50781 3.22945 6.44519 3.44918 5.61334 4.07109L4.18293 5.1402C3.67704 5.51813 3.58113 6.22406 3.96947 6.71731C4.35781 7.21055 5.08149 7.30301 5.58702 6.92543L7.01815 5.85633C7.29471 5.64926 7.647 5.57508 7.92933 5.64047L8.45937 5.7941L7.10865 8.86641C6.65361 9.90281 7.06142 11.1168 8.05697 11.6898L11.1212 13.4536L10.1306 16.5379C9.94026 17.1306 10.2788 17.7616 10.8868 17.9473C11.0018 17.9824 11.1179 17.9993 11.2322 17.9993C11.723 17.9993 12.178 17.691 12.3327 17.21L13.4736 13.6571C13.6867 12.927 13.3694 12.1426 12.6933 11.745L10.4851 10.4745L11.6141 7.72242L12.345 9.17895C12.6334 9.7534 13.2435 10.1243 13.8994 10.1243H15.8462C16.4833 10.1243 17 9.62051 17 8.9993C17 8.37809 16.4833 7.87465 15.8462 7.87465Z" fill="#438DFF"/>
  4977. </g>
  4978. </svg>
  4979. </file>
  4980. <file path="assets/img/ic_equip03.svg">
  4981. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  4982. <g id="8673670_ic_fluent_plug_disconnected_filled_icon 1" clip-path="url(#clip0_112_28923)">
  4983. <g id="Group 232">
  4984. <path id="Vector" d="M17.738 1.53642C18.0894 1.18493 18.0894 0.615085 17.738 0.263604C17.3865 -0.0878679 16.8166 -0.0878679 16.4652 0.263604L14.8475 1.88126C13.3714 0.961138 11.4044 1.14242 10.1218 2.42508L9.16052 3.3863C8.54545 4.00139 8.54545 4.99864 9.16052 5.61372L12.3878 8.84098C13.0029 9.45604 14.0001 9.45604 14.6152 8.84098L15.5764 7.87977C16.8591 6.59709 17.0404 4.63015 16.1203 3.15408L17.738 1.53642Z" fill="#E1473D"/>
  4985. <path id="Vector_2" d="M7.83647 8.73758C8.18793 8.38612 8.18793 7.81624 7.83647 7.46478C7.48502 7.1133 6.91515 7.1133 6.56367 7.46478L5.24096 8.78753L4.97737 8.52391C4.71377 8.2603 4.28637 8.2603 4.02276 8.52391L2.42513 10.1215C1.14248 11.4041 0.961201 13.3711 1.88128 14.8472L0.263604 16.4649C-0.0878679 16.8163 -0.0878679 17.3862 0.263604 17.7377C0.615085 18.0891 1.18493 18.0891 1.53642 17.7377L3.15408 16.12C4.63017 17.0401 6.59713 16.8588 7.87977 15.5762L9.47737 13.9785C9.74098 13.7149 9.74098 13.2876 9.47737 13.024L9.21376 12.7603L10.5365 11.4376C10.888 11.0862 10.888 10.5163 10.5365 10.1648C10.1851 9.81336 9.61516 9.81336 9.26371 10.1648L7.94097 11.4876L6.51377 10.0603L7.83647 8.73758Z" fill="#E1473D"/>
  4986. </g>
  4987. </g>
  4988. <defs>
  4989. <clipPath id="clip0_112_28923">
  4990. <rect width="18" height="18" fill="white"/>
  4991. </clipPath>
  4992. </defs>
  4993. </svg>
  4994. </file>
  4995. <file path="assets/img/ic_equip04.svg">
  4996. <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
  4997. <rect width="40" height="40" rx="20" fill="#FFEBEA"/>
  4998. <path d="M26.0766 18.2982H24.5015C24.3121 17.5437 23.9408 16.8651 23.4358 16.3153L24.2749 15.1132C24.3935 14.9436 24.356 14.707 24.1914 14.5851C24.0266 14.4629 23.7975 14.5017 23.679 14.6712L22.8849 15.8088C22.2399 15.3073 21.4597 14.9833 20.6091 14.9101V13.3784C20.6091 13.1694 20.4447 13 20.242 13C20.0392 13 19.8748 13.1694 19.8748 13.3784V14.9099C19.0133 14.9836 18.2229 15.3149 17.5723 15.828L16.7647 14.6712C16.6461 14.5016 16.4167 14.4624 16.2523 14.5851C16.0878 14.707 16.0503 14.9436 16.1688 15.1132L17.0247 16.3394C16.5304 16.885 16.1661 17.5545 15.9792 18.2982H14.3672C14.1644 18.2982 14 18.4676 14 18.6766C14 18.8856 14.1644 19.055 14.3672 19.055H15.8527C15.8427 19.1797 15.8341 19.3048 15.8341 19.4321V23.2507C15.9538 23.2299 16.0759 23.2166 16.2012 23.2166H24.2791C24.4044 23.2166 24.5266 23.2299 24.6463 23.2508V19.4321C24.6463 19.3048 24.6378 19.1797 24.6278 19.055H26.0766C26.2793 19.055 26.4437 18.8856 26.4437 18.6766C26.4437 18.4676 26.2793 18.2982 26.0766 18.2982ZM19.5076 17.5413C18.9002 17.5413 18.4061 18.0505 18.4061 18.6766C18.4061 18.8856 18.2417 19.055 18.0389 19.055C17.8361 19.055 17.6717 18.8856 17.6717 18.6766C17.6717 17.6333 18.4954 16.7844 19.5076 16.7844C19.7104 16.7844 19.8748 16.9538 19.8748 17.1628C19.8748 17.3718 19.7104 17.5413 19.5076 17.5413Z" fill="#E1473D"/>
  4999. <path d="M24.277 23.9727H16.1992C15.3914 23.9727 14.7305 24.6538 14.7305 25.4864C14.7305 26.3228 15.3914 27.0002 16.1992 27.0002H24.277C25.0884 27.0002 25.7457 26.3228 25.7457 25.4864C25.7457 24.6538 25.0884 23.9727 24.277 23.9727Z" fill="#E1473D"/>
  5000. </svg>
  5001. </file>
  5002. <file path="assets/img/ic_excel_green.svg">
  5003. <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
  5004. <path d="M27.9274 5.71094H16.9775V9.08922H19.5047C19.9696 9.08922 20.3468 9.46762 20.3468 9.93373C20.3469 10.4 19.9696 10.7784 19.5047 10.7784H16.9775V12.4677H19.5047C19.9696 12.4677 20.3468 12.8461 20.3468 13.3119C20.3469 13.7783 19.9696 14.1566 19.5047 14.1566H16.9775V15.8458H19.5047C19.9696 15.8458 20.3468 16.2241 20.3468 16.6904C20.3469 17.1563 19.9696 17.5347 19.5047 17.5347H16.9775V19.2241H19.5047C19.9696 19.2241 20.3468 19.6025 20.3468 20.0688C20.3468 20.535 19.9696 20.9133 19.5047 20.9133H16.9775V24.2914H27.9274C28.3925 24.2914 28.7698 23.9131 28.7697 23.4467V6.55545C28.7697 6.08922 28.3925 5.71094 27.9274 5.71094ZM24.5583 20.9132H22.8738C22.4089 20.9132 22.0314 20.5349 22.0314 20.0688C22.0314 19.6024 22.4089 19.224 22.8738 19.224H24.5583C25.0232 19.224 25.4005 19.6024 25.4005 20.0688C25.4005 20.5349 25.0232 20.9132 24.5583 20.9132ZM24.5583 17.5346H22.8738C22.4089 17.5346 22.0314 17.1562 22.0314 16.6904C22.0314 16.2241 22.4089 15.8457 22.8738 15.8457H24.5583C25.0232 15.8457 25.4005 16.2241 25.4005 16.6904C25.4005 17.1562 25.0232 17.5346 24.5583 17.5346ZM24.5583 14.1566H22.8738C22.4089 14.1566 22.0314 13.7782 22.0314 13.3118C22.0314 12.846 22.4089 12.4676 22.8738 12.4676H24.5583C25.0232 12.4676 25.4005 12.846 25.4005 13.3118C25.4005 13.7782 25.0232 14.1566 24.5583 14.1566ZM24.5583 10.7782H22.8738C22.4089 10.7782 22.0314 10.3998 22.0314 9.93361C22.0314 9.4675 22.4089 9.0891 22.8738 9.0891H24.5583C25.0232 9.0891 25.4005 9.4675 25.4005 9.93361C25.4005 10.3999 25.0232 10.7782 24.5583 10.7782Z" fill="#207245"/>
  5005. <path d="M16.0867 2.52639C15.8944 2.36596 15.6367 2.29659 15.3942 2.34751L1.91777 4.88098C1.51852 4.95569 1.23047 5.3035 1.23047 5.7105V24.2909C1.23047 24.6963 1.51852 25.0458 1.91777 25.1204L15.3942 27.654C15.4447 27.664 15.4969 27.6692 15.5492 27.6692C15.7445 27.6692 15.9349 27.6017 16.0866 27.4748C16.2805 27.3146 16.3912 27.0747 16.3912 26.8245V24.2909V20.9128V19.2236V17.5342V15.8453V14.1561V12.4671V10.7778V9.08872V5.7105V3.17702C16.3912 2.92518 16.2804 2.68694 16.0867 2.52639ZM12.7346 19.014C12.5745 19.1544 12.3772 19.2237 12.1799 19.2237C11.946 19.2237 11.7135 19.1255 11.5466 18.9334L9.09744 16.1273L6.94945 18.8974C6.78287 19.1122 6.53514 19.2235 6.28418 19.2235C6.10412 19.2235 5.92031 19.1661 5.76521 19.0463C5.39982 18.7593 5.33232 18.2287 5.61879 17.8603L7.96711 14.8335L5.65078 12.1782C5.34422 11.8284 5.37967 11.2947 5.72994 10.9876C6.07699 10.6799 6.60943 10.712 6.91758 11.0671L9.01992 13.4754L11.515 10.2592C11.8027 9.89286 12.3317 9.82524 12.6972 10.1125C13.0627 10.3994 13.1305 10.9299 12.8441 11.2983L10.1501 14.7713L12.8137 17.8233C13.1201 18.1731 13.0849 18.7069 12.7346 19.014Z" fill="#207245"/>
  5006. </svg>
  5007. </file>
  5008. <file path="assets/img/ic_excel.svg">
  5009. <svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  5010. <path d="M19.1183 3.80664H11.8184V6.05883H13.5032C13.8131 6.05883 14.0645 6.31109 14.0645 6.62184C14.0646 6.93266 13.813 7.18492 13.5032 7.18492H11.8184V8.31113H13.5032C13.8131 8.31113 14.0645 8.5634 14.0645 8.87395C14.0646 9.18488 13.813 9.43711 13.5032 9.43711H11.8184V10.5632H13.5032C13.8131 10.5632 14.0645 10.8154 14.0645 11.1263C14.0646 11.4369 13.813 11.6891 13.5032 11.6891H11.8184V12.8154H13.5032C13.8131 12.8154 14.0645 13.0677 14.0645 13.3786C14.0645 13.6893 13.813 13.9415 13.5032 13.9415H11.8184V16.1936H19.1183C19.4284 16.1936 19.6798 15.9414 19.6798 15.6305V4.36965C19.6798 4.05883 19.4284 3.80664 19.1183 3.80664ZM16.8722 13.9415H15.7492C15.4393 13.9415 15.1876 13.6893 15.1876 13.3785C15.1876 13.0676 15.4393 12.8154 15.7492 12.8154H16.8722C17.1821 12.8154 17.4337 13.0676 17.4337 13.3785C17.4337 13.6893 17.1821 13.9415 16.8722 13.9415ZM16.8722 11.6891H15.7492C15.4393 11.6891 15.1876 11.4368 15.1876 11.1262C15.1876 10.8154 15.4393 10.5632 15.7492 10.5632H16.8722C17.1821 10.5632 17.4337 10.8154 17.4337 11.1262C17.4337 11.4368 17.1821 11.6891 16.8722 11.6891ZM16.8722 9.43707H15.7492C15.4393 9.43707 15.1876 9.18484 15.1876 8.87391C15.1876 8.56336 15.4393 8.31109 15.7492 8.31109H16.8722C17.1821 8.31109 17.4337 8.56336 17.4337 8.87391C17.4337 9.18484 17.1821 9.43707 16.8722 9.43707ZM16.8722 7.18484H15.7492C15.4393 7.18484 15.1876 6.93258 15.1876 6.62176C15.1876 6.31102 15.4393 6.05875 15.7492 6.05875H16.8722C17.1821 6.05875 17.4337 6.31102 17.4337 6.62176C17.4337 6.93262 17.1821 7.18484 16.8722 7.18484Z" fill="#207245"/>
  5011. <path d="M11.2245 1.68394C11.0963 1.57698 10.9245 1.53073 10.7628 1.56468L1.77852 3.25366C1.51234 3.30347 1.32031 3.53534 1.32031 3.80667V16.1936C1.32031 16.4639 1.51234 16.6969 1.77852 16.7466L10.7628 18.4357C10.7964 18.4423 10.8313 18.4458 10.8661 18.4458C10.9964 18.4458 11.1232 18.4008 11.2244 18.3162C11.3537 18.2094 11.4275 18.0495 11.4275 17.8826V16.1936V13.9416V12.8154V11.6891V10.5632V9.4371V8.31109V7.18487V6.05882V3.80667V2.11769C11.4275 1.9498 11.3536 1.79097 11.2245 1.68394ZM8.98973 12.6757C8.88301 12.7692 8.75145 12.8155 8.61996 12.8155C8.46402 12.8155 8.30902 12.75 8.19773 12.6219L6.56496 10.7512L5.13297 12.598C5.02191 12.7411 4.85676 12.8153 4.68945 12.8153C4.56941 12.8153 4.44687 12.7771 4.34348 12.6972C4.09988 12.5059 4.05488 12.1521 4.24586 11.9065L5.81141 9.88866L4.26719 8.11847C4.06281 7.88527 4.08645 7.52948 4.31996 7.32472C4.55133 7.11964 4.90629 7.14101 5.11172 7.37773L6.51328 8.98327L8.17668 6.83917C8.36844 6.59491 8.72113 6.54984 8.9648 6.74136C9.20848 6.93261 9.25367 7.28628 9.06273 7.53191L7.26672 9.84718L9.0425 11.8819C9.24676 12.1151 9.22324 12.4709 8.98973 12.6757Z" fill="#207245"/>
  5012. </svg>
  5013. </file>
  5014. <file path="assets/img/ic_gear.svg">
  5015. <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
  5016. <g id="settings" clip-path="url(#clip0_87_25998)">
  5017. <path id="Vector" d="M11 13.75C12.5188 13.75 13.75 12.5188 13.75 11C13.75 9.48122 12.5188 8.25 11 8.25C9.48122 8.25 8.25 9.48122 8.25 11C8.25 12.5188 9.48122 13.75 11 13.75Z" stroke="#0B318B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  5018. <path id="Vector_2" d="M17.7833 13.7503C17.6613 14.0268 17.6249 14.3335 17.6788 14.6309C17.7328 14.9282 17.8745 15.2026 18.0858 15.4187L18.1408 15.4737C18.3113 15.6439 18.4465 15.8461 18.5388 16.0687C18.631 16.2912 18.6785 16.5298 18.6785 16.7707C18.6785 17.0117 18.631 17.2502 18.5388 17.4728C18.4465 17.6954 18.3113 17.8976 18.1408 18.0678C17.9706 18.2383 17.7684 18.3735 17.5458 18.4658C17.3232 18.558 17.0847 18.6055 16.8438 18.6055C16.6028 18.6055 16.3643 18.558 16.1417 18.4658C15.9191 18.3735 15.7169 18.2383 15.5467 18.0678L15.4917 18.0128C15.2756 17.8015 15.0012 17.6597 14.7039 17.6058C14.4065 17.5519 14.0998 17.5883 13.8233 17.7103C13.5522 17.8265 13.321 18.0195 13.1581 18.2654C12.9953 18.5113 12.9078 18.7995 12.9067 19.0945V19.2503C12.9067 19.7366 12.7135 20.2029 12.3697 20.5467C12.0259 20.8905 11.5596 21.0837 11.0733 21.0837C10.5871 21.0837 10.1208 20.8905 9.77698 20.5467C9.43316 20.2029 9.24 19.7366 9.24 19.2503V19.1678C9.23291 18.8644 9.1347 18.5702 8.95814 18.3233C8.78158 18.0764 8.53485 17.8884 8.25 17.7837C7.97352 17.6616 7.66683 17.6252 7.36947 17.6792C7.0721 17.7331 6.79771 17.8748 6.58167 18.0862L6.52667 18.1412C6.3564 18.3116 6.15421 18.4468 5.93165 18.5391C5.70908 18.6314 5.47052 18.6789 5.22959 18.6789C4.98866 18.6789 4.75009 18.6314 4.52753 18.5391C4.30497 18.4468 4.10277 18.3116 3.9325 18.1412C3.76205 17.9709 3.62682 17.7687 3.53456 17.5461C3.4423 17.3236 3.39481 17.085 3.39481 16.8441C3.39481 16.6031 3.4423 16.3646 3.53456 16.142C3.62682 15.9195 3.76205 15.7173 3.9325 15.547L3.9875 15.492C4.19883 15.276 4.34059 15.0016 4.39451 14.7042C4.44843 14.4068 4.41203 14.1001 4.29 13.8237C4.17381 13.5525 3.98086 13.3213 3.73493 13.1584C3.489 12.9956 3.20081 12.9082 2.90584 12.907H2.75001C2.26377 12.907 1.79746 12.7138 1.45364 12.37C1.10983 12.0262 0.916672 11.5599 0.916672 11.0737C0.916672 10.5874 1.10983 10.1211 1.45364 9.7773C1.79746 9.43348 2.26377 9.24033 2.75001 9.24033H2.8325C3.13592 9.23323 3.43018 9.13502 3.67703 8.95846C3.92388 8.7819 4.11191 8.53517 4.21667 8.25033C4.33869 7.97384 4.37509 7.66715 4.32118 7.36979C4.26726 7.07242 4.1255 6.79803 3.91417 6.58199L3.85917 6.52699C3.68871 6.35672 3.55349 6.15453 3.46123 5.93197C3.36897 5.7094 3.32148 5.47084 3.32148 5.22991C3.32148 4.98898 3.36897 4.75041 3.46123 4.52785C3.55349 4.30529 3.68871 4.10309 3.85917 3.93283C4.02944 3.76237 4.23163 3.62714 4.4542 3.53488C4.67676 3.44262 4.91533 3.39513 5.15625 3.39513C5.39718 3.39513 5.63575 3.44262 5.85831 3.53488C6.08088 3.62714 6.28307 3.76237 6.45334 3.93283L6.50834 3.98783C6.72438 4.19915 6.99877 4.34091 7.29613 4.39483C7.59349 4.44875 7.90019 4.41235 8.17667 4.29033H8.25C8.52113 4.17413 8.75235 3.98118 8.91522 3.73525C9.07809 3.48932 9.16549 3.20113 9.16667 2.90616V2.75033C9.16667 2.2641 9.35983 1.79778 9.70364 1.45396C10.0475 1.11015 10.5138 0.916992 11 0.916992C11.4862 0.916992 11.9526 1.11015 12.2964 1.45396C12.6402 1.79778 12.8333 2.2641 12.8333 2.75033V2.83283C12.8345 3.1278 12.9219 3.41599 13.0848 3.66192C13.2477 3.90785 13.4789 4.10079 13.75 4.21699C14.0265 4.33901 14.3332 4.37541 14.6305 4.3215C14.9279 4.26758 15.2023 4.12582 15.4183 3.91449L15.4733 3.85949C15.6436 3.68904 15.8458 3.55381 16.0684 3.46155C16.2909 3.36929 16.5295 3.3218 16.7704 3.3218C17.0113 3.3218 17.2499 3.36929 17.4725 3.46155C17.695 3.55381 17.8972 3.68904 18.0675 3.85949C18.238 4.02976 18.3732 4.23196 18.4654 4.45452C18.5577 4.67708 18.6052 4.91565 18.6052 5.15658C18.6052 5.3975 18.5577 5.63607 18.4654 5.85863C18.3732 6.0812 18.238 6.28339 18.0675 6.45366L18.0125 6.50866C17.8012 6.7247 17.6594 6.99909 17.6055 7.29645C17.5516 7.59381 17.588 7.90051 17.71 8.17699V8.25033C17.8262 8.52145 18.0191 8.75267 18.2651 8.91554C18.511 9.07841 18.7992 9.16582 19.0942 9.16699H19.25C19.7362 9.16699 20.2025 9.36015 20.5464 9.70396C20.8902 10.0478 21.0833 10.5141 21.0833 11.0003C21.0833 11.4866 20.8902 11.9529 20.5464 12.2967C20.2025 12.6405 19.7362 12.8337 19.25 12.8337H19.1675C18.8725 12.8348 18.5843 12.9222 18.3384 13.0851C18.0925 13.248 17.8995 13.4792 17.7833 13.7503Z" stroke="#0B318B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  5019. </g>
  5020. <defs>
  5021. <clipPath id="clip0_87_25998">
  5022. <rect width="22" height="22" fill="white"/>
  5023. </clipPath>
  5024. </defs>
  5025. </svg>
  5026. </file>
  5027. <file path="assets/img/ic_google.svg">
  5028. <svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
  5029. <circle cx="50" cy="50" r="49.5" fill="white" stroke="#666666"/>
  5030. <g clip-path="url(#clip0_168_1253)">
  5031. <path fill-rule="evenodd" clip-rule="evenodd" d="M71.9999 50.5078C71.9999 48.9534 71.8544 47.4404 71.6049 46.0104H50.8136V54.5285H62.6854C62.1656 57.285 60.6271 59.6062 58.2777 61.1606V66.6736H65.4091C69.5881 62.8394 71.9999 57.2021 71.9999 50.5078Z" fill="#3E82F1"/>
  5032. <path fill-rule="evenodd" clip-rule="evenodd" d="M50.7928 72C56.7599 72 61.7498 70.0311 65.4091 66.6736L58.2776 61.1606C56.3025 62.487 53.7659 63.2539 50.8136 63.2539C45.0752 63.2539 40.21 59.3782 38.4635 54.1761H31.0826V59.8756C34.7211 67.0673 42.1852 72 50.7928 72Z" fill="#32A753"/>
  5033. <path fill-rule="evenodd" clip-rule="evenodd" d="M38.4636 54.1762C38.027 52.8498 37.7775 51.4405 37.7775 49.9897C37.7775 48.5389 38.027 47.1296 38.4636 45.8031V40.1244H31.0827C29.5857 43.0881 28.7333 46.4456 28.7333 49.9897C28.7333 53.5337 29.5857 56.8912 31.0827 59.8757L38.4636 54.1762Z" fill="#F9BB00"/>
  5034. <path fill-rule="evenodd" clip-rule="evenodd" d="M50.7928 36.7461C54.0362 36.7461 56.947 37.8653 59.234 40.0414L65.5546 33.7409C61.7498 30.1762 56.7599 28 50.7928 28C42.1852 28 34.7211 32.9326 31.0826 40.1244L38.4635 45.8238C40.1892 40.6218 45.0544 36.7461 50.7928 36.7461Z" fill="#E74133"/>
  5035. </g>
  5036. <defs>
  5037. <clipPath id="clip0_168_1253">
  5038. <rect width="44" height="44" fill="white" transform="translate(28 28)"/>
  5039. </clipPath>
  5040. </defs>
  5041. </svg>
  5042. </file>
  5043. <file path="assets/img/ic_home_arrow.svg">
  5044. <svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg">
  5045. <g id="chevron-right">
  5046. <path id="Vector" d="M7.125 14.25L11.875 9.5L7.125 4.75" stroke="#505050" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5047. </g>
  5048. </svg>
  5049. </file>
  5050. <file path="assets/img/ic_info.svg">
  5051. <svg width="15" height="16" viewBox="0 0 15 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5052. <g id="ico / info" clip-path="url(#clip0_24_25325)">
  5053. <path id="Vector" d="M7.5 15.5C9.48912 15.5 11.3968 14.7098 12.8033 13.3033C14.2098 11.8968 15 9.98912 15 8C15 6.01088 14.2098 4.10322 12.8033 2.6967C11.3968 1.29018 9.48912 0.5 7.5 0.5C5.51088 0.5 3.60322 1.29018 2.1967 2.6967C0.790176 4.10322 0 6.01088 0 8C0 9.98912 0.790176 11.8968 2.1967 13.3033C3.60322 14.7098 5.51088 15.5 7.5 15.5ZM8.37188 6.67625L7.43437 11.0872C7.36875 11.4059 7.46156 11.5869 7.71938 11.5869C7.90125 11.5869 8.17594 11.5212 8.3625 11.3562L8.28 11.7463C8.01094 12.0706 7.4175 12.3069 6.90656 12.3069C6.2475 12.3069 5.96719 11.9113 6.14906 11.0703L6.84094 7.81906C6.90094 7.54437 6.84656 7.445 6.57188 7.37844L6.14906 7.3025L6.22594 6.94531L8.37188 6.67625ZM7.5 5.65625C7.25136 5.65625 7.0129 5.55748 6.83709 5.38166C6.66127 5.20585 6.5625 4.96739 6.5625 4.71875C6.5625 4.47011 6.66127 4.23165 6.83709 4.05584C7.0129 3.88002 7.25136 3.78125 7.5 3.78125C7.74864 3.78125 7.9871 3.88002 8.16291 4.05584C8.33873 4.23165 8.4375 4.47011 8.4375 4.71875C8.4375 4.96739 8.33873 5.20585 8.16291 5.38166C7.9871 5.55748 7.74864 5.65625 7.5 5.65625Z" fill="#495871"/>
  5054. </g>
  5055. <defs>
  5056. <clipPath id="clip0_24_25325">
  5057. <rect width="15" height="15" fill="white" transform="translate(0 0.5)"/>
  5058. </clipPath>
  5059. </defs>
  5060. </svg>
  5061. </file>
  5062. <file path="assets/img/ic_issue_flag.svg">
  5063. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5064. <g id="ico / &#236;&#157;&#180;&#236;&#138;&#136;">
  5065. <g id="Layer_3">
  5066. <path id="Vector" d="M12.1412 2H10.5273H10.4504H10.0364H9.34065H9.05885H8.34561H7.89051H7.35058H7.2976V1.40625V1.09375V1H3.5815H1.85547V6.5V13H3.5815V6.5H5.58932H6.64608H7.2976H7.35058V6.75V7.40625V7.5H9.05885H9.34065H9.88678H10.4504H10.5273H12.1412L10.7322 4.75L12.1412 2Z" fill="#E1473D"/>
  5067. </g>
  5068. </g>
  5069. </svg>
  5070. </file>
  5071. <file path="assets/img/ic_kakao.svg">
  5072. <svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
  5073. <circle cx="50" cy="50" r="50" fill="#FAE100"/>
  5074. <path d="M50.0234 27C63.81 27 75 35.8398 75 46.8066C74.9999 57.7733 63.763 66.6132 49.9766 66.6133C48.4186 66.6133 46.8604 66.5186 45.3496 66.2822C42.564 68.1258 36.1427 72.522 35.7178 72.8057C35.1984 73.1365 34.3482 73.1833 34.6787 71.8125C34.9621 70.725 36.3312 65.5728 36.8506 63.6348C29.7214 60.1367 25.0001 53.8971 25 46.8066C25 35.8399 36.2369 27.0001 50.0234 27ZM44.7354 40.7559C44.1216 40.7087 43.5075 40.9455 43.2715 41.5127C42.6573 42.932 40.3442 49.5012 39.5889 51.25C39.0225 52.5263 41.4309 53.5663 41.9502 52.29L42.4697 50.4941H47.1904C47.1826 50.5014 47.0689 50.6415 47.6631 52.2432C48.1828 53.5661 50.6375 52.6676 50.1182 51.2969C49.4099 49.4059 46.9082 42.507 46.4355 41.5127C46.2467 41.04 45.4908 40.7559 44.7354 40.7559ZM67.4932 42.5518C68.0586 41.9842 66.3128 40.2365 65.7461 40.8027C65.1824 41.3201 61.3934 45.1608 61.3555 45.1992C61.3559 45.1766 61.4025 42.7822 61.3555 41.4648C61.3554 40.945 60.741 40.709 60.0801 40.709C59.4191 40.709 58.7109 40.9924 58.7109 41.5596C58.7581 42.5523 58.6641 51.4363 58.6641 52.1006C58.6641 53.1405 61.3076 53.1405 61.3076 52.1006V48.6025L62.0635 47.9883L65.5098 52.5732C66.218 53.4714 68.3426 51.8644 67.6816 50.9189L64.0938 46.1445C64.1224 46.1137 66.5544 43.4916 67.4932 42.5518ZM32.5547 40.6611C31.0438 40.6611 31.0438 43.1191 32.5547 43.1191H35.1514C35.1514 43.1191 35.1514 50.2092 35.1514 51.8643C35.1514 53.046 37.8428 53.0933 37.8428 51.8643V43.2139H40.3916C41.9969 43.2139 41.9969 40.709 40.3916 40.709C38.6055 40.709 32.6109 40.6616 32.5547 40.6611ZM52.4316 40.709C51.6762 40.709 51.0146 41.1343 51.0146 41.8906V51.3447C51.0121 51.3643 50.8349 52.7626 52.0537 52.7627H57.2002C58.4277 52.7627 58.3805 50.21 57.2002 50.21H53.8008V41.8906C53.8008 41.0871 53.0926 40.709 52.4316 40.709ZM46.2939 48.083H43.3193L44.877 43.5918L46.2939 48.083Z" fill="#371D1E"/>
  5075. </svg>
  5076. </file>
  5077. <file path="assets/img/ic_list_off.svg">
  5078. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  5079. <g id="ico / list">
  5080. <path id="Vector" d="M1 6H11" stroke="#8A8A8A" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5081. <path id="Vector_2" d="M1 2H11" stroke="#8A8A8A" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5082. <path id="Vector_3" d="M1 10H11" stroke="#8A8A8A" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5083. </g>
  5084. </svg>
  5085. </file>
  5086. <file path="assets/img/ic_list_on.svg">
  5087. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  5088. <g id="ico / list">
  5089. <path id="Vector" d="M1 6H11" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5090. <path id="Vector_2" d="M1 2H11" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5091. <path id="Vector_3" d="M1 10H11" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5092. </g>
  5093. </svg>
  5094. </file>
  5095. <file path="assets/img/ic_map_card.svg">
  5096. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5097. <g id="ico / &#236;&#185;&#180;&#235;&#147;&#156;" clip-path="url(#clip0_95_84252)">
  5098. <g id="Square Menu">
  5099. <path id="Vector" d="M4.66667 5.66667H1.75C1.48478 5.66667 1.23043 5.56131 1.04289 5.37377C0.855357 5.18624 0.75 4.93188 0.75 4.66667V1.75C0.75 1.48478 0.855357 1.23043 1.04289 1.04289C1.23043 0.855357 1.48478 0.75 1.75 0.75H4.66667C4.93188 0.75 5.18624 0.855357 5.37377 1.04289C5.56131 1.23043 5.66667 1.48478 5.66667 1.75V4.66667C5.66667 4.93188 5.56131 5.18624 5.37377 5.37377C5.18624 5.56131 4.93188 5.66667 4.66667 5.66667Z" stroke="white" stroke-width="1.5"/>
  5100. <path id="Vector_2" d="M12.2487 5.66667H9.33203C9.06681 5.66667 8.81246 5.56131 8.62492 5.37377C8.43739 5.18624 8.33203 4.93188 8.33203 4.66667V1.75C8.33203 1.48478 8.43739 1.23043 8.62492 1.04289C8.81246 0.855357 9.06681 0.75 9.33203 0.75H12.2487C12.5139 0.75 12.7683 0.855357 12.9558 1.04289C13.1433 1.23043 13.2487 1.48478 13.2487 1.75V4.66667C13.2487 4.93188 13.1433 5.18624 12.9558 5.37377C12.7683 5.56131 12.5139 5.66667 12.2487 5.66667Z" stroke="white" stroke-width="1.5"/>
  5101. <path id="Vector_3" d="M4.66667 13.2497H1.75C1.48478 13.2497 1.23043 13.1443 1.04289 12.9568C0.855357 12.7692 0.75 12.5149 0.75 12.2497V9.33301C0.75 9.06779 0.855357 8.81344 1.04289 8.6259C1.23043 8.43836 1.48478 8.33301 1.75 8.33301H4.66667C4.93188 8.33301 5.18624 8.43836 5.37377 8.6259C5.56131 8.81344 5.66667 9.06779 5.66667 9.33301V12.2497C5.66667 12.5149 5.56131 12.7692 5.37377 12.9568C5.18624 13.1443 4.93188 13.2497 4.66667 13.2497Z" stroke="white" stroke-width="1.5"/>
  5102. <path id="Vector_4" d="M12.2487 13.2497H9.33203C9.06681 13.2497 8.81246 13.1443 8.62492 12.9568C8.43739 12.7692 8.33203 12.5149 8.33203 12.2497V9.33301C8.33203 9.06779 8.43739 8.81344 8.62492 8.6259C8.81246 8.43836 9.06681 8.33301 9.33203 8.33301H12.2487C12.5139 8.33301 12.7683 8.43836 12.9558 8.6259C13.1433 8.81344 13.2487 9.06779 13.2487 9.33301V12.2497C13.2487 12.5149 13.1433 12.7692 12.9558 12.9568C12.7683 13.1443 12.5139 13.2497 12.2487 13.2497Z" stroke="white" stroke-width="1.5"/>
  5103. </g>
  5104. </g>
  5105. <defs>
  5106. <clipPath id="clip0_95_84252">
  5107. <rect width="14" height="14" fill="white"/>
  5108. </clipPath>
  5109. </defs>
  5110. </svg>
  5111. </file>
  5112. <file path="assets/img/ic_map_pin.svg">
  5113. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5114. <g id="ico / &#236;&#167;&#128;&#235;&#143;&#132;" clip-path="url(#clip0_95_84225)">
  5115. <g id="Group 231">
  5116. <path id="Vector" d="M6.99998 12.5C6.88498 12.5 6.76948 12.4605 6.67598 12.381C6.55499 12.278 3.70499 9.83097 2.516 7.16198C2.4035 6.90998 2.517 6.61398 2.7695 6.50198C3.021 6.38998 3.317 6.50298 3.4295 6.75548C4.29899 8.70797 6.21799 10.605 6.99148 11.3205C8.35648 9.99547 11 7.03448 11 5.11498C11 2.84599 9.20548 0.999997 6.99998 0.999997C4.79449 0.999997 3 2.84599 3 5.11498C3 5.39098 2.776 5.61498 2.5 5.61498C2.224 5.61498 2 5.39098 2 5.11498C2 2.29449 4.24299 0 6.99998 0C9.75698 0 12 2.29449 12 5.11498C12 8.07097 7.52798 12.1945 7.33748 12.369C7.24198 12.456 7.12098 12.5 6.99998 12.5Z" fill="white"/>
  5117. <path id="Vector_2" d="M6.99999 6.99999C5.897 6.99999 5 6.10299 5 4.99999C5 3.897 5.897 3 6.99999 3C8.10299 3 8.99999 3.897 8.99999 4.99999C8.99999 6.10299 8.10299 6.99999 6.99999 6.99999ZM6.99999 4C6.4485 4 6 4.4485 6 4.99999C6 5.55149 6.4485 5.99999 6.99999 5.99999C7.55149 5.99999 7.99999 5.55149 7.99999 4.99999C7.99999 4.4485 7.55149 4 6.99999 4Z" fill="white"/>
  5118. <path id="Vector_3" d="M13.5 14.0003H0.5C0.322001 14.0003 0.157002 13.9058 0.0675019 13.7514C-0.0219978 13.5969 -0.0224978 13.4074 0.0660019 13.2524L2.066 9.75236C2.20299 9.51286 2.50849 9.42886 2.74799 9.56636C2.98749 9.70336 3.07099 10.0089 2.93399 10.2484L1.3615 13.0004H12.638L11.0655 10.2484C10.9285 10.0089 11.012 9.70336 11.2515 9.56636C11.491 9.42836 11.7965 9.51286 11.9335 9.75236L13.9335 13.2524C14.022 13.4074 14.0215 13.5969 13.932 13.7514C13.843 13.9058 13.678 14.0003 13.5 14.0003Z" fill="white"/>
  5119. </g>
  5120. </g>
  5121. <defs>
  5122. <clipPath id="clip0_95_84225">
  5123. <rect width="14" height="14" fill="white"/>
  5124. </clipPath>
  5125. </defs>
  5126. </svg>
  5127. </file>
  5128. <file path="assets/img/ic_mapt_chv.svg">
  5129. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5130. <g id="chevron-right">
  5131. <path id="Vector" d="M5.25 10.5L8.75 7L5.25 3.5" stroke="#C5C5C5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  5132. </g>
  5133. </svg>
  5134. </file>
  5135. <file path="assets/img/ic_more_btn.svg">
  5136. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  5137. <g id="plus-circle" clip-path="url(#clip0_107_29365)">
  5138. <path id="Vector" d="M10.0003 18.3337C14.6027 18.3337 18.3337 14.6027 18.3337 10.0003C18.3337 5.39795 14.6027 1.66699 10.0003 1.66699C5.39795 1.66699 1.66699 5.39795 1.66699 10.0003C1.66699 14.6027 5.39795 18.3337 10.0003 18.3337Z" stroke="#6780A8" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5139. <path id="Vector_2" d="M10 6.66699V13.3337" stroke="#6780A8" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5140. <path id="Vector_3" d="M6.66699 10H13.3337" stroke="#6780A8" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5141. </g>
  5142. <defs>
  5143. <clipPath id="clip0_107_29365">
  5144. <rect width="20" height="20" fill="white"/>
  5145. </clipPath>
  5146. </defs>
  5147. </svg>
  5148. </file>
  5149. <file path="assets/img/ic_more_plust_gray.svg">
  5150. <svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
  5151. <g clip-path="url(#clip0_222_66373)">
  5152. <path d="M10 0.5C8.02219 0.5 6.08879 1.08649 4.4443 2.1853C2.79981 3.28412 1.51809 4.8459 0.761209 6.67316C0.00433284 8.50042 -0.1937 10.5111 0.192152 12.4509C0.578004 14.3907 1.53041 16.1725 2.92894 17.5711C4.32746 18.9696 6.10929 19.922 8.0491 20.3078C9.98891 20.6937 11.9996 20.4957 13.8268 19.7388C15.6541 18.9819 17.2159 17.7002 18.3147 16.0557C19.4135 14.4112 20 12.4778 20 10.5C19.9949 7.84939 18.9397 5.30881 17.0655 3.43455C15.1912 1.56028 12.6506 0.505083 10 0.5ZM13.8462 11.2692H10.7692V14.3462C10.7692 14.5502 10.6882 14.7458 10.5439 14.8901C10.3997 15.0343 10.204 15.1154 10 15.1154C9.79599 15.1154 9.60033 15.0343 9.45607 14.8901C9.31182 14.7458 9.23077 14.5502 9.23077 14.3462V11.2692H6.15385C5.94984 11.2692 5.75418 11.1882 5.60992 11.0439C5.46566 10.8997 5.38462 10.704 5.38462 10.5C5.38462 10.296 5.46566 10.1003 5.60992 9.95607C5.75418 9.81181 5.94984 9.73077 6.15385 9.73077H9.23077V6.65384C9.23077 6.44983 9.31182 6.25418 9.45607 6.10992C9.60033 5.96566 9.79599 5.88461 10 5.88461C10.204 5.88461 10.3997 5.96566 10.5439 6.10992C10.6882 6.25418 10.7692 6.44983 10.7692 6.65384V9.73077H13.8462C14.0502 9.73077 14.2458 9.81181 14.3901 9.95607C14.5343 10.1003 14.6154 10.296 14.6154 10.5C14.6154 10.704 14.5343 10.8997 14.3901 11.0439C14.2458 11.1882 14.0502 11.2692 13.8462 11.2692Z" fill="#8B8B8B"/>
  5153. </g>
  5154. <defs>
  5155. <clipPath id="clip0_222_66373">
  5156. <rect width="20" height="20" fill="white" transform="translate(0 0.5)"/>
  5157. </clipPath>
  5158. </defs>
  5159. </svg>
  5160. </file>
  5161. <file path="assets/img/ic_naver.svg">
  5162. <svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
  5163. <circle cx="50" cy="50" r="50" fill="#2DB400"/>
  5164. <path d="M54.7634 36V49.8672L45.2639 36H35V63.4886H45.2366V49.6215L54.7361 63.4886H65V36H54.7634Z" fill="white"/>
  5165. </svg>
  5166. </file>
  5167. <file path="assets/img/ic_no_img.svg">
  5168. <svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
  5169. <rect width="90" height="90" rx="10" fill="#F3F5F9"/>
  5170. <g clip-path="url(#clip0_204_1289)">
  5171. <path d="M58.125 23.2007L56.7993 21.875L31.875 46.7993L33.2007 48.125L35.0757 46.25H54.375C54.8721 46.2493 55.3486 46.0516 55.7001 45.7001C56.0516 45.3486 56.2493 44.8721 56.25 44.375V25.0757L58.125 23.2007ZM54.375 44.375H36.9507L44.2566 37.0691L46.4867 39.2991C46.8383 39.6507 47.3152 39.8483 47.8125 39.8483C48.3098 39.8483 48.7867 39.6507 49.1383 39.2991L50.625 37.8125L54.375 41.56V44.375ZM54.375 38.9077L51.9508 36.4834C51.5992 36.1318 51.1223 35.9342 50.625 35.9342C50.1277 35.9342 49.6508 36.1318 49.2992 36.4834L47.8125 37.9702L45.5841 35.7417L54.375 26.9507V38.9077Z" fill="#9DA3B0"/>
  5172. <path d="M35.625 40.625V37.8125L40.3125 33.1282L41.6 34.4157L42.9274 33.0882L41.6383 31.7991C41.2867 31.4475 40.8098 31.2499 40.3125 31.2499C39.8152 31.2499 39.3383 31.4475 38.9867 31.7991L35.625 35.1609V25.625H50.625V23.75H35.625C35.1279 23.7505 34.6512 23.9482 34.2997 24.2997C33.9482 24.6512 33.7505 25.1279 33.75 25.625V40.625H35.625Z" fill="#9DA3B0"/>
  5173. </g>
  5174. <path d="M18.0705 60.82L22.9205 67.06V60.77H23.9805V68.78H22.9905L18.1405 62.54V68.83H17.0905V60.82H18.0705ZM29.574 69.01C28.774 69.01 28.0507 68.83 27.404 68.47C26.764 68.11 26.2607 67.61 25.894 66.97C25.5273 66.33 25.344 65.6133 25.344 64.82C25.344 64.0267 25.524 63.31 25.884 62.67C26.2507 62.03 26.754 61.53 27.394 61.17C28.0407 60.81 28.764 60.63 29.564 60.63C30.364 60.63 31.084 60.81 31.724 61.17C32.3707 61.53 32.8773 62.03 33.244 62.67C33.6107 63.31 33.794 64.0267 33.794 64.82C33.794 65.6133 33.6107 66.33 33.244 66.97C32.884 67.61 32.3807 68.11 31.734 68.47C31.094 68.83 30.374 69.01 29.574 69.01ZM29.574 68.05C30.174 68.05 30.714 67.9133 31.194 67.64C31.6807 67.36 32.0607 66.9767 32.334 66.49C32.6073 65.9967 32.744 65.44 32.744 64.82C32.744 64.2 32.6073 63.6467 32.334 63.16C32.0607 62.6667 31.6807 62.2833 31.194 62.01C30.714 61.73 30.1707 61.59 29.564 61.59C28.9573 61.59 28.414 61.73 27.934 62.01C27.454 62.2833 27.0773 62.6667 26.804 63.16C26.5307 63.6467 26.394 64.2 26.394 64.82C26.394 65.44 26.5307 65.9967 26.804 66.49C27.0773 66.9767 27.4573 67.36 27.944 67.64C28.4307 67.9133 28.974 68.05 29.574 68.05ZM39.0291 68.83H37.9791V60.82H39.0291V68.83ZM41.6726 60.82L44.7626 66.26L47.8526 60.82H48.7726V68.83H47.7226V62.92L45.1426 67.48H44.3826L41.8026 62.92V68.83H40.7526V60.82H41.6726ZM55.5791 66.85H51.7291L50.9291 68.83H49.8291L53.1291 60.82H54.2391L57.5291 68.83H56.3791L55.5791 66.85ZM55.2091 65.92L53.6591 62.05L52.0991 65.92H55.2091ZM62.024 69.01C61.2173 69.01 60.494 68.83 59.854 68.47C59.2207 68.11 58.724 67.6133 58.364 66.98C58.004 66.34 57.824 65.62 57.824 64.82C57.824 64.02 58.004 63.3033 58.364 62.67C58.724 62.03 59.2207 61.53 59.854 61.17C60.494 60.81 61.2173 60.63 62.024 60.63C62.684 60.63 63.2907 60.75 63.844 60.99C64.404 61.2233 64.8707 61.5467 65.244 61.96C65.6173 62.3733 65.874 62.8367 66.014 63.35H64.874C64.7673 63.0167 64.574 62.7167 64.294 62.45C64.0207 62.1833 63.6873 61.9733 63.294 61.82C62.9073 61.6667 62.4907 61.59 62.044 61.59C61.4373 61.59 60.8907 61.73 60.404 62.01C59.924 62.2833 59.5473 62.6667 59.274 63.16C59.0073 63.6467 58.874 64.2 58.874 64.82C58.874 65.44 59.0073 66 59.274 66.5C59.5473 66.9933 59.9273 67.38 60.414 67.66C60.9007 67.9333 61.4507 68.07 62.064 68.07C62.604 68.07 63.0907 67.96 63.524 67.74C63.964 67.52 64.3173 67.22 64.584 66.84C64.8507 66.4533 65.004 66.02 65.044 65.54H61.854V64.63H66.164V64.99C66.164 65.7633 65.9807 66.4567 65.614 67.07C65.254 67.6767 64.7573 68.15 64.124 68.49C63.4973 68.8367 62.7973 69.01 62.024 69.01ZM73.1906 60.82V61.75H68.5506V64.27H72.8406V65.2H68.5506V67.9H73.2806V68.83H67.5006V60.82H73.1906Z" fill="#7B7E87"/>
  5175. <defs>
  5176. <clipPath id="clip0_204_1289">
  5177. <rect width="30" height="30" fill="white" transform="translate(30 20)"/>
  5178. </clipPath>
  5179. </defs>
  5180. </svg>
  5181. </file>
  5182. <file path="assets/img/ic_no_tree.svg">
  5183. <svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
  5184. <g id="ico / &#236;&#160;&#149;&#235;&#179;&#180;&#236;&#151;&#134;&#236;&#157;&#140;" clip-path="url(#clip0_8_10889)">
  5185. <path id="Vector" d="M25.2 0H10.8C4.8438 0 0 4.8438 0 10.8V34.2C0 34.6774 0.189642 35.1352 0.527208 35.4728C0.864773 35.8104 1.32261 36 1.8 36H25.2C31.1562 36 36 31.1562 36 25.2V10.8C36 4.8438 31.1562 0 25.2 0ZM26.4708 23.9274L23.9256 26.4726L18 20.547L12.0744 26.4726L9.5292 23.9274L15.4548 18.0018L9.5292 12.0762L12.0744 9.531L18 15.4566L23.9256 9.531L26.4708 12.0762L20.5452 18.0018L26.4708 23.9274Z" fill="#438DFF"/>
  5186. </g>
  5187. <defs>
  5188. <clipPath id="clip0_8_10889">
  5189. <rect width="36" height="36" fill="white"/>
  5190. </clipPath>
  5191. </defs>
  5192. </svg>
  5193. </file>
  5194. <file path="assets/img/ic_preview_nw.svg">
  5195. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  5196. <g id="search">
  5197. <g id="Group 209">
  5198. <path id="Vector" d="M9.33333 14.6667C12.2789 14.6667 14.6667 12.2789 14.6667 9.33333C14.6667 6.38781 12.2789 4 9.33333 4C6.38781 4 4 6.38781 4 9.33333C4 12.2789 6.38781 14.6667 9.33333 14.6667Z" stroke="#8E8E8E" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5199. <path id="Vector_2" d="M16.0001 16.0016L13.1001 13.1016" stroke="#8E8E8E" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5200. </g>
  5201. </g>
  5202. </svg>
  5203. </file>
  5204. <file path="assets/img/ic_radio_off.svg">
  5205. <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
  5206. <rect x="0.5" y="0.5" width="14" height="14" rx="7" fill="white"/>
  5207. <rect x="0.5" y="0.5" width="14" height="14" rx="7" stroke="#C5D8E8"/>
  5208. </svg>
  5209. </file>
  5210. <file path="assets/img/ic_radio_on.svg">
  5211. <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
  5212. <rect width="15" height="15" rx="7.5" fill="#0647FF"/>
  5213. <circle cx="7.5" cy="7.5" r="4.5" fill="white"/>
  5214. </svg>
  5215. </file>
  5216. <file path="assets/img/ic_sch_nw.svg">
  5217. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5218. <g id="search">
  5219. <path id="Vector" d="M7.33333 12.6667C10.2789 12.6667 12.6667 10.2789 12.6667 7.33333C12.6667 4.38781 10.2789 2 7.33333 2C4.38781 2 2 4.38781 2 7.33333C2 10.2789 4.38781 12.6667 7.33333 12.6667Z" stroke="#8E8E8E" stroke-linecap="round" stroke-linejoin="round"/>
  5220. <path id="Vector_2" d="M13.9996 14.0016L11.0996 11.1016" stroke="#8E8E8E" stroke-linecap="round" stroke-linejoin="round"/>
  5221. </g>
  5222. </svg>
  5223. </file>
  5224. <file path="assets/img/ic_sts.svg">
  5225. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5226. <g id="ico" clip-path="url(#clip0_214_65424)">
  5227. <path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M-3.0598e-07 7C-3.24757e-07 6.57043 0.348226 6.22222 0.777778 6.22222L9.4661 6.22222C9.78639 5.31596 10.6507 4.66667 11.6667 4.66667C12.9554 4.66667 14 5.7113 14 7C14 8.2887 12.9554 9.33333 11.6667 9.33333C10.6507 9.33333 9.78639 8.68404 9.4661 7.77778L0.777778 7.77778C0.348226 7.77778 -2.87203e-07 7.42957 -3.0598e-07 7ZM-5.09966e-07 2.33333C-5.28743e-07 1.90377 0.348226 1.55556 0.777777 1.55556L4.79944 1.55556C5.11975 0.64929 5.98407 6.92102e-07 7 6.47695e-07C8.01593 6.03287e-07 8.88028 0.64929 9.20057 1.55556L13.2222 1.55556C13.6518 1.55556 14 1.90377 14 2.33333C14 2.7629 13.6518 3.11111 13.2222 3.11111L9.20057 3.11111C8.88028 4.01738 8.01593 4.66667 7 4.66667C5.98407 4.66667 5.11975 4.01738 4.79944 3.11111L0.777777 3.11111C0.348226 3.11111 -4.91189e-07 2.7629 -5.09966e-07 2.33333ZM2.33333 14C1.04467 14 -4.56641e-08 12.9553 -1.01993e-07 11.6667C-1.58322e-07 10.378 1.04467 9.33333 2.33333 9.33333C3.34928 9.33333 4.21358 9.98263 4.53389 10.8889L13.2222 10.8889C13.6518 10.8889 14 11.2371 14 11.6667C14 12.0962 13.6518 12.4444 13.2222 12.4444L4.53389 12.4444C4.21358 13.3507 3.34928 14 2.33333 14ZM1.55556 11.6667C1.55556 12.0962 1.90378 12.4444 2.33333 12.4444C2.76288 12.4444 3.11111 12.0962 3.11111 11.6667C3.11111 11.2371 2.76288 10.8889 2.33333 10.8889C1.90378 10.8889 1.55556 11.2371 1.55556 11.6667ZM6.22222 2.33333C6.22222 2.7629 6.57043 3.11111 7 3.11111C7.42957 3.11111 7.77778 2.7629 7.77778 2.33333C7.77778 1.90377 7.42957 1.55556 7 1.55556C6.57043 1.55556 6.22222 1.90377 6.22222 2.33333ZM10.8889 7C10.8889 7.42957 11.2371 7.77778 11.6667 7.77778C12.0962 7.77778 12.4444 7.42957 12.4444 7C12.4444 6.57043 12.0962 6.22222 11.6667 6.22222C11.2371 6.22222 10.8889 6.57043 10.8889 7Z" fill="#555555"/>
  5228. </g>
  5229. <defs>
  5230. <clipPath id="clip0_214_65424">
  5231. <rect width="14" height="14" fill="white" transform="translate(0 14) rotate(-90)"/>
  5232. </clipPath>
  5233. </defs>
  5234. </svg>
  5235. </file>
  5236. <file path="assets/img/ic_tab01.svg">
  5237. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  5238. <g id="ico / &#234;&#182;&#140;&#237;&#149;&#156;">
  5239. <g id="C_-_11_x2C__Stamp_x2C__Approval_x2C__authority_x2C__legal_x2C__mark_x2C__rubber_x2C__seal">
  5240. <g id="Group">
  5241. <path id="Vector" d="M4.90978 5.98597C4.72235 6.71021 4.52899 7.45733 4.41171 8.01132H5.89022V5.14318C5.89022 5.08252 5.93939 5.03335 6.00005 5.03335C6.0607 5.03335 6.10988 5.08252 6.10988 5.14318V8.0113H7.58829C7.47106 7.45761 7.27779 6.71089 7.09046 5.98688C6.87905 5.16999 6.66045 4.3253 6.54553 3.73855C6.53595 3.68966 6.56051 3.64039 6.60535 3.61864C7.08537 3.38572 7.38354 2.91134 7.38354 2.38055C7.38354 1.62148 6.76287 1.00391 5.99988 1.00391C5.23706 1.00391 4.61646 1.62148 4.61646 2.38055C4.61646 2.91148 4.91466 3.38588 5.39471 3.61862C5.43959 3.64037 5.46415 3.68961 5.45456 3.73855C5.33958 4.32542 5.12107 5.16959 4.90978 5.98597ZM6.00706 1.61502C6.01411 1.61546 6.71524 1.67089 6.79029 2.59423C6.79521 2.65468 6.75021 2.70767 6.68974 2.71259C6.68672 2.71285 6.68372 2.71297 6.68072 2.71297C6.6241 2.71297 6.57607 2.66947 6.57138 2.61205C6.51153 1.87578 5.99822 1.83453 5.99306 1.8342C5.93253 1.83031 5.88659 1.77814 5.89048 1.7176C5.89432 1.65709 5.94645 1.61101 6.00706 1.61502Z" fill="white"/>
  5242. <path id="Vector_2" d="M8.77841 9.92523H9.7371V9.07776C9.7371 8.61055 9.35495 8.23047 8.88519 8.23047H7.72353H7.72307H4.27698H3.11478C2.64505 8.23047 2.26288 8.61058 2.26288 9.07776V9.92523H3.22166H8.77841Z" fill="white"/>
  5243. <path id="Vector_3" d="M11.0515 10.7757H8.66856V10.1445H3.33149V10.7757H0.948482C0.887849 10.7757 0.838654 10.8249 0.838654 10.8856C0.838654 10.9462 0.887849 10.9954 0.948482 10.9954H11.0515C11.1122 10.9954 11.1613 10.9462 11.1613 10.8856C11.1613 10.8249 11.1122 10.7757 11.0515 10.7757Z" fill="white"/>
  5244. </g>
  5245. </g>
  5246. </g>
  5247. </svg>
  5248. </file>
  5249. <file path="assets/img/ic_tab02.svg">
  5250. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  5251. <g id="ico / &#234;&#184;&#180;&#234;&#184;&#137;" clip-path="url(#clip0_86_24581)">
  5252. <g id="Layer 2">
  5253. <path id="Vector" d="M11.4 8.4H10.8V4.8C10.8 3.52696 10.2943 2.30606 9.39411 1.40589C8.49394 0.505713 7.27304 0 6 0C4.72696 0 3.50606 0.505713 2.60589 1.40589C1.70571 2.30606 1.2 3.52696 1.2 4.8V8.4H0.6C0.44087 8.4 0.288258 8.46321 0.175736 8.57574C0.0632141 8.68826 0 8.84087 0 9V11.4C0 11.5591 0.0632141 11.7117 0.175736 11.8243C0.288258 11.9368 0.44087 12 0.6 12H11.4C11.5591 12 11.7117 11.9368 11.8243 11.8243C11.9368 11.7117 12 11.5591 12 11.4V9C12 8.84087 11.9368 8.68826 11.8243 8.57574C11.7117 8.46321 11.5591 8.4 11.4 8.4ZM6 2.4V3.6C5.68174 3.6 5.37652 3.72643 5.15147 3.95147C4.92643 4.17652 4.8 4.48174 4.8 4.8H3.6C3.6 4.16348 3.85286 3.55303 4.30294 3.10294C4.75303 2.65286 5.36348 2.4 6 2.4ZM10.8 10.8H1.2V9.6H10.8V10.8Z" fill="white"/>
  5254. </g>
  5255. </g>
  5256. <defs>
  5257. <clipPath id="clip0_86_24581">
  5258. <rect width="12" height="12" fill="white"/>
  5259. </clipPath>
  5260. </defs>
  5261. </svg>
  5262. </file>
  5263. <file path="assets/img/ic_tab03.svg">
  5264. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  5265. <g id="ico / &#236;&#154;&#180;&#236;&#152;&#129;" clip-path="url(#clip0_86_17395)">
  5266. <path id="Vector" d="M1.15795 2.94218L0.0277495 1.07201L0.781214 0.323941L2.66487 1.44604V2.19411L4.60235 4.11772C4.60235 4.17115 4.60235 4.22459 4.60235 4.27802L3.90271 4.91922L1.91141 2.94218H1.15795ZM9.23077 7.48403C9.06932 7.48403 8.96168 7.48403 8.80022 7.48403C8.42349 7.48403 8.10058 7.4306 7.77767 7.37717L6.64747 8.65957L9.17696 11.4915C9.76896 12.1327 10.7915 12.1862 11.3835 11.545C12.0294 10.9038 11.9755 9.94197 11.3297 9.35421L9.23077 7.48403ZM11.0606 5.45356C11.9217 4.59862 12.1908 3.31622 11.8679 2.19411C11.8141 1.98038 11.545 1.92695 11.4373 2.08725L9.55369 3.95742L8.04676 2.46128L9.93042 0.591108C10.0919 0.430808 10.0381 0.217074 9.82278 0.16364C8.69259 -0.210395 7.40093 0.0567731 6.53983 0.965143C5.57109 1.92695 5.35582 3.42309 5.89401 4.59862L0.512119 9.35421C-0.133707 9.94197 -0.187526 10.9572 0.4583 11.545C1.10413 12.1862 2.07287 12.1327 2.66487 11.4915L7.45475 6.1482C8.63877 6.68253 10.0919 6.4688 11.0606 5.45356Z" fill="white"/>
  5267. </g>
  5268. <defs>
  5269. <clipPath id="clip0_86_17395">
  5270. <rect width="12" height="12" fill="white"/>
  5271. </clipPath>
  5272. </defs>
  5273. </svg>
  5274. </file>
  5275. <file path="assets/img/ic_tab04.svg">
  5276. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  5277. <g id="ico / IP">
  5278. <path id="Vector" d="M9.85712 4C9.36339 4.00064 8.88498 4.16012 8.50254 4.45157C8.1201 4.74302 7.85701 5.14862 7.7576 5.6H4.2424C4.13619 5.11439 3.84057 4.68287 3.41286 4.38912C2.98515 4.09538 2.45581 3.96032 1.92747 4.01013C1.39913 4.05995 0.909426 4.29109 0.553301 4.65874C0.197176 5.0264 0 5.50437 0 6C0 6.49563 0.197176 6.9736 0.553301 7.34126C0.909426 7.70891 1.39913 7.94005 1.92747 7.98987C2.45581 8.03968 2.98515 7.90462 3.41286 7.61088C3.84057 7.31713 4.13619 6.88562 4.2424 6.4H7.7576C7.8387 6.77078 8.03083 7.11249 8.3117 7.38542C8.59256 7.65835 8.95063 7.8513 9.34431 7.94187C9.73798 8.03244 10.1511 8.01691 10.5357 7.89708C10.9203 7.77724 11.2606 7.55803 11.517 7.2649C11.7734 6.97176 11.9355 6.61674 11.9844 6.24107C12.0332 5.8654 11.9669 5.4845 11.7931 5.14261C11.6193 4.80072 11.3451 4.51187 11.0024 4.30961C10.6597 4.10736 10.2626 4 9.85712 4ZM9.85712 7.2C9.60283 7.2 9.35425 7.12962 9.14282 6.99776C8.93139 6.8659 8.76659 6.67849 8.66928 6.45922C8.57197 6.23995 8.54651 5.99867 8.59612 5.76589C8.64573 5.53312 8.76818 5.3193 8.94799 5.15147C9.1278 4.98365 9.35689 4.86936 9.60629 4.82306C9.85569 4.77676 10.1142 4.80052 10.3491 4.89135C10.5841 4.98217 10.7849 5.13598 10.9261 5.33332C11.0674 5.53066 11.1428 5.76266 11.1428 6C11.1425 6.31815 11.0069 6.62317 10.7658 6.84814C10.5248 7.07311 10.198 7.19965 9.85712 7.2Z" fill="white"/>
  5279. </g>
  5280. </svg>
  5281. </file>
  5282. <file path="assets/img/ic_tack_off.svg">
  5283. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5284. <g id="ico / tack (off)" clip-path="url(#clip0_214_65518)">
  5285. <path id="Vector" d="M6.75376 6.71751L9.22863 4.24264C9.28019 4.19108 9.30597 4.13216 9.30597 4.06586C9.30597 3.99957 9.28019 3.94065 9.22863 3.88909C9.17707 3.83753 9.11814 3.81175 9.05185 3.81175C8.98556 3.81175 8.92664 3.83753 8.87508 3.88909L6.4002 6.36396C6.34864 6.41552 6.32286 6.47445 6.32286 6.54074C6.32286 6.60703 6.34864 6.66595 6.4002 6.71751C6.45176 6.76907 6.51069 6.79485 6.57698 6.79485C6.64327 6.79485 6.7022 6.76907 6.75376 6.71751ZM8.52152 12.3744C8.42577 12.4701 8.30792 12.518 8.16797 12.518C8.02802 12.518 7.91017 12.4701 7.81442 12.3744L5.4445 10.0045L2.49454 12.3909C2.44298 12.4278 2.3859 12.4462 2.32329 12.4462C2.26068 12.4462 2.20728 12.4241 2.16309 12.3799L2.15756 12.3744C2.05812 12.2749 2.04892 12.1663 2.12994 12.0484L4.38937 8.94932L2.15756 6.71751C2.06181 6.62176 2.01393 6.50391 2.01393 6.36396C2.01393 6.22401 2.06181 6.10616 2.15756 6.01041C2.61055 5.55742 3.16298 5.29409 3.81484 5.22044C4.46671 5.14678 4.97494 5.29225 5.33954 5.65685L8.16797 2.82843C7.97646 2.63692 7.88071 2.40122 7.88071 2.12132C7.88071 1.84142 7.97646 1.60572 8.16797 1.41421C8.35948 1.22271 8.59518 1.12695 8.87508 1.12695C9.15497 1.12695 9.39067 1.22271 9.58218 1.41421L13.1177 4.94975C13.3092 5.14126 13.405 5.37696 13.405 5.65685C13.405 5.93675 13.3092 6.17245 13.1177 6.36396C12.9262 6.55547 12.6905 6.65122 12.4106 6.65122C12.1307 6.65122 11.895 6.55547 11.7035 6.36396L8.87508 9.19239C9.23968 9.55699 9.38515 10.0652 9.31149 10.7171C9.23784 11.369 8.97451 11.9214 8.52152 12.3744Z" fill="#BFBFBF"/>
  5286. </g>
  5287. <defs>
  5288. <clipPath id="clip0_214_65518">
  5289. <rect width="14" height="14" fill="white"/>
  5290. </clipPath>
  5291. </defs>
  5292. </svg>
  5293. </file>
  5294. <file path="assets/img/ic_tack_on.svg">
  5295. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5296. <g id="ico / tack (on)" clip-path="url(#clip0_95_84160)">
  5297. <path id="Vector" d="M6.75376 6.71751L9.22863 4.24264C9.28019 4.19108 9.30597 4.13216 9.30597 4.06586C9.30597 3.99957 9.28019 3.94065 9.22863 3.88909C9.17707 3.83753 9.11814 3.81175 9.05185 3.81175C8.98556 3.81175 8.92664 3.83753 8.87508 3.88909L6.4002 6.36396C6.34864 6.41552 6.32286 6.47445 6.32286 6.54074C6.32286 6.60703 6.34864 6.66595 6.4002 6.71751C6.45176 6.76907 6.51069 6.79485 6.57698 6.79485C6.64327 6.79485 6.7022 6.76907 6.75376 6.71751ZM8.52152 12.3744C8.42577 12.4701 8.30792 12.518 8.16797 12.518C8.02802 12.518 7.91017 12.4701 7.81442 12.3744L5.4445 10.0045L2.49454 12.3909C2.44298 12.4278 2.3859 12.4462 2.32329 12.4462C2.26068 12.4462 2.20728 12.4241 2.16309 12.3799L2.15756 12.3744C2.05812 12.2749 2.04892 12.1663 2.12994 12.0484L4.38937 8.94932L2.15756 6.71751C2.06181 6.62176 2.01393 6.50391 2.01393 6.36396C2.01393 6.22401 2.06181 6.10616 2.15756 6.01041C2.61055 5.55742 3.16298 5.29409 3.81484 5.22044C4.46671 5.14678 4.97494 5.29225 5.33954 5.65685L8.16797 2.82843C7.97646 2.63692 7.88071 2.40122 7.88071 2.12132C7.88071 1.84142 7.97646 1.60572 8.16797 1.41421C8.35948 1.22271 8.59518 1.12695 8.87508 1.12695C9.15497 1.12695 9.39067 1.22271 9.58218 1.41421L13.1177 4.94975C13.3092 5.14126 13.405 5.37696 13.405 5.65685C13.405 5.93675 13.3092 6.17245 13.1177 6.36396C12.9262 6.55547 12.6905 6.65122 12.4106 6.65122C12.1307 6.65122 11.895 6.55547 11.7035 6.36396L8.87508 9.19239C9.23968 9.55699 9.38515 10.0652 9.31149 10.7171C9.23784 11.369 8.97451 11.9214 8.52152 12.3744Z" fill="#3F5984"/>
  5298. </g>
  5299. <defs>
  5300. <clipPath id="clip0_95_84160">
  5301. <rect width="14" height="14" fill="white"/>
  5302. </clipPath>
  5303. </defs>
  5304. </svg>
  5305. </file>
  5306. <file path="assets/img/ic_tenant_small_white.svg">
  5307. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5308. <path d="M1.66661 5.90577L7.66661 9.37244C7.76795 9.43095 7.88291 9.46176 7.99994 9.46176C8.11696 9.46176 8.23193 9.43095 8.33327 9.37244L14.3333 5.90577C14.434 5.8476 14.5178 5.76408 14.5763 5.6635C14.6348 5.56292 14.6659 5.44878 14.6666 5.33244C14.6671 5.21497 14.6365 5.09946 14.578 4.99761C14.5194 4.89575 14.435 4.81118 14.3333 4.75244L8.33327 1.29244C8.23193 1.23393 8.11696 1.20312 7.99994 1.20312C7.88291 1.20312 7.76795 1.23393 7.66661 1.29244L1.66661 4.75244C1.56487 4.81118 1.48046 4.89575 1.42192 4.99761C1.36339 5.09946 1.33281 5.21497 1.33327 5.33244C1.33397 5.44878 1.36511 5.56292 1.42359 5.6635C1.48207 5.76408 1.56585 5.8476 1.66661 5.90577ZM7.99994 2.66577L12.6666 5.33244L7.99994 7.99911L3.33327 5.33244L7.99994 2.66577ZM13.6666 7.44578L7.99994 10.6658L2.33327 7.41911C2.25718 7.37503 2.17313 7.34644 2.08594 7.33498C1.99875 7.32353 1.91016 7.32943 1.82527 7.35236C1.74038 7.37529 1.66086 7.41478 1.59129 7.46857C1.52173 7.52236 1.46349 7.58938 1.41994 7.66577C1.33302 7.81885 1.31018 8.00009 1.35639 8.16995C1.4026 8.33981 1.51412 8.4845 1.66661 8.57244L7.66661 12.0391C7.76795 12.0976 7.88291 12.1284 7.99994 12.1284C8.11696 12.1284 8.23193 12.0976 8.33327 12.0391L14.3333 8.57244C14.4858 8.4845 14.5973 8.33981 14.6435 8.16995C14.6897 8.00009 14.6669 7.81885 14.5799 7.66577C14.5364 7.58938 14.4781 7.52236 14.4086 7.46857C14.339 7.41478 14.2595 7.37529 14.1746 7.35236C14.0897 7.32943 14.0011 7.32353 13.9139 7.33498C13.8268 7.34644 13.7427 7.37503 13.6666 7.41911V7.44578ZM13.6666 10.1124L7.99994 13.3324L2.33327 10.0858C2.25718 10.0417 2.17313 10.0131 2.08594 10.0016C1.99875 9.99019 1.91016 9.9961 1.82527 10.019C1.74038 10.042 1.66086 10.0815 1.59129 10.1352C1.52173 10.189 1.46349 10.2561 1.41994 10.3324C1.33302 10.4855 1.31018 10.6668 1.35639 10.8366C1.4026 11.0065 1.51412 11.1512 1.66661 11.2391L7.66661 14.7058C7.76795 14.7643 7.88291 14.7951 7.99994 14.7951C8.11696 14.7951 8.23193 14.7643 8.33327 14.7058L14.3333 11.2391C14.4858 11.1512 14.5973 11.0065 14.6435 10.8366C14.6897 10.6668 14.6669 10.4855 14.5799 10.3324C14.5364 10.2561 14.4781 10.189 14.4086 10.1352C14.339 10.0815 14.2595 10.042 14.1746 10.019C14.0897 9.9961 14.0011 9.99019 13.9139 10.0016C13.8268 10.0131 13.7427 10.0417 13.6666 10.0858V10.1124Z" fill="white"/>
  5309. </svg>
  5310. </file>
  5311. <file path="assets/img/ic_tenant_small.svg">
  5312. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5313. <g id="ico / &#237;&#133;&#140;&#235;&#132;&#140;&#237;&#138;&#184;">
  5314. <path id="Vector" d="M1.66563 5.90577L7.66563 9.37244C7.76698 9.43095 7.88194 9.46176 7.99896 9.46176C8.11599 9.46176 8.23095 9.43095 8.3323 9.37244L14.3323 5.90577C14.4331 5.8476 14.5168 5.76408 14.5753 5.6635C14.6338 5.56292 14.6649 5.44878 14.6656 5.33244C14.6661 5.21497 14.6355 5.09946 14.577 4.99761C14.5184 4.89575 14.434 4.81118 14.3323 4.75244L8.3323 1.29244C8.23095 1.23393 8.11599 1.20312 7.99896 1.20312C7.88194 1.20312 7.76698 1.23393 7.66563 1.29244L1.66563 4.75244C1.56389 4.81118 1.47948 4.89575 1.42095 4.99761C1.36241 5.09946 1.33183 5.21497 1.3323 5.33244C1.333 5.44878 1.36414 5.56292 1.42261 5.6635C1.48109 5.76408 1.56487 5.8476 1.66563 5.90577ZM7.99896 2.66577L12.6656 5.33244L7.99896 7.99911L3.3323 5.33244L7.99896 2.66577ZM13.6656 7.44578L7.99896 10.6658L2.3323 7.41911C2.25621 7.37503 2.17215 7.34644 2.08496 7.33498C1.99778 7.32353 1.90919 7.32943 1.82429 7.35236C1.7394 7.37529 1.65988 7.41478 1.59032 7.46857C1.52075 7.52236 1.46252 7.58938 1.41896 7.66577C1.33205 7.81885 1.3092 8.00009 1.35541 8.16995C1.40163 8.33981 1.51314 8.4845 1.66563 8.57244L7.66563 12.0391C7.76698 12.0976 7.88194 12.1284 7.99896 12.1284C8.11599 12.1284 8.23095 12.0976 8.3323 12.0391L14.3323 8.57244C14.4848 8.4845 14.5963 8.33981 14.6425 8.16995C14.6887 8.00009 14.6659 7.81885 14.579 7.66577C14.5354 7.58938 14.4772 7.52236 14.4076 7.46857C14.338 7.41478 14.2585 7.37529 14.1736 7.35236C14.0887 7.32943 14.0001 7.32353 13.913 7.33498C13.8258 7.34644 13.7417 7.37503 13.6656 7.41911V7.44578ZM13.6656 10.1124L7.99896 13.3324L2.3323 10.0858C2.25621 10.0417 2.17215 10.0131 2.08496 10.0016C1.99778 9.99019 1.90919 9.9961 1.82429 10.019C1.7394 10.042 1.65988 10.0815 1.59032 10.1352C1.52075 10.189 1.46252 10.2561 1.41896 10.3324C1.33205 10.4855 1.3092 10.6668 1.35541 10.8366C1.40163 11.0065 1.51314 11.1512 1.66563 11.2391L7.66563 14.7058C7.76698 14.7643 7.88194 14.7951 7.99896 14.7951C8.11599 14.7951 8.23095 14.7643 8.3323 14.7058L14.3323 11.2391C14.4848 11.1512 14.5963 11.0065 14.6425 10.8366C14.6887 10.6668 14.6659 10.4855 14.579 10.3324C14.5354 10.2561 14.4772 10.189 14.4076 10.1352C14.338 10.0815 14.2585 10.042 14.1736 10.019C14.0887 9.9961 14.0001 9.99019 13.913 10.0016C13.8258 10.0131 13.7417 10.0417 13.6656 10.0858V10.1124Z" fill="#438DFF"/>
  5315. </g>
  5316. </svg>
  5317. </file>
  5318. <file path="assets/img/ic_tenant01.svg">
  5319. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5320. <path d="M1.66563 5.90577L7.66563 9.37244C7.76698 9.43095 7.88194 9.46176 7.99896 9.46176C8.11599 9.46176 8.23095 9.43095 8.3323 9.37244L14.3323 5.90577C14.4331 5.8476 14.5168 5.76408 14.5753 5.6635C14.6338 5.56292 14.6649 5.44878 14.6656 5.33244C14.6661 5.21497 14.6355 5.09946 14.577 4.99761C14.5184 4.89575 14.434 4.81118 14.3323 4.75244L8.3323 1.29244C8.23095 1.23393 8.11599 1.20312 7.99896 1.20312C7.88194 1.20312 7.76698 1.23393 7.66563 1.29244L1.66563 4.75244C1.56389 4.81118 1.47948 4.89575 1.42095 4.99761C1.36241 5.09946 1.33183 5.21497 1.3323 5.33244C1.333 5.44878 1.36414 5.56292 1.42261 5.6635C1.48109 5.76408 1.56487 5.8476 1.66563 5.90577ZM7.99896 2.66577L12.6656 5.33244L7.99896 7.99911L3.3323 5.33244L7.99896 2.66577ZM13.6656 7.44578L7.99896 10.6658L2.3323 7.41911C2.25621 7.37503 2.17215 7.34644 2.08496 7.33498C1.99778 7.32353 1.90919 7.32943 1.82429 7.35236C1.7394 7.37529 1.65988 7.41478 1.59032 7.46857C1.52075 7.52236 1.46252 7.58938 1.41896 7.66577C1.33205 7.81885 1.3092 8.00009 1.35541 8.16995C1.40163 8.33981 1.51314 8.4845 1.66563 8.57244L7.66563 12.0391C7.76698 12.0976 7.88194 12.1284 7.99896 12.1284C8.11599 12.1284 8.23095 12.0976 8.3323 12.0391L14.3323 8.57244C14.4848 8.4845 14.5963 8.33981 14.6425 8.16995C14.6887 8.00009 14.6659 7.81885 14.579 7.66577C14.5354 7.58938 14.4772 7.52236 14.4076 7.46857C14.338 7.41478 14.2585 7.37529 14.1736 7.35236C14.0887 7.32943 14.0001 7.32353 13.913 7.33498C13.8258 7.34644 13.7417 7.37503 13.6656 7.41911V7.44578ZM13.6656 10.1124L7.99896 13.3324L2.3323 10.0858C2.25621 10.0417 2.17215 10.0131 2.08496 10.0016C1.99778 9.99019 1.90919 9.9961 1.82429 10.019C1.7394 10.042 1.65988 10.0815 1.59032 10.1352C1.52075 10.189 1.46252 10.2561 1.41896 10.3324C1.33205 10.4855 1.3092 10.6668 1.35541 10.8366C1.40163 11.0065 1.51314 11.1512 1.66563 11.2391L7.66563 14.7058C7.76698 14.7643 7.88194 14.7951 7.99896 14.7951C8.11599 14.7951 8.23095 14.7643 8.3323 14.7058L14.3323 11.2391C14.4848 11.1512 14.5963 11.0065 14.6425 10.8366C14.6887 10.6668 14.6659 10.4855 14.579 10.3324C14.5354 10.2561 14.4772 10.189 14.4076 10.1352C14.338 10.0815 14.2585 10.042 14.1736 10.019C14.0887 9.9961 14.0001 9.99019 13.913 10.0016C13.8258 10.0131 13.7417 10.0417 13.6656 10.0858V10.1124Z" fill="white"/>
  5321. </svg>
  5322. </file>
  5323. <file path="assets/img/ic_tenant02.svg">
  5324. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5325. <g id="ico / &#237;&#133;&#140;&#235;&#132;&#140;&#237;&#138;&#184;">
  5326. <path id="Vector" d="M1.66563 5.90577L7.66563 9.37244C7.76698 9.43095 7.88194 9.46176 7.99896 9.46176C8.11599 9.46176 8.23095 9.43095 8.3323 9.37244L14.3323 5.90577C14.4331 5.8476 14.5168 5.76408 14.5753 5.6635C14.6338 5.56292 14.6649 5.44878 14.6656 5.33244C14.6661 5.21497 14.6355 5.09946 14.577 4.99761C14.5184 4.89575 14.434 4.81118 14.3323 4.75244L8.3323 1.29244C8.23095 1.23393 8.11599 1.20312 7.99896 1.20312C7.88194 1.20312 7.76698 1.23393 7.66563 1.29244L1.66563 4.75244C1.56389 4.81118 1.47948 4.89575 1.42095 4.99761C1.36241 5.09946 1.33183 5.21497 1.3323 5.33244C1.333 5.44878 1.36414 5.56292 1.42261 5.6635C1.48109 5.76408 1.56487 5.8476 1.66563 5.90577ZM7.99896 2.66577L12.6656 5.33244L7.99896 7.99911L3.3323 5.33244L7.99896 2.66577ZM13.6656 7.44578L7.99896 10.6658L2.3323 7.41911C2.25621 7.37503 2.17215 7.34644 2.08496 7.33498C1.99778 7.32353 1.90919 7.32943 1.82429 7.35236C1.7394 7.37529 1.65988 7.41478 1.59032 7.46857C1.52075 7.52236 1.46252 7.58938 1.41896 7.66577C1.33205 7.81885 1.3092 8.00009 1.35541 8.16995C1.40163 8.33981 1.51314 8.4845 1.66563 8.57244L7.66563 12.0391C7.76698 12.0976 7.88194 12.1284 7.99896 12.1284C8.11599 12.1284 8.23095 12.0976 8.3323 12.0391L14.3323 8.57244C14.4848 8.4845 14.5963 8.33981 14.6425 8.16995C14.6887 8.00009 14.6659 7.81885 14.579 7.66577C14.5354 7.58938 14.4772 7.52236 14.4076 7.46857C14.338 7.41478 14.2585 7.37529 14.1736 7.35236C14.0887 7.32943 14.0001 7.32353 13.913 7.33498C13.8258 7.34644 13.7417 7.37503 13.6656 7.41911V7.44578ZM13.6656 10.1124L7.99896 13.3324L2.3323 10.0858C2.25621 10.0417 2.17215 10.0131 2.08496 10.0016C1.99778 9.99019 1.90919 9.9961 1.82429 10.019C1.7394 10.042 1.65988 10.0815 1.59032 10.1352C1.52075 10.189 1.46252 10.2561 1.41896 10.3324C1.33205 10.4855 1.3092 10.6668 1.35541 10.8366C1.40163 11.0065 1.51314 11.1512 1.66563 11.2391L7.66563 14.7058C7.76698 14.7643 7.88194 14.7951 7.99896 14.7951C8.11599 14.7951 8.23095 14.7643 8.3323 14.7058L14.3323 11.2391C14.4848 11.1512 14.5963 11.0065 14.6425 10.8366C14.6887 10.6668 14.6659 10.4855 14.579 10.3324C14.5354 10.2561 14.4772 10.189 14.4076 10.1352C14.338 10.0815 14.2585 10.042 14.1736 10.019C14.0887 9.9961 14.0001 9.99019 13.913 10.0016C13.8258 10.0131 13.7417 10.0417 13.6656 10.0858V10.1124Z" fill="#438DFF"/>
  5327. </g>
  5328. </svg>
  5329. </file>
  5330. <file path="assets/img/ic_tenant03.svg">
  5331. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5332. <g id="ico / &#237;&#133;&#140;&#235;&#132;&#140;&#237;&#138;&#184;">
  5333. <path id="Vector" d="M1.66563 5.90577L7.66563 9.37244C7.76698 9.43095 7.88194 9.46176 7.99896 9.46176C8.11599 9.46176 8.23095 9.43095 8.3323 9.37244L14.3323 5.90577C14.4331 5.8476 14.5168 5.76408 14.5753 5.6635C14.6338 5.56292 14.6649 5.44878 14.6656 5.33244C14.6661 5.21497 14.6355 5.09946 14.577 4.99761C14.5184 4.89575 14.434 4.81118 14.3323 4.75244L8.3323 1.29244C8.23095 1.23393 8.11599 1.20312 7.99896 1.20312C7.88194 1.20312 7.76698 1.23393 7.66563 1.29244L1.66563 4.75244C1.56389 4.81118 1.47948 4.89575 1.42095 4.99761C1.36241 5.09946 1.33183 5.21497 1.3323 5.33244C1.333 5.44878 1.36414 5.56292 1.42261 5.6635C1.48109 5.76408 1.56487 5.8476 1.66563 5.90577ZM7.99896 2.66577L12.6656 5.33244L7.99896 7.99911L3.3323 5.33244L7.99896 2.66577ZM13.6656 7.44578L7.99896 10.6658L2.3323 7.41911C2.25621 7.37503 2.17215 7.34644 2.08496 7.33498C1.99778 7.32353 1.90919 7.32943 1.82429 7.35236C1.7394 7.37529 1.65988 7.41478 1.59032 7.46857C1.52075 7.52236 1.46252 7.58938 1.41896 7.66577C1.33205 7.81885 1.3092 8.00009 1.35541 8.16995C1.40163 8.33981 1.51314 8.4845 1.66563 8.57244L7.66563 12.0391C7.76698 12.0976 7.88194 12.1284 7.99896 12.1284C8.11599 12.1284 8.23095 12.0976 8.3323 12.0391L14.3323 8.57244C14.4848 8.4845 14.5963 8.33981 14.6425 8.16995C14.6887 8.00009 14.6659 7.81885 14.579 7.66577C14.5354 7.58938 14.4772 7.52236 14.4076 7.46857C14.338 7.41478 14.2585 7.37529 14.1736 7.35236C14.0887 7.32943 14.0001 7.32353 13.913 7.33498C13.8258 7.34644 13.7417 7.37503 13.6656 7.41911V7.44578ZM13.6656 10.1124L7.99896 13.3324L2.3323 10.0858C2.25621 10.0417 2.17215 10.0131 2.08496 10.0016C1.99778 9.99019 1.90919 9.9961 1.82429 10.019C1.7394 10.042 1.65988 10.0815 1.59032 10.1352C1.52075 10.189 1.46252 10.2561 1.41896 10.3324C1.33205 10.4855 1.3092 10.6668 1.35541 10.8366C1.40163 11.0065 1.51314 11.1512 1.66563 11.2391L7.66563 14.7058C7.76698 14.7643 7.88194 14.7951 7.99896 14.7951C8.11599 14.7951 8.23095 14.7643 8.3323 14.7058L14.3323 11.2391C14.4848 11.1512 14.5963 11.0065 14.6425 10.8366C14.6887 10.6668 14.6659 10.4855 14.579 10.3324C14.5354 10.2561 14.4772 10.189 14.4076 10.1352C14.338 10.0815 14.2585 10.042 14.1736 10.019C14.0887 9.9961 14.0001 9.99019 13.913 10.0016C13.8258 10.0131 13.7417 10.0417 13.6656 10.0858V10.1124Z" fill="#8991AA"/>
  5334. </g>
  5335. </svg>
  5336. </file>
  5337. <file path="assets/img/ic_tenant04.svg">
  5338. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5339. <g id="ico / &#234;&#184;&#136;&#236;&#167;&#128;" clip-path="url(#clip0_232_30270)">
  5340. <path id="Vector" d="M8 0.25C3.71981 0.25 0.25 3.71978 0.25 8C0.25 12.2802 3.71981 15.75 8 15.75C12.2802 15.75 15.75 12.2802 15.75 8C15.75 3.71981 12.2802 0.25 8 0.25ZM12.0659 3.93412C14.1111 5.97937 14.2534 9.10541 12.712 11.2978L4.70219 3.288C6.89606 1.74563 10.0217 1.89003 12.0659 3.93412ZM3.93412 12.0659C1.88888 10.0206 1.74662 6.89459 3.28797 4.70222L11.2978 12.712C9.10397 14.2544 5.97825 14.11 3.93412 12.0659Z" fill="#E1473D"/>
  5341. </g>
  5342. <defs>
  5343. <clipPath id="clip0_232_30270">
  5344. <rect width="16" height="16" fill="white"/>
  5345. </clipPath>
  5346. </defs>
  5347. </svg>
  5348. </file>
  5349. <file path="assets/img/ic_wifi_dis.svg">
  5350. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5351. <g id="ico / &#236;&#153;&#128;&#236;&#157;&#180;&#237;&#140;&#140;&#236;&#157;&#180; (&#235;&#129;&#138;&#234;&#185;&#128;)">
  5352. <g id="Group 230">
  5353. <path id="Vector" d="M2.30859 2L11.3995 12" stroke="#E1473D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5354. <path id="Vector_2" d="M1 5.30575C1.77375 4.54372 2.68851 3.93967 3.69318 3.52734" stroke="#E1473D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5355. <path id="Vector_3" d="M2.93359 7.23295C3.69986 6.4814 4.66644 5.96654 5.71768 5.75" stroke="#E1473D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5356. <path id="Vector_4" d="M4.85938 9.16359C5.37177 8.67437 6.04591 8.39024 6.7539 8.3651C7.46189 8.33997 8.15449 8.57557 8.70028 9.02723" stroke="#E1473D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5357. <path id="Vector_5" d="M6.22656 2.93096C6.43111 2.91392 6.64134 2.90823 6.85156 2.90823C9.04093 2.90234 11.1433 3.76456 12.6982 5.30596" stroke="#E1473D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5358. <path id="Vector_6" d="M9.11328 6.10742C9.72909 6.38028 10.291 6.7613 10.7724 7.23242" stroke="#E1473D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5359. <path id="Vector_7" d="M6.8505 11.9998C7.35257 11.9998 7.75959 11.5928 7.75959 11.0907C7.75959 10.5887 7.35257 10.1816 6.8505 10.1816C6.34842 10.1816 5.94141 10.5887 5.94141 11.0907C5.94141 11.5928 6.34842 11.9998 6.8505 11.9998Z" fill="#E1473D"/>
  5360. </g>
  5361. </g>
  5362. </svg>
  5363. </file>
  5364. <file path="assets/img/ic_wifi.svg">
  5365. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  5366. <g id="ico / &#236;&#153;&#128;&#236;&#157;&#180;&#237;&#140;&#140;&#236;&#157;&#180; (&#235;&#129;&#138;&#234;&#185;&#128;)">
  5367. <path id="Vector" d="M3.75 3.125L16.25 16.875" stroke="#E1473D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5368. <path id="Vector_2" d="M1.95312 7.67187C3.01703 6.62408 4.27482 5.79352 5.65625 5.22656" stroke="#E1473D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5369. <path id="Vector_3" d="M4.60938 10.3203C5.66299 9.28692 6.99204 8.57899 8.4375 8.28125" stroke="#E1473D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5370. <path id="Vector_4" d="M7.25781 12.9764C7.96235 12.3037 8.8893 11.913 9.86279 11.8785C10.8363 11.8439 11.7886 12.1679 12.5391 12.7889" stroke="#E1473D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5371. <path id="Vector_5" d="M9.14062 4.40629C9.42188 4.38285 9.71094 4.37504 10 4.37504C13.0104 4.36694 15.9012 5.55249 18.0391 7.67192" stroke="#E1473D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5372. <path id="Vector_6" d="M13.1094 8.77344C13.9561 9.14862 14.7287 9.67252 15.3906 10.3203" stroke="#E1473D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5373. <path id="Vector_7" d="M10 16.875C10.6904 16.875 11.25 16.3154 11.25 15.625C11.25 14.9346 10.6904 14.375 10 14.375C9.30964 14.375 8.75 14.9346 8.75 15.625C8.75 16.3154 9.30964 16.875 10 16.875Z" fill="#E1473D"/>
  5374. </g>
  5375. </svg>
  5376. </file>
  5377. <file path="assets/img/ic_x_btn.svg">
  5378. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5379. <g id="x">
  5380. <path id="Vector" d="M12 4L4 12" stroke="#6780A8" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5381. <path id="Vector_2" d="M4 4L12 12" stroke="#6780A8" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5382. </g>
  5383. </svg>
  5384. </file>
  5385. <file path="assets/img/ic_x_btn2.svg">
  5386. <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
  5387. <path d="M18 6L6 18M6 6L18 18" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  5388. </svg>
  5389. </file>
  5390. <file path="assets/img/ic_xcircle.svg">
  5391. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  5392. <g id="x-circle">
  5393. <g id="Group 210">
  5394. <path id="Vector" d="M10 18C14.4183 18 18 14.4183 18 10C18 5.58173 14.4183 2 10 2C5.58173 2 2 5.58173 2 10C2 14.4183 5.58173 18 10 18Z" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5395. <path id="Vector_2" d="M12.4001 7.6001L7.6001 12.4001" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5396. <path id="Vector_3" d="M7.6001 7.6001L12.4001 12.4001" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5397. </g>
  5398. </g>
  5399. </svg>
  5400. </file>
  5401. <file path="assets/img/ico_alarm_blue.svg">
  5402. <svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
  5403. <g clip-path="url(#clip0_256_51207)">
  5404. <path d="M7.00011 14.1109C7.85858 14.1109 8.55493 13.371 8.55493 12.4581H5.44529C5.44529 13.371 6.14164 14.1109 7.00011 14.1109ZM12.2353 10.2447C11.7657 9.70856 10.887 8.90206 10.887 6.2602C10.887 4.25362 9.56288 2.64733 7.7774 2.25325V1.71506C7.7774 1.25874 7.42934 0.888672 7.00011 0.888672C6.57087 0.888672 6.22282 1.25874 6.22282 1.71506V2.25325C4.43734 2.64733 3.11318 4.25362 3.11318 6.2602C3.11318 8.90206 2.23453 9.70856 1.76495 10.2447C1.61912 10.4113 1.55447 10.6104 1.55568 10.8053C1.55835 11.2289 1.87117 11.6317 2.33589 11.6317H11.6643C12.1291 11.6317 12.4421 11.2289 12.4445 10.8053C12.4458 10.6104 12.3811 10.411 12.2353 10.2447Z" fill="#438DFF"/>
  5405. </g>
  5406. <defs>
  5407. <clipPath id="clip0_256_51207">
  5408. <rect width="14" height="14" fill="white" transform="translate(0 0.5)"/>
  5409. </clipPath>
  5410. </defs>
  5411. </svg>
  5412. </file>
  5413. <file path="assets/img/ico_alarm_gray.svg">
  5414. <svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
  5415. <g clip-path="url(#clip0_256_51200)">
  5416. <path d="M7.00011 14.1109C7.85858 14.1109 8.55493 13.371 8.55493 12.4581H5.44529C5.44529 13.371 6.14164 14.1109 7.00011 14.1109ZM12.2353 10.2447C11.7657 9.70856 10.887 8.90206 10.887 6.2602C10.887 4.25362 9.56288 2.64733 7.7774 2.25325V1.71506C7.7774 1.25874 7.42934 0.888672 7.00011 0.888672C6.57087 0.888672 6.22282 1.25874 6.22282 1.71506V2.25325C4.43734 2.64733 3.11318 4.25362 3.11318 6.2602C3.11318 8.90206 2.23453 9.70856 1.76495 10.2447C1.61912 10.4113 1.55447 10.6104 1.55568 10.8053C1.55835 11.2289 1.87117 11.6317 2.33589 11.6317H11.6643C12.1291 11.6317 12.4421 11.2289 12.4445 10.8053C12.4458 10.6104 12.3811 10.411 12.2353 10.2447Z" fill="#A7B0CA"/>
  5417. </g>
  5418. <defs>
  5419. <clipPath id="clip0_256_51200">
  5420. <rect width="14" height="14" fill="white" transform="translate(0 0.5)"/>
  5421. </clipPath>
  5422. </defs>
  5423. </svg>
  5424. </file>
  5425. <file path="assets/img/ico_alarm_green.svg">
  5426. <svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
  5427. <g clip-path="url(#clip0_256_51214)">
  5428. <path d="M7.00011 14.1109C7.85858 14.1109 8.55493 13.371 8.55493 12.4581H5.44529C5.44529 13.371 6.14164 14.1109 7.00011 14.1109ZM12.2353 10.2447C11.7657 9.70856 10.887 8.90206 10.887 6.2602C10.887 4.25362 9.56288 2.64733 7.7774 2.25325V1.71506C7.7774 1.25874 7.42934 0.888672 7.00011 0.888672C6.57087 0.888672 6.22282 1.25874 6.22282 1.71506V2.25325C4.43734 2.64733 3.11318 4.25362 3.11318 6.2602C3.11318 8.90206 2.23453 9.70856 1.76495 10.2447C1.61912 10.4113 1.55447 10.6104 1.55568 10.8053C1.55835 11.2289 1.87117 11.6317 2.33589 11.6317H11.6643C12.1291 11.6317 12.4421 11.2289 12.4445 10.8053C12.4458 10.6104 12.3811 10.411 12.2353 10.2447Z" fill="#30DA55"/>
  5429. </g>
  5430. <defs>
  5431. <clipPath id="clip0_256_51214">
  5432. <rect width="14" height="14" fill="white" transform="translate(0 0.5)"/>
  5433. </clipPath>
  5434. </defs>
  5435. </svg>
  5436. </file>
  5437. <file path="assets/img/ico_alarm_red.svg">
  5438. <svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
  5439. <g clip-path="url(#clip0_256_51193)">
  5440. <path d="M7.00011 14.1109C7.85858 14.1109 8.55493 13.371 8.55493 12.4581H5.44529C5.44529 13.371 6.14164 14.1109 7.00011 14.1109ZM12.2353 10.2447C11.7657 9.70856 10.887 8.90206 10.887 6.2602C10.887 4.25362 9.56288 2.64733 7.7774 2.25325V1.71506C7.7774 1.25874 7.42934 0.888672 7.00011 0.888672C6.57087 0.888672 6.22282 1.25874 6.22282 1.71506V2.25325C4.43734 2.64733 3.11318 4.25362 3.11318 6.2602C3.11318 8.90206 2.23453 9.70856 1.76495 10.2447C1.61912 10.4113 1.55447 10.6104 1.55568 10.8053C1.55835 11.2289 1.87117 11.6317 2.33589 11.6317H11.6643C12.1291 11.6317 12.4421 11.2289 12.4445 10.8053C12.4458 10.6104 12.3811 10.411 12.2353 10.2447Z" fill="#E1473D"/>
  5441. </g>
  5442. <defs>
  5443. <clipPath id="clip0_256_51193">
  5444. <rect width="14" height="14" fill="white" transform="translate(0 0.5)"/>
  5445. </clipPath>
  5446. </defs>
  5447. </svg>
  5448. </file>
  5449. <file path="assets/img/ico_alarm1.svg">
  5450. <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
  5451. <path d="M8.66667 18.4209L9.28655 18.8431C9.37133 18.7186 9.41667 18.5715 9.41667 18.4209H8.66667ZM6 22.3362L5.38012 21.914C5.22366 22.1437 5.20707 22.4411 5.337 22.6868C5.46692 22.9325 5.72207 23.0862 6 23.0862V22.3362ZM26 22.3362V23.0862C26.2793 23.0862 26.5355 22.931 26.6648 22.6834C26.7941 22.4357 26.7751 22.1368 26.6154 21.9076L26 22.3362ZM23.3333 18.5079H22.5833C22.5833 18.6611 22.6303 18.8107 22.7179 18.9365L23.3333 18.5079ZM9.41667 12.3333C9.41667 8.69746 12.3641 5.75 16 5.75V4.25C11.5357 4.25 7.91667 7.86903 7.91667 12.3333H9.41667ZM9.41667 18.4209V12.3333H7.91667V18.4209H9.41667ZM6.61988 22.7584L9.28655 18.8431L8.04679 17.9987L5.38012 21.914L6.61988 22.7584ZM26 21.5862H6V23.0862H26V21.5862ZM22.7179 18.9365L25.3846 22.7649L26.6154 21.9076L23.9488 18.0792L22.7179 18.9365ZM22.5833 12.3333V18.5079H24.0833V12.3333H22.5833ZM16 5.75C19.6359 5.75 22.5833 8.69746 22.5833 12.3333H24.0833C24.0833 7.86903 20.4643 4.25 16 4.25V5.75Z" fill="white"/>
  5452. <path d="M13.3931 24.3657C13.3931 25.7753 14.5357 26.918 15.9453 26.918H16.1742C17.5837 26.918 18.7264 25.7753 18.7264 24.3657V24.3657V24.3657" stroke="white" stroke-width="1.5" stroke-linejoin="round"/>
  5453. </svg>
  5454. </file>
  5455. <file path="assets/img/ico_alarm2.svg">
  5456. <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
  5457. <path d="M17.875 28.1876C17.6838 28.1872 17.4974 28.1283 17.3406 28.0189L7.96562 21.4564C7.84144 21.3702 7.73992 21.2553 7.66973 21.1215C7.59954 20.9876 7.56275 20.8388 7.5625 20.6876V11.3126C7.56275 11.1615 7.59954 11.0126 7.66973 10.8788C7.73992 10.7449 7.84144 10.63 7.96562 10.5439L17.3406 3.98137C17.4773 3.88889 17.6359 3.83412 17.8006 3.8226C17.9652 3.81108 18.1299 3.84321 18.2781 3.91574C18.4362 3.99103 18.5701 4.1091 18.6645 4.25657C18.759 4.40404 18.8102 4.57501 18.8125 4.75012V27.2501C18.8129 27.4223 18.7658 27.5912 18.6765 27.7384C18.5872 27.8856 18.4591 28.0053 18.3062 28.0845C18.1728 28.1529 18.0249 28.1882 17.875 28.1876ZM9.4375 20.2001L16.9375 25.4501V6.55012L9.4375 11.8001V20.2001Z" fill="white"/>
  5458. <path d="M8.5 21.625H4.75C4.00408 21.625 3.28871 21.3287 2.76126 20.8012C2.23382 20.2738 1.9375 19.5584 1.9375 18.8125V13.1875C1.9375 12.4416 2.23382 11.7262 2.76126 11.1988C3.28871 10.6713 4.00408 10.375 4.75 10.375H8.5C8.74864 10.375 8.9871 10.4738 9.16291 10.6496C9.33873 10.8254 9.4375 11.0639 9.4375 11.3125V20.6875C9.4375 20.9361 9.33873 21.1746 9.16291 21.3504C8.9871 21.5262 8.74864 21.625 8.5 21.625ZM4.75 12.25C4.50136 12.25 4.2629 12.3488 4.08709 12.5246C3.91127 12.7004 3.8125 12.9389 3.8125 13.1875V18.8125C3.8125 19.0611 3.91127 19.2996 4.08709 19.4754C4.2629 19.6512 4.50136 19.75 4.75 19.75H7.5625V12.25H4.75Z" fill="white"/>
  5459. <path d="M17.875 20.6874V18.8124C18.4309 18.8119 18.9742 18.6467 19.4362 18.3376C19.8983 18.0285 20.2584 17.5895 20.4711 17.0759C20.6837 16.5623 20.7394 15.9971 20.6311 15.4519C20.5228 14.9066 20.2553 14.4057 19.8625 14.0124L21.1938 12.6812C21.851 13.3367 22.2988 14.1727 22.4804 15.0831C22.6619 15.9935 22.5691 16.9373 22.2136 17.7949C21.8581 18.6524 21.256 19.3851 20.4836 19.9001C19.7112 20.415 18.8033 20.6891 17.875 20.6874Z" fill="white"/>
  5460. <path d="M25.825 24.8877C25.7016 24.8884 25.5793 24.8648 25.4651 24.8181C25.3509 24.7715 25.247 24.7027 25.1594 24.6158C25.0715 24.5287 25.0018 24.425 24.9542 24.3108C24.9066 24.1965 24.8821 24.074 24.8821 23.9502C24.8821 23.8265 24.9066 23.7039 24.9542 23.5897C25.0018 23.4754 25.0715 23.3718 25.1594 23.2846C27.0887 21.3513 28.1722 18.7315 28.1722 16.0002C28.1722 13.2689 27.0887 10.6492 25.1594 8.71585C25.072 8.62844 25.0026 8.52466 24.9553 8.41046C24.908 8.29625 24.8837 8.17384 24.8837 8.05022C24.8837 7.9266 24.908 7.8042 24.9553 7.68999C25.0026 7.57578 25.072 7.47201 25.1594 7.3846C25.2468 7.29719 25.3506 7.22785 25.4648 7.18054C25.579 7.13324 25.7014 7.10889 25.825 7.10889C25.9486 7.10889 26.071 7.13324 26.1853 7.18054C26.2995 7.22785 26.4032 7.29719 26.4906 7.3846C28.7749 9.67002 30.058 12.769 30.058 16.0002C30.058 19.2315 28.7749 22.3304 26.4906 24.6158C26.403 24.7027 26.2992 24.7715 26.1849 24.8181C26.0707 24.8648 25.9484 24.8884 25.825 24.8877Z" fill="white"/>
  5461. <path d="M23.1719 22.2343C22.9259 22.2333 22.6902 22.1356 22.5156 21.9624C22.3611 21.7832 22.28 21.5522 22.2887 21.3157C22.2974 21.0793 22.3952 20.8548 22.5625 20.6874C23.172 20.078 23.6554 19.3546 23.9852 18.5583C24.3151 17.7621 24.4848 16.9087 24.4848 16.0468C24.4848 15.185 24.3151 14.3315 23.9852 13.5353C23.6554 12.7391 23.172 12.0156 22.5625 11.4062C22.4089 11.2268 22.3287 10.9961 22.3378 10.7602C22.3469 10.5243 22.4447 10.3004 22.6117 10.1335C22.7786 9.96651 23.0024 9.8687 23.2384 9.85959C23.4743 9.85047 23.705 9.93073 23.8844 10.0843C25.4644 11.6664 26.352 13.8109 26.352 16.0468C26.352 18.2828 25.4644 20.4273 23.8844 22.0093C23.7874 22.0937 23.6741 22.1572 23.5515 22.1959C23.4289 22.2346 23.2997 22.2477 23.1719 22.2343Z" fill="white"/>
  5462. </svg>
  5463. </file>
  5464. <file path="assets/img/ico_alarm3.svg">
  5465. <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
  5466. <path d="M16.3352 23.3306C16.1993 23.3303 16.0667 23.2884 15.9552 23.2106L9.28744 18.5432C9.19912 18.4819 9.12692 18.4002 9.077 18.305C9.02707 18.2098 9.00091 18.1039 9.00073 17.9964V11.3287C9.00091 11.2212 9.02707 11.1154 9.077 11.0202C9.12692 10.925 9.19912 10.8432 9.28744 10.782L15.9552 6.11455C16.0524 6.04878 16.1652 6.00982 16.2823 6.00163C16.3994 5.99343 16.5165 6.01628 16.6219 6.06787C16.7344 6.12142 16.8296 6.20539 16.8968 6.31028C16.964 6.41516 17.0004 6.53676 17.002 6.6613V22.6639C17.0023 22.7863 16.9688 22.9064 16.9053 23.0111C16.8418 23.1158 16.7507 23.201 16.6419 23.2573C16.547 23.3059 16.4419 23.3311 16.3352 23.3306ZM10.3343 17.6497L15.6685 21.3836V7.94151L10.3343 11.6754V17.6497Z" fill="white"/>
  5467. <path d="M9.66741 18.6634H7.00032C6.4698 18.6634 5.96101 18.4526 5.58588 18.0775C5.21075 17.7024 5 17.1936 5 16.6631V12.6624C5 12.1319 5.21075 11.6231 5.58588 11.248C5.96101 10.8729 6.4698 10.6621 7.00032 10.6621H9.66741C9.84425 10.6621 10.0138 10.7324 10.1389 10.8574C10.2639 10.9824 10.3342 11.152 10.3342 11.3289V17.9966C10.3342 18.1734 10.2639 18.343 10.1389 18.4681C10.0138 18.5931 9.84425 18.6634 9.66741 18.6634ZM7.00032 11.9957C6.82348 11.9957 6.65388 12.0659 6.52884 12.1909C6.40379 12.316 6.33355 12.4856 6.33355 12.6624V16.6631C6.33355 16.8399 6.40379 17.0095 6.52884 17.1345C6.65388 17.2596 6.82348 17.3298 7.00032 17.3298H9.00064V11.9957H7.00032Z" fill="white"/>
  5468. <path d="M16.3352 17.996V16.6625C16.7306 16.6621 17.117 16.5446 17.4456 16.3248C17.7742 16.105 18.0303 15.7927 18.1816 15.4274C18.3329 15.0621 18.3725 14.6602 18.2954 14.2724C18.2184 13.8846 18.0282 13.5283 17.7488 13.2486L18.6956 12.3018C19.163 12.768 19.4815 13.3626 19.6106 14.0101C19.7398 14.6576 19.6737 15.3288 19.4209 15.9388C19.1681 16.5487 18.7399 17.0698 18.1905 17.436C17.6412 17.8023 16.9954 17.9972 16.3352 17.996Z" fill="white"/>
  5469. <path d="M21.9895 20.9836C21.9017 20.9841 21.8147 20.9673 21.7335 20.9341C21.6523 20.9009 21.5784 20.852 21.5161 20.7902C21.4536 20.7283 21.404 20.6545 21.3701 20.5733C21.3363 20.492 21.3188 20.4049 21.3188 20.3168C21.3188 20.2288 21.3363 20.1417 21.3701 20.0604C21.404 19.9792 21.4536 19.9054 21.5161 19.8434C22.8882 18.4684 23.6589 16.6052 23.6589 14.6626C23.6589 12.72 22.8882 10.8568 21.5161 9.48178C21.4539 9.41961 21.4046 9.3458 21.3709 9.26458C21.3373 9.18335 21.32 9.09629 21.32 9.00837C21.32 8.92045 21.3373 8.83339 21.3709 8.75216C21.4046 8.67093 21.4539 8.59713 21.5161 8.53496C21.5782 8.47279 21.6521 8.42348 21.7333 8.38983C21.8145 8.35618 21.9016 8.33887 21.9895 8.33887C22.0774 8.33887 22.1645 8.35618 22.2457 8.38983C22.3269 8.42348 22.4007 8.47279 22.4629 8.53496C24.0875 10.1604 25.0001 12.3645 25.0001 14.6626C25.0001 16.9607 24.0875 19.1648 22.4629 20.7902C22.4006 20.852 22.3267 20.9009 22.2455 20.9341C22.1642 20.9673 22.0772 20.9841 21.9895 20.9836Z" fill="white"/>
  5470. <path d="M20.1025 19.0966C19.9275 19.0959 19.7599 19.0264 19.6357 18.9033C19.5258 18.7758 19.4681 18.6115 19.4743 18.4433C19.4805 18.2751 19.5501 18.1155 19.669 17.9965C20.1025 17.563 20.4463 17.0485 20.6809 16.4822C20.9155 15.9159 21.0363 15.3089 21.0363 14.6959C21.0363 14.083 20.9155 13.476 20.6809 12.9097C20.4463 12.3434 20.1025 11.8288 19.669 11.3954C19.5598 11.2678 19.5027 11.1038 19.5092 10.936C19.5157 10.7681 19.5853 10.609 19.704 10.4902C19.8228 10.3715 19.9819 10.3019 20.1498 10.2954C20.3176 10.2889 20.4816 10.346 20.6092 10.4553C21.733 11.5804 22.3642 13.1057 22.3642 14.6959C22.3642 16.2862 21.733 17.8114 20.6092 18.9366C20.5402 18.9966 20.4596 19.0418 20.3725 19.0693C20.2853 19.0968 20.1934 19.1061 20.1025 19.0966Z" fill="white"/>
  5471. </svg>
  5472. </file>
  5473. <file path="assets/img/ico_alarm4.svg">
  5474. <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
  5475. <g id="ico / speaker">
  5476. <g id="Layer 34">
  5477. <path id="Vector" d="M16.3352 23.3306C16.1993 23.3303 16.0667 23.2884 15.9552 23.2106L9.28744 18.5432C9.19912 18.4819 9.12692 18.4002 9.077 18.305C9.02707 18.2098 9.00091 18.1039 9.00073 17.9964V11.3287C9.00091 11.2212 9.02707 11.1154 9.077 11.0202C9.12692 10.925 9.19912 10.8432 9.28744 10.782L15.9552 6.11455C16.0524 6.04878 16.1652 6.00982 16.2823 6.00163C16.3994 5.99343 16.5165 6.01628 16.6219 6.06787C16.7344 6.12142 16.8296 6.20539 16.8968 6.31028C16.964 6.41516 17.0004 6.53676 17.002 6.6613V22.6639C17.0023 22.7863 16.9688 22.9064 16.9053 23.0111C16.8418 23.1158 16.7507 23.201 16.6419 23.2573C16.547 23.3059 16.4419 23.3311 16.3352 23.3306ZM10.3343 17.6497L15.6685 21.3836V7.94151L10.3343 11.6754V17.6497Z" fill="white"/>
  5478. <path id="Vector_2" d="M9.66741 18.6634H7.00032C6.4698 18.6634 5.96101 18.4526 5.58588 18.0775C5.21075 17.7024 5 17.1936 5 16.6631V12.6624C5 12.1319 5.21075 11.6231 5.58588 11.248C5.96101 10.8729 6.4698 10.6621 7.00032 10.6621H9.66741C9.84425 10.6621 10.0138 10.7324 10.1389 10.8574C10.2639 10.9824 10.3342 11.152 10.3342 11.3289V17.9966C10.3342 18.1734 10.2639 18.343 10.1389 18.4681C10.0138 18.5931 9.84425 18.6634 9.66741 18.6634ZM7.00032 11.9957C6.82348 11.9957 6.65388 12.0659 6.52884 12.1909C6.40379 12.316 6.33355 12.4856 6.33355 12.6624V16.6631C6.33355 16.8399 6.40379 17.0095 6.52884 17.1345C6.65388 17.2596 6.82348 17.3298 7.00032 17.3298H9.00064V11.9957H7.00032Z" fill="white"/>
  5479. <path id="Vector_3" d="M16.3352 17.996V16.6625C16.7306 16.6621 17.117 16.5446 17.4456 16.3248C17.7742 16.105 18.0303 15.7927 18.1816 15.4274C18.3329 15.0621 18.3725 14.6602 18.2954 14.2724C18.2184 13.8846 18.0282 13.5283 17.7488 13.2486L18.6956 12.3018C19.163 12.768 19.4815 13.3626 19.6106 14.0101C19.7398 14.6576 19.6737 15.3288 19.4209 15.9388C19.1681 16.5487 18.7399 17.0698 18.1905 17.436C17.6412 17.8023 16.9954 17.9972 16.3352 17.996Z" fill="white"/>
  5480. <path id="Vector_4" d="M21.9895 20.9836C21.9017 20.9841 21.8147 20.9673 21.7335 20.9341C21.6523 20.9009 21.5784 20.852 21.5161 20.7902C21.4536 20.7283 21.404 20.6545 21.3701 20.5733C21.3363 20.492 21.3188 20.4049 21.3188 20.3168C21.3188 20.2288 21.3363 20.1417 21.3701 20.0604C21.404 19.9792 21.4536 19.9054 21.5161 19.8434C22.8882 18.4684 23.6589 16.6052 23.6589 14.6626C23.6589 12.72 22.8882 10.8568 21.5161 9.48178C21.4539 9.41961 21.4046 9.3458 21.3709 9.26458C21.3373 9.18335 21.32 9.09629 21.32 9.00837C21.32 8.92045 21.3373 8.83339 21.3709 8.75216C21.4046 8.67093 21.4539 8.59713 21.5161 8.53496C21.5782 8.47279 21.6521 8.42348 21.7333 8.38983C21.8145 8.35618 21.9016 8.33887 21.9895 8.33887C22.0774 8.33887 22.1645 8.35618 22.2457 8.38983C22.3269 8.42348 22.4007 8.47279 22.4629 8.53496C24.0875 10.1604 25.0001 12.3645 25.0001 14.6626C25.0001 16.9607 24.0875 19.1648 22.4629 20.7902C22.4006 20.852 22.3267 20.9009 22.2455 20.9341C22.1642 20.9673 22.0772 20.9841 21.9895 20.9836Z" fill="white"/>
  5481. <path id="Vector_5" d="M20.1025 19.0966C19.9275 19.0959 19.7599 19.0264 19.6357 18.9033C19.5258 18.7758 19.4681 18.6115 19.4743 18.4433C19.4805 18.2751 19.5501 18.1155 19.669 17.9965C20.1025 17.563 20.4463 17.0485 20.6809 16.4822C20.9155 15.9159 21.0363 15.3089 21.0363 14.6959C21.0363 14.083 20.9155 13.476 20.6809 12.9097C20.4463 12.3434 20.1025 11.8288 19.669 11.3954C19.5598 11.2678 19.5027 11.1038 19.5092 10.936C19.5157 10.7681 19.5853 10.609 19.704 10.4902C19.8228 10.3715 19.9819 10.3019 20.1498 10.2954C20.3176 10.2889 20.4816 10.346 20.6092 10.4553C21.733 11.5804 22.3642 13.1057 22.3642 14.6959C22.3642 16.2862 21.733 17.8114 20.6092 18.9366C20.5402 18.9966 20.4596 19.0418 20.3725 19.0693C20.2853 19.0968 20.1934 19.1061 20.1025 19.0966Z" fill="white"/>
  5482. </g>
  5483. <line id="Line 16" x1="6.70711" y1="5.29289" x2="25.7071" y2="24.2929" stroke="white" stroke-width="2"/>
  5484. </g>
  5485. </svg>
  5486. </file>
  5487. <file path="assets/img/ico_all_pop.svg">
  5488. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5489. <path d="M3.71403 2C2.76719 2 1.99963 2.76756 1.99963 3.71439V5.42879C1.99963 6.37562 2.76719 7.14318 3.71403 7.14318H5.42842C6.37525 7.14318 7.14281 6.37562 7.14281 5.42879V3.71439C7.14281 2.76756 6.37525 2 5.42842 2H3.71403Z" fill="#8E8E8E"/>
  5490. <path d="M3.71403 8.85742C2.76719 8.85742 1.99963 9.62496 1.99963 10.5718V12.2862C1.99963 13.2331 2.76719 14.0006 3.71403 14.0006H5.42842C6.37525 14.0006 7.14281 13.2331 7.14281 12.2862V10.5718C7.14281 9.62496 6.37525 8.85742 5.42842 8.85742H3.71403Z" fill="#8E8E8E"/>
  5491. <path d="M8.85718 3.71439C8.85718 2.76756 9.62471 2 10.5716 2H12.286C13.2328 2 14.0004 2.76756 14.0004 3.71439V5.42879C14.0004 6.37562 13.2328 7.14318 12.286 7.14318H10.5716C9.62471 7.14318 8.85718 6.37562 8.85718 5.42879V3.71439Z" fill="#8E8E8E"/>
  5492. <path d="M8.85718 10.5718C8.85718 9.62496 9.62471 8.85742 10.5716 8.85742H12.286C13.2328 8.85742 14.0004 9.62496 14.0004 10.5718V12.2862C14.0004 13.2331 13.2328 14.0006 12.286 14.0006H10.5716C9.62471 14.0006 8.85718 13.2331 8.85718 12.2862V10.5718Z" fill="#8E8E8E"/>
  5493. </svg>
  5494. </file>
  5495. <file path="assets/img/ico_arrow_next.svg">
  5496. <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
  5497. <rect x="-0.5" y="0.5" width="31" height="31" rx="15.5" transform="matrix(-1 0 0 1 31 0)" fill="white"/>
  5498. <rect x="-0.5" y="0.5" width="31" height="31" rx="15.5" transform="matrix(-1 0 0 1 31 0)" stroke="#D6D6D6"/>
  5499. <path d="M15.0278 19.5L18.5278 16L15.0278 12.5" stroke="#8F9DAC" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  5500. </svg>
  5501. </file>
  5502. <file path="assets/img/ico_arrow_prev.svg">
  5503. <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
  5504. <rect x="0.5" y="0.5" width="31" height="31" rx="15.5" fill="white"/>
  5505. <rect x="0.5" y="0.5" width="31" height="31" rx="15.5" stroke="#D6D6D6"/>
  5506. <path d="M16.9722 19.5L13.4722 16L16.9722 12.5" stroke="#8F9DAC" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  5507. </svg>
  5508. </file>
  5509. <file path="assets/img/ico_backup1.svg">
  5510. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5511. <path d="M6.41667 11.0833C8.994 11.0833 11.0833 8.994 11.0833 6.41667C11.0833 3.83934 8.994 1.75 6.41667 1.75C3.83934 1.75 1.75 3.83934 1.75 6.41667C1.75 8.994 3.83934 11.0833 6.41667 11.0833Z" stroke="#5488C5" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5512. <path d="M12.25 12.2504L9.71249 9.71289" stroke="#5488C5" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5513. </svg>
  5514. </file>
  5515. <file path="assets/img/ico_backup2.svg">
  5516. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5517. <g clip-path="url(#clip0_1016_11510)">
  5518. <path d="M11.2904 5.8544C10.8937 3.84773 9.12333 2.33398 7 2.33398C5.31417 2.33398 3.85292 3.29065 3.12083 4.68773C1.36792 4.87732 0 6.3619 0 8.16732C0 10.1011 1.56625 11.6673 3.5 11.6673H11.0833C12.6933 11.6673 14 10.3607 14 8.75065C14 7.21065 12.8012 5.96232 11.2904 5.8544ZM8.16667 7.58398V9.91732H5.83333V7.58398H4.08333L7 4.66732L9.91667 7.58398H8.16667Z" fill="#5488C5"/>
  5519. </g>
  5520. <defs>
  5521. <clipPath id="clip0_1016_11510">
  5522. <rect width="14" height="14" fill="white"/>
  5523. </clipPath>
  5524. </defs>
  5525. </svg>
  5526. </file>
  5527. <file path="assets/img/ico_backup3.svg">
  5528. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5529. <path d="M9.33333 7C9.33333 6.26333 8.73667 5.66667 8 5.66667C7.26333 5.66667 6.66667 6.26333 6.66667 7C6.66667 7.73667 7.26333 8.33333 8 8.33333C8.73667 8.33333 9.33333 7.73667 9.33333 7ZM8 1C4.68667 1 2 3.68667 2 7H0L2.66667 9.66667L5.33333 7H3.33333C3.33333 4.42333 5.42333 2.33333 8 2.33333C10.5767 2.33333 12.6667 4.42333 12.6667 7C12.6667 9.57667 10.5767 11.6667 8 11.6667C6.99 11.6667 6.06 11.3433 5.29333 10.7967L4.35 11.7533C5.36333 12.5333 6.62667 13 8 13C11.3133 13 14 10.3133 14 7C14 3.68667 11.3133 1 8 1Z" fill="#5488C5"/>
  5530. </svg>
  5531. </file>
  5532. <file path="assets/img/ico_backup4.svg">
  5533. <svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5534. <path d="M12.4953 7C12.1182 7 11.8668 7.25783 11.8668 7.64458C11.8668 10.1585 9.91859 12.1567 7.4676 12.1567C7.34191 12.1567 7.15337 12.1567 7.02768 12.1567C6.90199 12.1567 6.83914 12.1567 6.71345 12.0922C6.58776 12.0922 6.52491 12.0278 6.39922 12.0278C6.33637 12.0278 6.27353 11.9633 6.21068 11.9633C5.77076 11.8344 5.33084 11.5766 4.95376 11.3187C4.89091 11.2543 4.82807 11.2543 4.82807 11.1898C4.76522 11.1253 4.70238 11.0609 4.63953 11.0609C4.51384 10.9964 4.38815 10.8675 4.3253 10.8031C4.26245 10.7386 4.26245 10.7386 4.19961 10.6741L5.33084 10.4808C5.64507 10.4163 5.89645 10.094 5.8336 9.70726C5.77076 9.38496 5.45653 9.12713 5.07945 9.19159L3.00554 9.57834L2.50277 9.70726C2.31423 9.70726 2.18854 9.83617 2.12569 9.96509C2.06285 10.094 2 10.2874 2 10.4163L2.50277 13.1236C2.56561 13.4458 2.817 13.6392 3.13123 13.6392C3.19407 13.6392 3.19407 13.6392 3.25692 13.6392C3.57115 13.5748 3.82253 13.2525 3.75969 12.8657L3.57115 11.7699C3.69684 11.8988 3.88538 12.0278 4.01107 12.1567C4.01107 12.1567 4.01107 12.1567 4.07392 12.1567C4.13676 12.2211 4.19961 12.2856 4.26245 12.2856C4.38815 12.4145 4.51384 12.479 4.70238 12.5434C4.82807 12.8013 5.01661 12.8657 5.20514 12.9946H5.26799C5.33084 13.0591 5.45653 13.0591 5.58222 13.1236C5.8336 13.188 6.08499 13.2525 6.27353 13.3169C6.39922 13.3169 6.52491 13.3814 6.6506 13.3814H6.71345C6.77629 13.3814 6.90199 13.3814 6.96483 13.3814C7.09052 13.3814 7.27906 13.3814 7.40475 13.3814C10.5471 13.3814 13.0609 10.8031 13.0609 7.58013C13.1237 7.25783 12.8095 7 12.4953 7Z" fill="#5488C5"/>
  5535. <path d="M2.5037 7.64917C2.88078 7.64917 3.13216 7.39133 3.13216 7.00458C3.13216 4.4907 5.08039 2.49249 7.53138 2.49249C7.65707 2.49249 7.84561 2.49249 7.9713 2.49249C8.097 2.49249 8.15984 2.49249 8.28553 2.55695C8.41123 2.55695 8.47407 2.62141 8.59976 2.62141C8.66261 2.62141 8.72546 2.68586 8.7883 2.68586C9.22822 2.81478 9.66814 3.00816 10.0452 3.33045C10.1081 3.39491 10.1709 3.39491 10.2338 3.45937C10.2966 3.52382 10.3595 3.52382 10.4223 3.58828C10.4851 3.65274 10.548 3.78166 10.6737 3.84612C10.7365 3.91057 10.7365 3.91057 10.7994 3.97503L9.66814 4.16841C9.35391 4.23287 9.10253 4.55516 9.16538 4.94191C9.22822 5.2642 9.47961 5.45758 9.79384 5.45758C9.85668 5.45758 9.85668 5.45758 9.91953 5.45758L12.5591 4.94191C12.8733 4.87745 13.1247 4.55516 13.0618 4.16841L12.5591 1.52561C12.4962 1.20332 12.182 0.945485 11.8049 1.00994C11.4907 1.0744 11.2393 1.39669 11.3021 1.78345L11.4907 2.87924C11.365 2.75032 11.1764 2.55695 11.0508 2.49249C11.0508 2.49249 11.0508 2.49249 10.9879 2.49249C10.9251 2.42803 10.8622 2.36357 10.7994 2.36357C10.6737 2.23465 10.548 2.1702 10.3595 2.04128C10.1709 1.91236 9.98238 1.8479 9.79384 1.71899H9.73099C9.66814 1.65453 9.54245 1.65453 9.41676 1.59007C9.16538 1.52561 8.91399 1.46115 8.72546 1.39669C8.59976 1.39669 8.47407 1.33224 8.34838 1.33224H8.28553C8.22269 1.33224 8.097 1.33224 8.03415 1.33224C7.90846 1.33224 7.71992 1.33224 7.59423 1.33224C4.45193 1.33224 1.93809 3.91057 1.93809 7.1335C1.87525 7.39133 2.12663 7.64917 2.5037 7.64917Z" fill="#5488C5"/>
  5536. </svg>
  5537. </file>
  5538. <file path="assets/img/ico_ban.svg">
  5539. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5540. <g clip-path="url(#clip0_242_51602)">
  5541. <path d="M7 0.21875C3.25484 0.21875 0.21875 3.25481 0.21875 7C0.21875 10.7452 3.25484 13.7812 7 13.7812C10.7452 13.7812 13.7812 10.7452 13.7812 7C13.7812 3.25484 10.7452 0.21875 7 0.21875ZM10.5576 3.44236C12.3472 5.23195 12.4717 7.96723 11.123 9.88556L4.11441 2.877C6.03405 1.52742 8.76903 1.65378 10.5576 3.44236ZM3.44236 10.5576C1.65277 8.76805 1.5283 6.03277 2.87697 4.11444L9.88559 11.123C7.96597 12.4726 5.23097 12.3463 3.44236 10.5576Z" fill="#E1473D"/>
  5542. </g>
  5543. <defs>
  5544. <clipPath id="clip0_242_51602">
  5545. <rect width="14" height="14" fill="white"/>
  5546. </clipPath>
  5547. </defs>
  5548. </svg>
  5549. </file>
  5550. <file path="assets/img/ico_bar.svg">
  5551. <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
  5552. <path d="M4 12H20" stroke="black" stroke-width="2" stroke-linecap="round"/>
  5553. </svg>
  5554. </file>
  5555. <file path="assets/img/ico_black_pin.svg">
  5556. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5557. <path d="M11.7637 3.48444C11.7122 3.29753 11.6072 3.09864 11.5298 2.92427C10.6007 0.771729 8.57133 0 6.93265 0C4.73872 0 2.32262 1.41854 2 4.34295V4.94044C2 4.96537 2.0088 5.18919 2.0218 5.30131C2.2026 6.69492 3.3426 8.17612 4.19422 9.56973C5.11024 11.0631 6.06106 12.5315 7.00293 14C7.58348 13.0419 8.16222 12.0713 8.72977 11.1376C8.88431 10.8639 9.06413 10.5902 9.21895 10.3287C9.32206 10.1547 9.51907 9.98046 9.60933 9.81862C10.5254 8.20092 12 6.57054 12 4.96537V4.30562C12.0001 4.13165 11.7767 3.5219 11.7637 3.48444ZM6.97261 6.48336C6.32765 6.48336 5.62205 6.17235 5.27358 5.3137C5.2216 5.17693 5.22579 4.90311 5.22579 4.87818V4.49225C5.22579 3.39752 6.18974 2.89961 7.02822 2.89961C8.06064 2.89961 8.85902 3.696 8.85902 4.69155C8.85902 5.68724 8.00489 6.48336 6.97261 6.48336Z" fill="#3F5984"/>
  5558. </svg>
  5559. </file>
  5560. <file path="assets/img/ico_blue_pin.svg">
  5561. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  5562. <path d="M11.7637 3.48444C11.7122 3.29753 11.6072 3.09864 11.5298 2.92427C10.6007 0.771729 8.57133 0 6.93265 0C4.73872 0 2.32262 1.41854 2 4.34295V4.94044C2 4.96537 2.0088 5.18919 2.0218 5.30131C2.2026 6.69492 3.3426 8.17612 4.19422 9.56973C5.11024 11.0631 6.06106 12.5315 7.00293 14C7.58348 13.0419 8.16222 12.0713 8.72977 11.1376C8.88431 10.8639 9.06413 10.5902 9.21895 10.3287C9.32206 10.1547 9.51907 9.98046 9.60933 9.81862C10.5254 8.20092 12 6.57054 12 4.96537V4.30562C12.0001 4.13165 11.7767 3.5219 11.7637 3.48444ZM6.97261 6.48336C6.32765 6.48336 5.62205 6.17235 5.27358 5.3137C5.2216 5.17693 5.22579 4.90311 5.22579 4.87818V4.49225C5.22579 3.39752 6.18974 2.89961 7.02822 2.89961C8.06064 2.89961 8.85902 3.696 8.85902 4.69155C8.85902 5.68724 8.00489 6.48336 6.97261 6.48336Z" fill="#438DFF"/>
  5563. </svg>
  5564. </file>
  5565. <file path="assets/img/ico_btn1.svg">
  5566. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5567. <g clip-path="url(#clip0_333_53483)">
  5568. <path d="M8.20061 11.1988C9.53752 11.1988 10.6008 10.1339 10.6008 8.79863C10.6008 7.46332 9.53752 6.39844 8.20061 6.39844C6.8637 6.39844 5.80042 7.46332 5.80042 8.79863C5.80042 10.1339 6.8637 11.1988 8.20061 11.1988Z" fill="#8E8E8E"/>
  5569. <path d="M15.2548 7.3494C15.0662 6.428 14.6978 5.55284 14.1707 4.77399C13.6527 4.00775 12.9928 3.34781 12.2265 2.82983C11.4476 2.30285 10.5724 1.93447 9.6511 1.74574C9.16714 1.6476 8.67439 1.59934 8.18058 1.60173V0L5.00033 2.40019L8.18058 4.80039V3.20186C8.56782 3.20026 8.95505 3.23706 9.32868 3.31387C10.0448 3.46061 10.7249 3.74687 11.3304 4.15634C11.9276 4.55896 12.4415 5.07291 12.8442 5.67006C13.4693 6.59432 13.8026 7.68491 13.801 8.80071C13.8009 9.54948 13.6513 10.2907 13.361 10.9809C13.2198 11.3134 13.0473 11.6316 12.8458 11.9314C12.6434 12.2293 12.4136 12.5076 12.1593 12.7626C11.3848 13.5356 10.4017 14.0659 9.33028 14.2884C8.5852 14.4388 7.81757 14.4388 7.07249 14.2884C6.35608 14.1415 5.67561 13.8549 5.06993 13.4451C4.47347 13.0428 3.96008 12.5294 3.55781 11.933C2.9334 11.0077 2.59989 9.91693 2.60013 8.80071H1C1.00085 10.2358 1.42954 11.638 2.2313 12.8282C2.74962 13.5932 3.40888 14.2525 4.17386 14.7708C5.36245 15.5752 6.76536 16.004 8.20059 16.0013C8.68804 16.0013 9.17426 15.9522 9.6519 15.8549C10.5726 15.6648 11.4472 15.2965 12.2265 14.7708C12.6092 14.513 12.9658 14.2185 13.2914 13.8915C13.6174 13.5646 13.9121 13.2078 14.1715 12.8258C14.9752 11.6376 15.4036 10.2353 15.4012 8.80071C15.4011 8.31326 15.3521 7.82704 15.2548 7.3494Z" fill="#8E8E8E"/>
  5570. </g>
  5571. <defs>
  5572. <clipPath id="clip0_333_53483">
  5573. <rect width="16" height="16" fill="white"/>
  5574. </clipPath>
  5575. </defs>
  5576. </svg>
  5577. </file>
  5578. <file path="assets/img/ico_btn2.svg">
  5579. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5580. <path d="M8 15L8.71429 13.6V11.5H12.2857C12.4752 11.5 12.6568 11.4263 12.7908 11.295C12.9247 11.1637 13 10.9857 13 10.8V9.6898C13 9.3216 12.8471 8.9604 12.5814 8.7L11.5714 7.7102V5.2C11.7609 5.2 11.9426 5.12625 12.0765 4.99497C12.2105 4.8637 12.2857 4.68565 12.2857 4.5V2.4C12.2857 1.6279 11.645 1 10.8571 1H5.14286C4.355 1 3.71429 1.6279 3.71429 2.4V4.5C3.71429 4.68565 3.78954 4.8637 3.9235 4.99497C4.05745 5.12625 4.23913 5.2 4.42857 5.2V7.7102L3.41857 8.7C3.15131 8.96292 3.00086 9.31868 3 9.6898V10.8C3 10.9857 3.07526 11.1637 3.20921 11.295C3.34316 11.4263 3.52485 11.5 3.71429 11.5H7.28571V13.6L8 15ZM5.14286 2.4H10.8571V3.8H5.14286V2.4ZM4.42857 9.6898L5.64786 8.4949C5.71432 8.43001 5.76702 8.35287 5.80294 8.26794C5.83886 8.183 5.85728 8.09194 5.85714 8V5.2H10.1429V8C10.1429 8.1862 10.2179 8.364 10.3521 8.4949L11.5714 9.6898V10.1H4.42857V9.6898Z" fill="white"/>
  5581. </svg>
  5582. </file>
  5583. <file path="assets/img/ico_btn3.svg">
  5584. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  5585. <path d="M13.25 9.5V14C13.25 14.3978 13.092 14.7794 12.8107 15.0607C12.5294 15.342 12.1478 15.5 11.75 15.5H3.5C3.10218 15.5 2.72064 15.342 2.43934 15.0607C2.15804 14.7794 2 14.3978 2 14V5.75C2 5.35218 2.15804 4.97064 2.43934 4.68934C2.72064 4.40804 3.10218 4.25 3.5 4.25H8" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5586. <path d="M11 2H15.5V6.5" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5587. <path d="M7.25 10.25L15.5 2" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5588. </svg>
  5589. </file>
  5590. <file path="assets/img/ico_cal_dis.svg">
  5591. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  5592. <path d="M13.6667 2.57895H12.8889V1.78947C12.8889 1.58009 12.8069 1.37929 12.6611 1.23123C12.5152 1.08318 12.3174 1 12.1111 1C11.9048 1 11.707 1.08318 11.5611 1.23123C11.4153 1.37929 11.3333 1.58009 11.3333 1.78947V2.57895H6.66667V1.78947C6.66667 1.58009 6.58472 1.37929 6.43886 1.23123C6.293 1.08318 6.09517 1 5.88889 1C5.68261 1 5.48478 1.08318 5.33892 1.23123C5.19306 1.37929 5.11111 1.58009 5.11111 1.78947V2.57895H4.33333C3.71449 2.57895 3.121 2.82848 2.68342 3.27264C2.24583 3.71681 2 4.31922 2 4.94737V13.6316C2 14.2597 2.24583 14.8621 2.68342 15.3063C3.121 15.7505 3.71449 16 4.33333 16H13.6667C14.2855 16 14.879 15.7505 15.3166 15.3063C15.7542 14.8621 16 14.2597 16 13.6316V4.94737C16 4.31922 15.7542 3.71681 15.3166 3.27264C14.879 2.82848 14.2855 2.57895 13.6667 2.57895ZM5.88889 13.6316C5.73506 13.6316 5.58468 13.5853 5.45678 13.4985C5.32887 13.4118 5.22918 13.2885 5.17032 13.1442C5.11145 13 5.09605 12.8412 5.12606 12.6881C5.15607 12.5349 5.23014 12.3943 5.33892 12.2839C5.44769 12.1735 5.58628 12.0983 5.73715 12.0678C5.88803 12.0373 6.04441 12.053 6.18653 12.1127C6.32865 12.1725 6.45012 12.2737 6.53559 12.4035C6.62105 12.5333 6.66667 12.686 6.66667 12.8421C6.66667 13.0515 6.58472 13.2523 6.43886 13.4003C6.293 13.5484 6.09517 13.6316 5.88889 13.6316ZM5.88889 10.4737C5.73506 10.4737 5.58468 10.4274 5.45678 10.3406C5.32887 10.2539 5.22918 10.1306 5.17032 9.98633C5.11145 9.84207 5.09605 9.68334 5.12606 9.53019C5.15607 9.37705 5.23014 9.23638 5.33892 9.12597C5.44769 9.01556 5.58628 8.94037 5.73715 8.90991C5.88803 8.87944 6.04441 8.89508 6.18653 8.95483C6.32865 9.01459 6.45012 9.11577 6.53559 9.2456C6.62105 9.37543 6.66667 9.52807 6.66667 9.68421C6.66667 9.89359 6.58472 10.0944 6.43886 10.2425C6.293 10.3905 6.09517 10.4737 5.88889 10.4737ZM9 13.6316C8.84617 13.6316 8.69579 13.5853 8.56789 13.4985C8.43998 13.4118 8.3403 13.2885 8.28143 13.1442C8.22256 13 8.20716 12.8412 8.23717 12.6881C8.26718 12.5349 8.34125 12.3943 8.45003 12.2839C8.5588 12.1735 8.69739 12.0983 8.84826 12.0678C8.99914 12.0373 9.15552 12.053 9.29764 12.1127C9.43976 12.1725 9.56124 12.2737 9.6467 12.4035C9.73216 12.5333 9.77778 12.686 9.77778 12.8421C9.77778 13.0515 9.69583 13.2523 9.54997 13.4003C9.40411 13.5484 9.20628 13.6316 9 13.6316ZM9 10.4737C8.84617 10.4737 8.69579 10.4274 8.56789 10.3406C8.43998 10.2539 8.3403 10.1306 8.28143 9.98633C8.22256 9.84207 8.20716 9.68334 8.23717 9.53019C8.26718 9.37705 8.34125 9.23638 8.45003 9.12597C8.5588 9.01556 8.69739 8.94037 8.84826 8.90991C8.99914 8.87944 9.15552 8.89508 9.29764 8.95483C9.43976 9.01459 9.56124 9.11577 9.6467 9.2456C9.73216 9.37543 9.77778 9.52807 9.77778 9.68421C9.77778 9.89359 9.69583 10.0944 9.54997 10.2425C9.40411 10.3905 9.20628 10.4737 9 10.4737ZM12.1111 10.4737C11.9573 10.4737 11.8069 10.4274 11.679 10.3406C11.5511 10.2539 11.4514 10.1306 11.3925 9.98633C11.3337 9.84207 11.3183 9.68334 11.3483 9.53019C11.3783 9.37705 11.4524 9.23638 11.5611 9.12597C11.6699 9.01556 11.8085 8.94037 11.9594 8.90991C12.1102 8.87944 12.2666 8.89508 12.4088 8.95483C12.5509 9.01459 12.6723 9.11577 12.7578 9.2456C12.8433 9.37543 12.8889 9.52807 12.8889 9.68421C12.8889 9.89359 12.8069 10.0944 12.6611 10.2425C12.5152 10.3905 12.3174 10.4737 12.1111 10.4737ZM14.4444 7.31579H3.55556V4.94737C3.55556 4.73799 3.6375 4.53718 3.78336 4.38913C3.92922 4.24107 4.12705 4.15789 4.33333 4.15789H5.11111V4.94737C5.11111 5.15675 5.19306 5.35756 5.33892 5.50561C5.48478 5.65367 5.68261 5.73684 5.88889 5.73684C6.09517 5.73684 6.293 5.65367 6.43886 5.50561C6.58472 5.35756 6.66667 5.15675 6.66667 4.94737V4.15789H11.3333V4.94737C11.3333 5.15675 11.4153 5.35756 11.5611 5.50561C11.707 5.65367 11.9048 5.73684 12.1111 5.73684C12.3174 5.73684 12.5152 5.65367 12.6611 5.50561C12.8069 5.35756 12.8889 5.15675 12.8889 4.94737V4.15789H13.6667C13.8729 4.15789 14.0708 4.24107 14.2166 4.38913C14.3625 4.53718 14.4444 4.73799 14.4444 4.94737V7.31579Z" fill="#E0E0E0"/>
  5593. </svg>
  5594. </file>
  5595. <file path="assets/img/ico_cal.svg">
  5596. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  5597. <path d="M13.6667 2.57895H12.8889V1.78947C12.8889 1.58009 12.8069 1.37929 12.6611 1.23123C12.5152 1.08318 12.3174 1 12.1111 1C11.9048 1 11.707 1.08318 11.5611 1.23123C11.4153 1.37929 11.3333 1.58009 11.3333 1.78947V2.57895H6.66667V1.78947C6.66667 1.58009 6.58472 1.37929 6.43886 1.23123C6.293 1.08318 6.09517 1 5.88889 1C5.68261 1 5.48478 1.08318 5.33892 1.23123C5.19306 1.37929 5.11111 1.58009 5.11111 1.78947V2.57895H4.33333C3.71449 2.57895 3.121 2.82848 2.68342 3.27264C2.24583 3.71681 2 4.31922 2 4.94737V13.6316C2 14.2597 2.24583 14.8621 2.68342 15.3063C3.121 15.7505 3.71449 16 4.33333 16H13.6667C14.2855 16 14.879 15.7505 15.3166 15.3063C15.7542 14.8621 16 14.2597 16 13.6316V4.94737C16 4.31922 15.7542 3.71681 15.3166 3.27264C14.879 2.82848 14.2855 2.57895 13.6667 2.57895ZM5.88889 13.6316C5.73506 13.6316 5.58468 13.5853 5.45678 13.4985C5.32887 13.4118 5.22918 13.2885 5.17032 13.1442C5.11145 13 5.09605 12.8412 5.12606 12.6881C5.15607 12.5349 5.23014 12.3943 5.33892 12.2839C5.44769 12.1735 5.58628 12.0983 5.73715 12.0678C5.88803 12.0373 6.04441 12.053 6.18653 12.1127C6.32865 12.1725 6.45012 12.2737 6.53559 12.4035C6.62105 12.5333 6.66667 12.686 6.66667 12.8421C6.66667 13.0515 6.58472 13.2523 6.43886 13.4003C6.293 13.5484 6.09517 13.6316 5.88889 13.6316ZM5.88889 10.4737C5.73506 10.4737 5.58468 10.4274 5.45678 10.3406C5.32887 10.2539 5.22918 10.1306 5.17032 9.98633C5.11145 9.84207 5.09605 9.68334 5.12606 9.53019C5.15607 9.37705 5.23014 9.23638 5.33892 9.12597C5.44769 9.01556 5.58628 8.94037 5.73715 8.90991C5.88803 8.87944 6.04441 8.89508 6.18653 8.95483C6.32865 9.01459 6.45012 9.11577 6.53559 9.2456C6.62105 9.37543 6.66667 9.52807 6.66667 9.68421C6.66667 9.89359 6.58472 10.0944 6.43886 10.2425C6.293 10.3905 6.09517 10.4737 5.88889 10.4737ZM9 13.6316C8.84617 13.6316 8.69579 13.5853 8.56789 13.4985C8.43998 13.4118 8.3403 13.2885 8.28143 13.1442C8.22256 13 8.20716 12.8412 8.23717 12.6881C8.26718 12.5349 8.34125 12.3943 8.45003 12.2839C8.5588 12.1735 8.69739 12.0983 8.84826 12.0678C8.99914 12.0373 9.15552 12.053 9.29764 12.1127C9.43976 12.1725 9.56124 12.2737 9.6467 12.4035C9.73216 12.5333 9.77778 12.686 9.77778 12.8421C9.77778 13.0515 9.69583 13.2523 9.54997 13.4003C9.40411 13.5484 9.20628 13.6316 9 13.6316ZM9 10.4737C8.84617 10.4737 8.69579 10.4274 8.56789 10.3406C8.43998 10.2539 8.3403 10.1306 8.28143 9.98633C8.22256 9.84207 8.20716 9.68334 8.23717 9.53019C8.26718 9.37705 8.34125 9.23638 8.45003 9.12597C8.5588 9.01556 8.69739 8.94037 8.84826 8.90991C8.99914 8.87944 9.15552 8.89508 9.29764 8.95483C9.43976 9.01459 9.56124 9.11577 9.6467 9.2456C9.73216 9.37543 9.77778 9.52807 9.77778 9.68421C9.77778 9.89359 9.69583 10.0944 9.54997 10.2425C9.40411 10.3905 9.20628 10.4737 9 10.4737ZM12.1111 10.4737C11.9573 10.4737 11.8069 10.4274 11.679 10.3406C11.5511 10.2539 11.4514 10.1306 11.3925 9.98633C11.3337 9.84207 11.3183 9.68334 11.3483 9.53019C11.3783 9.37705 11.4524 9.23638 11.5611 9.12597C11.6699 9.01556 11.8085 8.94037 11.9594 8.90991C12.1102 8.87944 12.2666 8.89508 12.4088 8.95483C12.5509 9.01459 12.6723 9.11577 12.7578 9.2456C12.8433 9.37543 12.8889 9.52807 12.8889 9.68421C12.8889 9.89359 12.8069 10.0944 12.6611 10.2425C12.5152 10.3905 12.3174 10.4737 12.1111 10.4737ZM14.4444 7.31579H3.55556V4.94737C3.55556 4.73799 3.6375 4.53718 3.78336 4.38913C3.92922 4.24107 4.12705 4.15789 4.33333 4.15789H5.11111V4.94737C5.11111 5.15675 5.19306 5.35756 5.33892 5.50561C5.48478 5.65367 5.68261 5.73684 5.88889 5.73684C6.09517 5.73684 6.293 5.65367 6.43886 5.50561C6.58472 5.35756 6.66667 5.15675 6.66667 4.94737V4.15789H11.3333V4.94737C11.3333 5.15675 11.4153 5.35756 11.5611 5.50561C11.707 5.65367 11.9048 5.73684 12.1111 5.73684C12.3174 5.73684 12.5152 5.65367 12.6611 5.50561C12.8069 5.35756 12.8889 5.15675 12.8889 4.94737V4.15789H13.6667C13.8729 4.15789 14.0708 4.24107 14.2166 4.38913C14.3625 4.53718 14.4444 4.73799 14.4444 4.94737V7.31579Z" fill="#6F8AA6"/>
  5598. </svg>
  5599. </file>
  5600. <file path="assets/img/ico_calendar.svg">
  5601. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5602. <path d="M12.6667 2.6665H3.33333C2.59695 2.6665 2 3.26346 2 3.99984V13.3332C2 14.0696 2.59695 14.6665 3.33333 14.6665H12.6667C13.403 14.6665 14 14.0696 14 13.3332V3.99984C14 3.26346 13.403 2.6665 12.6667 2.6665Z" stroke="#7B7B7B" stroke-linecap="round" stroke-linejoin="round"/>
  5603. <path d="M10.6667 1.3335V4.00016" stroke="#7B7B7B" stroke-linecap="round" stroke-linejoin="round"/>
  5604. <path d="M5.33334 1.3335V4.00016" stroke="#7B7B7B" stroke-linecap="round" stroke-linejoin="round"/>
  5605. <path d="M2 6.6665H14" stroke="#7B7B7B" stroke-linecap="round" stroke-linejoin="round"/>
  5606. </svg>
  5607. </file>
  5608. <file path="assets/img/ico_cancel_disabled.svg">
  5609. <svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  5610. <path d="M17.1108 10.8674C16.9535 12.0674 16.4724 13.2019 15.7193 14.1492C14.9662 15.0966 13.9694 15.821 12.8358 16.2449C11.7022 16.6688 10.4747 16.7761 9.28472 16.5554C8.09479 16.3346 6.9874 15.7941 6.0813 14.9918C5.17521 14.1895 4.5046 13.1557 4.1414 12.0013C3.7782 10.8468 3.73611 9.61527 4.01964 8.43872C4.30317 7.26216 4.90162 6.18498 5.75082 5.32269C6.60002 4.46041 7.66793 3.84555 8.84001 3.54406C12.0892 2.71073 15.4525 4.38323 16.6942 7.4999M17.1667 3.33322V7.49988H13" stroke="#8E8E8E" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
  5611. </svg>
  5612. </file>
  5613. <file path="assets/img/ico_cancel.svg">
  5614. <svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  5615. <path d="M17.1108 10.8674C16.9535 12.0674 16.4724 13.2019 15.7193 14.1492C14.9662 15.0966 13.9694 15.821 12.8358 16.2449C11.7022 16.6688 10.4747 16.7761 9.28472 16.5554C8.09479 16.3346 6.9874 15.7941 6.0813 14.9918C5.17521 14.1895 4.5046 13.1557 4.1414 12.0013C3.7782 10.8468 3.73611 9.61527 4.01964 8.43872C4.30317 7.26216 4.90162 6.18498 5.75082 5.32269C6.60002 4.46041 7.66793 3.84555 8.84001 3.54406C12.0892 2.71073 15.4525 4.38323 16.6942 7.4999M17.1667 3.33322V7.49988H13" stroke="white" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
  5616. </svg>
  5617. </file>
  5618. <file path="assets/img/ico_cate.svg">
  5619. <svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
  5620. <g clip-path="url(#clip0_60_21996)">
  5621. <path d="M0 3.63428C0 2.67052 -5.21532e-08 2.18865 0.155173 1.80773C0.368509 1.28404 0.784036 0.868509 1.30773 0.655173C1.68865 0.5 2.17052 0.5 3.13428 0.5C4.09803 0.5 4.57991 0.5 4.96083 0.655173C5.48453 0.868509 5.90006 1.28404 6.11342 1.80773C6.26854 2.18865 6.26854 2.67052 6.26854 3.63428C6.26854 4.59803 6.26854 5.07991 6.11342 5.46083C5.90006 5.98453 5.48453 6.40006 4.96083 6.61342C4.57991 6.76854 4.09803 6.76854 3.13428 6.76854C2.17052 6.76854 1.68865 6.76854 1.30773 6.61342C0.784036 6.40006 0.368509 5.98453 0.155173 5.46083C-5.21532e-08 5.07991 0 4.59803 0 3.63428Z" fill="black"/>
  5622. <path d="M0.00012207 11.3647C0.00012207 10.401 0.000122018 9.91912 0.155295 9.53819C0.368631 9.01453 0.784158 8.59894 1.30785 8.38566C1.68877 8.23047 2.17065 8.23047 3.1344 8.23047C4.09815 8.23047 4.58003 8.23047 4.96095 8.38566C5.48465 8.59894 5.90018 9.01453 6.11354 9.53819C6.26866 9.91912 6.26866 10.401 6.26866 11.3647C6.26866 12.3285 6.26866 12.8104 6.11354 13.1913C5.90018 13.715 5.48465 14.1305 4.96095 14.3438C4.58003 14.499 4.09815 14.499 3.1344 14.499C2.17065 14.499 1.68877 14.499 1.30785 14.3438C0.784158 14.1305 0.368631 13.715 0.155295 13.1913C0.000122018 12.8104 0.00012207 12.3285 0.00012207 11.3647Z" fill="black"/>
  5623. <path d="M7.73145 11.3647C7.73145 10.401 7.73145 9.91912 7.88663 9.53819C8.09999 9.01453 8.5155 8.59894 9.03916 8.38566C9.4201 8.23047 9.90197 8.23047 10.8657 8.23047C11.8295 8.23047 12.3114 8.23047 12.6923 8.38566C13.216 8.59894 13.6315 9.01453 13.8449 9.53819C14.0001 9.91912 14.0001 10.401 14.0001 11.3647C14.0001 12.3285 14.0001 12.8104 13.8449 13.1913C13.6315 13.715 13.216 14.1305 12.6923 14.3438C12.3114 14.499 11.8295 14.499 10.8657 14.499C9.90197 14.499 9.4201 14.499 9.03916 14.3438C8.5155 14.1305 8.09999 13.715 7.88663 13.1913C7.73145 12.8104 7.73145 12.3285 7.73145 11.3647Z" fill="black"/>
  5624. <path fill-rule="evenodd" clip-rule="evenodd" d="M10.3407 5.73273C10.3407 6.02268 10.5757 6.25775 10.8657 6.25775C11.1556 6.25775 11.3907 6.02268 11.3907 5.73273V4.15776H12.9656C13.2556 4.15776 13.4906 3.92271 13.4906 3.63277C13.4906 3.34283 13.2556 3.10778 12.9656 3.10778H11.3907V1.5328C11.3907 1.24286 11.1556 1.00781 10.8657 1.00781C10.5757 1.00781 10.3407 1.24286 10.3407 1.5328V3.10778H8.76571C8.47571 3.10778 8.24072 3.34283 8.24072 3.63277C8.24072 3.92271 8.47571 4.15776 8.76571 4.15776H10.3407V5.73273Z" fill="black"/>
  5625. </g>
  5626. <defs>
  5627. <clipPath id="clip0_60_21996">
  5628. <rect width="14" height="14" fill="white" transform="translate(0 0.5)"/>
  5629. </clipPath>
  5630. </defs>
  5631. </svg>
  5632. </file>
  5633. <file path="assets/img/ico_certify_n.svg">
  5634. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  5635. <g clip-path="url(#clip0_107_29022)">
  5636. <path d="M17.7382 10.5788C18.2171 11.0358 17.9931 11.849 17.3649 11.9984L15.1592 12.5609L15.7832 14.7406C15.9273 15.3692 15.3659 15.958 14.7373 15.7865L12.558 15.1625L12 17.3685C11.8462 18.0059 11.0202 18.2168 10.5808 17.7419L8.9984 16.1229L7.44801 17.7401C7.00434 18.2105 6.18696 18.017 6.02876 17.3668L5.47083 15.1607L3.29149 15.7847C2.66325 15.9561 2.06981 15.3671 2.24559 14.7388L2.86961 12.5591L0.663911 11.9966C0.00352221 11.8163 -0.224979 11.0358 0.258384 10.5788L1.84393 8.99675L0.258384 7.41472C-0.220585 6.92957 0.00352228 6.1491 0.631919 5.99793L2.83762 5.43543L2.21395 3.25574C2.06981 2.6275 2.63125 2.03406 3.25985 2.20984L5.43918 2.83386L5.99711 0.62781C6.15092 -0.000783741 6.9727 -0.21594 7.41637 0.254099L8.9984 1.88465L10.5488 0.254099C10.997 -0.22051 11.8186 0.0396459 11.9681 0.62781L12.526 2.83386L14.7053 2.20984C15.3336 2.03406 15.927 2.6275 15.7512 3.25574L15.1578 5.43543L17.3635 5.99793C17.9917 6.14734 18.2202 6.96051 17.7368 7.41297L16.1513 8.995L17.7382 10.5788Z" fill="#E1473D"/>
  5637. <rect x="2" y="19.0607" width="3.5" height="23.5068" rx="1.75" transform="rotate(-135 2 19.0607)" fill="#E1473D" stroke="#FFEBEA" stroke-width="1.5"/>
  5638. </g>
  5639. <defs>
  5640. <clipPath id="clip0_107_29022">
  5641. <rect width="18" height="18" fill="white"/>
  5642. </clipPath>
  5643. </defs>
  5644. </svg>
  5645. </file>
  5646. <file path="assets/img/ico_certify_y.svg">
  5647. <svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
  5648. <g clip-path="url(#clip0_341_15065)">
  5649. <path d="M29.0691 32.589V3.41061C29.0691 2.51134 28.3574 1.76514 27.4583 1.76514H8.54051C7.66018 1.76514 6.92969 2.4922 6.92969 3.41061V32.6081C6.92969 33.5074 7.64145 34.2536 8.54051 34.2536H27.4583C28.3574 34.2345 29.0691 33.5074 29.0691 32.589Z" fill="white"/>
  5650. <path d="M27.4585 35H8.54071C7.2483 35 6.18066 33.9285 6.18066 32.5892V3.4108C6.18066 2.07147 7.2483 1 8.54071 1H27.4585C28.7509 1 29.8185 2.07147 29.8185 3.4108V32.6083C29.8185 33.9285 28.7696 35 27.4585 35ZM8.54071 2.53067C8.07244 2.53067 7.6791 2.91334 7.6791 3.4108V32.6083C7.6791 33.0867 8.05371 33.4885 8.54071 33.4885H27.4585C27.9268 33.4885 28.3201 33.0867 28.3201 32.6083V3.4108C28.3201 2.93247 27.9268 2.53067 27.4585 2.53067H8.54071Z" fill="#515151"/>
  5651. <path d="M20.9022 27.9204H15.0957V34.2344H20.9022V27.9204Z" fill="white"/>
  5652. <path d="M20.9024 35H15.0959C14.6838 35 14.3467 34.6556 14.3467 34.2346V27.9206C14.3467 27.4997 14.6838 27.1553 15.0959 27.1553H20.9024C21.3144 27.1553 21.6516 27.4997 21.6516 27.9206V34.2346C21.6516 34.6556 21.3144 35 20.9024 35ZM15.8451 33.4693H20.1531V28.6859H15.8451V33.4693Z" fill="#515151"/>
  5653. <path d="M25.96 6.12793H10.0391V8.4622H25.96V6.12793Z" fill="#C7D0DB"/>
  5654. <path d="M25.96 10.9688H10.0391V13.303H25.96V10.9688Z" fill="#C7D0DB"/>
  5655. <path d="M25.96 15.8286H10.0391V18.1629H25.96V15.8286Z" fill="#C7D0DB"/>
  5656. <path d="M25.96 20.6885H10.0391V23.0227H25.96V20.6885Z" fill="#C7D0DB"/>
  5657. <path d="M35.2509 26.0264C35.2509 28.8581 33.5464 31.135 31.4673 31.135C29.3695 31.135 27.665 28.839 27.665 26.0264C27.665 23.1947 29.3695 19.0045 31.4673 19.0045C33.5651 18.9853 35.2509 23.1947 35.2509 26.0264Z" fill="#38FFBF"/>
  5658. <path d="M31.4675 31.9005C28.9576 31.9005 26.916 29.2601 26.916 26.0265C26.916 22.9269 28.7329 18.2393 31.4675 18.2393C34.2022 18.2393 36.0003 22.9269 36.0003 26.0265C36.0003 29.2601 33.9774 31.9005 31.4675 31.9005ZM31.4675 19.7508C30.1002 19.7508 28.4145 23.1948 28.4145 26.0074C28.4145 28.3991 29.7818 30.3507 31.4675 30.3507C33.1533 30.3507 34.5019 28.3991 34.5019 26.0074C34.5019 23.2139 32.8349 19.7508 31.4675 19.7508Z" fill="#515151"/>
  5659. <path d="M31.468 35.0001C31.0559 35.0001 30.7188 34.6557 30.7188 34.2347V27.1745C30.7188 26.7536 31.0559 26.4092 31.468 26.4092C31.88 26.4092 32.2172 26.7536 32.2172 27.1745V34.2347C32.2172 34.6557 31.88 35.0001 31.468 35.0001Z" fill="#515151"/>
  5660. <path d="M8.33487 26.0264C8.33487 28.8582 6.6304 31.135 4.53258 31.135C2.43477 31.135 0.749023 28.839 0.749023 26.0264C0.749023 23.1947 2.4535 18.9854 4.53258 18.9854C6.61167 18.9854 8.33487 23.1947 8.33487 26.0264Z" fill="#38FFBF"/>
  5661. <path d="M4.53278 31.9006C2.04162 31.9006 0 29.2602 0 26.0266C0 22.927 1.81686 18.2202 4.53278 18.2202C7.26743 18.2202 9.08429 22.9079 9.08429 26.0075C9.08429 29.2602 7.04266 31.9006 4.53278 31.9006ZM4.53278 19.7509C3.18418 19.7509 1.49844 23.214 1.49844 26.0266C1.49844 28.4183 2.86576 30.3699 4.53278 30.3699C6.21852 30.3699 7.58585 28.4183 7.58585 26.0266C7.58585 23.214 5.9001 19.7509 4.53278 19.7509Z" fill="#515151"/>
  5662. <path d="M4.53242 35.0001C4.12035 35.0001 3.7832 34.6557 3.7832 34.2347V27.1745C3.7832 26.7536 4.12035 26.4092 4.53242 26.4092C4.94449 26.4092 5.28164 26.7536 5.28164 27.1745V34.2347C5.28164 34.6557 4.96322 35.0001 4.53242 35.0001Z" fill="#515151"/>
  5663. </g>
  5664. <defs>
  5665. <clipPath id="clip0_341_15065">
  5666. <rect width="36" height="36" fill="white"/>
  5667. </clipPath>
  5668. </defs>
  5669. </svg>
  5670. </file>
  5671. <file path="assets/img/ico_certify_y2.svg">
  5672. <svg width="36" height="48" viewBox="0 0 36 48" fill="none" xmlns="http://www.w3.org/2000/svg">
  5673. <g id="&#234;&#176;&#157;&#236;&#178;&#180;" clip-path="url(#clip0_71_23025)">
  5674. <g id="Group">
  5675. <g id="Group_2">
  5676. <path id="Vector" d="M30.4041 22.6736C29.658 21.9018 28.8186 21.1781 27.9326 20.551C26.487 19.5379 24.9015 18.7178 23.1762 18.1389C21.544 17.6083 19.8186 17.3188 18 17.3188C16.1813 17.3188 14.4559 17.6083 12.8238 18.1389C11.0984 18.6696 9.51294 19.4897 8.06735 20.551C3.45076 23.8314 0.466309 29.3309 0.466309 35.5058V42.2113C0.466309 43.5621 1.53885 44.6716 2.84455 44.6716H33.2021C34.5078 44.6716 35.5803 43.5621 35.5803 42.2113V35.5058C35.5337 30.4887 33.5751 25.954 30.4041 22.6736Z" fill="white"/>
  5677. <path id="Vector_2" d="M33.1554 45.1057H2.84456C1.3057 45.1057 0 43.8032 0 42.163V35.5057C0 29.3791 2.89119 23.6384 7.78757 20.165C9.27979 19.1037 10.9585 18.2836 12.6839 17.7047C16.0881 16.5952 19.8653 16.5952 23.2694 17.7047C24.9948 18.2354 26.6736 19.1037 28.1658 20.165C29.0518 20.7922 29.8912 21.5158 30.6839 22.3359C34.0881 25.8575 35.9534 30.5369 35.9534 35.5057V42.2113C36 43.8032 34.7409 45.1057 33.1554 45.1057ZM18 17.8494C16.2746 17.8494 14.5959 18.0906 12.9637 18.6213C11.3316 19.152 9.74611 19.9238 8.30052 20.9369C3.68394 24.2655 0.932643 29.7168 0.932643 35.5057V42.2113C0.932643 43.2726 1.77202 44.1891 2.84456 44.1891H33.2021C34.228 44.1891 35.114 43.3208 35.114 42.2113V35.5057C35.114 30.7781 33.342 26.3399 30.1244 23.0113C29.3782 22.2394 28.5855 21.564 27.7461 20.9369C26.3005 19.9238 24.7617 19.152 23.0829 18.6213C21.4041 18.1389 19.7254 17.8494 18 17.8494Z" fill="#2C2D38"/>
  5678. </g>
  5679. <g id="Group_3">
  5680. <path id="Vector_3" d="M11.6109 30.5849L12.5902 26.002L8.06689 20.5507C9.51249 19.5377 11.098 18.7176 12.8234 18.1387L17.9995 34.5889L11.6109 30.5849Z" fill="#77A3E8"/>
  5681. <path id="Vector_4" d="M17.9998 35.1196C17.9065 35.1196 17.8132 35.1196 17.7666 35.0714L11.378 31.0191C11.1915 30.9226 11.1449 30.6814 11.1449 30.4885L12.0775 26.1467L7.69408 20.8885C7.60081 20.792 7.55418 20.6473 7.60081 20.5025C7.60081 20.3578 7.69408 20.2613 7.78734 20.1648C9.27957 19.1035 10.9583 18.2834 12.6837 17.7045C12.9169 17.6081 13.1967 17.7528 13.2433 17.994L18.4195 34.4442C18.4661 34.6372 18.4195 34.8302 18.2796 34.9749C18.1863 35.0714 18.093 35.1196 17.9998 35.1196ZM12.1241 30.3437L17.1604 33.5277L12.5438 18.8141C11.2381 19.2965 9.93242 19.9236 8.76662 20.6955L12.9635 25.7126C13.0568 25.8091 13.1034 26.002 13.0568 26.1467L12.1241 30.3437Z" fill="#2C2D38"/>
  5682. </g>
  5683. <g id="Group_4">
  5684. <path id="Vector_5" d="M23.4093 26.0021L24.3886 30.585L18 34.6373L23.1762 18.187C24.9016 18.7177 26.487 19.5378 27.9326 20.5991L23.4093 26.0021Z" fill="#77A3E8"/>
  5685. <path id="Vector_6" d="M18.0002 35.1197C17.9069 35.1197 17.8137 35.0715 17.7204 35.0232C17.5805 34.8785 17.4872 34.6855 17.5805 34.4926L22.7567 18.0423C22.8499 17.8011 23.0831 17.6564 23.3163 17.7529C25.0416 18.2835 26.7204 19.1519 28.2126 20.2132C28.3059 20.3097 28.3992 20.4061 28.3992 20.5509C28.3992 20.6956 28.3992 20.8403 28.3059 20.9368L23.9225 26.1951L24.8551 30.5368C24.9018 30.7298 24.8085 30.9227 24.622 31.0675L18.2334 35.1197C18.1401 35.0715 18.0935 35.1197 18.0002 35.1197ZM23.4562 18.8142L18.8396 33.576L23.8758 30.3921L22.9432 26.1468C22.8966 26.0021 22.9432 25.8574 23.0365 25.7127L27.2334 20.6956C26.0676 19.8755 24.7619 19.2484 23.4562 18.8142Z" fill="#2C2D38"/>
  5686. </g>
  5687. <g id="Group_5">
  5688. <path id="Vector_7" d="M18 45.1055C17.7202 45.1055 17.5337 44.9126 17.5337 44.6231V34.6372C17.5337 34.3477 17.7202 34.1548 18 34.1548C18.2798 34.1548 18.4663 34.3477 18.4663 34.6372V44.6714C18.4663 44.9126 18.2332 45.1055 18 45.1055Z" fill="#2C2D38"/>
  5689. </g>
  5690. <g id="Group_6">
  5691. <path id="Vector_8" d="M18.6993 21.9982L19.6786 20.6474L19.0257 19.2967L17.9998 18.4766L16.9739 19.2967L16.3211 20.6474L17.2537 21.9982L15.6216 27.16L17.0205 31.5499L17.9998 34.6374L18.9791 31.5499L20.3314 27.16L18.6993 21.9982Z" fill="#FDCBD4"/>
  5692. <path id="Vector_9" d="M17.9999 35.1196C17.8134 35.1196 17.6268 34.9749 17.5336 34.7819L15.202 27.3045C15.1553 27.2081 15.1553 27.1116 15.202 27.0151L16.7408 22.0945L15.9481 20.9367C15.8548 20.792 15.8082 20.599 15.9014 20.4543L16.5543 19.1035C16.6009 19.0553 16.6476 19.0071 16.6942 18.9588L17.7201 18.0905C17.9066 17.9458 18.1398 17.9458 18.3263 18.0905L19.3522 18.9588C19.3989 19.0071 19.4455 19.0553 19.4921 19.1035L20.145 20.4543C20.2382 20.599 20.1916 20.792 20.0983 20.9367L19.3056 22.0945L20.7978 27.0151C20.8445 27.1116 20.8445 27.2081 20.7978 27.3045L18.4662 34.7819C18.373 34.9749 18.1864 35.1196 17.9999 35.1196ZM16.1346 27.1598L17.9999 33.0935L19.8652 27.1598L18.2797 22.191C18.2331 22.0463 18.2797 21.9015 18.3263 21.7568L19.1191 20.6473L18.6527 19.6824L17.9999 19.1518L17.347 19.6824L16.8807 20.6473L17.6735 21.7568C17.7667 21.9015 17.7667 22.0463 17.7201 22.191L16.1346 27.1598Z" fill="#2C2D38"/>
  5693. </g>
  5694. <g id="Group_7">
  5695. <path id="Vector_10" d="M24.7153 9.40705V8.87639C24.7153 6.94674 23.9691 3.76282 22.7567 2.50855C21.5443 1.25428 19.8655 0.482422 18.0002 0.482422C14.2697 0.482422 11.2852 5.06534 11.2852 8.92463V9.45529C10.3526 9.45529 9.60645 10.2271 9.60645 11.192C9.60645 12.1568 10.3526 12.9287 11.2852 12.9287C11.2852 16.7397 14.3163 19.4895 18.0002 19.4895C21.6842 19.4895 24.7153 16.7879 24.7153 12.9287C25.6479 12.9287 26.394 12.1568 26.394 11.192C26.394 10.1789 25.6479 9.40705 24.7153 9.40705Z" fill="white"/>
  5696. <path id="Vector_11" d="M18.0002 19.8754C14.0831 19.8754 11.0521 17.0774 10.8189 13.2663C9.83962 13.0734 9.14014 12.1568 9.14014 11.0955C9.14014 10.0342 9.83962 9.16583 10.8189 8.97287V8.87638C10.8189 4.87236 13.9899 0 18.0002 0C19.9122 0 21.7308 0.771859 23.0831 2.17085C24.4355 3.56985 25.1816 6.99497 25.1816 8.87638V8.97287C26.1142 9.21407 26.8603 10.0824 26.8603 11.0955C26.8603 12.1568 26.1609 13.0251 25.1816 13.2663C24.9484 17.0774 21.9173 19.8754 18.0002 19.8754ZM11.2852 12.3497C11.5184 12.3497 11.7515 12.5427 11.7515 12.8322C11.7515 16.3055 14.4562 18.9106 18.0002 18.9106C21.5443 18.9106 24.2489 16.3055 24.2489 12.8322C24.2489 12.5427 24.4821 12.3497 24.7153 12.3497C25.3681 12.3497 25.9277 11.8191 25.9277 11.0955C25.9277 10.3719 25.4147 9.84121 24.7153 9.84121C24.4355 9.84121 24.2489 9.64824 24.2489 9.35879V8.82814C24.2489 6.85025 23.4562 3.8593 22.4303 2.79799C21.2179 1.6402 19.679 0.964824 18.0002 0.964824C14.5495 0.964824 11.7515 5.30653 11.7515 8.92462V9.45528C11.7515 9.74472 11.565 9.93769 11.2852 9.93769C10.6324 9.93769 10.0728 10.4683 10.0728 11.192C10.0728 11.8191 10.5857 12.3497 11.2852 12.3497Z" fill="#2C2D38"/>
  5697. </g>
  5698. <g id="Group_8">
  5699. <path id="Vector_12" d="M24.7152 7.42915C22.0572 8.20101 19.8655 7.33267 18.0002 5.54775C16.1815 7.09147 13.9898 7.86333 11.2852 7.42915C11.2852 3.56986 14.3162 0.482422 18.0002 0.482422C19.8655 0.482422 21.5442 1.25428 22.7567 2.50855C23.9691 3.76282 24.7152 5.49951 24.7152 7.42915Z" fill="#77A3E8"/>
  5700. <path id="Vector_13" d="M22.7564 8.201C21.031 8.201 19.4455 7.52563 17.9533 6.17487C15.9948 7.71859 13.7564 8.29749 11.1917 7.91156C10.9585 7.86332 10.772 7.67035 10.772 7.42915C10.8186 3.32864 14.0362 0 18 0C19.9119 0 21.7305 0.771859 23.0829 2.17085C24.4352 3.56985 25.1813 5.45126 25.1813 7.42915C25.1813 7.62211 25.0414 7.81508 24.8549 7.91156C24.1554 8.10452 23.4559 8.201 22.7564 8.201ZM18 5.06533C18.0932 5.06533 18.2331 5.11357 18.3264 5.21005C20.145 6.99498 22.1036 7.57387 24.2487 7.09146C24.1554 5.4995 23.5025 4.00402 22.43 2.89447C21.2176 1.6402 19.6787 0.964824 18 0.964824C14.6891 0.964824 11.9844 3.61809 11.7512 6.99498C14.0362 7.23618 15.9948 6.65729 17.6735 5.16181C17.7668 5.11357 17.9067 5.06533 18 5.06533Z" fill="#2C2D38"/>
  5701. </g>
  5702. <g id="Group_9">
  5703. <path id="Vector_14" d="M14.7822 12.1087C14.5024 12.1087 14.3159 11.9157 14.3159 11.6263V11.2886C14.3159 10.9991 14.5024 10.8062 14.7822 10.8062C15.062 10.8062 15.2486 10.9991 15.2486 11.2886V11.6263C15.2486 11.8675 15.062 12.1087 14.7822 12.1087Z" fill="#2C2D38"/>
  5704. </g>
  5705. <g id="Group_10">
  5706. <path id="Vector_15" d="M21.2178 12.1087C20.938 12.1087 20.7515 11.9157 20.7515 11.6263V11.2886C20.7515 10.9991 20.938 10.8062 21.2178 10.8062C21.4976 10.8062 21.6841 10.9991 21.6841 11.2886V11.6263C21.6841 11.8675 21.4509 12.1087 21.2178 12.1087Z" fill="#2C2D38"/>
  5707. </g>
  5708. <g id="Group_11">
  5709. <path id="Vector_16" d="M18 13.8933C17.7202 13.8933 17.5337 13.7004 17.5337 13.4109V12.3496C17.5337 12.0602 17.7202 11.8672 18 11.8672C18.2798 11.8672 18.4663 12.0602 18.4663 12.3496V13.4109C18.4663 13.6521 18.2332 13.8933 18 13.8933Z" fill="#2C2D38"/>
  5710. </g>
  5711. <g id="Group_12">
  5712. <path id="Vector_17" d="M30.3107 30.2954H5.5957L7.13456 47.5175H28.7719L30.3107 30.2954Z" fill="white"/>
  5713. <path id="Vector_18" d="M28.8185 47.9998H7.13458C6.90142 47.9998 6.71489 47.8069 6.66825 47.5657L5.12939 30.2953C5.12939 30.1506 5.17603 30.0059 5.26929 29.9094C5.36256 29.8129 5.50245 29.7646 5.59572 29.7646H30.3107C30.4506 29.7646 30.5439 29.8129 30.6372 29.9094C30.7304 30.0059 30.7771 30.1506 30.7771 30.2953L29.2848 47.5174C29.2382 47.8069 29.0517 47.9998 28.8185 47.9998ZM7.55427 47.035H28.3988L29.8444 30.7777H6.10867L7.55427 47.035Z" fill="#2C2D38"/>
  5714. </g>
  5715. <g id="Group_13">
  5716. <path id="Vector_19" d="M20.8913 38.5446C20.8913 40.233 19.5856 41.5838 17.9534 41.5838C16.3213 41.5838 15.0156 40.233 15.0156 38.5446C15.0156 36.8561 16.3213 35.5054 17.9534 35.5054C19.5856 35.5054 20.8913 36.8561 20.8913 38.5446Z" fill="#F9EE7A"/>
  5717. <path id="Vector_20" d="M17.9535 42.0662C16.0882 42.0662 14.5493 40.4742 14.5493 38.5446C14.5493 36.6149 16.0882 35.0229 17.9535 35.0229C19.8187 35.0229 21.3576 36.6149 21.3576 38.5446C21.3576 40.4742 19.8187 42.0662 17.9535 42.0662ZM17.9535 35.9878C16.6011 35.9878 15.482 37.1456 15.482 38.5446C15.482 39.9436 16.6011 41.1013 17.9535 41.1013C19.3058 41.1013 20.425 39.9436 20.425 38.5446C20.425 37.1456 19.3058 35.9878 17.9535 35.9878Z" fill="#2C2D38"/>
  5718. </g>
  5719. <g id="Group_14">
  5720. <path id="Vector_21" d="M31.197 48H4.70997C4.43018 48 4.24365 47.807 4.24365 47.5176C4.24365 47.2281 4.43018 47.0352 4.70997 47.0352H31.197C31.4768 47.0352 31.6633 47.2281 31.6633 47.5176C31.6633 47.807 31.4768 48 31.197 48Z" fill="#2C2D38"/>
  5721. </g>
  5722. </g>
  5723. </g>
  5724. <defs>
  5725. <clipPath id="clip0_71_23025">
  5726. <rect width="36" height="48" fill="white"/>
  5727. </clipPath>
  5728. </defs>
  5729. </svg>
  5730. </file>
  5731. <file path="assets/img/ico_certify_y3.svg">
  5732. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  5733. <g clip-path="url(#clip0_107_29020)">
  5734. <path d="M17.7382 10.5788C18.2171 11.0358 17.9931 11.849 17.3649 11.9984L15.1592 12.5609L15.7832 14.7406C15.9273 15.3692 15.3659 15.958 14.7373 15.7865L12.558 15.1625L12 17.3685C11.8462 18.0059 11.0202 18.2168 10.5808 17.7419L8.9984 16.1229L7.44801 17.7401C7.00434 18.2105 6.18696 18.017 6.02876 17.3668L5.47083 15.1607L3.29149 15.7847C2.66325 15.9561 2.06981 15.3671 2.24559 14.7388L2.86961 12.5591L0.663911 11.9966C0.00352221 11.8163 -0.224979 11.0358 0.258384 10.5788L1.84393 8.99675L0.258384 7.41472C-0.220585 6.92957 0.00352228 6.1491 0.631919 5.99793L2.83762 5.43543L2.21395 3.25574C2.06981 2.6275 2.63125 2.03406 3.25985 2.20984L5.43918 2.83386L5.99711 0.62781C6.15092 -0.000783741 6.9727 -0.21594 7.41637 0.254099L8.9984 1.88465L10.5488 0.254099C10.997 -0.22051 11.8186 0.0396459 11.9681 0.62781L12.526 2.83386L14.7053 2.20984C15.3336 2.03406 15.927 2.6275 15.7512 3.25574L15.1578 5.43543L17.3635 5.99793C17.9917 6.14734 18.2202 6.96051 17.7368 7.41297L16.1513 8.995L17.7382 10.5788Z" fill="#438DFF"/>
  5735. </g>
  5736. <defs>
  5737. <clipPath id="clip0_107_29020">
  5738. <rect width="18" height="18" fill="white"/>
  5739. </clipPath>
  5740. </defs>
  5741. </svg>
  5742. </file>
  5743. <file path="assets/img/ico_check_indeterminate.svg">
  5744. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5745. <g filter="url(#filter0_i_823_32936)">
  5746. <rect width="16" height="16" rx="4" fill="white"/>
  5747. <rect x="0.5" y="0.5" width="15" height="15" rx="3.5" stroke="#C0C0C0"/>
  5748. <g filter="url(#filter1_i_823_32936)">
  5749. <rect x="3" y="7" width="10" height="2" rx="1" fill="#438DFF"/>
  5750. </g>
  5751. </g>
  5752. <defs>
  5753. <filter id="filter0_i_823_32936" x="0" y="0" width="17" height="17" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
  5754. <feFlood flood-opacity="0" result="BackgroundImageFix"/>
  5755. <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
  5756. <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
  5757. <feOffset dx="1" dy="1"/>
  5758. <feGaussianBlur stdDeviation="1.5"/>
  5759. <feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
  5760. <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
  5761. <feBlend mode="normal" in2="shape" result="effect1_innerShadow_823_32936"/>
  5762. </filter>
  5763. <filter id="filter1_i_823_32936" x="3" y="7" width="11" height="3" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
  5764. <feFlood flood-opacity="0" result="BackgroundImageFix"/>
  5765. <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
  5766. <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
  5767. <feOffset dx="1" dy="1"/>
  5768. <feGaussianBlur stdDeviation="1.5"/>
  5769. <feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
  5770. <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
  5771. <feBlend mode="normal" in2="shape" result="effect1_innerShadow_823_32936"/>
  5772. </filter>
  5773. </defs>
  5774. </svg>
  5775. </file>
  5776. <file path="assets/img/ico_chk_circle_disabled.svg">
  5777. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  5778. <path d="M17 9.36V10.004C16.9991 11.5135 16.5103 12.9823 15.6065 14.1913C14.7027 15.4003 13.4323 16.2847 11.9847 16.7127C10.5372 17.1407 8.99008 17.0893 7.57413 16.5662C6.15818 16.0431 4.94926 15.0763 4.12767 13.8099C3.30609 12.5436 2.91585 11.0456 3.01517 9.53942C3.11449 8.0332 3.69804 6.59943 4.6788 5.45196C5.65955 4.30448 6.98495 3.50477 8.45733 3.17211C9.92971 2.83944 11.4702 2.99164 12.849 3.60601" stroke="#8E8E8E" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
  5779. <path d="M17 4L10.0769 11L8 8.9021" stroke="#8E8E8E" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
  5780. </svg>
  5781. </file>
  5782. <file path="assets/img/ico_chk_circle.svg">
  5783. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  5784. <path d="M17 9.36V10.004C16.9991 11.5135 16.5103 12.9823 15.6065 14.1913C14.7027 15.4003 13.4323 16.2847 11.9847 16.7127C10.5372 17.1407 8.99008 17.0893 7.57413 16.5662C6.15818 16.0431 4.94926 15.0763 4.12767 13.8099C3.30609 12.5436 2.91585 11.0456 3.01517 9.53942C3.11449 8.0332 3.69804 6.59943 4.6788 5.45196C5.65955 4.30448 6.98495 3.50477 8.45733 3.17211C9.92971 2.83944 11.4702 2.99164 12.849 3.60601" stroke="white" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
  5785. <path d="M17 4L10.0769 11L8 8.9021" stroke="white" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
  5786. </svg>
  5787. </file>
  5788. <file path="assets/img/ico_chk_off.svg">
  5789. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5790. <g filter="url(#filter0_i_23_4661)">
  5791. <path d="M0 4C0 1.79086 1.79086 0 4 0H12C14.2091 0 16 1.79086 16 4V12C16 14.2091 14.2091 16 12 16H4C1.79086 16 0 14.2091 0 12V4Z" fill="white"/>
  5792. <path d="M0.5 4C0.5 2.067 2.067 0.5 4 0.5H12C13.933 0.5 15.5 2.067 15.5 4V12C15.5 13.933 13.933 15.5 12 15.5H4C2.067 15.5 0.5 13.933 0.5 12V4Z" stroke="#C0C0C0"/>
  5793. </g>
  5794. <defs>
  5795. <filter id="filter0_i_23_4661" x="0" y="0" width="17" height="17" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
  5796. <feFlood flood-opacity="0" result="BackgroundImageFix"/>
  5797. <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
  5798. <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
  5799. <feOffset dx="1" dy="1"/>
  5800. <feGaussianBlur stdDeviation="1.5"/>
  5801. <feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
  5802. <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
  5803. <feBlend mode="normal" in2="shape" result="effect1_innerShadow_23_4661"/>
  5804. </filter>
  5805. </defs>
  5806. </svg>
  5807. </file>
  5808. <file path="assets/img/ico_chk_off2.svg">
  5809. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5810. <g filter="url(#filter0_i_69_18063)">
  5811. <path d="M0 4C0 1.79086 1.79086 0 4 0H12C14.2091 0 16 1.79086 16 4V12C16 14.2091 14.2091 16 12 16H4C1.79086 16 0 14.2091 0 12V4Z" fill="white"/>
  5812. <path d="M0.5 4C0.5 2.067 2.067 0.5 4 0.5H12C13.933 0.5 15.5 2.067 15.5 4V12C15.5 13.933 13.933 15.5 12 15.5H4C2.067 15.5 0.5 13.933 0.5 12V4Z" stroke="#C0C0C0"/>
  5813. </g>
  5814. <defs>
  5815. <filter id="filter0_i_69_18063" x="0" y="0" width="17" height="17" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
  5816. <feFlood flood-opacity="0" result="BackgroundImageFix"/>
  5817. <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
  5818. <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
  5819. <feOffset dx="1" dy="1"/>
  5820. <feGaussianBlur stdDeviation="1.5"/>
  5821. <feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
  5822. <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
  5823. <feBlend mode="normal" in2="shape" result="effect1_innerShadow_69_18063"/>
  5824. </filter>
  5825. </defs>
  5826. </svg>
  5827. </file>
  5828. <file path="assets/img/ico_chk_on.svg">
  5829. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5830. <g filter="url(#filter0_i_23_6880)">
  5831. <rect width="16" height="16" rx="4" fill="white"/>
  5832. <rect x="0.5" y="0.5" width="15" height="15" rx="3.5" stroke="#C0C0C0"/>
  5833. <g filter="url(#filter1_i_23_6880)">
  5834. <rect x="3" y="3" width="10" height="10" rx="2" fill="#438DFF"/>
  5835. </g>
  5836. </g>
  5837. <defs>
  5838. <filter id="filter0_i_23_6880" x="0" y="0" width="17" height="17" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
  5839. <feFlood flood-opacity="0" result="BackgroundImageFix"/>
  5840. <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
  5841. <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
  5842. <feOffset dx="1" dy="1"/>
  5843. <feGaussianBlur stdDeviation="1.5"/>
  5844. <feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
  5845. <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
  5846. <feBlend mode="normal" in2="shape" result="effect1_innerShadow_23_6880"/>
  5847. </filter>
  5848. <filter id="filter1_i_23_6880" x="3" y="3" width="11" height="11" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
  5849. <feFlood flood-opacity="0" result="BackgroundImageFix"/>
  5850. <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
  5851. <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
  5852. <feOffset dx="1" dy="1"/>
  5853. <feGaussianBlur stdDeviation="1.5"/>
  5854. <feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
  5855. <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
  5856. <feBlend mode="normal" in2="shape" result="effect1_innerShadow_23_6880"/>
  5857. </filter>
  5858. </defs>
  5859. </svg>
  5860. </file>
  5861. <file path="assets/img/ico_chk.svg">
  5862. <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
  5863. <path d="M11.1666 4.75L6.12492 9.79167L3.83325 7.5" stroke="#034EA2" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5864. </svg>
  5865. </file>
  5866. <file path="assets/img/ico_close_gray.svg">
  5867. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5868. <path d="M12 4L4 12" stroke="#6780A8" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5869. <path d="M4 4L12 12" stroke="#6780A8" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5870. </svg>
  5871. </file>
  5872. <file path="assets/img/ico_close.svg">
  5873. <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
  5874. <path d="M18 6L6 18M6 6L18 18" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  5875. </svg>
  5876. </file>
  5877. <file path="assets/img/ico_core_alarm1.svg">
  5878. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  5879. <path d="M9.99932 3.33237C5.93349 3.33237 2.49932 6.76654 2.49932 10.8324C2.49932 14.8982 5.93349 18.3324 9.99932 18.3324C14.0652 18.3324 17.4993 14.8982 17.4993 10.8324C17.4993 6.76654 14.0652 3.33237 9.99932 3.33237ZM13.3327 11.6657H10.8327V14.1657H9.16599V11.6657H6.66599V9.99904H9.16599V7.49904H10.8327V9.99904H13.3327V11.6657ZM14.4027 3.0882L15.5793 1.9082L18.0877 4.4082L16.9102 5.58904L14.4027 3.0882ZM4.40099 1.9107L5.58266 3.08737L3.09099 5.58737L1.91016 4.40987L4.40099 1.9107Z" fill="#438DFF"/>
  5880. </svg>
  5881. </file>
  5882. <file path="assets/img/ico_core_alarm2.svg">
  5883. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  5884. <path d="M16.9093 5.58904L14.401 3.08904L15.5777 1.9082L18.086 4.4082L16.9093 5.58904ZM18.0885 16.9099L16.1827 15.0032C17.0068 13.8015 17.4993 12.3632 17.4993 10.8324C17.4993 6.76737 14.0652 3.33237 9.99932 3.33237C8.46766 3.33237 7.03016 3.82404 5.82766 4.64987L4.92432 3.7457L5.58099 3.08737L4.40099 1.9107L3.74599 2.56737L3.08849 1.90987L1.91016 3.0882L16.9102 18.0882L18.0885 16.9099ZM14.166 11.6657H12.8443L11.1777 9.99904H14.166V11.6657ZM9.16599 6.6657H10.8327V9.65404L9.16599 7.98737V6.6657ZM9.99932 18.3324C11.381 18.3324 12.686 17.9282 13.811 17.2449L3.58682 7.0207C2.88107 8.16724 2.50481 9.48604 2.49932 10.8324C2.49932 14.8974 5.93432 18.3324 9.99932 18.3324Z" fill="#E1473D"/>
  5885. </svg>
  5886. </file>
  5887. <file path="assets/img/ico_date_pic.svg">
  5888. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5889. <path d="M12.6667 2.66675H3.33333C2.59695 2.66675 2 3.2637 2 4.00008V13.3334C2 14.0698 2.59695 14.6667 3.33333 14.6667H12.6667C13.403 14.6667 14 14.0698 14 13.3334V4.00008C14 3.2637 13.403 2.66675 12.6667 2.66675Z" stroke="#8E8E8E" stroke-linecap="round" stroke-linejoin="round"/>
  5890. <path d="M10.667 1.33325V3.99992" stroke="#8E8E8E" stroke-linecap="round" stroke-linejoin="round"/>
  5891. <path d="M5.33301 1.33325V3.99992" stroke="#8E8E8E" stroke-linecap="round" stroke-linejoin="round"/>
  5892. <path d="M2 6.66675H14" stroke="#8E8E8E" stroke-linecap="round" stroke-linejoin="round"/>
  5893. </svg>
  5894. </file>
  5895. <file path="assets/img/ico_del_disabled.svg">
  5896. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  5897. <g id="ico / &#236;&#130;&#173;&#236;&#160;&#156;">
  5898. <g id="Layer 2">
  5899. <path id="Vector" d="M11.5455 17.2724H6.45455C5.61068 17.2724 4.80138 16.9372 4.20467 16.3405C3.60796 15.7438 3.27274 14.9345 3.27274 14.0906V6.45423C3.27274 6.28546 3.33978 6.1236 3.45912 6.00426C3.57846 5.88492 3.74033 5.81787 3.9091 5.81787C4.07787 5.81787 4.23973 5.88492 4.35908 6.00426C4.47842 6.1236 4.54546 6.28546 4.54546 6.45423V14.0906C4.54546 14.5969 4.7466 15.0825 5.10462 15.4405C5.46265 15.7986 5.94823 15.9997 6.45455 15.9997H11.5455C12.0518 15.9997 12.5374 15.7986 12.8954 15.4405C13.2534 15.0825 13.4546 14.5969 13.4546 14.0906V6.45423C13.4546 6.28546 13.5216 6.1236 13.6409 6.00426C13.7603 5.88492 13.9221 5.81787 14.0909 5.81787C14.2597 5.81787 14.4216 5.88492 14.5409 6.00426C14.6602 6.1236 14.7273 6.28546 14.7273 6.45423V14.0906C14.7273 14.9345 14.3921 15.7438 13.7953 16.3405C13.1986 16.9372 12.3893 17.2724 11.5455 17.2724Z" fill="#8E8E8E"/>
  5900. <path id="Vector_2" d="M15.3636 4.54519H2.63636C2.46759 4.54519 2.30573 4.47814 2.18639 4.3588C2.06705 4.23946 2 4.0776 2 3.90882C2 3.74005 2.06705 3.57819 2.18639 3.45885C2.30573 3.33951 2.46759 3.27246 2.63636 3.27246H15.3636C15.5324 3.27246 15.6943 3.33951 15.8136 3.45885C15.933 3.57819 16 3.74005 16 3.90882C16 4.0776 15.933 4.23946 15.8136 4.3588C15.6943 4.47814 15.5324 4.54519 15.3636 4.54519Z" fill="#8E8E8E"/>
  5901. <path id="Vector_3" d="M11.5454 4.54523H6.45454C6.28577 4.54523 6.1239 4.47819 6.00456 4.35885C5.88522 4.2395 5.81818 4.07764 5.81818 3.90887V2.63614C5.81818 2.12982 6.01931 1.64423 6.37734 1.28621C6.73536 0.928187 7.22094 0.727051 7.72727 0.727051H10.2727C10.779 0.727051 11.2646 0.928187 11.6227 1.28621C11.9807 1.64423 12.1818 2.12982 12.1818 2.63614V3.90887C12.1818 4.07764 12.1148 4.2395 11.9954 4.35885C11.8761 4.47819 11.7142 4.54523 11.5454 4.54523ZM7.0909 3.27251H10.9091V2.63614C10.9091 2.46737 10.842 2.30551 10.7227 2.18616C10.6034 2.06682 10.4415 1.99978 10.2727 1.99978H7.72727C7.55849 1.99978 7.39663 2.06682 7.27729 2.18616C7.15795 2.30551 7.0909 2.46737 7.0909 2.63614V3.27251Z" fill="#8E8E8E"/>
  5902. <path id="Vector_4" d="M7.72728 13.4543C7.5585 13.4543 7.39664 13.3873 7.2773 13.2679C7.15796 13.1486 7.09091 12.9867 7.09091 12.818V8.36341C7.09091 8.19464 7.15796 8.03278 7.2773 7.91344C7.39664 7.7941 7.5585 7.72705 7.72728 7.72705C7.89605 7.72705 8.05791 7.7941 8.17725 7.91344C8.29659 8.03278 8.36364 8.19464 8.36364 8.36341V12.818C8.36364 12.9867 8.29659 13.1486 8.17725 13.2679C8.05791 13.3873 7.89605 13.4543 7.72728 13.4543Z" fill="#8E8E8E"/>
  5903. <path id="Vector_5" d="M10.2727 13.4543C10.1039 13.4543 9.94208 13.3873 9.82274 13.2679C9.7034 13.1486 9.63635 12.9867 9.63635 12.818V8.36341C9.63635 8.19464 9.7034 8.03278 9.82274 7.91344C9.94208 7.7941 10.1039 7.72705 10.2727 7.72705C10.4415 7.72705 10.6034 7.7941 10.7227 7.91344C10.842 8.03278 10.9091 8.19464 10.9091 8.36341V12.818C10.9091 12.9867 10.842 13.1486 10.7227 13.2679C10.6034 13.3873 10.4415 13.4543 10.2727 13.4543Z" fill="#8E8E8E"/>
  5904. </g>
  5905. </g>
  5906. </svg>
  5907. </file>
  5908. <file path="assets/img/ico_del_disabled2.svg">
  5909. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  5910. <path d="M11.5455 17.2724H6.45455C5.61068 17.2724 4.80138 16.9372 4.20467 16.3405C3.60796 15.7438 3.27274 14.9345 3.27274 14.0906V6.45423C3.27274 6.28546 3.33978 6.1236 3.45912 6.00426C3.57846 5.88492 3.74033 5.81787 3.9091 5.81787C4.07787 5.81787 4.23973 5.88492 4.35908 6.00426C4.47842 6.1236 4.54546 6.28546 4.54546 6.45423V14.0906C4.54546 14.5969 4.7466 15.0825 5.10462 15.4405C5.46265 15.7986 5.94823 15.9997 6.45455 15.9997H11.5455C12.0518 15.9997 12.5374 15.7986 12.8954 15.4405C13.2534 15.0825 13.4546 14.5969 13.4546 14.0906V6.45423C13.4546 6.28546 13.5216 6.1236 13.6409 6.00426C13.7603 5.88492 13.9221 5.81787 14.0909 5.81787C14.2597 5.81787 14.4216 5.88492 14.5409 6.00426C14.6602 6.1236 14.7273 6.28546 14.7273 6.45423V14.0906C14.7273 14.9345 14.3921 15.7438 13.7953 16.3405C13.1986 16.9372 12.3893 17.2724 11.5455 17.2724Z" fill="#8E8E8E"/>
  5911. <path d="M15.3636 4.54519H2.63636C2.46759 4.54519 2.30573 4.47814 2.18639 4.3588C2.06705 4.23946 2 4.0776 2 3.90882C2 3.74005 2.06705 3.57819 2.18639 3.45885C2.30573 3.33951 2.46759 3.27246 2.63636 3.27246H15.3636C15.5324 3.27246 15.6943 3.33951 15.8136 3.45885C15.933 3.57819 16 3.74005 16 3.90882C16 4.0776 15.933 4.23946 15.8136 4.3588C15.6943 4.47814 15.5324 4.54519 15.3636 4.54519Z" fill="#8E8E8E"/>
  5912. <path d="M11.5454 4.54523H6.45454C6.28577 4.54523 6.1239 4.47819 6.00456 4.35885C5.88522 4.2395 5.81818 4.07764 5.81818 3.90887V2.63614C5.81818 2.12982 6.01931 1.64423 6.37734 1.28621C6.73536 0.928187 7.22094 0.727051 7.72727 0.727051H10.2727C10.779 0.727051 11.2646 0.928187 11.6227 1.28621C11.9807 1.64423 12.1818 2.12982 12.1818 2.63614V3.90887C12.1818 4.07764 12.1148 4.2395 11.9954 4.35885C11.8761 4.47819 11.7142 4.54523 11.5454 4.54523ZM7.0909 3.27251H10.9091V2.63614C10.9091 2.46737 10.842 2.30551 10.7227 2.18616C10.6034 2.06682 10.4415 1.99978 10.2727 1.99978H7.72727C7.55849 1.99978 7.39663 2.06682 7.27729 2.18616C7.15795 2.30551 7.0909 2.46737 7.0909 2.63614V3.27251Z" fill="#8E8E8E"/>
  5913. <path d="M7.72728 13.4543C7.5585 13.4543 7.39664 13.3873 7.2773 13.2679C7.15796 13.1486 7.09091 12.9867 7.09091 12.818V8.36341C7.09091 8.19464 7.15796 8.03278 7.2773 7.91344C7.39664 7.7941 7.5585 7.72705 7.72728 7.72705C7.89605 7.72705 8.05791 7.7941 8.17725 7.91344C8.29659 8.03278 8.36364 8.19464 8.36364 8.36341V12.818C8.36364 12.9867 8.29659 13.1486 8.17725 13.2679C8.05791 13.3873 7.89605 13.4543 7.72728 13.4543Z" fill="#8E8E8E"/>
  5914. <path d="M10.2727 13.4543C10.1039 13.4543 9.94208 13.3873 9.82274 13.2679C9.7034 13.1486 9.63635 12.9867 9.63635 12.818V8.36341C9.63635 8.19464 9.7034 8.03278 9.82274 7.91344C9.94208 7.7941 10.1039 7.72705 10.2727 7.72705C10.4415 7.72705 10.6034 7.7941 10.7227 7.91344C10.842 8.03278 10.9091 8.19464 10.9091 8.36341V12.818C10.9091 12.9867 10.842 13.1486 10.7227 13.2679C10.6034 13.3873 10.4415 13.4543 10.2727 13.4543Z" fill="#8E8E8E"/>
  5915. </svg>
  5916. </file>
  5917. <file path="assets/img/ico_del.svg">
  5918. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  5919. <path d="M11.5454 17.2729H6.45452C5.61065 17.2729 4.80134 16.9377 4.20464 16.341C3.60793 15.7443 3.27271 14.935 3.27271 14.0911V6.45472C3.27271 6.28595 3.33975 6.12409 3.45909 6.00475C3.57843 5.8854 3.74029 5.81836 3.90907 5.81836C4.07784 5.81836 4.2397 5.8854 4.35905 6.00475C4.47839 6.12409 4.54543 6.28595 4.54543 6.45472V14.0911C4.54543 14.5974 4.74657 15.083 5.10459 15.441C5.46262 15.799 5.9482 16.0002 6.45452 16.0002H11.5454C12.0518 16.0002 12.5373 15.799 12.8954 15.441C13.2534 15.083 13.4545 14.5974 13.4545 14.0911V6.45472C13.4545 6.28595 13.5216 6.12409 13.6409 6.00475C13.7603 5.8854 13.9221 5.81836 14.0909 5.81836C14.2597 5.81836 14.4215 5.8854 14.5409 6.00475C14.6602 6.12409 14.7273 6.28595 14.7273 6.45472V14.0911C14.7273 14.935 14.392 15.7443 13.7953 16.341C13.1986 16.9377 12.3893 17.2729 11.5454 17.2729Z" fill="white"/>
  5920. <path d="M15.3636 4.54616H2.63636C2.46759 4.54616 2.30573 4.47912 2.18639 4.35978C2.06705 4.24044 2 4.07858 2 3.9098C2 3.74103 2.06705 3.57917 2.18639 3.45982C2.30573 3.34048 2.46759 3.27344 2.63636 3.27344H15.3636C15.5324 3.27344 15.6943 3.34048 15.8136 3.45982C15.933 3.57917 16 3.74103 16 3.9098C16 4.07858 15.933 4.24044 15.8136 4.35978C15.6943 4.47912 15.5324 4.54616 15.3636 4.54616Z" fill="white"/>
  5921. <path d="M11.5455 4.54572H6.4546C6.28583 4.54572 6.12397 4.47868 6.00462 4.35933C5.88528 4.23999 5.81824 4.07813 5.81824 3.90936V2.63663C5.81824 2.13031 6.01937 1.64472 6.3774 1.2867C6.73542 0.928675 7.22101 0.727539 7.72733 0.727539H10.2728C10.7791 0.727539 11.2647 0.928675 11.6227 1.2867C11.9807 1.64472 12.1819 2.13031 12.1819 2.63663V3.90936C12.1819 4.07813 12.1148 4.23999 11.9955 4.35933C11.8761 4.47868 11.7143 4.54572 11.5455 4.54572ZM7.09096 3.27299H10.9091V2.63663C10.9091 2.46786 10.8421 2.30599 10.7228 2.18665C10.6034 2.06731 10.4416 2.00027 10.2728 2.00027H7.72733C7.55855 2.00027 7.39669 2.06731 7.27735 2.18665C7.15801 2.30599 7.09096 2.46786 7.09096 2.63663V3.27299Z" fill="white"/>
  5922. <path d="M7.72731 13.4548C7.55853 13.4548 7.39667 13.3878 7.27733 13.2684C7.15799 13.1491 7.09094 12.9872 7.09094 12.8184V8.3639C7.09094 8.19513 7.15799 8.03327 7.27733 7.91393C7.39667 7.79458 7.55853 7.72754 7.72731 7.72754C7.89608 7.72754 8.05794 7.79458 8.17728 7.91393C8.29662 8.03327 8.36367 8.19513 8.36367 8.3639V12.8184C8.36367 12.9872 8.29662 13.1491 8.17728 13.2684C8.05794 13.3878 7.89608 13.4548 7.72731 13.4548Z" fill="white"/>
  5923. <path d="M10.2727 13.4548C10.1039 13.4548 9.94208 13.3878 9.82274 13.2684C9.7034 13.1491 9.63635 12.9872 9.63635 12.8184V8.3639C9.63635 8.19513 9.7034 8.03327 9.82274 7.91393C9.94208 7.79458 10.1039 7.72754 10.2727 7.72754C10.4415 7.72754 10.6034 7.79458 10.7227 7.91393C10.842 8.03327 10.9091 8.19513 10.9091 8.3639V12.8184C10.9091 12.9872 10.842 13.1491 10.7227 13.2684C10.6034 13.3878 10.4415 13.4548 10.2727 13.4548Z" fill="white"/>
  5924. </svg>
  5925. </file>
  5926. <file path="assets/img/ico_del2.svg">
  5927. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  5928. <path d="M11.5455 17.2724H6.45455C5.61068 17.2724 4.80138 16.9372 4.20467 16.3405C3.60796 15.7438 3.27274 14.9345 3.27274 14.0906V6.45423C3.27274 6.28546 3.33978 6.1236 3.45912 6.00426C3.57846 5.88492 3.74033 5.81787 3.9091 5.81787C4.07787 5.81787 4.23973 5.88492 4.35908 6.00426C4.47842 6.1236 4.54546 6.28546 4.54546 6.45423V14.0906C4.54546 14.5969 4.7466 15.0825 5.10462 15.4405C5.46265 15.7986 5.94823 15.9997 6.45455 15.9997H11.5455C12.0518 15.9997 12.5374 15.7986 12.8954 15.4405C13.2534 15.0825 13.4546 14.5969 13.4546 14.0906V6.45423C13.4546 6.28546 13.5216 6.1236 13.6409 6.00426C13.7603 5.88492 13.9221 5.81787 14.0909 5.81787C14.2597 5.81787 14.4216 5.88492 14.5409 6.00426C14.6602 6.1236 14.7273 6.28546 14.7273 6.45423V14.0906C14.7273 14.9345 14.3921 15.7438 13.7953 16.3405C13.1986 16.9372 12.3893 17.2724 11.5455 17.2724Z" fill="white"/>
  5929. <path d="M15.3636 4.54519H2.63636C2.46759 4.54519 2.30573 4.47814 2.18639 4.3588C2.06705 4.23946 2 4.0776 2 3.90882C2 3.74005 2.06705 3.57819 2.18639 3.45885C2.30573 3.33951 2.46759 3.27246 2.63636 3.27246H15.3636C15.5324 3.27246 15.6943 3.33951 15.8136 3.45885C15.933 3.57819 16 3.74005 16 3.90882C16 4.0776 15.933 4.23946 15.8136 4.3588C15.6943 4.47814 15.5324 4.54519 15.3636 4.54519Z" fill="white"/>
  5930. <path d="M11.5454 4.54523H6.45454C6.28577 4.54523 6.1239 4.47819 6.00456 4.35885C5.88522 4.2395 5.81818 4.07764 5.81818 3.90887V2.63614C5.81818 2.12982 6.01931 1.64423 6.37734 1.28621C6.73536 0.928187 7.22094 0.727051 7.72727 0.727051H10.2727C10.779 0.727051 11.2646 0.928187 11.6227 1.28621C11.9807 1.64423 12.1818 2.12982 12.1818 2.63614V3.90887C12.1818 4.07764 12.1148 4.2395 11.9954 4.35885C11.8761 4.47819 11.7142 4.54523 11.5454 4.54523ZM7.0909 3.27251H10.9091V2.63614C10.9091 2.46737 10.842 2.30551 10.7227 2.18616C10.6034 2.06682 10.4415 1.99978 10.2727 1.99978H7.72727C7.55849 1.99978 7.39663 2.06682 7.27729 2.18616C7.15795 2.30551 7.0909 2.46737 7.0909 2.63614V3.27251Z" fill="white"/>
  5931. <path d="M7.72728 13.4543C7.5585 13.4543 7.39664 13.3873 7.2773 13.2679C7.15796 13.1486 7.09091 12.9867 7.09091 12.818V8.36341C7.09091 8.19464 7.15796 8.03278 7.2773 7.91344C7.39664 7.7941 7.5585 7.72705 7.72728 7.72705C7.89605 7.72705 8.05791 7.7941 8.17725 7.91344C8.29659 8.03278 8.36364 8.19464 8.36364 8.36341V12.818C8.36364 12.9867 8.29659 13.1486 8.17725 13.2679C8.05791 13.3873 7.89605 13.4543 7.72728 13.4543Z" fill="white"/>
  5932. <path d="M10.2727 13.4543C10.1039 13.4543 9.94208 13.3873 9.82274 13.2679C9.7034 13.1486 9.63635 12.9867 9.63635 12.818V8.36341C9.63635 8.19464 9.7034 8.03278 9.82274 7.91344C9.94208 7.7941 10.1039 7.72705 10.2727 7.72705C10.4415 7.72705 10.6034 7.7941 10.7227 7.91344C10.842 8.03278 10.9091 8.19464 10.9091 8.36341V12.818C10.9091 12.9867 10.842 13.1486 10.7227 13.2679C10.6034 13.3873 10.4415 13.4543 10.2727 13.4543Z" fill="white"/>
  5933. </svg>
  5934. </file>
  5935. <file path="assets/img/ico_download.svg">
  5936. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  5937. <path d="M14 10V12.6667C14 13.0203 13.8595 13.3594 13.6095 13.6095C13.3594 13.8595 13.0203 14 12.6667 14H3.33333C2.97971 14 2.64057 13.8595 2.39052 13.6095C2.14048 13.3594 2 13.0203 2 12.6667V10" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5938. <path d="M4.66602 6.66699L7.99935 10.0003L11.3327 6.66699" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5939. <path d="M8 10V2" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5940. </svg>
  5941. </file>
  5942. <file path="assets/img/ico_end.svg">
  5943. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  5944. <g clip-path="url(#clip0_998_7719)">
  5945. <path d="M9 16.5C13.1421 16.5 16.5 13.1421 16.5 9C16.5 4.85786 13.1421 1.5 9 1.5C4.85786 1.5 1.5 4.85786 1.5 9C1.5 13.1421 4.85786 16.5 9 16.5Z" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5946. <path d="M11.25 6.75L6.75 11.25" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5947. <path d="M6.75 6.75L11.25 11.25" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5948. </g>
  5949. <defs>
  5950. <clipPath id="clip0_998_7719">
  5951. <rect width="18" height="18" fill="white"/>
  5952. </clipPath>
  5953. </defs>
  5954. </svg>
  5955. </file>
  5956. <file path="assets/img/ico_equip.svg">
  5957. <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
  5958. <path fill-rule="evenodd" clip-rule="evenodd" d="M10.5873 17.8125L7.5 15.1875V7.50195C7.5 6.9785 7.91972 6.5625 8.43746 6.5625H22.5C23.0112 6.5625 23.4375 6.9831 23.4375 7.50195V15.1875L20.3127 17.8125H10.5873ZM11.6899 18.75L13.3614 20.1712H17.5049L19.1967 18.75H11.6899ZM20.7986 18.8691L18.75 20.625L24.3029 25.3846L23.5457 26.1418L17.9246 21.3238L13.0276 21.3451L13.0078 21.3281L7.39183 26.1418L6.63462 25.3846L12.1875 20.625L10.1389 18.8691L6.5625 15.8438V10.65L3.75 13.125V14.0625V26.2556C3.75 27.288 4.58415 28.125 5.62837 28.125H25.3091C26.3465 28.125 27.1875 27.2864 27.1875 26.2556V13.125L24.375 10.65V15.8438L20.7986 18.8691ZM18.6648 5.625L15.4688 2.8125L12.2727 5.625H18.6648ZM9.375 9.375V10.3125H21.5625V9.375H9.375ZM9.375 12.1875V13.125H21.5625V12.1875H9.375ZM9.375 15V15.9375H21.5625V15H9.375Z" fill="#8FA2BE"/>
  5959. </svg>
  5960. </file>
  5961. <file path="assets/img/ico_eraser.svg">
  5962. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  5963. <path d="M7.14844 7.77344L12.4531 13.0781" stroke="#8E8E8E" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5964. <path d="M16.8749 16.8585H5.63271L2.73427 13.9601C2.61758 13.8446 2.52495 13.7071 2.46173 13.5556C2.39852 13.404 2.36597 13.2415 2.36597 13.0773C2.36597 12.9131 2.39852 12.7505 2.46173 12.599C2.52495 12.4475 2.61758 12.31 2.73427 12.1945L11.5702 3.35854C11.6857 3.24185 11.8232 3.14922 11.9747 3.086C12.1263 3.02278 12.2888 2.99023 12.453 2.99023C12.6172 2.99023 12.7798 3.02278 12.9313 3.086C13.0828 3.14922 13.2203 3.24185 13.3358 3.35854L16.8749 6.88979C17.1073 7.12644 17.2375 7.44485 17.2375 7.77651C17.2375 8.10817 17.1073 8.42657 16.8749 8.66323L8.67177 16.8585" stroke="#8E8E8E" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5965. </svg>
  5966. </file>
  5967. <file path="assets/img/ico_eraser2.svg">
  5968. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  5969. <path d="M7.14844 7.77344L12.4531 13.0781" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5970. <path d="M16.8751 16.8585H5.63295L2.73452 13.9601C2.61783 13.8446 2.5252 13.7071 2.46198 13.5556C2.39876 13.404 2.36621 13.2415 2.36621 13.0773C2.36621 12.9131 2.39876 12.7505 2.46198 12.599C2.5252 12.4475 2.61783 12.31 2.73452 12.1945L11.5705 3.35854C11.686 3.24185 11.8235 3.14922 11.975 3.086C12.1265 3.02278 12.2891 2.99023 12.4533 2.99023C12.6175 2.99023 12.78 3.02278 12.9315 3.086C13.0831 3.14922 13.2206 3.24185 13.3361 3.35854L16.8751 6.88979C17.1075 7.12644 17.2377 7.44485 17.2377 7.77651C17.2377 8.10817 17.1075 8.42657 16.8751 8.66323L8.67202 16.8585" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  5971. </svg>
  5972. </file>
  5973. <file path="assets/img/ico_error.svg">
  5974. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  5975. <path d="M16.8489 15.1405L10.1133 2.66347C9.63589 1.77884 8.36411 1.77884 7.8863 2.66347L1.15114 15.1405C1.04748 15.3325 0.995512 15.5481 1.0003 15.7661C1.0051 15.9842 1.06649 16.1973 1.17848 16.3846C1.29048 16.572 1.44925 16.7271 1.63931 16.835C1.82936 16.9428 2.0442 16.9997 2.26286 17H15.7352C15.954 17 16.1691 16.9434 16.3594 16.8357C16.5497 16.728 16.7088 16.5729 16.821 16.3855C16.9332 16.1981 16.9948 15.9849 16.9997 15.7666C17.0046 15.5484 16.9526 15.3327 16.8489 15.1405ZM9 15.0683C8.84367 15.0683 8.69085 15.0221 8.56087 14.9355C8.43088 14.8488 8.32957 14.7257 8.26975 14.5816C8.20992 14.4375 8.19427 14.279 8.22477 14.1261C8.25527 13.9731 8.33055 13.8327 8.44109 13.7224C8.55163 13.6121 8.69247 13.537 8.8458 13.5066C8.99912 13.4762 9.15805 13.4918 9.30248 13.5515C9.44691 13.6111 9.57036 13.7122 9.65721 13.8419C9.74406 13.9715 9.79042 14.124 9.79042 14.2799C9.79042 14.3834 9.76997 14.486 9.73025 14.5816C9.69053 14.6773 9.63231 14.7642 9.55891 14.8374C9.48551 14.9106 9.39838 14.9687 9.30248 15.0083C9.20658 15.0479 9.1038 15.0683 9 15.0683ZM9.8584 7.13863L9.63155 11.9481C9.63155 12.1154 9.56492 12.2758 9.44634 12.3941C9.32775 12.5124 9.16692 12.5788 8.99921 12.5788C8.8315 12.5788 8.67067 12.5124 8.55208 12.3941C8.4335 12.2758 8.36687 12.1154 8.36687 11.9481L8.14002 7.1406C8.13493 7.02572 8.15307 6.911 8.19337 6.80326C8.23367 6.69552 8.2953 6.59698 8.37459 6.51351C8.45388 6.43004 8.54921 6.36335 8.65489 6.31741C8.76058 6.27147 8.87445 6.24723 8.98973 6.24612H8.99802C9.11409 6.24606 9.22896 6.26946 9.3357 6.3149C9.44245 6.36034 9.53886 6.42688 9.61912 6.51051C9.69938 6.59414 9.76181 6.69312 9.80267 6.80149C9.84352 6.90985 9.86194 7.02534 9.85681 7.141L9.8584 7.13863Z" fill="#E60A0A"/>
  5976. </svg>
  5977. </file>
  5978. <file path="assets/img/ico_event_pop.svg">
  5979. <svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg">
  5980. <g clip-path="url(#clip0_478_306)">
  5981. <path d="M10.9 4.8501H5.95001C5.34249 4.8501 4.85001 5.34258 4.85001 5.9501V10.9001C4.85001 11.5076 5.34249 12.0001 5.95001 12.0001H10.9C11.5075 12.0001 12 11.5076 12 10.9001V5.9501C12 5.34258 11.5075 4.8501 10.9 4.8501Z" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
  5982. <path d="M2.65 8.15H2.1C1.80826 8.15 1.52847 8.03411 1.32218 7.82782C1.11589 7.62153 1 7.34174 1 7.05V2.1C1 1.80826 1.11589 1.52847 1.32218 1.32218C1.52847 1.11589 1.80826 1 2.1 1H7.05C7.34174 1 7.62153 1.11589 7.82782 1.32218C8.03411 1.52847 8.15 1.80826 8.15 2.1V2.65" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
  5983. </g>
  5984. <defs>
  5985. <clipPath id="clip0_478_306">
  5986. <rect width="13" height="13" fill="white"/>
  5987. </clipPath>
  5988. </defs>
  5989. </svg>
  5990. </file>
  5991. <file path="assets/img/ico_event_view_black.svg">
  5992. <svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg">
  5993. <path d="M12.2112 6.27588C12.2432 6.34627 12.2598 6.42268 12.2598 6.5C12.2599 6.57732 12.2434 6.65376 12.2115 6.72418C11.9968 7.19853 11.7447 7.65506 11.4577 8.08946C11.4186 8.14928 11.368 8.20077 11.3089 8.24096C11.2498 8.28116 11.1834 8.30926 11.1134 8.32365C11.0434 8.33805 10.9712 8.33844 10.9011 8.32483C10.8309 8.31121 10.7642 8.28384 10.7046 8.24431C10.6451 8.20477 10.594 8.15384 10.5542 8.09446C10.5144 8.03508 10.4868 7.96841 10.4729 7.89831C10.4591 7.82821 10.4592 7.75605 10.4733 7.686C10.4874 7.61594 10.5153 7.54938 10.5553 7.49013C10.7651 7.17299 10.9536 6.84227 11.1197 6.50016C10.044 4.29038 8.33066 2.97933 6.49989 2.97933C4.66913 2.97933 2.95577 4.29038 1.88012 6.50016C2.95577 8.70994 4.66913 10.021 6.49989 10.021C7.50239 10.002 8.46695 9.63435 9.2278 8.9813M12.2112 6.27588C10.9636 3.53343 8.82843 1.896 6.49989 1.896C4.17136 1.896 2.03617 3.53343 0.788589 6.27588C0.756561 6.34631 0.73999 6.42279 0.73999 6.50016C0.73999 6.57754 0.756561 6.65401 0.788589 6.72444M12.2112 6.27588L11.7561 6.48292M12.2112 6.27588L11.7561 6.48286C11.7561 6.48288 11.7561 6.4829 11.7561 6.48292M0.788589 6.72444C2.03617 9.4669 4.17136 11.1043 6.49989 11.1043M0.788589 6.72444L1.24374 6.51748M0.788589 6.72444L1.24371 6.5174L1.24374 6.51748M6.49989 11.1043C7.7522 11.0865 8.9591 10.6326 9.91282 9.82078C10.0241 9.72994 10.0948 9.5986 10.1093 9.45565C10.1238 9.3127 10.0809 9.16985 9.99005 9.05853C9.89921 8.94721 9.76787 8.87654 9.62492 8.86205C9.48197 8.84757 9.33912 8.89047 9.2278 8.9813M6.49989 11.1043V10.6043C6.4987 10.6043 6.49751 10.6043 6.49632 10.6043M6.49989 11.1043L6.49277 10.6044C6.49395 10.6044 6.49514 10.6043 6.49632 10.6043M9.2278 8.9813L9.54391 9.3687C9.54458 9.36815 9.54527 9.36762 9.54597 9.36712M9.2278 8.9813L9.55345 9.36071C9.55096 9.36285 9.54846 9.36499 9.54597 9.36712M9.54597 9.36712C9.55421 9.36121 9.56436 9.35848 9.57452 9.35951C9.58553 9.36062 9.59566 9.36607 9.60265 9.37465C9.60965 9.38322 9.61296 9.39423 9.61184 9.40525C9.61073 9.41627 9.60528 9.42639 9.5967 9.43339L9.59663 9.4333L9.58873 9.44003C8.72449 10.1757 7.63105 10.5873 6.49632 10.6043M9.54597 9.36712L1.24371 6.48292C1.24126 6.48834 1.23999 6.49422 1.23999 6.50016C1.23999 6.50613 1.24127 6.51204 1.24374 6.51748M9.54597 9.36712C8.6981 10.0919 7.62478 10.4997 6.50938 10.5209L6.49989 10.5211V10.521C4.41034 10.521 2.55565 9.03037 1.43056 6.719L1.32403 6.50016L1.43056 6.28133C2.55565 3.96996 4.41034 2.47933 6.49989 2.47933C8.58945 2.47933 10.4441 3.96996 11.5692 6.28133L11.6756 6.49984L11.5695 6.71847C11.3938 7.08048 11.1943 7.43043 10.9723 7.76602L10.9698 7.76979L10.9698 7.76978C10.9667 7.77434 10.9645 7.77946 10.9634 7.78485C10.9624 7.79023 10.9623 7.79579 10.9634 7.80118C10.9645 7.80657 10.9666 7.8117 10.9697 7.81627C10.9727 7.82083 10.9767 7.82475 10.9812 7.82779C10.9858 7.83084 10.991 7.83294 10.9964 7.83399C11.0017 7.83504 11.0073 7.83501 11.0127 7.8339C11.0181 7.83279 11.0232 7.83063 11.0277 7.82754C11.0323 7.82445 11.0362 7.82049 11.0392 7.81588L11.0405 7.81382C11.313 7.40152 11.5522 6.96822 11.756 6.51801L11.7561 6.51775C11.7586 6.51227 11.7598 6.50632 11.7598 6.5003C11.7598 6.4943 11.7586 6.48838 11.7561 6.48292M9.54597 9.36712L1.24374 6.48285C2.43887 3.85575 4.4284 2.396 6.49989 2.396C8.57141 2.396 10.561 3.85578 11.7561 6.48292M6.49632 10.6043C4.42611 10.6026 2.43818 9.14306 1.24374 6.51748" fill="black" stroke="black"/>
  5994. <path d="M6.47136 5.41762L6.46763 4.91763C6.45181 4.91775 6.43653 4.91191 6.42483 4.90128C6.41312 4.89064 6.40585 4.87599 6.40446 4.86023L6.40434 4.85892C6.40408 4.85602 6.4044 4.8531 6.40528 4.85032C6.40617 4.84755 6.40761 4.84498 6.4095 4.84278C6.4114 4.84057 6.41372 4.83877 6.41633 4.83747C6.41807 4.83661 6.4199 4.83599 6.42179 4.83562L6.5058 4.83351C6.94571 4.83506 7.36726 5.01048 7.67843 5.32165C7.99099 5.63421 8.16659 6.05814 8.16659 6.50016C8.16659 6.94219 7.99099 7.36611 7.67843 7.67867C7.36592 7.99119 6.94208 8.16677 6.50013 8.16683C6.25464 8.16657 6.01224 8.11214 5.7902 8.00744C5.56809 7.9027 5.37183 7.75023 5.21543 7.5609L4.83344 7.87646L5.21543 7.5609C5.05904 7.37158 4.94635 7.15006 4.88543 6.91217C4.8245 6.67428 4.81683 6.42587 4.86297 6.18467L4.863 6.18447C4.86508 6.1736 4.87139 6.16399 4.88055 6.15777C4.88971 6.15155 4.90096 6.14922 4.91184 6.15129C4.92272 6.15337 4.93232 6.15968 4.93854 6.16884C4.94477 6.178 4.9471 6.18925 4.94502 6.20013L5.43616 6.29386L4.94529 6.19872C4.9033 6.41538 4.90705 6.63843 4.95633 6.85355L5.44371 6.74193L4.95633 6.85355C5.0056 7.06868 5.0993 7.27113 5.23141 7.44792C5.36352 7.6247 5.53113 7.77192 5.72348 7.88012C5.91583 7.98832 6.12868 8.05512 6.34836 8.07623C6.56804 8.09733 6.78972 8.07229 6.99915 8.00269C7.20859 7.93309 7.40116 7.82048 7.56452 7.67209C7.72787 7.52369 7.8584 7.34278 7.94774 7.14098C8.03707 6.93917 8.08323 6.72092 8.08325 6.50022H8.08333L8.08318 6.49143C8.07579 6.06893 7.90177 5.66647 7.599 5.37169C7.29624 5.07692 6.88926 4.91372 6.46672 4.91764L6.47136 5.41762ZM6.47136 5.41762C6.32992 5.41868 6.19326 5.36645 6.08857 5.27132C5.98389 5.1762 5.91885 5.04515 5.9064 4.90426L7.58325 6.50016C7.57817 6.20955 7.45847 5.93271 7.25021 5.72994C7.04195 5.52718 6.76201 5.41492 6.47136 5.41762Z" fill="black" stroke="black"/>
  5995. </svg>
  5996. </file>
  5997. <file path="assets/img/ico_event_view_down.svg">
  5998. <svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg">
  5999. <path d="M3 5L6.5 8L10 5" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6000. </svg>
  6001. </file>
  6002. <file path="assets/img/ico_event_view.svg">
  6003. <svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg">
  6004. <path d="M6.50002 11.1043C4.17148 11.1043 2.03629 9.4669 0.788711 6.72444C0.756684 6.65401 0.740112 6.57754 0.740112 6.50016C0.740112 6.42279 0.756684 6.34631 0.788711 6.27588C2.03629 3.53343 4.17148 1.896 6.50002 1.896C8.82855 1.896 10.9637 3.53343 12.2113 6.27588C12.2433 6.34627 12.2599 6.42268 12.26 6.5C12.26 6.57732 12.2435 6.65376 12.2116 6.72418C11.9969 7.19853 11.7448 7.65506 11.4578 8.08946C11.4187 8.14928 11.3681 8.20077 11.3091 8.24096C11.25 8.28116 11.1835 8.30926 11.1135 8.32365C11.0435 8.33805 10.9714 8.33844 10.9012 8.32483C10.831 8.31121 10.7643 8.28384 10.7047 8.24431C10.6452 8.20477 10.5941 8.15384 10.5543 8.09446C10.5146 8.03508 10.4869 7.96841 10.4731 7.89831C10.4592 7.82821 10.4593 7.75605 10.4734 7.686C10.4876 7.61594 10.5154 7.54938 10.5554 7.49013C10.7652 7.17299 10.9538 6.84227 11.1198 6.50016C10.0441 4.29038 8.33079 2.97933 6.50002 2.97933C4.66925 2.97933 2.95589 4.29038 1.88025 6.50016C2.95589 8.70994 4.66925 10.021 6.50002 10.021C7.50251 10.002 8.46707 9.63435 9.22792 8.9813C9.33924 8.89047 9.48209 8.84757 9.62504 8.86205C9.76799 8.87654 9.89933 8.94721 9.99017 9.05853C10.081 9.16985 10.1239 9.3127 10.1094 9.45565C10.0949 9.5986 10.0243 9.72994 9.91294 9.82078C8.95922 10.6326 7.75232 11.0865 6.50002 11.1043Z" fill="white"/>
  6005. <path d="M6.49998 8.66683C6.18083 8.66654 5.86567 8.5958 5.57701 8.45968C5.28834 8.32356 5.03327 8.1254 4.83001 7.87934C4.62675 7.63328 4.4803 7.3454 4.40112 7.03622C4.32194 6.72705 4.31197 6.40421 4.37193 6.09074C4.39887 5.94961 4.48076 5.82495 4.59961 5.7442C4.71845 5.66345 4.8645 5.63322 5.00564 5.66016C5.14677 5.68709 5.27142 5.76899 5.35217 5.88783C5.43292 6.00668 5.46315 6.15273 5.43622 6.29386C5.40748 6.44211 5.41005 6.59473 5.44377 6.74193C5.47748 6.88912 5.54159 7.02764 5.63199 7.14861C5.72238 7.26957 5.83707 7.3703 5.96868 7.44434C6.10029 7.51837 6.24593 7.56408 6.39624 7.57852C6.54656 7.59296 6.69823 7.57582 6.84154 7.5282C6.98484 7.48058 7.1166 7.40353 7.22838 7.30199C7.34015 7.20046 7.42946 7.07667 7.49059 6.93859C7.55171 6.80051 7.5833 6.65117 7.58331 6.50016C7.57824 6.20955 7.45853 5.93271 7.25027 5.72994C7.04201 5.52718 6.76207 5.41492 6.47142 5.41762C6.32998 5.41868 6.19332 5.36645 6.08864 5.27132C5.98395 5.1762 5.91891 5.04515 5.90646 4.90426C5.90012 4.83466 5.90783 4.7645 5.92913 4.69794C5.95043 4.63138 5.98489 4.56977 6.03045 4.51678C6.07601 4.4638 6.13176 4.4205 6.19438 4.38947C6.25699 4.35844 6.32521 4.3403 6.39497 4.33614L6.49998 4.3335C7.07462 4.3335 7.62572 4.56177 8.03205 4.9681C8.43837 5.37443 8.66665 5.92553 8.66665 6.50016C8.66665 7.0748 8.43837 7.6259 8.03205 8.03223C7.62572 8.43856 7.07462 8.66683 6.49998 8.66683Z" fill="white"/>
  6006. </svg>
  6007. </file>
  6008. <file path="assets/img/ico_excel_d.svg">
  6009. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6010. <path d="M16.8641 14.783H9.52424C9.2349 14.783 9.00006 14.5475 9.00006 14.2573V3.7434C9.00006 3.45318 9.2349 3.21774 9.52424 3.21774H16.8641C17.1535 3.21774 17.3884 3.45318 17.3884 3.7434V14.2573C17.3884 14.5475 17.1536 14.783 16.8641 14.783Z" fill="#F1F5F7"/>
  6011. <path d="M11.6214 6.37184H9.52424C9.2349 6.37184 9.00006 6.13633 9.00006 5.84612C9.00006 5.55597 9.2349 5.3205 9.52424 5.3205H11.6214C11.9107 5.3205 12.1456 5.55597 12.1456 5.84612C12.1456 6.13633 11.9108 6.37184 11.6214 6.37184Z" fill="#9DAAB8"/>
  6012. <path d="M11.6214 8.47465H9.52424C9.2349 8.47465 9.00006 8.23921 9.00006 7.94885C9.00006 7.65892 9.2349 7.42337 9.52424 7.42337H11.6214C11.9107 7.42337 12.1456 7.65892 12.1456 7.94885C12.1456 8.23917 11.9108 8.47465 11.6214 8.47465Z" fill="#9DAAB8"/>
  6013. <path d="M11.6214 10.5773H9.52424C9.2349 10.5773 9.00006 10.3418 9.00006 10.0518C9.00006 9.76154 9.2349 9.52603 9.52424 9.52603H11.6214C11.9107 9.52603 12.1456 9.76154 12.1456 10.0518C12.1456 10.3418 11.9108 10.5773 11.6214 10.5773Z" fill="#9DAAB8"/>
  6014. <path d="M11.6214 12.6803H9.52424C9.2349 12.6803 9.00006 12.4448 9.00006 12.1546C9.00006 11.8644 9.2349 11.6288 9.52424 11.6288H11.6214C11.9107 11.6288 12.1456 11.8644 12.1456 12.1546C12.1456 12.4448 11.9108 12.6803 11.6214 12.6803Z" fill="#9DAAB8"/>
  6015. <path d="M14.767 6.37184H13.7185C13.4291 6.37184 13.1942 6.13633 13.1942 5.84612C13.1942 5.55597 13.4291 5.3205 13.7185 5.3205H14.767C15.0563 5.3205 15.2912 5.55597 15.2912 5.84612C15.2912 6.13633 15.0563 6.37184 14.767 6.37184Z" fill="#9DAAB8"/>
  6016. <path d="M14.767 8.47465H13.7185C13.4291 8.47465 13.1942 8.23921 13.1942 7.94885C13.1942 7.65892 13.4291 7.42337 13.7185 7.42337H14.767C15.0563 7.42337 15.2912 7.65892 15.2912 7.94885C15.2912 8.23917 15.0563 8.47465 14.767 8.47465Z" fill="#9DAAB8"/>
  6017. <path d="M14.767 10.5773H13.7185C13.4291 10.5773 13.1942 10.3418 13.1942 10.0518C13.1942 9.76154 13.4291 9.52603 13.7185 9.52603H14.767C15.0563 9.52603 15.2912 9.76154 15.2912 10.0518C15.2912 10.3418 15.0563 10.5773 14.767 10.5773Z" fill="#9DAAB8"/>
  6018. <path d="M14.767 12.6803H13.7185C13.4291 12.6803 13.1942 12.4448 13.1942 12.1546C13.1942 11.8644 13.4291 11.6288 13.7185 11.6288H14.767C15.0563 11.6288 15.2912 11.8644 15.2912 12.1546C15.2912 12.4448 15.0563 12.6803 14.767 12.6803Z" fill="#9DAAB8"/>
  6019. <path d="M9.85882 1.23584C9.73915 1.13596 9.57873 1.09278 9.4278 1.12446L1.03945 2.70139C0.790965 2.74787 0.611633 2.9644 0.611633 3.21773V14.7829C0.611633 15.0353 0.790965 15.2528 1.03945 15.2993L9.4278 16.8763C9.4592 16.8825 9.49171 16.8858 9.52427 16.8858C9.64587 16.8858 9.76432 16.8437 9.85882 16.7647C9.97947 16.665 10.0484 16.5157 10.0484 16.36V1.64076C10.0484 1.48404 9.97944 1.33575 9.85882 1.23584Z" fill="#9DAAB8"/>
  6020. <path d="M7.82153 10.7572L6.16356 8.8575L7.84041 6.69588C8.01865 6.46652 7.9765 6.13634 7.749 5.95774C7.5215 5.77894 7.1922 5.82098 7.01311 6.04904L5.46008 8.05095L4.15157 6.55188C3.95975 6.33086 3.62834 6.31092 3.4123 6.50242C3.1943 6.6936 3.17218 7.02579 3.36305 7.24351L4.80484 8.89624L3.34315 10.7803C3.16484 11.0096 3.20685 11.3398 3.43427 11.5184C3.53081 11.5931 3.64521 11.6288 3.75729 11.6288C3.91349 11.6288 4.06775 11.5595 4.17139 11.4258L5.50839 9.70157L7.03287 11.4481C7.13675 11.5679 7.28142 11.6289 7.42707 11.6289C7.54984 11.6289 7.67261 11.5857 7.77231 11.4984C7.99035 11.3072 8.01225 10.975 7.82153 10.7572Z" fill="#FCFCFC"/>
  6021. </svg>
  6022. </file>
  6023. <file path="assets/img/ico_excel.svg">
  6024. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6025. <path d="M16.8641 14.783H9.52424C9.2349 14.783 9.00006 14.5475 9.00006 14.2573V3.74343C9.00006 3.45321 9.2349 3.21777 9.52424 3.21777H16.8641C17.1535 3.21777 17.3884 3.45321 17.3884 3.74343V14.2573C17.3884 14.5475 17.1536 14.783 16.8641 14.783Z" fill="#F1F5F7"/>
  6026. <path d="M11.6214 6.37166H9.52424C9.2349 6.37166 9.00006 6.13615 9.00006 5.84593C9.00006 5.55579 9.2349 5.32031 9.52424 5.32031H11.6214C11.9107 5.32031 12.1456 5.55579 12.1456 5.84593C12.1456 6.13615 11.9108 6.37166 11.6214 6.37166Z" fill="#46B34C"/>
  6027. <path d="M11.6214 8.47462H9.52424C9.2349 8.47462 9.00006 8.23918 9.00006 7.94882C9.00006 7.65889 9.2349 7.42334 9.52424 7.42334H11.6214C11.9107 7.42334 12.1456 7.65889 12.1456 7.94882C12.1456 8.23914 11.9108 8.47462 11.6214 8.47462Z" fill="#46B34C"/>
  6028. <path d="M11.6214 10.5772H9.52424C9.2349 10.5772 9.00006 10.3416 9.00006 10.0516C9.00006 9.76139 9.2349 9.52588 9.52424 9.52588H11.6214C11.9107 9.52588 12.1456 9.76139 12.1456 10.0516C12.1456 10.3416 11.9108 10.5772 11.6214 10.5772Z" fill="#46B34C"/>
  6029. <path d="M11.6214 12.6803H9.52424C9.2349 12.6803 9.00006 12.4448 9.00006 12.1546C9.00006 11.8644 9.2349 11.6289 9.52424 11.6289H11.6214C11.9107 11.6289 12.1456 11.8644 12.1456 12.1546C12.1456 12.4448 11.9108 12.6803 11.6214 12.6803Z" fill="#46B34C"/>
  6030. <path d="M14.767 6.37166H13.7184C13.4291 6.37166 13.1941 6.13615 13.1941 5.84593C13.1941 5.55579 13.4291 5.32031 13.7184 5.32031H14.767C15.0563 5.32031 15.2912 5.55579 15.2912 5.84593C15.2912 6.13615 15.0563 6.37166 14.767 6.37166Z" fill="#46B34C"/>
  6031. <path d="M14.767 8.47462H13.7184C13.4291 8.47462 13.1941 8.23918 13.1941 7.94882C13.1941 7.65889 13.4291 7.42334 13.7184 7.42334H14.767C15.0563 7.42334 15.2912 7.65889 15.2912 7.94882C15.2912 8.23914 15.0563 8.47462 14.767 8.47462Z" fill="#46B34C"/>
  6032. <path d="M14.767 10.5772H13.7184C13.4291 10.5772 13.1941 10.3416 13.1941 10.0516C13.1941 9.76139 13.4291 9.52588 13.7184 9.52588H14.767C15.0563 9.52588 15.2912 9.76139 15.2912 10.0516C15.2912 10.3416 15.0563 10.5772 14.767 10.5772Z" fill="#46B34C"/>
  6033. <path d="M14.767 12.6803H13.7184C13.4291 12.6803 13.1941 12.4448 13.1941 12.1546C13.1941 11.8644 13.4291 11.6289 13.7184 11.6289H14.767C15.0563 11.6289 15.2912 11.8644 15.2912 12.1546C15.2912 12.4448 15.0563 12.6803 14.767 12.6803Z" fill="#46B34C"/>
  6034. <path d="M9.85879 1.23587C9.73911 1.13599 9.5787 1.09281 9.42777 1.12449L1.03942 2.70142C0.790935 2.7479 0.611603 2.96443 0.611603 3.21776V14.783C0.611603 15.0353 0.790935 15.2528 1.03942 15.2993L9.42777 16.8763C9.45917 16.8825 9.49168 16.8858 9.52424 16.8858C9.64584 16.8858 9.76429 16.8437 9.85879 16.7647C9.97944 16.665 10.0484 16.5157 10.0484 16.36V1.6408C10.0483 1.48407 9.97941 1.33578 9.85879 1.23587Z" fill="#3CA241"/>
  6035. <path d="M7.82153 10.7571L6.16356 8.85744L7.84041 6.69582C8.01865 6.46646 7.9765 6.13628 7.749 5.95768C7.5215 5.77888 7.1922 5.82092 7.01311 6.04898L5.46008 8.05088L4.15157 6.55182C3.95975 6.33079 3.62834 6.31086 3.4123 6.50236C3.1943 6.69354 3.17218 7.02573 3.36305 7.24345L4.80484 8.89618L3.34315 10.7802C3.16484 11.0095 3.20685 11.3398 3.43427 11.5184C3.53081 11.593 3.64521 11.6288 3.75729 11.6288C3.91349 11.6288 4.06775 11.5594 4.17139 11.4257L5.50839 9.70151L7.03287 11.4481C7.13675 11.5678 7.28142 11.6288 7.42707 11.6288C7.54984 11.6288 7.67261 11.5857 7.77231 11.4983C7.99035 11.3071 8.01225 10.9749 7.82153 10.7571Z" fill="#FCFCFC"/>
  6036. </svg>
  6037. </file>
  6038. <file path="assets/img/ico_excel2.svg">
  6039. <svg width="18" height="16" viewBox="0 0 18 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  6040. <path d="M16.8641 13.783H9.52424C9.2349 13.783 9.00006 13.5475 9.00006 13.2573V2.74343C9.00006 2.45321 9.2349 2.21777 9.52424 2.21777H16.8641C17.1535 2.21777 17.3884 2.45321 17.3884 2.74343V13.2573C17.3884 13.5475 17.1536 13.783 16.8641 13.783Z" fill="#F1F5F7"/>
  6041. <path d="M11.6214 5.37166H9.52424C9.2349 5.37166 9.00006 5.13615 9.00006 4.84593C9.00006 4.55579 9.2349 4.32031 9.52424 4.32031H11.6214C11.9107 4.32031 12.1456 4.55579 12.1456 4.84593C12.1456 5.13615 11.9108 5.37166 11.6214 5.37166Z" fill="#007AFF"/>
  6042. <path d="M11.6214 7.47511H9.52424C9.2349 7.47511 9.00006 7.23966 9.00006 6.94931C9.00006 6.65937 9.2349 6.42383 9.52424 6.42383H11.6214C11.9107 6.42383 12.1456 6.65937 12.1456 6.94931C12.1456 7.23963 11.9108 7.47511 11.6214 7.47511Z" fill="#007AFF"/>
  6043. <path d="M11.6214 9.57764H9.52424C9.2349 9.57764 9.00006 9.3421 9.00006 9.05209C9.00006 8.76188 9.2349 8.52637 9.52424 8.52637H11.6214C11.9107 8.52637 12.1456 8.76188 12.1456 9.05209C12.1456 9.3421 11.9108 9.57764 11.6214 9.57764Z" fill="#007AFF"/>
  6044. <path d="M11.6214 11.6803H9.52424C9.2349 11.6803 9.00006 11.4448 9.00006 11.1546C9.00006 10.8644 9.2349 10.6289 9.52424 10.6289H11.6214C11.9107 10.6289 12.1456 10.8644 12.1456 11.1546C12.1456 11.4448 11.9108 11.6803 11.6214 11.6803Z" fill="#007AFF"/>
  6045. <path d="M14.767 5.37166H13.7185C13.4291 5.37166 13.1942 5.13615 13.1942 4.84593C13.1942 4.55579 13.4291 4.32031 13.7185 4.32031H14.767C15.0563 4.32031 15.2912 4.55579 15.2912 4.84593C15.2912 5.13615 15.0563 5.37166 14.767 5.37166Z" fill="#007AFF"/>
  6046. <path d="M14.767 7.47511H13.7185C13.4291 7.47511 13.1942 7.23966 13.1942 6.94931C13.1942 6.65937 13.4291 6.42383 13.7185 6.42383H14.767C15.0563 6.42383 15.2912 6.65937 15.2912 6.94931C15.2912 7.23963 15.0563 7.47511 14.767 7.47511Z" fill="#007AFF"/>
  6047. <path d="M14.767 9.57764H13.7185C13.4291 9.57764 13.1942 9.3421 13.1942 9.05209C13.1942 8.76188 13.4291 8.52637 13.7185 8.52637H14.767C15.0563 8.52637 15.2912 8.76188 15.2912 9.05209C15.2912 9.3421 15.0563 9.57764 14.767 9.57764Z" fill="#007AFF"/>
  6048. <path d="M14.767 11.6803H13.7185C13.4291 11.6803 13.1942 11.4448 13.1942 11.1546C13.1942 10.8644 13.4291 10.6289 13.7185 10.6289H14.767C15.0563 10.6289 15.2912 10.8644 15.2912 11.1546C15.2912 11.4448 15.0563 11.6803 14.767 11.6803Z" fill="#007AFF"/>
  6049. <path d="M9.85882 0.235866C9.73915 0.135987 9.57873 0.0928149 9.4278 0.124491L1.03945 1.70142C0.790965 1.7479 0.611633 1.96443 0.611633 2.21776V13.783C0.611633 14.0353 0.790965 14.2528 1.03945 14.2993L9.4278 15.8763C9.4592 15.8825 9.49171 15.8858 9.52427 15.8858C9.64587 15.8858 9.76432 15.8437 9.85882 15.7647C9.97947 15.665 10.0484 15.5157 10.0484 15.36V0.640795C10.0484 0.484069 9.97944 0.33578 9.85882 0.235866Z" fill="#007AFF"/>
  6050. <path d="M7.82153 9.75714L6.16356 7.85744L7.84041 5.69582C8.01865 5.46646 7.9765 5.13628 7.749 4.95768C7.5215 4.77888 7.1922 4.82092 7.01311 5.04898L5.46008 7.05088L4.15157 5.55182C3.95975 5.33079 3.62834 5.31086 3.4123 5.50236C3.1943 5.69354 3.17218 6.02573 3.36305 6.24345L4.80484 7.89618L3.34315 9.78021C3.16484 10.0095 3.20685 10.3398 3.43427 10.5184C3.53081 10.593 3.64521 10.6288 3.75729 10.6288C3.91349 10.6288 4.06775 10.5594 4.17139 10.4257L5.50839 8.70151L7.03287 10.4481C7.13675 10.5678 7.28142 10.6288 7.42707 10.6288C7.54984 10.6288 7.67261 10.5857 7.77231 10.4983C7.99035 10.3071 8.01225 9.9749 7.82153 9.75714Z" fill="#FCFCFC"/>
  6051. </svg>
  6052. </file>
  6053. <file path="assets/img/ico_eye.svg">
  6054. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6055. <path d="M8.99989 3.75C4.26938 3.75 1.97453 8.0124 1.56671 8.856C1.52204 8.94832 1.52204 9.05168 1.56671 9.144C1.97453 9.9876 4.26938 14.25 8.99989 14.25C13.7304 14.25 16.0252 9.9876 16.4331 9.144C16.4778 9.05168 16.4778 8.94832 16.4331 8.856C16.0252 8.0124 13.7304 3.75 8.99989 3.75Z" stroke="#222222" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6056. <path d="M9 11.25C10.2426 11.25 11.25 10.2426 11.25 9C11.25 7.75736 10.2426 6.75 9 6.75C7.75736 6.75 6.75 7.75736 6.75 9C6.75 10.2426 7.75736 11.25 9 11.25Z" stroke="#222222" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6057. </svg>
  6058. </file>
  6059. <file path="assets/img/ico_eye2.svg">
  6060. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6061. <path d="M5.25002 4.77139C6.27158 4.16952 7.51592 3.75 9.00002 3.75C13.7306 3.75 16.0253 8.0124 16.4332 8.856C16.4779 8.94832 16.4777 9.05205 16.433 9.14445C16.1689 9.6906 15.1157 11.6659 13.125 12.9933M10.5 14.1001C10.0301 14.1965 9.53034 14.25 9.00002 14.25C4.2695 14.25 1.97466 9.9876 1.56683 9.144C1.52216 9.05168 1.52288 8.94682 1.56758 8.85442C1.73158 8.51542 2.19737 7.63057 3.00002 6.69085" stroke="#222222" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6062. <path d="M7.5 7.32292C7.8981 6.96664 8.4237 6.75 9 6.75C10.2427 6.75 11.25 7.75732 11.25 9C11.25 9.5763 11.0333 10.1019 10.6771 10.5" stroke="#222222" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6063. <path d="M2.25 2.25L15.75 15.75" stroke="#222222" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6064. </svg>
  6065. </file>
  6066. <file path="assets/img/ico_gray_pin.svg">
  6067. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6068. <path d="M11.7637 3.48444C11.7122 3.29753 11.6072 3.09864 11.5298 2.92427C10.6007 0.771729 8.57133 0 6.93265 0C4.73872 0 2.32262 1.41854 2 4.34295V4.94044C2 4.96537 2.0088 5.18919 2.0218 5.30131C2.2026 6.69492 3.3426 8.17612 4.19422 9.56973C5.11024 11.0631 6.06106 12.5315 7.00293 14C7.58348 13.0419 8.16222 12.0713 8.72977 11.1376C8.88431 10.8639 9.06413 10.5902 9.21895 10.3287C9.32206 10.1547 9.51907 9.98046 9.60933 9.81862C10.5254 8.20092 12 6.57054 12 4.96537V4.30562C12.0001 4.13165 11.7767 3.5219 11.7637 3.48444ZM6.97261 6.48336C6.32765 6.48336 5.62205 6.17235 5.27358 5.3137C5.2216 5.17693 5.22579 4.90311 5.22579 4.87818V4.49225C5.22579 3.39752 6.18974 2.89961 7.02822 2.89961C8.06064 2.89961 8.85902 3.696 8.85902 4.69155C8.85902 5.68724 8.00489 6.48336 6.97261 6.48336Z" fill="#C3C8D8"/>
  6069. </svg>
  6070. </file>
  6071. <file path="assets/img/ico_grid_sort.svg">
  6072. <svg width="14" height="10" viewBox="0 0 14 10" fill="none" xmlns="http://www.w3.org/2000/svg">
  6073. <path d="M1.09082 1H13.0908" stroke="#444444" stroke-width="1.6" stroke-linecap="round"/>
  6074. <path d="M3.09082 5H11.0908" stroke="#444444" stroke-width="1.6" stroke-linecap="round"/>
  6075. <path d="M5.09082 9H9.09082" stroke="#444444" stroke-width="1.6" stroke-linecap="round"/>
  6076. </svg>
  6077. </file>
  6078. <file path="assets/img/ico_grid_sort2.svg">
  6079. <svg width="14" height="10" viewBox="0 0 14 10" fill="none" xmlns="http://www.w3.org/2000/svg">
  6080. <path d="M12.8184 9H0.818359" stroke="#444444" stroke-width="1.6" stroke-linecap="round"/>
  6081. <path d="M10.8184 5H2.81836" stroke="#444444" stroke-width="1.6" stroke-linecap="round"/>
  6082. <path d="M8.81836 1H4.81836" stroke="#444444" stroke-width="1.6" stroke-linecap="round"/>
  6083. </svg>
  6084. </file>
  6085. <file path="assets/img/ico_id_off.svg">
  6086. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6087. <g clip-path="url(#clip0_69_372)">
  6088. <path d="M17.0193 16.9999L13.7598 13.7676" stroke="#8E8E8E" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6089. <path d="M8.38461 15.7692C12.463 15.7692 15.7692 12.463 15.7692 8.38462C15.7692 4.3062 12.463 1 8.38461 1C4.3062 1 1 4.3062 1 8.38462C1 12.463 4.3062 15.7692 8.38461 15.7692Z" stroke="#8E8E8E" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6090. <path d="M10.8594 7.06814C10.8594 7.39314 10.7954 7.71496 10.671 8.01523C10.5467 8.31549 10.3644 8.58832 10.1345 8.81814C9.90474 9.04795 9.6319 9.23025 9.33164 9.35462C9.03137 9.47899 8.70955 9.54301 8.38454 9.54301C7.72817 9.54301 7.09868 9.28226 6.63455 8.81814C6.17042 8.35401 5.90967 7.72451 5.90967 7.06814C5.90967 6.41176 6.17042 5.78227 6.63455 5.31814C7.09868 4.85401 7.72817 4.59326 8.38454 4.59326C8.70955 4.59326 9.03137 4.65728 9.33164 4.78165C9.6319 4.90602 9.90474 5.08832 10.1345 5.31814C10.3644 5.54795 10.5467 5.82078 10.671 6.12104C10.7954 6.42131 10.8594 6.74313 10.8594 7.06814Z" stroke="#8E8E8E" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6091. <path d="M3.28564 13.7049C3.28564 12.6424 3.82286 11.6234 4.7791 10.8721C5.73535 10.1208 7.03229 9.69873 8.38462 9.69873C9.73696 9.69873 11.0339 10.1208 11.9901 10.8721C12.9464 11.6234 13.4836 12.6424 13.4836 13.7049" stroke="#8E8E8E" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6092. </g>
  6093. <defs>
  6094. <clipPath id="clip0_69_372">
  6095. <rect width="18" height="18" fill="white"/>
  6096. </clipPath>
  6097. </defs>
  6098. </svg>
  6099. </file>
  6100. <file path="assets/img/ico_id_on.svg">
  6101. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6102. <path d="M17.0192 17L13.7596 13.7677" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6103. <path d="M8.38461 15.7692C12.463 15.7692 15.7692 12.463 15.7692 8.38462C15.7692 4.3062 12.463 1 8.38461 1C4.3062 1 1 4.3062 1 8.38462C1 12.463 4.3062 15.7692 8.38461 15.7692Z" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6104. <path d="M10.8595 7.06801C10.8595 7.39302 10.7955 7.71484 10.6711 8.01511C10.5467 8.31537 10.3644 8.5882 10.1346 8.81801C9.9048 9.04783 9.63196 9.23012 9.3317 9.3545C9.03143 9.47887 8.70961 9.54289 8.38461 9.54289C7.72823 9.54289 7.09874 9.28214 6.63461 8.81801C6.17048 8.35389 5.90973 7.72439 5.90973 7.06801C5.90973 6.41164 6.17048 5.78214 6.63461 5.31801C7.09874 4.85389 7.72823 4.59314 8.38461 4.59314C8.70961 4.59314 9.03143 4.65715 9.3317 4.78153C9.63196 4.9059 9.9048 5.0882 10.1346 5.31801C10.3644 5.54783 10.5467 5.82065 10.6711 6.12092C10.7955 6.42119 10.8595 6.74301 10.8595 7.06801Z" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6105. <path d="M3.28564 13.705C3.28564 12.6425 3.82286 11.6235 4.7791 10.8722C5.73535 10.1209 7.03229 9.69885 8.38462 9.69885C9.73696 9.69885 11.0339 10.1209 11.9901 10.8722C12.9464 11.6235 13.4836 12.6425 13.4836 13.705" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6106. </svg>
  6107. </file>
  6108. <file path="assets/img/ico_info.svg">
  6109. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  6110. <g clip-path="url(#clip0_515_78701)">
  6111. <path d="M8 15C11.866 15 15 11.866 15 8C15 4.13401 11.866 1 8 1C4.13401 1 1 4.13401 1 8C1 11.866 4.13401 15 8 15Z" stroke="#438DFF" stroke-linecap="round" stroke-linejoin="round"/>
  6112. <path d="M8 5.33203V7.9987" stroke="#438DFF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6113. <path d="M8 10.668H8.0075" stroke="#438DFF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6114. </g>
  6115. <defs>
  6116. <clipPath id="clip0_515_78701">
  6117. <rect width="16" height="16" fill="white"/>
  6118. </clipPath>
  6119. </defs>
  6120. </svg>
  6121. </file>
  6122. <file path="assets/img/ico_lang_english.svg">
  6123. <svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
  6124. <g clip-path="url(#clip0_571_1499)">
  6125. <path d="M12.9996 16.5444H0.492188C0.725781 17.3671 1.03555 18.1593 1.42148 18.9058H12.9996H24.5777C24.9637 18.1542 25.2734 17.3671 25.507 16.5444H12.9996Z" fill="white"/>
  6126. <path d="M13 18.9111H1.42188C1.85352 19.7592 2.37656 20.5463 2.97578 21.2725H13H23.0191C23.6184 20.5463 24.1414 19.7541 24.5781 18.9111H13Z" fill="#BF0A30"/>
  6127. <path d="M13 23.6387H5.53516C7.65273 25.1266 10.2273 26 13 26C15.7777 26 18.3523 25.1266 20.4648 23.6387H13Z" fill="#BF0A30"/>
  6128. <path d="M12.9996 21.2725H2.98047C3.72188 22.1662 4.58008 22.9635 5.53477 23.6338H12.9996H20.4645C21.4191 22.9635 22.2773 22.1662 23.0187 21.2725H12.9996Z" fill="white"/>
  6129. <path d="M12.9998 14.1831H0.0556641C0.126758 14.9956 0.279102 15.7827 0.492383 16.5444H12.9998H25.5072C25.7256 15.7827 25.8729 14.9905 25.9439 14.1831H12.9998Z" fill="#BF0A30"/>
  6130. <path d="M20.4648 2.36133C18.3523 0.873438 15.7777 0 13 0V2.36133H20.4648Z" fill="#BF0A30"/>
  6131. <path d="M13 9.45557H25.5074C25.2738 8.63291 24.9641 7.84072 24.5781 7.09424H13V9.45557Z" fill="white"/>
  6132. <path d="M13 7.08887H24.5781C24.1414 6.24082 23.6234 5.45371 23.0242 4.72754H13V7.08887Z" fill="#BF0A30"/>
  6133. <path d="M13 4.72754H23.0242C22.2828 3.83379 21.4246 3.03652 20.4699 2.36621H13V4.72754Z" fill="white"/>
  6134. <path d="M13 11.8169H25.9492C25.8781 11.0044 25.7258 10.2173 25.5125 9.45557H13V11.8169Z" fill="#BF0A30"/>
  6135. <path d="M5.53496 2.36133C4.58027 3.03672 3.72207 3.82891 2.98066 4.72773C2.37637 5.45391 1.85332 6.24609 1.42168 7.08906C1.03574 7.84063 0.725977 8.62773 0.492383 9.45039C0.274023 10.2121 0.126758 11.0043 0.0556641 11.8117H12.9998V9.45039V7.08906V4.72773V2.36133V0C10.2271 0 7.64746 0.873438 5.53496 2.36133Z" fill="#002868"/>
  6136. <path d="M25.9492 11.8169H13H0.0558594C0.0203125 12.2079 0 12.5989 0 13.0001C0 13.4013 0.0203125 13.7923 0.0558594 14.1833H13H25.9492C25.9848 13.7974 26 13.4013 26 13.0001C26 12.5989 25.9848 12.2079 25.9492 11.8169Z" fill="white"/>
  6137. <path d="M7.41426 3.31592L8.20137 5.73311H10.7455L8.68887 7.23115L9.4709 9.64834L7.41426 8.15537L5.35254 9.64834L6.14473 7.23115L4.08301 5.73311H6.62715L7.41426 3.31592Z" fill="white"/>
  6138. </g>
  6139. <defs>
  6140. <clipPath id="clip0_571_1499">
  6141. <rect width="26" height="26" fill="white"/>
  6142. </clipPath>
  6143. </defs>
  6144. </svg>
  6145. </file>
  6146. <file path="assets/img/ico_lang_korea.svg">
  6147. <svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
  6148. <g clip-path="url(#clip0_571_1476)">
  6149. <path d="M25.5 13C25.5 19.8892 19.894 25.5 13 25.5C6.11091 25.5 0.5 19.8891 0.5 13C0.5 6.10596 6.11078 0.5 13 0.5C19.8942 0.5 25.5 6.10583 25.5 13Z" fill="white" stroke="#D9D9D9"/>
  6150. <path d="M12.9999 8.51611C11.2074 8.51611 9.65854 9.57236 8.94252 11.0958C8.93237 11.5681 8.97299 13.0052 9.87182 13.5739C10.6792 14.0868 11.7304 14.3052 12.9999 13.0001C14.2695 11.695 15.346 11.9438 15.9148 12.213C16.4835 12.4821 17.2402 13.1372 17.0574 14.9044H17.0624C17.3316 14.3255 17.4839 13.6806 17.4839 13.0001C17.4839 10.522 15.4781 8.51611 12.9999 8.51611Z" fill="#C60C30"/>
  6151. <path d="M17.058 14.9043C17.2459 13.1422 16.4842 12.482 15.9154 12.2129C15.3467 11.9437 14.265 11.6898 13.0006 13C11.7361 14.3102 10.6799 14.0867 9.87246 13.5738C8.97363 13.0051 8.92793 11.568 8.94316 11.0957C8.67402 11.6746 8.5166 12.3195 8.5166 13C8.5166 15.4781 10.5225 17.484 13.0006 17.484C14.7932 17.484 16.342 16.4277 17.058 14.9043Z" fill="#003478"/>
  6152. <path d="M6.14981 14.8801L5.53711 15.2886L8.02438 19.0197L8.63707 18.6113L6.14981 14.8801Z" fill="black"/>
  6153. <path d="M4.29141 16.1189L3.67871 16.5273L6.16598 20.2585L6.77868 19.85L4.29141 16.1189Z" fill="black"/>
  6154. <path d="M5.2211 15.5037L4.6084 15.9121L5.7464 17.6192L6.3591 17.2108L5.2211 15.5037Z" fill="black"/>
  6155. <path d="M5.95703 17.9309L7.09453 19.6371L7.70898 19.2309L6.56641 17.5195L5.95703 17.9309Z" fill="black"/>
  6156. <path d="M22.324 16.5195L21.7096 16.1133L20.5771 17.8246L21.1865 18.2309L22.324 16.5195Z" fill="black"/>
  6157. <path d="M19.2314 19.8505L19.8408 20.2567L20.9783 18.5454L20.3639 18.1392L19.2314 19.8505Z" fill="black"/>
  6158. <path d="M21.3895 15.9048L20.775 15.4985L19.6426 17.2048L20.257 17.6161L21.3895 15.9048Z" fill="black"/>
  6159. <path d="M18.3018 19.2312L18.9111 19.6374L20.0486 17.9312L19.4342 17.5249L18.3018 19.2312Z" fill="black"/>
  6160. <path d="M17.3672 18.6166L17.9816 19.0229L19.1141 17.3166L18.4996 16.9053L17.3672 18.6166Z" fill="black"/>
  6161. <path d="M19.8482 14.8788L18.7139 16.5884L19.3274 16.9955L20.4618 15.2859L19.8482 14.8788Z" fill="black"/>
  6162. <path d="M21.3893 10.0852L20.7748 10.4965L18.3018 6.75391L18.9162 6.34766L21.3893 10.0852Z" fill="black"/>
  6163. <path d="M21.7096 9.87734L22.324 9.47109L21.1916 7.75977L20.5771 8.16602L21.7096 9.87734Z" fill="black"/>
  6164. <path d="M19.851 5.7334L19.2314 6.13457L20.3639 7.85098L20.9783 7.44473L19.851 5.7334Z" fill="black"/>
  6165. <path d="M19.3289 8.99108L18.7148 9.39746L19.8471 11.1083L20.4611 10.7019L19.3289 8.99108Z" fill="black"/>
  6166. <path d="M17.9865 6.9624L17.3721 7.36865L18.5045 9.07998L19.1139 8.67373L17.9865 6.9624Z" fill="black"/>
  6167. <path d="M6.14961 11.1113L5.53516 10.7L8.02852 6.97266L8.63789 7.38398L6.14961 11.1113Z" fill="black"/>
  6168. <path d="M5.2209 10.4866L4.60645 10.0753L7.0998 6.35303L7.71426 6.75928L5.2209 10.4866Z" fill="black"/>
  6169. <path d="M4.29121 9.86699L3.67676 9.45566L6.17012 5.7334L6.78457 6.13965L4.29121 9.86699Z" fill="black"/>
  6170. </g>
  6171. <defs>
  6172. <clipPath id="clip0_571_1476">
  6173. <rect width="26" height="26" fill="white"/>
  6174. </clipPath>
  6175. </defs>
  6176. </svg>
  6177. </file>
  6178. <file path="assets/img/ico_lang_korea2.svg">
  6179. <svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
  6180. <g clip-path="url(#clip0_798_31381)">
  6181. <path d="M3.84741 6.89844C5.46568 4.47103 7.98196 2.7859 10.8427 2.21375C13.7034 1.64161 16.6743 2.22931 19.1017 3.84759C21.5291 5.46586 23.2142 7.98213 23.7864 10.8429C24.3585 13.7036 23.7708 16.6744 22.1525 19.1018L3.84741 6.89844Z" fill="#CD2E3A"/>
  6182. <path d="M3.84743 6.89823C2.22916 9.32564 1.64145 12.2965 2.2136 15.1572C2.78574 18.0179 4.47087 20.5342 6.89828 22.1525C9.32569 23.7708 12.2965 24.3585 15.1573 23.7863C18.018 23.2142 20.5343 21.529 22.1525 19.1016C22.9617 17.8879 23.2555 16.4025 22.9695 14.9721C22.6834 13.5418 21.8408 12.2836 20.6271 11.4745C19.4134 10.6654 17.928 10.3715 16.4976 10.6576C15.0673 10.9437 13.8091 11.7862 13 12.9999L3.84743 6.89823Z" fill="#0047A0"/>
  6183. <path d="M13 13C14.685 10.4726 14.002 7.05785 11.4746 5.37291C8.9472 3.68797 5.53242 4.37092 3.84748 6.89833C2.16254 9.42574 2.8455 12.8405 5.37291 14.5255C7.90032 16.2104 11.3151 15.5274 13 13Z" fill="#CD2E3A"/>
  6184. </g>
  6185. <defs>
  6186. <clipPath id="clip0_798_31381">
  6187. <rect width="22" height="22" fill="white" transform="translate(2 2)"/>
  6188. </clipPath>
  6189. </defs>
  6190. </svg>
  6191. </file>
  6192. <file path="assets/img/ico_link.svg">
  6193. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6194. <path d="M17.7791 2.21967C18.072 2.51256 18.072 2.98744 17.7791 3.28033L16.3335 4.72592C17.4075 6.29705 17.2471 8.4587 15.8524 9.85344L15.5524 10.1534L15.5499 10.1559L15.2413 10.4646C14.8312 10.8746 14.1664 10.8746 13.7564 10.4646L9.53409 6.24233C9.12405 5.83229 9.12405 5.16749 9.53409 4.75745L10.1453 4.14634C10.3196 3.97199 10.5059 3.81693 10.7016 3.68116C12.0712 2.73076 13.8982 2.72545 15.2729 3.66524L16.7185 2.21967C17.0114 1.92678 17.4862 1.92678 17.7791 2.21967Z" fill="#E1473D"/>
  6195. <path d="M8.78033 8.46967C9.07322 8.76256 9.07322 9.23744 8.78033 9.53033L7.50884 10.8018L9.19818 12.4912L10.4697 11.2197C10.7626 10.9268 11.2374 10.9268 11.5303 11.2197C11.8232 11.5126 11.8232 11.9874 11.5303 12.2803L10.2536 13.557C10.7333 14.1423 10.6999 15.0073 10.1536 15.5537L9.85357 15.8537C8.45879 17.2484 6.29705 17.4088 4.72591 16.3348L3.28033 17.7803C2.98744 18.0732 2.51256 18.0732 2.21967 17.7803C1.92678 17.4874 1.92678 17.0126 2.21967 16.7197L3.66527 15.2741C2.59133 13.7029 2.75172 11.5413 4.14646 10.1466L4.44646 9.84655C4.99275 9.30026 5.85772 9.26686 6.44297 9.74637L7.71967 8.46967C8.01256 8.17678 8.48744 8.17678 8.78033 8.46967Z" fill="#E1473D"/>
  6196. </svg>
  6197. </file>
  6198. <file path="assets/img/ico_list_white.svg">
  6199. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6200. <g clip-path="url(#clip0_461_89217)">
  6201. <path d="M17.5 5.625H6.875C6.70924 5.625 6.55027 5.55915 6.43306 5.44194C6.31585 5.32473 6.25 5.16576 6.25 5C6.25 4.83424 6.31585 4.67527 6.43306 4.55806C6.55027 4.44085 6.70924 4.375 6.875 4.375H17.5C17.6658 4.375 17.8247 4.44085 17.9419 4.55806C18.0592 4.67527 18.125 4.83424 18.125 5C18.125 5.16576 18.0592 5.32473 17.9419 5.44194C17.8247 5.55915 17.6658 5.625 17.5 5.625Z" fill="white"/>
  6202. <path d="M4.375 5.625H2.5C2.33424 5.625 2.17527 5.55915 2.05806 5.44194C1.94085 5.32473 1.875 5.16576 1.875 5C1.875 4.83424 1.94085 4.67527 2.05806 4.55806C2.17527 4.44085 2.33424 4.375 2.5 4.375H4.375C4.54076 4.375 4.69973 4.44085 4.81694 4.55806C4.93415 4.67527 5 4.83424 5 5C5 5.16576 4.93415 5.32473 4.81694 5.44194C4.69973 5.55915 4.54076 5.625 4.375 5.625Z" fill="white"/>
  6203. <path d="M13.125 10.625H2.5C2.33424 10.625 2.17527 10.5592 2.05806 10.4419C1.94085 10.3247 1.875 10.1658 1.875 10C1.875 9.83424 1.94085 9.67527 2.05806 9.55806C2.17527 9.44085 2.33424 9.375 2.5 9.375H13.125C13.2908 9.375 13.4497 9.44085 13.5669 9.55806C13.6842 9.67527 13.75 9.83424 13.75 10C13.75 10.1658 13.6842 10.3247 13.5669 10.4419C13.4497 10.5592 13.2908 10.625 13.125 10.625Z" fill="white"/>
  6204. <path d="M6.875 15.625H2.5C2.33424 15.625 2.17527 15.5592 2.05806 15.4419C1.94085 15.3247 1.875 15.1658 1.875 15C1.875 14.8342 1.94085 14.6753 2.05806 14.5581C2.17527 14.4408 2.33424 14.375 2.5 14.375H6.875C7.04076 14.375 7.19973 14.4408 7.31694 14.5581C7.43415 14.6753 7.5 14.8342 7.5 15C7.5 15.1658 7.43415 15.3247 7.31694 15.4419C7.19973 15.5592 7.04076 15.625 6.875 15.625Z" fill="white"/>
  6205. <path d="M5.625 6.875C5.25416 6.875 4.89165 6.76503 4.58331 6.55901C4.27496 6.35298 4.03464 6.06014 3.89273 5.71753C3.75081 5.37492 3.71368 4.99792 3.78603 4.63421C3.85838 4.27049 4.03695 3.9364 4.29918 3.67418C4.5614 3.41195 4.89549 3.23338 5.25921 3.16103C5.62292 3.08868 5.99992 3.12581 6.34253 3.26773C6.68514 3.40964 6.97798 3.64996 7.18401 3.95831C7.39003 4.26665 7.5 4.62916 7.5 5C7.5 5.49728 7.30246 5.9742 6.95083 6.32583C6.5992 6.67746 6.12228 6.875 5.625 6.875ZM5.625 4.375C5.50139 4.375 5.38055 4.41166 5.27777 4.48033C5.17499 4.54901 5.09488 4.64662 5.04758 4.76082C5.00027 4.87503 4.98789 5.00069 5.01201 5.12193C5.03613 5.24317 5.09565 5.35453 5.18306 5.44194C5.27047 5.52935 5.38183 5.58888 5.50307 5.61299C5.62431 5.63711 5.74997 5.62473 5.86418 5.57743C5.97838 5.53012 6.07599 5.45001 6.14467 5.34723C6.21335 5.24445 6.25 5.12361 6.25 5C6.25 4.83424 6.18415 4.67527 6.06694 4.55806C5.94973 4.44085 5.79076 4.375 5.625 4.375Z" fill="white"/>
  6206. <path d="M14.375 11.875C14.0042 11.875 13.6416 11.765 13.3333 11.559C13.025 11.353 12.7846 11.0601 12.6427 10.7175C12.5008 10.3749 12.4637 9.99792 12.536 9.63421C12.6084 9.27049 12.787 8.9364 13.0492 8.67418C13.3114 8.41195 13.6455 8.23338 14.0092 8.16103C14.3729 8.08868 14.7499 8.12581 15.0925 8.26773C15.4351 8.40964 15.728 8.64996 15.934 8.95831C16.14 9.26665 16.25 9.62916 16.25 10C16.25 10.4973 16.0525 10.9742 15.7008 11.3258C15.3492 11.6775 14.8723 11.875 14.375 11.875ZM14.375 9.375C14.2514 9.375 14.1306 9.41166 14.0278 9.48033C13.925 9.54901 13.8449 9.64662 13.7976 9.76082C13.7503 9.87503 13.7379 10.0007 13.762 10.1219C13.7861 10.2432 13.8457 10.3545 13.9331 10.4419C14.0205 10.5294 14.1318 10.5889 14.2531 10.613C14.3743 10.6371 14.5 10.6247 14.6142 10.5774C14.7284 10.5301 14.826 10.45 14.8947 10.3472C14.9633 10.2445 15 10.1236 15 10C15 9.83424 14.9342 9.67527 14.8169 9.55806C14.6997 9.44085 14.5408 9.375 14.375 9.375Z" fill="white"/>
  6207. <path d="M8.125 16.875C7.75416 16.875 7.39165 16.765 7.08331 16.559C6.77496 16.353 6.53464 16.0601 6.39273 15.7175C6.25081 15.3749 6.21368 14.9979 6.28603 14.6342C6.35838 14.2705 6.53695 13.9364 6.79918 13.6742C7.0614 13.412 7.39549 13.2334 7.75921 13.161C8.12292 13.0887 8.49992 13.1258 8.84253 13.2677C9.18514 13.4096 9.47798 13.65 9.68401 13.9583C9.89003 14.2666 10 14.6292 10 15C10 15.4973 9.80246 15.9742 9.45083 16.3258C9.0992 16.6775 8.62228 16.875 8.125 16.875ZM8.125 14.375C8.00139 14.375 7.88055 14.4117 7.77777 14.4803C7.67499 14.549 7.59488 14.6466 7.54758 14.7608C7.50027 14.875 7.48789 15.0007 7.51201 15.1219C7.53613 15.2432 7.59565 15.3545 7.68306 15.4419C7.77047 15.5294 7.88183 15.5889 8.00307 15.613C8.12431 15.6371 8.24997 15.6247 8.36418 15.5774C8.47838 15.5301 8.57599 15.45 8.64467 15.3472C8.71335 15.2445 8.75 15.1236 8.75 15C8.75 14.8342 8.68415 14.6753 8.56694 14.5581C8.44973 14.4408 8.29076 14.375 8.125 14.375Z" fill="white"/>
  6208. <path d="M17.5 10.625H15.625C15.4592 10.625 15.3003 10.5592 15.1831 10.4419C15.0658 10.3247 15 10.1658 15 10C15 9.83424 15.0658 9.67527 15.1831 9.55806C15.3003 9.44085 15.4592 9.375 15.625 9.375H17.5C17.6658 9.375 17.8247 9.44085 17.9419 9.55806C18.0592 9.67527 18.125 9.83424 18.125 10C18.125 10.1658 18.0592 10.3247 17.9419 10.4419C17.8247 10.5592 17.6658 10.625 17.5 10.625Z" fill="white"/>
  6209. <path d="M17.5 15.625H9.375C9.20924 15.625 9.05027 15.5592 8.93306 15.4419C8.81585 15.3247 8.75 15.1658 8.75 15C8.75 14.8342 8.81585 14.6753 8.93306 14.5581C9.05027 14.4408 9.20924 14.375 9.375 14.375H17.5C17.6658 14.375 17.8247 14.4408 17.9419 14.5581C18.0592 14.6753 18.125 14.8342 18.125 15C18.125 15.1658 18.0592 15.3247 17.9419 15.4419C17.8247 15.5592 17.6658 15.625 17.5 15.625Z" fill="white"/>
  6210. </g>
  6211. <defs>
  6212. <clipPath id="clip0_461_89217">
  6213. <rect width="20" height="20" fill="white"/>
  6214. </clipPath>
  6215. </defs>
  6216. </svg>
  6217. </file>
  6218. <file path="assets/img/ico_list.svg">
  6219. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6220. <g clip-path="url(#clip0_461_80474)">
  6221. <path d="M17.5 5.625H6.875C6.70924 5.625 6.55027 5.55915 6.43306 5.44194C6.31585 5.32473 6.25 5.16576 6.25 5C6.25 4.83424 6.31585 4.67527 6.43306 4.55806C6.55027 4.44085 6.70924 4.375 6.875 4.375H17.5C17.6658 4.375 17.8247 4.44085 17.9419 4.55806C18.0592 4.67527 18.125 4.83424 18.125 5C18.125 5.16576 18.0592 5.32473 17.9419 5.44194C17.8247 5.55915 17.6658 5.625 17.5 5.625Z" fill="#7B7B7B"/>
  6222. <path d="M4.375 5.625H2.5C2.33424 5.625 2.17527 5.55915 2.05806 5.44194C1.94085 5.32473 1.875 5.16576 1.875 5C1.875 4.83424 1.94085 4.67527 2.05806 4.55806C2.17527 4.44085 2.33424 4.375 2.5 4.375H4.375C4.54076 4.375 4.69973 4.44085 4.81694 4.55806C4.93415 4.67527 5 4.83424 5 5C5 5.16576 4.93415 5.32473 4.81694 5.44194C4.69973 5.55915 4.54076 5.625 4.375 5.625Z" fill="#7B7B7B"/>
  6223. <path d="M13.125 10.625H2.5C2.33424 10.625 2.17527 10.5592 2.05806 10.4419C1.94085 10.3247 1.875 10.1658 1.875 10C1.875 9.83424 1.94085 9.67527 2.05806 9.55806C2.17527 9.44085 2.33424 9.375 2.5 9.375H13.125C13.2908 9.375 13.4497 9.44085 13.5669 9.55806C13.6842 9.67527 13.75 9.83424 13.75 10C13.75 10.1658 13.6842 10.3247 13.5669 10.4419C13.4497 10.5592 13.2908 10.625 13.125 10.625Z" fill="#7B7B7B"/>
  6224. <path d="M6.875 15.625H2.5C2.33424 15.625 2.17527 15.5592 2.05806 15.4419C1.94085 15.3247 1.875 15.1658 1.875 15C1.875 14.8342 1.94085 14.6753 2.05806 14.5581C2.17527 14.4408 2.33424 14.375 2.5 14.375H6.875C7.04076 14.375 7.19973 14.4408 7.31694 14.5581C7.43415 14.6753 7.5 14.8342 7.5 15C7.5 15.1658 7.43415 15.3247 7.31694 15.4419C7.19973 15.5592 7.04076 15.625 6.875 15.625Z" fill="#7B7B7B"/>
  6225. <path d="M5.625 6.875C5.25416 6.875 4.89165 6.76503 4.58331 6.55901C4.27496 6.35298 4.03464 6.06014 3.89273 5.71753C3.75081 5.37492 3.71368 4.99792 3.78603 4.63421C3.85838 4.27049 4.03695 3.9364 4.29918 3.67418C4.5614 3.41195 4.89549 3.23338 5.25921 3.16103C5.62292 3.08868 5.99992 3.12581 6.34253 3.26773C6.68514 3.40964 6.97798 3.64996 7.18401 3.95831C7.39003 4.26665 7.5 4.62916 7.5 5C7.5 5.49728 7.30246 5.9742 6.95083 6.32583C6.5992 6.67746 6.12228 6.875 5.625 6.875ZM5.625 4.375C5.50139 4.375 5.38055 4.41166 5.27777 4.48033C5.17499 4.54901 5.09488 4.64662 5.04758 4.76082C5.00027 4.87503 4.98789 5.00069 5.01201 5.12193C5.03613 5.24317 5.09565 5.35453 5.18306 5.44194C5.27047 5.52935 5.38183 5.58888 5.50307 5.61299C5.62431 5.63711 5.74997 5.62473 5.86418 5.57743C5.97838 5.53012 6.07599 5.45001 6.14467 5.34723C6.21335 5.24445 6.25 5.12361 6.25 5C6.25 4.83424 6.18415 4.67527 6.06694 4.55806C5.94973 4.44085 5.79076 4.375 5.625 4.375Z" fill="#7B7B7B"/>
  6226. <path d="M14.375 11.875C14.0042 11.875 13.6416 11.765 13.3333 11.559C13.025 11.353 12.7846 11.0601 12.6427 10.7175C12.5008 10.3749 12.4637 9.99792 12.536 9.63421C12.6084 9.27049 12.787 8.9364 13.0492 8.67418C13.3114 8.41195 13.6455 8.23338 14.0092 8.16103C14.3729 8.08868 14.7499 8.12581 15.0925 8.26773C15.4351 8.40964 15.728 8.64996 15.934 8.95831C16.14 9.26665 16.25 9.62916 16.25 10C16.25 10.4973 16.0525 10.9742 15.7008 11.3258C15.3492 11.6775 14.8723 11.875 14.375 11.875ZM14.375 9.375C14.2514 9.375 14.1306 9.41166 14.0278 9.48033C13.925 9.54901 13.8449 9.64662 13.7976 9.76082C13.7503 9.87503 13.7379 10.0007 13.762 10.1219C13.7861 10.2432 13.8457 10.3545 13.9331 10.4419C14.0205 10.5294 14.1318 10.5889 14.2531 10.613C14.3743 10.6371 14.5 10.6247 14.6142 10.5774C14.7284 10.5301 14.826 10.45 14.8947 10.3472C14.9633 10.2445 15 10.1236 15 10C15 9.83424 14.9342 9.67527 14.8169 9.55806C14.6997 9.44085 14.5408 9.375 14.375 9.375Z" fill="#7B7B7B"/>
  6227. <path d="M8.125 16.875C7.75416 16.875 7.39165 16.765 7.08331 16.559C6.77496 16.353 6.53464 16.0601 6.39273 15.7175C6.25081 15.3749 6.21368 14.9979 6.28603 14.6342C6.35838 14.2705 6.53695 13.9364 6.79918 13.6742C7.0614 13.412 7.39549 13.2334 7.75921 13.161C8.12292 13.0887 8.49992 13.1258 8.84253 13.2677C9.18514 13.4096 9.47798 13.65 9.68401 13.9583C9.89003 14.2666 10 14.6292 10 15C10 15.4973 9.80246 15.9742 9.45083 16.3258C9.0992 16.6775 8.62228 16.875 8.125 16.875ZM8.125 14.375C8.00139 14.375 7.88055 14.4117 7.77777 14.4803C7.67499 14.549 7.59488 14.6466 7.54758 14.7608C7.50027 14.875 7.48789 15.0007 7.51201 15.1219C7.53613 15.2432 7.59565 15.3545 7.68306 15.4419C7.77047 15.5294 7.88183 15.5889 8.00307 15.613C8.12431 15.6371 8.24997 15.6247 8.36418 15.5774C8.47838 15.5301 8.57599 15.45 8.64467 15.3472C8.71335 15.2445 8.75 15.1236 8.75 15C8.75 14.8342 8.68415 14.6753 8.56694 14.5581C8.44973 14.4408 8.29076 14.375 8.125 14.375Z" fill="#7B7B7B"/>
  6228. <path d="M17.5 10.625H15.625C15.4592 10.625 15.3003 10.5592 15.1831 10.4419C15.0658 10.3247 15 10.1658 15 10C15 9.83424 15.0658 9.67527 15.1831 9.55806C15.3003 9.44085 15.4592 9.375 15.625 9.375H17.5C17.6658 9.375 17.8247 9.44085 17.9419 9.55806C18.0592 9.67527 18.125 9.83424 18.125 10C18.125 10.1658 18.0592 10.3247 17.9419 10.4419C17.8247 10.5592 17.6658 10.625 17.5 10.625Z" fill="#7B7B7B"/>
  6229. <path d="M17.5 15.625H9.375C9.20924 15.625 9.05027 15.5592 8.93306 15.4419C8.81585 15.3247 8.75 15.1658 8.75 15C8.75 14.8342 8.81585 14.6753 8.93306 14.5581C9.05027 14.4408 9.20924 14.375 9.375 14.375H17.5C17.6658 14.375 17.8247 14.4408 17.9419 14.5581C18.0592 14.6753 18.125 14.8342 18.125 15C18.125 15.1658 18.0592 15.3247 17.9419 15.4419C17.8247 15.5592 17.6658 15.625 17.5 15.625Z" fill="#7B7B7B"/>
  6230. </g>
  6231. <defs>
  6232. <clipPath id="clip0_461_80474">
  6233. <rect width="20" height="20" fill="white"/>
  6234. </clipPath>
  6235. </defs>
  6236. </svg>
  6237. </file>
  6238. <file path="assets/img/ico_location_arr.svg">
  6239. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6240. <path d="M5.25 10.5L8.75 7L5.25 3.5" stroke="#B4B4B4" stroke-linecap="round" stroke-linejoin="round"/>
  6241. </svg>
  6242. </file>
  6243. <file path="assets/img/ico_location_home.svg">
  6244. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6245. <g clip-path="url(#clip0_506_7922)">
  6246. <path d="M13.5158 5.98492L7.39081 0.443258C7.28362 0.346518 7.14437 0.292969 6.99998 0.292969C6.85559 0.292969 6.71633 0.346518 6.60915 0.443258L0.484146 5.98492C0.426692 6.03625 0.379911 6.09839 0.346472 6.16779C0.313033 6.2372 0.293592 6.31251 0.289259 6.38943C0.284926 6.46634 0.295785 6.54336 0.321216 6.61608C0.346648 6.6888 0.386154 6.7558 0.437479 6.81326C0.488804 6.87071 0.550943 6.91749 0.620347 6.95093C0.689752 6.98437 0.765063 7.00381 0.841981 7.00814C0.918899 7.01248 0.995917 7.00162 1.06864 6.97619C1.14136 6.95076 1.20836 6.91125 1.26581 6.85992L6.99998 1.66242L12.7341 6.84826C12.7916 6.89958 12.8586 6.93909 12.9313 6.96452C13.004 6.98995 13.0811 7.00081 13.158 6.99648C13.2349 6.99214 13.3102 6.9727 13.3796 6.93926C13.449 6.90583 13.5112 6.85904 13.5625 6.80159C13.6138 6.74414 13.6533 6.67714 13.6787 6.60442C13.7042 6.5317 13.715 6.45468 13.7107 6.37776C13.7064 6.30084 13.6869 6.22553 13.6535 6.15613C13.62 6.08672 13.5733 6.02458 13.5158 5.97326V5.98492Z" fill="#555555"/>
  6247. <path d="M12.2501 7.58301C12.0954 7.58301 11.947 7.64447 11.8376 7.75386C11.7282 7.86326 11.6667 8.01163 11.6667 8.16634V12.5413H2.33341V8.16634C2.33341 8.01163 2.27196 7.86326 2.16256 7.75386C2.05316 7.64447 1.90479 7.58301 1.75008 7.58301C1.59537 7.58301 1.447 7.64447 1.3376 7.75386C1.22821 7.86326 1.16675 8.01163 1.16675 8.16634V13.1247C1.16675 13.2794 1.22821 13.4278 1.3376 13.5372C1.447 13.6465 1.59537 13.708 1.75008 13.708H12.2501C12.4048 13.708 12.5532 13.6465 12.6626 13.5372C12.772 13.4278 12.8334 13.2794 12.8334 13.1247V8.16634C12.8334 8.01163 12.772 7.86326 12.6626 7.75386C12.5532 7.64447 12.4048 7.58301 12.2501 7.58301Z" fill="#555555"/>
  6248. </g>
  6249. <defs>
  6250. <clipPath id="clip0_506_7922">
  6251. <rect width="14" height="14" fill="white"/>
  6252. </clipPath>
  6253. </defs>
  6254. </svg>
  6255. </file>
  6256. <file path="assets/img/ico_logo.svg">
  6257. <svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
  6258. <g id="logo" clip-path="url(#clip0_62_58584)">
  6259. <path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M18.1338 24.4028C18.9454 24.389 19.7197 24.0677 20.2936 23.5068C20.8676 22.9458 21.1963 22.1889 21.2104 21.3957C21.2104 20.282 20.3197 19.3297 19.1593 18.8897C18.9578 16.1301 16.6468 14.202 13.519 14.3789C11.2418 14.5092 9.14257 15.4861 8.39142 17.3861C6.30652 17.542 4.62519 19.0571 4.8021 20.8944C4.96721 22.6195 6.42703 24.3993 8.39142 24.4028H18.1338ZM15.3355 22.8701C14.0934 22.8701 13.1106 22.0862 13.1106 20.5668C13.1106 19.0714 14.1175 18.2151 15.3174 18.2151C15.9746 18.2151 16.445 18.4925 16.7525 18.8001L16.1857 19.4874C15.9626 19.2885 15.7275 19.1377 15.3536 19.1377C14.6903 19.1377 14.214 19.6563 14.214 20.5305C14.214 21.423 14.6119 21.9415 15.4501 21.9415C15.6068 21.9415 15.7757 21.8993 15.8722 21.8269V21.1034H15.1607V20.2231H16.8309V22.3214C16.5173 22.6229 15.9626 22.8701 15.3355 22.8701ZM9.27347 22.2494C9.62926 22.5991 10.1237 22.8704 10.8413 22.8704C11.7035 22.8704 12.4632 22.3036 12.4632 21.3329C12.4632 20.4043 11.8241 19.9762 11.0643 19.9762C10.8955 19.9762 10.7629 20.0003 10.6 20.0666L10.6663 19.3069H12.2642V18.4084H9.74382L9.62926 20.6334L10.0995 20.9409C10.3649 20.7721 10.4855 20.7178 10.7327 20.7178C11.1186 20.7178 11.3899 20.9469 11.3899 21.363C11.3899 21.7851 11.1186 22.0021 10.6845 22.0021C10.3287 22.0021 10.0152 21.8152 9.76194 21.574L9.27347 22.2494Z" fill="#364FC7"/>
  6260. <path id="Vector_2" opacity="0.75" fill-rule="evenodd" clip-rule="evenodd" d="M14.6083 7.35309C14.1205 6.84758 13.436 6.53317 12.678 6.53317C11.8612 6.53317 11.1297 6.89822 10.6377 7.47407L8.87307 5.78968C9.8102 4.74957 11.1677 4.09567 12.678 4.09567C14.1711 4.09567 15.5148 4.73479 16.4508 5.75436L14.6083 7.35309ZM17.7036 4.66723C16.4633 3.29776 14.6711 2.4375 12.6779 2.4375C10.6959 2.4375 8.91264 3.28816 7.67316 4.6443L5.90967 2.96096C7.59325 1.1401 10.0024 0 12.6779 0C15.4061 0 17.8574 1.18547 19.5448 3.0694L17.7036 4.66723Z" fill="#364FC7"/>
  6261. <path id="Vector_3" opacity="0.45" fill-rule="evenodd" clip-rule="evenodd" d="M23.5625 25.3157V21.8945C23.5625 16.061 18.8335 11.332 13 11.332C7.16649 11.332 2.4375 16.061 2.4375 21.8945V25.3157H0V21.8945C0 14.7148 5.82029 8.89453 13 8.89453C20.1797 8.89453 26 14.7148 26 21.8945V25.3157H23.5625Z" fill="#364FC7"/>
  6262. </g>
  6263. <defs>
  6264. <clipPath id="clip0_62_58584">
  6265. <rect width="26" height="26" fill="white"/>
  6266. </clipPath>
  6267. </defs>
  6268. </svg>
  6269. </file>
  6270. <file path="assets/img/ico_map.svg">
  6271. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6272. <g id="ico / &#236;&#167;&#128;&#235;&#143;&#132;" clip-path="url(#clip0_119_29728)">
  6273. <g id="Group 231">
  6274. <path id="Vector" d="M7.00011 12.5C6.88511 12.5 6.76961 12.4605 6.67611 12.381C6.55511 12.278 3.70512 9.83097 2.51612 7.16198C2.40362 6.90998 2.51712 6.61398 2.76962 6.50198C3.02112 6.38998 3.31712 6.50298 3.42962 6.75548C4.29911 8.70797 6.21811 10.605 6.99161 11.3205C8.3566 9.99547 11.0001 7.03448 11.0001 5.11498C11.0001 2.84599 9.2056 0.999997 7.00011 0.999997C4.79461 0.999997 3.00012 2.84599 3.00012 5.11498C3.00012 5.39098 2.77612 5.61498 2.50012 5.61498C2.22412 5.61498 2.00012 5.39098 2.00012 5.11498C2.00012 2.29449 4.24311 0 7.00011 0C9.7571 0 12.0001 2.29449 12.0001 5.11498C12.0001 8.07097 7.5281 12.1945 7.3376 12.369C7.24211 12.456 7.12111 12.5 7.00011 12.5Z" fill="white"/>
  6275. <path id="Vector_2" d="M6.99999 6.99999C5.897 6.99999 5 6.10299 5 4.99999C5 3.897 5.897 3 6.99999 3C8.10299 3 8.99999 3.897 8.99999 4.99999C8.99999 6.10299 8.10299 6.99999 6.99999 6.99999ZM6.99999 4C6.4485 4 6 4.4485 6 4.99999C6 5.55149 6.4485 5.99999 6.99999 5.99999C7.55149 5.99999 7.99999 5.55149 7.99999 4.99999C7.99999 4.4485 7.55149 4 6.99999 4Z" fill="white"/>
  6276. <path id="Vector_3" d="M13.5 14.0003H0.5C0.322001 14.0003 0.157002 13.9058 0.0675019 13.7514C-0.0219978 13.5969 -0.0224978 13.4074 0.0660019 13.2524L2.066 9.75236C2.20299 9.51286 2.50849 9.42886 2.74799 9.56636C2.98749 9.70336 3.07099 10.0089 2.93399 10.2484L1.3615 13.0004H12.638L11.0655 10.2484C10.9285 10.0089 11.012 9.70336 11.2515 9.56636C11.491 9.42836 11.7965 9.51286 11.9335 9.75236L13.9335 13.2524C14.022 13.4074 14.0215 13.5969 13.932 13.7514C13.843 13.9058 13.678 14.0003 13.5 14.0003Z" fill="white"/>
  6277. </g>
  6278. </g>
  6279. <defs>
  6280. <clipPath id="clip0_119_29728">
  6281. <rect width="14" height="14" fill="white"/>
  6282. </clipPath>
  6283. </defs>
  6284. </svg>
  6285. </file>
  6286. <file path="assets/img/ico_menu_arr.svg">
  6287. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  6288. <path d="M4 9L7 6L4 3" stroke="#515A64" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6289. </svg>
  6290. </file>
  6291. <file path="assets/img/ico_menu_arr2.svg">
  6292. <svg width="15" height="16" viewBox="0 0 15 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  6293. <path d="M5.625 11.75L9.375 8L5.625 4.25" stroke="#C2C2C2" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6294. </svg>
  6295. </file>
  6296. <file path="assets/img/ico_menu_minus.svg">
  6297. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6298. <rect x="0.5" y="0.5" width="17" height="17" rx="4.5" fill="white"/>
  6299. <rect x="0.5" y="0.5" width="17" height="17" rx="4.5" stroke="#BBC4CC"/>
  6300. <path d="M5.5 9H12.5" stroke="#8D9EAC" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6301. </svg>
  6302. </file>
  6303. <file path="assets/img/ico_menu_nodata.svg">
  6304. <svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
  6305. <path d="M0 8.05958C0 5.58135 -1.34108e-07 4.34225 0.399017 3.36272C0.947594 2.01609 2.01609 0.947594 3.36272 0.399017C4.34225 -1.34108e-07 5.58135 0 8.05958 0C10.5378 0 11.7769 -1.34108e-07 12.7564 0.399017C14.1031 0.947594 15.1716 2.01609 15.7202 3.36272C16.1191 4.34225 16.1191 5.58135 16.1191 8.05958C16.1191 10.5378 16.1191 11.7769 15.7202 12.7564C15.1716 14.1031 14.1031 15.1716 12.7564 15.7202C11.7769 16.1191 10.5378 16.1191 8.05958 16.1191C5.58135 16.1191 4.34225 16.1191 3.36272 15.7202C2.01609 15.1716 0.947594 14.1031 0.399017 12.7564C-1.34108e-07 11.7769 0 10.5378 0 8.05958Z" fill="#D5DBE1"/>
  6306. <path d="M0 27.9385C0 25.4603 -1.34108e-07 24.2212 0.399017 23.2416C0.947594 21.8951 2.01609 20.8264 3.36272 20.278C4.34225 19.8789 5.58135 19.8789 8.05958 19.8789C10.5378 19.8789 11.7769 19.8789 12.7564 20.278C14.1031 20.8264 15.1716 21.8951 15.7202 23.2416C16.1191 24.2212 16.1191 25.4603 16.1191 27.9385C16.1191 30.4166 16.1191 31.6557 15.7202 32.6353C15.1716 33.982 14.1031 35.0505 12.7564 35.5989C11.7769 35.998 10.5378 35.998 8.05958 35.998C5.58135 35.998 4.34225 35.998 3.36272 35.5989C2.01609 35.0505 0.947594 33.982 0.399017 32.6353C-1.34108e-07 31.6557 0 30.4166 0 27.9385Z" fill="#D5DBE1"/>
  6307. <path d="M19.8804 27.9385C19.8804 25.4603 19.8804 24.2212 20.2795 23.2416C20.8281 21.8951 21.8966 20.8264 23.2431 20.278C24.2227 19.8789 25.4618 19.8789 27.94 19.8789C30.4184 19.8789 31.6575 19.8789 32.6368 20.278C33.9836 20.8264 35.052 21.8951 35.6006 23.2416C35.9997 24.2212 35.9997 25.4603 35.9997 27.9385C35.9997 30.4166 35.9997 31.6557 35.6006 32.6353C35.052 33.982 33.9836 35.0505 32.6368 35.5989C31.6575 35.998 30.4184 35.998 27.94 35.998C25.4618 35.998 24.2227 35.998 23.2431 35.5989C21.8966 35.0505 20.8281 33.982 20.2795 32.6353C19.8804 31.6557 19.8804 30.4166 19.8804 27.9385Z" fill="#D5DBE1"/>
  6308. <path fill-rule="evenodd" clip-rule="evenodd" d="M26.59 13.4603C26.59 14.2059 27.1943 14.8104 27.94 14.8104C28.6856 14.8104 29.29 14.2059 29.29 13.4603V9.41041H33.3399C34.0855 9.41041 34.6899 8.806 34.6899 8.06043C34.6899 7.31487 34.0855 6.71046 33.3399 6.71046H29.29V2.66052C29.29 1.91496 28.6856 1.31055 27.94 1.31055C27.1943 1.31055 26.59 1.91496 26.59 2.66052V6.71046H22.5401C21.7944 6.71046 21.1901 7.31487 21.1901 8.06043C21.1901 8.806 21.7944 9.41041 22.5401 9.41041H26.59V13.4603Z" fill="#D5DBE1"/>
  6309. </svg>
  6310. </file>
  6311. <file path="assets/img/ico_menu_plus.svg">
  6312. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6313. <rect x="0.5" y="0.5" width="17" height="17" rx="4.5" fill="#5E81A5"/>
  6314. <rect x="0.5" y="0.5" width="17" height="17" rx="4.5" stroke="#3E6994"/>
  6315. <path d="M9 5.5V12.5" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6316. <path d="M5.5 9H12.5" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6317. </svg>
  6318. </file>
  6319. <file path="assets/img/ico_menu.svg">
  6320. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6321. <path d="M1.66666 5.39737C1.66666 4.25002 1.66666 3.67635 1.85139 3.22286C2.10536 2.59941 2.60005 2.10472 3.2235 1.85075C3.67699 1.66602 4.25066 1.66602 5.39801 1.66602C6.54535 1.66602 7.11902 1.66602 7.57251 1.85075C8.19597 2.10472 8.69066 2.59941 8.94466 3.22286C9.12932 3.67635 9.12932 4.25002 9.12932 5.39737C9.12932 6.54471 9.12932 7.11838 8.94466 7.57187C8.69066 8.19532 8.19597 8.69002 7.57251 8.94402C7.11902 9.12868 6.54535 9.12868 5.39801 9.12868C4.25066 9.12868 3.67699 9.12868 3.2235 8.94402C2.60005 8.69002 2.10536 8.19532 1.85139 7.57187C1.66666 7.11838 1.66666 6.54471 1.66666 5.39737Z" fill="#8398AF"/>
  6322. <path d="M1.66666 14.6024C1.66666 13.4551 1.66666 12.8814 1.85139 12.4279C2.10536 11.8045 2.60005 11.3098 3.2235 11.0558C3.67699 10.8711 4.25066 10.8711 5.39801 10.8711C6.54535 10.8711 7.11902 10.8711 7.57251 11.0558C8.19597 11.3098 8.69066 11.8045 8.94466 12.4279C9.12932 12.8814 9.12932 13.4551 9.12932 14.6024C9.12932 15.7498 9.12932 16.3234 8.94466 16.7769C8.69066 17.4004 8.19597 17.8951 7.57251 18.149C7.11902 18.3338 6.54535 18.3338 5.39801 18.3338C4.25066 18.3338 3.67699 18.3338 3.2235 18.149C2.60005 17.8951 2.10536 17.4004 1.85139 16.7769C1.66666 16.3234 1.66666 15.7498 1.66666 14.6024Z" fill="#8398AF"/>
  6323. <path d="M10.8708 14.6024C10.8708 13.4551 10.8708 12.8814 11.0555 12.4279C11.3095 11.8045 11.8042 11.3098 12.4276 11.0558C12.8811 10.8711 13.4548 10.8711 14.6021 10.8711C15.7495 10.8711 16.3232 10.8711 16.7766 11.0558C17.4001 11.3098 17.8948 11.8045 18.1488 12.4279C18.3335 12.8814 18.3335 13.4551 18.3335 14.6024C18.3335 15.7498 18.3335 16.3234 18.1488 16.7769C17.8948 17.4004 17.4001 17.8951 16.7766 18.149C16.3232 18.3338 15.7495 18.3338 14.6021 18.3338C13.4548 18.3338 12.8811 18.3338 12.4276 18.149C11.8042 17.8951 11.3095 17.4004 11.0555 16.7769C10.8708 16.3234 10.8708 15.7498 10.8708 14.6024Z" fill="#8398AF"/>
  6324. <path fill-rule="evenodd" clip-rule="evenodd" d="M13.9771 7.89844C13.9771 8.24361 14.2568 8.52347 14.6021 8.52347C14.9472 8.52347 15.2271 8.24361 15.2271 7.89844V6.02344H17.1021C17.4472 6.02344 17.7271 5.74361 17.7271 5.39844C17.7271 5.05326 17.4472 4.77344 17.1021 4.77344H15.2271V2.89844C15.2271 2.55326 14.9472 2.27344 14.6021 2.27344C14.2568 2.27344 13.9771 2.55326 13.9771 2.89844V4.77344H12.1021C11.7568 4.77344 11.4771 5.05326 11.4771 5.39844C11.4771 5.74361 11.7568 6.02344 12.1021 6.02344H13.9771V7.89844Z" fill="#8398AF"/>
  6325. </svg>
  6326. </file>
  6327. <file path="assets/img/ico_minus.svg">
  6328. <svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
  6329. <path d="M2.91666 7.5H11.0833" stroke="#333333" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6330. </svg>
  6331. </file>
  6332. <file path="assets/img/ico_mod_disabled.svg">
  6333. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6334. <g clip-path="url(#clip0_1_24829)">
  6335. <path d="M6.75 15.1875H3.375C3.22582 15.1875 3.08275 15.1282 2.97726 15.0227C2.87177 14.9173 2.8125 14.7742 2.8125 14.625V11.482C2.81225 11.409 2.8264 11.3366 2.85415 11.269C2.8819 11.2015 2.9227 11.1401 2.97422 11.0883L11.4117 2.65078C11.4641 2.59763 11.5265 2.55543 11.5953 2.52662C11.6641 2.49781 11.7379 2.48297 11.8125 2.48297C11.8871 2.48297 11.9609 2.49781 12.0298 2.52662C12.0986 2.55543 12.1609 2.59763 12.2133 2.65078L15.3492 5.78672C15.4024 5.83906 15.4446 5.90145 15.4734 5.97025C15.5022 6.03906 15.517 6.11291 15.517 6.1875C15.517 6.26209 15.5022 6.33594 15.4734 6.40475C15.4446 6.47355 15.4024 6.53594 15.3492 6.58828L6.75 15.1875Z" stroke="#8E8E8E" stroke-linecap="round" stroke-linejoin="round"/>
  6336. <path d="M9.5625 4.5L13.5 8.4375" stroke="#8E8E8E" stroke-linecap="round" stroke-linejoin="round"/>
  6337. <path d="M15.1875 15.1875H6.75" stroke="#8E8E8E" stroke-linecap="round" stroke-linejoin="round"/>
  6338. </g>
  6339. <defs>
  6340. <clipPath id="clip0_1_24829">
  6341. <rect width="18" height="18" fill="white"/>
  6342. </clipPath>
  6343. </defs>
  6344. </svg>
  6345. </file>
  6346. <file path="assets/img/ico_mod.svg">
  6347. <svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
  6348. <rect y="0.5" width="16" height="16" rx="8" fill="#96A7BA"/>
  6349. <g clip-path="url(#clip0_636_6541)">
  6350. <path d="M4.7265 9.1485C4.377 9.498 4 11.3515 4 11.5C4 11.7605 4.203 12 4.5 12C4.6485 12 6.502 11.623 6.8515 11.2735L9.7125 8.4125L7.5875 6.2875L4.7265 9.1485ZM9.5 5C9.199 5 8.7755 5.0995 8.4295 5.4455L8.2875 5.5875L10.4125 7.7125L10.5545 7.5705C10.873 7.252 11 6.8475 11 6.5C11 5.6715 10.328 5 9.5 5Z" fill="white"/>
  6351. </g>
  6352. <defs>
  6353. <clipPath id="clip0_636_6541">
  6354. <rect width="7" height="7" fill="white" transform="translate(4 5)"/>
  6355. </clipPath>
  6356. </defs>
  6357. </svg>
  6358. </file>
  6359. <file path="assets/img/ico_mod2.svg">
  6360. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6361. <g clip-path="url(#clip0_101_14048)">
  6362. <path d="M6.75 15.1879H3.375C3.22582 15.1879 3.08275 15.1287 2.97726 15.0232C2.87177 14.9177 2.8125 14.7746 2.8125 14.6254V11.4825C2.81225 11.4094 2.8264 11.337 2.85415 11.2695C2.8819 11.2019 2.9227 11.1405 2.97422 11.0887L11.4117 2.65121C11.4641 2.59806 11.5265 2.55585 11.5953 2.52704C11.6641 2.49823 11.7379 2.4834 11.8125 2.4834C11.8871 2.4834 11.9609 2.49823 12.0298 2.52704C12.0986 2.55585 12.1609 2.59806 12.2133 2.65121L15.3492 5.78715C15.4024 5.83949 15.4446 5.90187 15.4734 5.97068C15.5022 6.03948 15.517 6.11333 15.517 6.18793C15.517 6.26252 15.5022 6.33637 15.4734 6.40517C15.4446 6.47398 15.4024 6.53637 15.3492 6.58871L6.75 15.1879Z" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
  6363. <path d="M9.5625 4.5L13.5 8.4375" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
  6364. <path d="M15.1875 15.1875H6.75" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
  6365. </g>
  6366. <defs>
  6367. <clipPath id="clip0_101_14048">
  6368. <rect width="18" height="18" fill="white"/>
  6369. </clipPath>
  6370. </defs>
  6371. </svg>
  6372. </file>
  6373. <file path="assets/img/ico_mode_dark.svg">
  6374. <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
  6375. <path d="M27.9999 17.0533C27.7901 19.3229 26.9383 21.4859 25.5442 23.2891C24.15 25.0922 22.2712 26.4611 20.1275 27.2354C17.9838 28.0097 15.6638 28.1575 13.4392 27.6615C11.2146 27.1654 9.17719 26.0461 7.5655 24.4344C5.95381 22.8227 4.83445 20.7853 4.33841 18.5607C3.84237 16.336 3.99016 14.0161 4.76448 11.8724C5.53881 9.72868 6.90764 7.84982 8.71082 6.45567C10.514 5.06152 12.6769 4.20974 14.9465 4C13.6178 5.79769 12.9783 8.0126 13.1446 10.2419C13.3108 12.4712 14.2717 14.5667 15.8524 16.1475C17.4331 17.7282 19.5287 18.689 21.758 18.8553C23.9873 19.0215 26.2022 18.3821 27.9999 17.0533Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  6376. </svg>
  6377. </file>
  6378. <file path="assets/img/ico_mode_white.svg">
  6379. <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
  6380. <circle cx="16.5" cy="15.5" r="7.5" stroke="white" stroke-width="2"/>
  6381. <path d="M16.5 2L16.5 4" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6382. <path d="M16.5 27L16.5 29" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6383. <path d="M30 15.5L28 15.5" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6384. <path d="M5 15.5L3 15.5" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6385. <path d="M26.046 5.9541L24.6317 7.36831" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6386. <path d="M8.36829 23.6318L6.95407 25.046" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6387. <path d="M6.9541 5.9541L8.36832 7.36831" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6388. <path d="M24.6318 23.6318L26.046 25.046" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6389. </svg>
  6390. </file>
  6391. <file path="assets/img/ico_mode_white2.svg">
  6392. <svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
  6393. <circle cx="12.9999" cy="12.9994" r="5.2963" stroke="white" stroke-width="2"/>
  6394. <path d="M13 3L13 4.48148" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6395. <path d="M13 21.5186L13 23" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6396. <path d="M23 13L21.5185 13" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6397. <path d="M4.48145 13L2.99996 13" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6398. <path d="M20.071 5.92871L19.0235 6.97628" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6399. <path d="M6.97656 19.0234L5.929 20.071" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6400. <path d="M5.92896 5.92871L6.97652 6.97628" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6401. <path d="M19.0234 19.0234L20.071 20.071" stroke="white" stroke-width="2" stroke-linecap="round"/>
  6402. </svg>
  6403. </file>
  6404. <file path="assets/img/ico_ne_add.svg">
  6405. <svg width="9" height="9" viewBox="0 0 9 9" fill="none" xmlns="http://www.w3.org/2000/svg">
  6406. <path d="M7.33711 3.9375H5.0625V1.66289C5.0625 1.36582 4.81113 1.125 4.5 1.125C4.18887 1.125 3.9375 1.36582 3.9375 1.66289V3.9375H1.66289C1.36582 3.9375 1.125 4.18887 1.125 4.5C1.125 4.81113 1.36582 5.0625 1.66289 5.0625H3.9375V7.33711C3.9375 7.63418 4.18887 7.875 4.5 7.875C4.81113 7.875 5.0625 7.63418 5.0625 7.33711V5.0625H7.33711C7.63418 5.0625 7.875 4.81113 7.875 4.5C7.875 4.18887 7.63418 3.9375 7.33711 3.9375Z" fill="white"/>
  6407. </svg>
  6408. </file>
  6409. <file path="assets/img/ico_ne_del_d.svg">
  6410. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  6411. <g id="ico / &#236;&#130;&#173;&#236;&#160;&#156;" clip-path="url(#clip0_51_4160)">
  6412. <g id="Group">
  6413. <path id="Vector" d="M10.9269 2.16875C10.8519 1.8875 10.8019 1.73125 10.8019 1.73125C10.7207 1.44062 10.5144 1.44062 10.2082 1.39062L8.54882 1.18125C8.34257 1.14687 8.34257 1.14687 8.26132 0.968749C7.98944 0.356249 7.90507 0 7.60819 0H4.38945C4.09257 0 4.01132 0.356249 3.73945 0.971874C3.6582 1.14687 3.6582 1.14687 3.45195 1.18437L1.78945 1.39375C1.48633 1.44375 1.26758 1.47187 1.18633 1.7625C1.18633 1.7625 1.14883 1.89062 1.0707 2.16875C0.970701 2.54062 0.930076 2.5 1.27383 2.5H10.7238C11.0676 2.50312 11.0301 2.54062 10.9269 2.16875Z" fill="#637086"/>
  6414. <path id="Vector_2" d="M9.85506 3.5H2.14257C1.62383 3.5 1.59883 3.56875 1.63008 3.95937L2.21445 11.5406C2.26445 11.925 2.30195 12.0031 2.76132 12.0031H9.23631C9.69569 12.0031 9.73319 11.925 9.78319 11.5406L10.3676 3.95937C10.3988 3.56562 10.3738 3.5 9.85506 3.5Z" fill="#637086"/>
  6415. </g>
  6416. </g>
  6417. <defs>
  6418. <clipPath id="clip0_51_4160">
  6419. <rect width="12" height="12" fill="white"/>
  6420. </clipPath>
  6421. </defs>
  6422. </svg>
  6423. </file>
  6424. <file path="assets/img/ico_ne_del.svg">
  6425. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  6426. <g clip-path="url(#clip0_636_6330)">
  6427. <path d="M10.9269 2.16875C10.8519 1.8875 10.8019 1.73125 10.8019 1.73125C10.7207 1.44062 10.5144 1.44062 10.2082 1.39062L8.54882 1.18125C8.34257 1.14687 8.34257 1.14687 8.26132 0.968749C7.98944 0.356249 7.90507 0 7.60819 0H4.38945C4.09257 0 4.01132 0.356249 3.73945 0.971874C3.6582 1.14687 3.6582 1.14687 3.45195 1.18437L1.78945 1.39375C1.48633 1.44375 1.26758 1.47187 1.18633 1.7625C1.18633 1.7625 1.14883 1.89062 1.0707 2.16875C0.970701 2.54062 0.930076 2.5 1.27383 2.5H10.7238C11.0676 2.50312 11.0301 2.54062 10.9269 2.16875Z" fill="#FF2426"/>
  6428. <path d="M9.85512 3.5H2.14263C1.62388 3.5 1.59888 3.56875 1.63013 3.95937L2.2145 11.5406C2.2645 11.925 2.302 12.0031 2.76138 12.0031H9.23637C9.69574 12.0031 9.73324 11.925 9.78324 11.5406L10.3676 3.95937C10.3989 3.56562 10.3739 3.5 9.85512 3.5Z" fill="#FF2426"/>
  6429. </g>
  6430. <defs>
  6431. <clipPath id="clip0_636_6330">
  6432. <rect width="12" height="12" fill="white"/>
  6433. </clipPath>
  6434. </defs>
  6435. </svg>
  6436. </file>
  6437. <file path="assets/img/ico_no_data_nw.svg">
  6438. <svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6439. <path d="M6.33334 11.6667H10.5" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
  6440. <path d="M6.33334 4.96655L3.20834 1.84155" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
  6441. <path d="M6.29996 1.875L3.17496 5" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
  6442. <path d="M6.33334 8.33325H13" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
  6443. <path d="M8.83334 1.66675H13.8333C16.6083 1.81675 18 2.84175 18 6.65841V13.3334" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
  6444. <path d="M3 7.5083V13.3166C3 16.6583 3.83333 18.3333 8 18.3333H10.5C10.6417 18.3333 12.8667 18.3333 13 18.3333" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
  6445. <path d="M18 13.3333L13 18.3333V15.8333C13 14.1666 13.8333 13.3333 15.5 13.3333H18Z" stroke="#292D32" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6446. </svg>
  6447. </file>
  6448. <file path="assets/img/ico_no_data.svg">
  6449. <svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
  6450. <g clip-path="url(#clip0_636_6325)">
  6451. <path d="M25.2 0H10.8C4.8438 0 0 4.8438 0 10.8V34.2C0 34.6774 0.189642 35.1352 0.527208 35.4728C0.864773 35.8104 1.32261 36 1.8 36H25.2C31.1562 36 36 31.1562 36 25.2V10.8C36 4.8438 31.1562 0 25.2 0ZM26.4708 23.9274L23.9256 26.4726L18 20.547L12.0744 26.4726L9.5292 23.9274L15.4548 18.0018L9.5292 12.0762L12.0744 9.531L18 15.4566L23.9256 9.531L26.4708 12.0762L20.5452 18.0018L26.4708 23.9274Z" fill="#D5DBE1"/>
  6452. </g>
  6453. <defs>
  6454. <clipPath id="clip0_636_6325">
  6455. <rect width="36" height="36" fill="white"/>
  6456. </clipPath>
  6457. </defs>
  6458. </svg>
  6459. </file>
  6460. <file path="assets/img/ico_no_data2.svg">
  6461. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6462. <path d="M8 1H2C1.73478 1 1.48043 1.10536 1.29289 1.29289C1.10536 1.48043 1 1.73478 1 2V8C1 8.26522 1.10536 8.51957 1.29289 8.70711C1.48043 8.89464 1.73478 9 2 9H8C8.26522 9 8.51957 8.89464 8.70711 8.70711C8.89464 8.51957 9 8.26522 9 8V2C9 1.73478 8.89464 1.48043 8.70711 1.29289C8.51957 1.10536 8.26522 1 8 1ZM7 7H3V3H7V7ZM18 11H12C11.7348 11 11.4804 11.1054 11.2929 11.2929C11.1054 11.4804 11 11.7348 11 12V18C11 18.2652 11.1054 18.5196 11.2929 18.7071C11.4804 18.8946 11.7348 19 12 19H18C18.2652 19 18.5196 18.8946 18.7071 18.7071C18.8946 18.5196 19 18.2652 19 18V12C19 11.7348 18.8946 11.4804 18.7071 11.2929C18.5196 11.1054 18.2652 11 18 11ZM17 17H13V13H17V17ZM15 1C12.794 1 11 2.794 11 5C11 7.206 12.794 9 15 9C17.206 9 19 7.206 19 5C19 2.794 17.206 1 15 1ZM15 7C13.897 7 13 6.103 13 5C13 3.897 13.897 3 15 3C16.103 3 17 3.897 17 5C17 6.103 16.103 7 15 7ZM5 11C2.794 11 1 12.794 1 15C1 17.206 2.794 19 5 19C7.206 19 9 17.206 9 15C9 12.794 7.206 11 5 11ZM5 17C3.897 17 3 16.103 3 15C3 13.897 3.897 13 5 13C6.103 13 7 13.897 7 15C7 16.103 6.103 17 5 17Z" fill="#292D32"/>
  6463. </svg>
  6464. </file>
  6465. <file path="assets/img/ico_no_table_dt.svg">
  6466. <svg width="82" height="82" viewBox="0 0 82 82" fill="none" xmlns="http://www.w3.org/2000/svg">
  6467. <circle cx="41" cy="41" r="29" fill="white"/>
  6468. <path d="M52.6663 42.1667V44.5001C52.6663 50.3334 50.333 52.6667 44.4997 52.6667H37.4997C31.6663 52.6667 29.333 50.3334 29.333 44.5001V42.7267" stroke="#438DFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  6469. <path d="M39.833 29.3333H37.4997C31.6663 29.3333 29.333 31.6666 29.333 37.4999" stroke="#438DFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  6470. <path d="M50.2515 37.5117L51.4765 36.2867C53.0632 34.7001 53.8099 32.8567 51.4765 30.5234C49.1432 28.1901 47.2999 28.9367 45.7132 30.5234L36.5199 39.7167C36.1699 40.0667 35.8199 40.7551 35.7499 41.2567L35.2482 44.7684C35.0615 46.04 35.9599 46.9267 37.2315 46.7517L40.7432 46.2501C41.2332 46.1801 41.9215 45.8301 42.2832 45.4801L45.9932 41.7701L46.8449 40.9184" stroke="#438DFF" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
  6471. <path d="M44.3955 31.8416C45.1772 34.6299 47.3588 36.8116 50.1588 37.6049" stroke="#438DFF" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
  6472. </svg>
  6473. </file>
  6474. <file path="assets/img/ico_not_excel.svg">
  6475. <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
  6476. <g clip-path="url(#clip0_636_7099)">
  6477. <path d="M20 39.0937C30.5452 39.0937 39.0937 30.5452 39.0937 20C39.0937 9.45481 30.5452 0.90625 20 0.90625C9.45481 0.90625 0.90625 9.45481 0.90625 20C0.90625 30.5452 9.45481 39.0937 20 39.0937Z" fill="#C8CED3"/>
  6478. <path d="M18.2969 38.0469C17.7812 38 17.4062 37.5391 17.4531 37.0234C17.5 36.5078 17.9609 36.125 18.4766 36.1797C18.9922 36.2266 19.3672 36.6875 19.3203 37.2031C19.2734 37.6875 18.8672 38.0547 18.3906 38.0547C18.3594 38.0469 18.3281 38.0469 18.2969 38.0469ZM20.7187 37.1953C20.6719 36.6797 21.0469 36.2188 21.5625 36.1719C22.0781 36.125 22.5391 36.5 22.5859 37.0156C22.6328 37.5312 22.2578 37.9922 21.7422 38.0391C21.7109 38.0391 21.6797 38.0469 21.6484 38.0469C21.1719 38.0469 20.7656 37.6797 20.7187 37.1953ZM14.9141 37.3984C14.4141 37.25 14.1328 36.7344 14.2734 36.2344C14.4219 35.7344 14.9375 35.4531 15.4375 35.5938C15.9375 35.7422 16.2187 36.2578 16.0781 36.7578C15.9609 37.1641 15.5859 37.4297 15.1797 37.4297C15.0859 37.4375 15 37.4297 14.9141 37.3984ZM23.9609 36.7578C23.8125 36.2578 24.1015 35.7422 24.5937 35.5938C25.0937 35.4453 25.6094 35.7344 25.7578 36.2266C25.9062 36.7266 25.6172 37.2422 25.125 37.3906C25.0391 37.4141 24.9453 37.4297 24.8594 37.4297C24.4531 37.4297 24.0781 37.1641 23.9609 36.7578ZM11.7109 36.125C11.25 35.8906 11.0703 35.3203 11.3047 34.8594C11.5391 34.3984 12.1094 34.2188 12.5703 34.4531C13.0312 34.6875 13.2109 35.2578 12.9766 35.7188C12.8125 36.0391 12.4844 36.2266 12.1406 36.2266C12 36.2266 11.8516 36.1953 11.7109 36.125ZM27.0547 35.7031C26.8203 35.2422 27 34.6797 27.4531 34.4375C27.9141 34.2031 28.4766 34.3828 28.7187 34.8359C28.9531 35.2969 28.7734 35.8594 28.3203 36.1016C28.1797 36.1719 28.0391 36.2031 27.8906 36.2031C27.5547 36.2109 27.2265 36.0234 27.0547 35.7031ZM8.81249 34.2656C8.40624 33.9453 8.33593 33.3594 8.65624 32.9531C8.97655 32.5469 9.56249 32.4766 9.96874 32.7969C10.375 33.1172 10.4453 33.7031 10.125 34.1172C9.93749 34.3516 9.66405 34.4766 9.39061 34.4766C9.18749 34.4609 8.98436 34.3984 8.81249 34.2656ZM29.8984 34.0859C29.5781 33.6797 29.6484 33.0859 30.0547 32.7734C30.4609 32.4531 31.0547 32.5234 31.3672 32.9297C31.6875 33.3359 31.6172 33.9297 31.2109 34.25C31.0391 34.3828 30.8359 34.4531 30.6328 34.4531C30.3594 34.4375 30.0859 34.3203 29.8984 34.0859ZM6.3203 31.8906C5.98436 31.5 6.02343 30.9062 6.41405 30.5703C6.80468 30.2266 7.39843 30.2734 7.73436 30.6641C8.0703 31.0547 8.03124 31.6484 7.64061 31.9844C7.46093 32.1406 7.24218 32.2109 7.02343 32.2109C6.76561 32.2109 6.49999 32.1016 6.3203 31.8906ZM32.3828 31.9531C31.9922 31.6172 31.9453 31.0234 32.289 30.6328C32.625 30.2422 33.2187 30.2031 33.6094 30.5391C34 30.875 34.0391 31.4688 33.7031 31.8594C33.5156 32.0703 33.2578 32.1797 32.9922 32.1797C32.7812 32.1797 32.5625 32.1094 32.3828 31.9531ZM4.31249 29.0859C4.05468 28.6406 4.20311 28.0625 4.65624 27.8047C5.10155 27.5469 5.67968 27.6953 5.93749 28.1484C6.1953 28.5937 6.04686 29.1719 5.59374 29.4297C5.4453 29.5156 5.28124 29.5547 5.12499 29.5547C4.80468 29.5547 4.48436 29.3828 4.31249 29.0859ZM34.4219 29.3984C33.9766 29.1406 33.8203 28.5625 34.0781 28.1172C34.3359 27.6719 34.9062 27.5156 35.3594 27.7734C35.8047 28.0312 35.9609 28.6094 35.7031 29.0547C35.5312 29.3516 35.2109 29.5234 34.8906 29.5234C34.7344 29.5234 34.5703 29.4844 34.4219 29.3984ZM2.87499 25.9531C2.70311 25.4609 2.96093 24.9297 3.45311 24.7578C3.9453 24.5859 4.47655 24.8437 4.64843 25.3359C4.8203 25.8281 4.56249 26.3594 4.0703 26.5312C3.96874 26.5625 3.86718 26.5859 3.76561 26.5859C3.37499 26.5859 3.0078 26.3438 2.87499 25.9531ZM35.9453 26.5C35.4531 26.3281 35.1953 25.7969 35.3672 25.3047C35.5391 24.8125 36.0703 24.5547 36.5625 24.7266C37.0547 24.8984 37.3125 25.4297 37.1406 25.9219C37.0078 26.3125 36.6406 26.5547 36.2578 26.5547C36.1484 26.5469 36.0469 26.5313 35.9453 26.5ZM2.06249 22.6094C1.99218 22.0938 2.34374 21.6172 2.85936 21.5469C3.37499 21.4688 3.84374 21.8281 3.92186 22.3438C3.99218 22.8516 3.64061 23.3281 3.12499 23.4062C3.07811 23.4141 3.03905 23.4141 2.99218 23.4141C2.53124 23.4141 2.1328 23.0703 2.06249 22.6094ZM36.8828 23.3672C36.3672 23.2969 36.0156 22.8203 36.0859 22.3047C36.1562 21.7891 36.6328 21.4375 37.1484 21.5078C37.6641 21.5781 38.0156 22.0547 37.9453 22.5703C37.8828 23.0391 37.4766 23.375 37.0156 23.375C36.9766 23.375 36.9297 23.3672 36.8828 23.3672ZM2.78905 20.1484C2.27343 20.125 1.86718 19.6875 1.89061 19.1719C1.91405 18.6562 2.35155 18.25 2.86718 18.2812C3.3828 18.3047 3.78124 18.7422 3.7578 19.2578C3.73436 19.7578 3.3203 20.1562 2.8203 20.1562C2.8203 20.1484 2.80468 20.1484 2.78905 20.1484ZM36.2344 19.2188C36.2109 18.7031 36.6094 18.2656 37.125 18.2344C37.6406 18.2109 38.0781 18.6094 38.1094 19.125C38.1328 19.6406 37.7344 20.0781 37.2187 20.1016C37.2031 20.1016 37.1875 20.1016 37.1719 20.1016C36.6719 20.1094 36.2578 19.7188 36.2344 19.2188ZM3.0703 16.8906C2.56249 16.7734 2.2578 16.2656 2.37499 15.7578C2.49218 15.2578 2.99999 14.9453 3.5078 15.0625C4.01561 15.1797 4.3203 15.6875 4.20311 16.1953C4.10155 16.625 3.71874 16.9141 3.28905 16.9141C3.21093 16.9141 3.14061 16.9062 3.0703 16.8906ZM35.7969 16.1562C35.6719 15.6562 35.9844 15.1484 36.4844 15.0234C36.9844 14.8984 37.4922 15.2109 37.6172 15.7109C37.7422 16.2109 37.4297 16.7188 36.9297 16.8438C36.8594 16.8594 36.7812 16.8672 36.7109 16.8672C36.2812 16.875 35.8984 16.5859 35.7969 16.1562ZM3.96093 13.7422C3.49218 13.5234 3.28124 12.9688 3.49999 12.5C3.71093 12.0312 4.27343 11.8203 4.74218 12.0391C5.21093 12.2578 5.42186 12.8125 5.21093 13.2812C5.05468 13.625 4.71093 13.8281 4.35936 13.8281C4.21874 13.8203 4.08593 13.7969 3.96093 13.7422ZM34.7812 13.2422C34.5625 12.7734 34.7734 12.2188 35.2422 12C35.7109 11.7813 36.2734 11.9922 36.4844 12.4609C36.7031 12.9297 36.4922 13.4844 36.0234 13.7031C35.8984 13.7578 35.7656 13.7891 35.6328 13.7891C35.2812 13.7891 34.9375 13.5859 34.7812 13.2422ZM5.43749 10.8203C5.01561 10.5234 4.91405 9.9375 5.21874 9.51562C5.51561 9.09375 6.10155 8.99219 6.52343 9.29688C6.9453 9.59375 7.04686 10.1797 6.74218 10.6016C6.56249 10.8594 6.27343 11 5.97655 11C5.78905 10.9922 5.60155 10.9375 5.43749 10.8203ZM33.2344 10.5703C32.9297 10.1484 33.0312 9.5625 33.4531 9.26562C33.875 8.96094 34.4609 9.0625 34.7578 9.48438C35.0547 9.90625 34.9609 10.4922 34.5391 10.7891C34.375 10.9062 34.1797 10.9609 33.9922 10.9609C33.7109 10.9609 33.4219 10.8281 33.2344 10.5703ZM7.43749 8.23438C7.07811 7.85938 7.09374 7.26562 7.46874 6.90625C7.84374 6.54688 8.43749 6.5625 8.79686 6.9375C9.15624 7.3125 9.14061 7.90625 8.76561 8.26562C8.58593 8.4375 8.35155 8.52344 8.11718 8.52344C7.86718 8.52344 7.62499 8.42188 7.43749 8.23438ZM31.2109 8.23438C30.8359 7.875 30.8203 7.28125 31.1797 6.90625C31.5391 6.53125 32.1328 6.51562 32.5078 6.875C32.8828 7.23438 32.8984 7.82812 32.5391 8.20312C32.3516 8.39844 32.1094 8.49219 31.8594 8.49219C31.625 8.49219 31.3906 8.40625 31.2109 8.23438ZM9.89061 6.0625C9.60936 5.625 9.73436 5.04688 10.1719 4.76562C10.6094 4.48438 11.1875 4.60938 11.4687 5.04688C11.75 5.48437 11.625 6.0625 11.1875 6.34375C11.0312 6.44531 10.8516 6.49219 10.6797 6.49219C10.375 6.49219 10.0703 6.34375 9.89061 6.0625ZM28.7812 6.32812C28.3437 6.04688 28.2187 5.46875 28.5 5.03125C28.7812 4.59375 29.3594 4.46875 29.7969 4.75C30.2344 5.03125 30.3594 5.60938 30.0781 6.04688C29.8984 6.32812 29.5937 6.47656 29.2891 6.47656C29.1172 6.47656 28.9375 6.42969 28.7812 6.32812ZM12.7109 4.39844C12.5156 3.92188 12.75 3.375 13.2266 3.17969C13.7031 2.98438 14.25 3.21875 14.4453 3.69531C14.6406 4.17188 14.4062 4.71875 13.9297 4.91406C13.8125 4.96094 13.6953 4.98438 13.5781 4.98438C13.2109 4.99219 12.8594 4.76562 12.7109 4.39844ZM26.039 4.90625C25.5547 4.71094 25.3281 4.17188 25.5156 3.6875C25.7109 3.20313 26.2578 2.97656 26.7344 3.16406C27.2109 3.35938 27.4453 3.90625 27.2578 4.38281C27.1094 4.75 26.7578 4.96875 26.3906 4.96875C26.2734 4.97656 26.1562 4.95312 26.039 4.90625ZM15.7891 3.30469C15.6875 2.79687 16.0234 2.30469 16.5312 2.20313C17.0391 2.10156 17.5312 2.4375 17.6328 2.94531C17.7344 3.45312 17.3984 3.94531 16.8906 4.04688C16.8281 4.05469 16.7734 4.0625 16.7109 4.0625C16.2734 4.0625 15.875 3.75 15.7891 3.30469ZM23.0781 4.03906C22.5703 3.9375 22.2344 3.45312 22.3359 2.94531C22.4297 2.4375 22.9219 2.10156 23.4297 2.20313C23.9375 2.29688 24.2734 2.78906 24.1719 3.29688C24.0859 3.75 23.6953 4.0625 23.25 4.05469C23.1953 4.05469 23.1328 4.05469 23.0781 4.03906ZM19.0234 2.8125C19.0234 2.29688 19.4453 1.875 19.9609 1.875C19.9687 1.875 19.9766 1.875 19.9844 1.875C19.9922 1.875 19.9922 1.875 20 1.875C20.5156 1.875 20.9375 2.29688 20.9375 2.8125C20.9375 3.32812 20.5156 3.75 20 3.75C19.9922 3.75 19.9844 3.75 19.9844 3.75C19.9766 3.75 19.9766 3.75 19.9687 3.75C19.4453 3.75 19.0234 3.32812 19.0234 2.8125Z" fill="white"/>
  6479. <path d="M16.1797 11.75L10.6562 15.3516L14.4531 18.4141L20.0391 14.9766L16.1797 11.75Z" fill="white"/>
  6480. <path d="M29.375 15.3594L23.8672 11.7734L20.0391 14.9766L25.5859 18.4063L29.375 15.3594Z" fill="white"/>
  6481. <path d="M20.0391 21.8438L23.8672 25.0547L29.375 21.4609L25.5859 18.4062L20.0391 21.8438Z" fill="white"/>
  6482. <path d="M10.6562 21.4766L16.1797 25.0547L20.0391 21.8438L14.4531 18.4141L10.6562 21.4766Z" fill="white"/>
  6483. <path d="M20.0391 22.5312L16.1875 25.7578L14.5391 24.6875V25.8906L20.0391 29.1953L25.5547 25.875V24.6875L23.8984 25.7578L20.0391 22.5312Z" fill="white"/>
  6484. </g>
  6485. <defs>
  6486. <clipPath id="clip0_636_7099">
  6487. <rect width="40" height="40" fill="white"/>
  6488. </clipPath>
  6489. </defs>
  6490. </svg>
  6491. </file>
  6492. <file path="assets/img/ico_otp_step1.svg">
  6493. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6494. <g clip-path="url(#clip0_173_550)">
  6495. <path d="M16 7H15V5C15 2.24 12.76 0 10 0C7.24 0 5 2.24 5 5V7H4C2.895 7 2 7.895 2 9V19C2 20.105 2.895 21 4 21H16C17.105 21 18 20.105 18 19V9C18 7.895 17.105 7 16 7ZM10 16C8.895 16 8 15.105 8 14C8 12.895 8.895 12 10 12C11.105 12 12 12.895 12 14C12 15.105 11.105 16 10 16ZM13.1 7H6.9V5C6.9 3.29 8.29 1.9 10 1.9C11.71 1.9 13.1 3.29 13.1 5V7Z" fill="#7C8B9C"/>
  6496. </g>
  6497. <defs>
  6498. <clipPath id="clip0_173_550">
  6499. <rect width="20" height="20" fill="white"/>
  6500. </clipPath>
  6501. </defs>
  6502. </svg>
  6503. </file>
  6504. <file path="assets/img/ico_otp_step2.svg">
  6505. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6506. <path d="M17.8545 5.78312V5.76945C17.8466 5.59211 17.8412 5.405 17.838 5.19641C17.8283 4.70398 17.6332 4.23336 17.2916 3.87852C16.95 3.52368 16.4872 3.31079 15.9955 3.28236C13.8701 3.16517 12.2287 2.47298 10.8244 1.10696L10.8127 1.09525C10.594 0.893359 10.3073 0.78125 10.0097 0.78125C9.71211 0.78125 9.42543 0.893359 9.2068 1.09525L9.19469 1.10696C7.79234 2.47415 6.14781 3.164 4.02594 3.28236C3.53399 3.31016 3.07076 3.52286 2.72905 3.87783C2.38735 4.23277 2.19241 4.70379 2.18334 5.19641C2.18022 5.40344 2.17475 5.5925 2.16694 5.76945V5.80227C2.12553 7.9632 2.07437 10.6546 2.97554 13.0964C3.47125 14.439 4.22164 15.6066 5.20641 16.5659C6.32789 17.6597 7.79664 18.5261 9.57008 19.1441C9.62902 19.1645 9.68933 19.1808 9.75055 19.1929C9.98383 19.2393 10.2253 19.2223 10.4498 19.1437C12.2232 18.5249 13.692 17.657 14.8107 16.5655C15.7947 15.6054 16.5455 14.4378 17.0412 13.0948C17.9455 10.6445 17.8943 7.94875 17.8545 5.78312ZM14.1548 8.00734C14.1322 8.23531 14.0311 8.44832 13.8689 8.61008L13.4033 9.07531L9.2482 13.2226C9.18723 13.2831 9.11883 13.3356 9.04469 13.3788C8.85527 13.4889 8.63476 13.5334 8.4175 13.5051C8.20027 13.4768 7.99844 13.3775 7.84351 13.2226L6.07633 11.4581C5.98164 11.3665 5.90613 11.257 5.85426 11.1358C5.80234 11.0147 5.77508 10.8845 5.77402 10.7527C5.77297 10.621 5.7982 10.4903 5.84816 10.3684C5.89812 10.2465 5.97187 10.1357 6.06512 10.0426C6.15832 9.94949 6.26914 9.87586 6.39113 9.82605C6.51309 9.77621 6.64379 9.75113 6.77555 9.75234C6.9073 9.75352 7.0375 9.78094 7.15855 9.83297C7.27961 9.885 7.3891 9.96062 7.48062 10.0554L8.015 10.5882C8.15574 10.7288 8.34652 10.8077 8.54547 10.8077C8.74437 10.8077 8.93515 10.7288 9.07594 10.5882L12.3181 7.3507L12.4627 7.205C12.6074 7.06023 12.7934 6.96379 12.9952 6.92879C13.1969 6.89383 13.4045 6.92207 13.5895 7.00969C13.7746 7.09727 13.928 7.23992 14.0289 7.41809C14.1297 7.59629 14.173 7.80129 14.1529 8.005L14.1548 8.00734Z" fill="#7C8B9C"/>
  6507. </svg>
  6508. </file>
  6509. <file path="assets/img/ico_otp_step3.svg">
  6510. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6511. <g clip-path="url(#clip0_173_566)">
  6512. <path d="M18.9988 3.6H10.4V1.396C10.4002 1.21262 10.3642 1.03101 10.2941 0.861556C10.224 0.692104 10.1211 0.53814 9.99146 0.408475C9.86179 0.27881 9.70782 0.17599 9.53836 0.105899C9.3689 0.0358076 9.18729 -0.000178225 9.00391 6.63688e-07H1.3959C1.21253 -0.000157769 1.03094 0.0358434 0.861501 0.105944C0.692064 0.176045 0.538114 0.278869 0.40846 0.408533C0.278806 0.538196 0.175993 0.692154 0.105905 0.861595C0.0358166 1.03104 -0.000171248 1.21264 6.12643e-07 1.396V18.604C0.000328914 18.9741 0.147499 19.329 0.409206 19.5907C0.670914 19.8524 1.02577 19.9996 1.3959 20H9.0039C9.37405 19.9997 9.72896 19.8525 9.99071 19.5908C10.2525 19.3291 10.3997 18.9742 10.4 18.604V11.6H18.999C19.2645 11.6 19.5191 11.4945 19.7068 11.3068C19.8945 11.1191 20 10.8645 20 10.599V4.60115C20 4.46968 19.9741 4.33949 19.9238 4.21803C19.8735 4.09656 19.7997 3.98619 19.7068 3.89323C19.6138 3.80026 19.5034 3.72652 19.382 3.67621C19.2605 3.62589 19.1303 3.6 18.9988 3.6ZM4.2 0.848001H6.2C6.33261 0.848001 6.45979 0.900679 6.55355 0.994447C6.64732 1.08822 6.7 1.21539 6.7 1.348C6.7 1.48061 6.64732 1.60779 6.55355 1.70155C6.45979 1.79532 6.33261 1.848 6.2 1.848H4.2C4.06739 1.848 3.94022 1.79532 3.84645 1.70155C3.75268 1.60779 3.7 1.48061 3.7 1.348C3.7 1.21539 3.75268 1.08822 3.84645 0.994447C3.94022 0.900679 4.06739 0.848001 4.2 0.848001ZM6.19981 19.1487H4.19981C4.0672 19.1487 3.94002 19.096 3.84625 19.0022C3.75248 18.9085 3.69981 18.7813 3.69981 18.6487C3.69981 18.5161 3.75248 18.3889 3.84625 18.2951C3.94002 18.2013 4.0672 18.1487 4.19981 18.1487H6.19981C6.33241 18.1487 6.45959 18.2013 6.55336 18.2951C6.64713 18.3889 6.69981 18.5161 6.69981 18.6487C6.69981 18.7813 6.64713 18.9085 6.55336 19.0022C6.45959 19.096 6.33241 19.1487 6.19981 19.1487ZM9.51992 17.3H0.879885V2.7H9.51992V3.6H4.19177C3.92874 3.6 3.67648 3.70449 3.49048 3.89048C3.30449 4.07648 3.2 4.32874 3.2 4.59177V10.6073C3.2 10.7377 3.22568 10.8667 3.27556 10.9872C3.32545 11.1076 3.39857 11.2171 3.49076 11.3092C3.58294 11.4014 3.69237 11.4745 3.81281 11.5244C3.93325 11.5743 4.06234 11.6 4.19271 11.6H6V13.2066C6 13.3044 6.02899 13.4 6.08331 13.4812C6.13763 13.5625 6.21483 13.6259 6.30516 13.6633C6.39548 13.7007 6.49487 13.7105 6.59076 13.6914C6.68665 13.6724 6.77473 13.6253 6.84386 13.5561L8.8 11.6H9.51992V17.3ZM8.43592 7.964C8.55067 8.03063 8.63442 8.13994 8.66889 8.26808C8.70336 8.39622 8.68575 8.53279 8.61992 8.648C8.5874 8.70531 8.54382 8.75558 8.49171 8.79591C8.4396 8.83624 8.38 8.86583 8.31637 8.88294C8.25274 8.90006 8.18635 8.90437 8.12104 8.89563C8.05573 8.88688 7.99281 8.86525 7.93592 8.832L7.3 8.464V9.2C7.3 9.33261 7.24732 9.45979 7.15355 9.55355C7.05979 9.64732 6.93261 9.7 6.8 9.7C6.66739 9.7 6.54022 9.64732 6.44645 9.55355C6.35268 9.45979 6.3 9.33261 6.3 9.2V8.464L5.66387 8.832C5.60698 8.86525 5.54406 8.88688 5.47875 8.89563C5.41344 8.90437 5.34705 8.90006 5.28342 8.88294C5.21979 8.86583 5.16019 8.83624 5.10808 8.79591C5.05597 8.75558 5.01239 8.70531 4.97987 8.648C4.91413 8.53277 4.89658 8.39623 4.93104 8.26812C4.9655 8.14001 5.04919 8.0307 5.16387 7.964L5.8 7.6L5.16387 7.232C5.04877 7.1657 4.96472 7.05639 4.93022 6.92811C4.89571 6.79984 4.91358 6.66312 4.97988 6.54802C5.04619 6.43292 5.1555 6.34887 5.28377 6.31437C5.41204 6.27986 5.54877 6.29773 5.66387 6.36403L6.3 6.732V6C6.3 5.86739 6.35268 5.74022 6.44645 5.64645C6.54022 5.55268 6.66739 5.5 6.8 5.5C6.93261 5.5 7.05979 5.55268 7.15355 5.64645C7.24732 5.74022 7.3 5.86739 7.3 6V6.732L7.93594 6.36403C8.05104 6.29773 8.18776 6.27986 8.31604 6.31437C8.44431 6.34887 8.55362 6.43292 8.61992 6.54802C8.68623 6.66312 8.70409 6.79984 8.66959 6.92811C8.63509 7.05639 8.55104 7.1657 8.43594 7.232L7.8 7.6L8.43592 7.964ZM13.2359 7.964C13.3507 8.03063 13.4344 8.13994 13.4689 8.26808C13.5034 8.39622 13.4858 8.53279 13.4199 8.648C13.3874 8.70531 13.3438 8.75558 13.2917 8.79591C13.2396 8.83624 13.18 8.86583 13.1164 8.88294C13.0527 8.90006 12.9863 8.90437 12.921 8.89563C12.8557 8.88688 12.7928 8.86525 12.7359 8.832L12.1 8.464V9.2C12.1 9.33261 12.0473 9.45979 11.9536 9.55355C11.8598 9.64732 11.7326 9.7 11.6 9.7C11.4674 9.7 11.3402 9.64732 11.2464 9.55355C11.1527 9.45979 11.1 9.33261 11.1 9.2V8.464L10.4639 8.832C10.407 8.86525 10.3441 8.88688 10.2787 8.89563C10.2134 8.90437 10.147 8.90006 10.0834 8.88294C10.0198 8.86583 9.96019 8.83624 9.90808 8.79591C9.85597 8.75558 9.81239 8.70531 9.77987 8.648C9.71413 8.53277 9.69658 8.39623 9.73104 8.26812C9.7655 8.14001 9.84919 8.0307 9.96387 7.964L10.6 7.6L9.96387 7.232C9.84877 7.1657 9.76472 7.05639 9.73022 6.92811C9.69571 6.79984 9.71358 6.66312 9.77988 6.54802C9.84619 6.43292 9.9555 6.34887 10.0838 6.31437C10.212 6.27986 10.3488 6.29773 10.4639 6.36403L11.1 6.732V6C11.1 5.86739 11.1527 5.74022 11.2464 5.64645C11.3402 5.55268 11.4674 5.5 11.6 5.5C11.7326 5.5 11.8598 5.55268 11.9536 5.64645C12.0473 5.74022 12.1 5.86739 12.1 6V6.732L12.7359 6.36403C12.851 6.29773 12.9878 6.27986 13.116 6.31437C13.2443 6.34887 13.3536 6.43292 13.4199 6.54802C13.4862 6.66312 13.5041 6.79984 13.4696 6.92811C13.4351 7.05639 13.351 7.1657 13.2359 7.232L12.6 7.6L13.2359 7.964ZM18.0359 7.964C18.1507 8.03063 18.2344 8.13994 18.2689 8.26808C18.3034 8.39622 18.2858 8.53279 18.2199 8.648C18.1874 8.70531 18.1438 8.75558 18.0917 8.79591C18.0396 8.83624 17.98 8.86583 17.9164 8.88294C17.8527 8.90006 17.7863 8.90437 17.721 8.89563C17.6557 8.88688 17.5928 8.86525 17.5359 8.832L16.9 8.464V9.2C16.9 9.33261 16.8473 9.45979 16.7536 9.55355C16.6598 9.64732 16.5326 9.7 16.4 9.7C16.2674 9.7 16.1402 9.64732 16.0464 9.55355C15.9527 9.45979 15.9 9.33261 15.9 9.2V8.464L15.2639 8.832C15.207 8.86525 15.1441 8.88688 15.0787 8.89563C15.0134 8.90437 14.947 8.90006 14.8834 8.88294C14.8198 8.86583 14.7602 8.83624 14.7081 8.79591C14.656 8.75558 14.6124 8.70531 14.5799 8.648C14.5141 8.53277 14.4966 8.39623 14.531 8.26812C14.5655 8.14001 14.6492 8.0307 14.7639 7.964L15.4 7.6L14.7639 7.232C14.6488 7.1657 14.5647 7.05639 14.5302 6.92811C14.4957 6.79984 14.5136 6.66312 14.5799 6.54802C14.6462 6.43292 14.7555 6.34887 14.8838 6.31437C15.012 6.27986 15.1488 6.29773 15.2639 6.36403L15.9 6.732V6C15.9 5.86739 15.9527 5.74022 16.0464 5.64645C16.1402 5.55268 16.2674 5.5 16.4 5.5C16.5326 5.5 16.6598 5.55268 16.7536 5.64645C16.8473 5.74022 16.9 5.86739 16.9 6V6.732L17.5359 6.36403C17.5929 6.3312 17.6558 6.30992 17.721 6.3014C17.7863 6.29287 17.8525 6.29728 17.916 6.31437C17.9795 6.33145 18.0391 6.36088 18.0912 6.40097C18.1434 6.44106 18.1871 6.49102 18.2199 6.54802C18.2528 6.60501 18.274 6.66791 18.2826 6.73313C18.2911 6.79834 18.2867 6.8646 18.2696 6.92811C18.2525 6.99163 18.2231 7.05115 18.183 7.10329C18.1429 7.15544 18.0929 7.19917 18.0359 7.232L17.4 7.6L18.0359 7.964Z" fill="#7C8B9C"/>
  6513. </g>
  6514. <defs>
  6515. <clipPath id="clip0_173_566">
  6516. <rect width="20" height="20" fill="white"/>
  6517. </clipPath>
  6518. </defs>
  6519. </svg>
  6520. </file>
  6521. <file path="assets/img/ico_otp_step4.svg">
  6522. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6523. <g clip-path="url(#clip0_173_575)">
  6524. <path d="M19.9997 4.44444C19.9997 2 17.9997 0 15.5552 0H14.4441C13.7775 0 13.333 0.444444 13.333 1.11111C13.333 1.77778 13.7775 2.22222 14.4441 2.22222H15.5552C16.7775 2.22222 17.7775 3.22222 17.7775 4.44444V5.66667C17.7775 6.33333 18.2219 6.77778 18.8886 6.77778C19.5552 6.77778 19.9997 6.33333 19.9997 5.66667V4.44444Z" fill="#7C8B9C"/>
  6525. <path d="M19.9997 14.4446C19.9997 13.7779 19.5552 13.3335 18.8886 13.3335C18.2219 13.3335 17.7775 13.7779 17.7775 14.4446V15.5557C17.7775 16.7779 16.7775 17.7779 15.5552 17.7779H14.4441C13.7775 17.7779 13.333 18.2224 13.333 18.8891C13.333 19.5557 13.7775 20.0002 14.4441 20.0002H15.5552C17.9997 20.0002 19.9997 18.0002 19.9997 15.5557V14.4446Z" fill="#7C8B9C"/>
  6526. <path d="M0 15.5557C0 18.0002 2 20.0002 4.44444 20.0002H5.55556C6.22222 20.0002 6.66667 19.5557 6.66667 18.8891C6.66667 18.2224 6.22222 17.7779 5.55556 17.7779H4.44444C3.22222 17.7779 2.22222 16.7779 2.22222 15.5557V14.4446C2.22222 13.7779 1.77778 13.3335 1.11111 13.3335C0.444444 13.3335 0 13.7779 0 14.4446V15.5557Z" fill="#7C8B9C"/>
  6527. <path d="M5.55556 0H4.44444C2 0 0 2 0 4.44444V5.55556C0 6.22222 0.444444 6.66667 1.11111 6.66667C1.77778 6.66667 2.22222 6.22222 2.22222 5.55556V4.44444C2.22222 3.22222 3.22222 2.22222 4.44444 2.22222H5.55556C6.22222 2.22222 6.66667 1.77778 6.66667 1.11111C6.66667 0.444444 6.22222 0 5.55556 0Z" fill="#7C8B9C"/>
  6528. <path d="M13.3337 6.66683C13.3337 4.77794 11.8892 3.3335 10.0003 3.3335C8.11144 3.3335 6.66699 4.77794 6.66699 6.66683C6.66699 8.55572 8.11144 10.0002 10.0003 10.0002C11.8892 10.0002 13.3337 8.55572 13.3337 6.66683ZM10.0003 7.77794C9.33366 7.77794 8.88921 7.3335 8.88921 6.66683C8.88921 6.00016 9.33366 5.55572 10.0003 5.55572C10.667 5.55572 11.1114 6.00016 11.1114 6.66683C11.1114 7.3335 10.667 7.77794 10.0003 7.77794Z" fill="#7C8B9C"/>
  6529. <path d="M4.9994 12.6667L4.55496 14.1111C4.33274 14.6667 4.66607 15.3333 5.22163 15.5556C5.77718 15.7778 6.44385 15.4444 6.66607 14.8889L7.11051 13.3333C7.33274 12.6667 7.9994 12.2222 8.66607 12.2222H11.3327C11.9994 12.2222 12.6661 12.6667 12.8883 13.3333L13.3327 14.7778C13.4438 15.2222 13.8883 15.5556 14.3327 15.5556C14.4438 15.5556 14.555 15.5556 14.6661 15.4444C15.2216 15.2222 15.555 14.6667 15.3327 14L14.8883 12.5556C14.4438 11.1111 12.9994 10 11.3327 10H9.9994H8.66607C6.9994 10 5.55496 11.1111 4.9994 12.6667Z" fill="#7C8B9C"/>
  6530. </g>
  6531. <defs>
  6532. <clipPath id="clip0_173_575">
  6533. <rect width="20" height="20" fill="white"/>
  6534. </clipPath>
  6535. </defs>
  6536. </svg>
  6537. </file>
  6538. <file path="assets/img/ico_otp_step5.svg">
  6539. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6540. <g clip-path="url(#clip0_173_589)">
  6541. <path d="M15.0001 6.36366C13.7274 6.36366 12.7274 5.36366 12.7274 4.09093V0.909095C12.7274 0.363638 12.3638 0 11.8183 0H4.54556C2.54555 0 0.90918 1.63637 0.90918 3.63638V16.3637C0.90918 18.3637 2.54555 20.0001 4.54556 20.0001H15.4547C17.4547 20.0001 19.0911 18.3637 19.0911 16.3637V7.27276C19.0911 6.7273 18.7274 6.36366 18.182 6.36366H15.0001ZM11.8183 14.5455H6.36375C5.81829 14.5455 5.45465 14.1819 5.45465 13.6364C5.45465 13.091 5.81829 12.7273 6.36375 12.7273H11.8183C12.3638 12.7273 12.7274 13.091 12.7274 13.6364C12.7274 14.1819 12.3638 14.5455 11.8183 14.5455ZM13.6365 10.9091H6.36375C5.81829 10.9091 5.45465 10.5455 5.45465 10C5.45465 9.45458 5.81829 9.09095 6.36375 9.09095H13.6365C14.182 9.09095 14.5456 9.45458 14.5456 10C14.5456 10.5455 14.182 10.9091 13.6365 10.9091Z" fill="#7C8B9C"/>
  6542. </g>
  6543. <defs>
  6544. <clipPath id="clip0_173_589">
  6545. <rect width="20" height="20" fill="white"/>
  6546. </clipPath>
  6547. </defs>
  6548. </svg>
  6549. </file>
  6550. <file path="assets/img/ico_paging_more.svg">
  6551. <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
  6552. <circle cx="13.5" cy="19.5" r="1.5" fill="#969696"/>
  6553. <circle cx="20.5" cy="19.5" r="1.5" fill="#969696"/>
  6554. <circle cx="27.5" cy="19.5" r="1.5" fill="#969696"/>
  6555. </svg>
  6556. </file>
  6557. <file path="assets/img/ico_paging_next.svg">
  6558. <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none">
  6559. <path d="M8 14L12.5 9.5L8 5" stroke="#616161" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6560. </svg>
  6561. </file>
  6562. <file path="assets/img/ico_paging_next1.svg">
  6563. <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
  6564. <path d="M17 25L22 20L17 15" stroke="#969696" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6565. </svg>
  6566. </file>
  6567. <file path="assets/img/ico_paging_next2.svg">
  6568. <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
  6569. <path d="M20.8333 24.1668L25 20.0002L20.8333 15.8335" stroke="#969696" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6570. <path d="M16 24.3333L20.1666 20.1667L16 16" stroke="#969696" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6571. </svg>
  6572. </file>
  6573. <file path="assets/img/ico_paging_prev.svg">
  6574. <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none">
  6575. <path d="M10 14L5.5 9.5L10 5" stroke="#616161" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6576. </svg>
  6577. </file>
  6578. <file path="assets/img/ico_paging_prev1.svg">
  6579. <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
  6580. <path d="M23 25L18 20L23 15" stroke="#969696" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6581. </svg>
  6582. </file>
  6583. <file path="assets/img/ico_paging_prev2.svg">
  6584. <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
  6585. <path d="M19.1667 24.1668L15 20.0002L19.1667 15.8335" stroke="#969696" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6586. <path d="M25 24.1668L20.8333 20.0002L25 15.8335" stroke="#969696" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6587. </svg>
  6588. </file>
  6589. <file path="assets/img/ico_performance1.svg">
  6590. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6591. <path d="M8.22016 2.50684C4.21759 2.50652 0.973068 5.75103 0.973389 9.75361C0.973068 13.7562 4.21759 17.0007 8.22016 17.0004C12.2227 17.0007 15.4673 13.7562 15.4669 9.75361L8.22016 9.75329V2.50684Z" fill="white"/>
  6592. <path d="M9.77991 1V8.2471H17.0267C17.027 4.2442 13.7828 0.999359 9.77991 1Z" fill="white"/>
  6593. </svg>
  6594. </file>
  6595. <file path="assets/img/ico_performance2.svg">
  6596. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6597. <path d="M12.375 5.625V14.625C12.375 14.7742 12.4343 14.9173 12.5398 15.0227C12.6452 15.1282 12.7883 15.1875 12.9375 15.1875H15.1875C15.3367 15.1875 15.4798 15.1282 15.5852 15.0227C15.6907 14.9173 15.75 14.7742 15.75 14.625V5.625C15.75 5.47582 15.6907 5.33274 15.5852 5.22725C15.4798 5.12176 15.3367 5.0625 15.1875 5.0625H12.9375C12.7883 5.0625 12.6452 5.12176 12.5398 5.22725C12.4343 5.33274 12.375 5.47582 12.375 5.625Z" fill="white"/>
  6598. <path d="M7.875 8.4375C7.72582 8.4375 7.58274 8.49676 7.47725 8.60225C7.37176 8.70774 7.3125 8.85082 7.3125 9V14.625C7.3125 14.7742 7.37176 14.9173 7.47725 15.0227C7.58274 15.1282 7.72582 15.1875 7.875 15.1875H10.125C10.2742 15.1875 10.4173 15.1282 10.5227 15.0227C10.6282 14.9173 10.6875 14.7742 10.6875 14.625V9C10.6875 8.85082 10.6282 8.70774 10.5227 8.60225C10.4173 8.49676 10.2742 8.4375 10.125 8.4375H7.875Z" fill="white"/>
  6599. <path d="M2.8125 11.25C2.66332 11.25 2.52024 11.3093 2.41475 11.4148C2.30926 11.5202 2.25 11.6633 2.25 11.8125V14.625C2.25 14.7742 2.30926 14.9173 2.41475 15.0227C2.52024 15.1282 2.66332 15.1875 2.8125 15.1875H5.0625C5.21168 15.1875 5.35476 15.1282 5.46025 15.0227C5.56574 14.9173 5.625 14.7742 5.625 14.625V11.8125C5.625 11.6633 5.56574 11.5202 5.46025 11.4148C5.35476 11.3093 5.21168 11.25 5.0625 11.25H2.8125Z" fill="white"/>
  6600. <path d="M16.3125 15.75H1.6875C1.53832 15.75 1.39524 15.8093 1.28975 15.9148C1.18426 16.0202 1.125 16.1633 1.125 16.3125C1.125 16.4617 1.18426 16.6048 1.28975 16.7102C1.39524 16.8157 1.53832 16.875 1.6875 16.875H16.3125C16.4617 16.875 16.6048 16.8157 16.7102 16.7102C16.8157 16.6048 16.875 16.4617 16.875 16.3125C16.875 16.1633 16.8157 16.0202 16.7102 15.9148C16.6048 15.8093 16.4617 15.75 16.3125 15.75Z" fill="white"/>
  6601. <path d="M2.24997 10.125C2.32399 10.1254 2.39738 10.1112 2.46591 10.0832C2.53445 10.0553 2.59678 10.014 2.64934 9.96187L7.53184 5.0625L7.87497 6.8625V6.91313C7.87256 6.9412 7.87256 6.96943 7.87497 6.9975C7.89605 7.03527 7.92053 7.07104 7.94809 7.10438V7.14938C7.98567 7.18254 8.02724 7.21089 8.07184 7.23375H8.12247C8.21858 7.28757 8.32733 7.31476 8.43747 7.3125H8.54997C8.54997 7.3125 8.57809 7.3125 8.59497 7.3125L8.69622 7.2675C8.73088 7.25155 8.76309 7.23071 8.79184 7.20563H8.83684L12.9375 3.04313V3.375C12.9375 3.52418 12.9967 3.66726 13.1022 3.77275C13.2077 3.87824 13.3508 3.9375 13.5 3.9375C13.6491 3.9375 13.7922 3.87824 13.8977 3.77275C14.0032 3.66726 14.0625 3.52418 14.0625 3.375V1.6875C14.0616 1.61399 14.0463 1.54138 14.0175 1.47375C13.9604 1.3363 13.8512 1.22708 13.7137 1.17C13.6461 1.14118 13.5735 1.12589 13.5 1.125H11.8125C11.6633 1.125 11.5202 1.18426 11.4147 1.28975C11.3092 1.39524 11.25 1.53832 11.25 1.6875C11.25 1.83668 11.3092 1.97976 11.4147 2.08525C11.5202 2.19074 11.6633 2.25 11.8125 2.25H12.1443L8.76934 5.625L8.43747 3.825C8.43747 3.825 8.43747 3.825 8.43747 3.78C8.42483 3.74525 8.40979 3.71142 8.39247 3.67875C8.37513 3.64486 8.3544 3.61282 8.33059 3.58313C8.33166 3.56814 8.33166 3.55311 8.33059 3.53813H8.28559L8.18997 3.47625C8.15875 3.45736 8.12449 3.44404 8.08872 3.43688H7.99309H7.76247C7.76247 3.43688 7.73434 3.43688 7.71747 3.43688L7.61622 3.48188C7.58155 3.49783 7.54935 3.51866 7.52059 3.54375H7.47559L1.85059 9.16875C1.79787 9.22104 1.75602 9.28326 1.72746 9.3518C1.69891 9.42035 1.6842 9.49387 1.6842 9.56813C1.6842 9.64238 1.69891 9.7159 1.72746 9.78445C1.75602 9.853 1.79787 9.91521 1.85059 9.9675C1.95766 10.0707 2.10125 10.1274 2.24997 10.125Z" fill="white"/>
  6602. </svg>
  6603. </file>
  6604. <file path="assets/img/ico_pin_off.svg">
  6605. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6606. <g clip-path="url(#clip0_232_29750)">
  6607. <path d="M6.74985 6.71751L9.22472 4.24264C9.27628 4.19108 9.30206 4.13216 9.30206 4.06586C9.30206 3.99957 9.27628 3.94065 9.22472 3.88909C9.17316 3.83753 9.11424 3.81175 9.04795 3.81175C8.98166 3.81175 8.92273 3.83753 8.87117 3.88909L6.3963 6.36396C6.34474 6.41552 6.31896 6.47445 6.31896 6.54074C6.31896 6.60703 6.34474 6.66595 6.3963 6.71751C6.44786 6.76907 6.50678 6.79485 6.57307 6.79485C6.63936 6.79485 6.69829 6.76907 6.74985 6.71751ZM8.51762 12.3744C8.42186 12.4701 8.30401 12.518 8.16406 12.518C8.02412 12.518 7.90626 12.4701 7.81051 12.3744L5.4406 10.0045L2.49064 12.3909C2.43908 12.4278 2.38199 12.4462 2.31938 12.4462C2.25678 12.4462 2.20337 12.4241 2.15918 12.3799L2.15366 12.3744C2.05422 12.2749 2.04501 12.1663 2.12603 12.0484L4.38546 8.94932L2.15366 6.71751C2.0579 6.62176 2.01002 6.50391 2.01002 6.36396C2.01002 6.22401 2.0579 6.10616 2.15365 6.01041C2.60665 5.55742 3.15907 5.29409 3.81094 5.22044C4.4628 5.14678 4.97103 5.29225 5.33564 5.65685L8.16406 2.82843C7.97255 2.63692 7.8768 2.40122 7.8768 2.12132C7.8768 1.84142 7.97255 1.60572 8.16406 1.41421C8.35557 1.22271 8.59127 1.12695 8.87117 1.12695C9.15107 1.12695 9.38677 1.22271 9.57828 1.41421L13.1138 4.94975C13.3053 5.14126 13.4011 5.37696 13.4011 5.65685C13.4011 5.93675 13.3053 6.17245 13.1138 6.36396C12.9223 6.55547 12.6866 6.65122 12.4067 6.65122C12.1268 6.65122 11.8911 6.55547 11.6996 6.36396L8.87117 9.19239C9.23577 9.55699 9.38124 10.0652 9.30759 10.7171C9.23393 11.369 8.97061 11.9214 8.51762 12.3744Z" fill="#BFBFBF"/>
  6608. </g>
  6609. <defs>
  6610. <clipPath id="clip0_232_29750">
  6611. <rect width="14" height="14" fill="white"/>
  6612. </clipPath>
  6613. </defs>
  6614. </svg>
  6615. </file>
  6616. <file path="assets/img/ico_pin_on.svg">
  6617. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6618. <g clip-path="url(#clip0_232_29678)">
  6619. <path d="M6.74985 6.71751L9.22472 4.24264C9.27628 4.19108 9.30206 4.13216 9.30206 4.06586C9.30206 3.99957 9.27628 3.94065 9.22472 3.88909C9.17316 3.83753 9.11424 3.81175 9.04795 3.81175C8.98166 3.81175 8.92273 3.83753 8.87117 3.88909L6.3963 6.36396C6.34474 6.41552 6.31896 6.47445 6.31896 6.54074C6.31896 6.60703 6.34474 6.66595 6.3963 6.71751C6.44786 6.76907 6.50678 6.79485 6.57307 6.79485C6.63936 6.79485 6.69829 6.76907 6.74985 6.71751ZM8.51762 12.3744C8.42186 12.4701 8.30401 12.518 8.16406 12.518C8.02412 12.518 7.90626 12.4701 7.81051 12.3744L5.4406 10.0045L2.49064 12.3909C2.43908 12.4278 2.38199 12.4462 2.31938 12.4462C2.25678 12.4462 2.20337 12.4241 2.15918 12.3799L2.15366 12.3744C2.05422 12.2749 2.04501 12.1663 2.12603 12.0484L4.38546 8.94932L2.15366 6.71751C2.0579 6.62176 2.01002 6.50391 2.01002 6.36396C2.01002 6.22401 2.0579 6.10616 2.15365 6.01041C2.60665 5.55742 3.15907 5.29409 3.81094 5.22044C4.4628 5.14678 4.97103 5.29225 5.33564 5.65685L8.16406 2.82843C7.97255 2.63692 7.8768 2.40122 7.8768 2.12132C7.8768 1.84142 7.97255 1.60572 8.16406 1.41421C8.35557 1.22271 8.59127 1.12695 8.87117 1.12695C9.15107 1.12695 9.38677 1.22271 9.57828 1.41421L13.1138 4.94975C13.3053 5.14126 13.4011 5.37696 13.4011 5.65685C13.4011 5.93675 13.3053 6.17245 13.1138 6.36396C12.9223 6.55547 12.6866 6.65122 12.4067 6.65122C12.1268 6.65122 11.8911 6.55547 11.6996 6.36396L8.87117 9.19239C9.23577 9.55699 9.38124 10.0652 9.30759 10.7171C9.23393 11.369 8.97061 11.9214 8.51762 12.3744Z" fill="#3F5984"/>
  6620. </g>
  6621. <defs>
  6622. <clipPath id="clip0_232_29678">
  6623. <rect width="14" height="14" fill="white"/>
  6624. </clipPath>
  6625. </defs>
  6626. </svg>
  6627. </file>
  6628. <file path="assets/img/ico_pip.svg">
  6629. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6630. <g clip-path="url(#clip0_273_53216)">
  6631. <path d="M12.4444 11.6473V11.5416C13.3579 11.1607 14 10.2591 14 9.2075V2.52778C14 1.13172 12.8683 0 11.4722 0H4.86111C3.73643 0 2.7833 0.734511 2.45525 1.75H2.29902C1.58942 1.75 0.986168 1.99994 0.570881 2.49168C0.16779 2.96898 0 3.60488 0 4.27778V11.0833C0 11.908 0.297788 12.6497 0.863847 13.183C1.42765 13.7143 2.21147 13.9962 3.11111 13.9962L6.1593 13.9963L9.33046 13.9999H9.33154C10.0907 14.0035 10.8433 13.8441 11.4266 13.4704C12.0326 13.0822 12.4444 12.4637 12.4444 11.6473ZM2.29902 2.91667H2.33333V9.2075C2.33333 10.6036 3.46506 11.7353 4.86111 11.7353H11.2745C11.2499 12.0603 11.0864 12.3028 10.7973 12.4881C10.46 12.7041 9.94926 12.8363 9.33621 12.8333H9.33403L6.1593 12.8296L3.11111 12.8295C2.4552 12.8295 1.97512 12.6272 1.66393 12.3339C1.35499 12.0429 1.16667 11.6198 1.16667 11.0833V4.27778C1.16667 3.78402 1.29054 3.4477 1.46221 3.24444C1.62167 3.05562 1.87627 2.91667 2.29902 2.91667ZM7.0168 2.72223H10.6944C11.0166 2.72223 11.2778 2.9834 11.2778 3.30556V6.98329C11.2778 7.30544 11.0166 7.56662 10.6944 7.56662C10.3723 7.56662 10.1111 7.30544 10.1111 6.98329V4.71385L6.05134 8.77358C5.82353 9.00139 5.45424 9.00139 5.22641 8.77358C4.99861 8.54577 4.99861 8.17648 5.22641 7.94867L9.28612 3.88889H7.0168C6.69457 3.88889 6.43347 3.62772 6.43347 3.30556C6.43347 2.9834 6.69457 2.72223 7.0168 2.72223Z" fill="#0B318B"/>
  6632. </g>
  6633. <defs>
  6634. <clipPath id="clip0_273_53216">
  6635. <rect width="14" height="14" fill="white"/>
  6636. </clipPath>
  6637. </defs>
  6638. </svg>
  6639. </file>
  6640. <file path="assets/img/ico_pip2.svg">
  6641. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6642. <path d="M8.33337 3.33398H5.00004C4.07957 3.33398 3.33337 4.08018 3.33337 5.00065V15.0007C3.33337 15.9212 4.07957 16.6673 5.00004 16.6673H15C15.9205 16.6673 16.6667 15.9212 16.6667 15.0007V11.6673M10 10.0007L16.6667 3.33398M16.6667 3.33398V7.50065M16.6667 3.33398H12.5" stroke="#8E8E8E" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6643. </svg>
  6644. </file>
  6645. <file path="assets/img/ico_plus.svg">
  6646. <svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
  6647. <path d="M7 3.41797V11.5846" stroke="#929292" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6648. <path d="M2.91666 7.5H11.0833" stroke="#929292" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6649. </svg>
  6650. </file>
  6651. <file path="assets/img/ico_pop_close.svg">
  6652. <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
  6653. <path d="M18 6L6 18" stroke="#484848" stroke-linecap="round" stroke-linejoin="round"/>
  6654. <path d="M6 6L18 18" stroke="#484848" stroke-linecap="round" stroke-linejoin="round"/>
  6655. </svg>
  6656. </file>
  6657. <file path="assets/img/ico_pos.svg">
  6658. <svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
  6659. <rect y="0.5" width="16" height="16" rx="8" fill="#007AFF"/>
  6660. <path d="M8 5C7.20435 5 6.44129 5.32325 5.87868 5.89865C5.31607 6.47405 5 7.25445 5 8.06818C5 10.7955 8 12.5 8 12.5C8 12.5 11 10.7955 11 8.06818C11 7.25445 10.6839 6.47405 10.1213 5.89865C9.55871 5.32325 8.79565 5 8 5ZM8 9.43182C7.73629 9.43182 7.47851 9.35184 7.25924 9.202C7.03997 9.05217 6.86908 8.8392 6.76816 8.59002C6.66724 8.34085 6.64084 8.06667 6.69229 7.80215C6.74373 7.53763 6.87072 7.29465 7.05719 7.10395C7.24366 6.91324 7.48124 6.78336 7.73988 6.73075C7.99852 6.67813 8.26661 6.70514 8.51024 6.80835C8.75388 6.91156 8.96212 7.08634 9.10863 7.31059C9.25513 7.53483 9.33333 7.79848 9.33333 8.06818C9.33333 8.42984 9.19286 8.77669 8.94281 9.03242C8.69276 9.28815 8.35362 9.43182 8 9.43182Z" fill="white"/>
  6661. </svg>
  6662. </file>
  6663. <file path="assets/img/ico_ran_arrow_gray.svg">
  6664. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6665. <path d="M5.25 10.5L8.75 7L5.25 3.5" stroke="#555555" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6666. </svg>
  6667. </file>
  6668. <file path="assets/img/ico_ran_arrow_white.svg">
  6669. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6670. <path d="M5.25 10.5L8.75 7L5.25 3.5" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6671. </svg>
  6672. </file>
  6673. <file path="assets/img/ico_red_pin.svg">
  6674. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6675. <path d="M11.7637 3.48444C11.7122 3.29753 11.6072 3.09864 11.5298 2.92427C10.6007 0.771729 8.57133 0 6.93265 0C4.73872 0 2.32262 1.41854 2 4.34295V4.94044C2 4.96537 2.0088 5.18919 2.0218 5.30131C2.2026 6.69492 3.3426 8.17612 4.19422 9.56973C5.11024 11.0631 6.06106 12.5315 7.00293 14C7.58348 13.0419 8.16222 12.0713 8.72977 11.1376C8.88431 10.8639 9.06413 10.5902 9.21895 10.3287C9.32206 10.1547 9.51907 9.98046 9.60933 9.81862C10.5254 8.20092 12 6.57054 12 4.96537V4.30562C12.0001 4.13165 11.7767 3.5219 11.7637 3.48444ZM6.97261 6.48336C6.32765 6.48336 5.62205 6.17235 5.27358 5.3137C5.2216 5.17693 5.22579 4.90311 5.22579 4.87818V4.49225C5.22579 3.39752 6.18974 2.89961 7.02822 2.89961C8.06064 2.89961 8.85902 3.696 8.85902 4.69155C8.85902 5.68724 8.00489 6.48336 6.97261 6.48336Z" fill="#E1473D"/>
  6676. </svg>
  6677. </file>
  6678. <file path="assets/img/ico_refresh_dis.svg">
  6679. <svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6680. <path d="M13 7C12.4667 7 12.2138 7.37581 12.125 7.77263C11.8052 9.20063 10.4481 11.375 7.75 11.375C5.33369 11.375 3.375 9.41587 3.375 7C3.375 4.58413 5.33369 2.625 7.75 2.625C8.73 2.625 9.62906 2.95444 10.3575 3.5H9.5C9.017 3.5 8.625 3.892 8.625 4.375C8.625 4.858 9.017 5.25 9.5 5.25H12.125C12.608 5.25 13 4.858 13 4.375V1.75C13 1.267 12.608 0.875 12.125 0.875C11.642 0.875 11.25 1.267 11.25 1.75V1.97663C10.2582 1.28275 9.05244 0.875 7.75 0.875C4.36725 0.875 1.625 3.61725 1.625 7C1.625 10.3827 4.36725 13.125 7.75 13.125C12.1158 13.125 13.875 8.96875 13.875 7.92969C13.875 7.294 13.4104 7 13 7Z" fill="#E0E0E0"/>
  6681. </svg>
  6682. </file>
  6683. <file path="assets/img/ico_refresh.svg">
  6684. <svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6685. <path d="M13 7C12.4667 7 12.2138 7.37581 12.125 7.77263C11.8052 9.20063 10.4481 11.375 7.75 11.375C5.33369 11.375 3.375 9.41587 3.375 7C3.375 4.58413 5.33369 2.625 7.75 2.625C8.73 2.625 9.62906 2.95444 10.3575 3.5H9.5C9.017 3.5 8.625 3.892 8.625 4.375C8.625 4.858 9.017 5.25 9.5 5.25H12.125C12.608 5.25 13 4.858 13 4.375V1.75C13 1.267 12.608 0.875 12.125 0.875C11.642 0.875 11.25 1.267 11.25 1.75V1.97663C10.2582 1.28275 9.05244 0.875 7.75 0.875C4.36725 0.875 1.625 3.61725 1.625 7C1.625 10.3827 4.36725 13.125 7.75 13.125C12.1158 13.125 13.875 8.96875 13.875 7.92969C13.875 7.294 13.4104 7 13 7Z" fill="#444444"/>
  6686. </svg>
  6687. </file>
  6688. <file path="assets/img/ico_reg_disabled.svg">
  6689. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6690. <path d="M9 16.875C6.89625 16.875 4.91906 16.056 3.43181 14.5682C1.00069 12.1376 0.423562 8.45156 1.99519 5.39719C2.1375 5.121 2.47612 5.01244 2.75287 5.15419C3.02906 5.29594 3.13819 5.63513 2.99587 5.91188C1.64869 8.53031 2.14312 11.6893 4.22719 13.7728C5.50181 15.048 7.19662 15.75 9 15.75C10.8028 15.75 12.4982 15.048 13.7728 13.7728C15.0474 12.4976 15.75 10.8028 15.75 9C15.75 7.19662 15.048 5.50181 13.7728 4.22719C12.4976 2.95256 10.8034 2.25 9 2.25C7.19662 2.25 5.50181 2.95256 4.22719 4.22719C4.00725 4.44712 3.65175 4.44712 3.43181 4.22719C3.21187 4.00725 3.21187 3.65175 3.43181 3.43181C4.91906 1.94456 6.89625 1.125 9 1.125C11.1037 1.125 13.0815 1.94456 14.5682 3.43181C16.056 4.91906 16.875 6.89625 16.875 9C16.875 11.1032 16.056 13.0809 14.5682 14.5682C13.0815 16.056 11.1037 16.875 9 16.875Z" fill="#8E8E8E"/>
  6691. <path d="M9 12.375C8.6895 12.375 8.4375 12.1236 8.4375 11.8125V6.1875C8.4375 5.877 8.6895 5.625 9 5.625C9.3105 5.625 9.5625 5.877 9.5625 6.1875V11.8125C9.5625 12.1236 9.3105 12.375 9 12.375Z" fill="#8E8E8E"/>
  6692. <path d="M11.8125 9.5625H6.1875C5.877 9.5625 5.625 9.3105 5.625 9C5.625 8.6895 5.877 8.4375 6.1875 8.4375H11.8125C12.1236 8.4375 12.375 8.6895 12.375 9C12.375 9.3105 12.1236 9.5625 11.8125 9.5625Z" fill="#8E8E8E"/>
  6693. </svg>
  6694. </file>
  6695. <file path="assets/img/ico_reg.svg">
  6696. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6697. <g clip-path="url(#clip0_602_3947)">
  6698. <path d="M8.99997 16.875C6.89622 16.875 4.91904 16.056 3.43179 14.5682C1.00066 12.1376 0.423536 8.45156 1.99516 5.39719C2.13747 5.121 2.4761 5.01244 2.75285 5.15419C3.02904 5.29594 3.13816 5.63513 2.99585 5.91188C1.64866 8.53031 2.1431 11.6893 4.22716 13.7728C5.50179 15.048 7.1966 15.75 8.99997 15.75C10.8028 15.75 12.4982 15.048 13.7728 13.7728C15.0474 12.4976 15.75 10.8028 15.75 9C15.75 7.19662 15.048 5.50181 13.7728 4.22719C12.4976 2.95256 10.8033 2.25 8.99997 2.25C7.1966 2.25 5.50179 2.95256 4.22716 4.22719C4.00722 4.44712 3.65172 4.44712 3.43179 4.22719C3.21185 4.00725 3.21185 3.65175 3.43179 3.43181C4.91904 1.94456 6.89622 1.125 8.99997 1.125C11.1037 1.125 13.0815 1.94456 14.5682 3.43181C16.056 4.91906 16.875 6.89625 16.875 9C16.875 11.1032 16.056 13.0809 14.5682 14.5682C13.0815 16.056 11.1037 16.875 8.99997 16.875Z" fill="white"/>
  6699. <path d="M9 12.375C8.6895 12.375 8.4375 12.1236 8.4375 11.8125V6.1875C8.4375 5.877 8.6895 5.625 9 5.625C9.3105 5.625 9.5625 5.877 9.5625 6.1875V11.8125C9.5625 12.1236 9.3105 12.375 9 12.375Z" fill="white"/>
  6700. <path d="M11.8125 9.5625H6.1875C5.877 9.5625 5.625 9.3105 5.625 9C5.625 8.6895 5.877 8.4375 6.1875 8.4375H11.8125C12.1236 8.4375 12.375 8.6895 12.375 9C12.375 9.3105 12.1236 9.5625 11.8125 9.5625Z" fill="white"/>
  6701. </g>
  6702. <defs>
  6703. <clipPath id="clip0_602_3947">
  6704. <rect width="18" height="18" fill="white"/>
  6705. </clipPath>
  6706. </defs>
  6707. </svg>
  6708. </file>
  6709. <file path="assets/img/ico_save_disabled.svg">
  6710. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6711. <path d="M14.1667 17.5V10.8333H5.83333V17.5M5.83333 2.5V6.66667H12.5M15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V4.16667C2.5 3.72464 2.67559 3.30072 2.98816 2.98816C3.30072 2.67559 3.72464 2.5 4.16667 2.5H13.3333L17.5 6.66667V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5Z" stroke="#8E8E8E" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
  6712. </svg>
  6713. </file>
  6714. <file path="assets/img/ico_save.svg">
  6715. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6716. <path d="M14.1667 17.5V10.8333H5.83333V17.5M5.83333 2.5V6.66667H12.5M15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V4.16667C2.5 3.72464 2.67559 3.30072 2.98816 2.98816C3.30072 2.67559 3.72464 2.5 4.16667 2.5H13.3333L17.5 6.66667V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5Z" stroke="white" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
  6717. </svg>
  6718. </file>
  6719. <file path="assets/img/ico_search.svg">
  6720. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  6721. <path d="M7.33333 12.6667C10.2789 12.6667 12.6667 10.2789 12.6667 7.33333C12.6667 4.38781 10.2789 2 7.33333 2C4.38781 2 2 4.38781 2 7.33333C2 10.2789 4.38781 12.6667 7.33333 12.6667Z" stroke="#8E8E8E" stroke-linecap="round" stroke-linejoin="round"/>
  6722. <path d="M14 14.0001L11.1 11.1001" stroke="#8E8E8E" stroke-linecap="round" stroke-linejoin="round"/>
  6723. </svg>
  6724. </file>
  6725. <file path="assets/img/ico_set_blue.svg">
  6726. <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
  6727. <g clip-path="url(#clip0_112_45486)">
  6728. <path d="M11 13.75C12.5188 13.75 13.75 12.5188 13.75 11C13.75 9.48122 12.5188 8.25 11 8.25C9.48122 8.25 8.25 9.48122 8.25 11C8.25 12.5188 9.48122 13.75 11 13.75Z" stroke="#0B318B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  6729. <path d="M17.7833 13.7493C17.6613 14.0258 17.6249 14.3325 17.6788 14.6299C17.7327 14.9273 17.8745 15.2016 18.0858 15.4177L18.1408 15.4727C18.3113 15.6429 18.4465 15.8451 18.5388 16.0677C18.631 16.2903 18.6785 16.5288 18.6785 16.7698C18.6785 17.0107 18.631 17.2493 18.5388 17.4718C18.4465 17.6944 18.3113 17.8966 18.1408 18.0668C17.9706 18.2373 17.7684 18.3725 17.5458 18.4648C17.3232 18.5571 17.0847 18.6045 16.8437 18.6045C16.6028 18.6045 16.3643 18.5571 16.1417 18.4648C15.9191 18.3725 15.7169 18.2373 15.5467 18.0668L15.4917 18.0118C15.2756 17.8005 15.0012 17.6588 14.7039 17.6048C14.4065 17.5509 14.0998 17.5873 13.8233 17.7093C13.5522 17.8255 13.321 18.0185 13.1581 18.2644C12.9952 18.5104 12.9078 18.7985 12.9067 19.0935V19.2493C12.9067 19.7356 12.7135 20.2019 12.3697 20.5457C12.0259 20.8895 11.5596 21.0827 11.0733 21.0827C10.5871 21.0827 10.1208 20.8895 9.77697 20.5457C9.43315 20.2019 9.24 19.7356 9.24 19.2493V19.1668C9.2329 18.8634 9.13469 18.5692 8.95813 18.3223C8.78157 18.0755 8.53484 17.8874 8.25 17.7827C7.97352 17.6607 7.66682 17.6243 7.36946 17.6782C7.0721 17.7321 6.7977 17.8739 6.58166 18.0852L6.52666 18.1402C6.3564 18.3106 6.1542 18.4459 5.93164 18.5381C5.70907 18.6304 5.47051 18.6779 5.22958 18.6779C4.98865 18.6779 4.75009 18.6304 4.52752 18.5381C4.30496 18.4459 4.10276 18.3106 3.9325 18.1402C3.76204 17.9699 3.62682 17.7677 3.53455 17.5452C3.44229 17.3226 3.39481 17.084 3.39481 16.8431C3.39481 16.6022 3.44229 16.3636 3.53455 16.141C3.62682 15.9185 3.76204 15.7163 3.9325 15.546L3.9875 15.491C4.19882 15.275 4.34058 15.0006 4.3945 14.7032C4.44842 14.4059 4.41202 14.0992 4.29 13.8227C4.1738 13.5516 3.98086 13.3203 3.73492 13.1575C3.48899 12.9946 3.2008 12.9072 2.90583 12.906H2.75C2.26377 12.906 1.79745 12.7129 1.45364 12.369C1.10982 12.0252 0.916664 11.5589 0.916664 11.0727C0.916664 10.5865 1.10982 10.1201 1.45364 9.77632C1.79745 9.4325 2.26377 9.23935 2.75 9.23935H2.8325C3.13591 9.23225 3.43017 9.13404 3.67702 8.95748C3.92387 8.78093 4.1119 8.53419 4.21666 8.24935C4.33869 7.97287 4.37509 7.66617 4.32117 7.36881C4.26725 7.07145 4.12549 6.79705 3.91416 6.58102L3.85916 6.52602C3.68871 6.35575 3.55348 6.15355 3.46122 5.93099C3.36896 5.70843 3.32147 5.46986 3.32147 5.22893C3.32147 4.988 3.36896 4.74944 3.46122 4.52687C3.55348 4.30431 3.68871 4.10212 3.85916 3.93185C4.02943 3.76139 4.23163 3.62617 4.45419 3.53391C4.67675 3.44164 4.91532 3.39416 5.15625 3.39416C5.39718 3.39416 5.63574 3.44164 5.8583 3.53391C6.08087 3.62617 6.28306 3.76139 6.45333 3.93185L6.50833 3.98685C6.72437 4.19817 6.99876 4.33994 7.29612 4.39385C7.59349 4.44777 7.90018 4.41137 8.17666 4.28935H8.25C8.52112 4.17315 8.75235 3.98021 8.91522 3.73428C9.07808 3.48834 9.16549 3.20015 9.16666 2.90518V2.74935C9.16666 2.26312 9.35982 1.7968 9.70363 1.45299C10.0475 1.10917 10.5138 0.916016 11 0.916016C11.4862 0.916016 11.9525 1.10917 12.2964 1.45299C12.6402 1.7968 12.8333 2.26312 12.8333 2.74935V2.83185C12.8345 3.12682 12.9219 3.41501 13.0848 3.66094C13.2476 3.90687 13.4789 4.09982 13.75 4.21602C14.0265 4.33804 14.3332 4.37444 14.6305 4.32052C14.9279 4.2666 15.2023 4.12484 15.4183 3.91352L15.4733 3.85852C15.6436 3.68806 15.8458 3.55283 16.0684 3.46057C16.2909 3.36831 16.5295 3.32082 16.7704 3.32082C17.0113 3.32082 17.2499 3.36831 17.4725 3.46057C17.695 3.55283 17.8972 3.68806 18.0675 3.85852C18.238 4.02878 18.3732 4.23098 18.4654 4.45354C18.5577 4.6761 18.6052 4.91467 18.6052 5.1556C18.6052 5.39653 18.5577 5.63509 18.4654 5.85766C18.3732 6.08022 18.238 6.28241 18.0675 6.45268L18.0125 6.50768C17.8012 6.72372 17.6594 6.99811 17.6055 7.29548C17.5516 7.59284 17.588 7.89953 17.71 8.17602V8.24935C17.8262 8.52047 18.0191 8.7517 18.2651 8.91457C18.511 9.07744 18.7992 9.16484 19.0942 9.16602H19.25C19.7362 9.16602 20.2025 9.35917 20.5464 9.70299C20.8902 10.0468 21.0833 10.5131 21.0833 10.9993C21.0833 11.4856 20.8902 11.9519 20.5464 12.2957C20.2025 12.6395 19.7362 12.8327 19.25 12.8327H19.1675C18.8725 12.8339 18.5843 12.9213 18.3384 13.0841C18.0925 13.247 17.8995 13.4782 17.7833 13.7493Z" stroke="#0B318B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  6730. </g>
  6731. <defs>
  6732. <clipPath id="clip0_112_45486">
  6733. <rect width="22" height="22" fill="white"/>
  6734. </clipPath>
  6735. </defs>
  6736. </svg>
  6737. </file>
  6738. <file path="assets/img/ico_set.svg">
  6739. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6740. <g clip-path="url(#clip0_119_30785)">
  6741. <path d="M12.95 8.4L12.25 7.99167C11.4917 7.525 11.4917 6.41667 12.25 5.95L12.95 5.54167C13.5333 5.19167 13.7083 4.49167 13.3583 3.96667L12.775 2.975C12.425 2.39167 11.725 2.21667 11.2 2.56667L10.5 2.975C9.74166 3.44167 8.75 2.85833 8.75 1.98333V1.16667C8.75 0.525 8.225 0 7.58333 0H6.41666C5.775 0 5.25 0.525 5.25 1.16667V1.925C5.25 2.8 4.25833 3.38333 3.5 2.91667L2.8 2.56667C2.21666 2.21667 1.51666 2.45 1.225 2.975L0.641662 3.96667C0.349996 4.55 0.524996 5.25 1.05 5.6L1.75 6.00833C2.50833 6.41667 2.50833 7.58333 1.75 7.99167L1.05 8.4C0.466662 8.75 0.291662 9.45 0.641662 9.975L1.225 10.9667C1.575 11.55 2.275 11.725 2.8 11.375L3.5 11.025C4.25833 10.5583 5.25 11.1417 5.25 12.0167V12.8333C5.25 13.475 5.775 14 6.41666 14H7.58333C8.225 14 8.75 13.475 8.75 12.8333V12.075C8.75 11.2 9.74166 10.6167 10.5 11.0833L11.2 11.4917C11.7833 11.8417 12.4833 11.6083 12.775 11.0833L13.3583 10.0917C13.65 9.45 13.475 8.75 12.95 8.4ZM7 9.33333C5.71666 9.33333 4.66666 8.28333 4.66666 7C4.66666 5.71667 5.71666 4.66667 7 4.66667C8.28333 4.66667 9.33333 5.71667 9.33333 7C9.33333 8.28333 8.28333 9.33333 7 9.33333Z" fill="#777777"/>
  6742. </g>
  6743. <defs>
  6744. <clipPath id="clip0_119_30785">
  6745. <rect width="14" height="14" fill="white"/>
  6746. </clipPath>
  6747. </defs>
  6748. </svg>
  6749. </file>
  6750. <file path="assets/img/ico_setting.svg">
  6751. <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
  6752. <path d="M19.8989 12.6594C19.7386 12.4769 19.6502 12.2423 19.6502 11.9994C19.6502 11.7565 19.7386 11.5219 19.8989 11.3394L21.1789 9.89941C21.32 9.74208 21.4076 9.54411 21.4291 9.33391C21.4507 9.12372 21.4051 8.91209 21.2989 8.72941L19.2989 5.26941C19.1938 5.08693 19.0338 4.94228 18.8417 4.85609C18.6495 4.7699 18.4351 4.74656 18.2289 4.78941L16.3489 5.16941C16.1097 5.21884 15.8607 5.179 15.6488 5.05741C15.4369 4.93582 15.2769 4.74089 15.1989 4.50941L14.5889 2.67941C14.5218 2.48079 14.394 2.30827 14.2235 2.18625C14.0531 2.06423 13.8486 1.99887 13.6389 1.99941H9.63892C9.42085 1.98802 9.20505 2.04833 9.02448 2.17112C8.84391 2.29391 8.7085 2.47243 8.63892 2.67941L8.07892 4.50941C8.00092 4.74089 7.84089 4.93582 7.62903 5.05741C7.41717 5.179 7.16814 5.21884 6.92892 5.16941L4.99892 4.78941C4.80347 4.76179 4.60422 4.79263 4.42627 4.87805C4.24831 4.96346 4.09962 5.09964 3.99892 5.26941L1.99892 8.72941C1.89008 8.91006 1.84114 9.12049 1.8591 9.33063C1.87706 9.54077 1.961 9.73985 2.09892 9.89941L3.36892 11.3394C3.52924 11.5219 3.61765 11.7565 3.61765 11.9994C3.61765 12.2423 3.52924 12.4769 3.36892 12.6594L2.09892 14.0994C1.961 14.259 1.87706 14.458 1.8591 14.6682C1.84114 14.8783 1.89008 15.0888 1.99892 15.2694L3.99892 18.7294C4.10402 18.9119 4.26404 19.0565 4.45617 19.1427C4.64831 19.2289 4.86274 19.2522 5.06892 19.2094L6.94892 18.8294C7.18814 18.78 7.43717 18.8198 7.64903 18.9414C7.86089 19.063 8.02092 19.2579 8.09892 19.4894L8.70892 21.3194C8.7785 21.5264 8.91392 21.7049 9.09449 21.8277C9.27506 21.9505 9.49085 22.0108 9.70892 21.9994H13.7089C13.9186 21.9999 14.1231 21.9346 14.2935 21.8126C14.464 21.6905 14.5918 21.518 14.6589 21.3194L15.2689 19.4894C15.3469 19.2579 15.5069 19.063 15.7188 18.9414C15.9307 18.8198 16.1797 18.78 16.4189 18.8294L18.2989 19.2094C18.5051 19.2522 18.7195 19.2289 18.9117 19.1427C19.1038 19.0565 19.2638 18.9119 19.3689 18.7294L21.3689 15.2694C21.4751 15.0867 21.5207 14.8751 21.4991 14.6649C21.4776 14.4547 21.39 14.2567 21.2489 14.0994L19.8989 12.6594ZM18.4089 13.9994L19.2089 14.8994L17.9289 17.1194L16.7489 16.8794C16.0287 16.7322 15.2795 16.8545 14.6435 17.2232C14.0075 17.5919 13.5291 18.1812 13.2989 18.8794L12.9189 19.9994H10.3589L9.99892 18.8594C9.76877 18.1612 9.2903 17.5719 8.65432 17.2032C8.01835 16.8345 7.26914 16.7122 6.54892 16.8594L5.36892 17.0994L4.06892 14.8894L4.86892 13.9894C5.36087 13.4394 5.63285 12.7273 5.63285 11.9894C5.63285 11.2515 5.36087 10.5394 4.86892 9.98941L4.06892 9.08941L5.34892 6.88941L6.52892 7.12941C7.24914 7.27663 7.99835 7.15429 8.63432 6.78561C9.2703 6.41692 9.74877 5.82757 9.97892 5.12941L10.3589 3.99941H12.9189L13.2989 5.13941C13.5291 5.83757 14.0075 6.42692 14.6435 6.79561C15.2795 7.16429 16.0287 7.28663 16.7489 7.13941L17.9289 6.89941L19.2089 9.11941L18.4089 10.0194C17.9225 10.5682 17.6539 11.2761 17.6539 12.0094C17.6539 12.7427 17.9225 13.4506 18.4089 13.9994ZM11.6389 7.99941C10.8478 7.99941 10.0744 8.234 9.41664 8.67353C8.75884 9.11305 8.24615 9.73777 7.9434 10.4687C7.64065 11.1996 7.56144 12.0038 7.71578 12.7798C7.87012 13.5557 8.25108 14.2684 8.81049 14.8278C9.3699 15.3872 10.0826 15.7682 10.8586 15.9225C11.6345 16.0769 12.4387 15.9977 13.1697 15.6949C13.9006 15.3922 14.5253 14.8795 14.9648 14.2217C15.4043 13.5639 15.6389 12.7905 15.6389 11.9994C15.6389 10.9385 15.2175 9.92112 14.4673 9.17098C13.7172 8.42083 12.6998 7.99941 11.6389 7.99941ZM11.6389 13.9994C11.2434 13.9994 10.8567 13.8821 10.5278 13.6623C10.1989 13.4426 9.94254 13.1302 9.79116 12.7648C9.63979 12.3993 9.60018 11.9972 9.67735 11.6092C9.75452 11.2213 9.945 10.8649 10.2247 10.5852C10.5044 10.3055 10.8608 10.115 11.2487 10.0378C11.6367 9.96067 12.0388 10.0003 12.4043 10.1516C12.7697 10.303 13.0821 10.5594 13.3019 10.8883C13.5216 11.2172 13.6389 11.6038 13.6389 11.9994C13.6389 12.5298 13.4282 13.0385 13.0531 13.4136C12.6781 13.7887 12.1694 13.9994 11.6389 13.9994Z" fill="white"/>
  6753. </svg>
  6754. </file>
  6755. <file path="assets/img/ico_slt.svg">
  6756. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  6757. <path d="M3 5L6 8L9 5" stroke="#8E8E8E" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6758. </svg>
  6759. </file>
  6760. <file path="assets/img/ico_slt2.svg">
  6761. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  6762. <path d="M3 4.5L6 7.5L9 4.5" stroke="#333333" stroke-linecap="round" stroke-linejoin="round"/>
  6763. </svg>
  6764. </file>
  6765. <file path="assets/img/ico_sort.svg">
  6766. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6767. <g clip-path="url(#clip0_232_35017)">
  6768. <path fill-rule="evenodd" clip-rule="evenodd" d="M-3.0598e-07 7C-3.24757e-07 6.57043 0.348226 6.22222 0.777778 6.22222L9.4661 6.22222C9.78639 5.31596 10.6507 4.66667 11.6667 4.66667C12.9554 4.66667 14 5.7113 14 7C14 8.2887 12.9554 9.33333 11.6667 9.33333C10.6507 9.33333 9.78639 8.68404 9.4661 7.77778L0.777778 7.77778C0.348226 7.77778 -2.87203e-07 7.42957 -3.0598e-07 7ZM-5.09966e-07 2.33333C-5.28743e-07 1.90377 0.348226 1.55556 0.777777 1.55556L4.79944 1.55556C5.11975 0.64929 5.98407 6.92102e-07 7 6.47695e-07C8.01593 6.03287e-07 8.88028 0.64929 9.20057 1.55556L13.2222 1.55556C13.6518 1.55556 14 1.90377 14 2.33333C14 2.7629 13.6518 3.11111 13.2222 3.11111L9.20057 3.11111C8.88028 4.01738 8.01593 4.66667 7 4.66667C5.98407 4.66667 5.11975 4.01738 4.79944 3.11111L0.777777 3.11111C0.348226 3.11111 -4.91189e-07 2.7629 -5.09966e-07 2.33333ZM2.33333 14C1.04467 14 -4.56641e-08 12.9553 -1.01993e-07 11.6667C-1.58322e-07 10.378 1.04467 9.33333 2.33333 9.33333C3.34928 9.33333 4.21358 9.98263 4.53389 10.8889L13.2222 10.8889C13.6518 10.8889 14 11.2371 14 11.6667C14 12.0962 13.6518 12.4444 13.2222 12.4444L4.53389 12.4444C4.21358 13.3507 3.34928 14 2.33333 14ZM1.55556 11.6667C1.55556 12.0962 1.90378 12.4444 2.33333 12.4444C2.76288 12.4444 3.11111 12.0962 3.11111 11.6667C3.11111 11.2371 2.76288 10.8889 2.33333 10.8889C1.90378 10.8889 1.55556 11.2371 1.55556 11.6667ZM6.22222 2.33333C6.22222 2.7629 6.57043 3.11111 7 3.11111C7.42957 3.11111 7.77778 2.7629 7.77778 2.33333C7.77778 1.90377 7.42957 1.55556 7 1.55556C6.57043 1.55556 6.22222 1.90377 6.22222 2.33333ZM10.8889 7C10.8889 7.42957 11.2371 7.77778 11.6667 7.77778C12.0962 7.77778 12.4444 7.42957 12.4444 7C12.4444 6.57043 12.0962 6.22222 11.6667 6.22222C11.2371 6.22222 10.8889 6.57043 10.8889 7Z" fill="#555555"/>
  6769. </g>
  6770. <defs>
  6771. <clipPath id="clip0_232_35017">
  6772. <rect width="14" height="14" fill="white" transform="translate(0 14) rotate(-90)"/>
  6773. </clipPath>
  6774. </defs>
  6775. </svg>
  6776. </file>
  6777. <file path="assets/img/ico_square.svg">
  6778. <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
  6779. <rect x="6" y="6" width="12" height="12" stroke="black" stroke-width="2"/>
  6780. </svg>
  6781. </file>
  6782. <file path="assets/img/ico_state1.svg">
  6783. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6784. <path fill-rule="evenodd" clip-rule="evenodd" d="M10.8443 8.36927L11.7727 7.44133C13.2239 5.99014 13.2239 3.63333 11.7727 2.18214C10.3211 0.730953 7.9647 0.730953 6.51352 2.18214L5.58514 3.11052C5.3292 3.36645 5.3292 3.78208 5.58514 4.03845C5.84152 4.29439 6.25714 4.29439 6.51352 4.03845L7.44145 3.11052C8.38033 2.1712 9.90545 2.1712 10.8443 3.11052C11.7836 4.04939 11.7836 5.57408 10.8443 6.51339L9.91639 7.44133C9.66002 7.69727 9.66002 8.11333 9.91639 8.36927C10.1723 8.62564 10.5884 8.62564 10.8443 8.36927Z" fill="#007AFF"/>
  6785. <path fill-rule="evenodd" clip-rule="evenodd" d="M3.11064 5.58453L2.18226 6.51291C0.731075 7.96409 0.731075 10.3205 2.18226 11.7721C3.63345 13.2233 5.99026 13.2233 7.44145 11.7721L8.36939 10.8437C8.62576 10.5878 8.62576 10.1717 8.36939 9.91578C8.11345 9.65941 7.69739 9.65941 7.44145 9.91578L6.51351 10.8437C5.5742 11.783 4.04951 11.783 3.11064 10.8437C2.17133 9.90484 2.17133 8.37972 3.11064 7.44084L4.03858 6.51291C4.29451 6.25653 4.29451 5.84091 4.03858 5.58453C3.7822 5.32859 3.36658 5.32859 3.11064 5.58453Z" fill="#007AFF"/>
  6786. <path fill-rule="evenodd" clip-rule="evenodd" d="M4.96647 9.9158L9.91635 4.96592C10.1723 4.70998 10.1723 4.29392 9.91635 4.03798C9.65997 3.78161 9.24435 3.78161 8.98841 4.03798L4.03853 8.98786C3.78216 9.2438 3.78216 9.65942 4.03853 9.9158C4.29447 10.1717 4.71053 10.1717 4.96647 9.9158Z" fill="#007AFF"/>
  6787. </svg>
  6788. </file>
  6789. <file path="assets/img/ico_state2.svg">
  6790. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6791. <g clip-path="url(#clip0_1016_11493)">
  6792. <path d="M12.5369 11.6457L11.9005 11.0093C11.6459 10.7547 11.264 10.7547 11.0095 11.0093C10.7549 11.2639 10.7549 11.6457 11.0095 11.9003L11.6459 12.5367C11.7732 12.664 11.9641 12.7276 12.0914 12.7276C12.2187 12.7276 12.4096 12.664 12.5369 12.5367C12.7915 12.2821 12.7915 11.9003 12.5369 11.6457Z" fill="#FF2426"/>
  6793. <path d="M8.27283 13.3643C8.27283 13.7462 8.5274 14.0008 8.90925 14.0008C9.2911 14.0008 9.54567 13.7462 9.54567 13.3643V12.0915C9.54567 11.7096 9.2911 11.4551 8.90925 11.4551C8.5274 11.4551 8.27283 11.7096 8.27283 12.0915V13.3643Z" fill="#FF2426"/>
  6794. <path d="M13.3642 8.27344H12.0913C11.7095 8.27344 11.4549 8.52801 11.4549 8.90986C11.4549 9.29171 11.7095 9.54628 12.0913 9.54628H13.3642C13.746 9.54628 14.0006 9.29171 14.0006 8.90986C14.0006 8.52801 13.746 8.27344 13.3642 8.27344Z" fill="#FF2426"/>
  6795. <path d="M12.5368 4.7106C12.5368 3.81961 12.2186 3.0559 11.5822 2.41948C10.9458 1.78306 10.182 1.46484 9.29105 1.46484C8.40006 1.46484 7.63635 1.78306 6.99993 2.41948L5.5998 3.81961C5.34523 4.07418 5.34523 4.45603 5.5998 4.7106C5.85437 4.96517 6.23622 4.96517 6.49079 4.7106L7.89092 3.31047C8.65463 2.54676 9.92748 2.54676 10.6912 3.31047C11.073 3.69232 11.264 4.20146 11.264 4.7106C11.264 5.21974 11.073 5.72888 10.6912 6.11073L9.29105 7.51086C9.03648 7.76543 9.03648 8.14728 9.29105 8.40185C9.41834 8.52914 9.60926 8.59278 9.73655 8.59278C9.86383 8.59278 10.0548 8.52914 10.182 8.40185L11.5822 7.00172C12.2186 6.3653 12.5368 5.60159 12.5368 4.7106Z" fill="#FF2426"/>
  6796. <path d="M1.46313 9.29234C1.46313 10.1833 1.78135 10.947 2.41777 11.5835C3.05419 12.2199 3.8179 12.5381 4.70889 12.5381C5.59988 12.5381 6.36359 12.2199 7.00001 11.5835L8.40014 10.1833C8.65471 9.92876 8.65471 9.5469 8.40014 9.29234C8.14557 9.03777 7.76372 9.03777 7.50915 9.29234L6.10902 10.6925C5.34531 11.4562 4.07247 11.4562 3.30876 10.6925C2.92691 10.3106 2.73598 9.80147 2.73598 9.29234C2.73598 8.7832 2.92691 8.27406 3.30876 7.8922L4.70889 6.49207C4.96346 6.23751 4.96346 5.85565 4.70889 5.60108C4.45432 5.34651 4.07247 5.34651 3.8179 5.60108L2.41777 7.00121C1.78135 7.63764 1.46313 8.40134 1.46313 9.29234Z" fill="#FF2426"/>
  6797. <path d="M2.99056 2.09883L2.35414 1.46241C2.09957 1.20784 1.71771 1.20784 1.46314 1.46241C1.20857 1.71698 1.20857 2.09883 1.46314 2.3534L2.09957 2.98983C2.22685 3.11711 2.35414 3.18075 2.54506 3.18075C2.73599 3.18075 2.86327 3.11711 2.99056 2.98983C3.24513 2.73526 3.24513 2.3534 2.99056 2.09883Z" fill="#FF2426"/>
  6798. <path d="M5.72713 1.90927V0.636423C5.72713 0.254569 5.47256 0 5.09071 0C4.70885 0 4.45428 0.254569 4.45428 0.636423V1.90927C4.45428 2.29112 4.70885 2.54569 5.09071 2.54569C5.47256 2.54569 5.72713 2.29112 5.72713 1.90927Z" fill="#FF2426"/>
  6799. <path d="M1.9086 5.72792C2.29045 5.72792 2.54502 5.47335 2.54502 5.0915C2.54502 4.70965 2.29045 4.45508 1.9086 4.45508H0.635751C0.253898 4.45508 -0.000671387 4.70965 -0.000671387 5.0915C-0.000671387 5.47335 0.253898 5.72792 0.635751 5.72792H1.9086Z" fill="#FF2426"/>
  6800. </g>
  6801. <defs>
  6802. <clipPath id="clip0_1016_11493">
  6803. <rect width="14" height="14" fill="white"/>
  6804. </clipPath>
  6805. </defs>
  6806. </svg>
  6807. </file>
  6808. <file path="assets/img/ico_state3.svg">
  6809. <svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6810. <g clip-path="url(#clip0_1016_11520)">
  6811. <path d="M13.7612 10.0542L9.26811 2.02116C8.92773 1.34038 8.24696 1 7.49811 1C6.74926 1 6.06849 1.34038 5.72811 2.02116L1.23503 10.0542C0.89464 10.6669 0.89464 11.4839 1.23503 12.0966C1.57541 12.7092 2.25618 13.1177 3.00503 13.1177H11.9912C12.74 13.1177 13.3527 12.7092 13.7612 12.0966C14.1697 11.4839 14.1016 10.735 13.7612 10.0542ZM12.6039 11.4158C12.5358 11.4839 12.3997 11.7562 11.9912 11.7562H3.00503C2.66464 11.7562 2.46041 11.5519 2.39233 11.4158C2.32426 11.2796 2.1881 11.0754 2.39233 10.735L6.88542 2.63385C7.08965 2.29346 7.36196 2.29346 7.49811 2.29346C7.63426 2.29346 7.90657 2.29346 8.1108 2.63385L12.6039 10.735C12.74 11.0754 12.6039 11.3477 12.6039 11.4158Z" fill="#F3A14B"/>
  6812. <path d="M7.49809 4.94727C7.08963 4.94727 6.81732 5.21957 6.81732 5.62804V7.67035C6.81732 8.07881 7.08963 8.35112 7.49809 8.35112C7.90655 8.35112 8.17886 8.07881 8.17886 7.67035V5.62804C8.17886 5.21957 7.90655 4.94727 7.49809 4.94727Z" fill="#F3A14B"/>
  6813. <path d="M7.49809 10.3947C7.87407 10.3947 8.17886 10.09 8.17886 9.71397C8.17886 9.33799 7.87407 9.0332 7.49809 9.0332C7.12211 9.0332 6.81732 9.33799 6.81732 9.71397C6.81732 10.09 7.12211 10.3947 7.49809 10.3947Z" fill="#F3A14B"/>
  6814. </g>
  6815. <defs>
  6816. <clipPath id="clip0_1016_11520">
  6817. <rect width="14" height="14" fill="white" transform="translate(0.5)"/>
  6818. </clipPath>
  6819. </defs>
  6820. </svg>
  6821. </file>
  6822. <file path="assets/img/ico_status1.svg">
  6823. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6824. <path d="M9.18375 2.625C9.92722 2.625 10.5299 2.03738 10.5299 1.3125C10.5299 0.587617 9.92722 0 9.18375 0C8.44028 0 7.83759 0.587617 7.83759 1.3125C7.83759 2.03738 8.44028 2.625 9.18375 2.625ZM4.74396 8.68082L4.3289 9.62473H2.45298C1.95742 9.62473 1.55554 10.0166 1.55554 10.4997C1.55554 10.9829 1.95742 11.3747 2.45298 11.3747H4.62505C5.16492 11.3747 5.65093 11.0619 5.86211 10.5793L6.10863 10.0182L5.80939 9.84594C5.32365 9.56621 4.96636 9.15223 4.74396 8.68082ZM12.3248 6.12473H11.09L10.3591 4.66867C10.0085 3.97004 9.36492 3.45926 8.6265 3.27578L6.63307 2.69773C5.8394 2.5118 5.01291 2.6827 4.36592 3.16641L3.25338 3.99793C2.85991 4.29188 2.78531 4.84094 3.08735 5.22457C3.3894 5.6082 3.95226 5.68012 4.34545 5.38645L5.45855 4.55492C5.67365 4.39387 5.94765 4.33617 6.16724 4.38703L6.5795 4.50652L5.52894 6.89609C5.17501 7.70219 5.4922 8.64637 6.26652 9.09207L8.64977 10.4639L7.87938 12.8628C7.7313 13.3238 7.99464 13.8146 8.46748 13.959C8.55694 13.9863 8.64725 13.9995 8.73615 13.9995C9.11784 13.9995 9.47177 13.7596 9.59208 13.3856L10.4794 10.6222C10.6452 10.0543 10.3984 9.44426 9.87253 9.135L8.15506 8.1468L9.03315 6.00633L9.60162 7.13918C9.82597 7.58598 10.3005 7.87445 10.8106 7.87445H12.3248C12.8203 7.87445 13.2222 7.48262 13.2222 6.99945C13.2222 6.51629 12.8203 6.12473 12.3248 6.12473Z" fill="#438DFF"/>
  6825. </svg>
  6826. </file>
  6827. <file path="assets/img/ico_status2.svg">
  6828. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6829. <g clip-path="url(#clip0_119_29807)">
  6830. <path d="M13.7955 1.19499C14.0688 0.921616 14.0688 0.478399 13.7955 0.205025C13.5221 -0.0683417 13.0789 -0.0683417 12.8055 0.205025L11.5473 1.4632C10.3992 0.747552 8.86937 0.888548 7.87179 1.88617L7.12411 2.63379C6.64572 3.11219 6.64572 3.88783 7.12411 4.36623L9.6342 6.87632C10.1127 7.3547 10.8883 7.3547 11.3666 6.87632L12.1143 6.12871C13.1119 5.13107 13.2529 3.60123 12.5373 2.45318L13.7955 1.19499Z" fill="#E1473D"/>
  6831. <path d="M6.09504 6.79654C6.36839 6.52319 6.36839 6.07995 6.09504 5.80659C5.82168 5.53322 5.37845 5.53322 5.10508 5.80659L4.0763 6.83539L3.87129 6.63036C3.66626 6.42533 3.33384 6.42533 3.12882 6.63036L1.88621 7.87294C0.888597 8.87053 0.747601 10.4004 1.46322 11.5485L0.205025 12.8067C-0.0683417 13.08 -0.0683417 13.5233 0.205025 13.7966C0.478399 14.07 0.921616 14.07 1.19499 13.7966L2.45318 12.5384C3.60124 13.254 5.1311 13.1131 6.12871 12.1155L7.37129 10.8728C7.57632 10.6678 7.57632 10.3354 7.37129 10.1304L7.16626 9.92537L8.19506 8.89657C8.46841 8.62321 8.46841 8.17997 8.19506 7.90662C7.92171 7.63326 7.47846 7.63326 7.20511 7.90662L6.17631 8.93542L5.06627 7.82534L6.09504 6.79654Z" fill="#E1473D"/>
  6832. </g>
  6833. <defs>
  6834. <clipPath id="clip0_119_29807">
  6835. <rect width="14" height="14" fill="white"/>
  6836. </clipPath>
  6837. </defs>
  6838. </svg>
  6839. </file>
  6840. <file path="assets/img/ico_status3.svg">
  6841. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  6842. <path d="M13.0766 5.29815H11.5015C11.3121 4.5437 10.9408 3.86512 10.4358 3.31529L11.2749 2.1132C11.3935 1.94357 11.356 1.70704 11.1914 1.58508C11.0266 1.46294 10.7975 1.50175 10.679 1.67119L9.88487 2.80884C9.23989 2.30732 8.45967 1.9833 7.60913 1.91007V0.378439C7.60913 0.169448 7.44472 0 7.24195 0C7.03918 0 6.87478 0.169448 6.87478 0.378439V1.90994C6.01325 1.9836 5.22286 2.31489 4.57228 2.82804L3.76474 1.67119C3.64605 1.50156 3.41675 1.46239 3.25234 1.58508C3.08776 1.70704 3.05029 1.94357 3.1688 2.1132L4.02475 3.33938C3.53037 3.88498 3.16613 4.55451 2.97918 5.29815H1.36717C1.1644 5.29815 1 5.4676 1 5.67659C1 5.88558 1.1644 6.05503 1.36717 6.05503H2.85272C2.84268 6.17969 2.83414 6.30483 2.83414 6.43208V10.2507C2.95381 10.2299 3.07593 10.2166 3.20125 10.2166H11.2791C11.4044 10.2166 11.5266 10.2299 11.6463 10.2508V6.43208C11.6463 6.30483 11.6378 6.17969 11.6278 6.05503H13.0766C13.2793 6.05503 13.4437 5.88558 13.4437 5.67659C13.4437 5.4676 13.2793 5.29815 13.0766 5.29815ZM6.5076 4.54127C5.90019 4.54127 5.40608 5.05054 5.40608 5.67659C5.40608 5.88558 5.24168 6.05503 5.03891 6.05503C4.83614 6.05503 4.67174 5.88558 4.67174 5.67659C4.67174 4.63329 5.49537 3.78439 6.5076 3.78439C6.71037 3.78439 6.87478 3.95384 6.87478 4.16283C6.87478 4.37182 6.71037 4.54127 6.5076 4.54127Z" fill="#E1473D"/>
  6843. <path d="M11.278 10.9727H3.20014C2.39238 10.9727 1.73145 11.6538 1.73145 12.4864C1.73145 13.3228 2.39238 14.0002 3.20014 14.0002H11.278C12.0894 14.0002 12.7467 13.3228 12.7467 12.4864C12.7467 11.6538 12.0894 10.9727 11.278 10.9727Z" fill="#E1473D"/>
  6844. </svg>
  6845. </file>
  6846. <file path="assets/img/ico_step_arr.svg">
  6847. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6848. <path d="M7.5 15L12.5 10L7.5 5" stroke="#D3D3D3" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  6849. </svg>
  6850. </file>
  6851. <file path="assets/img/ico_step_arr2.svg">
  6852. <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
  6853. <path d="M6 9L12 15L18 9" stroke="#AFAFAF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  6854. </svg>
  6855. </file>
  6856. <file path="assets/img/ico_tenant1.svg">
  6857. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6858. <path fill-rule="evenodd" clip-rule="evenodd" d="M6 2C4.34315 2 3 3.34315 3 5V15C3 16.6569 4.34315 18 6 18H14C15.6569 18 17 16.6569 17 15V5C17 3.34315 15.6569 2 14 2H6ZM6 4C5.44772 4 5 4.44772 5 5V8C5 8.55229 5.44772 9 6 9H14C14.5523 9 15 8.55229 15 8V5C15 4.44772 14.5523 4 14 4H6ZM8 12C8 12.5523 7.55228 13 7 13C6.44772 13 6 12.5523 6 12C6 11.4477 6.44772 11 7 11C7.55228 11 8 11.4477 8 12ZM10 13C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11C9.44771 11 9 11.4477 9 12C9 12.5523 9.44771 13 10 13ZM14 12C14 12.5523 13.5523 13 13 13C12.4477 13 12 12.5523 12 12C12 11.4477 12.4477 11 13 11C13.5523 11 14 11.4477 14 12ZM7 16C7.55228 16 8 15.5523 8 15C8 14.4477 7.55228 14 7 14C6.44772 14 6 14.4477 6 15C6 15.5523 6.44772 16 7 16ZM11 15C11 15.5523 10.5523 16 10 16C9.44771 16 9 15.5523 9 15C9 14.4477 9.44771 14 10 14C10.5523 14 11 14.4477 11 15ZM13 16C13.5523 16 14 15.5523 14 15C14 14.4477 13.5523 14 13 14C12.4477 14 12 14.4477 12 15C12 15.5523 12.4477 16 13 16Z" fill="#438DFF"/>
  6859. </svg>
  6860. </file>
  6861. <file path="assets/img/ico_tenant2.svg">
  6862. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6863. <g clip-path="url(#clip0_232_29872)">
  6864. <path d="M16.7882 6.82923C16.7882 6.68124 16.7096 6.60724 16.6309 6.53325L10.259 3.0555C10.1804 2.9815 10.023 2.9815 9.8657 3.0555L3.41514 6.53325C3.33648 6.60724 3.25781 6.68124 3.25781 6.82923C3.25781 6.97722 3.33648 7.05121 3.41514 7.12521L9.78703 10.603C9.8657 10.603 9.94437 10.677 9.94437 10.677C9.94437 10.677 10.1017 10.677 10.1017 10.603L16.4736 7.12521C16.7096 7.05121 16.7882 6.90322 16.7882 6.82923Z" fill="#8998B1"/>
  6865. <path d="M8.92255 12.379L2.55066 8.9012C2.39333 8.8272 2.236 8.8272 2.15733 8.9012C2.07867 8.97519 2 9.12318 2 9.19718V16.1527C2 16.3007 2.07867 16.3747 2.15733 16.4487L8.52922 19.9264C8.60789 19.9264 8.68655 20.0004 8.68655 20.0004C8.68655 20.0004 8.84388 20.0004 8.84388 19.9264C8.92255 19.8524 9.00121 19.7784 9.00121 19.6304V12.6749C9.15855 12.5269 9.07988 12.4529 8.92255 12.379Z" fill="#8998B1"/>
  6866. <path d="M17.8874 8.9012C17.8087 8.8272 17.6514 8.8272 17.4941 8.9012L11.1222 12.379C11.0435 12.4529 10.9648 12.5269 10.9648 12.6749V19.6304C10.9648 19.7784 11.0435 19.8524 11.1222 19.9264C11.2008 19.9264 11.2795 20.0004 11.2795 20.0004C11.2795 20.0004 11.4368 20.0004 11.4368 19.9264L17.8087 16.4487C17.8874 16.3747 17.9661 16.3007 17.9661 16.1527V9.19718C18.0447 9.12318 17.9661 8.97519 17.8874 8.9012Z" fill="#8998B1"/>
  6867. <path d="M5.25 4.65957V5.00974L5.51846 5.23457L7.51283 6.90478C8.06164 7.3644 8.56208 7.78242 8.92631 8.08572C9.10832 8.23728 9.25685 8.36064 9.36058 8.44635C9.41223 8.48904 9.45388 8.52331 9.48335 8.54732C9.49769 8.559 9.51133 8.57004 9.52253 8.57893C9.52742 8.58281 9.53608 8.58964 9.54566 8.59686C9.54931 8.59961 9.5608 8.60826 9.57553 8.61834C9.58147 8.6224 9.59973 8.63486 9.62409 8.64896C9.63526 8.65543 9.66153 8.67034 9.69665 8.68588C9.6967 8.6859 9.69685 8.68597 9.69709 8.68608C9.7056 8.69012 9.83179 8.75 10.0001 8.75C10.1685 8.75 10.2947 8.6901 10.3032 8.68606C10.3034 8.68595 10.3036 8.68588 10.3036 8.68586C10.3388 8.67032 10.365 8.65541 10.3762 8.64894C10.4006 8.63483 10.4188 8.62237 10.4248 8.61831C10.4395 8.60822 10.451 8.59957 10.4546 8.59682C10.4642 8.5896 10.4729 8.58276 10.4778 8.57888C10.489 8.57 10.5026 8.55896 10.5169 8.54727C10.5464 8.52326 10.5881 8.48899 10.6397 8.44629C10.7434 8.36057 10.892 8.23719 11.074 8.08561C11.4382 7.78228 11.9386 7.3642 12.4873 6.90453L14.4816 5.23411L14.75 5.00928V4.65916V3.59742C14.75 3.30275 14.7481 3.03318 14.745 2.83568C14.7434 2.73773 14.7415 2.65346 14.7392 2.5915C14.7381 2.56211 14.7366 2.52922 14.7343 2.49983C14.7335 2.48819 14.7312 2.45948 14.7261 2.42646L14.726 2.42602C14.7241 2.41402 14.7172 2.36922 14.7004 2.31504C14.6936 2.2931 14.6711 2.22163 14.6211 2.14087L14.6202 2.1395C14.5972 2.10214 14.4018 1.78567 13.9832 1.78567C13.8159 1.78567 13.6904 1.84476 13.6808 1.84927C13.6805 1.84941 13.6803 1.84949 13.6802 1.84953C13.6449 1.86509 13.6185 1.88008 13.6071 1.88666C13.5823 1.90097 13.5636 1.91373 13.5571 1.91817C13.5412 1.929 13.5283 1.93873 13.5227 1.94288C13.5094 1.9529 13.4955 1.96387 13.4838 1.97311C13.4591 1.99272 13.426 2.01946 13.3872 2.05114C13.3087 2.11516 13.1977 2.20657 13.0631 2.31805C12.7934 2.54135 12.4245 2.84872 12.0212 3.18642C11.9136 3.27661 11.8087 3.36415 11.7078 3.44817C11.707 3.17988 11.7062 2.86394 11.7054 2.49186L11.6997 -0.00170481L11.698 -0.75H10.9497H10.0112H9.07263H8.32432L8.32263 -0.00169833L8.31696 2.50123C8.31611 2.87734 8.31533 3.1963 8.31448 3.46683C8.21015 3.37994 8.10157 3.28927 7.98993 3.19577C7.58365 2.85551 7.21195 2.54581 6.94024 2.32082C6.80459 2.20849 6.69281 2.1164 6.61375 2.05193C6.57462 2.02001 6.54136 1.9931 6.51651 1.97339C6.5048 1.96409 6.49083 1.95311 6.47754 1.9431C6.47203 1.93894 6.4591 1.92924 6.44334 1.91846C6.43689 1.91404 6.41823 1.90132 6.39358 1.88704C6.38226 1.88049 6.35588 1.86551 6.32067 1.84993C6.32062 1.84991 6.32047 1.84984 6.32024 1.84973C6.31169 1.84567 6.18533 1.78567 6.01682 1.78567C5.59811 1.78567 5.40279 2.10221 5.37974 2.13956C5.37943 2.14007 5.37914 2.14053 5.37889 2.14094C5.32884 2.22169 5.30636 2.29314 5.29956 2.31509C5.28278 2.36924 5.27586 2.41402 5.274 2.42603L5.27393 2.42648C5.26882 2.4595 5.26655 2.48821 5.26565 2.49984C5.26339 2.52924 5.26191 2.56213 5.26081 2.59152C5.2585 2.6535 5.25659 2.73777 5.25504 2.83574C5.25191 3.03328 5.25 3.30291 5.25 3.59762V4.65957Z" fill="#8998B1" stroke="#F5F5F5" stroke-width="1.5"/>
  6868. </g>
  6869. <defs>
  6870. <clipPath id="clip0_232_29872">
  6871. <rect width="20" height="20" fill="white"/>
  6872. </clipPath>
  6873. </defs>
  6874. </svg>
  6875. </file>
  6876. <file path="assets/img/ico_tenant3.svg">
  6877. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6878. <g clip-path="url(#clip0_232_29879)">
  6879. <path d="M16.7882 6.82923C16.7882 6.68124 16.7096 6.60724 16.6309 6.53325L10.259 3.0555C10.1804 2.9815 10.023 2.9815 9.8657 3.0555L3.41514 6.53325C3.33648 6.60724 3.25781 6.68124 3.25781 6.82923C3.25781 6.97722 3.33648 7.05121 3.41514 7.12521L9.78703 10.603C9.8657 10.603 9.94437 10.677 9.94437 10.677C9.94437 10.677 10.1017 10.677 10.1017 10.603L16.4736 7.12521C16.7096 7.05121 16.7882 6.90322 16.7882 6.82923Z" fill="#8998B1"/>
  6880. <path d="M8.92255 12.379L2.55066 8.9012C2.39333 8.8272 2.236 8.8272 2.15733 8.9012C2.07867 8.97519 2 9.12318 2 9.19718V16.1527C2 16.3007 2.07867 16.3747 2.15733 16.4487L8.52922 19.9264C8.60789 19.9264 8.68655 20.0004 8.68655 20.0004C8.68655 20.0004 8.84388 20.0004 8.84388 19.9264C8.92255 19.8524 9.00121 19.7784 9.00121 19.6304V12.6749C9.15855 12.5269 9.07988 12.4529 8.92255 12.379Z" fill="#8998B1"/>
  6881. <path d="M17.8874 8.9012C17.8087 8.8272 17.6514 8.8272 17.4941 8.9012L11.1222 12.379C11.0435 12.4529 10.9648 12.5269 10.9648 12.6749V19.6304C10.9648 19.7784 11.0435 19.8524 11.1222 19.9264C11.2008 19.9264 11.2795 20.0004 11.2795 20.0004C11.2795 20.0004 11.4368 20.0004 11.4368 19.9264L17.8087 16.4487C17.8874 16.3747 17.9661 16.3007 17.9661 16.1527V9.19718C18.0447 9.12318 17.9661 8.97519 17.8874 8.9012Z" fill="#8998B1"/>
  6882. <path d="M5.25 3.34043V2.99026L5.51846 2.76543L7.51283 1.09522C8.06164 0.635603 8.56208 0.217581 8.92631 -0.0857172C9.10832 -0.237277 9.25685 -0.36064 9.36058 -0.446354C9.41223 -0.489039 9.45388 -0.523306 9.48335 -0.547319C9.49769 -0.559005 9.51133 -0.570044 9.52253 -0.578927C9.52742 -0.582807 9.53608 -0.589643 9.54566 -0.596861C9.54931 -0.599613 9.5608 -0.60826 9.57553 -0.618341C9.58147 -0.622405 9.59973 -0.634862 9.62409 -0.648965C9.63527 -0.655433 9.66153 -0.670345 9.69665 -0.685878C9.69671 -0.685902 9.69685 -0.685971 9.69709 -0.686084C9.70563 -0.690135 9.8318 -0.75 10.0001 -0.75C10.1685 -0.75 10.2947 -0.690104 10.3032 -0.686062C10.3034 -0.685949 10.3036 -0.68588 10.3036 -0.685856C10.3388 -0.67032 10.365 -0.655403 10.3762 -0.648933C10.4006 -0.634828 10.4188 -0.622369 10.4248 -0.618304C10.4395 -0.608221 10.451 -0.599573 10.4546 -0.59682C10.4642 -0.589602 10.4729 -0.582764 10.4778 -0.578884C10.489 -0.569999 10.5026 -0.558959 10.5169 -0.547273C10.5464 -0.523255 10.5881 -0.488985 10.6397 -0.446295C10.7434 -0.360569 10.892 -0.237192 11.074 -0.0856133C11.4382 0.217723 11.9386 0.635798 12.4873 1.09547L14.4816 2.76589L14.75 2.99072V3.34084V4.40258C14.75 4.69725 14.7481 4.96682 14.745 5.16432C14.7434 5.26227 14.7415 5.34654 14.7392 5.4085C14.7381 5.43789 14.7366 5.47078 14.7343 5.50017C14.7335 5.51181 14.7312 5.54052 14.7261 5.57354L14.726 5.574C14.7241 5.58602 14.7172 5.63081 14.7004 5.68496C14.6936 5.70691 14.6711 5.77837 14.6211 5.85913L14.6202 5.8605C14.5972 5.89786 14.4018 6.21433 13.9832 6.21433C13.8159 6.21433 13.6904 6.15523 13.6808 6.15073C13.6805 6.15059 13.6803 6.15051 13.6802 6.15047C13.6449 6.13491 13.6185 6.11992 13.6071 6.11334C13.5823 6.09903 13.5636 6.08627 13.5571 6.08183C13.5412 6.071 13.5283 6.06127 13.5227 6.05712C13.5094 6.0471 13.4955 6.03613 13.4838 6.02689C13.4591 6.00728 13.426 5.98054 13.3872 5.94886C13.3087 5.88484 13.1977 5.79343 13.0631 5.68195C12.7934 5.45865 12.4245 5.15128 12.0212 4.81358C11.9136 4.72339 11.8087 4.63585 11.7078 4.55183C11.707 4.82012 11.7062 5.13606 11.7054 5.50814L11.6997 8.0017L11.698 8.75H10.9497H10.0112H9.07263H8.32432L8.32263 8.0017L8.31696 5.49877C8.31611 5.12266 8.31533 4.8037 8.31448 4.53317C8.21015 4.62006 8.10157 4.71073 7.98993 4.80423C7.58365 5.14449 7.21195 5.45419 6.94024 5.67918C6.80459 5.79151 6.69281 5.8836 6.61375 5.94807C6.57462 5.97999 6.54136 6.0069 6.51651 6.02661C6.5048 6.03591 6.49083 6.04689 6.47754 6.0569C6.47203 6.06106 6.4591 6.07076 6.44334 6.08154C6.43689 6.08596 6.41823 6.09868 6.39358 6.11296C6.38226 6.11951 6.35588 6.13449 6.32067 6.15007C6.32062 6.15009 6.32047 6.15016 6.32024 6.15027C6.31169 6.15433 6.18533 6.21433 6.01682 6.21433C5.59811 6.21433 5.40278 5.89779 5.37974 5.86044C5.37943 5.85993 5.37914 5.85947 5.37889 5.85906C5.32884 5.77831 5.30636 5.70686 5.29956 5.68491C5.28278 5.63076 5.27586 5.58598 5.274 5.57397L5.27393 5.57352C5.26882 5.5405 5.26655 5.51179 5.26565 5.50016C5.26339 5.47076 5.26191 5.43787 5.26081 5.40848C5.2585 5.3465 5.25659 5.26223 5.25504 5.16426C5.25191 4.96672 5.25 4.69709 5.25 4.40238V3.34043Z" fill="#8998B1" stroke="#F5F5F5" stroke-width="1.5"/>
  6883. </g>
  6884. <defs>
  6885. <clipPath id="clip0_232_29879">
  6886. <rect width="20" height="20" fill="white"/>
  6887. </clipPath>
  6888. </defs>
  6889. </svg>
  6890. </file>
  6891. <file path="assets/img/ico_tenant4.svg">
  6892. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6893. <path d="M13 6C13 7.65685 11.6569 9 10 9C8.34315 9 7 7.65685 7 6C7 4.34315 8.34315 3 10 3C11.6569 3 13 4.34315 13 6Z" fill="#8998B1"/>
  6894. <path d="M18 8C18 9.10457 17.1046 10 16 10C14.8954 10 14 9.10457 14 8C14 6.89543 14.8954 6 16 6C17.1046 6 18 6.89543 18 8Z" fill="#8998B1"/>
  6895. <path d="M14 15C14 12.7909 12.2091 11 10 11C7.79086 11 6 12.7909 6 15V18H14V15Z" fill="#8998B1"/>
  6896. <path d="M6 8C6 9.10457 5.10457 10 4 10C2.89543 10 2 9.10457 2 8C2 6.89543 2.89543 6 4 6C5.10457 6 6 6.89543 6 8Z" fill="#8998B1"/>
  6897. <path d="M15.9993 18V15C15.9993 13.9459 15.7275 12.9552 15.25 12.0943C15.4895 12.0327 15.7406 12 15.9993 12C17.6562 12 18.9993 13.3431 18.9993 15V18H15.9993Z" fill="#8998B1"/>
  6898. <path d="M4.74926 12.0943C4.27185 12.9552 4 13.9459 4 15V18H1V15C1 13.3431 2.34315 12 4 12C4.25871 12 4.50977 12.0327 4.74926 12.0943Z" fill="#8998B1"/>
  6899. </svg>
  6900. </file>
  6901. <file path="assets/img/ico_time_disabled.svg">
  6902. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6903. <path d="M17 9.5C17 5.35787 13.6422 2 9.5 2C5.35787 2 2 5.35787 2 9.5C2 13.6422 5.35787 17 9.5 17" stroke="#8E8E8E" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6904. <path d="M9.5 5.33331V8.4699C9.5 9.10123 9.85667 9.67831 10.4213 9.96065L12.8333 11.1666" stroke="#8E8E8E" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6905. <path d="M15.3333 12.8333V15.3333M15.3333 15.3333V17.8333M15.3333 15.3333H12.8333M15.3333 15.3333H17.8333" stroke="#8E8E8E" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6906. </svg>
  6907. </file>
  6908. <file path="assets/img/ico_time.svg">
  6909. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  6910. <path d="M17 9.5C17 5.35787 13.6422 2 9.5 2C5.35787 2 2 5.35787 2 9.5C2 13.6422 5.35787 17 9.5 17" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6911. <path d="M9.5 5.33331V8.4699C9.5 9.10123 9.85667 9.67831 10.4213 9.96065L12.8333 11.1666" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6912. <path d="M15.3333 12.8333V15.3333M15.3333 15.3333V17.8333M15.3333 15.3333H12.8333M15.3333 15.3333H17.8333" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6913. </svg>
  6914. </file>
  6915. <file path="assets/img/ico_tit_arr.svg">
  6916. <svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg">
  6917. <path d="M7.125 14.25L11.875 9.5L7.125 4.75" stroke="#505050" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6918. </svg>
  6919. </file>
  6920. <file path="assets/img/ico_tool.svg">
  6921. <svg width="15" height="10" viewBox="0 0 15 10" fill="none" xmlns="http://www.w3.org/2000/svg">
  6922. <path d="M14.5 0H0.5L7.5 10L14.5 0Z" fill="#438DFF" fill-opacity="0.7"/>
  6923. </svg>
  6924. </file>
  6925. <file path="assets/img/ico_trash_nw.svg">
  6926. <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
  6927. <path d="M11.5454 17.2724H6.45452C5.61065 17.2724 4.80134 16.9372 4.20464 16.3405C3.60793 15.7438 3.27271 14.9345 3.27271 14.0906V6.45423C3.27271 6.28546 3.33975 6.1236 3.45909 6.00426C3.57843 5.88492 3.74029 5.81787 3.90907 5.81787C4.07784 5.81787 4.2397 5.88492 4.35905 6.00426C4.47839 6.1236 4.54543 6.28546 4.54543 6.45423V14.0906C4.54543 14.5969 4.74657 15.0825 5.10459 15.4405C5.46262 15.7986 5.9482 15.9997 6.45452 15.9997H11.5454C12.0518 15.9997 12.5373 15.7986 12.8954 15.4405C13.2534 15.0825 13.4545 14.5969 13.4545 14.0906V6.45423C13.4545 6.28546 13.5216 6.1236 13.6409 6.00426C13.7603 5.88492 13.9221 5.81787 14.0909 5.81787C14.2597 5.81787 14.4215 5.88492 14.5409 6.00426C14.6602 6.1236 14.7273 6.28546 14.7273 6.45423V14.0906C14.7273 14.9345 14.392 15.7438 13.7953 16.3405C13.1986 16.9372 12.3893 17.2724 11.5454 17.2724Z" fill="#8E8E8E"/>
  6928. <path d="M15.3636 4.54519H2.63636C2.46759 4.54519 2.30573 4.47814 2.18639 4.3588C2.06705 4.23946 2 4.0776 2 3.90882C2 3.74005 2.06705 3.57819 2.18639 3.45885C2.30573 3.33951 2.46759 3.27246 2.63636 3.27246H15.3636C15.5324 3.27246 15.6943 3.33951 15.8136 3.45885C15.933 3.57819 16 3.74005 16 3.90882C16 4.0776 15.933 4.23946 15.8136 4.3588C15.6943 4.47814 15.5324 4.54519 15.3636 4.54519Z" fill="#8E8E8E"/>
  6929. <path d="M11.5455 4.54523H6.4546C6.28583 4.54523 6.12397 4.47819 6.00462 4.35885C5.88528 4.2395 5.81824 4.07764 5.81824 3.90887V2.63614C5.81824 2.12982 6.01937 1.64423 6.3774 1.28621C6.73542 0.928187 7.22101 0.727051 7.72733 0.727051H10.2728C10.7791 0.727051 11.2647 0.928187 11.6227 1.28621C11.9807 1.64423 12.1819 2.12982 12.1819 2.63614V3.90887C12.1819 4.07764 12.1148 4.2395 11.9955 4.35885C11.8761 4.47819 11.7143 4.54523 11.5455 4.54523ZM7.09096 3.27251H10.9091V2.63614C10.9091 2.46737 10.8421 2.30551 10.7228 2.18616C10.6034 2.06682 10.4416 1.99978 10.2728 1.99978H7.72733C7.55855 1.99978 7.39669 2.06682 7.27735 2.18616C7.15801 2.30551 7.09096 2.46737 7.09096 2.63614V3.27251Z" fill="#8E8E8E"/>
  6930. <path d="M7.72731 13.4543C7.55853 13.4543 7.39667 13.3873 7.27733 13.2679C7.15799 13.1486 7.09094 12.9867 7.09094 12.818V8.36341C7.09094 8.19464 7.15799 8.03278 7.27733 7.91344C7.39667 7.7941 7.55853 7.72705 7.72731 7.72705C7.89608 7.72705 8.05794 7.7941 8.17728 7.91344C8.29662 8.03278 8.36367 8.19464 8.36367 8.36341V12.818C8.36367 12.9867 8.29662 13.1486 8.17728 13.2679C8.05794 13.3873 7.89608 13.4543 7.72731 13.4543Z" fill="#8E8E8E"/>
  6931. <path d="M10.2727 13.4543C10.1039 13.4543 9.94208 13.3873 9.82274 13.2679C9.7034 13.1486 9.63635 12.9867 9.63635 12.818V8.36341C9.63635 8.19464 9.7034 8.03278 9.82274 7.91344C9.94208 7.7941 10.1039 7.72705 10.2727 7.72705C10.4415 7.72705 10.6034 7.7941 10.7227 7.91344C10.842 8.03278 10.9091 8.19464 10.9091 8.36341V12.818C10.9091 12.9867 10.842 13.1486 10.7227 13.2679C10.6034 13.3873 10.4415 13.4543 10.2727 13.4543Z" fill="#8E8E8E"/>
  6932. </svg>
  6933. </file>
  6934. <file path="assets/img/ico_tree_add.svg">
  6935. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  6936. <rect x="0.5" y="0.5" width="15" height="15" rx="4.5" fill="#5E81A5"/>
  6937. <rect x="0.5" y="0.5" width="15" height="15" rx="4.5" stroke="#3E6994"/>
  6938. <path d="M8 4.5V11.5" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6939. <path d="M4.5 8H11.5" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6940. </svg>
  6941. </file>
  6942. <file path="assets/img/ico_tree_arr.svg">
  6943. <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  6944. <path d="M3 7.5L6 4.5L9 7.5" stroke="#515A64" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  6945. </svg>
  6946. </file>
  6947. <file path="assets/img/ico_tree_save.svg">
  6948. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  6949. <g clip-path="url(#clip0_750_9391)">
  6950. <circle cx="8" cy="8" r="8" fill="#007AFF"/>
  6951. <g clip-path="url(#clip1_750_9391)">
  6952. <path d="M10.6667 12V8.44444H5.33333V12H4.44444C4.32657 12 4.21352 11.9532 4.13017 11.8698C4.04683 11.7865 4 11.6734 4 11.5556V4.44444C4 4.32657 4.04683 4.21352 4.13017 4.13017C4.21352 4.04683 4.32657 4 4.44444 4H10.2222L12 5.77778V11.5556C12 11.6734 11.9532 11.7865 11.8698 11.8698C11.7865 11.9532 11.6734 12 11.5556 12H10.6667ZM9.77778 12H6.22222V9.33333H9.77778V12Z" fill="white"/>
  6953. </g>
  6954. </g>
  6955. <defs>
  6956. <clipPath id="clip0_750_9391">
  6957. <rect width="16" height="16" fill="white"/>
  6958. </clipPath>
  6959. <clipPath id="clip1_750_9391">
  6960. <rect width="8" height="8" fill="white" transform="translate(4 4)"/>
  6961. </clipPath>
  6962. </defs>
  6963. </svg>
  6964. </file>
  6965. <file path="assets/img/ico_tree1.svg">
  6966. <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
  6967. <g clip-path="url(#clip0_636_6511)">
  6968. <path d="M7.6041 0V1.35644H5.12198V2.90327H3.80127V7.71795H2.62749V6.19473H1.83568V7.71795H0V15.9997H16V7.71795H14.1117V6.19473H13.3199V7.71795H12.0982V2.90327H10.677V1.35644H8.3959V0H7.6041ZM5.91378 2.11214H9.88517V2.90327H5.91378V2.11214ZM4.59308 3.66046H11.3048V15.2426H9.43669V12.4352H6.46279V15.2426H4.59462V7.71795H4.59304L4.59308 3.66046ZM1.5202 9.83748H3.07288V10.5947H1.5202V9.83748ZM12.8761 9.83748H14.4288V10.5947H12.8761V9.83748ZM1.5202 11.4803H3.07288V12.236H1.5202V11.4803ZM12.8761 11.4803H14.4288V12.236H12.8761V11.4803ZM1.5202 13.123H3.07288V13.8787H1.5202V13.123ZM12.8761 13.123H14.4288V13.8787H12.8761V13.123ZM7.25613 13.1924H8.64334V15.2426H7.25613V13.1924Z" fill="#064F9E"/>
  6969. <path d="M5.98206 4.71777C5.98206 5.48563 5.98206 6.25349 5.98206 7.02135C7.26028 7.02135 8.53851 7.02135 9.81673 7.02135C9.81673 6.25349 9.81673 5.48563 9.81673 4.71777C8.53851 4.71777 7.26028 4.71777 5.98206 4.71777ZM6.77513 5.47476C7.52464 5.47476 8.27415 5.47476 9.02366 5.47476C9.02366 5.73844 9.02366 6.00211 9.02366 6.26578C8.27415 6.26578 7.52464 6.26578 6.77513 6.26578C6.77513 6.00211 6.77513 5.73844 6.77513 5.47476Z" fill="#064F9E"/>
  6970. <path d="M5.98206 8.25195C5.98206 9.01981 5.98206 9.78767 5.98206 10.5555C7.26028 10.5555 8.53851 10.5555 9.81673 10.5555C9.81673 9.78767 9.81673 9.01981 9.81673 8.25195C8.53851 8.25195 7.26028 8.25195 5.98206 8.25195ZM6.77513 9.00753C7.52464 9.00753 8.27415 9.00753 9.02366 9.00753C9.02366 9.2712 9.02366 9.53487 9.02366 9.79854C8.27415 9.79854 7.52464 9.79854 6.77513 9.79854C6.77513 9.53487 6.77513 9.2712 6.77513 9.00753Z" fill="#064F9E"/>
  6971. </g>
  6972. <defs>
  6973. <clipPath id="clip0_636_6511">
  6974. <rect width="16" height="16" fill="white"/>
  6975. </clipPath>
  6976. </defs>
  6977. </svg>
  6978. </file>
  6979. <file path="assets/img/ico_tree2.svg">
  6980. <svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
  6981. <g clip-path="url(#clip0_636_6523)">
  6982. <path d="M16 5.164L15.1436 3.836L13.1815 5.18L10.1217 3.604L7.0073 5.204L4.67153 4.004V0.5H3.11436V4.004L0 5.604V11.396L3.11436 12.996V16.5H4.67153V12.004L1.55718 10.404V6.596L3.89294 5.396L6.22871 6.596V11.396L10.1217 13.396L14.0146 11.396V6.532L16 5.164ZM12.4574 10.404L10.1217 11.604L7.78589 10.404V6.596L10.1217 5.396L12.4574 6.596V10.404Z" fill="#5B6C80"/>
  6983. </g>
  6984. <defs>
  6985. <clipPath id="clip0_636_6523">
  6986. <rect width="16" height="16" fill="white" transform="translate(0 0.5)"/>
  6987. </clipPath>
  6988. </defs>
  6989. </svg>
  6990. </file>
  6991. <file path="assets/img/ico_tree3_core.svg">
  6992. <svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" overflow="hidden"><g transform="translate(-584 -486)"><path d="M587.689 487C586.796 487 586.409 487.819 586.081 488.733L585.03 491.763C585.189 491.667 585.347 491.614 585.536 491.614L598.464 491.614C598.653 491.614 598.811 491.667 598.97 491.763L597.928 488.733C597.541 487.85 597.204 487 596.311 487L587.689 487ZM585.536 492.188C585.238 492.188 585 492.454 585 492.772L585 494.505C585 494.814 585.238 495.079 585.536 495.079L598.464 495.079C598.762 495.079 599 494.814 599 494.505L599 492.772C599 492.454 598.762 492.188 598.464 492.188L585.536 492.188ZM597.115 492.772C597.561 492.772 597.928 493.155 597.928 493.634 597.928 494.112 597.561 494.505 597.115 494.505 596.668 494.505 596.311 494.112 596.311 493.634 596.311 493.155 596.668 492.772 597.115 492.772ZM585.536 495.653C585.238 495.653 585 495.909 585 496.228L585 497.96C585 498.279 585.238 498.534 585.536 498.534L598.464 498.534C598.762 498.534 599 498.279 599 497.96L599 496.228C599 495.909 598.762 495.653 598.464 495.653L585.536 495.653ZM597.115 496.228C597.561 496.228 597.928 496.621 597.928 497.099 597.928 497.578 597.561 497.96 597.115 497.96 596.668 497.96 596.311 497.578 596.311 497.099 596.311 496.621 596.668 496.228 597.115 496.228ZM585.536 499.119C585.238 499.119 585 499.374 585 499.693L585 501.426C585 501.745 585.238 502 585.536 502L598.464 502C598.762 502 599 501.745 599 501.426L599 499.693C599 499.374 598.762 499.119 598.464 499.119L585.536 499.119ZM597.115 499.693C597.561 499.693 597.928 500.076 597.928 500.554 597.928 501.033 597.561 501.426 597.115 501.426 596.668 501.426 596.311 501.033 596.311 500.554 596.311 500.076 596.668 499.693 597.115 499.693Z" fill="#5F5F5F" fill-rule="evenodd"/></g></svg>
  6993. </file>
  6994. <file path="assets/img/ico_tree3_ran.svg">
  6995. <svg width="17" height="17" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" overflow="hidden"><defs><clipPath id="clip0"><rect x="709" y="476" width="17" height="17"/></clipPath><clipPath id="clip1"><rect x="-9716.34" y="-0.297457" width="174899" height="155466"/></clipPath><image width="32" height="32" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAE7UExURQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHmF6doAAABodFJOUwABAgMEBgcJCgsMDg8QERYXGhscHiMmKy8wNTY5OkZJSkxQUVNXW11eYGFmZ2hqbG1yc3R1d3p+homMjo+SlaOlqqusrbC2ubq9vsLExsjN0dTX2tvd3uDj5OXn6uzt8/T1+Pn6/P3+UmJq5gAAAAlwSFlzAAAOeQAADnkBYhTeRQAAAfZJREFUOE9tUula4kAQbAS8cBVUvA9EEBF1V/ACVLxPVDxR1KhRtN7/CbZ6Ej/4wPpRVd2dTGZqIiIdJ+PkXzB+0mE0izufMQ3w3SGr2mtjyjSaMAW7l7KOM63+KNVgyjOsi3geEKPveV5t0Z6DltXnHkoMDx4ZxmsrfR6XdRvxXSJPaX3FsCzgSDsWJnUyvbs7rRqBpc8fYUE2kKMbgeWlpEGkabwWRig5bMg2luhmcErmkoT55ClmyEvYlj0s0qVwQO7XOdBPe4AUeRF7UsAyXRxFsvdJ50/6sSLi5GUUmOMm3SDe2yjRD+AjStP2jkHKJrOcNe96ykhSZA6YU02i7KEUMSthfHbRrqDspxTARUX8ZaxQuj4RFrky22m/iJA734C3TprIRTs5hStyGte6K11REri9RUKdlt5rk0nAMgc1OMbaGo7dgoe0Aqr/cO9eQ6j6HQ5/V0NO5bvHX2Na8n1GRTJ6oiIybtmXr7tggxLmReZRcssmDMHuFum2MeQ2GpHDvsq+ud9f4K1AU5YoKnruZkzgRcMU/wsmTKMRBWw5ZsvE3QTGPOa4MSfuRiRwY+JmzDdO3A1gzIHRWDIZGw3UxV1DqIrHL/PH4esRP3HXIaOjyvnh4XlF3U/cNZTsnXjQscH4jt0U90DWnToIZgeMivwH19Bpf87RijUAAAAASUVORK5CYII=" preserveAspectRatio="none" id="img2"></image><clipPath id="clip3"><rect x="0" y="0" width="155465" height="155465"/></clipPath></defs><g clip-path="url(#clip0)" transform="translate(-709 -476)"><g clip-path="url(#clip1)" transform="matrix(0.000102917 0 0 0.000102917 710 477)"><g clip-path="url(#clip3)" transform="matrix(1.00001 0 0 1 0.222656 0.310199)"><use width="100%" height="100%" xlink:href="#img2" transform="scale(4858.28 4858.28)"></use></g></g></g></svg>
  6996. </file>
  6997. <file path="assets/img/ico_tree3.svg">
  6998. <svg width="18" height="17" viewBox="0 0 18 17" fill="none" xmlns="http://www.w3.org/2000/svg">
  6999. <path d="M16.9056 9.44687L14.239 15.4469C14.089 15.7875 13.7806 16 13.4195 16H2.77779C1.79584 16 1 15.1044 1 14V4C1 2.89562 1.79584 2 2.77779 2H6.04169C6.51309 2 6.96531 2.21069 7.29892 2.58594L8.66393 4H12.5556C13.5376 4 14.3334 4.89563 14.3334 6V7H13.0001V6C13.0001 5.72425 12.8007 5.5 12.5556 5.5H8.11115L6.35558 3.64656C6.27225 3.55188 6.16114 3.5 6.04169 3.5H2.77779C2.53279 3.5 2.33334 3.72438 2.33334 4V13L4.31002 8.55312C4.46113 8.2125 4.76946 8 5.10558 8H16.1112C16.7695 8 17.2001 8.78125 16.9056 9.44687Z" fill="#959EA8"/>
  7000. </svg>
  7001. </file>
  7002. <file path="assets/img/ico_trend.svg">
  7003. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  7004. <g clip-path="url(#clip0_301_65348)">
  7005. <path d="M12.4444 11.6473V11.5416C13.3579 11.1607 14 10.2591 14 9.2075V2.52778C14 1.13172 12.8683 0 11.4722 0H4.86111C3.73643 0 2.7833 0.734511 2.45525 1.75H2.29902C1.58942 1.75 0.986168 1.99994 0.570881 2.49168C0.16779 2.96898 0 3.60488 0 4.27778V11.0833C0 11.908 0.297788 12.6497 0.863847 13.183C1.42765 13.7143 2.21147 13.9962 3.11111 13.9962L6.1593 13.9963L9.33046 13.9999H9.33154C10.0907 14.0035 10.8433 13.8441 11.4266 13.4704C12.0326 13.0822 12.4444 12.4637 12.4444 11.6473ZM2.29902 2.91667H2.33333V9.2075C2.33333 10.6036 3.46506 11.7353 4.86111 11.7353H11.2745C11.2499 12.0603 11.0864 12.3028 10.7973 12.4881C10.46 12.7041 9.94926 12.8363 9.33621 12.8333H9.33403L6.1593 12.8296L3.11111 12.8295C2.4552 12.8295 1.97512 12.6272 1.66393 12.3339C1.35499 12.0429 1.16667 11.6198 1.16667 11.0833V4.27778C1.16667 3.78402 1.29054 3.4477 1.46221 3.24444C1.62167 3.05562 1.87627 2.91667 2.29902 2.91667ZM7.0168 2.72223H10.6944C11.0166 2.72223 11.2778 2.9834 11.2778 3.30556V6.98329C11.2778 7.30544 11.0166 7.56662 10.6944 7.56662C10.3723 7.56662 10.1111 7.30544 10.1111 6.98329V4.71385L6.05134 8.77358C5.82353 9.00139 5.45424 9.00139 5.22641 8.77358C4.99861 8.54577 4.99861 8.17648 5.22641 7.94867L9.28612 3.88889H7.0168C6.69457 3.88889 6.43347 3.62772 6.43347 3.30556C6.43347 2.9834 6.69457 2.72223 7.0168 2.72223Z" fill="white"/>
  7006. </g>
  7007. <defs>
  7008. <clipPath id="clip0_301_65348">
  7009. <rect width="14" height="14" fill="white"/>
  7010. </clipPath>
  7011. </defs>
  7012. </svg>
  7013. </file>
  7014. <file path="assets/img/ico_view_del.svg">
  7015. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  7016. <path d="M1.75 3.5H2.91667H12.25" stroke="#EA5555" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  7017. <path d="M11.0832 3.50033V11.667C11.0832 11.9764 10.9603 12.2732 10.7415 12.492C10.5227 12.7107 10.2259 12.8337 9.9165 12.8337H4.08317C3.77375 12.8337 3.47701 12.7107 3.25821 12.492C3.03942 12.2732 2.9165 11.9764 2.9165 11.667V3.50033M4.6665 3.50033V2.33366C4.6665 2.02424 4.78942 1.72749 5.00821 1.5087C5.22701 1.28991 5.52375 1.16699 5.83317 1.16699H8.1665C8.47592 1.16699 8.77267 1.28991 8.99146 1.5087C9.21025 1.72749 9.33317 2.02424 9.33317 2.33366V3.50033" stroke="#EA5555" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  7018. <path d="M5.8335 6.41699V9.91699" stroke="#EA5555" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  7019. <path d="M8.1665 6.41699V9.91699" stroke="#EA5555" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  7020. </svg>
  7021. </file>
  7022. <file path="assets/img/ico_view_list.svg">
  7023. <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
  7024. <path d="M1.3125 5.375C0.587617 5.375 0 5.96289 0 6.6875C0 7.41211 0.587617 8 1.3125 8C2.03738 8 2.625 7.41211 2.625 6.6875C2.625 5.96289 2.03738 5.375 1.3125 5.375ZM1.3125 9.75C0.587617 9.75 0 10.3379 0 11.0625C0 11.7871 0.587617 12.375 1.3125 12.375C2.03738 12.375 2.625 11.7871 2.625 11.0625C2.625 10.3379 2.03738 9.75 1.3125 9.75ZM1.3125 1C0.587617 1 0 1.58762 0 2.3125C0 3.03738 0.587617 3.625 1.3125 3.625C2.03738 3.625 2.625 3.03711 2.625 2.3125C2.625 1.58789 2.03738 1 1.3125 1ZM5.25 3.1875H13.125C13.6082 3.1875 14 2.79566 14 2.33711C14 1.87855 13.609 1.4375 13.125 1.4375H5.25C4.76602 1.4375 4.375 1.82934 4.375 2.28789C4.375 2.74645 4.76602 3.1875 5.25 3.1875ZM13.125 5.8125H5.25C4.76602 5.8125 4.375 6.20352 4.375 6.6875C4.375 7.17148 4.76684 7.5625 5.25 7.5625H13.125C13.6082 7.5625 14 7.17066 14 6.6875C14 6.20434 13.609 5.8125 13.125 5.8125ZM13.125 10.1875H5.25C4.76684 10.1875 4.375 10.5793 4.375 11.0625C4.375 11.5457 4.76684 11.9375 5.25 11.9375H13.125C13.6082 11.9375 14 11.5457 14 11.0625C14 10.5793 13.609 10.1875 13.125 10.1875Z" fill="#4B5A6B"/>
  7025. </svg>
  7026. </file>
  7027. <file path="assets/img/ico_view_list2.svg">
  7028. <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  7029. <path d="M3.33334 5H16.6667M3.33334 10H16.6667M3.33334 15H13.3333" stroke="#8E8E8E" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
  7030. </svg>
  7031. </file>
  7032. <file path="assets/img/ico_wifi.svg">
  7033. <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
  7034. <path d="M6.59094 5.71484L32.565 34.2863" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
  7035. <path d="M2.85718 15.1632C5.0679 12.986 7.68149 11.2601 10.552 10.082" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
  7036. <path d="M8.37671 20.6667C10.566 18.5194 13.3277 17.0484 16.3313 16.4297" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
  7037. <path d="M13.8784 26.1831C15.3424 24.7853 17.2685 23.9735 19.2914 23.9017C21.3142 23.8299 23.293 24.503 24.8524 25.7935" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
  7038. <path d="M17.7902 8.37752C18.3746 8.32882 18.9752 8.31259 19.5759 8.31259C25.8312 8.29575 31.8381 10.7592 36.2804 15.1632" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
  7039. <path d="M26.038 17.4512C27.7974 18.2308 29.4029 19.3194 30.7782 20.6655" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
  7040. <path d="M19.578 34.2866C21.0125 34.2866 22.1754 33.1237 22.1754 31.6892C22.1754 30.2547 21.0125 29.0918 19.578 29.0918C18.1435 29.0918 16.9806 30.2547 16.9806 31.6892C16.9806 33.1237 18.1435 34.2866 19.578 34.2866Z" fill="white"/>
  7041. </svg>
  7042. </file>
  7043. <file path="assets/img/ico-arrow-right.svg">
  7044. <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
  7045. <path data-name="패스 840983" d="m7115.731-18230.381 4.592 4.592-4.592 4.594" transform="translate(-7108.23 18235.881)" style="fill:none;stroke:#191919;stroke-linecap:round;stroke-linejoin:round;stroke-width:2px"/>
  7046. </svg>
  7047. </file>
  7048. <file path="assets/img/ico-check-on.svg">
  7049. <svg xmlns="http://www.w3.org/2000/svg" width="21.055" height="15.556" viewBox="0 0 21.055 15.556">
  7050. <g data-name="그룹 464221">
  7051. <path data-name="패스 46" d="M653.667 1058.331h14" transform="rotate(135 554.548 398.976)" style="fill:none;stroke:#fff;stroke-linecap:round;stroke-linejoin:round;stroke-width:4px"/>
  7052. <path data-name="패스 47" d="M0 0h7.777" transform="rotate(45 -7.31 7.027)" style="fill:none;stroke:#fff;stroke-linecap:round;stroke-linejoin:round;stroke-width:4px"/>
  7053. </g>
  7054. </svg>
  7055. </file>
  7056. <file path="assets/img/img_mode_dark.svg">
  7057. <svg width="70" height="40" viewBox="0 0 70 40" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  7058. <rect width="70" height="40" fill="url(#pattern0_571_2526)"/>
  7059. <defs>
  7060. <pattern id="pattern0_571_2526" patternContentUnits="objectBoundingBox" width="1" height="1">
  7061. <use xlink:href="#image0_571_2526" transform="matrix(0.000529101 0 0 0.000925926 -0.00793651 0)"/>
  7062. </pattern>
  7063. <image id="image0_571_2526" width="1920" height="1080" xlink:href="data:image/png;base64,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e9518104nP7DInocndW9PSnY1akqxm1LvEDYutpXi/LoFi+MJAAeWArpec0x2BQCa47xTZs2ufVKWAt5AACAWAiAkVF0UNE/OKnfdfBSBzRffvkVu+/+B1y1ykMP/Ny+Of1Ud1BR8zptWL/eXn99RWQeiLnfPd/qvYOZjy1a7Pr46+CmlukfsDzMW/a7q1eH3r/u95zZs92BUC1f7RFf9pbBAUxgaGKdBCAbsK4CgMRpbt4RI0a4btCbt2xNewDc7MLaYvczFflR1cqZ2vp50gEH2KRJB9iixUssVTNnTLdVq960VW++aZlGldlq2Y34JkzYyyoqKiJ/v//+Wtu5c2dKt01UQ32Drf3gAxsq1MFg+PDhtnnzZjcogRAYAAAkigAYGUeVLJVd7bK+5e0QrvcOUN7WNUedDkKqMuW446Z5ByiXuN9VsaK573zX3XBTt+V94QsHu6qUWBUrQaqG0cFKVa749wdgaGOdBCAbsK4CgN6p8re6qspKS0vdvLzR2ar+LuhDy19VFzd1BcDtba2WClX8dX9YHVYUaBHdnyrKy23C3hNiXq6w1qfwV50j+hIA6/aP2eIeAXBvjyOov8JAVWJrLmdVApd4nxd057//GggQdNW8axIO9M+aNavH7RPx4rJldveCe20oUdeAYbW1tm37dteWnBAYAAAkggAYGW3fffeNVJL4Orzd4d7mrdOBzS98/vPugKR+f/mVVywRanV4/LHHuqqZ6NaHAMA6CUA2YF0FAOE0v68f5uUXhM+nWVCQ+jybba2tWuF2toD2wmAFwgp0+yody0jE5EMm2wVz5oRe1tDQYGfMPqu3Rdj5582xkSNHhl629v337YEHH+ptEXEfR7T+DANVnapKbgJgs1GjRtpee+1lBx4wyY484nAr90L6XFXW2mYjmpusrKuN+4dl5barcPDn3y0tK7MRXvi7dcsW03TAhMAAAKA3BMDIODro+FLXAUfNIydqZehbvXq1d1oT8/aao05tCh9dtNi1IjznrFmWKFXPzLngQnfQ85yzZruT/lYLRABDE+skANmAdRUAJMYPeBWqFngnhcJ+m2X9rsCvNMXAzy3HL9/1lqV5gPsS3ipALvICn76E0slYtuwld4p27byrbYIX/qlls09BYJi1a9faxo0be5x/5OGH284kpwY497zzbeOmTTZYVHnduGuXweyaq6+2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"/>
  7064. </defs>
  7065. </svg>
  7066. </file>
  7067. <file path="assets/img/img_mode_white.svg">
  7068. <svg width="70" height="40" viewBox="0 0 70 40" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  7069. <rect width="70" height="40" fill="url(#pattern0_571_2523)"/>
  7070. <defs>
  7071. <pattern id="pattern0_571_2523" patternContentUnits="objectBoundingBox" width="1" height="1">
  7072. <use xlink:href="#image0_571_2523" transform="matrix(0.000529101 0 0 0.000925926 -0.00793651 0)"/>
  7073. </pattern>
  7074. <image id="image0_571_2523" width="1920" height="1080" xlink:href="data:image/png;base64,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"/>
  7075. </defs>
  7076. </svg>
  7077. </file>
  7078. <file path="assets/img/img_popup.svg">
  7079. <svg width="82" height="82" viewBox="0 0 82 82" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  7080. <circle cx="41" cy="41" r="41" fill="#85C0FF"/>
  7081. <mask id="mask0_1016_12749" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="82" height="82">
  7082. <circle cx="41" cy="41" r="41" fill="#ACD4FF"/>
  7083. </mask>
  7084. <g mask="url(#mask0_1016_12749)">
  7085. <rect x="16.5654" y="14.9082" width="49.697" height="53.0101" fill="url(#pattern0_1016_12749)"/>
  7086. </g>
  7087. <defs>
  7088. <pattern id="pattern0_1016_12749" patternContentUnits="objectBoundingBox" width="1" height="1">
  7089. <use xlink:href="#image0_1016_12749" transform="matrix(0.00489297 0 0 0.00458716 -0.00397555 0)"/>
  7090. </pattern>
  7091. <image id="image0_1016_12749" width="206" height="218" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAM4AAADaCAYAAADuWH1JAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpBNDU5OUY0RDExMThFNjExQTQzREUxN0FCQkZDQkZCOSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0NDY5NTk2NjU0OTYxMUVGOTNFQTg0Rjg3NEZFNzBDNyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0NDY5NTk2NTU0OTYxMUVGOTNFQTg0Rjg3NEZFNzBDNyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjAyREZGQTlBQjAxOEU2MTFCRENEODNEN0M5QjVGQUYxIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkE0NTk5RjREMTExOEU2MTFBNDNERTE3QUJCRkNCRkI5Ii8+IDwvcmRmOkRlc2NyaXB0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"/>
  7092. </defs>
  7093. </svg>
  7094. </file>
  7095. <file path="assets/img/img_qr.svg">
  7096. <svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  7097. <rect x="3" y="3" width="54" height="54" fill="url(#pattern0_173_15471)"/>
  7098. <defs>
  7099. <pattern id="pattern0_173_15471" patternContentUnits="objectBoundingBox" width="1" height="1">
  7100. <use xlink:href="#image0_173_15471" transform="translate(-0.148148 -0.148148) scale(0.000648148)"/>
  7101. </pattern>
  7102. <image id="image0_173_15471" width="2000" height="2000" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB9AAAAfQCAYAAACaOMR5AAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzcL8heZRyH8Uv3OuNmmSbBqKAigsXJLAb/BMOMihiHZTDBYBFEBC1iN6hxIAgDg0GHSRBBQTDJguB/HDjY2IJhpjfI5p7n/Pa+5/OBp3/D4eaB65y7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIB/2oNDAgAAAABB/197wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDAWZWmjHb0KzaAAAAAElFTkSuQmCC"/>
  7103. </defs>
  7104. </svg>
  7105. </file>
  7106. <file path="assets/img/img_system.svg">
  7107. <svg width="120" height="120" viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  7108. <g clip-path="url(#clip0_71_41430)">
  7109. <rect width="120" height="120" rx="60" fill="#438DFF"/>
  7110. <rect width="120" height="120" fill="url(#pattern0_71_41430)" fill-opacity="0.2"/>
  7111. <rect x="12" y="32" width="97" height="56" fill="url(#pattern1_71_41430)"/>
  7112. </g>
  7113. <defs>
  7114. <pattern id="pattern0_71_41430" patternContentUnits="objectBoundingBox" width="1" height="1">
  7115. <use xlink:href="#image0_71_41430" transform="translate(-0.00374365) scale(0.00253807)"/>
  7116. </pattern>
  7117. <pattern id="pattern1_71_41430" patternContentUnits="objectBoundingBox" width="1" height="1">
  7118. <use xlink:href="#image1_71_41430" transform="matrix(0.00524836 0 0 0.00909091 -0.00121837 0)"/>
  7119. </pattern>
  7120. <clipPath id="clip0_71_41430">
  7121. <rect width="120" height="120" rx="60" fill="white"/>
  7122. </clipPath>
  7123. <image id="image0_71_41430" width="525" height="394" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAg0AAAGKCAYAAACPRXJpAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkQwRDQ1NkY1NjQ0QzExRUZBMEUwRTY3NDVDMUFGMjNFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkQwRDQ1NkY2NjQ0QzExRUZBMEUwRTY3NDVDMUFGMjNFIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RDBENDU2RjM2NDRDMTFFRkEwRTBFNjc0NUMxQUYyM0UiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RDBENDU2RjQ2NDRDMTFFRkEwRTBFNjc0NUMxQUYyM0UiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7IBa3mAAA7sElEQVR42uzdBbRc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"/>
  7124. <image id="image1_71_41430" width="191" height="110" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAL8AAABuCAYAAAB2iMKMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFBMDA4MEI5NjQ0RDExRUZBMzZDQjkzNUIwOEUzRDhBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjFBMDA4MEJBNjQ0RDExRUZBMzZDQjkzNUIwOEUzRDhBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MUEwMDgwQjc2NDREMTFFRkEzNkNCOTM1QjA4RTNEOEEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MUEwMDgwQjg2NDREMTFFRkEzNkNCOTM1QjA4RTNEOEEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7Xj8kzAABdD0lEQVR42ux9B6AcV3X2uTOzfd/b16veU++yii3J3caAC0kMBJxGAiFxCCEQwOEHQkIg1JD81ABJIAm/6QklhGrAuIBxlW3ZlmRZVq+v961T7v3PufdO2X37niQjy4Jo7NG+nZ2dnfKdc79TLxNCwPnl/HKmFsbYSfdpbW2Fd7zjHTBw4gQ0JhxYvn4N9Petg46ODtMwBBOcw9TEqHdw/9Pipz/6AXz98/8NefxeGVcP1+XLV8JrXnMdeF4OFixYCceOPQY7n3gM4lPH4Ykde+GxEx5+dvJztc4/rvPL2V5c1wVSupdedhls3nyhmWtsbvK41+s4lS7P87KCe16qp3+id8Gi45dcfs3gldf8WuFD7/972L5v/xk9j/PgP7+c9SUej8N1110LK1asbKjYlbWu416JwrDZNK1+HDnS3GMIf2e8UrGfEsL7+dXXv/D+Cy7ccOwtb/1r97Yf3Q5niqycB//55awulmXBJz/5SbjgggtaZ2by1zBgv4XCcAmCv5NzLy64wTyDgWGAx0Bsdl1+SWFm5gfZhuy3/v2zn975mj97g73t4e1g22UUggxwpEg4WkClgu/LJXzvnfK5sPOc//xyNjn/m970Jvj4xz/eWCgUbsBdX8OYcSl+J0M4JCBzz0UwO+C5DtIjB5AKcdexjyOovxOLxW/N56cf++Z/f929aOsW6Ozoh2ymiRWLk+LIkf2w75G74T+/9CXYdrB8Hvznl7O/3HjjjXN+1tDQAB/96EfNlpaWS1Bb32IYxg24ZuizWvAT8KUAOBVw7Apuc1EA+FeseOLWpuaOYziGNHHhtXquncXtLo4S4wLE4O6d26ff8va/FQ8//Nh52nN+ObvLwoWL5vzsyiuvII9Oc6VSudI0zYsJ+DRS0ErgV4MGAy6Q9tA2RvTHANwXpYP34H4vMQzLchzvmBUzFuLOi5hhNAoPRQVHBxwhHly5au1dX/3yrfv/+ObXOff8/P7z4D+/nL1lxYp+aZDato0AVtsUuRCwevVK4uddCOiNCOR2psHtg5925MyQwOckFIYSApMOZJrMNIwl8UT6DxLJpI0C0SAET3seM+nbILwKGspbS8V8fyaV/PInPvqh3b/+4t/2BgaHzoP//HJ2ls997vOS3tzy5jdDZXpaaXAgeHLo6ug0yLBFsC/ANV7fRlA0nIVSI98YJo4AVtxKJFPt8XhCfk8atyQwhoEDgJFC4ViF9nKiUi7NLF7UP/HGN/zp8Xe8833BkQ1cE3iskgjfn1/OL2dsefzxXfDoo08ghGPgxdLAE1no7OyBtWs3QSqdMQTnDYjYbIhvoVcuVwl4rvk/rsJfJS0ywbJiOAio0SIQHPpMCpIcLBbi67VoUK+74boXWG2NjWCSvZFkcPGyFDRGEH8e/OeXM74kEgmlwUnLlstQLOahoycN8bhB2pq0v+mDmntesHr+ihqdtDptc9EApqCY46AhzAnghl614GghkYJCwgOCDISlaAWsRPsi9YLLF8LaJQl40XVLoKPFwv3O057zy7O8EIhJI/ct6IUF3V3g8jiCV8QRuBkJfuCRYJXv6fGq3Zzk8XHob0/paW0j+OxIcNrf1QJCniEHj+PidpHGT1txjV10+VbIdGehPDMBY4W8z6rOg//88uwspVJJ8v4L1q1lra1taSTknZ7H2/GjPgTv1ai027mmMlIIuNBAVmAmwNuOjWC2pSAQXmPxOI4oKQS/qXh+ICxqf8dW+9Nx0ASwUFBytuPmfvv33zY1OTXK9+3ZJn76rf+CB3aFHqDzfv7zyxld0uk0bNiwAW677TajsSHbV7GdKxGtlyPUluDHHaZp9iJXb0FQmwRcSXl4hPZojU9AJm1OXD6eTEEmm4N0pkFyfjWyEBWqgF0uQaWCa7mIAlAm0xoNY8tG43ibFUt+J5ZI7TOZMYyW9zGnXBj8yhe/XP6b934ABbRyXvOfX87s8rrX/Tm88pV/ALnGxgW24/wOgv23cfMKkgtJd7Sy9d2bXCjNz+WqOL7jEPVxJS2KJ5OQbWiCdBYNV9PSwTAlMEITeKaPZ5gmmEiLEsl0HEG/yTDj/Sh4EyhQw27F3okCc8fNr/2j+1MNqbHXv/Ftp6f55wtd02df+MIX4fDhxyAWS8Lq1Vugo6MNWptbpYMWuZwYPH7U2/7wz8Tn//lW2HPoBBT1d1/xiuvgiitugJVLVsGe3XfD/ffvAoefgIfu2g4HxuY/p/Mj17m1jI0dgtbWRVnbtl+KFOcWxMVGIuwStNqYVZ4bFnB90Aarg9rerpRRk8uIrswDyjbk5Eq0RzqCZC6PH/215XdcpwyuXZGCFI+nIJnGESKm95f2gM1xVJh27MpDaBP8R2ND5od/+mdvnj5jmp8uiCT2ggu24Hqh2dLS3oQX0Icn14NSnOY8Vlm2cvXg6jXrjlx/w2+OfezDH3M/+4WvnEfLr9gyPFyAXM7tQnBfhesKFAAZ6+JC8XrS1h4apaZhoZKMAYsZAX4sx5IGLfF60uyxRFJqfAK+r3jphen9uXaP+sJkmTH5nVg8iaOApY1f6RI1TIM1cRMux1FmDAVz32v+5JXbzyjtWbx4EVx++RWpcrm02nXd5+NpXiLTVHHIQ6G3UVqPF8qlhzINjXe87x8/+MSytWvyb3v7O2VGnhzqcCcp/Wi8CIOfR9Iv4dLd1UO+/D4E3Ep8mwkQq0FKYOUex024ItB9Dq98/PhZzNOGMEgDlwQEZJBMuXiCHCASJE8ZvUEcgP5jphSeMLgm3UI+PcowJjaWS6U1a1avfPKMgZ943uWXX56y7crFeOF/gCeN4Bc9nJsJ7hk49NCJiXV4xpvQkFlbmLa/evMf/eHdhXxhamjkACxduhw6u7tRADbB+ASDfQfugVLxPJh+2RYrZpEh24pKrwU5tazKItySFvbpCoHXJHe81uA+//dXn0ZLbS+xy0PgR+MCXK/6vZB5QTw4jm8b+MKiRgKvFQ+2AJVt8rTA/+53v6f+BVsm/PEf/xHxurU4bL0K1xfj5lbJ6VA6KT+bqauICcvrxRP5NU942cnJcf7a1/7J3WYs5SQSyYyLJ9SzYIG3afM1hZHhlxVS5kf4v3/lf84j6pdokVmZVG0oVTs9cyY5vczU1BydjFsyTGWAiimtTMCUmZzkAZI5+UwJi2eG7k3BQ3eoF4LezwA18LgxaSwjc0Djl4xm/3OyCaQrVHCDGBaKBzst8Le3p0DlH/kZeGrZuHErdHV1taChcg1a989H8LeGmXp4IS5KI2Xn4crpok2jATdcgR8XAMymeDyJlFAsxu+0onHi4MkeaG3t3fbBj3xsd66zt/iRj336PKp+WTj/wFG3t3/pUTQud6HS60KdlyCujzSYUWoyMgOl3RH4CGqGtIeQHcNnbuLnAhUg6kuKkDEXFGOXhi9JAxceI0BTMEutNvNBTe+ZycEql5H7W/LY0h1qV6QL1HFKwF2bEkWP4aGOoh1ROS3wd3dbEQOX61eA/v5OisL1Iui34trtZ+rpPVHGyIjRWXpGkKaaY4b1wmQqvToWi1sUkfMMJ0VETnjuqG2X73Vs70t/9dY337t/3/7i/3z3h+eR9Uuw/OfnPiP+6oMf31cq5r+IGN6NqjeLIETQOgR+Ju05xA6BVnDXisUTWXzf7Nh2gwS/5+URMdNooxZQICoEB6RSCCeENucEfkMVudiMRhGZ60/BMI94tQsU35IWLv5PAoe/wygegKMBSVwFsbevoTH74JNP7imfFvhvueXDsGXLFny9BSYnJyTwyWBpaOgk6e3G3+zH3eJRPy7zHbG+S1TbP5ScZMWTLUh3Wiw0auiGEDUSpksZfDn8uMV1UAe47thb//KNj912+928UlYVOq1JgBn808a/H98LUCzD2qkZ+AR+/WqULUvKnRH5WVF9Dv4m+Y+AQIirfbc1+5/M/mbz/JY+Ng/+qectq+UPc+8jqTCb57xY5Af9bADOqo4jeTEdx1O7IWNA7SkVMgJJyO4HlEtDTBqVrfzbJTe8B3scV7znb/7U+nq963jPxz4LixYunbz+JS+7S5jWQ/hFC4UAQU+pCsi5URuTOStcGwm6awiIJxC4Wc8ppz3EOp5Y0TTMEt7Disddt+g5oskyWRlBb+IJx2ImQksmvzEaUVjCBI4odhzCW0xmf5KQkCMJYnQ43N+wgJt0ycJDpVs4fOTozN/83Qf5aYH/yJET0Nc3hpo7AclkGsrlMShN2URniO9nqfjYN2J8C1wFMfwMPS8MUOD5E5czrZgMTghPtaUQYYZeM65XliuVbUuXLdn3/C0bpu+/90FYdVEnJEfH4b6DjjwnZFRdM3n4Pn5tITmIhKEAwQzFN+m49N6IU8q3NqBoUI2HwK8SAANmAefUfL2+ZM8WmKg8nHJYwpgNbFEruNHXcJxVP+afP4HeELOBr50gmpKjZtQJlVz4iZXybw98gUCA2QyBzNdyT3ztvZ+0X/6uv4j/d+1pk9dOL2W9npGl8QyOTktWA2x7+MbTj/CScesbJc3NOWhdshgBbBKwpWVCN4ocu56mRipk7cpVZudJzuYqOMiKHQN8PzCP5HcImavNO/Agy1C2shdvWjlt28dg0ZpGeOr24eCZj43Dq1EjLaTn7HZMw6HsDuis9ED6cDeYnRU43Lgbck4r5I4tAGhy4UjTbshW0tA0sAQFJA1+npQUiiiYWDWwTgm0tVq/RhDEHMepe2wx909UfcbqaH8vej7qwkRUwPV7CXw3FADUpaiomQI9vnoUdfWUYNAh5WjgMT8o9QHc9N+/1J6p0/0CRd8aGxthCYI+l8ul8O424OZOIL8uan8cWcDVdzhwRzmSo8nkI0fyMw+FKAEGan3y9apEJV9AQh6HwhOjEaBUKmd/+0//DC5+0Q2we+ddsOeO/eBI0kOaBrbKQyQE3Nt+BxxNPAGGnYRLxl4G4y0HYHfD/XgeDC6b+D0oNw/AQ823AY2TlxZfCQuPr4BEhqnAiXES0InTHAHAH4HC73NfIPjsY6sU3WdAs2oEYO7zFAH1ETQiErCFD3of+KGWl146T/1Nqgqps6RDyNNxH/o+7/6ld8uezs6pVAqWLl0KF6xbZ6EG70cQb8Uh9AKkO4tQ6a/DW9geJCsFOdquAr42Tki7k52QymSR7SWVkARa3xcAclep7DzDjC0xrMRVHR1tzd3dy0a3XnT1yEXrf23mDX/512LHrt304DNKazMokYcNhY+j4TPooFFFnFBSCBcGkHNaeGyJPcOBERSyDnxvuES7cBcNHgLrXPgRpxp3iwLT9enHbBpfdTwxD3D5HEJoVAuZ4OGPC1/aAhrHglFDaBuA62CS0vQa6J4SBtcz8D2X7z1fSAj4JAB0j7nw/leB/xWveAW8613vMvCmLcOb+3toPNyIr1RITElLccotUj5bFVTwlItL5WbbvsaPQaYhJ1fLisuHpGiUCmREk5Ri8YSVSGY2WLFEM24esO3yERSgB9du2HT3l7/4bwdf+rJXeBQUJIVm4UBw+fD18FimCVipH7rHu6EpgwOSmwCRb4Ge0V5otvrBQw3nTmeg83g3/r6BD1cAGVIy5iIilMGYw/g05jZaazl79Pvcixip3jyU5iTgDwSAacHyj+nUG4FC7uYHjxTXV5rf5/geCzU+jQCk5UnzO1oA1HZXjQgcdHUVFeoWaoSepKYCcPwxsIeOgp3uhXRLq/T2wf573gIH7/1z3rL8J07rxtfS8RNNjaisKB8f/168Xkova1t4boL/T17zGjR4+5pcx7mWsvV0CJv5AQd58kw1JuJkzJpK81IuB4GZVkpLzTY2QTyutL6n72gQosb7ZOF+LB7HkaYB4sl0Dn/iAs911qIdUMbncUmxkO9a0Nvzxb9799sP67pncCmHYrgBtjgvhAqCwkrjxmEGGwZegCMAhxgSNJgwYN3QC6FkC0gmFIKk5GglyaK0QwOUmTWAPVV9J2q8LZ4yImcJhjc/+KVxbtYXGFFvpKmiP2L2KBE4JJhWUuq8PC/k9SQAUeDLYBJoh4XnCxANN9Zs8JsWSXpcKTJh28OHoVxyIH10x+sQAUu8oQM3j8PqDyRa248k4zHkrfqkdTT3nNX8C/u6yJ/fhzz9CjRCKSjFVMW9GhLpZhHwY7rAWCYrxSx8eIZMZKJko3Q2Cwn8HNRXNQUWQb0mbaQ4AGXlxRIpfE1IewB5O6VrpE0Ga7gBN87MzOx+/tVXDT58KKQXBBIT72da33pOgoR/x4WhDHDyw6LMxZIa9FBt+PncX/ig9SIgtvSr//fJhIBXv3IR8Sa5EUCyENhz0h7tsToVcEgKZImqcr3gPITyhoVUk0kaIykPfsB9muOpEYE6KCgayyX46VXo+lo5klTyNaMd3vzJIyv4E9/7KqtUDHPhFa+L55ofs6aPvhRcHI7xgpnnmPHC0Rc3X7D8U0ZhLOcdfOQtzIqXWP/qf0TweOcs+DPZnIlGaA+iZBFF7khVyv8iORR0SJlYZOh8bc+UedixuJBuzZgV009cJznx0D7wvT0yU08mKRnByO1n7wn5+PhiXNfivnf7oQSuaQAZv7wGcEJ7PDweAZEhQu+LxyK4YkrbuzUXb0eMUx7h66yecRzmq1ThT35PyGCfdGXa4qRAPqVBxlPXUytws/cTgXFMLULUcwO9cundcSu+MCijF6TNJjRN8vPuFdcc3nZPtZ1jxCEx9sRv5mYGLySfOztw10+4lTgGxamVdMEUyTFiMWgp7vy/8PjM1e70+CqYGV6HoIJytnO/13vB1zJNvecm+BPxOHNdO4XaPcm110IWIGhvjtQKCG7p1wf/5roy38MHb5CRp7W97wZVxq6f+ETGrsrzMFF4VBcvN8jhxv1TeLwWfBCJwIXHtZsdQdXVAdDYqIohQHNbxrRxR4FAU1QHnUQd2nEybs+MOdEZBJRkgAGUujUgKL6oEggvZAz1BIk+N0weHrNO7IG74XbGRP3j09UZ1SOMKrMVoZIgGuqo/ZwylyM5/Ted5/DUHgGFUhz1HQ8yJZ+eCn9Leo5QY5SGUtsuRAHqaLYoNyeDB0LgE+Vl+nwo3sKTYmDvTVLRxJJQninCnrsfvCl3/aKvLVt+jmr+kZER3tLaMoLG62HkIH14E2J+/oRdqQQazzQYNVKx8DOT8ips2+aUsEH/UTzMd0t4SnCYq+s1HSc0jHGcYLFySSdFeZQTwuxKCVxbNiMdY8ToDbPCNS1hGhjZNEB3pwdh8hGr8o2LWm7MIlz8NBey71UibSSI5L+X1Mms4eHGvByJEk+YjLzWSoEZ7ifUhYo5ORAL92PV/tAqV6osIGd6jdgCZD+5eM9xVPIERXcFNDUyKOYrsH2HB4mkpVyj+NlFl24OFIE7dACGpgpwOL72gT0PP7a/s9lbqkZRS8rc1ISDGOGQy1myi4ODIwPdeJLVp3ZPw4nJmUuatwxR24fKOQn+b33rG/wNr3/znsmJ0S/jxT+Jmj3tqvx7RhU4ypByiUgmEOQ5W+ZrlJnreQX8bMY0Y0UafNEeIkJjkCzIhCeHcj50AhLtj8SThl3cXyYvIfgN9XkJtX6FdOCJWDz2M5SCvHDx/hnKWJUJglqDCiPk5QJqAlkRuhJkOJByVsmEShhM9X2DCdk+r75Ny6oBH8ZYNb2IbGf1OH1NGFkonn2ysC/RuPpCUuMWhXlsCC34vsb3HQdS2zvKfnOJBjmUgYnbBCkgSllWN5hiJ+T6VqdlgkjFoAHKsKi1yfCmm223OIpP2EQh4rDtZxOwc1cZKo4HzW1xuOqaJujpjiu3Kolh2eXdW5//bx0rllcAzlHN/653vQ/Wr1k+smHjxd9HQP/UENyMkyI3EKBmRUcPpRcnVqmU0+XCTIaCYjgOlBKJRAmVvk1E0sabm44nDIty3cCR7J4AlMeHWUbAJ9E4TiF9iscYk30aPY40HGFkUY1mXJiGUULKNPXhj3+qcs3Lv6BzvvEZ4NVMzQAcHzChoQEfnkytqAa9qJPLI+b+owrm4iSu/dnB4fB7TFMDmb8UCAurnwwUDZaJ2QIg5vpOrQAY6rdknpMbCotv6wgQYaqDBr7nKg+PK3WYssVmih48uZ+cCWgAO1xqBkZZP54ItAUffOpmGNzxMlYpLrUqxZUClN23/6Fx2PPgODjNLSPJnqYnJ/OVxh/9aHLTTb/ZDOm0JfNTlq7rmoqvbHwqPfH0QoD1h88W+H/puzd843b4EQL8OpnSorU1MBWsIZdnkKDl+MGdiNar8b0Ht8I8DZdmPb/+XArXrRaOk6U6BIYzE1WJadVPUCc0ae7nc/7aNvVe5Ps8TLMP/PbqVRd+eCoXy3WE9uK5Mj1f9sz0FF3Cez3+8Rd+t1WB38vAkW2HuV1q5TK5SmUVctT6j37tCAz2r/ty4yVb3+YkzROm67D88dGXbIQdn+1r89od7aQQtoPKLXE0+eYv9p+z6Q3n2lIq1AePr80IC6bQN1i7+gKOa1QDvgqM5vwu/Hm9L6ImNqAFgwYxg3nQ0bAXOhr3QUN8WDoJZsodMJRfBsPTK1DmzGqe7vn+84gHSLvE5WfamJYjQuT3qIwCzDBOYIqgE6CKZ3AVGBN+ugMB3jUk7SJK4zlMCYWw1Hb822Zc2i3cVRd4MJ+Qp4af2XwMBnsT0JpKmDJwKEdbGuEX9Dy+9tW/9eryTN6dnp6A1vZG0blp4f8knxh4ozt5/Boarul8qE4Xj5M7Z2nPubgwXToQ6WkaPGA/iavuqlHMotr2VPzop7CPT8VrUyUWtT4C67p/CG3ZgxCmVap0AVK9wzNL4ImBF8ORqS1hgCuSwuDHBYJzr/HeRDNBKf4kIna/DJQ5Gvim0vyGvE9CenRkFixIT4z0LskfIJB7Snsw361No5GpwL2vnJOnY8Xjzn27xF3Htz++9ur1PXDT5d04yglJQ3sv6X/UNApuug+JEG8Es6ENxMzopfbM8MUCT8rEExydKMPh4SKMFGz3xvPgP61FVGl7DYzAfRfReNHt0dFB1BrDJ4vcnkaQV95kw4bLln4Vlnfcp60AM4x4yZMjHk8jwgF4QeajsGf4eXD/oT/Gc42Fx4omr3k1dnJ0NOA1242aQJsWEJnNKY1m5ZkS/o3w4wCe8OMq6jMm9Hb/XglYd+FG+YaCmkmL/futew9c/JNdU4uvXN3a0pmLGy6Cu9Ec+i0xtG2flVz2X8KzbGfw0ed5B7d/CKUjTcXmHDn/vY8MwvYD42guWg3/q8D/n9/Lg4mWr2lSuRqT/mCiKEbg9w478fpZiDIq6Sk3nBAZFgCtFtRzAD8K+ipNfhIBOF3zSLbZM8vwwjWfhd7mp+TtlpqS0j+QRxdKFek3TyXieL0cHPJ1CBdWtN8JKXMM7tj/FrQHEwGIA6GNGMIB8EVEKESEcokwFiD8z0QI/CB45UrnZ/B3UEweAb7QN1LoG9Xc2oqjgImaPwFL1l3w+B++/W1bM9OHfyMz8LNvetSck3KIPDcrBp76gDN04J1ExoRdzqohS0lvoYBcn8XzCy7a9LlYNvX4/yraQ6D31wD4hl+9HwElJbvx0I04l4OmFtTiFIAf5LifAcpTfToCrl75Jeht3UdioGoX8NyfPnwUBocmwYxZElDlQgV6OnOwalFHUNDT1/QYXNn/Kbjz4Fvm1/oRoa0SChEKAnerr2GWYHgi8N0rD070vvsMTVT5hmn74KPbICMK0Lp4KbTg5x0ruzPwyE/f7VgiTlUaZkylTDgcr9N1U4oKorBovmbjZymLwxXXbf3hzIW//qZ9T2yH/1XgN4K6XqXtfeAbxiw/YgwF4HrkpteiktyCu1Dvx6aYkaeCfXDINccJXBbe9Fi1IMxnlNYB/ikXnJyE7qxbcA8s6dwJKsJpyezFhx7ZAQ25Bth64XpIJeNSKgvFIjyx+wDcfu/T8LyLl8gEQDIwl7TeB8en1sGTo9dX0Z9ZWr9GKKIjQAB8MxwRAq0v009ESJUiwS5pHJAd4EFVspzU+8z3Xnkgpk5AuTIMA24W3HIh1X7s2PKWbBx5fAXu2zsOK7uzsLglrdysOtp+eLIo78WyjgxA3IIcTK/KxEUis+oc9vOfbHnVu+4+4yf4qt+4tAlf3ojr6/H+dUAdzS/zTVwKwgjZtNR1GMRTCUg3pKRHHepx/KgWe4a0Zr6lITkOW5beJi1N0nY01G/bvgP6F/bDkr4+PNeSTPemH00mYnDlljWwc89h+Mm9++D6K5dJ/zpDYd7S+2U4hAZw0WmZpfXrhgfquWjNOm7ZSEWXMpSF9h7NFvoqesjCeyY9DVYMbRq893iNh1nz6O17vIfaSsevPTBQgsePT0IqFYO/um4prOjMSuv7wb1j8F/bB4BVHLh+bTcsX9AITx56at2K3JObWhcteeCsKt5zyXFD62fXFIvv9vY+ctNic+PnXvYBYY3cfrQElfeUe/Z11Hvegvsz+anCazLIHMeD8ZE8HN47CtOT5dnAPl3u/gyEgoCfiJN7JYYGYQp27dsHHV2dsKR/IVRkBwPlFhI6w7JUsWHdil7oaM/BA48fg2QqLgUmGc/D5u4vz3pa0frgWUJhhDy/VjBEJPdHeBGTyqv+fqTR2azjCh0lpiQ1cEp9rDD+goVJgI2rlkLvZS/61H8/PlY4OO2ULrrqqg9dcM21f1mC+Ak5quM6gs/DyDTu671o62fuPsH3/cOPnoZdR8co0a7dyJ5VT+fcmv/KK6887YMtvuZ9vxDwaR04av39wBAfT1y/4Q27xv8Q7OSqLHgGDB5rhD5RW4gdPiTu15tqQ5gCSpWyB4f3jUNzWxq6+pqeoSvp9I3cztwhWN79mKRghhWH8ckppDYV2LBmowR+ONSwqosplm3YvH4hfOv7j8PQWAlasqasRlvReic8OXQDjJSXV90xUQvKCICr6E6dESEI8InZwAde57qNyCip95/eu+cFsaP3fMFoFT3JxtbnG9PH7rqkJbG966aNd4j+zZ9OdK/4sY0jX37PQ97jB37+CaoOKycaD7/glb+5Od2QmYJ8oeeBn/z4g4uXLDrQ94Jf/2E11/3foflZVAD+Pd314ek/fOXzuRW7eSD5cuDpXojjE+yD9irPjYh4LfxIpUzJlcCnprlcpuJSyH5kcBqFYATORjCb/OGXrvi+mkGEyXQMePrQQVixdLn2yYqqFE5Jy1i19bp54wJ44LHjIFu6kP2DRs7FvZ+bpfXr0hxjNt2pDbZVRbPraXZe/wn5xrJlqAMeu+177xXFQg859PmRxz7i7rvvbZkDP7z70j7vxZd1Flesb5yBppQFE7n+Oz9y7wD8vwcOQbqj65Gly5dNNaZTkGttPXHFb7zk1auuesF7zXjcEZ53bmj+50gAjK1rln4ElffLmPY6KGXAtIsNuXzzNFjNMwDpAvBYGZWQBxV8ImJXE3jbu2Effi3vCAV8lwcTnU2OzcgIa++i9mcv4IDryu5HoLv5qCzsiMUScHTgOMTxtaO1Q3YrC8p3ohG4QChURuWi3ibY8dQAPHVwHFb0NUAFh7Gexh2wpOlnsH/8qrm1fpTumHMLReAJ4jWCwecAvgiB3588Dq9q/TqM8ZaGjoZMT6tsSmmAUZ7YlBRjmyCFo5VLU+Um7+XDR2HR4jboufGlu048/eT/eeq+uy9YfPUN/7R844VQnJyAfY9tV1m8Mh3+7DcmPpfAb9x4xYUvx5v8OqIuRqTZEmnTVLOAWNcJsBsGZOtDAr0LjvzXjbvAR/OwfDgFKzIZeDjJ4eEZCIAvW2Pj68jAOGQaEpBrObUuMKc7UsStMmxeeocOOxNloV5HR2HThgvlbCP1Cwe07zzC4xz84iWo/b//46dhSa8yFKmwZ0vnF+Dw5FZwZfJgHa4PJzeA68YC5gK+zowVOh2i1RyGxbtvgfSmDuhtwGGpzVhEs+C6tgeFsoDGnCVd1twTLJ4wl1fGx3YmK6NOPGmKdZdc/pHJE0cg29kLZjINVtquSbl+DjyN5wj4xZUbVjcYYH5M1oh6irNzbcw29LjQuDgPLGFA3i1DkRehDBUoCxtKRgWKlRKwvSbEuAmoc+ASNHh/rR0PYJa1AHjBevTAgKRCz4bW37DoZ9CYnpJ0JxZPw/7DB6G1vR0yKJAi4lISUW3vO9L1NllQgufX3pyEvr5GeOjxIUgmY1I95BLHYX3bN+d2bdZo/fnoziyhmIvqRI3rZAM8PZWB2+4/Dp5QXZSn8jD5nZ86j/3Xf45Vvv31YZie9CheY4nDD98azx97AgZ3/Yd5bJuxpNGWLlzXUUrgudD056y3pzGVfgNSvk7ZKk/2lVFGbLrHAatjBqkNtR1JAzgZmHSnIc/zUBRlKLEyOMMCMkNpiiPJDnHc4LCiYsHFjWP4vqS26VJLmgtg+MTIGT//XHoMwX+f6g9vxtCWK8Dw0AgsX7xMVrn5/el9kJefKsPov03C6K1TUDni1HSTws8rKMQbu+DpA9MwOWMrG8JgCP5vQENscH7XZj0e79V0pIt6duby6tQYw+OFFNhbPgQt5ImSATEPzIWr32qsW39h01VbrhyZyRx54r5xVbXFkACJyqry6MBlxePHrdYYgxuuuFA2PYNzJJH4XAC/uHzNWstz2etdv0eko9IXrAYXrC4EPlIb4vVlfDWhDTU9R15fhApHzo/GoHHQhLSTAk6Nl4DLlikFHBGuEIugveGQpj16xb+Hjg2edDqj0wtqCdi6/DaIUf01s/ABJ+Gp/Xtg0aLFsjM1BH3n1WtpRxGG/mEI8vfkYeauPAx9aBKcY244kYIUVgGJmAkb1rbCnfefgGTClOo4bhbgotb/V9WCcE6tb8wtCHM+/WjWa41gWahULss9Cdds7pSUhSrscs0NI9dctlC0rlm4rXnTkg/F8mV5CYT/u48m73xosvdGb2TILh85CH0JjtcUU30dgD3nU0o95+A/eNffspgRu9Z1RQfl3JO3hoSA8vGtvhkoI/+p4BBZxidb8WwwRRxSvB1KdlkWVlDrQ+dpVPpGQuX8uFy+EuEuoHD8jrkWHHMwMlGBLImE6YlJeGYqaHaKaG/LfljW9aTk+lSkPzI2AjYO7/09PbIDnepo7ZNqDjN3TIFwud+SEXjRhfx9pTDLUx+3YjuwaXUzan4HDhzLgxVTc9Eub74DulI7dCrC7HTVOd2a9agQnw18iLgzo8um/L/CmokvQzYbR0FQHiv7xME3tabtzKb2EiztyQ0vXpVVgUdPuOsuv+rPV128ZV+ibzGkFi6FRN8iyOB3WWUKB+mKnGyOP4f4t54LsNdu8zzjBtXVQMjpZCj1I96BdCVekRX/IpKKSdo7yzug4IxAhc1AbCYG2UGavsZCjc+l65A6C8SodQy+Wok4LET+f/ioG3hZaJ0Ym0Ct1VRHAFgdrT/3EyI35KUrfqgiuXI1YM/+vbB6+UrVczQajNA8gldUYX9wbMoiKLsRe4CHIwCC8JqLu+En9xyDm1++EBymasC2tH0Gvpv/J2n8V2t9EQE3C+lOvWhwLfC9edyneIxj4yfgi3vHoHPXGKxcmIOrV7aCNzFwjb1r5t7mePLubEvl+bGunJRzQwizfWb3J2HZ6t8XsewI/ZhMOiEFNLgPLNOA5b2NMD40AJ74FQd/PdD7i2PzTbJnDtMFjXizE01F3SPG06APPSIM1VjK64JRewxiw0nIjjcApPHJ2yaYngXcQkOsvQKTC2ZgeimHxUYbHPqUE3SQoCdZmM7Po9lPfVnZ+zC05wYl3YnF4mjkHkKKkoC25hzaF3boVtGeJ1B1zrJVd+j88QHvRVahJ/nzYMmCNGQzcXjw8QnYvKYRBd+D9tRuWNb4Y9ibv2Ee746I8HxWpfVnRXTnA76WxbH+d4LRSwG7B2F6/2fhkkU5SKRiYLnlDa5b2hAzVePhsakKFamzxvEj17qP374Ukk0j9YomYii4F6RdGEl2PicjgPVcgt5fKhWxTM2yp4AvB9S0rTQnQBVfVkXyaAiLJkg5bVDe70B2phmNrASUmx2Y6J+AmT60B7qRAlk4Erh41BLTbdH9EiaAYmHmFME/9+knY0XYsuwurfUZ0pQKHD50FC7ZsknSngA12uMEQs8dy3V9JUDYhSHsTB0KvX5ftj144aXt8KVvH4F1S7PynKiofmPLrXC4eCV+nqn269fxAgXZmnXsALrCKy51YcUStLMsVWGsdjSC3H117+P4Fwp1oRmKn/o2ZFMWTJdtODbtwII2FFCkZcNOin/yp2NQyU8ZL/8/b87P9G36jsOV+9ZGLutQJw565aLous5XDJh57+9Y42VqdcN+VcB/KqCnp5jpWMfsCm+KYk3mvMe8qsnF/JRaqTXlH+T76YDh/SMwtcaG4VXHwFmIRliC+7MqyIltVLdoVZ8qguASqPpUXbxd3dNyLmGYfTmbFt8J6URe3sY4av3tO3dCV1c7pJHL0gwkiouIauDLV6JDTqQGQQFLAt9TRjno2IQsDsfXlqY4LFuYgdsfGIUXXdEBeZtD0hyG1dn/hO3jN8/S2mLO3qBilndn1Qq0LS7wJOU0WD33u25vIlRz25knn4D7DpyAtvYMHGpcA1/5+R1wbV8MXnF1L6Q7Fxm//sG3wvT0DJSaWrIo5FlVDql6AHm6fsCUXSjYOyqGNYTvP/ErQ3tOAfjycwK+ZxdYucwTtVgTfv9OLqpm6lPvFS2IiQR0XN8DU6mKAhZhrQwBvfAXiSWfSmh3ohdBgJiv/VrViYWft2SHYN3CbcrIRf46MTUFI0NjcM0VW8GuFEMPD4EddKPOgP6orgjRC5ag97zIPkK/gkzXKKBhf9Xmdvi3/zoIgyNlaEyrGS5X5b4O+wvXwrTbP8tNOetyquiOCNycXR086Moo74KIlD/qfhNC2xq0phcuB/Oi62Hyxt+Bvu4++N1Vl8Hdn3g/3LHXhp71l6ICSkK8OY5aHrU9pZzgyVCDJWoo4EQmLZEjfTxx0a+MwXsS4AefJZsWG57u8lsp84qgicsiOTvFAodUAw+mp68WAi94T3WiXoXrXPFoR+IQ3H5nAhHJbTb8hlIRmsN5OA3myQRg67IfyX42pF4R+/DEzt2wYmmfNIA9HoZFRWC8as1PLT/kPD92RPjo+uJ6H0+dh/BUoE+oVGMazKiv68UbW+D2+0fhd67rgTJN6gYVWN/4H3DPyHvmoDswJ90Rngga6O4qlqFECoXmU0P1T7W1VMw+jduamSrlBa18iplGyP3xG+Ag0ZmZAniLVsDy//s5eAKpzSM44lnD41BB2mfbrqQ442VUTtTUzBPBvLnknDDxfq7tbPNaLv+tX37wzwN8NheJFl6FVcpiEh94J49kaI4NOdCbhmBao1Dzq/6SEiiR0SBMeItWp4tI3KiaY1NDLOFXg8zy8c8nBAL62/bAwvbdQH3NKWhz9Nhx2W2uv6cdH3i5Jl2BB+cKulCdKI+cEzaapcq98Jp030y/ZNO/J4WSgHXLcvDIrkl46lAeFncloYyC35v8KXQmHoEh56IqrT+nW9MIHUqqaS3ADM3ykUmpGdAl/WHS27kDQbshkdS9/BVNLCKgjyCIF+P+NNOO4ylNvne6KO9Za1MDlGxHAp+u4+fHhqA7nYCmbAbtIleOcPRoHj52AorlMvwqaP5TBj5qfUagDw1edz9q0E4RCfEP7QfoXchD8OueMoHXR3Nhn17waLeGoEuaOtbUgBFJJNMjTyoRat05gO73zYkC3zRcuGTZbTrfi4JRDux48gBs3bjcn+c1DI3qZrxBggzXqRay87FTNe6oiR+4qkngysXpBeAXQdaqjR9cvbkNfnTPIPTf2Bd0k7ug4dMwMv4Z/H6sbvRG8LkDeHJeXD3BB+iZy33eo2cX1GYRCziRBXqSaBoppHQacrQQfsNU6uImO+ephD2auso2E7B8aBD20v3o6lQpfigIzyR9/pku99wTNte1ztAPn5bGL08ehERDj//QGd4ASn6/TIhwpu3ppzMwvXkUQWpIfi686MzaenIE34DVHFL2rolON68fxtHH3AivV0umoaGKxijKM58AKMSs6X0AmrOD0viLx0zYufsg5LIp1HaZiGtTVAe2fND7vnvUssJzquaUo5kKXV2Y72t8X+urUUAJAbUQ7Oug30vAgzsnYOuaJkCbCXKxfbA49T3YO/NSrfVZ/fSF2qQ2eZZcTrPocb/xFZMxEtrF9VuSRwVV6BbnumuzJ1cuPTkgJ7VQnh2bJoEGNXqTQGxsnQEYOAwHD+BolcspKuo9dxO8GGcB+Kze3wR6f/W80o/ljfBnaqTZuMsC9j5g6BvshiuBJvjbn/rIU02XPD3VpT9C4OvEYQEj+72aKCiH5ra26rTiaCyhNnlBoycVz8OFC+/QF8KhkC/Ant3HYcPqBUBNdEFOb69W353pn6vaph62maPrp3k/HfWK12TkVHRbtQxUNQkq0s2DWVNcXayTL7pw5UWt8PjTMzCDf3PtiVmRuhUS1pQGtqhOgYimLtT4+BXd9GZ1vaDV5NUFRJ42YF3Oa7zCKl3B4zwyujAdd2PQkSrDioYRSHRMQwbGoFQoqdH7OQT/s+XqZCfh+swuDItYqkUK39DAN+/s7PntEbx57RC4NzmM7szAie4p6FwcMXxFHQ+QqD+hlV0EeOpOPgvQ1B2sqa01Qnuqe2bWant/2+bFP5RlhaTOqNPwfdv2wrKlrZBOmDIVITQweGCYh+95MPN484tbIP/EBNjDyuiNL0pC8vJGmvgj7Jev6Y6ne+dLY9E36HFbJhmD5f1Z+Nmj43D9pe1QLNgQg3FYiQLwuPOmCN3R11UP+LpjFx1/DI3Vp/JFiJuGmhyE4hbUaxNHpEypAjM00Qh+YQF+TqPU0zjKjeJ3LM+T5+05HuwrFMEtFqGhZEMev1PB7dR7/wQaxfvw783l/XD08DBsP+ZB2hoAh36/qSE4k1828LPTBH7Vq9ANKKcm7nPbOl/8r4xZfyu1NoRFKPvuQCPshUVo6feqgR/l/wCzAE6OpF23CShN1X4moKe/r66BOx/fb2s4Diu7t8lzoJ6Vg0PjMDI8A5dv7EejsxLOeuFTnlmv/sRcAuLdFvS9dwnMbJ+SHpXkhiyIOJOTPUt644WgV/PiMp3eHRr1+RKCCSnPl79/BI4Pl6GlwZL7Lox/Gw6avwHTYmmE7kRzfvxgl7KbhJ6FxcAfb6FZdaiTBlfXSN0wBnB7Bre348GaEfQp1wYDT64Htx8uz8BhmkFH9vB0IebSpH8OZEwmR7oUHpx+xsBt6ydcePLBUfgfkYZsNguNOOIN6ymP5sGSONdpz+kKQ/DqlidltQp5kacmH/pnHHqH/MxLf3UqHuz6QQwOb7NUs1khTrqOHwF47Fto6A7OpjHxRBx6+vqqIsbVQlBNg/zl4iXfw5tly3MymQf3P7IfNq7pUojy5xXzqs/dX9VEtooGqS4TqCkzBiQva4LEVtT4FtOVZ6oM0/Hpj091qHMyjQpeWKbJNb3YvLYZfvrImCoikQLiwOrUv1TjxxDVBr8RhBNUcFnGTASOYDHZQEuuODpSBiaBtztmwaJyGbyBYTh4aBR2Hx+D/MQkrMZr2losQBMKRSKbgUyMZt6xoLmxCbqbc9CDa1NTDq5rb4GlYwPw87wH2fY+6G5phsY4Hpu7spLrJHhiJwnAPCean50G7WFz2AHMrUyDGc+ykRNfz2fSq95mmJnP+9MVBZVYuB5A/j+4x4LOVS404yhgJaCq+xhR6plhgMGnGIwdgjnTZZeuWgmGZUUS5fwzYkEuTEh5FI9d0r4DFrQ8Jc8DbVzYs3dINkdeuqARtb4d0C4B1Ro/TFDTs9Bo/k5cvrBjCvIPTspZIJMXt4DZn9ZzXmnt79Md7cb1u1SoVRXAkCCsXNgAO56eht0HC7CsNyUbQbVZD0CHeS8M8cvq0J3Zhj2B3089kFMHqQlGoIi/sxJ/PDc6Avt2HYMdnQ2QbsvAXqQ4U/k83FgpwkLHhlViAp5MpKFiGdCeKYHFx2CiEpOVbK143MsGT8APDxyA6Z4+aM2mA54vZ9vxHHaaeBPnCu05XcDXk2bm2XkwY2l2cN97/mfxsvd+RoD52rACiwfVWPkxATM/Z2qGE1Gd81NPW9cuPX290NrZoQCqZ0EJOuaL+h4empziwoW3KYNVKK/IA9uOwouuWSRTGKQXCqrBH3AUEmJtBHqRid6m7hqG0X8/GDzJGXyf+/OlYC1vCGdI1B4e0N3Sgj76vt2jZ/MrVQRctqEVfvLAMCzsSukYCMCy+K0w7FwC1DK8XhJbdKSUHhtXBdf8hrUuMlJqn7/AK8G+7QfhwZ5GWNCQgSQqjj784WQqBYPJFAwMDMCayRnYFC/Cys3NkMkxGB54Gu4dEJA0V8Dm4RM4Sj4MjzbkoKW5CeI4ihiJuLxnBtoCwuO1ilScLSEwzrDWP1XPT3SVvYc9pygdzccO/9PfCGF/O6r1hY6O+rW40aqoUwV+W2c7LF61vCrFgUd6GIqafh3+sbpy+6Elc0T+dtzk8MiOY9DdmYaO5oQMbHGdoSmzNF1Nb7SHR7r7ZBcJ0N0kuKQ0k98+Ue3jx+0z3zgmi9eJ5jia/qg2LFwGkejQ0hWqXYtcd1tzbCp5jENLUwwe3T0FMRya6LIajV2Qs3ZXE2jm9+HkNd4eDkWUzNEyGrHlCgyVHEiYFVjVPAVF4yh8Y2YIRsGEQTTqx1Drj+A5Tdgu5PEcjja1wJcgAQ/MjEJrkw2lmTyUppEKHdsGKx59EO5/6CH4NL6fzDbCFH53Er876alXN3RUsHmU48ko0XOu+dlpuDnnXLlbYmgGieOHP/GnXb1/NgosdnNkFsYg9ff0NX4PLF65LKA1Ioj1sqCMlvldyCJzWdExF7c9qg1VD8poZO7eMwYvfeFCKJRVuB50joofc+A6IOX6/vpIgCr4O+9CbQ8tb6QiQR89hj9RdBCJ5aK6W5VeiiUXNq9qgttR+1+wNKsNYwYdxt0wbq9V98aYneDm+1josPmKA4fGJ5Gzm1DG0aKdJsGLz4BbGoFKDkcUBPuY4cBUxYVRFNbpUhFM/E4Z+f5UMgE/tZph7YkBEMUZvJZhcGcAfnxsEB5pzIHR0CxH0hIVEhWKul+QGm1YNXTYHNmEpzopzjlHe04J+KEAVFBjDvAj+979jp5Fb95mmk3vA+0CDdIEThH4cTSqlqxcCu1dHcpNGG1Hrpv6z3rPqgWgI3MAP86Cba6CkUIPXHxtM8w0ZGGKU03xOBj2AUjyJyDJjqOmZkHgJwC6B8Fct/42ye/3zFQ9VfOCnNT0np7YgddSHYjM5uinX/gBJ3xtzFiy1PHYcBkWdCSkhm817sfP/3zuMd9TmteVDWMFrGppApoGyjVMaJmehqd37oW7Ch50WV3QlUlCOpOV6RzpYhmGkPKtREO25Kh0hYrXCt/ZuwcW5Aeggt95oNAJ+d4crGhuATY1BYvw2M00W6C+r2RXbD8+SAFMdgqgZ8+GAFhnUMufzFqvJwzGHH/L9cShj387m9tyd7bpytcYRuqPKJmyFvj1lhiCvqevC3oW9sjJrxVVYkFejzIYDa35ff4fXopvA5AHJd64BkaMCxBgGYg3GQhypotuaN9+/PoGyNu/BlNTD0CD+wOU3vEI8PWrntNWO4UgdVMf8C8eAu9IUQFhRQMYL+rWLddFYPBGm3KFgiqqUpeAqSgF/VZbLg5D4xXo70xKYzMBw3WyOaFq5g4ZQZbtUjw5YRwd18IDZo8NwNcfK8N9LQ1wQ48Fk/ki2HgvyQM0gxp/ulSGQsVRUVykegSk/U4zbB/qgSxNGZvwoEFyey7bmAumfoeeBRUjeUa9irl5heCcNXjZPHRnPsCfVADyU9vyuH7cirV+qrntxmsMs/FKYPH1jCbCBpbDVzMWs1gynYCGxiw0t+agua1JG7IsrAPwwRMEsrgObhmBxgc9YRxpp1RSwJa1RSjAVpX9KFzleXELyP2LqmQRh3ojloJEIgle65UwnV8G8YnPgukeU0akB2GCGgc91xW+tsQh+RfLNX8HHcwSsq6XV1U9RmY7r33sQuUWUWIpVb+R9k7EDMiXnPC7/vy/tcD30xr0PaHv2oA2Cnl7DAMWFabh4N79MNDRCB2JBNAkE+VSBbhVBA+N3LKt5k7mcg5lW01WTUoHf6gZbYBGNJrzUzMqu9VXOZFAhXQoRCcLOLmmZ6cwCpy29n+2g1zsrc+76dOlYWMzosuQAm/FhcgUb//U/d/84DzAnyUErjMmRgZuvRP/viv6Oy//wy990zTjm/z2N6qGNzJLraQFLJiXVszqysxl3a3gIpgMI4EU4NL1BcikytKoJW7aGNsPB3b9ANz8Prh8UxoKJdTk0Ag8sRLc9BVgJFdAMtuNfPlPIDb8EeDOdJD3wv1IrRQGna6gQc81rw/cm5Es1cCFKqCKokFE43PfU4VrAW0SclHKEUe3Xwh78Yswr0fXBvs2EP2mjVq/TMKJwB1D4O5EA9dMZ8GjjmoxmjbURYqDXzJtsGUekic7yVU8Fd+gQ9PoQfGuWCqNu9ngFEvSqKXfo3QIR4gqcIigWH92/+GTCMQZEYAzzflnuTFzU4v/qCOdZZRSYKWTYGVTcGjkIfLS/30dsBtzgb+O8ax8xdyzGak/rni74vZ+ziXTdEeDh6hOPSUajebiB+tXlCXwpSsTNX1X7LuQdLZDMT0Dd2wfRsHolyF+LkaBV0YAJu8F0fB8MFp/F+KZbihlXgTG2FcD6hNq/0jSmgi3haCvfg2A79fiVk0oLCI3RM03RHz/krU5mW4g8+5FVwB8vx+/r4Sl2Gg6RZp7wnbg/kPHgRk0OSzAVKYBOBqnZbwvu8cmZcNcKjSknjwlPEwZgV20KzJ2IakMHYMS+3DbyHQeyuUyuNSeEfedwmOTEknkS5GMWxylKhUwRJZB9Zysog7dOR0BOKu0h81DcygzipSTKUvZ9ENBMm3PAXxjHmpUl04JHH+5EYuk7epJkv2ZyoPcHdDuTBbOhO5XKzGlgUkAmnIAfV1lfHgOVCpIB6b3Qn/zduly7OtJyymU7rxvGK6+uF0mmFEXQlmiN3Y7AoCB2fl7YDZsBXvkuyg406GnJzB6IcjQ5FVgD/l9mK80W+PLq2FhLhNlD9MMiA/sGMdXBp1IqRzbk/RtyL0qMJIFi7p3w2549Ps0X3ESwb2xs1WmKEu3MtLHCaQ6+4ZG4KLeDqnVCeR0504g35/EC1/VkpOcX8iiGgF7J2bAMgX04E0kxeF6jhyVdo+MQ3cqAY2o/ORURbJJgQG7h10/X2mu1Ab2DATglIXC+gVpzlyG7Nx+WCr7i8WhDrjn0v7mXMExUCm3Oq7PdHRWUQGf9zI9BU5VSi5XKbaBe5OFVR6Le1WWKHHavUebYGpyAyxv+JqULFJsL71uAXzpW4dkKeHlF7VBriEmta5LAjT1EzCaLgMz3g2JpvXgTtwnG2mRUHEdMOMyW5iBSurQ4Nev6jLUsw4dO8wn6MHk02r6SaW9Z/IO3PPIGJQQ8Ndf0obnqApFXJaAE871SpAM7enSfX54ZGSJNs1lsorLCOyfWNwKanrVlKMiaCjAgWvCwoL0cf8uMznTjoFaXU4drjtWq36j9DTp1d+mrS12CsA/o1r/F9H8bJ6MzTrvRQg6oh6GJUuoFm28qCcbQysgFjPwpseHjxwePXrkqD2PDTA7OY5zg3sipAaMBSOAfLSCawAxPQoYOpOBa8FQvT0UjebQ3Mgl+Mu2BUcGU/j9NDwxcD2sbf+e1NwkNK982WK4/9FR+NbtA5CIG5DNKJDQ76zxHofuZT1wYroHdt436HsTA24vIlrX59sBDkUkDsEj86xHYhP+/aRrLpRcGURb2puGdUtbVPoEXSFN/eP+HhS9brzXPIgS+8ltPJKAp2a20WkUnt89QtUOSwNdpo3rdo9+gFHmKJGx60juL6PcTMzal0nlA7opgQhHMYCgKqzKCzE35ZlPAM6qn5+d3r7hxFgGUoaxI8gJp6Y7fv+mW/YcXdmUSxgWUgmDpTNp2DJ89J/+9R8//MnT4P7ywRm60FvSG15nsjmttQi4ogr0Wqv5k9oyVScrm1pNx6XrkT57+OjLIBs/Cj2Z7doXz2HrhjbYtKYFhkfxesYrsjxPujETaqBKZTuguTlZPcO5DihFqY2aEV5EcneiThARBt78jfp8LcuApkwMmhtQ8AwhhYBpSjTMr4AD9iuldg40vj/jPOhOGExo4Hv6/FRNrbYGVH205pKGULRGbhNKSYAsRRQyA1SmgRBtJLBThih1Z5DeZFULTL18TFypUZVvkpm6OkxwPl+k9pkKwCkJxJmgPTBPUKvqOqid9ZGjEzA8PZbpe/6ypqnmHNJ/SwajMgh+c/R4ttYGEIqgs7k0Pxq8BqnkYNANtHzI+/3+M+SfwUdBdUv4L42/2t3JVHGK7D/JqSclQLFiSUCQoFBq7137Xw9ber8IixvvUnWsZZVlSbSnMRsP3JXpjn7p4Uils7BqcU5pY0/bBV6E80eCYVUzRPJI4I1Ha71ExLj1mRCXXJwx35EjYMB7MTxd/guQ/hdDhK2DRNgcy4+wRktEywjmR4bG5OSAKsEO7R28vtFCCbYPjkovldANtwoo6AXc7gTblS0wUaxQngpMiTDrlH5qHG0EmpEmUXFCrYS/U0KD12zI1MvtYachAGeF9rBnQIdmfV2l+bo4UuKt5x4j7se1WpycmlKKTghzHs1fJQD4oAzSfCoDgIUNlsA3bMM6XxHN1qQ+J+Sr1xxatmpCoE/nGXS1mhCzeNU8tC6PwX0Hb4ajuQthRet3oTm+O/Tfc0/69JnZDJBcIgs7hD0u+TfXvn7fralyciLGLeeB0Vs1rWhVgU44c17YVkRpeaave4JfAMeQ6oyJixXQdWcJf/5cv/+n0FPUq9JEFVsg2rIeDdwpBLTc6o8KBuUN5aSbU44iGm850g6NWekBUl4k3Uo+TR0oYvJ6IQhiCWjCfTkPU1QMPSR3tTRJxVfzXPlJRoCznt7AnqldwL3opRmyfw7XXVC575rUV4xGJoto+lNyd+L3hSqdY0G6r/CjubJnTmQ2Rn2fdL6mNMyUmWAE9/jwMQb93XHoaSvDTjMh6YRvZFIk/sjUBjgyvQGakoegPfkkZK0jkDBQY0IZ2hZdh9eB36mQq68Ek5VlQXoC1/SD+8X2PEp7qqdZ8jM2g8QbDQlfY1OElLMkVLwOKMESmOQbYNpdpqiMn2Wqb6pPq0D33gnqnYUql5QjFoI7k8DRN5YEVrakzcN11zjJ4U2l3T1qRxIrAYvh3XNiIBx/AhDfZ8+rvFIQsV1CNyuOu0YFrKQSWttz/WctAgNMwaGeEXw6VOekQnGmXJ0ncX+y0NDRfmFFSKpnVzd4SswD+LruTqKqLPBehH772ZWNLAwmMp1OJRvbGoE6JU16CMG/Zb0BDcilN64qwP3bU+ozOmWkbeTOpC+PFxbC6NRCSeVow9J+F/rbyrIXP4Fn28HfgLHpG4Pc+6pzic6fG50swm817qnfquq/QxgxIt3WmPbXM38KUU9laPpa141QKN2gCoL7pFItgIfllRSEYiUGlR1j0kfPdUatTLFWxgJUcHuxvQJty9qBD5WhdDwf2hUQcTpAxEULogqB3HEhnylA66oOMASbC0NGZAQ4XU/QGdX87DRHgjr0RARIjYJAGqu6y3CZakQ5i13zwptumClmFkgLCj9GG8l5evf3vz0xNl6pWwvgcu3c1LRH8Cr64HvSRKA61QjEfLehxL7vBcKHj+De8ZSALRssWLrQBduegh17M1AumpqqGkEkWBq4qMHWLndh3QoPgY8PdmYGRiZbYWRMaN96OFl09FaIiDEeAJr7wIfINEEsaD3IeCgkwg3TlP1glW/Q+m5fn3cH0wtxZddwj1eVgkqjl3KPkOpN93EoTDuBB8gLWiwq2mYlTfDKDngtSBGpTsHxAhdsbTNaIeo7cMx4So6CDOmTnHOkPp58ATgd785zEuGd27cv88WZngDckJqitoiAQvKP7hiB1pHcVcnUZa9OJyzpzUgkLcjl8CZXnn5oYuzBw/W9PeSmj/TdjFCIICgkzVl/9kONBA120F4gxZ/ViPDEkyZcuC4JiYQB69fEYGFvGQ4eobB/HI00U3LuNA5SHS0c+nsFZNIGCgkaepOTMF1IwMM7ksoP7vkuXjbLgVd1vlwZgH7wKQzYafD7cuuJIAWYc31vnbBHkXT5GuEsLMJPW/YC56KkKn6/o9DgVQ0CjLIJrQMWNNjJoF0MD6rqBNhlBpNNZRAtKPSjJsTHE2HbxwjVEXXnHlOLi8byRGIaWGtwL6wI7eGnaPielQgv+wXpTyDCfjSyWlTCAMnA/klI5XmiuS2hIIrgT6diYMaEn6BQn/PT7GdBNZWeqjTSjDVMD9AmhAZ5GN01ZZCLtjY1IgdFcKxfk4L2VspnYTA6OgVNTWm4sEkVW/ud35gO2pBmLBQKUMR1cCQGjz3VDKUy17RGhLZGRCkGs51HWwpK4LPqyeE0cGUPHj1LOvMpjc+zeZj+EBTz+7k9BgQ2gzJuVZQ7rA9QP1SYYtDcgdTHqsB4dlRej59UR1ImBZk0f9xDzR+TiUn5dB6mU5OBsyKgcX7S6FxoSKGQkTuYzgGfMc9PH56D558Me7+wv/9Mav45hi/pRFSa3x+F2ewCMvIlU+arJC1caWQuK5oQkIVCubevrymWSlPHX+V/cZzK0cOHxuktM/y6WYjk9kBYBqiygKrMBqZ71qvoLoPrn9eIvJ3D5FQB2loruD0JgwMnEMhC+vCp/I5y3aXhS4UYsmWHK8P4+QKHpw82wL4j6ZBOMFHD5VkIVP90RDXIJfirRoOw27KwWejx4aoZF92fKq0fHEeEdEobolKAItMjcX+iDNx39FgG0rkipBs8SLc3g5XL6HrjaKvIsHMGdWQ0YgnRtKBlmvKI5sKlgOpZU/0NTFNR13YePLbz0c/V2HT1uP4ZoTmnA372C2p88tywIHO4asKQ6q/4lUaGGR6L9qPSvX07CnzZZZffUm7rfh5ZAFQEEU8koZMXxj7/d3/3Eo9cFszTfnyujToI6IGASANaUN4gJlttaO2N2553WQ7WLDfkJHANDXGYyaMGHD8sb8+9j6QluJcvFtDVbstUZ/oRKk2cnGZwbCgFRweQDhVZkCZRlUodPE42uwiL1xq6YV+eAMheRC/6XF+okSCIbPv30KdTXISaN9LenYtoHr/veORgVwTsfaRFR3l52BrdjwtwHvIRIfxg2vTIobdfOo9WjhoAHKIdw8JXXkNvogp0PqMXTjHjc17heNb68wudlGKY1UxOZQiwuiJNqQKGHin8h7V/15To2pxdle3stuKoeclATmVQU03R9Ivqd/yH6geM1AgQRn1ZlUoRymOjhfDiC7OweQOCN9Iw1bIsBLcFR45bcOiwJ4etsQlDzr6SjCsl5ejpUkEXwsgcUhbR2KJ2UjgW+vJ5mLfgG7VRkAdGrS8sji9SIf8PWo8YIjR+jYjxq1M4OI8aoLqoXkuW7/nx6Y9qlOUGjX2rXK8+pQoCDfK9OQ8go31gWA2nr/V9RWnPXOkNcAp+/rNq8LL5gD97F3XtJgu1ciTbLNiDR+6I5ECqpXHgvVBtrtXBEPCe4vzVXQ58o1BE0MZ0gYuhgbdudQZecEUDFIqquzDXYX5aY7EYtDTZstzO9cLBqlQyAneiX/giMxVBBJioMmSrLo9FMjTFbMrDQi9OQJlYWMPLRFiPwKOtSOj3tRBImmLo47thsb4fI/CLSTiELdRDje+F8wJwrmsCIkas/33wu9bOAn894IuakQBqfPr1Fg4n7/onni3aw84A8OXJ8XqXPMfhpUbi0eax6k8Zco+4cryI6KDOHjbMlJxpRRaNCIgEvHQMwR+umS52we1LFiXgxuuaoVgq6SxJUQV+aqY0Pqm6KEi/eXCPuTKefY3qg5PV0pyav2sdID74o5NJ8MikEjwyivga3guREeznhu1N/G4Uws/niXSqCIxhpo1xHnbBkFFe31+vG+uGNc9R0Ov8nRBzxkk0P58D/PW0/XzBzDMa2X02aI+o1vj+ZbJIBDWSpijznqL8h/kRqCAyqBxgPJLLojyCJVTFM+PT7ute/Kp/aD00fYVp0BxPuFsqBT+wUjo446dTRIRJW5o9nSm46cYONGTLQSGL63kB8GmW8Mkp6s8ThwiutUDq/N6aHvh+oVRAeSK6qwr4EUM2UNy+bz9CEgJD15vNboPRgYlI4h5AWMcTcvpwalP63UjKhs7lj/Yd4nr+AF7TJEDoFA8Wzcj0pm6fR3PXozviJMlr9VYxR1pLPQp01rw9bH6qU88XpBLMAt9xVZMo9epRZmRcB3uMkP+QZ8UKtDeDfNmBw0+egJVG26a2dJ9hJgwwEzGw2htBHByqmnQhDL4o7d2ci8MrXt6FmyoqyFYDfKJU+bwDP30gjoYu1HQ6ZpFZX1hVkpmERJSnixrwR/8WoYEK0XkFeOjx5hHbAXQ+DovGMGTUVwTkIcgSDfy9NSvzI748oILCC/KnI31FfcDzwIBmTFT7b3jx5zOjX/3UPJqf1Ri4RvXVgRHZ1zgFATgZvz8rWZ1zqfy5PwyyNoKQpXR1So5NgRVmBqhQ0d6a2Iaam5cFqba+98aj9DfZKFMB3TFk2ZxTnvyOHJx9rhP0xAXINcRjN//+oitjMTfnumoCNtVNTYGfClhKpYr38BP87pHR4gCTVSCGNtDJKDUEM9VsC4HZwvTsC2pI4AbTCcgRWAQTw1UNdqpanhrBmSbowo5gdOGGEVFvPgiVACuWhr+Dtg4Lg3pcGyHc0LxdQRYPJpSFr0dm6YplKs2EbqK0sBnxfU+lnxrCnxdMSR3TDYUZ9WLm7ujO/OhXf6qHJOMUtH5US58u3ZlLCGqV8BlLbDuVTlkCTp6DHc0lq/k2m2Xd0LAq/ZiB8y78Gcpx8CmPoi9c2gG4CjLUTBomZBajI3Y/+r736VGIM4r9Um45Djh9ff2xW/7qI5/EW5+jEkULEUfAJ1+9r/XJZ1/Ij/3lHd/+668lY2oONvrpVEKmpouYKTgdC/EvLJOJbFJAzEK7wxKiMaVjOAkhcuk5brYJLJPUZLmmW1O05p7z2dpkpsSYi1gtVBgr4Wq7QpQdemWMSmMdF5grS2kZc1xmUDC4VJGltXi2jJUdnX5POWmeweSEiMJPG5cTs5icszCVHN97MhuCBVm2WgfNRUPqaX2oAXutlq+n9efS5KcazHrWyhhPeTCouhgWZqPLu2EY2q5lQVWRcotWh4BVXa02UoMILmn9sL8O9400z/Bdc0ylDQUFvTyTThvvff/fv9+wYheXSmUJfK6B7welZNJWYeof/+H9b/+mrL/AH6fTlA5E/D0LRxkbhwISApIpEgLHpiAlIgNhVCqpM4+bXEyn6t+UmMVYIhYC29JuLwK1f9GOW3++9AoB3RGCwG4jeCv4t+ORQDBWrFDQlc5Kvje4PENmlG3pRCDwGxVH2lMEdAQ/l22JmBq2VO0JU9/TwkCDrSETSHVoXAf3jHmATzvN5dpkc2h8OAWNf0art86Knz8c8ZnMIESAaA8fD/38QgQ5DwxUxY92wMkophIU4d95mQLtdzOTI7+EIlcRYdC5KCoiGeSK4MI++vFPvSmbzV03NT0jW2jLLMYIz69UKlAuF77yzr96w7/K6abwJD1Lpkqb9Hc5JgM7sr+JmulIJU4jkDWN45x0aSKmwGwZHvf/rl2S8flvmO3Wn4u8VPGNdgS77d8+gzS6rA6WIkl3S7IjQ5aI246aYwiVjeG4TOduM4MERCc3GfSpvATGTGKChiEfDml9uu2GVvdM71OdnBKZwEANEGFhIlMRP6MO1THmMWRPp//mWff2nKxbm6hJ54m4CFmtmojcFW2oMTGbGfLZnM5PiQ5mLZQhfy6n0EFtbgi1qHoC3N7a2n4tzZySiCvk0WQSPs+38e9KpXjnO99xy/uLRYK5cnJbJvh5K0G0wDSIZOtsIR1KjdPMDLLVsED646PD43PdwHiMsbrTyJxksZ2ARxLVCW6i7Wqo+cMm4pUoEOFWgZ3wbFDXZWKVCvycaWAbUjCAqZ28EPw0CtBBTI3vQAgir4KFuVnyfmvND5puGpp61qPJp8P356M9z1p6w+nQG4C5Gw3VSXEL8254tChbSAzPspAEUwWH0TXqaSHskQKj1iiO4wSg9z0gO3c+8fVly1a9kemqMZ/uUC+Zcrn05Ec//MG/PXHiRAzhY/khKRQOLvQBaJEt/TnXW3gQdIhb6hI9z+UxDX4yRKRQzLHEzPrbHa++UNgOD+q3DMNkTphOg3/7I6RpaHYiBUFWlikPgtb9hqRFPuj1Rv2vYSjaI7/CNAUCXxB02rk+uPyy0H+LiC3A9fZAdWl7waihQ6fT7hLgWZyyyHrd614XvPmXf/mXM5HFWeWLFeoh6H6TmpbUVKrJou5IJiLn0UCRLqrQNInrCnDhedp34bcelMkuBGwzMmuj1Ei3vOn13/iXz3yut6ur9+VC2xzE8e1K6fgXP/9vf/3Iw9uQaYskj6BbcicGeigXct5o8CUhLK4Fz/XtE4+XK5QaofpxlCqu8IWhdjHr+Ehcb+7RgOwAH2EeD6OE9B2t4fEWC62d6V/OKCpNqCY0awpDb/SLoRU+MxX0Ff61YmdKhcv2IvJvTw0JPvijqy8EBHTDd3nr9z5V8k5Bs8N8tsQvskTxTctXvvKVZ6T552wp5w979UYB6TH2hMzZV6mISFVkHJ4BZxEdr/vNczOkQ37lkY9yzsLIr3bjqexDQhOik7w+ms6opDq1CvLivPpVv/eJj//TPw8uXbr8d23Hi1Uqpfx3v/3Nd/3g+98dxzOMa0ERgWonF4cRwl0YfstJ+ogH0utK61hEsjVUDSUdQhuQdZ3DvrF7MvC7rhAQUa+eDBr6hrIcPqW2ViEL5j8PabwK1cKOPpMAxzuDaDflEIBmvIy+G1oQ1DCgWRBVRWvqqMGtfHSh1hdR8NNX6YLxlUdshICmiFB25wI3Ow3F+pw1qp3PxekLQdVJBnk2shRJzalr0+RaTBWYyEQ28rfTFDUCOURcU31/vih/Ok7t8eE60kNUwDV5dTKIP5WPfnBcIVUJAX73L17/2q/h318jXcllAb1qHaWFhWiNr/mZCOP9KlvAVcKgwxpMROc1imhyLveTnhKq04dakPuGkMNP7RlGGrZJV6ec81k3KOK6wTQnpBuqF6NUu56QMNaxE9VVhEtcorGrqDp+iZS97I6hR0klRDTg6Qibv03TSOHTn8BhrRDNdZQ8AHkN2E+mSM+kpj8riW2zEozqXK1kGLIQmun5WEEFlYpePCG0197HgGt7UGFGOq2qEgOnvmML1FiJjJ81JuFuypaQMZ62ZLTJE7oPjGVAY67JnJqccFS62GwvglJlvjIFT5a36gATV9zUn1ZRjjhqVkLu+enPoFStHAGCtDmu3JZC5wHIHvz6PSlny6i+N4Kd2gOSzI4FI4O+CKVZ3bCxvU/k/Txu4b+nk8FjeFq7y+RTPHXTkBap4ue+ZvepjEHbpCaXGt2/UaJmP+Ebt/6NjLg6IfrZubz8wt0bent72LLlS6ylyxancrnGbDwey5qmkcK7ly2UoZn9KGkJ6W0wZDmfg/RkyE0mF7IYcxUpRNAhBy9UYLqSy+TShu4coFraFadLMDNl5TKodl3pgJYOC5g44aTK/SmTGZa6+Qb1lU+yK666YeFD9/9k/8jIiEvFJ37uDqOgKQXFqPjF74+tGYpHwwsJkGFK/HJPd8QXUtPKYJo0gKnmThur+thVEUzqU+nbA0rjhyCIRUYAIU7u7XHw5yxtTBP1iVmGHzORgV3/M+m/1EYq/U9CYpqBF0dSHgiJPv0r6zAtxgyf/MtBQsuQz/N1TbO/EeqA33/1OT4PAvGnxiDgF4nOnsJxn31vD135+o3rM0uXLF4Ri8cvREq5FIfdNgRLY7nMGkde0vRoUZhZhEVyHEHXuW4Db3FWuJnGBmfjMA2ZHjFUuHnDUsS0x5PpY7qzDTiocN3uPym6sUSKW3vzQg3daEK4nC9Y322XUmZlV0/BEdypuNwpcffQYINj/n/irm3HbRuIktRt5d1NihQuUPT/v6UpChToB/QtRYEWzcKxvbqSU86FEnWzva2DBlhYkrV2ljrDGZ45M2zL3a7LsqwblqfosiVxwIblPJgo3KHVMmapRP9PN5ucQQzxXqUZJcaI2gzgRVZnDuTEaIhBnkd8/2QBfMEAMHubipV1vcP1weAKcSEbQilhbfjYDzy+VyRarMFEPD2vATiEESsgdjQxAt4EYER+xAzpCPA6YnwmHiBifgLbA5F3gJkngBtAC/cA99cA/8QLfPr0O/z80y+nXfn82/67/SHNsl/TJH30MHh4eND5D9+fEj9pGuxs4PFkv3nqu7Zp/Br0c9diTGNM7oc7L/Yuo07G9k9svGzbvu+buu6Nblzz2sPp0AP1kfGArarKnk9f2sOXY3M+HrvT+Wyr11db1ZWtq9r5DwfU48NYAwDY3yRa0KIxAL3HjI6T5lF0Uz6AlA0nT0McxAZBgIZoN7v46bjeFTkDVYsXWKM9uVfTDPTtdCHQRAsDxHHdBZGHfL4Z28gi+FtqgD96AcwAy7Ghxm7cHZboT++5zGgImCIxbLuS5Aoz/4zjV4HV0ZMGtUNSKw6JXAT8uax5S+N/d4DfBP430JyLRe/HHz9a//PiD1/mNFbEAl3bkUVtve+9SBjwQKeZMV/gJuEEfp8HvguTa8g6+pBEBxaHilVSrosK55K1GjS8RcZQDmEMVXAhfyNgL3JuhB5vrsPnnPYtCwroYMzsTg2gLKbPuJkBv56dn+sw+ImGoRyHMrl0XrdaP2ojcntjMClWKDPQn53VnNHlVhUmAB3pThSM+FDKRJSlC0muKFEVZA5uluWNCQ8XRQSXQP+W2Ry+OvjvqOdZlJ8JA3BNmjq/NuhAkiSZDATG3+E+YSDiUEPHKfYA/iyVlSizExj2sKsmaiJ0M0TnYrkXgr9SFiy2NPJ5ZU5QA8Mb+KpdgRTu+HclRuJ9eUUDyMy6AWTpNt0zN4SqsdDahLU/1sf1zgjtaUjI9tpotSvxj2VmxxuCynJaHGnS9fRap7SZupYMLgHeibaH+s/6uYEMAp0lrgusm9TSroF9kbAKIc/G7L5W1rRV7XXJaO62Xnhr06pblJwTMEfcc4x/2DCYuNx2Wf8o18QYtqQVY7MmGTT8bsM7zAGTHqTQlMyoZskCN0QgA5AuhgRuH3o7zu8r8ODX/hy9iP99vuf9Y6TbEdGav2/4v3z7DKsCt3flMubvZ2pOEbnRv5cTA/5Ua121PKao6jyclXpncWZHBki5o38/L2hRTGt9VC6bjsxVWpgG7zk2x8V9J6L1uBHNoZlPVhGHfw0LSq1Xcm1Vd/0bQP9vwrYtvv/i9ZAOj6xAq/V6zXmNJ2wYol5zp4Giix9Cmk7upVp3Dl2UiNWIBhQlJ4MdKdQnAXLCYAfcXIRkzNnYgeTDI3hDGb//eTcef3gG8QZTenj//mph9uTaHy/8+vmo1ZE3cVR/nxQ8ob6nI0mzQtkD8latpc7hfvWhTNsYh14vXqFIdeeQmouaW4wPRS+ew1aV1Rbw54B3N8zyt9T+3i0UumcB+7wqZ/M1OAMA2HKHesMwYDb4a/EjbAzUYiAjSaIyegh/dBIMgAvPtAe6Y/pSASoq9+X0e3EDxF0hH5U9aZWMw2KlKsVyODS80a5vvixuziyAZYfGlgcyrr8Oy9+rWh6fhLWu3ih0qHTQKw8OYAnQtQqs+FitPAN15Rm4C7O+uwD0a8/1P3uEfwQYAFOpSIZl6tEyAAAAAElFTkSuQmCC"/>
  7125. </defs>
  7126. </svg>
  7127. </file>
  7128. <file path="assets/img/is_disconnect.svg">
  7129. <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
  7130. <g id="ico / &#236;&#153;&#128;&#236;&#157;&#180;&#237;&#140;&#140;&#236;&#157;&#180; (&#235;&#129;&#138;&#234;&#185;&#128;)">
  7131. <g id="Group 230">
  7132. <path id="Vector" d="M6.59082 5.71484L32.5648 34.2863" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
  7133. <path id="Vector_2" d="M2.85742 15.1632C5.06814 12.986 7.68173 11.2601 10.5522 10.082" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
  7134. <path id="Vector_3" d="M8.37695 20.6667C10.5663 18.5194 13.3279 17.0484 16.3315 16.4297" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
  7135. <path id="Vector_4" d="M13.8789 26.1831C15.3429 24.7853 17.269 23.9735 19.2918 23.9017C21.3147 23.8299 23.2935 24.503 24.8529 25.7935" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
  7136. <path id="Vector_5" d="M17.79 8.37752C18.3745 8.32882 18.9751 8.31259 19.5758 8.31259C25.8311 8.29575 31.838 10.7592 36.2803 15.1632" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
  7137. <path id="Vector_6" d="M26.0381 17.4512C27.7975 18.2308 29.403 19.3194 30.7783 20.6655" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
  7138. <path id="Vector_7" d="M19.5779 34.2866C21.0124 34.2866 22.1753 33.1237 22.1753 31.6892C22.1753 30.2547 21.0124 29.0918 19.5779 29.0918C18.1434 29.0918 16.9805 30.2547 16.9805 31.6892C16.9805 33.1237 18.1434 34.2866 19.5779 34.2866Z" fill="white"/>
  7139. </g>
  7140. </g>
  7141. </svg>
  7142. </file>
  7143. <file path="assets/img/logo_foot.svg">
  7144. <svg width="131" height="23" viewBox="0 0 131 23" fill="none" xmlns="http://www.w3.org/2000/svg">
  7145. <g clip-path="url(#clip0_264_110)">
  7146. <path d="M122.469 14.2716C122.582 14.0946 122.638 13.9177 122.638 13.7408V10.969H121.179H120.449V12.0305H120.954V13.21C120.954 13.21 121.01 13.7998 120.393 13.7998C120.393 13.7998 119.888 13.7998 119.888 13.269V9.6126C119.888 9.08183 120.393 9.08183 120.393 9.08183C120.954 9.08183 120.954 9.67157 120.954 9.67157V10.0254H122.638V9.08183C122.638 8.43311 121.908 8.02029 121.908 8.02029C121.515 7.72542 120.786 7.72542 120.786 7.72542H119.944C119.214 7.72542 118.765 8.13824 118.765 8.13824C118.204 8.49208 118.204 9.1408 118.204 9.1408V10.1434V12.6203V13.6229C118.204 13.6229 118.204 14.2716 118.765 14.6254C118.765 14.6254 119.214 15.0382 119.944 15.0382H120.73C115.173 17.5741 107.765 19.8152 99.5153 21.2895C81.3316 24.5331 65.8418 22.7049 65 17.2793C64.551 14.3895 68.2551 11.028 74.5408 8.07926C74.0357 8.43311 74.0357 9.08183 74.0357 9.08183V10.0844C74.0357 10.91 74.5969 11.3229 74.5969 11.3229C74.7653 11.4408 76.1122 12.2075 76.1122 12.2075C76.6735 12.3844 76.7296 12.9152 76.7296 12.9152C76.7296 13.6229 76.1684 13.6229 76.1684 13.6229C75.6071 13.6229 75.6071 12.9152 75.6071 12.9152V12.4434H73.8112V12.9152C73.8112 14.0946 74.4286 14.4485 74.4286 14.4485C74.9898 14.9203 76.2806 14.9203 76.2806 14.9203C77.2908 14.9203 77.9643 14.3895 77.9643 14.3895C78.4694 13.9767 78.5255 13.387 78.5255 13.387V12.3844C78.5255 11.3818 77.6837 10.969 77.6837 10.969L76.2245 10.2613C75.6633 10.0254 75.7194 9.6126 75.7194 9.6126C75.7194 9.08183 76.2245 9.08183 76.2245 9.08183C76.7857 9.08183 76.7857 9.67157 76.7857 9.67157V10.0254H78.4694V9.08183C78.4694 8.43311 77.7398 8.02029 77.7398 8.02029C77.3469 7.72542 76.6174 7.72542 76.6174 7.72542H75.7755C75.6633 7.72542 75.551 7.72542 75.3827 7.78439C80.8827 5.30747 88.2347 3.06644 96.3725 1.59208C114.556 -1.6515 130.046 0.1767 130.888 5.60234C131.393 8.37414 128.138 11.4408 122.469 14.2716ZM101.143 9.08183C101.143 8.43311 100.413 8.02029 100.413 8.02029C100.02 7.72542 99.2908 7.72542 99.2908 7.72542H98.449C97.7194 7.72542 97.2704 8.13824 97.2704 8.13824C96.7092 8.49208 96.7092 9.1408 96.7092 9.1408V10.1434C96.7092 10.969 97.2704 11.3818 97.2704 11.3818C97.4388 11.4998 98.7857 12.2664 98.7857 12.2664C99.3469 12.4434 99.4031 12.9741 99.4031 12.9741C99.4031 13.6818 98.8418 13.6818 98.8418 13.6818C98.2806 13.6818 98.2806 12.9741 98.2806 12.9741V12.5023H96.4847V12.9741C96.4847 14.1536 97.102 14.5075 97.102 14.5075C97.6633 14.9793 98.9541 14.9793 98.9541 14.9793C99.9643 14.9793 100.638 14.4485 100.638 14.4485C101.143 14.0357 101.199 13.4459 101.199 13.4459V12.4434C101.199 11.4408 100.357 11.028 100.357 11.028L98.8418 10.2023C98.2806 9.96644 98.3367 9.55362 98.3367 9.55362C98.3367 9.02285 98.8418 9.02285 98.8418 9.02285C99.4031 9.02285 99.4031 9.6126 99.4031 9.6126V10.0254H101.087V9.08183H101.143ZM84.3061 7.90234H81.4439L80.3214 14.7434H82.1174L82.9031 9.3767L83.6888 14.7434H85.4847L84.3061 7.90234ZM89.0765 14.7434V9.6126L90.1429 14.7434H91.9388L93.0051 9.6126V14.7434C92.8929 14.7434 94.6327 14.7434 94.6327 14.7434V7.90234H91.8827L90.9847 11.7946L90.199 7.90234H87.449V14.7434H89.0765ZM115.903 7.90234H114.276V12.0305L112.48 7.90234H110.403V14.7434H112.031V10.6741L113.827 14.7434H115.903M105.184 13.1511V7.90234H103.332V13.0921C103.332 13.0921 103.219 15.0972 105.633 15.0972C108.158 15.0972 107.99 13.0921 107.99 13.0921V7.90234H106.138V13.1511C106.138 13.1511 106.138 13.7408 105.633 13.7408C105.184 13.7408 105.184 13.1511 105.184 13.1511Z" fill="#0B318B"/>
  7147. </g>
  7148. <g clip-path="url(#clip1_264_110)">
  7149. <path d="M35.0615 4.25586H39.3197C41.1316 4.25586 42.4 4.85342 43.0342 6.30464C43.5778 7.4144 43.6684 10.0607 43.6684 10.4876C43.6684 13.3046 43.3966 15.012 42.853 15.8656C42.1282 16.9754 40.6786 17.5729 38.2325 17.5729H35.0615V4.25586ZM36.8735 16.1217H38.5949C41.041 16.1217 41.947 15.2681 41.947 12.1095V9.46318C41.947 6.73147 41.041 5.79244 39.2291 5.79244H36.8735V16.1217Z" fill="#004098"/>
  7150. <path d="M27.0889 13.7319V14.1587C27.0889 15.9514 28.2667 16.5489 29.4444 16.5489C30.894 16.5489 31.9812 15.9514 31.9812 14.4148C31.9812 11.427 25.7299 11.7685 25.7299 7.75626C25.7299 5.36602 27.4513 4.1709 29.8068 4.1709C32.3436 4.1709 33.7932 5.36602 33.7026 8.09773H31.8906C31.8906 6.64651 31.4376 5.70748 29.7162 5.70748C28.6291 5.70748 27.5419 6.21968 27.5419 7.6709C27.5419 10.5733 33.7932 10.1465 33.7932 14.4148C33.7932 17.2319 31.8 18.0855 29.4444 18.0855C25.3675 18.0855 25.3675 15.0977 25.3675 13.8172H27.0889V13.7319Z" fill="#004098"/>
  7151. <path d="M9.24103 4V11.1707H11.053V8.26829H12.6838V6.81707H11.053V4H9.24103Z" fill="#004098"/>
  7152. <path d="M2.35556 17.5729V11.7681H11.1436V17.6583H2.35556V17.5729ZM9.33163 16.2071V13.2193H4.07693V16.2071H9.33163Z" fill="#004098"/>
  7153. <path d="M23.7368 4V11.1707H21.9248V8.26829H19.5692V6.81707H21.9248V4H23.7368Z" fill="#004098"/>
  7154. <path d="M19.1162 17.9998C16.3983 17.9998 14.2239 16.5486 14.2239 14.6706C14.2239 12.8779 16.3983 11.3413 19.1162 11.3413C21.8342 11.3413 24.0086 12.7925 24.0086 14.6706C24.0086 16.4633 21.8342 17.9998 19.1162 17.9998ZM22.1966 14.6706C22.1966 13.6462 20.8376 12.7925 19.2068 12.7925C17.5761 12.7925 16.2171 13.6462 16.2171 14.6706C16.2171 15.695 17.5761 16.5486 19.2068 16.5486C20.8376 16.5486 22.1966 15.695 22.1966 14.6706Z" fill="#004098"/>
  7155. <path d="M4.80171 4.25586C4.80171 4.25586 4.52991 8.09732 7.88205 9.71927L6.97607 10.9998C6.97607 10.9998 4.52991 9.46318 3.98632 7.84123C3.44274 9.46318 0.996581 10.9998 0.996581 10.9998L0 9.71927C3.35214 8.09732 3.08034 4.25586 3.08034 4.25586H4.80171Z" fill="#004098"/>
  7156. <path d="M16.3983 7.84163C15.8547 9.46358 13.5897 10.8294 13.5897 10.8294L12.5932 9.54895C15.7641 8.09773 15.4923 4.1709 15.4923 4.1709H17.2137C17.2137 4.1709 16.9419 8.01236 20.1128 9.54895L19.1162 10.8294C19.1162 10.8294 16.9419 9.46358 16.3983 7.84163Z" fill="#004098"/>
  7157. <path d="M46.2957 13.7319V14.1587C46.2957 15.9514 47.4735 16.5489 48.6513 16.5489C50.1009 16.5489 51.188 15.9514 51.188 14.4148C51.188 11.427 44.9368 11.7685 44.9368 7.75626C44.9368 5.36602 46.6581 4.1709 49.0137 4.1709C51.5504 4.1709 53 5.36602 52.9094 8.09773H51.0068C51.0068 6.64651 50.5539 5.70748 48.8325 5.70748C47.7453 5.70748 46.6581 6.21968 46.6581 7.6709C46.6581 10.5733 52.9094 10.1465 52.9094 14.4148C52.9094 17.2319 50.9162 18.0855 48.5607 18.0855C44.4838 18.0855 44.4838 15.0977 44.4838 13.8172H46.2957V13.7319Z" fill="#004098"/>
  7158. </g>
  7159. <defs>
  7160. <clipPath id="clip0_264_110">
  7161. <rect width="66" height="23" fill="white" transform="translate(65)"/>
  7162. </clipPath>
  7163. <clipPath id="clip1_264_110">
  7164. <rect width="53" height="14" fill="white" transform="translate(0 4)"/>
  7165. </clipPath>
  7166. </defs>
  7167. </svg>
  7168. </file>
  7169. <file path="assets/img/logo_foot2.svg">
  7170. <svg width="187" height="23" viewBox="0 0 187 23" fill="none" xmlns="http://www.w3.org/2000/svg">
  7171. <g clip-path="url(#clip0_478_288)">
  7172. <path d="M178.469 14.2716C178.582 14.0946 178.638 13.9177 178.638 13.7408V10.969H177.179H176.449V12.0305H176.954V13.21C176.954 13.21 177.01 13.7998 176.393 13.7998C176.393 13.7998 175.888 13.7998 175.888 13.269V9.6126C175.888 9.08183 176.393 9.08183 176.393 9.08183C176.954 9.08183 176.954 9.67157 176.954 9.67157V10.0254H178.638V9.08183C178.638 8.43311 177.908 8.02029 177.908 8.02029C177.515 7.72542 176.786 7.72542 176.786 7.72542H175.944C175.214 7.72542 174.765 8.13824 174.765 8.13824C174.204 8.49208 174.204 9.1408 174.204 9.1408V10.1434V12.6203V13.6229C174.204 13.6229 174.204 14.2716 174.765 14.6254C174.765 14.6254 175.214 15.0382 175.944 15.0382H176.73C171.173 17.5741 163.765 19.8152 155.515 21.2895C137.332 24.5331 121.842 22.7049 121 17.2793C120.551 14.3895 124.255 11.028 130.541 8.07926C130.036 8.43311 130.036 9.08183 130.036 9.08183V10.0844C130.036 10.91 130.597 11.3229 130.597 11.3229C130.765 11.4408 132.112 12.2075 132.112 12.2075C132.673 12.3844 132.73 12.9152 132.73 12.9152C132.73 13.6229 132.168 13.6229 132.168 13.6229C131.607 13.6229 131.607 12.9152 131.607 12.9152V12.4434H129.811V12.9152C129.811 14.0946 130.429 14.4485 130.429 14.4485C130.99 14.9203 132.281 14.9203 132.281 14.9203C133.291 14.9203 133.964 14.3895 133.964 14.3895C134.469 13.9767 134.526 13.387 134.526 13.387V12.3844C134.526 11.3818 133.684 10.969 133.684 10.969L132.224 10.2613C131.663 10.0254 131.719 9.6126 131.719 9.6126C131.719 9.08183 132.224 9.08183 132.224 9.08183C132.786 9.08183 132.786 9.67157 132.786 9.67157V10.0254H134.469V9.08183C134.469 8.43311 133.74 8.02029 133.74 8.02029C133.347 7.72542 132.617 7.72542 132.617 7.72542H131.776C131.663 7.72542 131.551 7.72542 131.383 7.78439C136.883 5.30747 144.235 3.06644 152.372 1.59208C170.556 -1.6515 186.046 0.1767 186.888 5.60234C187.393 8.37414 184.138 11.4408 178.469 14.2716ZM157.143 9.08183C157.143 8.43311 156.413 8.02029 156.413 8.02029C156.02 7.72542 155.291 7.72542 155.291 7.72542H154.449C153.719 7.72542 153.27 8.13824 153.27 8.13824C152.709 8.49208 152.709 9.1408 152.709 9.1408V10.1434C152.709 10.969 153.27 11.3818 153.27 11.3818C153.439 11.4998 154.786 12.2664 154.786 12.2664C155.347 12.4434 155.403 12.9741 155.403 12.9741C155.403 13.6818 154.842 13.6818 154.842 13.6818C154.281 13.6818 154.281 12.9741 154.281 12.9741V12.5023H152.485V12.9741C152.485 14.1536 153.102 14.5075 153.102 14.5075C153.663 14.9793 154.954 14.9793 154.954 14.9793C155.964 14.9793 156.638 14.4485 156.638 14.4485C157.143 14.0357 157.199 13.4459 157.199 13.4459V12.4434C157.199 11.4408 156.357 11.028 156.357 11.028L154.842 10.2023C154.281 9.96644 154.337 9.55362 154.337 9.55362C154.337 9.02285 154.842 9.02285 154.842 9.02285C155.403 9.02285 155.403 9.6126 155.403 9.6126V10.0254H157.087V9.08183H157.143ZM140.306 7.90234H137.444L136.321 14.7434H138.117L138.903 9.3767L139.689 14.7434H141.485L140.306 7.90234ZM145.077 14.7434V9.6126L146.143 14.7434H147.939L149.005 9.6126V14.7434C148.893 14.7434 150.633 14.7434 150.633 14.7434V7.90234H147.883L146.985 11.7946L146.199 7.90234H143.449V14.7434H145.077ZM171.903 7.90234H170.276V12.0305L168.48 7.90234H166.403V14.7434H168.031V10.6741L169.827 14.7434H171.903M161.184 13.1511V7.90234H159.332V13.0921C159.332 13.0921 159.219 15.0972 161.633 15.0972C164.158 15.0972 163.99 13.0921 163.99 13.0921V7.90234H162.138V13.1511C162.138 13.1511 162.138 13.7408 161.633 13.7408C161.184 13.7408 161.184 13.1511 161.184 13.1511Z" fill="#0B318B"/>
  7173. </g>
  7174. <g clip-path="url(#clip1_478_288)">
  7175. <path d="M3.77226 4.44191C2.09859 4.63878 1.02328 5.47441 0.693744 6.84378C0.568002 7.36441 0.53765 8.12128 0.620033 8.59378C0.750111 9.34628 1.0146 9.83191 1.64765 10.4794C2.14195 10.9825 2.59722 11.3107 3.75058 11.9888C4.99499 12.715 5.53265 13.1613 5.77113 13.6513C5.86218 13.835 5.87519 13.9269 5.87519 14.3032C5.87085 14.7975 5.78413 15.06 5.53699 15.3225C5.29851 15.5763 5.09906 15.6507 4.63511 15.6725C4.06277 15.6988 3.78093 15.6113 3.50777 15.34C3.20859 15.0338 3.1132 14.745 3.08718 14.0275L3.0655 13.45H0.390228V13.9619C0.394564 15.2175 0.663392 16.04 1.27476 16.6657C1.52624 16.9238 1.66066 17.02 1.99453 17.1819C2.71863 17.5319 3.31699 17.6282 4.52671 17.5932C5.68007 17.5625 6.26109 17.4444 6.98085 17.09C7.45781 16.8582 7.94777 16.355 8.19058 15.8563C8.48976 15.235 8.5548 14.9069 8.55913 14.0188C8.56347 13.1263 8.52011 12.9075 8.2166 12.2907C7.80035 11.4375 7.11093 10.8469 5.48495 9.95003C4.12781 9.20191 3.62917 8.80816 3.3907 8.30066C3.28663 8.07753 3.27363 7.99441 3.27363 7.63128C3.27796 7.29003 3.29531 7.18066 3.37769 7.01003C3.59449 6.55941 4.01507 6.31878 4.58742 6.31878C5.10773 6.31878 5.41558 6.49378 5.6237 6.90066C5.74511 7.14566 5.84917 7.65316 5.85351 8.01628V8.24378L7.14562 8.23503L8.43339 8.22191L8.42472 7.60941C8.41171 6.55066 8.17324 5.89441 7.59222 5.30816C7.09359 4.80941 6.5039 4.55566 5.58035 4.43753C5.16843 4.38503 4.24054 4.38941 3.77226 4.44191ZM38.5682 4.45941C37.0332 4.66941 36.0403 5.38253 35.6674 6.52878C35.5113 7.01878 35.4593 7.36441 35.4593 7.98128C35.4593 8.63753 35.5503 9.04003 35.8148 9.55191C36.2528 10.405 36.8815 10.9475 38.5855 11.9582C39.8559 12.7107 40.2375 13.0038 40.515 13.4238C40.7448 13.7738 40.8272 14.1325 40.7621 14.5394C40.6798 15.095 40.4066 15.4669 39.9817 15.6157C39.7215 15.7032 39.0971 15.7032 38.811 15.6069C38.2256 15.4188 37.9394 14.8107 37.9394 13.7519V13.45H35.3032L35.2728 13.7432C35.2425 14.0932 35.3075 14.8719 35.4073 15.2832C35.4463 15.4407 35.5634 15.7513 35.6674 15.9744C36.1964 17.09 37.2891 17.6063 39.1188 17.6063C41.9805 17.6063 43.277 16.6088 43.4678 14.255C43.5241 13.5944 43.3811 12.8332 43.0992 12.2688C42.683 11.4332 42.0109 10.8644 40.3676 9.95003C39.353 9.38566 39.0278 9.17128 38.7069 8.86503C38.282 8.45378 38.1519 8.16941 38.1519 7.64003C38.1476 7.06691 38.3557 6.68191 38.7806 6.46316C38.9584 6.36691 39.0798 6.34503 39.4007 6.32753C39.7736 6.31003 39.8212 6.31878 40.0467 6.42816C40.4543 6.62941 40.6624 7.05816 40.7101 7.80191L40.7361 8.22191L42.0282 8.23503L43.316 8.24378V7.71003C43.3117 5.46128 42.0889 4.38066 39.5654 4.39816C39.2316 4.40253 38.785 4.42878 38.5682 4.45941ZM71.066 4.44191C69.2579 4.67378 68.2043 5.59691 67.7534 7.32941C67.5843 7.98128 67.5062 8.62441 67.4715 9.75316C67.4325 10.895 67.4759 13.0738 67.5539 13.6688C67.6753 14.6444 67.8184 15.2088 68.0872 15.7688C68.2303 16.0663 68.3387 16.215 68.6379 16.5169C69.0455 16.9325 69.375 17.1294 69.9604 17.3132C70.6541 17.5319 71.0834 17.58 72.2801 17.5844C73.4421 17.5844 73.841 17.5494 75.3066 17.3132L76.009 17.1994V10.6938L73.9624 10.7025L71.9115 10.7157L71.8985 11.6869L71.8898 12.6625H73.3641V15.4975L73.1603 15.5675C72.5619 15.7557 71.7641 15.8038 71.3218 15.6682C70.7148 15.4844 70.3939 14.9069 70.2465 13.7344C70.0991 12.5707 70.1078 9.01816 70.2639 8.13441C70.42 7.21566 70.7018 6.69066 71.1744 6.43691C71.3218 6.35378 71.4172 6.34066 71.8248 6.34066C72.2324 6.34066 72.3321 6.35378 72.5186 6.44128C73.0649 6.69503 73.299 7.15003 73.3511 8.07753L73.3771 8.55003H76.022L75.996 7.99003C75.9656 7.32066 75.8529 6.82191 75.6187 6.34066C75.1114 5.28191 74.0968 4.62128 72.7137 4.43753C72.3278 4.38941 71.4649 4.38941 71.066 4.44191ZM85.2662 4.42003C84.0912 4.56003 83.3497 4.86191 82.7687 5.44378C82.2484 5.96441 82.0013 6.54191 81.8972 7.49128C81.8061 8.31378 81.9622 9.09253 82.3438 9.74441C82.5823 10.1513 83.276 10.8513 83.792 11.2013C84.0088 11.35 84.5248 11.6694 84.941 11.9188C85.9816 12.5313 86.3502 12.785 86.658 13.0957C87.0483 13.4938 87.1654 13.7344 87.187 14.2025C87.2174 14.8413 87.0136 15.2919 86.58 15.5282C86.3805 15.6375 86.2938 15.6594 85.9339 15.6725C84.8196 15.7207 84.3773 15.1957 84.3773 13.8307V13.45L83.0462 13.4588L81.7107 13.4719L81.7151 14.1063C81.7151 14.4563 81.7411 14.8588 81.7714 15.0032C82.0446 16.3638 82.7427 17.1163 84.0521 17.4575C84.4164 17.5538 84.6158 17.5757 85.2749 17.5932C87.9068 17.6719 89.2943 16.9238 89.7582 15.1738C89.8883 14.6882 89.923 13.6075 89.8233 13.1263C89.6282 12.1638 89.0515 11.3807 88.0499 10.7025C87.8071 10.5407 87.2 10.1775 86.7057 9.90191C85.2402 9.08816 84.7849 8.68566 84.6158 8.05128C84.4164 7.31628 84.7632 6.57253 85.3876 6.38441C85.6434 6.31003 86.103 6.30128 86.3415 6.36691C86.541 6.42378 86.8271 6.66878 86.9355 6.88753C87.0439 7.09753 87.1523 7.65316 87.1523 7.98128V8.24378H89.7669L89.7409 7.59628C89.7235 7.15441 89.6889 6.84378 89.6282 6.60753C89.2943 5.33441 88.4011 4.62566 86.8922 4.43753C86.554 4.39816 85.5697 4.38503 85.2662 4.42003ZM105.407 4.44191C104.015 4.60378 103.044 5.20753 102.571 6.20066C102.298 6.76941 102.22 7.15878 102.22 7.93753C102.22 8.46253 102.237 8.62878 102.319 8.91316C102.649 10.0725 103.386 10.8119 105.385 11.9888C106.374 12.5707 106.612 12.7369 106.994 13.1175C107.449 13.5725 107.549 13.8132 107.523 14.3688C107.492 14.9507 107.275 15.34 106.859 15.5632C106.616 15.69 105.953 15.7207 105.606 15.62C104.999 15.4407 104.717 14.885 104.713 13.8744V13.45H102.025V13.9007C102.025 15.1869 102.302 16.0532 102.909 16.6613C103.542 17.3 104.271 17.5494 105.61 17.5932C106.512 17.6194 107.158 17.5669 107.787 17.405C109.001 17.0944 109.777 16.3375 110.098 15.1344C110.176 14.8413 110.189 14.6575 110.194 13.9969C110.198 13.2882 110.189 13.1788 110.098 12.8813C109.886 12.1988 109.487 11.5994 108.932 11.1269C108.511 10.7638 108.099 10.4969 107.111 9.94566C105.693 9.14941 105.294 8.83441 105.025 8.28753C104.925 8.07753 104.908 7.99441 104.908 7.65316C104.912 7.16316 105.021 6.87878 105.311 6.62503C105.545 6.41503 105.836 6.31878 106.23 6.31878C107.024 6.31878 107.406 6.78691 107.475 7.83691L107.501 8.24378H110.102L110.076 7.61816C110.029 6.49378 109.782 5.83316 109.201 5.27316C108.711 4.80503 108.108 4.55128 107.215 4.43753C106.803 4.38503 105.875 4.38941 105.407 4.44191ZM12.9514 4.64316C12.9298 4.67816 9.45234 17.3307 9.45234 17.3657C9.45234 17.3788 10.042 17.3832 10.7618 17.3788L12.0669 17.3657L12.4181 15.9744L12.7693 14.5875L14.5861 14.5963L16.4072 14.6094L16.7497 15.9963L17.0923 17.3875H19.8976L19.8412 17.2038C19.8152 17.0988 19.0391 14.2244 18.1199 10.8163L16.4549 4.61253H14.7118C13.7536 4.61253 12.9601 4.62566 12.9514 4.64316ZM15.1714 9.73128C15.501 11.1619 15.7871 12.4 15.8045 12.4744L15.8348 12.6188H14.5731C13.8793 12.6188 13.3113 12.61 13.3113 12.5969C13.3113 12.5532 14.4864 7.17191 14.5124 7.10628C14.5254 7.07128 14.5427 7.05816 14.5514 7.08441C14.5601 7.10628 14.8376 8.30066 15.1714 9.73128ZM20.9859 11V17.3875H23.5875V12.4569C23.5875 9.74878 23.5962 7.53941 23.6092 7.54816C23.6178 7.56128 24.1338 9.73566 24.7539 12.3782C25.3782 15.025 25.8942 17.2344 25.9072 17.2869L25.9289 17.3875H28.4784L29.6838 12.4963C30.3429 9.81003 30.9022 7.59191 30.9196 7.56566C30.9412 7.54378 30.9586 9.70066 30.9586 12.4569V17.3875H33.5168V4.61253H31.4616C29.8573 4.61253 29.402 4.62566 29.389 4.66503C29.376 4.69566 28.9034 6.64691 28.3353 8.99628C27.763 11.35 27.286 13.275 27.273 13.275C27.26 13.275 26.8308 11.4507 26.3235 9.21503C25.8162 6.98378 25.3696 5.03691 25.3349 4.88378L25.2698 4.61253H20.9859V11ZM45.2368 9.52128C45.2542 14.8238 45.2412 14.5657 45.4796 15.2569C45.8829 16.4338 46.7934 17.1732 48.2373 17.4969C48.6492 17.5932 49.911 17.6325 50.3923 17.5669C51.5239 17.4138 52.4388 16.9544 53.0112 16.2544C53.3017 15.9 53.6009 15.2963 53.7309 14.8063L53.8263 14.4344L53.8393 9.52128L53.8567 4.61253H51.2118L51.1944 9.41191C51.1857 13.7344 51.1771 14.2375 51.112 14.4519C50.9343 15.0294 50.6741 15.375 50.2578 15.5675C50.0887 15.6463 49.976 15.6594 49.5381 15.6594C49.0958 15.6594 48.9874 15.6463 48.8183 15.5675C48.4194 15.3794 48.1202 14.9725 47.9685 14.4038C47.9034 14.1544 47.8948 13.6688 47.8818 9.36816L47.8644 4.61253H45.2195L45.2368 9.52128ZM55.9336 11V17.3875H58.4484L58.4571 12.7194L58.4701 8.05128L60.0918 12.4482C60.985 14.8632 61.7654 16.9632 61.8218 17.1163L61.9259 17.3875H65.4293V4.61253H62.9578L62.9535 9.04003C62.9535 12.225 62.9405 13.4544 62.9058 13.4019C62.8798 13.3669 62.1123 11.3763 61.2061 8.98316L59.5498 4.63441L57.7417 4.62128L55.9336 4.61253V11ZM91.7484 11V17.3875H94.2156C96.8778 17.3875 97.073 17.3744 97.7277 17.1469C98.9201 16.74 99.6962 15.8125 100.056 14.3732C100.269 13.5244 100.308 13.0388 100.308 11.2407C100.308 9.53878 100.269 8.91753 100.117 8.00316C99.8003 6.12191 98.9461 5.07628 97.4285 4.71753C97.1423 4.64753 96.7998 4.63878 94.428 4.62566L91.7484 4.60816V11ZM96.5223 6.72566C97.2551 7.08878 97.5196 7.81066 97.6106 9.72253C97.667 10.895 97.6106 12.8507 97.4979 13.5244C97.3331 14.5044 97.047 15.0163 96.5266 15.2744C96.2838 15.3969 96.2665 15.3969 95.3603 15.41L94.4367 15.4232V6.57253L95.3603 6.59003C96.2621 6.60316 96.2838 6.60316 96.5223 6.72566Z" fill="#034EA2"/>
  7176. </g>
  7177. <defs>
  7178. <clipPath id="clip0_478_288">
  7179. <rect width="66" height="23" fill="white" transform="translate(121)"/>
  7180. </clipPath>
  7181. <clipPath id="clip1_478_288">
  7182. <rect width="111" height="14" fill="white" transform="translate(0 4)"/>
  7183. </clipPath>
  7184. </defs>
  7185. </svg>
  7186. </file>
  7187. <file path="assets/img/logo_login.svg">
  7188. <svg width="160" height="20" viewBox="0 0 160 20" fill="none" xmlns="http://www.w3.org/2000/svg">
  7189. <path d="M5.4375 0.631158C3.025 0.912408 1.475 2.10616 1 4.06241C0.81875 4.80616 0.775 5.88741 0.89375 6.56241C1.08125 7.63741 1.4625 8.33116 2.375 9.25616C3.0875 9.97491 3.74375 10.4437 5.40625 11.4124C7.2 12.4499 7.975 13.0874 8.31875 13.7874C8.45 14.0499 8.46875 14.1812 8.46875 14.7187C8.4625 15.4249 8.3375 15.7999 7.98125 16.1749C7.6375 16.5374 7.35 16.6437 6.68125 16.6749C5.85625 16.7124 5.45 16.5874 5.05625 16.1999C4.625 15.7624 4.4875 15.3499 4.45 14.3249L4.41875 13.4999H0.5625V14.2312C0.56875 16.0249 0.95625 17.1999 1.8375 18.0937C2.2 18.4624 2.39375 18.5999 2.875 18.8312C3.91875 19.3312 4.78125 19.4687 6.525 19.4187C8.1875 19.3749 9.025 19.2062 10.0625 18.6999C10.75 18.3687 11.4563 17.6499 11.8063 16.9374C12.2375 16.0499 12.3313 15.5812 12.3375 14.3124C12.3438 13.0374 12.2813 12.7249 11.8438 11.8437C11.2438 10.6249 10.25 9.78116 7.90625 8.49991C5.95 7.43116 5.23125 6.86866 4.8875 6.14366C4.7375 5.82491 4.71875 5.70616 4.71875 5.18741C4.725 4.69991 4.75 4.54366 4.86875 4.29991C5.18125 3.65616 5.7875 3.31241 6.6125 3.31241C7.3625 3.31241 7.80625 3.56241 8.10625 4.14366C8.28125 4.49366 8.43125 5.21866 8.4375 5.73741V6.06241L10.3 6.04991L12.1563 6.03116L12.1438 5.15616C12.125 3.64366 11.7813 2.70616 10.9438 1.86866C10.225 1.15616 9.375 0.793658 8.04375 0.624908C7.45 0.549908 6.1125 0.556158 5.4375 0.631158ZM55.5938 0.656158C53.3813 0.956158 51.95 1.97491 51.4125 3.61241C51.1875 4.31241 51.1125 4.80616 51.1125 5.68741C51.1125 6.62491 51.2438 7.19991 51.625 7.93116C52.2563 9.14991 53.1625 9.92491 55.6188 11.3687C57.45 12.4437 58 12.8624 58.4 13.4624C58.7313 13.9624 58.85 14.4749 58.7563 15.0562C58.6375 15.8499 58.2438 16.3812 57.6313 16.5937C57.2563 16.7187 56.3563 16.7187 55.9438 16.5812C55.1 16.3124 54.6875 15.4437 54.6875 13.9312V13.4999H50.8875L50.8438 13.9187C50.8 14.4187 50.8938 15.5312 51.0375 16.1187C51.0938 16.3437 51.2625 16.7874 51.4125 17.1062C52.175 18.6999 53.75 19.4374 56.3875 19.4374C60.5125 19.4374 62.3813 18.0124 62.6563 14.6499C62.7375 13.7062 62.5313 12.6187 62.125 11.8124C61.525 10.6187 60.5563 9.80616 58.1875 8.49991C56.725 7.69366 56.2563 7.38741 55.7938 6.94991C55.1813 6.36241 54.9938 5.95616 54.9938 5.19991C54.9875 4.38116 55.2875 3.83116 55.9 3.51866C56.1563 3.38116 56.3313 3.34991 56.7938 3.32491C57.3313 3.29991 57.4 3.31241 57.725 3.46866C58.3125 3.75616 58.6125 4.36866 58.6813 5.43116L58.7188 6.03116L60.5813 6.04991L62.4375 6.06241V5.29991C62.4313 2.08741 60.6688 0.543658 57.0313 0.568658C56.55 0.574908 55.9063 0.612408 55.5938 0.656158ZM102.438 0.631158C99.8313 0.962408 98.3125 2.28116 97.6625 4.75616C97.4188 5.68741 97.3063 6.60616 97.2563 8.21866C97.2 9.84991 97.2625 12.9624 97.375 13.8124C97.55 15.2062 97.7563 16.0124 98.1438 16.8124C98.35 17.2374 98.5063 17.4499 98.9375 17.8812C99.525 18.4749 100 18.7562 100.844 19.0187C101.844 19.3312 102.463 19.3999 104.188 19.4062C105.863 19.4062 106.438 19.3562 108.55 19.0187L109.563 18.8562V9.56241L106.613 9.57491L103.656 9.59366L103.638 10.9812L103.625 12.3749H105.75V16.4249L105.456 16.5249C104.594 16.7937 103.444 16.8624 102.806 16.6687C101.931 16.4062 101.469 15.5812 101.256 13.9062C101.044 12.2437 101.056 7.16866 101.281 5.90616C101.506 4.59366 101.913 3.84366 102.594 3.48116C102.806 3.36241 102.944 3.34366 103.531 3.34366C104.119 3.34366 104.263 3.36241 104.531 3.48741C105.319 3.84991 105.656 4.49991 105.731 5.82491L105.769 6.49991H109.581L109.544 5.69991C109.5 4.74366 109.338 4.03116 109 3.34366C108.269 1.83116 106.806 0.887408 104.813 0.624908C104.256 0.556158 103.013 0.556158 102.438 0.631158ZM122.906 0.599908C121.213 0.799908 120.144 1.23116 119.306 2.06241C118.556 2.80616 118.2 3.63116 118.05 4.98741C117.919 6.16241 118.144 7.27491 118.694 8.20616C119.038 8.78741 120.038 9.78741 120.781 10.2874C121.094 10.4999 121.838 10.9562 122.438 11.3124C123.938 12.1874 124.469 12.5499 124.913 12.9937C125.475 13.5624 125.644 13.9062 125.675 14.5749C125.719 15.4874 125.425 16.1312 124.8 16.4687C124.513 16.6249 124.388 16.6562 123.869 16.6749C122.263 16.7437 121.625 15.9937 121.625 14.0437V13.4999L119.706 13.5124L117.781 13.5312L117.788 14.4374C117.788 14.9374 117.825 15.5124 117.869 15.7187C118.263 17.6624 119.269 18.7374 121.156 19.2249C121.681 19.3624 121.969 19.3937 122.919 19.4187C126.713 19.5312 128.713 18.4624 129.381 15.9624C129.569 15.2687 129.619 13.7249 129.475 13.0374C129.194 11.6624 128.363 10.5437 126.919 9.57491C126.569 9.34366 125.694 8.82491 124.981 8.43116C122.869 7.26866 122.213 6.69366 121.969 5.78741C121.681 4.73741 122.181 3.67491 123.081 3.40616C123.45 3.29991 124.113 3.28741 124.456 3.38116C124.744 3.46241 125.156 3.81241 125.313 4.12491C125.469 4.42491 125.625 5.21866 125.625 5.68741V6.06241H129.394L129.356 5.13741C129.331 4.50616 129.281 4.06241 129.194 3.72491C128.713 1.90616 127.425 0.893658 125.25 0.624908C124.763 0.568658 123.344 0.549908 122.906 0.599908ZM151.938 0.631158C149.931 0.862408 148.531 1.72491 147.85 3.14366C147.456 3.95616 147.344 4.51241 147.344 5.62491C147.344 6.37491 147.369 6.61241 147.488 7.01866C147.963 8.67491 149.025 9.73116 151.906 11.4124C153.331 12.2437 153.675 12.4812 154.225 13.0249C154.881 13.6749 155.025 14.0187 154.988 14.8124C154.944 15.6437 154.631 16.1999 154.031 16.5187C153.681 16.6999 152.725 16.7437 152.225 16.5999C151.35 16.3437 150.944 15.5499 150.938 14.1062V13.4999H147.063V14.1437C147.063 15.9812 147.463 17.2187 148.338 18.0874C149.25 18.9999 150.3 19.3562 152.231 19.4187C153.531 19.4562 154.463 19.3812 155.369 19.1499C157.119 18.7062 158.238 17.6249 158.7 15.9062C158.813 15.4874 158.831 15.2249 158.838 14.2812C158.844 13.2687 158.831 13.1124 158.7 12.6874C158.394 11.7124 157.819 10.8562 157.019 10.1812C156.413 9.66241 155.819 9.28116 154.394 8.49366C152.35 7.35616 151.775 6.90616 151.388 6.12491C151.244 5.82491 151.219 5.70616 151.219 5.21866C151.225 4.51866 151.381 4.11241 151.8 3.74991C152.138 3.44991 152.556 3.31241 153.125 3.31241C154.269 3.31241 154.819 3.98116 154.919 5.48116L154.956 6.06241H158.706L158.669 5.16866C158.6 3.56241 158.244 2.61866 157.406 1.81866C156.7 1.14991 155.831 0.787408 154.544 0.624908C153.95 0.549908 152.613 0.556158 151.938 0.631158ZM18.6688 0.918658C18.6375 0.968658 13.625 19.0437 13.625 19.0937C13.625 19.1124 14.475 19.1187 15.5125 19.1124L17.3938 19.0937L17.9 17.1062L18.4063 15.1249L21.025 15.1374L23.65 15.1562L24.1438 17.1374L24.6375 19.1249H28.6813L28.6 18.8624C28.5625 18.7124 27.4438 14.6062 26.1188 9.73741L23.7188 0.874908H21.2063C19.825 0.874908 18.6813 0.893658 18.6688 0.918658ZM21.8688 8.18741C22.3438 10.2312 22.7563 11.9999 22.7813 12.1062L22.825 12.3124H21.0063C20.0063 12.3124 19.1875 12.2999 19.1875 12.2812C19.1875 12.2187 20.8813 4.53116 20.9188 4.43741C20.9375 4.38741 20.9625 4.36866 20.975 4.40616C20.9875 4.43741 21.3875 6.14366 21.8688 8.18741ZM30.25 9.99991V19.1249H34V12.0812C34 8.21241 34.0125 5.05616 34.0313 5.06866C34.0438 5.08741 34.7875 8.19366 35.6813 11.9687C36.5813 15.7499 37.325 18.9062 37.3438 18.9812L37.375 19.1249H41.05L42.7875 12.1374C43.7375 8.29991 44.5438 5.13116 44.5688 5.09366C44.6 5.06241 44.625 8.14366 44.625 12.0812V19.1249H48.3125V0.874908H45.35C43.0375 0.874908 42.3813 0.893658 42.3625 0.949908C42.3438 0.993658 41.6625 3.78116 40.8438 7.13741C40.0188 10.4999 39.3313 13.2499 39.3125 13.2499C39.2938 13.2499 38.675 10.6437 37.9438 7.44991C37.2125 4.26241 36.5688 1.48116 36.5188 1.26241L36.425 0.874908H30.25V9.99991ZM65.2063 7.88741C65.2313 15.4624 65.2125 15.0937 65.5563 16.0812C66.1375 17.7624 67.45 18.8187 69.5313 19.2812C70.125 19.4187 71.9438 19.4749 72.6375 19.3812C74.2688 19.1624 75.5875 18.5062 76.4125 17.5062C76.8313 16.9999 77.2625 16.1374 77.45 15.4374L77.5875 14.9062L77.6063 7.88741L77.6313 0.874908H73.8188L73.7938 7.73116C73.7813 13.9062 73.7688 14.6249 73.675 14.9312C73.4188 15.7562 73.0438 16.2499 72.4438 16.5249C72.2 16.6374 72.0375 16.6562 71.4063 16.6562C70.7688 16.6562 70.6125 16.6374 70.3688 16.5249C69.7938 16.2562 69.3625 15.6749 69.1438 14.8624C69.05 14.5062 69.0375 13.8124 69.0188 7.66866L68.9938 0.874908H65.1813L65.2063 7.88741ZM80.625 9.99991V19.1249H84.25L84.2625 12.4562L84.2813 5.78741L86.6188 12.0687C87.9063 15.5187 89.0313 18.5187 89.1125 18.7374L89.2625 19.1249H94.3125V0.874908H90.75L90.7438 7.19991C90.7438 11.7499 90.725 13.5062 90.675 13.4312C90.6375 13.3812 89.5313 10.5374 88.225 7.11866L85.8375 0.906158L83.2313 0.887408L80.625 0.874908V9.99991ZM132.25 9.99991V19.1249H135.806C139.644 19.1249 139.925 19.1062 140.869 18.7812C142.588 18.1999 143.706 16.8749 144.225 14.8187C144.531 13.6062 144.588 12.9124 144.588 10.3437C144.588 7.91241 144.531 7.02491 144.313 5.71866C143.856 3.03116 142.625 1.53741 140.438 1.02491C140.025 0.924908 139.531 0.912408 136.113 0.893658L132.25 0.868658V9.99991ZM139.131 3.89366C140.188 4.41241 140.569 5.44366 140.7 8.17491C140.781 9.84991 140.7 12.6437 140.538 13.6062C140.3 15.0062 139.888 15.7374 139.138 16.1062C138.788 16.2812 138.763 16.2812 137.456 16.2999L136.125 16.3187V3.67491L137.456 3.69991C138.756 3.71866 138.788 3.71866 139.131 3.89366Z" fill="#034EA2"/>
  7190. </svg>
  7191. </file>
  7192. <file path="assets/img/logo_new.svg">
  7193. <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
  7194. <g clip-path="url(#clip0_798_924)">
  7195. <path fill-rule="evenodd" clip-rule="evenodd" d="M22.3185 30.0345C23.3174 30.0175 24.2704 29.6221 24.9768 28.9317C25.6832 28.2412 26.0877 27.3097 26.1051 26.3334C26.1051 24.9627 25.0089 23.7907 23.5807 23.2491C23.3327 19.8527 20.4884 17.4797 16.6388 17.6974C13.8361 17.8578 11.2524 19.0601 10.3279 21.3985C7.76188 21.5904 5.69255 23.4551 5.91028 25.7165C6.11349 27.8397 7.91019 30.0302 10.3279 30.0345H22.3185ZM18.8745 28.1481C17.3457 28.1481 16.1361 27.1833 16.1361 25.3132C16.1361 23.4727 17.3754 22.4189 18.8522 22.4189C19.6611 22.4189 20.24 22.7603 20.6185 23.1388L19.9209 23.9848C19.6463 23.7399 19.3569 23.5544 18.8968 23.5544C18.0804 23.5544 17.4942 24.1926 17.4942 25.2686C17.4942 26.367 17.9839 27.0052 19.0155 27.0052C19.2084 27.0052 19.4162 26.9532 19.535 26.8642V25.9737H18.6593V24.8902H20.7149V27.4727C20.329 27.8438 19.6463 28.1481 18.8745 28.1481ZM11.4135 27.3841C11.8514 27.8145 12.4599 28.1485 13.3431 28.1485C14.4043 28.1485 15.3393 27.4509 15.3393 26.2561C15.3393 25.1132 14.5527 24.5863 13.6176 24.5863C13.4098 24.5863 13.2466 24.616 13.0462 24.6976L13.1278 23.7626H15.0944V22.6568H11.9924L11.8514 25.3952L12.4302 25.7737C12.7568 25.5659 12.9052 25.4991 13.2095 25.4991C13.6844 25.4991 14.0184 25.7811 14.0184 26.2932C14.0184 26.8127 13.6844 27.0798 13.1501 27.0798C12.7123 27.0798 12.3264 26.8498 12.0147 26.5529L11.4135 27.3841Z" fill="white"/>
  7196. <path opacity="0.75" fill-rule="evenodd" clip-rule="evenodd" d="M17.9795 9.04996C17.3791 8.42779 16.5366 8.04083 15.6037 8.04083C14.5984 8.04083 13.6981 8.49012 13.0925 9.19886L10.9207 7.12576C12.0741 5.84562 13.7449 5.04083 15.6037 5.04083C17.4413 5.04083 19.0952 5.82743 20.2471 7.08229L17.9795 9.04996ZM21.789 5.74428C20.2625 4.05878 18.0567 3 15.6036 3C13.1642 3 10.9694 4.04697 9.44389 5.71606L7.27344 3.64426C9.34554 1.4032 12.3107 0 15.6036 0C18.9614 0 21.9784 1.45904 24.0552 3.77772L21.789 5.74428Z" fill="white"/>
  7197. <path opacity="0.45" fill-rule="evenodd" clip-rule="evenodd" d="M29 31.158V26.9473C29 19.7676 23.1797 13.9473 16 13.9473C8.8203 13.9473 3 19.7676 3 26.9473V31.158H0V26.9473C0 18.1107 7.16344 10.9473 16 10.9473C24.8366 10.9473 32 18.1107 32 26.9473V31.158H29Z" fill="white"/>
  7198. </g>
  7199. <defs>
  7200. <clipPath id="clip0_798_924">
  7201. <rect width="32" height="32" fill="white"/>
  7202. </clipPath>
  7203. </defs>
  7204. </svg>
  7205. </file>
  7206. <file path="assets/img/logo_sams_sds.svg">
  7207. <svg width="130" height="15" viewBox="0 0 130 15" fill="none" xmlns="http://www.w3.org/2000/svg">
  7208. <g clip-path="url(#clip0_61_23266)">
  7209. <path d="M4.41797 0.473369C2.45781 0.684306 1.19844 1.57962 0.8125 3.04681C0.665234 3.60462 0.629688 4.41556 0.726172 4.92181C0.878516 5.72806 1.18828 6.24837 1.92969 6.94212C2.50859 7.48118 3.0418 7.83274 4.39258 8.55931C5.85 9.33743 6.47969 9.81556 6.75899 10.3406C6.86563 10.5374 6.88086 10.6359 6.88086 11.039C6.87578 11.5687 6.77422 11.8499 6.48477 12.1312C6.20547 12.4031 5.97188 12.4827 5.42852 12.5062C4.7582 12.5343 4.42813 12.4406 4.1082 12.1499C3.75781 11.8218 3.64609 11.5124 3.61563 10.7437L3.59023 10.1249H0.457031V10.6734C0.462109 12.0187 0.776953 12.8999 1.49297 13.5702C1.7875 13.8468 1.94492 13.9499 2.33594 14.1234C3.18398 14.4984 3.88477 14.6015 5.30156 14.564C6.65234 14.5312 7.33281 14.4046 8.17578 14.0249C8.73438 13.7765 9.3082 13.2374 9.59258 12.7031C9.94297 12.0374 10.0191 11.6859 10.0242 10.7343C10.0293 9.77806 9.97852 9.54368 9.62305 8.88274C9.13555 7.96868 8.32813 7.33587 6.42383 6.37493C4.83438 5.57337 4.25039 5.15149 3.97109 4.60774C3.84922 4.36868 3.83398 4.27962 3.83398 3.89056C3.83906 3.52493 3.85938 3.40774 3.95586 3.22493C4.20977 2.74212 4.70234 2.48431 5.37266 2.48431C5.98203 2.48431 6.34258 2.67181 6.58633 3.10774C6.72852 3.37024 6.85039 3.91399 6.85547 4.30306V4.54681L8.36875 4.53743L9.87695 4.52337L9.8668 3.86712C9.85156 2.73274 9.57227 2.02962 8.8918 1.40149C8.30781 0.867119 7.61719 0.595244 6.53555 0.468681C6.05313 0.412431 4.96641 0.417119 4.41797 0.473369ZM45.1699 0.492119C43.3723 0.717119 42.2094 1.48118 41.7727 2.70931C41.5898 3.23431 41.5289 3.60462 41.5289 4.26556C41.5289 4.96868 41.6356 5.39993 41.9453 5.94837C42.4582 6.86243 43.1945 7.44368 45.1902 8.52649C46.6781 9.33274 47.125 9.64681 47.45 10.0968C47.7191 10.4718 47.8156 10.8562 47.7395 11.2921C47.643 11.8874 47.323 12.2859 46.8254 12.4452C46.5207 12.539 45.7895 12.539 45.4543 12.4359C44.7688 12.2343 44.4336 11.5827 44.4336 10.4484V10.1249H41.3461L41.3106 10.439C41.275 10.814 41.3512 11.6484 41.468 12.089C41.5137 12.2577 41.6508 12.5906 41.7727 12.8296C42.3922 14.0249 43.6719 14.5781 45.8148 14.5781C49.1664 14.5781 50.6848 13.5093 50.9082 10.9874C50.9742 10.2796 50.8066 9.46399 50.4766 8.85931C49.9891 7.96399 49.202 7.35462 47.2773 6.37493C46.0891 5.77024 45.7082 5.54056 45.3324 5.21243C44.8348 4.77181 44.6824 4.46712 44.6824 3.89993C44.6773 3.28587 44.9211 2.87337 45.4188 2.63899C45.627 2.53587 45.7691 2.51243 46.1449 2.49368C46.5816 2.47493 46.6375 2.48431 46.9016 2.60149C47.3789 2.81712 47.6227 3.27649 47.6785 4.07337L47.709 4.52337L49.2223 4.53743L50.7305 4.54681V3.97493C50.7254 1.56556 49.2934 0.407744 46.3379 0.426494C45.9469 0.431181 45.4238 0.459306 45.1699 0.492119ZM83.2305 0.473369C81.1129 0.721806 79.8789 1.71087 79.3508 3.56712C79.1527 4.26556 79.0613 4.95462 79.0207 6.16399C78.975 7.38743 79.0258 9.72181 79.1172 10.3593C79.2594 11.4046 79.427 12.0093 79.7418 12.6093C79.9094 12.9281 80.0363 13.0874 80.3867 13.4109C80.8641 13.8562 81.25 14.0671 81.9356 14.264C82.7481 14.4984 83.2508 14.5499 84.6524 14.5546C86.0133 14.5546 86.4805 14.5171 88.1969 14.264L89.0195 14.1421V7.17181L86.6227 7.18118L84.2207 7.19524L84.2055 8.23587L84.1953 9.28118H85.9219V12.3187L85.6832 12.3937C84.9824 12.5952 84.0481 12.6468 83.5301 12.5015C82.8191 12.3046 82.4434 11.6859 82.2707 10.4296C82.0981 9.18274 82.1082 5.37649 82.291 4.42962C82.4738 3.44524 82.8039 2.88274 83.3574 2.61087C83.5301 2.52181 83.6418 2.50774 84.1191 2.50774C84.5965 2.50774 84.7133 2.52181 84.9316 2.61556C85.5715 2.88743 85.8457 3.37493 85.9066 4.36868L85.9371 4.87493H89.0348L89.0043 4.27493C88.9688 3.55774 88.8367 3.02337 88.5625 2.50774C87.9684 1.37337 86.7801 0.665556 85.1602 0.468681C84.7082 0.417119 83.6977 0.417119 83.2305 0.473369ZM99.8613 0.449931C98.4852 0.599931 97.6168 0.923369 96.9363 1.54681C96.327 2.10462 96.0375 2.72337 95.9156 3.74056C95.809 4.62181 95.9918 5.45618 96.4387 6.15462C96.718 6.59056 97.5305 7.34056 98.1348 7.71556C98.3887 7.87493 98.993 8.21712 99.4805 8.48431C100.699 9.14056 101.131 9.41243 101.491 9.74524C101.948 10.1718 102.086 10.4296 102.111 10.9312C102.146 11.6156 101.908 12.0984 101.4 12.3515C101.166 12.4687 101.065 12.4921 100.643 12.5062C99.3383 12.5577 98.8203 11.9952 98.8203 10.5327V10.1249L97.2613 10.1343L95.6973 10.1484L95.7023 10.8281C95.7023 11.2031 95.7328 11.6343 95.7684 11.789C96.0883 13.2468 96.9059 14.0531 98.4395 14.4187C98.866 14.5218 99.0996 14.5452 99.8715 14.564C102.954 14.6484 104.579 13.8468 105.122 11.9718C105.275 11.4515 105.315 10.2937 105.198 9.77806C104.97 8.74681 104.295 7.90774 103.121 7.18118C102.837 7.00774 102.126 6.61868 101.547 6.32337C99.8309 5.45149 99.2977 5.02024 99.0996 4.34056C98.866 3.55306 99.2723 2.75618 100.004 2.55462C100.303 2.47493 100.841 2.46556 101.121 2.53587C101.354 2.59681 101.689 2.85931 101.816 3.09368C101.943 3.31868 102.07 3.91399 102.07 4.26556V4.54681H105.132L105.102 3.85306C105.082 3.37962 105.041 3.04681 104.97 2.79368C104.579 1.42962 103.533 0.670244 101.766 0.468681C101.37 0.426494 100.217 0.412431 99.8613 0.449931ZM123.449 0.473369C121.819 0.646806 120.682 1.29368 120.128 2.35774C119.808 2.96712 119.717 3.38431 119.717 4.21868C119.717 4.78118 119.737 4.95931 119.834 5.26399C120.22 6.50618 121.083 7.29837 123.424 8.55931C124.582 9.18274 124.861 9.36087 125.308 9.76868C125.841 10.2562 125.958 10.514 125.927 11.1093C125.892 11.7327 125.638 12.1499 125.15 12.389C124.866 12.5249 124.089 12.5577 123.683 12.4499C122.972 12.2577 122.642 11.6624 122.637 10.5796V10.1249H119.488V10.6077C119.488 11.9859 119.813 12.914 120.524 13.5656C121.266 14.2499 122.119 14.5171 123.688 14.564C124.744 14.5921 125.501 14.5359 126.237 14.3624C127.659 14.0296 128.568 13.2187 128.944 11.9296C129.035 11.6156 129.05 11.4187 129.055 10.7109C129.061 9.95149 129.05 9.83431 128.944 9.51556C128.695 8.78431 128.228 8.14212 127.578 7.63587C127.085 7.24681 126.603 6.96087 125.445 6.37024C123.784 5.51712 123.317 5.17962 123.002 4.59368C122.886 4.36868 122.865 4.27962 122.865 3.91399C122.87 3.38899 122.997 3.08431 123.338 2.81243C123.612 2.58743 123.952 2.48431 124.414 2.48431C125.343 2.48431 125.79 2.98587 125.871 4.11087L125.902 4.54681H128.949L128.918 3.87649C128.863 2.67181 128.573 1.96399 127.893 1.36399C127.319 0.862431 126.613 0.590556 125.567 0.468681C125.084 0.412431 123.998 0.417119 123.449 0.473369ZM15.1684 0.688994C15.143 0.726494 11.0703 14.2827 11.0703 14.3202C11.0703 14.3343 11.7609 14.339 12.6039 14.3343L14.1324 14.3202L14.5438 12.8296L14.9551 11.3437L17.0828 11.3531L19.2156 11.3671L19.6168 12.8531L20.018 14.3437H23.3035L23.2375 14.1468C23.207 14.0343 22.298 10.9546 21.2215 7.30306L19.2715 0.656181H17.2301C16.1078 0.656181 15.1785 0.670244 15.1684 0.688994ZM17.7684 6.14056C18.1543 7.67337 18.4895 8.99993 18.5098 9.07962L18.5453 9.23431H17.0676C16.2551 9.23431 15.5898 9.22493 15.5898 9.21087C15.5898 9.16399 16.966 3.39837 16.9965 3.32806C17.0117 3.29056 17.032 3.27649 17.0422 3.30462C17.0523 3.32806 17.3773 4.60774 17.7684 6.14056ZM24.5781 7.49993V14.3437H27.625V9.06087C27.625 6.15931 27.6352 3.79212 27.6504 3.80149C27.6605 3.81556 28.2648 6.14524 28.991 8.97649C29.7223 11.8124 30.3266 14.1796 30.3418 14.2359L30.3672 14.3437H33.3531L34.7648 9.10306C35.5367 6.22493 36.1918 3.84837 36.2121 3.82024C36.2375 3.79681 36.2578 6.10774 36.2578 9.06087V14.3437H39.2539V0.656181H36.8469C34.968 0.656181 34.4348 0.670244 34.4195 0.712431C34.4043 0.745244 33.8508 2.83587 33.1856 5.35306C32.5152 7.87493 31.9566 9.93743 31.9414 9.93743C31.9262 9.93743 31.4234 7.98274 30.8293 5.58743C30.2352 3.19681 29.7121 1.11087 29.6715 0.946806L29.5953 0.656181H24.5781V7.49993ZM52.9801 5.91556C53.0004 11.5968 52.9852 11.3202 53.2645 12.0609C53.7367 13.3218 54.8031 14.114 56.4941 14.4609C56.9766 14.564 58.4543 14.6062 59.018 14.5359C60.3434 14.3718 61.4148 13.8796 62.0852 13.1296C62.4254 12.7499 62.7758 12.1031 62.9281 11.5781L63.0398 11.1796L63.0551 5.91556L63.0754 0.656181H59.9777L59.9574 5.79837C59.9473 10.4296 59.9371 10.9687 59.8609 11.1984C59.6527 11.8171 59.348 12.1874 58.8605 12.3937C58.6625 12.4781 58.5305 12.4921 58.0176 12.4921C57.4996 12.4921 57.3727 12.4781 57.1746 12.3937C56.7074 12.1921 56.357 11.7562 56.1793 11.1468C56.1031 10.8796 56.093 10.3593 56.0777 5.75149L56.0574 0.656181H52.9598L52.9801 5.91556ZM65.5078 7.49993V14.3437H68.4531L68.4633 9.34212L68.4785 4.34056L70.3777 9.05149C71.4238 11.639 72.3379 13.889 72.4039 14.0531L72.5258 14.3437H76.6289V0.656181H73.7344L73.7293 5.39993C73.7293 8.81243 73.7141 10.1296 73.6734 10.0734C73.643 10.0359 72.7441 7.90306 71.6828 5.33899L69.743 0.679619L67.6254 0.665556L65.5078 0.656181V7.49993ZM107.453 7.49993V14.3437H110.343C113.461 14.3437 113.689 14.3296 114.456 14.0859C115.852 13.6499 116.761 12.6562 117.183 11.114C117.432 10.2046 117.477 9.68431 117.477 7.75774C117.477 5.93431 117.432 5.26868 117.254 4.28899C116.883 2.27337 115.883 1.15306 114.105 0.768681C113.77 0.693681 113.369 0.684306 110.591 0.670244L107.453 0.651494V7.49993ZM113.044 2.92024C113.902 3.30931 114.212 4.08274 114.319 6.13118C114.385 7.38743 114.319 9.48274 114.187 10.2046C113.994 11.2546 113.659 11.8031 113.049 12.0796C112.765 12.2109 112.745 12.2109 111.683 12.2249L110.602 12.239V2.75618L111.683 2.77493C112.739 2.78899 112.765 2.78899 113.044 2.92024Z" fill="#034EA2"/>
  7210. </g>
  7211. <defs>
  7212. <clipPath id="clip0_61_23266">
  7213. <rect width="130" height="15" fill="white"/>
  7214. </clipPath>
  7215. </defs>
  7216. </svg>
  7217. </file>
  7218. <file path="assets/img/logo_sams.svg">
  7219. <svg width="97" height="32" viewBox="0 0 97 32" fill="none" xmlns="http://www.w3.org/2000/svg">
  7220. <g clip-path="url(#clip0_61_23264)">
  7221. <path d="M84.4627 19.8564C84.6277 19.6102 84.7102 19.364 84.7102 19.1179V15.2615H82.5656H81.4934V16.7384H82.2357V18.3794C82.2357 18.3794 82.3182 19.1999 81.4109 19.1999C81.4109 19.1999 80.6685 19.1999 80.6685 18.4615V13.3743C80.6685 12.6358 81.4109 12.6358 81.4109 12.6358C82.2357 12.6358 82.2357 13.4564 82.2357 13.4564V13.9487H84.7102V12.6358C84.7102 11.7333 83.6379 11.1589 83.6379 11.1589C83.0605 10.7487 81.9883 10.7487 81.9883 10.7487H80.751C79.6787 10.7487 79.0189 11.323 79.0189 11.323C78.194 11.8153 78.194 12.7179 78.194 12.7179V14.1128V17.5589V18.9538C78.194 18.9538 78.194 19.8564 79.0189 20.3487C79.0189 20.3487 79.6787 20.923 80.751 20.923H81.9058C73.74 24.4512 62.8522 27.5692 50.7272 29.6205C24.0027 34.1333 1.23741 31.5897 0.000162017 24.041C-0.659702 20.0205 4.78417 15.3435 14.0223 11.241C13.2799 11.7333 13.2799 12.6358 13.2799 12.6358V14.0307C13.2799 15.1794 14.1048 15.7538 14.1048 15.7538C14.3522 15.9179 16.3318 16.9846 16.3318 16.9846C17.1566 17.2307 17.2391 17.9692 17.2391 17.9692C17.2391 18.9538 16.4143 18.9538 16.4143 18.9538C15.5894 18.9538 15.5894 17.9692 15.5894 17.9692V17.3128H12.95V17.9692C12.95 19.6102 13.8573 20.1025 13.8573 20.1025C14.6821 20.7589 16.5792 20.7589 16.5792 20.7589C18.0639 20.7589 19.0537 20.0205 19.0537 20.0205C19.7961 19.4461 19.8786 18.6256 19.8786 18.6256V17.2307C19.8786 15.8358 18.6413 15.2615 18.6413 15.2615L16.4968 14.2769C15.6719 13.9487 15.7544 13.3743 15.7544 13.3743C15.7544 12.6358 16.4968 12.6358 16.4968 12.6358C17.3216 12.6358 17.3216 13.4564 17.3216 13.4564V13.9487H19.7961V12.6358C19.7961 11.7333 18.7238 11.1589 18.7238 11.1589C18.1464 10.7487 17.0741 10.7487 17.0741 10.7487H15.8369C15.6719 10.7487 15.507 10.7487 15.2595 10.8307C23.3428 7.38456 34.1481 4.26661 46.1082 2.21533C72.8326 -2.29749 95.5979 0.246098 96.8352 7.79482C97.5775 11.6512 92.7935 15.9179 84.4627 19.8564ZM53.1192 12.6358C53.1192 11.7333 52.0469 11.1589 52.0469 11.1589C51.4695 10.7487 50.3973 10.7487 50.3973 10.7487H49.16C48.0877 10.7487 47.4279 11.323 47.4279 11.323C46.6031 11.8153 46.6031 12.7179 46.6031 12.7179V14.1128C46.6031 15.2615 47.4279 15.8358 47.4279 15.8358C47.6753 15.9999 49.6549 17.0666 49.6549 17.0666C50.4798 17.3128 50.5622 18.0512 50.5622 18.0512C50.5622 19.0358 49.7374 19.0358 49.7374 19.0358C48.9126 19.0358 48.9126 18.0512 48.9126 18.0512V17.3948H46.2731V18.0512C46.2731 19.6923 47.1804 20.1846 47.1804 20.1846C48.0053 20.841 49.9024 20.841 49.9024 20.841C51.3871 20.841 52.3769 20.1025 52.3769 20.1025C53.1192 19.5282 53.2017 18.7076 53.2017 18.7076V17.3128C53.2017 15.9179 51.9644 15.3435 51.9644 15.3435L49.7374 14.1948C48.9126 13.8666 48.9951 13.2923 48.9951 13.2923C48.9951 12.5538 49.7374 12.5538 49.7374 12.5538C50.5622 12.5538 50.5622 13.3743 50.5622 13.3743V13.9487H53.0367V12.6358H53.1192ZM28.3743 10.9948H24.1677L22.518 20.5128H25.1575L26.3122 13.0461L27.467 20.5128H30.1065L28.3743 10.9948ZM35.3854 20.5128V13.3743L36.9525 20.5128H39.592L41.1592 13.3743V20.5128C40.9942 20.5128 43.5512 20.5128 43.5512 20.5128V10.9948H39.5095L38.1898 16.4102L37.035 10.9948H32.9934V20.5128H35.3854ZM74.8122 10.9948H72.4202V16.7384L69.7808 10.9948H66.7289V20.5128H69.1209V14.8512L71.7604 20.5128H74.8122M59.058 18.2974V10.9948H56.336V18.2153C56.336 18.2153 56.1711 21.0051 59.7178 21.0051C63.4296 21.0051 63.1821 18.2153 63.1821 18.2153V10.9948H60.4602V18.2974C60.4602 18.2974 60.4602 19.1179 59.7178 19.1179C59.058 19.1179 59.058 18.2974 59.058 18.2974Z" fill="#034EA2"/>
  7222. </g>
  7223. <defs>
  7224. <clipPath id="clip0_61_23264">
  7225. <rect width="97" height="32" fill="white"/>
  7226. </clipPath>
  7227. </defs>
  7228. </svg>
  7229. </file>
  7230. <file path="assets/img/map_kangwon.svg">
  7231. <?xml version="1.0" encoding="utf-8"?>
  7232. <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
  7233. <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
  7234. <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
  7235. width="500px" height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  7236. <path fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" d="M490.636,430.313l-1.72-2.347l1.251-0.313
  7237. l-1.329-2.19l-0.861-0.782l-0.703-6.1l0.86-3.128l-1.563-3.363l2.814-2.894l-0.859-1.174l0.233-2.268l-1.954-0.234l-0.234-1.486
  7238. l-2.738-2.424l0.235-4.692l-1.8-1.955l-1.486,0.859l-2.736-2.111l0.626-2.58l-1.329-2.582l-1.486,0.704l-4.38-3.206l-0.625-5.631
  7239. l-2.737-5.318l-0.079-2.815l0.313-1.721l-4.771-2.893l-3.911-2.972l-3.44-3.833l-1.486-5.161l0.782-1.096l-0.782-3.831l-3.284-3.441
  7240. l-1.436-1.374l-2.241-2.146l-2.58-3.754l-4.771-7.351l0.078-1.956l-1.642-2.502l-0.47-3.754l1.721-1.565l-0.704-3.362l-0.782-3.206
  7241. l-8.717-7.049l-2.311-1.867l-3.91-5.865l0.235-3.05l1.406-0.783l1.018-2.188l-0.313-1.878l0.235-2.033l-8.837-8.993l-1.017-2.111
  7242. l-3.754-3.91l-1.486-3.364l-7.195-7.116l-15.329-16.658l-0.313-2.659l-6.647-7.117l-3.52-4.693l0.782-3.363l-1.407-3.284
  7243. l-3.973-2.866l-0.798-0.576l-3.833-4.771l0.079-1.721l-1.721-1.095l-2.19-2.034l-2.189-6.178l-4.849-6.022l-1.408-1.017l1.643-4.536
  7244. l-2.111-0.235l-6.491-6.178l-4.536-5.944l0.392-2.346l-2.269-3.675l-7.039-7.821l-0.313-1.877l-1.876-1.956l-3.129-5.083
  7245. l0.169-2.803l0.223-3.688l1.251-1.408l-2.034-0.86l-2.189-4.614l0.939-2.972l-3.384-4.944l-0.684-1l-4.302-6.256l-0.938-4.614
  7246. l-1.876-4.302l0.234-3.519l-1.408-2.268l-2.737-2.581l-0.078-3.832l-2.111-1.251l-1.799-3.207l-0.782-3.207l1.017-1.095
  7247. l-1.173-2.424l-10.558-14.155l-0.704-4.067l2.502-1.956l-3.441-4.457l-0.155-1.408l-2.659-2.033l0.391-1.799l-1.643-1.095
  7248. l-1.485-3.128l-0.704-5.005l-0.625-2.425l-1.486-0.704l0.234-1.33l-1.563-2.033l1.251-2.269l-1.485-1.173l-0.939-2.268l-1.017-2.346
  7249. l-1.407-0.234l-2.894-4.067l-1.564-3.754l-1.486-0.782l-0.938-4.223l-5.162,4.458l-6.57,1.877l2.347,4.927l-1.173,16.892
  7250. l-1.174,10.324l-8.445,14.077l-4.927,5.162l1.329,1.721h-1.956l-1.094,1.251l-0.782,2.737l-1.643,1.408l-1.095,3.91l-1.251-1.721
  7251. l-3.207,0.469v1.564l-1.721,2.033l-1.877-0.938l-3.441,4.536v1.721l-1.251-1.251l-0.641,1.251l-1.236-0.626l-0.704,2.268
  7252. l-2.659,0.625h-2.112l-0.939-1.251l-4.614,3.363l-1.173,2.189l-7.195-7.742l-2.19-0.313l-4.223,5.083l-1.564,2.189v2.815
  7253. l-0.704,3.754l0.938,1.251l-1.329,1.329l-0.704,2.112l-1.173,0.547l-2.346-0.625l-1.095,1.408l-0.547-2.19l-1.799-1.955
  7254. l-4.536-3.911l-4.379-0.938l-4.771-1.173l-3.363-0.626l-0.859,1.252l-1.877-0.625l-3.91-5.006v-1.642l-5.396,1.721l-3.832,0.782
  7255. h-4.458l-2.19-4.458l-1.643-2.815l-1.407-0.47l-2.816,2.19l-2.581-0.939l-2.894,1.173l-1.563,2.033l-2.425,0.938l-3.754-0.391
  7256. l-1.408,2.894l-2.268,0.156l-3.833-0.704l-2.033,0.548h-7.665v-1.33l-0.704-1.173l-1.955-0.704l-1.956,0.86l-1.721-1.017
  7257. l-2.581,0.313l-1.408,1.564l-2.815,0.938l-1.564,0.156l-5.161,4.537l-1.564,0.156l-0.782,1.721l-2.503,0.938l-2.111-2.033v-4.223
  7258. l-1.643-2.346l-1.095,1.095l-5.943,0.156v2.19l-6.022-3.754l-6.569-1.486l-3.207-0.078l-1.095,1.173l-3.91,1.408l-1.642-0.157
  7259. l-1.799-1.095l-2.737,2.033l-0.938,1.721l-1.721,0.782l-2.189-0.547L51.897,116l-2.972-0.86l-0.86,0.704l-2.581-1.017v-1.095
  7260. l-2.111-0.079l-1.408-1.251l-1.798-0.703l-3.05,1.329l-2.268,1.799l-4.301,2.033l-3.441,1.017l-3.128-1.72l-0.86-1.017v-1.72
  7261. l-0.938-0.625l-2.66,0.078l-1.173,2.659l-0.704,2.189l-1.563,1.017l-2.894,4.223l-1.251,0.547l-3.441,3.129v1.017l2.268,0.078
  7262. l-1.173,1.564l0.469,0.704h1.955l-0.547,3.754l0.391,2.894l-0.234,1.798l1.33,1.33l2.737,1.141l2.659-1.375l1.877-1.643l1.486,0.704
  7263. l1.407,0.626l-0.704,4.951l1.251,1.462l1.329,0.313l0.47,2.112l-1.095,2.018l2.346,3.222l2.033-0.86l-0.078,2.425l-0.704,1.721
  7264. l0.704,3.519l1.798,1.348l1.173,0.686l3.754,4.458l0.782-1.674l-0.235-1.454l2.268,0.391l0.782-1.017l-0.078-1.39l1.173-0.331
  7265. l3.05-1.642l0.391-1.643l1.173-0.782l0.235-1.095v-1.173l3.989-0.587l0.234,1.292l2.424,0.391l-0.078,1.017l-1.72,1.292
  7266. l-0.157,1.759l-1.095,0.547l0.86,2.268l-0.782,1.486l-1.72,2.346l0.156,3.206h1.564v2.581l0.782,0.548l4.066-0.47l0.392-0.808
  7267. l1.094,0.338l0.079,2.894l1.563,3.128h1.956l1.721,1.408l0.313-2.034l0.469-1.329l1.643-0.782l2.659-0.234l2.033-1.095l1.798-2.294
  7268. l5.553,1.59l-0.235,1.877l1.877,1.017l2.19-1.33l1.407-2.346l1.017,1.408l1.33,0.469l0.99,3.05v2.816v1.721v2.737l-0.364,3.519
  7269. l1.72,2.815l-0.234,2.737l0.938,2.268l0.313,2.425l0.938,1.877l2.112,1.721l5.474,0.547l1.251,1.643l1.408-0.938l4.536-0.391
  7270. l2.033,0.782l1.798,5.631l-1.094,1.017l0.078,2.19l3.676,1.329h3.05l5.553,1.721l0.313,2.581l2.112,1.798l0.625,2.502l-0.938,1.408
  7271. l0.234,1.643l0.782,0.938l0.156,2.425l-1.017,2.581l-1.095,1.721l0.156,2.111l-0.704,2.346l-3.441-0.704l-2.659,0.704l-1.799,2.346
  7272. l-0.313,1.643l-0.86,0.938h-1.486l-1.251,1.017v1.643h-2.111l-2.19,1.721l-1.094,3.832l2.189,1.877l0.704,2.189l-3.676,4.771
  7273. l0.704,1.329l4.224,5.396l0.313,2.269l-1.486,2.111l-4.223,3.05l-1.877,1.721l-0.704,2.112l0.391,1.876l0.939,1.017l2.659-2.893
  7274. l1.173,0.077l2.269,1.643l2.111-2.346h2.425l-0.938,4.614l-1.486,6.178l-0.469,5.084l0.938,1.876l-1.407,1.174l-0.235,1.486
  7275. l-2.189,0.469l0.313,2.033l1.956,1.564l2.815,2.424l1.251-1.329l3.207,0.156l0.86-2.268l3.05-1.721l1.017-1.564l2.19,1.877
  7276. l5.083,2.502l2.189,0.939l0.704,2.815l2.503-0.469l1.564,2.658l4.379,3.363h1.33l1.173,1.721l-0.783,1.407l2.034,1.173l3.206-1.173
  7277. l3.753,1.173l3.129-1.721l2.659,2.737l3.989,1.095l1.486-1.876l2.268,0.704l2.346,5.083l3.676,0.781l3.285,2.347l-1.095,3.676
  7278. l-7.195,0.391l-0.86,0.704l0.078,1.173l-2.111,0.626v1.486l-1.799,1.329l-0.782,1.486l-2.424,1.407l-2.738,0.939l-0.078,2.972h3.441
  7279. l1.251,1.172l1.017,2.503l0.939,0.938l2.346,0.548v1.643l-1.173,1.017l0.625,2.425l-0.156,3.284l0.524,0.91l0.648,1.123
  7280. l-0.156,1.877h-1.799l-1.251,6.805l-0.938,0.859l0.156,1.017l-0.86,0.704l0.782,1.329l-1.642,0.938l-0.234,1.408l0.86,2.033h-3.754
  7281. l-0.625,1.486l0.391,2.972l-0.782,1.407l1.095,3.988l-0.782,0.939l2.112,5.865l0.078,1.877h-1.564l-2.66,1.173l0.391,1.486
  7282. l1.721,3.676l0.156,2.737l-0.547,3.206l-1.877,2.581l-0.156,5.161l0.313,1.33l-0.234,1.877l-1.095,1.173l1.877,8.134l1.017,2.815
  7283. l2.268,2.972l4.536,3.988l1.486-0.781l1.408,0.781l1.173-1.251l1.877,0.234l2.19-1.564l2.581,0.47l2.034-0.47l0.782-2.111
  7284. l0.938,0.157l0.235,1.251l1.33,0.156l1.642-2.269l4.224,1.174l1.798,2.58l0.782-1.094l-0.078-1.565l1.173-1.954l1.721-0.549
  7285. l1.798,1.486l0.548-1.642l1.408-1.721l-0.156-1.643l0.234-1.799l-0.625-2.658l0.547-2.504l-1.408-3.362l-1.33-0.704l0.391-1.799
  7286. l2.895-2.737l2.189-0.234l0.547-1.721l1.643-0.938l1.642-0.078l1.486-1.563l2.034-0.157l2.972,1.017l2.659,0.47l2.425,2.033
  7287. l0.625,5.162l2.424,0.392l-0.078,1.251l1.251,1.095l-1.329,1.095l-0.938,2.424l1.173,0.782l0.078,1.878l1.564,1.172l1.173-0.703
  7288. l4.302-1.018l1.642,0.313l7.429-3.598l0.235-1.329l0.704-2.425l1.486-1.251l0.704-2.659l2.346,1.173l1.721,0.079l0.079,2.11
  7289. l1.798,0.704l0.391,0.939l2.425,0.704l1.642-1.408v-3.52l4.379-3.676l2.189-1.017l1.799,1.251l1.877,1.563l1.563,3.051l2.973,0.156
  7290. l1.563-0.782l1.799,2.425l2.112,3.44l2.971-0.547l0.783-1.486l4.771-0.469l1.799-1.799l1.563,1.33l1.799,0.391l-0.86,2.972
  7291. l0.078,1.408l-0.938,1.329l-2.425-0.156l-0.078,1.643l-1.408,1.173l-2.189,0.86l0.704,3.05l-1.799,0.469l-3.051-0.859l-2.503,3.441
  7292. l1.721,3.128l1.565,1.407l2.502,0.782l1.017,1.799l2.346-1.017l1.486-2.425l3.441-1.251l1.329-1.956l3.363,0.314l1.563,2.188
  7293. l0.86-2.424l2.503,1.407l2.034-1.251l2.658,2.581l1.017,2.189l-1.251,2.815h1.72l2.895,2.973l0.938,1.798v2.503h1.643l1.564-2.58
  7294. l1.408,1.642l1.329-1.877l5.553,0.703l1.173-1.329l1.486-2.425l1.33-0.859l2.11,2.972l1.174,0.625l0.47,3.441l1.876-0.625
  7295. l2.737,1.017v2.58l3.129,1.095l2.58-1.642l1.877,1.642l0.626,1.096l3.988,0.938l1.878-1.8l0.625,1.8l3.206-2.659l2.269,1.799v1.877
  7296. l1.173,1.017l4.458,1.721l3.598,1.251l1.876,2.189l1.564-0.469l2.033,3.128l2.19,0.782l1.251-1.251l1.956,0.156l2.346,0.47
  7297. l3.754,3.52l0.782-1.644l1.173-0.859v-2.033l-1.877-2.659l0.469-4.302l2.033,1.721l0.782-2.894l2.112-1.329l-1.329-2.348
  7298. l1.642-1.563l1.877,1.955l2.189-0.077v2.346l1.643,0.938l1.095-1.096l3.832,0.079l0.47,3.284l2.658,2.658l0.392,1.486l3.52,0.626
  7299. l1.955,1.408l1.407-0.86v-1.877l2.112,0.859l1.642,1.799v-3.441l3.129-2.814l1.251-3.362l-0.392-1.252l1.643-2.425l1.956,0.704
  7300. l3.05-0.704l1.563,2.19v1.486l1.564,0.859l5.318-2.19l6.334,1.565l4.303,0.859l1.563,1.564l2.658,0.313v1.329l1.8-1.174l1.172-1.721
  7301. l-0.547-1.642l0.938-1.173v-1.408l4.482-2.413l0.601-0.324l2.737,1.8l3.52,0.547l0.548,2.033l1.486,0.625l1.563-0.155l5.24,3.831
  7302. l0.391,1.565l2.189,1.876l1.174,1.486v1.721l1.799,0.704l2.502-1.33l1.564,0.626l2.659-0.392l2.111,1.721l1.408-0.234l-1.956-2.581
  7303. l-0.313-2.425l0.704-2.11l-1.485-2.425l2.346-2.66l2.268-3.05l4.535-2.58l-0.39-1.486l0.938-1.798l1.329-0.313l3.441,1.33
  7304. l0.47-2.816l4.535-2.189l1.721-2.894l1.799,0.704l1.955-1.329l3.284,0.625l1.252-0.548L490.636,430.313z"/>
  7305. </svg>
  7306. </file>
  7307. <file path="assets/img/pf_sample.svg">
  7308. <svg width="96" height="96" viewBox="0 0 96 96" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  7309. <circle cx="48" cy="48" r="47.5" fill="url(#pattern0_168_1406)" stroke="#9475EC"/>
  7310. <defs>
  7311. <pattern id="pattern0_168_1406" patternContentUnits="objectBoundingBox" width="1" height="1">
  7312. <use xlink:href="#image0_168_1406" transform="translate(0 -0.0412844) scale(0.00229358)"/>
  7313. </pattern>
  7314. <image id="image0_168_1406" width="436" height="472" preserveAspectRatio="none" xlink:href="data:image/png;base64,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"/>
  7315. </defs>
  7316. </svg>
  7317. </file>
  7318. <file path="assets/scss/roulette.scss">
  7319. @charset "UTF-8";
  7320. @import url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css");
  7321. *{
  7322. font-family: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif;
  7323. box-sizing: border-box;
  7324. }
  7325. .roulette--container--wrappers{
  7326. display: flex;
  7327. flex-direction: column;
  7328. justify-content: center;
  7329. align-items: center;
  7330. min-height: 100vh;
  7331. margin: 0;
  7332. background:url(../img/rlt_bg.png) no-repeat center top;
  7333. background-color: #a882df;
  7334. .title {
  7335. color: white;
  7336. text-align: center;
  7337. margin-bottom: 20px;
  7338. font-size: 14px;
  7339. }
  7340. .main-title {
  7341. font-size: 32px;
  7342. font-weight: bold;
  7343. margin: 10px 0;
  7344. text-shadow: 2px 2px 0 #000;
  7345. }
  7346. .main-title span:first-child {
  7347. color: #FFD700;
  7348. }
  7349. .main-title span:last-child {
  7350. color: white;
  7351. }
  7352. .roulette--wrapper{
  7353. padding-top:760px;
  7354. padding-bottom:150px;
  7355. }
  7356. .roulette-container-wrap{
  7357. margin: 20px 0;
  7358. width: 500px;
  7359. height: 500px;
  7360. background: url(../img/round.png) no-repeat center;
  7361. display: flex;
  7362. align-items: center;
  7363. justify-content: center;
  7364. margin-top:80px;
  7365. }
  7366. .roulette-container {
  7367. position: relative;
  7368. width: 420px;
  7369. height: 420px;
  7370. border-radius: 500px;
  7371. display: flex;
  7372. align-items: center;
  7373. justify-content: center;
  7374. box-sizing: border-box;
  7375. }
  7376. .wheel {
  7377. position: relative;
  7378. width: 100%;
  7379. height: 100%;
  7380. border-radius: 50%;
  7381. box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
  7382. transform-origin: center;
  7383. transition: transform 5s cubic-bezier(0.2, 0.8, 0.3, 0.9);
  7384. }
  7385. .center-button {
  7386. position: absolute;
  7387. top: 50%;
  7388. left: 50%;
  7389. transform: translate(-50%, -50%);
  7390. width: 150px;
  7391. height: 150px;
  7392. background-color: #673AB7;
  7393. border: none;
  7394. border-radius: 50%;
  7395. color: white;
  7396. font-weight: bold;
  7397. cursor: pointer;
  7398. z-index: 10;
  7399. background: url(../img/btn.png) no-repeat center;
  7400. background-size: contain;
  7401. }
  7402. .pointer {
  7403. position: absolute;
  7404. top: -48px;
  7405. left: 50%;
  7406. transform: translateX(-50%);
  7407. width: 50px;
  7408. height: 68px;
  7409. background: url(../img/pin.png) no-repeat center;
  7410. z-index: 11;
  7411. }
  7412. .text-layer {
  7413. position: absolute;
  7414. width: 100%;
  7415. height: 100%;
  7416. top: 0;
  7417. left: 0;
  7418. z-index: 5;
  7419. pointer-events: none;
  7420. }
  7421. .section-text {
  7422. position: absolute;
  7423. transform-origin: center;
  7424. color: #333;
  7425. font-weight: bold;
  7426. font-size: 20px;
  7427. text-align: center;
  7428. width: 60px;
  7429. margin-left: -30px;
  7430. margin-top: -10px;
  7431. display: flex;
  7432. align-items: center;
  7433. justify-content: center;
  7434. }
  7435. .bottom-text {
  7436. color: white;
  7437. text-align: center;
  7438. margin-top: 20px;
  7439. font-size: 18px;
  7440. font-weight: bold;
  7441. }
  7442. .sub-text {
  7443. color: white;
  7444. font-size: 12px;
  7445. margin-top: 5px;
  7446. text-align: center;
  7447. }
  7448. .buttons {
  7449. display: flex;
  7450. justify-content: center;
  7451. gap: 10px;
  7452. margin-top: 20px;
  7453. }
  7454. .button {
  7455. padding: 10px 20px;
  7456. border-radius: 20px;
  7457. border: none;
  7458. font-weight: bold;
  7459. cursor: pointer;
  7460. }
  7461. .button.primary {
  7462. background-color: #FFD700;
  7463. color: #333;
  7464. }
  7465. .button.secondary {
  7466. background-color: #f0f0f0;
  7467. color: #333;
  7468. }
  7469. .probability-display {
  7470. color: white;
  7471. font-size: 14px;
  7472. margin-top: 15px;
  7473. background-color: rgba(255, 255, 255, 0.2);
  7474. padding: 10px;
  7475. border-radius: 10px;
  7476. text-align: center;
  7477. }
  7478. .coins {
  7479. position: absolute;
  7480. width: 100%;
  7481. height: 100%;
  7482. pointer-events: none;
  7483. }
  7484. .coin {
  7485. position: absolute;
  7486. width: 30px;
  7487. height: 30px;
  7488. background: #FFD700;
  7489. border-radius: 50%;
  7490. border: 2px solid #B8860B;
  7491. }
  7492. .form--contents{
  7493. width:100%;
  7494. display: flex;
  7495. align-items: center;
  7496. flex-direction: column;
  7497. gap:20px;
  7498. margin-bottom:120px;
  7499. }
  7500. .form--contents input{
  7501. width:250px;
  7502. padding-left:10px;
  7503. height:45px;
  7504. }
  7505. .agree--wrapper{
  7506. border-radius: 5px;
  7507. padding:10px;
  7508. background: #fff;
  7509. max-width:450px;
  7510. max-height:250px;
  7511. overflow: auto;
  7512. color:#000;
  7513. line-height: 1.7;
  7514. margin-top:150px;
  7515. margin-bottom:150px;
  7516. }
  7517. .agree--wrapper > h2{
  7518. padding:0px;
  7519. line-height: 100%;
  7520. margin-bottom:10px;
  7521. }
  7522. .agree--wrapper > h3{
  7523. padding:0px;
  7524. line-height: 100%;
  7525. margin-bottom:10px;
  7526. }
  7527. .modal--wrappers{
  7528. position: fixed;
  7529. top:0px;
  7530. left:0px;
  7531. z-index: 10;
  7532. width:100%;
  7533. height:100%;
  7534. background: rgba(0,0,0,.5);
  7535. display: flex;
  7536. align-items: center;
  7537. justify-content: center;
  7538. }
  7539. .layer-popup {
  7540. display: none;
  7541. align-items: center;
  7542. justify-content: center;
  7543. position: fixed;
  7544. top: 0;
  7545. left: 0;
  7546. width: 100%;
  7547. height: 100%;
  7548. background: rgba(25, 25, 25, .85);
  7549. z-index: 200;
  7550. }
  7551. .layer-popup .layer-popup-item {
  7552. display: inline-flex;
  7553. flex-direction: column;
  7554. align-items: center;
  7555. justify-content: center;
  7556. position: relative;
  7557. background-color: #fff;
  7558. border-radius: 10px;
  7559. overflow: hidden;
  7560. transform: translateY(-50px);
  7561. transition: all .3s ease-out;
  7562. max-height: 90vh;
  7563. opacity: 0;
  7564. width:100%;
  7565. max-width:700px;
  7566. box-sizing: border-box;
  7567. }
  7568. .layer-popup.bottom-sheet-wrap .layer-popup-item .popup-header {
  7569. width: 100%;
  7570. padding: 30px 60px 30px 30px;
  7571. }
  7572. .layer-popup.bottom-sheet-wrap .layer-popup-item .txt-main {
  7573. text-align: left;
  7574. margin-bottom: 0;
  7575. line-height: 1.33;
  7576. }
  7577. .layer-popup .layer-popup-item .txt-main {
  7578. display: block;
  7579. margin-bottom: 16px;
  7580. color: #191919;
  7581. font-size: 24px;
  7582. font-weight: 600;
  7583. line-height: normal;
  7584. letter-spacing: -.4px;
  7585. text-align: center;
  7586. }
  7587. .layer-popup.bottom-sheet-wrap .layer-popup-item .popup-body {
  7588. width: 100%;
  7589. padding: 0 30px;
  7590. max-height: 600px;
  7591. overflow-y: auto;
  7592. overflow-x: hidden;
  7593. text-align: left;
  7594. margin-top: 10px;
  7595. }
  7596. .layer-popup .layer-popup-item .popup-body {
  7597. width: 100%;
  7598. padding: 0 40px;
  7599. text-align: center;
  7600. }
  7601. .page-desc h2 {
  7602. color: #191919;
  7603. font-size: 20px;
  7604. font-weight: 600;
  7605. line-height: normal;
  7606. letter-spacing: -.4px;
  7607. }
  7608. .layer-popup .layer-popup-item .btn-close-x {
  7609. display: block;
  7610. position: absolute;
  7611. right: 25px;
  7612. top: 30px;
  7613. width: 30px;
  7614. height: 30px;
  7615. font-size: 0;
  7616. z-index: 1;
  7617. background: transparent;
  7618. background-size: 20px 20px;
  7619. border:0px;
  7620. cursor: pointer;
  7621. }
  7622. .layer-popup .layer-popup-item .btn-close-x svg{
  7623. width:20px;
  7624. height: 20px;
  7625. }
  7626. .layer-popup .evt-reservation .page-desc+.box-btn {
  7627. text-align: center;
  7628. margin-bottom: 50px;
  7629. }
  7630. .layer-popup.bottom-sheet-wrap .layer-popup-item .box-btn {
  7631. font-size: 0;
  7632. margin-top:40px;
  7633. }
  7634. .btns, .btns.btns-radio, .btns.corner-half, .btns.line, .btns.sticky, .btns.sticky.white, .btns.w-md, .btns.w-sm, .btns:disabled {
  7635. color: #191919;
  7636. font-size: 16px;
  7637. font-weight: 600;
  7638. line-height: normal;
  7639. letter-spacing: -.3px;
  7640. color: #fff;
  7641. width: 260px;
  7642. height: 58px;
  7643. background: #662d91;
  7644. padding: 20px 0;
  7645. border-radius: 7px;
  7646. text-align: center;
  7647. cursor: pointer;
  7648. }
  7649. .md-ripples {
  7650. position: relative;
  7651. overflow: hidden;
  7652. -webkit-tap-highlight-color: transparent;
  7653. }
  7654. .box-input .input-wrap {
  7655. position: relative;
  7656. padding-top:20px;
  7657. }
  7658. .box-input input[type=number]:disabled, .box-input input[type=text]:disabled {
  7659. background-color: #f6f6f6;
  7660. }
  7661. .box-input .input-default.is-delete {
  7662. padding-right: 50px;
  7663. }
  7664. .box-input .input-default, .box-select .select-default, .btn-select button {
  7665. width: 100%;
  7666. height: 58px;
  7667. padding: 16px 20px;
  7668. border: 1px solid #ddd;
  7669. border-radius: 7px;
  7670. transition: border-color .3s ease;
  7671. color: #666;
  7672. font-size: 16px;
  7673. font-weight: 400;
  7674. line-height: normal;
  7675. letter-spacing: -.3px;
  7676. }
  7677. .mt45{
  7678. margin-top:45px!important;
  7679. }
  7680. .layer-popup .layer-popup-item .agree-box {
  7681. border: 1px solid #ddd;
  7682. border-radius: 10px;
  7683. padding: 40px;
  7684. p{
  7685. line-height: 1.6;
  7686. }
  7687. }
  7688. .layer-popup .layer-popup-item .btns.w-sm {
  7689. height: 58px !important;
  7690. }
  7691. .btns.lightgray {
  7692. background: #eff1f5;
  7693. border: none;
  7694. color: #666;
  7695. }
  7696. .btns.w-sm {
  7697. width: auto;
  7698. min-width: 140px;
  7699. height: 58px;
  7700. padding: 0 30px;
  7701. display: flex;
  7702. justify-content: center;
  7703. align-items: center;
  7704. }
  7705. .btn-group {
  7706. flex: 1;
  7707. width: 100%;
  7708. display: flex;
  7709. gap: 10px;
  7710. align-items: center;
  7711. justify-content: center;
  7712. }
  7713. .layer-popup .layer-popup-item .popup-footer {
  7714. width: 100%;
  7715. padding: 30px 40px 50px;
  7716. }
  7717. .layer-popup.bottom-sheet-wrap .layer-popup-item .popup-footer {
  7718. width: 100%;
  7719. padding: 30px 30px 50px;
  7720. }
  7721. .layer-popup.show{
  7722. display: flex;
  7723. }
  7724. .layer-popup.show .layer-popup-item {
  7725. opacity: 1;
  7726. transform: translateY(0);
  7727. transition-delay: .2s;
  7728. }
  7729. .rq-form .agree-wrap, .rq-form .box-attach, .rq-form .box-flex, .rq-form .box-input, .rq-form .box-input-wrap, .rq-form .box-my-use, .rq-form .box-select, .rq-form .box-select-group, .rq-form .box-select-wrap, .rq-form .cardList-wrap, .rq-form .group-wrap, .rq-form .input-group, .rq-form .radio-group-wrap, .rq-form .select-group, .rq-form .textarea-wrap {
  7730. margin: 40px 0 0;
  7731. }
  7732. .agree-wrap {
  7733. margin-top: 50px;
  7734. display: flex;
  7735. flex-direction: column;
  7736. align-items: flex-start !important;
  7737. }
  7738. .rq-form .agree-wrap .btn-check {
  7739. margin: 20px 0 0 !important;
  7740. }
  7741. .btn-text-line.btn-check {
  7742. padding: 13px 20px;
  7743. border: 1px solid #ddd;
  7744. border-radius: 7px;
  7745. }
  7746. .agree-wrap .btn-check {
  7747. margin-top: 20px;
  7748. }
  7749. .btn-check {
  7750. position: relative;
  7751. display: flex;
  7752. justify-content: flex-start;
  7753. align-items: center;
  7754. gap: 10px;
  7755. }
  7756. .btn-text-line {
  7757. width: 100% !important;
  7758. justify-content: flex-start !important;
  7759. }
  7760. .agree-wrap .agree-group {
  7761. margin-top: 40px;
  7762. padding: 0 30px;
  7763. }
  7764. .rq-form .agree-wrap .agree-group {
  7765. width: 100%;
  7766. margin: 0;
  7767. padding: 0 20px 0 0;
  7768. }
  7769. .agree-wrap .agree-group .btn-check {
  7770. margin-bottom: 30px;
  7771. }
  7772. .rq-form .agree-wrap .btn-check {
  7773. margin: 20px 0 0 !important;
  7774. }
  7775. .agree-wrap .btn-check:not(.btn-text-line) {
  7776. padding-left: 20px;
  7777. }
  7778. .agree-wrap .btn-check {
  7779. margin-top: 20px;
  7780. }
  7781. .btn-check {
  7782. position: relative;
  7783. display: flex;
  7784. justify-content: flex-start;
  7785. align-items: center;
  7786. gap: 10px;
  7787. }
  7788. .btn-check input[type=checkbox] {
  7789. display: none !important;
  7790. overflow: hidden;
  7791. padding: 0 !important;
  7792. margin: 0 !important;
  7793. width: 1px;
  7794. height: 1px;
  7795. line-height: 1px;
  7796. font-size: 1px;
  7797. border: 0;
  7798. clip: rect(0 0 0 0);
  7799. }
  7800. .layer-popup-item.evt-reservation .agree-group .btn-check label {
  7801. font-weight: 400 !important;
  7802. }
  7803. .btn-check label {
  7804. cursor: pointer;
  7805. display: inline-flex;
  7806. align-items: center;
  7807. color: #666;
  7808. font-size: 16px;
  7809. font-weight: 400;
  7810. line-height: normal;
  7811. letter-spacing: -.3px;
  7812. color: #191919;
  7813. }
  7814. .btn-check label .ico-check {
  7815. width: 24px;
  7816. height: 24px;
  7817. display: inline-block;
  7818. padding-left: 30px;
  7819. position: relative;
  7820. transition: all .3s ease-out;
  7821. }
  7822. .btn-check label .ico-check::before {
  7823. content: "";
  7824. position: absolute;
  7825. top: 0;
  7826. left: 0;
  7827. display: inline-block;
  7828. width: 24px;
  7829. height: 24px;
  7830. background-color: #ddd;
  7831. border-radius: 50%;
  7832. }
  7833. .btn-check label .ico-check::after {
  7834. content: "";
  7835. position: absolute;
  7836. top: 4px;
  7837. left: 4px;
  7838. display: inline-block;
  7839. width: 15px;
  7840. height: 15px;
  7841. background: url(../img/ico-check-on.svg) no-repeat center;
  7842. background-size: contain;
  7843. }
  7844. .btn-check input[type=checkbox]:checked+label .ico-check::before {
  7845. background-color: #662d91;
  7846. transition: all .3s ease-out;
  7847. }
  7848. .ico-arrow-right {
  7849. font-size: 0;
  7850. border: none;
  7851. display: inline-block;
  7852. background: url(../img/ico-arrow-right.svg) no-repeat right;
  7853. background-size: contain;
  7854. width: 20px;
  7855. height: 20px;
  7856. }
  7857. }
  7858. </file>
  7859. <file path="assets/scss/sample.scss">
  7860. // 샘플 화면의 scss
  7861. @charset "UTF-8";
  7862. .sample-layout{
  7863. html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
  7864. margin: 0;
  7865. padding: 0;
  7866. border: 0;
  7867. font-size: 100%;
  7868. color:#1A1A1A;
  7869. vertical-align: baseline;
  7870. }
  7871. *{
  7872. box-sizing:border-box !important;
  7873. &::-webkit-scrollbar {
  7874. height:3px;
  7875. width:3px;
  7876. }
  7877. &::-webkit-scrollbar-button:start:decrement,
  7878. &::-webkit-scrollbar-button:end:increment {
  7879. display:none;
  7880. }
  7881. &::-webkit-scrollbar-track {
  7882. background-color:transparent;
  7883. width:3px;
  7884. height:3px;
  7885. }
  7886. &::-webkit-scrollbar-thumb {
  7887. width:3px;
  7888. border-radius:3px;
  7889. background-color:transparent;
  7890. }
  7891. }
  7892. body{
  7893. &::-webkit-scrollbar-thumb {
  7894. width:3px;
  7895. border-radius:3px;
  7896. background-color:#3570FF;
  7897. }
  7898. }
  7899. /* HTML5 display-role reset for older browsers */
  7900. article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {display: block;}
  7901. body {line-height: 2;}
  7902. ol, ul {list-style: none;}
  7903. blockquote, q {quotes: none;}
  7904. blockquote:before, blockquote:after, q:before, q:after {content: '';content: none;}
  7905. table {border-collapse: collapse;border-spacing: 0;}
  7906. input:focus {outline: none;}
  7907. a {color: inherit;text-decoration: none;}
  7908. html{overflow:auto !important;}
  7909. button{outline:0; cursor:pointer;}
  7910. .mb--0{margin-bottom:0px!important;}
  7911. .mb--5{margin-bottom:5px!important;}
  7912. .mb--10{margin-bottom:10px!important;}
  7913. .mb--15{margin-bottom:15px!important;}
  7914. .mb--20{margin-bottom: 20px!important;}
  7915. .mb--30{margin-bottom: 30px!important;}
  7916. .ml--0{margin-left: 0px!important;}
  7917. .ml--3{margin-left: 3px!important;}
  7918. .ml--5{margin-left: 5px!important;}
  7919. .ml--10{margin-left: 10px!important;}
  7920. .ml--15{margin-left: 15px!important;}
  7921. .ml--20{margin-left: 20px!important;}
  7922. .ml--25{margin-left: 25px!important;}
  7923. .ml--30{margin-left: 30px!important;}
  7924. .ml--35{margin-left: 35px!important;}
  7925. .mr--0{margin-right: 0px!important;}
  7926. .mr--3{margin-right: 3px!important;}
  7927. .mr--10{margin-right: 10px!important;}
  7928. .mr--15{margin-right: 15px!important;}
  7929. .mr--20{margin-right:20px!important;}
  7930. .mr--25{margin-right:25px!important;}
  7931. .mt--0{margin-top:0px!important;}
  7932. .mt--10{margin-top:10px!important;}
  7933. .mt--15{margin-top:15px!important;}
  7934. .mt--20{margin-top:20px!important;}
  7935. .mt--25{margin-top:25px!important;}
  7936. .mt--30{margin-top:30px!important;}
  7937. .mt--35{margin-top:35px!important;}
  7938. .mt--40{margin-top:40px!important;}
  7939. .mt--45{margin-top:45px!important;}
  7940. .mt--50{margin-top:50px!important;}
  7941. .mt--60{margin-top:60px!important;}
  7942. .pt--0{padding-top:0px!important;}
  7943. .text-left{text-align:left !important;}
  7944. .text-center{text-align:center !important;}
  7945. .text-right{text-align:right !important;}
  7946. @mixin bor($w, $c, $r){
  7947. border:$w solid $c;
  7948. border-radius:$r;
  7949. }
  7950. @mixin borBg($border, $bg){
  7951. border-color:$border;
  7952. background-color:$bg;
  7953. }
  7954. @mixin wh(
  7955. $w:null,
  7956. $minw:null,
  7957. $maxw:null,
  7958. $h:null,
  7959. $minh:null,
  7960. $maxh:null,
  7961. ){
  7962. width:$w;
  7963. min-width:$minw;
  7964. max-width:$maxw;
  7965. height:$h;
  7966. min-height:$minh;
  7967. max-height:$maxh;
  7968. }
  7969. @mixin pm(
  7970. $p:null,
  7971. $pt:null,
  7972. $pr:null,
  7973. $pb:null,
  7974. $pl:null,
  7975. $m:null,
  7976. $mt:null,
  7977. $mr:null,
  7978. $mb:null,
  7979. $ml:null,
  7980. ) {
  7981. padding:$p;
  7982. padding-top:$pt;
  7983. padding-right:$pr;
  7984. padding-bottom:$pb;
  7985. padding-left:$pl;
  7986. margin:$m;
  7987. margin-top:$mt;
  7988. margin-right:$mr;
  7989. margin-bottom:$mb;
  7990. margin-left:$ml;
  7991. }
  7992. @mixin flex(
  7993. $dis:flex,
  7994. $align:null,
  7995. $justify:null,
  7996. $dir:null,
  7997. $wrap:null,
  7998. ){
  7999. display:$dis;
  8000. align-items:$align;
  8001. justify-content:$justify;
  8002. flex-direction:$dir;
  8003. flex-wrap:$wrap;
  8004. }
  8005. @mixin position(
  8006. $p:absolute,
  8007. $t:null,
  8008. $r:null,
  8009. $b:null,
  8010. $l:null,
  8011. ) {
  8012. position:$p;
  8013. top:$t;
  8014. bottom:$b;
  8015. left:$l;
  8016. right:$r;
  8017. }
  8018. @mixin font(
  8019. $s:null,
  8020. $w:null,
  8021. $c:null,
  8022. $a:null,
  8023. ) {
  8024. font-size:$s;
  8025. font-weight:$w;
  8026. color:$c;
  8027. text-align:$a;
  8028. }
  8029. // 샘플 메인
  8030. .sample--main--wrap{
  8031. h1{
  8032. text-align: center;
  8033. color: black;
  8034. font-size: 30px;
  8035. }
  8036. .section--wrap{
  8037. display: flex;
  8038. margin-top: 10px;
  8039. .left--section{
  8040. background: #eee;
  8041. padding: 10px;
  8042. border: 1px solid #eee;
  8043. width: 50%;
  8044. margin-right: 10px;
  8045. }
  8046. .right--section{
  8047. background: #eee;
  8048. padding: 10px;
  8049. border: 1px solid #eee;
  8050. width: 50%;
  8051. margin-left: 10px;
  8052. .result--msg{
  8053. border: 1px solid;
  8054. height: 200px;
  8055. font-size: 20px;
  8056. font-weight: 600;
  8057. }
  8058. }
  8059. }
  8060. .div--wrap{
  8061. border: 1px solid;
  8062. border-radius: 15px;
  8063. background: #eee;
  8064. margin: 20px;
  8065. width: 300px;
  8066. padding: 10px;
  8067. h2{
  8068. font-size: 20px;
  8069. text-align: center;
  8070. }
  8071. .btn--wrap{
  8072. margin-top: 10px;
  8073. text-align: center;
  8074. .v-btn{
  8075. &.actv{
  8076. background-color: #3468E2;
  8077. .v-btn__content{
  8078. color: #eee;
  8079. }
  8080. }
  8081. }
  8082. }
  8083. }
  8084. .arrow--wrap{
  8085. margin: -12px;
  8086. display: flex;
  8087. align-items: center;
  8088. justify-items: center;
  8089. opacity: 0;
  8090. transition: opacity 0.5s ease, transform 0.5s ease;
  8091. &.actv{
  8092. opacity: 1; /* 초기에는 투명하게 설정 */
  8093. transform: translateY(0);
  8094. transition: opacity 0.5s ease, transform 0.5s ease;
  8095. }
  8096. }
  8097. }
  8098. .component--item{
  8099. width: 300px;
  8100. height: 300px;
  8101. border: 1px solid;
  8102. }
  8103. // 게시판 메인
  8104. .board_list_wrapper {
  8105. width: 100%;
  8106. height: 100%;
  8107. padding: 50px;
  8108. .search_wrap {
  8109. display: flex;
  8110. .custom_select {
  8111. max-width: 150px;
  8112. }
  8113. .custom_input {
  8114. max-width: 300px;
  8115. }
  8116. }
  8117. .btn-wrapper {
  8118. display: flex;
  8119. justify-content: space-between;
  8120. }
  8121. .v-table{
  8122. .v-table__wrapper{
  8123. table{
  8124. thead{
  8125. background-color: rgba(230, 230, 230, 0.5);
  8126. th{
  8127. height:44px;
  8128. padding:9px 5px !important;
  8129. border:0;
  8130. vertical-align:middle;
  8131. word-break:keep-all;
  8132. @include font($s:14px !important, $w:500, $c:#777 !important, $a:center !important);
  8133. background:#f7f7fa !important;
  8134. }
  8135. }
  8136. tbody{
  8137. tr{
  8138. td{
  8139. height:44px;
  8140. padding:9px 5px;
  8141. border-bottom:1px solid #E3E6ED;
  8142. vertical-align:middle;
  8143. word-break:keep-all;
  8144. @include font($s:14px, $w:500, $c:#333, $a:center !important);
  8145. background:#fff;
  8146. cursor:pointer;
  8147. &.text-left{
  8148. text-align:left !important;
  8149. }
  8150. span{
  8151. @include font($w:500, $c:#333);
  8152. &.color-red{
  8153. color:#E60000;
  8154. }
  8155. &.color-green{
  8156. color:#4AAC44;
  8157. }
  8158. &.color-orange{
  8159. color:#FF7732;
  8160. }
  8161. &.line1{
  8162. display:block;
  8163. overflow:hidden;
  8164. max-width:285px;
  8165. text-overflow:ellipsis;
  8166. white-space:nowrap;
  8167. }
  8168. &.text-left{
  8169. display:block;
  8170. text-align:left;
  8171. }
  8172. }
  8173. }
  8174. }
  8175. }
  8176. }
  8177. }
  8178. }
  8179. }
  8180. // 게시판 타이틀
  8181. .menu-title-wrap{
  8182. @include flex($align:center);
  8183. margin-bottom:24px;
  8184. h2{
  8185. line-height:20px;
  8186. @include font($s:18px, $w:800, $c:#001A58);
  8187. }
  8188. .arrow{
  8189. @include wh($w:30px, $h:30px);
  8190. margin:0 11px;
  8191. }
  8192. .menu-depth2{
  8193. line-height:20px;
  8194. @include font($s:18px, $w:600, $c:#1A1A1A);
  8195. }
  8196. .setting-util{
  8197. display:flex;
  8198. margin-left:auto;
  8199. .btn-style{
  8200. width:120px;
  8201. margin:0 0 0 5px;
  8202. }
  8203. }
  8204. }
  8205. .view-area{
  8206. padding:40px 24px;
  8207. @include bor(1px, #E6EBF1, 16px);
  8208. background:#FFF;
  8209. }
  8210. .form-style{
  8211. border-top:1px solid #E3E6ED;
  8212. table{
  8213. width:100%;
  8214. th{
  8215. padding:12px 5px;
  8216. border-bottom:1px solid #E3E6ED;
  8217. vertical-align:middle;
  8218. @include font($s:14px, $w:500, $c:#333, $a:center);
  8219. background:#f7f8fa;
  8220. .star{
  8221. display:inline-block;
  8222. padding-left:3px;
  8223. //color:#F43232;
  8224. color:#3570FF;
  8225. }
  8226. }
  8227. td{
  8228. height:48px;
  8229. padding:6px 0 6px 24px;
  8230. border-bottom:1px solid #E3E6ED;
  8231. vertical-align:middle;
  8232. @include font($s:14px, $w:500, $c:#333, $a:left);
  8233. .view-cont{
  8234. word-break: break-all;
  8235. min-height:459px;
  8236. padding:12px 0;
  8237. @include font($c:#333, $a:left);
  8238. }
  8239. .file-form-list{
  8240. @include flex($wrap:wrap);
  8241. margin-top:8px;
  8242. font-size:0;
  8243. &:empty{
  8244. margin:0;
  8245. }
  8246. .btn-file-download{
  8247. display:inline-block;
  8248. @include wh($w:auto, $h:36px);
  8249. @include pm($p:0 10px, $m:0 8px 0 0);
  8250. line-height:32px;
  8251. @include bor(1px, #EDF1FF, 6px);
  8252. vertical-align:middle;
  8253. @include font($s:14px, $w:400, $c:#000);
  8254. background:#F7F9FF;
  8255. &:last-of-type{
  8256. margin-right:0;
  8257. }
  8258. .ico{
  8259. display:inline-block;
  8260. @include wh($w:10px, $h:13px);
  8261. margin-right:7px;
  8262. vertical-align:middle;
  8263. // background:url("~/assets/img/sample/ico_file_download.png") no-repeat center;
  8264. }
  8265. button{
  8266. @include wh($w:20px, $h:20px);
  8267. margin-left:5px;
  8268. border-radius:100%;
  8269. vertical-align:middle;
  8270. // background:#3468E2 url(~/assets/img/sample/ico_close.png) no-repeat center / 14px;
  8271. }
  8272. }
  8273. }
  8274. .custom-input.v-text-field{
  8275. min-height:36px;
  8276. .v-input__control{
  8277. .v-input__slot{
  8278. height:36px;
  8279. .v-text-field__slot{
  8280. height:34px;
  8281. input{
  8282. height:34px;
  8283. }
  8284. }
  8285. }
  8286. }
  8287. }
  8288. .custom-select.v-input{
  8289. min-height:36px;
  8290. .v-input__control{
  8291. .v-input__slot{
  8292. height:34px;
  8293. }
  8294. .v-select__slot{
  8295. .v-select__selection{
  8296. height:34px;
  8297. }
  8298. }
  8299. }
  8300. }
  8301. .btn-style{
  8302. height:36px;
  8303. }
  8304. }
  8305. }
  8306. }
  8307. .btn-wrap{
  8308. @include flex($align:center, $justify:center);
  8309. margin-top:26px;
  8310. @include font($s:0, $a:center);
  8311. &.text-right{
  8312. justify-content:flex-end;
  8313. .btn-style{
  8314. &:first-of-type{
  8315. margin-left:0;
  8316. }
  8317. }
  8318. }
  8319. .left{
  8320. margin-right:auto;
  8321. .btn-style{
  8322. &:first-of-type{
  8323. margin-left:0;
  8324. }
  8325. &:last-of-type{
  8326. margin-right:0;
  8327. }
  8328. }
  8329. }
  8330. .right{
  8331. margin-left:auto;
  8332. .btn-style{
  8333. &:first-of-type{
  8334. margin-left:0;
  8335. }
  8336. &:last-of-type{
  8337. margin-right:0;
  8338. }
  8339. }
  8340. }
  8341. }
  8342. .btn-style{
  8343. @include flex($dis:inline-flex, $align:center, $justify:center);
  8344. @include wh($w:152px, $h:44px);
  8345. margin:0 5px;
  8346. letter-spacing:-0.35px;
  8347. border-radius:6px;
  8348. @include font($s:14px, $w:500);
  8349. &.btn-blue{
  8350. color:#fff;
  8351. background:#3468E2;
  8352. }
  8353. &.btn-blue2{
  8354. @include wh($w:auto, $h:40px);
  8355. padding:0 34px;
  8356. color:#fff;
  8357. background:#3468E2;
  8358. }
  8359. &.btn-white{
  8360. border:1px solid #e6ebf1;
  8361. color:#000;
  8362. background:#fff;
  8363. }
  8364. &.btn-white2{
  8365. @include wh($w:auto, $h:40px);
  8366. padding:0 34px;
  8367. line-height:38px;
  8368. border:1.3px solid #D7DBE3;
  8369. color:#333;
  8370. background:#fff;
  8371. }
  8372. &.btn-black{
  8373. color:#fff;
  8374. background:#363636;
  8375. }
  8376. &.full{
  8377. width:100%;
  8378. }
  8379. &.mini{
  8380. @include wh($w:80px, $h:30px);
  8381. border-radius:4px;
  8382. font-size:12px;
  8383. }
  8384. &.mini2{
  8385. height:40px;
  8386. }
  8387. &.w80{
  8388. width:80px;
  8389. padding:0;
  8390. }
  8391. &.btn-comment{
  8392. width:auto;
  8393. padding:0 23px;
  8394. span{
  8395. padding-left:5px;
  8396. letter-spacing:-0.4px;
  8397. @include font($s:16px, $w:700, $c:#3570FF);
  8398. }
  8399. }
  8400. }
  8401. .custom-input{
  8402. .v-input__control{
  8403. }
  8404. &.v-input--error{
  8405. .v-input__details{
  8406. .v-messages{
  8407. .v-messages__message{
  8408. color: red !important;
  8409. }
  8410. }
  8411. }
  8412. }
  8413. }
  8414. .custom-textarea{
  8415. .v-input__control{
  8416. }
  8417. &.v-input--error{
  8418. .v-input__details{
  8419. .v-messages{
  8420. .v-messages__message{
  8421. color: red !important;
  8422. }
  8423. }
  8424. }
  8425. }
  8426. }
  8427. .flex--wrap{
  8428. display:flex;
  8429. align-items: center;
  8430. .title--wrap{
  8431. width: 100%;
  8432. position: relative;
  8433. .close--btn{
  8434. position: absolute;
  8435. right: 3px;
  8436. top: 3px;
  8437. }
  8438. }
  8439. }
  8440. }
  8441. </file>
  8442. <file path="backend/app/Config/Routes2.php">
  8443. <?php
  8444. use CodeIgniter\Router\RouteCollection;
  8445. /**
  8446. * @var RouteCollection $routes
  8447. */
  8448. // =============================================================================
  8449. // Routes2.php - 파트너십 전용 라우팅 시스템 (완전 독립)
  8450. // 기존 Routes.php와 별개로 동작하는 파트너십 전용 라우팅
  8451. // =============================================================================
  8452. $routes->group('api', function($routes) {
  8453. // =============================================================================
  8454. // 벤더사-인플루언서 파트너십 관리 API (완전 재설계)
  8455. // =============================================================================
  8456. $routes->group('vendor-influencer', function($routes) {
  8457. // 벤더사용 API
  8458. $routes->post('requests', 'PartnershipController::getInfluencerRequests', [
  8459. 'as' => 'partnership.requests',
  8460. 'filter' => 'cors'
  8461. ]);
  8462. $routes->post('approve', 'PartnershipController::processInfluencerRequest', [
  8463. 'as' => 'partnership.approve',
  8464. 'filter' => 'cors'
  8465. ]);
  8466. $routes->post('terminate', 'PartnershipController::terminatePartnership', [
  8467. 'as' => 'partnership.terminate',
  8468. 'filter' => 'cors'
  8469. ]);
  8470. // 인플루언서용 API
  8471. $routes->post('search-vendors', 'PartnershipController::searchVendorsForInfluencer', [
  8472. 'as' => 'partnership.search_vendors',
  8473. 'filter' => 'cors'
  8474. ]);
  8475. $routes->post('create-request', 'PartnershipController::createPartnershipRequest', [
  8476. 'as' => 'partnership.create_request',
  8477. 'filter' => 'cors'
  8478. ]);
  8479. $routes->post('reapply-request', 'PartnershipController::createReapplyRequest', [
  8480. 'as' => 'partnership.reapply_request',
  8481. 'filter' => 'cors'
  8482. ]);
  8483. // 공용 API
  8484. $routes->post('list', 'PartnershipController::getPartnershipList', [
  8485. 'as' => 'partnership.list',
  8486. 'filter' => 'cors'
  8487. ]);
  8488. $routes->post('detail/(:num)', 'PartnershipController::getPartnershipDetail/$1', [
  8489. 'as' => 'partnership.detail',
  8490. 'filter' => 'cors'
  8491. ]);
  8492. $routes->post('history/(:num)', 'PartnershipController::getPartnershipHistory/$1', [
  8493. 'as' => 'partnership.history',
  8494. 'filter' => 'cors'
  8495. ]);
  8496. $routes->post('stats/(:num)', 'PartnershipController::getPartnershipStats/$1', [
  8497. 'as' => 'partnership.stats',
  8498. 'filter' => 'cors'
  8499. ]);
  8500. // 관리용 API (개발/디버깅)
  8501. $routes->get('debug/partnership/(:num)', 'PartnershipController::debugPartnership/$1', [
  8502. 'as' => 'partnership.debug',
  8503. 'filter' => 'cors'
  8504. ]);
  8505. $routes->get('debug/stats/(:num)', 'PartnershipController::getPartnershipStats/$1', [
  8506. 'as' => 'partnership.debug_stats',
  8507. 'filter' => 'cors'
  8508. ]);
  8509. $routes->get('debug/all', 'PartnershipController::debugAllPartnerships', [
  8510. 'as' => 'partnership.debug_all',
  8511. 'filter' => 'cors'
  8512. ]);
  8513. });
  8514. // =============================================================================
  8515. // 파트너십 대시보드 API (향후 확장)
  8516. // =============================================================================
  8517. $routes->group('partnership-dashboard', function($routes) {
  8518. $routes->post('vendor/(:num)', 'PartnershipDashboardController::getVendorDashboard/$1', [
  8519. 'as' => 'partnership_dashboard.vendor',
  8520. 'filter' => 'cors'
  8521. ]);
  8522. $routes->post('influencer/(:num)', 'PartnershipDashboardController::getInfluencerDashboard/$1', [
  8523. 'as' => 'partnership_dashboard.influencer',
  8524. 'filter' => 'cors'
  8525. ]);
  8526. $routes->post('analytics', 'PartnershipDashboardController::getAnalytics', [
  8527. 'as' => 'partnership_dashboard.analytics',
  8528. 'filter' => 'cors'
  8529. ]);
  8530. });
  8531. // =============================================================================
  8532. // 파트너십 알림 API (향후 확장)
  8533. // =============================================================================
  8534. $routes->group('partnership-notifications', function($routes) {
  8535. $routes->post('send', 'PartnershipNotificationController::sendNotification', [
  8536. 'as' => 'partnership_notifications.send',
  8537. 'filter' => 'cors'
  8538. ]);
  8539. $routes->post('list/(:num)', 'PartnershipNotificationController::getNotifications/$1', [
  8540. 'as' => 'partnership_notifications.list',
  8541. 'filter' => 'cors'
  8542. ]);
  8543. $routes->post('mark-read', 'PartnershipNotificationController::markAsRead', [
  8544. 'as' => 'partnership_notifications.mark_read',
  8545. 'filter' => 'cors'
  8546. ]);
  8547. });
  8548. });
  8549. // =============================================================================
  8550. // 파트너십 전용 웹 라우팅 (향후 확장)
  8551. // =============================================================================
  8552. $routes->group('partnership', function($routes) {
  8553. // 파트너십 전용 대시보드 페이지 (향후 구현)
  8554. $routes->get('dashboard/vendor/(:num)', 'PartnershipWebController::vendorDashboard/$1', [
  8555. 'as' => 'partnership_web.vendor_dashboard'
  8556. ]);
  8557. $routes->get('dashboard/influencer/(:num)', 'PartnershipWebController::influencerDashboard/$1', [
  8558. 'as' => 'partnership_web.influencer_dashboard'
  8559. ]);
  8560. $routes->get('analytics', 'PartnershipWebController::analytics', [
  8561. 'as' => 'partnership_web.analytics'
  8562. ]);
  8563. // 파트너십 관리 페이지
  8564. $routes->get('manage', 'PartnershipWebController::manage', [
  8565. 'as' => 'partnership_web.manage'
  8566. ]);
  8567. $routes->get('settings', 'PartnershipWebController::settings', [
  8568. 'as' => 'partnership_web.settings'
  8569. ]);
  8570. });
  8571. // =============================================================================
  8572. // 파트너십 시스템 헬스체크 및 문서
  8573. // =============================================================================
  8574. $routes->group('health', function($routes) {
  8575. // 파트너십 시스템 헬스체크
  8576. $routes->get('partnership', function() {
  8577. return service('response')->setJSON([
  8578. 'status' => 'OK',
  8579. 'message' => 'Partnership System (Routes2.php) is healthy',
  8580. 'timestamp' => date('Y-m-d H:i:s'),
  8581. 'version' => '2.0',
  8582. 'system' => 'Routes2.php - Independent Partnership System',
  8583. 'api_endpoints' => [
  8584. 'vendor_apis' => [
  8585. 'POST /api/vendor-influencer/requests',
  8586. 'POST /api/vendor-influencer/approve',
  8587. 'POST /api/vendor-influencer/terminate'
  8588. ],
  8589. 'influencer_apis' => [
  8590. 'POST /api/vendor-influencer/search-vendors',
  8591. 'POST /api/vendor-influencer/create-request',
  8592. 'POST /api/vendor-influencer/reapply-request'
  8593. ],
  8594. 'common_apis' => [
  8595. 'POST /api/vendor-influencer/list',
  8596. 'POST /api/vendor-influencer/detail/{id}',
  8597. 'POST /api/vendor-influencer/history/{id}',
  8598. 'POST /api/vendor-influencer/stats/{id}'
  8599. ],
  8600. 'debug_apis' => [
  8601. 'GET /api/vendor-influencer/debug/partnership/{id}',
  8602. 'GET /api/vendor-influencer/debug/stats/{id}',
  8603. 'GET /api/vendor-influencer/debug/all'
  8604. ]
  8605. ],
  8606. 'database' => [
  8607. 'table' => 'VENDOR_INFLUENCER_PARTNERSHIP',
  8608. 'model' => 'VendorInfluencerPartnershipModel',
  8609. 'controller' => 'PartnershipController'
  8610. ]
  8611. ]);
  8612. }, ['as' => 'health.partnership']);
  8613. // 파트너십 API 문서
  8614. $routes->get('partnership/docs', function() {
  8615. return service('response')->setJSON([
  8616. 'title' => 'Partnership API Documentation (Routes2.php)',
  8617. 'description' => '벤더사-인플루언서 파트너십 관리 API 문서',
  8618. 'version' => '2.0',
  8619. 'base_url' => base_url('api/vendor-influencer'),
  8620. 'authentication' => 'Bearer Token (JWT)',
  8621. 'endpoints' => [
  8622. [
  8623. 'method' => 'POST',
  8624. 'path' => '/requests',
  8625. 'description' => '벤더사의 인플루언서 요청 목록 조회',
  8626. 'parameters' => [
  8627. 'vendorSeq' => 'integer (required)',
  8628. 'status' => 'string (optional)',
  8629. 'keyword' => 'string (optional)',
  8630. 'page' => 'integer (optional)',
  8631. 'size' => 'integer (optional)'
  8632. ]
  8633. ],
  8634. [
  8635. 'method' => 'POST',
  8636. 'path' => '/approve',
  8637. 'description' => '파트너십 승인/거부 처리',
  8638. 'parameters' => [
  8639. 'mappingSeq' => 'integer (required)',
  8640. 'action' => 'string (required) - APPROVE|REJECT',
  8641. 'processedBy' => 'integer (required)',
  8642. 'responseMessage' => 'string (optional)'
  8643. ]
  8644. ],
  8645. [
  8646. 'method' => 'POST',
  8647. 'path' => '/terminate',
  8648. 'description' => '파트너십 해지 처리',
  8649. 'parameters' => [
  8650. 'mappingSeq' => 'integer (required)',
  8651. 'terminatedBy' => 'integer (required)',
  8652. 'terminateReason' => 'string (optional)'
  8653. ]
  8654. ],
  8655. [
  8656. 'method' => 'POST',
  8657. 'path' => '/search-vendors',
  8658. 'description' => '인플루언서의 벤더사 검색',
  8659. 'parameters' => [
  8660. 'influencerSeq' => 'integer (required)',
  8661. 'keyword' => 'string (optional)',
  8662. 'category' => 'string (optional)',
  8663. 'page' => 'integer (optional)',
  8664. 'size' => 'integer (optional)'
  8665. ]
  8666. ],
  8667. [
  8668. 'method' => 'POST',
  8669. 'path' => '/create-request',
  8670. 'description' => '파트너십 요청 생성',
  8671. 'parameters' => [
  8672. 'vendorSeq' => 'integer (required)',
  8673. 'influencerSeq' => 'integer (required)',
  8674. 'requestMessage' => 'string (optional)',
  8675. 'commissionRate' => 'decimal (optional)',
  8676. 'specialConditions' => 'string (optional)'
  8677. ]
  8678. ],
  8679. [
  8680. 'method' => 'POST',
  8681. 'path' => '/reapply-request',
  8682. 'description' => '재승인 요청 생성',
  8683. 'parameters' => [
  8684. 'vendorSeq' => 'integer (required)',
  8685. 'influencerSeq' => 'integer (required)',
  8686. 'requestMessage' => 'string (optional)',
  8687. 'commissionRate' => 'decimal (optional)',
  8688. 'specialConditions' => 'string (optional)'
  8689. ]
  8690. ]
  8691. ]
  8692. ]);
  8693. }, ['as' => 'health.partnership_docs']);
  8694. });
  8695. // =============================================================================
  8696. // Routes2.php 정보 및 관리
  8697. // =============================================================================
  8698. $routes->get('routes2', function() {
  8699. return service('response')->setJSON([
  8700. 'title' => 'Routes2.php - Independent Partnership Routing System',
  8701. 'description' => '기존 Routes.php와 독립적으로 운영되는 파트너십 전용 라우팅 시스템',
  8702. 'version' => '2.0',
  8703. 'created' => '2024-12-22',
  8704. 'features' => [
  8705. '완전 독립적인 파트너십 라우팅',
  8706. '기존 시스템과 충돌 없음',
  8707. '확장 가능한 구조',
  8708. '개발자 친화적 디버깅 도구',
  8709. '자동 API 문서화'
  8710. ],
  8711. 'routes_count' => [
  8712. 'api_routes' => 12,
  8713. 'web_routes' => 5,
  8714. 'health_routes' => 2,
  8715. 'debug_routes' => 3
  8716. ],
  8717. 'health_check' => base_url('health/partnership'),
  8718. 'api_docs' => base_url('health/partnership/docs'),
  8719. 'status' => 'Active and Independent'
  8720. ]);
  8721. }, ['as' => 'routes2.info']);
  8722. </file>
  8723. <file path="backend/app/Controllers/Alimtalk.php">
  8724. <?php
  8725. namespace App\Controllers;
  8726. use CodeIgniter\Controller;
  8727. class Alimtalk extends Controller
  8728. {
  8729. public function send()
  8730. {
  8731. $receivers = [
  8732. [
  8733. 'phone' => '01011112222',
  8734. 'name' => '홍길동',
  8735. // 아래 부분만 알림톡 템플릿 변수와 1:1 매칭!
  8736. '이벤트 명' => '여름휴가 응모 이벤트',
  8737. '상품명' => '스타벅스 기프티콘',
  8738. '당첨일' => '2024-06-12',
  8739. '고객센터번호' => '1544-1234'
  8740. ]
  8741. ];
  8742. // 기본 파라미터
  8743. $variables = [
  8744. 'apikey' => 'npb9ryvqh9439js2sfbhuji4lwfmdgqu',
  8745. 'userid' => 'interscope',
  8746. 'senderkey' => '846700656ab2c0b136e4433751d75018ea48b8ec',
  8747. 'tpl_code' => 'UA_1201',
  8748. 'sender' => '010-8384-5309',
  8749. //'senddate' => date("YmdHis", strtotime("+10 minutes")),
  8750. ];
  8751. // 수신자별 파라미터 추가
  8752. foreach ($receivers as $idx => $info) {
  8753. $i = $idx + 1;
  8754. $variables["receiver_{$i}"] = $info['phone'];
  8755. $variables["recvname_{$i}"] = $info['name'];
  8756. // 템플릿 변수값 매칭
  8757. $variables["subject_{$i}"] = ''; // 필요 없으면 공란
  8758. $variables["message_{$i}"] =
  8759. "안녕하세요 고객님!\n"
  8760. . "{$info['이벤트 명']}\n"
  8761. . "{$info['상품명']} 당첨을 축하드립니다.\n"
  8762. . "당첨일자 : {$info['당첨일']}\n\n"
  8763. . "*이 메시지는 고객님이 참여한 이벤트 당첨으로 발송된 안내 메시지입니다.\n\n"
  8764. . "문의 : 고객센터 {$info['고객센터번호']}\n"
  8765. . "감사합니다.";
  8766. // 버튼 필요시 추가
  8767. // $variables["button_{$i}"] = '...';
  8768. }
  8769. $apiURL = 'https://kakaoapi.aligo.in/akv10/alimtalk/send/';
  8770. $hostInfo = parse_url($apiURL);
  8771. $port = (strtolower($hostInfo['scheme']) == 'https') ? 443 : 80;
  8772. // cURL 요청
  8773. $ch = curl_init();
  8774. curl_setopt($ch, CURLOPT_PORT, $port);
  8775. curl_setopt($ch, CURLOPT_URL, $apiURL);
  8776. curl_setopt($ch, CURLOPT_POST, 1);
  8777. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  8778. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($variables));
  8779. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  8780. $response = curl_exec($ch);
  8781. $error_msg = curl_error($ch);
  8782. curl_close($ch);
  8783. // 결과 출력 (json)
  8784. if ($error_msg) {
  8785. return $this->response->setJSON(['error' => $error_msg]);
  8786. }
  8787. $result = json_decode($response, true);
  8788. return $this->response->setJSON($result);
  8789. }
  8790. }
  8791. </file>
  8792. <file path="backend/app/Controllers/Auth.php">
  8793. <?php
  8794. namespace App\Controllers;
  8795. require_once __DIR__ . '/../Libraries/autoload.php';
  8796. use App\Models\UserListModel;
  8797. use CodeIgniter\RESTful\ResourceController;
  8798. use Google\Client;
  8799. use Google\Service\Oauth2;
  8800. use App\Libraries\JwtLib\JWT;
  8801. use App\Libraries\JwtLib\Key;
  8802. class Auth extends ResourceController
  8803. {
  8804. private const FRONTEND_BASE_URL = "http://localhost:3000";
  8805. //private const FRONTEND_BASE_URL = 'https://shopdeli.mycafe24.com';
  8806. protected $userModel;
  8807. public function __construct()
  8808. {
  8809. $this->userModel = new UserListModel();
  8810. }
  8811. //구글 로그인 콜백(인증)
  8812. public function callback()
  8813. {
  8814. if (isset($_GET['code'])) {
  8815. $code = $_GET['code'];
  8816. // Google 클라이언트 설정
  8817. $client = new Client();
  8818. $client->setClientId('373780605211-diojebh7mug45urv9rnqdil6n0b1ogge.apps.googleusercontent.com');
  8819. $client->setClientSecret('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');
  8820. $client->setRedirectUri('https://shopdeli.mycafe24.com/auth/callback');
  8821. $client->setAccessType('offline'); // 인증 요청 전에 지정!
  8822. $client->authenticate($code);
  8823. $googleAccessToken = $client->getAccessToken();
  8824. // 별도의 변수로 분리
  8825. $googleOAuthAccessToken = $googleAccessToken['access_token'] ?? null;
  8826. $googleOAuthRefreshToken = $googleAccessToken['refresh_token'] ?? null;
  8827. // 업데이트: setAccessToken에는 전체 배열을 넣을 수 있지만
  8828. // accessToken 만 넣으려면 아래처럼 쓸 수 있습니다.
  8829. if ($googleOAuthAccessToken) {
  8830. $client->setAccessToken($googleOAuthAccessToken);
  8831. }
  8832. // 사용자 정보 가져오기
  8833. $oauth2 = new Oauth2($client);
  8834. $userInfo = $oauth2->userinfo->get();
  8835. // 사용자 정보 변수 지정
  8836. $id = $userInfo->id;
  8837. $authenticatedEmail = $userInfo->email;
  8838. $name = $userInfo->name;
  8839. // DB Connection (CodeIgniter 4)
  8840. $db = \Config\Database::connect();
  8841. // 1. USER_LIST에서 이메일로 조회
  8842. $builder = $db->table('USER_LIST');
  8843. $user = $builder->where('EMAIL', $authenticatedEmail)->get()->getRowArray();
  8844. if ($user) {
  8845. $jwtSecret = env('JWT_SECRET');
  8846. $kid = env('JWT_KID');
  8847. if (empty($jwtSecret) || empty($kid)) {
  8848. return $this->failServerError('환경변수가 누락되었습니다. 관리자에게 문의하세요.');
  8849. }
  8850. if (!class_exists('\App\Libraries\JwtLib\JWT')) {
  8851. return $this->failServerError('JWT 라이브러리를 찾을 수 없습니다.');
  8852. }
  8853. $issuedAt = time();
  8854. $accessExpire = $issuedAt + 60 * 15; // 15분
  8855. $refreshExpire = $issuedAt + 60 * 60 * 24 * 14; // 14일
  8856. $accessPayload = [
  8857. 'iat' => $issuedAt,
  8858. 'exp' => $accessExpire,
  8859. 'sub' => $id,
  8860. 'name' => $name ?? '',
  8861. ];
  8862. $refreshPayload = [
  8863. 'iat' => $issuedAt,
  8864. 'exp' => $refreshExpire,
  8865. 'sub' => $id,
  8866. ];
  8867. try {
  8868. $accessToken = JWT::encode($accessPayload, $jwtSecret, 'HS256', $kid);
  8869. $refreshToken = JWT::encode($refreshPayload, $jwtSecret, 'HS256', $kid);
  8870. // (선택) DB의 리프레시 토큰 값 업데이트
  8871. $db = \Config\Database::connect();
  8872. $builder = $db->table('USER_LIST');
  8873. $builder->where('ID', $id)->update(['REFRESH_TOKEN' => $refreshToken]);
  8874. } catch (\Throwable $e) {
  8875. return $this->failServerError('JWT 생성 오류: ' . $e->getMessage());
  8876. }
  8877. unset($user['PASSWORD']); // 혹시 비번이 있다면 노출 방지
  8878. $query = http_build_query([
  8879. "accessToken" => $accessToken,
  8880. "refreshToken" => $refreshToken,
  8881. "user" => urlencode(json_encode($user)),
  8882. ]);
  8883. //return redirect()->to(base_url("auth/popupClose?$query"));
  8884. // 개발진행중 풀 URL
  8885. return redirect()->to(self::FRONTEND_BASE_URL."/auth/popupClose?$query");
  8886. } else {
  8887. // 회원이 없으면 회원가입
  8888. $type = 1;
  8889. // ID는 auto_increment라면 생략
  8890. $authData = [
  8891. 'ID' => $id,
  8892. 'NAME' => $name,
  8893. 'EMAIL' => $authenticatedEmail,
  8894. 'TYPE' => $type,
  8895. 'JOIN' => '1',
  8896. 'GOOGLE_REFRESH_TOKEN' => $googleOAuthRefreshToken ?? null
  8897. ];
  8898. $query = http_build_query([
  8899. "user" => urlencode(json_encode($authData)),
  8900. ]);
  8901. //return redirect()->to(base_url("auth/popupClose?$query"));
  8902. // 개발진행중 풀 URL
  8903. return redirect()->to(self::FRONTEND_BASE_URL."/auth/popupClose?$query");
  8904. }
  8905. } else {
  8906. echo "인증코드가 없습니다.";
  8907. }
  8908. }
  8909. public function join()
  8910. {
  8911. $postData = $this->request->getJSON(true);
  8912. // 필수값 추출
  8913. $id = $postData['ID'] ?? null;
  8914. $password = $postData['PASSWORD'] ?? null;
  8915. $name = $postData['NAME'] ?? null;
  8916. $nick_name = $postData['NICK_NAME'] ?? null;
  8917. $phone = $postData['PHONE'] ?? null;
  8918. $email = $postData['EMAIL'] ?? null;
  8919. $sns_type = $postData['SNS_TYPE'] ?? null;
  8920. $sns_link_id = $postData['SNS_LINK_ID'] ?? null;
  8921. $add_info1 = $postData['ADD_INFO1'] ?? null;
  8922. $google_refresh_token = $postData['GOOGLE_REFRESH_TOKEN'] ?? null;
  8923. $type = $postData['TYPE'] ?? null;
  8924. // 필수값 검증
  8925. if (empty($name) || empty($email)) {
  8926. return redirect()->back()->with('error', '필수 정보를 입력해 주세요.');
  8927. }
  8928. // insert용 데이터 준비
  8929. $insertData = [
  8930. 'ID' => $id,
  8931. 'PASSWORD' => $password,
  8932. 'NAME' => $name,
  8933. 'NICK_NAME' => $nick_name,
  8934. 'PHONE' => $phone,
  8935. 'EMAIL' => $email,
  8936. 'SNS_TYPE' => $sns_type,
  8937. 'SNS_LINK_ID' => $sns_link_id,
  8938. 'ADD_INFO1' => $add_info1,
  8939. 'GOOGLE_REFRESH_TOKEN' => $google_refresh_token,
  8940. 'TYPE' => $type,
  8941. ];
  8942. if (!empty($password)) {
  8943. $insertData['PASSWORD'] = password_hash($password, PASSWORD_DEFAULT);
  8944. }
  8945. // DB 연결 및 INSERT
  8946. try {
  8947. $db = \Config\Database::connect();
  8948. $builder = $db->table('USER_LIST');
  8949. $result = $builder->insert($insertData);
  8950. if (!$result) {
  8951. $error = $db->error();
  8952. return $this->response->setJSON([
  8953. 'status' => 'fail',
  8954. 'message' => 'DB Error: '.$error['message']
  8955. ])->setStatusCode(500);
  8956. }
  8957. } catch (\Throwable $e) {
  8958. return $this->response->setJSON([
  8959. 'status' => 'fail',
  8960. 'message' => 'Exception: ' . $e->getMessage()
  8961. ])->setStatusCode(500);
  8962. }
  8963. // 회원가입 성공 시, JSON 응답으로 결과 반환 (200 OK)
  8964. return $this->response->setJSON([
  8965. 'status' => 'success',
  8966. 'message' => '회원가입이 완료되었습니다.'
  8967. ])->setStatusCode(200);
  8968. }
  8969. public function joinVendor()
  8970. {
  8971. $postData = $this->request->getJSON(true);
  8972. // 필수값 추출
  8973. $id = $postData['ID'] ?? null;
  8974. $password = $postData['PASSWORD'] ?? null;
  8975. $name = $postData['NAME'] ?? null;
  8976. $company_name = $postData['COMPANY_NAME'] ?? null;
  8977. $company_number = $postData['COMPANY_NUMBER'] ?? null;
  8978. $hp = $postData['HP'] ?? null;
  8979. $email = $postData['EMAIL'] ?? null;
  8980. // 필수값 검증
  8981. if (empty($name) || empty($email)) {
  8982. return redirect()->back()->with('error', '필수 정보를 입력해 주세요.');
  8983. }
  8984. // insert용 데이터 준비
  8985. $insertData = [
  8986. 'ID' => $id,
  8987. 'PASSWORD' => $password,
  8988. 'NAME' => $name,
  8989. 'COMPANY_NAME' => $company_name,
  8990. 'HP' => $hp,
  8991. 'EMAIL' => $email,
  8992. 'COMPANY_NUMBER' => $company_number
  8993. ];
  8994. if (!empty($password)) {
  8995. $insertData['PASSWORD'] = password_hash($password, PASSWORD_DEFAULT);
  8996. }
  8997. // DB 연결 및 INSERT
  8998. try {
  8999. $db = \Config\Database::connect();
  9000. $builder = $db->table('VENDOR_LIST');
  9001. $result = $builder->insert($insertData);
  9002. if (!$result) {
  9003. $error = $db->error();
  9004. return $this->response->setJSON([
  9005. 'status' => 'fail',
  9006. 'message' => 'DB Error: '.$error['message']
  9007. ])->setStatusCode(500);
  9008. }
  9009. } catch (\Throwable $e) {
  9010. return $this->response->setJSON([
  9011. 'status' => 'fail',
  9012. 'message' => 'Exception: ' . $e->getMessage()
  9013. ])->setStatusCode(500);
  9014. }
  9015. // 회원가입 성공 시, JSON 응답으로 결과 반환 (200 OK)
  9016. return $this->response->setJSON([
  9017. 'status' => 'success',
  9018. 'message' => '회원가입이 완료되었습니다.'
  9019. ])->setStatusCode(200);
  9020. }
  9021. //구글 로그인 환경 회원 탈퇴
  9022. public function withdrawal()
  9023. {
  9024. // 1. 요청에서 사용자 SEQ 추출 (예: POST or GET)
  9025. $postData = $this->request->getJSON(true);
  9026. $seq = $postData['SEQ'];
  9027. $googleAccessToken = $postData['GOOGLE_REFRESH_TOKEN'];
  9028. // 2. 사용자 정보 조회 (구글 토큰 포함)
  9029. $user = $this->userModel->find($seq);
  9030. if (!$user) {
  9031. return $this->response->setJSON(['error' => 'User not found'])->setStatusCode(404);
  9032. }
  9033. // 3. 구글 인증 연결 해제(access_token 필요)
  9034. if ($googleAccessToken) {
  9035. $this->revokeGoogleAccess($googleAccessToken);
  9036. }
  9037. // 4. USER_LIST에서 사용자 삭제
  9038. $this->userModel->delete($seq);
  9039. // 5. 응답 반환
  9040. return $this->response->setJSON([
  9041. 'result' => 'User account deleted and Google link revoked'
  9042. ])->setStatusCode(200);
  9043. }
  9044. /***********************************
  9045. * 카카오 간편로그인 / 가입
  9046. **********************************/
  9047. //카카오 인증
  9048. public function kakaoLogin()
  9049. {
  9050. $clientId = '1f8376b18a02a00f2e4e5594f9ace6d4'; // 카카오 REST API 키로 변경
  9051. $redirectUri = urlencode('https://shopdeli.mycafe24.com/auth/kakao'); // 콜백 URL (ex: https://도메인/auth/kakaoCallback)
  9052. $url = "https://kauth.kakao.com/oauth/authorize?client_id={$clientId}&redirect_uri={$redirectUri}&response_type=code";
  9053. return redirect()->to($url);
  9054. }
  9055. //카카오 인증후 진행
  9056. public function kakao()
  9057. {
  9058. $code = $this->request->getGet('code');
  9059. $clientId = '1f8376b18a02a00f2e4e5594f9ace6d4'; // 카카오 REST API 키
  9060. $redirectUri = 'https://shopdeli.mycafe24.com/auth/kakao'; // 콜백 URL
  9061. $tokenUrl = "https://kauth.kakao.com/oauth/token";
  9062. // 토큰 요청
  9063. $tokenData = [
  9064. 'grant_type' => 'authorization_code',
  9065. 'scopes' => 'offline_access',
  9066. 'client_id' => $clientId,
  9067. 'redirect_uri' => $redirectUri,
  9068. 'code' => $code,
  9069. ];
  9070. $client = \Config\Services::curlrequest();
  9071. $tokenResponse = $client->post($tokenUrl, [
  9072. 'form_params' => $tokenData
  9073. ]);
  9074. $tokenResult = json_decode($tokenResponse->getBody(), true);
  9075. $accessTokenKakao = $tokenResult['access_token'];
  9076. $refreshTokenKakao = $tokenResult['refresh_token'];
  9077. // 사용자 정보 요청
  9078. $userUrl = "https://kapi.kakao.com/v2/user/me";
  9079. $userResponse = $client->get($userUrl, [
  9080. 'headers' => [
  9081. 'Authorization' => 'Bearer ' . $accessTokenKakao,
  9082. ]
  9083. ]);
  9084. $userInfo = json_decode($userResponse->getBody(), true);
  9085. $userInfo['access_token'] = $accessTokenKakao;
  9086. $userInfo['refresh_token'] = $refreshTokenKakao; //회원탈퇴시 이용 로그인시 마다 신규 리프래시 토큰 발급 받게 됨
  9087. // 여기에 회원가입/로그인 처리를 구현하세요
  9088. // 예: $userInfo['kakao_account']['email'], $userInfo['properties']['nickname']
  9089. //DB 커넥션
  9090. $db = \Config\Database::connect();
  9091. // 1. USER_LIST에서 이메일로 조회
  9092. $id = $userInfo['id'];
  9093. $email = $userInfo['kakao_account']['email'];
  9094. $builder = $db->table('USER_LIST');
  9095. $user = $builder->where('EMAIL', $email)->get()->getRowArray();
  9096. if($user){
  9097. $jwtSecret = env('JWT_SECRET');
  9098. $kid = env('JWT_KID');
  9099. if (empty($jwtSecret) || empty($kid)) {
  9100. return $this->failServerError('환경변수가 누락되었습니다. 관리자에게 문의하세요.');
  9101. }
  9102. if (!class_exists('\App\Libraries\JwtLib\JWT')) {
  9103. return $this->failServerError('JWT 라이브러리를 찾을 수 없습니다.');
  9104. }
  9105. $issuedAt = time();
  9106. $accessExpire = $issuedAt + 60 * 15; // 15분
  9107. $refreshExpire = $issuedAt + 60 * 60 * 24 * 14; // 14일
  9108. $accessPayload = [
  9109. 'iat' => $issuedAt,
  9110. 'exp' => $accessExpire,
  9111. 'sub' => $id,
  9112. //'name' => $name ?? '',
  9113. ];
  9114. $refreshPayload = [
  9115. 'iat' => $issuedAt,
  9116. 'exp' => $refreshExpire,
  9117. 'sub' => $id,
  9118. ];
  9119. try {
  9120. $accessToken = JWT::encode($accessPayload, $jwtSecret, 'HS256', $kid);
  9121. $refreshToken = JWT::encode($refreshPayload, $jwtSecret, 'HS256', $kid);
  9122. // (선택) DB의 리프레시 토큰 값 업데이트
  9123. $db = \Config\Database::connect();
  9124. $builder = $db->table('USER_LIST');
  9125. $builder->where('ID', $id)->update([
  9126. 'REFRESH_TOKEN' => $refreshToken,
  9127. 'KAKAO_REFRESH_TOKEN' => $userInfo['refresh_token']
  9128. ]);
  9129. } catch (\Throwable $e) {
  9130. return $this->failServerError('JWT 생성 오류: ' . $e->getMessage());
  9131. }
  9132. unset($user['PASSWORD']); // 혹시 비번이 있다면 노출 방지
  9133. $query = http_build_query([
  9134. "accessToken" => $accessToken,
  9135. "refreshToken" => $refreshToken,
  9136. "user" => urlencode(json_encode($user)),
  9137. ]);
  9138. //return redirect()->to(base_url("auth/popupClose?$query"));
  9139. // 개발진행중 풀 URL
  9140. return redirect()->to(self::FRONTEND_BASE_URL."/auth/popupClose?$query");
  9141. }else{
  9142. // 회원이 없으면 회원가입
  9143. $type = 1;
  9144. // ID는 auto_increment라면 생략
  9145. $authData = [
  9146. 'ID' => $id,
  9147. //'NAME' => $name,
  9148. 'EMAIL' => $email,
  9149. 'TYPE' => $type,
  9150. 'JOIN' => '1',
  9151. 'KAKAO_REFRESH_TOKEN' => $userInfo['refresh_token'] ?? null
  9152. ];
  9153. $query = http_build_query([
  9154. "user" => urlencode(json_encode($authData)),
  9155. ]);
  9156. //return redirect()->to(base_url("auth/popupClose?$query"));
  9157. // 개발진행중 풀 URL
  9158. return redirect()->to(self::FRONTEND_BASE_URL."/auth/popupClose?$query");
  9159. }
  9160. }
  9161. //카카오 회원탈퇴
  9162. public function kakaoWithdrawal(){
  9163. // 1. 요청에서 사용자 SEQ 추출 (예: POST or GET)
  9164. $postData = $this->request->getJSON(true);
  9165. $seq = $postData['SEQ'];
  9166. $refreshTokenKaKao = $postData['KAKAO_REFRESH_TOKEN'];
  9167. // 2. 사용자 정보 조회 (구글 토큰 포함)
  9168. $user = $this->userModel->find($seq);
  9169. if (!$user) {
  9170. return $this->response->setJSON(['error' => 'User not found'])->setStatusCode(404);
  9171. }
  9172. // 3. 카카오 언링크 처리
  9173. $tokenUrl = "https://kauth.kakao.com/oauth/token";
  9174. $tokenData = [
  9175. 'grant_type' => 'refresh_token',
  9176. 'client_id' => '1f8376b18a02a00f2e4e5594f9ace6d4',
  9177. 'refresh_token' => $refreshTokenKaKao, // DB에서 불러온 값
  9178. ];
  9179. $client = \Config\Services::curlrequest();
  9180. $tokenResponse = $client->post($tokenUrl, [
  9181. 'form_params' => $tokenData
  9182. ]);
  9183. $tokenResult = json_decode($tokenResponse->getBody(), true);
  9184. $accessTokenKakao = $tokenResult['access_token'];
  9185. // (2) 발급받은 access_token으로 연결 끊기 요청
  9186. $userUnlinkUrl = "https://kapi.kakao.com/v1/user/unlink";
  9187. $response = $client->post($userUnlinkUrl, [
  9188. 'headers' => [
  9189. 'Authorization' => 'Bearer ' . $accessTokenKakao,
  9190. ]
  9191. ]);
  9192. // 4. USER_LIST에서 사용자 삭제
  9193. $this->userModel->delete($seq);
  9194. // 5. 응답 반환
  9195. return $this->response->setJSON([
  9196. 'result' => 'User account deleted and Google link revoked'
  9197. ])->setStatusCode(200);
  9198. }
  9199. /***********************************
  9200. * 내아버 간편로그인 / 가입
  9201. **********************************/
  9202. //네이버 인증
  9203. public function naverLogin()
  9204. {
  9205. $client_id = 'tPw7dRu1r7yY89O5gN7n';
  9206. $redirect_uri = urlencode('https://shopdeli.mycafe24.com/auth/naver'); // ex) https://your.site/naver-callback
  9207. $state = bin2hex(random_bytes(8));
  9208. session()->set('naver_state', $state);
  9209. $naver_auth_url = "https://nid.naver.com/oauth2.0/authorize?"
  9210. . "response_type=code"
  9211. . "&client_id={$client_id}"
  9212. . "&client_icon=https://ndevthumb-phinf.pstatic.net/20250708_43/1751954347202gc3db_JPEG/x49C3CDfcWcI20250708145907.jpeg"
  9213. . "&redirect_uri={$redirect_uri}"
  9214. . "&state={$state}";
  9215. // 네이버 인증/동의화면으로 리디렉트
  9216. return redirect()->to($naver_auth_url);
  9217. }
  9218. public function naver(){
  9219. $client_id = 'tPw7dRu1r7yY89O5gN7n';
  9220. $client_secret = 'Pgan4lv9l9';
  9221. $state = $this->request->getGet('state');
  9222. $code = $this->request->getGet('code');
  9223. if ($state !== session()->get('naver_state')) {
  9224. exit('CSRF 실패');
  9225. }
  9226. // 토큰 발급
  9227. $token_url = "https://nid.naver.com/oauth2.0/token"
  9228. . "?grant_type=authorization_code"
  9229. . "&client_id={$client_id}"
  9230. . "&client_secret={$client_secret}"
  9231. . "&code={$code}"
  9232. . "&state={$state}";
  9233. // cURL로 토큰 요청
  9234. $ch = curl_init();
  9235. curl_setopt($ch, CURLOPT_URL, $token_url);
  9236. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  9237. $token_response = curl_exec($ch);
  9238. curl_close($ch);
  9239. // JSON 파싱
  9240. $token_data = json_decode($token_response, true);
  9241. $access_token = $token_data['access_token'] ?? null;
  9242. // 회원 정보 요청
  9243. if ($access_token) {
  9244. $headers = [
  9245. "Authorization: Bearer {$access_token}"
  9246. ];
  9247. $ch = curl_init();
  9248. curl_setopt($ch, CURLOPT_URL, "https://openapi.naver.com/v1/nid/me");
  9249. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  9250. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  9251. $user_info = curl_exec($ch);
  9252. curl_close($ch);
  9253. $user_info_arr = json_decode($user_info, true);
  9254. $user_info_arr['refresh_token'] = $token_data['refresh_token'];
  9255. $user_info_arr['access_token'] = $token_data['access_token'];
  9256. //DB 커넥션
  9257. $db = \Config\Database::connect();
  9258. // 1. USER_LIST에서 이메일로 조회
  9259. $id = $user_info_arr['response']['id'];
  9260. $email = $user_info_arr['response']['email'];
  9261. $name = $user_info_arr['response']['name'];
  9262. $phone = $user_info_arr['response']['mobile'];
  9263. $builder = $db->table('USER_LIST');
  9264. $user = $builder->where('EMAIL', $email)->get()->getRowArray();
  9265. if($user){
  9266. $jwtSecret = env('JWT_SECRET');
  9267. $kid = env('JWT_KID');
  9268. if (empty($jwtSecret) || empty($kid)) {
  9269. return $this->failServerError('환경변수가 누락되었습니다. 관리자에게 문의하세요.');
  9270. }
  9271. if (!class_exists('\App\Libraries\JwtLib\JWT')) {
  9272. return $this->failServerError('JWT 라이브러리를 찾을 수 없습니다.');
  9273. }
  9274. $issuedAt = time();
  9275. $accessExpire = $issuedAt + 60 * 15; // 15분
  9276. $refreshExpire = $issuedAt + 60 * 60 * 24 * 14; // 14일
  9277. $accessPayload = [
  9278. 'iat' => $issuedAt,
  9279. 'exp' => $accessExpire,
  9280. 'sub' => $id,
  9281. 'name' => $name ?? '',
  9282. ];
  9283. $refreshPayload = [
  9284. 'iat' => $issuedAt,
  9285. 'exp' => $refreshExpire,
  9286. 'sub' => $id,
  9287. ];
  9288. try {
  9289. $accessToken = JWT::encode($accessPayload, $jwtSecret, 'HS256', $kid);
  9290. $refreshToken = JWT::encode($refreshPayload, $jwtSecret, 'HS256', $kid);
  9291. // (선택) DB의 리프레시 토큰 값 업데이트
  9292. $db = \Config\Database::connect();
  9293. $builder = $db->table('USER_LIST');
  9294. $builder->where('ID', $id)->update([
  9295. 'REFRESH_TOKEN' => $refreshToken,
  9296. 'NAVER_REFRESH_TOKEN' => $user_info_arr['refresh_token']
  9297. ]);
  9298. } catch (\Throwable $e) {
  9299. return $this->failServerError('JWT 생성 오류: ' . $e->getMessage());
  9300. }
  9301. unset($user['PASSWORD']); // 혹시 비번이 있다면 노출 방지
  9302. $query = http_build_query([
  9303. "accessToken" => $accessToken,
  9304. "refreshToken" => $refreshToken,
  9305. "user" => urlencode(json_encode($user)),
  9306. ]);
  9307. //return redirect()->to(base_url("auth/popupClose?$query"));
  9308. // 개발진행중 풀 URL
  9309. return redirect()->to(self::FRONTEND_BASE_URL."/auth/popupClose?$query");
  9310. }else{
  9311. // 회원이 없으면 회원가입
  9312. $type = 1;
  9313. // ID는 auto_increment라면 생략
  9314. $authData = [
  9315. 'ID' => $id,
  9316. 'NAME' => $name,
  9317. 'PHONE' => $phone,
  9318. 'EMAIL' => $email,
  9319. 'TYPE' => $type,
  9320. 'JOIN' => '1',
  9321. 'NAVER_REFRESH_TOKEN' => $user_info_arr['refresh_token'] ?? null
  9322. ];
  9323. $query = http_build_query([
  9324. "user" => urlencode(json_encode($authData)),
  9325. ]);
  9326. //return redirect()->to(base_url("auth/popupClose?$query"));
  9327. // 개발진행중 풀 URL
  9328. return redirect()->to(self::FRONTEND_BASE_URL."/auth/popupClose?$query");
  9329. }
  9330. } else {
  9331. // 오류 처리
  9332. }
  9333. }
  9334. public function naverWithdrawal($refreshToken)
  9335. {
  9336. // 1. 요청에서 사용자 SEQ 추출 (예: POST or GET)
  9337. $postData = $this->request->getJSON(true);
  9338. $seq = $postData['SEQ'];
  9339. $refreshTokenNaver = $postData['NAVER_REFRESH_TOKEN'];
  9340. // 2. 사용자 정보 조회 (구글 토큰 포함)
  9341. $user = $this->userModel->find($seq);
  9342. if (!$user) {
  9343. return $this->response->setJSON(['error' => 'User not found'])->setStatusCode(404);
  9344. }
  9345. $clientId = 'tPw7dRu1r7yY89O5gN7n';
  9346. $clientSecret = 'Pgan4lv9l9';
  9347. // 1. 리프레시 토큰으로 엑세스 토큰 재발급 요청
  9348. $tokenUrl = "https://nid.naver.com/oauth2.0/token";
  9349. $tokenParams = [
  9350. 'grant_type' => 'refresh_token',
  9351. 'client_id' => $clientId,
  9352. 'client_secret' => $clientSecret,
  9353. 'refresh_token' => $refreshTokenNaver
  9354. ];
  9355. $ch = curl_init();
  9356. curl_setopt($ch, CURLOPT_URL, $tokenUrl);
  9357. curl_setopt($ch, CURLOPT_POST, true);
  9358. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($tokenParams));
  9359. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  9360. $tokenResponse = curl_exec($ch);
  9361. $tokenError = curl_error($ch);
  9362. curl_close($ch);
  9363. if ($tokenError) {
  9364. return [
  9365. 'success' => false,
  9366. 'message' => "토큰 재발급 오류: " . $tokenError,
  9367. ];
  9368. }
  9369. $tokenData = json_decode($tokenResponse, true);
  9370. if (empty($tokenData['access_token'])) {
  9371. return [
  9372. 'success' => false,
  9373. 'message' => '엑세스 토큰 재발급 실패: ' . ($tokenData['error_description'] ?? '알 수 없는 오류'),
  9374. ];
  9375. }
  9376. $accessToken = $tokenData['access_token'];
  9377. // 2. 엑세스 토큰으로 연결끊기
  9378. $withdrawUrl = "https://nid.naver.com/oauth2.0/token";
  9379. $withdrawParams = [
  9380. 'grant_type' => 'delete',
  9381. 'client_id' => $clientId,
  9382. 'client_secret' => $clientSecret,
  9383. 'access_token' => $accessToken,
  9384. 'service_provider' => 'NAVER',
  9385. ];
  9386. $ch2 = curl_init();
  9387. curl_setopt($ch2, CURLOPT_URL, $withdrawUrl);
  9388. curl_setopt($ch2, CURLOPT_POST, true);
  9389. curl_setopt($ch2, CURLOPT_POSTFIELDS, http_build_query($withdrawParams));
  9390. curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
  9391. $withdrawResponse = curl_exec($ch2);
  9392. $withdrawError = curl_error($ch2);
  9393. curl_close($ch2);
  9394. if ($withdrawError) {
  9395. return [
  9396. 'success' => false,
  9397. 'message' => "연결해제 요청 오류: " . $withdrawError,
  9398. ];
  9399. }
  9400. $withdrawData = json_decode($withdrawResponse, true);
  9401. if (isset($withdrawData['result']) && $withdrawData['result'] === 'success') {
  9402. return [
  9403. 'success' => true,
  9404. 'message' => '네이버 연동 해제 완료',
  9405. ];
  9406. // 4. USER_LIST에서 사용자 삭제
  9407. $this->userModel->delete($seq);
  9408. // 5. 응답 반환
  9409. return $this->response->setJSON([
  9410. 'result' => 'User account deleted and Google link revoked'
  9411. ])->setStatusCode(200);
  9412. } else {
  9413. return [
  9414. 'success' => false,
  9415. 'message' => $withdrawData['error'] ?? '연동 해제 실패',
  9416. ];
  9417. }
  9418. }
  9419. /***********************************
  9420. * @param $refreshTokenGoogle
  9421. * @return void
  9422. **********************************/
  9423. // 구글 연결 가입정보 연결 해제(회원가입중 페이지 빠져나올경우 리프래시 토큰이 사라짐 고객이 직접 계정에서 해제 필요)
  9424. protected function revokeGoogleAccess($refreshTokenGoogle)
  9425. {
  9426. // 1. 리프레시 토큰으로 엑세스 토큰 발급
  9427. $client_id = '373780605211-diojebh7mug45urv9rnqdil6n0b1ogge.apps.googleusercontent.com';
  9428. $client_secret = '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';
  9429. $refresh_token = $refreshTokenGoogle;
  9430. $token_url = 'https://oauth2.googleapis.com/token';
  9431. $params = [
  9432. 'client_id' => $client_id,
  9433. 'client_secret' => $client_secret,
  9434. 'refresh_token' => $refresh_token,
  9435. 'grant_type' => 'refresh_token',
  9436. ];
  9437. $ch = curl_init();
  9438. curl_setopt($ch, CURLOPT_URL, $token_url);
  9439. curl_setopt($ch, CURLOPT_POST, true);
  9440. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
  9441. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  9442. $response = curl_exec($ch);
  9443. curl_close($ch);
  9444. $data = json_decode($response, true);
  9445. // 2. 새 엑세스 토큰으로 연결 끊기
  9446. if (!empty($data['access_token'])) {
  9447. $accessToken = $data['access_token'];
  9448. $revoke_url = 'https://accounts.google.com/o/oauth2/revoke?token=' . urlencode($accessToken);
  9449. $ch = curl_init($revoke_url);
  9450. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  9451. curl_exec($ch);
  9452. curl_close($ch);
  9453. } else {
  9454. // TODO : 엑세스 토큰 발급 실패 처리 필요
  9455. }
  9456. }
  9457. /***********************************
  9458. * 아이디 체크
  9459. **********************************/
  9460. public function checkId()
  9461. {
  9462. $postData = $this->request->getJSON(true);
  9463. // 필수값 검증
  9464. if (empty($id) || empty($type)) {
  9465. return $this->response->setJSON([
  9466. 'status' => 'fail',
  9467. 'message' => '필수 정보가 누락되었습니다.'
  9468. ])->setStatusCode(400);
  9469. }
  9470. $db = \Config\Database::connect();
  9471. try {
  9472. // type에 따라 다른 테이블에서 ID 중복 체크
  9473. if ($type === 'vendor') {
  9474. // 벤더 회원가입의 경우 VENDOR_LIST 테이블 체크
  9475. $builder = $db->table('VENDOR_LIST');
  9476. $existingUser = $builder->where('ID', $id)->get()->getRowArray();
  9477. if ($existingUser) {
  9478. return $this->response->setJSON([
  9479. 'status' => 'fail',
  9480. 'message' => '이미 사용 중인 아이디입니다.'
  9481. ])->setStatusCode(200);
  9482. }
  9483. } elseif ($type === 'influencer') {
  9484. // 인플루언서(일반회원가입)의 경우 USER_LIST 테이블 체크
  9485. $builder2 = $db->table('USER_LIST');
  9486. $existingUser = $builder2->where('ID', $id)->get()->getRowArray();
  9487. if ($existingUser) {
  9488. return $this->response->setJSON([
  9489. 'status' => 'fail',
  9490. 'message' => '이미 사용 중인 아이디입니다.'
  9491. ])->setStatusCode(200);
  9492. }
  9493. } else {
  9494. return $this->response->setJSON([
  9495. 'status' => 'fail',
  9496. 'message' => '유효하지 않은 회원 유형입니다.'
  9497. ])->setStatusCode(400);
  9498. }
  9499. // ID가 사용 가능한 경우
  9500. return $this->response->setJSON([
  9501. 'status' => 'success',
  9502. 'message' => '사용 가능한 아이디입니다.'
  9503. ])->setStatusCode(200);
  9504. } catch (\Throwable $e) {
  9505. return $this->response->setJSON([
  9506. 'status' => 'fail',
  9507. 'message' => 'DB 오류: ' . $e->getMessage()
  9508. ])->setStatusCode(500);
  9509. }
  9510. }
  9511. }
  9512. </file>
  9513. <file path="backend/app/Controllers/BaseController.php">
  9514. <?php
  9515. namespace App\Controllers;
  9516. use CodeIgniter\Controller;
  9517. use CodeIgniter\HTTP\CLIRequest;
  9518. use CodeIgniter\HTTP\IncomingRequest;
  9519. use CodeIgniter\HTTP\RequestInterface;
  9520. use CodeIgniter\HTTP\ResponseInterface;
  9521. use Psr\Log\LoggerInterface;
  9522. /**
  9523. * Class BaseController
  9524. *
  9525. * BaseController provides a convenient place for loading components
  9526. * and performing functions that are needed by all your controllers.
  9527. * Extend this class in any new controllers:
  9528. * class Home extends BaseController
  9529. *
  9530. * For security be sure to declare any new methods as protected or private.
  9531. */
  9532. abstract class BaseController extends Controller
  9533. {
  9534. /**
  9535. * Instance of the main Request object.
  9536. *
  9537. * @var CLIRequest|IncomingRequest
  9538. */
  9539. protected $request;
  9540. /**
  9541. * An array of helpers to be loaded automatically upon
  9542. * class instantiation. These helpers will be available
  9543. * to all other controllers that extend BaseController.
  9544. *
  9545. * @var list<string>
  9546. */
  9547. protected $helpers = [];
  9548. /**
  9549. * Be sure to declare properties for any property fetch you initialized.
  9550. * The creation of dynamic property is deprecated in PHP 8.2.
  9551. */
  9552. // protected $session;
  9553. /**
  9554. * @return void
  9555. */
  9556. public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
  9557. {
  9558. // Do Not Edit This Line
  9559. parent::initController($request, $response, $logger);
  9560. // Preload any models, libraries, etc, here.
  9561. // E.g.: $this->session = service('session');
  9562. }
  9563. }
  9564. </file>
  9565. <file path="backend/app/Controllers/Home.php">
  9566. <?php
  9567. namespace App\Controllers;
  9568. class Home extends BaseController
  9569. {
  9570. public function index(): string
  9571. {
  9572. // DB에 연결
  9573. $db = \Config\Database::connect();
  9574. // USER_INFO 테이블에서 모든 데이터 가져오기
  9575. $builder = $db->table('USER_INFO');
  9576. $users = $builder->get()->getResultArray();
  9577. return view('welcome_message', ['users' => $users]);
  9578. }
  9579. }
  9580. </file>
  9581. <file path="backend/app/Controllers/InfluencerControllerV2.php">
  9582. <?php
  9583. namespace App\Controllers;
  9584. use CodeIgniter\RESTful\ResourceController;
  9585. use App\Models\VendorInfluencerMappingModel;
  9586. use App\Models\VendorInfluencerStatusHistoryModel;
  9587. use App\Models\VendorModel;
  9588. use App\Models\UserModel;
  9589. class InfluencerControllerV2 extends ResourceController
  9590. {
  9591. protected $modelName = 'App\Models\VendorInfluencerMappingModel';
  9592. protected $format = 'json';
  9593. protected $vendorInfluencerModel;
  9594. protected $statusHistoryModel;
  9595. protected $vendorModel;
  9596. protected $userModel;
  9597. public function __construct()
  9598. {
  9599. $this->vendorInfluencerModel = new VendorInfluencerMappingModel();
  9600. $this->statusHistoryModel = new VendorInfluencerStatusHistoryModel();
  9601. $this->vendorModel = new VendorModel();
  9602. $this->userModel = new UserModel();
  9603. }
  9604. /**
  9605. * 벤더사 검색 (상태 정보 포함)
  9606. */
  9607. public function searchVendors()
  9608. {
  9609. try {
  9610. $request = $this->request->getJSON();
  9611. $influencerSeq = $request->influencerSeq ?? null;
  9612. $name = $request->name ?? '';
  9613. $category = $request->category ?? '';
  9614. $page = $request->page ?? 1;
  9615. $size = $request->size ?? 10;
  9616. if (!$influencerSeq) {
  9617. return $this->response->setStatusCode(400)->setJSON([
  9618. 'success' => false,
  9619. 'message' => '인플루언서 SEQ는 필수입니다.'
  9620. ]);
  9621. }
  9622. // 벤더사 목록 조회
  9623. $vendors = $this->vendorModel->searchVendors($name, $category, $page, $size);
  9624. // 각 벤더사와의 파트너십 상태 확인
  9625. foreach ($vendors['data'] as &$vendor) {
  9626. $partnership = $this->vendorInfluencerModel
  9627. ->select('VENDOR_INFLUENCER_MAPPING.SEQ, VENDOR_INFLUENCER_MAPPING.REQUEST_TYPE,
  9628. VENDOR_INFLUENCER_STATUS_HISTORY.STATUS as CURRENT_STATUS,
  9629. VENDOR_INFLUENCER_STATUS_HISTORY.STATUS_MESSAGE,
  9630. VENDOR_INFLUENCER_STATUS_HISTORY.CHANGED_DATE')
  9631. ->join('VENDOR_INFLUENCER_STATUS_HISTORY',
  9632. 'VENDOR_INFLUENCER_STATUS_HISTORY.MAPPING_SEQ = VENDOR_INFLUENCER_MAPPING.SEQ AND VENDOR_INFLUENCER_STATUS_HISTORY.IS_CURRENT = "Y"')
  9633. ->where('VENDOR_SEQ', $vendor['SEQ'])
  9634. ->where('INFLUENCER_SEQ', $influencerSeq)
  9635. ->where('VENDOR_INFLUENCER_MAPPING.IS_ACT', 'Y')
  9636. ->orderBy('VENDOR_INFLUENCER_MAPPING.REG_DATE', 'DESC')
  9637. ->first();
  9638. if ($partnership) {
  9639. $vendor['PARTNERSHIP_STATUS'] = $partnership['CURRENT_STATUS'];
  9640. $vendor['PARTNERSHIP_MESSAGE'] = $partnership['STATUS_MESSAGE'];
  9641. $vendor['PARTNERSHIP_DATE'] = $partnership['CHANGED_DATE'];
  9642. $vendor['MAPPING_SEQ'] = $partnership['SEQ'];
  9643. } else {
  9644. $vendor['PARTNERSHIP_STATUS'] = null;
  9645. $vendor['PARTNERSHIP_MESSAGE'] = null;
  9646. $vendor['PARTNERSHIP_DATE'] = null;
  9647. $vendor['MAPPING_SEQ'] = null;
  9648. }
  9649. }
  9650. return $this->response->setJSON([
  9651. 'success' => true,
  9652. 'data' => $vendors['data'],
  9653. 'pagination' => $vendors['pagination']
  9654. ]);
  9655. } catch (\Exception $e) {
  9656. log_message('error', '벤더사 검색 오류: ' . $e->getMessage());
  9657. return $this->response->setStatusCode(500)->setJSON([
  9658. 'success' => false,
  9659. 'message' => '벤더사 검색 중 오류가 발생했습니다.',
  9660. 'error' => $e->getMessage()
  9661. ]);
  9662. }
  9663. }
  9664. /**
  9665. * 승인 요청 생성 (히스토리 테이블 기반)
  9666. */
  9667. public function createApprovalRequest()
  9668. {
  9669. try {
  9670. $request = $this->request->getJSON();
  9671. $vendorSeq = $request->vendorSeq ?? null;
  9672. $influencerSeq = $request->influencerSeq ?? null;
  9673. $requestType = $request->requestType ?? 'INFLUENCER_REQUEST';
  9674. $requestMessage = $request->requestMessage ?? '';
  9675. $requestedBy = $request->requestedBy ?? null;
  9676. $commissionRate = $request->commissionRate ?? null;
  9677. $specialConditions = $request->specialConditions ?? '';
  9678. if (!$vendorSeq || !$influencerSeq || !$requestedBy) {
  9679. return $this->response->setStatusCode(400)->setJSON([
  9680. 'success' => false,
  9681. 'message' => '필수 파라미터가 누락되었습니다.'
  9682. ]);
  9683. }
  9684. // 중복 요청 확인 (PENDING 상태)
  9685. $existingRequest = $this->vendorInfluencerModel->checkExistingPendingRequest($vendorSeq, $influencerSeq);
  9686. if ($existingRequest) {
  9687. return $this->response->setStatusCode(409)->setJSON([
  9688. 'success' => false,
  9689. 'message' => '이미 처리 중인 요청이 있습니다.'
  9690. ]);
  9691. }
  9692. // 요청 생성 (STATUS 컬럼 없이)
  9693. $data = [
  9694. 'VENDOR_SEQ' => $vendorSeq,
  9695. 'INFLUENCER_SEQ' => $influencerSeq,
  9696. 'REQUEST_TYPE' => $requestType,
  9697. 'REQUEST_MESSAGE' => $requestMessage,
  9698. 'REQUESTED_BY' => $requestedBy,
  9699. 'COMMISSION_RATE' => $commissionRate,
  9700. 'SPECIAL_CONDITIONS' => $specialConditions
  9701. ];
  9702. $mappingSeq = $this->vendorInfluencerModel->insert($data);
  9703. // afterInsert 콜백에서 자동으로 PENDING 상태 히스토리 생성됨
  9704. if ($mappingSeq) {
  9705. return $this->response->setStatusCode(201)->setJSON([
  9706. 'success' => true,
  9707. 'message' => '승인 요청이 성공적으로 생성되었습니다.',
  9708. 'data' => [
  9709. 'mappingSeq' => $mappingSeq,
  9710. 'status' => 'PENDING'
  9711. ]
  9712. ]);
  9713. } else {
  9714. return $this->response->setStatusCode(500)->setJSON([
  9715. 'success' => false,
  9716. 'message' => '승인 요청 생성에 실패했습니다.'
  9717. ]);
  9718. }
  9719. } catch (\Exception $e) {
  9720. log_message('error', '승인 요청 생성 오류: ' . $e->getMessage());
  9721. return $this->response->setStatusCode(500)->setJSON([
  9722. 'success' => false,
  9723. 'message' => '승인 요청 생성 중 오류가 발생했습니다.',
  9724. 'error' => $e->getMessage()
  9725. ]);
  9726. }
  9727. }
  9728. /**
  9729. * 재승인 요청 생성 (히스토리 테이블 기반)
  9730. */
  9731. public function createReapplyRequest()
  9732. {
  9733. try {
  9734. $request = $this->request->getJSON();
  9735. $vendorSeq = $request->vendorSeq ?? null;
  9736. $influencerSeq = $request->influencerSeq ?? null;
  9737. $requestMessage = $request->requestMessage ?? '';
  9738. $requestedBy = $request->requestedBy ?? null;
  9739. $commissionRate = $request->commissionRate ?? null;
  9740. $specialConditions = $request->specialConditions ?? '';
  9741. log_message('debug', '재승인 요청 파라미터: ' . json_encode([
  9742. 'vendorSeq' => $vendorSeq,
  9743. 'influencerSeq' => $influencerSeq,
  9744. 'requestedBy' => $requestedBy
  9745. ]));
  9746. if (!$vendorSeq || !$influencerSeq || !$requestedBy) {
  9747. return $this->response->setStatusCode(400)->setJSON([
  9748. 'success' => false,
  9749. 'message' => '필수 파라미터가 누락되었습니다.'
  9750. ]);
  9751. }
  9752. // 재승인 가능한 파트너십 확인 (TERMINATED 또는 REJECTED 상태)
  9753. $eligiblePartnership = $this->vendorInfluencerModel->checkReapplyEligiblePartnership($vendorSeq, $influencerSeq);
  9754. if (!$eligiblePartnership) {
  9755. return $this->response->setStatusCode(400)->setJSON([
  9756. 'success' => false,
  9757. 'message' => '재승인을 요청할 수 있는 이전 파트너십이 없습니다.'
  9758. ]);
  9759. }
  9760. // 이미 재승인 요청 중인지 확인
  9761. $existingReapply = $this->vendorInfluencerModel->checkExistingPendingRequest($vendorSeq, $influencerSeq);
  9762. if ($existingReapply) {
  9763. return $this->response->setStatusCode(409)->setJSON([
  9764. 'success' => false,
  9765. 'message' => '이미 재승인 요청이 진행 중입니다.'
  9766. ]);
  9767. }
  9768. // 재승인 요청 생성
  9769. $data = [
  9770. 'VENDOR_SEQ' => $vendorSeq,
  9771. 'INFLUENCER_SEQ' => $influencerSeq,
  9772. 'REQUEST_TYPE' => 'INFLUENCER_REAPPLY',
  9773. 'REQUEST_MESSAGE' => $requestMessage,
  9774. 'REQUESTED_BY' => $requestedBy,
  9775. 'COMMISSION_RATE' => $commissionRate ?: $eligiblePartnership['COMMISSION_RATE'],
  9776. 'SPECIAL_CONDITIONS' => $specialConditions ?: $eligiblePartnership['SPECIAL_CONDITIONS'],
  9777. 'ADD_INFO1' => 'REAPPLY',
  9778. 'ADD_INFO2' => $eligiblePartnership['SEQ'], // 이전 파트너십 SEQ
  9779. 'ADD_INFO3' => date('Y-m-d H:i:s') // 재신청 일시
  9780. ];
  9781. $mappingSeq = $this->vendorInfluencerModel->insert($data);
  9782. // afterInsert 콜백에서 자동으로 PENDING 상태 히스토리 생성됨
  9783. if ($mappingSeq) {
  9784. log_message('debug', "재승인 요청 성공 - 새 매핑 SEQ: " . $mappingSeq);
  9785. return $this->response->setStatusCode(201)->setJSON([
  9786. 'success' => true,
  9787. 'message' => '재승인 요청이 성공적으로 생성되었습니다.',
  9788. 'data' => [
  9789. 'mappingSeq' => $mappingSeq,
  9790. 'status' => 'PENDING',
  9791. 'isReapply' => true,
  9792. 'previousPartnership' => $eligiblePartnership['SEQ']
  9793. ]
  9794. ]);
  9795. } else {
  9796. log_message('error', '재승인 요청 삽입 실패');
  9797. return $this->response->setStatusCode(500)->setJSON([
  9798. 'success' => false,
  9799. 'message' => '재승인 요청 데이터 삽입에 실패했습니다.'
  9800. ]);
  9801. }
  9802. } catch (\Exception $e) {
  9803. log_message('error', '재승인 요청 처리 중 예외 발생: ' . $e->getMessage());
  9804. log_message('error', '재승인 요청 스택 트레이스: ' . $e->getTraceAsString());
  9805. return $this->response->setStatusCode(500)->setJSON([
  9806. 'success' => false,
  9807. 'message' => '재승인 요청 생성 중 오류가 발생했습니다.',
  9808. 'error' => $e->getMessage()
  9809. ]);
  9810. }
  9811. }
  9812. /**
  9813. * 내 파트너십 목록 조회 (상태 히스토리 포함)
  9814. */
  9815. public function getMyPartnerships()
  9816. {
  9817. try {
  9818. $request = $this->request->getJSON();
  9819. $influencerSeq = $request->influencerSeq ?? null;
  9820. $status = $request->status ?? null;
  9821. $page = $request->page ?? 1;
  9822. $size = $request->size ?? 20;
  9823. if (!$influencerSeq) {
  9824. return $this->response->setStatusCode(400)->setJSON([
  9825. 'success' => false,
  9826. 'message' => '인플루언서 SEQ는 필수입니다.'
  9827. ]);
  9828. }
  9829. $result = $this->vendorInfluencerModel->getVendorPartnershipsByInfluencer($influencerSeq, $page, $size, $status);
  9830. return $this->response->setJSON([
  9831. 'success' => true,
  9832. 'data' => $result['data'],
  9833. 'pagination' => $result['pagination']
  9834. ]);
  9835. } catch (\Exception $e) {
  9836. log_message('error', '파트너십 목록 조회 오류: ' . $e->getMessage());
  9837. return $this->response->setStatusCode(500)->setJSON([
  9838. 'success' => false,
  9839. 'message' => '파트너십 목록 조회 중 오류가 발생했습니다.',
  9840. 'error' => $e->getMessage()
  9841. ]);
  9842. }
  9843. }
  9844. /**
  9845. * 파트너십 해지 (히스토리 테이블 기반)
  9846. */
  9847. public function terminatePartnership()
  9848. {
  9849. try {
  9850. $request = $this->request->getJSON();
  9851. $mappingSeq = $request->mappingSeq ?? null;
  9852. $reason = $request->reason ?? '';
  9853. $terminatedBy = $request->terminatedBy ?? null;
  9854. if (!$mappingSeq || !$terminatedBy) {
  9855. return $this->response->setStatusCode(400)->setJSON([
  9856. 'success' => false,
  9857. 'message' => '필수 파라미터가 누락되었습니다.'
  9858. ]);
  9859. }
  9860. // 현재 상태 확인
  9861. $mapping = $this->vendorInfluencerModel->getWithCurrentStatus($mappingSeq);
  9862. if (!$mapping) {
  9863. return $this->response->setStatusCode(404)->setJSON([
  9864. 'success' => false,
  9865. 'message' => '해당 파트너십을 찾을 수 없습니다.'
  9866. ]);
  9867. }
  9868. if ($mapping['CURRENT_STATUS'] !== 'APPROVED') {
  9869. return $this->response->setStatusCode(400)->setJSON([
  9870. 'success' => false,
  9871. 'message' => '승인된 파트너십만 해지할 수 있습니다.'
  9872. ]);
  9873. }
  9874. // 상태를 TERMINATED로 변경
  9875. $this->statusHistoryModel->changeStatus($mappingSeq, 'TERMINATED', '파트너십 해지: ' . $reason, $terminatedBy);
  9876. // 해지 날짜 업데이트
  9877. $this->vendorInfluencerModel->update($mappingSeq, [
  9878. 'PARTNERSHIP_END_DATE' => date('Y-m-d H:i:s')
  9879. ]);
  9880. return $this->response->setJSON([
  9881. 'success' => true,
  9882. 'message' => '파트너십이 해지되었습니다.',
  9883. 'data' => [
  9884. 'mappingSeq' => $mappingSeq,
  9885. 'status' => 'TERMINATED'
  9886. ]
  9887. ]);
  9888. } catch (\Exception $e) {
  9889. log_message('error', '파트너십 해지 오류: ' . $e->getMessage());
  9890. return $this->response->setStatusCode(500)->setJSON([
  9891. 'success' => false,
  9892. 'message' => '파트너십 해지 중 오류가 발생했습니다.',
  9893. 'error' => $e->getMessage()
  9894. ]);
  9895. }
  9896. }
  9897. }
  9898. </file>
  9899. <file path="backend/app/Controllers/Mng.php">
  9900. <?php
  9901. namespace App\Controllers;
  9902. use CodeIgniter\RESTful\ResourceController;
  9903. class Mng extends ResourceController
  9904. {
  9905. //관리자 리스트
  9906. public function mnglist()
  9907. {
  9908. // DB 객체 얻기
  9909. $db = \Config\Database::connect();
  9910. $request = $this->request->getJSON(true);
  9911. if (!isset($request['compId'])) {
  9912. return $this->respond([
  9913. 'status' => 'fail',
  9914. 'message' => 'filter(compId)가 누락되었습니다.'
  9915. ], 400);
  9916. }
  9917. // ADM_LIST 테이블 모든 레코드 가져오기
  9918. $status = isset($request['status']) ? $request['status'] : null;
  9919. $compId = $request['compId'];
  9920. $builder = $db->table('ADM_LIST');
  9921. if ($compId !== '0-000000') {
  9922. $builder->where('COMP_ID', $compId);
  9923. }
  9924. if ($status === '-1') {
  9925. // 삭제된 관리자만 조회
  9926. $builder->where('status', '-1');
  9927. } else {
  9928. // 디폴트 :: 사용중(사용중,정지)인 관리자만 조회
  9929. $builder->whereIn('status', ['0', '1']);
  9930. }
  9931. $lists = $builder->get()->getResultArray();
  9932. // PASSWORD 필드 제거
  9933. $filtered = array_map(function($row) {
  9934. unset($row['PASSWORD']);
  9935. return $row;
  9936. }, $lists);
  9937. // 역순으로 정렬
  9938. $filtered = array_reverse($filtered);
  9939. // JSON 응답
  9940. return $this->respond($filtered, 200);
  9941. }
  9942. public function mngSearch()
  9943. {
  9944. $db = \Config\Database::connect();
  9945. // 요청 바디에서 filter와 keyword 추출 (예: {filter: "id", keyword: "admin"})
  9946. $request = $this->request->getJSON(true);
  9947. // 필수값 체크
  9948. if (
  9949. !isset($request['compId']) ||
  9950. !isset($request['filter']) ||
  9951. !isset($request['keyword']) ||
  9952. !in_array($request['filter'], ['id', 'name', 'status'])
  9953. ) {
  9954. return $this->respond([
  9955. 'status' => 'fail',
  9956. 'message' => 'filter(id, name, status)와 keyword가 필요합니다.'
  9957. ], 400);
  9958. }
  9959. $filterMap = [
  9960. 'id' => 'ID',
  9961. 'name' => 'NAME',
  9962. 'status' => 'STATUS'
  9963. ];
  9964. $filterColumn = $filterMap[$request['filter']];
  9965. $keyword = $request['keyword'];
  9966. $status = isset($request['status']) ? $request['status'] : null;
  9967. if (!isset($request['compId'])) {
  9968. return $this->respond([
  9969. 'status' => 'fail',
  9970. 'message' => 'filter(compId)가 누락되었습니다.'
  9971. ], 400);
  9972. }
  9973. $compId = $request['compId'];
  9974. // 평문 검색 (LIKE 연산 사용)
  9975. $builder = $db->table('ADM_LIST');
  9976. if ($compId !== '0-000000') {
  9977. $builder->where('COMP_ID', $compId);
  9978. }
  9979. // 사용중 관리자 리스트 검색, 삭제 관리자 리스트 검색 분리
  9980. if ($status === '-1') {
  9981. $builder->where('STATUS', '-1');
  9982. } else {
  9983. $builder->whereIn('STATUS', ['0', '1']);
  9984. }
  9985. $builder->like($filterColumn, $keyword);
  9986. $lists = $builder->get()->getResultArray();
  9987. // PASSWORD 제거
  9988. $filtered = array_map(function($row) {
  9989. unset($row['PASSWORD']);
  9990. return $row;
  9991. }, $lists);
  9992. // 최신순(역순) 정렬 (ID 기준 또는 원하는 기준으로 변경 가능)
  9993. $filtered = array_reverse($filtered);
  9994. return $this->respond($filtered, 200);
  9995. }
  9996. //관리자 등록
  9997. public function mngRegister()
  9998. {
  9999. // DB 객체 얻기
  10000. $db = \Config\Database::connect();
  10001. $request = $this->request->getJSON(true);
  10002. if (
  10003. !isset($request['id']) ||
  10004. !isset($request['password']) ||
  10005. !isset($request['name']) ||
  10006. !isset($request['email']) ||
  10007. !isset($request['phone'])
  10008. ) {
  10009. return $this->respond([
  10010. 'status' => 'fail',
  10011. 'message' => '필수 값이 누락됐습니다.(id, password, name, email, phone)'
  10012. ], 400);
  10013. }
  10014. // 비밀번호 해시
  10015. $hashedPassword = password_hash($request['password'], PASSWORD_DEFAULT);
  10016. $mngData = [
  10017. 'id' => $request['id'],
  10018. 'password' => $hashedPassword,
  10019. 'name' => $request['name'],
  10020. 'email' => $request['email'],
  10021. 'regdate' => date('Y-m-d', strtotime($request['regdate'])),
  10022. 'phone' => $request['phone'],
  10023. 'status' => 0,
  10024. 'comp_name' => $request['comp_name'],
  10025. 'comp_id' => $request['comp_id'],
  10026. ];
  10027. $builder = $db->table('ADM_LIST');
  10028. if ($builder->insert($mngData)) {
  10029. return $this->respond(['message' => '관리자 등록 성공'], 201);
  10030. } else {
  10031. return $this->respond(['error' => '등록 실패'], 500);
  10032. }
  10033. }
  10034. //아이디 중복체크
  10035. public function mngIDChk(){
  10036. $db = \Config\Database::connect();
  10037. $request = $this->request->getJSON(true);
  10038. if (!isset($request['id']) || trim($request['id']) === '') {
  10039. return $this->respond([
  10040. 'status' => 'fail',
  10041. 'message' => 'ID가 없습니다.'
  10042. ], 400);
  10043. }
  10044. $id = $request['id'];
  10045. // 영어 소문자와 숫자만 허용 (정규식 체크)
  10046. if (!preg_match('/^[a-z0-9]+$/', $id)) {
  10047. return $this->respond([
  10048. 'status' => 'fail',
  10049. 'message' => 'ID는 영어 소문자와 숫자만 사용할 수 있습니다.'
  10050. ], 400);
  10051. }
  10052. $builder = $db->table('ADM_LIST');
  10053. $exists = $builder->where('id', $id)->countAllResults();
  10054. if ($exists > 0) {
  10055. return $this->respond([
  10056. 'status' => 'fail',
  10057. 'message' => '이미 사용 중인 ID입니다.'
  10058. ], 409);
  10059. }
  10060. return $this->respond([
  10061. 'status' => 'success',
  10062. 'message' => '사용 가능한 ID입니다.'
  10063. ], 200);
  10064. }
  10065. //관리자 수정
  10066. public function mngUpdate(){
  10067. $db = \Config\Database::connect();
  10068. $request = $this->request->getJSON(true);
  10069. if (
  10070. !isset($request['id']) ||
  10071. !isset($request['name']) ||
  10072. !isset($request['phone']) ||
  10073. !isset($request['email']) ||
  10074. !isset($request['regdate']) ||
  10075. !isset($request['status'])
  10076. ) {
  10077. return $this->respond([
  10078. 'status' => 'fail',
  10079. 'message' => '필수 값이 누락됐습니다.(id, name, phone, email, regdate, status)'
  10080. ], 400);
  10081. }
  10082. $id = $request['id'];
  10083. $mngData = [
  10084. 'EMAIL' => $request['email'],
  10085. 'REGDATE' => date('Y-m-d', strtotime($request['regdate'])),
  10086. 'PHONE' => $request['phone'],
  10087. 'STATUS' => $request['status'],
  10088. 'COMP_NAME' => $request['comp_name'],
  10089. 'COMP_ID' => $request['comp_id'],
  10090. ];
  10091. //비밀번호 변경시
  10092. if (!empty($request['password'])) {
  10093. $mngData['PASSWORD'] = password_hash($request['password'], PASSWORD_DEFAULT);
  10094. }
  10095. $updated = $db->table('ADM_LIST')->where('ID', $id)->update($mngData);
  10096. if ($updated) {
  10097. return $this->respond([
  10098. 'status' => 'success',
  10099. 'message' => '관리자 정보가 수정되었습니다.'
  10100. ], 200);
  10101. } else {
  10102. return $this->respond([
  10103. 'status' => 'fail',
  10104. 'message' => '수정에 실패했습니다.'
  10105. ], 500);
  10106. }
  10107. }
  10108. //관리자 상세
  10109. public function mngDetail($id)
  10110. {
  10111. // DB 객체 얻기
  10112. $db = \Config\Database::connect();
  10113. $builder = $db->table('ADM_LIST');
  10114. $mng = $builder->where('id', $id)->get()->getRowArray();
  10115. if($mng){
  10116. // 보안상 패스워드는 반환 X
  10117. unset($mng['password']);
  10118. return $this->respond($mng, 200);
  10119. } else {
  10120. return $this->respond([
  10121. 'status' => 'fail',
  10122. 'message' => '해당 ID의 관리자가 존재하지 않습니다.'
  10123. ], 404);
  10124. }
  10125. }
  10126. //관리자 상태 변경(삭제, 복원)
  10127. public function mngStatusUpdate($id){
  10128. $db = \Config\Database::connect();
  10129. $mng = $db->table('ADM_LIST')->select('STATUS')->where('ID', $id)->get()->getRowArray();
  10130. $currentStatus = (int) $mng['STATUS'];
  10131. if ($currentStatus == -1 ){
  10132. // 복원 시 사용중 상태로 변경
  10133. $nextStatus = 0;
  10134. } else {
  10135. // 삭제 시 삭제 상태로 변경
  10136. $nextStatus = -1;
  10137. }
  10138. $updated = $db->table('ADM_LIST')
  10139. ->where('ID', $id)
  10140. ->update(['STATUS' => $nextStatus, 'REGDATE' => date('Y-m-d') ]);
  10141. if ($updated) {
  10142. return $this->respond(['status' => 'success', 'message' => '상태 변경 완료', 'new_status' => $nextStatus], 200);
  10143. } else {
  10144. return $this->respond(['status' => 'fail', 'message' => '상태 변경 실패']);
  10145. }
  10146. }
  10147. //관리자 삭제
  10148. public function mngDelete($id)
  10149. {
  10150. $db = \Config\Database::connect();
  10151. //관리자 삭제
  10152. $deleted = $db->table('ADM_LIST')->where('ID', $id)->delete();
  10153. if ($deleted) {
  10154. return $this->respond(['status' => 'success', 'message' => '관리자 영구 삭제!'], 200);
  10155. } else {
  10156. return $this->respond(['status' => 'fail', 'message' => '삭제 실패!'], 500);
  10157. }
  10158. }
  10159. }
  10160. </file>
  10161. <file path="backend/app/Controllers/PartnershipController.php">
  10162. <?php
  10163. namespace App\Controllers;
  10164. use App\Controllers\BaseController;
  10165. use App\Models\VendorInfluencerPartnershipModel;
  10166. use App\Models\UserModel;
  10167. use App\Models\VendorModel;
  10168. use CodeIgniter\HTTP\ResponseInterface;
  10169. /**
  10170. * 벤더사-인플루언서 파트너십 관리 컨트롤러 (완전 재설계)
  10171. */
  10172. class PartnershipController extends BaseController
  10173. {
  10174. protected $partnershipModel;
  10175. protected $userModel;
  10176. protected $vendorModel;
  10177. public function __construct()
  10178. {
  10179. $this->partnershipModel = new VendorInfluencerPartnershipModel();
  10180. $this->userModel = new UserModel();
  10181. $this->vendorModel = new VendorModel();
  10182. }
  10183. /**
  10184. * 벤더사의 인플루언서 요청 목록 조회
  10185. * POST /api/vendor-influencer/requests
  10186. */
  10187. public function getInfluencerRequests()
  10188. {
  10189. try {
  10190. $request = $this->request->getJSON();
  10191. $vendorSeq = $request->vendorSeq ?? null;
  10192. $status = $request->status ?? null;
  10193. $keyword = $request->keyword ?? null;
  10194. $page = $request->page ?? 1;
  10195. $size = $request->size ?? 20;
  10196. if (!$vendorSeq) {
  10197. return $this->response->setStatusCode(400)->setJSON([
  10198. 'success' => false,
  10199. 'message' => '벤더사 SEQ가 필요합니다.'
  10200. ]);
  10201. }
  10202. $filters = [];
  10203. if ($status) $filters['status'] = $status;
  10204. if ($keyword) $filters['keyword'] = $keyword;
  10205. // 데이터 조회
  10206. $items = $this->partnershipModel->getInfluencerRequestsForVendor($vendorSeq, $filters);
  10207. // 페이징 처리
  10208. $total = count($items);
  10209. $offset = ($page - 1) * $size;
  10210. $pagedItems = array_slice($items, $offset, $size);
  10211. // 통계 조회
  10212. $stats = $this->partnershipModel->getVendorStats($vendorSeq);
  10213. return $this->response->setJSON([
  10214. 'success' => true,
  10215. 'message' => '요청 목록 조회 성공',
  10216. 'data' => [
  10217. 'items' => $pagedItems,
  10218. 'total' => $total,
  10219. 'page' => $page,
  10220. 'totalPages' => ceil($total / $size),
  10221. 'size' => $size,
  10222. 'stats' => $stats
  10223. ]
  10224. ]);
  10225. } catch (\Exception $e) {
  10226. log_message('error', '인플루언서 요청 목록 조회 오류: ' . $e->getMessage());
  10227. return $this->response->setStatusCode(500)->setJSON([
  10228. 'success' => false,
  10229. 'message' => '요청 목록을 불러오는 중 오류가 발생했습니다.',
  10230. 'error' => ENVIRONMENT === 'development' ? $e->getMessage() : null
  10231. ]);
  10232. }
  10233. }
  10234. /**
  10235. * 파트너십 승인/거부 처리
  10236. * POST /api/vendor-influencer/approve
  10237. */
  10238. public function processInfluencerRequest()
  10239. {
  10240. try {
  10241. $request = $this->request->getJSON();
  10242. $mappingSeq = $request->mappingSeq ?? null;
  10243. $action = $request->action ?? null; // APPROVE or REJECT
  10244. $processedBy = $request->processedBy ?? null;
  10245. $responseMessage = $request->responseMessage ?? '';
  10246. if (!$mappingSeq || !$action) {
  10247. return $this->response->setStatusCode(400)->setJSON([
  10248. 'success' => false,
  10249. 'message' => '필수 파라미터가 누락되었습니다.',
  10250. 'debug' => [
  10251. 'mappingSeq' => $mappingSeq,
  10252. 'action' => $action,
  10253. 'processedBy' => $processedBy,
  10254. 'received_data' => $request
  10255. ]
  10256. ]);
  10257. }
  10258. // processedBy가 없으면 파트너십의 벤더 정보에서 기본값 설정
  10259. if (!$processedBy) {
  10260. $partnership = $this->partnershipModel->find($mappingSeq);
  10261. if ($partnership) {
  10262. $processedBy = $partnership['VENDOR_SEQ']; // 임시로 벤더 SEQ 사용
  10263. }
  10264. }
  10265. if (!in_array($action, ['APPROVE', 'REJECT'])) {
  10266. return $this->response->setStatusCode(400)->setJSON([
  10267. 'success' => false,
  10268. 'message' => '유효하지 않은 액션입니다. (APPROVE 또는 REJECT)'
  10269. ]);
  10270. }
  10271. // 파트너십 존재 확인
  10272. $partnership = $this->partnershipModel->find($mappingSeq);
  10273. if (!$partnership) {
  10274. return $this->response->setStatusCode(404)->setJSON([
  10275. 'success' => false,
  10276. 'message' => '파트너십 요청을 찾을 수 없습니다.'
  10277. ]);
  10278. }
  10279. if ($partnership['STATUS'] !== 'PENDING') {
  10280. return $this->response->setStatusCode(400)->setJSON([
  10281. 'success' => false,
  10282. 'message' => '대기 중인 요청만 처리할 수 있습니다.'
  10283. ]);
  10284. }
  10285. // 처리자 검증
  10286. $processor = $this->userModel->find($processedBy);
  10287. if (!$processor) {
  10288. $processor = $this->vendorModel->find($processedBy);
  10289. }
  10290. if (!$processor) {
  10291. return $this->response->setStatusCode(400)->setJSON([
  10292. 'success' => false,
  10293. 'message' => '처리자 정보를 찾을 수 없습니다.'
  10294. ]);
  10295. }
  10296. // 승인/거부 처리
  10297. $result = false;
  10298. if ($action === 'APPROVE') {
  10299. $result = $this->partnershipModel->approvePartnership($mappingSeq, $processedBy, $responseMessage);
  10300. $message = '파트너십이 승인되었습니다.';
  10301. } else {
  10302. $result = $this->partnershipModel->rejectPartnership($mappingSeq, $processedBy, $responseMessage);
  10303. $message = '파트너십이 거부되었습니다.';
  10304. }
  10305. if (!$result) {
  10306. return $this->response->setStatusCode(500)->setJSON([
  10307. 'success' => false,
  10308. 'message' => '처리 중 오류가 발생했습니다.'
  10309. ]);
  10310. }
  10311. // 처리된 파트너십 정보 조회
  10312. $updatedPartnership = $this->partnershipModel->find($mappingSeq);
  10313. return $this->response->setJSON([
  10314. 'success' => true,
  10315. 'message' => $message,
  10316. 'data' => [
  10317. 'partnership' => $updatedPartnership,
  10318. 'processedBy' => $processor['NAME'] ?? $processor['NICK_NAME'],
  10319. 'processedAt' => date('Y-m-d H:i:s')
  10320. ]
  10321. ]);
  10322. } catch (\Exception $e) {
  10323. log_message('error', '파트너십 처리 오류: ' . $e->getMessage());
  10324. return $this->response->setStatusCode(500)->setJSON([
  10325. 'success' => false,
  10326. 'message' => '처리 중 오류가 발생했습니다.',
  10327. 'error' => ENVIRONMENT === 'development' ? $e->getMessage() : null
  10328. ]);
  10329. }
  10330. }
  10331. /**
  10332. * 파트너십 해지 처리
  10333. */
  10334. public function terminatePartnership()
  10335. {
  10336. try {
  10337. $mappingSeq = $this->request->getVar('mappingSeq');
  10338. $terminatedBy = $this->request->getVar('terminatedBy');
  10339. $responseMessage = $this->request->getVar('responseMessage');
  10340. if (!$mappingSeq || !$terminatedBy) {
  10341. return $this->response->setJSON([
  10342. 'success' => false,
  10343. 'message' => '필수 파라미터가 누락되었습니다.'
  10344. ]);
  10345. }
  10346. // 처리자 정보 확인
  10347. $userModel = new UserModel();
  10348. $vendorModel = new VendorModel();
  10349. $processor = $userModel->find($terminatedBy);
  10350. if (!$processor) {
  10351. $processor = $vendorModel->find($terminatedBy);
  10352. }
  10353. if (!$processor) {
  10354. return $this->response->setJSON([
  10355. 'success' => false,
  10356. 'message' => '처리자 정보를 찾을 수 없습니다.'
  10357. ]);
  10358. }
  10359. $partnershipModel = new VendorInfluencerPartnershipModel();
  10360. // 현재 파트너십 상태 확인
  10361. $partnership = $partnershipModel->find($mappingSeq);
  10362. if (!$partnership) {
  10363. return $this->response->setJSON([
  10364. 'success' => false,
  10365. 'message' => '파트너십 정보를 찾을 수 없습니다.'
  10366. ]);
  10367. }
  10368. // 해지 처리 실행
  10369. $result = $partnershipModel->terminatePartnership($mappingSeq, $terminatedBy, $responseMessage);
  10370. if (!$result['success']) {
  10371. log_message('error', 'Termination failed: ' . json_encode($result));
  10372. return $this->response->setJSON([
  10373. 'success' => false,
  10374. 'message' => '해지 처리 중 오류가 발생했습니다.',
  10375. 'debug' => $result['debug'] ?? null
  10376. ]);
  10377. }
  10378. // 성공 응답
  10379. return $this->response->setJSON([
  10380. 'success' => true,
  10381. 'message' => '파트너십이 해지되었습니다.',
  10382. 'data' => $result['data']
  10383. ]);
  10384. } catch (\Exception $e) {
  10385. log_message('error', '[terminatePartnership] Exception: ' . $e->getMessage());
  10386. return $this->response->setJSON([
  10387. 'success' => false,
  10388. 'message' => '해지 처리 중 오류가 발생했습니다.',
  10389. 'debug' => [
  10390. 'error' => $e->getMessage(),
  10391. 'file' => $e->getFile(),
  10392. 'line' => $e->getLine()
  10393. ]
  10394. ]);
  10395. }
  10396. }
  10397. /**
  10398. * 인플루언서의 벤더사 검색
  10399. * POST /api/vendor-influencer/search-vendors
  10400. */
  10401. public function searchVendorsForInfluencer()
  10402. {
  10403. try {
  10404. $request = $this->request->getJSON();
  10405. $influencerSeq = $request->influencerSeq ?? null;
  10406. $keyword = $request->keyword ?? null;
  10407. $category = $request->category ?? null;
  10408. $page = $request->page ?? 1;
  10409. $size = $request->size ?? 20;
  10410. if (!$influencerSeq) {
  10411. return $this->response->setStatusCode(400)->setJSON([
  10412. 'success' => false,
  10413. 'message' => '인플루언서 SEQ가 필요합니다.'
  10414. ]);
  10415. }
  10416. $filters = [];
  10417. if ($keyword) $filters['keyword'] = $keyword;
  10418. if ($category) $filters['category'] = $category;
  10419. // 벤더사 검색
  10420. $items = $this->partnershipModel->searchVendorsForInfluencer($influencerSeq, $filters);
  10421. // 페이징 처리
  10422. $total = count($items);
  10423. $offset = ($page - 1) * $size;
  10424. $pagedItems = array_slice($items, $offset, $size);
  10425. return $this->response->setJSON([
  10426. 'success' => true,
  10427. 'message' => '벤더사 검색 성공',
  10428. 'data' => [
  10429. 'items' => $pagedItems,
  10430. 'pagination' => [
  10431. 'total' => $total,
  10432. 'page' => $page,
  10433. 'totalPages' => ceil($total / $size),
  10434. 'size' => $size
  10435. ]
  10436. ]
  10437. ]);
  10438. } catch (\Exception $e) {
  10439. log_message('error', '벤더사 검색 오류: ' . $e->getMessage());
  10440. return $this->response->setStatusCode(500)->setJSON([
  10441. 'success' => false,
  10442. 'message' => '검색 중 오류가 발생했습니다.',
  10443. 'error' => ENVIRONMENT === 'development' ? $e->getMessage() : null
  10444. ]);
  10445. }
  10446. }
  10447. /**
  10448. * 파트너십 요청 생성
  10449. * POST /api/vendor-influencer/create-request
  10450. */
  10451. public function createPartnershipRequest()
  10452. {
  10453. try {
  10454. $request = $this->request->getJSON();
  10455. $vendorSeq = $request->vendorSeq ?? null;
  10456. $influencerSeq = $request->influencerSeq ?? null;
  10457. $requestMessage = $request->requestMessage ?? '';
  10458. $commissionRate = $request->commissionRate ?? null;
  10459. $specialConditions = $request->specialConditions ?? '';
  10460. if (!$vendorSeq || !$influencerSeq) {
  10461. return $this->response->setStatusCode(400)->setJSON([
  10462. 'success' => false,
  10463. 'message' => '벤더사 및 인플루언서 정보가 필요합니다.'
  10464. ]);
  10465. }
  10466. // 중복 요청 확인
  10467. $existingPartnership = $this->partnershipModel->getActivePartnership($vendorSeq, $influencerSeq);
  10468. if ($existingPartnership && in_array($existingPartnership['STATUS'], ['PENDING', 'APPROVED'])) {
  10469. return $this->response->setStatusCode(400)->setJSON([
  10470. 'success' => false,
  10471. 'message' => '이미 활성화된 파트너십 요청이 있습니다.'
  10472. ]);
  10473. }
  10474. $partnershipData = [
  10475. 'VENDOR_SEQ' => $vendorSeq,
  10476. 'INFLUENCER_SEQ' => $influencerSeq,
  10477. 'STATUS' => 'PENDING',
  10478. 'REQUEST_TYPE' => 'NEW',
  10479. 'REQUEST_MESSAGE' => $requestMessage,
  10480. 'COMMISSION_RATE' => $commissionRate,
  10481. 'SPECIAL_CONDITIONS' => $specialConditions,
  10482. 'REQUESTED_BY' => $influencerSeq,
  10483. 'IS_ACTIVE' => 'Y'
  10484. ];
  10485. $result = $this->partnershipModel->createPartnershipRequest($partnershipData);
  10486. if (is_array($result) && isset($result['success']) && $result['success'] === false) {
  10487. return $this->response->setStatusCode(500)->setJSON([
  10488. 'success' => false,
  10489. 'message' => '재승인 요청 생성 중 오류가 발생했습니다.',
  10490. 'error' => $result
  10491. ]);
  10492. }
  10493. // 생성된 파트너십 정보 조회
  10494. $partnershipSeq = is_array($result) && isset($result['data']['SEQ']) ? $result['data']['SEQ'] : $result;
  10495. $createdPartnership = $this->partnershipModel->find($partnershipSeq);
  10496. return $this->response->setJSON([
  10497. 'success' => true,
  10498. 'message' => '파트너십 요청이 전송되었습니다.',
  10499. 'data' => [
  10500. 'partnership' => $createdPartnership,
  10501. 'requestedAt' => date('Y-m-d H:i:s')
  10502. ]
  10503. ]);
  10504. } catch (\Exception $e) {
  10505. log_message('error', '파트너십 요청 생성 오류: ' . $e->getMessage());
  10506. return $this->response->setStatusCode(500)->setJSON([
  10507. 'success' => false,
  10508. 'message' => '재승인 요청 생성 중 오류가 발생했습니다.',
  10509. 'error' => $e->getMessage()
  10510. ]);
  10511. }
  10512. }
  10513. /**
  10514. * 재승인 요청 생성
  10515. * POST /api/vendor-influencer/reapply-request
  10516. */
  10517. public function createReapplyRequest()
  10518. {
  10519. try {
  10520. $request = $this->request->getJSON();
  10521. $vendorSeq = $request->vendorSeq ?? null;
  10522. $influencerSeq = $request->influencerSeq ?? null;
  10523. $requestMessage = $request->requestMessage ?? '';
  10524. $requestedBy = $request->requestedBy ?? null;
  10525. if (!$vendorSeq || !$influencerSeq || !$requestedBy) {
  10526. return $this->response->setStatusCode(400)->setJSON([
  10527. 'success' => false,
  10528. 'message' => '필수 파라미터가 누락되었습니다.'
  10529. ]);
  10530. }
  10531. // createReapplyRequest 호출 (새로 추가한 메서드)
  10532. $result = $this->partnershipModel->createReapplyRequest($vendorSeq, $influencerSeq, $requestMessage, $requestedBy);
  10533. // 에러 응답이면 그대로 반환
  10534. if (is_array($result) && isset($result['success']) && $result['success'] === false) {
  10535. return $this->response->setStatusCode(500)->setJSON([
  10536. 'success' => false,
  10537. 'message' => '재승인 요청 생성 중 오류가 발생했습니다.',
  10538. 'error' => $result
  10539. ]);
  10540. }
  10541. // 생성된 파트너십 정보 조회
  10542. $partnershipSeq = is_array($result) && isset($result['data']['SEQ']) ? $result['data']['SEQ'] : $result;
  10543. $createdPartnership = $this->partnershipModel->find($partnershipSeq);
  10544. return $this->response->setJSON([
  10545. 'success' => true,
  10546. 'message' => '재승인 요청이 전송되었습니다.',
  10547. 'data' => [
  10548. 'partnership' => $createdPartnership,
  10549. 'requestedAt' => date('Y-m-d H:i:s')
  10550. ]
  10551. ]);
  10552. } catch (\Exception $e) {
  10553. log_message('error', '재승인 요청 생성 오류: ' . $e->getMessage());
  10554. return $this->response->setStatusCode(500)->setJSON([
  10555. 'success' => false,
  10556. 'message' => '재승인 요청 생성 중 오류가 발생했습니다.',
  10557. 'error' => [
  10558. 'db_error' => [
  10559. 'code' => $e->getCode(),
  10560. 'message' => $e->getMessage()
  10561. ]
  10562. ]
  10563. ]);
  10564. }
  10565. }
  10566. }
  10567. </file>
  10568. <file path="backend/app/Controllers/Roulette.php">
  10569. <?php
  10570. namespace App\Controllers;
  10571. use CodeIgniter\RESTful\ResourceController;
  10572. use App\Libraries\JwtLib\JWT;
  10573. use App\Libraries\JwtLib\Key;
  10574. use App\Models\LoginModel;
  10575. class Roulette extends ResourceController
  10576. {
  10577. public function login()
  10578. {
  10579. // JSON 데이터 받기
  10580. $data = $this->request->getJSON(true);
  10581. $id = $data['id'] ?? null;
  10582. $password = $data['password'] ?? null;
  10583. $logintype = $data['logintype'] ?? null;
  10584. if (!$id || !$password) {
  10585. return $this->fail([
  10586. 'errorCode' => 1000,
  10587. 'message' => '아이디 또는 비밀번호가 누락되었습니다.'
  10588. ], 400);
  10589. }
  10590. $loginModel = new LoginModel();
  10591. $builder = $loginModel->getBuilderFor($logintype); // 모델을 통해 빌더를 가져옴
  10592. $user = $builder->where('ID', $id)->get()->getRowArray();
  10593. if (!$user) {
  10594. return $this->fail([
  10595. 'errorCode' => 1001,
  10596. 'message' => '존재하지 않는 아이디입니다.'
  10597. ], 404);
  10598. }
  10599. // 비밀번호 검증
  10600. if (!password_verify($password, $user['PASSWORD'])) {
  10601. return $this->fail([
  10602. 'errorCode' => 1002,
  10603. 'message' => '비밀번호가 틀렸습니다.'
  10604. ], 401);
  10605. }
  10606. unset($user['PASSWORD']); // 비밀번호 노출 방지
  10607. // JWT 토큰 생성에 필요한 값 로드
  10608. $jwtSecret = env('JWT_SECRET');
  10609. $kid = env('JWT_KID');
  10610. if (empty($jwtSecret) || empty($kid)) {
  10611. return $this->failServerError('환경변수가 누락되었습니다. 관리자에게 문의하세요.');
  10612. }
  10613. if (!class_exists('\App\Libraries\JwtLib\JWT')) {
  10614. return $this->failServerError('JWT 라이브러리를 찾을 수 없습니다.');
  10615. }
  10616. $issuedAt = time();
  10617. $accessExpire = $issuedAt + 60 * 15; // 15분
  10618. //$accessExpire = $issuedAt + 5; // 15분
  10619. $refreshExpire = $issuedAt + 60 * 60 * 24 * 14; // 14일
  10620. //$refreshExpire = $issuedAt + 5; // 14일
  10621. $accessPayload = [
  10622. 'iat' => $issuedAt,
  10623. 'exp' => $accessExpire,
  10624. 'sub' => $user['ID'],
  10625. 'name' => $user['NAME'] ?? '',
  10626. ];
  10627. // 리프레시 토큰 existing check
  10628. $currentRefreshToken = $user['REFRESH_TOKEN'] ?? null;
  10629. $validRefreshToken = null;
  10630. // 토큰이 **없거나** (빈 값, null), 존재하지만 만료된 경우 모두 새로 발급
  10631. $needIssueRefresh = !$currentRefreshToken; // null 또는 빈 문자열 등
  10632. if ($currentRefreshToken) {
  10633. // 기존 리프레시 토큰 유효성 검사
  10634. try {
  10635. $key = new Key($jwtSecret, 'HS256');
  10636. $decoded = JWT::decode($currentRefreshToken, $key);
  10637. if (isset($decoded->exp) && $decoded->exp > time()) {
  10638. // 만료되지 않음, 재사용
  10639. $validRefreshToken = $currentRefreshToken;
  10640. $needIssueRefresh = false;
  10641. } else {
  10642. // 만료됨
  10643. $needIssueRefresh = true;
  10644. }
  10645. } catch (\Throwable $e) {
  10646. // 토큰이 변조됐거나 잘못된 경우에도 새로 발급
  10647. $needIssueRefresh = true;
  10648. }
  10649. }
  10650. if ($needIssueRefresh) {
  10651. // 없거나 만료/무효화 시 새로 발급 및 DB 업데이트
  10652. $refreshPayload = [
  10653. 'iat' => $issuedAt,
  10654. 'exp' => $refreshExpire,
  10655. 'sub' => $user['ID'],
  10656. ];
  10657. try {
  10658. $validRefreshToken = JWT::encode($refreshPayload, $jwtSecret, 'HS256', $kid);
  10659. // ADM_LIST에 리프레시 토큰 값 업데이트 (신규 발급 포함)
  10660. $builder->where('ID', $user['ID'])->update(['REFRESH_TOKEN' => $validRefreshToken]);
  10661. } catch (\Throwable $e) {
  10662. return $this->failServerError('JWT 생성 오류: ' . $e->getMessage());
  10663. }
  10664. }
  10665. try {
  10666. $accessToken = JWT::encode($accessPayload, $jwtSecret, 'HS256', $kid);
  10667. } catch (\Throwable $e) {
  10668. return $this->failServerError('JWT 생성 오류: ' . $e->getMessage());
  10669. }
  10670. return $this->respond([
  10671. 'status' => 'active',
  10672. 'accessToken' => $accessToken,
  10673. 'refreshToken' => $validRefreshToken,
  10674. 'user' => $user,
  10675. ]);
  10676. }
  10677. public function refreshToken()
  10678. {
  10679. $data = $this->request->getJSON(true);
  10680. $refreshToken = $data['refreshToken'] ?? null;
  10681. if (!$refreshToken) {
  10682. return $this->fail('리프레시 토큰이 필요합니다.', 400);
  10683. }
  10684. $jwtSecret = env('JWT_SECRET');
  10685. $kid = env('JWT_KID');
  10686. try {
  10687. $key = new Key($jwtSecret, 'HS256');
  10688. $headers = null;
  10689. $decoded = JWT::decode($refreshToken, $key, $headers);
  10690. if ($decoded->exp < time()) {
  10691. return $this->fail('리프레시 토큰이 만료되었습니다.', 401);
  10692. }
  10693. $userId = $decoded->sub ?? null;
  10694. if (!$userId) {
  10695. return $this->fail('유효하지 않은 토큰입니다.', 401);
  10696. }
  10697. // ADM_LIST에서 해당 유저와 REFRESH_TOKEN 비교
  10698. $db = \Config\Database::connect();
  10699. $builder = $db->table('ADM_LIST');
  10700. $user = $builder->where('ID', $userId)->get()->getRowArray();
  10701. if (!$user) {
  10702. return $this->fail('사용자를 찾을 수 없습니다.', 404);
  10703. }
  10704. unset($user['PASSWORD']);
  10705. // DB에 저장된 리프레시 토큰과 요청 리프레시 토큰이 일치하지 않으면 거절
  10706. if (!isset($user['REFRESH_TOKEN']) || $user['REFRESH_TOKEN'] !== $refreshToken) {
  10707. return $this->fail('리프레시 토큰 불일치 또는 무효한 요청입니다.', 401);
  10708. }
  10709. // 일치하면 액세스 토큰 발급
  10710. $issuedAt = time();
  10711. $expire = $issuedAt + 60 * 15; // 15분
  10712. //$expire = $issuedAt + 5; // 15분
  10713. $accessPayload = [
  10714. 'iat' => $issuedAt,
  10715. 'exp' => $expire,
  10716. 'sub' => $userId,
  10717. 'name' => $user['NAME'] ?? '',
  10718. ];
  10719. $accessToken = JWT::encode($accessPayload, $jwtSecret, 'HS256', $kid);
  10720. return $this->respond([
  10721. 'accessToken' => $accessToken,
  10722. 'user' => $user,
  10723. ]);
  10724. } catch (\Throwable $e) {
  10725. return $this->fail('유효하지 않은 리프레시 토큰입니다.', 401);
  10726. }
  10727. }
  10728. }
  10729. </file>
  10730. <file path="backend/app/Controllers/VendorControllerV2.php">
  10731. <?php
  10732. namespace App\Controllers;
  10733. use CodeIgniter\RESTful\ResourceController;
  10734. use App\Models\VendorInfluencerMappingModel;
  10735. use App\Models\VendorInfluencerStatusHistoryModel;
  10736. use App\Models\VendorModel;
  10737. use App\Models\UserModel;
  10738. class VendorControllerV2 extends ResourceController
  10739. {
  10740. protected $modelName = 'App\Models\VendorInfluencerMappingModel';
  10741. protected $format = 'json';
  10742. protected $vendorInfluencerModel;
  10743. protected $statusHistoryModel;
  10744. protected $vendorModel;
  10745. protected $userModel;
  10746. public function __construct()
  10747. {
  10748. $this->vendorInfluencerModel = new VendorInfluencerMappingModel();
  10749. $this->statusHistoryModel = new VendorInfluencerStatusHistoryModel();
  10750. $this->vendorModel = new VendorModel();
  10751. $this->userModel = new UserModel();
  10752. }
  10753. /**
  10754. * 벤더사의 인플루언서 요청 목록 조회 (히스토리 테이블 기반)
  10755. */
  10756. public function getInfluencerRequests()
  10757. {
  10758. try {
  10759. $request = $this->request->getJSON();
  10760. $vendorSeq = $request->vendorSeq ?? null;
  10761. $status = $request->status ?? null;
  10762. $page = $request->page ?? 1;
  10763. $size = $request->size ?? 20;
  10764. log_message('debug', 'getInfluencerRequests 호출: ' . json_encode([
  10765. 'vendorSeq' => $vendorSeq,
  10766. 'status' => $status,
  10767. 'page' => $page,
  10768. 'size' => $size
  10769. ]));
  10770. if (!$vendorSeq) {
  10771. return $this->response->setStatusCode(400)->setJSON([
  10772. 'success' => false,
  10773. 'message' => '벤더사 SEQ는 필수입니다.'
  10774. ]);
  10775. }
  10776. $result = $this->vendorInfluencerModel->getInfluencerRequestsByVendor($vendorSeq, $page, $size, $status);
  10777. // 통계 계산
  10778. $stats = $this->statusHistoryModel->getStatusStatsByVendor($vendorSeq);
  10779. $statsFormatted = [
  10780. 'pending' => 0,
  10781. 'approved' => 0,
  10782. 'rejected' => 0,
  10783. 'total' => 0
  10784. ];
  10785. foreach ($stats as $stat) {
  10786. $statsFormatted['total'] += $stat['count'];
  10787. switch ($stat['STATUS']) {
  10788. case 'PENDING':
  10789. $statsFormatted['pending'] = $stat['count'];
  10790. break;
  10791. case 'APPROVED':
  10792. $statsFormatted['approved'] = $stat['count'];
  10793. break;
  10794. case 'REJECTED':
  10795. $statsFormatted['rejected'] = $stat['count'];
  10796. break;
  10797. }
  10798. }
  10799. log_message('debug', 'API 응답 데이터: ' . json_encode([
  10800. 'items_count' => count($result['data']),
  10801. 'pagination' => $result['pagination'],
  10802. 'stats' => $statsFormatted
  10803. ]));
  10804. // 프론트엔드에서 기대하는 응답 구조에 맞춤
  10805. return $this->response->setJSON([
  10806. 'success' => true,
  10807. 'data' => [
  10808. 'items' => $result['data'], // 프론트엔드에서 data.items로 접근
  10809. 'total' => $result['pagination']['total'],
  10810. 'page' => $result['pagination']['currentPage'],
  10811. 'totalPages' => $result['pagination']['totalPages'],
  10812. 'size' => $result['pagination']['limit'],
  10813. 'stats' => $statsFormatted
  10814. ]
  10815. ]);
  10816. } catch (\Exception $e) {
  10817. log_message('error', '인플루언서 요청 목록 조회 오류: ' . $e->getMessage());
  10818. log_message('error', '스택 트레이스: ' . $e->getTraceAsString());
  10819. return $this->response->setStatusCode(500)->setJSON([
  10820. 'success' => false,
  10821. 'message' => '요청 목록 조회 중 오류가 발생했습니다.',
  10822. 'error' => $e->getMessage()
  10823. ]);
  10824. }
  10825. }
  10826. /**
  10827. * 인플루언서 요청 승인/거절 처리 (히스토리 테이블 기반)
  10828. */
  10829. public function processInfluencerRequest()
  10830. {
  10831. try {
  10832. $request = $this->request->getJSON();
  10833. $mappingSeq = $request->mappingSeq ?? null;
  10834. $action = $request->action ?? null; // 'approve' or 'reject'
  10835. $processedBy = $request->processedBy ?? null;
  10836. $responseMessage = $request->responseMessage ?? '';
  10837. log_message('debug', '승인 처리 요청: ' . json_encode([
  10838. 'mappingSeq' => $mappingSeq,
  10839. 'action' => $action,
  10840. 'processedBy' => $processedBy,
  10841. 'responseMessage' => $responseMessage
  10842. ]));
  10843. if (!$mappingSeq || !$action || !$processedBy) {
  10844. return $this->response->setStatusCode(400)->setJSON([
  10845. 'success' => false,
  10846. 'message' => '필수 파라미터가 누락되었습니다. (mappingSeq, action, processedBy 필요)'
  10847. ]);
  10848. }
  10849. // action 검증
  10850. if (!in_array($action, ['approve', 'reject'])) {
  10851. return $this->response->setStatusCode(400)->setJSON([
  10852. 'success' => false,
  10853. 'message' => 'action은 approve 또는 reject만 가능합니다.'
  10854. ]);
  10855. }
  10856. // 매핑 정보와 현재 상태 확인
  10857. $mapping = $this->vendorInfluencerModel->getWithCurrentStatus($mappingSeq);
  10858. if (!$mapping) {
  10859. return $this->response->setStatusCode(404)->setJSON([
  10860. 'success' => false,
  10861. 'message' => '요청을 찾을 수 없습니다.'
  10862. ]);
  10863. }
  10864. // 현재 상태가 PENDING인지 확인
  10865. if ($mapping['CURRENT_STATUS'] !== 'PENDING') {
  10866. return $this->response->setStatusCode(400)->setJSON([
  10867. 'success' => false,
  10868. 'message' => '이미 처리된 요청입니다. 현재 상태: ' . $mapping['CURRENT_STATUS']
  10869. ]);
  10870. }
  10871. // 처리자 확인
  10872. $processingUser = $this->validateProcessor($processedBy);
  10873. if (!$processingUser['success']) {
  10874. return $this->response->setStatusCode(400)->setJSON($processingUser);
  10875. }
  10876. // 상태 변경
  10877. $newStatus = ($action === 'approve') ? 'APPROVED' : 'REJECTED';
  10878. $statusMessage = $responseMessage ?: ($action === 'approve' ? '승인 처리됨' : '거부 처리됨');
  10879. log_message('debug', "상태 변경: {$mapping['CURRENT_STATUS']} → {$newStatus}");
  10880. // 히스토리 테이블에 상태 변경 기록
  10881. $this->statusHistoryModel->changeStatus($mappingSeq, $newStatus, $statusMessage, $processedBy);
  10882. // 메인 테이블 업데이트 (응답 관련 정보)
  10883. $this->vendorInfluencerModel->update($mappingSeq, [
  10884. 'RESPONSE_MESSAGE' => $responseMessage,
  10885. 'RESPONSE_DATE' => date('Y-m-d H:i:s'),
  10886. 'APPROVED_BY' => $processedBy
  10887. ]);
  10888. // 승인인 경우 파트너십 시작일 설정
  10889. if ($action === 'approve') {
  10890. $this->vendorInfluencerModel->update($mappingSeq, [
  10891. 'PARTNERSHIP_START_DATE' => date('Y-m-d H:i:s')
  10892. ]);
  10893. }
  10894. log_message('debug', "승인 처리 완료: action={$action}, newStatus={$newStatus}");
  10895. return $this->response->setJSON([
  10896. 'success' => true,
  10897. 'message' => $action === 'approve' ? '요청이 승인되었습니다.' : '요청이 거부되었습니다.',
  10898. 'data' => [
  10899. 'mappingSeq' => $mappingSeq,
  10900. 'action' => $action,
  10901. 'status' => $newStatus,
  10902. 'processedBy' => $processingUser['data']['name'],
  10903. 'responseMessage' => $responseMessage
  10904. ]
  10905. ]);
  10906. } catch (\Exception $e) {
  10907. log_message('error', '승인 처리 중 예외 발생: ' . $e->getMessage());
  10908. log_message('error', '승인 처리 스택 트레이스: ' . $e->getTraceAsString());
  10909. return $this->response->setStatusCode(500)->setJSON([
  10910. 'success' => false,
  10911. 'message' => '요청 처리 중 오류가 발생했습니다.',
  10912. 'error' => $e->getMessage()
  10913. ]);
  10914. }
  10915. }
  10916. /**
  10917. * 처리자 검증 (벤더사 또는 사용자)
  10918. */
  10919. private function validateProcessor($processedBy)
  10920. {
  10921. // 1. 먼저 USER_LIST에서 확인 (인플루언서)
  10922. $user = $this->userModel
  10923. ->where('SEQ', $processedBy)
  10924. ->where('IS_ACT', 'Y')
  10925. ->first();
  10926. if ($user) {
  10927. return [
  10928. 'success' => true,
  10929. 'data' => [
  10930. 'type' => 'user',
  10931. 'seq' => $user['SEQ'],
  10932. 'name' => $user['NICK_NAME'] ?: $user['NAME']
  10933. ]
  10934. ];
  10935. }
  10936. // 2. VENDOR_LIST에서 확인 (벤더사)
  10937. $vendor = $this->vendorModel
  10938. ->where('SEQ', $processedBy)
  10939. ->where('IS_ACT', 'Y')
  10940. ->first();
  10941. if ($vendor) {
  10942. return [
  10943. 'success' => true,
  10944. 'data' => [
  10945. 'type' => 'vendor',
  10946. 'seq' => $vendor['SEQ'],
  10947. 'name' => $vendor['COMPANY_NAME'] . ' (벤더사)'
  10948. ]
  10949. ];
  10950. }
  10951. return [
  10952. 'success' => false,
  10953. 'message' => "처리자 SEQ {$processedBy}는 USER_LIST나 VENDOR_LIST에서 찾을 수 없습니다."
  10954. ];
  10955. }
  10956. /**
  10957. * 파트너십 해지 (히스토리 테이블 기반)
  10958. */
  10959. public function terminatePartnership()
  10960. {
  10961. try {
  10962. $request = $this->request->getJSON();
  10963. $mappingSeq = $request->mappingSeq ?? null;
  10964. $terminatedBy = $request->terminatedBy ?? null;
  10965. $terminationReason = $request->terminationReason ?? '';
  10966. if (!$mappingSeq || !$terminatedBy) {
  10967. return $this->response->setStatusCode(400)->setJSON([
  10968. 'success' => false,
  10969. 'message' => '필수 파라미터가 누락되었습니다.'
  10970. ]);
  10971. }
  10972. // 매핑 정보와 현재 상태 확인
  10973. $mapping = $this->vendorInfluencerModel->getWithCurrentStatus($mappingSeq);
  10974. if (!$mapping) {
  10975. return $this->response->setStatusCode(404)->setJSON([
  10976. 'success' => false,
  10977. 'message' => '파트너십을 찾을 수 없습니다.'
  10978. ]);
  10979. }
  10980. // 현재 상태가 APPROVED인지 확인
  10981. if ($mapping['CURRENT_STATUS'] !== 'APPROVED') {
  10982. return $this->response->setStatusCode(400)->setJSON([
  10983. 'success' => false,
  10984. 'message' => '승인된 파트너십만 해지할 수 있습니다. 현재 상태: ' . $mapping['CURRENT_STATUS']
  10985. ]);
  10986. }
  10987. // 처리자 확인
  10988. $processingUser = $this->validateProcessor($terminatedBy);
  10989. if (!$processingUser['success']) {
  10990. return $this->response->setStatusCode(400)->setJSON($processingUser);
  10991. }
  10992. // 상태를 TERMINATED로 변경
  10993. $statusMessage = '파트너십 해지: ' . $terminationReason;
  10994. $this->statusHistoryModel->changeStatus($mappingSeq, 'TERMINATED', $statusMessage, $terminatedBy);
  10995. // 해지 날짜 업데이트
  10996. $this->vendorInfluencerModel->update($mappingSeq, [
  10997. 'PARTNERSHIP_END_DATE' => date('Y-m-d H:i:s')
  10998. ]);
  10999. return $this->response->setJSON([
  11000. 'success' => true,
  11001. 'message' => '파트너십이 해지되었습니다.',
  11002. 'data' => [
  11003. 'mappingSeq' => $mappingSeq,
  11004. 'status' => 'TERMINATED',
  11005. 'terminatedBy' => $processingUser['data']['name']
  11006. ]
  11007. ]);
  11008. } catch (\Exception $e) {
  11009. log_message('error', '파트너십 해지 오류: ' . $e->getMessage());
  11010. return $this->response->setStatusCode(500)->setJSON([
  11011. 'success' => false,
  11012. 'message' => '파트너십 해지 중 오류가 발생했습니다.',
  11013. 'error' => $e->getMessage()
  11014. ]);
  11015. }
  11016. }
  11017. /**
  11018. * 벤더사 상태 통계 조회
  11019. */
  11020. public function getStatusStats()
  11021. {
  11022. try {
  11023. $request = $this->request->getJSON();
  11024. $vendorSeq = $request->vendorSeq ?? null;
  11025. if (!$vendorSeq) {
  11026. return $this->response->setStatusCode(400)->setJSON([
  11027. 'success' => false,
  11028. 'message' => '벤더사 SEQ는 필수입니다.'
  11029. ]);
  11030. }
  11031. $stats = $this->statusHistoryModel->getStatusStatsByVendor($vendorSeq);
  11032. return $this->response->setJSON([
  11033. 'success' => true,
  11034. 'data' => $stats
  11035. ]);
  11036. } catch (\Exception $e) {
  11037. log_message('error', '상태 통계 조회 오류: ' . $e->getMessage());
  11038. return $this->response->setStatusCode(500)->setJSON([
  11039. 'success' => false,
  11040. 'message' => '상태 통계 조회 중 오류가 발생했습니다.',
  11041. 'error' => $e->getMessage()
  11042. ]);
  11043. }
  11044. }
  11045. }
  11046. </file>
  11047. <file path="backend/app/Controllers/VendorInfluencerTerminate.php">
  11048. <?php
  11049. namespace App\Controllers;
  11050. use App\Controllers\BaseController;
  11051. use App\Models\VendorInfluencerMappingModel;
  11052. use App\Models\UserModel;
  11053. use CodeIgniter\HTTP\ResponseInterface;
  11054. /**
  11055. * 벤더-인플루언서 파트너십 해지 API 예제
  11056. * 경로: POST /api/vendor-influencer/terminate
  11057. */
  11058. class VendorInfluencerTerminate extends BaseController
  11059. {
  11060. protected $vendorInfluencerModel;
  11061. protected $userModel;
  11062. public function __construct()
  11063. {
  11064. $this->vendorInfluencerModel = new VendorInfluencerMappingModel();
  11065. $this->userModel = new UserModel();
  11066. }
  11067. /**
  11068. * 승인된 파트너십 해지 처리
  11069. */
  11070. public function terminate()
  11071. {
  11072. try {
  11073. $request = $this->request->getJSON();
  11074. $mappingSeq = $request->mappingSeq ?? null;
  11075. $terminateReason = $request->terminateReason ?? null;
  11076. $terminatedBy = $request->terminatedBy ?? null;
  11077. // 필수 파라미터 검증
  11078. if (!$mappingSeq || !$terminateReason || !$terminatedBy) {
  11079. return $this->response->setStatusCode(400)->setJSON([
  11080. 'success' => false,
  11081. 'message' => '필수 파라미터가 누락되었습니다. (mappingSeq, terminateReason, terminatedBy 필요)'
  11082. ]);
  11083. }
  11084. // 해지 사유 길이 검증
  11085. if (strlen($terminateReason) > 500) {
  11086. return $this->response->setStatusCode(400)->setJSON([
  11087. 'success' => false,
  11088. 'message' => '해지 사유는 500자를 초과할 수 없습니다.'
  11089. ]);
  11090. }
  11091. // 기존 매핑 확인 (승인된 상태여야 함)
  11092. $existingMapping = $this->vendorInfluencerModel
  11093. ->where('SEQ', $mappingSeq)
  11094. ->where('STATUS', 'APPROVED')
  11095. ->where('IS_ACT', 'Y')
  11096. ->first();
  11097. if (!$existingMapping) {
  11098. return $this->response->setStatusCode(404)->setJSON([
  11099. 'success' => false,
  11100. 'message' => '해지할 수 있는 승인된 파트너십을 찾을 수 없습니다.'
  11101. ]);
  11102. }
  11103. // 해지 권한 확인 (벤더사 또는 관련 사용자만 해지 가능)
  11104. $terminatingUser = $this->userModel
  11105. ->where('SEQ', $terminatedBy)
  11106. ->where('IS_ACT', 'Y')
  11107. ->first();
  11108. if (!$terminatingUser) {
  11109. return $this->response->setStatusCode(400)->setJSON([
  11110. 'success' => false,
  11111. 'message' => '해지 처리자 정보를 찾을 수 없습니다.'
  11112. ]);
  11113. }
  11114. // 해지 처리 데이터 준비
  11115. $terminateData = [
  11116. 'STATUS' => 'TERMINATED',
  11117. 'RESPONSE_MESSAGE' => '파트너십 해지: ' . $terminateReason,
  11118. 'RESPONSE_DATE' => date('Y-m-d H:i:s'),
  11119. 'APPROVED_BY' => $terminatedBy, // 해지 처리자
  11120. 'PARTNERSHIP_END_DATE' => date('Y-m-d H:i:s'), // 파트너십 종료일
  11121. 'MOD_DATE' => date('Y-m-d H:i:s')
  11122. ];
  11123. log_message('info', "파트너십 해지 처리 시작 - 매핑 SEQ: {$mappingSeq}, 해지자: {$terminatedBy}");
  11124. // 해지 처리 실행
  11125. $result = $this->vendorInfluencerModel->update($mappingSeq, $terminateData);
  11126. if (!$result) {
  11127. log_message('error', "파트너십 해지 업데이트 실패 - 매핑 SEQ: {$mappingSeq}");
  11128. return $this->response->setStatusCode(500)->setJSON([
  11129. 'success' => false,
  11130. 'message' => '파트너십 해지 처리 중 데이터베이스 오류가 발생했습니다.'
  11131. ]);
  11132. }
  11133. // 해지된 매핑 정보 조회
  11134. $terminatedMapping = $this->vendorInfluencerModel
  11135. ->select('vim.SEQ, vim.VENDOR_SEQ, vim.INFLUENCER_SEQ, vim.STATUS,
  11136. vim.RESPONSE_MESSAGE, vim.RESPONSE_DATE, vim.PARTNERSHIP_END_DATE,
  11137. v.COMPANY_NAME as vendorName,
  11138. inf.NICK_NAME as influencerNickname, inf.NAME as influencerName')
  11139. ->from('VENDOR_INFLUENCER_MAPPING vim')
  11140. ->join('VENDOR_LIST v', 'vim.VENDOR_SEQ = v.SEQ', 'left')
  11141. ->join('USER_LIST inf', 'vim.INFLUENCER_SEQ = inf.SEQ', 'left')
  11142. ->where('vim.SEQ', $mappingSeq)
  11143. ->get()
  11144. ->getRowArray();
  11145. log_message('info', "파트너십 해지 완료 - 매핑 SEQ: {$mappingSeq}");
  11146. return $this->response->setJSON([
  11147. 'success' => true,
  11148. 'message' => '파트너십이 성공적으로 해지되었습니다.',
  11149. 'data' => [
  11150. 'terminatedMapping' => $terminatedMapping,
  11151. 'terminateDate' => date('Y-m-d H:i:s'),
  11152. 'terminatedBy' => $terminatingUser['NICK_NAME'] ?? $terminatingUser['NAME']
  11153. ]
  11154. ]);
  11155. } catch (\Exception $e) {
  11156. log_message('error', "파트너십 해지 처리 중 예외 발생: " . $e->getMessage());
  11157. return $this->response->setStatusCode(500)->setJSON([
  11158. 'success' => false,
  11159. 'message' => '파트너십 해지 처리 중 오류가 발생했습니다.',
  11160. 'error' => ENVIRONMENT === 'development' ? $e->getMessage() : null
  11161. ]);
  11162. }
  11163. }
  11164. }
  11165. /**
  11166. * 라우터 설정 예제 (routes.php에 추가)
  11167. *
  11168. * $routes->group('api/vendor-influencer', ['namespace' => 'App\Controllers'], function($routes) {
  11169. * $routes->post('terminate', 'VendorInfluencerController::terminate');
  11170. * });
  11171. */
  11172. /**
  11173. * 프론트엔드에서 호출 예제
  11174. *
  11175. * const params = {
  11176. * mappingSeq: 123,
  11177. * terminateReason: "계약 조건 위반으로 인한 해지",
  11178. * terminatedBy: 8 // 해지 처리자 USER SEQ
  11179. * };
  11180. *
  11181. * useAxios()
  11182. * .post('/api/vendor-influencer/terminate', params)
  11183. * .then((res) => {
  11184. * if (res.data.success) {
  11185. * console.log('해지 완료:', res.data.data);
  11186. * // 성공 처리
  11187. * } else {
  11188. * console.error('해지 실패:', res.data.message);
  11189. * // 실패 처리
  11190. * }
  11191. * })
  11192. * .catch((err) => {
  11193. * console.error('해지 오류:', err);
  11194. * });
  11195. */
  11196. /**
  11197. * 응답 예제
  11198. *
  11199. * 성공시:
  11200. * {
  11201. * "success": true,
  11202. * "message": "파트너십이 성공적으로 해지되었습니다.",
  11203. * "data": {
  11204. * "terminatedMapping": {
  11205. * "SEQ": 123,
  11206. * "VENDOR_SEQ": 8,
  11207. * "INFLUENCER_SEQ": 23,
  11208. * "STATUS": "TERMINATED",
  11209. * "RESPONSE_MESSAGE": "파트너십 해지: 계약 조건 위반으로 인한 해지",
  11210. * "RESPONSE_DATE": "2025-07-23 10:30:00",
  11211. * "PARTNERSHIP_END_DATE": "2025-07-23 10:30:00",
  11212. * "vendorName": "테스트 벤더사",
  11213. * "influencerNickname": "인플루언서닉네임",
  11214. * "influencerName": "인플루언서이름"
  11215. * },
  11216. * "terminateDate": "2025-07-23 10:30:00",
  11217. * "terminatedBy": "벤더관리자"
  11218. * }
  11219. * }
  11220. *
  11221. * 실패시:
  11222. * {
  11223. * "success": false,
  11224. * "message": "해지할 수 있는 승인된 파트너십을 찾을 수 없습니다."
  11225. * }
  11226. */
  11227. </file>
  11228. <file path="backend/app/Controllers/Winner.php">
  11229. <?php
  11230. namespace App\Controllers;
  11231. use CodeIgniter\RESTful\ResourceController;
  11232. class Winner extends ResourceController
  11233. {
  11234. //당첨자 리스트
  11235. public function winnerlist()
  11236. {
  11237. $db = \Config\Database::connect();
  11238. // POST JSON 파라미터 받기
  11239. $request = $this->request->getJSON(true);
  11240. if (!isset($request['compId'])) {
  11241. return $this->respond([
  11242. 'status' => 'fail',
  11243. 'message' => 'filter(compId)가 누락되었습니다.'
  11244. ], 400);
  11245. }
  11246. $status = isset($request['status']) ? $request['status'] : null;
  11247. $compId = $request['compId'];
  11248. // 쿼리 빌더
  11249. $builder = $db->table('EVT_LIST');
  11250. // compId가 '0-000000'이 아닐 때만 COMP_ID 조건 추가
  11251. if ($compId !== '0-000000') {
  11252. $builder->where('COMP_ID', $compId);
  11253. }
  11254. if ($status !== null) {
  11255. // status가 넘어오면 해당 값만 검색
  11256. $builder->where('status', $status);
  11257. }
  11258. $lists = $builder->get()->getResultArray();
  11259. foreach ($lists as &$row) {
  11260. if (isset($row['STARTDATE']) && !empty($row['STARTDATE'])) {
  11261. $row['STARTDATE'] = date('Y-m-d', strtotime($row['STARTDATE']));
  11262. }
  11263. if (isset($row['ENDDATE']) && !empty($row['ENDDATE'])) {
  11264. $row['ENDDATE'] = date('Y-m-d', strtotime($row['ENDDATE']));
  11265. }
  11266. }
  11267. // 반환 데이터 가공 (필요시)
  11268. $filtered = array_reverse($lists);
  11269. return $this->respond($filtered, 200);
  11270. }
  11271. //이벤트 마감 체크
  11272. public function winnerChk()
  11273. {
  11274. $db = \Config\Database::connect();
  11275. $seq = null;
  11276. $requestJson = $this->request->getJSON(true);
  11277. if (is_array($requestJson) && isset($requestJson['seq'])) {
  11278. $seq = $requestJson['seq'];
  11279. }
  11280. if (empty($seq)) {
  11281. return $this->respond(['status' => 'fail', 'message' => '필수 파라미터 누락'], 400);
  11282. }
  11283. // EVT_ITEM에서 해당 seq 로 아이템과 WIN_QTY 조회
  11284. $items = $db->table('EVT_ITEM')
  11285. ->select('ITEM_SEQ, WIN_QTY')
  11286. ->where('EVT_SEQ', $seq)
  11287. ->get()->getResultArray();
  11288. // 아이템별 최대 당첨자수 배열 구성
  11289. $maxWinners = [];
  11290. foreach ($items as $idx => $item) {
  11291. $rank = $idx + 1; // 1등부터 시작
  11292. $maxWinners[$rank] = (int)$item['WIN_QTY'];
  11293. }
  11294. // PARTICIPATION_LIST에서 seq로 당첨자 집계 (RANK별 COUNT)
  11295. $counts = [];
  11296. $results = $db->table('PARTICIPATION_LIST')
  11297. ->select('RANK, COUNT(*) as cnt')
  11298. ->where('EVT_SEQ', $seq)
  11299. ->groupBy('RANK')
  11300. ->get()->getResultArray();
  11301. foreach ($results as $row) {
  11302. $counts[(int)$row['RANK']] = (int)$row['cnt'];
  11303. }
  11304. // 모든 RANK의 당첨자수가 max와 같거나 크면 "마감"
  11305. $isClosed = true;
  11306. foreach ($maxWinners as $rank => $qty) {
  11307. $curr = isset($counts[$rank]) ? $counts[$rank] : 0;
  11308. if ($curr < $qty) {
  11309. $isClosed = false;
  11310. break;
  11311. }
  11312. }
  11313. if ($isClosed) {
  11314. return $this->respond(['status' => 'closed', 'message' => '마감되었습니다'], 200);
  11315. } else {
  11316. return $this->respond(['status' => 'open', 'message' => '아직 마감 아님'], 200);
  11317. }
  11318. }
  11319. //당첨자 등록 및 랭크 반환
  11320. public function winnerReg()
  11321. {
  11322. $db = \Config\Database::connect();
  11323. // 파라미터 추출
  11324. $seq = null;
  11325. $name = null;
  11326. $phone = null;
  11327. $request = $this->request->getJSON(true);
  11328. if (is_array($request) && isset($request['seq'])) {
  11329. $seq = $request['seq'];
  11330. $name = $request['name'];
  11331. $phone = $request['phone'];
  11332. } else {
  11333. $seq = $this->request->getPost('seq');
  11334. $name = $this->request->getPost('name');
  11335. $phone = $this->request->getPost('phone');
  11336. }
  11337. // 등수별 설정 및 ITEM_NAME 매핑
  11338. $rankConfigs = [];
  11339. $itemNames = [];
  11340. if (!empty($seq)) {
  11341. $builder = $db->table('EVT_ITEM');
  11342. $builder->select('WIN_RATE, WIN_QTY, ITEM_NAME');
  11343. $builder->where('EVT_SEQ', $seq);
  11344. $builder->orderBy('ITEM_SEQ', 'ASC');
  11345. $rows = $builder->get()->getResultArray();
  11346. foreach ($rows as $i => $row) {
  11347. $rank = $i + 1; // 1등부터 시작
  11348. $rankConfigs[$rank] = [
  11349. 'percent' => (int)$row['WIN_RATE'],
  11350. 'max' => (int)$row['WIN_QTY']
  11351. ];
  11352. $itemNames[$rank] = $row['ITEM_NAME'];
  11353. }
  11354. }
  11355. // 등수별 참여자 집계
  11356. $builder = $db->table('PARTICIPATION_LIST')
  11357. ->select('RANK, COUNT(*) AS cnt')
  11358. ->where('EVT_SEQ', $seq)
  11359. ->groupBy('RANK');
  11360. $result = $builder->get()->getResultArray();
  11361. $winnerCounts = [];
  11362. foreach ($result as $row) {
  11363. $winnerCounts[(int)$row['RANK']] = (int)$row['cnt'];
  11364. }
  11365. // 가능한 등수 구하기
  11366. $availableRanks = [];
  11367. $totalPercent = 0;
  11368. foreach ($rankConfigs as $rank => $cfg) {
  11369. $cnt = isset($winnerCounts[$rank]) ? $winnerCounts[$rank] : 0;
  11370. if ($cnt < $cfg['max']) {
  11371. $availableRanks[] = [
  11372. 'rank' => $rank,
  11373. 'percent' => $cfg['percent']
  11374. ];
  11375. $totalPercent += $cfg['percent'];
  11376. }
  11377. }
  11378. // if (empty($availableRanks)) {
  11379. // return $this->respond(['status' => 'fail', 'message' => '모든 등수 당첨자가 마감되었습니다.'], 200);
  11380. // }
  11381. if (empty($availableRanks)) {
  11382. // 등수 마감 상태 => rank 0으로 처리
  11383. $selectedRank = 0;
  11384. $selectedItemName = "꽝";
  11385. $rankIndex = 0;
  11386. } else {
  11387. // 기존 랜덤 등수 추출
  11388. $rand = mt_rand() / mt_getrandmax() * $totalPercent;
  11389. foreach ($availableRanks as $cfg) {
  11390. if ($rand < $cfg['percent']) {
  11391. $selectedRank = $cfg['rank'];
  11392. break;
  11393. }
  11394. $rand -= $cfg['percent'];
  11395. }
  11396. if (!isset($selectedRank)) {
  11397. $selectedRank = $availableRanks[count($availableRanks) - 1]['rank'];
  11398. }
  11399. $selectedItemName = isset($itemNames[$selectedRank]) ? $itemNames[$selectedRank] : null;
  11400. // RANK_INDEX 구하기
  11401. $builder = $db->table('PARTICIPATION_LIST');
  11402. $builder->selectMax('RANK_INDEX');
  11403. $builder->where('EVT_SEQ', $seq);
  11404. $builder->where('RANK', $selectedRank);
  11405. $rankIndexRow = $builder->get()->getRowArray();
  11406. $rankIndex = isset($rankIndexRow['RANK_INDEX']) && $rankIndexRow['RANK_INDEX'] ? ((int)$rankIndexRow['RANK_INDEX']) + 1 : 1;
  11407. }
  11408. // DB 저장
  11409. $insertData = [
  11410. 'EVT_SEQ' => $seq,
  11411. 'RANK' => $selectedRank,
  11412. 'ITEM_NAME' => $selectedItemName,
  11413. 'NAME' => $name,
  11414. 'PHONE' => $phone,
  11415. 'RANK_INDEX' => $rankIndex,
  11416. 'PRIVACY_AGREE' => 1,
  11417. 'THIRDPARTY_AGREE' => 1
  11418. ];
  11419. $db->table('PARTICIPATION_LIST')->insert($insertData);
  11420. // 응답
  11421. return $this->respond([
  11422. 'rank' => $selectedRank,
  11423. 'item_name' => $selectedItemName,
  11424. 'rank_index' => $rankIndex,
  11425. 'name' => $name,
  11426. 'phone' => $phone,
  11427. ], 200);
  11428. }
  11429. //아이템 리스트
  11430. public function itemCount()
  11431. {
  11432. $db = \Config\Database::connect();
  11433. // POST 파라미터 JSON 또는 폼에서 받기 (JSON 우선)
  11434. $seq = null;
  11435. $request = $this->request->getJSON(true);
  11436. if (is_array($request) && isset($request['seq'])) {
  11437. $seq = $request['seq'];
  11438. } else {
  11439. $seq = $this->request->getPost('seq'); // 폼 방식 대비
  11440. }
  11441. if (empty($seq)) {
  11442. return $this->respond(['status' => 'fail', 'message' => 'seq 파라미터가 필요합니다.'], 400);
  11443. }
  11444. $builder = $db->table('EVT_ITEM');
  11445. $builder->select('ITEM_NAME');
  11446. $builder->where('EVT_SEQ', $seq);
  11447. $query = $builder->get();
  11448. $items = [];
  11449. foreach ($query->getResultArray() as $row) {
  11450. $items[] = $row['ITEM_NAME'];
  11451. }
  11452. $count = count($items);
  11453. return $this->respond([
  11454. 'count' => $count,
  11455. 'items' => $items
  11456. ], 200);
  11457. }
  11458. //당첨자 상세
  11459. public function winnerDetail($seq)
  11460. {
  11461. $db = \Config\Database::connect();
  11462. // 이벤트 + 아이템 목록 조인 조회
  11463. $builder = $db->table('EVT_LIST E');
  11464. $builder->join('EVT_ITEM I', 'E.SEQ = I.EVT_SEQ', 'left');
  11465. $builder->join('PARTICIPATION_LIST P', 'E.SEQ = P.EVT_SEQ', 'left');
  11466. $builder->select(
  11467. 'E.SEQ, E.TITLE, E.STARTDATE, E.ENDDATE, E.REGDATE, ' .
  11468. 'I.ITEM_SEQ, I.ITEM_NAME AS ITEM_ITEM_NAME, I.WIN_QTY, I.WIN_RATE,' .
  11469. 'P.PART_SEQ, P.RANK, P.ITEM_NAME AS PART_ITEM_NAME, P.ID, P.NAME, P.PHONE, P.WINNER_DATE, P.RANK_INDEX, P.PRIVACY_AGREE, P.THIRDPARTY_AGREE'
  11470. );
  11471. $builder->where('E.SEQ', $seq);
  11472. $rows = $builder->get()->getResultArray();
  11473. if (empty($rows)) {
  11474. return $this->respond(['status' => 'fail', 'message' => '해당 이벤트가 없습니다.'], 404);
  11475. }
  11476. // 이벤트(게시글) 정보와 아이템 배열로 가공하여 응답
  11477. $event = [
  11478. 'seq' => $rows[0]['SEQ'],
  11479. 'title' => $rows[0]['TITLE'],
  11480. 'startdate' => date('Y-m-d', strtotime( $rows[0]['STARTDATE'])),
  11481. 'enddate' => date('Y-m-d', strtotime( $rows[0]['ENDDATE'])),
  11482. 'regdate' =>date('Y-m-d', strtotime( $rows[0]['REGDATE'])),
  11483. 'items' => [],
  11484. 'participations' => [],
  11485. 'participations_cal' => []
  11486. ];
  11487. // 중복방지용
  11488. $itemSeqSet = [];
  11489. $partSeqSet = [];
  11490. foreach ($rows as $row) {
  11491. // 아이템 중복 체크 및 추가
  11492. if ($row['ITEM_SEQ'] !== null && !isset($itemSeqSet[$row['ITEM_SEQ']])) {
  11493. $event['items'][] = [
  11494. 'item_seq' => $row['ITEM_SEQ'],
  11495. 'name' => $row['ITEM_ITEM_NAME'], // 반드시! EVT_ITEM 테이블의 컬럼명 별칭
  11496. 'qty' => $row['WIN_QTY'],
  11497. 'rate' => $row['WIN_RATE']
  11498. ];
  11499. $itemSeqSet[$row['ITEM_SEQ']] = true;
  11500. }
  11501. // 참여자 중복 체크 및 추가
  11502. if ($row['PART_SEQ'] !== null && !isset($partSeqSet[$row['PART_SEQ']])) {
  11503. $event['participations'][] = [
  11504. 'part_seq' => $row['PART_SEQ'],
  11505. 'rank' => $row['RANK'],
  11506. 'item_name' => $row['PART_ITEM_NAME'],
  11507. 'id' => $row['ID'],
  11508. 'name' => $row['NAME'],
  11509. 'phone' => $row['PHONE'],
  11510. 'winner_date' => $row['WINNER_DATE'] = date('Y-m-d', strtotime($row['WINNER_DATE'])),
  11511. 'rank_index' => $row['RANK_INDEX'],
  11512. 'privacy_agree' => $row['PRIVACY_AGREE'],
  11513. 'thirdparty_agree' => $row['THIRDPARTY_AGREE']
  11514. ];
  11515. $partSeqSet[$row['PART_SEQ']] = true;
  11516. }
  11517. }
  11518. // 중복되는 rank에서 part_seq가 가장 낮은 값만 participations_cal에 담기
  11519. // 유니크 참여자 배열 만들기
  11520. $participations = [];
  11521. foreach ($rows as $row) {
  11522. if (
  11523. !array_key_exists('PART_SEQ', $row) ||
  11524. !array_key_exists('RANK', $row) ||
  11525. $row['PART_SEQ'] === null ||
  11526. $row['RANK'] === null ||
  11527. $row['RANK'] == 0
  11528. ) {
  11529. continue;
  11530. }
  11531. $participations[$row['PART_SEQ']] = $row;
  11532. }
  11533. // 등수별 인원수 카운트
  11534. $rankCounts = [];
  11535. foreach ($participations as $part) {
  11536. $rank = $part['RANK'];
  11537. if (!isset($rankCounts[$rank])) {
  11538. $rankCounts[$rank] = 0;
  11539. }
  11540. $rankCounts[$rank]++;
  11541. }
  11542. // 중복 등수에서 part_seq가 가장 낮은 값만 participations_cal에 담기 (참여자 기준)
  11543. $rankMinPartSeq = [];
  11544. foreach ($participations as $part) {
  11545. $rank = $part['RANK'];
  11546. $partSeq = $part['PART_SEQ'];
  11547. if (!isset($rankMinPartSeq[$rank]) || $partSeq < $rankMinPartSeq[$rank]['part_seq']) {
  11548. $rankMinPartSeq[$rank] = [
  11549. 'part_seq' => $partSeq,
  11550. 'rank' => $part['RANK'],
  11551. 'item_name' => $part['PART_ITEM_NAME'],
  11552. 'id' => $part['ID'],
  11553. 'name' => $part['NAME'],
  11554. 'phone' => $part['PHONE'],
  11555. 'winner_date' => $part['WINNER_DATE'],
  11556. 'rank_index' => $part['RANK_INDEX'],
  11557. 'privacy_agree' => $part['PRIVACY_AGREE'],
  11558. 'thirdparty_agree' => $part['THIRDPARTY_AGREE'],
  11559. 'count' => $rankCounts[$rank]
  11560. ];
  11561. }
  11562. }
  11563. $event['participations_cal'] = array_values($rankMinPartSeq);
  11564. return $this->respond($event, 200);
  11565. }
  11566. //참여자 리스트
  11567. public function getParticipationByItem()
  11568. {
  11569. $db = \Config\Database::connect();
  11570. $request = $this->request->getJSON(true);
  11571. // 파라미터 추출
  11572. $seq = isset($request['seq']) ? $request['seq'] : null;
  11573. $itemName = isset($request['item_name']) ? $request['item_name'] : null;
  11574. if (empty($seq)) {
  11575. return $this->respond(['status' => 'fail', 'message' => 'seq는 필수입니다.'], 400);
  11576. }
  11577. // PARTICIPATION_LIST에서 EVT_SEQ와 ITEM_NAME으로 필터링
  11578. $builder = $db->table('PARTICIPATION_LIST');
  11579. $builder->where('EVT_SEQ', $seq);
  11580. if (!empty($itemName)) {
  11581. $builder->where('ITEM_NAME', $itemName);
  11582. }
  11583. $filterList = $builder->get()->getResultArray();
  11584. // 키를 모두 소문자로 변환
  11585. $filterListLower = [];
  11586. foreach ($filterList as $row) {
  11587. $filterListLower[] = array_change_key_case($row, CASE_LOWER);
  11588. }
  11589. return $this->respond([
  11590. 'status' => 'success',
  11591. 'list' => $filterListLower
  11592. ], 200);
  11593. }
  11594. // 이벤트 참가 여부 체크
  11595. public function matchedUser()
  11596. {
  11597. $data = $this->request->getJSON(true);
  11598. $seq = $data['seq'] ?? null;
  11599. $name = $data['name'] ?? null;
  11600. $phone = $data['phone'] ?? null;
  11601. if (!$seq || !$name || !$phone) {
  11602. return $this->fail('필수 값이 누락되었습니다.', 400);
  11603. }
  11604. $db = \Config\Database::connect();
  11605. $builder = $db->table('PARTICIPATION_LIST');
  11606. $existing = $builder
  11607. ->where('EVT_SEQ', $seq)
  11608. ->where('NAME', $name)
  11609. ->where('PHONE', $phone)
  11610. ->get()
  11611. ->getRowArray();
  11612. if ($existing) {
  11613. // 동일한 사람이 이미 존재할 경우
  11614. return $this->respond([
  11615. 'result' => 'matched'
  11616. ]);
  11617. }
  11618. $phoneSame = $builder
  11619. ->where('EVT_SEQ', $seq)
  11620. ->where('NAME !=', $name)
  11621. ->where('PHONE', $phone)
  11622. ->get()
  11623. ->getRowArray();
  11624. if ($phoneSame) {
  11625. return $this->respond([
  11626. 'result' => 'phonesame'
  11627. ]);
  11628. }
  11629. // 일치하는 정보가 없을 때 (필요에 따라 처리)
  11630. return $this->respond([
  11631. 'result' => 'not_found'
  11632. ]);
  11633. }
  11634. }
  11635. </file>
  11636. <file path="backend/app/Models/InfluencerModel.php">
  11637. <?php
  11638. namespace App\Models;
  11639. use CodeIgniter\Model;
  11640. class InfluencerModel extends Model
  11641. {
  11642. protected $table = 'USER_LIST';
  11643. protected $primaryKey = 'SEQ';
  11644. protected $useAutoIncrement = true;
  11645. protected $returnType = 'array';
  11646. protected $useSoftDeletes = false;
  11647. protected $allowedFields = [
  11648. 'ID',
  11649. 'PASSWORD',
  11650. 'NICK_NAME',
  11651. 'NAME',
  11652. 'EMAIL',
  11653. 'PHONE',
  11654. 'MEMBER_TYPE',
  11655. 'STATUS',
  11656. 'PROFILE_IMAGE',
  11657. 'LAST_LOGIN_DATE',
  11658. 'IS_ACT',
  11659. 'REG_DATE',
  11660. 'MOD_DATE',
  11661. // 인플루언서 전용 필드들
  11662. 'INFLUENCER_TYPE',
  11663. 'PRIMARY_CATEGORY',
  11664. 'SECONDARY_CATEGORY',
  11665. 'FOLLOWER_COUNT',
  11666. 'ENGAGEMENT_RATE',
  11667. 'AVERAGE_VIEWS',
  11668. 'SNS_CHANNELS',
  11669. 'REGION',
  11670. 'DESCRIPTION',
  11671. 'PORTFOLIO_URL',
  11672. 'BANK_NAME',
  11673. 'ACCOUNT_NUMBER',
  11674. 'ACCOUNT_HOLDER',
  11675. 'TAX_INFO',
  11676. 'RATING',
  11677. 'VERIFICATION_STATUS',
  11678. 'PREFERRED_CATEGORIES',
  11679. 'MIN_COMMISSION_RATE',
  11680. 'AVAILABLE_REGIONS'
  11681. ];
  11682. protected $useTimestamps = true;
  11683. protected $createdField = 'REG_DATE';
  11684. protected $updatedField = 'MOD_DATE';
  11685. protected $dateFormat = 'datetime';
  11686. protected $validationRules = [
  11687. 'ID' => 'required|min_length[4]|max_length[50]|is_unique[USER_LIST.ID,SEQ,{SEQ}]',
  11688. 'PASSWORD' => 'required|min_length[8]',
  11689. 'NICK_NAME' => 'required|min_length[2]|max_length[50]',
  11690. 'EMAIL' => 'required|valid_email|is_unique[USER_LIST.EMAIL,SEQ,{SEQ}]',
  11691. 'PHONE' => 'permit_empty|min_length[10]|max_length[15]',
  11692. 'MEMBER_TYPE' => 'required|in_list[INFLUENCER]',
  11693. 'STATUS' => 'required|in_list[ACTIVE,INACTIVE,SUSPENDED,PENDING]',
  11694. 'INFLUENCER_TYPE' => 'permit_empty|in_list[MICRO,MACRO,MEGA,NANO]',
  11695. 'FOLLOWER_COUNT' => 'permit_empty|integer|greater_than_equal_to[0]',
  11696. 'ENGAGEMENT_RATE' => 'permit_empty|decimal|greater_than_equal_to[0]|less_than_equal_to[100]',
  11697. 'IS_ACT' => 'required|in_list[Y,N]'
  11698. ];
  11699. protected $validationMessages = [
  11700. 'ID' => [
  11701. 'required' => '아이디는 필수입니다.',
  11702. 'min_length' => '아이디는 최소 4자 이상이어야 합니다.',
  11703. 'is_unique' => '이미 사용 중인 아이디입니다.'
  11704. ],
  11705. 'EMAIL' => [
  11706. 'required' => '이메일은 필수입니다.',
  11707. 'valid_email' => '올바른 이메일 형식이 아닙니다.',
  11708. 'is_unique' => '이미 사용 중인 이메일입니다.'
  11709. ],
  11710. 'NICK_NAME' => [
  11711. 'required' => '닉네임은 필수입니다.',
  11712. 'min_length' => '닉네임은 최소 2자 이상이어야 합니다.'
  11713. ]
  11714. ];
  11715. protected $beforeInsert = ['hashPassword', 'setInfluencerDefaults'];
  11716. protected $beforeUpdate = ['hashPassword'];
  11717. /**
  11718. * 패스워드 해시화
  11719. */
  11720. protected function hashPassword(array $data)
  11721. {
  11722. if (isset($data['data']['PASSWORD'])) {
  11723. $data['data']['PASSWORD'] = password_hash($data['data']['PASSWORD'], PASSWORD_DEFAULT);
  11724. }
  11725. return $data;
  11726. }
  11727. /**
  11728. * 인플루언서 기본값 설정
  11729. */
  11730. protected function setInfluencerDefaults(array $data)
  11731. {
  11732. if (!isset($data['data']['MEMBER_TYPE'])) {
  11733. $data['data']['MEMBER_TYPE'] = 'INFLUENCER';
  11734. }
  11735. if (!isset($data['data']['STATUS'])) {
  11736. $data['data']['STATUS'] = 'PENDING';
  11737. }
  11738. if (!isset($data['data']['IS_ACT'])) {
  11739. $data['data']['IS_ACT'] = 'Y';
  11740. }
  11741. if (!isset($data['data']['VERIFICATION_STATUS'])) {
  11742. $data['data']['VERIFICATION_STATUS'] = 'PENDING';
  11743. }
  11744. return $data;
  11745. }
  11746. /**
  11747. * 인플루언서 목록 조회 (필터링)
  11748. */
  11749. public function getInfluencers($filters = [])
  11750. {
  11751. $builder = $this->builder();
  11752. $builder->where('MEMBER_TYPE', 'INFLUENCER');
  11753. $builder->where('IS_ACT', 'Y');
  11754. // 상태 필터
  11755. if (isset($filters['status'])) {
  11756. $builder->where('STATUS', $filters['status']);
  11757. }
  11758. // 카테고리 필터
  11759. if (isset($filters['category'])) {
  11760. $builder->where('PRIMARY_CATEGORY', $filters['category']);
  11761. }
  11762. // 지역 필터
  11763. if (isset($filters['region'])) {
  11764. $builder->where('REGION', $filters['region']);
  11765. }
  11766. // 팔로워 수 범위
  11767. if (isset($filters['min_followers'])) {
  11768. $builder->where('FOLLOWER_COUNT >=', $filters['min_followers']);
  11769. }
  11770. if (isset($filters['max_followers'])) {
  11771. $builder->where('FOLLOWER_COUNT <=', $filters['max_followers']);
  11772. }
  11773. // 인플루언서 타입
  11774. if (isset($filters['influencer_type'])) {
  11775. $builder->where('INFLUENCER_TYPE', $filters['influencer_type']);
  11776. }
  11777. // 검증 상태
  11778. if (isset($filters['verification_status'])) {
  11779. $builder->where('VERIFICATION_STATUS', $filters['verification_status']);
  11780. }
  11781. // 키워드 검색
  11782. if (isset($filters['keyword'])) {
  11783. $builder->groupStart()
  11784. ->like('NICK_NAME', $filters['keyword'])
  11785. ->orLike('NAME', $filters['keyword'])
  11786. ->orLike('DESCRIPTION', $filters['keyword'])
  11787. ->groupEnd();
  11788. }
  11789. // 정렬
  11790. $sortBy = $filters['sort_by'] ?? 'REG_DATE';
  11791. $sortOrder = $filters['sort_order'] ?? 'DESC';
  11792. $builder->orderBy($sortBy, $sortOrder);
  11793. return $builder;
  11794. }
  11795. /**
  11796. * 인플루언서 프로필 조회
  11797. */
  11798. public function getProfile($influencerSeq)
  11799. {
  11800. return $this->select('
  11801. SEQ, ID, NICK_NAME, NAME, EMAIL, PHONE, PROFILE_IMAGE,
  11802. INFLUENCER_TYPE, PRIMARY_CATEGORY, SECONDARY_CATEGORY,
  11803. FOLLOWER_COUNT, ENGAGEMENT_RATE, AVERAGE_VIEWS,
  11804. SNS_CHANNELS, REGION, DESCRIPTION, PORTFOLIO_URL,
  11805. RATING, VERIFICATION_STATUS, PREFERRED_CATEGORIES,
  11806. MIN_COMMISSION_RATE, AVAILABLE_REGIONS,
  11807. REG_DATE, MOD_DATE, LAST_LOGIN_DATE
  11808. ')
  11809. ->where('SEQ', $influencerSeq)
  11810. ->where('MEMBER_TYPE', 'INFLUENCER')
  11811. ->where('IS_ACT', 'Y')
  11812. ->first();
  11813. }
  11814. /**
  11815. * 인플루언서 통계 조회
  11816. */
  11817. public function getStats($influencerSeq)
  11818. {
  11819. // 파트너십 통계는 별도 모델에서 처리
  11820. $partnershipModel = new \App\Models\InfluencerPartnershipModel();
  11821. return $partnershipModel->getInfluencerStats($influencerSeq);
  11822. }
  11823. /**
  11824. * 인플루언서 검증 상태 업데이트
  11825. */
  11826. public function updateVerificationStatus($influencerSeq, $status, $reason = '')
  11827. {
  11828. $data = [
  11829. 'VERIFICATION_STATUS' => $status,
  11830. 'MOD_DATE' => date('Y-m-d H:i:s')
  11831. ];
  11832. if (!empty($reason)) {
  11833. $data['VERIFICATION_REASON'] = $reason;
  11834. }
  11835. return $this->update($influencerSeq, $data);
  11836. }
  11837. /**
  11838. * 카테고리별 인플루언서 수 조회
  11839. */
  11840. public function getCountByCategory()
  11841. {
  11842. return $this->select('PRIMARY_CATEGORY, COUNT(*) as count')
  11843. ->where('MEMBER_TYPE', 'INFLUENCER')
  11844. ->where('IS_ACT', 'Y')
  11845. ->where('STATUS', 'ACTIVE')
  11846. ->groupBy('PRIMARY_CATEGORY')
  11847. ->findAll();
  11848. }
  11849. /**
  11850. * 인플루언서 타입별 통계
  11851. */
  11852. public function getCountByType()
  11853. {
  11854. return $this->select('INFLUENCER_TYPE, COUNT(*) as count')
  11855. ->where('MEMBER_TYPE', 'INFLUENCER')
  11856. ->where('IS_ACT', 'Y')
  11857. ->where('STATUS', 'ACTIVE')
  11858. ->groupBy('INFLUENCER_TYPE')
  11859. ->findAll();
  11860. }
  11861. /**
  11862. * 로그인 검증
  11863. */
  11864. public function verifyLogin($id, $password)
  11865. {
  11866. $user = $this->where('ID', $id)
  11867. ->where('MEMBER_TYPE', 'INFLUENCER')
  11868. ->where('IS_ACT', 'Y')
  11869. ->first();
  11870. if ($user && password_verify($password, $user['PASSWORD'])) {
  11871. // 마지막 로그인 시간 업데이트
  11872. $this->update($user['SEQ'], [
  11873. 'LAST_LOGIN_DATE' => date('Y-m-d H:i:s')
  11874. ]);
  11875. unset($user['PASSWORD']); // 패스워드 제거 후 반환
  11876. return $user;
  11877. }
  11878. return false;
  11879. }
  11880. /**
  11881. * 인플루언서 랭킹 조회
  11882. */
  11883. public function getTopInfluencers($limit = 10, $category = null)
  11884. {
  11885. $builder = $this->select('
  11886. SEQ, NICK_NAME, PROFILE_IMAGE, FOLLOWER_COUNT,
  11887. ENGAGEMENT_RATE, RATING, PRIMARY_CATEGORY
  11888. ');
  11889. $builder->where('MEMBER_TYPE', 'INFLUENCER');
  11890. $builder->where('IS_ACT', 'Y');
  11891. $builder->where('STATUS', 'ACTIVE');
  11892. $builder->where('VERIFICATION_STATUS', 'VERIFIED');
  11893. if ($category) {
  11894. $builder->where('PRIMARY_CATEGORY', $category);
  11895. }
  11896. $builder->orderBy('RATING', 'DESC');
  11897. $builder->orderBy('FOLLOWER_COUNT', 'DESC');
  11898. $builder->limit($limit);
  11899. return $builder->get()->getResultArray();
  11900. }
  11901. }
  11902. </file>
  11903. <file path="backend/app/Models/LoginModel.php">
  11904. <?php
  11905. // app/Models/LoginModel.php
  11906. namespace App\Models;
  11907. use Config\Database;
  11908. class LoginModel
  11909. {
  11910. /**
  11911. * 로그인 타입에 맞는 쿼리 빌더를 반환합니다.
  11912. * @param string $loginType ('vendor' or 'influence')
  11913. * @return \CodeIgniter\Database\BaseBuilder
  11914. */
  11915. public function getBuilderFor(string $loginType)
  11916. {
  11917. $db = Database::connect();
  11918. $tableName = '';
  11919. switch ($loginType) {
  11920. case 'vendor':
  11921. $tableName = 'VENDOR_LIST';
  11922. break;
  11923. case 'influence':
  11924. $tableName = 'USER_LIST';
  11925. break;
  11926. default:
  11927. throw new \InvalidArgumentException("Invalid login type provided: " . $loginType);
  11928. }
  11929. return $db->table($tableName);
  11930. }
  11931. }
  11932. </file>
  11933. <file path="backend/app/Models/UserListModel.php">
  11934. <?php
  11935. namespace App\Models;
  11936. use CodeIgniter\Model;
  11937. class UserListModel extends Model
  11938. {
  11939. protected $table = 'USER_LIST';
  11940. protected $primaryKey = 'SEQ'; // PK 컬럼명 맞춰주세요
  11941. // protected $allowedFields = ['user_name', 'email', /* 기타 컬럼들 */];
  11942. }
  11943. </file>
  11944. <file path="backend/app/Models/VendorAddressModel.php">
  11945. <?php
  11946. namespace App\Models;
  11947. use CodeIgniter\Model;
  11948. class VendorAddressModel extends Model
  11949. {
  11950. protected $table = 'vendor_addresses';
  11951. protected $primaryKey = 'id';
  11952. protected $useAutoIncrement = true;
  11953. protected $returnType = 'array';
  11954. protected $useSoftDeletes = false;
  11955. protected $allowedFields = [
  11956. 'vendor_id', 'address_type', 'zip_code', 'address',
  11957. 'detail_address', 'city', 'district', 'is_primary'
  11958. ];
  11959. protected $useTimestamps = true;
  11960. protected $createdField = 'created_at';
  11961. protected $updatedField = 'updated_at';
  11962. protected $validationRules = [
  11963. 'vendor_id' => 'required|integer|is_not_unique[vendors.id]',
  11964. 'address_type' => 'required|in_list[HEAD_OFFICE,BRANCH,WAREHOUSE,BILLING]',
  11965. 'zip_code' => 'permit_empty|max_length[10]',
  11966. 'address' => 'required|max_length[500]',
  11967. 'detail_address' => 'permit_empty|max_length[500]',
  11968. 'city' => 'permit_empty|max_length[100]',
  11969. 'district' => 'permit_empty|max_length[100]',
  11970. 'is_primary' => 'permit_empty|in_list[0,1]'
  11971. ];
  11972. protected $validationMessages = [
  11973. 'vendor_id' => [
  11974. 'required' => '벤더사 id는 필수입니다.',
  11975. 'is_not_unique' => '존재하지 않는 벤더사입니다.'
  11976. ],
  11977. 'address' => [
  11978. 'required' => '주소는 필수입니다.'
  11979. ]
  11980. ];
  11981. // 기본 주소로 설정
  11982. public function setPrimaryAddress($vendorId, $addressId)
  11983. {
  11984. $this->db->transStart();
  11985. // 기존 기본 주소 해제
  11986. $this->where('vendor_id', $vendorId)
  11987. ->set('is_primary', 0)
  11988. ->update();
  11989. // 새로운 기본 주소 설정
  11990. $this->update($addressId, ['is_primary' => 1]);
  11991. $this->db->transComplete();
  11992. return $this->db->transStatus();
  11993. }
  11994. }
  11995. </file>
  11996. <file path="backend/app/Models/VendorBusinessAreaModel.php">
  11997. <?php
  11998. namespace App\Models;
  11999. use CodeIgniter\Model;
  12000. class VendorBusinessAreaModel extends Model
  12001. {
  12002. protected $table = 'vendor_business_areas';
  12003. protected $primaryKey = 'id';
  12004. protected $useAutoIncrement = true;
  12005. protected $returnType = 'array';
  12006. protected $useSoftDeletes = false;
  12007. protected $allowedFields = [
  12008. 'vendor_seq', 'business_area'
  12009. ];
  12010. protected $useTimestamps = true;
  12011. protected $createdField = 'created_at';
  12012. protected $updatedField = null;
  12013. protected $validationRules = [
  12014. 'vendor_seq' => 'required|integer|is_not_unique[vendors.id]',
  12015. 'business_area' => 'required|max_length[100]'
  12016. ];
  12017. protected $validationMessages = [
  12018. 'vendor_seq' => [
  12019. 'required' => '벤더사 id는 필수입니다.',
  12020. 'is_not_unique' => '존재하지 않는 벤더사입니다.'
  12021. ],
  12022. 'business_area' => [
  12023. 'required' => '사업 분야는 필수입니다.'
  12024. ]
  12025. ];
  12026. // 벤더사의 사업 분야 일괄 업데이트
  12027. public function updateBusinessAreas($vendorId, $businessAreas)
  12028. {
  12029. $this->db->transStart();
  12030. // 기존 사업 분야 삭제
  12031. $this->where('vendor_seq', $vendorId)->delete();
  12032. // 새로운 사업 분야 추가
  12033. if (!empty($businessAreas)) {
  12034. $insertData = [];
  12035. foreach ($businessAreas as $area) {
  12036. $insertData[] = [
  12037. 'vendor_seq' => $vendorId,
  12038. 'business_area' => $area
  12039. ];
  12040. }
  12041. $this->insertBatch($insertData);
  12042. }
  12043. $this->db->transComplete();
  12044. return $this->db->transStatus();
  12045. }
  12046. }
  12047. </file>
  12048. <file path="backend/app/Models/VendorCategoryModel.php">
  12049. <?php
  12050. namespace App\Models;
  12051. use CodeIgniter\Model;
  12052. class VendorCategoryModel extends Model
  12053. {
  12054. protected $table = 'vendor_categories';
  12055. protected $primaryKey = 'id';
  12056. protected $useAutoIncrement = true;
  12057. protected $returnType = 'array';
  12058. protected $useSoftDeletes = false;
  12059. protected $allowedFields = [
  12060. 'code', 'name_ko', 'name_en', 'description', 'sort_order', 'is_active'
  12061. ];
  12062. protected $useTimestamps = true;
  12063. protected $createdField = 'created_at';
  12064. protected $updatedField = null;
  12065. protected $validationRules = [
  12066. 'code' => 'required|max_length[50]|is_unique[vendor_categories.code,id,{id}]',
  12067. 'name_ko' => 'required|max_length[100]',
  12068. 'name_en' => 'permit_empty|max_length[100]',
  12069. 'description' => 'permit_empty|max_length[65535]',
  12070. 'sort_order' => 'permit_empty|integer',
  12071. 'is_active' => 'permit_empty|in_list[0,1]'
  12072. ];
  12073. // 활성화된 카테고리만 조회
  12074. public function getActiveCategories()
  12075. {
  12076. return $this->where('is_active', 1)
  12077. ->orderBy('sort_order', 'ASC')
  12078. ->findAll();
  12079. }
  12080. // 코드로 카테고리 조회
  12081. public function getCategoryByCode($code)
  12082. {
  12083. return $this->where('code', $code)->first();
  12084. }
  12085. }
  12086. </file>
  12087. <file path="backend/app/Models/VendorContactModel.php">
  12088. <?php
  12089. namespace App\Models;
  12090. use CodeIgniter\Model;
  12091. class VendorContactModel extends Model
  12092. {
  12093. protected $table = 'vendor_contacts';
  12094. protected $primaryKey = 'id';
  12095. protected $useAutoIncrement = true;
  12096. protected $returnType = 'array';
  12097. protected $useSoftDeletes = false;
  12098. protected $allowedFields = [
  12099. 'vendor_id', 'contact_type', 'name', 'position',
  12100. 'phone', 'email', 'is_primary'
  12101. ];
  12102. protected $useTimestamps = true;
  12103. protected $createdField = 'created_at';
  12104. protected $updatedField = 'updated_at';
  12105. protected $validationRules = [
  12106. 'vendor_id' => 'required|integer|is_not_unique[vendors.id]',
  12107. 'contact_type' => 'required|in_list[PRIMARY,SECONDARY,BILLING,TECHNICAL]',
  12108. 'name' => 'required|max_length[100]',
  12109. 'position' => 'permit_empty|max_length[100]',
  12110. 'phone' => 'permit_empty|max_length[20]',
  12111. 'email' => 'permit_empty|max_length[255]|valid_email',
  12112. 'is_primary' => 'permit_empty|in_list[0,1]'
  12113. ];
  12114. protected $validationMessages = [
  12115. 'vendor_id' => [
  12116. 'required' => '벤더사 id는 필수입니다.',
  12117. 'is_not_unique' => '존재하지 않는 벤더사입니다.'
  12118. ],
  12119. 'name' => [
  12120. 'required' => '담당자명은 필수입니다.'
  12121. ],
  12122. 'email' => [
  12123. 'valid_email' => '유효하지 않은 이메일 형식입니다.'
  12124. ]
  12125. ];
  12126. // 기본 담당자로 설정
  12127. public function setPrimaryContact($vendorId, $contactId)
  12128. {
  12129. $this->db->transStart();
  12130. // 기존 기본 담당자 해제
  12131. $this->where('vendor_id', $vendorId)
  12132. ->set('is_primary', 0)
  12133. ->update();
  12134. // 새로운 기본 담당자 설정
  12135. $this->update($contactId, ['is_primary' => 1]);
  12136. $this->db->transComplete();
  12137. return $this->db->transStatus();
  12138. }
  12139. }
  12140. </file>
  12141. <file path="backend/app/Models/VendorInfluencerPartnershipModel.php">
  12142. <?php
  12143. namespace App\Models;
  12144. use CodeIgniter\Model;
  12145. class VendorInfluencerPartnershipModel extends Model
  12146. {
  12147. protected $table = 'VENDOR_INFLUENCER_PARTNERSHIP';
  12148. protected $primaryKey = 'SEQ';
  12149. protected $useAutoIncrement = true;
  12150. protected $returnType = 'array';
  12151. protected $useSoftDeletes = false;
  12152. protected $protectFields = true;
  12153. protected $allowedFields = [
  12154. 'VENDOR_SEQ',
  12155. 'INFLUENCER_SEQ',
  12156. 'STATUS',
  12157. 'REQUEST_TYPE',
  12158. 'REQUEST_MESSAGE',
  12159. 'RESPONSE_MESSAGE',
  12160. 'COMMISSION_RATE',
  12161. 'SPECIAL_CONDITIONS',
  12162. 'REQUESTED_BY',
  12163. 'PROCESSED_BY',
  12164. 'REQUEST_DATE',
  12165. 'RESPONSE_DATE',
  12166. 'PARTNERSHIP_START_DATE',
  12167. 'PARTNERSHIP_END_DATE',
  12168. 'IS_ACTIVE',
  12169. 'PARTNERSHIP_CYCLE',
  12170. 'PREVIOUS_STATUS',
  12171. 'PREVIOUS_END_DATE',
  12172. 'CREATED_AT',
  12173. 'UPDATED_AT'
  12174. ];
  12175. // Dates
  12176. protected $useTimestamps = false;
  12177. protected $dateFormat = 'datetime';
  12178. protected $createdField = 'CREATED_AT';
  12179. protected $updatedField = 'UPDATED_AT';
  12180. protected $deletedField = '';
  12181. // Validation
  12182. protected $validationRules = [
  12183. 'VENDOR_SEQ' => 'required|integer',
  12184. 'INFLUENCER_SEQ' => 'required|integer',
  12185. 'STATUS' => 'required|in_list[PENDING,APPROVED,REJECTED,TERMINATED]',
  12186. 'REQUEST_TYPE' => 'required|in_list[NEW,REAPPLY]',
  12187. 'REQUESTED_BY' => 'required|integer',
  12188. 'IS_ACTIVE' => 'required|in_list[Y,N]'
  12189. ];
  12190. protected $validationMessages = [
  12191. 'VENDOR_SEQ' => [
  12192. 'required' => '벤더사 SEQ는 필수입니다.',
  12193. 'integer' => '벤더사 SEQ는 정수여야 합니다.'
  12194. ],
  12195. 'INFLUENCER_SEQ' => [
  12196. 'required' => '인플루언서 SEQ는 필수입니다.',
  12197. 'integer' => '인플루언서 SEQ는 정수여야 합니다.'
  12198. ],
  12199. 'STATUS' => [
  12200. 'required' => '상태는 필수입니다.',
  12201. 'in_list' => '유효하지 않은 상태입니다.'
  12202. ],
  12203. 'REQUEST_TYPE' => [
  12204. 'required' => '요청 타입은 필수입니다.',
  12205. 'in_list' => '유효하지 않은 요청 타입입니다.'
  12206. ],
  12207. 'REQUESTED_BY' => [
  12208. 'required' => '요청자 SEQ는 필수입니다.',
  12209. 'integer' => '요청자 SEQ는 정수여야 합니다.'
  12210. ],
  12211. 'IS_ACTIVE' => [
  12212. 'required' => 'IS_ACTIVE는 필수입니다.',
  12213. 'in_list' => 'IS_ACTIVE는 Y 또는 N이어야 합니다.'
  12214. ]
  12215. ];
  12216. protected $skipValidation = true; // 임시로 validation 비활성화
  12217. protected $cleanValidationRules = true;
  12218. // Callbacks
  12219. protected $allowCallbacks = true;
  12220. protected $beforeInsert = ['beforeInsert'];
  12221. protected $afterInsert = [];
  12222. protected $beforeUpdate = ['beforeUpdate'];
  12223. protected $afterUpdate = [];
  12224. protected $beforeFind = [];
  12225. protected $afterFind = [];
  12226. protected $beforeDelete = [];
  12227. protected $afterDelete = [];
  12228. /**
  12229. * 삽입 전 처리
  12230. */
  12231. protected function beforeInsert(array $data)
  12232. {
  12233. if (!isset($data['data']['CREATED_AT'])) {
  12234. $data['data']['CREATED_AT'] = date('Y-m-d H:i:s');
  12235. }
  12236. if (!isset($data['data']['UPDATED_AT'])) {
  12237. $data['data']['UPDATED_AT'] = date('Y-m-d H:i:s');
  12238. }
  12239. if (!isset($data['data']['REQUEST_DATE'])) {
  12240. $data['data']['REQUEST_DATE'] = date('Y-m-d H:i:s');
  12241. }
  12242. return $data;
  12243. }
  12244. /**
  12245. * 업데이트 전 처리
  12246. */
  12247. protected function beforeUpdate(array $data)
  12248. {
  12249. $data['data']['UPDATED_AT'] = date('Y-m-d H:i:s');
  12250. return $data;
  12251. }
  12252. /**
  12253. * 벤더사의 인플루언서 요청 목록 조회 (히스토리 포함)
  12254. */
  12255. public function getInfluencerRequestsForVendor($vendorSeq, $filters = [])
  12256. {
  12257. $builder = $this->select('
  12258. VENDOR_INFLUENCER_PARTNERSHIP.*,
  12259. VENDOR_INFLUENCER_PARTNERSHIP.STATUS as CURRENT_STATUS,
  12260. VENDOR_INFLUENCER_PARTNERSHIP.REQUEST_TYPE as ADD_INFO1,
  12261. VENDOR_INFLUENCER_PARTNERSHIP.PARTNERSHIP_END_DATE as ADD_INFO3,
  12262. USER_LIST.NAME as INFLUENCER_NAME,
  12263. USER_LIST.NICK_NAME as INFLUENCER_NICKNAME,
  12264. USER_LIST.EMAIL as INFLUENCER_EMAIL,
  12265. USER_LIST.PHONE as INFLUENCER_PHONE,
  12266. USER_LIST.SNS_TYPE as SNS_TYPE,
  12267. USER_LIST.SNS_LINK_ID as SNS_LINK_ID
  12268. ')
  12269. ->join('USER_LIST', 'USER_LIST.SEQ = VENDOR_INFLUENCER_PARTNERSHIP.INFLUENCER_SEQ', 'left')
  12270. ->where('VENDOR_INFLUENCER_PARTNERSHIP.VENDOR_SEQ', $vendorSeq);
  12271. // 상태별 필터링
  12272. if (!empty($filters['status'])) {
  12273. if ($filters['status'] === 'TERMINATED') {
  12274. $builder->where('VENDOR_INFLUENCER_PARTNERSHIP.STATUS', 'TERMINATED')
  12275. ->where('VENDOR_INFLUENCER_PARTNERSHIP.IS_ACTIVE', 'N');
  12276. } else {
  12277. $builder->where('VENDOR_INFLUENCER_PARTNERSHIP.STATUS', $filters['status'])
  12278. ->where('VENDOR_INFLUENCER_PARTNERSHIP.IS_ACTIVE', 'Y');
  12279. }
  12280. } else {
  12281. $builder->where('VENDOR_INFLUENCER_PARTNERSHIP.IS_ACTIVE', 'Y');
  12282. }
  12283. if (!empty($filters['keyword'])) {
  12284. $builder->groupStart()
  12285. ->like('USER_LIST.NAME', $filters['keyword'])
  12286. ->orLike('USER_LIST.NICK_NAME', $filters['keyword'])
  12287. ->orLike('USER_LIST.EMAIL', $filters['keyword'])
  12288. ->groupEnd();
  12289. }
  12290. $results = $builder->orderBy('VENDOR_INFLUENCER_PARTNERSHIP.CREATED_AT', 'DESC')
  12291. ->get()
  12292. ->getResultArray();
  12293. // 각 인플루언서의 파트너십 히스토리 추가
  12294. foreach ($results as &$result) {
  12295. $history = $this->where('VENDOR_SEQ', $vendorSeq)
  12296. ->where('INFLUENCER_SEQ', $result['INFLUENCER_SEQ'])
  12297. ->orderBy('CREATED_AT', 'DESC')
  12298. ->get()
  12299. ->getResultArray();
  12300. $result['partnership_history'] = $history;
  12301. // SNS 채널 정보를 JSON 배열로 변환
  12302. $snsChannels = [];
  12303. if (!empty($result['SNS_TYPE']) && !empty($result['SNS_LINK_ID'])) {
  12304. $snsChannels[] = [
  12305. 'platform' => strtolower($result['SNS_TYPE']),
  12306. 'handle' => $result['SNS_LINK_ID']
  12307. ];
  12308. }
  12309. $result['influencerSnsChannels'] = json_encode($snsChannels);
  12310. }
  12311. return $results;
  12312. }
  12313. /**
  12314. * 인플루언서의 벤더사 검색 (히스토리 포함)
  12315. */
  12316. public function searchVendorsForInfluencer($influencerSeq, $filters = [])
  12317. {
  12318. $builder = $this->db->table('VENDOR_LIST')
  12319. ->select('
  12320. VENDOR_LIST.*,
  12321. VIP.STATUS as PARTNERSHIP_STATUS,
  12322. VIP.REQUEST_TYPE as PARTNERSHIP_REQUEST_TYPE,
  12323. VIP.COMMISSION_RATE as CURRENT_COMMISSION_RATE,
  12324. VIP.SPECIAL_CONDITIONS as CURRENT_SPECIAL_CONDITIONS,
  12325. VIP.CREATED_AT as PARTNERSHIP_DATE,
  12326. VIP.IS_ACTIVE,
  12327. VIP.SEQ as PARTNERSHIP_SEQ
  12328. ')
  12329. ->join('(
  12330. SELECT * FROM VENDOR_INFLUENCER_PARTNERSHIP p1
  12331. WHERE p1.CREATED_AT = (
  12332. SELECT MAX(p2.CREATED_AT)
  12333. FROM VENDOR_INFLUENCER_PARTNERSHIP p2
  12334. WHERE p2.VENDOR_SEQ = p1.VENDOR_SEQ
  12335. AND p2.INFLUENCER_SEQ = p1.INFLUENCER_SEQ
  12336. )
  12337. ) VIP',
  12338. "VIP.VENDOR_SEQ = VENDOR_LIST.SEQ AND VIP.INFLUENCER_SEQ = {$influencerSeq}",
  12339. 'left'
  12340. )
  12341. ->where('VENDOR_LIST.IS_ACT', 'Y');
  12342. // 필터 적용
  12343. if (!empty($filters['keyword'])) {
  12344. $builder->like('VENDOR_LIST.COMPANY_NAME', $filters['keyword']);
  12345. }
  12346. if (!empty($filters['category'])) {
  12347. $builder->where('VENDOR_LIST.CATEGORY', $filters['category']);
  12348. }
  12349. // 파트너십 상태별 필터링
  12350. if (!empty($filters['status'])) {
  12351. if ($filters['status'] === 'TERMINATED') {
  12352. $builder->where('VIP.STATUS', 'TERMINATED')
  12353. ->where('VIP.IS_ACTIVE', 'N');
  12354. } else {
  12355. $builder->where('VIP.STATUS', $filters['status'])
  12356. ->where('VIP.IS_ACTIVE', 'Y');
  12357. }
  12358. }
  12359. $results = $builder->orderBy('VIP.CREATED_AT', 'DESC')
  12360. ->get()
  12361. ->getResultArray();
  12362. // 각 벤더사의 파트너십 히스토리 추가
  12363. foreach ($results as &$result) {
  12364. $history = $this->db->table($this->table)
  12365. ->where('VENDOR_SEQ', $result['SEQ'])
  12366. ->where('INFLUENCER_SEQ', $influencerSeq)
  12367. ->orderBy('CREATED_AT', 'DESC')
  12368. ->get()
  12369. ->getResultArray();
  12370. $result['partnership_history'] = $history;
  12371. }
  12372. return $results;
  12373. }
  12374. /**
  12375. * 파트너십 요청 생성
  12376. */
  12377. public function createPartnershipRequest($data)
  12378. {
  12379. $db = \Config\Database::connect();
  12380. $db->transStart();
  12381. $this->deactivateExistingPartnership($data['VENDOR_SEQ'], $data['INFLUENCER_SEQ']);
  12382. $result = $this->insert($data);
  12383. $dbError = $db->error();
  12384. $db->transComplete();
  12385. if (!$result || !empty($dbError['message'])) {
  12386. return [
  12387. 'success' => false,
  12388. 'db_error' => $dbError,
  12389. 'model_errors' => $this->errors()
  12390. ];
  12391. }
  12392. return $result;
  12393. }
  12394. /**
  12395. * 파트너십 승인 처리
  12396. */
  12397. public function approvePartnership($partnershipSeq, $processedBy, $responseMessage = '')
  12398. {
  12399. $updateData = [
  12400. 'STATUS' => 'APPROVED',
  12401. 'PROCESSED_BY' => $processedBy,
  12402. 'RESPONSE_MESSAGE' => $responseMessage,
  12403. 'RESPONSE_DATE' => date('Y-m-d H:i:s'),
  12404. 'PARTNERSHIP_START_DATE' => date('Y-m-d H:i:s')
  12405. ];
  12406. return $this->update($partnershipSeq, $updateData);
  12407. }
  12408. /**
  12409. * 파트너십 거부 처리
  12410. */
  12411. public function rejectPartnership($partnershipSeq, $processedBy, $responseMessage = '')
  12412. {
  12413. $updateData = [
  12414. 'STATUS' => 'REJECTED',
  12415. 'PROCESSED_BY' => $processedBy,
  12416. 'RESPONSE_MESSAGE' => $responseMessage,
  12417. 'RESPONSE_DATE' => date('Y-m-d H:i:s')
  12418. ];
  12419. return $this->update($partnershipSeq, $updateData);
  12420. }
  12421. /**
  12422. * 파트너십 해지 처리
  12423. */
  12424. public function terminatePartnership($mappingSeq, $terminatedBy, $responseMessage = null)
  12425. {
  12426. $db = \Config\Database::connect();
  12427. // 현재 상태 확인
  12428. $current = $db->table($this->table)
  12429. ->where('SEQ', $mappingSeq)
  12430. ->get()
  12431. ->getRowArray();
  12432. if (!$current) {
  12433. log_message('error', "Partnership not found: {$mappingSeq}");
  12434. return ['success' => false, 'error' => 'Partnership not found'];
  12435. }
  12436. // APPROVED 상태이고 활성 상태인 경우에만 해지 가능
  12437. if ($current['STATUS'] !== 'APPROVED' || $current['IS_ACTIVE'] !== 'Y') {
  12438. log_message('error', "Invalid status for termination. Current status: {$current['STATUS']}, IS_ACTIVE: {$current['IS_ACTIVE']}");
  12439. return ['success' => false, 'error' => 'Invalid status for termination'];
  12440. }
  12441. $db->transStart();
  12442. try {
  12443. // 해지 처리 실행
  12444. $updateData = [
  12445. 'STATUS' => 'TERMINATED',
  12446. 'IS_ACTIVE' => 'N',
  12447. 'PARTNERSHIP_END_DATE' => date('Y-m-d H:i:s'),
  12448. 'RESPONSE_MESSAGE' => $responseMessage,
  12449. 'PROCESSED_BY' => $terminatedBy,
  12450. 'RESPONSE_DATE' => date('Y-m-d H:i:s'),
  12451. 'UPDATED_AT' => date('Y-m-d H:i:s')
  12452. ];
  12453. $success = $db->table($this->table)
  12454. ->where('SEQ', $mappingSeq)
  12455. ->update($updateData);
  12456. if (!$success || $db->affectedRows() !== 1) {
  12457. throw new \Exception('Failed to terminate partnership');
  12458. }
  12459. // 최종 상태 확인
  12460. $final = $db->table($this->table)
  12461. ->where('SEQ', $mappingSeq)
  12462. ->get()
  12463. ->getRowArray();
  12464. if (!$final || $final['STATUS'] !== 'TERMINATED' || $final['IS_ACTIVE'] !== 'N') {
  12465. throw new \Exception('Final state verification failed');
  12466. }
  12467. $db->transComplete();
  12468. return ['success' => true, 'data' => $final];
  12469. } catch (\Exception $e) {
  12470. $db->transRollback();
  12471. log_message('error', "Termination failed: " . $e->getMessage());
  12472. return [
  12473. 'success' => false,
  12474. 'error' => $e->getMessage(),
  12475. 'debug' => [
  12476. 'expectedStatus' => 'TERMINATED',
  12477. 'expectedIsActive' => 'N',
  12478. 'actualStatus' => $current['STATUS'],
  12479. 'actualIsActive' => $current['IS_ACTIVE'],
  12480. 'error' => $e->getMessage()
  12481. ]
  12482. ];
  12483. }
  12484. }
  12485. /**
  12486. * 기존 파트너십 비활성화 (재신청 시 사용)
  12487. */
  12488. protected function deactivateExistingPartnership($vendorSeq, $influencerSeq)
  12489. {
  12490. $db = \Config\Database::connect();
  12491. // 1. 현재 활성 파트너십 찾기
  12492. $activePartnership = $db->table($this->table)
  12493. ->where('VENDOR_SEQ', $vendorSeq)
  12494. ->where('INFLUENCER_SEQ', $influencerSeq)
  12495. ->where('IS_ACTIVE', 'Y')
  12496. ->get()
  12497. ->getRowArray();
  12498. if ($activePartnership) {
  12499. // 2. 상태를 TERMINATED로 변경하고 IS_ACTIVE='N'으로 설정
  12500. $db->table($this->table)
  12501. ->where('SEQ', $activePartnership['SEQ'])
  12502. ->update([
  12503. 'STATUS' => 'TERMINATED',
  12504. 'IS_ACTIVE' => 'N',
  12505. 'PARTNERSHIP_END_DATE' => date('Y-m-d H:i:s')
  12506. ]);
  12507. }
  12508. // 3. 혹시 모를 다른 IS_ACTIVE='Y' 레코드도 'N'으로 변경
  12509. $db->table($this->table)
  12510. ->where('VENDOR_SEQ', $vendorSeq)
  12511. ->where('INFLUENCER_SEQ', $influencerSeq)
  12512. ->where('IS_ACTIVE', 'Y')
  12513. ->update(['IS_ACTIVE' => 'N']);
  12514. // 4. 검증 및 로깅
  12515. $finalCheck = $db->table($this->table)
  12516. ->where('VENDOR_SEQ', $vendorSeq)
  12517. ->where('INFLUENCER_SEQ', $influencerSeq)
  12518. ->where('IS_ACTIVE', 'Y')
  12519. ->countAllResults();
  12520. if ($finalCheck > 0) {
  12521. log_message('error', "Found unexpected active partnerships: vendor={$vendorSeq}, influencer={$influencerSeq}, count={$finalCheck}");
  12522. }
  12523. }
  12524. /**
  12525. * 현재 활성 파트너십 조회
  12526. */
  12527. public function getActivePartnership($vendorSeq, $influencerSeq)
  12528. {
  12529. return $this->where('VENDOR_SEQ', $vendorSeq)
  12530. ->where('INFLUENCER_SEQ', $influencerSeq)
  12531. ->where('IS_ACTIVE', 'Y')
  12532. ->first();
  12533. }
  12534. /**
  12535. * 벤더사 통계 조회
  12536. */
  12537. public function getVendorStats($vendorSeq)
  12538. {
  12539. $result = $this->select('STATUS, COUNT(*) as count')
  12540. ->where('VENDOR_SEQ', $vendorSeq)
  12541. ->where('IS_ACTIVE', 'Y')
  12542. ->groupBy('STATUS')
  12543. ->get()
  12544. ->getResultArray();
  12545. $stats = [
  12546. 'pending' => 0,
  12547. 'approved' => 0,
  12548. 'rejected' => 0,
  12549. 'terminated' => 0,
  12550. 'total' => 0
  12551. ];
  12552. foreach ($result as $row) {
  12553. $status = strtolower($row['STATUS']);
  12554. $stats[$status] = (int)$row['count'];
  12555. $stats['total'] += (int)$row['count'];
  12556. }
  12557. return $stats;
  12558. }
  12559. /**
  12560. * 재승인 요청 생성
  12561. */
  12562. public function createReapplyRequest($vendorSeq, $influencerSeq, $requestMessage, $requestedBy)
  12563. {
  12564. $db = \Config\Database::connect();
  12565. $db->transStart();
  12566. try {
  12567. // 기존 활성 파트너십 비활성화
  12568. $this->deactivateExistingPartnership($vendorSeq, $influencerSeq);
  12569. // 이전 파트너십들의 최대 사이클 번호 조회
  12570. $maxCycle = $db->table($this->table)
  12571. ->selectMax('PARTNERSHIP_CYCLE', 'max_cycle')
  12572. ->where('VENDOR_SEQ', $vendorSeq)
  12573. ->where('INFLUENCER_SEQ', $influencerSeq)
  12574. ->get()
  12575. ->getRowArray();
  12576. $newCycle = ($maxCycle && $maxCycle['max_cycle']) ? $maxCycle['max_cycle'] + 1 : 1;
  12577. // 최근 TERMINATED 파트너십 정보 조회 (이전 상태 정보용)
  12578. $previousPartnership = $db->table($this->table)
  12579. ->where('VENDOR_SEQ', $vendorSeq)
  12580. ->where('INFLUENCER_SEQ', $influencerSeq)
  12581. ->where('STATUS', 'TERMINATED')
  12582. ->where('IS_ACTIVE', 'N')
  12583. ->orderBy('CREATED_AT', 'DESC')
  12584. ->get()
  12585. ->getRowArray();
  12586. // 새로운 재승인 요청 생성
  12587. $insertData = [
  12588. 'VENDOR_SEQ' => $vendorSeq,
  12589. 'INFLUENCER_SEQ' => $influencerSeq,
  12590. 'STATUS' => 'PENDING',
  12591. 'REQUEST_TYPE' => 'REAPPLY',
  12592. 'REQUEST_MESSAGE' => $requestMessage,
  12593. 'REQUESTED_BY' => $requestedBy,
  12594. 'REQUEST_DATE' => date('Y-m-d H:i:s'),
  12595. 'IS_ACTIVE' => 'Y',
  12596. 'PARTNERSHIP_CYCLE' => $newCycle,
  12597. 'CREATED_AT' => date('Y-m-d H:i:s'),
  12598. 'UPDATED_AT' => date('Y-m-d H:i:s')
  12599. ];
  12600. // 이전 파트너십 정보가 있으면 추가
  12601. if ($previousPartnership) {
  12602. $insertData['PREVIOUS_STATUS'] = $previousPartnership['STATUS'];
  12603. $insertData['PREVIOUS_END_DATE'] = $previousPartnership['PARTNERSHIP_END_DATE'];
  12604. }
  12605. $result = $this->insert($insertData);
  12606. if (!$result) {
  12607. throw new \Exception('Failed to create reapply request');
  12608. }
  12609. $db->transComplete();
  12610. return [
  12611. 'success' => true,
  12612. 'data' => array_merge(['SEQ' => $result], $insertData)
  12613. ];
  12614. } catch (\Exception $e) {
  12615. $db->transRollback();
  12616. log_message('error', "Create reapply request failed: " . $e->getMessage());
  12617. return [
  12618. 'success' => false,
  12619. 'error' => $e->getMessage()
  12620. ];
  12621. }
  12622. }
  12623. }
  12624. </file>
  12625. <file path="backend/app/Models/VendorInfluencerReapply.php">
  12626. <?php
  12627. /**
  12628. * 벤더-인플루언서 재승인요청 API 예제
  12629. *
  12630. * 기능: 해지된 파트너십에 대한 재계약 요청 처리
  12631. * 경로: POST /api/vendor-influencer/reapply-request
  12632. */
  12633. namespace App\Controllers;
  12634. use App\Controllers\BaseController;
  12635. use App\Models\VendorModel;
  12636. use App\Models\UserModel;
  12637. use App\Models\VendorInfluencerMappingModel;
  12638. use CodeIgniter\HTTP\ResponseInterface;
  12639. class VendorInfluencerController extends BaseController
  12640. {
  12641. protected $vendorModel;
  12642. protected $userModel;
  12643. protected $vendorInfluencerModel;
  12644. public function __construct()
  12645. {
  12646. $this->vendorModel = new VendorModel();
  12647. $this->userModel = new UserModel();
  12648. $this->vendorInfluencerModel = new VendorInfluencerMappingModel();
  12649. }
  12650. /**
  12651. * 재승인 요청 (해지된 파트너십에 대한 재계약 요청)
  12652. *
  12653. * @route POST /api/vendor-influencer/reapply-request
  12654. * @param int vendorSeq 벤더사 SEQ
  12655. * @param int influencerSeq 인플루언서 SEQ
  12656. * @param string requestMessage 요청 메시지
  12657. * @param int requestedBy 요청자 SEQ (인플루언서)
  12658. *
  12659. * @return JSON
  12660. */
  12661. public function reapplyRequest()
  12662. {
  12663. try {
  12664. $request = $this->request->getJSON();
  12665. $vendorSeq = $request->vendorSeq ?? null;
  12666. $influencerSeq = $request->influencerSeq ?? null;
  12667. $requestMessage = $request->requestMessage ?? '';
  12668. $requestedBy = $request->requestedBy ?? null;
  12669. // 필수 파라미터 검증
  12670. if (!$vendorSeq || !$influencerSeq || !$requestedBy) {
  12671. return $this->response->setStatusCode(400)->setJSON([
  12672. 'success' => false,
  12673. 'message' => '필수 파라미터가 누락되었습니다.'
  12674. ]);
  12675. }
  12676. // 기존 해지된 파트너십 확인
  12677. $terminatedPartnership = $this->vendorInfluencerModel
  12678. ->where('VENDOR_SEQ', $vendorSeq)
  12679. ->where('INFLUENCER_SEQ', $influencerSeq)
  12680. ->where('STATUS', 'TERMINATED')
  12681. ->where('IS_ACT', 'Y')
  12682. ->orderBy('REG_DATE', 'DESC')
  12683. ->first();
  12684. if (!$terminatedPartnership) {
  12685. return $this->response->setStatusCode(404)->setJSON([
  12686. 'success' => false,
  12687. 'message' => '해지된 파트너십 기록을 찾을 수 없습니다.'
  12688. ]);
  12689. }
  12690. // 현재 처리 중인 요청이 있는지 확인
  12691. $existingPendingRequest = $this->vendorInfluencerModel
  12692. ->where('VENDOR_SEQ', $vendorSeq)
  12693. ->where('INFLUENCER_SEQ', $influencerSeq)
  12694. ->where('STATUS', 'PENDING')
  12695. ->where('IS_ACT', 'Y')
  12696. ->first();
  12697. if ($existingPendingRequest) {
  12698. return $this->response->setStatusCode(409)->setJSON([
  12699. 'success' => false,
  12700. 'message' => '이미 처리 중인 승인 요청이 있습니다.'
  12701. ]);
  12702. }
  12703. // 재승인 요청 생성
  12704. $reapplyData = [
  12705. 'VENDOR_SEQ' => $vendorSeq,
  12706. 'INFLUENCER_SEQ' => $influencerSeq,
  12707. 'REQUEST_TYPE' => 'INFLUENCER_REQUEST',
  12708. 'STATUS' => 'PENDING',
  12709. 'REQUEST_MESSAGE' => '[재계약 요청] ' . $requestMessage,
  12710. 'REQUESTED_BY' => $requestedBy,
  12711. 'COMMISSION_RATE' => $terminatedPartnership['COMMISSION_RATE'], // 이전 수수료율 유지
  12712. 'SPECIAL_CONDITIONS' => $terminatedPartnership['SPECIAL_CONDITIONS'], // 이전 특별조건 유지
  12713. 'EXPIRED_DATE' => date('Y-m-d H:i:s', strtotime('+7 days')),
  12714. 'ADD_INFO1' => 'REAPPLY', // 재신청 구분자
  12715. 'ADD_INFO2' => $terminatedPartnership['SEQ'], // 이전 파트너십 SEQ 참조
  12716. 'ADD_INFO3' => date('Y-m-d H:i:s') // 재신청 일시
  12717. ];
  12718. $insertId = $this->vendorInfluencerModel->insert($reapplyData);
  12719. // 생성된 재승인 요청 정보 조회
  12720. $createdReapply = $this->vendorInfluencerModel
  12721. ->select('vim.*, v.COMPANY_NAME as vendorName, u.NICK_NAME as influencerName, req_user.NICK_NAME as requestedByName')
  12722. ->from('VENDOR_INFLUENCER_MAPPING vim')
  12723. ->join('VENDOR_LIST v', 'vim.VENDOR_SEQ = v.SEQ', 'left')
  12724. ->join('USER_LIST u', 'vim.INFLUENCER_SEQ = u.SEQ', 'left')
  12725. ->join('USER_LIST req_user', 'vim.REQUESTED_BY = req_user.SEQ', 'left')
  12726. ->where('vim.SEQ', $insertId)
  12727. ->get()
  12728. ->getRowArray();
  12729. return $this->response->setJSON([
  12730. 'success' => true,
  12731. 'message' => '재승인 요청이 성공적으로 생성되었습니다.',
  12732. 'data' => [
  12733. 'reapplyRequest' => $createdReapply,
  12734. 'previousPartnership' => $terminatedPartnership
  12735. ]
  12736. ]);
  12737. } catch (\Exception $e) {
  12738. return $this->response->setStatusCode(500)->setJSON([
  12739. 'success' => false,
  12740. 'message' => '재승인 요청 생성 중 오류가 발생했습니다.',
  12741. 'error' => ENVIRONMENT === 'development' ? $e->getMessage() : null
  12742. ]);
  12743. }
  12744. }
  12745. }
  12746. /*
  12747. 사용 예시:
  12748. POST /api/vendor-influencer/reapply-request
  12749. Content-Type: application/json
  12750. {
  12751. "vendorSeq": 8,
  12752. "influencerSeq": 15,
  12753. "requestMessage": "이전 계약이 만료되어 재계약을 요청드립니다. 새로운 프로모션 진행을 위해 파트너십을 재개하고 싶습니다.",
  12754. "requestedBy": 15
  12755. }
  12756. 응답 예시:
  12757. {
  12758. "success": true,
  12759. "message": "재승인 요청이 성공적으로 생성되었습니다.",
  12760. "data": {
  12761. "reapplyRequest": {
  12762. "SEQ": 25,
  12763. "VENDOR_SEQ": 8,
  12764. "INFLUENCER_SEQ": 15,
  12765. "REQUEST_TYPE": "INFLUENCER_REQUEST",
  12766. "STATUS": "PENDING",
  12767. "REQUEST_MESSAGE": "[재계약 요청] 이전 계약이 만료되어 재계약을 요청드립니다...",
  12768. "REQUESTED_BY": 15,
  12769. "COMMISSION_RATE": 10.5,
  12770. "SPECIAL_CONDITIONS": "월 2회 포스팅",
  12771. "EXPIRED_DATE": "2024-01-20 10:30:00",
  12772. "ADD_INFO1": "REAPPLY",
  12773. "ADD_INFO2": "23",
  12774. "ADD_INFO3": "2024-01-13 10:30:00",
  12775. "vendorName": "뷰티코리아",
  12776. "influencerName": "뷰티블로거",
  12777. "requestedByName": "뷰티블로거"
  12778. },
  12779. "previousPartnership": {
  12780. "SEQ": 23,
  12781. "STATUS": "TERMINATED",
  12782. "PARTNERSHIP_END_DATE": "2024-01-10 15:20:00"
  12783. }
  12784. }
  12785. }
  12786. */
  12787. </file>
  12788. <file path="backend/app/Models/VendorProductModel.php">
  12789. <?php
  12790. namespace App\Models;
  12791. use CodeIgniter\Model;
  12792. class VendorProductModel extends Model
  12793. {
  12794. protected $table = 'vendor_products';
  12795. protected $primaryKey = 'id';
  12796. protected $useAutoIncrement = true;
  12797. protected $returnType = 'array';
  12798. protected $useSoftDeletes = true;
  12799. protected $allowedFields = [
  12800. 'vendor_id', 'name', 'description', 'category',
  12801. 'price', 'image_url', 'is_featured', 'status'
  12802. ];
  12803. protected $useTimestamps = true;
  12804. protected $createdField = 'created_at';
  12805. protected $updatedField = 'updated_at';
  12806. protected $deletedField = 'deleted_at';
  12807. protected $validationRules = [
  12808. 'vendor_id' => 'required|integer|is_not_unique[vendors.id]',
  12809. 'name' => 'required|max_length[255]',
  12810. 'description' => 'permit_empty|max_length[65535]',
  12811. 'category' => 'permit_empty|max_length[100]',
  12812. 'price' => 'permit_empty|decimal|greater_than_equal_to[0]',
  12813. 'image_url' => 'permit_empty|max_length[500]|valid_url',
  12814. 'is_featured' => 'permit_empty|in_list[0,1]',
  12815. 'status' => 'required|in_list[ACTIVE,INACTIVE,DISCONTINUED]'
  12816. ];
  12817. protected $validationMessages = [
  12818. 'vendor_id' => [
  12819. 'required' => '벤더사 id는 필수입니다.',
  12820. 'is_not_unique' => '존재하지 않는 벤더사입니다.'
  12821. ],
  12822. 'name' => [
  12823. 'required' => '제품명은 필수입니다.'
  12824. ],
  12825. 'price' => [
  12826. 'greater_than_equal_to' => '가격은 0 이상이어야 합니다.'
  12827. ],
  12828. 'image_url' => [
  12829. 'valid_url' => '유효하지 않은 이미지 URL입니다.'
  12830. ]
  12831. ];
  12832. // 벤더사별 주요 제품 조회
  12833. public function getFeaturedProducts($vendorId, $limit = 5)
  12834. {
  12835. return $this->where('vendor_id', $vendorId)
  12836. ->where('status', 'ACTIVE')
  12837. ->where('is_featured', 1)
  12838. ->limit($limit)
  12839. ->orderBy('created_at', 'DESC')
  12840. ->findAll();
  12841. }
  12842. }
  12843. </file>
  12844. <file path="components/cellRenderer/customActionTypeTextColor.vue">
  12845. <template>
  12846. <span v-if="useUtil.isNull(params.value)">{{ params.value }}</span>
  12847. <span v-else class="color-nm-blue" :class="[params.value == 'LOGIN' ? 'color-blue2' : 'color-red']" :title="params.value">{{ params.value }}</span>
  12848. </template>
  12849. <script setup>
  12850. import useUtil from '@/composables/useUtil';
  12851. // props
  12852. const props = defineProps({
  12853. params: Object,
  12854. })
  12855. </script>
  12856. </file>
  12857. <file path="components/cellRenderer/customBackUpBtn.vue">
  12858. <template>
  12859. <div style="display: block;">
  12860. <v-btn flat class="btn-backup" @click="btnClickedHandler"><i class="ico ico2"></i>{{ params.value }}</v-btn>
  12861. </div>
  12862. </template>
  12863. <script setup>
  12864. // props
  12865. const props = defineProps({
  12866. params: Object,
  12867. })
  12868. function btnClickedHandler() {
  12869. // 콜백함수
  12870. props.params.clicked(props.params)
  12871. }
  12872. </script>
  12873. </file>
  12874. <file path="components/cellRenderer/customBackUpBtnR.vue">
  12875. <template>
  12876. <div style="display: block;">
  12877. <v-btn flat class="btn-backup" @click="btnClickedHandler"><i class="ico ico3"></i>{{ params.value }}</v-btn>
  12878. </div>
  12879. </template>
  12880. <script setup>
  12881. // props
  12882. const props = defineProps({
  12883. params: Object,
  12884. })
  12885. function btnClickedHandler() {
  12886. // 콜백함수
  12887. props.params.clicked(props.params)
  12888. }
  12889. </script>
  12890. </file>
  12891. <file path="components/cellRenderer/customButtonSms.vue">
  12892. <template>
  12893. <button type="button" class="kakao--sms--button" @click="sendMsg">재발송</button>
  12894. </template>
  12895. <script setup>
  12896. // props
  12897. const props = defineProps({
  12898. params: Object,
  12899. });
  12900. function sendMsg() {
  12901. if (props.params && typeof props.params.onSendKakao === "function") {
  12902. props.params.onSendKakao(props.params.value);
  12903. }
  12904. }
  12905. </script>
  12906. </file>
  12907. <file path="components/cellRenderer/customHeaderText.vue">
  12908. <template>
  12909. <div class="custom-header-text">세션 만료 시간 (초) <span class="blue-text">※ 시간은 360 ~ 3600초까지 설정 가능</span></div>
  12910. </template>
  12911. <script setup>
  12912. </script>
  12913. </file>
  12914. <file path="components/cellRenderer/customInhibitSelect.vue">
  12915. <template>
  12916. <div class="lc--custom--btn">
  12917. <v-select
  12918. v-model="props.params.data.inhibitStatus"
  12919. :items="sltInhibit"
  12920. variant="outlined"
  12921. class="custom-select"
  12922. style="width:15rem"
  12923. @click.stop
  12924. >
  12925. </v-select>
  12926. <v-btn class="custom-btn mini apply-btn" @click="btnClickedHandler">적용</v-btn>
  12927. </div>
  12928. </template>
  12929. <script setup>
  12930. // props
  12931. const props = defineProps({
  12932. params: Object,
  12933. })
  12934. const sltInhibit = ref([])
  12935. function btnClickedHandler(event){
  12936. event.stopPropagation();
  12937. props.params.clicked(props.params)
  12938. }
  12939. watchEffect(() =>{
  12940. fnGetEnumCode(useLangStore().getLang)
  12941. })
  12942. /**
  12943. * ENUM 업데이트
  12944. * @param lang
  12945. */
  12946. function fnGetEnumCode(lang){
  12947. lang = useUtil.nvl(lang, 'kr')
  12948. let objEnum = useEnumCode.getEnumCode(lang)
  12949. let deleteAllInhibit = objEnum.inhibitStatus.filter(item=>item.value !== -1)
  12950. sltInhibit.value = deleteAllInhibit
  12951. }
  12952. </script>
  12953. </file>
  12954. <file path="components/cellRenderer/customIpConnTextColor.vue">
  12955. <template>
  12956. <span class="color-nm-blue" :class="[params.value == 'Y' ? 'color-blue2' : 'color-red']" :title="params.value">{{ params.value }}</span>
  12957. </template>
  12958. <script setup>
  12959. // props
  12960. const props = defineProps({
  12961. params: Object,
  12962. })
  12963. </script>
  12964. </file>
  12965. <file path="components/cellRenderer/customIpNotConnTextColor.vue">
  12966. <template>
  12967. <span :class="[params.data.allowYn === 'N' ? 'text-disabled' : '']">{{ params.value }}</span>
  12968. </template>
  12969. <script setup>
  12970. // props
  12971. const props = defineProps({
  12972. params: Object,
  12973. })
  12974. </script>
  12975. </file>
  12976. <file path="components/cellRenderer/customLicenseBtn.vue">
  12977. <template>
  12978. <div class="lc--custom--btn">
  12979. <v-btn v-if="params.value" class="custom-btn btn-del" @click="btnClickedHandler($event, 'delete')" click.stop><i class="ico"></i>{{ $t('common.delete') }}</v-btn>
  12980. <v-btn v-else class="custom-btn btn-reg" @click="btnClickedHandler($event, 'reg')" click.stop><i class="ico"></i>{{ $t('common.reg') }}</v-btn>
  12981. </div>
  12982. </template>
  12983. <script setup>
  12984. // props
  12985. const props = defineProps({
  12986. params: Object,
  12987. })
  12988. function btnClickedHandler(event, mode) {
  12989. event.stopPropagation();
  12990. // 콜백함수
  12991. props.params.clicked(props.params, mode)
  12992. }
  12993. </script>
  12994. </file>
  12995. <file path="components/cellRenderer/customLogLevelSelect.vue">
  12996. <template>
  12997. <div class="input-wrap slt-btn slt-btn-nw">
  12998. <v-select
  12999. v-model="props.params.data.logLevel"
  13000. :items="sltLogLevel"
  13001. variant="outlined"
  13002. class="custom-select"
  13003. style="width:6.25rem; max-width:6.25rem"
  13004. >
  13005. </v-select>
  13006. <v-btn class="custom-btn btn-gray" style="max-width:3.5rem; height:1.85rem;" @click="btnClickedHandler">변경</v-btn>
  13007. </div>
  13008. </template>
  13009. <script setup>
  13010. // props
  13011. const props = defineProps({
  13012. params: Object,
  13013. })
  13014. const sltLogLevel = ref([])
  13015. function btnClickedHandler(){
  13016. props.params.clicked(props.params)
  13017. }
  13018. watchEffect(() =>{
  13019. fnGetEnumCode(useLangStore().getLang)
  13020. })
  13021. /**
  13022. * ENUM 업데이트
  13023. * @param lang
  13024. */
  13025. function fnGetEnumCode(lang){
  13026. lang = useUtil.nvl(lang, 'kr')
  13027. let objEnum = useEnumCode.getEnumCode(lang)
  13028. sltLogLevel.value = objEnum.logLevel
  13029. }
  13030. </script>
  13031. </file>
  13032. <file path="components/cellRenderer/customNullValue.vue">
  13033. <template>
  13034. <span>{{useUtil.nvl(params.value, '-')}}</span>
  13035. </template>
  13036. <script setup>
  13037. import useUtil from '@/composables/useUtil';
  13038. // props
  13039. const props = defineProps({
  13040. params: Object,
  13041. })
  13042. </script>
  13043. </file>
  13044. <file path="components/cellRenderer/customRadio.vue">
  13045. <template>
  13046. <v-radio-group row inline v-model="params.data.useYN" class="custom-radio type2">
  13047. <v-radio value="Y" label="사용" @click="fnUpdate('Y', params)" readonly></v-radio>
  13048. <v-radio value="N" label="미사용" @click="fnUpdate('N', params)" readonly></v-radio>
  13049. </v-radio-group>
  13050. </template>
  13051. <script setup>
  13052. // props
  13053. const props = defineProps({
  13054. params: Object,
  13055. })
  13056. function fnUpdate(yn, item){
  13057. props.params.clicked(yn, item)
  13058. }
  13059. </script>
  13060. </file>
  13061. <file path="components/cellRenderer/customResultTextDivBg.vue">
  13062. <template>
  13063. <div class="cautions-text-box" :class="[params.data.data == 'SUCCESS' ? '' : 'fail' ]">{{ params.value }}</div>
  13064. </template>
  13065. <script setup>
  13066. // props
  13067. const props = defineProps({
  13068. params: Object,
  13069. })
  13070. </script>
  13071. </file>
  13072. <file path="components/cellRenderer/customSessionSetTextField.vue">
  13073. <template>
  13074. <div class="input-wrap slt-btn slt-btn-nw">
  13075. <v-text-field
  13076. v-model="params.data.keyValue"
  13077. class="custom-input mini"
  13078. placeholder=""
  13079. style="max-width:6.9375rem; min-height:1.85rem;"
  13080. :disabled="params.data.useYN === 'N'"
  13081. ></v-text-field>
  13082. <v-btn class="custom-btn btn-gray" :disabled="params.data.useYN === 'N'" style="width:3.5rem; height:1.85rem" @click="fnUpdate(params)">적용</v-btn>
  13083. </div>
  13084. </template>
  13085. <script setup>
  13086. // props
  13087. const props = defineProps({
  13088. params: Object,
  13089. })
  13090. function fnUpdate(item){
  13091. props.params.clicked(item)
  13092. }
  13093. </script>
  13094. </file>
  13095. <file path="components/cellRenderer/customStatusBox.vue">
  13096. <template>
  13097. <span class="btn-state" :class="[params.data.status == 1 ? 'state1' : params.data.status == 0 ? 'state2' : 'state3']"><i class="ico"></i>{{ params.value }}</span>
  13098. </template>
  13099. <script setup>
  13100. // props
  13101. const props = defineProps({
  13102. params: Object,
  13103. })
  13104. </script>
  13105. </file>
  13106. <file path="components/cellRenderer/customTextColor.vue">
  13107. <template>
  13108. <span
  13109. class="status--box"
  13110. :class="[params.value == 'on' ? 'actv' : '']"
  13111. :title="params.value"
  13112. >{{ params.value }}</span
  13113. >
  13114. </template>
  13115. <script>
  13116. export default {
  13117. props: ["params"],
  13118. methods: {},
  13119. };
  13120. </script>
  13121. </file>
  13122. <file path="components/cellRenderer/customTextDivSession.vue">
  13123. <template>
  13124. <!-- 현재 로그인 계정 아이디인 경우 hidden -->
  13125. <v-btn
  13126. v-if="params.data.accountId != useAuthStore().getAccountId"
  13127. flat
  13128. class="btn-session-ends"
  13129. style="height:1.9375rem; width:5.75rem;"
  13130. @click="btnClickedHandler"
  13131. ><i class="icon-wrap"><v-icon icon="mdi-close"/></i>{{ params.value }}</v-btn>
  13132. </template>
  13133. <script setup>
  13134. // props
  13135. const props = defineProps({
  13136. params: Object,
  13137. })
  13138. function btnClickedHandler() {
  13139. // 콜백함수
  13140. props.params.clicked(props.params)
  13141. }
  13142. </script>
  13143. </file>
  13144. <file path="components/cellRenderer/customUseYNTextColor.vue">
  13145. <template>
  13146. <span class="color-nm-blue" :class="[params.data.useYN == 'Y' ? 'color-blue2' : '']">{{ getUseYnText(params.value) }}</span>
  13147. </template>
  13148. <script setup>
  13149. import { useI18n } from 'vue-i18n';
  13150. // props
  13151. const props = defineProps({
  13152. params: Object,
  13153. })
  13154. const i18n = useI18n()
  13155. const getUseYnText = computed(() => {
  13156. return (val) => {
  13157. if(!useUtil.isNull(val)) {
  13158. // 다국어처리 하기
  13159. return val === 'Y' ? i18n.t('common.enabled') : i18n.t('common.disabled')
  13160. }
  13161. }
  13162. })
  13163. </script>
  13164. </file>
  13165. <file path="components/chat/ClaudeChat.vue">
  13166. <template>
  13167. <div class="claude-chat">
  13168. <div class="chat-container">
  13169. <div class="messages" ref="messagesContainer">
  13170. <div
  13171. v-for="(message, index) in messages"
  13172. :key="index"
  13173. :class="['message', message.role]"
  13174. >
  13175. <div class="message-content">
  13176. <div class="message-role">{{ message.role === 'user' ? '사용자' : 'Claude' }}</div>
  13177. <div class="message-text">{{ message.content }}</div>
  13178. </div>
  13179. </div>
  13180. <div v-if="isLoading" class="message assistant loading">
  13181. <div class="message-content">
  13182. <div class="message-role">Claude</div>
  13183. <div class="message-text">
  13184. <div class="typing-indicator">
  13185. <span></span>
  13186. <span></span>
  13187. <span></span>
  13188. </div>
  13189. </div>
  13190. </div>
  13191. </div>
  13192. </div>
  13193. <div class="input-container">
  13194. <div class="input-wrapper">
  13195. <textarea
  13196. v-model="newMessage"
  13197. @keydown.enter.prevent="handleEnter"
  13198. placeholder="메시지를 입력하세요..."
  13199. rows="1"
  13200. ref="messageInput"
  13201. ></textarea>
  13202. <button
  13203. @click="sendMessage"
  13204. :disabled="!newMessage.trim() || isLoading"
  13205. class="send-button"
  13206. >
  13207. <Icon name="mdi:send" />
  13208. </button>
  13209. </div>
  13210. </div>
  13211. </div>
  13212. </div>
  13213. </template>
  13214. <script setup>
  13215. import { ref, nextTick, onMounted } from 'vue'
  13216. const { sendStreamMessage } = useClaude()
  13217. const messages = ref([])
  13218. const newMessage = ref('')
  13219. const isLoading = ref(false)
  13220. const messagesContainer = ref(null)
  13221. const messageInput = ref(null)
  13222. const scrollToBottom = () => {
  13223. nextTick(() => {
  13224. if (messagesContainer.value) {
  13225. messagesContainer.value.scrollTop = messagesContainer.value.scrollHeight
  13226. }
  13227. })
  13228. }
  13229. const handleEnter = (event) => {
  13230. if (!event.shiftKey) {
  13231. sendMessage()
  13232. } else {
  13233. newMessage.value += '\n'
  13234. }
  13235. }
  13236. const sendMessage = async () => {
  13237. if (!newMessage.value.trim() || isLoading.value) return
  13238. const userMessage = newMessage.value.trim()
  13239. newMessage.value = ''
  13240. messages.value.push({
  13241. role: 'user',
  13242. content: userMessage
  13243. })
  13244. scrollToBottom()
  13245. isLoading.value = true
  13246. const assistantMessage = {
  13247. role: 'assistant',
  13248. content: ''
  13249. }
  13250. messages.value.push(assistantMessage)
  13251. scrollToBottom()
  13252. try {
  13253. const result = await sendStreamMessage(
  13254. userMessage,
  13255. messages.value.slice(0, -1),
  13256. (chunk, fullResponse) => {
  13257. assistantMessage.content = fullResponse
  13258. scrollToBottom()
  13259. }
  13260. )
  13261. if (!result.success) {
  13262. assistantMessage.content = `오류가 발생했습니다: ${result.error}`
  13263. }
  13264. } catch (error) {
  13265. assistantMessage.content = `오류가 발생했습니다: ${error.message}`
  13266. } finally {
  13267. isLoading.value = false
  13268. scrollToBottom()
  13269. }
  13270. }
  13271. onMounted(() => {
  13272. if (messageInput.value) {
  13273. messageInput.value.focus()
  13274. }
  13275. })
  13276. </script>
  13277. <style scoped>
  13278. .claude-chat {
  13279. height: 100vh;
  13280. display: flex;
  13281. flex-direction: column;
  13282. }
  13283. .chat-container {
  13284. flex: 1;
  13285. display: flex;
  13286. flex-direction: column;
  13287. max-width: 800px;
  13288. margin: 0 auto;
  13289. padding: 20px;
  13290. height: 100%;
  13291. }
  13292. .messages {
  13293. flex: 1;
  13294. overflow-y: auto;
  13295. padding: 20px 0;
  13296. scroll-behavior: smooth;
  13297. }
  13298. .message {
  13299. margin-bottom: 20px;
  13300. display: flex;
  13301. }
  13302. .message.user {
  13303. justify-content: flex-end;
  13304. }
  13305. .message.assistant {
  13306. justify-content: flex-start;
  13307. }
  13308. .message-content {
  13309. max-width: 70%;
  13310. padding: 15px;
  13311. border-radius: 15px;
  13312. word-wrap: break-word;
  13313. }
  13314. .message.user .message-content {
  13315. background-color: #007bff;
  13316. color: white;
  13317. border-bottom-right-radius: 5px;
  13318. }
  13319. .message.assistant .message-content {
  13320. background-color: #f8f9fa;
  13321. color: #333;
  13322. border-bottom-left-radius: 5px;
  13323. border: 1px solid #e9ecef;
  13324. }
  13325. .message-role {
  13326. font-size: 12px;
  13327. font-weight: 600;
  13328. margin-bottom: 5px;
  13329. opacity: 0.7;
  13330. }
  13331. .message-text {
  13332. white-space: pre-wrap;
  13333. line-height: 1.5;
  13334. }
  13335. .input-container {
  13336. padding: 20px 0;
  13337. border-top: 1px solid #e9ecef;
  13338. }
  13339. .input-wrapper {
  13340. display: flex;
  13341. gap: 10px;
  13342. align-items: flex-end;
  13343. }
  13344. textarea {
  13345. flex: 1;
  13346. min-height: 40px;
  13347. max-height: 120px;
  13348. padding: 12px 15px;
  13349. border: 1px solid #ddd;
  13350. border-radius: 20px;
  13351. resize: none;
  13352. font-family: inherit;
  13353. font-size: 14px;
  13354. line-height: 1.4;
  13355. outline: none;
  13356. transition: border-color 0.2s;
  13357. }
  13358. textarea:focus {
  13359. border-color: #007bff;
  13360. }
  13361. .send-button {
  13362. width: 40px;
  13363. height: 40px;
  13364. border: none;
  13365. border-radius: 50%;
  13366. background-color: #007bff;
  13367. color: white;
  13368. cursor: pointer;
  13369. display: flex;
  13370. align-items: center;
  13371. justify-content: center;
  13372. transition: background-color 0.2s;
  13373. }
  13374. .send-button:hover:not(:disabled) {
  13375. background-color: #0056b3;
  13376. }
  13377. .send-button:disabled {
  13378. background-color: #ccc;
  13379. cursor: not-allowed;
  13380. }
  13381. .typing-indicator {
  13382. display: flex;
  13383. gap: 4px;
  13384. align-items: center;
  13385. }
  13386. .typing-indicator span {
  13387. width: 8px;
  13388. height: 8px;
  13389. border-radius: 50%;
  13390. background-color: #007bff;
  13391. animation: typing 1.4s infinite ease-in-out;
  13392. }
  13393. .typing-indicator span:nth-child(1) {
  13394. animation-delay: -0.32s;
  13395. }
  13396. .typing-indicator span:nth-child(2) {
  13397. animation-delay: -0.16s;
  13398. }
  13399. @keyframes typing {
  13400. 0%, 80%, 100% {
  13401. transform: scale(0);
  13402. opacity: 0.5;
  13403. }
  13404. 40% {
  13405. transform: scale(1);
  13406. opacity: 1;
  13407. }
  13408. }
  13409. .loading .message-text {
  13410. display: flex;
  13411. align-items: center;
  13412. min-height: 20px;
  13413. }
  13414. </style>
  13415. </file>
  13416. <file path="components/common/footer/eventDetailView.vue">
  13417. <template>
  13418. <v-dialog v-model="props.isEventDetailModal" persistent width="62.5rem">
  13419. <div class="v-common-dialog-wrapper custom-dialog">
  13420. <div class="modal-tit">
  13421. <strong>이벤트 이력 상세 정보</strong>
  13422. <button class="btn-close" @click="fnEventDetailClose()"></button>
  13423. </div>
  13424. <div class="v-common-dialog-content">
  13425. <div class="form-style1 col4 shadow--type">
  13426. <table>
  13427. <colgroup>
  13428. <col style="width:8.75rem;">
  13429. <col style="calc(50% - 8.75rem);">
  13430. <col style="width:8.75rem;">
  13431. <col style="calc(50% - 8.75rem);">
  13432. </colgroup>
  13433. <tbody>
  13434. <tr>
  13435. <th>번호</th>
  13436. <td>{{ props.eventDetailData.no }}</td>
  13437. <th>이벤트 유형</th>
  13438. <td>{{ props.eventDetailData.eventType }}</td>
  13439. </tr>
  13440. <tr>
  13441. <th>이벤트 코드</th>
  13442. <td>{{ props.eventDetailData.eventCode }}</td>
  13443. <th>심각도</th>
  13444. <td class="critical">{{ props.eventDetailData.severity }}</td>
  13445. </tr>
  13446. <tr>
  13447. <th>알람 그룹</th>
  13448. <td>{{ props.eventDetailData.alarmGroup }}</td>
  13449. <th>위치</th>
  13450. <td>{{ props.eventDetailData.location }}</td>
  13451. </tr>
  13452. <tr>
  13453. <th>테넌트 이름</th>
  13454. <td>{{ props.eventDetailData.tenantName }}</td>
  13455. <th>수집 시스템</th>
  13456. <td>{{ props.eventDetailData.emsName }}</td>
  13457. </tr>
  13458. <tr>
  13459. <th>NE 그룹 이름</th>
  13460. <td>{{ props.eventDetailData.neGroup }}</td>
  13461. <th>NE 이름</th>
  13462. <td>{{ props.eventDetailData.neName }}</td>
  13463. </tr>
  13464. <tr>
  13465. <th>발생 원인</th>
  13466. <td colspan="3">{{ props.eventDetailData.probcause }}</td>
  13467. </tr>
  13468. <tr>
  13469. <th>추가 정보</th>
  13470. <td colspan="3">{{ props.eventDetailData.additionalText }}</td>
  13471. </tr>
  13472. <tr>
  13473. <th>발생 시간</th>
  13474. <td>{{ props.eventDetailData.alarmTime }}</td>
  13475. <th>상태</th>
  13476. <td>{{ props.eventDetailData.alarmState }}</td>
  13477. </tr>
  13478. </tbody>
  13479. </table>
  13480. </div>
  13481. <div class="form-style1 col4 shadow--type mt--125rem" v-if="props.currentAlarmYn">
  13482. <table>
  13483. <colgroup>
  13484. <col style="width:8.75rem;">
  13485. <col style="calc(50% - 8.75rem);">
  13486. <col style="width:8.75rem;">
  13487. <col style="calc(50% - 8.75rem);">
  13488. </colgroup>
  13489. <tbody>
  13490. <tr>
  13491. <th>인지 시간</th>
  13492. <td>{{ props.eventDetailData.ackTime }}</td>
  13493. <th>인지 사용자</th>
  13494. <td>{{ props.eventDetailData.ackUser }}</td>
  13495. </tr>
  13496. <tr>
  13497. <th>인지 시스템</th>
  13498. <td colspan="3">{{ props.eventDetailData.ackSystem }}</td>
  13499. </tr>
  13500. </tbody>
  13501. </table>
  13502. </div>
  13503. <div class="form-style1 col4 shadow--type mt--125rem" v-if="props.currentAlarmYn">
  13504. <table>
  13505. <colgroup>
  13506. <col style="width:8.75rem;">
  13507. <col style="calc(50% - 8.75rem);">
  13508. <col style="width:8.75rem;">
  13509. <col style="calc(50% - 8.75rem);">
  13510. </colgroup>
  13511. <tbody>
  13512. <tr>
  13513. <th>해제 시간</th>
  13514. <td>{{ props.eventDetailData.clearTime }}</td>
  13515. <th>해제 사용자</th>
  13516. <td>{{ props.eventDetailData.clearUser }}</td>
  13517. </tr>
  13518. <tr>
  13519. <th>해제 시스템</th>
  13520. <td colspan="3">{{ props.eventDetailData.clearSystem }}</td>
  13521. </tr>
  13522. </tbody>
  13523. </table>
  13524. </div>
  13525. <div class="form-style1 col4 shadow--type mt--125rem" v-if="!props.currentAlarmYn">
  13526. <table>
  13527. <colgroup>
  13528. <col style="width:8.75rem;">
  13529. <col style="calc(50% - 8.75rem);">
  13530. <col style="width:8.75rem;">
  13531. <col style="calc(50% - 8.75rem);">
  13532. </colgroup>
  13533. <tbody>
  13534. <tr>
  13535. <th>인지/해제 사용자</th>
  13536. <td>{{ props.eventDetailData.modifyUser }}</td>
  13537. <th>인지/해제 시스템</th>
  13538. <td>{{ props.eventDetailData.modifySystem }}</td>
  13539. </tr>
  13540. </tbody>
  13541. </table>
  13542. </div>
  13543. </div>
  13544. <div class="btn-wrap">
  13545. <v-btn class="custom-btn btn-blue mini" @click="fnEventDetailClose()"><i class="ico"></i>확인</v-btn></div>
  13546. </div>
  13547. </v-dialog>
  13548. </template>
  13549. <script setup>
  13550. import { useI18n } from 'vue-i18n';
  13551. /***********************
  13552. * import
  13553. ************************/
  13554. /***********************
  13555. * plugins inject
  13556. ************************/
  13557. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  13558. // props
  13559. const props = defineProps({
  13560. isEventDetailModal: Boolean,
  13561. eventDetailData: Object,
  13562. currentAlarmYn: Boolean //true:currentAlarm활성화
  13563. })
  13564. // 참조가능 데이터 설정
  13565. defineExpose({
  13566. fnInit
  13567. })
  13568. const emit = defineEmits(['closeModal'])
  13569. const i18n = useI18n()
  13570. const detailData = ref({})
  13571. function fnInit(){
  13572. // 데이터 초기화
  13573. }
  13574. function fnEventDetailClose() {
  13575. emit('closeModal')
  13576. }
  13577. </script>
  13578. </file>
  13579. <file path="components/common/header/modal/myInfoUpdate.vue">
  13580. <template>
  13581. <!-- 내 정보 수정 -->
  13582. <v-dialog v-model="props.isMyInfoUpdateModal" persistent width="50rem">
  13583. <div class="v-common-dialog-wrapper custom-dialog">
  13584. <div class="modal-tit">
  13585. <strong>{{$t('common.header.myInfoUpdateModal.title')}}</strong>
  13586. <button class="btn-close" @click="fnMyInfoClose()"></button>
  13587. </div>
  13588. <div class="v-common-dialog-content">
  13589. <div class="form-style1 col4 shadow--type">
  13590. <table>
  13591. <colgroup>
  13592. <col style="width:9.375rem;">
  13593. <col style="width: 9.5rem">
  13594. <col style="width:7.375rem;">
  13595. <col style="width: calc(50% - 0.375rem)">
  13596. </colgroup>
  13597. <tbody>
  13598. <tr>
  13599. <th>{{$t('common.header.myInfoUpdateModal.id')}}</th>
  13600. <td>{{ myInfo.id }}</td>
  13601. <th>{{$t('common.header.myInfoUpdateModal.name')}}</th>
  13602. <td>{{ myInfo.name }}</td>
  13603. </tr>
  13604. <tr>
  13605. <th>{{$t('common.header.myInfoUpdateModal.tenantName')}}</th>
  13606. <td>{{ myInfo.tenantName }}</td>
  13607. <th>{{$t('common.header.myInfoUpdateModal.priority')}}</th>
  13608. <td>{{ myInfo.accountRole }}</td>
  13609. </tr>
  13610. <tr>
  13611. <th>{{$t('common.header.myInfoUpdateModal.alarmMsgType')}}</th>
  13612. <td>{{ myInfo.emailRecvYN === 'Y' ? $t('common.header.myInfoUpdateModal.alarmEmail') : '' }}{{ myInfo.smsRecvYN === 'Y' ? ' / '+$t('common.header.myInfoUpdateModal.alarmMobile') : '' }}</td>
  13613. <th>{{$t('common.header.myInfoUpdateModal.alarmMsgTime')}}</th>
  13614. <td>{{ myInfo.recvSdate }} ~ {{ myInfo.recvEdate }}</td>
  13615. </tr>
  13616. <tr v-if="!errorCheck.pwdChg">
  13617. <th>{{$t('common.header.myInfoUpdateModal.password')}}</th>
  13618. <td>
  13619. <v-btn class="custom-btn btn-password" style="width: 7.875rem;" @click="errorCheck.pwdChg = true">{{$t('common.header.myInfoUpdateModal.passwordChange')}}</v-btn>
  13620. </td>
  13621. </tr>
  13622. <tr v-if="errorCheck.pwdChg">
  13623. <th>{{$t('common.header.myInfoUpdateModal.newPassword')}}<span class="cir"></span></th>
  13624. <td colspan="3">
  13625. <div class="txt-field-box" :class="errorCheck.newPassword1Error ? 'error' : ''">
  13626. <v-text-field type="password" :placeholder="$t('common.header.myInfoUpdateModal.newPasswordDesc')" class="custom-input mini2" v-model="myInfo.newPassword1" style="width:100%;" @input="setInputField('newPassword1')"></v-text-field>
  13627. <i class="ico"></i>
  13628. </div>
  13629. </td>
  13630. </tr>
  13631. <tr v-if="errorCheck.pwdChg">
  13632. <th class="align-top">{{$t('common.header.myInfoUpdateModal.newPassword2')}}<span class="cir"></span></th>
  13633. <td colspan="3">
  13634. <div class="txt-field-box" :class="errorCheck.newPassword2Error ? 'error' : ''">
  13635. <v-text-field type="password" :placeholder="$t('common.header.myInfoUpdateModal.newPasswordDesc2')" class="custom-input mini2" style="width:100%;" v-model="myInfo.newPassword2" @input="setInputField('newPassword2')"></v-text-field>
  13636. <i class="ico"></i>
  13637. </div>
  13638. <p class="error-txt" v-if="errorCheck.newPassword1Error || errorCheck.newPassword2Error">{{ errorCheck.inputValidPasswordTxt }}</p>
  13639. </td>
  13640. </tr>
  13641. <tr>
  13642. <th class="align-top">{{$t('common.header.myInfoUpdateModal.email')}}<span class="cir"></span></th>
  13643. <td colspan="3" class="pr--0">
  13644. <div class="input-wrap">
  13645. <div class="txt-field-box" :class="errorCheck.isEmailErr ? 'error' : ''">
  13646. <v-text-field placeholder="admin@test.com" class="custom-input mini2" v-model="myInfo.email" style="width: 100%" @input="setInputField('email')"></v-text-field>
  13647. <i class="ico"></i>
  13648. </div>
  13649. <v-btn class="custom-btn btn-black mini2" style="width:5.1875rem; height:2.25rem;" @click="fnDupCheck('EMAIL')" :disabled="!errorCheck.isEmailBtn">{{$t('common.header.myInfoUpdateModal.dupCheck')}}</v-btn>
  13650. </div>
  13651. <p class="error-txt" v-if="errorCheck.isEmailErr">{{errorCheck.emailErrText}}</p>
  13652. <p class="success-txt" v-if="errorCheck.isEmailDupCheck">{{$t('common.header.myInfoUpdateModal.valid.dupSuccessEmail')}}</p>
  13653. </td>
  13654. </tr>
  13655. <tr>
  13656. <th>{{$t('common.header.myInfoUpdateModal.phone')}}<span class="cir"></span></th>
  13657. <td colspan="3" class="pr--0">
  13658. <div class="input-wrap">
  13659. <div class="txt-field-box" :class="errorCheck.isPhoneErr ? 'error' : ''">
  13660. <v-text-field placeholder="010-1234-5678" class="custom-input mini2" v-model="myInfo.phone" @input="setInputField('phone')"></v-text-field>
  13661. <i class="ico"></i>
  13662. </div>
  13663. <v-btn class="custom-btn btn-black mini2" style="width:5.1875rem; height: 2.25rem;" @click="fnDupCheck('PHONE_NUMBER')" :disabled="!errorCheck.isPhoneBtn">{{$t('common.header.myInfoUpdateModal.dupCheck')}}</v-btn>
  13664. </div>
  13665. <p class="error-txt" v-if="errorCheck.isPhoneErr">{{errorCheck.phoneErrText}}</p>
  13666. <p class="success-txt" v-if="errorCheck.isPhoneDupCheck">{{$t('common.header.myInfoUpdateModal.valid.dupSuccessPhone')}}</p>
  13667. </td>
  13668. </tr>
  13669. </tbody>
  13670. </table>
  13671. </div>
  13672. </div>
  13673. <div class="btn-wrap">
  13674. <v-btn class="custom-btn btn-white mini" @click="fnMyInfoClose()"><i class="ico"></i>
  13675. {{$t('common.cancel')}}
  13676. </v-btn>
  13677. <v-btn class="custom-btn btn-blue2 btn-mod mini" @click="fnUpdate" :disabled="!errorCheck.isUpdateBtn"><i class="ico"></i> 수정 </v-btn>
  13678. </div>
  13679. </div>
  13680. </v-dialog>
  13681. </template>
  13682. <script setup>
  13683. /***********************
  13684. * import
  13685. ************************/
  13686. import apiUrl from '@/composables/useApi';
  13687. import useUtil from '@/composables/useUtil';
  13688. import useValid from '@/composables/useValid';
  13689. import { useI18n } from 'vue-i18n';
  13690. /***********************
  13691. * plugins inject
  13692. ************************/
  13693. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  13694. // 현재 입력 중인 필드를 설정하는 함수
  13695. const setInputField = (name) => {
  13696. fnValidCheck(name)
  13697. }
  13698. // props
  13699. const props = defineProps({
  13700. isMyInfoUpdateModal: Boolean,
  13701. })
  13702. // 참조가능 데이터 설정
  13703. defineExpose({
  13704. fnInit
  13705. })
  13706. // 발신 이벤트 선언
  13707. const emit = defineEmits(['closeModal'])
  13708. const i18n = useI18n()
  13709. /***********************
  13710. * data & created
  13711. ************************/
  13712. const errorCheck = ref({
  13713. pwdChg: false, // 비밀번호 활성화 YN
  13714. newPassword1Error: false, // 신규비밀번호 입력 에러
  13715. newPassword2Error: false, // 변경비밀번호 체크 입력 에러
  13716. inputValidPasswordTxt: '', // 비밀번호 validation 문구
  13717. isEmailErr: false, // 이메일 에러
  13718. emailErrText: 'success', // 이메일 중복체크 문구
  13719. isEmailBtn: false,
  13720. isPhoneErr: false, // 전화번호 에러
  13721. phoneErrText: 'success', // 전화번호 중복체크 문구
  13722. isPhoneBtn: false,
  13723. isEmailDupCheck: false, //
  13724. isPhoneDupCheck: false,
  13725. isUpdateBtn: false,
  13726. })
  13727. const myInfo = ref({
  13728. id: '',
  13729. name: '',
  13730. newPassword1: '',
  13731. newPassword2: '',
  13732. tenantName: '',
  13733. accountRole: '',
  13734. email: '',
  13735. phone: ''
  13736. })
  13737. const myInfoClone = ref({})
  13738. const errorCheckClone = ref({})
  13739. /*********************
  13740. * computed
  13741. *********************/
  13742. // 변경사항 여부 체크
  13743. const isUpdateContents = computed(() => {
  13744. const isUpdate = JSON.stringify(myInfo.value) != JSON.stringify(myInfoClone.value)
  13745. return isUpdate
  13746. })
  13747. watch(() => errorCheck.value, (newV, oldV) => {
  13748. let isEmailDupCheck = true
  13749. let isPhoneDupCheck = true
  13750. // 비밀번호 입력 란이 활성화 되어있을 경우
  13751. if(errorCheck.value.pwdChg) {
  13752. if(errorCheck.value.inputValidPasswordTxt === 'success') {
  13753. if(errorCheck.value.emailErrText != 'success') isEmailDupCheck = false
  13754. else isEmailDupCheck = true
  13755. if(errorCheck.value.phoneErrText != 'success') isPhoneDupCheck = false
  13756. else isPhoneDupCheck = true
  13757. if(isEmailDupCheck && isPhoneDupCheck) {
  13758. errorCheck.value.isUpdateBtn = true
  13759. } else {
  13760. errorCheck.value.isUpdateBtn = false
  13761. }
  13762. } else {
  13763. errorCheck.value.isUpdateBtn = false
  13764. }
  13765. } else {
  13766. if(errorCheck.value.emailErrText != 'success') isEmailDupCheck = false
  13767. else isEmailDupCheck = true
  13768. if(errorCheck.value.phoneErrText != 'success') isPhoneDupCheck = false
  13769. else isPhoneDupCheck = true
  13770. if(isEmailDupCheck && isPhoneDupCheck) {
  13771. errorCheck.value.isUpdateBtn = true
  13772. } else {
  13773. errorCheck.value.isUpdateBtn = false
  13774. }
  13775. }
  13776. },{ deep: true, immediate: false })
  13777. /***********************
  13778. * Methods
  13779. ************************/
  13780. function fnInit(){
  13781. // 데이터 초기화
  13782. errorCheckClone.value = _cloneDeep(errorCheck.value)
  13783. fnGetMyInfo()
  13784. }
  13785. /**
  13786. * @SCRIPT
  13787. * 내 정보 조회
  13788. */
  13789. function fnGetMyInfo(){
  13790. useAxios().get(apiUrl.myInfo).then((res) => {
  13791. let dataObj = {}
  13792. dataObj = res.data.data
  13793. dataObj.accessToken = useAuthStore().getAccessToken
  13794. dataObj.refreshToken = useAuthStore().getRefreshToken
  13795. useAuthStore().setAuth(dataObj)
  13796. myInfo.value = {
  13797. id: dataObj.accountId,
  13798. name: dataObj.accountName,
  13799. newPassword1: '',
  13800. newPassword2: '',
  13801. tenantName: dataObj.tenantName,
  13802. accountRole: dataObj.accountRole,
  13803. emailRecvYN: dataObj.emailRecvYN,
  13804. smsRecvYN: dataObj.smsRecvYN,
  13805. recvSdate: $dayjs(dataObj.recvSdate).format('YYYY-MM-DD HH:mm:ss'),
  13806. recvEdate: $dayjs(dataObj.recvEdate).format('YYYY-MM-DD HH:mm:ss'),
  13807. email: dataObj.email,
  13808. phone: dataObj.phoneNumber
  13809. }
  13810. myInfoClone.value = _cloneDeep(myInfo.value)
  13811. $log.debug("[myInfoUpdate][fnGetMyInfo][success]")
  13812. }).catch((error)=>{
  13813. $log.debug("[myInfoUpdate][fnGetMyInfo][error]")
  13814. useErrorHandler().fnSetCommErrorHandle(error, fnGetMyInfo)
  13815. }).finally(()=>{
  13816. $log.debug("[myInfoUpdate][fnGetMyInfo][finished]")
  13817. })
  13818. }
  13819. /**
  13820. * @SCRIPT
  13821. * 이메일 validation 검사 및 중복확인 처리
  13822. */
  13823. function fnDupCheck(type){
  13824. if(type === 'EMAIL') {
  13825. if(myInfo.value.email === myInfoClone.value.email) {
  13826. errorCheck.value.isEmailErr = true
  13827. errorCheck.value.isEmailDupCheck = false
  13828. errorCheck.value.emailErrText = i18n.t('common.header.myInfoUpdateModal.valid.dupEmail')
  13829. } else {
  13830. fnDupCheckProc('EMAIL')
  13831. }
  13832. } else {
  13833. if(myInfo.value.phone.replace(/\D/g, '') === myInfoClone.value.phone.replace(/\D/g, '')) {
  13834. errorCheck.value.isPhoneErr = true
  13835. errorCheck.value.isPhoneDupCheck = false
  13836. errorCheck.value.phoneErrText = i18n.t('common.header.myInfoUpdateModal.valid.dupPhone')
  13837. } else {
  13838. fnDupCheckProc('PHONE_NUMBER')
  13839. }
  13840. }
  13841. }
  13842. function fnMyInfoClose() {
  13843. errorCheck.value = _cloneDeep(errorCheckClone.value)
  13844. emit('closeModal')
  13845. }
  13846. /**
  13847. * @API
  13848. * 이메일 & 전화번호 중복체크
  13849. */
  13850. function fnDupCheckProc(type){
  13851. let _req = {
  13852. checkType: type
  13853. }
  13854. if(type === 'EMAIL') {
  13855. _req.checkValue = myInfo.value.email
  13856. } else {
  13857. _req.checkValue = myInfo.value.phone
  13858. }
  13859. useAxios().get(apiUrl.accountDupChk, {params: _req}).then((res) => {
  13860. if(type === 'EMAIL') {
  13861. errorCheck.value.isEmailDupCheck = true
  13862. errorCheck.value.emailErrText = 'success'
  13863. } else {
  13864. errorCheck.value.isPhoneDupCheck = true
  13865. errorCheck.value.phoneErrText = 'success'
  13866. }
  13867. $log.debug("[myInfoUpdate][fnDupCheckProc][success]")
  13868. }).catch((error)=>{
  13869. $log.debug("[myInfoUpdate][fnDupCheckProc][error]")
  13870. // 에러 메시지 체크
  13871. let errData = error.response.data
  13872. let errorMessage = ''
  13873. if(errData.message === 'DUPLICATE_ERROR') {
  13874. if(type === 'EMAIL') {
  13875. errorMessage = i18n.t('common.header.myInfoUpdateModal.valid.dupFailEmail')
  13876. errorCheck.value.isEmailBtn = false
  13877. errorCheck.value.isEmailErr = true
  13878. errorCheck.value.emailErrText = errorMessage
  13879. } else {
  13880. errorMessage = i18n.t('common.header.myInfoUpdateModal.valid.dupFailPhone')
  13881. errorCheck.value.isPhoneBtn = false
  13882. errorCheck.value.isPhoneErr = true
  13883. errorCheck.value.phoneErrText = errorMessage
  13884. }
  13885. }
  13886. //$toast.error(errorMessage)
  13887. }).finally(()=>{
  13888. $log.debug("[myInfoUpdate][fnDupCheckProc][finished]")
  13889. })
  13890. }
  13891. /**
  13892. * @API
  13893. * 수정API
  13894. */
  13895. function fnUpdate(){
  13896. // // 1. 변경사항 체크 2. 필수입력값 체크 3. validation 검사
  13897. if(isUpdateContents.value){
  13898. let _req = {
  13899. newPassword: btoa(myInfo.value.newPassword2),
  13900. email: myInfo.value.email,
  13901. phoneNumber: myInfo.value.phone
  13902. }
  13903. useAxios().post(apiUrl.myInfoUpdate, _req).then((res) => {
  13904. useAuthStore().setHeaderMyInfo(_req)
  13905. console.log('%c 내 정보가 수정되었습니다.' ,'color:#bada55','')
  13906. $toast.success(i18n.t('common.header.myInfoUpdateModal.successMyInfo'))
  13907. emit('closeModal')
  13908. $log.debug("[myInfoUpdate][fnUpdate][success]")
  13909. }).catch((error)=>{
  13910. $log.debug("[myInfoUpdate][fnUpdate][error]")
  13911. useErrorHandler().fnSetCommErrorHandle(error, fnUpdate)
  13912. }).finally(()=>{
  13913. $log.debug("[myInfoUpdate][fnUpdate][finished]")
  13914. })
  13915. }
  13916. }
  13917. /**
  13918. * @SCRIPT
  13919. * 비밀번호확인 validation
  13920. */
  13921. function fnValidCheck(type) {
  13922. if(type === 'newPassword1') {
  13923. let digits1 = myInfo.value.phone.replace(/\D/g, '')
  13924. let digits2 = myInfo.value.newPassword1.replace(/\D/g, '')
  13925. let lastEightDigits1 = digits1.slice(-8)
  13926. let lastEightDigits2 = digits2.slice(-8)
  13927. if(_includes(myInfo.value.newPassword1 , myInfo.value.id)) {
  13928. // 아이디는 비밀번호로 사용할 수 없습니다.
  13929. errorCheck.value.newPassword1Error = true
  13930. errorCheck.value.inputValidPasswordTxt = i18n.t('common.header.myInfoUpdateModal.valid.includeId')
  13931. } else if(lastEightDigits1 === lastEightDigits2) {
  13932. // 연락처와 유사한 비밀번호는 사용할 수 없습니다.
  13933. errorCheck.value.newPassword1Error = true
  13934. errorCheck.value.inputValidPasswordTxt = i18n.t('common.header.myInfoUpdateModal.valid.includePhone')
  13935. } else if(/(.)\1{2,}/.test(myInfo.value.newPassword1)) {
  13936. // 3자리 이상 연속 숫자, 문자는 사용 불가합니다.
  13937. errorCheck.value.newPassword1Error = true
  13938. errorCheck.value.inputValidPasswordTxt = i18n.t('common.header.myInfoUpdateModal.valid.continuousUse')
  13939. } else if(!/^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,30}$/i.test(myInfo.value.newPassword1)) {
  13940. // 비밀번호는 문자,숫자,특수문자 조합 8~30자리로입력
  13941. errorCheck.value.newPassword1Error = true
  13942. errorCheck.value.inputValidPasswordTxt = i18n.t('common.header.myInfoUpdateModal.valid.validPassword')
  13943. } else {
  13944. errorCheck.value.newPassword1Error = false
  13945. }
  13946. } else if(type === 'newPassword2') {
  13947. if(myInfo.value.newPassword1 != myInfo.value.newPassword2) {
  13948. // 신규비밀번호가 일치 하지 않습니다.
  13949. errorCheck.value.newPassword2Error = true
  13950. errorCheck.value.inputValidPasswordTxt = i18n.t('common.header.myInfoUpdateModal.valid.missmatchPassword')
  13951. } else if(!/^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,30}$/i.test(myInfo.value.newPassword1)) {
  13952. errorCheck.value.newPassword2Error = true
  13953. errorCheck.value.inputValidPasswordTxt = i18n.t('common.header.myInfoUpdateModal.valid.validPassword')
  13954. } else {
  13955. if(!errorCheck.value.newPassword1Error) {
  13956. errorCheck.value.newPassword2Error = false
  13957. errorCheck.value.inputValidPasswordTxt = 'success'
  13958. }
  13959. }
  13960. } else if(type === 'email') {
  13961. let isValid = useValid.emailStrChk(myInfo.value.email)
  13962. if(useUtil.isNull(myInfo.value.email)) {
  13963. errorCheck.value.isEmailErr = true
  13964. errorCheck.value.isEmailBtn = false
  13965. errorCheck.value.isEmailDupCheck = false
  13966. errorCheck.value.emailErrText = i18n.t('login.findId.valid.isNullEmail')
  13967. } else if(!isValid) {
  13968. errorCheck.value.isEmailErr = true
  13969. errorCheck.value.isEmailBtn = false
  13970. errorCheck.value.isEmailDupCheck = false
  13971. errorCheck.value.emailErrText = i18n.t('login.findId.valid.isTypeEmail')
  13972. } else {
  13973. errorCheck.value.isEmailErr = false
  13974. errorCheck.value.isEmailBtn = true
  13975. }
  13976. }else {
  13977. // phone
  13978. //let isValid = useValid.phoneStrChk(myInfo.value.phone)
  13979. myInfo.value.phone = useValid.p5gNumCheck(myInfo.value.phone, 'phone')
  13980. if(useUtil.isNull(myInfo.value.phone) || myInfo.value.phone.length <= 10) {
  13981. errorCheck.value.isPhoneErr = true
  13982. errorCheck.value.isPhoneBtn = false
  13983. errorCheck.value.isPhoneDupCheck = false
  13984. errorCheck.value.phoneErrText = i18n.t('common.header.myInfoUpdateModal.valid.validPhone')
  13985. } else {
  13986. errorCheck.value.isPhoneErr = false
  13987. errorCheck.value.isPhoneBtn = true
  13988. }
  13989. }
  13990. }
  13991. </script>
  13992. </file>
  13993. <file path="components/common/header/modal/passwordCheck.vue">
  13994. <template>
  13995. <!-- 비밀번호 확인 -->
  13996. <v-dialog v-model="props.isPwdConfirmModal" persistent width="32.81rem">
  13997. <div class="v-common-dialog-wrapper custom-dialog">
  13998. <div class="modal-tit">
  13999. <strong>{{$t('common.header.passwdCheckModal.title')}}</strong>
  14000. <button class="btn-close" @click="$emit('closeModal')"></button>
  14001. </div>
  14002. <div class="v-common-dialog-content">
  14003. <div class="info-mod">
  14004. <p class="mod-txt">
  14005. {{$t('common.header.passwdCheckModal.desc')}}
  14006. </p>
  14007. <div class="txt-field-box" :class="!isErrorTxt ? 'error' : ''">
  14008. <v-text-field v-model="password" type="password" placeholder="Password" class="custom-input" @keydown.enter="fnClickOk" @input="setInputField()"></v-text-field>
  14009. <i class="ico"></i>
  14010. </div>
  14011. <p class="error-txt" v-if="!isErrorTxt">{{ $t('common.header.valid.errorPasswd') }}</p>
  14012. </div>
  14013. </div>
  14014. <div class="btn-wrap">
  14015. <v-btn class="custom-btn btn-white mini" @click="$emit('closeModal')"><i class="ico"></i>{{$t('common.cancel')}}</v-btn>
  14016. <v-btn class="custom-btn btn-blue mini" @click="fnClickOk"><i class="ico"></i>{{$t('common.confirm')}}</v-btn>
  14017. </div>
  14018. </div>
  14019. </v-dialog>
  14020. </template>
  14021. <script setup>
  14022. /***********************
  14023. * import
  14024. ************************/
  14025. import apiUrl from '@/composables/useApi';
  14026. import useUtil from '@/composables/useUtil';
  14027. import { useI18n } from 'vue-i18n';
  14028. /***********************
  14029. * plugins inject
  14030. ************************/
  14031. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  14032. // props
  14033. const props = defineProps({
  14034. isPwdConfirmModal: Boolean,
  14035. })
  14036. // 참조가능 데이터 설정
  14037. defineExpose({
  14038. fnInit
  14039. })
  14040. /**
  14041. * @SCRIPT
  14042. * 비밀번호 입력 validation체크
  14043. */
  14044. const setInputField = () => {
  14045. if(useUtil.isNull(password.value) || !/^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,30}$/i.test(password.value)) {
  14046. //if(useUtil.isNull(password.value)) {
  14047. isErrorTxt.value = false
  14048. } else {
  14049. isErrorTxt.value = true
  14050. }
  14051. }
  14052. // 발신 이벤트 선언
  14053. const emit = defineEmits(['closeModal', 'openMyInfoUpdateModal'])
  14054. const i18n = useI18n()
  14055. /***********************
  14056. * data & created
  14057. ************************/
  14058. const password = ref("")
  14059. const isErrorTxt = ref(true)
  14060. /***********************
  14061. * Methods
  14062. ************************/
  14063. function fnInit(){
  14064. // 데이터 초기화
  14065. password.value = ""
  14066. isErrorTxt.value = true
  14067. }
  14068. /**
  14069. * 확인
  14070. */
  14071. function fnClickOk(){
  14072. setInputField()
  14073. if(isErrorTxt.value) {
  14074. fnPasswordCheck()
  14075. }
  14076. }
  14077. /**
  14078. * @API
  14079. * 비밀번호 확인
  14080. */
  14081. function fnPasswordCheck(){
  14082. let _req = {
  14083. username: useAuthStore().getAccountId,
  14084. password: btoa(password.value)
  14085. }
  14086. useAxios().post(apiUrl.idPwCheck, _req).then((res) => {
  14087. emit('closeModal')
  14088. emit('openMyInfoUpdateModal')
  14089. $log.debug("[passwordCheck][fnPasswordCheck][success]")
  14090. }).catch((error)=>{
  14091. let errorData = error.response.data
  14092. let errorMessage = ''
  14093. if(errorData.code === '2002') {
  14094. // 비밀번호 불일치 XX회
  14095. errorMessage += i18n.t('login.sendFail')+' '+Number(errorData.reason)+'회 오류'
  14096. $toast.error(errorMessage)
  14097. }
  14098. $log.debug("[passwordCheck][fnPasswordCheck][error]")
  14099. }).finally(()=>{
  14100. $log.debug("[passwordCheck][fnPasswordCheck][finished]")
  14101. })
  14102. }
  14103. </script>
  14104. </file>
  14105. <file path="components/common/header/modal/privacyPop.vue">
  14106. <template>
  14107. <!-- 이용약관 -->
  14108. <v-dialog v-model="props.isPrivacyConfirmModal" persistent width="62.5rem">
  14109. <div class="v-common-dialog-wrapper custom-dialog alert">
  14110. <div class="modal-tit">
  14111. <strong>{{ langType === 'kr' ? props.privacyDetail.kr.title : props.privacyDetail.en.title }}</strong>
  14112. <button class="btn-close" @click="$emit('closeModal');"></button>
  14113. </div>
  14114. <div class="flag--wrap">
  14115. <div class="lang-set">
  14116. <v-select v-model="langType" :items="langTypeList" @update:modelValue="fnLangChange" variant="outlined" style="width: 9.375rem; height: 2.25rem" class="custom-select"></v-select>
  14117. </div>
  14118. </div>
  14119. <div class="v-common-dialog-content type--l">
  14120. <div class="agree--contents border--top">
  14121. <pre v-html="langType == 'kr' ? props.privacyDetail.kr.contents : props.privacyDetail.en.contents"></pre>
  14122. </div>
  14123. </div>
  14124. <div class="btn-wrap">
  14125. <div class="inner--btn--wrap">
  14126. <v-btn class="custom-btn btn-blue mini" @click="$emit('closeModal')"><i class="ico"></i>확인</v-btn>
  14127. </div>
  14128. </div>
  14129. </div>
  14130. </v-dialog>
  14131. </template>
  14132. <script setup>
  14133. /***********************
  14134. * import
  14135. ************************/
  14136. import useUtil from '@/composables/useUtil';
  14137. import { useI18n } from 'vue-i18n';
  14138. /***********************
  14139. * plugins inject
  14140. ************************/
  14141. const {$toast, $log, $dayjs, $eventBus } = useNuxtApp()
  14142. // props
  14143. const props = defineProps({
  14144. isPrivacyConfirmModal: Boolean,
  14145. privacyDetail: Object
  14146. })
  14147. // 다국어
  14148. const langTypeList = ref({})
  14149. const langType = ref('')
  14150. const emit = defineEmits(["closeModal"])
  14151. const i18n = useI18n()
  14152. watchEffect(() =>{
  14153. // 감시하고자 하는 데이터를 해당 블럭내에서 사용하면 호출된다.
  14154. // getLang.value를 감시하는 상태
  14155. fnGetEnumCode(useLangStore().getLang)
  14156. })
  14157. /***********************
  14158. * data & created
  14159. ************************/
  14160. /**
  14161. * @SCRIPT
  14162. * 다국어 기능 | 한글 영문 변경 이벤트
  14163. */
  14164. function fnLangChange() {
  14165. useLangStore().setLang(langType.value)
  14166. }
  14167. function fnGetEnumCode(lang){
  14168. lang = useUtil.nvl(lang, 'kr')
  14169. langType.value = lang
  14170. let objEnum = useEnumCode.getEnumCode(lang)
  14171. langTypeList.value = objEnum.langType
  14172. i18n.locale.value = lang
  14173. }
  14174. /***********************
  14175. * Methods
  14176. ************************/
  14177. </script>
  14178. </file>
  14179. <file path="components/common/confirmDialog.vue">
  14180. <template>
  14181. <v-dialog v-model="isOpenPop" persistent width="32.81rem">
  14182. <div class="v-common-dialog-wrapper custom-dialog alert">
  14183. <div class="modal-tit">
  14184. <strong>{{ popUpOption.title }}</strong>
  14185. <button class="btn-close" @click="fnProcNo"></button>
  14186. </div>
  14187. <!-- 신뢰할수있는 코드... 작성자만 넣을수있기때문에 -->
  14188. <div class="v-common-dialog-content">
  14189. <p class="alert-txt" v-html="popUpOption.content"></p>
  14190. </div>
  14191. <div class="btn-wrap">
  14192. <v-btn class="custom-btn btn-white mini" v-if="popUpOption.no" @click="fnProcNo"
  14193. ><i class="ico"></i>{{ popUpOption.no.text }}</v-btn
  14194. >
  14195. <v-btn class="custom-btn btn-blue mini" @click="fnProcYes"
  14196. ><i class="ico"></i>{{ popUpOption.yes.text }}</v-btn
  14197. >
  14198. </div>
  14199. </div>
  14200. </v-dialog>
  14201. </template>
  14202. <script setup>
  14203. import { useRouter, useRoute } from "vue-router";
  14204. let pageId = "confirmDialog";
  14205. const router = useRouter();
  14206. const route = useRoute();
  14207. const { $eventBus } = useNuxtApp();
  14208. // data
  14209. let isOpenPop = ref(false); // 팝업 활성화 여부
  14210. // interface inPopUpOption {
  14211. // id: string,
  14212. // title: string,
  14213. // content: string,
  14214. // yes: {
  14215. // text: string,
  14216. // param?: any,
  14217. // event?: string,
  14218. // isProc: boolean, // isProc일경우 확인 버튼을 누르면 팝업이 닫히면서 특정 동작을 해야함
  14219. // },
  14220. // no?: {
  14221. // text: string,
  14222. // isProc: boolean, // isProc일경우 확인 버튼을 누르면 팝업이 닫히면서 특정 동작을 해야함
  14223. // }
  14224. // }
  14225. let popUpOption; // 팝업 데이터
  14226. $eventBus.off("OPEN_CONFIRM_POP_UP");
  14227. $eventBus.on("OPEN_CONFIRM_POP_UP", (e) => {
  14228. popUpOption = e; // 반응형일 필요가 없다.
  14229. isOpenPop.value = true;
  14230. });
  14231. // methods
  14232. function fnProcYes() {
  14233. if (popUpOption.yes.isProc) {
  14234. if (popUpOption.yes.event)
  14235. $eventBus.emit(popUpOption.yes.event, popUpOption.yes.param);
  14236. // 하나의 컴포넌트에서 여러개의 팝업창이 필요한 경우
  14237. else $eventBus.emit(`${popUpOption.id}_PROC_YES`, popUpOption.yes.param); // 하나의 컴포넌트에서 하나의 팝업창만 열릴경우
  14238. }
  14239. if (popUpOption.reload) {
  14240. window.location.reload();
  14241. }
  14242. isOpenPop.value = false;
  14243. }
  14244. function fnProcNo() {
  14245. if (popUpOption.hasOwnProperty("no")) {
  14246. if (popUpOption.no.isProc) {
  14247. if (popUpOption.no.event)
  14248. $eventBus.emit(popUpOption.no.event, popUpOption.no.param);
  14249. else $eventBus.emit(`${popUpOption.id}_PROC_NO`, popUpOption.no.param);
  14250. }
  14251. }
  14252. if (popUpOption.reload) {
  14253. window.location.reload();
  14254. }
  14255. isOpenPop.value = false;
  14256. }
  14257. </script>
  14258. <style lang="scss"></style>
  14259. </file>
  14260. <file path="components/common/customLoading.vue">
  14261. <template>
  14262. <div v-if="getCount > 0" class="loading-container">
  14263. <div class="loading-background">
  14264. <!-- <v-icon class="cursor-default" color="black" icon="mdi-cow mdi-spin" size="200" style=""></v-icon> -->
  14265. <v-progress-circular indeterminate :size="80"></v-progress-circular>
  14266. </div>
  14267. </div>
  14268. </template>
  14269. <script setup>
  14270. import {useLoadingStore} from "~/stores/loading"
  14271. // 로딩 스토어
  14272. let store = useLoadingStore()
  14273. let { getCount } = storeToRefs(store) // state 의 경우 반응성 유지를 위해 필요
  14274. let {$log} = useNuxtApp()
  14275. $log.debug('로딩컴포넌트')
  14276. </script>
  14277. <style lang="scss" scoped>
  14278. .loading-container {
  14279. z-index: 9999 !important;
  14280. position: fixed;
  14281. top: 0;
  14282. left: 0;
  14283. width: 100%;
  14284. height: 100%;
  14285. .loading-background {
  14286. position: absolute;
  14287. top: 0;
  14288. left: 0;
  14289. width: 100%;
  14290. height: 100%;
  14291. background-color: rgba(0, 0, 0, 0.2);
  14292. display: flex;
  14293. justify-content: center;
  14294. align-items: center;
  14295. }
  14296. }
  14297. </style>
  14298. </file>
  14299. <file path="components/common/excelUpload.vue">
  14300. <template>
  14301. <v-dialog v-model="props.isExcelUploadModal" persistent width="32.8125rem">
  14302. <div class="v-common-dialog-wrapper custom-dialog">
  14303. <div class="modal-tit">
  14304. <strong>엑셀업로드</strong>
  14305. <button class="btn-close" @click="$emit('closeModal')"></button>
  14306. </div>
  14307. <div class="v-common-dialog-content">
  14308. <div class="excel-step">
  14309. <div class="excel-step-box">
  14310. <div class="excel-step-top">
  14311. <span class="step" style="width:3.9375rem">Step1</span>
  14312. <strong>양식 다운로드</strong>
  14313. </div>
  14314. <div class="excel-step-btm">
  14315. <div class="excel--inner--content">
  14316. <div class="ico"></div>
  14317. <div class="desc">
  14318. <p>일괄 등록 양식을 다운로드 받아 양식에 맞게 데이터를 입력 하고 하단의 첨부파일 등록을 통해 일괄 등록 신청을 진행하세요.</p>
  14319. <v-btn class="custom-btn mini btn-gray" @click="fnExcelFormDownload">엑셀 다운로드</v-btn>
  14320. </div>
  14321. </div>
  14322. </div>
  14323. </div>
  14324. <div class="excel-step-box">
  14325. <div class="excel-step-top">
  14326. <span class="step">Step2</span>
  14327. <strong>엑셀 일괄 업로드</strong>
  14328. </div>
  14329. <div class="excel-step-btm">
  14330. <div class="step-bg-box type2">
  14331. <p>양식에 맞게 작성을 하였다면 해당 파일을 업로드하세요.</p>
  14332. <p class="txt2">(파일 등록 시 STEP 03에서 결과 확인 가능)</p>
  14333. <div class="add-file">
  14334. <v-file-input
  14335. hide-details
  14336. @change="fnFileChange"
  14337. @click:clear="fnClearFile"
  14338. >
  14339. <template v-slot:label>
  14340. <v-btn class="custom-btn mini btn-gray" style="max-width:7.0625rem!important; height:2.25rem;">엑셀 일괄 등록</v-btn>
  14341. </template>
  14342. </v-file-input>
  14343. </div>
  14344. </div>
  14345. </div>
  14346. </div>
  14347. <div class="excel-step-box">
  14348. <div class="excel-step-top">
  14349. <span class="step">Step3</span>
  14350. <strong>일괄 등록 결과 확인</strong>
  14351. </div>
  14352. <div class="excel-step-btm">
  14353. <div class="tbl-wrapper">
  14354. <div class="tbl-wrap">
  14355. <!-- ag grid -->
  14356. <ag-grid-vue
  14357. style="width:100%; height:calc(5 * 3.15rem);"
  14358. class="ag-theme-quartz"
  14359. :gridOptions="gridOptions2"
  14360. :defaultColDef="defaultColDef"
  14361. :columnDefs="tblHeaders2"
  14362. :rowData="tblItems2"
  14363. :suppressPaginationPanel="true"
  14364. :overlayNoRowsTemplate="getExcelResultMsg"
  14365. @grid-ready="fnOnGridReady"
  14366. >
  14367. </ag-grid-vue>
  14368. </div>
  14369. </div>
  14370. </div>
  14371. </div>
  14372. </div>
  14373. </div>
  14374. <div class="btn-wrap">
  14375. <v-btn
  14376. class="custom-btn btn-white mini"
  14377. @click="$emit('closeModal')"
  14378. >
  14379. <i class="ico"></i>
  14380. 취소
  14381. </v-btn>
  14382. <v-btn class="custom-btn btn-blue mini" :disabled="isUploadStep3 === false" @click="fnUploadProc">
  14383. <i class="ico"></i>
  14384. 확인
  14385. </v-btn>
  14386. </div>
  14387. </div>
  14388. </v-dialog>
  14389. </template>
  14390. <script setup>
  14391. /***********************
  14392. * import
  14393. ************************/
  14394. import { read, utils, writeFile } from "xlsx";
  14395. import { useI18n } from "vue-i18n"
  14396. import useUtil from "@/composables/useUtil"
  14397. import useValid from "@/composables/useValid"
  14398. import "ag-grid-community/styles/ag-grid.css"
  14399. import "ag-grid-community/styles/ag-theme-quartz.css"
  14400. import { AgGridVue } from "ag-grid-vue3"
  14401. import customTextDiv from '@/components/design/customTextDiv'
  14402. /***********************
  14403. * plugins inject
  14404. ************************/
  14405. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  14406. // props
  14407. const props = defineProps({
  14408. isExcelUploadModal: Boolean,
  14409. menu: String,
  14410. imsiPrefixList: Array
  14411. });
  14412. // 참조가능 데이터 설정
  14413. defineExpose({
  14414. fnInit,
  14415. })
  14416. // 발신 이벤트 선언
  14417. const emit = defineEmits(["closeModal", "uploadProc"])
  14418. const i18n = useI18n()
  14419. /***********************
  14420. * data & created
  14421. ************************/
  14422. const tblHeaders2 = ref([
  14423. { headerName: 'No', field: 'no'},
  14424. { headerName: '엑셀 시트', field: 'headerName'},
  14425. { headerName: '엑셀 행', field: 'cellNum'},
  14426. { headerName: '실패 원인', field: 'errorMsg', cellRenderer : customTextDiv},
  14427. ])
  14428. const tblItems2 = ref([])
  14429. const excelFileNames = ref([])
  14430. const invalidData = ref([]) // 등록실패 데이터
  14431. const isUploadStep2 = ref(false) // 파일 등록 여부
  14432. const isUploadStep3 = ref(false) // 파일 데이터 유효성 통과 여부
  14433. const uploadParams = ref(null)
  14434. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  14435. const rowHeightRem = 2.65; // 원하는 rem 값
  14436. const rowHeightPx = rowHeightRem * remToPx();
  14437. // gridOption2
  14438. const gridOptions2 = {
  14439. columnDefs: tblHeaders2.value,
  14440. rowData: tblItems2.value, // 테이블 데이터
  14441. rowSelection : 'multiple',
  14442. autoSizeStrategy: {
  14443. type: "fitGridWidth", // width맞춤
  14444. },
  14445. headerHeight : rowHeightPx,
  14446. rowHeight: rowHeightPx,
  14447. pagination: true,
  14448. // overlayNoRowsTemplate: '<span class="no--rows--custom"><i class="ico-excel"></i>※ 엑셀 파일을 일괄 등록하세요.</span>',
  14449. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  14450. suppressRowClickSelection: true, // 행 클릭 체크박스 무시
  14451. localeText: {
  14452. noRowsToShow: i18n.t('common.noData')
  14453. },
  14454. }
  14455. const excelResultMsg = ref('<span class="no--rows--custom"><i class="ico-excel"></i>※ 엑셀 파일을 일괄 등록하세요.</span>')
  14456. // grid default 옵션
  14457. const defaultColDef = ref({
  14458. lockVisible: true, // 열을 그리드 밖으로 꺼내지 않음
  14459. })
  14460. const gridApi = shallowRef()
  14461. const isExcel = ref(false)
  14462. const getExcelResultMsg = computed(() => {
  14463. if(!isExcel.value) {
  14464. return '<span class="no--rows--custom"><i class="ico-excel"></i>※ 엑셀 파일을 일괄 등록하세요.</span>'
  14465. }else{
  14466. return '<span class="no--rows--custom"><i class="ico-excel"></i>※ 등록한 파일의 데이터가 정상입니다.</span>'
  14467. }
  14468. })
  14469. /***********************
  14470. * Methods
  14471. ************************/
  14472. function fnInit() {
  14473. tblItems2.value = []
  14474. isUploadStep2.value = false
  14475. isUploadStep3.value = false
  14476. uploadParams.value = null
  14477. invalidData.value = []
  14478. }
  14479. /**
  14480. * 엑셀 양식 다운로드
  14481. */
  14482. function fnExcelFormDownload(){
  14483. let arrForm = ''
  14484. let arrGuide = ''
  14485. let sheetTitle = ''
  14486. let fileName = ''
  14487. if(props.menu === 'userMgmt') {
  14488. arrForm = fnSetUserInsertForm()
  14489. arrGuide = fnSetUserGuideForm()
  14490. sheetTitle = 'USERS'
  14491. fileName = '가입자일괄등록양식'
  14492. }else{
  14493. arrForm = fnSetNeInsertForm()
  14494. arrGuide = fnSetNeGuideForm()
  14495. sheetTitle = 'NE'
  14496. fileName = 'NE일괄등록양식'
  14497. }
  14498. useUtil.fnExcelFormDown(arrForm, arrGuide, sheetTitle, fileName)
  14499. }
  14500. // 가입자등록 양식 데이터
  14501. function fnSetUserInsertForm() {
  14502. let arr = []
  14503. arr.push([
  14504. "tenantName",
  14505. "imsi",
  14506. "msisdns",
  14507. "skey",
  14508. "opc",
  14509. "uplink",
  14510. "downlink",
  14511. "singleNssais",
  14512. "defaultNssais",
  14513. "dnnConf_1_nssai",
  14514. "dnnConf_1_dnn",
  14515. "dnnConf_2_nssai",
  14516. "dnnConf_2_dnn",
  14517. "dnnConf_3_nssai",
  14518. "dnnConf_3_dnn",
  14519. "dnnConf_4_nssai",
  14520. "dnnConf_4_dnn",
  14521. "dnnConf_5_nssai",
  14522. "dnnConf_5_dnn",
  14523. "dnnConf_6_nssai",
  14524. "dnnConf_6_dnn",
  14525. "dnnConf_7_nssai",
  14526. "dnnConf_7_dnn",
  14527. "dnnConf_8_nssai",
  14528. "dnnConf_8_dnn",
  14529. "dnnConf_9_nssai",
  14530. "dnnConf_9_dnn",
  14531. "dnnConf_10_nssai",
  14532. "dnnConf_10_dnn",
  14533. ])
  14534. arr.push(["KT", "45043000", "", "", "", ""])
  14535. return arr
  14536. }
  14537. // 가입자등록 양식 유효성 데이터
  14538. function fnSetUserGuideForm() {
  14539. let arr = []
  14540. arr.push(["COLUMN NAME", "입력 설명"])
  14541. arr.push(["tenantName", "테넌트 이름"])
  14542. arr.push(["imsi","IMSI, 앞 자리 값은 테넌트에 할당된 번호여야 하고 테넌트 이름과 함께 유효성 체크를 한다.",])
  14543. arr.push(["msisdns","pattern: '(msisdn-[0-9]{5,15}|extid-.+@.+|.+)' 콤마(,)로 구분하여 여러개 입력이 가능하다. -- ex) 1000,2000,3000",])
  14544. arr.push(["skey", ""])
  14545. arr.push(["opc", ""])
  14546. arr.push(["uplink","subscribed-UeAmbr Uplink, pattern: '^\\d+(\\.\\d+)? (bps|Kbps|Mbps|Gbps|Tbps)$' -- ex) 1024 Mbps",])
  14547. arr.push(["downlink","subscribed-UeAmbr Downlink, pattern: '^\\d+(\\.\\d+)? (bps|Kbps|Mbps|Gbps|Tbps)$' -- ex) 1024 Mbps",])
  14548. arr.push(["singleNssais","List of non default Single Nssais. 콤마(,)로 구분하여 여러개 입력이 가능하다. -- ex) 1000,2000,3000",])
  14549. arr.push(["defaultNssais","A list of Single Nssais used as default. 콤마(,)로 구분하여 여러개 입력이 가능하다. -- ex) 1000,2000,3000",])
  14550. arr.push(["dnnConf/{index}/nssai","dnnConf는 최대 5개의 nssai 와 dnn 쌍으로 입력 가능하다.",])
  14551. arr.push(["dnnConf/{index}/dnn","반드시 1쌍 이상으로 index를 유의해서 입력해야한다. 쌍이 성립되지 않으면 데이터는 처리하지 않는다.",])
  14552. return arr
  14553. }
  14554. // NE등록 양식 데이터
  14555. function fnSetNeInsertForm(){
  14556. let arr = []
  14557. arr.push([
  14558. 'NE Name',
  14559. 'Tenant Name',
  14560. 'NE Group Name',
  14561. 'NE Type',
  14562. 'NE ID',
  14563. 'Connected UPF',
  14564. 'EMS Name',
  14565. 'NE Address',
  14566. 'NE Location (Latitude)',
  14567. 'NE Location (Longitude)',
  14568. 'Description'
  14569. ])
  14570. arr.push(["nename01", "", "", "", "", "", "", "", "", "", ""])
  14571. return arr
  14572. }
  14573. // NE등록 양식 유효성 데이터
  14574. function fnSetNeGuideForm(){
  14575. let arr = []
  14576. arr.push(["COLUMN NAME", "입력 설명"])
  14577. arr.push(["NE Name", "NE 이름"])
  14578. arr.push(["Tenant Name","테넌트 이름",])
  14579. arr.push(["NE Group Name","NE 그룹 이름",])
  14580. arr.push(["NE Type", "NE 유형"])
  14581. arr.push(["NE ID", ""])
  14582. arr.push(["Connected UPF","연동 UPF",])
  14583. arr.push(["EMS Name","수집 시스템",])
  14584. arr.push(["NE Address","NE 주소",])
  14585. arr.push(["NE Location (Latitude)","NE 주소 위도",])
  14586. arr.push(["NE Location (Longitude)","NE 주소 경도",])
  14587. arr.push(["Description","설명",])
  14588. return arr
  14589. }
  14590. /**
  14591. * 파일 업로드 이벤트
  14592. */
  14593. function fnFileChange(event) {
  14594. let isFiles = event.target.files.length > 0
  14595. if(isFiles) {
  14596. isUploadStep2.value = true // 파일 업로드한 상태
  14597. isUploadStep3.value = false
  14598. let excelFileName = event.target.files[0].name;
  14599. excelFileNames.value = excelFileName
  14600. if (excelFileName.includes("xlsx") === true ||excelFileName.includes("xls") === true) {
  14601. const file = event.target.files[0]
  14602. let reader = new FileReader()
  14603. reader.onload = () => {
  14604. let data = reader.result
  14605. let workbook
  14606. try {
  14607. workbook = read(data, { type: "binary" })
  14608. } catch (error) {
  14609. alert("파일을 읽을 수 없습니다.")
  14610. return;
  14611. }
  14612. let sheetName = workbook.SheetNames[0]
  14613. let worksheet = workbook.Sheets[sheetName]
  14614. const rowObject = utils.sheet_to_json(worksheet)
  14615. // 엑셀 데이터를 JSON으로 변환하면서 셀 위치 정보를 추가
  14616. const jsonData = utils.sheet_to_json(worksheet, { header: 1 })
  14617. console.log('%c rowObject########' ,'color:#bada55', rowObject)
  14618. console.log('%c jsonData' ,'color:#bada55', jsonData)
  14619. // 빈배열제거
  14620. const newData = jsonData.filter(el => el.length)
  14621. const headers = newData[0]
  14622. let rowData = newData.slice(1).map((row, rowIndex) => {
  14623. const obj = {}
  14624. headers.forEach((header, colIndex) => {
  14625. const cell = row[colIndex] !== undefined ? row[colIndex] : '' // 값을 설정하고 빈 값은 빈 문자열로
  14626. obj[header] = {
  14627. value: cell,
  14628. cell: utils.encode_cell({ r: rowIndex + 1, c: colIndex }),
  14629. }
  14630. })
  14631. return obj
  14632. })
  14633. let invalidDataList = []
  14634. if(props.menu === 'userMgmt') {
  14635. // 사용자 일괄 등록
  14636. invalidDataList = userValidateData(headers, rowData)
  14637. if(invalidDataList.length === 0){
  14638. // 유효성 모두 통과
  14639. let param = fnUserMakeParam(rowData)
  14640. uploadParams.value = _cloneDeep(param)
  14641. } else {
  14642. uploadParams.value = null
  14643. }
  14644. }else{
  14645. // NE 일괄 등록
  14646. invalidDataList = neValidateData(headers, rowData)//neValidateData(rowData)
  14647. if(invalidDataList.length === 0){
  14648. let param = fnNeMakeParam(rowData)
  14649. uploadParams.value = _cloneDeep(param)
  14650. } else {
  14651. uploadParams.value = null
  14652. }
  14653. }
  14654. // 유효성 체크 리스트
  14655. invalidData.value = _cloneDeep(invalidDataList)
  14656. if(invalidDataList.length === 0) {
  14657. isExcel.value = true
  14658. // gridApi.value.api.setRowData(rowData.value);
  14659. setTimeout(() => {
  14660. gridApi.value.showNoRowsOverlay();
  14661. }, 1);
  14662. }else{
  14663. isExcel.value = false
  14664. }
  14665. // 양식에러 테이블 데이터 목록
  14666. tblItems2.value = _cloneDeep(invalidData.value)
  14667. isUploadStep3.value = invalidData.value.length === 0
  14668. }
  14669. reader.readAsBinaryString(file)
  14670. } else {
  14671. alert("파일 확장자를 확인하세요(.xlsx, .xls)")
  14672. }
  14673. }
  14674. else{
  14675. isUploadStep2.value = false
  14676. isUploadStep3.value = false
  14677. fnClearFile()
  14678. }
  14679. }
  14680. /**
  14681. * 사용자 일괄등록 유효성 검사
  14682. */
  14683. function userValidateData(headers, data) {
  14684. let invalidData = [];
  14685. // 유효성 체크 항목들
  14686. let regexMap = {
  14687. tenantName: fnBusinessNameChk, // 테넌트명 체크
  14688. uplink: fnLinkValidChk, // 업로드 속도값 체크
  14689. downlink: fnLinkValidChk, // 다운로드 속도값 체크
  14690. imsi: fnImsiChk, // IMSI체크
  14691. msisdns: fnMsisdnsChk, // MSISDN 체크
  14692. // defaultNssais: fnDefaultNssaisChk, // Default NSSAI 체크
  14693. };
  14694. const dnnConf = [
  14695. 'dnnConf_1_nssai', 'dnnConf_1_dnn',
  14696. 'dnnConf_2_nssai', 'dnnConf_2_dnn',
  14697. 'dnnConf_3_nssai', 'dnnConf_3_dnn',
  14698. 'dnnConf_4_nssai', 'dnnConf_4_dnn',
  14699. 'dnnConf_5_nssai', 'dnnConf_5_dnn',
  14700. 'dnnConf_6_nssai', 'dnnConf_6_dnn',
  14701. 'dnnConf_7_nssai', 'dnnConf_7_dnn',
  14702. 'dnnConf_8_nssai', 'dnnConf_8_dnn',
  14703. 'dnnConf_9_nssai', 'dnnConf_9_dnn',
  14704. 'dnnConf_10_nssai', 'dnnConf_10_dnn',
  14705. ]
  14706. // dnnConf키 수집 수
  14707. let dnnConfKeyCnt = 0
  14708. // 필수 키값 목록
  14709. const requiredFields = ['tenantName', 'imsi', 'msisdns', 'skey', 'opc', 'uplink', 'downlink', 'singleNssais', 'defaultNssais']
  14710. // IMSI 중복체크 데이터
  14711. const imsiList = data.map(row => {
  14712. if(row.hasOwnProperty('imsi')) {
  14713. return row.imsi.value.toString()
  14714. }else return []
  14715. })
  14716. // flatMap으로 평탄화 작업
  14717. let num = 0
  14718. invalidData = data.flatMap((item, index) => {
  14719. // row 한바퀴 수행 후 초기화
  14720. dnnConfKeyCnt = 0
  14721. validDnnConf.value = []
  14722. dnnConfigCnt.value = 0
  14723. return Object.entries(item).flatMap(([key, { value, cell }]) => {
  14724. // 필수 값 체크 dnnConf키가 아니고 필수키가 없는 경우
  14725. if (!dnnConf.includes(key) && !requiredFields.includes(key)) {
  14726. return { no: ++num, ROW_NUM: index + 2, headerName: key, value, cellNum: cell, errorMsg: '형식에러' }
  14727. }
  14728. if (requiredFields.includes(key) && useUtil.isNull(value)) {
  14729. // 헤더 키는 존재하나 데이터가 없는 경우
  14730. return { no: ++num, ROW_NUM: index + 2, headerName: key, value, cellNum: cell, errorMsg: 'noData' }
  14731. }
  14732. if(dnnConf.includes(key)) {
  14733. dnnConfKeyCnt++
  14734. }
  14735. if(dnnConfKeyCnt == 19) {
  14736. const result = fnDnnValidation(item)
  14737. if(result !==true){
  14738. return { no: ++num, ROW_NUM: index + 2, headerName: key, value, cellNum: cell, errorMsg: result }
  14739. }
  14740. }
  14741. // IMSI 중복 체크
  14742. if (key === 'imsi') {
  14743. const result = fnImsiDupChk(item, key, imsiList);
  14744. if (result !== true) {
  14745. return { no: ++num, ROW_NUM: index + 2, headerName: key, value, cellNum: cell, errorMsg: result }
  14746. }
  14747. }
  14748. const regex = regexMap[key];
  14749. if (regex) {
  14750. const result = regex(item, key);
  14751. if (result !== true) {
  14752. // 정규식 통과 실패
  14753. return { no: ++num, ROW_NUM: index + 2, headerName: key, value, cellNum: cell, errorMsg: result }
  14754. }
  14755. }
  14756. return []
  14757. })
  14758. })
  14759. return invalidData
  14760. }
  14761. /**
  14762. * 사용자일괄등록 param목록
  14763. */
  14764. function fnUserMakeParam(rowData){
  14765. let params = []
  14766. rowData.forEach((row, idx) => {
  14767. let msisdnsArray = row.msisdns.value.toString().replace(/ /g, "").split(",") // 공백제거 후, split
  14768. let singleNssaisArray = []
  14769. if (row.singleNssais.value != undefined)
  14770. singleNssaisArray = row.singleNssais.value.toString().replace(/ /g, "").split(",")
  14771. let defaultNssaisArray = row.defaultNssais.value.toString().replace(/ /g, "").split(",")
  14772. let item = {
  14773. accountId: useAuthStore().getAccountId,
  14774. tenantName: row.tenantName.value,
  14775. imsi: row.imsi.value.toString(),
  14776. msisdns: msisdnsArray, //item.msisdns,
  14777. skey: row.skey.value.toString(),
  14778. opc: row.opc.value.toString(),
  14779. singleNssais: singleNssaisArray, //item.singleNssais,
  14780. defaultNssais: defaultNssaisArray, //item.defaultNssais,
  14781. uplink: row.uplink.value,
  14782. downlink: row.downlink.value,
  14783. dnnConf: row.dnnConf
  14784. }
  14785. params.push(item)
  14786. })
  14787. return params
  14788. }
  14789. /**
  14790. * 사업자명 체크
  14791. */
  14792. function fnBusinessNameChk(row, key){
  14793. const userPriority = useAuthStore().getAccountRole
  14794. const userBusinessInfo = useAuthStore().getAuth.tenantName
  14795. if (userPriority == "ADMIN") {
  14796. // ADMIN 권한인 경우 등록가능, 테넌트 명이 존재하고 나의 테넌트명과 다르면 등록안된다.
  14797. if (userBusinessInfo.length > 0 && userBusinessInfo != row[key].value) {
  14798. return 'invalid_tenantName'
  14799. }else{
  14800. return true
  14801. }
  14802. // return true
  14803. }else{
  14804. return 'No permission'
  14805. }
  14806. }
  14807. /**
  14808. * 업다운링크 체크
  14809. */
  14810. function fnLinkValidChk(row, key){
  14811. let linkRegex = /^\d+(\.\d+)? (bps|Kbps|Mbps|Gbps|Tbps)$/
  14812. return linkRegex.test(row[key].value) ? true : 'Invalid link'
  14813. }
  14814. // 현재 업로드한 엑셀파일 데이터에서 imsi값 중복체크
  14815. function fnImsiDupChk(row, key, imsiList ){
  14816. const imsiValue = row[key].value.toString()
  14817. return imsiList.indexOf(imsiValue) !== imsiList.lastIndexOf(imsiValue) ? 'Duplicate IMSI' : true
  14818. }
  14819. /**
  14820. * imsi체크
  14821. * key = 'imsi'
  14822. */
  14823. function fnImsiChk(row, key){
  14824. let imsiPrefix = row[key].value.toString().substr(0, 8) // 엑셀에 입력한 imsi값 앞에서 8자리 가져온다
  14825. let notMatchFlag = false
  14826. props.imsiPrefixList.some((element) => {
  14827. if (element.key == row.tenantName.value) {
  14828. // imsiPrefix의 테넌트명과 엑셀에 입력된 테넌트명이 같은 경우
  14829. if (imsiPrefix == element.value) {
  14830. // 입력한 고정imsi값이 imsiPrefix값과 같은 경우
  14831. notMatchFlag = false
  14832. }
  14833. return true
  14834. }
  14835. })
  14836. return notMatchFlag ? 'Invalid_imsi' : true
  14837. }
  14838. function fnMsisdnsChk(row, key){
  14839. const regex = /(msisdn-\d{5,15}|extid-.+@.+|.+)/
  14840. const items = row[key].value.split(',').map(item => item.trim())
  14841. for (const item of items) {
  14842. if (!regex.test(item)) {
  14843. return `Invalid entry found: "${item}"`
  14844. }
  14845. }
  14846. return true
  14847. }
  14848. /**
  14849. * dnnConfig 유효성 검사
  14850. */
  14851. const validDnnConf = ref([])
  14852. const dnnConfigCnt = ref(0)
  14853. function fnDnnValidation(row){
  14854. const pairs = [
  14855. { key1: 'dnnConf_1_nssai', key2: 'dnnConf_1_dnn' },
  14856. { key1: 'dnnConf_2_nssai', key2: 'dnnConf_2_dnn' },
  14857. { key1: 'dnnConf_3_nssai', key2: 'dnnConf_3_dnn' },
  14858. { key1: 'dnnConf_4_nssai', key2: 'dnnConf_4_dnn' },
  14859. { key1: 'dnnConf_5_nssai', key2: 'dnnConf_5_dnn' },
  14860. { key1: 'dnnConf_6_nssai', key2: 'dnnConf_6_dnn' },
  14861. { key1: 'dnnConf_7_nssai', key2: 'dnnConf_7_dnn' },
  14862. { key1: 'dnnConf_8_nssai', key2: 'dnnConf_8_dnn' },
  14863. { key1: 'dnnConf_9_nssai', key2: 'dnnConf_9_dnn' },
  14864. { key1: 'dnnConf_10_nssai', key2: 'dnnConf_10_dnn' },
  14865. ]
  14866. pairs.forEach((item, idx) => {
  14867. if (!useUtil.isNull(row[item.key1].value) && !useUtil.isNull(row[item.key2].value)) {
  14868. validDnnConf.value[dnnConfigCnt.value++] = {
  14869. nssai: row[item.key1].value.toString(),
  14870. dnn: row[item.key2].value.toString(),
  14871. }
  14872. }
  14873. })
  14874. if (dnnConfigCnt.value < 1) {
  14875. return 'one NSSAI-DNN pair required'
  14876. }else{
  14877. row.dnnConf=_cloneDeep(validDnnConf.value)
  14878. }
  14879. return true
  14880. }
  14881. /**
  14882. * ne일괄등록 param목록
  14883. */
  14884. function fnNeMakeParam(rowData){
  14885. let params = []
  14886. rowData.forEach((row, idx) => {
  14887. let item = {
  14888. accountId: useAuthStore().getAccountId,
  14889. accountName: useAuthStore().getAccountName,
  14890. tenantName: row['Tenant Name'].value,
  14891. neGroup: row['NE Group Name'].value,
  14892. neName: row['NE Name'].value,
  14893. neId: row['NE ID'].value,
  14894. neType: row['NE Type'].value,
  14895. upfNum: row['Connected UPF'].value,
  14896. emsName: row['EMS Name'].value,
  14897. neAddress: row['NE Address'].value,
  14898. neLocLatitude: row['NE Location (Latitude)'].value,
  14899. neLocLongitude: row['NE Location (Longitude)'].value,
  14900. description: row['Description'].value
  14901. }
  14902. params.push(item)
  14903. })
  14904. return params
  14905. }
  14906. /**
  14907. * ne일괄등록 유효성 검사
  14908. */
  14909. function neValidateData(headers, rowData){
  14910. let invalidData = []
  14911. const requiredFields = ['NE Name', 'Tenant Name', 'NE Group Name', 'NE Type', 'NE ID', 'Connected UPF', 'EMS Name', 'NE Address', 'NE Location (Latitude)', 'NE Location (Longitude)', 'Description']
  14912. // flatMap으로 평탄화 작업
  14913. let num = 0
  14914. invalidData = rowData.flatMap((item, index) => {
  14915. return Object.entries(item).flatMap(([key, { value, cell }]) => {
  14916. // 필수 값 체크
  14917. if(!requiredFields.includes(key)){
  14918. // 양식에 맞지 않는 키값
  14919. return { no: ++num, ROW_NUM: index + 2, headerName: key, value, cellNum: cell, errorMsg: '형식에러' };
  14920. }
  14921. if (requiredFields.includes(key) && useUtil.isNull(value)) {
  14922. // 키는 존재하나 데이터가 없는 경우
  14923. return { no: ++num, ROW_NUM: index + 2, headerName: key, value, cellNum: cell, errorMsg: '형식에러' };
  14924. }
  14925. return [];
  14926. })
  14927. })
  14928. return invalidData
  14929. }
  14930. /**
  14931. * 업로드 요청하기 - 각 부모컴포넌트로 이벤트 전달
  14932. */
  14933. function fnUploadProc(){
  14934. emit('uploadProc', uploadParams.value)
  14935. }
  14936. function fnClearFile(e){
  14937. //
  14938. fnInit()
  14939. isExcel.value = false
  14940. setTimeout(() => {
  14941. gridApi.value.showNoRowsOverlay();
  14942. }, 1);
  14943. }
  14944. // Grid 데이터 바인딩
  14945. function fnOnGridReady(params){
  14946. gridApi.value = params.api
  14947. }
  14948. function fnMakeNeJson(){
  14949. let jsonData = {
  14950. '@DU': {
  14951. 'NE ID': [],
  14952. 'NE Type': [],
  14953. 'NE Version': [],
  14954. 'Release Version': [],
  14955. 'Network': [],
  14956. 'NE Name': [],
  14957. 'Administrative State': [],
  14958. 'gNB DU Name': [],
  14959. 'gNB DU Name': [],
  14960. 'Endpoint CU IP address': [],
  14961. 'Local Time Offset': [],
  14962. 'NE Serial Number': [],
  14963. 'FW Auto Fusing': [],
  14964. },
  14965. '@GNB_INFORMATION': {
  14966. 'NE ID': [],
  14967. 'gNB Num': [],
  14968. 'gNB ID': [],
  14969. 'gNB ID Length': [],
  14970. 'Operator Name': [],
  14971. 'Access Mode': [],
  14972. },
  14973. '@GNB_IP_INFORMATION': {
  14974. 'NE ID': [],
  14975. 'gNB Num': [],
  14976. 'IP Index': [],
  14977. 'Local IPv4 Address': [],
  14978. 'Local IPv6 Address': [],
  14979. 'Secondary Local IPv4 Address': [],
  14980. 'Secondary Local IPv6 Address': [],
  14981. },
  14982. '@SERVER_INFORMATION': {
  14983. 'NE ID': [],
  14984. 'CFM': [],
  14985. 'PSM': [],
  14986. 'Local IPv4 Address': [],
  14987. 'Local IPv6 Address': [],
  14988. 'Secondary Local IPv4 Address': [],
  14989. 'Secondary Local IPv6 Address': [],
  14990. },
  14991. '@PLMN_INFORMATION': {
  14992. 'NE ID': [],
  14993. 'gNB Num': [],
  14994. 'PLMN Index': [],
  14995. 'MCC': [],
  14996. 'MNC': [],
  14997. },
  14998. '@MAIN_BOARD_INFORMATION': {
  14999. 'NE ID': [],
  15000. 'Unit Type': [],
  15001. 'Unit ID': [],
  15002. 'Board Type': [],
  15003. },
  15004. '@CLOCK_INFORMATION': {
  15005. 'NE ID': [],
  15006. 'Clock Source ID': [],
  15007. 'Clock Source': [],
  15008. 'Priority Level': [],
  15009. 'Quality Level': [],
  15010. },
  15011. '@PTP_INFORMATION': {
  15012. 'NE ID': [],
  15013. 'IP Version': [],
  15014. 'First Master IP': [],
  15015. 'Second Master IP': [],
  15016. 'Clock Profile': [],
  15017. 'PTP Domain': [],
  15018. 'PTP Hybrid Mode': [],
  15019. },
  15020. '@DEBUG_PORT_INFORMATION': {
  15021. 'NE ID': [],
  15022. 'Port Switch': [],
  15023. },
  15024. '@PORT_INFORMATION': {
  15025. 'NE ID': [],
  15026. 'Port ID': [],
  15027. 'VR ID': [],
  15028. 'Port Administrative State': [],
  15029. 'Connect Type': [],
  15030. 'UDE Type': [],
  15031. 'MTU': [],
  15032. 'Speed Duplex': [],
  15033. 'Fec Mode': [],
  15034. },
  15035. '@VIRTUAL_ROUTING_INFORMATION': {
  15036. 'NE ID': [],
  15037. 'VR ID': [],
  15038. },
  15039. '@IP_INFORMATION': {
  15040. 'NE ID': [],
  15041. 'CPU ID': [],
  15042. 'External Interface Name': [],
  15043. 'IP Address': [],
  15044. 'IP Get Type': [],
  15045. 'Management': [],
  15046. 'Control': [],
  15047. 'Bearer': [],
  15048. 'IEEE1588': [],
  15049. },
  15050. '@VLAN_INFORMATION': {
  15051. 'NE ID': [],
  15052. 'CPU ID': [],
  15053. 'VLAN Interface Name': [],
  15054. 'VLAN ID': [],
  15055. 'VR ID': [],
  15056. },
  15057. '@LAG_INFORMATION': {
  15058. 'NE ID': [],
  15059. 'CPU ID': [],
  15060. 'LAG ID': [],
  15061. 'VR ID': [],
  15062. 'LAG Interface Name': [],
  15063. },
  15064. '@ROUTE_INFORMATION': {
  15065. 'NE ID': [],
  15066. 'CPU ID': [],
  15067. 'VR ID': [],
  15068. 'IP Prefix': [],
  15069. 'IP Prefix Length': [],
  15070. 'IP Gateway': [],
  15071. 'Route Interface Name': [],
  15072. },
  15073. '@SYSTEM_LOCATION_INFORMATION': {
  15074. 'NE ID': [],
  15075. 'User Defined Mode': [],
  15076. 'Latitude': [],
  15077. 'Longitude': [],
  15078. 'Height': [],
  15079. },
  15080. '@RU_INFORMATION': {
  15081. 'NE ID': [],
  15082. 'Start Frequency': [],
  15083. 'Second Start Frequency': [],
  15084. 'Uncertainty Semi Major': [],
  15085. 'Uncertainty Semi Minor': [],
  15086. 'Orientation Of Majjor Axis': [],
  15087. 'Uncertainty Altitude': [],
  15088. 'Confidence': []
  15089. },
  15090. '@IPSEC_INFORMATION': {
  15091. 'NE ID': [],
  15092. 'CPU ID': [],
  15093. 'VR ID': [],
  15094. 'Interface Name1': [],
  15095. 'Peer IP Version': [],
  15096. 'First Peer IP': [],
  15097. 'Second Peer IP': [],
  15098. 'Inner IP Version': [],
  15099. 'Tunnel Mode': [],
  15100. 'Interface Name2': [],
  15101. 'Interface Name3': [],
  15102. 'Interface Name4': [],
  15103. 'Interface Name5': [],
  15104. 'Interface Name6': [],
  15105. 'Crypto Algorithm': [],
  15106. 'Hash Algorithm': [],
  15107. 'Local ID Type': [],
  15108. 'Local ID': [],
  15109. },
  15110. '@PKI_INFORMATION': {
  15111. 'NE ID': [],
  15112. 'CPU ID': [],
  15113. 'IP Address': [],
  15114. 'FQDN': [],
  15115. 'Port': [],
  15116. 'Path': [],
  15117. 'DN': [],
  15118. 'DN Domain': [],
  15119. 'CA DN': [],
  15120. 'Hash Algorithm': [],
  15121. },
  15122. }
  15123. return JSON.stringify(jsonData)
  15124. }
  15125. </script>
  15126. </file>
  15127. <file path="components/common/footer.vue">
  15128. <template>
  15129. <footer class="footer">
  15130. <div class="foot-connection">
  15131. <strong>Connection</strong>
  15132. <span>OK</span>
  15133. </div>
  15134. <div class="foot-numbering">
  15135. <span class="num1">{{eventState.critical}}</span>
  15136. <span class="num2">{{eventState.major}}</span>
  15137. <span class="num3">{{eventState.minor}}</span>
  15138. </div>
  15139. <div class="foot-state" v-show="eventState.latestSeverity">{{eventState.latestSeverity}}</div>
  15140. <p class="foot-txt">
  15141. <!-- Sbi-0-chosim[server]-198 HTTP2 CONNECTION ALARM (sysId=821, rsysId=198, rsysId=198, rsysName=AMF[server]) -->
  15142. {{eventState.latestCause +' '+eventState.latestLocation}}
  15143. </p>
  15144. <div class="foot-btn-wrap">
  15145. <!-- <button><i class="ico ico1"></i>Event View</button> -->
  15146. <button class="evt-view" @click="fnEventView()"><i class="ico ico1"></i>Event View</button>
  15147. </div>
  15148. <span class="foot-logo">SAMSUNG SDS</span>
  15149. </footer>
  15150. <!-- 이벤트 이력 -->
  15151. <div class="footer--dialog" :class="[eventViewPop == true ? 'active' : '']">
  15152. <div class="footer--dialog--after"></div>
  15153. <div class="v-common-dialog-wrapper custom-dialog">
  15154. <div class="modal-tit">
  15155. <strong>이벤트 이력</strong>
  15156. <span class="bar"></span>
  15157. <v-switch v-model="curAlarm" label="CURRENT ALARM" hide-details></v-switch>
  15158. <div class="select-on">
  15159. <v-btn class="custom-btn btn-blue btn-evt mini" :disabled="!curAlarm" @click="fnClearAlarmConfirm()" v-if="selectedItem.length"><i class="ico"></i>알람 해제</v-btn>
  15160. <v-checkbox class="custom-check type2" hide-details v-if="selectedItem.length" readonly v-model="defaultCheckbox" style="pointer-events:none;">
  15161. <template v-slot:label>
  15162. 목록 <span class="strong">{{selectedItem.length}}</span>건 선택
  15163. </template>
  15164. </v-checkbox>
  15165. </div>
  15166. <div class="btn-wrap">
  15167. <v-btn class="custom-btn mini btn-white btn-pip" @click="fnEventViewOpenPop()"><i class="ico"></i>전체 보기</v-btn>
  15168. <v-btn class="custom-btn btn-white mini" @click="fnReset()" v-if="!curAlarm"><i class="ico"></i>초기화</v-btn>
  15169. <v-btn class="custom-btn btn-gray mini" @click="fnFixWindow()"><i class="ico"></i>창 고정</v-btn>
  15170. </div>
  15171. </div>
  15172. <div class="modal-cont">
  15173. <div class="tbl-wrapper">
  15174. <div class="tbl-wrap">
  15175. <ag-grid-vue
  15176. style="width:100%; height:calc(50vh - 7.13rem)"
  15177. class="ag-theme-quartz"
  15178. :gridOptions="gridOptions"
  15179. :columnDefs="getHeaders"
  15180. :defaultColDef="defaultColDef"
  15181. :rowData="listObj.rowData"
  15182. :suppressPaginationPanel="true"
  15183. :suppressScrollOnNewData="true"
  15184. @selection-changed="fnOnSelectChange"
  15185. @rowClicked="fnRowClick"
  15186. @grid-ready="fnOnGridReady"
  15187. >
  15188. </ag-grid-vue>
  15189. </div>
  15190. </div>
  15191. </div>
  15192. <div class="foot-btn-wrap">
  15193. <button class="evt-view" @click="fnEventView()"><i class="ico ico1"></i>Event View</button>
  15194. </div>
  15195. </div>
  15196. </div>
  15197. <!-- 이벤트 이력 상세 정보 -->
  15198. <eventDetailView ref="refEventDetailView" :isEventDetailModal="isEventDetailModal" :eventDetailData="eventDetailData" :currentAlarmYn="curAlarm" @closeModal="fnCloseEventDetailModal"/>
  15199. </template>
  15200. <script setup>
  15201. import customNullValue from '@/components/cellRenderer/customNullValue.vue';
  15202. import "ag-grid-community/styles/ag-grid.css"; // Mandatory CSS required by the Data Grid
  15203. import "ag-grid-community/styles/ag-theme-quartz.css"; // Optional Theme applied to the Data Grid
  15204. import { AgGridVue } from "ag-grid-vue3"; // Vue Data Grid Component
  15205. import { useI18n } from 'vue-i18n';
  15206. import eventDetailView from './footer/eventDetailView.vue';
  15207. /***********************
  15208. * plugins inject
  15209. ************************/
  15210. const {$toast, $log, $dayjs, $eventBus } = useNuxtApp()
  15211. const i18n = useI18n()
  15212. /***********************
  15213. * data & created
  15214. ************************/
  15215. const pageId = 'footer'
  15216. const eventClientId = ref('')
  15217. const eventState = ref({
  15218. critical: 0,
  15219. major: 0,
  15220. minor: 0,
  15221. warning: 0,
  15222. latestCause: '', // 최근발생이벤트 원인
  15223. latestLocation: '', // 최근발생이벤트 위치
  15224. latestSeverity: '' // 최근발생이벤트 심각도
  15225. })
  15226. const eventInterval = ref(null)
  15227. const curAlarm = ref(false)
  15228. const gridApi = shallowRef() // Grid Api
  15229. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  15230. const rowHeightRem = 3.125; // 원하는 rem 값
  15231. const rowHeightPx = rowHeightRem * remToPx();
  15232. // grid default 옵션
  15233. const defaultColDef = ref({
  15234. lockVisible: true, // 열을 그리드 밖으로 꺼내지 않음
  15235. })
  15236. let listObj = ref({
  15237. currentData: [],
  15238. eventData: [],
  15239. rowData: []
  15240. })
  15241. const objSlt = ref({
  15242. eventTypeList: [],
  15243. severityList: [],
  15244. alarmGroupList: [],
  15245. alarmStateList: []
  15246. })
  15247. const getHeaders = computed(() => {
  15248. let headers = [
  15249. { field: "no", headerName: "No", width:100, cellRenderer: customNullValue},
  15250. { field: "eventType", headerName: "이벤트 유형", width:130, cellRenderer: customNullValue},
  15251. { field: "eventCode", headerName: "이벤트 코드", width:130, cellRenderer: customNullValue},
  15252. { field: "severity", headerName: "심각도", width:130, cellRenderer: fnSeverityRenderer},
  15253. { field: "alarmGroup", headerName: "알람 그룹", cellRenderer: customNullValue},
  15254. { field: "location", headerName: "위치", cellRenderer: customNullValue},
  15255. { field: "probcause", headerName: "발생 원인", cellRenderer: customNullValue},
  15256. { field: "alarmTime", headerName: "발생 시간", cellRenderer: customNullValue},
  15257. { field: "clearTime", headerName: "해제 시간", cellRenderer: customNullValue},
  15258. { field: "alarmState", headerName: "상태", cellRenderer: customNullValue}
  15259. ]
  15260. if(curAlarm.value){
  15261. headers.unshift({ field: "checkbox", headerName: "", checkboxSelection: true, headerCheckboxSelection: true,
  15262. showDisabledCheckboxes: true, //비활성화 체크박스 보이게 설정
  15263. width:50, checkboxSelection: params => {
  15264. let activeState = ['Uncleared', 'Audit', 'Unack', 'Ack']
  15265. let isCheckBoxStatus = (params.data.neId === -1 && params.data.eventType === 'Alarm' && _includes(activeState, params.data.alarmState))
  15266. return isCheckBoxStatus // alarmState가 'Uncleared'일 경우만 체크박스 활성화
  15267. }
  15268. })
  15269. }
  15270. return headers
  15271. })
  15272. const gridOptions = {
  15273. columnDefs: getHeaders.value,
  15274. rowData: listObj.value.rowData, // 테이블 데이터
  15275. rowSelection : 'multiple',
  15276. suppressMovableColumns: false,
  15277. autoSizeStrategy: {
  15278. type: "fitGridWidth", // width맞춤
  15279. },
  15280. headerHeight : rowHeightPx,
  15281. rowHeight: rowHeightPx,
  15282. pagination: false,
  15283. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  15284. suppressRowClickSelection: true, // 행 클릭 체크박스 무시
  15285. localeText: {
  15286. noRowsToShow: i18n.t('common.noData')
  15287. },
  15288. isRowSelectable: (rowNode) => {
  15289. // 나이가 30 미만이면 체크박스 비활성화
  15290. let activeState = ['Uncleared', 'Audit', 'Unack', 'Ack']
  15291. let isCheckBoxStatus = (rowNode.data.neId === -1 && rowNode.data.eventType === 'Alarm' && _includes(activeState, rowNode.data.alarmState))
  15292. return isCheckBoxStatus
  15293. }
  15294. // onRowSelected: (event) => {
  15295. // // 조건에 따라 선택 비활성화 처리
  15296. // if (event.node.data.neId === -1 && event.node.data.eventType === 'Alarm') {
  15297. // //console.log(event.node.data.neId)
  15298. // //console.log(event.node.data.eventType)
  15299. // // 선택 비활성화
  15300. // event.node.setSelected(false)
  15301. // }
  15302. // },
  15303. // onSelectionChanged: () => {
  15304. // const selectedNodes = gridOptions.api.getSelectedNodes()
  15305. // console.log(selectedNodes)
  15306. // selectedNodes.forEach(node => {
  15307. // console.log(node.data.neId)
  15308. // // if (node.data.age < 30) {
  15309. // // gridOptions.api.deselectNode(node); // 선택 해제
  15310. // // }
  15311. // })
  15312. // }
  15313. }
  15314. let eventViewPop = ref(false); // 이벤트 이력 팝업
  15315. const eventDetailData = ref({}) // 이벤트뷰어 상세 데이터
  15316. const refEventDetailView = ref(null) // 이벤트뷰어 상세 ref 참조
  15317. const isEventDetailModal = ref(false) // 이벤트뷰어 상세 모달
  15318. const getEventTypeText = computed(() => {
  15319. return (val) => {
  15320. if(!useUtil.isNull(val) && val !== '-') {
  15321. let titleValue = useUtil.nvl(_find(objSlt.value.eventTypeList, { value: val }), '-')
  15322. return titleValue.title
  15323. }else{
  15324. return val
  15325. }
  15326. }
  15327. })
  15328. const getSeverityText = computed(() => {
  15329. return (val) => {
  15330. if(!useUtil.isNull(val) && val !== '-') {
  15331. let titleValue = useUtil.nvl(_find(objSlt.value.severityList, { value: val }), '-')
  15332. return titleValue.title
  15333. }else{
  15334. return val
  15335. }
  15336. }
  15337. })
  15338. const getAlarmGroupText = computed(() => {
  15339. return (val) => {
  15340. if(!useUtil.isNull(val) && val !== '-') {
  15341. let titleValue = useUtil.nvl(_find(objSlt.value.alarmGroupList, { value: val }), '-')
  15342. return titleValue.title
  15343. }else{
  15344. return val
  15345. }
  15346. }
  15347. })
  15348. const getAlarmStateText = computed(() => {
  15349. return (val) => {
  15350. if(!useUtil.isNull(val) && val !== '-') {
  15351. let titleValue = useUtil.nvl(_find(objSlt.value.alarmStateList, { value: val }), '-')
  15352. return titleValue.title
  15353. }else{
  15354. return val
  15355. }
  15356. }
  15357. })
  15358. let fixWindowYN = ref((useUtil.nvl(localStorage.getItem('eventViewFix'), 'N')))
  15359. if(fixWindowYN.value === 'Y') {
  15360. eventViewPop.value = true
  15361. } else {
  15362. eventViewPop.value = false
  15363. }
  15364. const selectedItem = ref([]) // 선택한항목 리스트
  15365. const defaultCheckbox = ref(true) // ..건 선택 체크박스 상태
  15366. watchEffect(() =>{
  15367. // 감시하고자 하는 데이터를 해당 블럭내에서 사용하면 호출된다.
  15368. // getLang.value를 감시하는 상태
  15369. fnGetEnumCode(useLangStore().getLang)
  15370. })
  15371. watch(() => curAlarm.value, (newV, oldV) => {
  15372. fnGetEventViewer()
  15373. },{ deep: true, immediate: false })
  15374. onMounted(() => {
  15375. if(!useUtil.isNull(eventInterval.value)) {
  15376. clearInterval(eventInterval.value)
  15377. }
  15378. fnGetEventViewer()
  15379. eventInterval.value = setInterval(() => {
  15380. fnGetEventViewer()
  15381. }, 5000)
  15382. //}, 1000 * 30)
  15383. })
  15384. $eventBus.off('SET_FOOTER')
  15385. $eventBus.on('SET_FOOTER', () => {
  15386. //console.log('%c [SET_FOOTER]' ,'color:#bada55')
  15387. clearInterval(eventInterval.value)
  15388. })
  15389. $eventBus.off('DELETE_CLEAR_ALARM')
  15390. $eventBus.on('DELETE_CLEAR_ALARM', () => {
  15391. fnClearAlarm()
  15392. })
  15393. /***********************
  15394. * Methods
  15395. ************************/
  15396. /**
  15397. * @SCRIPT
  15398. * ENUM 업데이트
  15399. * @param lang
  15400. */
  15401. function fnGetEnumCode(lang){
  15402. lang = useUtil.nvl(lang, 'kr')
  15403. let objEnum = useEnumCode.getEnumCode(lang)
  15404. objSlt.value.alarmStateList = [...objEnum.alarmState]
  15405. objSlt.value.alarmGroupList = [...objEnum.alarmGroup]
  15406. objSlt.value.severityList = [...objEnum.severity]
  15407. objSlt.value.eventTypeList = [...objEnum.eventType]
  15408. }
  15409. /**
  15410. * @SCRIPT
  15411. * 이벤트뷰어 리스트 단건 클릭 이벤트
  15412. */
  15413. function fnRowClick(params){
  15414. eventDetailData.value = params.data
  15415. isEventDetailModal.value = true
  15416. // 데이터 초기화
  15417. refEventDetailView.value.fnInit()
  15418. }
  15419. /**
  15420. * @SCRIPT
  15421. * 이벤트뷰어 상세페이지 닫기
  15422. */
  15423. function fnCloseEventDetailModal() {
  15424. isEventDetailModal.value = false
  15425. }
  15426. /**
  15427. * @SCRIPT
  15428. * Grid 데이터 바인딩
  15429. */
  15430. function fnOnGridReady(params){
  15431. gridApi.value = params.api
  15432. // gridApi.value.api.setRowData(rowData.value);
  15433. //fnGetLoginHistory()
  15434. }
  15435. /**
  15436. * @SCRIPT
  15437. * 초기화 버튼 이벤트
  15438. */
  15439. function fnReset() {
  15440. gridApi.value.setGridOption('rowData', [])
  15441. }
  15442. /**
  15443. * @SCRIPT
  15444. * 창 고정 버튼 이벤트
  15445. */
  15446. function fnFixWindow() {
  15447. if(fixWindowYN.value === 'Y') {
  15448. fixWindowYN.value = 'N'
  15449. eventViewPop.value = false
  15450. localStorage.setItem('eventViewFix', 'N')
  15451. } else {
  15452. fixWindowYN.value = 'Y'
  15453. eventViewPop.value = true
  15454. localStorage.setItem('eventViewFix', 'Y')
  15455. }
  15456. }
  15457. /**
  15458. * @SCRIPT
  15459. * 이벤트뷰어 활성화 이벤트
  15460. */
  15461. function fnEventView() {
  15462. if(fixWindowYN.value === 'N') {
  15463. // 창고정이 꺼져있는경우
  15464. if(eventViewPop.value) {
  15465. eventViewPop.value = false
  15466. } else {
  15467. eventViewPop.value = true
  15468. }
  15469. } else {
  15470. eventViewPop.value = true
  15471. }
  15472. }
  15473. /**
  15474. * @SCRIPT
  15475. * 체크박스 선택 시 이벤트
  15476. */
  15477. function fnOnSelectChange() {
  15478. const selectedRows = gridApi.value.getSelectedRows()
  15479. let arrData = []
  15480. selectedRows.forEach((row) => {
  15481. arrData.push(row)
  15482. })
  15483. selectedItem.value = arrData
  15484. }
  15485. /**
  15486. * @SCRIPT
  15487. * 이벤트뷰어 윈도우 팝업 이벤트
  15488. */
  15489. // const eventAllPop = () => { // 이벤트 이력 전체 보기
  15490. // window.open("/design/evtHisPip", "_blank", "width=");
  15491. // components\common\footer\eventViewWindowPop.vue
  15492. // }
  15493. function fnEventViewOpenPop() {
  15494. const width = window.screen.width
  15495. const height = window.screen.height
  15496. const url = window.location.origin+'/view/home/eventView/eventViewWindowPop'
  15497. const popupWindow = window.open(url, '_blank', `width=${width},height=${height},top=0,left=0`)
  15498. if (popupWindow) {
  15499. popupWindow.focus()
  15500. }
  15501. // 전체보기에 대한 이벤트 처리
  15502. // popupWindow.onload = function () {
  15503. // let dataObj = []
  15504. // console.log(':::::::::::::fnEventViewOpenPop:::::::::::::')
  15505. // dataObj = listObj.value.currentData
  15506. // dataObj.clientId = eventClientId.value
  15507. // //dataObj.clientId = eventClientId.value
  15508. // console.log(dataObj)
  15509. // popupWindow.postMessage({message: JSON.stringify(dataObj)}, '*')
  15510. // }
  15511. }
  15512. /**
  15513. * @API
  15514. * event viewer
  15515. */
  15516. function fnGetEventViewer(){
  15517. let _req = {}
  15518. _req.clientId = useUtil.nvl(eventClientId.value, -1)
  15519. useAxios().post(useApi.eventViewer, _req).then((res) => {
  15520. //fetch('/test.json').then(response => response.json()).then(res => {
  15521. let temp = []
  15522. let currentTotalCnt = 0
  15523. let eventTotalCnt = 0
  15524. let resClientId = res.data.data.clientId
  15525. let curAlarm = res.data.data.curAlarm // {critical: 0, major: 0, minor: 0, warning: 0}
  15526. let currentList = res.data.data.curAlarms
  15527. let eventList = res.data.data.events
  15528. eventTotalCnt = eventList.length
  15529. currentTotalCnt = currentList.length
  15530. eventClientId.value = resClientId
  15531. // 상태값 데이터 셋팅
  15532. eventState.value = {
  15533. critical: curAlarm.critical,
  15534. major: curAlarm.major,
  15535. minor: curAlarm.minor,
  15536. warning: curAlarm.warning,
  15537. latestCause: useUtil.nvl(curAlarm.latestCause, ''),
  15538. latestLocation: useUtil.nvl(curAlarm.latestLocation, ''),
  15539. latestSeverity: curAlarm.latestSeverity
  15540. }
  15541. // CURRENT ALARM 활성화 시 보여질 데이터셋팅 실시간으로 값이 쌓이는 형식
  15542. if(currentTotalCnt > 0) {
  15543. currentList.forEach((item, idx) => {
  15544. let obj = {}
  15545. obj.no = idx + 1
  15546. obj.seqNo = useUtil.nvl(item.seqNo, '-')
  15547. obj.neId = useUtil.nvl(item.neId, '-')
  15548. obj.neName = useUtil.nvl(item.neName, '-')
  15549. obj.neGroup = useUtil.nvl(item.neGroup, '-')
  15550. obj.emsName = useUtil.nvl(item.emsName, '-')
  15551. obj.location = useUtil.nvl(item.location, '-')
  15552. obj.eventCode = useUtil.nvl(item.eventCode, '-')
  15553. obj.probcause = useUtil.nvl(item.probcause, '-')
  15554. obj.tenantName = useUtil.nvl(item.tenantName, '-')
  15555. obj.clearUser = useUtil.nvl(item.clearUser, '-')
  15556. obj.clearSystem = useUtil.nvl(item.clearSystem, '-')
  15557. obj.clearType = useUtil.nvl(item.clearType, '-')
  15558. obj.ackTime = useUtil.nvl(item.ackTime, '-')
  15559. obj.ackUser = useUtil.nvl(item.ackUser, '-')
  15560. obj.ackSystem = useUtil.nvl(item.ackSystem, '-')
  15561. obj.modifyUser = useUtil.nvl(item.modifyUser, '-')
  15562. obj.modifySystem = useUtil.nvl(item.modifySystem, '-')
  15563. obj.additionalText = useUtil.nvl(item.additionalText, '-')
  15564. obj.eventType = getEventTypeText.value(item.eventType)
  15565. obj.severity = getSeverityText.value(item.severity)
  15566. obj.alarmGroup = getAlarmGroupText.value(item.alarmGroup)
  15567. obj.alarmState = getAlarmStateText.value(item.alarmState)
  15568. obj.alarmTime = useUtil.fnNullCheckFormatDate(item.alarmTime)
  15569. obj.clearTime = useUtil.fnNullCheckFormatDate(item.clearTime)
  15570. temp.push(obj)
  15571. })
  15572. listObj.value.currentData = _cloneDeep(temp)
  15573. }
  15574. // CURRENT ALARM 비활성화 시 보여질 이벤트데이터 셋팅 실시간으로 값이 쌓이는 형식
  15575. if(eventTotalCnt > 0) {
  15576. eventList.forEach((item) => {
  15577. let obj = {}
  15578. obj.no = 0
  15579. obj.seqNo = useUtil.nvl(item.seqNo, '-')
  15580. obj.neId = useUtil.nvl(item.neId, '-')
  15581. obj.neName = useUtil.nvl(item.neName, '-')
  15582. obj.neGroup = useUtil.nvl(item.neGroup, '-')
  15583. obj.emsName = useUtil.nvl(item.emsName, '-')
  15584. obj.location = useUtil.nvl(item.location, '-')
  15585. obj.eventCode = useUtil.nvl(item.eventCode, '-')
  15586. obj.probcause = useUtil.nvl(item.probcause, '-')
  15587. obj.tenantName = useUtil.nvl(item.tenantName, '-')
  15588. obj.clearUser = useUtil.nvl(item.clearUser, '-')
  15589. obj.clearSystem = useUtil.nvl(item.clearSystem, '-')
  15590. obj.clearType = useUtil.nvl(item.clearType, '-')
  15591. obj.ackTime = useUtil.nvl(item.ackTime, '-')
  15592. obj.ackUser = useUtil.nvl(item.ackUser, '-')
  15593. obj.ackSystem = useUtil.nvl(item.ackSystem, '-')
  15594. obj.modifyUser = useUtil.nvl(item.modifyUser, '-')
  15595. obj.modifySystem = useUtil.nvl(item.modifySystem, '-')
  15596. obj.additionalText = useUtil.nvl(item.additionalText, '-')
  15597. obj.eventType = getEventTypeText.value(item.eventType)
  15598. obj.severity = getSeverityText.value(item.severity)
  15599. obj.alarmGroup = getAlarmGroupText.value(item.alarmGroup)
  15600. obj.alarmState = getAlarmStateText.value(item.alarmState)
  15601. obj.alarmTime = useUtil.fnNullCheckFormatDate(item.alarmTime)
  15602. obj.clearTime = useUtil.fnNullCheckFormatDate(item.clearTime)
  15603. listObj.value.eventData.unshift(obj)
  15604. })
  15605. }
  15606. // 최종 데이터 가공
  15607. fnSetData()
  15608. $log.debug("[footer][fnGetEventViewer][success]")
  15609. }).catch((error)=>{
  15610. $log.debug("[footer][fnGetEventViewer][error]")
  15611. useErrorHandler().fnSetCommErrorHandle(error, fnGetEventViewer)
  15612. }).finally(()=>{
  15613. $log.debug("[footer][fnGetEventViewer][finished]")
  15614. })
  15615. }
  15616. /**
  15617. * @API_REF
  15618. * 조회 API 최종 가공 데이터
  15619. */
  15620. function fnSetData() {
  15621. listObj.value.rowData = []
  15622. if(curAlarm.value) {
  15623. // currentAlarm이 활성화 되어있는 경우
  15624. listObj.value.rowData = listObj.value.currentData
  15625. } else {
  15626. _each(listObj.value.eventData, (item, idx) => {
  15627. item.no = idx + 1
  15628. })
  15629. listObj.value.rowData = listObj.value.eventData
  15630. }
  15631. gridApi.value.setGridOption('rowData', listObj.value.rowData)
  15632. }
  15633. /**
  15634. * @API_REF
  15635. * 데이터 가공 참조
  15636. */
  15637. function fnSeverityRenderer(params) {
  15638. // Critical, Major, Minor, Warning, Normal
  15639. let _cls = ''
  15640. if(!useUtil.isNull(params.value) && params.value !== '-') {
  15641. _cls = params.value == 'Critical' ? 'critical' : params.value == 'Major' ? 'major' : params.value == 'Minor' ? 'minor' : params.value == 'Warning' ? 'minor' : 'minor'
  15642. }
  15643. let el = `<span class="status--ele ${_cls}" title="${params.value}">${params.value}</span>`
  15644. return el
  15645. }
  15646. /**
  15647. * @API_REF
  15648. * 알람해제 confirm
  15649. */
  15650. function fnClearAlarmConfirm() {
  15651. if(selectedItem.value.length > 0){
  15652. let contents = i18n.t('common.footer.eventView.clearAlarmConfirmMsg')
  15653. let param = {
  15654. id: pageId,
  15655. title: '안내',
  15656. content: contents,
  15657. yes:{
  15658. text: i18n.t('common.confirm'),
  15659. isProc: true,
  15660. event:'DELETE_CLEAR_ALARM',
  15661. param: ''
  15662. },
  15663. no:{
  15664. text: i18n.t('common.cancel'),
  15665. isProc:false
  15666. }
  15667. }
  15668. $eventBus.emit('OPEN_CONFIRM_POP_UP', param)
  15669. }
  15670. }
  15671. /**
  15672. * @API
  15673. * 알람해제
  15674. */
  15675. function fnClearAlarm() {
  15676. let clearNumbers = selectedItem.value.map(item=>item.seqNo).join(',')
  15677. let _req = {
  15678. seqNo: clearNumbers,
  15679. clearUser: useAuthStore().getAccountId
  15680. }
  15681. useAxios().put(useApi.clearAlarm, _req).then((res) => {
  15682. $log.debug("[footer][fnClearAlarm][success]")
  15683. $toast.success('선택한 알람이 해제 되었습니다.')
  15684. fnGetEventViewer()
  15685. }).catch((error)=>{
  15686. $log.debug("[footer][fnClearAlarm][error]")
  15687. $toast.error('선택한 알람 해제를 실패하였습니다.')
  15688. useErrorHandler().fnSetCommErrorHandle(error)
  15689. }).finally(()=>{
  15690. $log.debug("[footer][fnClearAlarm][finished]")
  15691. })
  15692. }
  15693. </script>
  15694. </file>
  15695. <file path="components/common/location.vue">
  15696. <template>
  15697. <v-dialog v-model="props.isLatlngModal" persistent width="50rem">
  15698. <div class="v-common-dialog-wrapper custom-dialog">
  15699. <div class="modal-tit">
  15700. <strong>지도로 검색</strong>
  15701. <button class="btn-close" @click="$emit('closeModal')"></button>
  15702. </div>
  15703. <div class="v-common-dialog-content">
  15704. <div class="map-area" id="map2"></div>
  15705. <div class="map-address">
  15706. <strong>주소 :</strong>
  15707. <p class="color-blue2" v-if="!objSetLatlng.address">
  15708. ※ 마우스로 위치를 지정하세요
  15709. </p>
  15710. <p style="" v-else>{{ objSetLatlng.address }}</p>
  15711. </div>
  15712. </div>
  15713. <div class="btn-wrap">
  15714. <v-btn class="custom-btn btn-white mini" @click="$emit('closeModal')">
  15715. 취소
  15716. </v-btn>
  15717. <v-btn class="custom-btn btn-blue mini" @click="fnSaveLatlng"> 저장 </v-btn>
  15718. </div>
  15719. </div>
  15720. </v-dialog>
  15721. </template>
  15722. <script setup>
  15723. /***********************
  15724. * import
  15725. ************************/
  15726. import { useI18n } from "vue-i18n";
  15727. import useUtil from "@/composables/useUtil";
  15728. import useValid from "@/composables/useValid";
  15729. import useEnumCode from "@/composables/useEnumCode";
  15730. /***********************
  15731. * plugins inject
  15732. ************************/
  15733. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  15734. // props
  15735. const props = defineProps({
  15736. isLatlngModal: Boolean,
  15737. address: String,
  15738. centerPosition: Object,
  15739. });
  15740. // 참조가능 데이터 설정
  15741. defineExpose({
  15742. fnInit,
  15743. fnReset,
  15744. });
  15745. // 발신 이벤트 선언
  15746. const emit = defineEmits(["closeModal", "setLatlng"]);
  15747. const i18n = useI18n();
  15748. /***********************
  15749. * data & created
  15750. ************************/
  15751. const map = ref(null); // 카카오 맵 객체
  15752. const marker = ref(null); // 카카오맵 마커(핀) 객체
  15753. const geocoder = ref(null);
  15754. // 주소위치설정값
  15755. const objSetLatlng = ref({
  15756. lat: "", // 위도
  15757. lng: "", // 경도
  15758. address: "", // 주소
  15759. regionalCode: "", // 지역명 (코드로 변환필요)
  15760. });
  15761. const sidoCode = ref([]);
  15762. watchEffect(() => {
  15763. fnGetEnumCode(useLangStore().getLang);
  15764. });
  15765. /**
  15766. * ENUM 업데이트
  15767. * @param lang
  15768. */
  15769. function fnGetEnumCode(lang) {
  15770. let objEnum = useEnumCode.getEnumCode(lang);
  15771. // ...objEnum.sidoCode
  15772. sidoCode.value = _cloneDeep(objEnum.sidoCode);
  15773. }
  15774. /***********************
  15775. * Methods
  15776. ************************/
  15777. function fnInit() {
  15778. if (!useUtil.isNull(props.address)) {
  15779. objSetLatlng.value.address = _cloneDeep(props.address);
  15780. }
  15781. nextTick().then(() => {
  15782. if (window.kakao && window.kakao.maps) {
  15783. loadMap();
  15784. } else {
  15785. loadScript();
  15786. }
  15787. });
  15788. }
  15789. function fnReset() {
  15790. objSetLatlng.value = {
  15791. lat: "",
  15792. lng: "",
  15793. address: "",
  15794. };
  15795. }
  15796. /**
  15797. * kakao 스크립트 로드
  15798. */
  15799. function loadScript() {
  15800. const script = document.createElement("script");
  15801. script.async = true;
  15802. script.onload = () => {
  15803. window.kakao.maps.load(loadMap);
  15804. };
  15805. script.src = `//dapi.kakao.com/v2/maps/sdk.js?autoload=false&libraries=services,clusterer,drawing&appkey=${
  15806. import.meta.env.VITE_APP_KAKAO_APP_KEY
  15807. }`;
  15808. document.head.appendChild(script);
  15809. }
  15810. /**
  15811. * kakao 지도 로드
  15812. */
  15813. async function loadMap() {
  15814. const mapContainer = document.getElementById("map2");
  15815. let mapOption = {
  15816. center: new kakao.maps.LatLng(props.centerPosition.lat, props.centerPosition.lng), // 지도의 중심좌표
  15817. level: 3, // 지도의 확대 레벨
  15818. };
  15819. map.value = new kakao.maps.Map(mapContainer, mapOption);
  15820. // 주소-좌표 변환 객체를 생성합니다
  15821. geocoder.value = new kakao.maps.services.Geocoder();
  15822. // 지도를 클릭한 위치에 표출할 마커입니다
  15823. marker.value = new kakao.maps.Marker({
  15824. // 지도 중심좌표에 마커를 생성합니다
  15825. position: map.value.getCenter(),
  15826. });
  15827. // 지도에 마커를 표시합니다
  15828. marker.value.setMap(map.value);
  15829. let zoomControl = new kakao.maps.ZoomControl();
  15830. // map.value.addControl(zoomControl, kakao.maps.ControlPosition.BOTTOMRIGHT)
  15831. fnSetEventListener(); // 지도 이벤트 등록
  15832. }
  15833. /**
  15834. * 지도 클릭 이벤트
  15835. */
  15836. function fnSetEventListener() {
  15837. kakao.maps.event.addListener(map.value, "click", function (mouseEvent) {
  15838. // 클릭한 위도, 경도 정보
  15839. let latlng = mouseEvent.latLng;
  15840. marker.value.setPosition(latlng);
  15841. // 위/경도값으로 주소 조회
  15842. fnSearchAddrDetail(latlng);
  15843. // 위치값 설정
  15844. objSetLatlng.value.lat = latlng.getLat();
  15845. objSetLatlng.value.lng = latlng.getLng();
  15846. });
  15847. }
  15848. /**
  15849. * 위/경도 값으로 주소 구하기
  15850. */
  15851. function fnSearchAddrDetail(coords) {
  15852. return new Promise((resolve, reject) => {
  15853. fnSearchDetailAddrFromCoords(coords, function (result, status) {
  15854. if (status === kakao.maps.services.Status.OK) {
  15855. var detailAddr = !!result[0].road_address
  15856. ? result[0].road_address.address_name
  15857. : "";
  15858. detailAddr += `(${result[0].address.address_name})`;
  15859. objSetLatlng.value.address = detailAddr;
  15860. objSetLatlng.value.regionalCode = fnGetRegionCode(
  15861. result[0].address.region_1depth_name
  15862. );
  15863. resolve();
  15864. } else {
  15865. reject(status);
  15866. }
  15867. });
  15868. });
  15869. }
  15870. function fnSearchDetailAddrFromCoords(coords, callback) {
  15871. geocoder.value.coord2Address(coords.getLng(), coords.getLat(), callback);
  15872. }
  15873. // 지역코드 변환
  15874. function fnGetRegionCode(regionName) {
  15875. let regionCode = "";
  15876. sidoCode.value.forEach((item) => {
  15877. if (item.title.includes(regionName)) {
  15878. regionCode = item.value;
  15879. }
  15880. });
  15881. return regionCode;
  15882. }
  15883. /**
  15884. * 저장
  15885. */
  15886. async function fnSaveLatlng() {
  15887. if (useUtil.isNull(objSetLatlng.value.lat) || useUtil.isNull(objSetLatlng.value.lng)) {
  15888. let latlng = new kakao.maps.LatLng(
  15889. props.centerPosition.lat,
  15890. props.centerPosition.lng
  15891. );
  15892. try {
  15893. await fnSearchAddrDetail(latlng);
  15894. objSetLatlng.value.lat = latlng.getLat();
  15895. objSetLatlng.value.lng = latlng.getLng();
  15896. } catch (error) {
  15897. $log.debug("[주소위치설정 실패][error]", JSON.stringify(error));
  15898. }
  15899. }
  15900. let params = {
  15901. lat: objSetLatlng.value.lat.toFixed(8),
  15902. lng: objSetLatlng.value.lng.toFixed(8),
  15903. address: objSetLatlng.value.address,
  15904. regionalCode: objSetLatlng.value.regionalCode,
  15905. };
  15906. emit("setLatlng", params);
  15907. }
  15908. </script>
  15909. </file>
  15910. <file path="components/common/pagination.vue">
  15911. <template>
  15912. <div class="pagination-wrapper">
  15913. <!-- 첫 페이지 이동-->
  15914. <v-btn class="pagination-btn prev2" :disabled="pageObj.page == 1 || pageObj.pageMaxNumSize >= totalPages" @click="$emit('chg_page', 1)"></v-btn>
  15915. <!-- 왼쪽 이동 -->
  15916. <v-btn class="pagination-btn prev1" :disabled="pageObj.page == 1" @click="$emit('chg_page', pageObj.page - 1)"></v-btn>
  15917. <!-- 첫페이지 -->
  15918. <v-btn class="pagination-btn number" :class="{'on':pageObj.page==1}" @click="$emit('chg_page', 1)" v-if="totalPages>0">1</v-btn>
  15919. <!-- 첫 번째 ellipsis -->
  15920. <span class="pagination-btn more" v-if="showStartEllipsis"></span>
  15921. <!-- 중간 페이지 -->
  15922. <v-btn
  15923. v-for="page in visiblePages"
  15924. :key="page"
  15925. @click="$emit('chg_page', page)"
  15926. class="pagination-btn number"
  15927. :class="{'on':page === pageObj.page}"
  15928. >
  15929. {{ page }}
  15930. </v-btn>
  15931. <!-- 두 번째 ellipsis -->
  15932. <span class="pagination-btn more" v-if="showEndEllipsis"></span>
  15933. <!-- 마지막 페이지 -->
  15934. <v-btn class="pagination-btn number" :class="{'on':pageObj.page === totalPages}" @click="$emit('chg_page', totalPages)" v-if="totalPages!==0 && totalPages !== 1">{{ totalPages }}</v-btn>
  15935. <!-- 오른쪽 이동 -->
  15936. <v-btn class="pagination-btn next1" :disabled="pageObj.page == totalPages || pageObj.totalCnt == 0" @click="$emit('chg_page', pageObj.page + 1)"></v-btn>
  15937. <!-- 마지막 페이지 이동-->
  15938. <v-btn class="pagination-btn next2" :disabled="pageObj.page == totalPages || pageObj.totalCnt == 0 || pageObj.pageMaxNumSize >= totalPages" @click="$emit('chg_page', totalPages)"></v-btn>
  15939. <div class="page-go">
  15940. <v-text-field
  15941. v-model="pageGo"
  15942. class="custom-input mini"
  15943. style="width:calc(1vw * (70 / 19.2))"
  15944. ></v-text-field>
  15945. <button @click="fnPageGo">Go</button>
  15946. </div>
  15947. </div>
  15948. </template>
  15949. <script setup>
  15950. import { computed, ref } from 'vue';
  15951. const {$toast, $log, $eventBus } = useNuxtApp()
  15952. let pageId = 'pagination'
  15953. // props
  15954. const props = defineProps({
  15955. pageObj: Object,
  15956. })
  15957. // 발신 이벤트 선언
  15958. const emit = defineEmits(['chg_page'])
  15959. // data
  15960. const pageGo = ref(1) // 입력 페이지
  15961. const pageGoClone = ref(1) // 복구 페이지
  15962. // 페이지 복구
  15963. $eventBus.off('SET_INIT_PAGE')
  15964. $eventBus.on('SET_INIT_PAGE', () => {
  15965. if(!useUtil.isNull(pageGoClone.value)) {
  15966. pageGo.value = pageGoClone.value
  15967. }
  15968. })
  15969. $eventBus.off('SET_PAGE')
  15970. $eventBus.on('SET_PAGE', (param) => {
  15971. pageGo.value = param
  15972. })
  15973. // 전체 페이지수(마지막 페이지)
  15974. const totalPages = computed(() => {
  15975. return Math.ceil(props.pageObj.totalCnt / props.pageObj.pageSize)
  15976. })
  15977. // 첫, 마지막 페이지 제외한 노출 페이지 리스트
  15978. const visiblePages = computed(() => {
  15979. const pages = []
  15980. // 현재 페이지 기준 좌우에 표현할 수
  15981. const halfRange = Math.floor((props.pageObj.pageMaxNumSize - 4) / 2) // ...페이지 2개, 첫번째 마지막페이지 2개로 인해 -4를 한다
  15982. let start = props.pageObj.page - halfRange
  15983. let end = props.pageObj.page + halfRange
  15984. if (start < 2) {
  15985. start = 2
  15986. end = start + (props.pageObj.pageMaxNumSize - 4)
  15987. }
  15988. if (end >= totalPages.value) {
  15989. end = totalPages.value - 1
  15990. start = end - (props.pageObj.pageMaxNumSize - 4)
  15991. if (start < 2) {
  15992. start = 2
  15993. }
  15994. }
  15995. for (let i = start; i <= end; i++) {
  15996. pages.push(i)
  15997. }
  15998. return pages
  15999. })
  16000. // 첫 번째 ellipsis
  16001. const showStartEllipsis = computed(() => {
  16002. return visiblePages.value.length && visiblePages.value[0] > 2
  16003. })
  16004. // 두 번째 ellipsis
  16005. const showEndEllipsis = computed(() => {
  16006. return visiblePages.value.length && visiblePages.value[visiblePages.value.length - 1] < totalPages.value - 1
  16007. })
  16008. /**
  16009. * 페이지 입력 이동
  16010. */
  16011. function fnPageGo(){
  16012. let page = Number(pageGo.value)
  16013. if(page > totalPages.value) {
  16014. fnErrorPageAlert()
  16015. }else if(page < 1){
  16016. fnErrorPageAlert()
  16017. }else{
  16018. emit('chg_page', page)
  16019. pageGoClone.value = _cloneDeep(page)
  16020. }
  16021. }
  16022. /**
  16023. * 입력페이지 에러 comfirm alert
  16024. */
  16025. function fnErrorPageAlert(){
  16026. let param = {
  16027. id: pageId,
  16028. title:'Notice',
  16029. content:'입력하신 페이지가 존재하지 않습니다.',
  16030. yes:{
  16031. text:'OK',
  16032. isProc:true,
  16033. event:'SET_INIT_PAGE',
  16034. param:{},
  16035. }
  16036. }
  16037. $eventBus.emit('OPEN_CONFIRM_POP_UP', param)
  16038. }
  16039. </script>
  16040. <style lang="scss" scoped>
  16041. </style>
  16042. </file>
  16043. <file path="components/common/topologyPop.vue">
  16044. <template>
  16045. <div class="ne--topology--pop">
  16046. <div class="v-common-dialog-wrapper custom-dialog">
  16047. <div class="modal-tit">NE Topology</div>
  16048. <div class="v-common-dialog-content">
  16049. <div class="dialog-tree">
  16050. <div class="tree-area">
  16051. <div class="tree-depth1">
  16052. <ul>
  16053. <li class="depth1-item" v-for="(tenant, index) in myTreeView" :key="index">
  16054. <div class="depth-item-tit depth1-item-tit" :class="[tenant.fold ? '' : 'down']">
  16055. <button class="arr" :class="[tenant.neGroupList.length == 0 ? 'nor' : '']" @click="tenant.neGroupList.length > 0 && (tenant.fold = !tenant.fold)"></button>
  16056. <i class="ico"></i>
  16057. <strong>{{ tenant.tenantName }}{{tenant.neGroupList.length > 0 ? '('+tenant.neGroupList.length+')': ''}}</strong>
  16058. <!-- <button class="btn-tree btn-add" @click="addTree2(item1, index)"></button> -->
  16059. </div>
  16060. <div class="tree-depth2" v-if="tenant.fold">
  16061. <ul>
  16062. <li class="depth2-item" v-if="tenant.add">
  16063. <div class="depth-item-tit depth2-item-tit depth-item-reg">
  16064. <button class="arr"></button>
  16065. <i class="ico"></i>
  16066. <v-text-field
  16067. class="custom-input mini"
  16068. placeholder=""
  16069. v-model="addGroupTitle"
  16070. ></v-text-field>
  16071. <button class="btn-tree btn-save" @click="saveTree2(tenant)"></button>
  16072. </div>
  16073. </li>
  16074. <li class="depth2-item" v-for="(neGroup, index2) in tenant.neGroupList" :key="index2">
  16075. <div class="depth-item-tit depth2-item-tit" :class="[neGroup.fold ? '' : 'down']">
  16076. <button class="arr" @click="neGroup.fold = !neGroup.fold"></button>
  16077. <i class="ico"></i>
  16078. <v-checkbox
  16079. class="custom-check type2"
  16080. hide-details
  16081. v-model="neGroup.isAllCheck"
  16082. @update:modelValue="fnAllCheck($event, neGroup)">
  16083. <template v-slot:label>{{neGroup.neGroup}}{{neGroup.neList.length > 0 ? '('+neGroup.neList.length+')': ''}}</template>
  16084. </v-checkbox>
  16085. <!-- <button class="btn-ne-add" @click="neRegPop = true"><i class="plus"></i>NE</button>
  16086. <button class="btn-tree btn-pos"></button> -->
  16087. </div>
  16088. <div class="tree-depth3" v-if="neGroup.fold">
  16089. <ul>
  16090. <li class="depth3-item" v-for="(ne, index3) in neGroup.neList" :key="index3">
  16091. <div class="depth-item-tit depth3-item-tit">
  16092. <i class="ico" :class="getNeType(ne.neType)"></i>
  16093. <v-checkbox
  16094. class="custom-check type2"
  16095. hide-details
  16096. v-model="neGroup.selectNeList"
  16097. :value="ne.neId"
  16098. :id="neGroup.neGroup+ne.neId"
  16099. @update:modelValue="fnCheckNeBox($event, neGroup)">
  16100. <template v-slot:label v-if="ne.modify == false">{{ ne.neName }}</template>
  16101. </v-checkbox>
  16102. <!-- <v-text-field
  16103. v-if="ne.modify"
  16104. class="custom-input mini"
  16105. v-model="treeName3"
  16106. ></v-text-field> -->
  16107. <!-- <button class="btn-tree btn-mod" v-if="ne.modify == false" @click="txtModify(ne)" ></button>
  16108. <button class="btn-tree btn-save" v-if="ne.modify" @click="txtSave(ne)"></button> -->
  16109. </div>
  16110. </li>
  16111. </ul>
  16112. </div>
  16113. </li>
  16114. </ul>
  16115. </div>
  16116. </li>
  16117. </ul>
  16118. </div>
  16119. </div>
  16120. </div>
  16121. </div>
  16122. <div class="btn-wrap">
  16123. <v-btn
  16124. class="custom-btn btn-white mini"
  16125. @click="$emit('closePop')"
  16126. >
  16127. 취소
  16128. </v-btn>
  16129. <v-btn
  16130. class="custom-btn btn-blue mini"
  16131. @click="fnSave"
  16132. >
  16133. 선택
  16134. </v-btn>
  16135. </div>
  16136. </div>
  16137. </div>
  16138. </template>
  16139. <script setup>
  16140. /***********************
  16141. * import
  16142. ************************/
  16143. import { useI18n } from "vue-i18n"
  16144. import useUtil from "@/composables/useUtil"
  16145. import useValid from "@/composables/useValid"
  16146. /***********************
  16147. * plugins inject
  16148. ************************/
  16149. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  16150. // props
  16151. const props = defineProps({
  16152. isTopologyPop: Boolean,
  16153. })
  16154. // 참조가능 데이터 설정
  16155. defineExpose({
  16156. fnInit,
  16157. })
  16158. // 발신 이벤트 선언
  16159. const emit = defineEmits(["closePop", "selectTarget"])
  16160. /***********************
  16161. * data & created
  16162. ************************/
  16163. const coreList = ['AMF', 'SMF', 'UDC', 'MEC', 'UPF']
  16164. const ranList = ['CU', 'DU', 'RU', 'AU']
  16165. const myTreeView = ref([])
  16166. const userLevel = ref('')
  16167. const userTenant = ref('')
  16168. /***********************
  16169. * Watch & computed
  16170. ************************/
  16171. const getNeType = computed(() => {
  16172. return (val) => {
  16173. if(!useUtil.isNull(val)) {
  16174. if(coreList.includes(val)) return 'core'
  16175. else if(ranList.includes(val)) return 'ran'
  16176. }else return ''
  16177. }
  16178. })
  16179. /***********************
  16180. * Methods
  16181. ************************/
  16182. onMounted(() =>{
  16183. userTenant.value = useAuthStore().getTenantName
  16184. userLevel.value = useAuthStore().getAccountLevel
  16185. /*
  16186. userlevel구분
  16187. {title: 'superAdmin', value: -1},
  16188. {title: 'adminSds', value: 0},
  16189. {title: 'managerBusiness', value: 1},
  16190. {title: 'operatorBusiness', value: 2}
  16191. */
  16192. fnInit()
  16193. })
  16194. function fnInit(){
  16195. fnGetNeTopology()
  16196. }
  16197. /**
  16198. * NE Topology 트리뷰 데이터 조회
  16199. */
  16200. function fnGetNeTopology(){
  16201. useAxios().post(useApi.getTopology).then((res) => {
  16202. $log.debug("[neMgmt][fnGetNeTopology][success]")
  16203. let list = res.data.data
  16204. let temp = []
  16205. list.forEach((item, idx) => {
  16206. let depth1 = {}
  16207. depth1.tenantName = item.tenantName
  16208. depth1.fold = true
  16209. depth1.neGroupList = []
  16210. if(item.neGroupList){
  16211. item.neGroupList.forEach((neGroup, idx2) => {
  16212. let depth2 = {}
  16213. depth2.neGroup = neGroup.neGroup
  16214. depth2.fold = true
  16215. depth2.add = false
  16216. depth2.neList = []
  16217. depth2.isAllCheck = false
  16218. depth2.selectNeList = []
  16219. if(neGroup.neList && neGroup.neList.length > 0){
  16220. neGroup.neList.forEach((ne, idx3)=> {
  16221. let depth3 = {}
  16222. depth3.neName = ne.neName
  16223. depth3.neId = ne.neId
  16224. depth3.neType = ne.neType
  16225. depth3.upfNum = ne.upfNum
  16226. depth3.customerType = ne.customerType
  16227. depth3.modify = false
  16228. depth2.neList.push(depth3)
  16229. })
  16230. if(depth2.neList.length > 0){
  16231. depth1.neGroupList.push(depth2)
  16232. }
  16233. }
  16234. })
  16235. }
  16236. if(userLevel.value == 0 || userLevel.value == -1){
  16237. if(depth1.neGroupList.length > 0){
  16238. temp.push(depth1)
  16239. }
  16240. } else{
  16241. if(depth1.neGroupList.length > 0 && userTenant.value == depth1.tenantName){
  16242. temp.push(depth1)
  16243. }
  16244. }
  16245. })
  16246. myTreeView.value = _cloneDeep(temp)
  16247. }).catch((error)=>{
  16248. $log.debug("[neMgmt][fnGetNeTopology][error]")
  16249. useErrorHandler().fnSetCommErrorHandle(error, fnGetNeTopology)
  16250. }).finally(()=>{
  16251. $log.debug("[neMgmt][fnGetNeTopology][finished]")
  16252. })
  16253. }
  16254. const checkList = ref([])
  16255. function fnAllCheck(event, obj) {
  16256. if(event) {
  16257. obj.neList.forEach((item) => {
  16258. obj.selectNeList.push(item.neId)
  16259. })
  16260. }else{
  16261. obj.selectNeList = []
  16262. }
  16263. }
  16264. function fnCheckNeBox(event, group){
  16265. group.isAllCheck = group.selectNeList.length === group.neList.length
  16266. }
  16267. function fnSave(){
  16268. let selectItems = {
  16269. tenantName: [],
  16270. groupName: [],
  16271. neName: [],
  16272. singleData: []
  16273. }
  16274. myTreeView.value.forEach((tenant)=>{
  16275. let successfulNeGroups = []
  16276. let failedNeGroups = []
  16277. tenant.neGroupList.forEach((neGroup)=>{
  16278. let neGroupChk = neGroup.neList.every((ne,idx)=>{
  16279. let neChk = neGroup.selectNeList.includes(ne.neId)
  16280. return neChk
  16281. })
  16282. if(neGroupChk){
  16283. successfulNeGroups.push(neGroup)
  16284. } else{
  16285. failedNeGroups.push(neGroup)
  16286. }
  16287. })
  16288. //전부선택시 테넌트명 전달
  16289. if(failedNeGroups.length == 0){
  16290. if(tenant.neGroupList.length > 0){
  16291. if(tenant.neGroupList[0].neList.length > 0){
  16292. selectItems.tenantName.push(tenant.tenantName)
  16293. }
  16294. }
  16295. } else if(successfulNeGroups.length > 0){ //전부 선택하지 않았을시 그룹명 전달
  16296. successfulNeGroups.forEach(item=>{
  16297. selectItems.groupName.push(item.neGroup)
  16298. })
  16299. }
  16300. //전부선택이 아닌값중 선택한값
  16301. failedNeGroups.forEach(group=>{
  16302. group.neList.forEach((ne) => {
  16303. if(group.selectNeList.includes(ne.neId)) {
  16304. let obj = {}
  16305. obj.tenantName = tenant.tenantName
  16306. obj.neGroup = group.neGroup
  16307. obj.neName = ne.neName
  16308. obj.neId = ne.neId
  16309. selectItems.neName.push(obj)
  16310. }
  16311. })
  16312. })
  16313. //이벤트 이력 개별 neName값
  16314. tenant.neGroupList.forEach((neGroup)=>{
  16315. neGroup.neList.forEach((ne) => {
  16316. if(neGroup.selectNeList.includes(ne.neId)) {
  16317. let obj = {}
  16318. obj.tenantName = tenant.tenantName
  16319. obj.neGroup = neGroup.neGroup
  16320. obj.neName = ne.neName
  16321. obj.neId = ne.neId
  16322. selectItems.singleData.push(obj)
  16323. }
  16324. })
  16325. })
  16326. })
  16327. emit('selectTarget', selectItems)
  16328. }
  16329. </script>
  16330. <style lang="scss" scoped>
  16331. .checked-text{
  16332. color:#7ba1c5;
  16333. }
  16334. .label-text{
  16335. font-size: 0.75rem;
  16336. margin-left: 0.63rem;
  16337. line-height: 1.06rem;
  16338. white-space: nowrap;
  16339. text-overflow: ellipsis;
  16340. overflow: hidden;
  16341. display: block;
  16342. }
  16343. </style>
  16344. </file>
  16345. <file path="components/common/topologyPopMgmt.vue">
  16346. <template>
  16347. <div class="ne--topology--pop">
  16348. <div class="v-common-dialog-wrapper custom-dialog">
  16349. <div class="modal-tit">NE Topology</div>
  16350. <div class="v-common-dialog-content">
  16351. <div class="dialog-tree">
  16352. <div class="tree-area">
  16353. <div class="tree-depth1">
  16354. <ul>
  16355. <li class="depth1-item" v-for="(tenant, index) in myTreeView" :key="index">
  16356. <div class="depth-item-tit depth1-item-tit" :class="[tenant.fold ? '' : 'down']">
  16357. <button class="arr" :class="[tenant.neGroupList.length == 0 ? 'nor' : '']" @click="tenant.neGroupList.length > 0 && (tenant.fold = !tenant.fold)"></button>
  16358. <i class="ico"></i>
  16359. <strong>{{ tenant.tenantName }}{{tenant.neGroupList.length > 0 ? '('+tenant.neGroupList.length+')': ''}}</strong>
  16360. <!-- <button class="btn-tree btn-add" @click="addTree2(tenant, index)"></button> -->
  16361. </div>
  16362. <div class="tree-depth2" v-if="tenant.fold">
  16363. <ul>
  16364. <!-- <li class="depth2-item" v-if="tenant.add">
  16365. <div class="depth-item-tit depth2-item-tit depth-item-reg">
  16366. <button class="arr"></button>
  16367. <i class="ico"></i>
  16368. <v-text-field
  16369. class="custom-input mini"
  16370. placeholder=""
  16371. v-model="addGroupTitle"
  16372. ></v-text-field>
  16373. <button class="btn-tree btn-save" @click="saveTree2(tenant)"></button>
  16374. </div>
  16375. </li> -->
  16376. <li class="depth2-item" v-for="(neGroup, index2) in tenant.neGroupList" :key="index2">
  16377. <div class="depth-item-tit depth2-item-tit" :class="[neGroup.fold ? '' : 'down']">
  16378. <button class="arr" @click="neGroup.fold = !neGroup.fold"></button>
  16379. <i class="ico"></i>
  16380. <div class="middle-group">{{ neGroup.neGroup }}{{neGroup.neList.length > 0 ? '('+neGroup.neList.length+')': ''}}</div>
  16381. <!-- <v-checkbox
  16382. class="custom-check type2"
  16383. hide-details
  16384. v-model="neGroup.isAllCheck"
  16385. @update:modelValue="fnAllCheck($event, neGroup)">
  16386. <template v-slot:label>{{neGroup.neGroup}}{{neGroup.neList.length > 0 ? '('+neGroup.neList.length+')': ''}}</template>
  16387. </v-checkbox> -->
  16388. <!-- <button class="btn-ne-add" @click="neRegPop = true"><i class="plus"></i>NE</button>
  16389. <button class="btn-tree btn-pos"></button> -->
  16390. </div>
  16391. <div class="tree-depth3" v-if="neGroup.fold">
  16392. <ul>
  16393. <li class="depth3-item" v-for="(ne, index3) in neGroup.neList" :key="index3">
  16394. <div class="depth-item-tit depth3-item-tit">
  16395. <i class="ico" :class="getNeType(ne.neType)"></i>
  16396. <v-checkbox
  16397. class="custom-check type2"
  16398. hide-details
  16399. v-model="selectItem"
  16400. :value="tenant.tenantName+' '+neGroup.neGroup+' '+ne.neName+' '+ne.neType"
  16401. :id="neGroup.neGroup+ne.neName"
  16402. ><!--@update:modelValue="fnCheckNeBox($event, neGroup)"-->
  16403. <template v-slot:label v-if="ne.modify == false">{{ ne.neName }}</template>
  16404. </v-checkbox>
  16405. </div>
  16406. </li>
  16407. </ul>
  16408. </div>
  16409. </li>
  16410. </ul>
  16411. </div>
  16412. </li>
  16413. </ul>
  16414. </div>
  16415. </div>
  16416. </div>
  16417. </div>
  16418. <div class="btn-wrap">
  16419. <v-btn
  16420. class="custom-btn btn-white mini"
  16421. @click="$emit('closePop')"
  16422. >
  16423. 취소
  16424. </v-btn>
  16425. <v-btn
  16426. class="custom-btn btn-blue mini"
  16427. @click="fnSave"
  16428. >
  16429. 선택
  16430. </v-btn>
  16431. </div>
  16432. </div>
  16433. </div>
  16434. </template>
  16435. <script setup>
  16436. /***********************
  16437. * import
  16438. ************************/
  16439. import { useI18n } from "vue-i18n"
  16440. import useUtil from "@/composables/useUtil"
  16441. import useValid from "@/composables/useValid"
  16442. /***********************
  16443. * plugins inject
  16444. ************************/
  16445. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  16446. // props
  16447. const props = defineProps({
  16448. isTopologyPop: Boolean,
  16449. })
  16450. // 참조가능 데이터 설정
  16451. defineExpose({
  16452. fnInit,
  16453. })
  16454. // 발신 이벤트 선언
  16455. const emit = defineEmits(["closePop", "selectTarget"])
  16456. /***********************
  16457. * data & created
  16458. ************************/
  16459. const coreList = ['AMF', 'SMF', 'UDC', 'MEC', 'UPF']
  16460. const ranList = ['CU', 'DU', 'RU', 'AU']
  16461. const myTreeView = ref([])
  16462. const selectItem = ref('')
  16463. const userLevel = ref('')
  16464. const userTenant = ref('')
  16465. /***********************
  16466. * Watch & computed
  16467. ************************/
  16468. const getNeType = computed(() => {
  16469. return (val) => {
  16470. if(!useUtil.isNull(val)) {
  16471. if(coreList.includes(val)) return 'core'
  16472. else if(ranList.includes(val)) return 'ran'
  16473. }else return ''
  16474. }
  16475. })
  16476. /***********************
  16477. * Methods
  16478. ************************/
  16479. onMounted(() =>{
  16480. userTenant.value = useAuthStore().getTenantName
  16481. userLevel.value = useAuthStore().getAccountLevel
  16482. fnInit()
  16483. })
  16484. function fnInit(){
  16485. fnGetNeTopology()
  16486. }
  16487. /**
  16488. * NE Topology 트리뷰 데이터 조회
  16489. */
  16490. function fnGetNeTopology(){
  16491. useAxios().post(useApi.getTopology).then((res) => {
  16492. $log.debug("[neMgmt][fnGetNeTopology][success]")
  16493. let list = res.data.data
  16494. let temp = []
  16495. list.forEach((item, idx) => {
  16496. let depth1 = {}
  16497. depth1.tenantName = item.tenantName
  16498. depth1.fold = true
  16499. depth1.neGroupList = []
  16500. if(item.neGroupList){
  16501. item.neGroupList.forEach((neGroup, idx2) => {
  16502. let depth2 = {}
  16503. depth2.neGroup = neGroup.neGroup
  16504. depth2.fold = true
  16505. depth2.add = false
  16506. depth2.neList = []
  16507. depth2.isAllCheck = false
  16508. depth2.selectNeList = []
  16509. if(neGroup.neList && neGroup.neList.length > 0){
  16510. neGroup.neList.forEach((ne, idx3)=> {
  16511. let depth3 = {}
  16512. depth3.neName = ne.neName
  16513. depth3.neId = ne.neId
  16514. depth3.neType = ne.neType
  16515. depth3.upfNum = ne.upfNum
  16516. depth3.customerType = ne.customerType
  16517. depth3.modify = false
  16518. depth2.neList.push(depth3)
  16519. })
  16520. if(depth2.neList.length > 0){
  16521. depth1.neGroupList.push(depth2)
  16522. }
  16523. }
  16524. })
  16525. }
  16526. if(userLevel.value == 0 || userLevel.value == -1){
  16527. if(depth1.neGroupList.length > 0){
  16528. temp.push(depth1)
  16529. }
  16530. } else{
  16531. if(depth1.neGroupList.length > 0 && userTenant.value == depth1.tenantName){
  16532. temp.push(depth1)
  16533. }
  16534. }
  16535. })
  16536. myTreeView.value = _cloneDeep(temp)
  16537. }).catch((error)=>{
  16538. $log.debug("[neMgmt][fnGetNeTopology][error]")
  16539. useErrorHandler().fnSetCommErrorHandle(error, fnGetNeTopology)
  16540. }).finally(()=>{
  16541. $log.debug("[neMgmt][fnGetNeTopology][finished]")
  16542. })
  16543. }
  16544. const checkList = ref([])
  16545. function fnAllCheck(event, obj) {
  16546. if(event) {
  16547. obj.neList.forEach((item) => {
  16548. obj.selectNeList.push(item.neId)
  16549. })
  16550. }else{
  16551. obj.selectNeList = []
  16552. }
  16553. }
  16554. function fnCheckNeBox(event, group){
  16555. group.isAllCheck = group.selectNeList.length === group.neList.length
  16556. }
  16557. function fnSave(){
  16558. let selectItems = selectItem.value
  16559. emit('selectTarget', selectItems)
  16560. }
  16561. function toggleChk(id){
  16562. console.log('%c[id]','color:#bada55',id);
  16563. let checkBox = document.getElementById(id)
  16564. checkBox.click()
  16565. }
  16566. </script>
  16567. <style lang="scss" scoped>
  16568. .checked-text{
  16569. color:#7ba1c5;
  16570. }
  16571. .label-text{
  16572. font-size: 0.75rem;
  16573. margin-left: 0.63rem;
  16574. line-height: 1.06rem;
  16575. white-space: nowrap;
  16576. text-overflow: ellipsis;
  16577. overflow: hidden;
  16578. display: block;
  16579. }
  16580. .middle-group{
  16581. height: auto;
  16582. padding-left: 0.94rem;
  16583. margin: 0;
  16584. font-size: 0.81rem;
  16585. font-weight: 400;
  16586. color: #333;
  16587. opacity: 1;
  16588. }
  16589. </style>
  16590. </file>
  16591. <file path="components/home/dashboard/common/map/mapBusan.vue">
  16592. <template>
  16593. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  16594. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  16595. <g id="부산">
  16596. <g>
  16597. <path fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" d="M497.991,77.513l1.382-2.008l-2.385-1.632
  16598. l-1.507,0.879l-3.263-0.376l-2.134-1.506l-2.134,0.251l-2.008-3.389l-3.012,2.008l-6.401-2.761l1.381-2.385l2.635-2.886
  16599. l-0.501-3.012l1.381-2.761l-0.252-3.388l-3.388-3.138l0.502-5.396l1.631-5.271l-3.138-1.38l-1.631-6.526l-2.762-2.761
  16600. l-2.008-1.381l-0.879-3.263l-2.133-2.008l-2.636-0.627l0.251-2.26l-1.632-2.384l-0.251-3.891l-3.515,2.761l-3.64,0.628
  16601. l-3.011-1.004l-2.134-2.385l-3.139-0.753l0.628,4.142l-2.761,2.134l-2.636-1.757l-3.012,1.004l-1.004-2.636l-1.632,2.008
  16602. l-2.637,0.753l-1.129,3.64l-4.267-1.255l-3.138,0.878l-3.64,0.126l-5.397,1.757l-2.384-1.004l-1.758-1.004l-2.635-0.125
  16603. l-3.891-2.51l-1.757-1.757l-2.26-3.514L398.467,12l-2.384,4.142l-3.013,4.141l1.004,2.636h1.129l1.382,3.138l1.882,1.631
  16604. l-1.255,5.271l1.255,5.899l-5.396,4.016v2.635l-3.263,1.255h-2.511l-2.007,1.38l-2.637,3.765v2.384h-2.51l-1.632,2.385
  16605. l-3.138,0.502l-2.761-1.38l-2.26-1.883l-2.008,0.125l-3.137-2.51l-2.888-1.13l-1.003-3.514l-10.041-4.895l-2.636-0.125
  16606. l-1.757,1.004l-1.632-2.134l-5.271-1.004l-3.891,0.627l-3.013-0.377l-4.392-2.384l-3.139-0.125l-1.757,0.376l-4.017-2.008v2.008
  16607. l2.26,1.381l1.631,3.138l2.009,1.003l1.882-0.125l2.385,3.891l2.135,0.879l2.007,2.761l0.628,2.761l1.255,2.008l-0.627,2.761
  16608. l-3.514,1.255l-3.39,4.518l1.632,1.757l-2.134,1.882l-0.502,2.761l-1.506,1.632l-0.628,2.385l1.632,1.506l0.753,3.012
  16609. l-1.255,2.385l-3.766,2.51l-1.756,3.64l-1.131,3.514l-1.631,1.882l-2.385,1.255l-1.882,3.765l0.502,8.032l-1.256,3.64
  16610. l-2.384,2.259l-2.26-1.255l-5.146,2.008l-2.887,1.381h-7.279l-4.142,2.384l-2.636,3.389l-2.761,2.134l-1.13,2.008l-5.396,5.396
  16611. l-3.389-4.769l-1.506,1.38l-2.385-1.004l-4.267-0.879l-4.268,0.126l-1.506,4.142l-3.139,3.138l-1.129,3.765v1.631l2.134,1.506
  16612. l-0.753,2.008l-2.51,1.129l-2.762,4.393v3.011h-1.38h-1.506l-8.033-1.631l-2.007-1.631l-4.268-0.251l-12.173,1.757l-4.519,1.757
  16613. l1.13,4.393l-14.685,37.777l-3.093,3.825l-1.676,2.073l-18.072,7.405l-12.299,1.38l-6.275,1.381h-7.154l-5.02-4.393l-3.891,1.506
  16614. l-3.766,2.887l-5.522,5.647l-9.789,4.519l-2.008-1.632l-1.506,1.632l-3.64-6.652l-3.138-1.255l-4.644,3.891l4.895,5.522h-2.51
  16615. h-3.013l-7.279,2.636l-7.154-2.008l-1.883,0.753l-1.757-0.502l-1.757,1.757v1.506l-1.38,0.878l-0.753,1.13h-3.012l-3.514,6.652
  16616. l-2.384,1.003l-2.134,2.636l1.757,2.055l3.891,8.613l-0.628,4.017l1.506,2.761l4.519,4.518v1.883l-1.506,2.134l0.125,6.526
  16617. l1.38,3.138l-7.781-3.138l-1.506,2.385l4.393,2.51l1.255,2.008l-1.506,1.381l-0.125,1.757l2.008,1.632l0.251,2.385l1.882,0.878
  16618. h1.381l-0.125,2.887l-6.15-0.753l-1.38,1.882l1.129,1.256l-0.376,4.393l2.133,2.887l-4.894,0.502l-6.652-8.534v-2.134l1.757-0.502
  16619. l1.506,1.632l1.506-0.126l0.878-3.012l2.008-1.255l-1.506-4.017l-3.64-2.887l-5.898,0.377l-2.259-0.377l-1.381,1.506l-5.02,0.754
  16620. l-1.757,1.255l-2.259-0.377l-3.012,1.255l-1.129,2.511v2.007l-1.38,3.39l-4.268-1.757l-2.51,0.125l-1.757,2.636l-2.887,0.377
  16621. l-1.38-0.502l-2.259,2.007l-4.142-0.878l-1.38-2.26l-3.138-1.003l-2.008-1.883l-2.635,1.506l-1.882-0.878l-2.762,1.129
  16622. l-3.012-1.757l-3.765,0.879l-0.878,2.007H9.53l-1.506-1.505l-2.51,0.502l-0.753,2.008l0.879,1.506l-0.879,2.636l2.259,0.879
  16623. l1.004,1.505l1.506,0.754l2.008,5.02l1.757,0.753l0.125,2.636l-0.627,2.762h2.886l2.259-1.256l0.879,2.26l-0.627,2.259
  16624. l4.518,2.887l2.636,4.268l3.137,0.627l4.393,1.631h2.259l1.882,1.633l-0.125,1.882h3.012l3.64-2.259l1.506,1.757v3.013
  16625. l3.514,3.138l-1.004,2.761l-1.882,2.384l2.133,4.143l3.012,0.502l1.757,1.882l0.502,5.272l-1.757,3.639l-6.4,4.77l-2.636-1.129
  16626. l-8.535,1.129l-2.384,5.146l3.263,2.008l0.125,2.009l4.393,4.267l-2.51,2.762v2.258h-5.02l0.376,2.26h-3.891v1.757h-5.898v6.4
  16627. h20.081v6.652l-37.526,8.408l0.753,2.887L2,401.063v9.789h5.647l1.632,1.632l-0.251,1.883l1.004,2.385l5.397,0.753h1.631
  16628. l-0.125,2.51l1.632,2.385l3.765,2.761l0.878,4.393l-0.878,3.765l-0.879,1.632l-2.51-0.501l-1.004,1.505l1.255,2.637l2.511,1.129
  16629. h3.137l0.753,2.887l-0.628,2.636l-1.883,1.506l-5.522-2.008l-1.882,0.377l-0.376,1.631l1.631,0.878l-0.376,1.632l4.644-0.878
  16630. l0.376,2.51h2.51l3.138,1.13l5.271,2.384h1.506l3.389,3.891v2.134l-0.878,1.757l-5.647,1.005l1.631,2.133l1.883,0.879
  16631. l-0.502,2.761h-4.016l0.627,3.013l0.753,1.255l1.631-0.503l0.753,3.891l-1.254,1.131l0.25,3.138h1.883l3.765-2.134l1.757,1.38
  16632. l-0.251,2.259l-2.887,4.017l2.134,1.506l4.267-5.271l1.38,0.502l0.125-3.012l2.008-2.384l2.51-0.753l-1.757-3.013l3.263-6.024
  16633. l-1.004-3.891l-5.522-3.138l1.004-5.899l3.389-4.643l4.392-4.77l0.376-3.765l-2.008-1.758l2.259-4.769l4.77-4.518l2.008-5.773
  16634. l-1.255-2.386l1.004-7.655l-4.142-8.032l-1.882,1.255l-1.757,0.377l-0.628,1.506l-4.644,0.377l-3.64-2.511l-0.502-3.891
  16635. l0.376-2.761l2.008-1.004l-0.251-3.766l-1.381-1.38l1.632-0.754v-17.067l0.502-1.758l-1.13-3.765h1.883l1.129,3.64h27.736
  16636. l3.64-2.511l2.008,0.754l-2.008,1.631l-1.255,2.134l1.129,1.255l13.554,2.134l-0.752-3.012l2.761-7.154l1.882-1.758l1.13-21.837
  16637. l0.753-2.384l3.138-3.013l0.878-3.891l2.134-4.644l1.38-1.757l7.907,2.761l-1.004,2.635l-3.012,2.762l-1.38,3.013l0.251,3.765
  16638. l0.25,1.757l-5.647,23.971l0.251,8.535h14.81l1.506-0.628v-8.032l0.753-1.506l11.421-5.522l5.522-0.125l0.251-3.64l1.004-2.511
  16639. l-2.385-4.393l1.255-1.255l0.25-2.636l-0.753-1.882h2.259l0.627-2.134l-0.879-1.506l0.628-1.507l1.601,0.462l4.925,1.422
  16640. l-0.627,2.384l-2.51,0.628l-1.757,6.525l1.129,0.502l-2.384,7.028l0.376,2.009l-1.004,2.51l1.129,2.761l0.125,2.887l0.879,1.13
  16641. l3.263-1.883l1.254-2.385l2.259,0.251l-0.502,3.64l1.882-1.004l1.506-5.396l2.887-8.911l-0.753-4.142l1.757-6.777l7.279,1.13
  16642. l-0.878,14.308l-1.381,5.021l-2.761,5.898l-0.628,4.519l6.903,33.007l2.008,6.777l4.142,4.142l2.761-0.126l1.505,1.13
  16643. l-1.631,5.397l-2.133,2.887l0.627,3.765l1.757,1.255l1.38-1.757l-0.627-2.761l1.631-1.13l2.133-0.125l1.883-4.269l3.639,1.131
  16644. l1.255-1.382l-3.891-2.635l-4.769-3.389l1.882-2.636l3.138-0.878l1.255,1.882l3.765-0.753l1.255,2.762l2.008-0.629l-1.38-3.891
  16645. l1.129-2.258l-3.138-2.26l-5.271,0.126l-2.133-1.883l0.753-2.51l2.887-0.251l3.012-0.126l5.397-3.138l3.263,2.386l4.77,11.546
  16646. l-0.377,3.389l3.891,1.631l1.979-0.628v-2.259l3.417-2.008l-3.417-10.919l-2.732-6.902l-0.564-10.041l-1.569-2.385l2.133-1.38
  16647. l-2.636-6.275l0.251-5.02l3.891,1.38l0.627,3.64l2.637,0.627l1.004-2.509l-2.008-2.009l3.138-1.882v-1.758l2.509,1.883
  16648. l-1.129,4.268l0.412,4.258l0.717,7.413l3.891,6.526l2.762,1.13l-1.004,2.385l-2.761,0.251l0.251,2.887l3.389,9.79l3.766-1.382
  16649. l-0.753-2.51l1.129-2.51l2.259,0.251l4.142-5.648l-2.511-3.263l0.502-5.772l-1.756-2.26l-1.757-3.013l1.003-2.509l3.39-1.382
  16650. l1.254,2.009l2.008-0.376l2.133-11.045l-1.631-9.413v-2.51l3.263-0.753l5.523-1.004l0.627,1.38l2.26-1.004l1.003-2.761v-4.268
  16651. l6.15-5.898l1.757-0.502l0.631-0.703l4.891-5.447l-4.267-3.138l2.51-3.64l-1.882-2.258l2.886-4.771l3.013-1.505l0.502,4.016
  16652. l-2.135,2.385l2.511,2.636l8.66-10.542l2.008,1.882l-1.757,2.887l3.64,2.134l1.506-2.259l2.762,1.505l-3.64,4.394l2.761,2.635
  16653. l-5.773,9.162l8.409,5.522h14.81l0.627-6.149l3.013-0.251l1.004,17.696l4.016,3.389l6.401-0.503l-3.264-3.514l10.542-9.789
  16654. l1.757,3.138l3.64,1.129l4.52,0.502l1.505-2.385l-1.004-1.757l2.636-6.4l0.879-5.396l1.506-3.64l0.125-3.766l-3.263-4.393
  16655. l-1.632-1.129l-1.129-3.264l0.377-2.51l-1.256-4.77l-1.506-2.51l-2.385,2.887l-5.271-3.891l2.761-4.644l3.137-1.256l-0.376-7.279
  16656. l-3.389-0.753l0.628-2.887l3.891-4.894l2.886-1.381h1.256l0.376,2.259l10.543-2.511l0.125-2.258l-6.149-8.786l-2.762-1.506
  16657. l1.633-1.883l4.518,3.013l8.282,8.66l1.256,2.635l4.895,1.883l0.627-3.514l5.523-2.26l-2.511,4.519l-0.126,2.635l2.888,0.502
  16658. l1.882-4.769l0.754-2.385l4.142-1.255l9.161-0.627l6.902,5.145h4.645l3.012-1.756l2.008-3.64l6.777-0.753l0.502-2.511l2.511-3.64
  16659. l1.004-8.408l-0.753-3.766l2.51-4.017l4.017-1.757l1.129,2.636l2.385-1.506l-0.628-2.51l0.989-0.283l2.524-0.722v2.26l2.385-0.628
  16660. l0.753-3.389v-1.91l2.385-2.23l2.511,4.393l5.02-2.162l-0.878-5.117l2.008-3.264v-2.887v-2.008l4.393,0.125l1.255-6.024
  16661. l-0.878-3.264l-4.519-4.016l-2.887-3.766l-0.125-3.514l2.635-2.134l3.389-3.388l-1.38-7.028l3.138,0.126l0.627,2.635v2.008
  16662. l3.891,0.879l3.138-1.004l2.134-4.518v-3.514v-2.511l2.259,0.502l2.511-2.384v-3.765l-2.762-5.02l3.765,0.502l3.138-3.388
  16663. l-2.007-2.385l-2.762-1.254l2.762-2.51l3.388,2.133l1.758-1.883v-5.522l-0.753-6.275l0.753-4.142l-4.393-0.627l-2.887,2.762
  16664. l-0.753-3.138l-3.515,1.506l-2.385,1.882l-3.64-0.878l-1.506-3.891l1.004-3.891l2.008-0.753l4.017,0.251l2.134-1.255l1.632-2.887
  16665. l-1.382-2.133l2.511-2.635l5.899,1.38l3.263-4.769v-6.275l1.882-2.259h2.386l-0.879-4.268l-1.507-3.891l3.515-2.761l-0.878-2.134
  16666. l0.878-2.008v-3.514l-1.129-3.891l0.125-2.51l-1.632-2.384l2.636-4.644l2.134-7.655l3.64-6.276l3.891-2.008l5.521-2.51
  16667. l5.021-2.385l3.264,0.376v3.388h3.263v6.025l5.396,1.129l4.644-1.003l1.758-1.883v-2.51l2.007-1.004L500,88.181v-6.526
  16668. L497.991,77.513z"/>
  16669. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="289.78,388.387
  16670. 293.546,386.629 294.55,384.747 297.437,383.868 299.193,378.974 296.182,377.845 293.797,378.974 290.282,382.487
  16671. 289.027,382.237 287.396,385.375 286.016,385.375 282.25,378.096 280.744,375.334 282.501,373.954 280.869,371.82
  16672. 273.465,361.654 268.319,358.642 263.173,355.505 262.671,352.994 260.162,354.751 254.765,356.133 255.392,358.391
  16673. 253.51,358.894 252.883,357.513 249.118,358.894 243.344,361.528 241.21,362.407 240.081,363.286 241.336,365.545
  16674. 236.943,362.407 235.186,363.662 238.324,369.938 237.822,373.2 243.47,378.723 245.227,378.723 251.878,385.375 261.291,391.65
  16675. 265.182,391.65 268.319,393.281 268.319,401.063 272.586,402.819 274.595,405.456 277.48,402.443 280.116,402.819
  16676. 282.376,404.827 282.376,407.965 284.509,408.467 284.509,410.225 284.509,413.613 286.141,414.617 289.53,415.997
  16677. 292.166,414.742 294.55,414.24 295.428,412.231 294.926,410.35 299.193,403.698 293.922,401.941 290.157,399.18 287.897,394.662
  16678. 287.271,391.775 283.129,391.022 282.627,389.391 287.396,387.634 "/>
  16679. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="57.724,393.281 52.578,392.151
  16680. 50.821,388.889 50.444,386.253 47.432,385.249 47.432,387.509 47.432,390.144 46.805,394.788 49.942,394.788 50.57,397.799
  16681. 55.464,398.553 57.975,401.313 67.262,397.674 64.25,392.779 61.112,392.151 "/>
  16682. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="93.869,396.042 93.869,393.281
  16683. 91.986,394.473 83.828,392.779 75.294,392.151 71.278,391.65 69.897,389.642 67.262,391.65 68.643,393.281 74.416,395.29
  16684. 79.561,397.925 84.331,399.306 90.229,398.678 91.861,397.674 93.869,397.548 "/>
  16685. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="113.196,400.31
  16686. 113.196,402.318 116.459,404.953 122.204,406.459 124.617,407.84 128.131,401.313 123.613,400.686 117.714,401.313
  16687. 118.593,399.306 "/>
  16688. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="122.734,408.97
  16689. 107.549,403.572 100.144,401.313 97.257,397.674 93.869,399.808 98.387,404.2 122.204,411.479 124.743,413.487 129.01,412.357
  16690. 126.876,409.095 "/>
  16691. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="142.313,410.476
  16692. 148.839,407.024 154.864,405.581 150.973,403.572 141.309,403.572 "/>
  16693. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="158.377,415.244 137.67,412.86
  16694. 136.415,407.024 133.653,408.718 134.281,414.24 156.37,417.127 161.264,417.629 163.021,415.997 162.519,414.115 "/>
  16695. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="117.087,384.496
  16696. 109.933,390.646 112.066,392.528 115.205,389.14 121.605,385.751 131.269,383.742 131.269,381.233 124.868,381.233 "/>
  16697. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="155.491,393.281
  16698. 152.855,387.885 150.346,383.994 148.086,386.378 149.216,390.269 152.855,393.281 "/>
  16699. </g>
  16700. </g>
  16701. </svg>
  16702. </template>
  16703. </file>
  16704. <file path="components/home/dashboard/common/map/mapChungbuk.vue">
  16705. <template>
  16706. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  16707. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  16708. <g id="충청북도">
  16709. <path fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" d="M468.791,77.506l-2.754-1.835v-2.229
  16710. l-1.966-2.753l-5.506,4.719l-1.704-2.622l-2.884,1.835l-6.686-1.835l-3.277-3.54l-2.753,1.966l-5.637-1.573l-0.393-3.802
  16711. l-2.491-1.18l-3.54,1.048l-1.572-5.505l-3.146-4.326l-4.194,2.622l-2.359,3.54h-6.948l-2.752-0.656l-1.312,1.966l-2.884-1.835
  16712. l-1.18,1.442l-2.753,2.36l-0.394-4.588l-2.753-3.933l-4.063-2.491l-2.36-0.655l3.016-4.326l-3.016-4.194l-3.276-1.704l-1.966,1.573
  16713. l-4.458-1.704l-1.18,2.49l-2.884-2.752l-3.933,0.394l-3.015,2.622l-5.769,3.146l-4.193,3.146l-2.884-3.54l-5.375-2.752
  16714. l-1.967-3.802l1.835-4.195l3.146-1.18l5.112,1.18l0.524-5.112l4.063-2.36l1.441-3.277l3.146-0.787l1.704-3.67l1.181-3.933h-3.408
  16715. l-2.753-2.359l-2.098,2.49l-6.161,0.918l-2.229,1.704l-3.933,0.524l-4.194-4.063l-2.36-4.457l-2.229,1.573l-2.884-1.573
  16716. l-1.572,0.917l-4.457-6.686l-3.277-1.835l-5.375,2.884l-4.981,3.671l0.655,2.229l-1.441,4.457l-1.835,1.049l-4.195-1.966
  16717. l-2.753-1.967l-0.131-2.097l-3.539-0.917l-2.098-1.704l-2.622,5.244l-2.359,5.636l-3.933,2.884l-6.554,2.884h-5.244l-4.588,1.835
  16718. l-3.276-0.131l-1.574-3.277l-0.393-3.408l3.276-3.539l-2.884-3.802l-2.884-1.311l-0.524-6.292l-2.359-2.36l-6.161-2.49L258.788,2
  16719. l-7.733,3.278l-3.277,2.49l-0.655,1.967l-3.015,0.262l-3.933,3.932l-0.787,2.229l1.967,2.229l1.441,4.981l-0.393,3.933l1.31,3.408
  16720. l-1.048,5.375l-2.49,4.981l-3.278-2.884l-2.621,1.704l-1.967,6.161l-2.489-3.54l-4.982-1.835l-3.933,0.524l-1.18,2.491l-2.49-0.656
  16721. l-1.442,1.442l-6.03,0.262l-4.85,2.229l-4.063,0.393l-3.802,1.311l-7.603-5.768l-4.064-5.898l-2.228-12.978v-3.408l-3.147,1.18
  16722. l-3.276,11.536l-3.54-1.049l-3.67,6.162v4.457l-3.015,2.884v4.195l-2.754,2.359l-8.389-2.229l-3.933-4.457l-6.424-1.704
  16723. l3.408,5.899l-1.835,8.652l1.312,2.229l-0.524,5.637l-8.391,5.244l-3.146-0.524v2.491l1.836,2.49l0.262,3.015l-3.54-2.491
  16724. l-4.85-0.787l-4.195,6.162l0.918,1.966l-0.262,3.408l-3.146,2.098l-8.521-5.375l-4.981-1.311l-1.967,2.098l-0.524,1.704
  16725. l-3.932,0.655l-3.408-3.015l-6.293,0.918l-2.884,4.326L91.26,97.3l-2.491,0.787l-2.218,2.415l-3.681,4.008h-4.326l-3.277,2.098
  16726. h-5.112l-2.753,6.292l4.981,5.768l-1.209,2.097h-3.772l-2.884,5.899h-5.243l-2.098-2.359l-4.326,4.981l-7.21,3.54l-2.622,1.442
  16727. h-4.457l2.752,6.162l-2.752,6.338l-2.098,2.182l1.442,1.311l5.112,2.359l0.394,4.588v1.443l-1.704,2.882l2.228,1.967h5.112
  16728. l3.146,0.917l-0.524,4.477l-0.656,4.802l3.409,0.946h2.884l1.311,1.704l1.704,2.36l4.194,1.966h2.36l3.277,4.194l2.228,2.098
  16729. l-1.835,4.981l3.146,4.457h2.491l2.884,6.292l-3.146,1.049l-2.359,4.326l-3.933-2.098l-3.67-3.146l-6.292-1.049l-3.802,3.277
  16730. l-4.719,0.656l-0.262,2.359l3.408,4.063l-1.966,2.622l-3.277-2.359l-6.554,6.03l-0.262,5.898l-6.816,5.375l6.555,3.146
  16731. l-0.524,7.341l-3.409,2.49l-2.622,1.574l-3.277,6.554l1.704,2.622l3.408-1.967l1.704,6.029l2.884,7.996l-0.393,3.277l-1.835,2.885
  16732. l3.146,1.441h4.85l4.064,5.113l0.394,3.801l3.015-1.311l3.54,1.311l4.85-2.752l1.573,1.834l-0.263,3.408l2.622,5.113l3.772,0.787
  16733. l1.341-0.787l2.097,4.326l0.263,3.014h-2.622l-1.079,1.443l3.569,4.063l0.394,5.244l-3.963,1.311l2.521,3.539l-1.966,9.963
  16734. l2.098,1.443h8.389l3.671,1.572l3.014,0.656l3.803-3.279l1.18-6.16l5.637-1.441l-1.049,4.457l-1.574,3.67l3.016,1.703l4.981-1.572
  16735. l0.524,1.967l-3.671,4.326l-1.048,3.67l2.359,4.852l1.18,3.932l2.621,1.049l1.573-6.293l2.229,1.049l3.933-0.523l3.146,1.049
  16736. l5.768,7.996l-2.49,2.227l-4.063-1.18l-4.72,3.803l-0.263,8.914l-2.359,5.637l-4.719,3.801l-1.835,11.012l0.917,4.195l-2.229,1.049
  16737. l-0.393,1.572l2.359,4.98l-3.409,4.459v7.34l1.442,6.029h5.244l3.671-1.965l5.242-3.539l-0.13,2.752l1.572,1.311l2.884,1.441
  16738. l-2.228,4.982h4.193l4.064-2.623l4.194,0.525l4.457,5.244l1.18,4.98l-2.229,3.67l1.442,4.064l-0.381,1.236l-0.668,2.172
  16739. l2.098,2.883l-0.131,4.852l-2.622,3.539l-0.523,5.768l3.669,5.506l2.623,1.836l2.489,2.621l-0.13,4.195l0.393,3.275h1.704
  16740. l3.016,3.672l0.917,3.67l2.884,2.359l3.277,5.506l1.704,5.375h1.967l1.967-1.18l-1.181-3.803l6.161-4.719l2.491,1.967v5.898
  16741. l1.834,2.754l4.326,0.654l5.506,1.313l2.753,2.621l1.835-2.229l3.016,2.229h1.835l-0.918,4.063l3.015,0.656l4.327-1.836l1.835,1.18
  16742. l3.933-4.588l6.816-0.918l7.864-4.193l2.885,1.441l4.063,4.064l3.539,0.916l1.836-2.096v-3.277l5.505-1.313l2.099-3.932
  16743. l3.538-2.229l4.326,1.572l3.933-2.359l2.229-3.275l2.491-1.182v-4.85l-0.787-5.242l3.277-4.459v-4.324l1.311-1.836l2.885-0.918
  16744. l2.753-3.014v-4.459v-2.621l1.834-2.752l-1.704-3.934l-1.441-2.227l-0.655-3.016l-2.359-6.031l2.622-2.49l3.014-0.393l1.836-2.361
  16745. l4.719-0.916l6.161,3.408l1.836,2.883l6.423-3.145l-2.622-3.016v-2.623l-3.015-2.096l-0.655-3.672l-2.229-3.932l2.359-4.719
  16746. l2.229-0.131l1.049-2.098l-6.162-2.49l-1.966-1.967l-4.851-1.572l-4.193,1.834l-2.099,1.834l-4.063,0.264l0.918,2.885l-3.671,1.965
  16747. l-6.029-3.014l-1.049-4.064l-2.885-1.049l-1.31-3.016l-5.507-1.441l-2.752-1.836l-0.524-5.637l-5.244,4.982l-2.49,5.244
  16748. l-6.293-0.656l-3.801,1.049l-0.787-7.211l-1.18-6.422l1.328-3.225l0.508-1.232l1.049-5.113l5.374-2.359l0.787-2.752h3.015
  16749. l3.409-5.244l-2.885-5.506l0.524-3.146l-2.49-4.193l-4.589-0.787l0.787-3.803l2.884-1.703l1.835-5.506l0.787-2.098l-3.933,0.262
  16750. l1.704-2.359l-0.787-5.768l1.835-2.883l0.656-5.113l0.655-4.98l-2.098-2.623l1.967-3.277l2.098-0.393l5.374-4.326l-0.917-3.277
  16751. v-6.029l-4.457-2.359l-4.195-0.918l-1.572-2.621l0.393-4.326l-3.146-4.85l-2.49-2.098l-4.195,0.262l-1.311-0.393l-2.359-1.967
  16752. l-1.704,2.359l-3.54-3.277l-5.505-4.195v-5.375l3.146-0.131l4.195-2.49l0.917-1.834l3.409,0.393l2.229,1.572l3.146-1.572
  16753. l1.704,0.393l1.311-0.918l-3.146-2.621l0.263-5.709l3.016-0.715l2.752-2.883l3.671-5.768l1.441,4.719l1.574,2.36l0.262,3.801
  16754. l3.015,1.311l3.277,0.787l1.049,4.131l2.49,3.211l0.394,2.752l2.229-0.262l-0.131-5.797l1.966-1.807l0.787-5.84l-0.655-2.812
  16755. l1.441-2.097l0.131-2.622l-2.229-1.442l-0.655-4.588h-4.325l-1.704-4.064l-4.588-1.704l-3.803,1.442l-3.539-0.917l7.342-4.981
  16756. l6.422,0.524l4.195,1.049l0.655-2.491l-1.835-3.277l4.981-1.966l2.229,0.656l-0.131-5.506l1.966-3.146l1.311-3.67l4.063,3.539
  16757. l1.704,3.277l4.589,1.835l3.146-0.131l3.801-5.112l2.753,3.539l3.277,1.049l4.457,3.67l4.588,0.524l3.276,0.131l-1.18-5.637
  16758. l-6.423-6.292l-4.719-4.194l-0.263-2.622l3.803-5.899l2.489-7.996l1.312-4.85l2.229-6.292l4.456,1.835l2.753,3.146v2.097
  16759. l3.409,1.835v-3.146l1.966-1.311l2.229,0.393l0.918-6.161l4.063-1.049l3.408-2.36V173.2l2.36-0.131l3.408,4.326l2.621,0.393
  16760. l3.933,0.131l4.457,2.098l2.36-0.262l6.16,2.098l1.836-1.049l-1.836-9.045l-0.787-3.146l0.394-1.966l6.686,2.229l1.704-2.098
  16761. l-1.311-3.146l2.491-6.162l6.815,3.147l6.031,3.408l2.359,4.588l3.015,4.588l4.194,2.36l1.573,2.622v2.229l3.671-0.131l2.229-0.131
  16762. l5.636,2.229l1.442,2.49l3.146,1.573l3.408-3.802l4.326-1.704l5.505,0.656h4.72l3.015-4.457l0.917-4.326l3.277-2.884l1.181-3.67
  16763. v-5.899l-2.622-3.015l-5.375-2.098l1.18-2.753l-0.524-1.966l4.982-4.851l1.31-5.375l-1.572-4.981l5.768-2.491l1.18-2.622
  16764. l0.656-3.277l3.932-3.409l2.753-0.524l0.524-1.573l5.768-2.884l3.016-3.802l0.524-3.802l4.063-0.786l4.588-0.656l3.54-2.359
  16765. l0.655-3.146l2.49-1.704l2.49-2.49v-2.229l-1.704-3.932l1.704-1.704l1.836,0.131l1.967-3.54l4.193,1.311l3.016-0.918l1.049-3.539
  16766. l4.195,0.917v2.097l3.408,2.098l2.359-5.899l3.276-4.588L468.791,77.506z"/>
  16767. </g>
  16768. </svg>
  16769. </template>
  16770. </file>
  16771. <file path="components/home/dashboard/common/map/mapChungnam.vue">
  16772. <template>
  16773. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  16774. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  16775. <g id="충청남도">
  16776. <path fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" d="M124.708,35.557l-10.62,12.709l-2.09,1.219
  16777. l1.916,1.567l2.263,3.482l-5.397,3.656v-2.438l-2.089-1.044l-4.353-0.348l-1.042-2.139l-2.403-0.751l-5.033,0.376l0.751-1.503
  16778. l-1.953-0.451l-2.555,0.451v2.555l-3.456,0.375l-1.352-0.601l-1.127,1.202l-5.71,0.977l-0.676-2.329l-2.704,2.404v1.277
  16779. l-6.085,2.855l-1.803-1.653l-0.451,2.93l1.052,3.306h3.08l2.93,1.578l2.705,0.901l1.878-1.202l0.751,1.578l2.104-1.502l3.005,0.601
  16780. l-1.353,2.179l1.729,1.052l1.878-0.751l1.052,2.404l-1.127,1.352l-1.503-1.277l-2.179,0.601l-0.901,2.855l-1.878-1.578
  16781. l-2.479-1.803l-2.403-0.075l-1.653,0.751l-2.028-0.676l-1.803-0.15l-0.977,1.878l0.526,1.653l2.329,0.375l2.479-0.901l1.127,1.352
  16782. l-0.301,2.629l1.202,0.526l1.353-0.826l0.977,0.826l-1.353,1.653l-0.451,1.953l1.202,1.427l2.93-3.305l3.757,0.751l0.525,2.554
  16783. l0.977,0.751l-0.225,1.502l1.652,1.728l1.503-0.902l1.126-1.878l0.977,1.052l3.08-0.375l1.879,0.977l1.202-0.901v2.028
  16784. l-0.752,2.404l-0.901,1.202l-2.554-0.451l0.45,2.629l0.226,1.954l2.704,1.277h3.456l1.803,1.502l-0.375,1.803H99.54l-2.028,1.728
  16785. l-1.202-0.525l-0.301-1.052l-1.427,0.375v2.028l-2.028-0.676l-1.052,0.676l-0.301,2.104l1.428,1.202l-0.677,1.352h-3.831
  16786. l-1.277-1.127l-2.328,0.375l-0.15,1.277h-2.028l-1.277,1.578l2.404,2.705l-0.226,4.658h-1.353l-1.127,2.854l-2.178,0.451
  16787. l1.051,2.104l-0.15,1.427l2.404,2.329l-0.375,2.179l-3.907-0.977l-0.902-1.653l-0.225-1.803l-1.127-1.277l-1.803-1.578l1.428-2.479
  16788. l-0.075-1.878l1.427-1.277l-2.78-0.601l-2.854,0.075l-1.953,2.104l-0.977,4.282l-2.479,1.502l2.028,2.629l2.179,0.376l-1.126,3.305
  16789. l1.352,1.953l2.93,2.104l0.075,1.577l-3.756,0.676l-1.953-2.479l-1.202,2.104l-1.803,0.375l-1.75-0.977l-3.208,3.531l0.526,1.353
  16790. l-0.526,1.502l-1.502,1.052l-1.878-0.676l-0.526-2.855l1.277-3.23l-1.277-1.428l-1.728-0.451l0.451-3.906l2.629,1.202l2.329-0.376
  16791. l2.629-2.479l3.305-0.3l-0.15-2.329l-3.832-0.375l-2.93-1.427l0.901-4.433l2.479-2.179l-0.375-2.779l1.405-1.277l1.224-2.179
  16792. l0.375-3.831l1.202-1.202l4.057,0.977l1.127-2.705l-4.057-1.126v-4.808l-3.531-1.878l-0.397-2.254l-1.931-1.353l-0.15-1.953
  16793. l3.005-2.629l-1.652-2.93l0.15-1.277L60.4,81.368l1.352-2.028l2.179-3.23l-1.675-3.306l-2.683,0.901L57.17,73.33l1.953-2.104
  16794. l2.329-0.375l0.804-2.028l-0.429-2.629l-2.254,0.3l-0.826,1.954l-3.456,1.427l-0.376,3.08l1.277,4.282l0.075,5.184l1.277,2.329
  16795. l0.301,2.179l-1.954,5.409l-1.202,2.479l0.601,1.652l1.578,1.653l-2.329,1.277l-1.127-0.827l-1.277,0.977l-8.865-4.658l0.826-1.803
  16796. l-1.953-0.226l-1.352,1.803l-4.433,1.728l-3.456,0.451l-0.526,1.728L30.5,99.098l-0.901-1.578l-1.427-0.826l-0.451,3.606
  16797. l-0.601,1.578l-1.953,2.404l-1.277-1.352l-2.554,0.451l-1.578,1.728l2.93,0.751l2.028,2.329l-0.451,1.878l-1.653,0.977l1.578,1.202
  16798. l0.225,2.404l0.075,1.052l1.803-0.451l0.601,1.728l-1.202,3.606l-2.179,2.779l-2.855,1.578l-1.277,1.353l1.803,0.977l1.427-0.451
  16799. l1.427,2.329l-1.427,3.007l0.601,1.2l-0.676,1.202l1.277,2.554l1.277-0.301l0.601,2.78l0.977,3.681l1.202,2.854l-1.502,1.127
  16800. l-2.029-1.556l-0.676-2.962l-1.427-2.393l-1.202-2.629l-1.202-2.232l-2.179-0.698l0.301-2.627l0.751-2.331l-1.502-0.526
  16801. l-1.202-2.554l1.052-3.005l-2.404-0.902l-0.826-2.178l-1.052,2.93l-1.878,0.751l1.954,1.954l0.977,1.052l0.451,1.728l-1.052,3.606
  16802. l-1.202,2.104l-1.953,1.127v2.028l1.277,0.676l-1.653,4.883l-1.277,2.2l-2.329,0.88l-1.653,1.653l0.826,1.533l-0.826,1.021
  16803. l-2.554-0.451l-0.827,1.277L0,153.088l2.104,0.701l-0.676,1.652l1.352,1.182l-0.901,1.673l2.779,0.809l1.502,1.237l-1.202,0.884
  16804. l1.277,2.258l-3.08,4.353l0.301,1.428l-1.502,0.451l0.751,2.554l0.451,1.127l-1.953,1.878l0.226,2.028l1.202,0.375l4.808-6.235
  16805. l1.202-1.202l0.075-2.028l1.953,0.075l1.052-1.127l0.075-3.677l-2.179-3.61l-1.127-1.878l4.733-0.751l1.803,0.901l1.202-1.522
  16806. l3.005,1.447l3.531,0.451l0.601,1.82l-2.028,0.959l3.155,1.127l2.254,2.854l2.028,0.226l2.179-2.705l0.977,1.728l-1.202,2.93
  16807. l-2.479,1.728l-0.3,2.253l4.207-2.178l2.479,1.953l0.525,1.803l-2.479,3.23l-3.23,1.878h-3.23l-3.832-2.104l-0.901-1.653
  16808. l-2.104-0.15l-1.728-1.127l-2.554,2.179l0.601,1.502l-1.502,1.353h-2.705l-1.653,1.352l1.803,2.329l-0.751,1.652l0.451,1.653
  16809. l0.525,1.653l-0.3,1.803l1.352,0.751h3.832l1.352-0.977l1.728,1.653l1.427-0.977l3.005,0.977h2.104l1.126-2.554l-1.202-1.578
  16810. l3.005-0.301l1.277-0.901l-0.375-1.502l7.062-0.375l0.451-1.353l0.075-1.878l2.404-0.301l0.676-1.502l-2.329-1.052l0.451-3.981
  16811. l5.409,0.676l3.23-1.578l1.353-2.629l1.352-2.329l3.306-0.15l0.375,1.953l-2.779,1.202l0.601,2.178l-0.826,2.705l0.676,3.456
  16812. l-3.531,3.005l-0.375,2.479l0.375,3.155l1.428,0.526l-0.977,1.953l0.375,2.028l2.705,0.526l2.103-1.127l2.93,3.155l2.554,4.433
  16813. l1.127,6.085l0.075,5.484l-1.277,3.23l-2.93,1.728l0.601,5.033l-0.526,1.953l-2.028,1.427l0.826,1.503h1.427l1.052,3.08l3.23-2.179
  16814. l0.225-1.953l-1.953-3.005l1.953-0.225l2.029,1.202l1.202,3.456l1.803-2.179l1.052-3.23l1.728-1.427l-0.977-1.277l3.08-3.005
  16815. l1.578-1.427l0.526,1.803l2.855-0.827l0.451-1.427l1.578,0.15l3.531-2.629l0.676,1.502l3.756,0.676l2.479,1.502h4.507l4.809,1.277
  16816. l0.15,2.479l-1.353,1.653l3.831-0.225l10.894,4.507l-0.826,1.352l1.126,1.502l2.254,2.329l-0.375,1.878l1.276,3.381v2.329
  16817. l1.428,1.578l-2.555,4.658l1.428,3.23l2.63,1.653l1.728,1.728l2.329,2.028l-1.879,2.405l0.226,5.183l-0.45,3.982l-1.052,1.953
  16818. l0.15,2.104l0.676,4.132l0.901,2.328h1.428l0.601,2.029l-1.577,1.051l0.751,1.578l-0.602,2.93l1.428,2.104l3.23,1.353v1.277
  16819. l-1.353,0.826l-0.3,2.329l1.276,0.676l3.981-2.855l2.404-2.103l2.254-0.451l2.404,2.329l-1.578,0.826l-2.179-0.451l-2.704,2.705
  16820. l-2.404,2.629h-3.08l-1.277,2.479l-1.427,3.381l-0.451,4.883l-0.977,1.052l0.075,1.803l-1.577,2.78l1.201,1.427h3.832h1.728
  16821. l1.202,1.202l1.878-0.601l5.859,5.559l5.86,4.958l5.108,0.376v1.652l-2.479,0.827l-2.179,2.028l-0.977,1.652l-3.005,0.376
  16822. l-2.329,1.502h-2.403l-1.428,2.329h-2.704h-0.901l-0.677,1.728l1.353,1.729l3.831,8.488h1.953l1.653,1.127l6.01,11.795l-0.15,2.629
  16823. h-2.179l-1.803,6.16l-2.329,2.404l0.226,2.854l0.602,3.08l-0.677,1.953l2.329,3.531l0.301,4.658l-4.282,6.01l0.075,1.502
  16824. l1.427,2.855l-0.826,1.052l-0.15,1.652l-2.254,3.306l-1.427-0.677l-3.981,0.677h-2.931l0.075,9.69l1.503,1.127l1.277,1.503h2.104
  16825. l-1.578-3.155l-0.15-2.254l1.503-2.479l4.207-1.202l5.184,1.127l3.906,2.403l1.803,2.63l0.602,2.93l4.132-2.254v-2.254l3.23,1.052
  16826. l1.803,2.555l3.53,1.803l2.555,4.958l1.803,4.057v1.729l0.977,1.276l1.878-0.826l0.602-1.127l4.508,0.526l-0.602,3.08l3.155,0.525
  16827. l1.878-1.577l0.826,2.779l-4.432,2.404l-2.854-1.052l-1.729,2.479l3.306,0.601l0.301,6.311l0.225,3.005l3.381-0.451l2.329,2.855
  16828. l2.254,1.052l2.854,4.507l1.503,1.277l-1.127,1.202h-1.653l0.977,3.681l-0.375,1.953l-1.127,1.953l1.127,1.729l2.179,0.676
  16829. l2.104-2.028l2.779,0.526l6.461,0.826l3.455,0.676l3.005,1.953l1.804-1.276l2.179,0.901l2.103-6.235l1.729-4.207l4.282,0.075
  16830. l2.779-1.653l8.264-0.977l3.756-0.676l2.028-2.254l2.404-3.906l3.756-1.202l3.23-0.226l7.813-3.23l1.277-1.502l0.826-2.329
  16831. l0.601-6.611v-9.541l1.503-3.305l1.052-4.583l1.803-2.854l2.555-2.254l3.305,0.451l2.104,2.104l2.179,0.225l2.104-1.728
  16832. l2.555-1.052l2.028-3.23l3.605-1.878l4.282-0.751l2.93,2.479l2.705,1.202l5.483,0.301l2.931-1.652v1.803l1.953,0.45l1.276-1.577
  16833. l1.052,1.428l0.526,3.08l1.428,0.901l2.104-0.226l1.276-0.977l1.653,0.15l0.901-3.23l0.977,3.53l0.676,1.804l1.953,1.577
  16834. l2.555,2.028v2.78l-1.578,0.901l0.075,3.38l1.503,0.677l-0.601,4.057l0.601,1.352v1.202l1.728,0.075l2.854,2.028l2.329,2.705
  16835. l1.353,0.901l0.826,1.427l1.803-0.977l2.479-0.826l0.977,1.803l1.127-0.45l2.779,2.104l1.353,2.254l3.306-1.578l0.901-3.381v-3.155
  16836. l1.127-2.028l1.652-0.149l1.127-1.127l1.803,0.226v1.878l2.479,0.977l1.503-1.052l1.652,0.525l2.93-3.08v-1.427l1.578-0.226
  16837. l2.779,3.08l2.329,0.901l1.052-1.202l-0.602-1.428l1.503-1.577v-2.179l2.554-0.075l0.901,1.578l1.804-0.075l0.676-1.202
  16838. l4.132,2.629v1.353l2.104,2.63l1.127,0.676l2.779,0.15l1.428-2.028l-3.456-2.854l-0.525-3.757l1.427-1.127l0.677-2.704l2.253-0.602
  16839. l1.503,2.479l2.779,0.45l4.057-1.953l2.855,0.301l1.127-3.906l1.728-1.578l1.353-0.15l1.502,2.179l2.329,0.602v-2.179l1.503-0.602
  16840. v-1.728l1.728-0.676l1.353,0.901l2.403-0.376l1.729,5.334l2.253,0.526l1.202,3.005l-1.577,1.502l-1.052,2.479l0.901,1.878
  16841. l3.381,1.503l-1.127,1.728l0.15,1.953l0.977,1.503l-0.526,2.479l0.526,0.977l1.352,0.526l-1.352,1.953l0.075,3.306l1.276,1.202
  16842. l2.028,2.854l0.977,2.028v1.953l1.578,1.728l-0.677,2.854l4.282,2.404l3.682,3.682l1.878-2.479l2.179-0.301l1.577-3.23l2.028-0.3
  16843. l1.277-1.653l2.179-1.052v2.479l0.977,0.751l-1.277,3.381l1.277,2.104l1.728,0.15v2.028l1.353,0.901l0.526,3.381l1.878,2.179v1.502
  16844. h2.704l1.127-1.953l2.028,1.953l1.127,1.127l3.531,0.826l2.254-2.629l1.803-0.977l1.052,0.525v1.503l1.728,1.577l0.977-1.577
  16845. l3.757-0.901l3.455-2.555l1.578-2.254l-1.879-4.507l0.301-1.052l2.179-0.376l-0.901-2.028l-0.075-2.028l0.977-1.878l-0.751-2.855
  16846. l-2.028-0.676l-0.301-2.854l4.132,1.353l2.028,0.45l1.277,1.953l1.878-0.3l1.428,0.977l1.052-0.226l2.554,3.155l2.028-0.451
  16847. l0.901-1.276l2.555,0.826v2.254l1.728,0.751l1.127,2.554h2.404v1.804l0.826,1.201v1.729l1.803,0.075l1.277-2.78l-0.45-4.657
  16848. l-1.804-1.202l-1.052-0.977l0.977-1.428l3.306,1.052l1.353-0.45v-1.953l0.977-0.602l1.878,1.653L498,450.83l-2.328-2.253
  16849. l-0.526-1.954h-2.254l-1.803,1.277l-0.451-5.334l0.827-4.132l1.352-1.352l3.982,0.15l0.45-0.902l-1.202-2.328l-0.601-2.779
  16850. l-3.155-3.682l-1.653-0.526l-0.074-3.155l-0.075-1.878l0.826-1.352l-0.977-1.503l-1.578-0.45l-1.052-2.63l-1.127,0.901
  16851. l-2.704-3.681l-2.254-3.306l0.15-1.577v-2.029l1.127-3.906l2.554-2.179l-0.075-4.357l-0.901-2.028l-2.178-1.502l0.676-1.878
  16852. l1.276-1.353l-1.877-3.981l2.178-3.456l0.075-2.629l-1.277-0.677l0.752-1.953l-2.705-3.306l-1.803-2.403l-4.132-0.977l-1.728,1.276
  16853. l-1.202,1.277l-3.005,0.451l-2.93,0.301l1.577-5.785l-3.455-0.977l-1.277-1.878l0.826-2.028h-2.329l-2.93,3.005l-1.202,1.428
  16854. l-2.254,0.45l-3.08,0.901l-3.381-0.375l-0.525,2.028l-3.005,1.427l-0.826,1.653l-3.005,0.901l-0.376,2.404l1.127,0.676
  16855. l-3.756,1.052l-0.15,1.652l-1.953,0.901l1.127,1.729l-1.954,1.803l-3.005,1.428l-2.253-1.729l-1.202-2.403l-2.479-1.353
  16856. l-1.503,0.601l-3.605-2.403l1.127-2.028l-0.977-1.729l-1.353-0.3l-0.901-2.705l-0.226-2.028l-1.353,0.676l-3.079-0.676
  16857. l-0.075-1.652l1.427-0.752l-0.375-1.577l-1.127-3.606l1.577-3.831l-2.93-3.08l-2.854-1.127l-1.052,1.428l-2.028,0.375l-0.901,0.526
  16858. l-0.226,3.981l-0.376,1.277l1.803,1.127l0.075,3.005l-1.352,3.455l0.751,1.277l-0.15,1.804l-1.052,0.977l1.503,1.276l-0.075,1.428
  16859. l-1.428,0.15l-0.15,2.028l-2.104,0.676l-1.953,3.155l0.301,2.028l-2.329,3.907l-0.901-0.15l-0.15,2.028l-0.977,0.826l-1.277-0.751
  16860. l-0.075-3.456l1.277-3.005l-1.577-1.503l-2.028,0.376l-0.752-4.508l-2.028-3.305l-3.305-2.705l-0.226,3.005l-2.404,0.301
  16861. l-1.277-1.127l0.226-2.179l-1.728-2.254l-2.254-0.751l-0.601-6.611l1.427-2.179l3.306-2.104l-1.127-1.276l-2.779,0.45l-5.108-3.605
  16862. l-1.879-0.376l-4.356-5.784l1.652-2.63l2.779,0.451l0.376-2.93l-1.052-1.127l-0.075-5.108l1.052-1.503l-0.901-2.479l2.254-0.226
  16863. l0.977-1.353l-0.677-2.329l1.953-2.328l2.404-0.602l-0.601-2.629l-1.729-1.578l-0.826-2.404l2.78-1.878l0.601-4.057l-0.826-5.033
  16864. l0.15-3.906c0,0,0.901-2.93,0.977-3.155s0.375-3.981,0.375-3.981l-2.028,0.525l-3.005-1.728l-2.779,0.525l0.075,3.381l-2.705,0.526
  16865. l-2.328-4.809l-3.381-0.149l-2.404-3.081l-2.179-3.53l-3.229-0.075l-3.156-1.578l0.827-3.455l-1.277-1.803l1.803-0.902l0.677-1.953
  16866. l-0.902-3.08l-1.878,0.15l-2.179-4.808l1.428-1.653l0.451-2.779l-3.757-2.028l-2.179,0.901l-1.427-2.854l1.728-1.353l-2.254-2.479
  16867. l-0.225-1.953l4.057-3.08l-3.606-5.334l0.676-3.155l1.729-1.728l1.803,0.826l2.403-0.751l-1.953-2.629l2.254-4.958h1.878
  16868. l1.578-1.052l-0.075-2.329l1.353-2.028l-2.028-2.254l-2.179,1.277l-1.428-0.451l-0.826-2.253l0.601-3.531l-2.253,1.878
  16869. l-5.184-4.883l-4.207-1.502l0.3-3.155l-2.028-1.878l2.104-2.179l2.104-0.075l-1.502-6.761l-0.977-4.357l2.253-1.653l-0.225-2.329
  16870. l-2.179-1.578l1.352-2.554l1.954-2.028l-2.104-7.813l-5.259,2.629l-1.879-6.536l-2.93-1.202l3.757-2.404l3.455-2.254l1.277-3.531
  16871. l1.578,0.676l0.826-2.629l3.605,0.15l0.752,1.803l3.23-0.451l3.906,0.375l3.23,1.502l0.225,2.104l3.005,1.353l3.006,0.526
  16872. l-0.226,2.028l1.953,1.352l1.652-0.676l1.578,2.554l2.028,2.855l2.479-0.075l1.352,0.977l2.404,0.301l2.479-1.353l2.705,2.028
  16873. h1.878l2.028-2.554l4.883-3.005l-0.901-2.104l1.353-5.334l2.779-0.676l2.404-3.08l1.352-0.977l2.555,2.178l2.329-2.479
  16874. l-3.456-4.883l0.901-2.029l4.057-0.375l2.179-1.202l1.052-2.254l3.381-0.15l0.977,1.653l4.508-0.601l0.525,2.479h1.653l0.977,2.404
  16875. l3.08,1.427l0.225-2.254l1.804-1.803l0.226-1.728l2.629,0.15l0.226-1.428l-2.028-4.507l-3.606-1.202l-0.525-2.104l-2.63-1.428
  16876. l2.93-4.658l-1.728-2.704l-4.808-4.733l-4.733-1.427l-3.38-2.404l0.3-1.578l-1.728-2.104l-2.404,0.827l-3.53,0.15l0.15-3.23
  16877. l0.601-3.681l-0.15-2.93l-2.179-1.953l-2.104,0.751l-2.028-1.202l-1.728,0.676l-2.555-2.028l2.179-2.705l-0.075-4.883l-1.728-2.104
  16878. l-8.489-5.559v-2.479l-1.652-3.155l-4.583-0.526l-2.629-3.456l-2.78,2.178l-3.005-2.028l-4.808-3.155l-3.306,0.225l0.526-3.155
  16879. l-1.879-1.653l0.075-1.953l-1.427-2.554l-3.982,0.375l-1.126-1.578l-2.329-0.676l0.075-1.878l-4.583,0.451l-3.306-1.352
  16880. l1.804-2.329l-5.033-0.3l-4.058,1.653l-6.085-2.104l-5.634,5.334l-0.226,1.653l2.179,0.601l-1.652,2.404l-0.376,2.779l-3.306-3.23
  16881. l-4.282,4.583l-2.329-1.878l-5.935,3.832l-3.455,0.075l-1.879,1.953l-3.23-1.277l-3.079-2.179l-5.185,0.3l-4.657,1.578
  16882. l-2.028,1.803l-12.396,4.207l-7.438,4.131l-1.652,1.878l0.3,4.057l-1.502,1.427l-8.188,0.526l-6.16,3.306l-11.419-3.907
  16883. l-3.155-3.08l-1.428-7.888l-0.301-4.357l-2.178-2.329l-1.052,2.93l-3.982-4.958l0.902-2.329l-4.508-9.616l1.277-3.005l-11.27-5.484
  16884. l-2.479,0.676l-1.728-1.728l-5.71-1.052l-4.282-3.005l-1.878,0.977l-1.652-1.127l-6.987,0.451l-9.841-0.3l-3.005-0.751l-18.03-9.24
  16885. l-1.953,0.375l-4.207-3.005l-0.301-2.329l-3.605,1.052l-4.733-2.855l-2.479-1.803l0.45-2.629l-2.704-3.606l-6.761-2.104
  16886. l-1.503,2.329L124.708,35.557z"/>
  16887. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="181.664,179.023 181.664,181.653
  16888. 182.779,183.486 179.591,185.957 177.758,184.204 178.476,182.49 176.882,180.617 175.606,179.979 177.36,178.465 179.193,179.899
  16889. 180.07,178.864 "/>
  16890. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="256.581,79.638 254.748,80.275
  16891. 254.11,82.586 255.346,83.463 254.668,84.738 255.704,85.774 257.219,84.419 259.291,85.137 260.726,83.623 261.363,81.949 "/>
  16892. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="243.909,85.217 240.083,85.774
  16893. 240.402,86.731 241.996,87.448 242.793,90.716 245.423,91.194 247.655,89.68 244.308,87.289 "/>
  16894. </g>
  16895. </svg>
  16896. </template>
  16897. </file>
  16898. <file path="components/home/dashboard/common/map/mapDaegu.vue">
  16899. <template>
  16900. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  16901. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  16902. <g id="대구">
  16903. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="405.789,109.302 406.422,106.642
  16904. 404.016,104.869 404.016,101.323 401.609,99.296 399.709,99.169 399.709,95.497 397.81,94.483 399.329,93.217 399.583,89.164
  16905. 395.783,89.164 392.997,84.731 390.464,84.604 387.677,83.211 386.03,83.718 381.218,78.145 376.151,76.625 371.592,78.271
  16906. 369.565,75.359 367.159,75.738 363.486,78.018 361.207,80.552 355.761,81.058 356.394,83.464 353.734,83.971 355.001,86.504
  16907. 353.354,90.304 351.835,91.444 350.821,94.61 345.502,92.583 338.662,91.444 336.13,92.583 332.583,89.164 329.797,87.391
  16908. 329.544,85.491 325.87,85.998 325.11,90.431 322.704,92.204 320.805,90.177 317.638,87.897 313.205,89.164 311.686,87.391
  16909. 307.759,89.67 307.252,87.517 302.187,89.037 298.514,87.771 294.967,86.504 295.094,84.098 296.867,81.818 296.233,79.918
  16910. 293.827,78.145 291.168,79.792 288.508,77.385 283.695,79.158 281.795,82.451 278.883,80.552 278.502,77.892 276.982,74.599
  16911. 274.829,73.206 270.903,76.245 268.497,75.738 266.09,78.652 263.558,83.211 260.138,81.565 260.391,79.158 258.998,77.385
  16912. 261.277,75.738 261.277,71.813 259.251,70.419 261.657,69.533 261.657,64.973 259.504,61.173 263.177,59.527 263.938,57.121
  16913. 262.417,52.435 263.811,48.382 261.024,45.469 256.465,42.936 252.665,40.656 250.639,41.795 248.105,38.756 245.826,38.629
  16914. 242.279,39.643 240.253,38.629 238.435,34.703 235.061,33.943 227.841,32.803 225.308,35.716 222.521,37.236 219.862,35.589
  16915. 216.442,37.236 213.782,36.223 213.529,33.943 212.643,28.117 210.109,23.684 206.057,21.911 201.244,23.431 199.344,19.251
  16916. 196.938,18.491 193.392,17.478 190.985,18.618 189.212,16.085 184.02,16.338 179.586,15.579 178.953,13.299 174.141,12.539
  16917. 170.214,10.259 170.214,6.459 167.554,3.546 164.008,3.546 162.868,2.026 160.715,2.026 160.715,0 158.182,0 157.295,2.026
  16918. 155.269,3.167 154.636,6.206 152.736,7.853 150.203,9.119 150.836,14.945 149.569,16.212 148.43,14.692 147.037,16.212
  16919. 144.757,19.758 138.931,19.758 136.524,23.178 136.524,24.951 135.004,27.737 136.904,31.157 139.057,31.157 141.844,33.69
  16920. 144.377,35.97 143.363,39.009 140.957,41.289 141.337,45.722 138.551,48.128 140.324,51.294 139.311,52.941 138.931,56.614
  16921. 141.59,59.147 142.983,59.147 142.73,62.82 144.63,63.453 146.15,63.453 148.43,64.72 148.556,67.759 150.203,69.026
  16922. 150.456,72.826 152.609,75.485 154.002,73.839 158.688,73.079 162.615,69.153 164.134,69.913 167.554,67.506 169.581,68.266
  16923. 171.86,66.24 173.507,63.707 177.18,64.846 177.18,67.379 174.014,70.039 173.887,72.065 177.18,71.686 178.953,73.839
  16924. 178.953,78.018 180.853,79.792 182.119,84.098 181.486,88.531 182.119,91.063 185.412,91.063 186.172,94.99 186.172,97.776
  16925. 187.438,98.916 189.466,98.283 191.491,94.483 193.012,93.723 194.404,89.037 197.951,87.264 200.484,90.05 206.057,91.57
  16926. 208.717,96.89 209.477,98.916 210.869,101.323 212.77,103.602 215.556,103.602 217.329,103.602 215.809,106.389 215.556,110.188
  16927. 214.416,112.721 212.516,112.721 210.616,111.455 207.83,114.875 208.717,119.814 211.63,119.814 213.909,122.474 212.516,124.5
  16928. 213.022,126.78 212.263,129.313 215.176,130.326 212.01,135.772 214.416,137.039 214.669,140.079 217.329,143.878 219.229,143.878
  16929. 221.255,146.538 220.749,149.704 221.255,150.971 221.255,154.77 220.115,158.189 222.395,159.33 223.788,165.282 222.395,172.501
  16930. 221.129,177.314 221.255,179.087 222.901,180.354 223.788,183.394 223.788,186.307 227.208,183.773 229.868,182.76
  16931. 229.868,180.734 232.021,179.974 233.667,182.634 238.435,183.394 240,180.607 239.366,178.201 240,175.035 244.939,174.781
  16932. 250.006,173.008 251.905,173.515 254.691,173.008 254.691,170.855 256.718,170.982 259.504,174.148 256.972,176.935
  16933. 256.338,179.214 259.504,180.354 258.491,184.914 256.845,185.547 257.731,190.233 256.211,196.692 253.932,201.125
  16934. 253.172,204.545 253.172,209.484 256.211,211.891 262.037,214.677 264.19,219.49 260.771,220.63 258.491,222.023 254.564,220.883
  16935. 254.185,222.783 250.766,221.77 249.879,225.696 247.219,227.976 245.445,231.395 243.181,235.279 242.786,235.955 237.72,238.234
  16936. 237.594,240.514 234.934,241.781 231.641,242.414 225.814,242.414 219.735,245.834 216.949,245.834 216.822,249.76
  16937. 215.176,254.319 212.643,252.926 210.996,249.887 209.604,244.314 205.17,240.894 201.497,240.008 201.877,242.414
  16938. 200.104,243.934 202.257,253.18 204.157,253.56 204.917,255.839 203.144,261.412 204.917,269.011 201.751,278.764 199.598,279.523
  16939. 197.951,284.083 194.278,288.009 192.505,288.009 188.959,291.556 187.945,296.748 188.072,300.168 187.345,302.416
  16940. 186.679,304.474 184.905,304.474 184.525,302.067 182.372,302.194 180.473,297.635 178.699,296.495 176.42,299.408 173.38,297.508
  16941. 171.354,299.534 167.047,295.354 167.174,291.683 165.274,289.402 168.441,287.376 170.721,284.843 170.214,279.903
  16942. 171.733,276.483 172.113,271.291 167.681,268.505 164.008,268.631 159.575,265.085 159.448,269.518 157.549,271.544
  16943. 152.989,271.164 151.089,273.824 146.783,274.331 144.503,276.99 142.477,276.23 142.351,279.523 139.438,281.043 139.438,284.463
  16944. 135.004,290.796 131.838,298.269 129.432,301.308 128.798,305.36 126.012,304.221 124.239,308.78 126.898,308.78 126.645,314.733
  16945. 122.592,315.239 121.453,323.346 122.846,327.271 125.379,329.425 143.49,329.425 148.05,331.451 157.295,331.451 157.549,333.984
  16946. 160.968,333.478 159.955,336.264 164.261,338.924 167.343,339.559 168.567,339.811 173.76,344.75 174.267,350.829 172.494,354.122
  16947. 169.834,356.655 166.415,358.175 166.667,360.961 151.849,360.961 151.976,358.175 140.451,358.175 140.831,360.961
  16948. 137.917,360.961 137.791,363.241 135.891,363.241 133.738,367.801 132.725,369.827 133.104,372.867 130.952,372.867
  16949. 129.938,375.399 130.571,381.985 127.532,381.985 127.152,385.405 125.252,384.139 124.366,385.912 124.619,388.318
  16950. 122.339,388.318 121.453,393.892 122.592,397.944 124.619,401.363 130.571,405.29 141.21,411.496 146.91,416.309 148.303,420.235
  16951. 149.95,420.235 149.696,429.228 147.923,429.228 145.77,433.28 141.464,436.573 136.904,438.093 132.725,436.446 127.405,434.42
  16952. 122.466,433.787 117.399,433.787 114.74,431.507 109.927,429.101 104.481,428.467 101.948,430.62 101.948,437.333 103.848,443.666
  16953. 107.014,449.618 113.093,457.218 119.173,462.664 126.139,468.616 128.165,471.149 128.798,475.456 128.798,479.636
  16954. 127.912,482.422 125.252,485.208 121.959,490.527 115.88,493.82 112.587,493.82 112.207,495.087 116.26,498 119.299,498
  16955. 120.692,495.847 128.545,491.794 130.571,492.174 133.611,492.807 137.031,490.781 138.551,487.234 140.07,488.501 141.59,485.208
  16956. 143.363,485.081 147.29,488.121 150.329,481.535 152.609,480.396 155.522,476.469 160.461,476.976 161.348,475.202
  16957. 163.501,474.822 166.541,477.355 168.821,477.608 171.607,474.949 173.887,475.202 174.521,478.622 179.84,477.735
  16958. 183.069,475.582 186.299,475.836 188.705,475.076 191.365,472.416 190.731,469.503 189.212,467.856 189.085,463.93
  16959. 189.466,459.117 190.604,456.838 190.604,454.432 189.466,452.658 190.352,451.139 194.024,450.378 195.418,447.339
  16960. 199.851,445.313 203.144,445.692 203.144,441.893 205.297,438.093 203.271,436.066 204.283,431.634 201.624,426.188
  16961. 203.903,422.388 209.604,420.615 210.743,418.209 215.683,414.915 217.582,414.662 219.988,412.383 220.115,409.47
  16962. 222.015,408.329 224.801,409.977 229.614,407.316 231.261,407.696 232.527,410.103 235.187,412.889 237.087,411.242
  16963. 237.72,408.329 241.393,408.836 244.813,406.684 248.992,407.189 249.499,412.002 246.966,415.676 247.979,418.082
  16964. 250.259,419.729 250.892,422.135 249.119,424.161 249.119,427.201 252.412,431.381 254.691,432.014 258.238,428.848
  16965. 262.544,429.607 267.483,427.708 267.483,425.808 271.409,423.654 272.803,421.121 277.362,419.222 280.782,420.488
  16966. 282.176,418.969 287.875,419.096 287.875,415.802 291.674,413.269 293.067,410.103 290.914,407.443 293.067,403.517
  16967. 293.067,399.844 294.967,395.031 292.308,391.864 292.181,389.078 291.041,386.799 288.508,385.532 290.281,380.466
  16968. 288.381,378.819 286.354,374.387 287.241,371.6 291.041,369.573 291.928,367.421 293.574,366.787 295.601,368.561 297.627,368.181
  16969. 297.627,365.9 301.3,364.381 302.819,361.468 306.112,360.961 306.999,359.062 305.479,357.288 304.846,352.349 302.06,349.689
  16970. 301.68,346.903 306.999,341.077 310.546,339.811 310.546,337.404 312.065,333.984 310.799,327.778 309.152,325.372
  16971. 312.065,324.485 315.865,328.791 318.778,329.551 322.071,326.512 325.744,324.738 327.771,321.192 331.063,319.039
  16972. 331.063,316.886 331.063,313.34 328.53,310.934 331.063,307.387 331.823,303.841 329.164,298.142 328.91,292.695 330.557,290.796
  16973. 329.037,287.756 327.391,284.716 321.312,282.437 318.018,275.851 319.285,270.277 321.564,265.465 320.551,260.779
  16974. 318.271,256.979 320.805,254.193 322.578,249 322.831,245.453 318.778,242.794 318.018,239.627 314.345,236.968 314.979,234.435
  16975. 316.372,231.015 314.979,228.355 312.698,227.976 312.065,224.049 307.252,220.883 297.374,218.983 294.334,215.69
  16976. 294.334,213.157 296.107,210.371 296.993,206.824 294.841,202.518 295.854,200.619 298.387,198.085 299.653,194.159
  16977. 298.894,187.953 299.906,185.547 302.06,182.38 304.72,174.781 309.152,176.048 311.686,173.768 313.712,170.095 311.559,165.662
  16978. 310.166,164.143 311.686,162.369 314.219,162.496 317.258,160.089 316.498,158.189 319.538,157.81 321.817,155.657
  16979. 322.197,151.477 326.504,155.403 326.25,160.469 324.984,162.623 327.011,164.269 329.164,161.103 333.85,156.923 335.749,159.836
  16980. 340.436,160.85 346.008,164.776 347.148,167.562 350.314,166.549 352.341,167.689 355.381,165.536 359.181,165.282
  16981. 363.613,161.229 363.613,159.456 366.526,156.543 370.326,155.53 373.872,152.237 373.872,148.311 377.545,148.311
  16982. 378.685,145.778 381.218,145.018 382.864,142.611 381.218,140.585 382.864,138.432 381.091,133.746 381.472,131.719
  16983. 384.638,128.553 385.777,126.273 388.438,126.653 391.224,126.02 394.77,127.667 401.103,127.54 404.269,127.16 403.509,123.993
  16984. 404.269,120.194 406.422,116.521 408.828,113.734 "/>
  16985. </g>
  16986. </svg>
  16987. </template>
  16988. </file>
  16989. <file path="components/home/dashboard/common/map/mapDaejeon.vue">
  16990. <template>
  16991. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  16992. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  16993. <g id="대전">
  16994. <path fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" d="M449.184,156.924l-3.271,0.201l-3.271-1.204
  16995. l-2.309-6.621l-3.463-4.213l-4.616-1.204l-3.079-4.614l-1.539-5.417l1.539-6.42l-3.848-2.408l-5.771,2.408l-7.504,0.2l-1.73-3.21
  16996. l-2.693-1.003l-2.116-2.608l-4.617,3.411l-1.54,3.21l-4.231-5.016h-3.078l-3.271,18.258l-1.924,3.21l-3.078,1.204l-6.926-0.2
  16997. l-2.886-6.019l-2.886-4.615l-0.192-7.022l-2.309-6.42l-4.617-6.821l-3.271-9.43l3.649-8.052l1.353-2.983l10.196-10.633l2.886-2.207
  16998. l1.347-4.414l-2.309-5.417l-3.078-1.404l-10.773,4.213l-6.349,1.204l-5.579-0.803l-5.579-6.621l-0.77-4.414l2.501-5.216
  16999. l3.271-5.217l3.271-11.035l-0.577-4.013l-5.002-1.003l-10.389,3.611l-7.311,7.624l-3.848,8.025l-0.192,7.423l-0.962,6.621
  17000. l-5.579,6.22l-8.465,4.615l-6.733-0.201l-4.425-2.408l-8.712-8.426l-10.911-1.003l-15.198,3.21l-10.581,0.201l-5.771-0.802
  17001. l-1.146-1.792l-1.163-1.819l-2.501-0.401l0.962-4.213l-0.962-3.812l3.078,0.201l-0.962-7.624l1.539-8.427l3.078-6.22l0.192-6.821
  17002. l-1.347-7.423l-10.773-11.436l-9.619-7.825L226.369,0l-5.284,1.929l-3.529,6.527l-5.002,5.217l-5.386,3.812l-5.965-1.806
  17003. l-4.039-2.608l-0.771,3.009v3.411l-2.692,2.207v3.009l-1.154,3.009l3.462,2.207v4.414l2.886,4.815l1.731,1.806l-4.809,7.022
  17004. l-1.54,4.614l0.962,2.207l-5.001,2.408l2.501,4.615l-0.77,3.812l2.308,4.614l-1.538,2.408h-2.501v4.414l-1.924,2.809l-1.347,3.21
  17005. h-4.232l-6.926,5.216l-1.924,7.223l-1.154,2.809l-2.693,2.608l0.962,8.226l-10.581,7.423l-8.08,6.621l-5.771-2.608l-2.501,2.608
  17006. l-3.848,2.407l-3.078-3.411l-4.232-1.204v-2.006l-4.81,0.201h-5.387l-2.309,4.213l-3.271-1.605l-4.425-0.401l-1.539,2.408
  17007. l1.924,1.805l-1.924,3.411h-4.04v3.21l-11.543,3.01v5.618l-1.154,5.818v3.812l-3.271,11.637l1.154,11.637l-2.693,4.414l1.731,2.408
  17008. l0.77,9.028l1.924,1.806v5.417l-1.347,8.828l-3.078,2.006l0.962,4.815l-7.503,4.012l-2.116,2.608l0.962,5.618l1.924,5.417
  17009. l5.194,5.417l1.347,2.809l-0.192,2.408l1.731,3.411l-3.655,1.605l-3.848-0.802l-1.347,3.21l-4.81,2.407l-3.271,5.016v3.411
  17010. l3.271,6.22l-3.271,3.41v1.806l-3.655,1.806h-4.232l1.731,6.421l-0.77,5.617l-2.501,3.21v13.644v8.427l3.463,2.206l-2.309,7.022
  17011. l1.347,2.608h-4.81l-3.463-1.806l-3.848,1.806l-1.539,4.414h-2.501l-1.154,3.01l8.272,13.643l6.349,10.031l8.657,2.007l8.08,7.624
  17012. l8.85,4.013l4.04,3.41h6.733l4.648-1.604l2.662,1.604l-0.468,1.829l-0.302,1.181l-10.581,6.02l-1.924,2.809l0.577,2.809
  17013. l-4.617,4.614l2.501,6.22l-1.154,2.408l2.501,1.806l-2.116,2.809l0.77,2.608l2.886,1.003l-1.347,2.207l1.539,5.217l-1.731,1.806
  17014. l4.425,2.407h2.693l2.693,5.016l3.655,2.408l0.962,3.611l-2.501,1.404l2.693,2.608l0.77,2.809l5.002,2.809h5.194l3.271-1.806
  17015. l-1.731-6.621l0.77-4.614l4.81,5.818l9.427,5.417l4.232,11.035l3.848,1.806l-1.154,4.213l1.731,6.421l2.693,6.62l5.002-1.203
  17016. l2.693,2.809l3.271,1.003l1.731,2.408l-2.501,1.806l0.577,4.213l-2.886,3.21l2.116,2.407l-0.385,3.813l0.77,9.43l4.425,1.806
  17017. l3.078-4.213l0.77-5.217l4.04,0.201l0.577-7.223l2.886-2.408v-2.809l5.194-1.404l-0.77-6.821l-0.577-4.014l2.886-5.417l3.654-4.814
  17018. l3.849-2.81l5.001-1.604l1.539-7.624l4.617,0.2l-0.192-6.821l-4.81-4.815l2.693-3.611l-0.385-3.21l1.924-2.407l-3.27-4.214
  17019. l3.462-10.433l2.501-3.813l-2.309-12.438l-5.387-4.013l1.539-2.608l-0.77-8.025l-2.115-3.411l4.616-3.21l0.962-6.821l3.463,1.003
  17020. l7.695-1.404l0.962-3.411l6.156,0.603l4.618,4.414l2.692,0.602l3.271,4.213l6.156,5.417v4.214l-1.924,1.806v4.213l-0.962,3.211
  17021. l-1.924,1.003l-0.577,4.413l2.309,7.424l3.078,4.013v2.407v2.608l-1.924,3.21l-2.116,0.803l0.192,5.217l5.771,1.806l5.002,1.003
  17022. l6.156-1.404v6.821l5.579,10.634l3.655,0.803l4.04,6.42l-3.271,7.223l3.271,1.605l2.886,0.602l3.655,4.214l5.194,2.809l3.271-2.207
  17023. l2.309,3.411l6.541,1.404l1.924,2.608v3.21l2.116,1.203l1.347,3.611l3.655-0.2l5.771,3.21v3.01l3.271-0.201l1.731-1.404
  17024. l4.617-0.802l2.886-4.013l5.387-3.612l1.731-4.213l-3.463-5.216l1.924-2.408l5.387-2.007l1.347-5.416l5.194-2.207l5.964,0.4v-3.009
  17025. l-1.924-2.007l0.192-5.818l-0.192-3.009l3.655-1.605l5.964-1.003l3.271-3.01v-5.417l4.81-0.603l3.271,0.803l3.271-3.812l2.501,0.2
  17026. l2.501-1.806l-1.154-4.013l3.463-2.207l1.539-4.614l-2.693-7.624l-1.924,0.602l-1.347-4.012l-1.539-6.621l2.886-3.813l0.192-5.617
  17027. l-4.425-1.004l-0.962-4.213L358.38,371l1.154-6.02l2.309-0.803l-1.731-6.821l8.465-8.828l3.848-4.814l-0.962-7.424l-2.886-4.614
  17028. l-3.078-5.818l-2.501-6.02l1.154-5.016l3.078-1.404l2.116,3.01l1.924-4.414l1.154-6.22l-1.924-5.417l-3.848-4.213l3.078-1.806
  17029. l2.693-5.017l-1.924-6.22l4.81-1.404l4.04-7.021l-2.886-6.421l-0.577-6.42l0.577-4.615l-1.154-3.611l0.77-2.207l4.81-1.604
  17030. l3.848-3.611l-0.962-4.615l2.693-1.003l3.463,1.806l4.617-4.013l4.232-2.207l5.387-9.43l-2.501-3.411l4.04-7.022v-4.815
  17031. l2.886-5.818l-1.347-3.611l0.385-3.812l-1.348-2.608l1.348-4.414l-1.348-7.223l1.348-2.809l-1.732-4.013l5.772-2.809l1.538-3.21
  17032. l2.887,1.204l2.116-4.013l4.81-2.407l2.885-4.013l4.617,2.407l4.425,0.201l3.848-0.802l0.962,2.207l3.271,1.003l3.463-2.809
  17033. l1.154-2.006l3.271-1.405L449.184,156.924z"/>
  17034. </g>
  17035. </svg>
  17036. </template>
  17037. </file>
  17038. <file path="components/home/dashboard/common/map/mapGwangju.vue">
  17039. <template>
  17040. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  17041. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  17042. <g id="광주">
  17043. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="496.869,220.789 496.718,219.206
  17044. 492.043,217.773 489.328,215.284 487.519,209.93 486.688,207.743 482.918,205.557 481.712,203.445 479.676,202.389
  17045. 478.167,199.599 475.302,198.167 473.19,198.016 471.004,195.452 468.214,193.34 463.765,193.566 461.502,195.075 459.768,197.639
  17046. 456.299,197.79 453.811,196.734 451.774,193.34 449.286,194.094 447.023,196.507 448.079,198.242 445.439,201.71 441.896,201.107
  17047. 439.709,197.79 436.994,198.845 434.054,197.865 431.641,199.75 432.093,201.786 431.264,204.124 430.962,208.422 427.568,207.14
  17048. 424.929,204.124 424.552,202.012 423.571,200.58 421.46,199.75 421.008,196.809 418.218,193.717 415.05,190.701 414.748,188.062
  17049. 413.165,186.629 414.522,185.648 414.522,184.367 416.709,183.613 417.841,182.029 418.972,179.164 421.31,178.108
  17050. 421.912,175.091 424.023,174.036 423.194,169.586 420.404,170.114 417.765,168.908 413.844,164.836 411.054,164.308
  17051. 410.677,161.668 408.112,158.728 407.735,156.314 405.926,155.259 405.097,153.675 405.247,152.016 403.061,151.262
  17052. 402.532,148.396 401.401,145.079 401.326,141.836 403.739,137.538 405.322,136.482 402.684,131.731 401.552,128.564
  17053. 399.44,125.925 395.595,126 393.559,124.492 394.162,121.928 392.955,120.495 393.031,118.007 392.428,116.951 390.542,117.253
  17054. 387.149,114.613 384.812,114.01 384.208,112.653 382.549,112.653 381.795,110.843 380.89,111.145 379.08,110.24 380.362,106.017
  17055. 381.041,100.361 379.608,96.138 377.572,93.122 375.536,91.011 373.877,91.916 372.218,92.066 371.313,90.256 369.881,89.653
  17056. 368.372,90.784 364.828,89.804 361.812,87.768 362.34,86.109 358.946,83.47 357.589,83.998 356.081,83.168 355.93,81.66
  17057. 349.067,81.358 343.261,81.886 340.999,82.942 336.775,88.748 334.438,90.482 332.025,91.011 325.088,95.309 322.9,100.738
  17058. 321.543,99.909 318.904,101.341 318.15,99.758 316.868,100.437 315.436,99.456 310.835,98.778 308.724,97.496 308.498,96.138
  17059. 309.855,92.594 307.819,92.745 305.406,94.555 302.313,94.856 298.544,98.174 295.979,101.266 291.682,100.964 289.419,102.096
  17060. 287.232,102.925 285.573,104.66 285.423,109.033 283.16,110.843 279.691,112.351 276.223,114.538 274.715,113.332 271.773,114.387
  17061. 270.266,115.971 267.776,118.007 266.872,115.217 263.177,115.745 264.082,119.967 263.026,120.646 261.669,119.364
  17062. 260.085,120.722 258.502,120.269 257.295,123.135 257.521,125.925 255.485,127.584 251.187,127.282 250.81,129.318
  17063. 248.171,130.072 244.099,126.528 238.065,124.19 236.784,125.925 237.463,132.41 236.558,134.22 233.239,133.541 231.279,133.466
  17064. 230.072,135.652 228.263,137.387 225.321,135.728 221.777,138.744 220.27,139.197 219.138,141.761 215.745,141.987
  17065. 215.292,143.646 212.804,144.928 211.823,146.511 210.617,144.249 210.768,141.157 207.148,141.61 206.318,143.796 201.19,142.892
  17066. 199.456,144.098 195.61,142.213 195.158,140.177 193.197,139.046 190.332,136.708 188.296,138.442 183.093,136.256
  17067. 180.303,135.049 175.401,130.902 172.687,126.679 168.086,126 165.598,122.682 162.958,123.436 162.28,124.492 159.942,123.135
  17068. 157.453,122.908 154.89,121.4 152.175,120.873 150.516,121.626 147.424,121.476 144.936,119.289 143.654,115.745 145.464,109.41
  17069. 145.237,107.299 146.972,105.263 150.29,102.171 152.854,99.758 154.286,96.742 153.909,93.801 154.965,91.765 156.851,89.804
  17070. 157.453,86.788 156.322,84.601 153.607,80.981 151.346,80.981 148.857,81.886 145.689,84.601 142.146,83.998 137.923,85.506
  17071. 137.395,88.069 136.49,89.804 133.021,91.312 131.513,91.312 129.553,92.217 128.572,94.027 125.782,92.971 122.916,90.482
  17072. 121.635,90.181 121.635,92.066 120.729,92.292 120.428,94.027 114.998,101.341 114.998,102.85 112.208,105.338 112.812,110.315
  17073. 112.208,112.728 111.152,115.519 109.72,117.328 108.137,116.951 107.231,118.233 107.608,119.289 106.251,119.289
  17074. 105.497,121.099 105.497,122.833 104.517,123.512 103.688,126.151 104.894,126.98 102.179,130.977 99.313,132.184 99.615,135.275
  17075. 96.976,140.102 100.294,145.229 99.615,149.83 97.654,149.83 96.976,151.79 97.353,154.354 96.297,155.862 92.828,156.465
  17076. 91.546,155.485 87.021,156.013 81.97,159.557 80.612,159.557 76.238,163.554 72.845,161.895 71.035,160.236 68.849,161.065
  17077. 66.059,157.37 61.685,154.354 61.685,153.147 60.327,150.885 58.442,151.413 57.914,152.469 55.652,151.262 53.842,153.374
  17078. 52.258,158.275 52.635,160.16 50.071,161.895 47.432,162.121 46.829,164.157 47.432,165.59 46.452,169.436 44.566,169.888
  17079. 43.134,171.472 42.757,173.357 43.888,176.298 43.36,178.937 41.625,181.275 43.813,185.422 42.682,187.458 42.983,190.249
  17080. 41.098,190.776 38.76,190.022 37.931,187.082 36.271,184.97 34.99,185.799 32.803,184.291 30.993,187.609 29.032,186.403
  17081. 27.147,187.76 25.413,188.137 23.754,187.006 23.754,185.95 22.698,185.648 20.285,186.931 18.777,188.589 17.721,187.082
  17082. 15.006,185.422 12.895,186.327 10.934,187.685 12.065,190.776 14.403,194.17 16.439,195.829 17.042,197.865 21.944,199.524
  17083. 22.698,202.239 25.036,204.425 23.527,205.934 23.301,207.442 26.544,209.101 29.938,214.229 31.144,216.491 34.235,216.114
  17084. 36.196,219.13 35.518,222.599 34.009,224.937 31.445,224.937 29.938,225.69 27.977,225.992 25.79,226.37 23.829,228.179
  17085. 23.678,229.763 21.19,229.235 19.456,230.14 17.872,229.084 16.138,229.461 12.065,233.156 12.292,236.323 11.538,238.208
  17086. 12.065,239.868 13.875,240.772 13.8,242.205 11.613,244.543 10.934,246.051 9.577,246.428 8.521,248.917 9.426,250.123
  17087. 11.915,251.631 10.18,254.045 7.541,256.156 8.37,258.568 7.013,260.379 4.901,261.208 0,261.586 3.771,266.261 7.465,265.432
  17088. 8.823,266.261 11.387,266.261 10.557,267.995 10.934,273.35 12.065,274.33 12.216,276.441 13.272,277.119 12.97,283.152
  17089. 11.462,285.037 12.593,286.621 11.764,287.902 11.161,294.012 9.878,295.746 9.049,297.404 10.406,301.326 9.125,304.267
  17090. 10.256,306.83 13.649,308.264 14.177,309.696 13.649,313.391 16.515,315.955 18.098,315.276 20.36,315.201 23.905,313.014
  17091. 26.468,314.371 27.675,315.276 28.881,317.313 30.842,318.066 32.577,317.614 32.049,324.1 30.691,326.135 28.58,326.135
  17092. 29.862,328.85 32.803,329.83 36.875,329.83 38.157,328.623 41.098,329.453 44.189,327.418 46.527,324.854 52.937,324.854
  17093. 53.088,322.969 50.826,318.066 53.616,317.463 57.914,319.424 60.025,319.197 62.062,320.555 62.74,323.646 64.701,322.666
  17094. 66.586,323.496 67.34,324.929 70.507,324.703 70.96,323.194 73.071,322.139 74.881,318.143 75.635,316.559 79.934,316.332
  17095. 84.685,321.837 93.356,319.877 98.71,323.496 104.592,323.723 110.248,325.23 113.867,324.25 114.094,322.139 112.736,320.254
  17096. 112.736,317.916 115.225,315.879 118.09,318.972 119.599,321.837 119.523,324.552 121.258,323.949 123.821,325.08 127.29,327.643
  17097. 129.401,327.643 134.906,333.375 135.962,332.545 137.848,334.129 137.771,336.918 139.959,340.01 140.486,342.574
  17098. 143.277,346.043 144.332,350.342 148.404,351.096 150.817,350.568 153.382,351.549 154.814,351.549 154.965,353.66
  17099. 154.136,355.168 155.568,357.354 155.945,360.371 156.322,362.406 157.906,363.313 159.414,363.313 159.414,367.912
  17100. 158.132,371.305 161.525,377.111 165.824,381.033 166.805,384.652 162.808,387.82 160.395,388.197 157.076,388.197 152.401,386.99
  17101. 148.103,387.367 143.88,390.158 142.522,393.25 143.654,395.436 146.067,397.773 146.444,399.885 146.444,403.279 147.726,404.637
  17102. 149.762,402.223 151.044,398.754 153.607,396.189 155.87,394.908 158.434,394.607 161.827,396.943 163.26,400.488 162.355,403.127
  17103. 161.752,407.879 163.411,410.744 166.352,411.875 169.595,413.082 173.139,413.082 176.306,410.668 178.492,410.744
  17104. 180.528,411.725 182.489,408.934 184.525,409.084 185.883,407.502 187.542,405.391 189.276,405.465 190.332,403.58 192.594,402.6
  17105. 193.197,400.488 195.083,401.469 196.364,401.242 197.722,399.584 199.833,400.338 200.135,402.373 200.965,403.203
  17106. 203.755,402.523 206.695,404.334 206.318,406.068 208.656,409.236 209.485,413.686 210.994,413.686 211.371,415.344
  17107. 214.463,416.098 216.197,413.686 219.591,412.705 221.476,413.609 223.512,412.176 225.473,412.402 228.715,413.232
  17108. 229.62,412.402 229.62,409.688 231.807,405.992 232.184,403.881 233.993,401.393 236.558,400.035 239.348,397.473 244.023,398.301
  17109. 246.059,397.17 252.017,395.512 253.299,391.666 257.823,392.42 260.16,392.117 262.498,392.871 265.363,390.232 265.063,388.045
  17110. 266.344,387.744 266.344,386.01 268.229,383.672 268.229,381.711 274.79,379.223 276.977,375.604 277.73,372.965 278.032,371.758
  17111. 280.068,371.531 281.426,372.211 283.16,371.154 285.8,371.004 287.006,374.623 289.042,375.527 289.494,376.584 290.928,376.961
  17112. 291.907,375.68 295.226,376.811 296.206,378.016 299.298,378.242 300.957,376.584 301.711,377.639 305.632,376.131
  17113. 305.632,373.719 308.724,373.039 308.724,371.682 311.438,371.154 313.776,369.646 317.094,366.705 318.979,369.043 322.977,370.4
  17114. 326.067,372.588 327.5,370.928 330.216,367.912 334.966,367.006 336.55,367.986 344.316,366.328 345.222,363.313 350.576,357.807
  17115. 350.274,355.018 356.081,353.283 358.268,351.172 361.781,350.656 363.923,350.342 367.09,353.434 369.202,356.148
  17116. 369.202,358.486 371.464,362.105 370.71,365.725 372.067,366.252 372.746,369.043 374.104,368.967 375.988,370.777
  17117. 379.533,372.965 379.005,378.242 384.51,378.016 387.602,379.148 389.336,379.072 392.051,381.637 394.388,379.902
  17118. 399.592,381.033 403.513,380.58 407.962,378.469 412.863,372.361 413.617,371.305 415.428,370.701 415.428,368.666
  17119. 413.994,365.424 416.784,360.975 419.424,357.883 420.856,357.279 424.325,354.037 428.926,352.98 431.564,352.83 431.564,351.473
  17120. 434.431,349.738 437.598,350.568 438.578,349.436 440.84,350.568 444.158,348.457 448.909,347.324 452.076,346.873
  17121. 453.961,344.912 453.434,341.141 452.453,339.709 452.302,336.014 453.584,334.506 450.266,327.266 452.151,325.004
  17122. 453.961,325.154 454.263,319.801 460.748,317.991 463.086,316.709 468.214,314.296 466.856,311.506 473.492,305.398
  17123. 474.02,302.457 476.734,300.646 478.997,298.083 482.541,297.857 483.521,295.52 484.05,292.051 482.239,288.582 479.676,282.851
  17124. 480.354,271.313 481.033,269.277 479.147,268.146 477.79,265.959 478.922,265.055 478.771,259.7 480.731,258.268 481.41,256.382
  17125. 479.751,252.008 479.449,246.051 481.636,244.543 483.371,241.904 484.05,238.208 481.787,236.55 481.335,234.438 483.22,230.517
  17126. 486.387,230.064 488.574,231.271 491.213,231.422 495.964,228.405 498,222.146 "/>
  17127. </g>
  17128. </svg>
  17129. </template>
  17130. </file>
  17131. <file path="components/home/dashboard/common/map/mapGyeongbuk.vue">
  17132. <template>
  17133. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  17134. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  17135. <g id="경상북도">
  17136. <g>
  17137. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="
  17138. 1584.227,-911.443 1573.263,-915.281 1559.009,-911.443 1548.594,-901.576 1541.467,-887.322 1531.599,-881.292
  17139. 1521.184,-884.033 1514.604,-889.515 1506.381,-887.871 1493.772,-892.805 1476.23,-890.063 1459.235,-871.973 1452.657,-864.846
  17140. 1434.566,-858.816 1414.283,-858.816 1397.836,-854.979 1385.776,-862.105 1368.781,-854.979 1364.944,-846.207
  17141. 1343.016,-836.888 1334.793,-825.375 1319.991,-823.183 1309.575,-827.02 1293.129,-818.797 1284.357,-806.736 1265.719,-803.447
  17142. 1255.303,-803.447 1250.917,-795.224 1232.826,-795.224 1224.055,-798.513 1228.441,-810.025 1216.929,-807.833
  17143. 1216.929,-799.609 1216.929,-783.163 1220.766,-773.296 1227.893,-773.296 1232.826,-761.783 1241.05,-754.108 1253.11,-736.283
  17144. 1255.852,-730.536 1251.466,-722.86 1243.791,-722.86 1254.755,-712.993 1251.466,-693.806 1243.791,-675.715 1246.531,-658.172
  17145. 1250.369,-650.498 1261.333,-643.919 1267.363,-634.051 1269.008,-618.702 1277.779,-608.286 1295.87,-603.9 1302.448,-609.93
  17146. 1320.539,-606.093 1336.438,-594.581 1337.533,-587.454 1345.209,-582.52 1354.528,-582.52 1364.396,-575.941 1369.33,-566.622
  17147. 1375.908,-566.622 1380.294,-572.104 1400.577,-571.556 1410.445,-566.622 1418.12,-556.754 1431.825,-556.754 1448.819,-556.754
  17148. 1465.266,-546.338 1470.748,-534.278 1474.037,-528.796 1480.067,-528.796 1482.809,-536.471 1485.001,-561.14 1503.092,-579.23
  17149. 1498.706,-590.195 1520.103,-606.822 1540.918,-617.605 1557.912,-618.153 1567.232,-618.153 1584.227,-627.473 1589.16,-636.792
  17150. 1585.322,-644.467 1595.191,-649.949 1602.317,-644.467 1611.637,-648.305 1616.57,-655.431 1623.697,-656.528 1623.697,-666.396
  17151. 1614.926,-668.588 1609.992,-664.203 1599.576,-666.396 1602.317,-683.938 1591.901,-686.679 1590.805,-703.673
  17152. 1596.287,-712.993 1605.607,-715.734 1608.896,-726.15 1602.317,-739.307 1602.865,-750.271 1610.541,-751.367 1613.83,-766.717
  17153. 1612.186,-780.422 1603.414,-791.935 1590.805,-806.188 1584.227,-820.989 1581.486,-829.761 1590.805,-851.141 1598.48,-864.846
  17154. 1596.836,-871.973 1607.799,-875.262 1613.281,-877.455 1620.408,-878.551 1617.119,-886.226 1605.059,-885.13 1597.932,-885.13
  17155. 1592.998,-881.84 1586.42,-894.449 1588.612,-902.672 "/>
  17156. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="
  17157. 1632.651,-900.541 1629.119,-895.545 1626.438,-894.693 1623.027,-894.693 1620.713,-892.987 1619.008,-890.307
  17158. 1621.443,-886.531 1624.732,-885.313 1628.631,-882.876 1632.651,-886.165 1632.651,-889.576 1637.524,-895.059 "/>
  17159. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="
  17160. 1678.579,-847.182 1676.264,-844.745 1675.412,-842.187 1673.463,-842.187 1671.514,-838.897 1670.904,-833.294
  17161. 1674.193,-827.324 1676.873,-826.715 1679.432,-819.649 1684.549,-819.649 1687.229,-822.938 1686.741,-826.715
  17162. 1687.229,-832.319 1685.645,-836.339 1688.69,-838.532 1689.178,-843.283 1684.426,-844.989 1681.26,-848.034 "/>
  17163. </g>
  17164. <g>
  17165. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="
  17166. 1706.967,-582.654 1701.456,-591.396 1697.846,-589.495 1695.185,-591.396 1692.523,-587.975 1696.516,-580.943
  17167. 1692.523,-580.943 1692.523,-578.093 1698.035,-574.482 1693.854,-574.482 1693.475,-571.104 1691.384,-569.731 1694.614,-561.37
  17168. 1691.384,-555.098 1685.112,-550.347 1680.742,-550.347 1677.512,-551.107 1675.99,-556.999 1668.389,-560.419 1669.34,-548.637
  17169. 1662.117,-545.596 1658.127,-558.139 1651.855,-560.419 1644.824,-556.238 1644.824,-552.248 1653.945,-550.917
  17170. 1656.037,-543.506 1652.996,-545.406 1649.385,-542.556 1658.317,-532.864 1663.258,-524.882 1661.928,-516.14 1656.037,-510.819
  17171. 1659.077,-507.018 1652.426,-506.258 1661.928,-493.905 1665.349,-502.077 1670.1,-497.326 1666.108,-495.616 1667.819,-492.765
  17172. 1675.896,-489.915 1683.212,-491.055 1696.135,-498.466 1691.764,-492.195 1690.434,-487.254 1695.185,-485.544
  17173. 1705.826,-488.964 1712.098,-496.756 1709.818,-501.887 1717.799,-509.489 1721.6,-510.249 1722.36,-506.258 1725.021,-513.009
  17174. 1730.723,-514.24 1724.07,-524.122 1730.342,-532.28 1723.311,-532.673 1719.32,-537.044 1721.029,-540.085 1713.618,-546.356
  17175. 1709.058,-544.456 1706.967,-547.307 1714.379,-553.958 1712.288,-557.379 1718.18,-566.5 1713.428,-567.831 1714.759,-571.104
  17176. 1711.148,-582.084 "/>
  17177. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="
  17178. 1798.756,-535.904 1790.965,-525.832 1776.569,-520.812 1767.399,-510.249 1764.359,-503.978 1764.359,-499.417
  17179. 1758.848,-492.195 1762.027,-483.097 1755.997,-473.001 1758.658,-471.291 1754.477,-467.87 1750.296,-470.34 1750.296,-465.779
  17180. 1743.455,-469.2 1748.586,-476.992 1744.785,-479.272 1736.043,-462.359 1737.754,-458.748 1742.125,-458.748 1751.437,-447.536
  17181. 1746.686,-457.988 1757.707,-446.396 1759.038,-449.246 1754.857,-458.938 1757.138,-461.219 1763.029,-453.047
  17182. 1762.459,-461.409 1777.472,-447.346 1782.223,-448.296 1785.264,-440.694 1790.395,-442.785 1798.756,-440.694
  17183. 1798.756,-445.635 1784.883,-457.418 1790.774,-459.128 1793.625,-456.658 1797.426,-457.988 1797.616,-466.16 1800.656,-470.34
  17184. 1807.878,-469.771 1805.217,-475.852 1812.439,-479.272 1822.891,-473.761 1828.973,-476.802 1822.891,-478.702
  17185. 1824.222,-481.173 1828.118,-480.413 1828.973,-483.833 1832.583,-478.893 1836.764,-484.213 1833.533,-488.299
  17186. 1820.787,-489.836 1816.531,-495.983 1813.959,-503.598 1819.66,-507.588 1814.529,-511.769 1801.987,-505.118 1802.367,-499.417
  17187. 1800.276,-494.096 1794.575,-492.385 1791.914,-498.656 1802.938,-520.701 "/>
  17188. </g>
  17189. <path fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" d="M475.398,355.372l-0.805-3.534l0.481-2.41
  17190. l-0.803-1.045l-0.722-3.536l-1.929-2.009l0.401-3.213l-2.251-0.162l-1.526-2.49l-1.768,0.883l-0.643,2.41l-1.525,2.653
  17191. l-1.688,1.607l0.081,1.526l-1.929,0.16l-2.571,3.293l0.161,1.287l-2.41,1.285l-1.126,2.009l0.242,2.17l-2.17,0.803l-0.803,1.527
  17192. l-2.491,0.642l-3.375,1.928l-3.215,2.171l0.644,2.249l-1.446,1.446l-2.33,0.161l-5.383-2.33l-1.446-2.089l1.446-1.848l-2.733-0.965
  17193. l-1.687,1.688l-2.73-3.054l1.767-1.126l2.009-2.649l2.411,1.123c0,0,3.454,0.161,3.454-0.081c0-0.24,0.16-1.767,0.16-1.767
  17194. l-7.794-2.812l-4.821,3.937l-2.087-5.464l1.525-1.848l0.402-3.455l2.009,0.482l2.33-0.803l1.446-2.171l3.133-0.401l0.643-1.688
  17195. l-0.883-1.686l2.73-4.581l0.884,1.769l3.054-0.643l-0.964-5.705l-2.572-0.08l-7.632-5.706l-1.204-4.097l1.365-3.214l-0.644-5.383
  17196. l-1.526-4.419l-2.491-0.644l-2.491-2.09v-3.938l3.054-1.525l1.206-3.858l-2.009-0.722l-0.563-1.688l1.848-2.569l-2.411-2.491
  17197. l-1.045-2.893l0.725-4.259l1.848-1.688l-1.848-4.419l1.204-0.723l-0.08-5.063l0.241-7.955l1.688-4.821l0.561-3.133L427.27,251
  17198. l0.642-2.812l2.733-4.259l-0.081-2.571l1.527-0.885l4.177-4.901l0.482-3.213l1.446-2.331l-1.045-3.776l0.885-2.973l0.723-5.544
  17199. l-1.607-4.018l0.481-1.606l2.41-2.009l0.725-3.535l1.527-1.849l-0.965-1.848l-1.688-0.563l-0.723-5.384v-4.418l0.723-1.607
  17200. l-3.294-4.419l-2.169-1.928l-2.331-4.58l-0.482-3.535l1.849-1.205l-0.965-3.054L431.689,168l1.928-5.544l1.13-1.237l1.439-1.575
  17201. l1.287-4.018l1.366-3.294l2.49-1.849l0.884,0.723l2.009-1.848l1.365,0.964l0.402-3.456l2.009-2.892l-0.081-3.616l-0.482-4.419
  17202. l1.207-1.365l-2.33-7.472l2.731-5.063l-2.652-4.981l-1.687-1.928l-0.563-2.572l-0.563-4.74l-2.892-4.018l-0.723-2.812l-4.26-5.625
  17203. l-1.525-4.74l0.723-2.25l-1.848-5.142l0.964-2.25l-0.563-3.616l-0.161-4.821l1.125-4.419l-0.883-4.901l-1.045-3.375l-1.768-5.143
  17204. l3.213-4.178l-1.125-6.347l-1.527-2.813l0.404-2.893l1.284-0.804l-0.644-4.821l1.929-2.491l1.446,0.402l1.045-1.044l-1.527-2.812
  17205. l-4.98-3.616l-2.892-3.535l-3.536-3.535l-1.365-2.973l1.767-2.893l-2.17-1.045l-0.804-1.848l1.688-2.491l-2.009-0.482L419.797,2
  17206. h-2.09h-2.49l-3.053,1.365l-2.733-0.321l-2.329,3.535l-1.446,0.402l-3.054,2.008l-0.562,2.973l-4.901-1.125l-1.366,1.125v2.732
  17207. l-1.447,1.286l-1.687,0.482l-2.491,1.688l-1.445,3.133l-4.581,3.616l2.491,3.615l-1.285,2.25l1.204,3.535l1.125,1.366l-3.535-1.286
  17208. l-2.569,0.563l-2.491-0.965l-3.054,1.688l-2.09-0.804v-2.491l-3.936-3.535l-0.725-3.133l-3.535-0.482l-3.294-3.054l-3.135-0.642
  17209. l-0.48-2.009l-4.981-1.365l-2.733-2.412l-6.024,4.34v1.687l-1.287,1.446v1.526l-1.929,2.894l-5.462-3.617l-5.625-0.964
  17210. l-7.313-1.767l-3.775,1.688l-3.213,0.723l-1.206-1.126v-1.606l-1.929-2.651l-3.375,1.205l-2.49-0.683l-2.01,3.012l0.644,1.527
  17211. l-4.981,6.91l0.401,3.053l-0.965,1.045l-1.686-2.009l-2.572-1.206v2.732l-1.767,0.883l-2.171-2.089l-3.695-0.321l-1.365-2.491
  17212. l-1.688-2.651l-1.366-0.241v-2.571l-0.724-1.205l-2.088,0.643l-1.77-0.643l-1.526,1.044l-1.687-0.964v-2.25l-3.775-0.402
  17213. l-1.527-1.807l-1.527,1.486l1.126,1.446l-0.081,1.285l-1.848,1.446v2.25l-1.125,1.446l-2.009-2.169l-1.608,4.901l1.848,2.973
  17214. l0.805,2.892l-2.008,2.973l-4.581-4.018l-5.142-1.366l-1.768,1.366l-1.337-0.243l-1.315-0.239l-2.651-3.856l-1.768,0.322
  17215. l-2.41-2.331l-3.938-0.241l-0.803-1.687l-2.009,0.964l-2.41,3.938l-0.644,3.375l-2.972-3.134l-3.214-0.964l-0.723,2.892
  17216. l-5.866-0.08l-1.365,2.732l-2.651,0.723v2.41l1.285,1.687l-3.133,4.581l-1.125,2.57l-2.893,1.848h-4.178l-3.054,1.768v2.973
  17217. l-7.071,4.74l-0.482,1.607h-2.169l-3.053,2.089l-0.884,5.062l-4.5,2.17v4.178l-0.723,3.616l-3.615,4.099l-0.401,4.017l4.017,1.446
  17218. l2.33,2.732l-0.321,4.981l-3.693,4.581l-2.333,6.668h-4.661l-2.732-1.286l-3.616,0.884l-3.536,4.258h-1.848l-1.366-2.571
  17219. l-4.821-2.331l-4.901,0.482v-2.731l-5.142-3.696l-2.09-2.813l-1.285-4.499l-2.732-0.161l-2.169-2.089l-2.813-0.562l-2.411-1.929
  17220. l-2.169,3.455v2.331l1.205,1.687l-0.482,1.526l-6.267-1.606l-0.723,2.169l1.286,2.892l0.482,4.901l-0.241,2.169l-5.464-1.928
  17221. l-2.973,0.241l-2.651-1.768l-3.456,0.482l-2.41-0.883l-2.089-3.294l-2.732,0.161l0.723,1.848l-5.303,1.848l-1.125,4.58
  17222. l-3.857,1.286v2.33l-2.49-0.723l0.321-2.33l-4.017-3.616l-2.491-0.161l-0.964,5.464v2.249l-2.411,3.214v4.178l-3.455,4.499v2.412
  17223. l4.901,3.856l1.366,2.169l3.134,2.571l1.044,2.331l-0.803,2.008h-4.982l-3.133-1.526l-1.527-2.491l-1.848,0.081l-2.491-3.455
  17224. l-1.848,1.044l-1.366,3.455l-2.438-0.562l-2.543-0.241l-2.893-3.536l-2.331-2.571l-1.687,1.688l-0.723,3.214l-1.125,0.562v3.856
  17225. l-1.849-0.643l-3.375,2.25l1.286,2.33l-0.964,2.089l-3.214-1.607l-5.143,0.563l-3.616,1.768l-1.125,2.216l2.571,0.516l3.375-1.044
  17226. l3.375,1.767l1.205,2.813l3.134-0.698l0.401,4.233l1.768,0.723l-0.804,6.188l-2.088,5.463l-0.885,0.644l1.206,4.065l-1.929,0.595
  17227. l-0.803-3.054l-2.491-4.82l-4.58-1.045l-0.322-4.258l-2.009-1.849l-0.643-3.412l-1.527,2.127l-3.133,5.142h-2.732v1.607v2.732
  17228. l2.25,2.49l-0.964,1.045l-2.009-0.322l-1.688,1.125l-2.571-1.205l-5.223,1.848l-2.973,1.848v4.339l6.188,4.419h2.25l3.937,1.125
  17229. h2.25l2.973,2.571l1.446,2.893l-0.482,2.732l2.572,2.973l5.704,1.527l0.643,7.071l-1.285,2.33l-3.054,1.768h-2.249l-1.527,3.455
  17230. l2.089,2.088l-0.482,5.303l-1.767,4.419l0.482,6.588h2.33l-2.651,4.981l-2.491,1.849l0.16,3.535h2.732l2.009,3.615l-0.964,2.572
  17231. l1.527,1.688l1.526,2.892l-1.767,0.885l-0.241,2.491l-2.973,0.642l-1.045,2.732l-3.615,1.848l-0.884,3.214l-1.286,0.964
  17232. l-0.804,2.251l1.045,3.213l-0.16,2.249l0.964,1.446l0.562,4.581l3.133-0.965l3.135,0.162l1.205,0.803l1.125-2.491l4.499-6.429
  17233. l0.804,1.446l0.563,3.938l2.812,1.769l3.616,0.24l1.768,3.455h2.09l0.321,3.776l4.66,1.526l2.491-1.284l-0.482-2.09l1.044-0.803
  17234. l3.294-0.081l1.125-1.526l2.973-0.965l2.25,1.446h2.25l1.446,2.171l4.098,1.204l-0.723,1.446l-1.928,0.481l-2.009,3.455
  17235. l2.169,3.375v2.652l2.893,1.446l0.161,3.213l1.527,1.607l-4.901,2.088l-3.535-3.534l-4.339-1.206l-2.973,0.965l-1.286,1.607
  17236. l-2.732,0.643l-1.366,2.008l2.25,4.58l0.081,2.249l2.222,3.697l1.474,1.045l-2.892,2.009l0.643,5.864l-2.491,2.491l-2.491,0.724
  17237. l-1.045,1.526l0.241,2.731l-2.169,3.536l0.563,2.812l0.482,5.063l-1.928,1.123l-1.688,2.974L56.14,347.9l-3.295-0.964l-2.169,1.446
  17238. l-1.928,3.374l-4.419,1.446l-0.723,1.929l-1.526,2.09l-0.482,3.856l0.723,1.767l-0.644,2.731l2.651,1.045l2.491,2.41l-1.848,2.009
  17239. l2.49,0.644l1.527,6.91l1.687,1.043l-0.642,2.974l-2.893,1.928l-3.295,1.287l-0.482,3.856l1.527,1.045l-1.606,3.614l0.482,3.536
  17240. l2.49,2.009l2.09-0.482l0.562-0.724l2.009,0.242l1.607-0.884l1.125,3.213l1.446,0.482l0.563,3.455l0.642,1.687l-1.044,2.412
  17241. l2.892,0.803l2.25-2.009l2.331,0.241l1.125,1.768l3.053,0.884l1.849-2.491l3.696,6.669l2.008,0.481l1.366,2.09l5.384-2.009
  17242. l5.463,2.009l0.723-1.767l3.616-2.01l1.316,0.422l2.942,0.944l0.803,2.089l2.491-0.241l4.098,2.331l1.849,0.321l-0.081,6.267
  17243. l1.446,2.572l0.241,1.767l1.849,1.526h3.294l1.606-0.643l1.286,1.286l0.401,1.848l0.402,3.456l2.089,1.767l4.5,2.009l2.249,7.393
  17244. l0.965,3.533l-0.643,3.377l0.964,2.41l-0.643,2.65l0.643,1.929l-3.375,1.607l-1.286-0.401l-1.928,2.491h-3.053l-0.964,1.043
  17245. l-0.804,3.777l1.205,1.366l3.214-0.965l1.929-0.644l3.696,2.652l0.402,1.929h2.25l1.045,0.964h4.258l1.848-0.401l-0.562-2.894
  17246. l2.169-1.687l3.776,2.812l0.884,2.17l3.856-1.769l0.161-2.007l4.419,0.722l0.482-1.365l1.366-0.323l4.018,1.287l2.089,1.848
  17247. l2.973,0.401l1.366-0.803l1.849,0.24l2.491,3.777l0.723,3.375l-0.081,3.052l1.446,0.964l4.259-1.365l3.455-4.579l-0.08-4.58
  17248. l-3.295-3.856l-3.856-2.893l-2.491-3.294l-2.008-4.661l-0.482-3.938l1.446-1.124l3.293,0.563l2.973,2.088l6.187,1.286l3.295-0.08
  17249. l3.86-3.135v-4.74l-2.977-3.776l-6.427-3.776l-2.41-3.134l0.241-3.374l3.213-3.536l1.125-3.536l2.33-4.979l2.09-1.608h4.499
  17250. l6.669-0.161l2.972-2.973v-3.052l-5.945-4.26l-2.009-1.929l-7.794-1.204l-6.186-0.081l-2.09-2.491l0.804-3.535l1.928-0.482
  17251. l0.161-4.339l4.259-6.829l4.258-6.588l5.223-1.929l0.964-2.329l2.411,1.284l2.169,0.321l1.366,1.446l-1.687,5.625l-1.767,2.491
  17252. l1.606,3.938l3.696,0.079l1.526-0.804l1.688,2.893l1.767,0.322l0.644-2.732l-0.241-2.812l1.446-1.607l2.008-0.563l3.938-7.312
  17253. l-0.241-4.498l0.322-2.652l-2.25-5.142l1.045-1.286l2.25,0.322l1.205,1.124l0.723,2.892l1.606,1.446l1.286-3.775l2.008-0.321
  17254. l2.17-1.446h3.133l3.857-2.329l3.133-4.581l0.563-2.09l2.812-0.32l3.134-0.563l-0.964-2.491l-4.017-2.893l0.321-3.455l2.25-3.695
  17255. v-3.776l0.643-1.446l-1.125-1.367l0.964-1.767l-1.928-2.009l-0.804,1.526l-5.463,0.964l-0.241,2.491l-0.964,1.045l-2.41-0.161
  17256. l-0.723-1.527l-1.688,1.446l-2.331,2.01l-0.322-3.294l-0.723-1.207l1.206-2.812l0.402-3.052l-1.849-2.973l0.563-3.375l-0.281-1.068
  17257. l-0.522-1.985l-2.249-0.724l-0.964-3.455l0.964-2.088l-1.367-1.045l1.126-3.135l-2.491-0.562l-0.563-2.008l1.205-1.688l2.893,0.725
  17258. l0.322-3.778l-2.491-0.803l-2.49-5.142l-2.17-0.725l-1.285-1.445l-2.25,0.643l-0.161,2.33l-2.089,2.731l-1.044-0.159l-0.563-3.375
  17259. l-1.446-0.725l-0.563-4.74l-0.804-1.205l0.482-1.366l-1.928-1.125l-0.884,0.08l1.929-1.767l-0.241-1.285l-2.41-0.644l-1.768,1.848
  17260. l-1.928,0.482l-2.893,2.41l-1.688-0.08l-0.642,1.365l-0.885-2.249l-0.88-3.133l-2.574-1.125l-1.286-2.251l0.241-2.65l-1.286-1.366
  17261. l1.205-0.481l0.402-2.733l1.366-2.41l-2.25-2.088l-1.606-1.287l1.526-4.097h2.973l0.804-1.688h2.25l-0.644-3.133l2.651-2.893
  17262. l0.563-1.555h1.366l0.321,1.875l4.098,1.204l-0.08,2.491l4.017,1.287l1.607,1.285h3.454l2.651,0.32l2.572,2.491l2.089-0.563
  17263. l2.813,1.769l0.883,4.901l4.5,0.159l1.929-1.686l4.177,0.563l1.527,2.168l2.25-0.16l3.455,1.367l1.606,1.445l2.09,0.321
  17264. l0.964,1.446l-0.724,2.009l0.483,1.687l-1.849,1.85l0.883,2.892l-0.401,3.375l-0.804,1.285l0.965,1.928l1.206,0.563l2.49-3.214
  17265. l2.41-1.125l1.608,0.964l1.285,3.213l1.125-1.605l1.606-0.481l3.375,0.32l1.205,1.365l-1.043,2.01l2.813,1.284l4.339-0.24
  17266. l3.133-0.401l2.008,1.687l1.366-0.32l0.805-1.848l1.366-0.161l2.49,2.248l3.133,0.162l4.099,1.365l1.767-3.052l-0.883-2.251
  17267. l1.526-1.045l2.974-0.401l2.41-2.09l2.57,0.965l2.732,0.08l2.973,2.491l3.295,0.482l1.044,2.17l1.929,0.32l-1.285,2.731
  17268. l2.893,3.054l1.043,2.893l1.769,2.571l-2.17,1.929l-0.642,4.018l-3.938,0.321l-2.009-0.884l-2.171,0.24l-1.928,2.17l0.482,2.731
  17269. l-0.321,2.251l-0.803,1.365l-1.688,1.527l-0.803-0.242l-1.287,3.294l-2.248,0.322l-1.285,1.605l-0.725,1.287l-2.248,1.527
  17270. l-1.85,0.401l-2.731-0.161l-2.491-2.169l-3.455-2.17l-1.045,0.161l-1.848,2.65l-1.204-0.159l0.481-3.215l-1.286-2.249l-1.366,2.249
  17271. l-1.445,0.883l-0.803,1.527l-2.252,0.805l1.045,2.569l-0.964,3.215l-2.731-0.964l-0.08,3.615l-2.249,2.251v4.338l-2.17,3.214
  17272. l0.723,2.41l-1.446,2.33l2.01,2.331l4.339,1.045l2.249,1.446l0.161,1.929l1.446,0.641l-0.201,0.78l-0.442,1.711l2.491,3.696
  17273. l1.365,0.885l-0.643,4.258l-1.606,1.045l1.366,3.775l-1.207,2.731l-0.4,2.41l2.008,2.411l2.893,1.769l1.045,2.168l-0.643,1.446
  17274. l0.161,2.171l1.204,2.169l-1.123,3.615l0.883,1.045l-0.964,2.572l-1.366,1.767l-3.455,2.893l-3.135-2.893l-1.445,0.884l1.445,2.491
  17275. l-0.32,4.5l-1.688-0.081l-2.731,2.893l0.241,2.009l1.688,1.125l0.32,3.375l-4.579,3.534l-1.446-1.043l-0.885,1.767l-1.848,0.24
  17276. l-0.16,2.17l1.285,2.01v2.329l1.125,1.608l1.285,2.569l-0.723,2.813l0.241,1.285l-1.365,1.688l1.045,1.687l-1.929,1.929
  17277. l-0.161,1.688l-4.66,0.883l-1.848-0.644l-3.294,3.135l-1.849,1.687l-2.169-0.964l-2.089,2.089l-2.331-2.73l0.241-1.688l1.205-0.964
  17278. l-2.008-2.171l1.606-1.848l-0.081-2.329l-2.169-0.162l-1.928,1.368l-1.768-0.805l-0.803,2.009l-2.331-2.169l-2.411,1.124
  17279. l-2.651-1.045l-0.322,2.41l-3.776,2.974l-2.812,1.446l-1.206,1.85l1.125,2.489l-0.322,1.85l0.804,0.964l-2.009,5.462l0.482,3.778
  17280. l1.687,0.803l0.644,3.374l-1.286,2.491l0.964,2.893l-0.643,2.249l1.366,1.607l2.973,1.527l1.687-0.162l0.08,4.18l3.214,0.482
  17281. l0.885,3.132l6.749,3.617l6.668-1.848l1.929,0.964l0.964-2.09l4.499-2.652l4.5,0.563l3.375,0.323l1.206,1.123l0.401,2.733
  17282. l2.249,1.767h2.973l2.252-1.848l2.009,1.848h2.41l3.374,2.813l3.375-0.321l4.339,0.884l3.455-3.375l0.642-4.099l2.41,0.242
  17283. l3.455-1.446l2.893-0.805l2.652,2.813l2.168-2.089l1.126-3.695l1.366-1.446l1.607-2.332l0.563-3.052l0.722-2.251l2.009,0.242
  17284. l0.965,1.526l6.428-2.009l3.055-0.644l5.303,2.171l3.213,3.132l0.481,1.77l3.455,0.642l1.608,1.365l1.767,0.081l3.856-2.491
  17285. l1.77-3.534l1.686-0.563l1.126-1.769l1.687-0.321l1.928,1.126l1.769-1.446l0.884-4.019l4.42,1.126l1.607,0.239l1.285,2.01
  17286. l2.009-0.964l0.08-2.09l-2.652-2.813l-1.446-0.161l0.803-2.73l-0.561-1.285l1.365-1.929l-1.125-1.688l2.973-4.258l2.411-0.964
  17287. l0.563-0.964l6.187-1.768l1.848,0.321l0.964-2.25l2.571,0.884l0.884-1.85l-0.642-1.445l1.366-1.043l2.49,0.883l1.525,2.33
  17288. l2.733,0.401l1.607-0.803l1.365-2.17l1.285,1.044l3.213,1.769l0.805-1.769l1.527-0.563l4.497,3.778l2.814,1.928l4.979,1.204
  17289. l1.527,2.731l-0.081,1.85l-0.964,1.124l0.403,3.054l-1.446,2.009l0.482,2.329l1.605,1.77l4.18,0.561h1.446l2.41,2.572l2.087-1.929
  17290. l0.644-2.571l1.769-0.804l2.731,0.804l1.607-0.723l1.366-3.135l1.848-0.239l2.41-2.572l2.652-0.24l1.365,1.446l1.687,1.767
  17291. l2.572-0.724l3.937,1.126l0.965,1.445l2.249-0.239l3.856,1.848l1.85,1.446l1.767-0.725l1.848,1.366l1.286-4.339l2.49-0.321v-3.294
  17292. l2.331-1.206l0.965-3.455l-1.045-4.258l1.767-1.124l0.482-2.49l1.206-4.261l-1.126-4.498l2.893-2.571l-0.563-2.812l1.125-4.259
  17293. l-0.964-3.376l0.482-1.687l1.767-0.401v-2.17l1.607-0.964l1.767-3.776l-1.204-2.09l0.482-1.605l2.009-3.616l0.031-0.251
  17294. l0.451-3.687l1.929-4.178l1.365-0.964v-1.526l-3.856-0.402l0.239-2.813l2.411-0.078l-0.24-2.01l-0.804-2.652l2.25-0.644
  17295. l-2.572-5.303l-1.526-1.525l0.08-2.732l3.216-1.045l3.133-5.061l1.847-0.964v-3.135l1.126-2.491v-2.49v-1.205l-0.32-1.607
  17296. l1.204-0.803l2.329-0.081v-2.973l2.974-1.688l0.805-2.813v-1.526l-1.367-2.008L475.398,355.372z"/>
  17297. </g>
  17298. </svg>
  17299. </template>
  17300. </file>
  17301. <file path="components/home/dashboard/common/map/mapGyeonggido.vue">
  17302. <template>
  17303. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  17304. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  17305. <g id="경기도">
  17306. <g>
  17307. <path fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" d="M443.939,252.48l-6.081-1.48l-1.967-2.99
  17308. l-2.504-3.398l-2.325-1.252l-1.431,2.325l-1.968,0.537l-4.828-1.968l-3.22-3.398l-4.113,2.146l-5.544-0.716l-4.292,1.073
  17309. l-2.504-1.609l0.894-2.325l-10.551-7.69l-0.18-2.683l-3.397,1.609l-1.61-1.609v-3.041l-3.04,0.179l-3.219-3.755l-6.617-3.041
  17310. l-2.504,2.504l-3.577,1.252l-0.179,2.683l-2.861,0.894l-2.146-0.357l-2.504,1.788l-5.723-5.544l-0.357-2.683l1.967-0.894
  17311. l0.537-1.967l1.788-1.252l-0.716-3.398l1.789-11.088l0.715-1.967l0.18-2.862l1.072-2.503l-0.357-2.862l-2.683,0.179l-0.179,2.325
  17312. l-2.683,0.894l-3.935-3.04l-3.041,2.325l-2.503,2.146l-0.895-5.186l1.967-3.219l6.976-4.65l1.788-1.431l0.357-3.577l-3.756-5.723
  17313. l-3.397-4.471l4.829-6.975l-0.537-2.683l-3.397-2.325l0.894-4.829l3.756-3.219h2.683l0.537-2.504l2.146-1.431l1.968,0.537
  17314. l0.715-1.789l0.895-3.219l3.576-2.504h3.936l2.324,0.895l1.61-3.756l-0.537-2.504l1.788-3.398l0.895-4.113l-1.609-5.007
  17315. l1.252-1.61l-0.895-4.471l-2.683-1.788v-3.756l-6.081-2.504l-4.828-0.715l-2.325,0.537l-3.935-1.61l-0.179-3.04l0.536-3.398
  17316. l-1.788-6.081l-6.617-0.179l-3.577,0.537l-1.252,1.789l-1.788-3.577l-6.796-0.537l-4.472-3.577l-0.357-4.113l-1.609-3.398
  17317. l0.536-3.935l-1.788-1.609l0.179-7.869l-0.357-7.69l-1.073-3.755l-0.895-2.504l-2.146-0.537l-0.537-1.967l-2.504,4.292
  17318. l-2.324,1.788l-2.504-0.537l-0.358-4.292h-6.08l-1.968-1.789l-1.609,2.683l-1.788,1.967l-7.333,2.146l-0.357,4.471l-2.325-1.609
  17319. l-2.683-0.179l-1.967-3.935l-1.073-5.008l-1.968,0.894l-4.649,0.537l-1.788-1.609l0.179-2.146l-1.968,0.536l-0.357-5.365
  17320. l2.504-2.325l0.536-3.041l-0.357-2.683l1.967-3.219l1.968-1.609l0.357-1.789l-3.756,0.179l-0.894-2.146l-5.545,1.073l0.716,2.146
  17321. l-1.073,1.609l-2.683,2.862l-5.008,3.04v2.146h-3.935l0.358,2.862l-0.716,1.789l-5.901-6.975l-3.577-2.146l-1.252-5.008
  17322. l0.895-2.504l0.536-2.683l-2.683,0.894l-3.04-4.65l1.609-2.503l-1.252-3.219l-2.861-1.789l0.179-4.65l0.357-2.683L241.31,2
  17323. l-3.398,2.782l-3.935,0.715l-2.504-1.609L230.162,2l-1.432,0.794h-2.543l-1.113-0.397l-1.271,0.716l-1.828,0.397l-0.954-0.755
  17324. l-0.636,0.755h-1.271L217.683,2l-1.352,0.755l-0.397,2.504l-1.907,2.543l-0.875,0.795v1.351l-1.033,1.113l0.477,1.113l0.159,2.226
  17325. l-2.385,1.272h-2.861l-1.828-0.715v-2.385l0.795-0.954l0.397-1.113L205.68,9.71l-0.397,0.954l-2.226-0.556V8.836l-2.543-1.033
  17326. l-1.034,0.477v1.351l-1.431-0.795l-0.636-0.954l-2.066-1.033v1.113l-1.987-0.477l-1.431,1.908l1.271,4.61l0.795,3.418
  17327. l-2.066,2.385l0.636,1.828h-1.59l-1.669,1.351l-0.397,2.067l-1.271,1.271v2.146l-2.623,2.702h-1.59v1.511l2.94,2.225l0.397,0.954
  17328. l1.987,1.192l0.318,1.431l-0.954,1.51h-1.59v1.431l-1.055,0.636l-2.045-0.556l-2.066,0.159l-2.941,1.113v2.067h-1.59v-0.875
  17329. l-1.112-0.794l-0.478-1.113l-1.669-1.271l-1.112,0.318l-1.272-0.715h-1.112l-0.875,1.113v0.715l-1.431,0.238v0.875l-1.112-0.08
  17330. l-1.431,0.636v0.954l-0.875,0.556v3.1l-3.815,1.51l-1.986,0.636l-0.954,1.034l-1.033,2.623h-0.795v1.271h1.192l1.112,0.954
  17331. l-0.397,0.874h-0.795l-0.079,1.431l1.271,1.51l1.511,1.51l0.158,1.749l-0.715,0.874l0.159,1.431l-1.749,1.749h-0.795l-0.397,1.351
  17332. l0.159,2.862h-1.669v3.417l0.874,1.113l-0.874,0.954v2.226h-3.259l-2.544,5.246l-1.431,5.087v1.828l1.112,0.477l-0.238,2.067
  17333. h-2.226l-1.351-0.636l-3.498,0.159l-1.431,1.431v-1.033l-2.066-0.715l-0.397,1.749l-2.941,3.259l-0.795-1.033l-1.907-0.556
  17334. l-0.318,1.113l0.954,1.113l-0.954,0.556l-1.748-1.828l-1.511-1.033l-3.1,1.749l-0.795,1.51l-2.146,1.51l-0.953,2.782l-1.511-1.272
  17335. l-1.51-0.238l-0.318,1.033l-2.305,0.477v-1.59l-0.954-0.397l-0.954,0.557l-0.715-2.385l-2.067,0.159l-0.636,1.828l-2.544,1.351
  17336. v1.431l-1.51,1.828l-1.271-0.477l-1.59,1.51l-1.272-0.875l-0.397,0.875v2.543v2.384l-0.318,1.908l-0.795,1.192v2.146l-0.397,1.749
  17337. v1.51l1.987,1.669h1.669l0.954-0.715l0.636,1.113l-2.066,2.226l0.477,2.861l-0.954,1.908l-1.271,1.987l0.556,2.146h2.226
  17338. l0.715,1.113l-3.021,0.875l1.113,1.272l-1.352,1.113h2.305l1.351-0.954l2.703,1.669l-3.815,5.723l-0.556,3.12h-4.65l-1.252,1.533
  17339. l2.325,3.798l-3.398,6.114l-1.788,4.211l2.146,3.526l-0.537,2.475l-3.935-1.449l-4.829-1.025l-5.365,3.708l-2.325,4.829
  17340. l-2.146,0.894l-2.862-0.894l-2.325,0.894v-3.577l-15.023-5.854l-1.789,6.842l0.986,3.304l3.843,5.544l-2.683,10.194l0.179,4.65
  17341. l1.967,1.073l1.073,6.438l-1.967,5.365l3.756,2.504l0.894,2.503l-3.219,2.683l1.252,4.113l4.113,4.292l1.252,8.764l1.609,1.252
  17342. l3.219,1.967l1.789-2.146l1.609,2.146h2.683l0.179,1.789l3.577-1.968l2.146-2.683l3.041,1.252l3.398-5.902l0.894-3.04l2.683-0.179
  17343. l1.967-3.755l5.723,1.609l3.577,3.577l5.902,4.471l-0.536,3.756l3.577-0.716l3.219,4.649h3.577h2.146l0.895,4.472h1.967
  17344. l0.358-1.968l3.04-1.252l1.609,1.61l5.724,0.536l2.683-2.683l-1.789-2.504l1.252-2.861l1.789-1.252l5.007,4.471l6.797,4.293
  17345. l4.649,3.04l4.292-1.431l0.537-2.683l1.967-2.861l0.537,1.967l3.219-0.179l1.073-3.756l-0.357-4.65l2.146-4.471v-3.219l1.61-0.895
  17346. l-0.358-3.577l3.935-0.537l3.756-2.146l0.537-1.967l2.503-0.179l2.642,2.146l0.757,4.292l1.073,2.504l-0.895,1.789l4.113-0.895
  17347. l3.22-1.967v-3.219l-1.61-3.577l2.146-1.252l0.179-1.967l1.61-0.715l-0.18-4.829l2.146-1.789l2.861-0.179l-0.357-2.325
  17348. l0.357-2.325l1.968-1.61l3.755,0.537l1.61,3.219l1.967-1.431l2.325,0.894l0.895,2.861l3.576-3.398l4.65-0.715l1.431,1.967
  17349. l2.861,0.358l0.537,1.788l-1.431,2.146l1.431,3.398l-0.716,3.04l-1.252,1.789l1.609,4.829l3.22-0.715l0.943,1.51l0.845,1.352
  17350. v2.861l-2.146,1.431l-0.179,2.325l3.756,0.537v5.365l-1.073,2.146l1.073,1.968l-1.967,0.716l-0.537,3.04l-2.324,1.431
  17351. l-0.358,2.504h1.789l-1.431,4.026l1.251,1.696l2.146-0.894l3.577-2.325l5.365-2.146l3.756-0.179l2.146-3.219l1.729-0.916
  17352. L249,244.79l0.715,1.968v1.967l1.61,4.742v3.127l0.715,2.165l-6.26,0.876l-2.146,3.935l-0.358,2.324l-3.397,5.365l-0.358,2.504
  17353. l2.146,1.252h3.398l0.715,1.789l-1.252,2.861l-3.04,4.292l-2.325,2.146l-2.683-1.252l-0.179,2.146l1.609,0.895h-3.576
  17354. l-1.073,2.146l-0.716,2.146l-1.967-1.788l-1.968,0.179l-2.861,1.609l-1.609,3.935l-1.968,1.789h-3.04l0.357,1.967l-0.357,2.325
  17355. h-5.902l-0.908-0.855l-2.132-2.006l-2.146-0.537l1.072-2.861l-0.536-3.576l-0.357-3.398l-1.61-0.537l-0.536,2.504l-3.756,1.968
  17356. l-2.683-2.504l-0.357-2.146h-2.146v1.61l-5.365,3.04l-1.967,0.895l-2.146,2.324v2.146l-7.153,1.788l-0.716-1.788l-2.325-3.398
  17357. l-3.397,3.577l-3.398,2.504l-1.788-0.895l-1.431-4.113l-3.22-5.723l-4.113-8.048l1.609-0.895l-2.504-2.683l-5.186,4.292h-1.789
  17358. v3.041l-3.397-0.358l-5.545,0.179l1.431-2.146v-2.325l1.61-0.715l-3.398-3.041l1.968-1.431l1.072-2.861l1.789-0.357l-1.789-1.968
  17359. l0.716-3.397l1.073-1.61l-1.609-2.146l-0.358-2.683l-3.576-0.179l-1.252-2.128l-1.968,2.307v1.609l-1.609,0.895l-0.536-3.398
  17360. l-3.22-1.412l-3.219-1.092l-1.61-0.179l-1.431,5.901l0.179,6.438l-5.007,1.252l-0.716,1.968l0.716,2.861l-0.537,2.504l0.179,2.325
  17361. l3.398,1.609l1.431,2.146l2.861,1.967l2.683,0.179v5.544l0.537,1.789l-2.683,1.073l-0.895,2.503l1.252,3.398l-1.073,2.325h-2.683
  17362. l-1.609,1.431l0.179,3.04l-0.895,2.861l-0.357,2.146l4.471,0.895l-3.219,0.715h-3.04l-2.862,2.861l-9.836,12.341l1.073,1.609
  17363. l-2.146,2.146l-2.504-1.431l-1.789,2.503l0.591,2.875l-3.452,1.914l1.749,3.418l2.702-0.477l8.824,4.451l5.087,1.828l11.445,3.975
  17364. l7.393-0.457l2.385-1.054l3.021,0.557l2.066,1.391h1.292l1.431,4.472l4.113,4.292l2.861-1.967l-0.795,1.967l-1.352,1.054
  17365. l-1.748,0.238l-1.292-0.755l-1.649-2.425l-1.629-1.511l-1.232-2.623l-3.1-2.503h-1.987l-4.61,0.834l-4.134,0.557l-0.556,0.954
  17366. l0.079,2.385l0.397,4.689l-1.073,0.786l-1.629-7.225l-2.941-0.874l-2.305-0.159l-4.054-1.947h-2.703l-1.271,1.391l1.192,2.385
  17367. l-0.159,1.828l-3.656-1.828l-0.954-0.08l-0.238,2.146l-1.192-1.192l-2.066,1.352v-1.749h-0.954l-1.431,2.146l-2.941-0.159
  17368. l1.351-2.066l-1.51-2.782l-2.226-0.557l-3.18,1.272l0.159-2.106l-3.577-0.597l-5.246,1.511l3.259,3.497l2.702,2.623l0.397,1.49
  17369. l-0.795,1.848l-1.033,1.272l0.159,6.041l1.271,2.226l2.067,3.1l0.556,2.544l-0.477,3.179l-0.636,3.26l-0.874,3.576l-0.636,0.954
  17370. l0.636,1.192l1.302,0.065l1.619-0.463l-0.179,2.504l-1.431,2.146l-1.609,1.788l1.609,3.756l-3.04,2.861h3.577h2.504l3.398-1.968
  17371. l3.935,2.862l-3.577,1.251l-3.041,4.293l2.325,3.576l0.984,5.657l5.455-1.146l3.417-3.021l2.544-2.465l2.94-3.895l1.908-2.066
  17372. l1.987-1.749l2.702-2.305l2.623-0.397l3.18-0.159l3.021-2.385l1.51-2.781l1.173-2.961l0.536-4.829l0.199,6.358l-0.557,2.047
  17373. l-2.066,3.835l-2.862,2.385l-6.199,1.192l-4.657,3.821l10.777-2.629l7.313-0.477l-6.041,1.828l-3.064,1.112l-3.056,0.557
  17374. l-4.054,1.431l-2.623,2.306l-3.021,3.656l-0.079,3.497l1.271,8.902l1.669,3.975l-0.715,1.033l5.425,6.855l-2.504,4.471
  17375. l0.895,4.472h11.804l1.788,1.967l0.715,4.293h-3.04l-2.683,2.504l4.113,4.828l2.325-2.146l2.325,0.179l3.935,1.967l1.967-1.073
  17376. l0.179,4.114l3.935,6.259l-1.788,1.431l3.577,3.935l1.877,2.788l4.591,4.873l-9.04,2.119l0.636,3.602l1.695,2.542l2.189,1.131
  17377. l15.829-2.325l0.465,4.765l9.479-6.26l9.121-2.146l4.471-3.398l4.829-0.715l5.365,0.536l0.716,1.609l2.682,0.895l9.837-5.365
  17378. l2.325,1.609l3.756-3.756l2.324,1.789l1.432-2.862l2.146-1.609l-3.04-0.894l0.536-1.968l4.113-3.577l2.46,0.798l4.157,1.349
  17379. l3.577-1.788l3.04,2.324l5.902,0.716l1.609,2.146l5.544,2.146l2.861,4.65v2.324l9.658,5.008l2.504-1.788l1.967,3.219l4.292,0.358
  17380. l1.789,3.219l1.967,4.113l2.504-3.219l3.04-5.008l-2.503-5.723l3.935,0.536l2.146-1.431l8.048-3.398v-2.146l1.789-1.789
  17381. l1.609,0.179l0.895,1.968l5.365-0.357v-3.577l3.576-2.325l2.325,0.358l1.788-1.61l-2.146-3.935l-2.683-1.788l1.967-3.577
  17382. l0.537-2.504l5.901,0.358l1.789-1.609l2.324,0.536l3.041-3.22l3.04-0.179v-3.04l1.967-0.716v-3.219l1.431-2.325l-0.715-2.325
  17383. l3.04-3.397l5.187-0.895l3.577,2.504h2.861l2.861-3.935l2.504,1.073l1.968-0.357l1.252,1.967l6.438,3.577l3.755-2.504
  17384. l-1.609-5.365l3.935-5.365l5.365,1.073l2.325,1.788v-3.22l-1.609-1.967v-2.146l3.577,0.716l6.617-4.471l0.715-5.724l-1.073-3.397
  17385. l1.073-6.797l-3.04-5.187l6.975,1.61l2.683,3.219l3.398,1.968l5.008,0.357l1.967-1.431v-4.113l2.146-1.789l1.252-5.187l3.04-5.544
  17386. l2.861,0.895l2.325-9.658l3.935-3.04v-3.04v-6.975l2.861-6.26l0.716-4.829l-3.398-7.69l3.398-3.04l2.683-0.179l-1.252-4.65
  17387. l-1.61-6.617l-0.536-12.519l1.609-1.609l4.292-0.179v-4.293l1.432-1.788l1.431-5.365l1.609-7.869l2.504-1.431v-3.22l-1.431-1.967
  17388. l-0.716-7.333l2.146-3.219l-5.187-2.861l-1.609-3.577l-2.325-1.609l-3.935-0.358l-0.179-3.935l3.935-0.536l6.796-6.796
  17389. l3.577-5.008l6.975-0.179l2.861-0.357l2.146-4.65L443.939,252.48z"/>
  17390. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="95.671,385.282 95.989,381.626
  17391. 95.989,378.765 95.194,375.823 93.366,373.598 91.697,370.339 90.981,367.397 90.902,365.49 92.015,364.298 92.969,362.311
  17392. 92.412,360.244 91.141,358.733 87.881,355.713 83.987,357.938 76.913,353.487 75.005,353.408 73.733,352.454 73.653,353.487
  17393. 70.872,355.713 70.712,356.984 69.123,358.495 67.215,358.416 67.692,357.224 67.374,356.349 65.943,356.588 62.366,355.077
  17394. 62.366,356.27 65.308,357.621 65.705,359.449 67.056,360.244 67.056,361.575 68.249,362.311 68.487,365.49 69.679,365.888
  17395. 69.361,367.954 68.487,369.066 69.123,370.021 68.726,371.054 71.11,373.279 68.169,373.279 67.136,374.71 65.308,374.313
  17396. 63.956,375.267 62.923,376.538 62.923,377.73 64.036,377.73 64.751,378.765 65.864,378.049 66.341,378.765 67.851,380.513
  17397. 66.818,381.943 65.705,381.546 64.036,381.626 64.036,382.817 64.036,384.885 65.943,384.964 68.407,386.872 69.361,389.256
  17398. 71.03,387.189 71.03,385.123 72.302,383.295 73.335,378.844 74.766,379.639 76.515,379.161 76.992,382.103 78.979,381.467
  17399. 80.251,379.798 81.205,381.069 80.887,382.023 84.543,383.771 83.43,379.956 81.522,378.844 78.899,376.399 76.515,375.107
  17400. 75.561,373.915 76.992,373.915 78.979,374.79 80.489,376.399 81.443,375.505 83.271,376.399 83.748,374.313 84.94,375.505
  17401. 86.133,375.982 86.133,373.279 87.405,373.995 87.087,377.016 87.881,378.605 87.881,379.877 91.538,380.99 94.002,382.977
  17402. 94.002,384.328 92.73,384.726 92.492,387.349 92.81,388.7 92.571,390.131 93.843,390.846 94.797,387.667 "/>
  17403. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="86.53,394.661 84.623,396.967
  17404. 85.179,398.556 86.212,402.451 86.848,400.464 88.915,398.477 89.789,396.569 87.325,395.854 "/>
  17405. </g>
  17406. </g>
  17407. </svg>
  17408. </template>
  17409. </file>
  17410. <file path="components/home/dashboard/common/map/mapGyeongnam.vue">
  17411. <template>
  17412. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  17413. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  17414. <g id="경상남도">
  17415. <g>
  17416. <path fill="currentColor" stroke-miterlimit="10" d="M93.998,9.937l-5.365,2.98l-2.981-1.49v4.074l-2.583,2.186
  17417. l0.994,4.174l-2.782,0.794l-0.994,4.173l-2.981-0.994l-6.956,7.154l-2.384-2.384l-9.539,6.757h-3.975l-4.373-2.584l-2.186,4.174
  17418. l0.795,3.378l-5.565,10.532l-3.577,1.987l-6.16,5.167l-1.789,3.378l-3.776-1.192l-2.583,4.77l0.994,14.706l-1.789,5.167
  17419. l-3.776,2.186l-1.987,7.949v3.18l-2.981,3.18v2.782l-2.385,2.384v3.577l4.372,7.949l-4.372,0.994l-3.775,6.161v6.359l-6.558,6.956
  17420. v2.782l5.366,4.969l2.981,2.385l2.186,1.192H15.7l-0.795,3.577l5.962,8.963l2.583,4.853l-5.365,3.275l-0.994,4.173l3.18,6.558
  17421. h2.583h3.378h3.378l-2.186,4.968l-1.59,7.949l-4.372,4.373l-3.578,0.794l-3.775,5.564l0.198,4.174l-3.974,2.583v5.366l3.577,3.378
  17422. l-0.596,4.57l-2.98,1.789l-2.385,3.378l-4.173,2.981H0v5.564l2.384,2.186l3.18,8.544l4.77,1.987l2.98,11.925l-0.795,13.911
  17423. l9.937,11.725l3.378,0.993l8.148,8.347l2.385,6.359l0.198,6.36l4.373,3.974l2.583,4.173l5.564,2.385l0.397,3.18l7.154,3.776
  17424. l1.987,3.378l0.994,5.563l3.577,3.578l0.199,5.564l-1.987,7.155l-5.661,4.569l1.09,2.783l3.378,3.179l2.187,6.559h6.359
  17425. l4.968-0.994l5.564-2.186l0.597-5.365l1.987,1.39l0.994,3.976l7.353,0.597l6.757-4.373l2.782-5.168l2.385-1.985v-3.379l1.59-9.143
  17426. l3.577-1.985l2.583,5.763l-0.993,5.167l0.993,3.577l3.578-0.398l3.975-6.558l2.98,1.391l0.795,3.578l-3.577,1.191l-0.198,3.378
  17427. l4.968,2.188l5.167-9.539l2.781,2.186l3.975-7.75l-2.783-2.385l-0.794-4.771l-4.571-4.967l-3.975,1.39l1.391-4.77l7.949,0.397
  17428. l-0.198,3.976l2.981,2.384l2.782-4.968v-5.166l2.386-6.161l5.365-3.379l2.186,1.591l-4.174,4.968l-1.391,6.159l-0.596,7.553
  17429. l2.782,4.57l-2.584,5.764l1.59,6.161l2.187,3.179l-6.359,5.962l3.975,8.545l5.961,3.578l15.104,0.795l-3.378,3.18l1.589,3.577
  17430. h3.378l3.975,5.962l2.782-5.763l5.366-1.591l1.391,4.372l10.731,1.392l-1.192-6.956l2.782-5.961l-2.186-3.578l6.559-2.186
  17431. l5.167,0.994l4.77,0.396l4.968,0.795l-0.994,3.181l-1.191,2.582l2.185,4.174l2.981,2.583l6.955-3.577v-9.34l4.173-1.59v-4.77
  17432. l2.187-1.59l0.993,2.584l1.59,2.98h3.18v7.552l4.173,5.565l-2.186,2.384l-7.551-0.993l-4.372-0.596l-3.378,3.178l2.981,2.784
  17433. l0.794,3.178l5.763,2.783l6.757,0.993h6.757l1.788-2.385l2.187,3.379l10.532,2.584l-2.781,2.186l-7.155-0.993l-4.968,2.98
  17434. l4.372,4.969l5.365,1.788l7.354-1.987l5.167-0.398l3.576-4.967v-3.181v-5.961l2.982,3.774l1.589-7.749l-4.173-6.559l-4.372,3.18
  17435. l-3.379,6.358l-2.782,2.981l-0.397-7.949l-0.596-5.166l2.782-2.98l2.186-4.77l-1.192-9.739l2.783-3.974l0.396-5.365l-7.551-1.988
  17436. l-3.38,1.193l0.397-3.777l3.776-1.191l6.559,0.596l7.552,2.783l5.961-4.968l3.976-5.565l-4.372-4.372l-0.993-3.576l-4.969-2.981
  17437. l4.969-1.192l-1.392-5.764l-1.59-2.186l-3.976,2.186l-1.391-2.781l-3.577,2.98l1.987,4.173l-5.365,2.584l-8.744,1.589
  17438. l-4.571,2.385l0.597,7.154l-7.751-0.595l1.988-5.963l3.178-2.582l-3.973-3.38l7.54-1.192l7.364-4.372l1.59,1.988l3.18-0.397
  17439. l2.584-6.359h8.941l-0.396-2.981l-6.956-5.564l1.987-2.584l4.372,2.385h3.777l2.384-3.378l4.77,3.378l3.377-0.597l3.777-2.185
  17440. l3.179-4.771l2.186,6.956l4.969,2.784l4.175,1.589l-3.579,4.77l-5.166,3.576l3.974,5.764l12.124-1.788l10.531-4.77l-2.781-1.987
  17441. l-5.962,1.589l-0.994-3.974l7.751-1.591l-6.559-5.962l-1.986-6.357l-0.398-4.969l-0.795-5.564l-3.378-6.161l-4.77-5.365
  17442. l2.186-7.353l5.167-5.764l4.77,0.396l-4.571,4.771l0.796,10.531l4.968,7.554l0.795,3.974l3.181,2.584l1.788-5.167l4.968-1.192
  17443. v4.77l4.57,0.795l0.994,4.173l3.775-0.199l-0.795-7.353l4.571-1.987v4.371l3.974,5.962v2.783l-3.774,3.577l2.185,2.782
  17444. l3.976-2.782l2.98,4.372l4.571,1.192l5.764,3.974l3.576,1.392v4.372l2.782-4.569v-1.988l10.532,1.392l5.764-3.578l-2.782-3.775
  17445. l1.192-1.987l2.583,0.197l3.38-3.773l-2.784-6.161l-7.948-2.385l-3.975-7.155l6.558-1.59l3.181,1.393l4.969-1.393l2.185-2.78
  17446. l4.373-0.796v4.173l2.98,2.782l1.987-7.352v-4.373l-2.783-7.552l4.174-4.372l4.77,0.396l2.386-0.596l9.339-4.57l6.161,0.993
  17447. l8.347-2.98l3.577-2.781l2.186-4.866l1.987-8.251l6.16-0.396l3.975,0.596l2.187-3.975l1.192-3.577h3.975l5.167-2.782l6.956-1.59
  17448. v-4.77l5.166-6.16l2.187-6.559l-4.571-5.564l7.949,0.994l6.161,3.776l3.974,1.192l5.366-3.776v-4.869v-2.882l7.154-8.942
  17449. l-2.385-4.173l-4.372-1.391l0.993-3.776l-0.993-2.782l-4.769,1.987l-5.366,0.198l-8.545-6.757l-5.764-7.154l-2.584-5.167
  17450. l-0.794-4.77l-5.168-1.391l-11.129-4.571l-0.993-3.378l1.788-3.578l-6.955,1.988l-5.962,1.59l-1.392-2.384l-5.166,0.198
  17451. l2.584-4.571l-2.783-3.577l-3.576,1.59l-2.585-5.962l5.962-1.789l7.353-6.558l3.38-5.167l-0.993-6.161l-3.976-1.788l-3.378-1.987
  17452. l-4.571,5.763l-6.16-3.18l-3.975-4.968l-6.359-2.782l-4.968-0.596l-5.167,3.18l-2.981-0.596l-1.987-2.186l-2.583,1.987
  17453. l-0.795,5.366l-2.981,5.564l-3.576,5.167l-4.373-2.782l-2.98,1.192l-5.962,2.584l-3.776,7.154l-12.321-0.596l-6.558-3.179h-5.961
  17454. l-4.571-2.385l-0.993-3.776l-10.932-1.192l-8.146,5.167l-8.148,1.391l-6.955-3.775l-2.584-3.18l-3.975-3.18l-0.396-3.18
  17455. l-5.366-3.974l-0.596-7.154l0.596-6.359l-2.583-4.372l0.795-3.975l-7.155,3.975l-1.191,8.347l2.186,3.18l-3.379,1.987l-7.551,1.59
  17456. l-3.18-1.988l-4.77,0.199l-5.167,4.769l-4.173,1.988c0,0-2.981,2.98-3.577,2.98c-0.598,0-8.347,1.391-8.347,1.391l-5.167-1.789
  17457. l-1.987-10.135l-5.962-2.981l-10.93-3.179l-7.551,3.577l-5.167,1.192l-5.167-4.77l-1.788,2.186l-0.199,3.776l-3.775,0.198
  17458. l-5.763-0.794l-3.975-4.372l-4.372-0.994l-5.962,0.994l0.994-6.161l5.962-1.987l6.955-2.583l-0.794-9.142l-0.398-9.737
  17459. l-4.968-8.545l-6.558-3.378l0.199-3.817l-1.391-3.536l-4.571,0.398l-4.173-2.782l-1.59-5.167l0.199-6.359l-5.167-1.192
  17460. l-6.956-4.373l-4.571-1.192l-4.571,2.783l-5.563-0.596l-5.565,1.59l-4.77-1.789l-5.167-5.564l-1.192-4.173l-3.975,2.782
  17461. l-4.571-3.18l-3.577,1.391l-4.571,0.199l0.993-4.372l-0.794-4.173l-2.583-4.77l-4.571,0.994l-4.173,0.397l-1.789-3.179
  17462. L93.998,9.937z"/>
  17463. <polygon fill="currentColor" stroke-miterlimit="10" points="96.052,370.628 90.885,372.351 88.368,373.278
  17464. 87.308,376.457 85.056,377.252 84.128,381.89 87.573,386.261 81.346,386.261 76.709,391.958 75.649,397.787 73.529,397.787
  17465. 70.615,404.81 71.674,413.288 75.782,418.985 78.563,424.946 78.431,427.597 82.539,430.644 83.333,435.148 80.419,437.004
  17466. 80.816,439.653 78.696,441.905 79.756,443.894 84.261,443.894 84.658,449.191 89.825,452.371 95.39,453.563 101.351,449.722
  17467. 100.689,442.833 99.497,437.137 104.663,434.619 109.831,433.028 113.408,432.632 114.334,434.486 112.878,438.461
  17468. 111.42,447.072 113.408,452.902 114.334,457.141 117.779,458.467 121.754,457.671 125.199,455.021 128.909,455.948
  17469. 131.293,453.431 135.797,453.299 135.797,457.936 139.64,459.659 144.807,457.936 141.097,454.359 139.905,449.854
  17470. 143.879,445.747 146.926,442.435 144.674,435.016 144.011,430.908 145.071,427.73 148.384,419.779 144.542,415.143
  17471. 140.037,415.143 136.857,411.964 131.161,413.023 125.332,413.156 120.959,416.07 118.044,421.237 113.54,422.033 110.36,416.733
  17472. 108.903,411.964 103.471,410.373 100.424,404.279 97.642,397.125 100.026,393.151 106.386,390.103 107.446,382.021
  17473. 105.724,376.325 105.855,373.145 101.749,372.087 "/>
  17474. <polygon fill="currentColor" stroke-miterlimit="10" points="137.785,379.24 130.365,381.757 126.789,385.599
  17475. 125.199,389.441 121.357,394.74 116.72,399.775 118.575,406.399 122.417,409.977 129.041,411.036 134.075,410.373 134.87,406.665
  17476. 142.157,410.373 145.469,410.241 148.384,413.023 152.491,413.554 153.418,410.373 147.456,406.929 144.674,403.881
  17477. 148.384,401.763 148.384,396.396 140.7,388.381 136.063,393.813 136.592,399.378 134.208,401.497 131.293,399.775 131.293,395.27
  17478. 135.069,387.321 137.785,384.406 "/>
  17479. <polygon fill="currentColor" stroke-miterlimit="10" points="191.574,403.22 189.189,402.026 182.168,404.81
  17480. 180.048,405.472 180.048,409.182 183.625,410.772 183.36,413.554 185.811,415.143 189.852,411.964 191.574,409.445
  17481. 196.079,408.585 198.993,407.592 195.548,404.677 193.031,404.941 "/>
  17482. <polygon fill="currentColor" stroke-miterlimit="10" points="203.232,411.964 200.053,409.445 194.753,410.705
  17483. 189.521,416.866 194.488,421.768 201.51,426.14 203.763,425.345 202.173,420.179 206.413,421.37 209.857,417.793 204.955,415.143
  17484. "/>
  17485. <polygon fill="currentColor" stroke-miterlimit="10" points="257.022,412.626 261.925,415.143 262.719,420.974
  17486. 264.043,423.357 262.851,427.73 261.262,432.632 257.949,438.99 251.723,438.99 249.47,435.148 248.2,432.102 247.085,428.789
  17487. 242.449,425.808 243.243,421.105 242.449,418.853 237.414,415.938 232.512,417.793 229.464,414.349 231.85,411.169
  17488. 237.016,410.506 243.773,413.554 248.2,415.674 253.18,413.554 "/>
  17489. <polygon fill="currentColor" stroke-miterlimit="10" points="288.289,379.24 286.036,383.612 281.399,386.261
  17490. 276.497,391.163 273.45,395.138 273.45,402.026 274.51,407.062 279.809,412.626 281.797,416.469 284.578,419.515 285.241,422.033
  17491. 288.289,418.455 287.758,415.938 289.613,411.964 294.383,411.964 299.152,412.89 299.947,408.585 304.187,403.881
  17492. 307.765,407.327 307.765,413.554 309.485,415.143 306.969,418.455 306.307,425.345 304.055,427.464 299.152,427.464
  17493. 300.079,429.849 301.536,430.908 299.284,432.632 297.031,433.692 296.768,437.137 299.814,437.137 304.452,432.632
  17494. 310.148,433.16 311.209,438.063 306.969,438.063 303.656,443.627 303.524,447.338 310.413,448.265 313.593,448.795 312.4,452.107
  17495. 307.101,454.227 304.187,458.996 306.438,459.659 309.751,458.467 311.871,460.983 315.183,461.514 317.833,456.743
  17496. 322.999,458.996 324.191,456.611 319.687,452.239 322.205,449.323 327.503,449.06 327.503,445.217 326.18,442.566 322.47,436.871
  17497. 324.854,432.896 327.503,432.764 329.094,433.824 333.731,429.849 331.744,426.14 331.213,420.377 333.731,419.646
  17498. 339.428,421.105 337.97,424.748 340.753,425.345 344.064,420.377 346.582,423.887 344.595,425.609 349.895,427.73
  17499. 352.676,429.849 354.134,429.584 352.544,423.357 348.967,419.515 348.568,415.938 349.497,412.626 347.111,409.445
  17500. 344.329,413.554 342.077,409.445 346.582,405.736 350.291,408.585 354.134,407.724 351.616,403.881 355.591,398.45
  17501. 352.411,390.634 347.111,394.873 344.595,398.582 340.222,394.078 346.847,387.321 347.245,379.24 349.231,373.278
  17502. 346.45,364.931 340.488,359.102 341.548,354.862 340.885,351.948 344.064,347.312 346.185,347.84 348.171,341.35 342.21,337.904
  17503. 338.235,337.904 334.525,338.964 331.479,345.588 334.26,347.84 331.876,351.55 328.034,354.729 325.517,362.679 324.723,365.858
  17504. 321.012,364.137 315.845,364.666 313.328,365.727 313.726,362.149 311.605,362.943 309.088,367.315 306.704,370.495
  17505. 310.943,376.591 316.242,382.685 319.289,388.646 315.978,389.707 309.221,384.672 307.367,381.757 302.994,384.142
  17506. 304.187,387.321 301.669,387.852 297.164,385.068 292.527,380.167 "/>
  17507. <polygon fill="currentColor" stroke-miterlimit="10" points="324.457,342.409 319.423,349.299 316.905,355.128
  17508. 319.289,360.029 323.264,358.573 326.576,353.008 326.576,348.636 327.106,342.409 "/>
  17509. <polygon fill="currentColor" stroke-miterlimit="10" points="286.302,359.102 284.712,363.475 285.506,366.786
  17510. 286.302,369.171 284.712,371.291 285.506,376.192 289.613,376.854 290.806,372.219 288.421,366.786 290.806,364.534
  17511. 292.13,361.354 "/>
  17512. <path fill="currentColor" stroke-miterlimit="10" d="M276.1,420.442l2.385,3.709v5.564l1.987,2.121l2.252-0.929
  17513. l1.988,2.519l-0.662,4.238h-2.386l-3.313,2.916l-3.312-1.591l-2.386,1.591l-1.323-2.783c0,0-0.266-2.385,0-2.914
  17514. c0.264-0.531-1.724-4.372-1.724-4.372l2.252-4.372l-0.927-7.021l3.18-1.325L276.1,420.442z"/>
  17515. <polygon fill="currentColor" stroke-miterlimit="10" points="278.749,443.229 276.1,445.351 271.728,445.351
  17516. 269.607,446.939 277.821,449.854 284.712,449.854 281.399,445.351 "/>
  17517. <polygon fill="currentColor" stroke-miterlimit="10" points="186.671,457.274 183.89,458.201 181.77,457.274
  17518. 178.855,460.453 184.949,466.149 189.521,465.09 190.249,460.585 "/>
  17519. <polygon fill="currentColor" stroke-miterlimit="10" points="208.002,481.916 201.908,478.869 198.993,480.392
  17520. 197.006,485.096 201.775,490.396 207.339,490.396 208.796,488.54 213.169,490.396 216.746,490.396 219.528,483.902
  17521. 215.95,484.632 212.639,487.48 211.048,486.023 212.109,483.771 "/>
  17522. </g>
  17523. </g>
  17524. </svg>
  17525. </template>
  17526. </file>
  17527. <file path="components/home/dashboard/common/map/mapIncheon.vue">
  17528. <template>
  17529. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  17530. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  17531. <g id="인천">
  17532. <g>
  17533. <g>
  17534. <path fill="currentColor" d="M117.088,321.005c-0.09,0-0.18-0.024-0.257-0.071l-0.772-0.463c-0.15-0.09-0.243-0.253-0.243-0.429
  17535. v-0.157l-0.143-0.114c-0.119-0.095-0.188-0.238-0.188-0.391v-1l-0.896-0.738l-2.351-1.121c-0.04-0.019-0.077-0.043-0.111-0.072
  17536. l-0.91-0.782l-0.151,0.036l-0.721,0.388l-0.246,0.289l-0.234,0.802c-0.04,0.137-0.137,0.25-0.265,0.311l-1.661,0.791l0.199,0.335
  17537. c0.136,0.229,0.068,0.523-0.153,0.671l-0.397,0.265c-0.083,0.055-0.179,0.084-0.277,0.084h-0.662
  17538. c-0.073,0-0.146-0.017-0.212-0.047l-0.605-0.284h-1.544c-0.11,0-0.218-0.036-0.305-0.104l-0.076-0.059l-0.079,0.026
  17539. c-0.052,0.017-0.105,0.025-0.158,0.025c-0.123,0-0.243-0.045-0.336-0.13l-0.1-0.091h-0.05c-0.201,0-0.382-0.12-0.46-0.305
  17540. l-0.309-0.728c-0.053-0.126-0.053-0.269,0.002-0.395l0.22-0.508l0.101-0.323l-0.117-0.718l-0.198-0.281
  17541. c-0.146-0.207-0.114-0.492,0.076-0.661l0.088-0.079l0.033-0.117l-0.243-0.814l-0.455-0.614l-0.327-0.319
  17542. c-0.109-0.109-0.162-0.263-0.143-0.416l0.066-0.529c0.014-0.11,0.064-0.213,0.143-0.291l0.331-0.331
  17543. c0.071-0.071,0.162-0.119,0.261-0.138l0.996-0.188l0.173-0.203l0.074-0.413l-0.205-1.762l-0.383-0.985l-1.023-0.688h-0.113
  17544. c-0.179,0-0.344-0.096-0.434-0.251l-0.253-0.441c-0.08-0.14-0.088-0.309-0.022-0.455l0.118-0.261l-0.019-0.015l-0.482,0.401
  17545. c-0.093,0.078-0.207,0.116-0.32,0.116c-0.134,0-0.267-0.054-0.365-0.158l-0.64-0.685c-0.086-0.093-0.135-0.215-0.135-0.342
  17546. v-0.463c0-0.089,0.023-0.176,0.068-0.252l0.154-0.265c0.045-0.077,0.11-0.141,0.188-0.185l0.325-0.182l0.007-0.066l-0.334-0.883
  17547. c-0.037-0.098-0.042-0.205-0.015-0.306l0.177-0.662c0.058-0.219,0.256-0.371,0.483-0.371h0.496l0.203-0.241
  17548. c0.097-0.115,0.238-0.178,0.382-0.178c0.055,0,0.111,0.009,0.165,0.028l0.242,0.084l0.12-0.06
  17549. c0.069-0.035,0.146-0.053,0.224-0.053c0.006,0,0.45,0.018,0.45,0.018l0.265-0.125c0.068-0.031,0.14-0.047,0.212-0.047
  17550. c0.1,0,0.199,0.03,0.284,0.089l0.287,0.198c0.135,0.093,0.216,0.247,0.216,0.411v0.554l0.063,0.112l0.689,0.373
  17551. c0.063,0.034,0.119,0.081,0.162,0.14l0.086,0.114l0.236,0.05l1.105,0.343l0.556,0.21l0.428-0.045l1.258-0.523l0.187-0.218
  17552. c0.062-0.073,0.144-0.126,0.235-0.153l0.441-0.133c0.048-0.015,0.096-0.021,0.144-0.021c0.176,0,0.343,0.093,0.434,0.252
  17553. l0.095,0.165l0.232,0.102l0.108-0.012l0.61-0.536c0.042-0.038,0.091-0.068,0.144-0.089l0.441-0.177
  17554. c0.059-0.024,0.123-0.036,0.186-0.036c0.004,0,0.632,0.018,0.632,0.018l0.126-0.113l0.002-0.027
  17555. c0.012-0.124,0.071-0.24,0.165-0.323l0.198-0.177c0.092-0.082,0.211-0.127,0.333-0.127c0.027,0,0.055,0.002,0.083,0.007
  17556. l0.26,0.044l0.71-0.28c0.059-0.023,0.121-0.035,0.184-0.035c0.049,0,0.099,0.007,0.146,0.021l0.287,0.088
  17557. c0.125,0.039,0.231,0.125,0.293,0.241l0.257,0.476l0.088,0.095l0.532,0.099l0.687-0.275l0.661-0.495l0.191-0.331
  17558. c0.073-0.126,0.197-0.214,0.34-0.24c0.031-0.006,0.062-0.009,0.092-0.009c0.113,0,0.223,0.038,0.313,0.109l0.221,0.177
  17559. c0.112,0.09,0.181,0.225,0.187,0.368l0.015,0.326l0.211,0.272c0.068,0.088,0.105,0.195,0.105,0.307v0.221
  17560. c0,0.112-0.038,0.221-0.107,0.309l-0.165,0.211l-0.029,0.16l0.239,1.23l0.371,0.354c0.055,0.053,0.097,0.117,0.124,0.188
  17561. l0.155,0.419c0.033,0.089,0.04,0.186,0.02,0.278l-0.177,0.817c-0.025,0.118-0.092,0.223-0.189,0.295l-0.794,0.596
  17562. c-0.045,0.033-0.095,0.06-0.148,0.076l-0.743,0.235l-0.609,0.875l-0.771,1.534l0.068,0.121c0.067,0.12,0.083,0.263,0.041,0.395
  17563. l-0.11,0.353c-0.014,0.045-0.034,0.087-0.06,0.126l0.134,0.233l0.392,0.256l0.457,0.092c0.176,0.035,0.319,0.162,0.376,0.332
  17564. l0.354,1.059c0.067,0.2,0,0.422-0.167,0.552l-0.013,0.011l-0.038,1.332c-0.004,0.133-0.061,0.259-0.158,0.35
  17565. c-0.093,0.088-0.215,0.136-0.342,0.136c-0.006,0-1.253-0.044-1.253-0.044c-0.121-0.005-0.236-0.053-0.324-0.135l-0.354-0.331
  17566. c-0.11-0.104-0.168-0.251-0.157-0.402l0.088-1.191c0.005-0.064,0.022-0.128,0.051-0.187l0.287-0.574
  17567. c0.04-0.079,0.099-0.145,0.17-0.192l-0.09-0.048c-0.069-0.037-0.128-0.089-0.173-0.153l-0.329-0.465l-0.386,0.313l0.006,0.008
  17568. c0.168,0.203,0.151,0.502-0.04,0.684l-2.119,2.009c-0.063,0.06-0.142,0.102-0.226,0.122l0.815,0.742l2.111,0.879l0.073-0.03
  17569. c0.049-0.021,0.101-0.032,0.153-0.036l0.865-0.067l0.028-0.056c0.087-0.174,0.263-0.276,0.447-0.276c0.004,0,0.008,0,0.011,0
  17570. l0.058-0.087c0.075-0.113,0.194-0.19,0.328-0.215c0.029-0.005,0.059-0.008,0.088-0.008c0.105,0,0.208,0.033,0.294,0.096
  17571. l0.243,0.177c0.213,0.155,0.27,0.448,0.129,0.672l-0.568,0.897l0.032,0.12c0.009,0.034,0.015,0.069,0.016,0.105l0.022,0.485
  17572. c0.007,0.159-0.063,0.313-0.187,0.413l-0.293,0.234l0.128,0.458l0.295,0.207c0.045,0.031,0.084,0.069,0.116,0.114l0.419,0.573
  17573. c0.111,0.151,0.128,0.354,0.042,0.521c-0.085,0.168-0.257,0.273-0.446,0.273H117.088z"/>
  17574. <path fill="currentColor" d="M117.927,301.194l0.221,0.177l0.022,0.485l0.309,0.397v0.221l-0.243,0.309l-0.066,0.375l0.287,1.479
  17575. l0.485,0.464l0.155,0.419l-0.177,0.817l-0.794,0.596l-0.905,0.287l-0.706,1.015l-0.927,1.832l0.199,0.354l-0.11,0.353
  17576. l-0.221,0.166l0.397,0.695l0.574,0.375l0.551,0.11l0.354,1.059l-0.199,0.155l-0.044,1.566l-1.235-0.044l-0.354-0.331l0.088-1.191
  17577. l0.287-0.574l0.75,0.022l-0.221-0.574l-0.662-0.354l-0.53-0.75l-0.375,0.066l-0.927,0.75l0.331,0.397l-2.119,2.009l-0.397,0.065
  17578. l-0.155,0.486l1.214,1.104l2.384,0.993l0.265-0.11l1.147-0.089l0.154-0.309l0.221,0.088l0.265-0.397l0.243,0.177l-0.684,1.082
  17579. l0.088,0.331l0.022,0.485l-0.551,0.441l0.265,0.948l0.441,0.31l0.419,0.573h-0.375l-0.772-0.463v-0.397l-0.331-0.265v-0.641
  17580. v-0.596l-1.126-0.927l-2.406-1.147l-1.103-0.949l-0.463,0.11l-0.861,0.464l-0.375,0.441l-0.265,0.904l-1.81,0.861l-0.221,0.375
  17581. l0.353,0.596l-0.397,0.265h-0.662l-0.706-0.331h-0.861h-0.794l-0.287-0.221l-0.331,0.11l-0.243-0.221h-0.243l-0.309-0.728
  17582. l0.22-0.508l0.155-0.486l-0.155-0.948l-0.265-0.375l0.198-0.177l0.111-0.397l-0.309-1.037l-0.508-0.685l-0.375-0.375l0.066-0.529
  17583. l0.331-0.331l1.169-0.221l0.375-0.441l0.111-0.618l-0.221-1.898l-0.463-1.191l-1.28-0.86h-0.265l-0.253-0.441l0.209-0.464
  17584. l-0.044-0.243l-0.529-0.419l-0.794,0.662l-0.64-0.685v-0.463l0.154-0.265l0.552-0.31l0.044-0.441l-0.375-0.993l0.177-0.662H101
  17585. l0.353-0.419l0.442,0.154l0.309-0.154l0.552,0.021l0.375-0.176l0.287,0.198v0.287v0.397l0.199,0.353l0.816,0.441l0.199,0.265
  17586. l0.419,0.089l1.06,0.331l0.64,0.242l0.618-0.065l1.435-0.597l0.265-0.309l0.441-0.133l0.177,0.31l0.507,0.221l0.397-0.044
  17587. l0.728-0.641l0.441-0.177l0.817,0.022l0.419-0.375l0.022-0.221l0.198-0.177l0.397,0.066l0.839-0.331l0.287,0.088l0.287,0.53
  17588. l0.243,0.265l0.839,0.154l0.882-0.354l0.795-0.596L117.927,301.194 M117.927,300.194c-0.062,0-0.123,0.006-0.184,0.018
  17589. c-0.287,0.053-0.535,0.229-0.681,0.481l-0.141,0.242l-0.526,0.395l-0.492,0.196l-0.194-0.035l-0.191-0.354
  17590. c-0.125-0.231-0.336-0.403-0.587-0.48l-0.287-0.088c-0.095-0.029-0.194-0.044-0.292-0.044c-0.125,0-0.25,0.023-0.367,0.07
  17591. l-0.581,0.229l-0.124-0.021c-0.055-0.009-0.11-0.014-0.165-0.014c-0.244,0-0.481,0.089-0.666,0.254l-0.198,0.177
  17592. c-0.104,0.092-0.186,0.204-0.243,0.328l-0.322-0.009c-0.009,0-0.018,0-0.027,0c-0.127,0-0.253,0.024-0.372,0.071l-0.441,0.177
  17593. c-0.106,0.043-0.204,0.103-0.289,0.178l-0.348,0.307c-0.19-0.255-0.489-0.401-0.801-0.401c-0.096,0-0.193,0.014-0.288,0.042
  17594. l-0.441,0.133c-0.183,0.056-0.347,0.162-0.471,0.307l-0.109,0.128l-1.081,0.449l-0.237,0.025l-0.417-0.158
  17595. c-0.019-0.007-0.037-0.013-0.056-0.019l-1.06-0.331c-0.03-0.01-0.061-0.018-0.091-0.024l-0.054-0.011
  17596. c-0.082-0.1-0.182-0.183-0.296-0.244l-0.491-0.265v-0.047v-0.287c0-0.328-0.162-0.636-0.432-0.823l-0.287-0.198
  17597. c-0.17-0.117-0.369-0.177-0.568-0.177c-0.145,0-0.29,0.031-0.424,0.095l-0.155,0.072l-0.309-0.012
  17598. c-0.013-0.001-0.026-0.001-0.039-0.001c-0.128,0-0.255,0.024-0.374,0.072l-0.047-0.017c-0.108-0.037-0.219-0.056-0.33-0.056
  17599. c-0.289,0-0.571,0.126-0.765,0.355l-0.053,0.063h-0.263c-0.453,0-0.849,0.305-0.966,0.742l-0.177,0.662
  17600. c-0.054,0.202-0.043,0.416,0.031,0.611l0.202,0.532c-0.145,0.087-0.266,0.209-0.351,0.354l-0.154,0.265
  17601. c-0.089,0.153-0.136,0.327-0.136,0.504v0.463c0,0.254,0.096,0.498,0.27,0.683l0.64,0.685c0.196,0.21,0.463,0.317,0.731,0.317
  17602. c0.097,0,0.194-0.014,0.289-0.042c0.001,0.001,0.001,0.002,0.002,0.004l0.253,0.441c0.171,0.299,0.484,0.487,0.826,0.501
  17603. l0.768,0.517l0.303,0.779l0.189,1.624l-0.032,0.178l-0.798,0.151c-0.198,0.037-0.379,0.133-0.521,0.275l-0.331,0.331
  17604. c-0.157,0.157-0.257,0.362-0.285,0.583l-0.066,0.529c-0.039,0.306,0.067,0.613,0.285,0.831l0.323,0.323l0.359,0.483l0.15,0.505
  17605. c-0.296,0.343-0.327,0.85-0.059,1.229l0.132,0.188l0.079,0.484l-0.067,0.21l-0.2,0.462c-0.109,0.251-0.11,0.536-0.003,0.788
  17606. l0.309,0.728c0.136,0.321,0.427,0.544,0.765,0.598c0.182,0.152,0.41,0.232,0.642,0.232c0.047,0,0.095-0.003,0.142-0.01
  17607. c0.145,0.078,0.309,0.12,0.476,0.12h0.794h0.638l0.504,0.236c0.133,0.063,0.277,0.095,0.424,0.095h0.662
  17608. c0.197,0,0.39-0.059,0.554-0.168l0.397-0.265c0.398-0.265,0.547-0.769,0.375-1.201l1.177-0.56c0.257-0.123,0.45-0.349,0.53-0.622
  17609. l0.205-0.7l0.115-0.136l0.454-0.244l0.681,0.586c0.067,0.058,0.142,0.106,0.222,0.145l2.295,1.095l0.667,0.549v0.124v0.641
  17610. c0,0.286,0.123,0.558,0.334,0.746c0.027,0.319,0.205,0.607,0.482,0.773l0.772,0.463c0.155,0.094,0.333,0.143,0.514,0.143h0.375
  17611. c0.376,0,0.721-0.212,0.892-0.548s0.138-0.738-0.084-1.043l-0.419-0.573c-0.064-0.088-0.144-0.165-0.233-0.228l-0.122-0.086
  17612. l0.018-0.015c0.25-0.199,0.389-0.506,0.374-0.825l-0.022-0.485c-0.002-0.039-0.006-0.077-0.012-0.115l0.454-0.719
  17613. c0.282-0.445,0.169-1.033-0.257-1.343l-0.121-0.088c0.097-0.151,0.152-0.327,0.157-0.51l0.032-1.135
  17614. c0.203-0.26,0.268-0.609,0.16-0.932l-0.354-1.059c-0.114-0.341-0.401-0.594-0.752-0.664l-0.362-0.072l-0.15-0.098l0.078-0.25
  17615. c0.069-0.22,0.06-0.456-0.024-0.667l0.659-1.304l0.472-0.678l0.581-0.185c0.107-0.034,0.208-0.086,0.298-0.153l0.794-0.596
  17616. c0.192-0.145,0.327-0.354,0.377-0.589l0.177-0.817c0.04-0.186,0.026-0.379-0.04-0.558l-0.155-0.419
  17617. c-0.053-0.143-0.137-0.271-0.247-0.376l-0.255-0.244l-0.185-0.95l0.072-0.091c0.139-0.176,0.214-0.394,0.214-0.618v-0.221
  17618. c0-0.223-0.074-0.438-0.21-0.614l-0.114-0.146l-0.007-0.167c-0.013-0.288-0.149-0.556-0.374-0.735l-0.221-0.177
  17619. C118.374,300.271,118.153,300.194,117.927,300.194L117.927,300.194z M113.025,314.849l1.557-1.476l-0.08,1.077
  17620. c-0.022,0.302,0.093,0.598,0.313,0.804l0.354,0.331c0.145,0.136,0.325,0.225,0.518,0.257l-0.331,0.025
  17621. c-0.059,0.005-0.118,0.015-0.175,0.029l-1.852-0.771L113.025,314.849L113.025,314.849z"/>
  17622. </g>
  17623. <g>
  17624. <path fill="currentColor" d="M119.899,324.265c-0.062,0-0.124-0.012-0.183-0.034l-0.25-0.099h-0.082c-0.046,0-0.093-0.007-0.137-0.02
  17625. l-1.133-0.323c-0.086-0.024-0.164-0.071-0.225-0.136l-0.294-0.31c-0.065-0.068-0.109-0.154-0.128-0.247l-0.088-0.441
  17626. c-0.026-0.133,0.002-0.271,0.079-0.382l0.132-0.191c0.093-0.135,0.247-0.216,0.411-0.216h0.265c0.12,0,0.237,0.043,0.328,0.122
  17627. l0.124,0.107l0.419,0.092l0.507,0.019c0.232,0.011,0.425,0.181,0.467,0.409l0.047,0.257l0.004,0.003
  17628. c0.103,0.059,0.181,0.151,0.221,0.263l0.118,0.323c0.066,0.183,0.021,0.387-0.116,0.523l-0.132,0.133
  17629. C120.158,324.214,120.029,324.265,119.899,324.265z"/>
  17630. <path fill="currentColor" d="M118.266,322.366l0.221,0.191l0.544,0.118l0.588,0.029l0.088,0.485l0.206,0.118l0.118,0.323l-0.132,0.133
  17631. l-0.338-0.133h-0.177l-1.133-0.323l-0.294-0.31l-0.088-0.441l0.132-0.191H118.266 M118.266,321.366h-0.265
  17632. c-0.329,0-0.636,0.161-0.823,0.432l-0.132,0.191c-0.154,0.223-0.211,0.498-0.158,0.764l0.088,0.441
  17633. c0.037,0.186,0.126,0.356,0.256,0.494l0.294,0.31c0.123,0.129,0.278,0.224,0.45,0.272l1.133,0.323
  17634. c0.085,0.024,0.173,0.037,0.262,0.038l0.163,0.063c0.119,0.047,0.242,0.069,0.365,0.069c0.261,0,0.517-0.103,0.708-0.294
  17635. l0.132-0.133c0.274-0.275,0.364-0.684,0.231-1.048l-0.118-0.323c-0.051-0.141-0.132-0.267-0.237-0.37l-0.013-0.07
  17636. c-0.083-0.457-0.47-0.797-0.934-0.82l-0.506-0.025l-0.214-0.046l-0.027-0.024C118.739,321.453,118.506,321.366,118.266,321.366
  17637. L118.266,321.366z"/>
  17638. </g>
  17639. <g>
  17640. <path fill="currentColor" d="M38.523,252.646c-0.061,0-0.121-0.011-0.178-0.032l-1.189-0.452c-0.235-0.09-0.367-0.339-0.309-0.584
  17641. l0.199-0.835l-0.068-0.042l-0.5,0.333c-0.084,0.056-0.181,0.084-0.277,0.084c-0.093,0-0.187-0.026-0.269-0.078l-0.623-0.396
  17642. c-0.144-0.092-0.231-0.251-0.231-0.422v-1.21l-1.097-0.759l-1.45,0.2c-0.023,0.003-0.046,0.005-0.068,0.005
  17643. c-0.178,0-0.344-0.095-0.434-0.252l-0.191-0.335l-0.138,0.089l-0.04,0.597c-0.009,0.134-0.072,0.259-0.173,0.346l-0.792,0.68
  17644. c-0.091,0.079-0.207,0.121-0.326,0.121c-0.03,0-0.06-0.002-0.089-0.008l-0.623-0.113c-0.167-0.03-0.308-0.144-0.373-0.301
  17645. l-0.317-0.77l-0.77-0.316c-0.067-0.028-0.128-0.07-0.177-0.123l-0.466-0.504l-1.34,0.416c-0.048,0.015-0.098,0.022-0.148,0.022
  17646. c-0.019,0-0.852-0.092-0.852-0.092l-0.399,0.36c-0.077,0.07-0.174,0.113-0.278,0.125c0,0-2.02,0.229-2.039,0.229
  17647. c-0.2,0-0.383-0.12-0.461-0.308l-0.283-0.679c-0.075-0.18-0.039-0.387,0.093-0.53l0.271-0.296l-0.127-0.107l-3.077,0.991
  17648. c-0.05,0.016-0.102,0.024-0.153,0.024c-0.085,0-0.169-0.021-0.245-0.064l-0.806-0.453l-3.623-0.22
  17649. c-0.215-0.013-0.398-0.163-0.453-0.372l-0.77-2.916l-1.365-1.966c-0.066-0.095-0.097-0.21-0.088-0.325l0.104-1.296l-1.54-3.74
  17650. l-0.87-3.173c-0.021-0.076-0.023-0.155-0.007-0.231l0.32-1.574l-0.366-1.91l-0.756-1.645l-0.149,0.045
  17651. c-0.047,0.014-0.096,0.021-0.144,0.021c-0.141,0-0.278-0.06-0.375-0.168l-1.663-1.877l-2.415-0.751
  17652. c-0.048-0.015-0.093-0.037-0.134-0.065l-1.076-0.736c-0.121-0.083-0.2-0.214-0.215-0.36l-0.283-2.661l-0.33-1.413
  17653. c-0.016-0.067-0.017-0.137-0.004-0.205l0.34-1.812c0.031-0.167,0.145-0.306,0.301-0.37l0.814-0.335l1.048-1.676l0.591-1.552
  17654. l-0.097-0.783c-0.027-0.218,0.092-0.429,0.293-0.519l0.509-0.227c0.065-0.029,0.135-0.043,0.203-0.043
  17655. c0.163,0,0.321,0.08,0.416,0.223l0.566,0.85c0.027,0.041,0.048,0.085,0.063,0.132c0.021-0.013,0.042-0.024,0.065-0.033
  17656. l0.679-0.283c0.062-0.026,0.127-0.039,0.192-0.039c0.081,0,0.162,0.02,0.235,0.059l6.172,3.284
  17657. c0.03,0.016,0.058,0.035,0.084,0.056l2.722,2.25l1.94-0.722l0.208-0.622c0.042-0.126,0.132-0.229,0.25-0.289l2.831-1.416
  17658. c0.071-0.035,0.147-0.053,0.224-0.053c0.105,0,0.209,0.033,0.297,0.098l1.059,0.782l1.468-0.715l-0.149-0.277
  17659. c-0.076-0.141-0.08-0.31-0.011-0.454c0.069-0.144,0.204-0.247,0.361-0.275l1.869-0.34c0.03-0.006,0.06-0.008,0.089-0.008
  17660. c0.11,0,0.219,0.037,0.307,0.105l0.289,0.225l1.454-0.545l1.188-1.14v-0.58c0-0.25,0.184-0.461,0.431-0.495l2.039-0.283
  17661. c0.023-0.003,0.046-0.005,0.069-0.005c0.12,0,0.237,0.043,0.328,0.123c0.109,0.095,0.172,0.232,0.172,0.377v0.18h0.52
  17662. c0.273,0,0.495,0.218,0.5,0.49l0.882-0.126l0.573-0.451l0.575-1.619c0.055-0.156,0.185-0.274,0.345-0.316l1.302-0.34
  17663. c0.042-0.011,0.084-0.016,0.126-0.016c0.109,0,0.217,0.036,0.306,0.104c0.123,0.095,0.194,0.241,0.194,0.396v0.623
  17664. c0,0.154-0.071,0.3-0.193,0.395l-0.132,0.103c0,0,0.781-0.035,0.788-0.035c0.224,0,0.421,0.149,0.482,0.366l0.197,0.711
  17665. l1.457,0.236l0.955-1.48c0.081-0.125,0.211-0.207,0.358-0.225l3.386-0.423l0.328-0.532c0.074-0.121,0.196-0.204,0.335-0.229
  17666. c0.03-0.005,0.06-0.008,0.09-0.008c0.109,0,0.217,0.036,0.305,0.104l0.736,0.566l1.086,0.79l1.158-0.089l0.571-0.381
  17667. c0.083-0.055,0.18-0.084,0.277-0.084c0.042,0,0.084,0.005,0.126,0.016l2.832,0.736c0.041,0.011,0.081,0.027,0.118,0.047
  17668. l3.341,1.869l1.94,0.857c0.064,0.028,0.123,0.071,0.169,0.123l0.736,0.821c0.083,0.092,0.128,0.211,0.128,0.334v1.528
  17669. l0.491,3.953l1.008,1.486l0.535,1.061l0.673,0.412l0.779-0.347c0.064-0.028,0.134-0.043,0.203-0.043
  17670. c0.04,0,0.079,0.005,0.118,0.014l1.869,0.453c0.136,0.033,0.251,0.121,0.319,0.243l0.566,1.019
  17671. c0.042,0.074,0.063,0.158,0.063,0.243v1.02c0,0.162-0.078,0.313-0.209,0.407l-1.189,0.849c-0.085,0.061-0.187,0.093-0.291,0.093
  17672. h-1.925c-0.178,0-0.342-0.094-0.432-0.248l-0.271-0.464l-0.714-0.084c-0.136-0.016-0.26-0.087-0.342-0.197l-0.51-0.68
  17673. c-0.059-0.078-0.093-0.172-0.099-0.271l-0.039-0.654l-0.696-0.298l-1.124,0.541l-0.281,0.964l0.182,0.39h1.777
  17674. c0.134,0,0.263,0.054,0.357,0.15c0.094,0.096,0.146,0.226,0.143,0.36l-0.057,2.888c-0.004,0.2-0.127,0.378-0.312,0.454
  17675. l-2.095,0.849c-0.061,0.024-0.125,0.037-0.188,0.037c-0.117,0-0.233-0.042-0.326-0.121l-0.792-0.68
  17676. c-0.188-0.162-0.229-0.438-0.096-0.648l0.309-0.484l-0.637-0.152l-1.625,0.295l-5.217,4.718l-3.716,4.423l0.183,1.276
  17677. l0.354,0.657c0.065,0.12,0.078,0.261,0.036,0.39l-0.51,1.586c-0.049,0.152-0.167,0.271-0.318,0.322l-0.864,0.288l-1.895,2.664
  17678. l0.119,1.51h0.161c0.137,0,0.269,0.057,0.363,0.156c0.094,0.1,0.144,0.234,0.136,0.372l-0.057,1.02
  17679. c-0.01,0.182-0.119,0.344-0.283,0.423l-1.137,0.544l-0.435,0.966c-0.081,0.18-0.259,0.295-0.456,0.295h-0.679
  17680. c-0.091,0-0.18-0.024-0.257-0.071l-0.592-0.355l-0.433,0.261l-0.225,0.673c-0.068,0.204-0.259,0.342-0.474,0.342H38.523z"/>
  17681. <path fill="currentColor" d="M46.791,210.64l0.736,0.566l1.246,0.906L50.245,212l0.679-0.453l2.832,0.736l3.341,1.869l1.982,0.877
  17682. l0.736,0.821v1.528l0.509,4.134l1.076,1.586l0.566,1.132l1.019,0.623l1.019-0.453l1.869,0.453l0.566,1.019v1.02l-1.189,0.849
  17683. h-1.925l-0.396-0.68l-0.962-0.113l-0.51-0.68l-0.057-0.963l-1.189-0.509l-1.529,0.736l-0.396,1.359l0.396,0.849h2.095
  17684. l-0.057,2.888l-2.095,0.849l-0.792-0.68l0.396-0.623l0.056-0.51l-1.189-0.283l-1.869,0.34l-5.323,4.813l-3.907,4.644l0.227,1.585
  17685. l0.396,0.736l-0.51,1.586l-1.02,0.339l-2.095,2.945l0.169,2.151h0.623l-0.057,1.02l-1.302,0.623l-0.51,1.133h-0.679l-0.85-0.51
  17686. l-0.849,0.51l-0.283,0.849h-0.736l-1.189-0.452l0.283-1.189l-0.651-0.396l-0.765,0.51l-0.623-0.396v-1.473l-1.472-1.019
  17687. l-1.643,0.227l-0.453-0.793l-0.793,0.51l-0.057,0.849l-0.792,0.68l-0.623-0.113l-0.396-0.963l-0.962-0.396l-0.68-0.736
  17688. l-1.642,0.51l-1.02-0.113l-0.566,0.51l-1.982,0.226l-0.283-0.679l0.623-0.68l-0.736-0.623l-3.341,1.076l-0.906-0.51l-3.738-0.227
  17689. l-0.792-3.001l-1.416-2.039l0.113-1.416l-1.585-3.851l-0.85-3.114l0.34-1.67l-0.396-2.067l-0.963-2.095l-0.566,0.17l-1.755-1.982
  17690. l-2.548-0.792l-1.076-0.736l-0.283-2.661L2,219.757l0.34-1.812l0.962-0.396l1.133-1.812l0.679-1.755l-0.113-0.906l0.509-0.227
  17691. l0.566,0.85l-0.17,1.359l1.019-0.227l-0.113-0.849l0.679-0.283l6.172,3.284l2.944,2.435l2.435-0.906l0.283-0.849l2.831-1.416
  17692. l1.302,0.963l2.208-1.076l-0.396-0.736l1.869-0.34l0.51,0.396l1.812-0.68l1.416-1.359v-0.793l2.039-0.283v0.68h1.02v0.566
  17693. l1.585-0.227l0.792-0.623l0.623-1.755l1.302-0.34v0.623l-0.509,0.396l0.226,0.623l1.246-0.057l0.283,1.02l2.095,0.34l1.132-1.755
  17694. l3.624-0.453L46.791,210.64 M38.24,209.64c-0.084,0-0.169,0.011-0.252,0.032l-1.302,0.34c-0.321,0.084-0.579,0.321-0.69,0.633
  17695. l-0.526,1.482l-0.354,0.278l-0.351,0.05c-0.18-0.264-0.483-0.438-0.827-0.438h-0.072c-0.056-0.166-0.156-0.316-0.291-0.434
  17696. c-0.183-0.159-0.417-0.246-0.657-0.246c-0.046,0-0.092,0.003-0.138,0.009l-2.039,0.283c-0.494,0.069-0.862,0.492-0.862,0.991
  17697. v0.367l-0.959,0.921l-1.096,0.411l-0.068-0.053c-0.177-0.137-0.393-0.21-0.614-0.21c-0.06,0-0.12,0.005-0.179,0.016l-1.869,0.34
  17698. c-0.315,0.057-0.583,0.262-0.723,0.55c-0.108,0.226-0.127,0.482-0.058,0.717l-0.746,0.364l-0.814-0.603
  17699. c-0.176-0.129-0.385-0.196-0.595-0.196c-0.153,0-0.306,0.035-0.447,0.105l-2.831,1.416c-0.237,0.119-0.417,0.327-0.501,0.578
  17700. l-0.132,0.395l-1.445,0.538l-2.5-2.066c-0.052-0.043-0.108-0.081-0.167-0.112l-6.172-3.284c-0.146-0.078-0.308-0.117-0.47-0.117
  17701. c-0.13,0-0.261,0.025-0.385,0.077L6.76,212.92l-0.417-0.626c-0.19-0.286-0.507-0.445-0.833-0.445
  17702. c-0.136,0-0.274,0.028-0.406,0.086l-0.509,0.227c-0.403,0.179-0.641,0.6-0.586,1.037l0.082,0.657l-0.554,1.432l-0.912,1.459
  17703. l-0.665,0.274c-0.313,0.129-0.54,0.408-0.603,0.74l-0.34,1.812c-0.025,0.136-0.022,0.275,0.008,0.409l0.327,1.414l0.276,2.601
  17704. c0.031,0.291,0.188,0.554,0.43,0.719l1.076,0.736c0.083,0.056,0.173,0.1,0.268,0.13l2.282,0.709l1.57,1.773
  17705. c0.193,0.218,0.467,0.337,0.749,0.337c0.001,0,0.002,0,0.003,0l0.566,1.233l0.336,1.753l-0.3,1.477
  17706. c-0.031,0.153-0.026,0.312,0.015,0.462l0.85,3.114c0.011,0.04,0.024,0.079,0.04,0.118l1.494,3.629l-0.094,1.177
  17707. c-0.019,0.23,0.043,0.46,0.175,0.65l1.315,1.894l0.748,2.831c0.11,0.417,0.476,0.717,0.906,0.743l3.508,0.213l0.706,0.397
  17708. c0.151,0.085,0.32,0.128,0.49,0.128c0.103,0,0.207-0.016,0.307-0.048l2.148-0.692c0.004,0.119,0.029,0.238,0.077,0.352
  17709. l0.283,0.679c0.157,0.375,0.523,0.615,0.922,0.615c0.038,0,0.076-0.002,0.114-0.006l1.982-0.226
  17710. c0.207-0.023,0.401-0.111,0.556-0.25l0.232-0.209l0.573,0.063c0.037,0.004,0.074,0.006,0.11,0.006c0.1,0,0.2-0.015,0.296-0.045
  17711. l1.039-0.323l0.251,0.272c0.099,0.107,0.22,0.191,0.355,0.247l0.576,0.237l0.238,0.577c0.13,0.315,0.411,0.542,0.746,0.603
  17712. l0.623,0.113c0.06,0.011,0.119,0.016,0.179,0.016c0.237,0,0.468-0.084,0.651-0.241l0.792-0.68
  17713. c0.126-0.108,0.222-0.245,0.281-0.396c0.116,0.046,0.242,0.071,0.37,0.071c0.045,0,0.091-0.003,0.137-0.009l1.257-0.173
  17714. l0.721,0.499v0.949c0,0.342,0.174,0.66,0.463,0.844l0.623,0.396c0.164,0.104,0.351,0.156,0.537,0.156
  17715. c0.045,0,0.091-0.003,0.136-0.01c-0.038,0.439,0.218,0.86,0.641,1.021l1.189,0.452c0.114,0.043,0.234,0.065,0.355,0.065h0.736
  17716. c0.43,0,0.813-0.275,0.949-0.684l0.166-0.498l0.018-0.011l0.335,0.201c0.156,0.094,0.333,0.143,0.515,0.143h0.679
  17717. c0.394,0,0.75-0.23,0.912-0.59l0.359-0.799l0.972-0.465c0.329-0.157,0.546-0.482,0.567-0.846l0.057-1.02
  17718. c0.015-0.274-0.083-0.543-0.272-0.743c-0.117-0.124-0.263-0.214-0.421-0.265l-0.072-0.916l1.695-2.383l0.71-0.236
  17719. c0.302-0.101,0.539-0.339,0.636-0.643l0.51-1.586c0.083-0.259,0.057-0.541-0.072-0.78l-0.312-0.58l-0.138-0.966l3.575-4.249
  17720. l5.061-4.576l1.214-0.221c-0.152,0.389-0.047,0.842,0.281,1.123l0.792,0.68c0.185,0.158,0.416,0.241,0.651,0.241
  17721. c0.127,0,0.254-0.024,0.375-0.073l2.095-0.849c0.371-0.15,0.617-0.507,0.625-0.907l0.053-2.719
  17722. c0.025,0.005,0.051,0.009,0.077,0.012l0.466,0.055l0.145,0.249c0.179,0.307,0.508,0.496,0.864,0.496h1.925
  17723. c0.208,0,0.412-0.065,0.581-0.186l1.189-0.849c0.263-0.188,0.419-0.491,0.419-0.814v-1.02c0-0.17-0.043-0.337-0.126-0.486
  17724. l-0.566-1.019c-0.136-0.244-0.367-0.42-0.638-0.486l-1.869-0.453c-0.078-0.019-0.157-0.028-0.236-0.028
  17725. c-0.139,0-0.277,0.029-0.406,0.086l-0.539,0.24l-0.327-0.2l-0.438-0.876c-0.02-0.04-0.042-0.078-0.067-0.114l-0.941-1.386
  17726. l-0.472-3.833v-1.467c0-0.247-0.091-0.484-0.255-0.667l-0.736-0.821c-0.095-0.105-0.21-0.189-0.34-0.247l-1.939-0.858l-3.3-1.846
  17727. c-0.075-0.042-0.154-0.074-0.237-0.095l-2.832-0.736c-0.083-0.021-0.167-0.032-0.251-0.032c-0.196,0-0.389,0.058-0.555,0.168
  17728. l-0.461,0.308l-0.844,0.065l-0.948-0.689l-0.715-0.55c-0.176-0.136-0.391-0.208-0.61-0.208c-0.06,0-0.121,0.005-0.181,0.017
  17729. c-0.279,0.051-0.522,0.218-0.671,0.459l-0.202,0.328l-3.148,0.394c-0.293,0.037-0.556,0.202-0.716,0.45l-0.778,1.206
  17730. l-0.817-0.133l-0.112-0.402c-0.117-0.422-0.495-0.716-0.926-0.732v-0.586c0-0.31-0.144-0.602-0.389-0.792
  17731. C38.675,209.712,38.459,209.64,38.24,209.64L38.24,209.64z M59.518,226.241l0.718-0.346l0.203,0.087l0.021,0.346
  17732. c0.008,0.146,0.048,0.286,0.117,0.414h-1.205L59.518,226.241L59.518,226.241z"/>
  17733. </g>
  17734. <g>
  17735. <path fill="currentColor" d="M33.352,321.239c-0.07,0-0.141-0.015-0.207-0.045l-0.83-0.377c-0.179-0.081-0.293-0.259-0.293-0.455
  17736. v-1.244l-0.42-0.076c-0.237-0.044-0.41-0.251-0.41-0.492v-0.831c0-0.194,0.112-0.37,0.288-0.453l2.191-1.026l0.1-0.465
  17737. l-0.448-0.269c-0.124-0.073-0.209-0.197-0.235-0.34l-0.151-0.831c-0.025-0.137,0.009-0.278,0.093-0.39s0.211-0.183,0.35-0.196
  17738. l0.368-0.037l0.135-0.897l-0.95-1.1l-0.451,0.41c-0.092,0.084-0.212,0.13-0.336,0.13c-0.007,0-1.833-0.075-1.833-0.075
  17739. c-0.108-0.005-0.212-0.045-0.296-0.113l-0.831-0.68c-0.186-0.152-0.237-0.415-0.122-0.626l0.197-0.361l-1.478-0.682l-1.308-0.433
  17740. c-0.06-0.021-0.116-0.052-0.165-0.093l-1.963-1.661c-0.052-0.044-0.094-0.098-0.125-0.158l-0.453-0.906
  17741. c-0.101-0.202-0.054-0.447,0.115-0.597l0.679-0.604c0.093-0.083,0.211-0.127,0.333-0.127c0.038,0,0.077,0.004,0.115,0.014
  17742. l2.567,0.604c0.083,0.02,0.159,0.06,0.222,0.116l1.48,1.346l1.363-0.237l1.256-1.057l0.762-1.461l-0.235-0.705
  17743. c-0.078-0.236,0.028-0.494,0.251-0.605l0.887-0.443l0.253-0.633l-0.496-0.446c-0.133-0.119-0.192-0.301-0.154-0.477
  17744. c0.038-0.175,0.166-0.316,0.336-0.371l1.635-0.522l0.529-1.786c0.034-0.115,0.109-0.214,0.21-0.278l1.887-1.207l1.522-0.914
  17745. c0.081-0.048,0.169-0.071,0.257-0.071c0.168,0,0.333,0.085,0.427,0.239l0.17,0.279l0.1-0.053l0.175-0.758
  17746. c0.033-0.145,0.129-0.267,0.261-0.334c0.071-0.035,0.148-0.054,0.226-0.054c0.067,0,0.134,0.014,0.197,0.04l0.729,0.313
  17747. l1.065-1.178v-1.544l-0.293-1.492c-0.029-0.155,0.016-0.315,0.123-0.432l0.831-0.905c0.095-0.104,0.229-0.162,0.369-0.162h1.359
  17748. c0.203,0,0.385,0.122,0.462,0.31l0.417,1.013l6.58,0.795c0.251,0.03,0.44,0.243,0.44,0.496v0.834l0.642,0.992l1.996,0.481
  17749. c0.225,0.055,0.383,0.255,0.383,0.486v1.888c0,0.204-0.124,0.388-0.313,0.464l-4.241,1.711l-1.415,1.078l-0.512,1.406
  17750. l0.345,2.482l1.749,2.623c0.057,0.086,0.086,0.187,0.084,0.29l-0.076,3.02c-0.002,0.087-0.027,0.172-0.072,0.246l-1.736,2.869
  17751. c-0.029,0.049-0.066,0.092-0.11,0.127l-1.202,0.989l-0.557,1.113c-0.042,0.085-0.108,0.156-0.19,0.205l-2.265,1.359
  17752. c-0.058,0.034-0.122,0.058-0.188,0.066l-2.718,0.377c-0.023,0.003-0.046,0.005-0.069,0.005c-0.132,0-0.259-0.052-0.354-0.146
  17753. l-1.585-1.585c-0.094-0.094-0.146-0.221-0.146-0.354v-0.331l-0.133,0.035v0.446c0,0.2-0.119,0.381-0.303,0.46l-1.057,0.453
  17754. c-0.063,0.026-0.13,0.04-0.197,0.04c-0.081,0-0.162-0.02-0.235-0.059l-0.943-0.503l-0.98,0.327l-0.584,0.974
  17755. c-0.055,0.092-0.139,0.164-0.238,0.204l-1.088,0.448l-0.086,0.215l1.221,0.977c0.136,0.108,0.206,0.28,0.184,0.453
  17756. s-0.132,0.321-0.291,0.394l-2.341,1.057C33.492,321.225,33.422,321.239,33.352,321.239z"/>
  17757. <path fill="currentColor" d="M45.281,290.464l0.529,1.283l6.871,0.83v0.981l0.83,1.284l2.19,0.528v1.888l-4.304,1.736l-1.585,1.208
  17758. l-0.604,1.661l0.377,2.718l1.812,2.719l-0.076,3.02l-1.736,2.869l-1.284,1.057l-0.604,1.208l-2.265,1.359l-2.718,0.377
  17759. l-1.585-1.585v-0.981l-1.133,0.302v0.83l-1.057,0.453l-1.133-0.604l-1.359,0.453l-0.68,1.132l-1.283,0.528l-0.302,0.756
  17760. l1.51,1.208l-2.341,1.057l-0.83-0.377v-0.756v-0.905l-0.831-0.151v-0.831l2.416-1.132l0.227-1.058l-0.755-0.452l-0.151-0.831
  17761. l0.755-0.075l0.227-1.51L32.974,311l-0.831,0.755l-1.812-0.075L29.501,311l0.453-0.831l-1.963-0.905l-1.359-0.453l-1.963-1.661
  17762. l-0.453-0.906l0.679-0.604l2.567,0.604l1.661,1.51l1.737-0.302l1.435-1.208l0.906-1.736l-0.302-0.906l1.057-0.528l0.453-1.133
  17763. l-0.755-0.68l1.887-0.604l0.604-2.039l1.887-1.207l1.51-0.906l0.415,0.68l0.717-0.378l0.227-0.981l1.057,0.453l1.434-1.586
  17764. v-1.736l-0.302-1.586l0.831-0.905H45.281 M45.281,289.464h-1.359c-0.28,0-0.547,0.117-0.737,0.324l-0.831,0.905
  17765. c-0.213,0.232-0.305,0.553-0.246,0.862l0.284,1.494v1.257l-0.697,0.771l-0.4-0.172c-0.126-0.054-0.26-0.081-0.394-0.081
  17766. c-0.155,0-0.311,0.036-0.453,0.108c-0.259,0.131-0.448,0.368-0.518,0.649c-0.123-0.052-0.256-0.078-0.39-0.078
  17767. c-0.175,0-0.353,0.046-0.514,0.143l-1.51,0.906l-1.911,1.222c-0.203,0.13-0.352,0.328-0.42,0.559l-0.454,1.532l-1.383,0.442
  17768. c-0.341,0.108-0.598,0.392-0.673,0.742c-0.075,0.35,0.042,0.714,0.309,0.953l0.236,0.213l-0.053,0.132l-0.717,0.358
  17769. c-0.445,0.223-0.659,0.738-0.501,1.21l0.167,0.504l-0.618,1.186l-1.077,0.906l-0.989,0.172l-1.299-1.181
  17770. c-0.125-0.114-0.278-0.194-0.443-0.233l-2.567-0.604c-0.076-0.018-0.153-0.026-0.229-0.026c-0.243,0-0.48,0.088-0.665,0.253
  17771. l-0.679,0.604c-0.337,0.301-0.432,0.79-0.229,1.194l0.453,0.906c0.061,0.121,0.145,0.229,0.249,0.316l1.963,1.661
  17772. c0.097,0.082,0.209,0.145,0.33,0.185l1.307,0.437l0.948,0.437c-0.158,0.4-0.043,0.864,0.297,1.142l0.831,0.68
  17773. c0.167,0.138,0.375,0.217,0.592,0.226l1.812,0.075c0.014,0.001,0.028,0.001,0.042,0.001c0.248,0,0.488-0.093,0.672-0.26
  17774. l0.072-0.065l0.464,0.537l-0.043,0.286c-0.27,0.032-0.516,0.174-0.68,0.392c-0.168,0.223-0.235,0.506-0.186,0.78l0.151,0.831
  17775. c0.051,0.283,0.223,0.531,0.47,0.68l0.034,0.02l-1.832,0.858c-0.351,0.164-0.576,0.518-0.576,0.905v0.831
  17776. c0,0.483,0.345,0.897,0.821,0.983l0.01,0.002v0.071v0.756c0,0.393,0.229,0.748,0.586,0.91l0.83,0.377
  17777. c0.131,0.06,0.272,0.09,0.414,0.09c0.14,0,0.281-0.029,0.412-0.089l2.341-1.057c0.317-0.143,0.537-0.44,0.581-0.786
  17778. s-0.096-0.688-0.368-0.906l-0.707-0.564l0.538-0.222c0.199-0.082,0.366-0.226,0.477-0.41l0.489-0.814l0.601-0.2l0.754,0.401
  17779. c0.146,0.078,0.308,0.117,0.47,0.117c0.134,0,0.268-0.027,0.394-0.081l1.057-0.453c0.09-0.038,0.172-0.089,0.245-0.149
  17780. l1.373,1.372c0.189,0.188,0.444,0.293,0.707,0.293c0.045,0,0.091-0.003,0.137-0.01l2.718-0.377
  17781. c0.134-0.019,0.262-0.063,0.377-0.133l2.265-1.359c0.163-0.098,0.295-0.24,0.38-0.41l0.509-1.019l1.12-0.921
  17782. c0.087-0.072,0.161-0.158,0.22-0.255l1.736-2.869c0.09-0.148,0.14-0.318,0.144-0.492l0.076-3.02
  17783. c0.005-0.206-0.053-0.408-0.167-0.58l-1.685-2.528l-0.312-2.245l0.419-1.152l1.245-0.948l4.179-1.686
  17784. c0.378-0.153,0.626-0.52,0.626-0.928v-1.888c0-0.462-0.316-0.863-0.766-0.972l-1.801-0.435l-0.453-0.701v-0.687
  17785. c0-0.506-0.378-0.932-0.88-0.993l-6.29-0.76l-0.305-0.741C46.051,289.708,45.686,289.464,45.281,289.464L45.281,289.464z"/>
  17786. </g>
  17787. <g>
  17788. <path fill="currentColor" d="M54.52,345.569c-0.125,0-0.246-0.047-0.338-0.132l-0.339-0.312c-0.147-0.135-0.199-0.344-0.135-0.53
  17789. l-0.22-0.221c-0.12-0.12-0.171-0.293-0.135-0.459l0.056-0.262l-0.155-0.465c-0.075-0.223,0.017-0.468,0.218-0.588l1.568-0.933
  17790. c-0.043-0.121-0.038-0.253,0.014-0.37l0.189-0.425c0.081-0.181,0.259-0.297,0.457-0.297h0.542l0.314-0.445l0.13-1.26
  17791. l-0.094-0.084c-0.17-0.153-0.214-0.401-0.108-0.604l0.112-0.214c-0.169-0.148-0.219-0.395-0.117-0.599l0.198-0.396
  17792. c0.066-0.132,0.187-0.228,0.33-0.263l0.821-0.198c0.039-0.009,0.078-0.014,0.117-0.014c0.038,0,0.076,0.004,0.114,0.013
  17793. l0.657,0.153l0.565-0.325c0.076-0.044,0.162-0.067,0.25-0.067h0.754l0.183-0.503l-0.04-0.515l-0.183-0.316l-0.667-0.358
  17794. c-0.133-0.071-0.227-0.199-0.255-0.348c-0.028-0.148,0.013-0.302,0.111-0.417l0.821-0.963c0.098-0.115,0.238-0.176,0.381-0.176
  17795. c0.091,0,0.183,0.024,0.265,0.076l0.68,0.425c0.092,0.058,0.163,0.144,0.202,0.246l0.357,0.937l0.305,0.067l-0.087-0.071
  17796. c-0.125-0.102-0.193-0.258-0.183-0.419c0.011-0.161,0.098-0.308,0.235-0.393l0.273-0.17c0.08-0.05,0.172-0.075,0.264-0.075
  17797. c0.073,0,0.146,0.016,0.213,0.048l1.016,0.479l0.591-0.431c0.086-0.063,0.189-0.096,0.294-0.096c0.018,0,2.273,0.236,2.273,0.236
  17798. l0.264-0.212c0.083-0.066,0.186-0.104,0.292-0.109l1.295-0.054l1.978-0.604c0.048-0.015,0.098-0.021,0.146-0.021
  17799. c0.207,0,0.399,0.129,0.472,0.334l0.017,0.047l1.395-0.364c0.042-0.011,0.084-0.017,0.126-0.017c0.012,0,1.934,0.143,1.934,0.143
  17800. c0.151,0.012,0.29,0.091,0.375,0.216c0.085,0.126,0.11,0.283,0.066,0.428l-0.138,0.455l0.086,0.026
  17801. c0.211,0.063,0.356,0.258,0.356,0.479v0.425c0,0.221-0.145,0.415-0.356,0.479l-0.688,0.207l-0.841,1.156l0.034,0.058
  17802. c0.1,0.171,0.089,0.386-0.028,0.546l-0.299,0.412l0.141,0.404c0.036,0.103,0.037,0.215,0.003,0.319l-0.263,0.808l0.238,0.119
  17803. c0.161,0.081,0.267,0.241,0.276,0.422c0.009,0.18-0.079,0.351-0.231,0.447l-1.246,0.792c-0.048,0.03-0.101,0.053-0.156,0.065
  17804. l-1.104,0.255c-0.038,0.009-0.076,0.013-0.113,0.013c-0.224,0-0.428-0.151-0.484-0.379l-0.109-0.435l-0.432,0.095
  17805. c-0.036,0.008-0.072,0.012-0.107,0.012c-0.203,0-0.391-0.124-0.466-0.319l-0.179-0.462l-0.757,0.198
  17806. c-0.042,0.012-0.084,0.017-0.127,0.017c-0.124,0-0.245-0.046-0.338-0.132l-0.082-0.075l-0.455,0.236
  17807. c-0.072,0.037-0.151,0.056-0.23,0.056c-0.064,0-0.129-0.013-0.19-0.038l-0.481-0.198c-0.127-0.052-0.228-0.154-0.276-0.283
  17808. l-0.226-0.591l-0.2,0.199c-0.097,0.098-0.225,0.146-0.354,0.146c-0.11,0-0.22-0.036-0.312-0.109l-0.199,0.15
  17809. c-0.038,0.028-0.08,0.052-0.124,0.068l-1.199,0.453c-0.058,0.021-0.118,0.032-0.177,0.032c-0.163,0-0.321-0.08-0.416-0.223
  17810. l-0.091-0.137l-0.48,0.534c-0.097,0.107-0.233,0.165-0.372,0.165c-0.066,0-0.133-0.013-0.197-0.04l-0.455-0.195l-0.066,0.013
  17811. l-0.142,0.269c-0.05,0.095-0.13,0.172-0.228,0.218l-0.885,0.419l-0.243,0.706c-0.012,0.035-0.027,0.068-0.047,0.1l-0.906,1.473
  17812. c-0.046,0.075-0.112,0.138-0.189,0.179l-0.792,0.425c-0.073,0.039-0.154,0.06-0.236,0.06c-0.005,0-0.924-0.026-0.924-0.026
  17813. l-0.856,0.26l-0.287,0.147l-0.039,0.622c-0.01,0.166-0.103,0.315-0.246,0.399l-0.481,0.283c-0.077,0.046-0.164,0.069-0.253,0.069
  17814. H54.52z"/>
  17815. <path fill="currentColor" d="M73.32,333.036l1.897,0.142l-0.283,0.935l0.566,0.17v0.425l-0.849,0.255l-1.133,1.557l0.198,0.34
  17816. l-0.453,0.623l0.227,0.651l-0.396,1.218l0.623,0.312l-1.246,0.792l-1.104,0.255l-0.227-0.905l-0.906,0.198l-0.34-0.878
  17817. l-1.189,0.312l-0.34-0.312l-0.765,0.396l-0.481-0.198l-0.368-0.963l-0.396-0.085l-0.481,0.481l-0.286-0.255l-0.526,0.396
  17818. l-1.199,0.453l-0.34-0.51h-0.254l-0.765,0.85l-0.595-0.255l-0.453,0.085l-0.255,0.481l-1.076,0.509l-0.312,0.906l-0.906,1.473
  17819. l-0.792,0.425l-0.991-0.028l-0.934,0.283l-0.623,0.311l-0.057,0.906l-0.481,0.283h-0.51l-0.339-0.312l0.198-0.481h-0.283
  17820. l-0.255-0.255l0.085-0.396l-0.198-0.595l2.237-1.331l-0.453-0.198l0.189-0.425h0.406h0.396l0.538-0.765l0.17-1.642l-0.283-0.255
  17821. l0.312-0.595l-0.312-0.227l0.198-0.396L57.946,337l0.85,0.198l0.736-0.425h1.104l0.34-0.934l-0.057-0.736l-0.312-0.538
  17822. l-0.792-0.425l0.821-0.963l0.68,0.425l0.453,1.189l1.416,0.312l0.425-0.368l-0.935-0.765l0.273-0.17l1.284,0.604l0.831-0.604
  17823. l2.425,0.255l0.425-0.34l1.359-0.057l2.039-0.623l0.169,0.481L73.32,333.036 M71.311,332.036c-0.097,0-0.195,0.014-0.293,0.044
  17824. l-1.916,0.585l-1.231,0.052c-0.213,0.009-0.417,0.085-0.583,0.218l-0.104,0.084l-2.017-0.212
  17825. c-0.035-0.004-0.07-0.006-0.104-0.006c-0.21,0-0.417,0.066-0.588,0.191l-0.352,0.256l-0.748-0.352
  17826. c-0.136-0.064-0.281-0.096-0.426-0.096c-0.184,0-0.367,0.051-0.528,0.15l-0.24,0.149c-0.082-0.141-0.196-0.26-0.335-0.346
  17827. l-0.68-0.425c-0.164-0.103-0.347-0.152-0.529-0.152c-0.285,0-0.565,0.121-0.762,0.352l-0.821,0.963
  17828. c-0.196,0.229-0.277,0.536-0.222,0.834c0.056,0.297,0.244,0.553,0.51,0.695l0.542,0.291l0.055,0.095l0.022,0.294l-0.026,0.072
  17829. h-0.404c-0.175,0-0.348,0.046-0.5,0.134l-0.395,0.228l-0.465-0.108c-0.075-0.018-0.151-0.026-0.227-0.026
  17830. c-0.079,0-0.158,0.01-0.235,0.028l-0.821,0.198c-0.287,0.068-0.528,0.261-0.66,0.524l-0.198,0.396
  17831. c-0.138,0.277-0.137,0.592-0.017,0.858c-0.16,0.353-0.099,0.765,0.149,1.057l-0.092,0.888l-0.089,0.127H55.7
  17832. c-0.395,0-0.753,0.232-0.914,0.594l-0.189,0.425c-0.043,0.097-0.07,0.199-0.081,0.303l-1.3,0.773
  17833. c-0.404,0.24-0.586,0.729-0.438,1.176l0.112,0.335l-0.027,0.129c-0.071,0.332,0.03,0.677,0.271,0.917l0.047,0.047
  17834. c0.005,0.269,0.118,0.53,0.324,0.719l0.339,0.312c0.185,0.17,0.426,0.264,0.676,0.264h0.51c0.178,0,0.354-0.048,0.507-0.138
  17835. l0.481-0.283c0.287-0.169,0.471-0.469,0.491-0.8l0.021-0.331l0.032-0.016l0.698-0.212l0.829,0.024c0.009,0,0.019,0,0.028,0
  17836. c0.165,0,0.327-0.041,0.473-0.119l0.792-0.424c0.156-0.084,0.287-0.207,0.379-0.357l0.906-1.473
  17837. c0.039-0.063,0.07-0.13,0.094-0.199l0.174-0.508l0.695-0.328c0.159-0.075,0.294-0.19,0.394-0.334l0.087,0.037
  17838. c0.127,0.055,0.261,0.081,0.394,0.081c0.278,0,0.55-0.115,0.744-0.331l0.124-0.138c0.15,0.084,0.319,0.129,0.492,0.129
  17839. c0.118,0,0.237-0.021,0.353-0.064l1.199-0.453c0.074-0.028,0.144-0.064,0.208-0.108c0.082,0.021,0.166,0.031,0.25,0.031
  17840. c0.109,0,0.217-0.018,0.321-0.053c0.102,0.246,0.297,0.442,0.544,0.544l0.481,0.198c0.122,0.05,0.251,0.075,0.381,0.075
  17841. c0.158,0,0.316-0.038,0.46-0.112l0.174-0.09c0.145,0.077,0.306,0.117,0.47,0.117c0.084,0,0.17-0.011,0.253-0.032l0.325-0.086
  17842. l0.018,0.046c0.151,0.391,0.527,0.639,0.932,0.639c0.057,0,0.115-0.005,0.172-0.015c0.125,0.434,0.523,0.722,0.959,0.722
  17843. c0.075,0,0.15-0.008,0.226-0.025l1.104-0.255c0.111-0.025,0.216-0.07,0.312-0.131l1.246-0.792
  17844. c0.304-0.193,0.48-0.535,0.462-0.896c-0.016-0.303-0.168-0.58-0.409-0.756l0.134-0.412c0.068-0.208,0.065-0.432-0.006-0.638
  17845. l-0.055-0.158l0.146-0.2c0.178-0.243,0.232-0.55,0.161-0.833l0.575-0.79l0.526-0.158c0.423-0.127,0.712-0.517,0.712-0.958v-0.425
  17846. c0-0.297-0.13-0.569-0.344-0.755l0.018-0.06c0.088-0.29,0.04-0.605-0.132-0.855c-0.171-0.25-0.448-0.409-0.75-0.432l-1.897-0.142
  17847. c-0.024-0.002-0.049-0.003-0.074-0.003c-0.085,0-0.17,0.011-0.253,0.032l-1.039,0.271
  17848. C71.842,332.147,71.582,332.036,71.311,332.036L71.311,332.036z"/>
  17849. </g>
  17850. <g>
  17851. <path fill="currentColor" d="M8.434,372.801c-0.17,0-0.333-0.087-0.427-0.239l-0.33-0.539c-0.094-0.154-0.098-0.348-0.009-0.505
  17852. c0.063-0.113,0.167-0.195,0.287-0.233l0.032-0.276l-0.237-1.079l-0.306-0.574c-0.059-0.004-0.116-0.018-0.17-0.041l-0.479-0.21
  17853. l-2.408-0.761c-0.058-0.019-0.113-0.048-0.161-0.086l-0.899-0.719c-0.054-0.043-0.098-0.096-0.13-0.156l-0.128-0.243H2.651
  17854. c-0.248,0-0.458-0.181-0.495-0.426l-0.09-0.6c-0.02-0.136,0.016-0.273,0.1-0.382l0.063-0.084l-0.15-0.133
  17855. c-0.181-0.161-0.221-0.43-0.094-0.636l0.166-0.27v-0.848c0-0.124,0.046-0.243,0.129-0.335l0.569-0.629
  17856. c0.087-0.098,0.209-0.156,0.34-0.164c0,0,1.968-0.121,1.979-0.121c0.061,0,0.12,0.011,0.177,0.032l1.263,0.478h0.238
  17857. c0.101,0,0.199,0.03,0.282,0.087l0.569,0.39c0.077,0.053,0.137,0.125,0.175,0.21l0.572,1.288l0.841,1.045l0.463,0.11
  17858. c0.057,0.014,0.111,0.037,0.16,0.069l1.768,1.168l2.384,2.013c0.032,0.027,0.061,0.059,0.085,0.093l0.36,0.509
  17859. c0.079,0.111,0.108,0.25,0.083,0.384c-0.026,0.135-0.105,0.252-0.22,0.325l-0.292,0.188l-0.079,0.184v0.317
  17860. c0,0.194-0.112,0.37-0.288,0.452l-0.51,0.239c-0.066,0.031-0.139,0.048-0.212,0.048h-0.743l-0.461,0.185l-0.585,0.391
  17861. c-0.083,0.055-0.179,0.084-0.278,0.084c-0.018,0-1.855-0.2-1.855-0.2l-0.459,0.169C8.55,372.791,8.491,372.801,8.434,372.801z"/>
  17862. <path fill="currentColor" d="M5.168,363.013l1.348,0.51h0.33l0.569,0.39l0.599,1.348l0.989,1.229l0.629,0.15l1.768,1.168l2.337,1.978
  17863. l0.36,0.509l-0.42,0.271l-0.179,0.419v0.42l-0.51,0.239h-0.839l-0.599,0.239l-0.629,0.42l-1.917-0.21l-0.569,0.21l-0.33-0.539
  17864. h0.299l0.09-0.779l-0.27-1.229l-0.479-0.898h-0.27l-0.479-0.21l-2.457-0.779l-0.899-0.719l-0.27-0.509H2.651l-0.09-0.6l0.21-0.27
  17865. l-0.09-0.39l-0.27-0.239l0.24-0.39v-0.989l0.569-0.629L5.168,363.013 M5.168,362.013c-0.021,0-0.041,0.001-0.062,0.002
  17866. l-1.948,0.12c-0.261,0.016-0.505,0.134-0.68,0.327l-0.569,0.629c-0.166,0.184-0.258,0.423-0.258,0.671v0.706l-0.091,0.148
  17867. c-0.218,0.354-0.191,0.797,0.048,1.12c-0.046,0.145-0.059,0.299-0.036,0.452l0.09,0.6c0.074,0.489,0.494,0.851,0.989,0.851h0.117
  17868. c0.063,0.111,0.146,0.21,0.247,0.29l0.899,0.719c0.096,0.076,0.205,0.135,0.322,0.172l2.406,0.764l0.431,0.188
  17869. c0.011,0.005,0.022,0.01,0.034,0.014l0.169,0.317l0.194,0.886c-0.095,0.077-0.177,0.174-0.239,0.284
  17870. c-0.177,0.315-0.17,0.702,0.019,1.011l0.33,0.539c0.186,0.305,0.513,0.479,0.854,0.479c0.115,0,0.232-0.02,0.346-0.062
  17871. l0.348-0.129l1.684,0.185c0.036,0.004,0.073,0.006,0.109,0.006c0.197,0,0.39-0.059,0.555-0.168l0.542-0.362l0.323-0.129h0.646
  17872. c0.147,0,0.292-0.032,0.425-0.095l0.51-0.239c0.351-0.165,0.575-0.518,0.575-0.905v-0.178l0.141-0.091
  17873. c0.229-0.147,0.388-0.383,0.44-0.65c0.052-0.268-0.008-0.545-0.166-0.768l-0.36-0.509c-0.049-0.069-0.106-0.132-0.17-0.187
  17874. l-2.337-1.978c-0.03-0.025-0.062-0.049-0.095-0.07l-1.768-1.168c-0.097-0.064-0.205-0.111-0.319-0.139l-0.296-0.071l-0.693-0.86
  17875. l-0.546-1.229c-0.075-0.169-0.196-0.314-0.349-0.419l-0.569-0.39c-0.167-0.114-0.363-0.175-0.565-0.175H6.699l-1.177-0.445
  17876. C5.409,362.034,5.289,362.013,5.168,362.013L5.168,362.013z"/>
  17877. </g>
  17878. <g>
  17879. <path fill="currentColor" d="M22.875,414.235c-0.133,0-0.266-0.053-0.363-0.156l-0.824-0.871l-0.112,0.04
  17880. c-0.055,0.02-0.112,0.029-0.169,0.029c-0.085,0-0.169-0.021-0.245-0.064l-1.229-0.689c-0.149-0.083-0.246-0.238-0.255-0.409
  17881. l-0.019-0.362l-0.415-0.371c-0.158-0.141-0.209-0.366-0.129-0.563l0.209-0.509c0.077-0.188,0.26-0.31,0.462-0.31h0.923
  17882. l0.432-0.231l-0.131-1.248l-0.715-1.048l-1.006-0.694l-0.659,0.137c-0.034,0.007-0.068,0.011-0.102,0.011
  17883. c-0.054,0-0.107-0.009-0.159-0.025l-0.291-0.098l-0.509,0.382c-0.044,0.033-0.094,0.06-0.146,0.076l-1.019,0.329
  17884. c-0.051,0.017-0.103,0.024-0.154,0.024c-0.16,0-0.314-0.077-0.41-0.214l-0.209-0.3c-0.081-0.116-0.109-0.261-0.078-0.398
  17885. l0.02-0.087l-0.606-0.5l-0.348,0.055c-0.026,0.004-0.052,0.006-0.077,0.006c-0.191,0-0.368-0.109-0.452-0.286l-0.27-0.568
  17886. c-0.068-0.144-0.064-0.312,0.012-0.452c0.076-0.14,0.214-0.235,0.372-0.257l0.357-0.049l0.408-1.151l0.066-0.506
  17887. c0.027-0.179,0.148-0.329,0.316-0.393c0.058-0.022,0.118-0.033,0.178-0.033c0.115,0,0.229,0.04,0.32,0.115l0.061,0.051
  17888. l0.484-0.35l-0.054-0.199l-0.391-0.149c-0.126-0.048-0.228-0.146-0.281-0.27l-0.161-0.374l-2.383-0.369l-0.133,0.621
  17889. c-0.021,0.098-0.07,0.186-0.141,0.255l-0.725,0.701l0.16,0.683c0.029,0.126,0.009,0.258-0.057,0.369l-0.284,0.479
  17890. c-0.063,0.105-0.162,0.185-0.279,0.222l-0.736,0.233l0.008,0.021c0.046,0.131,0.036,0.274-0.027,0.396l-0.449,0.869
  17891. c-0.045,0.088-0.116,0.16-0.203,0.208l-1.139,0.629c-0.074,0.041-0.157,0.063-0.242,0.063c-0.02,0-0.04-0.001-0.061-0.004
  17892. l-1.229-0.149c-0.173-0.021-0.323-0.131-0.395-0.29l-0.016-0.036H6.636c-0.169,0-0.326-0.085-0.418-0.227
  17893. c-0.092-0.141-0.107-0.319-0.04-0.474l0.21-0.479c0.065-0.148,0.196-0.254,0.351-0.288c-0.013-0.019-0.025-0.038-0.036-0.059
  17894. c-0.086-0.165-0.074-0.364,0.032-0.517l0.479-0.689l1.191-1.231c0.097-0.1,0.227-0.151,0.358-0.151
  17895. c0.09,0,0.181,0.024,0.262,0.074l0.028,0.018c0.034-0.079,0.087-0.147,0.156-0.199l-0.166-0.447
  17896. c-0.04-0.106-0.042-0.224-0.006-0.331l0.149-0.45c0.058-0.174,0.204-0.3,0.379-0.334l-0.042-0.075
  17897. c-0.105-0.19-0.076-0.427,0.074-0.585l0.125-0.133l-0.122-0.107c-0.037-0.033-0.069-0.071-0.095-0.113l-0.24-0.39
  17898. c-0.06-0.098-0.085-0.213-0.07-0.326l0.09-0.689c0.023-0.183,0.146-0.338,0.318-0.403l0.513-0.194l-0.055-0.579
  17899. c-0.006-0.066,0.001-0.132,0.021-0.195l0.272-0.874l-0.484,0.151c-0.049,0.015-0.1,0.022-0.149,0.022
  17900. c-0.107,0-0.212-0.034-0.3-0.1l-0.359-0.27c-0.144-0.108-0.219-0.284-0.196-0.462l0.274-2.192l-0.383-0.496
  17901. c-0.127-0.165-0.139-0.391-0.03-0.567l0.178-0.29l0.103-1.132l-0.107-0.56c-0.027-0.142,0.008-0.288,0.098-0.402l1.618-2.067
  17902. l0.867-1.421c0.055-0.089,0.136-0.158,0.232-0.199l0.184-0.077l-0.178-0.791c-0.029-0.13-0.005-0.268,0.067-0.38l0.27-0.419
  17903. c0.013-0.02,0.026-0.038,0.041-0.056c-0.004-0.064,0.004-0.13,0.025-0.192l0.18-0.539c0.013-0.039,0.03-0.076,0.052-0.11
  17904. l0.131-0.206v-1.023c0-0.063,0.012-0.123,0.034-0.182l0.629-1.617c0.019-0.048,0.044-0.093,0.077-0.133l1.138-1.408
  17905. c0.095-0.117,0.238-0.186,0.389-0.186h0.41l0.079-0.157v-1.021l-0.165-1.009l-0.671-1.781c-0.063-0.167-0.033-0.354,0.08-0.491
  17906. l0.898-1.108c0.063-0.078,0.148-0.136,0.245-0.164l1.199-0.359c0.047-0.015,0.096-0.021,0.144-0.021
  17907. c0.108,0,0.214,0.035,0.303,0.102l0.749,0.569l0.47,0.509l0.276-0.061l0.29-0.268c0.093-0.086,0.215-0.133,0.339-0.133
  17908. c0.031,0,0.062,0.003,0.092,0.009c0.155,0.029,0.288,0.13,0.357,0.271l0.629,1.29c0.044,0.09,0.06,0.191,0.045,0.291l-0.18,1.228
  17909. c-0.018,0.12-0.078,0.228-0.167,0.306c0.043,0.031,0.081,0.07,0.112,0.115l0.209,0.3c0.073,0.104,0.103,0.231,0.085,0.356
  17910. l-0.06,0.42c-0.018,0.124-0.081,0.236-0.177,0.315l-0.292,0.241l0.035,0.246l0.484,0.78c0.018,0.028,0.033,0.06,0.044,0.091
  17911. l0.209,0.569c0.023,0.063,0.034,0.132,0.03,0.199l-0.054,1.024l0.435,1.032c0.021,0.049,0.033,0.101,0.038,0.153l0.038,0.468
  17912. l0.51-0.174l0.218-0.218c0.094-0.095,0.222-0.146,0.354-0.146c0.027,0,0.054,0.002,0.08,0.007
  17913. c0.159,0.025,0.295,0.126,0.367,0.27l0.087,0.175l0.055-0.015l0.897-0.132c0.023-0.003,0.047-0.005,0.071-0.005
  17914. c0.123,0,0.243,0.046,0.335,0.129c0.11,0.1,0.17,0.243,0.164,0.392l-0.024,0.581l0.113,0.208
  17915. c0.066,0.122,0.079,0.266,0.036,0.397l-0.205,0.614l0.902,0.951c0.179,0.188,0.183,0.484,0.009,0.678l-1.049,1.168
  17916. c-0.098,0.108-0.234,0.166-0.372,0.166c-0.088,0-0.177-0.023-0.257-0.071l-0.061-0.036l-0.421,0.217l0.024,0.156l0.413,0.188
  17917. c0.168,0.076,0.281,0.24,0.292,0.425l0.038,0.623l0.649,0.162l0.113-0.302c0.065-0.173,0.22-0.296,0.403-0.32l0.262-0.034
  17918. l1.032-1.183l0.193-0.672c0.055-0.192,0.22-0.333,0.419-0.357l0.734-0.091c0.021-0.003,0.041-0.004,0.062-0.004
  17919. c0.139,0,0.272,0.058,0.367,0.161l0.096-0.078c0.091-0.074,0.203-0.112,0.315-0.112c0.081,0,0.162,0.02,0.236,0.06l0.39,0.209
  17920. c0.174,0.093,0.276,0.279,0.262,0.477l-0.016,0.222l0.923,1.135c0.083,0.103,0.123,0.233,0.11,0.365l-0.028,0.276l0.396,0.227
  17921. l1.046-0.204c0.032-0.007,0.064-0.01,0.096-0.01c0.095,0,0.189,0.027,0.271,0.079l0.296,0.19h0.542
  17922. c0.177,0,0.341,0.094,0.431,0.246l0.3,0.51c0.042,0.072,0.066,0.154,0.068,0.237l0.026,0.776l0.421,0.747l1.208,0.802
  17923. l0.392,0.103l0.138-0.236c0.054-0.092,0.135-0.164,0.231-0.206l0.479-0.21c0.065-0.028,0.133-0.042,0.201-0.042
  17924. c0.146,0,0.29,0.064,0.387,0.184l0.27,0.33c0.081,0.1,0.121,0.226,0.111,0.353l-0.09,1.229c-0.006,0.087-0.035,0.17-0.083,0.241
  17925. l-0.096,0.144l0.111,0.138l0.43-0.286c0.039-0.025,0.081-0.046,0.125-0.061l0.749-0.239c0.05-0.016,0.101-0.023,0.152-0.023
  17926. c0.087,0,0.173,0.022,0.25,0.066l0.704,0.406l0.725,0.135c0.113,0.021,0.215,0.079,0.289,0.166l0.309,0.361l0.803,0.498
  17927. c0.123,0.076,0.207,0.202,0.23,0.346l0.08,0.499l0.696,0.358c0,0,0.964-0.08,0.978-0.08c0.058,0,0.115,0.01,0.169,0.029
  17928. l0.749,0.27c0.151,0.055,0.267,0.179,0.312,0.333l0.12,0.42l0.158,0.304l1.104,0.564l0.483-0.109
  17929. c0.036-0.009,0.073-0.013,0.11-0.013c0.099,0,0.196,0.029,0.279,0.085c0.114,0.077,0.192,0.197,0.214,0.333l0.12,0.719
  17930. c0.011,0.065,0.009,0.133-0.007,0.197l-0.149,0.63c-0.05,0.211-0.229,0.365-0.445,0.383l-0.844,0.07l-0.405,0.585
  17931. c-0.045,0.063-0.104,0.117-0.172,0.154l-1.049,0.569c-0.048,0.025-0.099,0.044-0.152,0.053l-1.969,0.347l-0.374,0.747v0.811
  17932. c0,0.101-0.03,0.198-0.086,0.281l-0.423,0.622v0.476c0,0.21-0.131,0.397-0.328,0.47l-0.899,0.329
  17933. c-0.056,0.021-0.114,0.03-0.172,0.03c-0.149,0-0.293-0.066-0.391-0.188l-0.359-0.449c-0.071-0.089-0.109-0.199-0.109-0.313
  17934. v-0.483l-0.187-0.233l-0.506,0.084l-1,0.651l-0.067,0.688c-0.012,0.129-0.074,0.248-0.172,0.332l-0.296,0.254l-0.097,0.403
  17935. l0.167,0.305l0.624,0.349c0.158,0.089,0.256,0.256,0.256,0.437v0.269l0.927,0.901c0.14,0.136,0.188,0.341,0.123,0.525
  17936. l-0.18,0.509c-0.037,0.104-0.107,0.192-0.2,0.253l-0.509,0.33c-0.069,0.044-0.147,0.071-0.229,0.078c0,0-0.718,0.062-0.732,0.062
  17937. c-0.095,0-0.189-0.027-0.27-0.079l-0.985-0.632l-1.287,0.328l-0.613,0.699v0.502c0,0.226-0.151,0.423-0.369,0.482l-0.659,0.18
  17938. c-0.043,0.012-0.087,0.018-0.131,0.018c-0.136,0-0.269-0.056-0.365-0.158l-0.785-0.837l-1.118-0.194l-1.013,0.219l-0.792,0.258
  17939. c-0.05,0.017-0.102,0.024-0.153,0.024c-0.061,0-0.121-0.011-0.178-0.033l-0.503-0.192l-0.708,0.115l-0.25,0.563
  17940. c-0.078,0.176-0.25,0.291-0.442,0.297l-2.007,0.06l-0.144,0.029c-0.004,0.109-0.045,0.215-0.115,0.299l-0.3,0.36
  17941. c-0.086,0.104-0.209,0.168-0.343,0.179l-0.58,0.048l-0.216,0.157C23.08,414.204,22.977,414.235,22.875,414.235z"/>
  17942. <path fill="currentColor" d="M16.972,372.84l0.749,0.569l0.599,0.659l0.689-0.149l0.39-0.36l0.629,1.289l-0.18,1.228l-0.569,0.24
  17943. l0.149,0.539h0.45l0.209,0.3l-0.06,0.42l-0.509,0.419l0.09,0.629l0.54,0.869l0.209,0.569l-0.06,1.139l0.479,1.139l0.09,1.107
  17944. l1.228-0.419l0.3-0.3l0.27,0.54l0.449-0.12l0.839-0.12l-0.03,0.719l0.18,0.33l-0.299,0.898l1.108,1.169l-1.049,1.168l-0.299-0.18
  17945. l-0.989,0.51l0.12,0.778l0.659,0.3l0.06,0.989l1.438,0.359l0.27-0.72l0.45-0.06l1.229-1.408l0.224-0.778l0.734-0.091l0.3,0.36
  17946. l0.479-0.39l0.39,0.209l-0.03,0.42l1.049,1.288l-0.06,0.6l0.839,0.479l1.229-0.24l0.419,0.27h0.689l0.3,0.51l0.03,0.898
  17947. l0.54,0.959l1.378,0.914l0.839,0.22l0.329-0.564l0.479-0.21l0.27,0.33l-0.09,1.229l-0.3,0.449l0.629,0.778l0.809-0.539
  17948. l0.749-0.239l0.779,0.449l0.809,0.149l0.359,0.42l0.869,0.539l0.12,0.749l1.048,0.539l1.079-0.09l0.749,0.27l0.12,0.42
  17949. l0.27,0.539l1.408,0.719l0.659-0.149l0.12,0.719l-0.149,0.63l-1.079,0.09l-0.539,0.778l-1.049,0.569l-2.217,0.39l-0.54,1.078
  17950. v0.929l-0.509,0.749v0.63l-0.899,0.329l-0.359-0.449v-0.659l-0.479-0.6l-0.898,0.15l-1.289,0.839l-0.09,0.929l-0.419,0.359
  17951. l-0.18,0.749l0.33,0.6l0.749,0.419v0.479l1.079,1.049l-0.18,0.509l-0.509,0.33l-0.689,0.06l-1.168-0.749l-1.647,0.42
  17952. l-0.839,0.958v0.689l-0.659,0.18l-0.899-0.959l-1.378-0.239l-1.108,0.239l-0.839,0.271l-0.629-0.24l-1.108,0.18l-0.36,0.81
  17953. l-2.007,0.06l-0.629,0.12v0.389l-0.3,0.36l-0.719,0.06l-0.329,0.239l-1.049-1.108l-0.419,0.15l-1.229-0.689l-0.03-0.569
  17954. l-0.569-0.51l0.209-0.509h1.049l0.839-0.449l-0.18-1.708l-0.839-1.229l-1.258-0.869l-0.869,0.181l-0.54-0.181l-0.719,0.54
  17955. l-1.019,0.329l-0.209-0.3l0.09-0.389l-1.019-0.839l-0.569,0.089l-0.27-0.568l0.659-0.09l0.509-1.438l0.09-0.599l0.359,0.299
  17956. l1.079-0.779l-0.21-0.778l-0.629-0.24l-0.27-0.629l-2.906-0.449l-0.27,0.21l-0.18,0.839l-0.929,0.898l0.225,0.959l-0.284,0.479
  17957. l-1.229,0.39l0.18,0.509l-0.449,0.869l-1.139,0.629l-1.229-0.149l-0.149-0.33H6.636l0.21-0.479h0.419l0.24-0.778H7.146
  17958. l0.479-0.689l1.139-1.168l0.39,0.239l0.269-0.12l0.09-0.329l0.299-0.21l-0.299-0.809l0.149-0.45h0.419l0.18-0.269l-0.299-0.54
  17959. l0.479-0.509l-0.509-0.449l-0.24-0.39l0.09-0.689l0.869-0.33l-0.09-0.958l0.419-1.349l-0.299-0.3l-0.959,0.3l-0.359-0.27
  17960. l0.299-2.396l-0.509-0.659l0.239-0.39l0.12-1.318l-0.12-0.629l1.618-2.067l0.899-1.468l0.569-0.24l-0.27-1.198l0.27-0.419h0.359
  17961. l-0.24-0.36l0.18-0.539l0.209-0.329v-1.169l0.629-1.617l1.138-1.408h0.719l0.27-0.539v-1.139l-0.18-1.139l-0.689-1.828
  17962. l0.898-1.108L16.972,372.84 M16.972,371.84c-0.096,0-0.193,0.014-0.287,0.042l-1.199,0.359c-0.192,0.058-0.363,0.172-0.49,0.328
  17963. l-0.898,1.108c-0.224,0.276-0.284,0.65-0.159,0.982l0.653,1.732l0.151,0.96v0.6c-0.298,0.003-0.579,0.14-0.767,0.371
  17964. l-1.138,1.408c-0.064,0.08-0.117,0.17-0.154,0.267l-0.629,1.617c-0.045,0.115-0.068,0.238-0.068,0.362v0.878l-0.053,0.083
  17965. c-0.043,0.069-0.079,0.143-0.104,0.22l-0.18,0.539c-0.021,0.061-0.035,0.122-0.043,0.184l-0.239,0.372
  17966. c-0.145,0.226-0.193,0.499-0.135,0.761l0.092,0.407c-0.107,0.077-0.198,0.175-0.268,0.289l-0.87,1.419l-1.583,2.022
  17967. c-0.178,0.228-0.249,0.521-0.195,0.804l0.094,0.491l-0.086,0.944l-0.117,0.19c-0.217,0.354-0.193,0.806,0.061,1.135l0.257,0.333
  17968. l-0.248,1.987c-0.044,0.356,0.105,0.709,0.392,0.924l0.359,0.27c0.148,0.111,0.322,0.178,0.501,0.195l-0.018,0.057
  17969. c-0.039,0.126-0.053,0.259-0.041,0.391l0.019,0.2l-0.157,0.06c-0.345,0.131-0.589,0.44-0.637,0.806l-0.09,0.689
  17970. c-0.03,0.227,0.02,0.458,0.14,0.653l0.229,0.372c-0.085,0.168-0.121,0.355-0.104,0.542c-0.113,0.109-0.201,0.246-0.253,0.402
  17971. l-0.149,0.45c-0.061,0.185-0.067,0.382-0.019,0.568c-0.184,0.041-0.358,0.135-0.497,0.277l-1.139,1.168
  17972. c-0.039,0.04-0.074,0.082-0.105,0.128l-0.479,0.689c-0.131,0.188-0.19,0.412-0.177,0.633c-0.091,0.088-0.165,0.194-0.218,0.314
  17973. l-0.21,0.479c-0.135,0.31-0.105,0.666,0.079,0.948c0.185,0.283,0.5,0.453,0.837,0.453h0.276c0.16,0.177,0.379,0.293,0.622,0.323
  17974. l1.229,0.148c0.04,0.006,0.081,0.008,0.121,0.008c0.168,0,0.335-0.043,0.483-0.125l1.139-0.629
  17975. c0.173-0.096,0.314-0.24,0.405-0.416l0.449-0.869c0.047-0.092,0.08-0.188,0.097-0.288l0.366-0.116
  17976. c0.234-0.074,0.433-0.232,0.558-0.443l0.284-0.479c0.131-0.222,0.172-0.486,0.113-0.738l-0.095-0.406l0.521-0.504
  17977. c0.143-0.138,0.241-0.315,0.283-0.51l0.034-0.159l1.643,0.254l0.051,0.119c0.02,0.048,0.044,0.094,0.071,0.137
  17978. c-0.036,0.01-0.072,0.021-0.107,0.034c-0.337,0.129-0.58,0.429-0.633,0.786l-0.076,0.504l-0.274,0.773l-0.055,0.007
  17979. c-0.316,0.043-0.592,0.234-0.744,0.515c-0.152,0.281-0.161,0.617-0.024,0.905l0.27,0.568c0.167,0.353,0.521,0.571,0.903,0.571
  17980. c0.051,0,0.103-0.004,0.155-0.012l0.126-0.02l0.218,0.18c0.002,0.199,0.063,0.396,0.18,0.563l0.209,0.301
  17981. c0.191,0.272,0.5,0.427,0.82,0.427c0.103,0,0.206-0.016,0.307-0.049l1.019-0.329c0.106-0.033,0.205-0.085,0.293-0.151
  17982. l0.299-0.225l0.042,0.014c0.103,0.034,0.21,0.052,0.317,0.052c0.068,0,0.136-0.007,0.204-0.021l0.449-0.094l0.753,0.52
  17983. l0.592,0.867l0.083,0.788l-0.025,0.014h-0.798c-0.405,0-0.771,0.244-0.925,0.619l-0.209,0.509
  17984. c-0.161,0.392-0.058,0.843,0.258,1.126l0.259,0.232l0.008,0.154c0.018,0.342,0.21,0.651,0.509,0.819l1.229,0.689
  17985. c0.151,0.085,0.32,0.128,0.489,0.128c0.042,0,0.083-0.003,0.124-0.008l0.618,0.653c0.195,0.206,0.46,0.313,0.727,0.313
  17986. c0.205,0,0.411-0.063,0.587-0.191l0.103-0.074l0.44-0.036c0.268-0.022,0.515-0.151,0.686-0.357l0.3-0.36
  17987. c0.041-0.049,0.076-0.101,0.106-0.155l1.791-0.053c0.384-0.012,0.728-0.242,0.884-0.594l0.14-0.315l0.309-0.05l0.377,0.145
  17988. c0.115,0.043,0.236,0.065,0.357,0.065c0.104,0,0.207-0.016,0.307-0.048l0.792-0.256l0.87-0.188l0.857,0.148l0.67,0.715
  17989. c0.191,0.205,0.457,0.316,0.729,0.316c0.088,0,0.176-0.012,0.263-0.035l0.659-0.18c0.435-0.119,0.737-0.514,0.737-0.965v-0.313
  17990. l0.387-0.441l0.926-0.236l0.803,0.515c0.162,0.104,0.349,0.158,0.54,0.158c0.029,0,0.057-0.001,0.086-0.004l0.689-0.06
  17991. c0.163-0.014,0.32-0.067,0.458-0.157l0.509-0.33c0.185-0.12,0.326-0.298,0.399-0.506l0.18-0.509
  17992. c0.13-0.368,0.034-0.778-0.246-1.05l-0.776-0.755v-0.057c0-0.362-0.196-0.696-0.512-0.873l-0.499-0.278l-0.005-0.01l0.014-0.058
  17993. l0.173-0.148c0.196-0.169,0.32-0.406,0.344-0.663l0.044-0.45l0.71-0.462l0.007-0.002v0.158c0,0.228,0.077,0.447,0.219,0.625
  17994. l0.359,0.449c0.193,0.242,0.483,0.375,0.781,0.375c0.115,0,0.231-0.02,0.344-0.061l0.899-0.329
  17995. c0.394-0.145,0.656-0.52,0.656-0.939v-0.322l0.336-0.494c0.113-0.166,0.173-0.362,0.173-0.563v-0.692l0.208-0.417l1.721-0.302
  17996. c0.106-0.02,0.209-0.055,0.304-0.106l1.049-0.569c0.138-0.075,0.256-0.181,0.345-0.31l0.27-0.391l0.609-0.051
  17997. c0.431-0.035,0.79-0.345,0.89-0.766l0.149-0.63c0.031-0.129,0.035-0.264,0.013-0.395l-0.12-0.719
  17998. c-0.045-0.271-0.2-0.513-0.429-0.666c-0.167-0.111-0.361-0.17-0.558-0.17c-0.074,0-0.148,0.008-0.221,0.024l-0.306,0.069
  17999. l-0.792-0.404l-0.081-0.162l-0.095-0.331c-0.088-0.309-0.32-0.557-0.623-0.665l-0.749-0.27c-0.109-0.04-0.224-0.06-0.339-0.06
  18000. c-0.028,0-0.055,0.001-0.083,0.004l-0.793,0.065l-0.344-0.177l-0.04-0.249c-0.046-0.286-0.214-0.539-0.46-0.691l-0.737-0.457
  18001. l-0.259-0.303c-0.149-0.174-0.353-0.291-0.578-0.333l-0.64-0.118l-0.63-0.363c-0.153-0.089-0.326-0.134-0.5-0.134
  18002. c-0.102,0-0.205,0.016-0.304,0.048l-0.557,0.178l0.061-0.83c0.019-0.255-0.062-0.508-0.223-0.706l-0.27-0.33
  18003. c-0.194-0.238-0.481-0.367-0.775-0.367c-0.135,0-0.271,0.027-0.4,0.084l-0.479,0.21c-0.156,0.068-0.291,0.175-0.394,0.309
  18004. l-0.999-0.662l-0.302-0.536l-0.021-0.654c-0.005-0.167-0.053-0.33-0.138-0.474l-0.3-0.51c-0.18-0.306-0.507-0.493-0.862-0.493
  18005. h-0.396l-0.172-0.11c-0.162-0.104-0.35-0.159-0.541-0.159c-0.064,0-0.128,0.006-0.192,0.019l-0.815,0.159
  18006. c0.004-0.234-0.075-0.465-0.225-0.648l-0.798-0.98l0.002-0.023c0.028-0.394-0.177-0.767-0.525-0.953l-0.39-0.209
  18007. c-0.148-0.08-0.311-0.119-0.473-0.119c-0.146,0-0.291,0.032-0.424,0.095c-0.112-0.043-0.232-0.065-0.354-0.065
  18008. c-0.041,0-0.082,0.003-0.123,0.008l-0.734,0.091c-0.398,0.049-0.728,0.33-0.838,0.716L25.9,387.39l-0.834,0.957l-0.076,0.01
  18009. c-0.252,0.033-0.477,0.16-0.635,0.349l-0.003-0.047c-0.009-0.149-0.051-0.291-0.12-0.418c0.14-0.056,0.269-0.144,0.375-0.262
  18010. l1.049-1.168c0.348-0.388,0.34-0.978-0.019-1.356l-0.696-0.733l0.11-0.329c0.087-0.264,0.062-0.551-0.07-0.795l-0.047-0.087
  18011. l0.018-0.442c0.012-0.297-0.108-0.584-0.329-0.783c-0.185-0.167-0.424-0.258-0.67-0.258c-0.047,0-0.094,0.003-0.142,0.01
  18012. l-0.617,0.089c-0.154-0.204-0.382-0.344-0.638-0.386c-0.054-0.009-0.107-0.013-0.161-0.013c-0.25,0-0.494,0.094-0.68,0.267
  18013. c-0.005-0.015-0.011-0.029-0.017-0.043l-0.39-0.928l0.047-0.909c0.007-0.136-0.013-0.271-0.06-0.398l-0.209-0.569
  18014. c-0.023-0.063-0.053-0.124-0.089-0.182l-0.367-0.591l0.032-0.026c0.193-0.159,0.319-0.384,0.354-0.631l0.06-0.42
  18015. c0.036-0.251-0.025-0.507-0.17-0.714l-0.118-0.17c0.022-0.062,0.039-0.126,0.048-0.192l0.18-1.228
  18016. c0.029-0.199-0.002-0.402-0.09-0.583l-0.629-1.289c-0.139-0.284-0.404-0.486-0.715-0.544c-0.061-0.012-0.123-0.018-0.184-0.018
  18017. c-0.25,0-0.493,0.094-0.679,0.266l-0.097,0.09l-0.161-0.178c-0.042-0.045-0.086-0.086-0.135-0.123l-0.749-0.569
  18018. C17.401,371.91,17.188,371.84,16.972,371.84L16.972,371.84z"/>
  18019. </g>
  18020. <g>
  18021. <path fill="currentColor" d="M18.8,441.689c-0.063,0-0.125-0.012-0.185-0.035l-0.871-0.346l-0.153,0.063
  18022. c-0.061,0.024-0.125,0.037-0.19,0.037c-0.103,0-0.205-0.032-0.292-0.094l-0.778-0.559l-0.195,0.009l-0.196,0.084
  18023. c-0.063,0.027-0.13,0.041-0.197,0.041c-0.077,0-0.154-0.018-0.224-0.053l-0.222-0.111l-0.29-0.011l-0.197,0.11
  18024. c-0.075,0.042-0.159,0.064-0.245,0.064h-0.32c-0.14,0-0.273-0.059-0.367-0.161l-0.083-0.09c0,0-0.282,0.011-0.288,0.011
  18025. c-0.057,0-0.113-0.01-0.166-0.028c-0.094,0.106-0.23,0.168-0.374,0.168h-0.58c-0.123,0-0.241-0.045-0.332-0.126
  18026. c0,0-0.388-0.346-0.4-0.36l-0.217,0.111c-0.072,0.037-0.15,0.056-0.229,0.056c-0.072,0-0.144-0.016-0.211-0.047l-0.3-0.14
  18027. c-0.111-0.052-0.2-0.143-0.249-0.256l-0.559-1.299c-0.053-0.123-0.053-0.261-0.005-0.382l-0.755-0.188
  18028. c-0.125-0.031-0.233-0.109-0.302-0.219c0,0-0.358-0.57-0.366-0.586c-0.249-0.005-0.457-0.193-0.486-0.441l-0.004-0.038
  18029. l-0.556-0.211c-0.129-0.05-0.233-0.15-0.285-0.278l-0.18-0.439l-0.261-1.148l-0.3-0.209c-0.135-0.093-0.215-0.246-0.215-0.41
  18030. v-1.598c0-0.145,0.063-0.282,0.171-0.377l0.408-0.355l0.462-0.702c0.076-0.115,0.196-0.193,0.332-0.217
  18031. c0.028-0.006,0.057-0.008,0.085-0.008c0.091,0,0.181,0.024,0.259,0.072l0.329-0.212c0.044-0.029,0.094-0.051,0.145-0.063
  18032. l0.601-0.157l0.04-0.256l-0.249-0.162l-0.694-0.49c-0.111-0.078-0.186-0.199-0.206-0.335c-0.02-0.135,0.016-0.272,0.1-0.381
  18033. l0.28-0.359c0.097-0.124,0.244-0.192,0.395-0.192c0.058,0,0.116,0.01,0.173,0.031l0.209,0.077l0.343-0.122l0.162-0.162
  18034. l0.383-0.767c0.024-0.048,0.056-0.092,0.094-0.13l0.143-0.144c-0.034-0.164,0.016-0.339,0.142-0.46l0.34-0.33
  18035. c0.095-0.093,0.221-0.142,0.348-0.142c0.076,0,0.152,0.018,0.223,0.053l0.069,0.034l0.331-0.178
  18036. c0.074-0.039,0.155-0.059,0.236-0.059c0.063,0,0.125,0.012,0.185,0.035l0.399,0.159c0.11,0.044,0.202,0.126,0.257,0.231
  18037. l0.059,0.11l0.203,0.026c0.223,0.029,0.399,0.203,0.431,0.426l0.005,0.036l0.873,0.097c0.072,0.008,0.142,0.032,0.205,0.069
  18038. l0.459,0.279c0.138,0.084,0.227,0.229,0.239,0.391l0.008,0.113c0.048,0.013,0.094,0.032,0.136,0.059l0.739,0.459
  18039. c0.087,0.054,0.156,0.134,0.196,0.228l0.24,0.56c0.064,0.149,0.052,0.32-0.033,0.458l-0.02,0.031l0.419,0.191
  18040. c0.126,0.058,0.223,0.165,0.267,0.297l0.16,0.479c0.031,0.095,0.034,0.196,0.007,0.293l-0.096,0.345l0.113,0.309l0.319,0.239
  18041. l0.842,0.046l0.804-0.304l0.295-0.466l-0.071-0.186c-0.036-0.093-0.042-0.194-0.02-0.292l0.14-0.6
  18042. c0.036-0.152,0.141-0.279,0.284-0.343l0.539-0.239c0.064-0.028,0.133-0.043,0.203-0.043c0.02,0,0.559,0.063,0.559,0.063
  18043. c0.163,0.019,0.306,0.117,0.383,0.262l0.339,0.64c0.02,0.037,0.035,0.077,0.044,0.117l0.24,0.998
  18044. c0.042,0.173-0.012,0.354-0.14,0.478l-0.979,0.939l-0.216,0.286l0.022,0.125c0.043,0.241-0.096,0.478-0.327,0.559l-1.652,0.58
  18045. l-0.104,0.293l0.14,1.697l0.304,0.441l0.103-0.141c0.075-0.104,0.188-0.176,0.315-0.199l0.219-0.04
  18046. c0.03-0.005,0.06-0.008,0.09-0.008c0.107,0,0.212,0.034,0.3,0.1c0.111,0.083,0.183,0.209,0.197,0.348l0.014,0.134l0.41,0.252
  18047. c0.148,0.091,0.238,0.252,0.238,0.426v0.419c0,0.213-0.134,0.401-0.335,0.472l-0.241,0.085l-0.586,0.88
  18048. c-0.095,0.143-0.253,0.223-0.416,0.223c-0.065,0-0.132-0.013-0.195-0.04l-0.121-0.051c0.035,0.132,0.015,0.271-0.054,0.386
  18049. l0.279,0.466c0.133,0.222,0.075,0.509-0.134,0.661l-0.22,0.16C19.007,441.657,18.904,441.689,18.8,441.689z"/>
  18050. <path fill="currentColor" d="M11.829,426.589l0.399,0.159l0.18,0.34l0.459,0.06l0.06,0.42l1.258,0.14l0.459,0.279l0.04,0.54
  18051. l0.339,0.02l0.739,0.459l0.24,0.56l-0.22,0.359l0.08,0.38l0.28-0.02l0.479,0.219l0.16,0.479l-0.14,0.5l0.22,0.599l0.559,0.42
  18052. l1.099,0.06l1.059-0.399l0.52-0.818l-0.16-0.42l0.14-0.6l0.539-0.239l0.5,0.06l0.339,0.64l0.24,0.998l-0.979,0.939l-0.4,0.519
  18053. l0.06,0.34l-1.877,0.659l-0.22,0.619l0.16,1.938l0.62,0.899l0.419-0.12l0.26-0.359l0.219-0.04l0.04,0.379l0.619,0.38v0.419
  18054. l-0.399,0.14l-0.679,1.02l-0.519-0.22l-0.5,0.279l0.22,0.479l-0.2,0.18l0.479,0.799l-0.22,0.16l-1.059-0.42l-0.34,0.14
  18055. l-0.918-0.659l-0.459,0.021l-0.28,0.12l-0.319-0.16l-0.54-0.02l-0.319,0.18h-0.32l-0.24-0.26l-0.499,0.02l-0.24-0.279
  18056. l-0.299,0.419h-0.58l-0.359-0.319l-0.2-0.319l-0.619,0.319l-0.3-0.14l-0.559-1.299l0.2-0.259l-0.339-0.36l-0.959-0.239
  18057. l-0.34-0.539l0.14-0.28H8.474l-0.04-0.339l-0.839-0.319l-0.18-0.439l-0.28-1.259l-0.459-0.319v-0.919v-0.679l0.459-0.4l0.5-0.759
  18058. l0.239,0.18l0.619-0.399l0.919-0.239l0.14-0.899l-0.519-0.339l-0.679-0.479l0.28-0.359l0.379,0.14l0.619-0.22l0.3-0.3
  18059. l0.419-0.839l0.399-0.399l-0.12-0.199l0.34-0.33l0.3,0.149L11.829,426.589 M11.829,425.589c-0.163,0-0.325,0.04-0.471,0.118
  18060. l-0.125,0.066c-0.086-0.023-0.175-0.035-0.263-0.035c-0.255,0-0.506,0.098-0.697,0.282l-0.34,0.33
  18061. c-0.174,0.17-0.275,0.39-0.298,0.618c-0.072,0.074-0.132,0.158-0.179,0.251l-0.347,0.693l-0.025,0.025l-0.065,0.023l-0.041-0.015
  18062. c-0.113-0.042-0.229-0.062-0.345-0.062c-0.302,0-0.596,0.138-0.789,0.386l-0.28,0.359c-0.168,0.216-0.24,0.49-0.2,0.761
  18063. s0.189,0.513,0.413,0.671l0.316,0.223c-0.049,0.021-0.097,0.048-0.142,0.076l-0.123,0.079c-0.063-0.012-0.128-0.019-0.194-0.019
  18064. c-0.057,0-0.114,0.005-0.171,0.015c-0.272,0.048-0.512,0.205-0.664,0.436l-0.424,0.645l-0.356,0.311
  18065. c-0.218,0.189-0.343,0.465-0.343,0.754v0.679v0.919c0,0.327,0.16,0.634,0.429,0.821l0.139,0.097l0.195,0.877
  18066. c0.012,0.056,0.029,0.109,0.05,0.162l0.18,0.439c0.105,0.256,0.312,0.457,0.57,0.556l0.317,0.12
  18067. c0.112,0.259,0.329,0.459,0.595,0.55l0.256,0.406c0.137,0.218,0.354,0.375,0.604,0.438l0.361,0.09
  18068. c0.014,0.065,0.034,0.13,0.061,0.193l0.559,1.299c0.097,0.226,0.273,0.407,0.496,0.511l0.3,0.14
  18069. c0.134,0.063,0.278,0.094,0.422,0.094c0.123,0,0.246-0.022,0.362-0.068l0.152,0.135c0.183,0.163,0.419,0.253,0.664,0.253h0.58
  18070. c0.182,0,0.358-0.05,0.51-0.14c0.01,0,0.019,0,0.029,0c0.013,0,0.026,0,0.039-0.001l0.046-0.002
  18071. c0.181,0.156,0.412,0.243,0.653,0.243h0.32c0.172,0,0.341-0.044,0.49-0.129l0.074-0.041l0.041,0.001l0.125,0.063
  18072. c0.141,0.071,0.294,0.106,0.448,0.106c0.134,0,0.269-0.027,0.395-0.081l0.066-0.028l0.614,0.44
  18073. c0.172,0.124,0.377,0.188,0.583,0.188c0.117,0,0.233-0.021,0.346-0.062l0.684,0.271c0.119,0.047,0.244,0.07,0.369,0.07
  18074. c0.208,0,0.416-0.065,0.589-0.191l0.22-0.16c0.418-0.306,0.535-0.879,0.269-1.323l-0.031-0.052
  18075. c0.208-0.067,0.396-0.203,0.524-0.396l0.494-0.741l0.083-0.028c0.401-0.141,0.67-0.52,0.67-0.944v-0.419
  18076. c0-0.348-0.181-0.671-0.477-0.853l-0.207-0.127c-0.052-0.23-0.185-0.437-0.376-0.58c-0.174-0.13-0.385-0.199-0.599-0.199
  18077. c-0.06,0-0.12,0.005-0.18,0.017l-0.219,0.04c-0.054,0.01-0.107,0.024-0.159,0.042l-0.104-1.255l1.412-0.496
  18078. c0.43-0.15,0.7-0.57,0.667-1.017l0.089-0.115l0.924-0.888c0.256-0.246,0.363-0.609,0.28-0.955l-0.24-0.998
  18079. c-0.02-0.082-0.049-0.161-0.089-0.235L22,429.675c-0.153-0.289-0.439-0.485-0.765-0.524l-0.5-0.06
  18080. c-0.04-0.005-0.079-0.007-0.119-0.007c-0.139,0-0.277,0.029-0.406,0.086l-0.539,0.239c-0.287,0.127-0.497,0.381-0.568,0.687
  18081. l-0.14,0.6c-0.042,0.177-0.034,0.361,0.021,0.533l-0.073,0.115l-0.549,0.207l-0.585-0.032l-0.08-0.06l-0.007-0.019l0.053-0.189
  18082. c0.053-0.191,0.048-0.396-0.015-0.585l-0.16-0.479c-0.088-0.263-0.281-0.478-0.533-0.593l-0.035-0.017
  18083. c0.002-0.138-0.025-0.276-0.081-0.406l-0.24-0.56c-0.081-0.188-0.217-0.348-0.392-0.456l-0.678-0.421
  18084. c-0.065-0.249-0.225-0.467-0.448-0.603l-0.459-0.279c-0.125-0.076-0.264-0.123-0.409-0.14l-0.56-0.062
  18085. c-0.145-0.254-0.398-0.438-0.697-0.489c-0.111-0.153-0.263-0.272-0.44-0.343l-0.399-0.159
  18086. C12.08,425.612,11.955,425.589,11.829,425.589L11.829,425.589z"/>
  18087. </g>
  18088. <g>
  18089. <path fill="currentColor" d="M32.562,422.874c-0.166,0-0.327-0.082-0.422-0.231l-0.14-0.22c-0.051-0.08-0.079-0.173-0.079-0.269
  18090. v-0.539c0-0.118,0.042-0.231,0.117-0.321c0,0,0.427-0.509,0.431-0.513l-0.005-0.008c-0.032-0.048-0.055-0.101-0.069-0.156
  18091. l-0.08-0.319c-0.042-0.171,0.008-0.347,0.125-0.468l-0.339-0.452c-0.044-0.059-0.074-0.125-0.089-0.196l-0.08-0.379
  18092. c-0.035-0.166,0.016-0.338,0.136-0.457l0.351-0.351l0.245-0.439c0.073-0.13,0.199-0.221,0.345-0.247l0.859-0.159
  18093. c0.03-0.006,0.061-0.009,0.091-0.009c0.094,0,0.188,0.026,0.268,0.078l0.22,0.14c0.131,0.083,0.216,0.223,0.23,0.378
  18094. c0.012,0.141-0.035,0.279-0.13,0.383l0.019,0.041h0.005c0.181,0.012,0.341,0.12,0.418,0.284l0.121,0.254l0.453,0.205
  18095. c0.167,0.075,0.278,0.234,0.292,0.417l0.013,0.165l0.298,0.613c0.059,0.121,0.066,0.261,0.021,0.388
  18096. c-0.045,0.126-0.14,0.229-0.262,0.285l-0.108,0.05l-0.32,0.592c-0.061,0.113-0.163,0.198-0.285,0.238l-0.295,0.096
  18097. c-0.003,0.055-0.016,0.109-0.038,0.161c-0.06,0.144-0.184,0.251-0.334,0.29l-0.459,0.12c-0.042,0.011-0.084,0.017-0.126,0.017
  18098. c-0.068,0-0.136-0.014-0.2-0.042l-0.96,0.521C32.724,422.854,32.643,422.874,32.562,422.874z"/>
  18099. <path fill="currentColor" d="M33.959,417.641l0.22,0.14l-0.24,0.22l0.3,0.64l0.299,0.02l0.2,0.419l0.619,0.28l0.02,0.26l0.34,0.699
  18100. l-0.26,0.119l-0.399,0.739l-0.799,0.26l0.16,0.279l-0.459,0.12l-0.22-0.1l-1.178,0.639l-0.14-0.22v-0.539l0.419-0.499h0.35
  18101. l-0.149-0.38l-0.16-0.24l-0.08-0.319l0.219-0.1l0.021-0.279l-0.54-0.72l-0.08-0.379l0.4-0.399l0.279-0.5L33.959,417.641
  18102. M33.959,416.641c-0.061,0-0.122,0.006-0.182,0.017l-0.859,0.159c-0.292,0.055-0.546,0.236-0.691,0.496l-0.211,0.378
  18103. l-0.301,0.301c-0.24,0.239-0.342,0.584-0.272,0.915l0.08,0.379c0.03,0.143,0.091,0.276,0.178,0.393l0.147,0.196
  18104. c-0.055,0.172-0.063,0.359-0.017,0.545l0.066,0.266l-0.242,0.287c-0.151,0.181-0.234,0.408-0.234,0.644v0.539
  18105. c0,0.19,0.054,0.377,0.157,0.538l0.14,0.22c0.19,0.297,0.513,0.462,0.844,0.462c0.161,0,0.325-0.039,0.476-0.121l0.788-0.427
  18106. c0.044,0.006,0.089,0.009,0.133,0.009c0.085,0,0.17-0.011,0.253-0.032l0.459-0.12c0.288-0.075,0.526-0.274,0.652-0.542
  18107. l0.043-0.014c0.244-0.08,0.449-0.25,0.571-0.476l0.241-0.447c0.223-0.116,0.395-0.312,0.479-0.549
  18108. c0.091-0.254,0.076-0.533-0.042-0.775l-0.257-0.528l-0.005-0.07c-0.028-0.363-0.252-0.684-0.584-0.834l-0.286-0.13l-0.042-0.089
  18109. c-0.064-0.135-0.156-0.25-0.268-0.342c0.007-0.064,0.008-0.129,0.002-0.194c-0.027-0.31-0.197-0.589-0.459-0.756l-0.22-0.14
  18110. C34.334,416.694,34.148,416.641,33.959,416.641L33.959,416.641z"/>
  18111. </g>
  18112. <g>
  18113. <path fill="currentColor" d="M55.74,424.152c-0.097,0-0.193-0.028-0.277-0.084l-0.449-0.3c-0.107-0.071-0.183-0.182-0.211-0.308
  18114. l-0.12-0.539l-0.259-0.829l-0.326-0.605c-0.037-0.071-0.057-0.15-0.057-0.231v-0.402l-0.186-0.585l-0.33-0.646
  18115. c-0.053-0.106-0.066-0.228-0.039-0.343l0.335-1.37l-0.091-0.568l-0.292-0.557c-0.038-0.071-0.057-0.151-0.057-0.232v-0.409
  18116. l-0.206-0.288c-0.061-0.085-0.093-0.187-0.093-0.291v-0.507l-0.264-0.111c-0.196-0.083-0.318-0.28-0.305-0.492l0.03-0.479
  18117. c0.01-0.153,0.088-0.293,0.214-0.38l0.172-0.119l-1.212-0.606l-0.07,0.438c-0.012,0.075-0.041,0.146-0.085,0.209l-0.359,0.509
  18118. c-0.078,0.111-0.199,0.186-0.333,0.206c-0.025,0.004-0.05,0.006-0.075,0.006c-0.109,0-0.216-0.036-0.304-0.104l-0.059-0.045
  18119. l-0.021,0.019c-0.095,0.086-0.215,0.13-0.336,0.13c-0.09,0-0.181-0.024-0.262-0.074l-0.061-0.037l-0.47,0.451
  18120. c-0.095,0.092-0.219,0.14-0.346,0.14c-0.059,0-0.117-0.01-0.174-0.031c-0.18-0.066-0.305-0.23-0.323-0.422l-0.085-0.892
  18121. l-0.63-0.134l-1.009-0.365l-0.526,0.483c-0.059,0.054-0.129,0.093-0.205,0.113l-0.869,0.24c-0.044,0.013-0.089,0.019-0.133,0.019
  18122. c-0.092,0-0.183-0.025-0.262-0.074c-0.118-0.073-0.201-0.191-0.228-0.328l-0.15-0.749c-0.051-0.253,0.1-0.503,0.347-0.576
  18123. l0.4-0.12l0.052-0.099l-0.118-0.491l-0.175-0.299l-0.291-0.116c-0.133-0.053-0.237-0.161-0.285-0.296l-0.15-0.42
  18124. c-0.044-0.123-0.038-0.259,0.017-0.378l0.109-0.237l-0.037-0.176l-0.407-0.677c-0.1-0.166-0.095-0.374,0.013-0.535l0.44-0.66
  18125. l0.188-0.592c0.015-0.047,0.036-0.091,0.064-0.131l0.213-0.312l-0.426-0.751l-1.031-0.809c-0.12-0.095-0.19-0.238-0.191-0.391
  18126. c-0.001-0.153,0.068-0.298,0.188-0.394l0.599-0.479c0.091-0.072,0.202-0.109,0.313-0.109c0.089,0,0.178,0.023,0.257,0.071
  18127. l0.988,0.592l0.737,0.194l0.339-0.47c0.045-0.063,0.104-0.114,0.172-0.15l0.112-0.059l-0.073-0.182
  18128. c-0.051-0.128-0.047-0.271,0.011-0.396s0.165-0.221,0.295-0.265l0.54-0.18c0.052-0.017,0.105-0.025,0.158-0.025
  18129. c0.077,0,0.153,0.018,0.224,0.053l0.068,0.034l0.087-0.434c0.023-0.116,0.087-0.221,0.18-0.294l0.719-0.569
  18130. c0.092-0.073,0.202-0.108,0.31-0.108c0.144,0,0.286,0.062,0.385,0.18l0.599,0.719c0.075,0.09,0.116,0.203,0.116,0.32v0.801
  18131. l0.184,0.116l0.45,0.128l0.215-0.039c0.029-0.005,0.059-0.008,0.089-0.008c0.121,0,0.238,0.044,0.331,0.125
  18132. c0.115,0.101,0.177,0.249,0.169,0.401l-0.03,0.569l0.057,0.424c0.011,0.093-0.004,0.187-0.044,0.271l-0.303,0.647l0.556,0.575
  18133. l1.01,0.409c0.143,0.059,0.251,0.179,0.293,0.327l0.162,0.569l0.334,0.093c0.012-0.029,0.027-0.058,0.045-0.084l0.24-0.359
  18134. c0.069-0.104,0.174-0.178,0.294-0.208l0.599-0.15c0.041-0.01,0.082-0.015,0.122-0.015c0.103,0,0.202,0.031,0.284,0.088
  18135. l0.037-0.088c0.082-0.187,0.266-0.299,0.458-0.299c0.063,0,0.127,0.012,0.189,0.037l0.659,0.27
  18136. c0.125,0.052,0.225,0.151,0.275,0.277l0.3,0.749c0.067,0.167,0.039,0.357-0.074,0.498c-0.096,0.119-0.24,0.188-0.391,0.188
  18137. c-0.026,0-0.053-0.002-0.079-0.006l-0.541-0.087l-0.034,0.133c-0.027,0.108-0.089,0.205-0.178,0.273l-0.087,0.067l-0.021,0.488
  18138. c-0.009,0.212-0.152,0.396-0.356,0.457l-0.299,0.09c-0.047,0.015-0.095,0.021-0.144,0.021c-0.058,0-0.116-0.01-0.171-0.03
  18139. l-0.008,0.121l0.16,0.254c0.071-0.037,0.15-0.056,0.229-0.056c0.053,0,0.106,0.009,0.157,0.025l0.271,0.09
  18140. c0,0,0.493-0.025,0.501-0.025c0.255,0,0.471,0.193,0.497,0.449l0.03,0.299c0.025,0.253-0.143,0.485-0.391,0.539l-0.469,0.103
  18141. l-0.246,0.439v0.229c0,0.276-0.224,0.5-0.5,0.5h-0.098l0.195,0.379l0.11,0.053l0.323-0.426c0.094-0.124,0.242-0.197,0.398-0.197
  18142. h0.389c0.057,0,0.113,0.01,0.167,0.028l0.344,0.122l0.524-0.183c0.053-0.018,0.108-0.027,0.164-0.027
  18143. c0.017,0,0.92,0.093,0.92,0.093c0.06,0.006,0.118,0.022,0.172,0.05l0.659,0.329c0.057,0.028,0.108,0.067,0.15,0.115l0.115,0.129
  18144. l0.186,0.023l0.286-0.088c0.048-0.015,0.098-0.022,0.147-0.022c0.015,0,1.063,0.092,1.063,0.092
  18145. c0.182,0.016,0.341,0.13,0.414,0.298l0.209,0.479c0.06,0.136,0.056,0.291-0.011,0.424l-0.18,0.359
  18146. c-0.079,0.157-0.234,0.262-0.41,0.275c0,0-1.224,0.091-1.236,0.091c-0.026,0-0.053-0.002-0.079-0.006l-0.519-0.083l-0.023,0.02
  18147. l0.228,0.703c0.053,0.164,0.018,0.345-0.093,0.477l-0.479,0.569c-0.096,0.114-0.237,0.178-0.382,0.178
  18148. c-0.038,0-0.076-0.004-0.114-0.013l-0.247-0.058l0.234,0.448c0.081,0.155,0.075,0.342-0.017,0.492l-0.329,0.539
  18149. c-0.091,0.149-0.253,0.239-0.427,0.239c-0.015,0-0.484-0.042-0.484-0.042l-0.114,0.105l-0.144,0.602
  18150. c-0.031,0.13-0.113,0.242-0.227,0.312l-0.249,0.15l0.098,1.394l0.001,0.704c0,0.095-0.027,0.188-0.078,0.269l-0.299,0.47
  18151. c-0.07,0.11-0.178,0.186-0.3,0.217l0.041,0.238c0.034,0.197-0.053,0.396-0.22,0.504C55.93,424.125,55.835,424.152,55.74,424.152z
  18152. "/>
  18153. <path fill="currentColor" d="M49.299,401.842l0.599,0.719v1.078l0.479,0.3l0.629,0.18l0.33-0.06l-0.03,0.569l0.06,0.509l-0.449,0.959
  18154. l0.869,0.899l1.109,0.449l0.239,0.839l0.749,0.209h0.51l-0.06-0.329l0.24-0.359l0.599-0.15l0.15,0.39l-0.03,0.479l0.3-0.03
  18155. l0.149-0.659l0.21-0.479l0.659,0.27l0.3,0.749l-0.749-0.12l-0.3,0.18l-0.09,0.359l-0.27,0.21l-0.03,0.719l-0.299,0.09v-0.629
  18156. l-0.359,0.03l-0.27,0.449l-0.06,0.869l0.509,0.809l0.389-0.239l0.359,0.119l0.569-0.029l0.03,0.299l-0.689,0.15l-0.419,0.749
  18157. v0.359h-0.54l-0.24,0.27l0.509,0.988l0.629,0.3l0.569-0.749h0.389l0.509,0.18l0.689-0.239l0.869,0.09l0.659,0.329l0.24,0.27
  18158. l0.479,0.061l0.389-0.12l1.019,0.09l0.209,0.479l-0.18,0.359l-1.199,0.09l-0.749-0.119l-0.449,0.389l0.33,1.019l-0.479,0.569
  18159. l-0.898-0.21v0.689l0.329,0.63l-0.329,0.539l-0.66-0.061l-0.389,0.359l-0.18,0.75l-0.509,0.309l0.12,1.698v0.669l-0.299,0.47
  18160. l-0.479-0.061l0.149,0.869l-0.449-0.3l-0.12-0.539l-0.27-0.869l-0.36-0.688v-0.479l-0.209-0.659l-0.359-0.719l0.359-1.469
  18161. l-0.12-0.749l-0.33-0.629v-0.569l-0.299-0.419v-0.839l-0.569-0.24l0.03-0.479l0.389-0.27v-0.569l-1.678-0.839l-0.479,0.15
  18162. l-0.12,0.749l-0.359,0.509l-0.39-0.299l-0.33,0.299l-0.39-0.239l-0.749,0.719l-0.12-1.258l-0.989-0.21l-1.229-0.449l-0.749,0.688
  18163. l-0.869,0.24l-0.15-0.749l0.599-0.18l0.24-0.449l-0.18-0.749l-0.3-0.51l-0.449-0.18l-0.15-0.42l0.18-0.389l-0.089-0.42
  18164. l-0.45-0.749l0.479-0.719l0.209-0.659l0.39-0.569l-0.629-1.108l-1.109-0.869l0.599-0.479l1.049,0.629l1.138,0.3l0.54-0.749
  18165. l0.509-0.27l-0.24-0.599l0.54-0.18l0.359,0.18l0.359-0.18l0.15-0.749L49.299,401.842 M49.299,400.842
  18166. c-0.218,0-0.437,0.07-0.62,0.216l-0.719,0.569c-0.172,0.137-0.295,0.326-0.349,0.538c-0.073,0.008-0.145,0.022-0.215,0.046
  18167. l-0.54,0.18c-0.261,0.088-0.476,0.278-0.591,0.528c-0.086,0.187-0.112,0.393-0.078,0.591c-0.035,0.035-0.066,0.073-0.096,0.113
  18168. l-0.138,0.192l-0.336-0.089l-0.927-0.556c-0.159-0.096-0.337-0.143-0.514-0.143c-0.222,0-0.443,0.074-0.625,0.22l-0.599,0.479
  18169. c-0.238,0.191-0.376,0.48-0.375,0.786s0.143,0.594,0.383,0.782l0.953,0.747l0.224,0.394L44.1,406.49
  18170. c-0.055,0.08-0.098,0.169-0.128,0.262l-0.167,0.524l-0.401,0.602c-0.214,0.321-0.224,0.738-0.025,1.069l0.337,0.563l-0.028,0.061
  18171. c-0.11,0.238-0.122,0.51-0.034,0.756l0.15,0.42c0.097,0.271,0.304,0.486,0.57,0.593l0.132,0.053l0.051,0.087l0.009,0.036
  18172. l-0.018,0.005c-0.495,0.148-0.795,0.648-0.693,1.154l0.15,0.749c0.054,0.272,0.22,0.51,0.457,0.655
  18173. c0.159,0.098,0.341,0.148,0.524,0.148c0.089,0,0.179-0.012,0.267-0.036l0.869-0.24c0.153-0.042,0.293-0.12,0.41-0.228
  18174. l0.301-0.276l0.657,0.24c0.044,0.016,0.089,0.029,0.136,0.039l0.271,0.057l0.05,0.527c0.037,0.382,0.288,0.709,0.647,0.843
  18175. c0.113,0.042,0.231,0.063,0.348,0.063c0.253,0,0.503-0.097,0.692-0.278l0.233-0.224c0.07,0.015,0.142,0.022,0.213,0.022
  18176. c0.123,0,0.245-0.022,0.36-0.066c0.114,0.044,0.236,0.066,0.359,0.066c0.05,0,0.1-0.004,0.15-0.012
  18177. c0.269-0.04,0.509-0.189,0.667-0.411l0.359-0.509c0.043-0.062,0.079-0.127,0.107-0.196l0.038,0.02
  18178. c-0.041,0.099-0.065,0.205-0.072,0.314l-0.03,0.479c-0.026,0.409,0.2,0.791,0.567,0.966v0.177c0,0.208,0.065,0.412,0.187,0.581
  18179. l0.113,0.158v0.249c0,0.162,0.04,0.321,0.115,0.465l0.254,0.483l0.062,0.388l-0.311,1.273c-0.057,0.229-0.029,0.473,0.077,0.685
  18180. l0.325,0.648l0.139,0.438v0.324c0,0.161,0.039,0.32,0.114,0.463l0.318,0.608l0.23,0.743l0.111,0.499
  18181. c0.056,0.252,0.207,0.472,0.421,0.615l0.449,0.3c0.168,0.112,0.362,0.168,0.555,0.168c0.189,0,0.379-0.054,0.545-0.161
  18182. c0.305-0.198,0.476-0.545,0.453-0.903c0.066-0.06,0.126-0.129,0.175-0.207l0.299-0.47c0.103-0.16,0.157-0.347,0.157-0.537v-0.669
  18183. c0-0.023-0.001-0.047-0.002-0.07l-0.077-1.089c0.222-0.14,0.38-0.359,0.441-0.614l0.07-0.295l0.094,0.009
  18184. c0.031,0.003,0.061,0.004,0.091,0.004c0.346,0,0.671-0.18,0.854-0.479l0.329-0.539c0.133-0.219,0.176-0.476,0.127-0.719
  18185. c0.134-0.061,0.255-0.151,0.354-0.268l0.479-0.569c0.219-0.26,0.291-0.612,0.192-0.937l1.186-0.089
  18186. c0.351-0.026,0.662-0.235,0.82-0.55l0.18-0.359c0.132-0.266,0.141-0.576,0.022-0.848l-0.209-0.479
  18187. c-0.146-0.335-0.464-0.563-0.829-0.596l-1.019-0.09c-0.029-0.003-0.059-0.004-0.088-0.004c-0.1,0-0.199,0.015-0.295,0.045
  18188. l-0.111,0.034c-0.075-0.074-0.161-0.137-0.256-0.184l-0.659-0.329c-0.108-0.054-0.224-0.088-0.344-0.101l-0.869-0.09
  18189. c-0.034-0.003-0.069-0.005-0.103-0.005c-0.111,0-0.222,0.019-0.328,0.056l-0.359,0.124l-0.18-0.063
  18190. c-0.106-0.037-0.219-0.057-0.333-0.057h-0.266l0.02-0.036l0.25-0.055c0.497-0.108,0.833-0.571,0.782-1.077l-0.03-0.299
  18191. c-0.051-0.499-0.46-0.877-0.951-0.898c0.069-0.129,0.11-0.274,0.116-0.428l0.011-0.267c0.048-0.049,0.091-0.102,0.127-0.158
  18192. l0.143,0.022c0.053,0.009,0.106,0.013,0.158,0.013c0.301,0,0.589-0.136,0.781-0.375c0.225-0.281,0.281-0.662,0.147-0.996
  18193. l-0.3-0.75c-0.101-0.251-0.299-0.451-0.55-0.554l-0.659-0.27c-0.124-0.051-0.252-0.074-0.378-0.074
  18194. c-0.269,0-0.527,0.108-0.716,0.301c-0.021-0.001-0.042-0.002-0.063-0.002c-0.081,0-0.163,0.01-0.244,0.03l-0.599,0.15
  18195. c-0.188,0.047-0.357,0.147-0.488,0.288c-0.093-0.274-0.301-0.495-0.571-0.604l-0.913-0.37l-0.243-0.251l0.157-0.336
  18196. c0.079-0.168,0.109-0.355,0.087-0.54l-0.05-0.425l0.025-0.484c0.016-0.306-0.108-0.602-0.337-0.803
  18197. c-0.184-0.162-0.42-0.25-0.661-0.25c-0.059,0-0.119,0.005-0.178,0.016l-0.101,0.019l-0.159-0.046v-0.486
  18198. c0-0.234-0.082-0.461-0.232-0.641l-0.599-0.719C49.87,400.965,49.585,400.842,49.299,400.842L49.299,400.842z"/>
  18199. </g>
  18200. <g>
  18201. <path fill="currentColor" d="M70.501,426.47c-0.114,0-0.226-0.039-0.315-0.112l-0.022-0.018h-0.032c-0.164,0-0.317-0.08-0.411-0.215
  18202. l-0.25-0.359c-0.074-0.106-0.104-0.236-0.083-0.364l0.04-0.25c0.019-0.12,0.081-0.228,0.172-0.304
  18203. c0.002-0.014,0.159-0.58,0.159-0.58c0.039-0.14,0.136-0.256,0.267-0.317c0.068-0.032,0.142-0.049,0.215-0.049
  18204. c0.068,0,0.137,0.014,0.201,0.042l0.479,0.21c0.08,0.035,0.15,0.091,0.202,0.161l0.335,0.455l0.617,0.247
  18205. c0.189,0.075,0.314,0.26,0.314,0.464v0.18c0,0.149-0.067,0.291-0.182,0.386l-0.23,0.189c-0.089,0.074-0.202,0.114-0.318,0.114
  18206. h-0.096l-0.094,0.054c-0.076,0.044-0.161,0.066-0.249,0.066h-0.2c-0.048,0-0.096-0.007-0.143-0.021l-0.039-0.012
  18207. C70.838,426.438,70.518,426.47,70.501,426.47z"/>
  18208. <path fill="currentColor" d="M70.241,424.401l0.479,0.21l0.419,0.569l0.749,0.3v0.18l-0.23,0.189H71.43l-0.209,0.12h-0.2l-0.135-0.04
  18209. l-0.384,0.04l-0.16-0.13h-0.21l-0.25-0.359l0.04-0.25l0.17-0.09v-0.2L70.241,424.401 M70.241,423.401
  18210. c-0.147,0-0.293,0.032-0.429,0.097c-0.262,0.125-0.457,0.356-0.535,0.637l-0.127,0.46c-0.111,0.136-0.187,0.3-0.215,0.478
  18211. l-0.04,0.25c-0.041,0.255,0.019,0.517,0.166,0.729l0.25,0.359c0.16,0.23,0.408,0.381,0.681,0.42c0.154,0.091,0.33,0.14,0.51,0.14
  18212. c0.035,0,0.069-0.002,0.104-0.005l0.192-0.021c0.073,0.017,0.148,0.025,0.224,0.025h0.2c0.167,0,0.33-0.042,0.477-0.121
  18213. c0.219-0.008,0.429-0.088,0.598-0.228l0.23-0.189c0.23-0.189,0.364-0.473,0.364-0.771v-0.18c0-0.409-0.249-0.776-0.628-0.929
  18214. l-0.484-0.193l-0.25-0.34c-0.104-0.142-0.244-0.253-0.404-0.323l-0.479-0.21C70.514,423.43,70.378,423.401,70.241,423.401
  18215. L70.241,423.401z"/>
  18216. </g>
  18217. <g>
  18218. <path fill="currentColor" d="M84.732,435.277c-0.056,0-0.112-0.01-0.165-0.028c-0.053,0.019-0.109,0.028-0.165,0.028
  18219. c-0.085,0-0.17-0.021-0.247-0.065l-0.293-0.166c-0.048,0.015-0.099,0.022-0.149,0.022c-0.065,0-0.131-0.013-0.193-0.039
  18220. c-0.127-0.053-0.227-0.156-0.275-0.285l-0.06-0.16c-0.024-0.065-0.035-0.135-0.031-0.203c-0.126-0.023-0.239-0.095-0.315-0.199
  18221. c-0.036-0.05-0.063-0.105-0.078-0.163c0,0-0.187,0.011-0.196,0.011c-0.157,0-0.305-0.073-0.399-0.199l-0.068-0.091l-0.284,0.074
  18222. c-0.042,0.012-0.084,0.017-0.127,0.017c-0.097,0-0.193-0.028-0.274-0.082c-0.082-0.008-0.161-0.035-0.229-0.08
  18223. c-0.015,0.001-0.03,0.002-0.045,0.002c-0.081,0-0.162-0.02-0.234-0.059c-0.124-0.065-0.214-0.18-0.249-0.314l-0.042-0.161
  18224. c-0.006,0.003-0.055,0.017-0.055,0.017l-0.321,0.366c-0.09,0.103-0.217,0.164-0.353,0.17l-0.01,0.001
  18225. c-0.085,0.068-0.19,0.107-0.3,0.11l-0.285,0.008l-0.143,0.054l-0.081,0.119c-0.052,0.076-0.124,0.136-0.207,0.174l-0.147,0.067
  18226. l-0.18,0.165c-0.094,0.087-0.215,0.132-0.338,0.132c-0.068,0-0.137-0.014-0.201-0.042c-0.042-0.019-0.082-0.043-0.116-0.071
  18227. c-0.112-0.027-0.212-0.093-0.283-0.187l-0.15-0.2c-0.025-0.033-0.046-0.07-0.062-0.108l-0.097-0.234l-0.205-0.184
  18228. c-0.03-0.027-0.057-0.059-0.08-0.092l-0.11-0.162l-0.238-0.106c-0.054,0.019-0.11,0.028-0.167,0.028
  18229. c-0.117,0-0.233-0.041-0.325-0.12l-0.128-0.11l-0.035,0.002l-0.327,0.292c-0.079,0.07-0.178,0.114-0.283,0.124l-0.065,0.105
  18230. c-0.043,0.07-0.104,0.129-0.176,0.17l-0.209,0.12c-0.074,0.043-0.157,0.065-0.242,0.066c-0.089,0.081-0.207,0.13-0.336,0.13
  18231. c-0.201,0-0.473-0.12-0.551-0.306l-0.058-0.139c-0.077-0.019-0.149-0.057-0.209-0.109l-0.09-0.079
  18232. c-0.1-0.087-0.16-0.21-0.169-0.343l-0.006-0.087c-0.067-0.087-0.105-0.194-0.105-0.307v-0.119c0-0.111,0.037-0.217,0.102-0.303
  18233. c0.013-0.149,0.092-0.285,0.215-0.369c-0.112-0.036-0.208-0.111-0.27-0.209c-0.054-0.005-0.106-0.018-0.157-0.04l-0.193-0.084
  18234. l-0.041,0.005l-0.135,0.102c-0.087,0.065-0.192,0.1-0.3,0.1c-0.029,0-0.059-0.003-0.088-0.008l-0.5-0.09
  18235. c-0.202-0.036-0.362-0.192-0.402-0.394l-0.082-0.406l-0.119-0.125c-0.086-0.09-0.135-0.208-0.139-0.332l-0.004-0.156
  18236. l-0.019-0.016c-0.112-0.095-0.177-0.234-0.177-0.382v-0.239c0-0.151,0.068-0.293,0.183-0.387l-0.011-0.487l-0.126-0.275
  18237. c-0.067-0.146-0.06-0.314,0.018-0.453l0.09-0.16c0.079-0.141,0.217-0.23,0.369-0.251l0.093-0.353
  18238. c0.011-0.041,0.028-0.081,0.049-0.118l0.12-0.21c0.057-0.1,0.145-0.176,0.251-0.218l0.065-0.026l0.104-0.143
  18239. c0.096-0.131,0.247-0.205,0.404-0.205c0.051,0,0.103,0.008,0.153,0.024l0.31,0.1c0.037,0.012,0.072,0.027,0.105,0.048
  18240. l0.193,0.116l0.2-0.015l0.163-0.146c0.096-0.086,0.215-0.128,0.334-0.128c0.136,0,0.271,0.055,0.37,0.163l0.3,0.329
  18241. c0.107,0.118,0.152,0.28,0.12,0.438l-0.09,0.439c-0.021,0.104-0.075,0.197-0.153,0.269l-0.075,0.068l-0.004,0.044
  18242. c-0.006,0.078-0.031,0.153-0.072,0.22l-0.321,0.521l-0.19,0.557l0.056,0.135c0.044,0.104,0.051,0.22,0.021,0.327l0.659,0.452
  18243. c0.039,0.026,0.074,0.059,0.104,0.095l0.219,0.268l0.325,0.091l0.539,0.008l0.54-0.112l0.497-0.619
  18244. c0.033-0.041,0.073-0.077,0.119-0.106l0.342-0.221l0.011-0.029l0.008-0.234c0.003-0.097,0.034-0.19,0.089-0.27l-0.101-0.171
  18245. c-0.031-0.053-0.053-0.112-0.063-0.174l-0.09-0.56c-0.021-0.134,0.012-0.271,0.093-0.379l0.013-0.018l0.012-0.082
  18246. c0.031-0.214,0.195-0.384,0.407-0.422l0.17-0.03c0.029-0.005,0.059-0.008,0.088-0.008c0.122,0,0.24,0.045,0.333,0.127
  18247. l0.021,0.015c0.016-0.001,0.031-0.002,0.046-0.002c0.067,0,0.133,0.014,0.194,0.039c0.062-0.067,0.143-0.116,0.232-0.141
  18248. l0.18-0.05c0.045-0.013,0.09-0.019,0.134-0.019c0.201,0,0.389,0.122,0.465,0.317l0.042,0.107c0,0,0.228-0.005,0.231-0.005
  18249. c0.116,0,0.228,0.04,0.318,0.114l0.229,0.188l0.299,0.041c0.101,0.014,0.195,0.058,0.27,0.126c0,0,0.226,0.205,0.229,0.208
  18250. c0.075-0.044,0.162-0.068,0.253-0.068h0.439c0.111,0,0.218,0.037,0.304,0.104l0.184-0.021l0.359-0.173l0.266-0.159
  18251. c0.077-0.045,0.165-0.069,0.254-0.069h0.619c0.075,0,0.149,0.017,0.217,0.05l0.29,0.14l0.393,0.098l0.438,0.068
  18252. c0.112,0.018,0.214,0.073,0.291,0.157l0.542,0.596l0.093,0.05h0.194c0.164,0,0.318,0.081,0.411,0.216l0.109,0.155l0.013-0.012
  18253. c0.068-0.062,0.152-0.104,0.243-0.121l0.16-0.03l0.078-0.037c0.057-0.021,0.116-0.031,0.175-0.031
  18254. c0.077,0,0.153,0.018,0.224,0.053l0.339,0.17l0.356,0.007c0.105,0.002,0.207,0.037,0.291,0.101l0.011,0.008
  18255. c0,0,0.137-0.009,0.148-0.009c0.095,0,0.189,0.027,0.27,0.079l0.14,0.09c0.143,0.092,0.23,0.251,0.23,0.421v0.645
  18256. c0,0.12-0.043,0.236-0.122,0.327l-0.09,0.104c-0.039,0.045-0.085,0.082-0.137,0.11l-0.2,0.11
  18257. c-0.074,0.041-0.157,0.063-0.242,0.063H86.55l-0.296,0.196c0.018,0.107,0,0.218-0.051,0.315
  18258. c-0.064,0.122-0.176,0.213-0.309,0.249l-0.18,0.05c-0.044,0.013-0.089,0.019-0.134,0.019c-0.091,0-0.182-0.025-0.262-0.074
  18259. c-0.05-0.03-0.094-0.07-0.13-0.115l-0.103,0.016l-0.135,0.09l-0.354,0.434l-0.011,0.069l0.043-0.026
  18260. c0.08-0.049,0.17-0.074,0.262-0.074c0.045,0,0.091,0.006,0.136,0.019c0.135,0.038,0.247,0.132,0.31,0.257l0.06,0.119
  18261. c0.116,0.229,0.039,0.508-0.177,0.646l-0.099,0.063l0.127,0.076c0.15,0.091,0.243,0.253,0.243,0.429v0.18
  18262. c0,0.148-0.066,0.289-0.18,0.385l-0.073,0.061l-0.034,0.099c-0.057,0.162-0.193,0.284-0.36,0.322
  18263. C84.807,435.273,84.769,435.277,84.732,435.277z"/>
  18264. <path fill="currentColor" d="M73.926,426.719l0.3,0.329l-0.09,0.439l-0.22,0.2l-0.02,0.239l-0.35,0.569l-0.27,0.789l0.13,0.31
  18265. l-0.17,0.03l0.01,0.27l1.019,0.698l0.32,0.39l0.54,0.15l0.659,0.01l0.769-0.16l0.609-0.759l0.479-0.31l0.1-0.26l0.01-0.319
  18266. l0.1-0.14l-0.01-0.28l-0.17-0.289l-0.09-0.56l0.09-0.12l0.03-0.209l0.17-0.03l0.18,0.16l0.22-0.021l0.11,0.12l0.1,0.2
  18267. l0.189,0.039l0.26-0.199l-0.1-0.28l0.18-0.05l0.13,0.33l0.11,0.1l0.499-0.01l0.339,0.279l0.44,0.06l0.22,0.2l0.1,0.229l0.2,0.12
  18268. l0.23-0.04l0.07-0.239h0.439l0.1,0.13l0.529-0.061l0.435-0.209l0.304-0.18h0.619l0.29,0.14l0.479,0.13l0.489,0.079l0.599,0.659
  18269. l0.279,0.15h0.32l0.29,0.419l0.459-0.08l0.12-0.109l0.16-0.03l0.16-0.06l0.439,0.22l0.469,0.01l0.16,0.12l0.3-0.021l0.14,0.09
  18270. v0.645l-0.09,0.104l-0.2,0.11H86.4l-0.739,0.489l0.1,0.29l-0.18,0.05l-0.05-0.25l-0.629,0.1l-0.29,0.19l-0.489,0.599l-0.07,0.46
  18271. l0.09,0.479l0.149,0.11l0.599-0.369l0.06,0.119l-0.609,0.39l0.299,0.39l0.35,0.21v0.18l-0.18,0.149l-0.08,0.229l-0.15-0.149
  18272. l-0.18,0.149l-0.509-0.289l-0.18,0.08l-0.06-0.16l0.04-0.16h0.12v-0.13l-0.24-0.189l-0.33-0.04l0.06-0.3l-0.239-0.09l-0.5,0.03
  18273. l-0.15-0.199l-0.229-0.131l-0.5,0.131l-0.09-0.091l-0.14,0.011l-0.15-0.14l-0.17,0.06l-0.05-0.189v-0.51l-0.12-0.149l-0.23,0.02
  18274. l-0.279,0.319l-0.18,0.05l-0.419,0.479l-0.209,0.01l-0.09,0.101l-0.369,0.01l-0.37,0.14l-0.17,0.25l-0.22,0.1l-0.239,0.22v-0.159
  18275. l-0.1-0.04l-0.1,0.1l-0.15-0.2l-0.14-0.339l-0.29-0.26l-0.189-0.28l-0.58-0.259l-0.16,0.079l-0.279-0.239l-0.41,0.02l-0.459,0.41
  18276. h-0.229l-0.21,0.339l-0.209,0.12l-0.33-0.02v0.149h-0.09l-0.109-0.26v-0.17h-0.29l-0.09-0.079l-0.02-0.29l-0.09-0.07v-0.119
  18277. l0.09-0.05l0.01-0.21l0.12-0.07l0.17-0.359v-0.29l-0.1-0.169h-0.32v-0.15l-0.229-0.159l-0.15,0.079l-0.32-0.14l-0.309,0.04
  18278. l-0.24,0.18l-0.5-0.09l-0.11-0.549l-0.22-0.229l-0.01-0.38l-0.189-0.16v-0.239l0.189-0.12l-0.02-0.869l-0.17-0.369l0.09-0.16
  18279. l0.209,0.07l0.14-0.189l0.16-0.6l0.12-0.21l0.2-0.079l0.189-0.26l0.31,0.1l0.33,0.199l0.529-0.039L73.926,426.719
  18280. M72.468,425.719c-0.313,0-0.616,0.147-0.808,0.411l-0.022,0.03c-0.179,0.088-0.329,0.228-0.428,0.402l-0.12,0.21
  18281. c-0.043,0.075-0.076,0.154-0.098,0.237l-0.027,0.102c-0.159,0.087-0.294,0.219-0.388,0.386l-0.09,0.16
  18282. c-0.157,0.279-0.17,0.616-0.036,0.907l0.083,0.181l0.004,0.188c-0.115,0.165-0.179,0.364-0.179,0.571v0.239
  18283. c0,0.22,0.072,0.431,0.202,0.603c0.015,0.235,0.112,0.458,0.276,0.629l0.019,0.02l0.053,0.264
  18284. c0.081,0.402,0.399,0.715,0.803,0.788l0.5,0.09c0.059,0.011,0.118,0.016,0.177,0.016c0.118,0,0.235-0.021,0.345-0.062
  18285. c-0.043,0.113-0.067,0.235-0.067,0.36v0.119c0,0.165,0.041,0.324,0.116,0.467c0.026,0.249,0.146,0.48,0.335,0.646l0.09,0.079
  18286. c0.049,0.043,0.102,0.081,0.158,0.113c0.166,0.344,0.515,0.564,0.9,0.564h0.09c0.193,0,0.373-0.055,0.526-0.149
  18287. c0.105-0.021,0.207-0.059,0.301-0.113l0.209-0.12c0.121-0.069,0.227-0.163,0.309-0.275c0.108-0.043,0.21-0.105,0.299-0.185
  18288. l0.043-0.038c0.137,0.067,0.288,0.102,0.439,0.102c0.028,0,0.056-0.001,0.084-0.004l0.016,0.023
  18289. c0.046,0.068,0.1,0.13,0.161,0.185l0.121,0.108l0.053,0.128c0.032,0.077,0.074,0.15,0.124,0.218l0.15,0.2
  18290. c0.117,0.156,0.276,0.273,0.457,0.34c0.044,0.028,0.092,0.054,0.141,0.075c0.129,0.058,0.266,0.085,0.402,0.085
  18291. c0.246,0,0.488-0.091,0.676-0.264l0.122-0.111l0.074-0.033c0.152-0.069,0.284-0.175,0.384-0.308l0.138-0.003
  18292. c0.165-0.005,0.324-0.05,0.464-0.129c0.17-0.033,0.329-0.109,0.46-0.223c0.049,0.04,0.102,0.075,0.158,0.104
  18293. c0.122,0.065,0.255,0.104,0.39,0.114c0.06,0.026,0.123,0.046,0.187,0.061c0.137,0.067,0.289,0.103,0.442,0.103
  18294. c0.081,0,0.162-0.01,0.242-0.029c0.154,0.127,0.344,0.206,0.544,0.225c0.067,0.081,0.147,0.151,0.235,0.207
  18295. c0.003,0.009,0.006,0.018,0.009,0.027l0.06,0.16c0.097,0.258,0.296,0.465,0.55,0.571c0.124,0.052,0.255,0.077,0.386,0.077
  18296. c0.018,0,0.036,0,0.054-0.002l0.141,0.081c0.154,0.087,0.324,0.13,0.494,0.13c0.055,0,0.11-0.005,0.165-0.014
  18297. c0.054,0.009,0.109,0.014,0.165,0.014c0.075,0,0.149-0.008,0.224-0.025c0.324-0.074,0.589-0.305,0.709-0.613
  18298. c0.208-0.189,0.327-0.458,0.327-0.74v-0.18c0-0.19-0.054-0.373-0.152-0.529c0.143-0.276,0.154-0.614,0.005-0.91l-0.01-0.02
  18299. c0.004-0.002,0.009-0.003,0.014-0.004l0.18-0.05c0.266-0.074,0.49-0.254,0.618-0.498c0.041-0.078,0.071-0.161,0.09-0.245h1.9
  18300. c0.169,0,0.335-0.043,0.483-0.125l0.2-0.11c0.104-0.057,0.196-0.132,0.273-0.221l0.09-0.104c0.157-0.182,0.244-0.414,0.244-0.654
  18301. v-0.645c0-0.341-0.173-0.658-0.46-0.842l-0.14-0.09c-0.161-0.104-0.349-0.158-0.54-0.158c-0.008,0-0.016,0-0.024,0
  18302. c-0.129-0.063-0.27-0.097-0.415-0.1l-0.244-0.005l-0.238-0.119c-0.14-0.07-0.293-0.105-0.447-0.105
  18303. c-0.118,0-0.236,0.021-0.35,0.063l-0.08,0.029l-0.076,0.015c-0.006,0.001-0.013,0.003-0.02,0.004
  18304. c-0.181-0.16-0.416-0.251-0.663-0.251h-0.02l-0.438-0.482c-0.152-0.167-0.357-0.278-0.581-0.314l-0.438-0.07l-0.339-0.093
  18305. l-0.206-0.099c-0.136-0.065-0.284-0.1-0.435-0.1h-0.619c-0.179,0-0.354,0.048-0.509,0.139l-0.267,0.158l-0.207,0.1
  18306. c-0.121-0.051-0.251-0.077-0.385-0.077h-0.439c-0.042,0-0.084,0.003-0.126,0.008l-0.02-0.018
  18307. c-0.15-0.137-0.338-0.225-0.539-0.252l-0.158-0.021l-0.12-0.099c-0.159-0.131-0.354-0.209-0.557-0.225
  18308. c-0.187-0.265-0.493-0.423-0.816-0.423c-0.089,0-0.179,0.012-0.268,0.036l-0.18,0.05c-0.068,0.019-0.133,0.045-0.194,0.077
  18309. c-0.151-0.087-0.323-0.133-0.498-0.133c-0.058,0-0.117,0.005-0.175,0.016l-0.17,0.03c-0.415,0.074-0.738,0.399-0.81,0.813
  18310. c-0.114,0.198-0.158,0.431-0.122,0.659l0.09,0.56c0.017,0.105,0.05,0.207,0.099,0.301c-0.018,0.069-0.028,0.141-0.031,0.213
  18311. l-0.132,0.086c-0.09,0.058-0.17,0.13-0.237,0.214l-0.385,0.479l-0.31,0.064l-0.419-0.006l-0.111-0.031l-0.12-0.146
  18312. c-0.06-0.072-0.13-0.137-0.208-0.19l-0.431-0.295c-0.009-0.075-0.027-0.15-0.054-0.223l0.111-0.325l0.292-0.475
  18313. c0.053-0.087,0.093-0.182,0.118-0.279c0.126-0.135,0.213-0.302,0.25-0.483l0.09-0.439c0.064-0.313-0.025-0.638-0.241-0.874
  18314. l-0.3-0.329c-0.197-0.216-0.468-0.326-0.74-0.326c-0.229,0-0.458,0.078-0.645,0.235c-0.062-0.036-0.128-0.065-0.197-0.088
  18315. l-0.31-0.1C72.674,425.734,72.57,425.719,72.468,425.719L72.468,425.719z"/>
  18316. </g>
  18317. <g>
  18318. <path fill="currentColor" d="M103.527,447.321c-0.135,0-0.265-0.055-0.359-0.152l-0.543-0.56l-0.258-0.101l-0.742-0.466h-0.835
  18319. c-0.152,0-0.295-0.069-0.39-0.188l-0.399-0.499c-0.047-0.059-0.08-0.127-0.097-0.2l-0.12-0.52
  18320. c-0.015-0.063-0.017-0.13-0.006-0.194l0.104-0.627l-0.075-0.361l-1.234-1.44l-0.879-0.72l-1.66-1.022h-0.748l-0.426,0.236
  18321. c-0.074,0.041-0.157,0.063-0.242,0.063H94.2l-0.071,0.077c-0.098,0.108-0.233,0.163-0.369,0.163c-0.116,0-0.233-0.04-0.328-0.122
  18322. l-0.3-0.26c-0.168-0.146-0.22-0.387-0.125-0.589l0.06-0.129l-0.015-0.05l-0.463-0.514l-0.475-0.377l-0.794-0.202l-0.205,0.05
  18323. l-0.145,0.375c-0.075,0.192-0.26,0.319-0.466,0.319h-0.719c-0.089,0-0.175-0.023-0.25-0.066c-0.074,0.042-0.16,0.066-0.25,0.066
  18324. h-0.709c-0.092,0-0.182-0.025-0.26-0.073l-0.689-0.42c-0.13-0.079-0.217-0.213-0.236-0.364l-0.03-0.242l-0.096-0.206
  18325. c-0.078-0.014-0.153-0.045-0.217-0.093l-0.799-0.599c-0.096-0.072-0.162-0.175-0.188-0.291l-0.163-0.06
  18326. c-0.075-0.027-0.142-0.072-0.196-0.131l-0.24-0.26c-0.104-0.112-0.151-0.267-0.126-0.417l0.14-0.879
  18327. c0.013-0.081,0.045-0.157,0.094-0.222l0.659-0.878c0.025-0.033,0.053-0.063,0.085-0.089l0.125-0.101
  18328. c-0.082-0.225,0.008-0.479,0.217-0.602l0.24-0.141l0.541-0.229l0.831-0.407c0.069-0.034,0.145-0.051,0.22-0.051
  18329. c0.056,0,0.111,0.009,0.165,0.028c0.126,0.044,0.229,0.137,0.287,0.257l0.466,0.979l0.915,0.142l0.453-0.156l-0.192-0.722
  18330. c-0.011-0.041-0.017-0.085-0.017-0.128v-0.285l-0.172-0.252c-0.057-0.083-0.087-0.182-0.087-0.282v-0.419
  18331. c0-0.276,0.224-0.5,0.5-0.5h0.019v-0.06c0-0.276,0.224-0.5,0.5-0.5h0.439c0.074,0,0.146,0.017,0.213,0.048l0.34,0.16l0.438,0.229
  18332. c0.059,0.03,0.111,0.072,0.153,0.124l0.19,0.23l0.926-0.183c0.032-0.007,0.064-0.01,0.097-0.01c0.123,0,0.243,0.046,0.336,0.13
  18333. l0.071,0.064c0.085-0.062,0.188-0.095,0.292-0.095c0.035,0,0.071,0.004,0.106,0.012l0.279,0.061
  18334. c0.128,0.027,0.24,0.104,0.312,0.214l0.339,0.516l0.315,0.141c0.053,0.023,0.101,0.057,0.143,0.097l1.289,1.238l0.542,0.666
  18335. c0.082,0.102,0.121,0.231,0.108,0.361l-0.017,0.175l0.042,0.04l0.348,0.043l0.518-0.21l0.458-0.27l0.396-0.209
  18336. c0.073-0.038,0.153-0.058,0.233-0.058c0.082,0,0.163,0.02,0.236,0.06c0.147,0.079,0.245,0.226,0.261,0.391l0.02,0.2
  18337. c0.012,0.125-0.022,0.25-0.098,0.35l-0.2,0.266l-0.239,0.605l0.319,0.75c0.023,0.055,0.037,0.113,0.04,0.172l0.06,1.218
  18338. l-0.064,0.515l-0.012,0.704l0.515,0.682c0.054,0.071,0.087,0.155,0.098,0.243l0.131,1.115l0.45,0.272l1.085,0.401l1.296,0.2
  18339. l0.646-0.09c0.023-0.003,0.046-0.005,0.069-0.005c0.038,0,0.076,0.004,0.113,0.013l0.859,0.2
  18340. c0.095,0.022,0.182,0.072,0.249,0.143l0.399,0.42c0.088,0.093,0.138,0.217,0.138,0.345v0.399c0,0.157-0.074,0.306-0.2,0.399
  18341. l-0.318,0.239l-0.604,1.042c0.076,0.115,0.103,0.259,0.068,0.397l-0.1,0.399c-0.01,0.041-0.025,0.08-0.045,0.117l-0.259,0.479
  18342. c-0.06,0.11-0.159,0.194-0.278,0.234l-0.699,0.239c-0.052,0.019-0.107,0.027-0.162,0.027H103.527z"/>
  18343. <path fill="currentColor" d="M91.763,431.162l0.34,0.16l0.419,0.22l0.38,0.46l1.218-0.24l0.22,0.199l0.28,0.08l0.2-0.18l0.279,0.061
  18344. l0.419,0.639l0.449,0.2l1.289,1.238l0.5,0.619l-0.04,0.419l0.339,0.319l0.639,0.08l0.639-0.26l0.52-0.299l0.379-0.2l0.02,0.2
  18345. l-0.24,0.319l-0.34,0.858l0.4,0.939l0.06,1.218l-0.06,0.42l-0.02,0.938l0.619,0.819l0.16,1.357l0.659,0.399l1.218,0.46
  18346. l1.418,0.22l0.719-0.101l0.859,0.2l0.399,0.42v0.399l-0.399,0.3l-0.879,1.518l0.24,0.14l-0.1,0.399l-0.259,0.479l-0.699,0.239
  18347. h-0.479l-0.619-0.639l-0.359-0.14l-0.779-0.5h-0.979l-0.399-0.499l-0.12-0.52l0.12-0.719l-0.12-0.579l-1.318-1.538l-0.939-0.779
  18348. l-1.837-1.138h-1.019l-0.539,0.299h-0.64l-0.219,0.24l-0.3-0.26l0.14-0.3l-0.1-0.34l-0.54-0.599l-0.619-0.5l-1.019-0.259
  18349. l-0.579,0.14l-0.24,0.619h-0.719l0.24-0.32l-0.02-0.259l-0.299-0.04l-0.32,0.279l-0.1,0.34h-0.709l-0.689-0.42l-0.04-0.319
  18350. l-0.259-0.56h-0.24l-0.799-0.599l-0.04-0.26l-0.439-0.16l-0.24-0.26l0.14-0.879l0.659-0.878l0.419-0.34l-0.14-0.319l0.24-0.141
  18351. l0.479-0.199l0.858-0.42l0.58,1.219l1.298,0.2l0.699-0.24l0.26-0.3l-0.26-0.979v-0.439l-0.259-0.38v-0.419h0.279l0.24-0.3v-0.26
  18352. H91.763 M91.763,430.162h-0.439c-0.43,0-0.796,0.271-0.938,0.651c-0.343,0.158-0.582,0.505-0.582,0.908v0.419
  18353. c0,0.201,0.061,0.397,0.174,0.563l0.085,0.125v0.131c0,0.087,0.011,0.173,0.034,0.257l0.058,0.218l-0.413-0.063l-0.352-0.741
  18354. c-0.115-0.241-0.321-0.427-0.574-0.515c-0.107-0.037-0.218-0.056-0.33-0.056c-0.151,0-0.301,0.034-0.439,0.102l-0.831,0.406
  18355. l-0.451,0.188c-0.042,0.018-0.083,0.038-0.122,0.062l-0.24,0.141c-0.304,0.178-0.482,0.495-0.494,0.827
  18356. c-0.028,0.029-0.055,0.061-0.08,0.094l-0.659,0.878c-0.098,0.131-0.162,0.283-0.188,0.443l-0.14,0.879
  18357. c-0.048,0.303,0.045,0.61,0.253,0.836l0.24,0.26c0.098,0.105,0.217,0.189,0.35,0.244c0.067,0.115,0.156,0.216,0.265,0.297
  18358. l0.799,0.599c0.042,0.032,0.086,0.06,0.131,0.084l0.015,0.119c0.038,0.303,0.211,0.571,0.472,0.73l0.689,0.42
  18359. c0.157,0.095,0.336,0.146,0.52,0.146h0.709c0.086,0,0.169-0.011,0.25-0.031c0.081,0.021,0.164,0.031,0.25,0.031h0.719
  18360. c0.413,0,0.783-0.254,0.933-0.639l0.021-0.054l0.426,0.107l0.387,0.313l0.224,0.248c-0.099,0.366,0.017,0.763,0.311,1.018
  18361. l0.3,0.26c0.189,0.164,0.422,0.244,0.654,0.244c0.233,0,0.465-0.081,0.651-0.24h0.208c0.169,0,0.336-0.043,0.485-0.125
  18362. l0.313-0.174h0.475l1.537,0.951l0.82,0.681l1.095,1.278l0.03,0.144l-0.089,0.535c-0.021,0.129-0.018,0.261,0.012,0.389l0.12,0.52
  18363. c0.034,0.146,0.1,0.283,0.194,0.4l0.399,0.499c0.19,0.237,0.477,0.375,0.781,0.375h0.686l0.532,0.342
  18364. c0.056,0.036,0.116,0.066,0.178,0.09l0.156,0.061l0.467,0.482c0.188,0.194,0.447,0.304,0.718,0.304h0.479
  18365. c0.11,0,0.22-0.019,0.324-0.054l0.699-0.239c0.238-0.081,0.437-0.249,0.556-0.471l0.259-0.479c0.04-0.073,0.07-0.151,0.09-0.232
  18366. l0.1-0.399c0.04-0.161,0.039-0.325,0.001-0.479l0.431-0.743l0.236-0.178c0.252-0.188,0.4-0.485,0.4-0.8v-0.399
  18367. c0-0.257-0.099-0.503-0.275-0.689l-0.399-0.42c-0.135-0.142-0.308-0.24-0.498-0.284l-0.859-0.2
  18368. c-0.075-0.018-0.151-0.026-0.227-0.026c-0.046,0-0.093,0.003-0.139,0.01l-0.573,0.08l-1.17-0.182l-1.035-0.391l-0.163-0.098
  18369. l-0.103-0.873c-0.021-0.176-0.088-0.344-0.195-0.485l-0.41-0.543l0.011-0.531l0.051-0.36c0.009-0.063,0.012-0.126,0.009-0.189
  18370. l-0.06-1.218c-0.006-0.118-0.033-0.234-0.079-0.343l-0.239-0.562l0.139-0.352l0.159-0.212c0.15-0.201,0.22-0.45,0.195-0.7
  18371. l-0.02-0.2c-0.033-0.331-0.229-0.624-0.522-0.781c-0.148-0.079-0.311-0.119-0.473-0.119c-0.16,0-0.321,0.038-0.467,0.115
  18372. l-0.379,0.2l-0.492,0.282l-0.176,0.072c-0.036-0.13-0.098-0.251-0.184-0.357l-0.5-0.619c-0.026-0.033-0.055-0.063-0.085-0.093
  18373. l-1.289-1.238c-0.083-0.08-0.18-0.146-0.286-0.192l-0.182-0.081l-0.258-0.394c-0.144-0.219-0.368-0.373-0.624-0.429l-0.279-0.061
  18374. c-0.07-0.015-0.142-0.022-0.212-0.022c-0.073,0-0.146,0.008-0.218,0.024c-0.147-0.081-0.313-0.124-0.481-0.124
  18375. c-0.064,0-0.129,0.006-0.193,0.019l-0.633,0.125h0c-0.084-0.103-0.189-0.188-0.307-0.249l-0.419-0.22l-0.378-0.179
  18376. C92.056,430.194,91.91,430.162,91.763,430.162L91.763,430.162z"/>
  18377. </g>
  18378. <g>
  18379. <path fill="currentColor" d="M124.339,447.961c-0.099,0-0.198-0.029-0.282-0.087c-0.137-0.094-0.218-0.248-0.218-0.413v-0.933
  18380. l-0.033-0.051l-1.885-1.06l-0.016-0.001l-0.144,0.22c-0.048,0.074-0.116,0.134-0.195,0.174l-0.679,0.34l-0.893,0.64
  18381. c-0.086,0.061-0.188,0.092-0.289,0.092c-0.073,0-0.147-0.016-0.215-0.049l-0.82-0.391l-0.622-0.116v0.056
  18382. c0,0.153-0.07,0.298-0.191,0.393c-0.089,0.07-0.198,0.107-0.309,0.107c-0.039,0-0.079-0.005-0.117-0.014l-0.659-0.159
  18383. c-0.208-0.051-0.361-0.228-0.381-0.441l-0.12-1.318c-0.015-0.162,0.051-0.321,0.175-0.427l0.083-0.069v-0.374l-1.439-0.921
  18384. l-1.123-0.401l-0.555,0.186c-0.051,0.017-0.104,0.025-0.158,0.025c-0.008,0-1.104-0.052-1.104-0.052l-0.028,0.112
  18385. c-0.056,0.223-0.256,0.379-0.485,0.379h-0.26c-0.169,0-0.326-0.085-0.418-0.227l-0.339-0.52
  18386. c-0.029-0.044-0.051-0.093-0.064-0.145l-0.08-0.3c-0.049-0.184,0.01-0.378,0.152-0.504l0.34-0.3l0.37-0.444v-0.195l-0.1-0.287
  18387. l-0.219-0.155h-0.32c-0.132,0-0.26-0.053-0.354-0.146l-0.939-0.938c-0.051-0.051-0.09-0.112-0.115-0.18l-0.459-1.238
  18388. c-0.048-0.13-0.041-0.273,0.021-0.396l0.134-0.27l0.011-0.18l-0.19-1.122c-0.039-0.23,0.086-0.456,0.301-0.546l0.24-0.1
  18389. c0.062-0.025,0.127-0.038,0.192-0.038c0.104,0,0.207,0.032,0.293,0.095l0.401,0.291c0-0.001,0.221-0.302,0.221-0.302
  18390. c0.094-0.128,0.244-0.204,0.403-0.204h0.979c0.132,0,0.26,0.053,0.354,0.146l0.459,0.459c0.048,0.049,0.087,0.106,0.112,0.171
  18391. l0.103,0.262l0.04,0.002c0.177,0.01,0.335,0.112,0.416,0.27l0.175,0.34l0.282-0.188l0.656-0.361
  18392. c0.074-0.04,0.156-0.062,0.24-0.062h0.878c0.085,0,0.168,0.021,0.242,0.063l0.54,0.299c0.053,0.029,0.101,0.068,0.14,0.115
  18393. l0.782,0.928l0.222,0.094l0.278-0.307l0.066-0.173c0.028-0.073,0.074-0.14,0.132-0.192l0.2-0.18
  18394. c0.077-0.069,0.174-0.113,0.277-0.125l0.519-0.06c0.019-0.002,0.038-0.003,0.057-0.003c0.126,0,0.248,0.048,0.341,0.134
  18395. l0.021,0.02c0.02-0.004,0.438-0.054,0.457-0.054c0.166,0,0.322,0.082,0.416,0.222l0.12,0.18c0.03,0.046,0.053,0.095,0.067,0.146
  18396. l0.312,0.034c0.153,0.018,0.291,0.104,0.371,0.235l0.159,0.26l0.634,0.991c0.034,0.054,0.058,0.112,0.07,0.175l0.2,1.038
  18397. c0.004,0.024,0.007,0.05,0.008,0.074l0.123,0.07c0.077-0.046,0.166-0.07,0.257-0.07c0.069,0,0.14,0.015,0.207,0.045l0.439,0.2
  18398. c0.14,0.063,0.242,0.188,0.278,0.338l0.097,0.401l0.152,0.111c0.057,0.042,0.104,0.095,0.14,0.156l0.375,0.662l0.362,0.307
  18399. l0.606,0.151c0.109,0.027,0.205,0.09,0.274,0.179l0.391,0.501c0,0,0.104-0.016,0.132-0.016c0.11,0,0.218,0.036,0.306,0.104
  18400. l0.799,0.619c0.123,0.095,0.194,0.241,0.194,0.396v0.499c0,0.217-0.14,0.409-0.346,0.476l-0.558,0.181l-0.928,0.978l-0.193,1.072
  18401. c-0.031,0.171-0.148,0.313-0.31,0.377l-0.459,0.18C124.462,447.949,124.401,447.961,124.339,447.961z"/>
  18402. <path fill="currentColor" d="M111.836,435.557l0.459,0.459l0.22,0.56l0.359,0.021l0.34,0.658l0.299,0.04l0.54-0.359l0.619-0.339h0.878
  18403. l0.54,0.299l0.859,1.019l0.659,0.28l0.579-0.64l0.1-0.26l0.2-0.18l0.519-0.06l0.3,0.279l0.18-0.14l0.339-0.04l0.12,0.18
  18404. l-0.16,0.3l0.899,0.1l0.159,0.26l0.64,0.999l0.2,1.038l-0.12,0.2l0.659,0.379l-0.08,0.3h0.219l0.2-0.399l0.439,0.2l0.14,0.579
  18405. l0.3,0.22l0.419,0.739l0.519,0.439l0.719,0.18l0.279,0.359l0.3,0.379l0.339-0.06l0.799,0.619v0.499l-0.679,0.22l-1.118,1.179
  18406. l-0.22,1.219l-0.459,0.18v-1.079l-0.18-0.279l-2.097-1.179l-0.419-0.02l-0.3,0.459l-0.679,0.34l-0.958,0.679l-0.879-0.419
  18407. l-0.859-0.16l-0.419,0.08v0.499l-0.659-0.159l-0.12-1.318l0.259-0.22v-0.879l-1.717-1.099l-1.338-0.479l-0.719,0.24l-1.278-0.061
  18408. l-0.24,0.101l-0.1,0.399h-0.26l-0.339-0.52l-0.08-0.3l0.34-0.3l0.539-0.639v-0.46l-0.18-0.519l-0.479-0.34h-0.479l-0.939-0.938
  18409. l-0.459-1.238l0.18-0.36l0.02-0.339l-0.2-1.179l0.24-0.1l0.579,0.419l0.3,0.16l0.339-0.12l-0.12-0.279l0.22-0.3h0.279H111.836
  18410. M111.836,434.557h-0.699h-0.279c-0.277,0-0.54,0.115-0.727,0.313l-0.005-0.004c-0.173-0.125-0.379-0.189-0.586-0.189
  18411. c-0.13,0-0.26,0.025-0.384,0.076l-0.24,0.1c-0.43,0.179-0.68,0.632-0.602,1.091l0.181,1.066l-0.001,0.021l-0.088,0.177
  18412. c-0.123,0.247-0.139,0.535-0.042,0.794l0.459,1.238c0.05,0.135,0.129,0.258,0.23,0.359l0.939,0.938
  18413. c0.188,0.188,0.442,0.293,0.707,0.293h0.098l-0.216,0.256l-0.285,0.251c-0.285,0.251-0.402,0.642-0.305,1.008l0.08,0.3
  18414. c0.027,0.103,0.071,0.2,0.129,0.289l0.339,0.52c0.185,0.282,0.5,0.453,0.837,0.453h0.26c0.354,0,0.672-0.186,0.851-0.475
  18415. l0.719,0.034c0.016,0.001,0.032,0.001,0.047,0.001c0.107,0,0.214-0.018,0.317-0.052l0.391-0.13l0.906,0.324l1.096,0.701
  18416. c-0.143,0.194-0.212,0.438-0.19,0.684l0.12,1.318c0.039,0.426,0.345,0.78,0.761,0.881l0.659,0.159
  18417. c0.078,0.02,0.157,0.028,0.235,0.028c0.222,0,0.44-0.074,0.619-0.214c0.095-0.075,0.175-0.166,0.236-0.267l0.112,0.021
  18418. l0.761,0.362c0.137,0.065,0.284,0.098,0.43,0.098c0.204,0,0.406-0.063,0.578-0.184l0.896-0.635l0.611-0.306
  18419. c0.098-0.05,0.188-0.114,0.264-0.191l1.285,0.723v0.672c0,0.33,0.163,0.64,0.436,0.826c0.168,0.115,0.366,0.174,0.564,0.174
  18420. c0.123,0,0.247-0.022,0.364-0.068l0.459-0.18c0.324-0.127,0.558-0.412,0.62-0.754l0.167-0.925l0.737-0.777l0.437-0.142
  18421. c0.413-0.133,0.692-0.518,0.692-0.951v-0.499c0-0.31-0.143-0.601-0.387-0.79l-0.799-0.619c-0.149-0.116-0.326-0.186-0.51-0.205
  18422. l-0.231-0.297c-0.137-0.177-0.33-0.303-0.547-0.356l-0.493-0.124l-0.206-0.174l-0.332-0.584
  18423. c-0.069-0.123-0.165-0.229-0.278-0.313l-0.005-0.004l-0.054-0.224c-0.072-0.299-0.278-0.547-0.558-0.675l-0.439-0.2
  18424. c-0.122-0.056-0.249-0.084-0.375-0.089l-0.136-0.707c-0.024-0.125-0.071-0.244-0.14-0.351l-0.64-0.999l-0.149-0.243
  18425. c-0.161-0.264-0.436-0.438-0.743-0.472l-0.047-0.005l-0.09-0.136c-0.187-0.279-0.5-0.444-0.832-0.444
  18426. c-0.039,0-0.078,0.002-0.117,0.007l-0.207,0.024c-0.15-0.085-0.32-0.131-0.495-0.131c-0.038,0-0.076,0.002-0.114,0.007
  18427. l-0.519,0.06c-0.206,0.023-0.4,0.11-0.555,0.25l-0.2,0.18c-0.101,0.09-0.182,0.2-0.238,0.322l-0.525-0.623
  18428. c-0.079-0.093-0.173-0.171-0.28-0.23l-0.54-0.299c-0.148-0.082-0.315-0.125-0.484-0.125h-0.878c-0.168,0-0.333,0.042-0.48,0.123
  18429. L113.678,436c-0.114-0.154-0.27-0.271-0.447-0.339l-0.004-0.011c-0.05-0.129-0.126-0.245-0.224-0.342l-0.459-0.459
  18430. C112.355,434.662,112.101,434.557,111.836,434.557L111.836,434.557z"/>
  18431. </g>
  18432. <g>
  18433. <path fill="currentColor" d="M124.999,451.477c-0.073,0-0.146-0.016-0.213-0.048l-0.958-0.452H123.7c-0.14,0-0.273-0.059-0.368-0.162
  18434. l-0.112-0.122l-0.403-0.086c-0.165-0.036-0.301-0.152-0.362-0.31l-0.1-0.26c-0.081-0.21-0.011-0.449,0.17-0.583l0.38-0.279
  18435. l0.332-0.254c0.089-0.067,0.196-0.103,0.304-0.103c0.082,0,0.165,0.021,0.24,0.062l0.069,0.037l0.292-0.268
  18436. c0.039-0.035,0.082-0.063,0.129-0.085l0.816-0.374l0.12-0.204c0.09-0.152,0.253-0.246,0.431-0.246h0.479
  18437. c0.17,0,0.329,0.087,0.421,0.23c0.092,0.143,0.104,0.323,0.034,0.479l-0.08,0.173l0.07,0.075
  18438. c0.086,0.093,0.135,0.215,0.135,0.342v0.459c0,0.149-0.067,0.291-0.183,0.387l-0.376,0.309v0.243c0,0.101-0.03,0.199-0.087,0.282
  18439. l-0.26,0.38c-0.054,0.079-0.13,0.142-0.218,0.179l-0.379,0.16C125.131,451.464,125.064,451.477,124.999,451.477z"/>
  18440. <path fill="currentColor" d="M126.117,448.24l-0.22,0.479l0.299,0.32v0.459l-0.559,0.459v0.479l-0.26,0.38l-0.379,0.16l-1.059-0.5
  18441. h-0.24l-0.22-0.239l-0.559-0.12l-0.1-0.26l0.38-0.279l0.339-0.26l0.22,0.12h0.259l0.459-0.42l0.959-0.439l0.2-0.339H126.117
  18442. M126.117,447.24h-0.479c-0.354,0-0.682,0.188-0.861,0.492l-0.041,0.068l-0.673,0.309c-0.094,0.043-0.182,0.101-0.258,0.171
  18443. l-0.063,0.059c-0.066-0.014-0.133-0.021-0.2-0.021c-0.215,0-0.43,0.069-0.608,0.206l-0.339,0.26l-0.364,0.268
  18444. c-0.363,0.268-0.503,0.744-0.341,1.165l0.1,0.26c0.121,0.315,0.393,0.548,0.723,0.618l0.248,0.054l0.005,0.005
  18445. c0.189,0.206,0.457,0.323,0.736,0.323h0.016l0.855,0.404c0.135,0.063,0.281,0.096,0.427,0.096c0.132,0,0.265-0.026,0.389-0.079
  18446. l0.379-0.16c0.177-0.074,0.329-0.198,0.437-0.356l0.26-0.38c0.113-0.166,0.174-0.363,0.174-0.564v-0.007l0.193-0.159
  18447. c0.231-0.189,0.366-0.473,0.366-0.772v-0.459c0-0.173-0.045-0.342-0.128-0.49c0.092-0.283,0.053-0.595-0.109-0.849
  18448. C126.775,447.414,126.458,447.24,126.117,447.24L126.117,447.24z"/>
  18449. </g>
  18450. <g>
  18451. <path fill="currentColor" d="M102.568,457.938c-0.063,0-0.125-0.012-0.185-0.035l-0.399-0.159c-0.122-0.049-0.22-0.144-0.273-0.265
  18452. l-0.182-0.414l-0.561-0.141c-0.117-0.029-0.22-0.101-0.289-0.2l-0.211-0.304h-0.297c-0.046,0-0.093-0.007-0.137-0.02l-1.61-0.46
  18453. h-1.1l-1.652,0.461c-0.044,0.013-0.089,0.019-0.134,0.019c-0.108,0-0.214-0.035-0.302-0.102
  18454. c-0.125-0.095-0.198-0.242-0.198-0.398v-0.399c0-0.072,0.016-0.144,0.046-0.21l0.161-0.348l-0.186-0.617
  18455. c-0.022-0.073-0.027-0.15-0.014-0.226l0.16-0.959c0.027-0.166,0.136-0.307,0.29-0.375l0.284-0.126l0.443-0.411l0.402-0.694
  18456. l0.647-0.789c0.055-0.064,0.125-0.115,0.203-0.146l0.719-0.279c0.059-0.022,0.12-0.034,0.181-0.034
  18457. c0.067,0,0.134,0.014,0.197,0.04l0.725,0.311l1.247-0.104l1.135-0.417c0.055-0.02,0.114-0.03,0.172-0.03h0.56
  18458. c0.085,0,0.168,0.021,0.243,0.063l0.719,0.399c0.159,0.089,0.257,0.256,0.257,0.438v0.64c0,0.069-0.015,0.138-0.042,0.201
  18459. l-0.996,2.261v0.621l0.451,0.292c0.072,0.047,0.13,0.11,0.17,0.186l0.359,0.679c0.066,0.125,0.076,0.271,0.028,0.404
  18460. c-0.048,0.132-0.149,0.238-0.279,0.292l-0.33,0.137l0.077,0.662c0.021,0.175-0.053,0.348-0.193,0.455
  18461. C102.784,457.902,102.677,457.938,102.568,457.938z"/>
  18462. <path fill="currentColor" d="M102.409,450.606l0.719,0.399v0.64l-1.039,2.356v0.999l0.679,0.439l0.359,0.679l-0.679,0.28l0.12,1.038
  18463. l-0.399-0.159l-0.28-0.64l-0.799-0.2l-0.36-0.519h-0.559l-1.678-0.479h-1.238l-1.718,0.479v-0.399l0.24-0.52l-0.24-0.799
  18464. l0.16-0.959l0.36-0.16l0.559-0.519l0.439-0.76l0.599-0.719l0.719-0.279l0.839,0.359l1.438-0.12l1.198-0.439H102.409
  18465. M102.409,449.606h-0.56c-0.118,0-0.234,0.021-0.344,0.062l-1.072,0.393l-1.055,0.088l-0.61-0.261
  18466. c-0.125-0.054-0.259-0.081-0.394-0.081c-0.123,0-0.246,0.022-0.362,0.067l-0.719,0.279c-0.158,0.062-0.298,0.162-0.406,0.292
  18467. l-0.599,0.719c-0.037,0.044-0.069,0.091-0.098,0.14l-0.364,0.63l-0.327,0.304l-0.208,0.092c-0.307,0.137-0.524,0.419-0.58,0.75
  18468. l-0.16,0.959c-0.025,0.15-0.016,0.305,0.028,0.451l0.131,0.437l-0.082,0.176c-0.061,0.131-0.092,0.274-0.092,0.419v0.399
  18469. c0,0.313,0.146,0.607,0.396,0.797c0.176,0.133,0.389,0.203,0.604,0.203c0.09,0,0.18-0.012,0.269-0.037l1.585-0.442h0.961
  18470. l1.543,0.441c0.089,0.025,0.182,0.038,0.275,0.038h0.036l0.062,0.089c0.138,0.198,0.344,0.341,0.579,0.399l0.323,0.081
  18471. l0.083,0.189c0.105,0.241,0.301,0.431,0.546,0.528l0.399,0.159c0.12,0.048,0.245,0.071,0.37,0.071
  18472. c0.216,0,0.431-0.07,0.608-0.206c0.279-0.214,0.426-0.56,0.385-0.909l-0.033-0.287c0.251-0.109,0.447-0.318,0.54-0.576
  18473. c0.096-0.266,0.075-0.559-0.057-0.808l-0.359-0.679c-0.08-0.151-0.197-0.279-0.34-0.372l-0.223-0.144v-0.244l0.954-2.164
  18474. c0.056-0.127,0.085-0.265,0.085-0.403v-0.64c0-0.363-0.197-0.697-0.514-0.874l-0.719-0.399
  18475. C102.746,449.649,102.579,449.606,102.409,449.606L102.409,449.606z"/>
  18476. </g>
  18477. <g>
  18478. <path fill="currentColor" d="M182.42,462.585c-0.136,0-0.27-0.056-0.367-0.16l-0.734-0.792l-1.375-1.722l-0.284-0.095
  18479. c-0.243-0.082-0.385-0.333-0.33-0.583l0.17-0.764c0.008-0.036,0.02-0.07,0.036-0.104l0.09-0.193h-8.123
  18480. c-0.223,0-0.419-0.147-0.481-0.362l-0.123-0.43h-0.528c-0.116,0-0.228-0.04-0.318-0.114l-0.48-0.396
  18481. c-0.083-0.068-0.142-0.162-0.167-0.267l-0.368-1.499c-0.029-0.119-0.014-0.244,0.043-0.353l0.213-0.404l-0.099-1.011
  18482. l-0.116-3.682c-0.004-0.138,0.049-0.271,0.146-0.369l0.34-0.34c0.095-0.095,0.222-0.146,0.354-0.146
  18483. c0.03,0,0.06,0.003,0.089,0.008l0.934,0.17l0.433-0.004l0.021-0.103l-0.034-0.511l-0.271-0.151
  18484. c-0.123-0.068-0.211-0.185-0.243-0.321l-0.509-2.149c-0.012-0.05-0.016-0.101-0.012-0.151l0.028-0.396
  18485. c0.013-0.182,0.125-0.343,0.291-0.419c0.039-0.018,0.079-0.03,0.12-0.037l0.126-0.3l-0.052-0.095h-0.355
  18486. c-0.244,0-0.453-0.177-0.493-0.418l-0.198-1.188c-0.012-0.073-0.008-0.149,0.013-0.222l0.227-0.78l-0.09-0.793l-0.149-0.271
  18487. l-0.842-0.154c-0.064-0.013-0.126-0.037-0.182-0.073l-0.565-0.367c-0.101-0.065-0.175-0.165-0.208-0.281l-0.17-0.595
  18488. c-0.038-0.135-0.019-0.278,0.054-0.397l0.48-0.791c0.073-0.119,0.192-0.203,0.329-0.23l1.132-0.227
  18489. c0.033-0.007,0.065-0.01,0.098-0.01c0.052,0,0.104,0.008,0.153,0.024l0.127-0.209c0.059-0.098,0.15-0.172,0.257-0.21l0.7-0.255
  18490. l0.007-0.022l-0.362-0.726l-0.456-1.525c-0.027-0.091-0.027-0.187-0.001-0.277l0.351-1.231l-0.171-0.47
  18491. c-0.02-0.055-0.03-0.112-0.03-0.171v-0.396c0-0.176,0.092-0.338,0.243-0.429l0.849-0.51c0.053-0.031,0.111-0.054,0.171-0.063
  18492. l0.481-0.084c0.029-0.006,0.058-0.008,0.086-0.008c0.228,0,0.431,0.155,0.486,0.384l0.134,0.563l0.249,0.236l0.291-0.124
  18493. c0.064-0.028,0.131-0.041,0.197-0.041c0.147,0,0.292,0.065,0.389,0.186l0.065,0.08l0.605-0.449
  18494. c0.089-0.066,0.193-0.099,0.298-0.099c0.128,0,0.256,0.05,0.353,0.146l0.193,0.193l0.358,0.105
  18495. c0.213,0.063,0.359,0.258,0.359,0.479v0.03l0.026,0.013l0.488,0.023c0.155,0.007,0.297,0.086,0.386,0.213l0.138,0.197
  18496. l0.913-0.502l1.617-1.905l0.146-0.6l-0.286-0.2c-0.102-0.071-0.174-0.179-0.201-0.301l-0.007-0.031l-0.227,0.046
  18497. c-0.033,0.007-0.065,0.01-0.098,0.01c-0.092,0-0.183-0.025-0.262-0.074l-0.368-0.227c-0.148-0.091-0.238-0.252-0.238-0.426v-0.34
  18498. c0-0.208,0.128-0.394,0.323-0.468l0.183-0.069l-0.017-0.014c-0.191-0.161-0.233-0.438-0.1-0.649l0.197-0.312
  18499. c0.093-0.147,0.254-0.232,0.422-0.232c0.049,0,0.098,0.007,0.146,0.021l0.623,0.19l0.77-1.446
  18500. c0.089-0.167,0.261-0.265,0.441-0.265c0.054,0,0.109,0.009,0.163,0.027l0.368,0.127c0.202,0.069,0.337,0.26,0.337,0.473v0.37
  18501. l0.077,0.275h0.074l0.615-0.132l0.116-0.102l0.194-0.268c0.094-0.13,0.245-0.206,0.404-0.206c0.012,0,0.024,0,0.036,0.001
  18502. c0.172,0.013,0.326,0.113,0.407,0.266l0.116,0.22l0.256-0.162l0.2-0.266c0.058-0.077,0.137-0.137,0.228-0.17l0.537-0.197
  18503. c0.056-0.021,0.114-0.03,0.172-0.03c0.101,0,0.201,0.03,0.286,0.09c0.088,0.062,0.152,0.147,0.186,0.246l0.338-0.121l0.872-1.018
  18504. l-0.051-0.089c-0.106-0.187-0.083-0.419,0.059-0.58l0.425-0.481c0.095-0.107,0.231-0.169,0.375-0.169h0.509
  18505. c0.22,0,0.415,0.145,0.479,0.354l0.283,0.934c0.045,0.148,0.019,0.31-0.072,0.436l-0.237,0.333l0.187,0.323l0.853,0.415
  18506. c0.078,0.037,0.145,0.096,0.194,0.167l0.256,0.374l2.098,0.467l0.921,0.337l1.58-0.32l0.773-0.494l0.065-0.259
  18507. c0.052-0.208,0.23-0.359,0.443-0.377c0,0,0.707-0.059,0.72-0.059c0.11,0,0.217,0.036,0.305,0.104l0.368,0.283
  18508. c0.151,0.116,0.223,0.308,0.186,0.495l-0.07,0.349l0.189,0.104c0.147,0.082,0.244,0.233,0.256,0.402l0.028,0.396
  18509. c0.003,0.037,0.001,0.075-0.004,0.112c0,0,0.821-0.068,0.835-0.068c0.151,0,0.295,0.068,0.391,0.188l0.227,0.283
  18510. c0.071,0.089,0.109,0.199,0.109,0.313v0.452l-0.025,0.213l0.039,0.026l1.205,0.263c0.184,0.04,0.33,0.18,0.377,0.362l0.17,0.65
  18511. c0.038,0.145,0.009,0.299-0.08,0.42c-0.088,0.121-0.226,0.196-0.375,0.205l-0.291,0.018l-0.01,0.01l0.08,0.353
  18512. c0.043,0.189-0.027,0.387-0.18,0.506l-0.963,0.751l0.021,1.101l0.419,1.035l0.691,0.878c0.079,0.1,0.116,0.226,0.105,0.352
  18513. l-0.084,0.99c-0.003,0.043-0.013,0.086-0.027,0.127l-0.191,0.533l0.993,1.283l1.347,1.37c0.191,0.195,0.19,0.51-0.004,0.703
  18514. l-0.107,0.107v0.896c0,0.139-0.057,0.271-0.158,0.365l-0.452,0.424l-0.267,0.182v0.132c0,0.126-0.048,0.248-0.134,0.34
  18515. l-0.735,0.792c-0.087,0.095-0.208,0.151-0.337,0.159c0,0-0.5,0.029-0.51,0.029c-0.202,0-0.385-0.122-0.463-0.311l-0.255-0.622
  18516. c-0.024-0.06-0.037-0.124-0.037-0.189v-0.609l-1.754-1.705l-1.374-0.1l-0.836,0.048l-0.155,0.113l0,0.008l1.096,0.691
  18517. c0.156,0.098,0.245,0.273,0.232,0.457c-0.013,0.184-0.125,0.345-0.292,0.421l-0.222,0.102l-0.216,0.229l0.055,0.189l0.392,0.187
  18518. c0.125,0.06,0.22,0.168,0.261,0.301c0.042,0.132,0.027,0.275-0.041,0.396l-0.255,0.452c-0.054,0.096-0.137,0.17-0.236,0.214
  18519. l-0.849,0.368c-0.064,0.027-0.132,0.041-0.199,0.041c-0.096,0-0.191-0.027-0.274-0.082c-0.141-0.093-0.226-0.25-0.226-0.418
  18520. v-0.234l-0.304-0.191l-0.251-0.109c-0.054-0.024-0.104-0.06-0.146-0.102l-0.415-0.414l-0.889,0.022l-0.396,0.041l-0.658,0.463
  18521. c-0.035,0.024-0.074,0.045-0.114,0.06l-0.343,0.127l-0.097,0.211l0.648,0.256c0.14,0.055,0.248,0.17,0.293,0.313l0.136,0.426
  18522. l0.412,0.217c0.03,0.016,0.059,0.035,0.086,0.057l0.575,0.476l0.445,0.141c0.1,0.031,0.187,0.093,0.25,0.177l0.254,0.339
  18523. c0.1,0.133,0.127,0.306,0.073,0.463l-0.282,0.82c-0.031,0.089-0.086,0.168-0.161,0.228l-0.425,0.34l-0.064,0.31l0.137,0.225
  18524. l0.56,0.304c0.162,0.087,0.262,0.256,0.262,0.439v0.51c0,0.077-0.018,0.153-0.053,0.223l-0.169,0.339
  18525. c-0.074,0.149-0.217,0.251-0.382,0.273l-1.075,0.142c-0.022,0.003-0.044,0.004-0.065,0.004c-0.103,0-0.204-0.031-0.288-0.092
  18526. l-0.292-0.206l-1.209,0.308l-0.303,0.281c-0.034,0.031-0.072,0.058-0.113,0.078l-1.671,0.85l-0.918,1.295l0.121,0.896
  18527. l0.271,0.035c0.094,0.013,0.183,0.052,0.255,0.112l0.358,0.299c0,0,0.358-0.019,0.367-0.019c0.128,0,0.251,0.049,0.344,0.138
  18528. c0.1,0.094,0.156,0.226,0.156,0.362v0.282c0,0.189-0.107,0.362-0.276,0.447l-0.282,0.142c-0.07,0.034-0.146,0.053-0.224,0.053
  18529. c-0.008,0-1.161-0.053-1.161-0.053l-0.347,0.135l-4.221,3.191l0.215,0.348c0.126,0.205,0.088,0.471-0.089,0.633l-0.09,0.082
  18530. l0.012,0.05c0.057,0.228-0.052,0.464-0.262,0.568l-0.396,0.197C182.572,462.568,182.496,462.585,182.42,462.585z"/>
  18531. <path fill="currentColor" d="M188.615,423.93l0.283,0.934l-0.424,0.594l0.424,0.735l0.99,0.481l0.367,0.537l2.291,0.51l0.99,0.367
  18532. l1.81-0.367l1.019-0.651l0.113-0.452l0.679-0.057l0.368,0.283l-0.142,0.707l0.509,0.282l0.028,0.396l-0.113,0.254l0.425,0.34
  18533. l1.018-0.085l0.227,0.283v0.452l-0.057,0.453l0.368,0.254l1.301,0.283l0.17,0.65l-0.481,0.028l-0.339,0.34l0.142,0.622
  18534. l-1.16,0.905l0.028,1.442l0.48,1.188l0.735,0.934l-0.084,0.99l-0.283,0.791l1.16,1.5l1.385,1.414l-0.254,0.254v0.453v0.65
  18535. l-0.452,0.424l-0.425,0.283v0.396l-0.735,0.792l-0.48,0.028l-0.255-0.622v-0.82l-2.036-1.979l-1.556-0.113l-1.047,0.057
  18536. l-0.509,0.367l0.057,0.538l1.301,0.82l-0.312,0.142l-0.48,0.509l0.198,0.679l0.594,0.283l-0.255,0.452l-0.849,0.368v-0.51
  18537. l-0.537-0.339l-0.311-0.142l-0.566-0.565l-1.103,0.027l-0.565,0.057l-0.765,0.538l-0.537,0.198l-0.339,0.735l0.282,0.282
  18538. l0.792,0.312l0.198,0.622l0.594,0.312l0.65,0.537l0.538,0.17l0.254,0.339l-0.282,0.82l-0.566,0.452l-0.141,0.68l0.311,0.509
  18539. l0.679,0.367v0.51l-0.169,0.339l-1.075,0.142l-0.48-0.339l-1.556,0.396l-0.396,0.367l-1.781,0.905l-1.104,1.556l0.198,1.471
  18540. l0.65,0.085l0.509,0.425l0.537-0.028v0.282l-0.282,0.142l-1.244-0.057l-0.51,0.198l-4.639,3.507l0.453,0.735l-0.312,0.283
  18541. l0.085,0.34l-0.396,0.197l-0.734-0.792l-1.443-1.81l-0.424-0.142l0.17-0.764l0.424-0.905h-8.909l-0.227-0.792h-0.905l-0.48-0.396
  18542. l-0.368-1.499l0.283-0.537l-0.113-1.16l-0.113-3.648l0.34-0.34l0.934,0.17h0.933l0.113-0.565l-0.057-0.849l-0.509-0.283
  18543. l-0.509-2.149l0.028-0.396l0.339,0.254l0.028-0.537l0.227-0.537l-0.312-0.566h-0.65l-0.198-1.188l0.255-0.877l-0.113-0.99
  18544. l-0.311-0.565l-1.075-0.198l-0.565-0.367l-0.17-0.595l0.48-0.791l1.132-0.227l0.311,0.227l0.396-0.651l0.934-0.339l0.141-0.452
  18545. l-0.452-0.905l-0.424-1.442l0.396-1.387l-0.227-0.622v-0.396l0.849-0.51l0.481-0.084l0.169,0.707l0.595,0.565l0.594-0.255
  18546. l0.367,0.453l0.99-0.735l0.283,0.282l0.48,0.142v0.339l0.396,0.198l0.594,0.028l0.396,0.566l1.387-0.764l1.753-2.065l0.255-1.046
  18547. l-0.565-0.396l-0.113-0.509l-0.707,0.142l-0.368-0.227v-0.34l0.595-0.226l0.084-0.396l-0.367-0.311l0.197-0.312l1.019,0.312
  18548. l0.283-0.538l0.679-1.272l0.368,0.127v0.438l0.197,0.707h0.453l0.848-0.17l0.255-0.226l0.227-0.312l0.283,0.537h0.339
  18549. l0.537-0.339l0.255-0.34l0.537-0.197v0.537l1.104-0.396l1.188-1.386l-0.227-0.396l0.425-0.481H188.615 M188.615,422.93h-0.509
  18550. c-0.287,0-0.56,0.123-0.75,0.338l-0.425,0.482c-0.224,0.253-0.3,0.597-0.218,0.913l-0.501,0.585
  18551. c-0.008-0.005-0.016-0.011-0.023-0.017c-0.17-0.118-0.37-0.18-0.572-0.18c-0.116,0-0.233,0.021-0.345,0.062l-0.537,0.197
  18552. c-0.169,0.063-0.319,0.169-0.433,0.31c-0.158-0.131-0.354-0.212-0.565-0.227c-0.024-0.002-0.048-0.003-0.072-0.003
  18553. c-0.318,0-0.62,0.152-0.809,0.412l-0.146,0.2l-0.025,0.005v-0.056c0-0.427-0.271-0.807-0.674-0.945l-0.368-0.127
  18554. c-0.107-0.037-0.218-0.055-0.326-0.055c-0.36,0-0.705,0.196-0.882,0.529l-0.578,1.083l-0.228-0.069
  18555. c-0.097-0.03-0.195-0.044-0.292-0.044c-0.336,0-0.658,0.17-0.845,0.465l-0.197,0.312c-0.141,0.223-0.184,0.482-0.137,0.726
  18556. c-0.206,0.186-0.33,0.453-0.33,0.742v0.34c0,0.348,0.18,0.67,0.476,0.852l0.368,0.227c0.159,0.098,0.34,0.148,0.524,0.148
  18557. c0.015,0,0.03,0,0.045-0.001c0.058,0.07,0.125,0.134,0.201,0.187l0.006,0.005l-0.037,0.152l-1.481,1.745l-0.458,0.252
  18558. c-0.171-0.159-0.396-0.255-0.633-0.267l-0.14-0.007c-0.121-0.245-0.34-0.438-0.615-0.519l-0.237-0.07l-0.103-0.103
  18559. c-0.194-0.193-0.449-0.292-0.707-0.292c-0.208,0-0.417,0.065-0.596,0.197l-0.28,0.208c-0.147-0.081-0.313-0.123-0.481-0.123
  18560. c-0.104,0-0.21,0.017-0.313,0.05l-0.072-0.3c-0.109-0.457-0.517-0.768-0.972-0.768c-0.057,0-0.115,0.005-0.173,0.015
  18561. l-0.481,0.084c-0.121,0.021-0.237,0.064-0.343,0.128l-0.849,0.51c-0.301,0.181-0.485,0.506-0.485,0.857v0.396
  18562. c0,0.117,0.021,0.232,0.061,0.342l0.115,0.317l-0.306,1.075c-0.052,0.182-0.051,0.375,0.002,0.557l0.424,1.442
  18563. c0.017,0.057,0.039,0.111,0.065,0.165l0.12,0.24l-0.189,0.068c-0.195,0.071-0.364,0.201-0.481,0.372
  18564. c-0.027,0.003-0.054,0.007-0.081,0.013l-1.132,0.227c-0.274,0.055-0.513,0.223-0.658,0.461l-0.48,0.791
  18565. c-0.145,0.238-0.184,0.526-0.107,0.794l0.17,0.595c0.066,0.232,0.214,0.433,0.417,0.564l0.565,0.367
  18566. c0.11,0.071,0.234,0.121,0.363,0.145l0.598,0.11l0.065,0.574l-0.199,0.684c-0.042,0.145-0.051,0.296-0.026,0.444l0.198,1.188
  18567. c0.051,0.308,0.24,0.563,0.497,0.707c-0.08,0.133-0.128,0.284-0.14,0.443l-0.028,0.396c-0.007,0.102,0.001,0.203,0.024,0.302
  18568. l0.509,2.149c0.035,0.146,0.102,0.281,0.194,0.396l-0.456-0.082c-0.06-0.012-0.12-0.017-0.179-0.017
  18569. c-0.263,0-0.518,0.104-0.707,0.293l-0.34,0.34c-0.195,0.195-0.301,0.462-0.292,0.738l0.113,3.648
  18570. c0,0.021,0.002,0.044,0.004,0.066l0.084,0.861l-0.144,0.271c-0.114,0.217-0.145,0.468-0.086,0.705l0.368,1.499
  18571. c0.051,0.21,0.169,0.396,0.335,0.534l0.48,0.396c0.179,0.147,0.404,0.228,0.636,0.228h0.151l0.019,0.067
  18572. c0.123,0.429,0.515,0.725,0.961,0.725h7.44l-0.101,0.452c-0.111,0.5,0.173,1.003,0.659,1.165l0.144,0.048l1.259,1.579
  18573. c0.016,0.019,0.032,0.038,0.048,0.056l0.734,0.792c0.194,0.209,0.462,0.32,0.734,0.32c0.151,0,0.303-0.034,0.445-0.104
  18574. l0.396-0.197c0.342-0.171,0.551-0.517,0.555-0.885c0.258-0.313,0.301-0.758,0.101-1.119l3.803-2.875l0.183-0.071l1.033,0.047
  18575. c0.015,0.001,0.03,0.001,0.045,0.001c0.156,0,0.309-0.036,0.448-0.106l0.282-0.142c0.338-0.169,0.552-0.516,0.552-0.894v-0.282
  18576. c0-0.274-0.113-0.537-0.312-0.726c-0.187-0.177-0.433-0.274-0.688-0.274c-0.018,0-0.035,0-0.053,0.001l-0.145,0.008l-0.207-0.173
  18577. c-0.117-0.098-0.255-0.167-0.402-0.203l-0.044-0.328l0.733-1.033l1.562-0.793c0.083-0.042,0.159-0.095,0.227-0.158l0.209-0.194
  18578. l0.863-0.219l0.104,0.073c0.169,0.119,0.371,0.183,0.576,0.183c0.043,0,0.087-0.003,0.13-0.009l1.075-0.142
  18579. c0.33-0.043,0.616-0.247,0.765-0.545l0.169-0.339c0.069-0.139,0.105-0.291,0.105-0.446v-0.51c0-0.367-0.201-0.705-0.524-0.88
  18580. l-0.339-0.183l0.205-0.164c0.148-0.118,0.26-0.276,0.322-0.456l0.282-0.82c0.107-0.313,0.053-0.659-0.146-0.925l-0.254-0.339
  18581. c-0.125-0.167-0.3-0.291-0.499-0.354l-0.353-0.111l-0.5-0.414c-0.053-0.044-0.111-0.082-0.172-0.114l-0.23-0.12l-0.074-0.231
  18582. c-0.069-0.219-0.212-0.404-0.399-0.529l0.374-0.264l0.267-0.026l0.637-0.016l0.263,0.263c0.084,0.084,0.183,0.152,0.292,0.202
  18583. l0.249,0.113l0.015,0.009c0.014,0.321,0.181,0.617,0.45,0.794c0.166,0.108,0.357,0.164,0.549,0.164
  18584. c0.135,0,0.271-0.027,0.398-0.083l0.849-0.368c0.2-0.086,0.366-0.236,0.473-0.426l0.255-0.452
  18585. c0.136-0.241,0.166-0.528,0.083-0.793c-0.064-0.203-0.192-0.38-0.362-0.505c0.234-0.172,0.386-0.44,0.406-0.737
  18586. c0.021-0.312-0.104-0.61-0.331-0.813l0.651,0.047l1.472,1.432v0.397c0,0.13,0.025,0.259,0.075,0.379l0.255,0.622
  18587. c0.154,0.377,0.521,0.621,0.925,0.621c0.02,0,0.04-0.001,0.06-0.002l0.48-0.028c0.257-0.015,0.499-0.129,0.674-0.317l0.735-0.792
  18588. c0.138-0.149,0.227-0.335,0.256-0.534c0.042-0.028,0.082-0.061,0.12-0.096l0.452-0.424c0.202-0.189,0.316-0.453,0.316-0.729
  18589. v-0.65v-0.041c0.348-0.39,0.338-0.987-0.032-1.365l-1.344-1.373l-0.79-1.021l0.099-0.275c0.029-0.081,0.048-0.166,0.055-0.252
  18590. l0.084-0.99c0.021-0.253-0.054-0.505-0.211-0.704l-0.647-0.821l-0.358-0.885l-0.015-0.758l0.766-0.598
  18591. c0.257-0.201,0.397-0.512,0.384-0.831c0.194-0.065,0.366-0.19,0.489-0.359c0.176-0.242,0.234-0.551,0.158-0.841l-0.17-0.65
  18592. c-0.095-0.364-0.387-0.645-0.754-0.725l-0.825-0.18v-0.285c0-0.228-0.077-0.447-0.219-0.625l-0.227-0.283
  18593. c-0.19-0.238-0.479-0.375-0.781-0.375c-0.027,0-0.055,0.001-0.083,0.004l-0.277,0.022v-0.003
  18594. c-0.021-0.286-0.162-0.546-0.385-0.719l0-0.003c0.075-0.373-0.069-0.757-0.371-0.989l-0.368-0.283
  18595. c-0.176-0.135-0.39-0.207-0.61-0.207c-0.028,0-0.055,0.001-0.083,0.004l-0.679,0.057c-0.427,0.035-0.783,0.338-0.887,0.753
  18596. l-0.017,0.067l-0.527,0.336l-1.347,0.273l-0.723-0.268c-0.042-0.016-0.086-0.028-0.13-0.039l-1.906-0.424l-0.144-0.211
  18597. c-0.098-0.144-0.232-0.259-0.389-0.335l-0.63-0.307l0.017-0.023c0.18-0.253,0.233-0.574,0.143-0.871l-0.283-0.934
  18598. C189.444,423.218,189.055,422.93,188.615,422.93L188.615,422.93z"/>
  18599. </g>
  18600. <g>
  18601. <path fill="currentColor" d="M219.69,457.561c-0.035,0-0.071-0.004-0.107-0.012l-0.814-0.178h-1.078c-0.085,0-0.169-0.021-0.243-0.063
  18602. l-1.848-1.029h-0.398c-0.05,0-0.101-0.008-0.149-0.022l-1.696-0.528c-0.155-0.049-0.277-0.17-0.327-0.325l-0.302-0.942
  18603. c-0.049-0.152-0.022-0.318,0.072-0.447s0.244-0.205,0.404-0.205h0.302l0.156-0.295l0.281-2.212l-0.213-1.247l-0.006-0.634
  18604. l-1.683-2.297c-0.025,0.029-0.053,0.057-0.084,0.08c-0.087,0.065-0.193,0.1-0.3,0.1c-0.047,0-0.094-0.007-0.141-0.021
  18605. l-0.904-0.265c-0.078-0.022-0.149-0.063-0.207-0.12l-0.417,0.575c-0.083,0.115-0.212,0.189-0.354,0.204
  18606. c-0.017,0.002-0.034,0.003-0.051,0.003c-0.124,0-0.245-0.046-0.337-0.131l-0.868-0.792c-0.188-0.171-0.217-0.456-0.068-0.662
  18607. l0.266-0.368l-0.293-0.362l-0.407-0.097l-0.457,0.322c-0.086,0.061-0.188,0.091-0.288,0.091c-0.104,0-0.207-0.032-0.294-0.096
  18608. l-0.414-0.302c-0.223-0.163-0.272-0.476-0.11-0.698l0.206-0.283v-0.177c0-0.276,0.224-0.5,0.5-0.5h0.383l0.476-0.301l0.126-0.252
  18609. l0.408-0.62l0.271-0.55c0.086-0.171,0.26-0.276,0.447-0.276c0.027,0,0.055,0.002,0.083,0.007l0.6,0.101l0.12-0.165
  18610. c0.095-0.131,0.247-0.206,0.404-0.206c0.038,0,0.075,0.004,0.113,0.013l0.35,0.081l0.436-0.151l0.076-0.634
  18611. c0.017-0.143,0.095-0.271,0.213-0.353c0.084-0.058,0.184-0.088,0.284-0.088c0.041,0,0.082,0.005,0.122,0.015l1.056,0.265
  18612. c0.167,0.042,0.3,0.167,0.354,0.33c0.053,0.164,0.019,0.343-0.091,0.476l-0.134,0.16h0.315c0.166,0,0.321,0.082,0.414,0.22
  18613. l1.584,2.338c0.023,0.033,0.042,0.07,0.055,0.108l0.83,2.263c0.084,0.229-0.009,0.483-0.22,0.605l-0.85,0.489l0.198,0.434
  18614. l0.522,0.645l0.967,0.403l0.146-0.117c0.089-0.071,0.199-0.109,0.313-0.109c0.009,0,0.706,0.038,0.706,0.038
  18615. c0.149,0.008,0.286,0.082,0.375,0.202c0.088,0.12,0.119,0.273,0.083,0.418l-0.226,0.905c-0.028,0.111-0.093,0.21-0.186,0.279
  18616. l-0.176,0.132l0.167,0.572l0.423,0.867c0.036,0.075,0.053,0.158,0.049,0.241l-0.028,0.554l1.265,1.471
  18617. c0.024,0.028,0.045,0.06,0.063,0.092l0.679,1.282c0.072,0.136,0.077,0.297,0.015,0.438l-0.452,1.019
  18618. C220.065,457.447,219.884,457.561,219.69,457.561z"/>
  18619. <path fill="currentColor" d="M211.808,440.73l1.056,0.265l-0.565,0.679l0.565,0.302h0.565l1.584,2.338l0.83,2.263l-1.244,0.717
  18620. l0.414,0.905l0.642,0.792l1.357,0.565l0.377-0.302l0.679,0.037l-0.226,0.905l-0.453,0.34l0.265,0.905l0.452,0.942l-0.038,0.754
  18621. l1.396,1.622l0.679,1.282l-0.452,1.019l-0.867-0.189h-1.132l-1.961-1.093h-0.528l-1.696-0.528l-0.302-0.942h0.604l0.339-0.642
  18622. l0.302-2.376l-0.226-1.32v-0.716l-1.962-2.678l-0.604-0.113v0.34l-0.904-0.265l-0.34-0.503l-0.829,1.145l-0.868-0.792l0.49-0.679
  18623. l-0.641-0.792l-0.792-0.188l-0.642,0.452l-0.414-0.302l0.302-0.415v-0.339h0.527l0.717-0.452l0.188-0.378l0.377-0.565
  18624. l0.302-0.604l0.905,0.151l0.302-0.415l0.49,0.113l0.867-0.302L211.808,440.73 M211.808,439.73c-0.201,0-0.398,0.061-0.567,0.176
  18625. c-0.237,0.163-0.392,0.42-0.426,0.705l-0.039,0.323l-0.005,0.002l-0.209-0.049c-0.075-0.017-0.15-0.025-0.225-0.025
  18626. c-0.28,0-0.55,0.118-0.74,0.328l-0.302-0.051c-0.055-0.009-0.111-0.014-0.166-0.014c-0.374,0-0.723,0.21-0.894,0.553
  18627. l-0.274,0.548l-0.342,0.514c-0.023,0.035-0.044,0.071-0.063,0.108l-0.063,0.128l-0.236,0.148h-0.238c-0.552,0-1,0.447-1,1v0.014
  18628. l-0.11,0.152c-0.325,0.446-0.227,1.071,0.22,1.396l0.414,0.302c0.175,0.127,0.382,0.191,0.589,0.191
  18629. c0.202,0,0.403-0.061,0.576-0.183l0.132-0.093c-0.221,0.399-0.143,0.906,0.202,1.222l0.868,0.791
  18630. c0.185,0.169,0.426,0.262,0.674,0.262c0.034,0,0.068-0.002,0.102-0.005c0.283-0.029,0.541-0.178,0.708-0.408l0.174-0.24
  18631. l0.809,0.236c0.092,0.026,0.187,0.04,0.281,0.04c0.081,0,0.162-0.01,0.241-0.029l1.325,1.808v0.389
  18632. c0,0.057,0.005,0.112,0.014,0.168l0.201,1.174l-0.253,1.996c-0.312,0.007-0.604,0.158-0.788,0.41
  18633. c-0.188,0.259-0.242,0.591-0.145,0.895l0.302,0.942c0.099,0.311,0.344,0.553,0.655,0.65l1.696,0.528
  18634. c0.096,0.029,0.196,0.045,0.297,0.045h0.269l1.734,0.966c0.149,0.083,0.316,0.127,0.487,0.127h1.024l0.762,0.166
  18635. c0.071,0.016,0.143,0.023,0.214,0.023c0.388,0,0.75-0.228,0.914-0.595l0.452-1.019c0.125-0.28,0.113-0.602-0.03-0.873
  18636. l-0.679-1.282c-0.035-0.066-0.077-0.128-0.125-0.185l-1.135-1.318l0.018-0.354c0.009-0.167-0.025-0.333-0.097-0.483l-0.417-0.869
  18637. l-0.05-0.17c0.132-0.129,0.227-0.293,0.271-0.474l0.226-0.905c0.072-0.29,0.011-0.597-0.166-0.836
  18638. c-0.177-0.24-0.452-0.389-0.75-0.404l-0.679-0.037c-0.019-0.002-0.037-0.002-0.055-0.002c-0.189,0-0.374,0.054-0.533,0.153
  18639. l-0.584-0.243l-0.376-0.465l0.446-0.257c0.422-0.242,0.607-0.754,0.44-1.211l-0.83-2.263c-0.028-0.076-0.065-0.148-0.111-0.216
  18640. l-1.584-2.338c-0.101-0.149-0.238-0.266-0.396-0.342c0.01-0.129-0.005-0.261-0.046-0.389c-0.106-0.326-0.374-0.576-0.708-0.659
  18641. l-1.056-0.265C211.971,439.74,211.889,439.73,211.808,439.73L211.808,439.73z"/>
  18642. </g>
  18643. <g>
  18644. <path fill="currentColor" d="M208.112,460.502c-0.212,0-0.401-0.134-0.472-0.334l-0.212-0.604c-0.019-0.054-0.028-0.109-0.028-0.166
  18645. v-0.339l-0.419-0.627c-0.055-0.083-0.084-0.18-0.084-0.278v-1.396c0-0.129,0.049-0.252,0.138-0.345l0.504-0.528
  18646. c0.095-0.1,0.226-0.155,0.362-0.155c0.009,0,0.502,0.028,0.502,0.028l0.416-0.334c0.088-0.07,0.199-0.109,0.313-0.109h0.679
  18647. c0.098,0,0.193,0.028,0.274,0.082l1.207,0.792c0.083,0.055,0.148,0.133,0.187,0.224l0.302,0.717
  18648. c0.048,0.115,0.052,0.245,0.01,0.362l-0.188,0.528c-0.029,0.081-0.078,0.153-0.143,0.21l-0.511,0.442l-0.226,0.354
  18649. c-0.056,0.088-0.139,0.156-0.235,0.194l-0.591,0.236l-0.253,0.45c-0.047,0.084-0.117,0.151-0.201,0.196l-0.641,0.34
  18650. c-0.072,0.038-0.153,0.059-0.234,0.059H208.112z"/>
  18651. <path fill="currentColor" d="M209.809,455.815l1.207,0.792l0.302,0.717l-0.188,0.528l-0.565,0.49l-0.265,0.414l-0.754,0.302
  18652. l-0.34,0.604l-0.641,0.34h-0.453l-0.212-0.604v-0.49l-0.504-0.754v-1.396l0.504-0.528l0.665,0.038l0.565-0.453H209.809
  18653. M209.809,454.815h-0.679c-0.228,0-0.448,0.077-0.625,0.22l-0.266,0.213l-0.282-0.016c-0.019-0.001-0.038-0.002-0.057-0.002
  18654. c-0.272,0-0.534,0.111-0.724,0.31l-0.504,0.528c-0.177,0.187-0.276,0.434-0.276,0.69v1.396c0,0.198,0.059,0.392,0.168,0.556
  18655. l0.335,0.502v0.187c0,0.113,0.019,0.225,0.057,0.331l0.212,0.604c0.141,0.4,0.519,0.669,0.943,0.669h0.453
  18656. c0.164,0,0.324-0.04,0.469-0.116l0.641-0.34c0.169-0.09,0.309-0.227,0.403-0.394l0.167-0.296l0.427-0.171
  18657. c0.194-0.078,0.358-0.214,0.471-0.391l0.187-0.291l0.456-0.396c0.13-0.113,0.229-0.258,0.287-0.42l0.188-0.528
  18658. c0.084-0.235,0.077-0.493-0.02-0.724l-0.302-0.717c-0.077-0.184-0.207-0.34-0.373-0.448l-1.207-0.792
  18659. C210.195,454.872,210.004,454.815,209.809,454.815L209.809,454.815z"/>
  18660. </g>
  18661. <g>
  18662. <path fill="currentColor" d="M242.006,393.718c-0.086,0-0.173-0.022-0.252-0.068l-2.056-1.198c-0.088-0.052-0.159-0.129-0.202-0.222
  18663. l-0.514-1.113c-0.096-0.209-0.038-0.457,0.142-0.601l1.284-1.027c0.09-0.071,0.201-0.109,0.313-0.109
  18664. c0.053,0,0.106,0.009,0.158,0.025l1.285,0.428c0.106,0.035,0.197,0.104,0.258,0.197l1.198,1.799
  18665. c0.136,0.204,0.104,0.477-0.076,0.644l-1.198,1.112C242.251,393.672,242.129,393.718,242.006,393.718z"/>
  18666. <path fill="currentColor" d="M240.721,389.879l1.285,0.428l1.198,1.799l-1.198,1.112l-2.056-1.198l-0.514-1.113L240.721,389.879
  18667. M240.721,388.879c-0.224,0-0.445,0.075-0.625,0.219l-1.284,1.027c-0.359,0.288-0.476,0.782-0.284,1.2l0.514,1.113
  18668. c0.086,0.187,0.228,0.342,0.405,0.445l2.056,1.198c0.157,0.091,0.331,0.136,0.503,0.136c0.247,0,0.491-0.091,0.681-0.267
  18669. l1.198-1.113c0.36-0.333,0.424-0.879,0.152-1.287l-1.198-1.799c-0.123-0.185-0.305-0.324-0.516-0.395l-1.285-0.428
  18670. C240.934,388.896,240.827,388.879,240.721,388.879L240.721,388.879z"/>
  18671. </g>
  18672. <g>
  18673. <path fill="currentColor" d="M242.605,437.985c-0.121,0-0.239-0.044-0.332-0.126l-0.698-0.62l-1.107-0.396
  18674. c-0.106-0.038-0.197-0.111-0.256-0.207l-1.453-2.341l-0.956-0.367c-0.101-0.039-0.187-0.109-0.244-0.201l-1.884-2.997
  18675. c-0.105-0.166-0.102-0.379,0.007-0.543l0.685-1.027c0.034-0.051,0.076-0.095,0.125-0.13l1.392-0.993l-0.565-0.791
  18676. c-0.049-0.068-0.08-0.148-0.09-0.232l-0.163-1.376l-1.164-2.496c-0.105-0.225-0.029-0.493,0.179-0.629l2.327-1.526l-2.415-3.773
  18677. l-1.107-0.712c-0.133-0.086-0.218-0.229-0.229-0.388l-0.066-0.998l-0.667-0.333h-0.511l-0.713,0.439
  18678. c-0.08,0.05-0.171,0.074-0.262,0.074c-0.083,0-0.165-0.021-0.24-0.062l-0.924-0.506l-0.075,0.563
  18679. c-0.019,0.143-0.099,0.271-0.219,0.351c-0.083,0.055-0.179,0.083-0.276,0.083c-0.044,0-0.088-0.006-0.131-0.018l-1.884-0.514
  18680. c-0.107-0.029-0.202-0.094-0.269-0.183l-0.642-0.856c-0.097-0.13-0.125-0.3-0.075-0.454l0.557-1.713
  18681. c0.067-0.206,0.259-0.346,0.476-0.346h0.788l0.553-1.244c0.081-0.181,0.259-0.297,0.457-0.297h1.094l-0.454-1.306
  18682. c-0.021-0.061-0.031-0.126-0.027-0.19l0.081-1.527l-0.394-1.104c-0.071-0.197-0.011-0.418,0.15-0.552l1.027-0.856
  18683. c0.09-0.075,0.203-0.116,0.32-0.116h0.487l1.158-3.763l-0.746-0.56c-0.126-0.095-0.2-0.243-0.2-0.4v-1.37
  18684. c0-0.276,0.224-0.5,0.5-0.5h0.628l2.163-2.482c0.095-0.109,0.232-0.172,0.377-0.172h1.284c0.137,0,0.268,0.057,0.362,0.155
  18685. l3.339,3.511c0.088,0.093,0.138,0.217,0.138,0.345v1.884c0,0.087-0.022,0.173-0.066,0.248l-0.576,1.007l0.354,1.107l0.274-0.302
  18686. c0.098-0.107,0.233-0.163,0.37-0.163c0.107,0,0.214,0.034,0.304,0.104l2.486,1.905l2.297,0.574
  18687. c0.151,0.038,0.276,0.144,0.337,0.286c0.062,0.143,0.054,0.306-0.021,0.442l-0.33,0.595l0.338,1.285l2.026,1.783
  18688. c0.054,0.047,0.097,0.104,0.126,0.17l0.683,1.519l0.999,0.356c0.214,0.076,0.35,0.286,0.33,0.513l-0.067,0.812l2.067,2.299
  18689. l1.743,0.475c0.118,0.032,0.221,0.107,0.287,0.21l1.027,1.581l3.45,1.396c0.233,0.095,0.36,0.349,0.296,0.593l-0.313,1.176
  18690. l0.322,1.774c0.047,0.261-0.117,0.513-0.376,0.575l-2.141,0.514c-0.038,0.009-0.077,0.014-0.116,0.014
  18691. c-0.05,0-0.1-0.008-0.148-0.022l-1.663-0.517l0.16,0.737h0.624c0.151,0,0.296,0.069,0.391,0.188l0.424,0.529l0.573-0.313
  18692. c0.076-0.042,0.158-0.062,0.239-0.062c0.17,0,0.335,0.087,0.429,0.243l0.514,0.856c0.1,0.165,0.095,0.373-0.013,0.534
  18693. l-0.358,0.538l0.396,0.858c0.058,0.126,0.062,0.271,0.009,0.398c-0.053,0.129-0.155,0.229-0.285,0.279l-1.616,0.615l-2.823,5.647
  18694. c-0.06,0.118-0.163,0.209-0.289,0.251l-1.027,0.343c-0.052,0.017-0.104,0.025-0.158,0.025s-0.106-0.009-0.158-0.025l-1.641-0.547
  18695. l-1.896,0.633c-0.051,0.017-0.105,0.025-0.158,0.025c-0.073,0-0.146-0.016-0.213-0.048l-0.976-0.459l-0.067,0.167l0.257,0.578
  18696. c0.088,0.198,0.039,0.43-0.123,0.575l-0.856,0.771c-0.095,0.085-0.215,0.128-0.334,0.128c-0.128,0-0.256-0.049-0.354-0.146
  18697. l-0.924-0.924l-0.02-0.005v0.918c0,0.224-0.149,0.421-0.365,0.481l-2.74,0.771C242.696,437.979,242.65,437.985,242.605,437.985z"
  18698. />
  18699. <path fill="currentColor" d="M237.982,395.701l3.339,3.511v1.884l-0.685,1.198l0.685,2.141l0.856-0.941l2.568,1.969l2.397,0.6
  18700. l-0.428,0.771l0.428,1.627l2.141,1.884l0.771,1.713l1.2,0.428l-0.086,1.027l2.311,2.568l1.885,0.514l1.113,1.713l3.596,1.456
  18701. l-0.342,1.284l0.342,1.884l-2.141,0.514l-2.482-0.771l0.428,1.969h1.027l0.686,0.856l0.941-0.514l0.514,0.856l-0.514,0.771
  18702. l0.514,1.113l-1.799,0.685l-2.91,5.822l-1.027,0.343l-1.799-0.6l-2.054,0.686L248,433.975l-0.343,0.856l0.343,0.771l-0.856,0.771
  18703. l-1.027-1.027l-0.771-0.171v1.541l-2.74,0.771l-0.771-0.685l-1.198-0.429l-1.541-2.483l-1.113-0.428l-1.884-2.997l0.685-1.027
  18704. l1.799-1.284l-0.856-1.198l-0.172-1.456l-1.198-2.568l2.74-1.798l-2.74-4.281l-1.199-0.771l-0.085-1.284l-1.028-0.514h-0.771
  18705. l-0.834,0.514l-1.563-0.855l-0.171,1.284l-1.884-0.514l-0.642-0.856l0.557-1.713h1.112l0.686-1.541h1.798l-0.686-1.97
  18706. l0.086-1.627l-0.428-1.198l1.027-0.856h0.856l1.37-4.452l-1.027-0.771v-1.37h0.855l2.313-2.654H237.982 M237.982,394.701h-1.284
  18707. c-0.289,0-0.564,0.125-0.754,0.343l-2.014,2.312h-0.4c-0.552,0-1,0.447-1,1v1.37c0,0.314,0.148,0.611,0.4,0.8l0.465,0.349
  18708. l-0.946,3.074h-0.118c-0.234,0-0.46,0.082-0.64,0.231l-1.027,0.856c-0.322,0.269-0.442,0.71-0.302,1.104l0.36,1.01l-0.075,1.427
  18709. c-0.007,0.13,0.012,0.259,0.054,0.382l0.223,0.641h-0.391c-0.395,0-0.753,0.232-0.914,0.594l-0.421,0.947h-0.463
  18710. c-0.433,0-0.817,0.279-0.951,0.691l-0.557,1.713c-0.101,0.309-0.044,0.647,0.151,0.908l0.642,0.856
  18711. c0.133,0.178,0.322,0.307,0.537,0.365l1.884,0.514c0.087,0.023,0.175,0.035,0.263,0.035c0.195,0,0.388-0.057,0.553-0.167
  18712. c0.196-0.13,0.338-0.324,0.405-0.547l0.296,0.162c0.15,0.082,0.315,0.123,0.48,0.123c0.182,0,0.364-0.05,0.524-0.148l0.593-0.365
  18713. h0.251l0.304,0.152l0.047,0.712c0.021,0.315,0.19,0.604,0.457,0.774l1.016,0.653l2.089,3.265l-1.913,1.256
  18714. c-0.416,0.272-0.568,0.809-0.358,1.259l1.13,2.423l0.153,1.296c0.02,0.167,0.082,0.327,0.18,0.464l0.274,0.385l-0.984,0.703
  18715. c-0.099,0.07-0.184,0.158-0.251,0.259l-0.685,1.027c-0.219,0.328-0.224,0.753-0.015,1.087l1.884,2.997
  18716. c0.115,0.183,0.286,0.323,0.488,0.401l0.8,0.307l1.364,2.198c0.119,0.192,0.3,0.338,0.513,0.414l1.016,0.363l0.626,0.556
  18717. c0.185,0.165,0.422,0.253,0.664,0.253c0.09,0,0.182-0.013,0.271-0.037l2.74-0.771c0.351-0.099,0.614-0.378,0.7-0.72l0.121,0.121
  18718. c0.195,0.194,0.451,0.293,0.707,0.293c0.239,0,0.478-0.085,0.669-0.257l0.856-0.771c0.229-0.206,0.345-0.5,0.33-0.795
  18719. l0.032,0.015c0.134,0.063,0.28,0.096,0.426,0.096c0.106,0,0.213-0.017,0.316-0.052l1.738-0.58l1.482,0.494
  18720. c0.103,0.034,0.21,0.052,0.316,0.052s0.214-0.018,0.316-0.052l1.027-0.343c0.252-0.084,0.46-0.264,0.578-0.501l2.735-5.474
  18721. l1.435-0.546c0.259-0.099,0.466-0.3,0.57-0.557s0.099-0.545-0.018-0.797l-0.279-0.605l0.203-0.305
  18722. c0.215-0.321,0.225-0.737,0.025-1.069l-0.514-0.856c-0.068-0.114-0.156-0.21-0.258-0.286l1.175-0.281
  18723. c0.516-0.124,0.846-0.629,0.751-1.151l-0.303-1.664l0.285-1.068c0.129-0.487-0.124-0.994-0.592-1.184l-3.304-1.338l-0.941-1.449
  18724. c-0.134-0.206-0.339-0.355-0.576-0.42l-1.601-0.437l-1.825-2.028l0.05-0.597c0.038-0.452-0.233-0.873-0.66-1.025l-0.798-0.284
  18725. l-0.596-1.324c-0.059-0.13-0.145-0.246-0.251-0.341l-1.912-1.682l-0.248-0.944l0.233-0.419c0.151-0.271,0.167-0.599,0.043-0.884
  18726. c-0.124-0.285-0.373-0.496-0.675-0.571l-2.196-0.55l-2.404-1.843c-0.181-0.139-0.395-0.206-0.608-0.206
  18727. c-0.137,0-0.274,0.028-0.401,0.084l-0.054-0.169l0.466-0.816c0.086-0.151,0.132-0.322,0.132-0.496v-1.884
  18728. c0-0.257-0.099-0.503-0.275-0.689l-3.339-3.511C238.518,394.813,238.256,394.701,237.982,394.701L237.982,394.701z"/>
  18729. </g>
  18730. <g>
  18731. <path fill="currentColor" d="M224.197,411.271c-0.186,0-0.356-0.104-0.443-0.268l-0.942-1.798c-0.069-0.132-0.076-0.287-0.019-0.425
  18732. l1.24-2.976l-0.078-1.341c-0.012-0.199,0.097-0.387,0.275-0.477l1.093-0.547l0.957-1.274c0.094-0.126,0.243-0.2,0.4-0.2h2.569
  18733. c0.276,0,0.5,0.224,0.5,0.5v2.312c0,0.09-0.024,0.179-0.07,0.256l-1.07,1.798c-0.046,0.077-0.112,0.141-0.192,0.184l-1.438,0.777
  18734. l-1.472,3.188c-0.082,0.177-0.259,0.29-0.454,0.29H224.197z"/>
  18735. <path fill="currentColor" d="M229.249,402.466v2.312l-1.07,1.798l-1.584,0.856l-1.542,3.339h-0.855l-0.942-1.798l1.284-3.082
  18736. l-0.085-1.456l1.198-0.6l1.027-1.369H229.249 M229.249,401.466h-2.569c-0.314,0-0.611,0.148-0.8,0.399l-0.886,1.181l-0.988,0.494
  18737. c-0.357,0.179-0.574,0.554-0.551,0.953l0.072,1.226l-1.195,2.869c-0.115,0.274-0.101,0.586,0.037,0.849l0.942,1.798
  18738. c0.173,0.33,0.514,0.536,0.886,0.536h0.855c0.39,0,0.744-0.227,0.908-0.581l1.403-3.036l1.291-0.698
  18739. c0.159-0.086,0.292-0.213,0.384-0.368l1.07-1.798c0.092-0.155,0.141-0.332,0.141-0.512v-2.312
  18740. C230.249,401.913,229.801,401.466,229.249,401.466L229.249,401.466z"/>
  18741. </g>
  18742. <g>
  18743. <path fill="currentColor" d="M263.584,433.79c-0.064,0-0.129-0.013-0.19-0.038l-1.322-0.544l-1.313,0.231
  18744. c-0.029,0.005-0.058,0.008-0.087,0.008c-0.077,0-0.154-0.018-0.224-0.053l-1.199-0.6c-0.04-0.021-0.077-0.046-0.111-0.076
  18745. l-0.855-0.771c-0.16-0.145-0.21-0.376-0.122-0.574l1.027-2.312c0.05-0.112,0.14-0.202,0.252-0.253l1.713-0.771
  18746. c0.064-0.029,0.135-0.044,0.205-0.044h1.797c0.157,0,0.305,0.073,0.399,0.199c0.095,0.125,0.124,0.287,0.081,0.438l-0.458,1.605
  18747. l0.85,1.62c0.038,0.071,0.058,0.151,0.058,0.232v1.199c0,0.167-0.083,0.322-0.222,0.415
  18748. C263.778,433.762,263.682,433.79,263.584,433.79z"/>
  18749. <path fill="currentColor" d="M263.154,428.495l-0.514,1.798l0.943,1.798v1.199l-1.457-0.6l-1.455,0.257l-1.199-0.6l-0.855-0.771
  18750. l1.027-2.312l1.713-0.771H263.154 M263.154,427.495h-1.797c-0.142,0-0.281,0.03-0.41,0.088l-1.713,0.771
  18751. c-0.225,0.102-0.403,0.281-0.504,0.506l-1.027,2.312c-0.176,0.396-0.077,0.859,0.245,1.149l0.855,0.771
  18752. c0.066,0.061,0.142,0.111,0.222,0.151l1.199,0.6c0.14,0.069,0.293,0.105,0.447,0.105c0.058,0,0.116-0.005,0.174-0.016
  18753. l1.169-0.206l1.188,0.489c0.123,0.051,0.252,0.075,0.381,0.075c0.195,0,0.39-0.058,0.557-0.169
  18754. c0.277-0.186,0.443-0.497,0.443-0.831v-1.199c0-0.162-0.039-0.321-0.114-0.465l-0.758-1.443l0.404-1.413
  18755. c0.086-0.302,0.025-0.626-0.163-0.877C263.764,427.643,263.468,427.495,263.154,427.495L263.154,427.495z"/>
  18756. </g>
  18757. <g>
  18758. <path fill="currentColor" d="M181.642,302.415c-0.196,0-0.374-0.114-0.455-0.293l-0.571-1.256c-0.034-0.075-0.049-0.158-0.044-0.24
  18759. l0.114-1.712c0.009-0.14,0.077-0.27,0.187-0.357l2.096-1.677v-1.521l-0.77-0.427c-0.203-0.113-0.302-0.352-0.238-0.574
  18760. l0.456-1.599c0.062-0.215,0.258-0.363,0.481-0.363h0.604l0.387-2.322l-0.007-2.367l-0.602-2.409l-1.902-0.602
  18761. c-0.096-0.03-0.182-0.09-0.244-0.169l-0.65-0.835h-1.125c-0.124,0-0.243-0.046-0.334-0.128l-1.142-1.027
  18762. c-0.071-0.064-0.122-0.146-0.147-0.238l-0.552-1.989l-0.892-1.487l-1.754-0.516c-0.122-0.035-0.225-0.116-0.29-0.226l-1.832-3.11
  18763. l-1.917-1.423c-0.058-0.043-0.106-0.099-0.141-0.162l-0.686-1.256c-0.025-0.045-0.042-0.095-0.052-0.146l-0.456-2.397
  18764. c-0.032-0.17,0.025-0.345,0.153-0.462c0.093-0.086,0.214-0.132,0.338-0.132c0.044,0,0.09,0.006,0.134,0.019l2.055,0.57
  18765. l4.289,1.85c0.085,0.037,0.159,0.098,0.212,0.174l0.864,1.248c0,0,1.224-0.094,1.237-0.094c0.173,0,0.335,0.09,0.427,0.239
  18766. l1.087,1.78l2.42-0.303c0.021-0.003,0.042-0.004,0.062-0.004c0.152,0,0.298,0.069,0.394,0.191l1.142,1.455
  18767. c0.069,0.088,0.106,0.196,0.106,0.309v0.78l2.18,0.545l3.487-1.771c0.072-0.036,0.149-0.054,0.227-0.054
  18768. c0.1,0,0.199,0.03,0.284,0.089c0.151,0.104,0.232,0.282,0.213,0.465l-0.088,0.818l0.858,0.858
  18769. c0.097,0.097,0.15,0.229,0.146,0.366c-0.004,0.138-0.063,0.268-0.166,0.359l-0.674,0.606l1.768,1.238
  18770. c0.2,0.139,0.27,0.402,0.166,0.622l-0.788,1.673l2.565,3.528c0.062,0.085,0.096,0.188,0.096,0.294v0.688l4.823,1.93
  18771. c0.05,0.02,0.096,0.048,0.137,0.082l1.37,1.159l3.638,0.428l2.535-0.66c0.042-0.012,0.084-0.017,0.126-0.017
  18772. c0.11,0,0.218,0.036,0.307,0.105l0.828,0.645l4.667-1.303l3.149-1.24c0.059-0.022,0.121-0.034,0.183-0.034
  18773. c0.087,0,0.174,0.022,0.252,0.068l1.177,0.687l2.539-0.813l1.175-1.068c0.094-0.085,0.214-0.13,0.336-0.13
  18774. c0.068,0,0.137,0.014,0.202,0.043c0.181,0.08,0.298,0.259,0.298,0.457v2.969c0,0.049-0.007,0.097-0.021,0.144l-0.621,2.072
  18775. l0.571,0.952c0.047,0.077,0.071,0.166,0.071,0.257v1.256c0,0.221-0.145,0.416-0.356,0.479l-0.911,0.273l-0.823,2.059
  18776. c-0.072,0.179-0.239,0.301-0.431,0.313c0,0-1.735,0.115-1.746,0.115c-0.126,0-0.249-0.048-0.342-0.135
  18777. c-0.101-0.095-0.158-0.227-0.158-0.365v-0.626l-6.635-1.474l-1.558,0.727c-0.067,0.031-0.139,0.047-0.211,0.047
  18778. c-0.044,0-0.087-0.006-0.13-0.018l-4.063-1.098l-1.557,0.622c-0.059,0.024-0.122,0.036-0.186,0.036
  18779. c-0.005,0-3.347-0.111-3.347-0.111l-1.176,0.421v1.246c0,0.169-0.085,0.327-0.228,0.419c-0.083,0.054-0.177,0.081-0.272,0.081
  18780. c-0.069,0-0.138-0.015-0.203-0.043l-1.958-0.871h-1.564v1.099c0,0.176-0.092,0.339-0.243,0.429l-1.142,0.685
  18781. c-0.079,0.047-0.168,0.071-0.257,0.071c-0.065,0-0.13-0.013-0.192-0.038l-1.37-0.57c-0.221-0.093-0.346-0.329-0.297-0.563
  18782. l0.477-2.29l-2.338-0.692l-0.688,0.765v1.862c0,0.259-0.197,0.475-0.455,0.498l-1.089,0.099l-3.643,3.313
  18783. c-0.092,0.084-0.212,0.13-0.336,0.13H181.642z"/>
  18784. <path fill="currentColor" d="M169.655,269.493l2.055,0.57l4.224,1.827l1.027,1.483l1.484-0.114l1.256,2.056l2.74-0.343l1.142,1.455
  18785. v1.171l2.74,0.685l3.653-1.855l-0.114,1.057l1.027,1.027l-1.142,1.027l2.283,1.599l-0.913,1.94l2.739,3.768v1.027l5.138,2.055
  18786. l1.484,1.256l3.881,0.457l2.626-0.685l1.027,0.799l4.909-1.37l3.197-1.256l1.369,0.799l2.854-0.913l1.256-1.142v2.969
  18787. l-0.685,2.283l0.685,1.142v1.256l-1.142,0.342l-0.913,2.283l-1.713,0.114v-1.027l-7.192-1.598l-1.712,0.799l-4.225-1.142
  18788. l-1.712,0.685l-3.426-0.114l-1.598,0.571v1.599l-2.055-0.914h-2.17v1.599l-1.142,0.685l-1.37-0.57l0.571-2.74l-3.082-0.913
  18789. l-1.028,1.142v2.055l-1.256,0.114l-3.767,3.425h-1.027l-0.571-1.256l0.114-1.712l2.283-1.827v-2.055l-1.027-0.57l0.456-1.599
  18790. h1.028l0.456-2.74v-2.512l-0.685-2.739l-2.169-0.686l-0.8-1.027h-1.37l-1.142-1.027l-0.57-2.055l-1.027-1.713l-1.941-0.57
  18791. l-1.883-3.197l-1.998-1.483l-0.686-1.256L169.655,269.493 M169.655,268.493c-0.248,0-0.49,0.092-0.677,0.265
  18792. c-0.254,0.233-0.37,0.583-0.305,0.922l0.456,2.397c0.02,0.103,0.055,0.201,0.104,0.293l0.686,1.256
  18793. c0.069,0.127,0.166,0.237,0.282,0.323l1.835,1.362l1.78,3.023c0.129,0.219,0.336,0.38,0.58,0.452l1.566,0.46l0.757,1.262
  18794. l0.534,1.924c0.051,0.184,0.153,0.349,0.294,0.476l1.142,1.027c0.184,0.165,0.422,0.257,0.669,0.257h0.881l0.5,0.642
  18795. c0.125,0.16,0.294,0.278,0.488,0.339l1.636,0.518l0.519,2.077v2.306l-0.303,1.823h-0.181c-0.447,0-0.839,0.296-0.961,0.726
  18796. l-0.456,1.599c-0.128,0.447,0.07,0.923,0.476,1.148l0.513,0.285v0.985l-1.908,1.526c-0.219,0.176-0.354,0.435-0.373,0.715
  18797. l-0.114,1.712c-0.011,0.165,0.019,0.33,0.087,0.48l0.571,1.256c0.162,0.356,0.518,0.586,0.91,0.586h1.027
  18798. c0.249,0,0.489-0.093,0.673-0.26l3.519-3.199l0.922-0.084c0.515-0.047,0.909-0.479,0.909-0.996v-1.671l0.349-0.388l1.594,0.473
  18799. l-0.383,1.839c-0.098,0.47,0.152,0.943,0.595,1.127l1.37,0.57c0.124,0.052,0.254,0.077,0.384,0.077
  18800. c0.179,0,0.357-0.048,0.514-0.143l1.142-0.685c0.301-0.181,0.486-0.506,0.486-0.857v-0.599h0.958l1.861,0.828
  18801. c0.13,0.058,0.268,0.086,0.406,0.086c0.19,0,0.38-0.055,0.545-0.161c0.284-0.185,0.455-0.5,0.455-0.839v-0.895l0.755-0.27
  18802. l3.235,0.107c0.011,0.001,0.022,0.001,0.033,0.001c0.127,0,0.253-0.024,0.371-0.071l1.402-0.561l3.902,1.055
  18803. c0.085,0.022,0.173,0.034,0.261,0.034c0.145,0,0.29-0.031,0.423-0.094l1.404-0.655l6.078,1.351v0.225
  18804. c0,0.276,0.115,0.541,0.317,0.73c0.186,0.174,0.43,0.27,0.683,0.27c0.022,0,0.044-0.001,0.066-0.002l1.713-0.114
  18805. c0.384-0.026,0.719-0.27,0.862-0.627l0.733-1.835l0.679-0.203c0.423-0.127,0.713-0.517,0.713-0.958v-1.256
  18806. c0-0.181-0.049-0.359-0.143-0.515l-0.458-0.763l0.558-1.86c0.028-0.093,0.042-0.189,0.042-0.287v-2.969
  18807. c0-0.396-0.233-0.754-0.595-0.914c-0.13-0.058-0.268-0.086-0.405-0.086c-0.244,0-0.485,0.09-0.673,0.26l-1.095,0.996
  18808. l-2.223,0.711l-0.985-0.574c-0.155-0.091-0.329-0.137-0.504-0.137c-0.124,0-0.248,0.022-0.366,0.069l-3.149,1.237l-4.375,1.221
  18809. l-0.63-0.489c-0.177-0.139-0.394-0.211-0.614-0.211c-0.084,0-0.169,0.011-0.252,0.032l-2.443,0.637l-3.395-0.399l-1.254-1.062
  18810. c-0.082-0.069-0.175-0.125-0.274-0.165l-4.509-1.803v-0.351c0-0.211-0.067-0.417-0.191-0.588l-2.391-3.289l0.661-1.405
  18811. c0.207-0.44,0.067-0.966-0.331-1.245l-1.253-0.877l0.207-0.187c0.204-0.184,0.324-0.442,0.331-0.717
  18812. c0.007-0.274-0.099-0.539-0.292-0.733l-0.688-0.688l0.063-0.581c0.04-0.364-0.124-0.722-0.426-0.931
  18813. c-0.17-0.117-0.369-0.177-0.568-0.177c-0.155,0-0.31,0.036-0.453,0.108l-3.321,1.687l-1.62-0.405v-0.39
  18814. c0-0.224-0.075-0.441-0.213-0.617l-1.142-1.455c-0.191-0.243-0.482-0.383-0.787-0.383c-0.041,0-0.083,0.003-0.124,0.008
  18815. l-2.1,0.263l-0.919-1.505c-0.183-0.299-0.507-0.479-0.854-0.479c-0.025,0-0.051,0.001-0.077,0.003l-0.912,0.07l-0.701-1.012
  18816. c-0.106-0.153-0.254-0.274-0.425-0.349l-4.224-1.827c-0.042-0.018-0.085-0.033-0.129-0.046l-2.055-0.57
  18817. C169.834,268.505,169.744,268.493,169.655,268.493L169.655,268.493z"/>
  18818. </g>
  18819. <g>
  18820. <path fill="currentColor" d="M249.227,303.785c-0.244,0-0.453-0.177-0.493-0.418l-0.135-0.808l-0.703-0.447l-0.46,0.53
  18821. c-0.095,0.109-0.233,0.172-0.377,0.172c-0.003,0-2.462-0.054-2.462-0.054l-0.978,0.463c-0.067,0.031-0.141,0.048-0.214,0.048
  18822. c-0.063,0-0.126-0.012-0.186-0.036l-0.856-0.343c-0.125-0.05-0.226-0.148-0.277-0.273s-0.05-0.266,0.004-0.39l0.57-1.313
  18823. c0.044-0.101,0.12-0.185,0.215-0.237l1.027-0.571c0.075-0.042,0.158-0.063,0.243-0.063h0.522l0.275-0.44l-0.73-1.461
  18824. c-0.048-0.097-0.064-0.206-0.045-0.312l0.399-2.227c0.031-0.174,0.151-0.318,0.316-0.38l0.759-0.285l1.183-1.822l-0.13-1.126
  18825. l-1.067-1.017c-0.122-0.116-0.177-0.286-0.147-0.452l0.457-2.512c0.012-0.064,0.036-0.125,0.071-0.181l0.894-1.392l-0.203-0.566
  18826. c-0.053-0.149-0.033-0.314,0.055-0.446l1.357-2.036l-0.338-1.221c-0.047-0.172,0-0.355,0.124-0.483l1.713-1.755
  18827. c0.094-0.096,0.223-0.15,0.358-0.15h1.083c0.181,0,0.348,0.098,0.436,0.255l0.424,0.753l1.826,0.679
  18828. c0.113,0.042,0.207,0.123,0.265,0.229l0.344,0.628c0.04,0.074,0.062,0.156,0.062,0.24v0.394l0.661,0.306l0.95-0.244l1.344-1.074
  18829. c0.089-0.071,0.199-0.109,0.313-0.109c0.019,0,2.11,0.231,2.11,0.231c0.104,0.012,0.2,0.055,0.278,0.125l1.084,0.971
  18830. c0.106,0.096,0.168,0.233,0.166,0.378c-0.002,0.144-0.065,0.28-0.175,0.374l-0.799,0.685c-0.093,0.079-0.209,0.12-0.325,0.12
  18831. c-0.091,0-0.181-0.024-0.262-0.074l-0.512-0.314l-2.607,1.232v1.967c0,0.08-0.02,0.158-0.056,0.229l-1.721,3.331l-0.166,2.918
  18832. c-0.002,0.039-0.009,0.078-0.021,0.115l-0.342,1.142c-0.019,0.063-0.05,0.122-0.092,0.173l-3.465,4.234l0.073,0.693l0.894,0.844
  18833. c0.191,0.181,0.209,0.48,0.04,0.684l-1.427,1.712c-0.095,0.114-0.236,0.18-0.384,0.18H249.227z"/>
  18834. <path fill="currentColor" d="M251.053,280.281l0.514,0.913l1.998,0.742l0.344,0.628v0.714l1.113,0.514l1.227-0.314l1.428-1.142
  18835. l2.055,0.229l1.084,0.971l-0.799,0.685l-0.742-0.456l-3.139,1.483v2.283l-1.77,3.426l-0.172,3.024l-0.342,1.142l-3.597,4.396
  18836. l0.114,1.085l1.028,0.971l-1.427,1.712h-0.742l-0.172-1.027l-1.255-0.799l-0.742,0.855l-2.569-0.057l-1.084,0.514l-0.856-0.343
  18837. l0.57-1.313l1.027-0.571h0.8l0.57-0.913l-0.855-1.712l0.399-2.227l0.913-0.343l1.37-2.111l-0.172-1.484l-1.198-1.142l0.457-2.512
  18838. l1.027-1.599l-0.286-0.799l1.484-2.227l-0.399-1.441l1.713-1.755H251.053 M251.053,279.281h-1.083
  18839. c-0.27,0-0.527,0.108-0.716,0.302l-1.713,1.755c-0.249,0.255-0.343,0.622-0.248,0.965l0.277,1.001l-1.23,1.846
  18840. c-0.175,0.264-0.216,0.594-0.109,0.892l0.12,0.336l-0.761,1.184c-0.071,0.11-0.119,0.233-0.143,0.362l-0.457,2.512
  18841. c-0.06,0.331,0.05,0.671,0.294,0.902l0.937,0.893l0.089,0.768l-0.995,1.533l-0.605,0.227c-0.33,0.124-0.57,0.413-0.633,0.76
  18842. l-0.399,2.227c-0.038,0.212-0.006,0.431,0.09,0.624l0.589,1.178h-0.209c-0.17,0-0.337,0.043-0.486,0.126l-1.027,0.571
  18843. c-0.192,0.106-0.344,0.274-0.431,0.476l-0.57,1.313c-0.108,0.248-0.111,0.528-0.008,0.778c0.103,0.25,0.302,0.448,0.553,0.549
  18844. l0.856,0.343c0.12,0.048,0.246,0.071,0.372,0.071c0.146,0,0.293-0.032,0.428-0.097l0.87-0.412l2.333,0.052
  18845. c0.007,0,0.015,0,0.022,0c0.29,0,0.565-0.125,0.755-0.345l0.177-0.204l0.152,0.097l0.098,0.588
  18846. c0.081,0.481,0.498,0.835,0.986,0.835h0.742c0.297,0,0.578-0.132,0.768-0.359l1.428-1.712c0.338-0.406,0.302-1.005-0.082-1.367
  18847. l-0.759-0.717l-0.031-0.302l3.332-4.072c0.084-0.103,0.146-0.221,0.185-0.347l0.342-1.142c0.022-0.075,0.036-0.152,0.04-0.23
  18848. l0.16-2.812l1.672-3.236c0.073-0.142,0.111-0.299,0.111-0.459v-1.649l2.076-0.981l0.281,0.172c0.161,0.1,0.343,0.148,0.523,0.148
  18849. c0.233,0,0.465-0.081,0.65-0.24l0.799-0.685c0.219-0.188,0.347-0.461,0.35-0.749s-0.118-0.563-0.333-0.756l-1.084-0.971
  18850. c-0.155-0.139-0.35-0.226-0.557-0.249l-2.055-0.229c-0.037-0.004-0.073-0.006-0.11-0.006c-0.226,0-0.446,0.076-0.625,0.219
  18851. l-1.26,1.008l-0.674,0.173l-0.209-0.097v-0.074c0-0.168-0.042-0.333-0.123-0.48l-0.344-0.628
  18852. c-0.115-0.211-0.303-0.373-0.528-0.457l-1.655-0.614l-0.334-0.594C251.747,279.477,251.414,279.281,251.053,279.281
  18853. L251.053,279.281z"/>
  18854. </g>
  18855. <g>
  18856. <path fill="currentColor" d="M275.484,312.919c-0.103,0-0.204-0.031-0.291-0.094l-0.799-0.571c-0.112-0.08-0.187-0.203-0.205-0.341
  18857. l-0.113-0.856c-0.025-0.197,0.067-0.392,0.238-0.494l0.328-0.197v-0.188l-2.256-2.149l-0.796-0.455l-0.244,0.271
  18858. c-0.098,0.108-0.233,0.166-0.372,0.166c-0.076,0-0.152-0.018-0.224-0.053l-0.799-0.4c-0.17-0.085-0.276-0.258-0.276-0.447v-0.323
  18859. c0,0-0.402,0.024-0.412,0.024c-0.166,0-0.322-0.083-0.416-0.223l-0.332-0.497l-4.934-0.675l-0.498,0.568v0.954
  18860. c0,0.22-0.144,0.414-0.354,0.479l-3.186,0.977v1.57c0,0.202-0.122,0.385-0.309,0.462c-0.063,0.025-0.127,0.038-0.191,0.038
  18861. c-0.13,0-0.258-0.051-0.354-0.146l-0.453-0.454l-5.316-0.774c-0.063-0.01-0.123-0.03-0.179-0.063l-1.084-0.628
  18862. c-0.12-0.069-0.206-0.187-0.236-0.321c-0.031-0.136-0.004-0.278,0.074-0.393l0.571-0.839l-0.436-0.29
  18863. c-0.217-0.145-0.286-0.431-0.16-0.658l2.277-4.111v-0.854l-0.742-0.48c-0.146-0.094-0.232-0.257-0.229-0.431
  18864. c0.004-0.173,0.097-0.332,0.246-0.42l3.321-1.96l0.226-0.679c0.043-0.129,0.137-0.235,0.26-0.293l0.866-0.412l-0.063-0.435
  18865. c-0.028-0.2,0.066-0.398,0.241-0.502l1.256-0.742c0.077-0.046,0.165-0.069,0.254-0.069c0.048,0,0.097,0.007,0.144,0.021
  18866. l0.856,0.257l0.303-0.303c0.095-0.095,0.222-0.146,0.354-0.146c0.025,0,0.051,0.002,0.076,0.006l0.474,0.073l0.732-0.824
  18867. c0.096-0.107,0.231-0.168,0.374-0.168h1.044l0.071-0.26c0.058-0.209,0.242-0.356,0.458-0.367l0.88-0.044l1.547-2.463
  18868. c0.064-0.103,0.164-0.178,0.279-0.213l1.91-0.576l0.601-0.899l-0.201-0.226c-0.142-0.159-0.166-0.391-0.063-0.576l1.199-2.138
  18869. l-0.261-0.695c-0.041-0.11-0.042-0.23-0.003-0.341l0.4-1.142c0.07-0.202,0.261-0.335,0.472-0.335
  18870. c0.012,0,3.175,0.229,3.175,0.229c0.138,0.011,0.265,0.077,0.352,0.184l1.424,1.752l1.457,0.81
  18871. c0.106,0.06,0.188,0.156,0.229,0.272l0.4,1.142c0.019,0.053,0.028,0.108,0.028,0.165v0.615l2.837,0.997h1.399
  18872. c0.276,0,0.5,0.224,0.5,0.5v0.913c0,0.06-0.011,0.119-0.031,0.175l-0.616,1.646l0.612,1.533c0.046,0.116,0.047,0.244,0.004,0.36
  18873. l-0.299,0.796l0.326,2.444c0.021,0.165-0.04,0.331-0.165,0.441c-0.092,0.081-0.211,0.125-0.331,0.125
  18874. c-0.042,0-0.084-0.005-0.126-0.017l-1.019-0.265l-0.311,0.345c-0.064,0.071-0.148,0.123-0.242,0.148l-0.855,0.229
  18875. c-0.042,0.011-0.086,0.017-0.129,0.017c-0.114,0-0.228-0.039-0.317-0.114l-0.685-0.563l-0.36,0.24l-0.339,2.523l1.39,1.63
  18876. l0.903,0.142c0.146,0.023,0.276,0.111,0.353,0.239c0.075,0.129,0.09,0.284,0.04,0.424l-1.992,5.534l0.417,1.083l1.252,0.386
  18877. c0.209,0.064,0.353,0.258,0.353,0.478v1.084c0,0.276-0.224,0.5-0.5,0.5h-0.799c-0.101,0-0.199-0.03-0.283-0.088l-0.49-0.337
  18878. l-0.35,0.54c-0.093,0.142-0.251,0.228-0.42,0.228h-0.627c-0.143,0-0.278-0.061-0.374-0.168l-0.174-0.195l-0.896,0.571
  18879. C275.671,312.893,275.577,312.919,275.484,312.919z"/>
  18880. <path fill="currentColor" d="M271.033,283.649l3.139,0.228l1.484,1.827l1.541,0.856l0.4,1.142v0.97l3.252,1.143h1.484v0.913
  18881. l-0.684,1.826l0.684,1.713l-0.342,0.913l0.342,2.568l-1.313-0.342l-0.514,0.57l-0.855,0.229l-0.971-0.799l-0.857,0.57
  18882. l-0.398,2.969l1.654,1.94l1.086,0.171l-2.055,5.709l0.57,1.483l1.484,0.457v1.084h-0.799l-0.914-0.627l-0.629,0.97h-0.627
  18883. l-0.457-0.514l-1.256,0.8l-0.799-0.571l-0.113-0.856l0.57-0.343v-0.685l-2.455-2.34l-1.199-0.686l-0.514,0.571l-0.799-0.4v-0.855
  18884. l-0.912,0.057l-0.457-0.685l-5.424-0.742l-0.799,0.913v1.142l-3.539,1.085v1.94l-0.57-0.571l-5.48-0.799l-1.084-0.628
  18885. l0.855-1.256l-0.855-0.57l2.34-4.225v-1.256l-0.971-0.628l3.482-2.055l0.285-0.856l1.199-0.57l-0.115-0.799l1.256-0.742
  18886. l1.143,0.342l0.514-0.514l0.742,0.114l0.914-1.027h1.426l0.172-0.628l1.141-0.057l1.686-2.684l2.082-0.628l0.914-1.369
  18887. l-0.457-0.515l1.313-2.34l-0.342-0.913L271.033,283.649 M271.033,282.649c-0.422,0-0.803,0.266-0.943,0.669l-0.4,1.142
  18888. c-0.078,0.221-0.075,0.462,0.007,0.682l0.179,0.479l-1.085,1.935c-0.194,0.347-0.164,0.773,0.071,1.088l-0.289,0.432
  18889. l-1.738,0.524c-0.231,0.069-0.43,0.221-0.558,0.425l-1.408,2.243l-0.621,0.03c-0.394,0.02-0.734,0.268-0.879,0.627h-0.669
  18890. c-0.285,0-0.558,0.122-0.747,0.335l-0.553,0.621l-0.204-0.031c-0.051-0.008-0.102-0.012-0.152-0.012
  18891. c-0.263,0-0.519,0.104-0.707,0.293l-0.092,0.092l-0.571-0.171c-0.094-0.028-0.19-0.042-0.286-0.042
  18892. c-0.178,0-0.354,0.047-0.509,0.139l-1.256,0.742c-0.349,0.207-0.539,0.603-0.481,1.004l0.011,0.069l-0.534,0.254
  18893. c-0.246,0.117-0.434,0.329-0.52,0.588l-0.166,0.501l-3.16,1.864c-0.299,0.176-0.484,0.494-0.492,0.841
  18894. c-0.007,0.347,0.166,0.672,0.457,0.86l0.514,0.332v0.453l-2.215,3.999c-0.252,0.455-0.113,1.027,0.32,1.316l0.015,0.01
  18895. l-0.286,0.422c-0.157,0.229-0.21,0.514-0.149,0.784c0.062,0.271,0.233,0.504,0.474,0.644l1.084,0.628
  18896. c0.109,0.063,0.23,0.105,0.356,0.124l5.152,0.751l0.335,0.336c0.191,0.192,0.447,0.294,0.708,0.294
  18897. c0.129,0,0.259-0.024,0.382-0.076c0.374-0.154,0.618-0.52,0.618-0.924v-1.201l2.832-0.868c0.42-0.129,0.707-0.517,0.707-0.956
  18898. v-0.766l0.197-0.226l4.443,0.608l0.207,0.311c0.174,0.26,0.457,0.421,0.764,0.442c0.061,0.297,0.255,0.556,0.532,0.694l0.799,0.4
  18899. c0.143,0.072,0.296,0.106,0.448,0.106c0.265,0,0.524-0.105,0.717-0.303l0.395,0.225l1.864,1.777
  18900. c-0.272,0.216-0.416,0.563-0.369,0.913l0.113,0.856c0.036,0.274,0.185,0.521,0.409,0.683l0.799,0.571
  18901. c0.174,0.124,0.378,0.187,0.582,0.187c0.187,0,0.373-0.052,0.537-0.156l0.55-0.351c0.176,0.142,0.396,0.221,0.626,0.221h0.627
  18902. c0.339,0,0.654-0.172,0.839-0.456l0.07-0.108l0.068,0.046c0.166,0.114,0.363,0.176,0.565,0.176h0.799c0.553,0,1-0.447,1-1v-1.084
  18903. c0-0.438-0.286-0.826-0.706-0.956l-1.02-0.313l-0.262-0.683l1.929-5.358c0.101-0.281,0.071-0.592-0.081-0.849
  18904. c-0.151-0.256-0.41-0.432-0.705-0.479l-0.721-0.113l-1.124-1.319l0.254-1.895l0.286,0.236c0.182,0.148,0.406,0.228,0.636,0.228
  18905. c0.086,0,0.173-0.011,0.258-0.034l0.855-0.229c0.188-0.05,0.355-0.152,0.485-0.297l0.106-0.118l0.725,0.188
  18906. c0.083,0.021,0.168,0.032,0.252,0.032c0.241,0,0.478-0.087,0.662-0.251c0.25-0.221,0.373-0.551,0.329-0.881l-0.309-2.32
  18907. l0.254-0.679c0.087-0.233,0.085-0.49-0.008-0.722l-0.54-1.354l0.548-1.464c0.042-0.112,0.063-0.23,0.063-0.351v-0.913
  18908. c0-0.553-0.447-1-1-1h-1.313l-2.423-0.852v-0.261c0-0.112-0.02-0.225-0.057-0.331l-0.4-1.142
  18909. c-0.081-0.23-0.243-0.424-0.458-0.543l-1.372-0.763l-1.362-1.678c-0.174-0.214-0.429-0.347-0.704-0.366l-3.139-0.228
  18910. C271.081,282.65,271.057,282.649,271.033,282.649L271.033,282.649z"/>
  18911. </g>
  18912. <g>
  18913. <path fill="currentColor" d="M237.753,300.018c-0.104,0-0.206-0.032-0.292-0.095c-0.13-0.094-0.208-0.244-0.208-0.405v-0.805
  18914. l-0.71-0.64l-0.715,0.397c-0.076,0.043-0.16,0.063-0.243,0.063c-0.107,0-0.214-0.034-0.303-0.103l-1.199-0.914
  18915. c-0.112-0.085-0.183-0.213-0.195-0.354c-0.012-0.14,0.035-0.278,0.129-0.382l0.333-0.362l-0.45-0.54l-0.717-0.09
  18916. c-0.167-0.021-0.312-0.124-0.386-0.274c-0.074-0.15-0.068-0.328,0.016-0.474l1.743-2.995l-0.095-0.805
  18917. c-0.026-0.221,0.097-0.433,0.302-0.519l1.425-0.604l0.92-0.703c0.09-0.069,0.197-0.103,0.303-0.103
  18918. c0.149,0,0.297,0.066,0.396,0.194l0.032,0.041l0.226-0.388c0.05-0.087,0.126-0.156,0.217-0.199l0.967-0.461l0.183-1.004
  18919. c0.034-0.189,0.174-0.342,0.36-0.393l1.884-0.514c0.043-0.012,0.087-0.018,0.131-0.018c0.145,0,0.285,0.063,0.381,0.177
  18920. c0.125,0.147,0.154,0.355,0.073,0.531l-0.52,1.136l0.354,0.61h0.454c0.276,0,0.5,0.224,0.5,0.5v1.428
  18921. c0,0.186-0.103,0.356-0.267,0.442l-1.701,0.896l0.241,0.401c0.065,0.11,0.087,0.24,0.06,0.365l-0.514,2.341
  18922. c-0.021,0.093-0.067,0.179-0.135,0.246l-1.038,1.037l0.132,0.397l0.823,0.532c0.127,0.082,0.21,0.217,0.226,0.367
  18923. c0.016,0.15-0.037,0.3-0.144,0.406l-0.913,0.913c-0.055,0.055-0.122,0.097-0.196,0.121l-1.713,0.57
  18924. C237.86,300.009,237.807,300.018,237.753,300.018z"/>
  18925. <path fill="currentColor" d="M241.806,287.074l-0.628,1.37l0.628,1.084h0.742v1.428l-2.169,1.142l0.514,0.855l-0.514,2.341
  18926. l-1.256,1.256l0.285,0.856l0.971,0.628l-0.913,0.913l-1.713,0.57v-1.027l-1.142-1.027l-1.027,0.571l-1.199-0.914l0.628-0.685
  18927. l-0.856-1.027l-0.913-0.114l1.827-3.14l-0.114-0.971l1.483-0.628l0.971-0.741l0.485,0.627l0.6-1.027l1.198-0.57l0.229-1.256
  18928. L241.806,287.074 M241.806,286.074c-0.087,0-0.176,0.012-0.263,0.035l-1.884,0.514c-0.372,0.102-0.652,0.407-0.721,0.786
  18929. l-0.137,0.752l-0.736,0.35c-0.16,0.076-0.296,0.193-0.395,0.338c-0.085-0.022-0.173-0.034-0.261-0.034
  18930. c-0.212,0-0.425,0.066-0.606,0.205l-0.87,0.664l-1.367,0.579c-0.41,0.173-0.655,0.597-0.604,1.038l0.075,0.639l-1.659,2.852
  18931. c-0.169,0.29-0.181,0.646-0.032,0.946s0.438,0.507,0.772,0.549l0.521,0.065l0.044,0.053l-0.037,0.04
  18932. c-0.19,0.207-0.284,0.484-0.259,0.765c0.025,0.279,0.167,0.536,0.39,0.706l1.199,0.914c0.178,0.136,0.392,0.205,0.606,0.205
  18933. c0.167,0,0.334-0.042,0.486-0.126l0.403-0.225l0.28,0.252v0.582c0,0.321,0.154,0.623,0.415,0.812
  18934. c0.172,0.124,0.377,0.188,0.585,0.188c0.106,0,0.213-0.017,0.316-0.051l1.713-0.57c0.147-0.05,0.281-0.132,0.391-0.242
  18935. l0.913-0.913c0.213-0.214,0.319-0.512,0.288-0.813c-0.032-0.3-0.198-0.57-0.452-0.734l-0.625-0.404l0.789-0.789
  18936. c0.135-0.135,0.229-0.306,0.27-0.493l0.514-2.34c0.051-0.23,0.018-0.47-0.09-0.678l1.234-0.649
  18937. c0.329-0.173,0.534-0.514,0.534-0.885v-1.428c0-0.553-0.448-1-1-1h-0.166l-0.08-0.138l0.413-0.899
  18938. c0.162-0.354,0.104-0.768-0.146-1.064C242.376,286.2,242.095,286.074,241.806,286.074L241.806,286.074z"/>
  18939. </g>
  18940. <g>
  18941. <path fill="currentColor" d="M249.169,308.237c-0.228,0-0.427-0.154-0.484-0.375l-0.399-1.541c-0.04-0.152-0.005-0.314,0.094-0.438
  18942. l0.457-0.57c0.097-0.121,0.242-0.188,0.39-0.188c0.07,0,0.14,0.015,0.207,0.045l0.628,0.285c0.042,0.019,0.081,0.043,0.116,0.072
  18943. l1.083,0.913c0.188,0.158,0.233,0.428,0.108,0.638l-0.542,0.913c-0.09,0.152-0.254,0.245-0.43,0.245H249.169z"/>
  18944. <path fill="currentColor" d="M249.227,305.626l0.628,0.285l1.084,0.913l-0.542,0.913h-1.228l-0.399-1.541L249.227,305.626
  18945. M249.228,304.626c-0.296,0-0.586,0.132-0.781,0.375l-0.457,0.57c-0.197,0.246-0.267,0.57-0.188,0.876l0.399,1.541
  18946. c0.115,0.441,0.513,0.749,0.968,0.749h1.228c0.353,0,0.68-0.187,0.86-0.489l0.542-0.913c0.25-0.421,0.158-0.96-0.216-1.275
  18947. l-1.084-0.913c-0.07-0.059-0.147-0.108-0.23-0.146l-0.628-0.285C249.507,304.655,249.367,304.626,249.228,304.626
  18948. L249.228,304.626z"/>
  18949. </g>
  18950. <g>
  18951. <path fill="currentColor" d="M245.63,306.64c-0.033,0-0.066-0.003-0.098-0.01l-1.427-0.286c-0.193-0.039-0.345-0.187-0.389-0.379
  18952. c-0.044-0.191,0.029-0.392,0.186-0.51l1.884-1.427c0.087-0.066,0.193-0.102,0.302-0.102c0.028,0,0.056,0.002,0.083,0.007
  18953. c0.136,0.023,0.256,0.101,0.333,0.216l0.343,0.514c0.055,0.082,0.084,0.179,0.084,0.277v0.686c0,0.17-0.086,0.329-0.23,0.421
  18954. l-0.8,0.514C245.819,306.612,245.726,306.64,245.63,306.64z"/>
  18955. <path fill="currentColor" d="M246.087,304.427l0.343,0.514v0.686l-0.8,0.514l-1.427-0.286L246.087,304.427 M246.087,303.427
  18956. c-0.216,0-0.429,0.07-0.604,0.203l-1.884,1.427c-0.313,0.237-0.458,0.637-0.371,1.021c0.088,0.383,0.392,0.68,0.778,0.757
  18957. l1.427,0.286c0.065,0.013,0.131,0.02,0.197,0.02c0.19,0,0.378-0.055,0.541-0.158l0.8-0.514c0.286-0.185,0.459-0.501,0.459-0.842
  18958. v-0.686c0-0.197-0.059-0.391-0.168-0.555l-0.343-0.514c-0.153-0.229-0.394-0.386-0.666-0.432
  18959. C246.198,303.432,246.143,303.427,246.087,303.427L246.087,303.427z"/>
  18960. </g>
  18961. <g>
  18962. <path fill="currentColor" d="M272.895,247.137c-0.149,0-0.291-0.067-0.386-0.182l-1.778-2.158c0,0-4.321,0.131-4.326,0.131
  18963. c-0.074,0-0.147-0.017-0.214-0.048l-2.429-1.15l-5.047,1.992c-0.059,0.023-0.121,0.035-0.184,0.035
  18964. c-0.014,0-24.762-2.074-24.762-2.074c-0.08-0.006-0.158-0.033-0.226-0.076l-5.663-3.59c-0.061-0.039-0.113-0.09-0.152-0.151
  18965. l-1.424-2.203l-2.253-0.772c-0.07-0.024-0.134-0.063-0.187-0.115l-2.832-2.762c-0.103-0.101-0.158-0.241-0.15-0.384l0.116-2.195
  18966. l-4.274-0.88c-0.1-0.021-0.192-0.072-0.262-0.146l-2.161-2.287l-2.63,0.501c-0.031,0.006-0.063,0.009-0.094,0.009
  18967. c-0.182,0-0.352-0.099-0.44-0.263l-0.968-1.795c-0.072-0.134-0.08-0.293-0.02-0.433c0.06-0.14,0.18-0.245,0.326-0.286l2.486-0.69
  18968. l2.044-0.969l0.34-1.585l-1.91-8.595l-0.885-3.54l-3.548-0.634c-0.123-0.022-0.232-0.089-0.309-0.188l-1.381-1.795
  18969. c-0.084-0.11-0.119-0.25-0.097-0.386c0.022-0.136,0.101-0.258,0.216-0.334l2.899-1.934c0.083-0.055,0.18-0.084,0.277-0.084
  18970. c0.038,0,0.076,0.004,0.114,0.013l4.027,0.94l5.985-1.463l2.534-2.134c0.091-0.077,0.205-0.118,0.322-0.118
  18971. c0.021,0,0.043,0.001,0.064,0.004l6.153,0.802l4.007-2.973l3.218-7.911l-0.537-7.646l-2.156-3.909
  18972. c-0.069-0.125-0.081-0.275-0.033-0.41l0.631-1.767l-1.962-5.624l-2.358-1.704c-0.069-0.05-0.124-0.117-0.16-0.194l-0.886-1.898
  18973. l-1.758-0.753c-0.07-0.03-0.133-0.076-0.183-0.134l-2.486-2.9c-0.046-0.054-0.081-0.116-0.1-0.184l-0.658-2.238l-1.304-1.434
  18974. c-0.075-0.083-0.12-0.188-0.128-0.298l-0.138-1.795c-0.011-0.139,0.037-0.276,0.132-0.378s0.228-0.16,0.367-0.16h1.158l0.77-2.31
  18975. l-2.641-3.521l-3.775-1.042h-4.904c-0.194,0-0.371-0.112-0.453-0.289l-0.869-1.861l-4.787-1.293l-3.765,0.538
  18976. c-0.024,0.003-0.047,0.005-0.071,0.005c-0.148,0-0.29-0.066-0.385-0.182l-2.624-3.176c-0.037-0.044-0.065-0.094-0.085-0.148
  18977. l-2.9-8.01c-0.063-0.175-0.024-0.371,0.102-0.508l1.401-1.528l0.26-3.89l-0.81-3.238c-0.01-0.04-0.015-0.08-0.015-0.121v-10.772
  18978. l0.836-5.054l1.095-9.728l-0.546-5.61l-0.141-4.729l-0.138-7.048c0-0.039,0.003-0.078,0.011-0.116l0.667-3.07l-1.182-5.384
  18979. l-2.624-2.099c-0.111-0.089-0.179-0.221-0.187-0.363c-0.008-0.142,0.045-0.281,0.146-0.381l2.348-2.348
  18980. c0.094-0.094,0.221-0.146,0.354-0.146h2.471l4.568-3.091l5.629-4.533c0.049-0.04,0.106-0.07,0.167-0.088l5.387-1.658L224.29,59
  18981. l3.722-11.035l-1.804-2.836c-0.095-0.149-0.104-0.337-0.024-0.495c0.08-0.158,0.237-0.261,0.413-0.273
  18982. c0,0,6.375-0.416,6.385-0.416c0.125,0,0.246,0.047,0.338,0.131l1.46,1.339l5.403-1.318c0.039-0.009,0.079-0.014,0.119-0.014
  18983. c0.088,0,0.176,0.023,0.253,0.069l2.142,1.261l1.812-0.68l1.567-2.875c0.051-0.094,0.132-0.17,0.229-0.215l1.677-0.774
  18984. l2.824-3.899c0.078-0.107,0.195-0.18,0.327-0.2c0.025-0.004,0.052-0.006,0.078-0.006c0.105,0,0.208,0.033,0.294,0.096
  18985. l2.957,2.151l3.909,0.944c0.214,0.051,0.369,0.237,0.382,0.457l0.131,2.206l2.344,3.332l1.325-0.331
  18986. c0.04-0.01,0.081-0.015,0.121-0.015c0.141,0,0.277,0.06,0.374,0.168l1.104,1.243c0.081,0.091,0.126,0.209,0.126,0.332v1.502
  18987. l4.704,6.854L285.085,68.5l9.047,6.717l5.234,2.014h2.255c0.092,0,0.183,0.025,0.261,0.074l4.283,2.624
  18988. c0.091,0.055,0.161,0.138,0.202,0.236l0.965,2.348c0.021,0.054,0.034,0.111,0.037,0.17l0.134,3.339l2.572,4.872
  18989. c0.056,0.106,0.072,0.229,0.045,0.346l-1.206,5.219l3.656,7.854l4.113,5.956l2.123,0.25c0.146,0.017,0.278,0.099,0.359,0.222
  18990. c0.081,0.124,0.104,0.276,0.062,0.418l-1.481,4.961l0.522,2.24c0.052,0.226-0.057,0.458-0.264,0.561l-1.275,0.638l-2.794,3.725
  18991. l-2.99,6.931l-1.212,7.814l3.06,7.85l2.184,1.156c0.047,0.025,0.09,0.058,0.127,0.096l3.039,3.176
  18992. c0.183,0.191,0.186,0.492,0.005,0.686l-1.712,1.842l-2.038,7.75l-0.394,3.324l0.406,3.254c0.013,0.098-0.005,0.197-0.049,0.286
  18993. l-1.324,2.65l0.133,4.57l0.521,2.961l2.729,2.989l1.712,0.733l2.215-0.261c0.02-0.002,0.039-0.003,0.059-0.003
  18994. c0.094,0,0.186,0.026,0.265,0.076l2.211,1.381c0.141,0.087,0.229,0.239,0.235,0.405l0.137,3.591
  18995. c0.009,0.243-0.157,0.457-0.396,0.508l-3.708,0.794l-2.2,2.459l-0.707,1.297l0.718,2.874l1.553,0.597
  18996. c0.127,0.049,0.229,0.148,0.282,0.274l0.691,1.657c0.022,0.056,0.036,0.116,0.038,0.176l0.135,4.172l2.574,5.15l2.193,3.698
  18997. l1.269,2.812c0.085,0.189,0.044,0.412-0.103,0.559l-1.354,1.353l0.346,3.685l0.464-0.046l0.106-1.378
  18998. c0.016-0.206,0.156-0.381,0.354-0.44l1.381-0.415c0.047-0.014,0.096-0.021,0.144-0.021c0.139,0,0.273,0.058,0.37,0.164
  18999. l1.381,1.519c0.04,0.044,0.072,0.095,0.094,0.151l1.934,4.834c0.061,0.15,0.044,0.32-0.043,0.456
  19000. c-0.088,0.136-0.236,0.221-0.397,0.229l-5.551,0.258l-0.612,2.936c-0.038,0.182-0.173,0.327-0.351,0.378l-8.952,2.577
  19001. l-3.283,4.464l-0.669,3.752c-0.014,0.078-0.046,0.151-0.094,0.215l-2.625,3.453c-0.095,0.124-0.242,0.197-0.398,0.197h-5.523
  19002. c-0.053,0-0.105-0.008-0.156-0.025l-10.496-3.453c-0.052-0.017-0.101-0.042-0.144-0.075l-5.344-4.006l-1.213,0.26l0.99,4.34
  19003. c0.059,0.255-0.09,0.511-0.339,0.589l-9.923,3.084l-0.642,4.111c-0.038,0.243-0.248,0.423-0.494,0.423H272.895z"/>
  19004. <path fill="currentColor" d="M251.213,37.265l3.037,2.21l4.006,0.967l0.139,2.348l2.623,3.729l1.658-0.414l1.104,1.243v1.657
  19005. l4.834,7.044l16.16,12.844l9.115,6.768l5.385,2.071h2.348l4.283,2.624l0.965,2.348l0.139,3.453l2.625,4.972l-1.244,5.386
  19006. l3.729,8.01l4.283,6.215l2.348,0.276l-1.52,5.088l0.553,2.37l-1.381,0.69l-2.9,3.867l-3.039,7.043l-1.242,8.01l3.176,8.148
  19007. l2.348,1.243l3.039,3.176l-1.797,1.934l-2.07,7.872l-0.414,3.453l0.414,3.314l-1.381,2.762l0.137,4.696l0.553,3.177l2.9,3.176
  19008. l1.934,0.829l2.348-0.276l2.211,1.381l0.137,3.591l-3.867,0.829l-2.348,2.624l-0.828,1.519l0.828,3.314l1.795,0.691l0.691,1.657
  19009. l0.139,4.281l2.623,5.248l2.211,3.729l1.242,2.762l-1.52,1.519l0.414,4.419l1.381-0.138l0.139-1.795l1.381-0.415l1.381,1.519
  19010. l1.934,4.834l-5.938,0.276l-0.691,3.315l-9.115,2.624l-3.453,4.696l-0.689,3.867l-2.625,3.453h-5.523l-10.496-3.453l-5.525-4.143
  19011. l-1.932,0.414l1.104,4.834l-10.221,3.177l-0.689,4.419h-1.658l-1.934-2.348l-4.557,0.138l-2.625-1.243l-5.248,2.072l-24.72-2.072
  19012. l-5.663-3.59l-1.519-2.348l-2.417-0.829l-2.832-2.762l0.139-2.624l-4.695-0.967l-2.349-2.486l-2.899,0.552l-0.968-1.795
  19013. l2.486-0.69l2.348-1.104l0.415-1.934l-1.934-8.701l-0.967-3.867l-3.867-0.691l-1.381-1.795l2.899-1.934l4.144,0.967l6.215-1.52
  19014. l2.624-2.209l6.354,0.829l4.281-3.177l3.314-8.148l-0.553-7.872l-2.209-4.005l0.69-1.933l-2.072-5.939l-2.485-1.795l-0.967-2.071
  19015. l-1.934-0.829l-2.486-2.9l-0.69-2.348l-1.381-1.519l-0.138-1.795h1.519l0.967-2.9l-2.9-3.867l-4.005-1.105h-4.972l-0.967-2.072
  19016. l-5.11-1.381l-3.867,0.552l-2.624-3.176l-2.9-8.01l1.52-1.657l0.276-4.144l-0.829-3.314v-10.772l0.829-4.972l1.104-9.806
  19017. l-0.552-5.662l-0.139-4.696l-0.138-7.043l0.69-3.176l-1.243-5.663l-2.762-2.209l2.348-2.348h2.624l4.695-3.177l5.662-4.557
  19018. l5.387-1.658l6.768-3.176l3.866-11.463l-1.933-3.038l6.353-0.415l1.657,1.52l5.663-1.381l2.348,1.381l2.21-0.829l1.656-3.039
  19019. l1.796-0.829L251.213,37.265 M251.213,36.265c-0.052,0-0.104,0.004-0.157,0.012c-0.262,0.042-0.497,0.186-0.653,0.401
  19020. l-2.748,3.793l-1.558,0.719c-0.195,0.09-0.356,0.241-0.459,0.43l-1.478,2.711l-1.415,0.53l-1.936-1.139
  19021. c-0.155-0.091-0.331-0.138-0.507-0.138c-0.079,0-0.159,0.009-0.237,0.028l-5.144,1.255l-1.264-1.158
  19022. c-0.185-0.17-0.426-0.263-0.676-0.263c-0.021,0-0.043,0-0.065,0.002l-6.353,0.415c-0.353,0.023-0.667,0.23-0.827,0.545
  19023. c-0.16,0.315-0.142,0.691,0.048,0.989l1.676,2.635l-3.577,10.606l-6.318,2.965l-5.319,1.637
  19024. c-0.122,0.037-0.234,0.097-0.333,0.177l-5.63,4.531l-4.407,2.982h-2.317c-0.265,0-0.52,0.105-0.707,0.293l-2.348,2.348
  19025. c-0.201,0.201-0.307,0.479-0.292,0.762c0.016,0.284,0.152,0.548,0.374,0.726l2.485,1.989l1.121,5.104l-0.644,2.963
  19026. c-0.017,0.076-0.024,0.154-0.023,0.232l0.138,7.043l0.139,4.706c0,0.023,0.002,0.045,0.004,0.068l0.542,5.557l-1.09,9.675
  19027. l-0.825,4.946c-0.009,0.054-0.014,0.109-0.014,0.165v10.772c0,0.082,0.01,0.163,0.03,0.243l0.791,3.162L199,135.319l-1.282,1.398
  19028. c-0.252,0.274-0.33,0.666-0.204,1.016l2.9,8.01c0.039,0.108,0.097,0.208,0.169,0.296l2.624,3.176
  19029. c0.191,0.232,0.475,0.363,0.771,0.363c0.047,0,0.094-0.003,0.141-0.01l3.664-0.523l4.463,1.206l0.77,1.65
  19030. c0.165,0.352,0.518,0.577,0.906,0.577h4.836l3.545,0.978l2.381,3.174l-0.573,1.72h-0.798c-0.278,0-0.544,0.116-0.733,0.32
  19031. c-0.189,0.205-0.285,0.479-0.264,0.756l0.138,1.795c0.017,0.222,0.107,0.432,0.257,0.596l1.226,1.349l0.625,2.128
  19032. c0.04,0.136,0.108,0.261,0.2,0.369l2.486,2.9c0.1,0.116,0.225,0.208,0.365,0.268l1.583,0.679l0.805,1.725
  19033. c0.072,0.154,0.183,0.288,0.321,0.388l2.23,1.611l1.852,5.309l-0.572,1.601c-0.096,0.27-0.072,0.568,0.066,0.819l2.103,3.813
  19034. l0.521,7.42l-3.122,7.674l-3.732,2.769l-5.953-0.776c-0.043-0.005-0.086-0.008-0.129-0.008c-0.234,0-0.463,0.083-0.644,0.235
  19035. l-2.445,2.059l-5.755,1.407l-3.911-0.913c-0.075-0.018-0.152-0.026-0.228-0.026c-0.196,0-0.389,0.058-0.555,0.168l-2.899,1.934
  19036. c-0.23,0.154-0.387,0.396-0.432,0.669c-0.045,0.273,0.025,0.553,0.194,0.772l1.381,1.795c0.151,0.197,0.372,0.331,0.617,0.375
  19037. l3.23,0.577l0.81,3.239l1.88,8.462l-0.266,1.236l-1.823,0.857l-2.405,0.668c-0.293,0.081-0.533,0.292-0.652,0.571
  19038. s-0.104,0.599,0.04,0.867l0.968,1.795c0.177,0.328,0.518,0.525,0.88,0.525c0.063,0,0.125-0.006,0.188-0.018l2.361-0.45
  19039. l1.973,2.087c0.141,0.149,0.324,0.251,0.525,0.293l3.853,0.793l-0.093,1.765c-0.015,0.288,0.094,0.567,0.3,0.769l2.832,2.762
  19040. c0.106,0.104,0.234,0.182,0.374,0.23l2.089,0.716l1.331,2.058c0.079,0.122,0.183,0.224,0.304,0.302l5.663,3.59
  19041. c0.136,0.086,0.292,0.138,0.452,0.152l24.72,2.072c0.028,0.002,0.057,0.003,0.084,0.003c0.125,0,0.25-0.023,0.367-0.07
  19042. l4.845-1.913l2.233,1.058c0.134,0.063,0.28,0.096,0.428,0.096c0.01,0,0.021,0,0.03,0l4.066-0.123l1.622,1.969
  19043. c0.189,0.23,0.473,0.364,0.771,0.364h1.658c0.493,0,0.912-0.359,0.988-0.846l0.593-3.803l9.626-2.992
  19044. c0.499-0.155,0.794-0.668,0.678-1.178l-0.878-3.846l0.496-0.106l5.161,3.87c0.087,0.065,0.184,0.116,0.287,0.149L302,242.338
  19045. c0.101,0.033,0.206,0.05,0.313,0.05h5.523c0.313,0,0.607-0.146,0.796-0.395l2.625-3.453c0.096-0.126,0.161-0.273,0.188-0.43
  19046. l0.648-3.637l3.113-4.234l8.788-2.53c0.356-0.103,0.627-0.394,0.702-0.757l0.533-2.556l5.164-0.24
  19047. c0.323-0.015,0.619-0.186,0.794-0.458c0.175-0.272,0.208-0.612,0.088-0.913l-1.934-4.834c-0.045-0.111-0.108-0.213-0.188-0.301
  19048. l-1.381-1.519c-0.192-0.211-0.463-0.327-0.74-0.327c-0.096,0-0.192,0.014-0.287,0.042l-1.381,0.415
  19049. c-0.188,0.056-0.349,0.164-0.471,0.305l-0.137-1.458l1.188-1.187c0.294-0.293,0.375-0.738,0.205-1.117l-1.242-2.762
  19050. c-0.016-0.034-0.033-0.067-0.052-0.1l-2.192-3.698l-2.51-5.021l-0.132-4.062c-0.004-0.122-0.029-0.241-0.076-0.353l-0.691-1.657
  19051. c-0.105-0.252-0.309-0.45-0.563-0.548l-1.311-0.504l-0.607-2.432l0.586-1.075l2.054-2.295l3.549-0.76
  19052. c0.475-0.102,0.808-0.531,0.789-1.016l-0.137-3.591c-0.013-0.331-0.188-0.634-0.469-0.81l-2.211-1.381
  19053. c-0.16-0.1-0.344-0.152-0.53-0.152c-0.039,0-0.078,0.002-0.117,0.007l-2.082,0.245l-1.489-0.638l-2.558-2.801l-0.491-2.818
  19054. l-0.127-4.373l1.269-2.537c0.088-0.177,0.122-0.375,0.098-0.571l-0.398-3.193l0.391-3.263l1.989-7.563l1.626-1.75
  19055. c0.36-0.388,0.356-0.989-0.01-1.372l-3.039-3.176c-0.074-0.077-0.16-0.142-0.255-0.192l-2.019-1.069l-2.943-7.551l1.182-7.619
  19056. l2.941-6.818l2.688-3.583l1.17-0.585c0.414-0.207,0.632-0.671,0.526-1.122l-0.492-2.111l1.443-4.834
  19057. c0.085-0.283,0.04-0.589-0.122-0.835c-0.163-0.247-0.426-0.409-0.719-0.444l-1.898-0.223l-3.979-5.773l-3.548-7.623l1.167-5.051
  19058. c0.054-0.234,0.021-0.479-0.09-0.692l-2.52-4.771l-0.13-3.226c-0.005-0.117-0.029-0.232-0.074-0.34l-0.965-2.348
  19059. c-0.08-0.196-0.222-0.362-0.402-0.473l-4.283-2.624c-0.157-0.097-0.338-0.147-0.522-0.147h-2.162l-5.084-1.956l-9.006-6.686
  19060. l-16.017-12.73l-4.573-6.665v-1.347c0-0.245-0.09-0.481-0.252-0.664l-1.104-1.243c-0.192-0.216-0.466-0.336-0.748-0.336
  19061. c-0.081,0-0.162,0.01-0.242,0.03l-0.993,0.248l-2.064-2.935l-0.122-2.064c-0.025-0.439-0.336-0.81-0.764-0.913l-3.813-0.92
  19062. l-2.877-2.093C251.629,36.331,251.423,36.265,251.213,36.265L251.213,36.265z"/>
  19063. </g>
  19064. <g>
  19065. <path fill="currentColor" d="M310.807,256.391c-0.104,0-0.206-0.032-0.291-0.093l-0.916-0.655l-2.395-0.944
  19066. c-0.19-0.075-0.316-0.26-0.316-0.465v-1.317l-0.917-1.599l-1.312-0.524l-0.744,0.532c-0.087,0.062-0.188,0.093-0.291,0.093
  19067. c-0.084,0-0.168-0.021-0.244-0.063c-0.169-0.095-0.269-0.278-0.255-0.472l0.121-1.705l-1.22-1.221
  19068. c-0.061-0.06-0.104-0.135-0.127-0.216l-0.275-0.967c-0.074-0.261,0.072-0.533,0.331-0.614l6.84-2.146l0.405-0.81v-0.917
  19069. c0-0.115,0.04-0.227,0.112-0.316l1.52-1.864c0.047-0.057,0.105-0.104,0.173-0.135l1.449-0.691
  19070. c0.067-0.032,0.141-0.049,0.215-0.049c0.02,0,0.039,0.001,0.06,0.003l2.9,0.346c0.145,0.018,0.275,0.097,0.356,0.219l0.691,1.036
  19071. c0.148,0.222,0.096,0.521-0.119,0.68l-3.947,2.912l0.167,0.707l1.202,1.14c0.038,0.036,0.07,0.078,0.096,0.124l0.271,0.499h2.742
  19072. c0.118,0,0.232,0.042,0.322,0.118l1.313,1.105c0.146,0.124,0.21,0.321,0.162,0.507l-0.553,2.141
  19073. c-0.025,0.096-0.078,0.183-0.152,0.249l-0.621,0.552c-0.094,0.083-0.213,0.126-0.332,0.126c-0.088,0-0.176-0.022-0.254-0.069
  19074. l-0.766-0.452v0.505c0,0.201-0.12,0.382-0.305,0.461l-1.795,0.759c-0.063,0.027-0.13,0.04-0.195,0.04
  19075. c-0.119,0-0.236-0.043-0.328-0.123v0.659c0,0.072-0.016,0.145-0.046,0.21l-0.416,0.897c-0.019,0.038-0.04,0.074-0.067,0.106
  19076. l-1.242,1.52c-0.095,0.116-0.236,0.184-0.387,0.184H310.807z"/>
  19077. <path fill="currentColor" d="M312.67,239.731l2.9,0.346l0.691,1.036l-4.213,3.107l0.277,1.174l1.311,1.243l0.414,0.76h3.039
  19078. l1.313,1.105l-0.553,2.141l-0.621,0.552l-1.52-0.897v1.381l-1.795,0.76l-0.828-1.035v2.071l-0.416,0.897l-1.242,1.52h-0.621
  19079. l-0.967-0.69l-2.451-0.967v-1.45l-1.07-1.865l-1.727-0.69l-0.967,0.69l0.137-1.933l-1.381-1.382l-0.275-0.967l7.043-2.209
  19080. l0.553-1.105v-1.036l1.52-1.864L312.67,239.731 M312.67,238.731c-0.148,0-0.296,0.033-0.431,0.097l-1.449,0.691
  19081. c-0.133,0.064-0.251,0.156-0.345,0.271l-1.52,1.864c-0.146,0.179-0.225,0.402-0.225,0.632v0.799l-0.257,0.514l-6.639,2.083
  19082. c-0.517,0.162-0.811,0.707-0.662,1.228l0.275,0.967c0.047,0.164,0.135,0.313,0.255,0.433l1.059,1.059l-0.104,1.478
  19083. c-0.027,0.386,0.171,0.754,0.509,0.943c0.152,0.086,0.32,0.128,0.488,0.128c0.204,0,0.408-0.063,0.581-0.187l0.522-0.372
  19084. l0.896,0.358l0.765,1.332v1.184c0,0.411,0.251,0.779,0.633,0.931l2.337,0.921l0.867,0.619c0.17,0.121,0.373,0.187,0.581,0.187
  19085. h0.621c0.3,0,0.584-0.135,0.774-0.367l1.242-1.52c0.053-0.064,0.098-0.136,0.133-0.212l0.416-0.897
  19086. c0.062-0.132,0.093-0.275,0.093-0.421v-0.051c0.073-0.013,0.146-0.034,0.218-0.064l1.795-0.76
  19087. c0.263-0.111,0.46-0.325,0.552-0.584l0.069,0.041c0.158,0.093,0.334,0.139,0.509,0.139c0.239,0,0.477-0.086,0.664-0.252
  19088. l0.621-0.552c0.148-0.133,0.255-0.306,0.304-0.498l0.553-2.141c0.097-0.373-0.029-0.767-0.323-1.015l-1.313-1.105
  19089. c-0.181-0.152-0.409-0.235-0.645-0.235h-2.445l-0.13-0.238c-0.05-0.092-0.114-0.175-0.189-0.247l-1.095-1.038l-0.057-0.241
  19090. l3.682-2.715c0.43-0.317,0.534-0.916,0.238-1.36l-0.691-1.036c-0.163-0.243-0.424-0.403-0.714-0.438l-2.9-0.346
  19091. C312.749,238.734,312.709,238.731,312.67,238.731L312.67,238.731z"/>
  19092. </g>
  19093. <g>
  19094. <path fill="currentColor" d="M117.627,107.579c-0.066,0-0.133-0.013-0.197-0.041l-4.351-1.865c-0.045-0.019-0.087-0.045-0.125-0.076
  19095. l-3.211-2.693c-0.057-0.048-0.103-0.108-0.134-0.176l-0.997-2.194l-8.615-8.415l-1.671,0.616
  19096. c-0.057,0.021-0.115,0.031-0.173,0.031c-0.143,0-0.283-0.062-0.379-0.175l-1.243-1.45c-0.099-0.114-0.14-0.267-0.112-0.416
  19097. s0.12-0.276,0.252-0.349l0.854-0.466l-0.18-2.161c-0.017-0.197,0.084-0.384,0.257-0.479l2.072-1.14
  19098. c0.074-0.041,0.157-0.062,0.241-0.062c0.019,0,1.715,0.188,1.715,0.188l4.191-3.334l-0.086-1.292
  19099. c-0.005-0.079,0.008-0.158,0.04-0.23l1.243-2.9c0.021-0.051,0.052-0.098,0.089-0.139l1.878-2.077l0.828-3.769l-1.561-0.954
  19100. c-0.118-0.072-0.201-0.189-0.229-0.325l-0.518-2.486c-0.021-0.102-0.01-0.208,0.032-0.303l1.139-2.589
  19101. c0.08-0.182,0.259-0.299,0.458-0.299h1.434l0.565-1.292l0.268-2.141l-1.549-1.275c-0.122-0.1-0.189-0.252-0.182-0.41
  19102. c0.007-0.157,0.089-0.302,0.22-0.391l7.875-5.319l2.324-4.244c0.042-0.077,0.103-0.141,0.178-0.187l1.865-1.14
  19103. c0.08-0.049,0.17-0.073,0.261-0.073c0.072,0,0.144,0.016,0.211,0.047l4.354,2.025h7.671l2.581-0.956l1.053-1.339
  19104. c0.095-0.121,0.24-0.191,0.393-0.191h1.036c0.161,0,0.312,0.077,0.405,0.207l1.254,1.737l4.616,1.605
  19105. c0.059,0.021,0.113,0.051,0.16,0.092l6.262,5.338l7.804,3.388c0.183,0.079,0.301,0.259,0.301,0.458v0.95h2.534l1.52-1.235
  19106. c0.092-0.075,0.204-0.112,0.315-0.112s0.224,0.037,0.315,0.112l1.519,1.235h7.121l4.736-1.486l1.242-1.507v-0.96
  19107. c0-0.169,0.085-0.327,0.228-0.419l1.036-0.673c0.082-0.053,0.177-0.081,0.272-0.081c0.048,0,0.096,0.007,0.142,0.021
  19108. c0.141,0.042,0.255,0.143,0.315,0.276l0.548,1.234l1.497,0.749c0.134,0.067,0.23,0.19,0.264,0.336l0.791,3.458l3.908,3.206
  19109. c0.124,0.102,0.191,0.255,0.182,0.415c-0.009,0.159-0.093,0.305-0.228,0.392l-1.701,1.1l-1.688,1.97l0.09,1.883l0.791,1.779
  19110. c0.055,0.124,0.057,0.264,0.007,0.39c-0.051,0.126-0.15,0.226-0.275,0.276l-2.683,1.094l-6.239,7.364l-0.993,1.634l0.376,1.88
  19111. c0.042,0.21-0.055,0.424-0.241,0.532l-7.561,4.351c-0.077,0.044-0.163,0.066-0.25,0.066c-0.077,0-0.153-0.018-0.224-0.053
  19112. l-0.916-0.458l-3.164,3.259c-0.094,0.097-0.224,0.152-0.359,0.152h-1.238l-3.397,1.553l-1.164,1.747
  19113. c-0.085,0.127-0.223,0.208-0.375,0.221c-0.014,0.001-0.027,0.001-0.041,0.001c-0.138,0-0.271-0.057-0.366-0.159l-2.748-2.951
  19114. l-4.339-2.564l-2.928,0.488c-0.027,0.004-0.055,0.007-0.082,0.007c-0.145,0-0.284-0.063-0.38-0.175l-1.093-1.275h-0.694
  19115. l-3.627,1.713c-0.038,0.018-0.078,0.031-0.119,0.039l-3.008,0.582l-1.645,2.419c-0.094,0.138-0.25,0.219-0.414,0.219
  19116. c-0.021,0-0.041-0.001-0.062-0.004l-5.8-0.725c-0.092-0.011-0.178-0.048-0.25-0.105l-0.847-0.678l-0.723,0.167v0.638
  19117. c0,0.18-0.097,0.347-0.254,0.435l-2.382,1.347c-0.077,0.043-0.162,0.065-0.246,0.065c-0.11,0-0.219-0.036-0.309-0.107
  19118. l-1.013-0.795l-0.592,0.948l0.496,0.992c0.058,0.116,0.069,0.25,0.029,0.374l-0.622,1.968c-0.021,0.065-0.054,0.125-0.099,0.177
  19119. l-5.386,6.215C117.908,107.518,117.769,107.579,117.627,107.579z"/>
  19120. <path fill="currentColor" d="M139.69,49.177l1.347,1.864l4.765,1.657l6.318,5.387l7.872,3.418v1.45h3.211l1.658-1.347l1.657,1.347
  19121. h7.375l4.951-1.554l1.45-1.761v-1.14l1.036-0.673l0.621,1.398l1.657,0.829l0.829,3.625l4.04,3.314l-1.762,1.139l-1.864,2.176
  19122. l0.104,2.175l0.829,1.864l-2.797,1.14l-6.318,7.458l-1.14,1.864l0.414,2.072l-7.561,4.351l-1.243-0.622l-3.418,3.521h-1.347
  19123. l-3.625,1.657l-1.243,1.865l-2.796-3.004l-4.558-2.693l-3.107,0.518l-1.243-1.45h-1.036l-3.729,1.761l-3.211,0.621l-1.761,2.59
  19124. l-5.8-0.725l-1.036-0.829l-1.346,0.311v1.036l-2.382,1.347l-1.451-1.139l-1.036,1.657l0.622,1.243l-0.622,1.968l-5.386,6.215
  19125. l-4.351-1.865l-3.211-2.693l-1.036-2.279l-8.908-8.701l-1.968,0.725l-1.243-1.45l1.14-0.622l-0.208-2.486l2.072-1.14l1.865,0.208
  19126. l4.558-3.625l-0.104-1.554l1.243-2.9l1.968-2.175l0.933-4.247l-1.865-1.14l-0.518-2.486l1.139-2.589h1.761l0.726-1.657
  19127. l0.311-2.486l-1.761-1.45l7.976-5.387l2.382-4.35l1.865-1.14l4.454,2.072h7.872l2.797-1.036l1.14-1.45H139.69 M139.69,48.177
  19128. h-1.036c-0.307,0-0.597,0.141-0.786,0.382l-0.965,1.228l-2.364,0.875h-7.472l-4.253-1.979c-0.134-0.063-0.278-0.093-0.422-0.093
  19129. c-0.181,0-0.362,0.049-0.521,0.147l-1.865,1.14c-0.149,0.091-0.271,0.219-0.355,0.373l-2.266,4.138l-7.775,5.251
  19130. c-0.262,0.176-0.424,0.466-0.439,0.781c-0.015,0.315,0.12,0.619,0.363,0.819l1.336,1.101l-0.224,1.795l-0.405,0.925h-1.107
  19131. c-0.396,0-0.756,0.234-0.916,0.597l-1.139,2.589c-0.083,0.191-0.106,0.403-0.063,0.606l0.518,2.486
  19132. c0.056,0.271,0.222,0.506,0.458,0.65l1.257,0.768l-0.723,3.291l-1.79,1.979c-0.074,0.082-0.134,0.175-0.177,0.277l-1.243,2.9
  19133. c-0.063,0.146-0.089,0.303-0.079,0.461l0.069,1.031l-3.824,3.042l-1.455-0.162c-0.037-0.004-0.074-0.006-0.111-0.006
  19134. c-0.168,0-0.334,0.042-0.482,0.124l-2.072,1.14c-0.346,0.19-0.547,0.566-0.515,0.959L97,89.629l-0.568,0.31
  19135. c-0.265,0.145-0.45,0.401-0.504,0.697c-0.055,0.297,0.028,0.603,0.224,0.832l1.243,1.45c0.194,0.226,0.473,0.349,0.759,0.349
  19136. c0.116,0,0.233-0.02,0.346-0.062l1.375-0.507l8.322,8.128l0.958,2.108c0.062,0.136,0.153,0.257,0.268,0.353l3.211,2.693
  19137. c0.075,0.063,0.159,0.114,0.249,0.153l4.351,1.865c0.127,0.055,0.261,0.081,0.394,0.081c0.284,0,0.562-0.121,0.756-0.345
  19138. l5.386-6.215c0.089-0.103,0.157-0.224,0.198-0.354l0.622-1.968c0.078-0.248,0.057-0.516-0.059-0.749l-0.371-0.742l0.148-0.237
  19139. l0.575,0.452c0.18,0.141,0.398,0.213,0.618,0.213c0.169,0,0.339-0.042,0.492-0.129l2.382-1.347
  19140. c0.314-0.177,0.508-0.51,0.508-0.871v-0.24l0.1-0.023l0.658,0.526c0.145,0.115,0.318,0.188,0.501,0.211l5.8,0.725
  19141. c0.042,0.005,0.083,0.008,0.124,0.008c0.329,0,0.639-0.162,0.827-0.438l1.529-2.249l2.806-0.542
  19142. c0.082-0.016,0.162-0.042,0.237-0.078l3.525-1.666h0.352l0.943,1.101c0.191,0.224,0.47,0.349,0.759,0.349
  19143. c0.055,0,0.109-0.004,0.165-0.014l2.748-0.458l4.12,2.434l2.698,2.898c0.19,0.204,0.456,0.319,0.732,0.319
  19144. c0.027,0,0.054-0.001,0.081-0.003c0.305-0.024,0.582-0.188,0.751-0.442l1.085-1.628l3.169-1.448h1.129
  19145. c0.271,0,0.529-0.109,0.718-0.304l2.908-2.996l0.588,0.294c0.141,0.07,0.294,0.105,0.447,0.105c0.172,0,0.345-0.044,0.499-0.133
  19146. l7.561-4.351c0.372-0.214,0.566-0.642,0.482-1.063l-0.337-1.688l0.896-1.464l6.11-7.212l2.57-1.047
  19147. c0.25-0.103,0.449-0.302,0.55-0.553s0.096-0.533-0.014-0.78l-0.753-1.693l-0.076-1.591l1.512-1.764l1.64-1.06
  19148. c0.268-0.173,0.438-0.464,0.456-0.783s-0.117-0.627-0.364-0.83l-3.776-3.098l-0.753-3.292c-0.066-0.291-0.26-0.538-0.527-0.671
  19149. l-1.336-0.668l-0.475-1.07c-0.119-0.268-0.349-0.47-0.63-0.553c-0.093-0.028-0.189-0.042-0.284-0.042
  19150. c-0.191,0-0.381,0.055-0.545,0.162l-1.036,0.673c-0.284,0.185-0.455,0.5-0.455,0.838v0.781l-1.033,1.254l-4.521,1.419h-6.867
  19151. l-1.381-1.123c-0.184-0.149-0.407-0.224-0.631-0.224s-0.447,0.075-0.63,0.224l-1.382,1.123h-1.856v-0.45
  19152. c0-0.398-0.236-0.759-0.602-0.917l-7.735-3.358l-6.205-5.29c-0.095-0.081-0.203-0.143-0.32-0.184l-4.467-1.554l-1.162-1.609
  19153. C140.313,48.331,140.011,48.177,139.69,48.177L139.69,48.177z"/>
  19154. </g>
  19155. <g>
  19156. <path fill="currentColor" d="M188.891,199.973c-0.146,0-0.286-0.064-0.38-0.176c-0.095-0.111-0.136-0.259-0.113-0.403l0.371-2.316
  19157. l-4.764-4.181l-0.663-0.121l-0.443,0.739c-0.074,0.123-0.196,0.208-0.337,0.234c-0.03,0.005-0.061,0.008-0.092,0.008
  19158. c-0.11,0-0.218-0.037-0.307-0.105l-1.865-1.45c-0.184-0.143-0.244-0.393-0.147-0.604l0.524-1.134l-0.832-1.756
  19159. c-0.052-0.109-0.063-0.232-0.03-0.348l1.036-3.729l1.184-7.215l-2.563-1.993c-0.057-0.044-0.104-0.101-0.137-0.165l-3.004-5.8
  19160. c-0.074-0.142-0.075-0.311-0.003-0.454l0.353-0.705l-3.625-3.449l-0.691,0.691c-0.094,0.094-0.221,0.146-0.354,0.146
  19161. c-0.002,0-0.003,0-0.005,0c-0.134-0.001-0.262-0.057-0.355-0.154l-2.417-2.517l-9.645-4.207l-2.113-1.16l-4.325-3.575
  19162. c-0.114-0.095-0.181-0.236-0.181-0.385v-1.807l-5.582-3.788c-0.068-0.046-0.124-0.108-0.162-0.181l-0.967-1.837l-3.392-1.896
  19163. c-0.047-0.026-0.089-0.06-0.125-0.099l-1.139-1.243c-0.084-0.092-0.131-0.213-0.131-0.338v-1.139
  19164. c0-0.189,0.107-0.362,0.276-0.447l1.45-0.725c0.069-0.035,0.146-0.053,0.224-0.053h2.589c0.138,0,0.269,0.057,0.363,0.157
  19165. l1.628,1.723l2.44,0.181l3.016-1.885l0.567-1.891l1.108-7.485l-0.797-2.691c-0.024-0.081-0.027-0.167-0.009-0.249l0.711-3.255
  19166. l-0.102-3.771l0.51-4.223l-0.596-2.185c-0.057-0.209,0.027-0.432,0.209-0.55l4.454-2.9c0.082-0.053,0.176-0.081,0.273-0.081
  19167. c0.003,0,6.175,0.101,6.175,0.101l3.083-1.989c0.083-0.054,0.177-0.08,0.271-0.08c0.097,0,0.193,0.028,0.277,0.084l0.605,0.403
  19168. l2.404-2.219l3.48-2.328c0.083-0.055,0.179-0.084,0.277-0.084c0.029,0,0.058,0.002,0.086,0.007l4.143,0.725
  19169. c0.092,0.016,0.177,0.058,0.247,0.12l3.937,3.522c0.106,0.095,0.167,0.23,0.167,0.373v2.278c0,0.145-0.063,0.282-0.171,0.377
  19170. l-3.954,3.447l-1.819,4.246l-2.153,7.605l-0.909,6.186l0.605,4.646l0.871,2.516l3.899,3.314h1.37
  19171. c0.135,0,0.265,0.055,0.359,0.152l6.575,6.781l4.179,2.242l3.506,1.184h5.477c0.276,0,0.5,0.224,0.5,0.5v1.211l0.864,0.336
  19172. v-0.408c0-0.174,0.091-0.336,0.239-0.427l1.864-1.139c0.08-0.049,0.17-0.073,0.261-0.073c0.081,0,0.161,0.02,0.234,0.059
  19173. l3.314,1.761c0.126,0.067,0.218,0.185,0.251,0.323s0.006,0.285-0.075,0.403l-0.781,1.129l0.354,0.922l3.042,1.57l2.875,2.225
  19174. c0.054,0.042,0.1,0.095,0.132,0.156l1.968,3.625c0.063,0.115,0.077,0.249,0.042,0.375l-1.939,6.838l0.192,1.345
  19175. c0.01,0.07,0.005,0.141-0.014,0.208l-1.243,4.35c-0.019,0.065-0.05,0.125-0.093,0.178l-2.692,3.315
  19176. c-0.095,0.117-0.238,0.185-0.388,0.185h-1.752l-3.917,1.861l-2.514,3.719c-0.021,0.032-0.046,0.062-0.075,0.087l-1.347,1.243
  19177. c-0.035,0.032-0.074,0.059-0.116,0.08l-2.071,1.036c-0.071,0.036-0.147,0.053-0.224,0.053c-0.12,0-0.239-0.043-0.332-0.126
  19178. l-0.539-0.479l-2.571,3.214c-0.095,0.119-0.239,0.188-0.391,0.188h-2.805l0.094,4.98c0.002,0.134-0.049,0.264-0.143,0.359
  19179. c-0.094,0.096-0.223,0.15-0.357,0.15H188.891z"/>
  19180. <path fill="currentColor" d="M176.358,105.421l4.143,0.725l3.937,3.522v2.278l-4.04,3.522l-1.864,4.351l-2.175,7.665l-0.933,6.318
  19181. l0.621,4.765l0.933,2.693l4.144,3.522h1.554l6.629,6.836l4.247,2.279l3.66,1.243h5.559v1.553l1.864,0.725v-1.139l1.864-1.139
  19182. l3.314,1.761l-0.932,1.346l0.518,1.347l3.211,1.657l2.797,2.175l1.968,3.625l-1.968,6.94l0.207,1.45l-1.243,4.35l-2.692,3.315
  19183. h-1.865l-4.143,1.968l-2.59,3.833l-1.347,1.243l-2.071,1.036l-0.933-0.829l-2.9,3.625h-3.314l0.104,5.49h-3.729l0.414-2.589
  19184. l-5.075-4.454l-1.14-0.207l-0.621,1.036l-1.865-1.45l0.622-1.347l-0.933-1.968l1.036-3.729l1.243-7.562l-2.797-2.175l-3.004-5.8
  19185. l0.518-1.036l-4.246-4.04l-1.036,1.036l-2.486-2.589l-9.736-4.247l-2.072-1.139l-4.247-3.521v-2.072l-5.801-3.936l-1.036-1.968
  19186. l-3.522-1.968l-1.139-1.243v-1.139l1.45-0.725h2.589l1.761,1.864l2.797,0.207l3.314-2.071l0.622-2.072l1.14-7.665l-0.829-2.797
  19187. l0.725-3.314l-0.104-3.833l0.518-4.247l-0.622-2.279l4.454-2.9l6.318,0.104l3.211-2.072l0.933,0.622l2.693-2.486L176.358,105.421
  19188. M176.358,104.421c-0.196,0-0.389,0.058-0.555,0.168l-3.418,2.279c-0.043,0.029-0.085,0.062-0.124,0.097l-2.115,1.952
  19189. l-0.278-0.185c-0.168-0.112-0.361-0.168-0.555-0.168c-0.188,0-0.377,0.053-0.542,0.16l-2.956,1.907l-6.015-0.099
  19190. c-0.006,0-0.011,0-0.017,0c-0.194,0-0.383,0.056-0.546,0.162l-4.454,2.9c-0.364,0.237-0.533,0.682-0.419,1.101l0.57,2.089
  19191. l-0.494,4.052c-0.006,0.049-0.008,0.099-0.007,0.148l0.1,3.711l-0.699,3.196c-0.036,0.165-0.03,0.336,0.018,0.498l0.766,2.584
  19192. l-1.097,7.375l-0.493,1.642l-2.717,1.698l-2.084-0.154l-1.494-1.582c-0.189-0.2-0.452-0.313-0.727-0.313h-2.589
  19193. c-0.155,0-0.309,0.036-0.447,0.105l-1.45,0.725c-0.339,0.169-0.553,0.516-0.553,0.895v1.139c0,0.25,0.094,0.491,0.263,0.676
  19194. l1.139,1.243c0.072,0.079,0.156,0.145,0.25,0.197l3.263,1.823l0.897,1.706c0.076,0.145,0.188,0.27,0.323,0.362l5.362,3.638v1.542
  19195. c0,0.298,0.132,0.58,0.362,0.77l4.247,3.521c0.048,0.041,0.101,0.076,0.156,0.107l2.072,1.139
  19196. c0.027,0.015,0.054,0.028,0.082,0.04l9.553,4.167l2.348,2.445c0.186,0.194,0.442,0.305,0.711,0.308c0.003,0,0.007,0,0.01,0
  19197. c0.265,0,0.52-0.105,0.707-0.293l0.346-0.346l3.004,2.858l-0.187,0.375c-0.143,0.286-0.141,0.623,0.006,0.907l3.004,5.8
  19198. c0.067,0.128,0.16,0.241,0.274,0.33l2.328,1.81l-1.138,6.921l-1.021,3.677c-0.064,0.231-0.043,0.479,0.06,0.696l0.732,1.545
  19199. l-0.426,0.922c-0.195,0.422-0.073,0.923,0.294,1.209l1.865,1.45c0.177,0.137,0.393,0.21,0.614,0.21
  19200. c0.061,0,0.123-0.005,0.184-0.017c0.282-0.053,0.527-0.223,0.674-0.469l0.266-0.442l0.187,0.034l4.452,3.907l-0.327,2.044
  19201. c-0.046,0.289,0.037,0.584,0.227,0.807s0.468,0.351,0.761,0.351h3.729c0.269,0,0.526-0.108,0.714-0.3
  19202. c0.188-0.191,0.291-0.451,0.286-0.719l-0.084-4.471h2.295c0.304,0,0.591-0.138,0.781-0.375l2.243-2.803l0.146,0.129
  19203. c0.187,0.166,0.424,0.252,0.664,0.252c0.152,0,0.305-0.035,0.447-0.105l2.071-1.036c0.084-0.042,0.162-0.096,0.231-0.16
  19204. l1.347-1.243c0.057-0.052,0.107-0.111,0.15-0.175l2.437-3.606l3.692-1.754h1.64c0.301,0,0.586-0.136,0.776-0.37l2.692-3.315
  19205. c0.085-0.105,0.148-0.226,0.185-0.355l1.243-4.35c0.039-0.135,0.048-0.277,0.028-0.416l-0.177-1.24l1.91-6.736
  19206. c0.071-0.251,0.042-0.521-0.083-0.75l-1.968-3.625c-0.066-0.121-0.156-0.228-0.265-0.313l-2.797-2.175
  19207. c-0.048-0.038-0.101-0.071-0.155-0.099l-2.873-1.482l-0.191-0.499l0.631-0.912c0.163-0.234,0.217-0.528,0.149-0.805
  19208. s-0.25-0.513-0.502-0.647l-3.314-1.761c-0.147-0.078-0.308-0.117-0.469-0.117c-0.181,0-0.362,0.049-0.521,0.146l-1.864,1.139
  19209. c-0.144,0.088-0.261,0.209-0.343,0.351v-0.636c0-0.552-0.448-1-1-1h-5.394l-3.425-1.164l-4.037-2.166l-6.521-6.725
  19210. c-0.188-0.194-0.447-0.304-0.718-0.304h-1.186l-3.656-3.107l-0.81-2.338l-0.59-4.525l0.903-6.117l2.139-7.541l1.749-4.082
  19211. l3.868-3.372c0.218-0.19,0.343-0.465,0.343-0.754v-2.278c0-0.285-0.121-0.556-0.333-0.745l-3.937-3.522
  19212. c-0.139-0.125-0.311-0.208-0.495-0.24l-4.143-0.725C176.473,104.426,176.416,104.421,176.358,104.421L176.358,104.421z"/>
  19213. </g>
  19214. <g>
  19215. <path fill="currentColor" d="M211.783,159.784c-0.162,0-0.313-0.078-0.407-0.209l-1.036-1.45c-0.103-0.144-0.122-0.332-0.05-0.494
  19216. l0.414-0.932c0.08-0.181,0.259-0.297,0.457-0.297h1.657c0.095,0,0.188,0.027,0.269,0.079l1.865,1.191
  19217. c0.229,0.146,0.299,0.449,0.158,0.682l-0.726,1.191c-0.091,0.149-0.253,0.24-0.427,0.24H211.783z"/>
  19218. <path fill="currentColor" d="M212.818,156.901l1.865,1.191l-0.726,1.191h-2.175l-1.036-1.45l0.414-0.932H212.818 M212.818,155.901
  19219. h-1.657c-0.395,0-0.753,0.233-0.914,0.594l-0.414,0.932c-0.144,0.323-0.105,0.699,0.101,0.987l1.036,1.45
  19220. c0.188,0.263,0.491,0.418,0.813,0.418h2.175c0.349,0,0.672-0.182,0.854-0.48l0.726-1.191c0.283-0.464,0.143-1.07-0.316-1.363
  19221. l-1.865-1.191C213.195,155.956,213.009,155.901,212.818,155.901L212.818,155.901z"/>
  19222. </g>
  19223. <g>
  19224. <path fill="currentColor" d="M139.482,131.092c-0.141,0-0.275-0.06-0.37-0.164l-0.991-1.091l-0.929-0.594l-0.702,0.591
  19225. c-0.09,0.076-0.205,0.118-0.322,0.118h-1.554c-0.242,0-0.449-0.173-0.492-0.411l-0.414-2.279
  19226. c-0.016-0.086-0.009-0.175,0.021-0.257l0.466-1.308l-0.48-1.925c-0.027-0.106-0.018-0.218,0.025-0.318l0.932-2.175
  19227. c0.079-0.184,0.259-0.303,0.459-0.303h0.95v-0.95c0-0.276,0.224-0.5,0.5-0.5h0.682l1.404-1.872c0.094-0.126,0.243-0.2,0.4-0.2
  19228. h1.036c0.221,0,0.416,0.145,0.479,0.356l0.622,2.072c0.012,0.041,0.019,0.083,0.021,0.125l0.099,2.666l1.072,1.753
  19229. c0.048,0.079,0.073,0.169,0.073,0.261v2.324l1.252,1.733c0.082,0.114,0.113,0.256,0.084,0.394s-0.112,0.256-0.232,0.328
  19230. l-2.59,1.554c-0.078,0.047-0.167,0.071-0.257,0.071H139.482z"/>
  19231. <path fill="currentColor" d="M140.104,117.955l0.622,2.072l0.104,2.797l1.14,1.864v2.486l1.347,1.864l-2.59,1.554h-1.243l-1.036-1.14
  19232. l-1.295-0.829l-0.984,0.829h-1.554l-0.414-2.279l0.518-1.45l-0.518-2.072l0.932-2.175h1.45v-1.45h0.932l1.554-2.072H140.104
  19233. M140.104,116.955h-1.036c-0.315,0-0.611,0.148-0.8,0.4l-1.254,1.672h-0.432c-0.552,0-1,0.448-1,1v0.45h-0.45
  19234. c-0.4,0-0.762,0.238-0.919,0.606l-0.932,2.175c-0.086,0.201-0.104,0.424-0.051,0.636l0.444,1.778l-0.416,1.166
  19235. c-0.059,0.165-0.073,0.342-0.042,0.515l0.414,2.279c0.086,0.476,0.5,0.821,0.984,0.821h1.554c0.236,0,0.464-0.083,0.644-0.235
  19236. l0.421-0.354l0.563,0.36l0.946,1.041c0.189,0.208,0.458,0.328,0.74,0.328h1.243c0.181,0,0.359-0.049,0.515-0.143l2.59-1.554
  19237. c0.24-0.144,0.409-0.382,0.465-0.656c0.056-0.274-0.005-0.56-0.169-0.787l-1.157-1.602v-2.163c0-0.184-0.051-0.365-0.147-0.521
  19238. l-1.003-1.641l-0.094-2.536c-0.003-0.085-0.017-0.169-0.042-0.25l-0.622-2.072C140.935,117.244,140.545,116.955,140.104,116.955
  19239. L140.104,116.955z"/>
  19240. </g>
  19241. <g>
  19242. <path fill="currentColor" d="M116.798,137.617c-0.075,0-0.151-0.017-0.22-0.051l-2.848-1.399h-1.179c-0.054,0-0.107-0.009-0.158-0.026
  19243. l-4.661-1.554c-0.099-0.033-0.185-0.096-0.246-0.18l-0.829-1.139c-0.142-0.194-0.125-0.462,0.04-0.637l1.658-1.761
  19244. c0.095-0.1,0.227-0.157,0.364-0.157h1.831l1.742-4.547c0.025-0.066,0.063-0.125,0.113-0.175l4.454-4.454
  19245. c0.096-0.096,0.224-0.146,0.354-0.146c0.066,0,0.133,0.013,0.197,0.041l2.175,0.933c0.077,0.033,0.144,0.085,0.196,0.15
  19246. l1.139,1.45c0.032,0.041,0.058,0.086,0.076,0.135l3.062,8.265l1.074,0.895l3.336,1.213c0.141,0.051,0.252,0.163,0.301,0.305
  19247. s0.032,0.299-0.046,0.427l-0.829,1.347c-0.091,0.148-0.253,0.238-0.426,0.238c-0.016,0-1.933-0.182-1.933-0.182l-0.558,0.797
  19248. c-0.094,0.134-0.247,0.213-0.41,0.213h-3.936c-0.084,0-0.167-0.021-0.241-0.062l-1.81-0.995l-1.51,0.977
  19249. C116.988,137.59,116.893,137.617,116.798,137.617z"/>
  19250. <path fill="currentColor" d="M117.213,121.891l2.175,0.933l1.139,1.45l3.108,8.39l1.243,1.036l3.418,1.243l-0.829,1.347l-2.175-0.207
  19251. l-0.725,1.036h-3.936l-2.072-1.139l-1.761,1.139l-2.952-1.45h-1.295l-4.661-1.554l-0.829-1.139l1.658-1.761h2.175l1.865-4.869
  19252. L117.213,121.891 M117.213,120.891c-0.26,0-0.516,0.102-0.707,0.293l-4.454,4.454c-0.099,0.099-0.177,0.218-0.227,0.349
  19253. l-1.619,4.227h-1.487c-0.276,0-0.539,0.114-0.728,0.314l-1.658,1.761c-0.33,0.35-0.363,0.885-0.081,1.274l0.829,1.139
  19254. c0.123,0.168,0.294,0.294,0.492,0.36l4.661,1.554c0.102,0.034,0.209,0.051,0.316,0.051h1.063l2.744,1.348
  19255. c0.14,0.069,0.291,0.103,0.441,0.103c0.189,0,0.378-0.054,0.543-0.16l1.259-0.815l1.548,0.852
  19256. c0.148,0.081,0.313,0.124,0.482,0.124h3.936c0.326,0,0.632-0.159,0.819-0.426l0.391-0.559l1.595,0.152
  19257. c0.032,0.003,0.063,0.004,0.095,0.004c0.345,0,0.668-0.178,0.852-0.476l0.829-1.347c0.158-0.256,0.191-0.569,0.093-0.853
  19258. s-0.32-0.508-0.603-0.611l-3.254-1.183l-0.904-0.754l-3.016-8.14c-0.036-0.098-0.087-0.189-0.151-0.271l-1.139-1.45
  19259. c-0.104-0.132-0.238-0.235-0.392-0.301l-2.175-0.933C117.48,120.917,117.346,120.891,117.213,120.891L117.213,120.891z"/>
  19260. </g>
  19261. <g>
  19262. <path fill="currentColor" d="M52.475,167.449c-0.101,0-0.201-0.031-0.287-0.09l-1.036-0.725c-0.063-0.044-0.115-0.102-0.151-0.169
  19263. l-0.445-0.809l-2.488-0.281c-0.079-0.009-0.155-0.037-0.221-0.081l-1.241-0.827l-1.06,0.896c-0.03,0.025-0.063,0.047-0.099,0.065
  19264. l-1.243,0.622c-0.07,0.035-0.147,0.053-0.224,0.053c-0.072,0-0.145-0.016-0.212-0.047c-0.139-0.064-0.24-0.189-0.275-0.338
  19265. l-0.415-1.761l-0.583-1.531h-1.209c-0.276,0-0.5-0.224-0.5-0.5v-3.263c0-0.129,0.05-0.254,0.14-0.347l2.693-2.797
  19266. c0.095-0.099,0.226-0.153,0.36-0.153c0.021,0,0.043,0.001,0.064,0.004c0.157,0.021,0.295,0.114,0.372,0.252l1.1,1.971h0.892
  19267. l1.526-1.097c0.087-0.062,0.189-0.094,0.292-0.094c0.074,0,0.147,0.016,0.216,0.049l1.243,0.596
  19268. c0.173,0.083,0.284,0.258,0.284,0.451v1.269c0,0.189-0.107,0.362-0.276,0.447l-0.463,0.231l1.369,1.598l1.559,0.642h3.423
  19269. c0.276,0,0.5,0.224,0.5,0.5v1.847l0.764,0.68c0.107,0.095,0.168,0.231,0.168,0.374v1.14c0,0.276-0.224,0.5-0.5,0.5h-2.375
  19270. l-1.453,0.678C52.619,167.433,52.546,167.449,52.475,167.449z"/>
  19271. <path fill="currentColor" d="M43.981,155.865l1.243,2.227h1.347l1.657-1.191l1.243,0.596v1.269l-1.036,0.518l1.864,2.175l1.761,0.726
  19272. h2.072h1.45v2.071l0.932,0.829v1.14h-2.486l-1.554,0.725l-1.036-0.725l-0.569-1.036l-2.745-0.311l-1.554-1.036l-1.347,1.139
  19273. l-1.243,0.622l-0.415-1.761l-0.725-1.917h-1.554v-3.263L43.981,155.865 M43.981,154.865c-0.27,0-0.531,0.109-0.72,0.306
  19274. l-2.693,2.797c-0.18,0.187-0.28,0.435-0.28,0.694v3.263c0,0.552,0.448,1,1,1h0.863l0.458,1.209l0.4,1.697
  19275. c0.07,0.298,0.272,0.547,0.549,0.677c0.134,0.063,0.279,0.094,0.424,0.094c0.153,0,0.307-0.035,0.447-0.105l1.243-0.622
  19276. c0.071-0.036,0.138-0.08,0.199-0.131l0.772-0.653l0.928,0.618c0.132,0.088,0.284,0.144,0.442,0.162l2.23,0.252l0.32,0.582
  19277. c0.074,0.134,0.178,0.25,0.303,0.338l1.036,0.725c0.171,0.12,0.372,0.181,0.573,0.181c0.144,0,0.288-0.031,0.423-0.094
  19278. l1.353-0.631h2.264c0.552,0,1-0.448,1-1v-1.14c0-0.286-0.122-0.558-0.335-0.748l-0.597-0.53v-1.622c0-0.552-0.448-1-1-1h-1.45
  19279. h-1.874l-1.355-0.559l-0.879-1.026c0.277-0.184,0.448-0.496,0.448-0.834v-1.269c0-0.385-0.221-0.735-0.568-0.902L48.66,156
  19280. c-0.137-0.066-0.285-0.098-0.432-0.098c-0.206,0-0.411,0.063-0.583,0.188l-1.396,1.003h-0.438l-0.957-1.714
  19281. c-0.154-0.276-0.431-0.464-0.745-0.504C44.066,154.868,44.023,154.865,43.981,154.865L43.981,154.865z"/>
  19282. </g>
  19283. <g>
  19284. <path fill="currentColor" d="M99.397,190.029c-0.101,0-0.202-0.03-0.289-0.092l-2.41-1.707l-6.311-1.578l-2.09,1.52
  19285. c-0.087,0.063-0.19,0.096-0.294,0.096c-0.07,0-0.141-0.015-0.207-0.045l-1.14-0.518c-0.19-0.086-0.307-0.282-0.292-0.491
  19286. l0.104-1.45c0.019-0.262,0.236-0.464,0.499-0.464h0.806l0.885-1.033l-0.95-2.073l-7.557-5.34l-2.85-0.356l-0.563,1.045
  19287. c-0.074,0.136-0.206,0.231-0.358,0.256l-2.879,0.48l-0.813,1.356c-0.076,0.126-0.204,0.213-0.349,0.236
  19288. c-0.027,0.004-0.053,0.006-0.08,0.006c-0.119,0-0.235-0.042-0.327-0.121L69,177.23l-1.411-0.486
  19289. c-0.124-0.042-0.226-0.132-0.284-0.249l-0.949-1.899h-2.177c-0.276,0-0.5-0.224-0.5-0.5v-1.643l-0.879-1.759
  19290. c-0.104-0.208-0.051-0.459,0.127-0.608l0.932-0.777c0.091-0.075,0.205-0.116,0.32-0.116c0.033,0,0.065,0.003,0.098,0.01
  19291. c0.148,0.03,0.275,0.125,0.345,0.259l0.518,0.992l1.211,0.303l1.16-0.851v-0.99c0-0.165,0.081-0.318,0.216-0.412
  19292. c0.084-0.059,0.184-0.088,0.284-0.088c0.06,0,0.121,0.011,0.178,0.033l1.908,0.727l1.849-1.479c0.09-0.072,0.2-0.109,0.313-0.109
  19293. c0.042,0,0.085,0.005,0.127,0.017c0.153,0.041,0.278,0.151,0.337,0.298l0.752,1.881l1.305,0.571l1.947-0.556l5.79-3.222
  19294. l1.952-3.203c0.074-0.122,0.196-0.206,0.336-0.231c0.03-0.005,0.061-0.008,0.09-0.008c0.11,0,0.219,0.037,0.307,0.105
  19295. l0.748,0.582l1.063-0.228l1.48-1.665l0.486-1.457c0.068-0.204,0.259-0.342,0.474-0.342h2.382c0.154,0,0.299,0.071,0.394,0.192
  19296. c0.095,0.121,0.128,0.279,0.091,0.429l-0.467,1.868l0.718,1.167c0.058,0.093,0.083,0.203,0.072,0.312l-0.191,1.914l5.902,10.48
  19297. l1.676,1.816h2.06c0.213,0,0.402,0.135,0.472,0.336l0.414,1.191c0.059,0.169,0.023,0.356-0.094,0.492l-3.94,4.546l-0.151,1.206
  19298. l1.098,0.76c0.073,0.051,0.132,0.121,0.169,0.202l0.622,1.347c0.083,0.18,0.052,0.393-0.081,0.542l-0.829,0.932
  19299. C99.672,189.972,99.535,190.029,99.397,190.029z"/>
  19300. <path fill="currentColor" d="M91.835,160.63l-0.518,2.072l0.829,1.347l-0.207,2.071l6.008,10.669l1.864,2.02h2.279l0.414,1.191
  19301. l-4.039,4.661l-0.208,1.657l1.347,0.932l0.622,1.347l-0.829,0.932l-2.486-1.761l-6.629-1.657l-2.279,1.657l-1.14-0.518
  19302. l0.104-1.45h1.036l1.243-1.45l-1.139-2.486l-7.769-5.49l-3.314-0.415l-0.725,1.347l-3.107,0.518l-0.932,1.554l-3.004-2.59
  19303. l-1.502-0.518l-1.087-2.175h-2.486v-1.761l-0.932-1.865l0.932-0.777l0.622,1.191l1.657,0.414l1.554-1.139v-1.243l2.175,0.829
  19304. l2.072-1.657l0.828,2.072l1.658,0.725l2.175-0.622l5.956-3.314l2.02-3.315l0.932,0.725l1.45-0.311l1.657-1.864l0.518-1.554
  19305. H91.835 M91.835,159.63h-2.382c-0.431,0-0.813,0.275-0.949,0.684l-0.453,1.359l-1.303,1.466l-0.674,0.145l-0.564-0.439
  19306. c-0.177-0.138-0.393-0.211-0.614-0.211c-0.06,0-0.12,0.005-0.18,0.017c-0.28,0.051-0.525,0.22-0.674,0.463l-1.883,3.09
  19307. l-5.625,3.13l-1.718,0.491l-0.953-0.417l-0.676-1.691c-0.118-0.294-0.368-0.515-0.674-0.596
  19308. c-0.084-0.022-0.169-0.033-0.255-0.033c-0.225,0-0.445,0.076-0.625,0.219l-1.626,1.3l-1.641-0.625
  19309. c-0.115-0.044-0.236-0.065-0.356-0.065c-0.2,0-0.398,0.06-0.567,0.177c-0.271,0.187-0.433,0.494-0.433,0.823v0.736l-0.767,0.562
  19310. l-0.766-0.191l-0.414-0.792c-0.14-0.269-0.394-0.459-0.69-0.518c-0.065-0.013-0.131-0.02-0.196-0.02
  19311. c-0.232,0-0.459,0.081-0.64,0.232l-0.932,0.777c-0.356,0.297-0.462,0.8-0.254,1.215l0.827,1.653v1.525c0,0.552,0.448,1,1,1h1.868
  19312. l0.811,1.623c0.117,0.234,0.321,0.413,0.569,0.498l1.32,0.455l2.859,2.464c0.183,0.158,0.415,0.243,0.653,0.243
  19313. c0.053,0,0.106-0.004,0.159-0.013c0.292-0.047,0.547-0.22,0.699-0.473l0.695-1.158l2.652-0.442
  19314. c0.305-0.051,0.569-0.24,0.716-0.512l0.4-0.744l2.386,0.299l7.344,5.189l0.76,1.66l-0.527,0.615h-0.576
  19315. c-0.524,0-0.96,0.405-0.998,0.929l-0.104,1.45c-0.03,0.417,0.203,0.809,0.583,0.981l1.14,0.518c0.132,0.06,0.273,0.09,0.414,0.09
  19316. c0.208,0,0.414-0.065,0.588-0.191l1.901-1.382l5.994,1.499l2.333,1.652c0.175,0.124,0.377,0.184,0.578,0.184
  19317. c0.277,0,0.551-0.115,0.748-0.335l0.829-0.932c0.264-0.297,0.327-0.723,0.16-1.083l-0.622-1.347
  19318. c-0.075-0.163-0.191-0.302-0.338-0.403l-0.849-0.587l0.095-0.755l3.84-4.432c0.234-0.27,0.306-0.645,0.188-0.983l-0.414-1.191
  19319. c-0.14-0.402-0.519-0.672-0.945-0.672h-1.841l-1.488-1.612l-5.795-10.292l0.176-1.756c0.021-0.218-0.029-0.437-0.144-0.624
  19320. l-0.608-0.988l0.416-1.664c0.075-0.299,0.007-0.615-0.182-0.858S92.144,159.63,91.835,159.63L91.835,159.63z"/>
  19321. </g>
  19322. <g>
  19323. <path fill="currentColor" d="M116.902,187.336c-0.162,0-0.321-0.079-0.417-0.223l-0.675-1.013l-2.875,0.084l-0.213,0.782
  19324. c-0.059,0.218-0.257,0.369-0.482,0.369h-1.968c-0.256,0-0.471-0.193-0.497-0.448l-0.622-5.904
  19325. c-0.024-0.229,0.112-0.445,0.329-0.523l1.45-0.518c0.054-0.02,0.111-0.029,0.168-0.029h1.139c0.093,0,0.185,0.026,0.264,0.076
  19326. l4.556,2.835l3.92,0.28l0.774-1.291c0.092-0.153,0.256-0.243,0.429-0.243c0.036,0,0.072,0.004,0.109,0.012l0.932,0.208
  19327. c0.142,0.032,0.263,0.124,0.332,0.252c0.069,0.128,0.079,0.28,0.026,0.416l-0.518,1.346c-0.042,0.109-0.12,0.199-0.221,0.256
  19328. l-5.697,3.211C117.07,187.315,116.985,187.336,116.902,187.336z"/>
  19329. <path fill="currentColor" d="M112.241,180.414l4.661,2.9l4.351,0.311l0.932-1.554l0.932,0.208l-0.518,1.346l-5.697,3.211l-0.829-1.243
  19330. l-3.522,0.104l-0.311,1.14h-1.968l-0.622-5.904l1.45-0.518H112.241 M112.241,179.414h-1.139c-0.115,0-0.229,0.02-0.336,0.058
  19331. l-1.45,0.518c-0.435,0.155-0.707,0.588-0.658,1.046l0.622,5.904c0.054,0.509,0.483,0.896,0.995,0.896h1.968
  19332. c0.451,0,0.846-0.302,0.965-0.737l0.116-0.424l2.227-0.066l0.521,0.782c0.191,0.288,0.508,0.445,0.833,0.445
  19333. c0.167,0,0.335-0.042,0.49-0.129l5.697-3.211c0.202-0.114,0.359-0.295,0.442-0.512l0.518-1.346
  19334. c0.104-0.271,0.085-0.575-0.052-0.832c-0.138-0.256-0.38-0.44-0.664-0.503l-0.932-0.208c-0.072-0.016-0.146-0.024-0.217-0.024
  19335. c-0.346,0-0.674,0.18-0.857,0.485l-0.616,1.027l-3.491-0.25l-4.451-2.77C112.61,179.466,112.427,179.414,112.241,179.414
  19336. L112.241,179.414z"/>
  19337. </g>
  19338. <g>
  19339. <path fill="currentColor" d="M136.686,217.375c-0.276,0-0.5-0.224-0.5-0.5v-1.691l-3.016-1.885l-5.003-1.327
  19340. c-0.047-0.013-0.093-0.032-0.135-0.059l-5.179-3.211l-4.333-3.604l-2.291-0.747c-0.167-0.055-0.292-0.192-0.332-0.362
  19341. l-0.502-2.156l-5.079-8.938l-0.923-0.554c-0.15-0.09-0.243-0.253-0.243-0.429v-1.45c0-0.123,0.045-0.241,0.126-0.332l0.829-0.932
  19342. c0.094-0.106,0.229-0.167,0.372-0.168c0,0,0.001,0,0.001,0c0.142,0,0.277,0.06,0.372,0.166l1.767,1.963l1.443,0.401l1.079-1.079
  19343. l-0.083-0.906c-0.02-0.222,0.109-0.43,0.316-0.511l2.124-0.829c0.059-0.023,0.121-0.034,0.182-0.034
  19344. c0.131,0,0.26,0.052,0.356,0.149l3.257,3.305l0.684-0.547c0.089-0.071,0.199-0.109,0.313-0.109h3.211l4.384-0.617
  19345. c0.023-0.003,0.046-0.005,0.069-0.005c0.069,0,0.137,0.014,0.2,0.042l1.657,0.725l1.751,0.721c0.188,0.077,0.31,0.26,0.31,0.462
  19346. v1.45c0,0.15-0.067,0.292-0.183,0.387l-0.957,0.783v1.109c0,0.062-0.011,0.122-0.033,0.18l-1.554,4.04
  19347. c-0.074,0.193-0.26,0.32-0.467,0.32h-0.47l-0.368,4.693l1.946,4.282l3.678,1.888l1.913,1.272c0.105,0.07,0.18,0.177,0.209,0.3
  19348. l0.518,2.175c0.009,0.038,0.014,0.077,0.014,0.116v1.554c0,0.276-0.224,0.5-0.5,0.5H136.686z"/>
  19349. <path fill="currentColor" d="M117.679,188.701l3.573,3.625l1.036-0.829h3.211l4.454-0.622l1.657,0.725l1.761,0.725v1.45l-1.14,0.933
  19350. v1.346l-1.554,4.04h-0.932l-0.415,5.283l2.072,4.558l3.833,1.968l1.864,1.243l0.518,2.175v1.554h-0.932v-1.968l-3.314-2.072
  19351. l-5.076-1.347l-5.179-3.211l-4.35-3.625l-2.382-0.777l-0.518-2.227l-5.179-9.115l-1.036-0.622v-1.45l0.829-0.932l1.864,2.072
  19352. l1.865,0.518l1.45-1.451l-0.104-1.139L117.679,188.701 M117.679,187.701c-0.122,0-0.246,0.022-0.363,0.068l-2.124,0.829
  19353. c-0.415,0.162-0.673,0.579-0.633,1.022l0.062,0.673L113.915,191l-1.022-0.284l-1.669-1.855c-0.189-0.211-0.459-0.331-0.743-0.331
  19354. c-0.001,0-0.002,0-0.003,0c-0.285,0.001-0.555,0.123-0.745,0.335l-0.829,0.932c-0.163,0.183-0.252,0.419-0.252,0.665v1.45
  19355. c0,0.351,0.184,0.677,0.485,0.857l0.811,0.486l4.978,8.761l0.485,2.086c0.08,0.341,0.331,0.616,0.664,0.724l2.2,0.717
  19356. l4.203,3.502c0.036,0.03,0.074,0.057,0.113,0.082l5.179,3.211c0.084,0.052,0.175,0.091,0.271,0.117l4.93,1.308l2.717,1.698v1.414
  19357. c0,0.552,0.448,1,1,1h0.932c0.552,0,1-0.448,1-1v-1.554c0-0.078-0.009-0.156-0.027-0.232l-0.518-2.175
  19358. c-0.059-0.246-0.208-0.46-0.418-0.6l-1.864-1.243c-0.031-0.021-0.064-0.04-0.098-0.058l-3.523-1.809l-1.821-4.006l0.322-4.104
  19359. h0.007c0.414,0,0.785-0.255,0.934-0.641l1.554-4.04c0.044-0.114,0.066-0.236,0.066-0.359v-0.873l0.773-0.632
  19360. c0.232-0.19,0.367-0.474,0.367-0.774v-1.45c0-0.405-0.245-0.771-0.619-0.925l-1.761-0.725l-1.637-0.716
  19361. c-0.127-0.056-0.263-0.084-0.401-0.084c-0.046,0-0.092,0.003-0.138,0.01l-4.385,0.612h-3.142c-0.227,0-0.447,0.077-0.625,0.219
  19362. l-0.332,0.265l-2.94-2.983C118.2,187.804,117.942,187.701,117.679,187.701L117.679,187.701z"/>
  19363. </g>
  19364. <g>
  19365. <path fill="currentColor" d="M226.695,381.723c-0.276,0-0.5-0.224-0.5-0.5v-1.201c0-0.154,0.071-0.3,0.192-0.395l0.771-0.602
  19366. c0.088-0.068,0.196-0.105,0.308-0.105h1.03c0.208,0,0.394,0.128,0.467,0.322l0.343,0.901c0.081,0.211,0.009,0.45-0.174,0.583
  19367. l-1.244,0.901c-0.085,0.062-0.188,0.095-0.293,0.095H226.695z"/>
  19368. <path fill="currentColor" d="M228.497,379.42l0.343,0.901l-1.244,0.901h-0.9v-1.201l0.771-0.602H228.497 M228.497,378.42h-1.03
  19369. c-0.223,0-0.439,0.074-0.615,0.211l-0.771,0.602c-0.243,0.19-0.385,0.48-0.385,0.789v1.201c0,0.553,0.448,1,1,1h0.9
  19370. c0.211,0,0.416-0.066,0.587-0.19l1.244-0.901c0.366-0.265,0.508-0.742,0.348-1.165l-0.343-0.901
  19371. C229.284,378.677,228.912,378.42,228.497,378.42L228.497,378.42z"/>
  19372. </g>
  19373. <g>
  19374. <path fill="currentColor" d="M412.131,452.373c-0.107,0-0.216-0.034-0.307-0.105l-33.752-26.201c-0.046-0.035-0.085-0.078-0.116-0.128
  19375. l-4.119-6.521c-0.052-0.082-0.078-0.177-0.077-0.274l0.216-14.464l-2.336,0.46l-3.381,0.435l-5.642,0.004
  19376. c-0.036,0-0.073-0.004-0.108-0.012l-5.406-1.201l-4.029-1.656l-16.024-9.558c-0.03-0.019-0.059-0.04-0.085-0.063l-3.777-3.518
  19377. l-1.758-2.105l-22.728-36.754l-4.326,1.763L296,360.678l-4.341,7.662c-0.036,0.064-0.087,0.12-0.147,0.163l-31.408,22.053
  19378. c-0.085,0.06-0.186,0.091-0.287,0.091c-0.033,0-0.065-0.003-0.098-0.01l-9.707-1.941l-2.751,1.291
  19379. c-0.066,0.031-0.139,0.048-0.212,0.048h-1.525c-0.143,0-0.279-0.062-0.374-0.168l-0.813-0.915
  19380. c-0.063-0.07-0.104-0.156-0.12-0.248l-0.996-5.879l-5.405-7.272l-1.635-0.327l-0.643,0.45l-0.087,1.486
  19381. c-0.008,0.133-0.068,0.257-0.167,0.345l-2.643,2.339c-0.093,0.083-0.211,0.126-0.332,0.126c-0.061,0-0.122-0.011-0.18-0.033
  19382. l-1.321-0.509c-0.178-0.068-0.301-0.232-0.318-0.422l-0.102-1.118c-0.018-0.194,0.08-0.382,0.25-0.479l1.261-0.722l0.547-1.552
  19383. c0.032-0.092,0.09-0.172,0.167-0.23l0.941-0.724l-1.907-2.687l-3.595-2.489l-2.883,2.185l-0.189,3.024
  19384. c-0.01,0.155-0.091,0.297-0.219,0.383c-0.084,0.057-0.181,0.086-0.28,0.086c-0.053,0-0.106-0.009-0.158-0.025l-3.516-1.172
  19385. l-2.288,0.631l0.843,2.444c0.05,0.145,0.031,0.303-0.051,0.432l-0.711,1.118c-0.092,0.145-0.251,0.231-0.422,0.231
  19386. c-0.004,0-0.008,0-0.012,0c-0.175-0.004-0.335-0.1-0.422-0.252l-0.579-1.013l-0.594,0.297c-0.071,0.035-0.147,0.053-0.224,0.053
  19387. c-0.104,0-0.207-0.032-0.294-0.096l-1.118-0.813c-0.092-0.066-0.159-0.163-0.188-0.272l-0.305-1.117
  19388. c-0.039-0.144-0.012-0.297,0.073-0.418l0.453-0.648l-0.959-0.832l-1.348,0.506c-0.057,0.021-0.116,0.032-0.176,0.032
  19389. c-0.03,0-0.06-0.003-0.09-0.008l-6.099-1.118c-0.139-0.025-0.26-0.108-0.334-0.229s-0.095-0.266-0.056-0.401l0.406-1.423
  19390. c0.037-0.128,0.123-0.235,0.239-0.3l2.948-1.627c0.075-0.042,0.158-0.063,0.242-0.063c0.073,0,0.146,0.016,0.213,0.048
  19391. l1.356,0.639l1.216-1.646l-1.491-1.355l-0.79,1.077c-0.096,0.13-0.246,0.204-0.403,0.204c-0.037,0-0.075-0.004-0.112-0.013
  19392. c-0.194-0.045-0.344-0.201-0.379-0.397l-0.407-2.236c-0.017-0.091-0.008-0.184,0.025-0.27l1.424-3.701l-1.057-1.358l-2.54,0.544
  19393. c-0.035,0.007-0.07,0.011-0.104,0.011c-0.105,0-0.208-0.033-0.294-0.096l-1.118-0.813l-1.149-0.566
  19394. c-0.131-0.065-0.227-0.186-0.262-0.328l-0.469-1.909l-0.389-0.715l-1.101-0.366c-0.128-0.043-0.234-0.137-0.293-0.259
  19395. l-0.944-1.974c-0.047-0.1-0.061-0.213-0.038-0.32l0.233-1.088l-0.572-2.291c-0.026-0.102-0.019-0.209,0.021-0.307l0.687-1.716
  19396. c0.044-0.11,0.126-0.201,0.231-0.257l1.364-0.718v-1.157c0-0.146,0.063-0.283,0.172-0.378l1.287-1.115
  19397. c0.034-0.029,0.071-0.054,0.111-0.072l2.316-1.115c0.068-0.033,0.142-0.05,0.217-0.05c0.038,0,0.077,0.004,0.114,0.014
  19398. l5.492,1.287c0.097,0.022,0.185,0.073,0.252,0.146l0.743,0.801c0.085,0.092,0.133,0.214,0.133,0.34v0.314l29.792-20.662
  19399. c0.037-0.025,0.078-0.046,0.12-0.061l1.716-0.601c0.041-0.015,0.083-0.023,0.125-0.026c0,0,17.188-1.375,17.202-1.375
  19400. c0.145,0,0.282,0.063,0.378,0.173l0.387,0.447l2.263-1.403c0.079-0.049,0.171-0.075,0.264-0.075
  19401. c0.01,0,14.038,0.798,14.038,0.798l3.414-0.66l12.896-6.728l1.043-4.08h-0.614c-0.146,0-0.286-0.064-0.381-0.177
  19402. c-0.096-0.111-0.137-0.26-0.112-0.404l2.174-13.157c0.017-0.104,0.065-0.198,0.14-0.272l2.059-2.06
  19403. c0.095-0.095,0.223-0.146,0.354-0.146c0.032,0,0.065,0.003,0.098,0.01l2.678,0.534l4.643-2.652
  19404. c0.075-0.043,0.161-0.065,0.248-0.065h3.289c0.236,0,0.44,0.166,0.489,0.397l0.449,2.142l3.285,0.703
  19405. c0.134,0.029,0.249,0.11,0.321,0.227l1.801,2.918c0.074,0.121,0.094,0.27,0.054,0.406l-0.373,1.244l2.433,0.769l0.479-0.718
  19406. c0.095-0.143,0.253-0.223,0.416-0.223c0.062,0,0.124,0.012,0.185,0.035c0,0,6.709,2.667,6.717,2.67l17.301-15.958
  19407. c0.045-0.042,0.097-0.074,0.152-0.097l27.06-10.858v-0.685L369,272.354c-0.094-0.094-0.146-0.221-0.146-0.354v-1.316h-3.977
  19408. c-0.058,0-0.115-0.01-0.169-0.029l-2.859-1.029c-0.093-0.033-0.174-0.094-0.232-0.173l-2.633-3.547
  19409. c-0.109-0.146-0.129-0.342-0.053-0.508l1.264-2.736l-9.158-15.583c-0.077-0.13-0.091-0.288-0.037-0.429
  19410. c0.053-0.141,0.166-0.251,0.31-0.299l11.445-3.827l7.286-4.236l2.533-2.365l2.168-3.017c0.061-0.084,0.146-0.147,0.244-0.18
  19411. l3.775-1.287c0.053-0.018,0.107-0.027,0.161-0.027c0.169,0,0.331,0.085,0.424,0.235l1.141,1.825h0.613l0.741-0.444
  19412. c0.078-0.047,0.168-0.071,0.257-0.071c0.066,0,0.133,0.013,0.195,0.04l3.251,1.382l0.334-0.122l-0.234-0.936
  19413. c-0.044-0.176,0.011-0.361,0.142-0.485l1.461-1.379l0.959-2.552v-1.797c0-0.121,0.044-0.238,0.124-0.329l1.146-1.31l0.849-2.084
  19414. l-0.301-1.125c-0.036-0.135-0.014-0.279,0.062-0.397l1.201-1.888c0.094-0.147,0.255-0.231,0.422-0.231
  19415. c0.061,0,0.121,0.011,0.18,0.033l0.799,0.308l0.681-0.736l0.24-3.787l-0.413-1.905c-0.021-0.097-0.013-0.199,0.023-0.291
  19416. l0.342-0.858c0.055-0.137,0.167-0.242,0.306-0.289c0.052-0.017,0.105-0.026,0.159-0.026c0.091,0,0.181,0.024,0.26,0.073
  19417. l2.155,1.308l0.398-0.222l0.532-0.911c0.09-0.154,0.254-0.248,0.432-0.248h1.887c0.119,0,0.234,0.042,0.325,0.121l0.68,0.582
  19418. l0.594-1.424l1.505-2.684v-1.5c0-0.097,0.028-0.191,0.08-0.272l0.818-1.262l-0.36-1.148c-0.047-0.149-0.021-0.313,0.07-0.44
  19419. l0.857-1.202c0.088-0.122,0.225-0.199,0.375-0.208c0.011,0,0.021-0.001,0.032-0.001c0.139,0,0.271,0.058,0.366,0.16l0.993,1.068
  19420. l1.713,0.214l1.057-0.604c0.078-0.044,0.163-0.066,0.248-0.066c0.138,0,0.274,0.057,0.372,0.166l1.38,1.533
  19421. c0,0,0.896-0.068,0.908-0.068c0.107,0,0.213,0.035,0.3,0.1l0.826,0.619l0.871-0.269c0.049-0.015,0.098-0.022,0.147-0.022
  19422. c0.077,0,0.153,0.018,0.224,0.053l4.463,2.231c0.065,0.033,0.123,0.08,0.169,0.137l1.287,1.631
  19423. c0.048,0.061,0.081,0.132,0.097,0.209l0.332,1.611l2.128,0.197l0.432-0.556c0.093-0.12,0.234-0.19,0.386-0.193
  19424. c0.003,0,0.006,0,0.009,0c0.148,0,0.289,0.066,0.384,0.18l0.859,1.03c0.075,0.09,0.116,0.203,0.116,0.32v0.979l5.846,5.286
  19425. l0.724-0.362c0.071-0.036,0.147-0.053,0.224-0.053c0.117,0,0.234,0.042,0.327,0.122l3.775,3.261l2.631,3.148l2.344,2
  19426. c0.079,0.067,0.135,0.157,0.16,0.258l0.859,3.433c0.035,0.143,0.006,0.295-0.08,0.415l-1.045,1.447l-0.222,1.397l0.186,0.596
  19427. l2.269-1.649c0.079-0.058,0.173-0.09,0.271-0.095c0,0,1.818-0.086,1.826-0.086c0.148,0,0.289,0.066,0.385,0.18l0.707,0.85h1.568
  19428. c0.245,0,0.454,0.178,0.493,0.42l0.567,3.486l3.266,2.368c0.049,0.035,0.09,0.078,0.123,0.127l2.547,3.821l2.229-0.594
  19429. c0.042-0.011,0.086-0.017,0.129-0.017c0.062,0,0.123,0.011,0.182,0.034l4.087,1.59l0.306-1.402
  19430. c0.032-0.148,0.129-0.273,0.265-0.341l1.717-0.858c0.07-0.035,0.147-0.053,0.224-0.053c0.092,0,0.183,0.025,0.263,0.075
  19431. c0.147,0.091,0.237,0.252,0.237,0.425v0.513l0.781-0.146c0.03-0.006,0.062-0.009,0.092-0.009c0.18,0,0.349,0.097,0.438,0.258
  19432. l0.244,0.44l1.433-0.341c0.039-0.009,0.077-0.014,0.116-0.014c0.099,0,0.196,0.029,0.28,0.085
  19433. c0.115,0.079,0.193,0.202,0.214,0.34l0.445,2.961c0,0,0.417-0.041,0.434-0.041c0.214,0,0.406,0.136,0.475,0.342l0.572,1.722
  19434. l1.407,1.82c0.067,0.087,0.104,0.195,0.104,0.306v2.049l1.064,0.71c0.072,0.048,0.131,0.114,0.17,0.192l0.261,0.521l1.107-0.212
  19435. l0.442-1.995c0.021-0.093,0.067-0.178,0.135-0.245l2.318-2.317c0.095-0.094,0.222-0.146,0.354-0.146
  19436. c0.021,0,0.041,0.001,0.063,0.004l2.56,0.321l2.295-1.531l0.457-1.065c0.062-0.142,0.184-0.247,0.333-0.286
  19437. c0.042-0.011,0.084-0.017,0.127-0.017c0.108,0,0.215,0.035,0.303,0.102l3.843,2.923l6.134,0.84
  19438. c0.128,0.018,0.244,0.084,0.324,0.187l0.573,0.728l2.006-2.292c0.098-0.112,0.236-0.171,0.376-0.171
  19439. c0.094,0,0.188,0.026,0.271,0.08l3.604,2.316c0.178,0.114,0.264,0.328,0.217,0.533l-1.029,4.462
  19440. c-0.023,0.102-0.078,0.192-0.155,0.262l-0.773,0.687l-0.994,1.08c-0.043,0.047-0.094,0.085-0.151,0.112l-3.773,1.806
  19441. l-0.536,1.312l0.489,0.294c0.115,0.069,0.197,0.181,0.229,0.312c0.031,0.13,0.009,0.268-0.062,0.381l-1.545,2.488
  19442. c-0.046,0.073-0.109,0.134-0.185,0.175l-2.66,1.459c-0.074,0.041-0.157,0.062-0.24,0.062c-0.02,0-0.038-0.001-0.058-0.003
  19443. l0.994,1.55c0.121,0.188,0.102,0.436-0.049,0.604l-3.398,3.795l0.662,0.782c0.097,0.114,0.137,0.266,0.11,0.413
  19444. c-0.027,0.146-0.118,0.274-0.249,0.347l-0.771,0.43c-0.074,0.042-0.158,0.063-0.243,0.063c-0.017,0-1.35-0.133-1.35-0.133
  19445. l-5.315,18.736l-0.541,11.863c-0.001,0.038-0.008,0.076-0.018,0.113l-1.063,3.761c-0.062,0.216-0.258,0.364-0.481,0.364h-3.188
  19446. c-0.276,0-0.5-0.224-0.5-0.5v-0.315h-0.25l-2.297,2.298c-0.094,0.094-0.221,0.146-0.354,0.146h-3.822v1.979
  19447. c0,0.123-0.046,0.242-0.128,0.334l-1.146,1.274v3.771h0.633c0.276,0,0.5,0.224,0.5,0.5v4.32c0,0.276-0.224,0.5-0.5,0.5h-0.35
  19448. v1.838c0,0.276-0.224,0.5-0.5,0.5h-0.598v1.879l0.879,0.881c0.094,0.094,0.146,0.221,0.146,0.354v4.249l2.259,1.343h3.192
  19449. c0.087,0,0.173,0.022,0.248,0.065l3.176,1.813c0.166,0.095,0.263,0.275,0.251,0.466l-0.101,1.599l2.349,2.242
  19450. c0.088,0.083,0.143,0.195,0.153,0.315l0.086,0.937l3.697,1.269c0.066,0.022,0.127,0.059,0.178,0.106l1.602,1.487
  19451. c0.084,0.078,0.139,0.183,0.155,0.296l0.151,1.061l2.9-0.677c0.037-0.009,0.075-0.013,0.113-0.013
  19452. c0.149,0,0.293,0.066,0.39,0.187l0.928,1.15l1.209-1.094c0.094-0.085,0.214-0.129,0.335-0.129c0.097,0,0.193,0.027,0.277,0.084
  19453. l1.029,0.687c0.181,0.121,0.263,0.345,0.203,0.554l-0.38,1.332l1.069,1.167c0.078,0.086,0.124,0.195,0.13,0.312l0.115,2.174
  19454. c0.005,0.083-0.012,0.167-0.048,0.242l-1.178,2.461l0.635,2.22c0.036,0.124,0.021,0.257-0.038,0.371l-0.968,1.838l1.898,1.799
  19455. c0.132,0.125,0.186,0.313,0.141,0.488l-0.914,3.547c-0.055,0.21-0.238,0.361-0.455,0.374l-3.727,0.219l-1.711,1.426l0.293,1.659
  19456. c0.022,0.129-0.006,0.261-0.079,0.369l-1.356,1.982l1.541,5.612c0.009,0.034,0.015,0.068,0.017,0.104l0.113,1.944
  19457. c0.006,0.092-0.015,0.184-0.058,0.265l-0.801,1.503l0.704,1.608c0.062,0.141,0.055,0.303-0.019,0.438l-1.488,2.746
  19458. c-0.058,0.107-0.153,0.189-0.268,0.231l-3.432,1.259c-0.056,0.021-0.114,0.03-0.172,0.03c-0.102,0-0.201-0.03-0.286-0.09
  19459. l-1.145-0.801l-0.77-0.763l-0.962,0.813v0.912c0,0.15-0.067,0.292-0.184,0.387l-2.518,2.06c-0.09,0.074-0.202,0.113-0.316,0.113
  19460. c-0.033,0-0.065-0.003-0.099-0.01l-0.367-0.074l0.951,3.81c0.057,0.228-0.052,0.463-0.262,0.568l-1.178,0.59l-2.2,7.568
  19461. c-0.014,0.046-0.033,0.09-0.06,0.13l-2.43,3.792c-0.023,0.037-0.053,0.071-0.085,0.101l-3.773,3.418l-9.223,10.822l-4.621,4.354
  19462. l-30.362,24.994c-0.059,0.049-0.128,0.083-0.202,0.101l-2.643,0.628c-0.038,0.009-0.077,0.014-0.115,0.014
  19463. c-0.108,0-0.215-0.035-0.303-0.102l-1.613-1.226l-2.959,2.959C412.388,452.323,412.26,452.373,412.131,452.373z"/>
  19464. <path fill="currentColor" d="M404.664,203.252l1.117,1.202l2.059,0.257l1.201-0.687l1.545,1.716l1.115-0.086l1.029,0.772l1.115-0.343
  19465. l4.463,2.231l1.287,1.63l0.406,1.974l2.77,0.257l0.6-0.772l0.859,1.03v1.201l6.264,5.664l1.029-0.515l3.775,3.261l2.574,3.089
  19466. l2.402,2.059l0.859,3.433l-1.115,1.544l-0.258,1.63l0.428,1.373l2.832-2.06l1.803-0.086l0.857,1.03h1.803l0.6,3.689l3.434,2.489
  19467. l2.379,3.569l0.367,0.55l2.574-0.687l4.633,1.802l0.43-1.974l1.717-0.858v1.116l1.373-0.257l0.428,0.772l1.803-0.429l0.516,3.432
  19468. l0.857-0.086l0.6,1.803l1.459,1.888v2.316l1.287,0.858l0.43,0.858l1.803-0.344l0.514-2.316l2.318-2.317l2.744,0.344l2.574-1.717
  19469. l0.516-1.201l3.947,3.003l6.264,0.858l0.945,1.201l2.402-2.745l3.604,2.316l-1.029,4.462l-0.773,0.687l-1.029,1.115l-3.947,1.889
  19470. l-0.771,1.888l0.857,0.515l-1.545,2.488l-2.66,1.459l-0.771-1.63l-0.859,0.601l2.146,3.346l-3.689,4.119l0.943,1.115l-0.771,0.43
  19471. l-1.717-0.172l-5.445,19.194l-0.391,8.563l-0.152,3.358l-1.063,3.761h-3.188v-0.815h-0.957l-2.443,2.444h-4.322v2.479
  19472. l-1.273,1.417v4.463h1.133v4.32h-0.85v2.338h-1.098v2.586l1.025,1.027v4.533l2.621,1.559h3.33l3.176,1.813l-0.115,1.831
  19473. l2.518,2.402l0.115,1.259l4.004,1.373l1.602,1.487l0.229,1.602l3.432-0.801l1.26,1.563l1.602-1.448l1.029,0.687l-0.457,1.602
  19474. l1.258,1.373l0.115,2.174l-1.26,2.632l0.688,2.402l-1.145,2.174l2.174,2.06l-0.914,3.547l-3.891,0.229l-2.061,1.717l0.344,1.944
  19475. l-1.486,2.174l1.602,5.836l0.113,1.944l-0.914,1.717l0.801,1.83l-1.488,2.746l-3.432,1.259l-1.145-0.801l-1.029-1.03
  19476. l-1.488,1.259v1.145l-2.518,2.06l-1.143-0.229l1.143,4.576l-1.373,0.688l-2.262,7.778l-2.43,3.792l-3.773,3.417l-9.268,10.869
  19477. l-4.215,3.97l-0.367,0.345l-30.338,24.973l-2.643,0.628l-1.961-1.489l-3.268,3.268l-33.752-26.201l-4.119-6.521l0.225-15.081
  19478. l-2.941,0.579l-3.348,0.429h-5.578l-5.406-1.201l-3.947-1.63l-15.959-9.525l-3.777-3.518l-1.715-2.06l-22.908-37.057l-4.809,1.96
  19479. l-8.496,8.323l-4.375,7.724l-31.408,22.053l-9.868-1.974l-2.9,1.361h-1.525l-0.813-0.915l-1.017-5.997l-5.591-7.522l-2.033-0.407
  19480. l-1.017,0.712l-0.102,1.728l-2.643,2.339l-1.321-0.509l-0.102-1.118l1.423-0.813l0.609-1.728l1.322-1.017l-2.236-3.151
  19481. l-3.965-2.745l-3.354,2.542l-0.203,3.253l-3.66-1.22l-2.948,0.813l1.017,2.948l-0.711,1.118l-0.813-1.423l-1.017,0.508
  19482. l-1.118-0.813l-0.305-1.117l0.711-1.018l-1.524-1.321l-1.627,0.61l-6.099-1.118l0.406-1.423l2.948-1.627l1.728,0.813l1.729-2.339
  19483. l-2.236-2.032l-1.118,1.524l-0.407-2.236l1.525-3.965l-1.423-1.829l-2.847,0.609l-1.118-0.813l-1.22-0.609l-0.484-1.973
  19484. l-0.515-0.944l-1.287-0.429l-0.944-1.974l0.258-1.201l-0.601-2.403l0.687-1.716l1.631-0.858v-1.459l1.287-1.115l2.316-1.115
  19485. l5.492,1.287l0.743,0.801v1.27l30.577-21.206l1.716-0.601l17.162-1.373l0.666,0.77l2.625-1.628l14.072,0.801l3.547-0.687
  19486. l13.158-6.864l1.258-4.92h-1.258l2.174-13.157l2.059-2.06l2.861,0.571l4.805-2.745h3.289l0.516,2.46l3.604,0.771l1.801,2.918
  19487. l-0.514,1.716l3.26,1.03l0.688-1.03l6.693,2.66l0.113,0.313l17.734-16.358l27.373-10.984v-1.229L369.354,272v-1.816h-4.477
  19488. l-2.859-1.029l-2.633-3.547l1.373-2.975l-9.291-15.808l11.494-3.843l7.379-4.291l2.574-2.403l2.232-3.089l3.775-1.287l1.287,2.06
  19489. h1.029l0.859-0.515l3.432,1.459l0.943-0.343l-0.344-1.373l1.545-1.459l1.031-2.746v-1.888l1.201-1.373l0.943-2.317l-0.344-1.287
  19490. l1.201-1.888l1.115,0.429l1.031-1.115l0.256-4.033l-0.428-1.974l0.342-0.858l2.404,1.459l0.771-0.429l0.602-1.03h1.887
  19491. l1.201,1.03l0.859-2.059l1.543-2.746v-1.63l0.945-1.459l-0.43-1.373L404.664,203.252 M393.955,381.912l-2.018-0.833l-0.426-0.176
  19492. L393.955,381.912 M404.664,202.252c-0.021,0-0.043,0-0.064,0.002c-0.3,0.02-0.575,0.173-0.75,0.417l-0.857,1.202
  19493. c-0.182,0.255-0.233,0.581-0.14,0.88l0.289,0.924l-0.689,1.064c-0.105,0.162-0.161,0.351-0.161,0.544v1.369l-1.415,2.518
  19494. c-0.019,0.034-0.036,0.069-0.051,0.104l-0.33,0.79l-0.157-0.135c-0.181-0.155-0.412-0.241-0.65-0.241h-1.887
  19495. c-0.355,0-0.685,0.188-0.863,0.496l-0.464,0.793l-0.024,0.014l-1.907-1.158c-0.158-0.096-0.338-0.145-0.519-0.145
  19496. c-0.106,0-0.214,0.017-0.317,0.052c-0.279,0.093-0.503,0.305-0.611,0.578l-0.342,0.858c-0.074,0.185-0.091,0.388-0.049,0.582
  19497. l0.398,1.837l-0.225,3.54l-0.329,0.356l-0.482-0.186c-0.117-0.045-0.239-0.067-0.359-0.067c-0.334,0-0.656,0.168-0.844,0.463
  19498. l-1.201,1.888c-0.15,0.236-0.194,0.524-0.122,0.794l0.257,0.963l-0.754,1.851l-1.091,1.247c-0.159,0.183-0.247,0.417-0.247,0.659
  19499. v1.706l-0.886,2.359l-1.377,1.3c-0.263,0.249-0.371,0.619-0.283,0.97l0.063,0.257l-2.733-1.163
  19500. c-0.126-0.053-0.259-0.08-0.392-0.08c-0.179,0-0.356,0.048-0.514,0.142l-0.622,0.373h-0.198l-0.994-1.589
  19501. c-0.187-0.299-0.511-0.47-0.848-0.47c-0.107,0-0.217,0.017-0.322,0.054l-3.775,1.287c-0.196,0.066-0.367,0.193-0.488,0.36
  19502. l-2.176,3.011l-2.42,2.259l-7.193,4.183l-11.397,3.811c-0.286,0.096-0.514,0.315-0.619,0.598
  19503. c-0.105,0.282-0.078,0.597,0.074,0.857l9.026,15.356l-1.154,2.5c-0.153,0.332-0.112,0.722,0.105,1.015l2.633,3.547
  19504. c0.117,0.158,0.278,0.278,0.464,0.346l2.859,1.029c0.108,0.039,0.224,0.059,0.339,0.059h3.477V272
  19505. c0,0.266,0.105,0.52,0.293,0.707l3.268,3.269v0.14l-26.745,10.732c-0.113,0.045-0.217,0.11-0.306,0.192l-17.069,15.745
  19506. l-6.425-2.554c-0.12-0.048-0.245-0.07-0.369-0.07c-0.326,0-0.642,0.16-0.832,0.445l-0.271,0.405l-1.604-0.507l0.231-0.772
  19507. c0.082-0.273,0.043-0.569-0.107-0.813l-1.801-2.918c-0.143-0.231-0.375-0.396-0.642-0.452l-2.967-0.636l-0.383-1.823
  19508. c-0.097-0.463-0.505-0.795-0.979-0.795h-3.289c-0.174,0-0.345,0.046-0.496,0.132l-4.479,2.56l-2.495-0.498
  19509. c-0.064-0.013-0.13-0.02-0.195-0.02c-0.263,0-0.518,0.104-0.707,0.293l-2.059,2.06c-0.147,0.147-0.245,0.338-0.279,0.544
  19510. l-2.174,13.157c-0.048,0.29,0.034,0.586,0.224,0.81c0.184,0.217,0.45,0.345,0.732,0.354l-0.828,3.24l-12.633,6.59l-3.281,0.635
  19511. l-13.948-0.793c-0.019-0.001-0.038-0.002-0.057-0.002c-0.186,0-0.368,0.052-0.527,0.15l-1.899,1.178l-0.108-0.124
  19512. c-0.19-0.221-0.467-0.346-0.756-0.346c-0.026,0-0.053,0.001-0.08,0.003l-17.161,1.373c-0.085,0.007-0.17,0.024-0.251,0.054
  19513. l-1.716,0.6c-0.085,0.03-0.166,0.071-0.239,0.123l-29.162,20.224c-0.033-0.052-0.07-0.101-0.113-0.146l-0.743-0.801
  19514. c-0.135-0.146-0.311-0.247-0.505-0.293l-5.492-1.287c-0.075-0.018-0.152-0.026-0.228-0.026c-0.149,0-0.297,0.033-0.434,0.099
  19515. l-2.316,1.115c-0.08,0.039-0.154,0.088-0.221,0.146l-1.287,1.115c-0.219,0.19-0.345,0.466-0.345,0.756v0.855L201,346.7
  19516. c-0.21,0.11-0.375,0.293-0.462,0.514l-0.687,1.716c-0.078,0.194-0.092,0.409-0.042,0.613l0.544,2.179l-0.209,0.974
  19517. c-0.046,0.217-0.02,0.442,0.076,0.642l0.944,1.974c0.117,0.245,0.329,0.432,0.586,0.518l0.914,0.304l0.264,0.484l0.454,1.847
  19518. c0.07,0.285,0.262,0.525,0.524,0.656l1.146,0.572l1.051,0.765c0.172,0.125,0.379,0.191,0.588,0.191
  19519. c0.07,0,0.14-0.007,0.209-0.022l2.233-0.478l0.691,0.888l-1.322,3.438c-0.066,0.172-0.083,0.357-0.051,0.538l0.407,2.236
  19520. c0.072,0.394,0.37,0.706,0.759,0.796c0.075,0.018,0.15,0.025,0.225,0.025c0.314,0,0.615-0.148,0.806-0.408l0.461-0.629
  19521. l0.746,0.678l-0.704,0.952l-0.985-0.464c-0.135-0.064-0.28-0.096-0.426-0.096c-0.167,0-0.333,0.042-0.483,0.124l-2.948,1.627
  19522. c-0.233,0.129-0.406,0.346-0.479,0.602l-0.406,1.423c-0.078,0.271-0.037,0.563,0.112,0.802c0.149,0.24,0.392,0.405,0.669,0.456
  19523. l6.099,1.118c0.06,0.011,0.12,0.017,0.18,0.017c0.12,0,0.238-0.021,0.351-0.063l1.07-0.401l0.395,0.342l-0.195,0.279
  19524. c-0.17,0.243-0.223,0.549-0.145,0.835l0.305,1.117c0.06,0.22,0.193,0.412,0.376,0.546l1.118,0.813
  19525. c0.174,0.127,0.381,0.191,0.588,0.191c0.152,0,0.306-0.035,0.447-0.105l0.171-0.085l0.344,0.602
  19526. c0.174,0.305,0.495,0.495,0.845,0.504c0.008,0,0.016,0,0.023,0c0.342,0,0.66-0.175,0.844-0.464l0.711-1.118
  19527. c0.164-0.257,0.201-0.574,0.102-0.862l-0.669-1.941l1.628-0.448l3.372,1.123c0.103,0.035,0.209,0.052,0.316,0.052
  19528. c0.197,0,0.392-0.059,0.559-0.171c0.257-0.174,0.419-0.457,0.439-0.767l0.174-2.796l2.412-1.827l3.225,2.232l1.578,2.224
  19529. l-0.559,0.43c-0.153,0.118-0.27,0.278-0.333,0.46l-0.486,1.377l-1.1,0.629c-0.34,0.194-0.535,0.568-0.5,0.959l0.102,1.118
  19530. c0.035,0.379,0.281,0.705,0.637,0.843l1.321,0.509c0.117,0.045,0.238,0.066,0.359,0.066c0.24,0,0.477-0.087,0.663-0.251
  19531. l2.643-2.339c0.199-0.177,0.32-0.425,0.336-0.69l0.073-1.244l0.27-0.189l1.237,0.248l5.218,7.021l0.977,5.76
  19532. c0.031,0.185,0.114,0.357,0.238,0.497l0.813,0.915c0.19,0.214,0.462,0.336,0.748,0.336h1.525c0.147,0,0.292-0.032,0.425-0.095
  19533. l2.603-1.222l9.544,1.909c0.065,0.013,0.131,0.02,0.196,0.02c0.204,0,0.405-0.063,0.574-0.182l31.408-22.053
  19534. c0.122-0.085,0.223-0.196,0.296-0.325l4.306-7.602l8.255-8.087l3.843-1.566l22.464,36.337c0.024,0.04,0.052,0.078,0.082,0.114
  19535. l1.715,2.06c0.027,0.032,0.056,0.063,0.087,0.092l3.777,3.518c0.052,0.049,0.108,0.091,0.169,0.127l15.959,9.525
  19536. c0.042,0.025,0.086,0.047,0.131,0.065l3.947,1.63c0.054,0.022,0.108,0.04,0.165,0.053l5.406,1.201
  19537. c0.071,0.016,0.144,0.023,0.217,0.023h5.578c0.042,0,0.085-0.003,0.127-0.008l3.348-0.429c0.022-0.003,0.044-0.007,0.066-0.011
  19538. l1.729-0.341l-0.206,13.847c-0.003,0.193,0.051,0.385,0.154,0.549l4.119,6.521c0.063,0.098,0.141,0.185,0.232,0.256
  19539. l33.752,26.201c0.182,0.141,0.397,0.21,0.613,0.21c0.257,0,0.513-0.099,0.707-0.293l2.65-2.65l1.267,0.961
  19540. c0.176,0.134,0.389,0.204,0.604,0.204c0.077,0,0.154-0.009,0.231-0.027l2.643-0.628c0.148-0.035,0.286-0.104,0.404-0.2
  19541. l30.338-24.973c0.017-0.015,0.033-0.028,0.049-0.043l0.367-0.345l4.216-3.972c0.026-0.024,0.052-0.051,0.075-0.079l9.226-10.82
  19542. l3.726-3.373c0.066-0.06,0.123-0.127,0.171-0.202l2.43-3.792c0.052-0.08,0.092-0.168,0.118-0.26l2.14-7.359l0.982-0.491
  19543. c0.419-0.21,0.637-0.683,0.523-1.137l-0.78-3.123c0.161-0.031,0.313-0.102,0.442-0.207l2.518-2.06
  19544. c0.232-0.19,0.367-0.475,0.367-0.774v-0.681l0.432-0.365l0.379,0.38c0.041,0.041,0.086,0.079,0.134,0.112l1.145,0.801
  19545. c0.17,0.119,0.371,0.181,0.573,0.181c0.116,0,0.232-0.021,0.345-0.062l3.432-1.259c0.229-0.083,0.419-0.248,0.534-0.462
  19546. l1.488-2.746c0.147-0.271,0.161-0.595,0.037-0.877l-0.606-1.387l0.687-1.29c0.086-0.162,0.126-0.345,0.115-0.528l-0.113-1.944
  19547. c-0.004-0.069-0.016-0.139-0.034-0.206l-1.479-5.39l1.225-1.791c0.147-0.216,0.205-0.481,0.159-0.738l-0.242-1.373l1.362-1.136
  19548. l3.562-0.209c0.434-0.025,0.802-0.328,0.91-0.748l0.914-3.547c0.09-0.353-0.018-0.726-0.281-0.976l-1.623-1.539l0.791-1.503
  19549. c0.12-0.228,0.147-0.493,0.076-0.741l-0.583-2.037l1.097-2.29c0.072-0.15,0.105-0.317,0.097-0.484l-0.115-2.174
  19550. c-0.013-0.231-0.105-0.452-0.262-0.623l-0.88-0.961l0.304-1.063c0.119-0.418-0.046-0.865-0.407-1.106l-1.029-0.687
  19551. c-0.169-0.112-0.362-0.168-0.555-0.168c-0.241,0-0.481,0.087-0.671,0.258l-0.816,0.739l-0.596-0.739
  19552. c-0.192-0.238-0.479-0.372-0.778-0.372c-0.075,0-0.151,0.009-0.228,0.026l-2.368,0.553l-0.074-0.521
  19553. c-0.032-0.227-0.142-0.436-0.31-0.591l-1.602-1.487c-0.103-0.096-0.224-0.168-0.356-0.214l-3.392-1.163l-0.056-0.613
  19554. c-0.022-0.241-0.131-0.466-0.306-0.633l-2.181-2.081l0.086-1.366c0.023-0.381-0.171-0.742-0.502-0.931l-3.176-1.813
  19555. c-0.151-0.087-0.322-0.132-0.496-0.132h-3.056l-1.896-1.127v-3.965c0-0.265-0.105-0.519-0.292-0.706l-0.733-0.735v-1.172h0.098
  19556. c0.553,0,1-0.447,1-1v-1.35c0.48-0.072,0.85-0.487,0.85-0.988v-4.32c0-0.553-0.447-1-1-1h-0.133v-3.079l1.018-1.133
  19557. c0.165-0.183,0.256-0.421,0.256-0.668v-1.479h3.322c0.266,0,0.52-0.105,0.707-0.293l1.83-1.831
  19558. c0.174,0.296,0.495,0.495,0.863,0.495h3.188c0.447,0,0.841-0.298,0.962-0.729l1.063-3.761c0.021-0.073,0.033-0.149,0.037-0.227
  19559. l0.152-3.358l0.386-8.447l5.185-18.277L486,275.47c0.033,0.003,0.066,0.005,0.1,0.005c0.17,0,0.337-0.043,0.486-0.126l0.771-0.43
  19560. c0.262-0.146,0.444-0.4,0.497-0.694c0.054-0.295-0.026-0.598-0.22-0.825l-0.381-0.451l3.108-3.471
  19561. c0.3-0.335,0.339-0.828,0.097-1.207l-0.655-1.021l2.438-1.338c0.151-0.083,0.278-0.203,0.369-0.35l1.545-2.488
  19562. c0.142-0.228,0.186-0.502,0.122-0.763c-0.063-0.26-0.228-0.484-0.457-0.622l-0.122-0.073L494,260.88l3.6-1.722
  19563. c0.114-0.055,0.217-0.131,0.304-0.225l0.995-1.078l0.736-0.653c0.155-0.138,0.264-0.321,0.311-0.523l1.029-4.462
  19564. c0.095-0.411-0.079-0.838-0.434-1.065l-3.604-2.317c-0.167-0.107-0.354-0.159-0.541-0.159c-0.279,0-0.557,0.117-0.753,0.341
  19565. l-1.608,1.839l-0.2-0.255c-0.16-0.204-0.394-0.337-0.65-0.372l-6.003-0.823l-3.738-2.844c-0.176-0.134-0.389-0.204-0.605-0.204
  19566. c-0.085,0-0.171,0.011-0.255,0.033c-0.298,0.078-0.543,0.29-0.664,0.572l-0.398,0.929l-2.018,1.345l-2.375-0.297
  19567. c-0.041-0.005-0.083-0.008-0.124-0.008c-0.264,0-0.519,0.104-0.707,0.293l-2.318,2.317c-0.135,0.135-0.229,0.305-0.27,0.49
  19568. l-0.371,1.674l-0.413,0.079l-0.091-0.182c-0.078-0.156-0.195-0.288-0.34-0.385l-0.842-0.562v-1.781
  19569. c0-0.221-0.073-0.437-0.209-0.611l-1.354-1.753l-0.546-1.641c-0.138-0.412-0.522-0.685-0.948-0.685c-0.004,0-0.007,0-0.011,0
  19570. l-0.374-2.495c-0.042-0.277-0.197-0.523-0.43-0.68c-0.167-0.113-0.362-0.171-0.56-0.171c-0.077,0-0.155,0.009-0.231,0.027
  19571. l-1.064,0.253l-0.06-0.108c-0.179-0.322-0.516-0.516-0.875-0.516c-0.061,0-0.122,0.005-0.185,0.017l-0.192,0.036
  19572. c-0.027-0.312-0.201-0.596-0.471-0.762c-0.16-0.099-0.343-0.149-0.525-0.149c-0.153,0-0.306,0.035-0.447,0.105l-1.717,0.858
  19573. c-0.271,0.135-0.466,0.386-0.53,0.682l-0.181,0.83l-3.542-1.378c-0.116-0.045-0.239-0.068-0.362-0.068
  19574. c-0.087,0-0.173,0.011-0.258,0.034l-1.883,0.502l-2.348-3.522c-0.065-0.099-0.148-0.185-0.245-0.255l-3.1-2.247l-0.533-3.283
  19575. c-0.079-0.484-0.497-0.839-0.987-0.839h-1.334l-0.558-0.67c-0.19-0.229-0.473-0.36-0.769-0.36c-0.016,0-0.031,0-0.048,0.001
  19576. l-1.803,0.086c-0.194,0.009-0.383,0.076-0.54,0.19l-1.607,1.169l0.144-0.912l0.976-1.351c0.173-0.239,0.231-0.542,0.159-0.828
  19577. l-0.859-3.433c-0.05-0.201-0.161-0.382-0.319-0.517l-2.338-2.004l-2.521-3.025c-0.035-0.042-0.073-0.081-0.115-0.117
  19578. l-3.775-3.261c-0.186-0.16-0.418-0.243-0.653-0.243c-0.152,0-0.306,0.035-0.447,0.105l-0.418,0.209l-5.428-4.907v-0.757
  19579. c0-0.234-0.082-0.461-0.232-0.641l-0.859-1.03c-0.189-0.228-0.472-0.359-0.768-0.359c-0.006,0-0.012,0-0.018,0
  19580. c-0.303,0.005-0.587,0.147-0.772,0.387l-0.263,0.339l-1.486-0.138l-0.257-1.248c-0.031-0.152-0.098-0.296-0.194-0.418
  19581. l-1.287-1.63c-0.091-0.115-0.207-0.209-0.338-0.275l-4.463-2.231c-0.141-0.07-0.293-0.105-0.447-0.105
  19582. c-0.099,0-0.198,0.015-0.294,0.044l-0.629,0.193l-0.622-0.466c-0.173-0.13-0.384-0.2-0.6-0.2c-0.025,0-0.051,0.001-0.077,0.003
  19583. L411,204.706l-1.216-1.351c-0.195-0.217-0.468-0.331-0.743-0.331c-0.17,0-0.341,0.043-0.496,0.132l-0.912,0.521l-1.367-0.171
  19584. l-0.869-0.935C405.207,202.367,404.941,202.252,404.664,202.252L404.664,202.252z"/>
  19585. </g>
  19586. </g>
  19587. </g>
  19588. </svg>
  19589. </template>
  19590. </file>
  19591. <file path="components/home/dashboard/common/map/mapJeju.vue">
  19592. <template>
  19593. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  19594. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  19595. <g id="제주도">
  19596. <polygon fill="currentColor" stroke-miterlimit="10" points="212.775,132.927 206.222,134.782 205.357,136.389
  19597. 204.492,140.345 200.536,142.076 194.477,142.076 192.375,144.301 191.757,147.021 189.532,145.662 185.205,145.414
  19598. 184.215,147.64 186.565,149.247 185.947,151.349 182.238,151.349 179.394,150.112 170.987,153.945 166.536,152.461 162.58,157.16
  19599. 158.747,156.417 156.645,157.778 155.903,160.25 154.172,160.25 152.812,159.632 151.453,161.61 147.249,160.992 144.9,156.417
  19600. 140.82,158.148 132.289,165.421 125.489,164.454 121.78,166.309 120.667,169.077 117.948,169.077 112.878,171.644 112.878,173.727
  19601. 108.056,173.727 102.988,173.727 98.166,173.727 97.547,172.367 95.817,172.923 92.973,174.963 92.973,177.312 94.923,178.301
  19602. 92.231,183.865 87.286,188.686 83.577,189.799 82.711,192.024 78.261,191.035 77.148,192.766 73.192,192.148 70.966,198.454
  19603. 69.235,196.475 67.752,197.959 64.414,197.959 63.672,200.184 64.414,207.231 63.672,209.704 63.672,212.795 61.941,212.795
  19604. 59.468,215.886 61.446,217.864 60.21,219.719 57.49,219.719 56.13,222.562 56.13,224.046 52.544,226.024 50.072,229.856
  19605. 46.857,231.587 45.498,233.813 38.203,232.453 37.337,235.667 33.505,238.511 33.505,240.242 34.741,241.973 31.774,245.063
  19606. 27.818,246.671 27.818,249.515 24.232,252.111 22.13,251.369 16.814,254.459 12.24,257.77 11.622,262.744 12.858,266.947
  19607. 8.654,267.813 3.091,269.049 2.473,270.285 3.214,272.139 0.742,273.5 0.742,275.725 2.473,277.58 1.978,279.434 0,279.434
  19608. 0,282.771 1.978,283.885 3.462,286.109 4.327,288.707 2.349,290.438 0.618,295.631 3.585,301.688 2.226,304.16 0,306.139
  19609. 0,308.488 0,312.691 4.451,314.67 5.069,319.121 8.036,323.076 11.003,325.426 12.734,331.855 19.411,335.564 21.636,338.654
  19610. 25.098,341.498 30.291,344.342 33.134,344.342 36.967,344.342 38.821,346.197 42.159,346.197 42.654,349.041 45.003,350.648
  19611. 46.487,349.906 48.588,354.975 50.319,354.975 50.443,359.426 55.512,363.752 60.705,370.43 62.559,370.43 62.806,368.451
  19612. 65.403,370.43 65.65,375.004 63.548,376.857 64.908,378.959 69.112,380.566 72.079,377.6 77.024,376.734 79.497,377.105
  19613. 79.621,380.566 81.846,381.432 84.566,379.455 83.948,375.869 81.104,373.396 83.33,366.844 83.577,363.012 88.893,356.953
  19614. 93.344,356.334 94.923,352.625 97.424,351.389 97.795,349.412 105.336,345.578 110.282,347.309 108.922,348.916 109.788,351.514
  19615. 115.845,350.4 115.722,348.793 119.06,350.152 124.995,349.164 127.714,350.523 132.413,355.346 141.191,352.502 153.801,344.713
  19616. 158.128,343.725 160.725,344.961 163.939,345.455 167.401,349.164 172.717,351.76 175.685,348.174 178.529,348.916
  19617. 182.238,347.063 184.339,345.703 188.914,346.939 191.51,350.277 191.88,353.49 194.601,354.852 196.084,357.201 202.142,356.953
  19618. 210.055,354.975 207.83,352.873 209.313,352.008 212.775,352.625 216.979,353.49 220.07,354.109 224.273,351.143 228.106,346.197
  19619. 233.669,347.063 236.636,347.309 239.727,345.455 241.83,347.186 245.043,347.309 247.146,345.455 250.484,347.186
  19620. 252.957,347.309 257.531,349.412 258.768,347.805 257.902,345.703 260.869,343.354 265.691,343.6 270.266,343.477 273.85,346.072
  19621. 273.85,347.557 277.313,350.029 282.01,347.309 286.832,346.443 291.16,344.096 291.16,340.139 295.609,338.283 297.217,335.811
  19622. 299.689,335.564 303.523,333.709 305.502,329.754 305.502,326.662 311.684,324.932 316.133,325.18 315.393,321.1 318.854,321.346
  19623. 319.719,324.932 322.934,323.695 325.529,324.809 327.508,325.797 329.732,323.324 338.018,324.066 344.445,322.707
  19624. 353.225,319.244 358.416,317.02 361.508,317.266 362.744,314.918 368.184,317.514 370.779,317.266 374.859,312.568
  19625. 374.859,310.096 377.332,310.713 382.896,307.623 384.627,301.813 387.471,300.699 390.563,297.113 390.563,295.631
  19626. 393.775,295.506 397.855,296.99 400.205,298.598 401.936,297.609 404.656,299.215 408.982,296.371 409.85,298.721 412.445,298.35
  19627. 415.906,295.877 418.256,295.877 419.986,297.113 425.303,296.742 425.303,294.146 429.631,292.045 429.631,290.066
  19628. 432.598,288.707 435.441,284.75 435.441,280.67 431.607,281.66 429.135,281.535 429.383,278.322 432.35,278.074 436.553,274.117
  19629. 441.129,271.645 443.23,266.082 445.949,264.598 449.412,259.529 449.412,255.943 448.67,252.357 451.391,250.627 452.131,249.02
  19630. 450.771,246.794 455.346,243.333 457.695,240.613 457.695,238.387 462.518,235.667 466.473,233.689 468.451,233.937
  19631. 473.15,231.835 473.768,228.744 473.768,226.147 471.418,222.562 472.16,221.326 473.768,219.966 474.51,216.133 476.24,214.402
  19632. 476.24,209.828 478.342,208.839 478.342,206.737 480.32,203.77 479.207,199.195 481.309,198.206 483.658,198.824 485.389,202.286
  19633. 484.4,204.388 488.48,207.973 492.066,201.915 487.49,198.948 483.535,196.352 483.164,190.788 485.389,184.854 489.223,181.021
  19634. 492.066,179.29 495.033,182.257 498,182.01 496.764,177.807 493.674,176.817 492.066,168.781 487.986,169.276 487.986,173.108
  19635. 489.469,175.086 487.986,178.054 486.625,180.526 484.029,181.886 483.658,177.064 479.455,177.93 480.072,175.21 482.299,174.468
  19636. 485.389,171.254 481.186,171.006 477.354,169.523 475.375,164.578 472.902,165.319 470.182,162.476 471.047,158.643
  19637. 472.654,157.778 474.756,158.767 476.363,157.654 476.117,154.316 476.859,151.225 478.342,146.403 476.734,141.705
  19638. 473.52,140.469 469.564,141.705 468.08,138.367 469.811,137.625 469.811,135.029 470.43,133.545 464.865,128.847 460.91,127.982
  19639. 459.18,128.6 456.582,126.498 450.523,126.498 447.186,129.218 443.848,130.207 441.252,128.476 438.408,125.756 438.779,123.902
  19640. 433.34,123.036 431.732,124.025 431.238,121.058 427.898,117.349 425.18,118.338 424.561,115.618 423.201,114.629 423.078,112.156
  19641. 424.314,110.055 421.717,107.087 421.965,104.244 415.783,102.266 410.344,105.728 407.129,104.615 406.016,106.84
  19642. 403.914,106.964 402.061,105.109 400.453,103.131 396.125,102.266 395.631,99.422 390.932,100.411 387.471,99.422 385.121,100.164
  19643. 384.627,98.68 382.031,99.793 380.795,105.109 377.58,105.233 376.467,103.873 369.668,105.356 366.947,107.458 365.588,104.491
  19644. 361.754,103.131 359.406,103.625 358.17,104.738 354.584,105.356 352.977,107.829 350.381,107.334 342.344,108.695 336.41,110.673
  19645. 335.049,112.28 331.959,111.291 330.229,108.818 327.508,109.065 325.406,112.404 325.9,114.876 321.326,115.742 318.359,114.011
  19646. 314.402,112.156 312.672,108.942 311.064,111.786 308.469,111.167 308.963,108.447 307.479,106.84 303.77,112.156 302.904,114.011
  19647. 300.186,114.505 299.814,117.844 301.174,120.069 299.938,121.553 296.848,120.193 292.148,119.698 286.584,119.945
  19648. 283.617,121.924 279.785,122.171 277.064,120.316 271.996,124.767 271.379,127.487 268.41,130.331 264.949,129.836
  19649. 263.219,128.229 260.621,129.836 258.396,128.847 255.43,128.353 251.721,131.443 247.64,132.433 243.931,132.062 242.324,129.96
  19650. 237.625,132.804 233.792,135.276 226.375,133.792 224.273,136.142 220.688,136.636 215.125,135.152 "/>
  19651. </g>
  19652. </svg>
  19653. </template>
  19654. </file>
  19655. <file path="components/home/dashboard/common/map/mapJeonbuk.vue">
  19656. <template>
  19657. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  19658. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  19659. <g id="전라북도">
  19660. <g>
  19661. <path fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" d="M495.351,157.866l-1.987-6.094
  19662. l-0.133-2.782l-2.782-0.53l2.65-3.047l-2.518-2.65l-4.637-1.59l1.06-2.12l-1.06-3.709l0.795-5.432l-4.372-0.663l-0.795-1.854
  19663. l-2.253-1.458l-1.457-3.179l-4.106,2.252l-2.915,0.132l-3.974,3.047l-6.625,0.53l-3.577,4.77l-1.986-0.663l-3.577,1.06
  19664. l-2.12,0.795l-2.252-1.192l1.192-2.782l-0.397-1.855l-2.649,0.397l-1.59-2.12l-1.458,0.795l-0.529,1.855l-2.12-3.047l-3.444-0.265
  19665. l-3.047-1.325h-4.902l-1.854-2.649l-0.133-7.154l-1.722,0.53l-0.928-2.385l-6.094,5.034l0.927,4.107l-2.384,1.59l-1.987-0.397
  19666. l-1.192-5.167l-0.397-2.782l-2.385-0.928l0.265-1.854l-1.987-1.987l-6.359,0.795l-1.722,5.167l0.132,5.829l3.445-0.663
  19667. l1.192,2.252l2.385,0.927l-1.061,2.782l-2.649-1.987l-1.325,2.915l-3.576-0.265l-1.723,1.06l2.518,1.987l1.06,4.504l-1.854,3.842
  19668. l-2.12-2.517v-2.252l-2.518-0.928l-1.324-2.915l-1.723-2.782l-2.782-0.662l-2.782,2.12l-1.987-2.649l-1.192-0.795l-1.987-1.06
  19669. l-1.59,0.53l-2.119-2.649l-2.12-0.53l-3.577-0.927v3.842l2.253,0.132v3.312l-0.53,1.722l1.06,3.445l-2.252,1.192l1.457,4.637
  19670. l-2.517,3.709l-2.039,1.142l-1.273,0.712l-3.975,2.12l-2.384-3.577l-2.65,1.06l-1.854,2.915l-3.975-0.795l-2.385-3.313
  19671. l-2.119,2.252l-2.782-0.265l-1.854-5.564l-1.061-4.372l-2.649-0.795l-0.265-3.709l-0.53-4.902l-4.372,2.65l-2.782,4.107
  19672. l-2.781,0.397l-1.855,1.854l-2.252-3.444l-3.577-1.987l-2.119-0.397l0.132-3.047l-1.325-3.577l-2.781-4.637l-2.518-1.987
  19673. l1.325-3.445l1.722-1.59l-1.59-1.722v-2.649l-1.192-2.252l1.192-2.649l-3.577-2.65l-0.132-3.577l1.722-1.723l-0.794-2.517
  19674. l-2.518-1.59l-1.457-2.915l0.132-2.385l-3.577,0.663l-2.385-0.927l-0.529,2.517l-1.192,0.927v2.12l-2.385-0.53l-2.252-3.18
  19675. l-2.782,1.987l-0.662,3.975h-3.577l-3.048,2.252l-3.179-0.397l-1.855-3.047l-2.517,1.325l-0.397,2.252l-1.723,1.325l0.133,3.577
  19676. l3.577,2.517l-0.663,2.782l-2.914-0.133l-3.047-3.047l-4.77-4.24l-1.987,1.325l-1.987-1.59h-2.649l-1.061,4.107l1.325,1.457
  19677. l-2.782,1.06l-3.444-3.445l-1.723-0.662L249,104.476l-3.644,0.53l-1.722-1.192l-0.795-1.722l-4.107,1.722l-1.59,2.385
  19678. l-0.529,5.829l-3.445,1.458l-6.358-4.77l-4.372,0.53l-5.697-4.505l-3.576-3.842l-0.266-4.77l-1.457-4.504l1.59-1.192l0.133-2.782
  19679. l-5.962-5.299l-0.928-2.12l-1.324,1.987l-3.048,0.795l-2.385-0.265l-2.119-5.034l-1.192,1.325l-1.987-0.663v-1.457l-2.518,1.325
  19680. l-7.816-0.265l-3.908-3.312l-5.763,1.192l-3.378,2.385l-1.192,2.385l-3.577,2.186l-2.98,0.795l-3.379-2.385l-3.577-0.397
  19681. l-3.775,5.365l-1.06,4.504l-1.458,3.445v10.4l-0.729,6.624l-1.391,3.179l-0.922,0.363l-7.822,3.082l-4.57,0.53l-2.584,1.06
  19682. l-1.391,2.451l-2.649,3.378l-3.644,1.06l-8.876,1.325l-2.584,1.192l-4.901,0.331l-1.392,2.318l-1.126,3.312l2.849-0.596
  19683. l2.054,1.391l-1.325,5.233l-2.054,3.179l-3.18,1.855h-2.848l-2.981-1.391l-3.842-2.318l-2.98,1.987l-3.776,2.12l-5.034,0.397
  19684. l-1.59-0.265l-6.359,1.987l-7.684,0.397v3.577h-2.583l-0.397-3.378l-31.266,2.053v10.797l2.119,1.192l-0.464,2.054l0.682,0.463
  19685. l-1.269,3.308l-11.127,34.295l-0.416,1.36l-0.839-0.227h-1.851l-0.151,0.68l1.7,2.72l-4.948,6.479l-1.246-0.511l-2.795-0.756
  19686. l-0.604,0.227l-0.642-0.604l-0.756-1.171l-1.133-0.831l-1.397-0.302l-0.869,0.378H5.196l-0.528,1.662l2.002,0.491l-0.114,0.642
  19687. l-0.755,0.416l1.737,0.944l0.453,1.171l-0.68-0.265l-0.566,0.416l0.188,1.058l-0.188,0.566l0.378,0.68l-0.378,0.793l0.453,1.133
  19688. l0.982-0.265l0.68-0.302l0.604-0.415l-0.113-0.831l-0.681,0.075l-0.49-0.075v-0.793l0.68-0.302l-0.68-0.907l0.755-0.151
  19689. l0.604,0.944l0.566-0.34v-0.566l0.831-0.907h1.359l-0.113,1.284l-0.868,0.793v0.642l1.284,0.377l2.342,0.378l0.491-0.491
  19690. l1.058-0.264l0.445,1.771l12.011,31.35l4.457,3.701l7.452,10.318l-2.833,2.566h-2.451l-1.523,3.775l-0.795,2.318l-0.993-0.729
  19691. l-1.392,1.723l-1.126,2.053l-5.564,4.306l-2.98,1.855l-2.849,3.113l-1.987,1.324h-2.849l-2.98,2.915l1.392,1.06h1.589l0.663,1.854
  19692. l-1.392,2.054l1.59,0.597v1.324l-2.186,0.729l-1.126,1.987l0.596,1.325l1.723,2.915l1.722,0.463l1.259-0.993l3.908,3.577
  19693. l0.266,2.583l1.457,0.928h1.788l2.65,2.119l1.722,1.325l0.795-1.259l0.662-2.45l1.392,0.529l0.464,2.782l2.716-0.53l5.563-2.119
  19694. l5.433-0.597l4.371-1.391l3.313,1.06l4.107-0.662l2.914,1.324l5.101-0.596l10.003,2.849l2.318-2.385l1.655,1.788l2.054,3.908
  19695. l1.06,0.994l-2.45,1.523l-0.066,3.312l-2.915-2.583l-1.987-2.518l-3.908-0.927l-1.722-0.729l-2.385,0.729l-0.066,1.457
  19696. l-0.861,0.596l-2.318-0.993l-0.662,0.464l-0.928,4.504h-1.325l-1.523,3.246l-1.722,2.518l0.331,0.86l-0.729,1.061l-5.101-1.723
  19697. l-5.763,0.53l-2.584,2.385H41.4l-1.987,1.921l-1.59-0.928l-4.637-0.133l-0.132,1.325l-2.12-0.795l-1.523,0.795l-4.372,2.649
  19698. l-0.861,1.458l-0.331,1.854l-1.192,0.265v1.723h-1.325l-1.126-1.723l-0.331-2.318l-2.782,5.564l-1.192,0.596l-0.596,1.59
  19699. l-0.066,1.192l-3.113,6.095l0.199,2.318h-1.523l-6.757,11.989l-0.928,0.53l-1.723,4.901L0,372.686l1.06,1.723l1.59,0.265
  19700. l2.451-1.457l1.59,0.265l0.795,2.583l2.782,0.928l3.644,0.331l2.45-1.656l1.325,1.325l0.265,2.252l2.187,2.782l1.457,0.464
  19701. l0.529,2.252l-0.86,4.902l-1.656,1.986l-1.523,0.53l-0.729,1.192l1.192,0.53l0.265,2.054l2.649,2.119l1.987,0.397v2.649
  19702. l0.066,1.126l-0.662,1.192l0.397,1.458l-1.656,1.655l0.529,1.524h1.192l0.928-1.656l2.981-2.849l1.589-0.066l0.53,2.915
  19703. l1.921,2.119l-0.596,3.71l-0.464,1.06l0.265,2.12l-1.391,1.655l1.192,1.192h1.259l1.126,5.034l1.391,0.53l0.662,2.054l2.318-0.729
  19704. l1.855-0.53l1.921-1.325l1.259,0.066l2.716,0.861l0.729,1.656l1.324-1.457l2.054,0.132l1.03,2.782l1.487,0.266l1.391,1.258
  19705. l1.325-2.053l0.662-4.969h-2.849l-0.795-2.649l1.523-2.385l1.855-0.662l1.854,0.861l1.723-1.126l0.795-1.523l2.119,1.655
  19706. l2.385,1.259l1.06,1.921l1.523,0.199l1.392,1.06l3.577-0.066l2.186,0.464l0.597-1.789l-1.259-1.258l1.391-0.861l1.921,0.927
  19707. l1.59-2.914l0.928,0.397v-2.649l0.133-2.318l1.192-0.199l0.596-2.318l1.789,0.133l3.047,1.258l1.523,1.723l2.385-3.511
  19708. l1.026,0.993l1.425,0.133l1.192-4.106l0.662-2.584l5.365,0.331l3.444-5.034l0.464-3.577l-0.529-3.511l-1.789-1.191l-1.325-0.729
  19709. l2.518-1.126l2.584-0.795l1.854-2.054l2.053-2.649l2.451-0.596l-0.397-1.523l-0.861-1.524l0.331-3.179l-0.396-2.318l-2.584-1.458
  19710. l-1.722-3.18l0.795-1.523l2.119,0.663l2.385-1.987l0.596-1.921l2.65-2.65l2.053-0.065l0.616-0.251l2.961-1.207l3.18,1.06
  19711. l1.656-0.463l6.293,0.132l-0.066-1.391l0.53-0.861l-1.259-1.126l0.662-2.782l1.59-1.324l2.981-0.066l0.86,2.318l1.392,0.662
  19712. l3.113,0.066l-0.795,2.649l-0.066,2.186l-1.126,1.259l0.928,1.723l1.59-1.59l2.053-0.397l2.716,0.994l3.776,0.86l2.517,2.252
  19713. l1.259,0.332l0.993,1.59l3.114,0.529l1.722,2.12l1.656,0.993l-2.518,3.113l2.054,1.723l-0.397,3.246l2.086,0.86v1.789l2.816,0.066
  19714. l1.258,1.523l-1.06,2.451l0.199,1.655l3.179-1.324l1.789-0.133l-0.133,1.656v1.987l1.392,0.795l1.457-0.795l1.391,0.861
  19715. l1.59-0.663l0.994,0.53l1.06-0.662l1.921,0.662l2.318-0.464l3.048-1.656v-2.385l-1.855-3.378l0.266-2.716l-0.199-2.782
  19716. l1.789-0.133l1.722,0.729v-1.655l1.523-0.133l-0.795-2.318l1.854-1.391l1.922-0.199l0.993-2.517v-2.65l-0.662-1.722l0.662-3.313
  19717. l4.107,1.192l0.927,1.854l3.842-2.914l3.577-0.53v3.047v4.505v5.564l2.253,1.192l1.06-1.59l2.385,3.047l-1.192,1.854l-1.192,5.829
  19718. l1.06,1.723l-1.854,2.252l-3.71-0.662l-1.722,0.662l0.397,2.385l2.914,3.18l0.795,2.12l2.518,1.324l3.312-2.252l2.782,2.782
  19719. l-0.662,2.119l2.119,1.723l-1.854,3.842l1.854,1.59v3.18v1.59l-1.457,1.987l-2.252-0.53l-1.192-1.325l-1.192,0.266l-0.662,4.901
  19720. l-2.252,2.518l2.517,2.518l4.372-0.133l1.192,2.119l1.854-0.265l6.889,2.782l0.663,1.59l2.252-0.133l1.192,1.325h3.18l4.504-2.252
  19721. v-1.987l5.697,0.132l0.662-3.577l3.975-3.444l3.71-3.18l1.192,1.458l4.371-3.047v1.32v3.051l1.325,1.59l1.854,1.325l1.457,1.457
  19722. l3.445,0.265l1.59-2.781v-3.18l2.252-2.12l4.106,0.53l5.829,6.491l0.53,1.854l2.518,1.061l1.987-1.061l8.081-0.132l5.432,3.975
  19723. l5.564-0.928l2.119-1.987l0.53-1.854l3.842-0.928l3.975-1.854l3.18,2.385l2.782,1.192l1.59,1.457l0.795,2.385l1.987,0.795
  19724. l2.385-1.723v-1.987l1.324-1.722l1.854-2.649l1.591-1.325l3.312-4.372l1.59-5.962l6.624-5.432l1.987,1.325l4.901-1.192l3.18-0.795
  19725. l2.782,0.662l2.12,2.252l4.106-0.795l3.18,3.18l1.854,0.397l1.59,2.253l2.65,1.06l2.252,3.577l2.914,0.265l0.663,2.649
  19726. l2.385,0.928l1.722,1.59l4.505,1.325l3.047,3.974l3.18-0.265l6.227-3.842l0.53-2.252l2.119-1.458l2.649-2.119l0.663-4.372
  19727. l-0.928-1.723l-1.59-1.06l-1.722-3.577l-0.398-2.649l0.796-1.457l2.384-0.928l2.65-2.518v-2.517l2.119-4.77l1.723-2.517
  19728. l3.18-0.796l2.385-4.371l2.252-0.53l1.06-4.637v-4.107l1.987-1.457l1.192-2.782l-1.06-1.192l-3.18,0.663l-2.252-1.458
  19729. l-1.987-0.132l-1.59,1.324l-2.915-5.432l0.663-4.372l-0.397-2.517l2.914-1.325l2.915-2.252l-1.325-1.854l0.397-2.782l-2.385-0.133
  19730. l-1.06-3.18l-2.252-3.047l0.529-2.518l-2.385-0.927l-0.795-1.723v-2.649l-1.854-1.325l-1.987-0.265l-1.987-1.325l-0.795-1.59
  19731. l-3.577-1.987l-1.457-2.252l-2.252-0.662l2.252-4.902l1.854-3.312l2.915-1.59l1.987-2.12l-1.457-4.637l2.119-1.722v-3.71
  19732. l5.3-3.577l2.385-0.132l-2.253-3.445l-1.59-2.252l0.397-2.252l-0.529-1.723l-1.458-1.324l3.577-5.433l-0.662-2.649l2.518-1.457
  19733. l1.589-2.385l-0.529-3.842l1.722-5.696l3.18-3.71l1.458-0.663l0.927-1.59l-0.265-3.179l1.192-3.048l-0.397-2.517l-0.53-2.252
  19734. l0.663-2.12l-0.397-3.047l0.927-2.915l-0.529-2.517l1.59-3.577h2.119l1.854,1.722l1.723-3.047v-1.59l5.063-3.949l1.562-1.218
  19735. l2.385-0.265l2.517-2.252l1.061-2.252v-3.577l3.047-0.795l0.662-3.709l2.253-2.649l-0.663-2.518l1.987-4.107l2.915,1.06
  19736. l1.59,2.252l2.252-0.795l2.252,0.133l2.12-1.722l1.192-2.65l2.517-1.59h1.325l3.577-2.517l4.239,1.987l1.06-2.517l1.723-2.65
  19737. l2.385-1.06l2.914,0.795l1.723-1.325v-2.252l0.662-1.325l1.723,0.662l1.06-1.987l-1.06-3.71l1.722-2.782l0.795-3.842l1.987-0.265
  19738. l1.723,1.325l5.432-2.12l0.795-2.518l-1.987-1.722l-0.265-3.577l2.252-1.723l5.962-3.312l1.457-3.444L495.351,157.866z
  19739. M77.035,218.573l-1.359-2.04l-1.813-0.453l-3.966-0.227l-8.385,2.493l-4.079,2.606l-4.759,6.346l-3.173,3.853l-1.7,1.133
  19740. l0.907,1.247l-2.04,3.513l0.566,1.586l1.36,0.906l-0.566,3.513l-2.38,1.473l-0.906-1.926l-2.153,0.453l-1.586,1.473l-2.606,5.666
  19741. l-1.02,2.833l6.005,2.379h1.36l0.68,1.133h2.152l2.153-1.02l1.473,0.227l-0.68,2.38l-2.72,1.474l-3.966,1.133h-0.377h-1.7
  19742. l0.151,1.548l-0.378,0.228l-6.27-9.217l-0.944-0.906l0.075-0.982l-0.491-0.302l-0.906,0.302l-1.436-0.906l-0.34-1.435L30.2,248.6
  19743. l-3.399-9.329h0.717l1.247-0.793l1.134-1.02l0.906-1.737l1.02-0.151l1.36,0.151l1.681-0.454l1.907-0.188l0.604-0.604l0.302-0.755
  19744. l-0.944-0.718l-0.227-0.68l-0.718-0.566h-1.095l-0.265-0.454l0.265-0.491l0.868-0.454l-0.188-0.755v-1.511l0.528-2.077
  19745. l-1.359-0.755l0.113-0.34l1.473,0.566l0.944-0.416l0.831-1.624l-0.188-0.491v-0.416v-1.02l-0.604-1.077l-1.246-1.832l-1.738-2.001
  19746. l-1.321-2.078l-0.982-0.433l-2.229,1.415l-0.528,0.604l-1.55,0.491l-1.661,1.397l-4.23,1.888l-0.755,0.756v0.982l0.302,0.755
  19747. l2.946,1.171l1.775,0.113l1.964-0.718l1.436-0.227l1.473,0.416l1.096,1.058l0.831,0.491l1.435,0.076l-0.188,0.34l-1.775-0.038
  19748. l-0.944-0.416l-0.981-1.171l-1.247-0.302l-1.774,0.34l-1.436,0.567l-1.436-0.038l-0.906-0.151l-0.643-0.34l-0.868,0.188
  19749. l0.227,1.058l-0.265,1.813l-3.021-7.969l-0.642-1.133l1.171-0.642l0.264-0.718l-1.435-0.264l-0.604-0.963l4.268-4.589l1.322-1.397
  19750. l1.896-2.304v-1.7v-0.907l-0.642-0.264l8.619-27.686l0.868-1.851l1.345-1.473l1.171,0.151l0.718,1.247l-0.793,1.095l-0.378,1.171
  19751. l0.68,0.793l1.284,0.454l2.418-0.793l1.511,1.095l0.075,0.869l1.096,0.869l1.095,0.038l1.433,0.999l-1.659,1.343l-0.68,1.247
  19752. l0.906,2.266l-0.227,1.926l-2.039,1.246l-1.247,1.473h1.587l0.34,2.153l0.906,1.7l1.134,4.646l0.793,1.813l3.399-1.133
  19753. l5.438-0.113l11.444-2.153l6.346-1.133l3.513-0.113l7.252,1.133l1.02,4.419l-4.419-1.02l-4.76-0.567l-20.509,4.873l-9.291,1.359
  19754. l-0.567,1.586l-0.415-0.038l-0.378-0.755l-1.095,0.265l-1.096,0.717l-1.096,0.34l-1.095,1.247l-1.134,0.68l-1.624,1.625
  19755. l-2.114,0.793l-0.567,1.02l0.529,2.19l1.02,1.284l1.171,0.944l1.397,0.264l0.756-0.755l1.699-1.171l2.398-0.076l-0.208,0.831
  19756. h-0.604l-1.057,0.189l-1.587,0.982l-0.642,0.755c0,0,0.188,1.247,0.188,1.417s1.171,1.454,1.171,1.454l2.19,1.058l1.474-0.377
  19757. l0.377-0.34l-0.49-0.491l0.528-0.755l0.906,0.075l0.303,0.454l-0.303,0.529l0.529,0.188l1.058-0.717l0.264-1.322l-0.717-1.624
  19758. l-1.436-0.944l-1.549-0.566v-1.133l0.416-0.68l-0.189-0.944l0.416-1.775l-0.189-1.133l0.34-1.171l-0.34-1.058l0.453-0.717
  19759. l0.357-0.075l0.021,0.868l-0.075,1.02l-0.303,1.096l0.113,1.322l-0.415,1.737l0.435,1.628l2.021,1.054l2.153,2.04h1.246
  19760. c0,0,2.039-0.906,2.152-1.246s1.474-2.833,1.474-2.833l5.552,0.113l7.025-1.075l5.213-0.965l4.985,0.965l5.099,2.321l3.399,2.719
  19761. l2.946,1.473l3.626,0.793l1.02,3.286l-5.099-1.246l-4.533-2.153L77.035,218.573z"/>
  19762. </g>
  19763. </g>
  19764. </svg>
  19765. </template>
  19766. </file>
  19767. <file path="components/home/dashboard/common/map/mapJeonnam.vue">
  19768. <template>
  19769. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  19770. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  19771. <g id="전라남도">
  19772. <g>
  19773. <path fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" d="M484.252,234.622l1.607-4.5
  19774. l-3.215-3.215l6.91-3.374l3.857-5.143l4.66-5.303l1.928-8.195l-0.805-3.536l-3.053-4.821l-2.25-8.035l-8.676-2.57v-4.5
  19775. l-6.75-3.214l-4.018-5.463l-2.732-2.571v-8.196l-5.143-6.588l-5.463-4.982l-4.5-0.643l-7.713-10.927l-0.16-7.714l-0.482-8.999
  19776. l-1.928-3.374l0.803-2.732l-0.482-3.214l-4.66-2.893l-3.535-8.517l-3.215-2.089l0.482-5.143l-2.57-3.696l-4.982-1.768l-4.018-4.5
  19777. l-3.535-2.571l-5.303-4.66l-3.857-2.089l-3.855,0.964l-1.607-2.41l-5.625,0.321l-2.893,0.964l-3.375-0.803l-6.105,4.821
  19778. l-3.053,7.231l-3.215,4.018l-1.768,5.464l-3.053,1.285l-2.893-4.178l-2.893-0.322l-3.375-3.213l-4.338,1.928l-4.822,2.731
  19779. l-5.303,2.089l-5.463-3.375h-9.32l-6.59-5.785l-1.123-2.089l-3.055-0.161l-2.41,1.768l-1.285,5.625l-3.375-0.482l-4.178-2.41
  19780. l-0.482-4.5l-3.053,1.768l-1.287-1.606l-5.623,5.624l-1.445,3.696l-4.822,0.321l-1.607,1.768l-4.018,1.446l-5.141-0.321
  19781. l-9.322-4.018l-3.053-2.893l-3.695-1.125l2.41-6.75l3.535,1.286l2.893-1.286l-2.25-6.107l1.768-4.017l-4.178-6.268l-2.572,2.892
  19782. l-2.73-2.41l-3.857-5.303l3.215-1.125l2.893-1.286l0.643-6.91l1.125-1.928l-1.768-2.731l-2.572,0.803l-1.285-9.16l1.125-1.928
  19783. l-1.447-3.213l-5.785,4.178l-3.373-2.089l-2.41,2.731l0.963,2.571l-1.285,3.857l-3.215,0.804l-1.123,4.338L251,48.695v5.303
  19784. l1.205,3.696v1.929l-4.178,3.053l-8.678-1.125l-0.161-4.5l-4.5,1.928l0.643-3.375l-1.446-2.893l-3.214,0.161l-2.41-6.267
  19785. l2.41-2.732l-2.893-2.571l-4.82-2.41l-8.196-3.054l-4.179,1.446l1.125-6.428l-3.856-1.607l-1.625-1.928l-3.517,0.804l-0.804,3.696
  19786. l0.804,2.411l-6.75,0.643l-3.535-1.607l-5.946,1.929l-3.053,5.303l-3.215-0.482l-1.124,2.25l1.767,2.732l2.893,1.125v5.624
  19787. l1.446,1.929l-2.25,0.803l-1.125,2.411l-2.411,1.286l-4.981,1.768l3.053,2.41v6.428l-3.053,4.179h-4.982L168,78.906l-2.893-1.125
  19788. l-1.768,3.054l-5.625-2.571l-2.088,5.142l-1.769,4.179l-3.213,2.25h-4.5l-3.536-2.732l-4.017-3.053l-2.25,2.571l-1.929-0.482
  19789. l-1.928,0.161l-1.607,2.571v2.25h3.214l-0.161,4.982l-1.607,1.446l-3.214-2.089l-1.446-2.089l-5.463-0.803l-6.106,2.25
  19790. l-1.446-3.053l-0.964-4.018l-2.893-1.285l2.25-6.268l-2.25-3.535v-2.571l-4.018,3.535l-1.607,1.928l-2.089-2.089l2.893-2.732
  19791. l0.322-4.5l-3.856-2.088l-2.893-3.214l4.66-2.571l0.16-6.588l-4.82-6.749l-3.053,1.285l-6.428-1.285l-7.231,0.803l-1.768,2.089
  19792. l-2.731,1.607l1.125,1.928l-1.125,5.625l-0.804,3.535l1.446,2.089l3.053-0.161l-0.803,2.732l3.696,2.571l1.928,2.571l3.857,1.767
  19793. l-6.75-0.16l-1.446-2.732l-3.053,0.643l-2.731-2.089h-1.928l-1.286,4.5l-1.607,1.446v4.018l-1.768,4.018v4.178l-1.286,2.731v2.732
  19794. l-1.768,4.981l0.803,3.214H61.94v-2.089l-5.303,1.125l-2.25,6.268l-1.607,2.41v2.731l1.607,2.732h2.088l-2.892,3.054l-3.375-2.251
  19795. v-2.892l-2.571,2.25l-1.768,6.106v4.017v3.857h4.339l0.803,2.089h5.625l0.482,4.017l4.821-0.964v-2.089l7.714-4.017l0.482,2.089
  19796. l-1.928,3.375l-1.928,0.643l1.446,3.375l-4.661,1.928l1.607,4.982l2.41,1.286l1.768,3.374l2.571-0.964l0.161,4.017l3.053,5.303
  19797. l2.731-1.125l5.625,11.409h2.893l3.696,0.964l4.018,0.803h2.571l-1.768,4.339l-7.713,1.446l7.392,4.982l-2.571,1.607l-1.607,4.339
  19798. l-4.339,2.088l-3.053,2.411l0.643,4.82l2.089,2.089h-5.304h-2.893l-1.446-2.572l1.286-3.535l-3.053-0.643l4.821-5.625
  19799. l-1.446-4.981l-1.768-1.446l-1.767,4.66l-2.25-0.643l2.25-5.786l-2.25-1.928l-2.41,3.696v4.66l-2.089,0.804l-0.321-3.856
  19800. l-5.303-2.732l-2.732-4.017l-2.41-2.25l-0.161-6.268l2.732-2.41l1.446-6.749l0.321-7.874l-4.018,3.214l-2.731,0.322l0.804,2.892
  19801. l-1.768,5.303l-5.625-0.804l0.964-2.892l-5.303-1.286l-2.893,2.41l-1.446-4.5l-3.696,0.161l-2.089,2.25l-1.285,3.536l-2.571,4.017
  19802. l-0.964,2.732l4.339,2.41l0.161,3.856l-5.785-1.928l-1.125,1.767l-3.214-3.696l-4.017,1.125l-6.267-3.375l-2.893,1.607v1.929
  19803. l-2.893-1.125L2,173.075v3.695l3.214,2.25L2,182.877l3.214,1.285l2.893,0.482l1.768,3.053l2.731-1.607l2.571,0.161l-1.607,2.732
  19804. l1.607,2.25l1.286,3.374l2.25-0.161l-0.803-5.303l4.338-0.803l3.214,1.446l0.804,3.856l-2.571,2.089l1.607,4.5l-2.25,0.803
  19805. l2.571,2.732h2.411l0.804-4.982l2.25,6.106l3.856-4.017l3.053-4.179l-3.696-2.893l-1.125-4.339l5.625-0.321l2.089-2.893
  19806. l3.214,1.929v2.731L46.835,193l3.053-3.374l-0.804-2.25l-2.893-1.286l5.143-2.41l-1.125-3.375l0.643-3.856h4.178l2.571,4.821
  19807. l1.768,2.892l-3.535,2.572l5.142,1.928l-0.482,2.732l2.25,4.339l4.5-3.375l4.018,0.16l1.768,4.822l-0.161,2.893l-14.945,9.963
  19808. l6.107,2.089l-0.804,3.374h-2.25l-0.642,3.696h-3.536l-2.571,3.053l-2.41-4.5l-3.375-3.053l-1.928,3.214l-1.768,0.642
  19809. l-0.482,3.696l3.053,3.858l1.606,2.571l3.536,1.446l-5.303,4.339l0.161,2.41h2.25l2.25-1.929l2.893,0.803v4.5l4.178,0.642h2.571
  19810. l0.161-2.571l4.5,1.446l1.607-2.25l-1.125-3.375l2.089-3.535l-2.732-0.965l2.732-3.857l-1.768-2.25l-2.41-0.321l0.482-2.732
  19811. l3.214-1.125l-2.25-3.535l1.928-4.821l2.571,2.893l0.322,6.75l3.856,2.411l-1.607,4.017v4.017l0.964,1.929l2.411,0.161
  19812. l-3.053,3.374l0.964,2.893l3.696,2.25l-1.446,5.303l-2.41,1.608l-1.446,5.141h3.535l-1.125,3.375l0.482,2.41h2.411l0.482,5.625
  19813. l2.089,1.768l-0.321,1.607h-3.696l-3.856,1.928l-7.714,11.409l-2.571,3.214l4.339,2.572l0.643,3.213h7.393l7.552-3.856
  19814. l6.588-2.731l3.214,6.588l-4.5,1.607h-5.303l-4.66,1.606h-3.214l-4.82,2.411l0.803,4.338l-1.607,1.607l-2.411-0.643l-2.088,3.375
  19815. l8.516,4.499l-0.482,3.856l-3.053,2.41l-1.768,4.661l-2.25,1.928l-2.732,0.804l-1.446-2.09l0.321-2.892l-4.018-4.659l-2.731-0.322
  19816. l0.161-4.982l1.446-1.767l-2.571-1.607l-2.25-3.375l-1.767,2.09l-2.25-0.644l1.125-2.57l-4.178-3.856l-2.57,1.892l-4.339,12.41
  19817. l2.25,2.25l-3.053,6.909l-2.732-2.57l-1.285,10.445l-0.482,5.784l3.856,7.393l0.322,3.535l3.535,2.41l2.732-2.089l1.767,2.089
  19818. l-3.213,4.5l-0.161,4.339l-1.125,3.374l3.696,2.411l1.607-2.893l3.696,4.178l-1.285,4.018l2.732,2.893l4.982-0.643l7.07,0.643
  19819. l3.214,3.374l5.143-1.446l1.446,2.41v4.822l-2.571,1.767l2.731,2.893l5.303-2.089l-0.161-3.053l2.732-0.644l2.571-2.893
  19820. l3.536-0.16l1.286,2.571l-0.964,1.768l0.321,4.499l2.893-2.893l4.339,1.286l-1.607,2.893l-3.053,0.804v2.25h5.625l3.053,4.499
  19821. l-1.768,1.768h-2.893l1.285,5.785l-1.928,2.41l2.25,4.019l2.25,3.856l-2.732,3.374l1.446,2.893l4.018,6.106l4.017-3.696
  19822. l1.606,2.089l3.214-4.178l2.572,3.375l-1.769,3.053l1.929,3.214l-2.893,3.535l-5.142-0.964l-0.321,4.018l1.928,2.571l-1.606,1.768
  19823. l-4.5,0.804l0.803,4.659l0.322,4.66v2.09l3.857-2.25h2.732l0.964-2.089l4.339,0.643l0.643,7.071l2.41,2.41l-4.178,6.428
  19824. l1.607,2.893l-0.964,5.464l3.535,1.768l1.447-3.856h4.017l4.499-7.714l7.393,1.446l4.017,3.054l2.571-1.929l0.482-9.963
  19825. l-0.642-2.41l5.303-3.536l-0.482-7.231l-3.053-0.482l-0.482-2.088l3.856-2.412v-4.499l4.018-2.41l3.214,0.804l1.446-4.178
  19826. l10.125-2.572l4.981-4.339l5.464-1.928l1.928,0.964l8.035-12.052l-0.643-1.928l-2.893-2.25l4.179-2.732l4.017-2.732l-2.411-9.802
  19827. l2.411-2.41l0.803-7.393l-0.964-4.339l0.964-19.444l4.179-3.054v9.481l-0.804,2.571l3.053,2.411v3.856l1.607,3.054l-1.607,6.105
  19828. l0.321,4.66l-1.125,9.481l1.607,7.07l1.928,4.982l-4.017,1.446l0.481,3.535l3.536-0.482l2.411,0.321l-0.643,4.179l3.695,3.053
  19829. l5.142-0.643l3.858-0.321l5.463,4.5l4.339,2.089l1.767,4.66l1.607-4.5l-1.125-4.178l-4.339-4.66l15.749,1.124l1.286,2.411h3.696
  19830. v-1.929l2.088-1.768l0.804-1.929l-2.892-6.106l2.892-1.929l3.214,5.305l2.571,1.928v-5.143l3.696,1.446v-5.143l-3.856-3.696
  19831. l0.643-4.178l2.089-0.643l4.018-15.428v-2.892h5.143v-3.535l-6.91-0.322l3.375-4.66l0.643-4.499l2.893-3.054l-3.375-4.017
  19832. l-0.965-2.571l-7.392-0.804l3.536-1.768l11.568,0.964l8.518-3.696l7.553-10.284l8.678-2.731l4.34-3.375l1.445-5.464l3.375-3.856
  19833. l5.143,4.66l7.23,0.482l5.625-1.286l5.303-8.999l2.09-3.375v-3.696l5.463-7.07l5.947-1.321l1.285,4.054v3.054l2.891,4.017
  19834. l3.055-4.339l6.105,3.857l2.412-4.499l3.213-3.055l5.143-0.16l1.607,13.659v4.66l-4.018,7.714l-0.322,6.428l-12.053-2.089
  19835. l0.482-4.339l1.447-4.982l-1.285-8.195l-5.947,1.606l-5.143,4.822l-1.928,3.695l1.285,2.731l-3.213,1.286l-1.93,9.802
  19836. l-8.676,2.412l-7.393,7.552l-0.805,7.553l0.645,4.34l-2.09,1.767l-4.178-1.125l-0.805-2.571l-2.73,4.66l-4.18,4.982l-4.178,5.463
  19837. l-0.643,4.66l3.375,1.769l-0.32,4.178l8.355,4.018l5.785-1.446l3.857-2.571h4.658l4.02,3.375l3.695-4.019l3.535,2.893
  19838. l-0.643,2.572l4.178,0.964l1.125-2.893l3.053,1.286l1.607,2.57l4.338,3.856l2.09,2.571l-4.34,4.018l6.59,3.535l6.428,6.106
  19839. l-2.572,1.929l5.947,4.018l4.498-1.286v-3.856l-5.623-4.499l6.75-5.304l3.213,0.482l0.803-3.695l3.375,1.124l1.768,3.375
  19840. l3.697-1.606v-5.305l-1.77-2.57l4.822-1.124l3.213,1.284l1.125-3.053v-2.731l4.178,2.089l2.412,0.803l-1.285-7.873l4.338-5.143
  19841. l-4.5-3.214l-8.678-1.768l2.57-3.535l-3.373-4.5l2.09-2.41l3.855-0.321l0.965,3.695l2.41,0.161l1.445-3.054l3.215,2.571
  19842. l2.09,1.768l2.73-2.731v-3.054l3.053,3.856l2.572,2.893l5.143-2.41l4.66-5.303l-1.285-6.428l-1.93-6.589l-7.23-2.731l-4.34-3.696
  19843. l1.607-1.606l3.857,2.731l1.285-1.445l4.34,1.606l-1.287-3.856l-3.855-1.286l-7.232-3.214l-4.98-4.018l-4.34-5.303l-9.963-7.714
  19844. l-0.322-2.731l-3.213-3.536l-1.93-4.98l2.412-3.696l2.73-0.322l3.375-2.41l0.965-4.339l-4.018-2.41v-4.5l5.463-5.303l4.5-3.374
  19845. l-7.713-1.929l-2.09,1.286l-2.732-4.661l-10.766-5.142l12.053,1.124l4.018,4.179l7.068-2.089l4.502-6.106l2.25,4.98l8.195-4.177
  19846. l5.463,2.41l1.607-3.536l-0.965-10.123l8.035,0.321v3.215l1.605,2.891v4.019l2.252,2.571l3.855-0.965l-0.965,4.339l-4.98,4.821
  19847. l-0.322,3.856l5.465,1.606l3.213-2.088l3.055,2.088v3.857l3.213,4.82l1.285,4.5l-0.963,3.178l2.41,0.679l1.768-2.893l2.57,6.749
  19848. l-5.143,4.982l-6.748,5.785l-0.965,2.57l2.09,1.607l5.945,2.249l1.285,3.215l-4.82-2.251l-4.018,1.769l-0.803,4.178l3.535,2.089
  19849. l-3.375,3.857l0.16,3.535l4.178,1.446l2.25,4.821l2.25-3.857l5.303,0.482l6.91,3.696l1.445,3.374l4.662,1.607v-5.785l-4.34-4.981
  19850. l2.09-3.856l-2.572-6.429l0.643-5.624l-2.57-3.053l1.768-3.856l5.945,3.374l-0.803-5.624l6.75-12.695l12.051,13.017l9.482-3.375
  19851. v-2.893l4.98,0.804l1.93-1.446l-1.607-3.375l1.607-4.66l-3.215-5.946l3.215-3.534l0.963-4.339l3.053-0.322v-10.767l2.41-3.053
  19852. v-8.838l-3.855-1.125l-5.143,1.125l-2.73-0.322l1.605,4.66l-5.625-4.178l-4.016,0.643l-6.268-1.285l-3.857,7.07l-3.695,2.893
  19853. l-1.93-3.215l-7.713,6.269l-3.857-3.536l4.34-3.053l-4.82-6.106l-4.18,3.536l-5.623-9.161l7.553-6.106l-6.107-8.356l-5.625-1.606
  19854. l6.75-2.893l0.16-4.339l2.572-0.481l0.965,5.784l8.678,14.945l17.836-12.695l0.805-5.784l4.5-1.447l0.963,2.088l-2.732,2.572
  19855. l-0.643,5.303l9.643,1.607l7.23-0.321l0.482,6.427l4.338,2.732l3.055-0.321v-11.088l-5.465-6.106L484.252,234.622z
  19856. M266.346,147.042l-2.73,1.447l-1.607,7.07l1.607,6.75l-4.5,4.017l-3.053,2.411v5.463l-4.018,0.964l-3.857,2.572l-0.964,2.731
  19857. l-4.66,1.286l-4.018-1.125l-4.338-5.785l-2.411,0.964l-1.285,3.053l-3.215,1.606l-2.731-1.446l-5.303,2.732l-3.696-1.928
  19858. l-2.732,4.5l-6.606,1.767l-2.393,3.856h-5.143v-2.089l-1.928-1.446l-4.178,3.535h-3.214l-0.161-2.732h-4.339l-1.125-2.892
  19859. l6.267-1.125l-1.928-3.053l-0.964-4.339l-2.732-0.804l-4.82-5.946l-8.678-2.089l-4.982,1.606l-3.053-2.088l-0.481,3.053
  19860. l-3.696,0.804l-0.804-2.572l-2.411-1.607l-2.41-1.125l0.803-8.838l-2.893-1.767l2.089-0.804l1.607-5.946h2.25l2.25-2.893
  19861. l-4.5-7.553l6.749,1.125v-4.5l3.215-5.786l3.856,4.018l2.41-2.732h3.214l-0.804-4.339l3.053-4.5l2.732-5.624l2.732,0.803
  19862. l5.303-3.214l-0.804,4.981l-2.411,0.965l-0.161,3.213l5.946,1.286l2.893,2.731l7.231,2.41l5.303-1.928l1.107-3.213l3.393,0.964
  19863. l12.534-8.999l3.215,2.571l4.981-4.981h3.214l1.285,2.089l3.696,1.446v2.893l3.215,1.607l3.374,4.5l-2.25,1.286l3.536,4.66
  19864. l3.536,2.732l-3.215,3.536l4.259,5.946l0.883-2.732l2.732-1.446l1.768,0.803l3.375-1.607l6.588,6.589V147.042z"/>
  19865. </g>
  19866. </g>
  19867. </svg>
  19868. </template>
  19869. </file>
  19870. <file path="components/home/dashboard/common/map/mapKangwon.vue">
  19871. <template>
  19872. <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
  19873. width="500px" height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  19874. <path fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" d="M498.896,434.512l-1.779-2.428
  19875. l1.295-0.323l-1.376-2.265l-0.891-0.81l-0.728-6.309l0.891-3.236l-1.617-3.479l2.911-2.993l-0.89-1.214l0.242-2.346l-2.021-0.242
  19876. l-0.242-1.538l-2.833-2.506l0.243-4.854l-1.86-2.022l-1.538,0.889l-2.83-2.183l0.647-2.67l-1.375-2.67l-1.537,0.729l-4.531-3.316
  19877. l-0.646-5.824l-2.832-5.502l-0.081-2.911l0.324-1.78l-4.935-2.992l-4.046-3.073l-3.559-3.965l-1.536-5.339l0.808-1.134l-0.808-3.962
  19878. l-3.398-3.56l-1.484-1.421l-2.318-2.22l-2.668-3.883l-4.935-7.603l0.08-2.024l-1.697-2.587l-0.485-3.883l1.778-1.62l-0.728-3.478
  19879. l-0.809-3.315l-9.018-7.292l-2.39-1.931l-4.044-6.066l0.243-3.155l1.455-0.81l1.053-2.264l-0.324-1.942l0.243-2.104l-9.141-9.302
  19880. l-1.052-2.184l-3.883-4.045l-1.538-3.479l-7.441-7.361l-15.855-17.23l-0.324-2.75l-6.875-7.362l-3.641-4.854l0.809-3.478
  19881. l-1.455-3.397l-4.109-2.964l-0.825-0.596l-3.965-4.934l0.082-1.78l-1.78-1.132l-2.265-2.104l-2.266-6.39l-5.015-6.229l-1.457-1.052
  19882. l1.7-4.691l-2.185-0.243l-6.714-6.39l-4.692-6.149l0.405-2.427l-2.347-3.801l-7.281-8.089l-0.323-1.941l-1.939-2.023l-3.237-5.257
  19883. l0.175-2.899l0.23-3.815l1.294-1.457l-2.104-0.889l-2.264-4.773l0.972-3.074l-3.5-5.114l-0.707-1.034l-4.45-6.471l-0.971-4.773
  19884. l-1.939-4.45l0.242-3.64l-1.457-2.346l-2.831-2.669l-0.081-3.963l-2.184-1.294l-1.86-3.317l-0.81-3.316l1.051-1.132l-1.212-2.508
  19885. l-10.921-14.642l-0.728-4.207l2.587-2.022l-3.56-4.61l-0.16-1.457l-2.75-2.103l0.403-1.86l-1.699-1.133l-1.536-3.236l-0.729-5.177
  19886. l-0.646-2.508l-1.538-0.728l0.242-1.375l-1.617-2.103l1.294-2.347l-1.536-1.213l-0.972-2.346l-1.052-2.427l-1.456-0.242
  19887. l-2.992-4.207l-1.619-3.883l-1.536-0.81l-0.97-4.368l-5.34,4.611l-6.796,1.941l2.427,5.096l-1.213,17.473l-1.214,10.678
  19888. l-8.735,14.561l-5.097,5.339l1.375,1.78H251.2l-1.131,1.294l-0.809,2.831l-1.699,1.456l-1.132,4.044l-1.294-1.78l-3.316,0.485v1.619
  19889. l-1.78,2.103l-1.941-0.971l-3.559,4.691v1.78l-1.294-1.294l-0.663,1.294l-1.279-0.647l-0.729,2.346l-2.75,0.647h-2.185l-0.971-1.294
  19890. l-4.772,3.479l-1.213,2.265l-7.442-8.008l-2.265-0.323l-4.368,5.258l-1.618,2.265v2.913l-0.728,3.883l0.971,1.294l-1.375,1.375
  19891. l-0.728,2.184l-1.213,0.566l-2.427-0.646l-1.132,1.456l-0.566-2.265l-1.861-2.022l-4.691-4.045l-4.529-0.971l-4.935-1.213
  19892. l-3.479-0.648l-0.889,1.295l-1.942-0.647l-4.044-5.178v-1.699l-5.582,1.78l-3.964,0.809h-4.61l-2.265-4.611l-1.699-2.912
  19893. l-1.456-0.486l-2.913,2.266l-2.67-0.971l-2.993,1.214l-1.617,2.103l-2.508,0.97l-3.883-0.404l-1.456,2.994l-2.346,0.162
  19894. l-3.964-0.729l-2.103,0.567h-7.928v-1.375l-0.728-1.214l-2.022-0.728l-2.022,0.89l-1.78-1.051l-2.669,0.323l-1.456,1.619
  19895. l-2.912,0.97l-1.618,0.162l-5.338,4.692l-1.618,0.162l-0.809,1.78l-2.589,0.97l-2.184-2.103v-4.368l-1.699-2.427l-1.132,1.132
  19896. l-6.147,0.162v2.266l-6.229-3.883l-6.794-1.537l-3.317-0.081l-1.133,1.213l-4.044,1.456l-1.698-0.162l-1.861-1.132l-2.832,2.104
  19897. l-0.971,1.779l-1.78,0.809l-2.265-0.566l-0.728-1.375l-3.074-0.89l-0.89,0.729l-2.67-1.052v-1.132l-2.184-0.081l-1.457-1.295
  19898. l-1.86-0.727l-3.155,1.375l-2.346,1.861l-4.448,2.103l-3.56,1.052l-3.236-1.779l-0.89-1.052v-1.779l-0.97-0.647l-2.751,0.081
  19899. l-1.213,2.751l-0.728,2.265l-1.617,1.051l-2.993,4.368l-1.294,0.566l-3.56,3.236v1.052l2.346,0.081l-1.213,1.618l0.485,0.728H3.83
  19900. l-0.565,3.883l0.404,2.993l-0.242,1.86l1.375,1.375l2.832,1.18l2.75-1.422l1.941-1.699l1.538,0.728l1.456,0.647l-0.728,5.121
  19901. l1.295,1.513l1.375,0.323l0.486,2.185l-1.133,2.086l2.427,3.333l2.103-0.89l-0.08,2.508l-0.728,1.78l0.728,3.64l1.86,1.394
  19902. l1.214,0.709l3.883,4.611l0.809-1.731l-0.243-1.504l2.346,0.405l0.808-1.052l-0.081-1.438l1.214-0.342l3.155-1.698l0.404-1.699
  19903. l1.213-0.809l0.243-1.132v-1.214l4.126-0.607l0.242,1.335l2.508,0.405l-0.081,1.051l-1.779,1.336l-0.163,1.819l-1.132,0.566
  19904. l0.89,2.345l-0.81,1.538l-1.779,2.426l0.162,3.316h1.617v2.67l0.81,0.566l4.206-0.486l0.405-0.835l1.131,0.35l0.082,2.993
  19905. l1.617,3.236h2.022l1.78,1.456l0.323-2.104l0.485-1.375l1.699-0.809l2.75-0.243l2.103-1.132l1.86-2.373l5.744,1.645l-0.243,1.941
  19906. l1.942,1.052l2.266-1.375l1.456-2.427l1.051,1.456l1.376,0.485l1.024,3.154v2.913v1.78v2.831l-0.377,3.64l1.779,2.911l-0.242,2.832
  19907. l0.97,2.346l0.324,2.508l0.97,1.941l2.185,1.78l5.663,0.566l1.294,1.699l1.456-0.971l4.692-0.404l2.103,0.809l1.86,5.824
  19908. l-1.132,1.052l0.081,2.265l3.802,1.375h3.155l5.744,1.78l0.323,2.67l2.185,1.86l0.647,2.588l-0.97,1.457l0.242,1.699l0.81,0.971
  19909. l0.162,2.507l-1.052,2.669l-1.132,1.78l0.162,2.184l-0.728,2.427l-3.56-0.729l-2.75,0.729l-1.86,2.427l-0.324,1.699l-0.89,0.971
  19910. h-1.537l-1.294,1.052v1.699h-2.184l-2.266,1.78l-1.132,3.964l2.265,1.942l0.728,2.264l-3.802,4.936l0.729,1.375l4.369,5.581
  19911. l0.323,2.347l-1.537,2.184l-4.368,3.155l-1.941,1.779l-0.728,2.186l0.404,1.939l0.971,1.052l2.75-2.991l1.213,0.079l2.347,1.699
  19912. l2.184-2.427h2.508l-0.971,4.773l-1.537,6.39l-0.485,5.259l0.971,1.939l-1.456,1.215l-0.242,1.538l-2.265,0.484l0.323,2.103
  19913. l2.023,1.619l2.912,2.506l1.294-1.375l3.317,0.162l0.89-2.345l3.155-1.78l1.051-1.618l2.265,1.941l5.258,2.588l2.265,0.972
  19914. l0.728,2.912l2.589-0.484l1.618,2.749l4.53,3.479h1.375l1.214,1.78l-0.81,1.456l2.104,1.212l3.316-1.212l3.882,1.212l3.236-1.779
  19915. l2.75,2.831l4.126,1.133l1.537-1.94l2.346,0.729l2.427,5.258l3.802,0.808l3.397,2.428l-1.132,3.802l-7.442,0.404l-0.89,0.729
  19916. l0.081,1.212l-2.184,0.647v1.538l-1.86,1.375l-0.81,1.537l-2.507,1.456l-2.832,0.972l-0.081,3.073h3.56l1.294,1.213l1.051,2.588
  19917. l0.972,0.972l2.426,0.566v1.698l-1.213,1.052l0.647,2.508l-0.161,3.397l0.542,0.941l0.67,1.161l-0.162,1.942h-1.86l-1.294,7.038
  19918. l-0.97,0.889l0.162,1.051l-0.89,0.729l0.808,1.375l-1.698,0.972l-0.243,1.456l0.89,2.104h-3.883l-0.647,1.536l0.405,3.074
  19919. l-0.81,1.455l1.133,4.126l-0.81,0.972l2.185,6.067l0.081,1.94h-1.617l-2.751,1.214l0.405,1.537l1.78,3.803l0.162,2.83l-0.566,3.316
  19920. l-1.941,2.67l-0.162,5.338l0.323,1.376l-0.242,1.941l-1.132,1.214l1.941,8.413l1.051,2.911l2.346,3.075l4.691,4.125l1.537-0.809
  19921. l1.456,0.809l1.213-1.294l1.941,0.242l2.265-1.619l2.669,0.486l2.104-0.486l0.81-2.183l0.97,0.162l0.243,1.295l1.375,0.16
  19922. l1.698-2.346l4.369,1.214l1.86,2.669l0.809-1.132l-0.08-1.618l1.213-2.022l1.78-0.567l1.86,1.538l0.567-1.699l1.456-1.779
  19923. l-0.162-1.699l0.242-1.859l-0.646-2.751l0.566-2.589l-1.456-3.478l-1.375-0.729l0.404-1.861l2.994-2.831l2.265-0.242l0.566-1.779
  19924. l1.699-0.972l1.698-0.08l1.537-1.618l2.104-0.162l3.074,1.052l2.75,0.485l2.508,2.103l0.647,5.34l2.507,0.405l-0.081,1.294
  19925. l1.294,1.132l-1.375,1.133l-0.971,2.508l1.214,0.809l0.08,1.942l1.618,1.213l1.213-0.728l4.45-1.053l1.699,0.324l7.685-3.722
  19926. l0.243-1.375l0.728-2.508l1.537-1.294l0.728-2.75l2.427,1.213l1.78,0.082l0.081,2.183l1.86,0.729l0.404,0.972l2.508,0.728
  19927. l1.699-1.456v-3.641l4.53-3.803l2.265-1.051l1.861,1.294l1.941,1.617l1.617,3.155l3.075,0.162l1.616-0.81l1.861,2.509l2.185,3.559
  19928. l3.073-0.566l0.811-1.537l4.934-0.484l1.86-1.861l1.617,1.376l1.861,0.404l-0.891,3.073l0.081,1.457l-0.97,1.374l-2.508-0.161
  19929. l-0.081,1.699l-1.457,1.214l-2.264,0.889l0.728,3.155l-1.86,0.484l-3.155-0.889l-2.589,3.56l1.779,3.235l1.619,1.456l2.588,0.81
  19930. l1.052,1.859l2.426-1.052l1.538-2.508l3.56-1.294l1.375-2.022l3.479,0.325l1.617,2.264l0.89-2.507l2.59,1.454l2.104-1.293l2.75,2.67
  19931. l1.051,2.264l-1.294,2.913h1.778l2.994,3.074l0.97,1.86v2.589h1.699l1.618-2.669l1.457,1.697l1.375-1.94l5.742,0.727l1.214-1.374
  19932. l1.538-2.509l1.375-0.889l2.183,3.074l1.215,0.646l0.485,3.56l1.94-0.647l2.831,1.052v2.669l3.237,1.133l2.668-1.698l1.941,1.698
  19933. l0.647,1.134l4.125,0.97l1.943-1.861l0.646,1.861l3.316-2.75l2.346,1.86v1.941l1.213,1.052l4.611,1.779l3.722,1.294l1.94,2.266
  19934. l1.618-0.485l2.104,3.235l2.265,0.809l1.295-1.294l2.022,0.162l2.427,0.485l3.883,3.641l0.81-1.7l1.212-0.889v-2.104l-1.94-2.75
  19935. l0.484-4.449l2.103,1.779l0.81-2.993l2.185-1.375l-1.374-2.428l1.697-1.617l1.941,2.022l2.265-0.08v2.426l1.699,0.971l1.133-1.133
  19936. l3.964,0.081l0.485,3.398l2.75,2.749l0.404,1.538l3.641,0.646l2.021,1.457l1.456-0.891v-1.94l2.186,0.889l1.697,1.86v-3.56
  19937. l3.236-2.911l1.294-3.479l-0.405-1.294l1.7-2.509l2.022,0.729l3.154-0.729l1.617,2.266v1.537l1.619,0.89l5.5-2.266l6.553,1.618
  19938. l4.45,0.89l1.616,1.618l2.751,0.324v1.375l1.86-1.214l1.213-1.78l-0.566-1.697l0.972-1.214v-1.457l4.637-2.496l0.621-0.335
  19939. l2.831,1.861l3.64,0.566l0.567,2.104l1.537,0.646l1.617-0.161l5.42,3.963l0.404,1.618l2.265,1.941l1.214,1.536v1.78l1.86,0.729
  19940. l2.589-1.376l1.617,0.647l2.751-0.404l2.184,1.779l1.457-0.242l-2.023-2.67l-0.323-2.508l0.729-2.183l-1.536-2.509l2.426-2.751
  19941. l2.347-3.154l4.689-2.669l-0.403-1.537l0.972-1.86l1.375-0.324l3.56,1.376l0.485-2.914l4.691-2.264l1.779-2.993l1.861,0.729
  19942. l2.021-1.375l3.397,0.646l1.294-0.566L498.896,434.512z"/>
  19943. </svg>
  19944. </template>
  19945. </file>
  19946. <file path="components/home/dashboard/common/map/mapSejong.vue">
  19947. <template>
  19948. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  19949. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  19950. <g id="세종">
  19951. <path fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" d="M428.146,356.758l1.408-3.074l-1.664-2.305
  19952. l1.664-4.354l-0.64-3.585l1.28-1.921l-3.842-2.945l-2.305-1.153l-0.512-7.939l-7.94-4.609l3.33-2.433l1.152-2.306l2.049,0.769
  19953. l2.049-0.769l2.177,0.256l0.64,1.409l2.178-0.769l-0.385-9.092l-3.457-3.458l0.512-2.304l-0.768-7.043l-1.665-1.025l-1.152,0.769
  19954. l-1.024-5.122l-2.816-1.28l-2.563,3.33l-7.17-0.257l-4.61-1.665l-3.97,0.385l-2.049-1.281l0.128-2.177l0.769-3.458l-2.433-1.92
  19955. l1.408-2.305l-2.816-1.666l-3.458-1.023l1.408-4.609l-1.793-3.971l-2.433-3.457l-2.944,0.256l-1.025-3.073l3.97-1.024l2.305-3.714
  19956. l-1.024-2.048l-1.28,0.896l-1.665-2.433l2.306-1.28l1.792-2.688l-11.909,2.048l-0.769,4.098l-1.921,2.434l-2.048-0.641
  19957. l-2.817,0.769l-1.28-2.049l-5.763,2.561l-1.536-1.921l-3.97,1.664l-3.073-2.944l-2.689-1.28l-5.25,0.256l-5.123,3.458l-2.177-1.024
  19958. l0.129-3.586l-2.049-4.354l1.92-2.945l-5.122-4.481l-0.127-2.305l-1.665-1.28l-5.379-2.434l-1.92-3.073l0.384-2.177l-5.379-1.409
  19959. l2.306-1.408l-1.281-2.817l-3.713,0.384l-7.171,1.408h-8.58l-1.062-0.279l-1.371-0.36l-1.793-2.945l-2.945-1.153l-0.128-2.689
  19960. l2.817-0.896l3.586-4.354l-0.257-7.043l2.177-6.531l-0.128-4.354l-6.531-6.531l-2.304-0.64l2.945-2.561v-5.25l-1.921-1.28
  19961. l0.128-4.354l-1.281-3.201l-3.457-0.256v-8.196l-4.482-0.512l-1.28-3.073l-1.024-6.019l1.921-7.171l-1.536-2.177l-3.329-0.256
  19962. l-2.689,1.921l-1.666,2.177l-3.2-0.896l-3.586,2.433l-0.768-3.33l-2.177-1.921l-2.178-5.506l2.049-3.202l3.073,2.562l4.099-2.433
  19963. l-1.024-4.61l2.945-7.299l2.561-0.128l0.768-2.049l-0.256-2.177l2.817-6.147l-0.641-3.585l4.738-1.025l4.098,0.384l1.536-2.305
  19964. l2.945-1.409l2.177,0.384v-3.585l1.666-3.329l3.2-1.665l1.024-6.915l-0.769-3.33l2.689-6.402l0.385-5.763l-4.482-3.073l0.257-1.409
  19965. l-3.073-1.024l-1.665,0.768l-4.994-1.024l-8.964-3.33l-1.024-2.433l-3.329-1.92l-5.378,1.024l-1.281-3.457l-3.201,1.92
  19966. l-1.723-1.281l-1.479-3.073l-1.793-1.665l-7.938,3.714h-7.3l-3.586,0.769l-1.408-2.945l-5.25-2.945h-3.457l-2.306,1.92
  19967. l-3.329-2.689l-2.177-3.713l1.793-1.537l-0.385-1.793l-6.402-2.177l-3.073-2.561l-0.128-4.098l-3.714-3.074l-3.842,1.921
  19968. l-2.562-1.024l-2.433-2.689l-3.457-2.945l0.512-2.689l0.256-2.817l-6.019,0.512l-5.249-2.177l0.384-2.689l-2.561-1.024l-2.05,1.665
  19969. l-4.609-1.28l-2.305-2.433l-2.306-3.97l0.513-3.329l-2.562-1.409l-5.763-2.305l-2.433-1.28l-2.817,1.665l-2.177-2.177l-2.945,0.513
  19970. l-0.896,2.049l-4.995-4.61l-3.714,0.256l-4.225,2.561l-3.971-1.409l-1.28,1.281l-2.177-3.97l-0.896-2.433L130.805,0l-2.177,1.409
  19971. h-3.585v2.177l-2.817,2.433v4.354h-2.562l-2.177-2.049h-2.433v2.049l-3.202,2.049l-2.048,6.146l1.793,2.689l-4.738,3.713
  19972. l-5.763,1.409l-1.664,3.458l-4.099,2.049h-1.792l-1.665,2.049l-1.665,2.561h-2.944l-2.306,2.561l2.945,2.561l3.201,1.152
  19973. l2.434-1.28l1.792,2.561l0.385,3.073l2.689,2.562l0.64,4.994l2.433,0.897l-0.769,4.481l2.434,0.641l1.024,3.585l-2.049,1.665
  19974. l1.024,1.281l2.433,1.281l3.971-2.306l2.177-0.127l2.049,2.433l3.329-2.945l3.842,0.256v-4.098l1.024-3.329l1.921,1.537
  19975. l2.304,2.817l0.897,3.969l-1.921,2.817l4.226,10.245l0.769,4.738l-0.769,3.202l-3.585,3.329l-2.689,1.792V95.4l-3.073,3.458
  19976. l-0.641,6.146l-2.049,1.153l3.586,2.817l3.585,2.177l1.024,7.427l-7.299,5.634l-0.769,6.659l0.385,2.305l-1.153,2.433l1.024,3.713
  19977. l2.945,1.921l-0.64,1.793l1.792,1.665l-1.023,2.177l1.664,3.841l-1.92,5.122l-0.129,4.994l1.408,2.689h3.074l0.128,3.586
  19978. l-3.586,1.537l-2.689-1.409l-2.56,3.586h-1.666l-1.536,3.458l-0.129,2.049l1.665,1.408l4.354,1.537l1.024,2.305l-1.024,3.458
  19979. l1.152,4.994l-1.152,4.354h3.713l1.281,2.689l3.97,0.64l3.842,2.689l2.433-1.281l0.64,3.585l3.202,3.201l2.688,4.994l6.916-1.921
  19980. l1.792,1.921h1.92v3.97l3.586,2.945l3.33-1.793v-2.049l2.433-2.305l1.041,0.986l1.393,1.319l-0.897,6.403l-1.536,4.226l2.434,2.305
  19981. v3.329l2.561,3.586l5.25-1.025l1.793-1.792l4.226,0.896l3.97,1.921l2.049,2.177l0.167,0.837l0.346,1.724l-1.025,3.073l-3.713,3.713
  19982. l-1.153,8.452l-4.609,4.097h-2.305h-4.098l-1.793,2.306l0.64,1.921l-3.456,3.97l-1.024,3.842l-0.257,3.585l-1.408,2.306h-1.665
  19983. l-0.896,1.408l4.098,5.762l3.201,1.281l0.513,2.048l-6.659,0.897l-1.665,2.689h-3.329l-1.664-2.818h-3.074l-6.019,5.122v4.482
  19984. l1.665,1.281l-3.201,3.969l0.512,3.33l2.306,0.64l0.384,5.506l1.664,2.434l1.281,0.896l2.562,4.098l3.329,4.481l-0.769,1.921
  19985. l-2.177,0.641l-0.896,2.049l-6.66,4.994l-1.024,2.689l-3.969,3.073l2.177,1.151l-0.385,2.306l-1.792,0.896l4.866,2.305l1.023,3.202
  19986. h2.433l-0.896,2.561l2.562,1.793l-1.281,4.098l-2.562-1.281l-2.561,2.434l0.128,2.689l1.793,0.896l0.129,2.945l2.048,1.024
  19987. l0.64,2.177l4.227,1.537l0.769-2.049l2.561-1.024l6.403,1.024l2.688,2.049l5.123,2.561l0.64,8.452h-1.665l-0.512,3.842
  19988. l-3.713,3.329l2.177,4.994l0.256,3.457l1.792,2.306v2.689l1.408,3.072l1.921,0.641l2.178,4.098l3.842-2.177l2.689,3.33l0.896,3.457
  19989. v2.944l0.896,2.306l-1.921,2.433l0.129,4.994h-2.689l-3.714,3.073l1.281,2.305l2.304,1.025l-0.127,3.97l0.896,2.048l-1.152,2.689
  19990. l0.128,4.738l-2.816,2.049l11.141,6.019h13.061l7.299-3.842l1.281,3.842l-3.97,1.921h-4.61h-6.658l6.019,2.177l1.793,3.713
  19991. l1.921,0.513l2.433,4.226l3.073,1.024v7.044l1.793,1.92l2.177-2.688l3.713,0.896v3.586l4.354,1.665h4.866l4.994-0.769l1.664,0.769
  19992. l-2.048,2.305l-0.256,3.457l2.304,0.641l2.818,6.019h2.688v3.713l1.536,1.793l5.251-1.408l3.841-0.256l1.536-1.665l0.769-2.945
  19993. l-1.023-4.738l1.023-2.177l5.507-2.433l3.586,0.256l6.659,2.689l4.167,2.433l4.54-2.689l3.201,1.281l3.073-0.769l7.299-1.408V480.2
  19994. l3.073-0.127l2.306-1.537l-1.281-2.306v-1.535l3.329-1.409l5.251,2.305l0.896-2.816l2.049-1.793l3.969,0.128l2.434,0.384
  19995. l2.305-0.384l2.049,2.305l2.562,0.896l2.305,3.331l3.073-1.537l0.896-2.05l2.689-1.536l2.433,1.792l3.201,0.513l4.354-2.561
  19996. l3.201-3.97l6.787-3.842l3.072-2.689l-0.64-2.561l-0.128-5.507l1.793-3.072l1.793,0.384v-3.842l1.664-5.635l5.25-3.841l0.897-2.305
  19997. l4.609,1.152l1.536-3.586l1.664-1.28l0.769-2.689l-0.896-2.689l2.305-0.512l1.536-1.921l-1.152-3.458l-1.793-1.536l1.793-3.586
  19998. l-2.562-3.841l3.714-1.537l0.642-2.049l-0.513-1.92l1.536-3.843l3.458-1.152v-2.305l1.536-3.586l-4.354-5.634l0.384-4.226
  19999. l-4.098-2.945l0.384-2.434l1.281-1.28l-0.128-2.817l1.536-1.92l0.256-2.306l0.897-3.458l3.073,2.178l6.786,2.305l2.306-1.024
  20000. l5.89-5.25l4.994-8.707l5.25-1.537l3.585,2.945l10.63,10.372l5.122-2.689l4.993-0.384l4.098-2.05h2.689l1.28-2.56v-2.05
  20001. L428.146,356.758z"/>
  20002. </g>
  20003. </svg>
  20004. </template>
  20005. </file>
  20006. <file path="components/home/dashboard/common/map/mapSeoul.vue">
  20007. <template>
  20008. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  20009. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  20010. <g id="서울">
  20011. <g>
  20012. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="421.209,164.29
  20013. 420.867,165.592 421.209,167.442 420.113,168.333 420.113,169.978 418.88,170.526 417.851,172.445 416.138,174.227
  20014. 416.138,175.461 421.62,181.424 421.209,183 419.222,183 417.851,184.029 415.658,184.029 415.314,184.646 414.973,186.153
  20015. 413.876,187.113 412.984,189.854 412.094,190.334 412.094,192.733 410.997,196.845 408.324,196.229 408.05,197.188
  20016. 404.143,197.941 402.019,197.941 401.195,198.421 401.195,199.449 398.522,199.449 397.701,199.93 400.1,199.93 402.772,201.368
  20017. 403.047,206.098 402.293,207.537 402.019,208.908 400.854,210.621 401.47,211.375 401.128,212.609 400.716,213.226
  20018. 402.019,215.282 403.869,215.625 404.623,216.447 404.691,217.886 403.938,219.12 403.596,222.181 403.047,223.712
  20019. 402.704,227.619 401.882,228.92 402.224,230.497 401.333,231.458 401.265,233.651 412.367,233.993 414.149,233.102
  20020. 415.727,233.307 417.92,233.993 416.48,238.105 412.574,249.894 412.162,253.115 409.661,258.599 393.108,276.007
  20021. 392.561,276.967 387.557,281.97 386.187,282.792 383.719,283.546 374.055,283.89 364.254,281.764 348.695,273.472
  20022. 331.767,266.892 318.333,262.367 315.454,262.094 312.987,260.859 310.108,260.792 307.71,261.683 304.625,263.807
  20023. 301.473,266.823 298.252,272.854 297.772,274.499 296.538,276.83 295.305,278.611 291.534,281.216 286.531,284.711
  20024. 282.83,290.537 281.734,291.429 277.278,293.964 269.602,299.207 265.489,301.229 260.418,301.982 251.919,301.503
  20025. 246.985,299.207 234.853,293.278 227.862,290.88 225.806,288.618 224.778,285.603 224.024,280.736 221.214,276.83
  20026. 218.198,273.882 216.828,273.265 214.497,272.718 213.058,271.483 208.809,263.602 206.272,261.751 202.571,261.751
  20027. 193.73,257.912 190.372,257.775 187.905,259.078 185.711,259.9 181.462,259.832 177.692,259.42 173.991,257.639 153.498,239.339
  20028. 153.498,236.392 152.744,235.843 150.414,235.912 141.024,229.332 133.759,226.591 115.596,210.004 116.898,210.004
  20029. 118.612,209.045 121.354,210.621 122.793,209.045 124.438,207.811 128.139,207.057 132.32,204.727 133.828,204.727
  20030. 133.828,202.191 135.061,200.272 134.582,198.901 135.541,198.353 134.513,197.599 135.541,194.652 137.049,194.31
  20031. 137.459,192.253 138.831,189.648 141.641,186.77 142.737,186.153 144.451,183.275 146.919,183.275 144.863,187.25
  20032. 145.273,189.648 146.165,189.991 146.919,191.361 149.592,190.745 151.99,191.431 154.526,190.128 155.897,190.951
  20033. 157.816,190.882 158.845,191.293 159.461,190.54 160.283,189.58 161.997,189.169 161.723,186.702 160.969,185.673
  20034. 161.174,184.371 163.23,182.315 164.533,181.493 163.574,178.202 164.053,176.763 163.711,173.816 162.614,171.349
  20035. 162.614,169.361 164.121,169.019 164.807,167.99 163.984,165.386 164.807,163.467 164.533,158.943 163.642,157.504
  20036. 163.504,155.859 163.162,154.969 164.396,152.912 164.396,150.513 165.972,148.389 165.972,147.086 166.452,146.195
  20037. 168.44,145.646 168.44,144.071 169.262,142.288 170.838,141.603 170.838,140.232 169.742,138.245 172.62,135.229 172.62,133.311
  20038. 173.169,132.076 172.278,129.952 170.838,128.787 170.633,127.21 169.878,126.388 170.016,125.428 173.786,121.795
  20039. 174.745,121.795 174.745,118.985 174.197,117.957 174.334,116.038 175.088,114.805 175.088,113.16 176.184,112.749
  20040. 177.144,112.063 176.665,110.76 176.758,108.782 171.729,105.277 171.113,104.318 169.81,103.358 168.508,101.508
  20041. 168.508,100.754 171.798,103.358 172.62,103.564 177.692,107.06 178.377,106.58 179.2,107.403 181.736,107.06 182.49,106.306
  20042. 187.835,106.168 192.564,103.221 196.746,99.315 198.322,98.561 203.052,98.561 206.135,96.847 208.33,92.187 210.11,89.582
  20043. 212.989,87.664 216.006,86.841 217.788,86.087 218.679,86.704 219.021,88.623 220.666,89.377 221.488,90.679 222.517,90.953
  20044. 223.271,92.255 225.257,92.53 226.081,91.707 226.902,91.707 227.451,93.146 229.644,95.34 230.33,98.081 230.604,100.617
  20045. 233.894,102.193 234.51,105.003 235.607,106.854 235.607,108.568 236.224,109.39 238.623,109.869 239.583,110.487
  20046. 240.953,113.022 243.9,116.312 243.9,119.465 244.449,120.562 246.299,124.812 247.807,125.633 250.412,126.388 251.509,127.347
  20047. 253.496,125.497 253.77,124.195 255.277,123.714 257.676,122.413 259.253,122.275 259.596,121.178 261.377,119.739
  20048. 262.954,119.808 262.954,117.752 264.119,114.119 263.434,112.063 262.063,111.925 261.651,110.487 261.104,108.841
  20049. 262.27,107.266 263.022,105.552 262.749,103.153 261.721,102.125 261.721,99.864 260.556,98.767 259.938,98.561 259.869,97.396
  20050. 258.704,96.779 258.088,93.832 256.923,92.324 256.648,90.336 258.91,88.211 260.692,88.143 260.623,87.115 263.022,86.087
  20051. 265.079,82.729 265.079,81.495 266.747,80.056 266.747,78.753 269.055,78.753 271.933,77.52 273.44,75.463 274.4,75.121
  20052. 273.44,72.996 273.577,67.513 273.921,66.279 272.961,64.634 273.646,62.578 272.344,61.002 272.344,57.095 271.179,55.861
  20053. 271.041,55.108 272.961,54.765 273.715,54.216 273.715,53.052 274.4,52.366 275.702,52.366 278.238,49.076 280.773,48.733
  20054. 282.419,48.048 283.379,49.213 284.612,48.459 285.16,47.089 288.107,47.089 290.713,47.911 291.329,46.334 291.672,44.004
  20055. 291.123,42.154 290.575,41.126 290.644,36.739 291.672,34.204 291.397,32.764 292.426,31.188 293.248,30.639 293.66,29.063
  20056. 294.961,27.692 297.772,27.692 298.799,26.801 298.799,25.499 299.417,24.197 299.417,23.375 301.679,23.375 303.598,22.757
  20057. 305.037,24.334 307.367,25.636 308.601,25.225 310.314,25.704 311.822,25.225 313.124,23.991 314.427,24.128 315.181,25.636
  20058. 316.071,28.378 316.483,31.736 317.717,35.505 319.087,35.78 319.498,37.15 321.623,36.945 322.925,36.26 323.748,36.67
  20059. 325.188,35.231 326.489,35.026 327.38,33.724 328.202,33.724 329.025,32.353 330.464,31.804 331.149,32.284 332.108,32.216
  20060. 332.108,33.313 331.767,34.066 334.234,35.643 335.262,36.26 336.839,35.505 338.141,33.929 338.963,33.929 340.402,39.001
  20061. 340.402,40.098 340.061,41.126 340.402,43.113 341.499,44.278 342.39,44.142 344.035,42.291 345.681,41.126 348.01,40.714
  20062. 350.684,41.332 351.712,41.126 352.945,41.879 354.315,41.399 354.795,40.646 355.618,41.057 356.715,40.167 358.223,40.167
  20063. 358.977,38.727 360.21,36.808 361.307,36.26 361.992,34.34 363.02,33.244 364.322,33.586 367.476,33.313 367.476,32.421
  20064. 369.12,31.53 371.726,30.982 372.821,30.228 377.893,30.16 378.921,31.394 380.292,32.901 380.909,35.231 381.8,37.013
  20065. 381.8,38.864 383.308,39.48 384.952,39.07 385.98,39.687 387.969,40.167 388.859,40.92 389.477,40.235 391.326,40.167
  20066. 392.354,41.537 393.451,40.989 394.343,41.537 394.343,42.702 394.891,44.004 395.165,45.718 394.616,46.472 394.548,47.979
  20067. 393.04,49.076 392.286,50.79 391.053,52.16 390.916,54.559 390.024,55.999 390.161,58.329 391.67,59.151 392.766,63.126
  20068. 393.108,64.429 394.479,65.388 394.822,69.295 393.863,70.734 393.931,73.407 392.491,74.778 392.561,76.56 393.383,77.04
  20069. 393.04,78.136 394,78.959 392.902,80.604 395.165,81.7 395.782,83.482 394.685,85.402 389.544,88.28 383.17,90.61 385.363,91.844
  20070. 388.653,92.049 389.818,90.474 391.189,92.049 392.423,94.86 392.012,96.368 391.943,97.808 390.847,99.246 390.847,101.302
  20071. 392.149,103.016 392.217,104.25 393.726,105.963 396.329,106.168 397.769,106.717 400.1,105.552 402.635,106.168 404.349,106.58
  20072. 405.445,106.168 406.474,106.717 407.913,106.649 409.146,107.266 411.065,110.281 412.779,110.35 414.081,114.667
  20073. 412.779,114.805 412.3,115.833 412.505,117.066 413.738,117.615 414.355,119.603 414.013,120.494 414.355,121.522 414.355,122.96
  20074. 413.67,123.92 413.876,125.428 412.916,128.443 409.901,130.294 409.353,131.871 406.474,133.378 406.199,136.463
  20075. 405.103,137.491 404.966,138.587 404.143,139.752 404.417,141.671 406.953,143.18 410.518,143.522 412.094,143.043
  20076. 416.138,144.825 418.193,144.756 418.193,146.127 419.906,147.292 419.906,149.142 419.496,150.308 419.496,152.089
  20077. 419.906,152.912 420.593,156.544 419.701,158.669 419.701,160.863 421.209,162.301 "/>
  20078. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="43.597,168.333 42.964,170.697
  20079. 43.597,172.034 41.643,172.034 40.101,174.09 40.101,178.409 41.026,181.698 42.964,184.474 42.363,186.941 44.522,190.643
  20080. 44.522,192.081 41.746,191.464 41.232,192.391 41.232,193.692 40.478,194.515 40.101,195.611 40.101,197.394 38.696,198.695
  20081. 38.696,196.982 37.326,196.639 37.326,198.284 35.886,199.107 35.886,199.93 36.503,200.614 35.543,201.917 35.201,203.424
  20082. 35.201,208.153 34.241,207.399 29.992,207.537 29.992,209.319 28.964,208.565 27.867,210.142 26.359,210.484 22.932,213.294
  20083. 22.453,215.077 21.63,215.831 23.138,217.476 22.795,218.503 21.356,218.503 19.985,218.503 21.699,220.148 21.082,220.765
  20084. 20.259,220.422 19.985,222.181 18.546,221.245 18.135,222.753 16.901,223.095 15.667,224.535 15.667,223.026 14.228,222.479
  20085. 14.228,220.971 12.994,222.753 13.885,223.986 13.885,225.494 15.667,227.413 15.667,230.018 17.038,230.36 17.106,233.307
  20086. 14.639,230.771 14.228,231.937 12.994,232.485 12.994,233.856 11.897,233.856 10.664,235.227 9.979,235.638 11.212,237.214
  20087. 10.39,238.173 7.511,237.625 6.415,238.173 6.415,239.818 1.411,240.162 1,240.983 3.742,241.258 4.016,242.766 5.112,242.766
  20088. 5.181,244.342 8.95,250.305 11.966,250.305 14.228,250.305 19.231,254.074 26.085,254.349 27.113,253.869 28.004,254.349
  20089. 29.786,257.021 30.746,257.57 33.419,257.57 33.076,259.215 33.556,260.792 37.051,261.339 36.777,262.916 35.749,264.286
  20090. 36.092,265.863 35.817,267.165 36.64,269.907 39.999,267.303 41.232,267.439 41.917,266.617 41.849,265.451 42.466,264.767
  20091. 42.466,263.327 43.905,262.064 44.865,262.064 45.619,260.997 44.659,259.969 46.441,259.01 48.565,258.94 50.416,258.666
  20092. 52.952,259.01 53.98,258.599 54.734,259.215 54.734,260.175 57.75,262.064 59.395,259.694 60.766,260.929 60.766,262.505
  20093. 69.264,262.573 68.854,264.013 69.676,265.451 69.676,268.879 68.99,271.072 69.676,271.964 69.676,273.06 71.183,273.06
  20094. 71.183,274.567 73.103,278.611 75.501,278.954 76.735,280.257 76.393,281.216 77.009,284.025 76.118,285.123 74.542,286.219
  20095. 73.925,287.247 73.171,288.823 73.651,290.537 73.583,294.513 72.965,296.021 70.772,298.898 70.841,300.338 71.937,301.915
  20096. 72.143,304.45 71.663,306.507 71.869,308.014 72.417,310.824 69.95,311.989 70.018,313.634 70.498,314.8 69.264,315.554
  20097. 69.813,317.13 69.127,318.364 69.127,319.803 67.62,320.693 66.454,321.928 66.317,324.053 65.426,325.148 64.261,325.148
  20098. 63.713,326.04 62.136,326.794 59.052,326.383 58.778,327.479 57.956,328.713 59.463,330.975 60.148,333.511 61.451,333.511
  20099. 61.862,334.607 64.33,335.841 65.426,335.841 66.454,336.731 69.95,337.966 70.361,339.953 71.046,341.667 68.51,343.724
  20100. 66.591,344.408 66.18,345.573 67.414,346.602 66.111,347.698 66.249,349.686 66.866,350.303 66.317,351.742 66.523,356.196
  20101. 68.579,358.802 68.785,360.378 70.224,359.076 72.074,358.39 74.199,359.076 77.009,359.076 78.517,357.567 80.505,356.608
  20102. 82.081,357.773 83.109,357.842 83.932,359.35 86.262,360.652 89.895,359.692 90.717,360.995 92.499,360.995 93.185,360.583
  20103. 94.692,360.652 96.748,362.64 97.297,361.816 97.914,352.084 98.462,350.371 100.244,349.549 102.094,350.509 104.63,350.783
  20104. 106.413,349.617 107.988,347.218 108.674,345.437 109.77,344.683 111.621,344.408 114.774,340.365 115.391,338.514
  20105. 117.173,336.801 118.955,336.869 120.805,335.841 122.451,333.922 123.479,333.717 123.479,332.482 123.752,330.975
  20106. 125.124,330.7 125.877,332.345 125.877,334.607 126.563,335.498 127.522,335.566 127.934,336.938 129.92,337.075 131.36,336.32
  20107. 131.703,337.28 131.018,338.583 129.715,338.445 129.441,339.611 130.058,340.707 131.428,340.091 132.32,340.639
  20108. 133.554,339.885 134.924,341.53 132.525,343.518 132.251,345.162 130.537,346.19 131.977,351.604 134.513,357.705 138.077,364.01
  20109. 145.137,374.497 148.426,379.157 148.975,381.145 148.289,381.967 146.987,381.487 145.547,381.967 144.588,382.928
  20110. 144.656,383.887 145.685,383.887 145.685,385.463 144.931,386.286 145.41,388.547 147.398,389.78 148.221,390.397
  20111. 148.975,390.397 149.455,391.357 148.838,391.906 149.797,392.66 149.522,394.51 150.894,394.51 153.019,394.989 154.251,393.756
  20112. 155.143,394.305 155.691,397.114 157.268,400.404 155.828,400.404 155.623,402.598 156.582,404.242 158.159,404.242
  20113. 160.078,406.367 160.626,408.629 160.626,411.097 161.448,412.262 162.683,412.673 162.683,413.564 161.518,413.564
  20114. 160.558,413.564 160.489,414.866 164.944,418.841 164.944,421.515 168.645,421.994 170.633,422.474 172.62,422.063
  20115. 173.443,420.555 174.608,419.869 175.088,417.059 176.87,415.003 178.721,413.016 181.05,412.946 181.599,412.192
  20116. 183.313,413.016 185.574,411.164 185.985,408.834 187.562,406.093 189.754,403.283 192.222,401.569 192.839,400.336
  20117. 194.484,399.65 196.129,397.8 197.363,398.485 198.939,400.885 198.939,404.379 199.831,405.339 201.063,405.751 203.668,408.08
  20118. 206.479,410.343 207.712,412.741 207.095,413.77 207.095,415.346 208.74,418.772 210.179,418.91 211.482,417.949 212.373,416.717
  20119. 214.223,416.579 216.074,416.717 217.855,414.935 219.363,414.455 220.598,415.003 222.996,414.044 224.641,413.701
  20120. 227.451,414.317 231.015,413.906 231.837,413.152 232.317,411.919 235.401,412.124 236.841,411.508 238.144,409.863
  20121. 237.732,406.847 238.144,404.928 239.925,403.899 241.57,403.968 242.803,402.94 244.997,402.734 246.162,401.775 250,401.639
  20122. 252.673,397.389 254.523,397.114 255.483,395.813 255.483,394.989 257.883,393.619 258.362,392.453 259.732,391.426
  20123. 260.144,389.644 259.664,388.205 262.27,387.861 265.901,386.766 268.163,385.257 270.493,383.133 271.453,383.544
  20124. 272.207,382.858 272.961,380.939 274.675,381.008 277.142,379.773 277.142,378.267 277.621,377.375 276.799,375.799
  20125. 276.73,373.126 277.621,372.441 280.157,372.304 281.116,372.783 282.281,372.234 283.584,372.852 284.954,372.646
  20126. 285.709,374.017 285.709,376.073 287.285,379.227 288.45,379.843 289.341,381.83 289.341,383.064 290.164,383.818 291.26,385.806
  20127. 291.26,386.971 293.522,388.41 294.07,389.918 299.417,390.124 304.763,389.164 311.822,385.668 316.414,378.129 316.414,375.045
  20128. 318.059,374.771 320.252,375.661 321.006,376.689 322.171,377.033 321.075,380.46 321.28,382.241 322.583,383.064
  20129. 322.583,386.354 323.885,386.971 324.913,389.026 324.913,391.288 324.228,393.14 324.228,394.646 323.953,395.744
  20130. 326.01,399.171 325.324,400.952 325.393,403.283 326.489,404.242 326.489,405.956 325.05,408.834 324.776,410.068
  20131. 323.131,411.302 323.542,414.111 325.393,415.346 328.682,415.346 329.916,415.894 330.738,417.402 333.617,420.006
  20132. 334.302,421.72 336.016,422.474 337.249,425.01 337.249,426.791 339.923,427.202 343.213,430.082 345.2,428.984 349.929,427.682
  20133. 351.163,428.368 352.533,428.3 353.699,427.751 356.509,428.505 357.674,429.328 358.771,429.464 360.484,427.819
  20134. 362.266,427.065 363.226,427.409 364.322,426.655 365.008,427.819 366.036,426.997 365.487,425.216 364.871,423.981
  20135. 366.036,421.72 366.036,419.526 367.612,418.019 369.325,416.854 369.874,414.866 367.886,413.906 366.516,412.878
  20136. 366.241,410.273 366.995,409.451 369.188,409.314 375.151,410.548 377.139,411.371 378.99,411.097 380.224,408.354
  20137. 382.828,405.613 385.296,405.818 386.05,404.723 386.392,400.952 385.912,399.719 386.804,398.622 386.804,397.938
  20138. 387.625,396.292 388.723,396.019 388.723,394.305 389.956,392.797 391.189,392.522 391.601,391.357 391.601,389.713
  20139. 392.972,388.342 394.41,388.136 394.41,385.874 393.383,384.914 394.891,382.104 395.713,381.625 396.193,383.475
  20140. 397.906,385.121 399.688,384.229 400.648,384.64 403.321,384.023 404.486,383.475 404.897,382.174 405.789,381.556
  20141. 405.24,379.911 406.68,379.911 407.501,379.157 410.86,380.254 412.162,380.254 414.561,381.008 415.247,381.556 415.727,382.995
  20142. 418.605,385.188 420.113,385.121 420.113,381.625 420.867,379.5 423.539,378.267 425.391,376.759 426.486,374.977
  20143. 429.846,372.715 429.846,369.494 430.736,369.494 434.232,371.207 438.892,371.207 441.908,369.356 438.617,366.752
  20144. 436.698,366.272 436.425,360.241 439.509,359.692 440.331,360.789 446.431,363.051 447.391,362.57 448.557,360.995
  20145. 449.652,361.475 449.996,358.459 455.272,358.253 458.494,355.717 458.494,351.604 460.07,347.972 460.688,344.819
  20146. 461.578,342.077 463.018,341.118 463.978,341.461 466.855,340.158 468.021,338.583 469.323,337.555 469.323,334.882
  20147. 471.242,332.619 471.242,330.7 470.831,328.302 471.859,326.862 472.201,325.08 472.955,323.778 472.681,322.545 471.79,321.38
  20148. 470.215,321.174 468.707,318.774 467.062,320.42 463.703,319.187 461.51,318.707 460.619,317.199 459.316,316.514 457.81,317.746
  20149. 456.438,318.364 453.834,318.295 452.943,317.062 451.16,316.719 449.927,315.348 448.419,314.868 449.036,313.154
  20150. 447.665,311.647 447.733,308.357 448.762,307.603 448.898,305.821 449.858,304.382 451.571,304.176 451.366,302.736
  20151. 450.406,301.915 447.803,301.023 447.117,300.133 452.669,300.133 454.039,299.207 453.08,297.87 453.148,294.238
  20152. 454.245,290.605 456.85,290.331 458.631,285.671 458.837,284.711 462.881,280.257 463.36,278.063 463.566,272.648
  20153. 465.279,270.455 465.554,269.222 467.473,267.028 467.747,265.726 470.557,262.162 471.79,261.477 474.807,256.405
  20154. 476.108,256.405 478.508,257.365 479.261,256.885 479.261,255.651 480.358,255.926 482.552,256.337 485.361,255.582
  20155. 487.623,255.308 488.377,255.993 489.885,255.926 492.215,254.212 494.066,253.663 495.437,254.074 496.602,255.514 499,255.514
  20156. 499,254.417 498.109,253.32 498.246,249.208 497.767,246.261 496.465,244.274 496.876,242.149 496.739,237.831 497.15,234.815
  20157. 497.287,232.074 495.368,229.058 494.34,225.631 494.066,220.834 492.764,218.297 492.215,215.487 490.021,212.472
  20158. 489.747,209.319 489.405,206.372 490.912,205.343 491.324,204.11 492.421,202.465 488.377,204.453 480.358,206.098
  20159. 464.662,218.229 456.096,222.181 448.487,221.588 444.992,222.479 439.646,224.809 435.465,227.482 428.543,235.295
  20160. 418.536,260.175 413.328,268.398 408.529,278.68 401.47,287.453 393.383,292.319 387.899,294.718 380.497,295.814 361.101,293.21
  20161. 343.624,280.188 317.03,271.483 311.617,272.785 283.31,303.011 278.17,304.725 271.041,312.127 267.408,313.703 264.188,312.949
  20162. 257.265,313.703 255.62,315.348 254.661,313.771 249.658,312.743 241.159,308.357 234.031,303.971 221.557,297.939
  20163. 216.211,295.678 212.099,297.528 205.245,299.207 200.104,300.063 195.786,300.133 193.045,299.207 184.271,292.936
  20164. 178.652,284.163 174.951,276.145 169.125,267.439 143.355,246.672 136.912,242.697 135.952,243.246 136.363,245.712
  20165. 135.267,245.987 134.033,242.218 125.191,232.896 96.2,210.896 75.707,199.586 57.476,185.948 51.102,176.353 "/>
  20166. </g>
  20167. </g>
  20168. </svg>
  20169. </template>
  20170. </file>
  20171. <file path="components/home/dashboard/common/map/mapUlsan.vue">
  20172. <template>
  20173. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px"
  20174. height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
  20175. <g id="울산">
  20176. <polygon fill="currentColor" stroke-linejoin="round" stroke-miterlimit="10" points="498.661,173.627 498.259,165.791
  20177. 499.397,160.299 498.192,154.538 495.981,150.854 494.374,151.792 492.298,148.778 493.102,143.889 491.293,142.415
  20178. 489.819,142.951 486.068,142.348 484.596,141.209 484.528,139.066 485.935,137.19 481.38,132.703 478.433,129.421 476.021,122.053
  20179. 476.021,118.704 478.365,116.493 476.49,112.943 476.089,105.508 477.696,103.097 480.978,102.963 483.456,100.083 484.729,97.069
  20180. 482.719,96.533 480.04,93.653 476.691,91.912 475.352,92.247 473.944,91.711 471.936,92.648 471.132,93.854 469.323,94.993
  20181. 467.515,92.715 467.648,89.768 462.759,91.376 462.491,89.5 456.329,86.352 453.918,85.883 452.177,85.013 446.014,80.86
  20182. 442.129,81.262 441.124,82.065 437.574,82.065 434.963,76.372 428.131,75.568 420.294,72.755 416.342,71.616 406.629,74.563
  20183. 406.764,72.554 404.754,69.406 401.338,69.272 400.467,66.593 398.592,65.923 398.19,64.115 397.989,61.302 395.645,62.507
  20184. 391.961,61.302 387.741,61.502 386.804,62.507 384.058,63.177 382.45,64.249 381.914,66.325 380.977,66.593 379.972,68.468
  20185. 378.363,68.871 376.957,71.55 374.412,73.492 370.059,74.43 367.781,73.559 366.643,76.305 366.24,77.711 366.844,79.386
  20186. 364.565,78.716 363.428,80.257 364.097,81.194 362.355,82.534 362.087,85.013 363.829,85.615 363.628,87.424 359.743,88.228
  20187. 357.197,87.424 354.586,89.098 353.179,90.036 352.576,87.96 350.299,86.553 348.558,87.893 346.48,85.347 344.673,84.946
  20188. 341.257,88.361 338.979,88.495 337.572,89.701 337.104,93.854 337.171,95.193 335.563,95.596 335.63,96.601 336.702,97.806
  20189. 336.3,101.021 331.946,100.887 329.735,105.174 325.181,104.236 323.439,102.025 323.774,100.418 318.885,97.404 315.938,95.596
  20190. 313.728,98.007 311.048,96.466 309.642,94.323 308.102,94.055 302.943,96.868 300.867,94.925 298.656,93.653 293.231,91.912
  20191. 293.03,90.706 291.289,88.764 291.088,86.62 288.609,85.281 287.807,78.046 289.078,76.841 289.882,74.229 292.763,71.684
  20192. 293.365,69.339 294.504,62.038 292.629,60.766 291.758,57.617 295.441,53.532 295.375,50.518 295.844,46.968 295.441,43.954
  20193. 293.165,42.346 292.294,38.059 290.083,35.313 283.653,33.571 280.237,34.04 275.415,32.433 274.41,30.892 266.842,31.361
  20194. 266.641,27.208 264.027,24.864 261.147,24.395 259.139,25.266 256.794,23.859 254.784,21.18 254.517,19.773 253.11,18.635
  20195. 250.229,19.773 248.22,16.893 244.27,14.348 242.125,12.54 241.656,9.927 239.179,9.592 236.231,10.798 233.954,13.143
  20196. 233.484,15.956 230.672,18.367 230.404,16.022 226.116,15.152 225.916,13.343 218.75,12.003 218.683,9.258 213.457,5.708
  20197. 213.659,9.592 211.515,12.071 211.113,14.616 207.296,17.764 204.885,18.903 203.209,17.965 199.928,16.827 198.454,17.63
  20198. 192.56,17.697 191.086,14.616 189.813,13.477 188.675,11.602 186.464,8.789 184.188,8.521 181.91,6.779 180.637,7.047
  20199. 178.494,4.837 174.743,5.507 173.002,6.578 173.002,8.052 170.591,8.923 168.982,10.932 171.997,13.343 168.982,18.97
  20200. 166.37,21.582 162.352,20.376 158.936,18.568 156.122,25.601 149.491,28.213 147.683,25.199 144.267,25.4 142.86,27.41
  20201. 139.042,28.213 134.621,27.41 132.009,30.021 127.79,31.026 125.78,32.634 121.963,32.634 121.963,35.246 118.145,38.059
  20202. 114.929,38.059 112.116,40.873 112.116,42.681 109.304,43.686 105.484,51.924 101.266,57.551 101.266,61.569 104.682,63.78
  20203. 100.06,69.406 98.854,71.616 101.063,74.43 98.854,77.444 100.261,80.86 98.854,83.874 98.854,87.893 102.471,87.893
  20204. 107.896,97.538 112.116,99.146 113.322,102.963 112.72,106.379 108.098,110.197 104.479,106.178 101.266,103.968 96.241,103.365
  20205. 85.993,99.949 78.76,97.136 77.152,100.552 77.152,103.365 74.339,110.197 71.124,114.782 68.11,120.043 62.082,118.508
  20206. 58.063,114.782 52.235,116.226 49.021,122.369 39.978,127.479 38.169,129.956 33.146,134.512 37.567,138.238 39.576,140.941
  20207. 42.791,140.941 45.203,142.2 47.815,140.338 53.441,142.2 54.647,148.376 54.044,155.61 56.857,159.629 53.843,165.255
  20208. 54.044,170.681 50.226,175.303 50.427,178.919 46.81,181.934 44.6,180.326 41.385,184.546 38.772,184.546 31.739,194.793
  20209. 26.113,200.219 14.659,203.233 8.832,205.444 2,209.864 3.407,214.285 9.435,221.921 11.444,226.542 21.291,219.71 23.501,225.136
  20210. 25.711,226.542 28.323,228.15 27.921,230.963 30.333,233.977 29.931,236.59 26.917,240.608 27.318,243.623 25.711,246.234
  20211. 26.113,249.65 35.356,247.842 38.772,247.842 41.385,249.65 40.179,254.072 43.997,255.88 47.011,253.871 49.422,254.072
  20212. 54.848,253.066 58.063,250.455 63.89,252.264 75.143,248.445 80.367,247.239 87.198,244.627 88.606,246.838 88.203,250.455
  20213. 85.592,252.664 83.582,254.272 84.186,256.885 82.779,259.698 83.783,261.506 84.186,265.927 93.63,272.559 97.045,272.559
  20214. 102.471,276.778 107.093,277.782 109.705,279.792 117.943,281.601 121.561,285.619 125.981,287.228 128.593,286.423
  20215. 131.004,288.433 134.621,287.025 137.636,288.433 139.042,290.844 138.439,294.662 139.444,298.078 141.453,300.891
  20216. 139.646,304.307 140.449,308.326 143.262,311.139 149.491,313.55 150.094,317.569 152.706,320.784 153.31,323.798 152.305,327.214
  20217. 154.716,330.229 159.739,332.036 163.557,337.462 170.791,343.691 172.6,349.117 178.494,353.738 180.637,353.738 185.259,356.351
  20218. 190.483,362.178 193.899,364.388 197.517,365.594 197.517,368.006 201.535,368.006 203.946,365.996 209.372,365.996
  20219. 211.181,368.006 218.013,363.986 222.635,364.59 224.643,362.379 229.868,360.37 234.49,368.006 232.681,370.216 234.49,373.431
  20220. 232.681,378.655 235.695,381.669 239.915,383.076 243.732,384.08 245.943,386.693 246.948,391.315 250.766,393.323 252.574,398.95
  20221. 248.154,402.366 244.737,406.787 242.326,407.792 240.518,412.414 235.294,417.035 233.887,422.862 236.298,424.269
  20222. 239.513,428.489 243.532,431.101 248.154,431.101 251.167,433.713 257.397,431.905 260.611,432.105 263.626,430.9 267.846,431.704
  20223. 269.252,427.886 274.075,426.078 275.481,428.087 277.893,427.685 280.506,428.891 284.122,426.881 282.917,423.465
  20224. 285.93,423.465 290.15,426.881 294.571,426.479 298.992,423.465 299.795,428.489 301.604,432.708 306.226,436.124 307.632,439.34
  20225. 310.445,442.153 311.651,447.578 312.656,449.788 317.277,450.793 317.277,453.607 315.269,453.607 313.66,462.046
  20226. 317.277,466.266 318.483,469.079 316.675,471.29 317.344,474.438 315.603,476.781 312.99,479.93 318.483,482.877 322.368,480.801
  20227. 323.439,482.877 325.248,485.489 327.66,484.351 329.535,486.293 333.219,486.695 335.563,485.757 337.237,486.695
  20228. 336.166,488.303 335.63,490.313 337.707,494.331 341.793,493.058 342.328,495 344.338,494.465 346.347,494.465 347.084,491.651
  20229. 348.289,490.513 348.289,488.235 349.361,486.695 350.365,483.48 352.442,484.618 354.72,483.613 353.581,481.738 354.72,479.395
  20230. 352.375,477.586 355.055,477.25 357.064,473.768 358.738,472.495 361.819,472.629 361.819,474.103 365.906,472.696
  20231. 366.375,470.151 367.513,468.343 367.178,465.396 368.919,462.381 372.135,461.242 375.082,461.377 376.623,463.051
  20232. 375.216,464.122 378.363,464.189 378.363,467.338 380.641,466.601 381.98,464.524 383.99,464.457 384.928,462.983 388.88,463.386
  20233. 392.229,462.983 395.176,460.706 396.314,458.094 396.314,456.42 394.037,455.482 394.238,451.798 392.229,450.86 391.157,449.052
  20234. 388.679,448.783 388.479,447.243 389.952,445.367 389.349,442.622 385.129,441.482 384.393,439.071 381.512,440.009 378.632,438
  20235. 379.301,436.526 378.766,432.374 380.373,427.283 382.717,425.407 380.977,422.126 380.373,420.519 382.45,418.71 383.388,417.371
  20236. 385.598,417.103 388.746,416.164 389.482,414.893 389.215,412.279 388.009,410.604 388.143,409.266 392.697,409.064
  20237. 396.649,405.18 396.649,389.641 398.19,388.77 398.19,376.847 396.85,374.167 396.784,372.426 398.19,371.488 400.467,370.551
  20238. 401.539,369.145 405.691,369.145 405.691,363.919 400.534,361.844 404.085,353.939 406.629,351.796 407.701,349.251
  20239. 403.146,347.375 402.075,349.52 401.003,349.117 399.195,350.59 398.727,351.863 401.07,352.733 399.128,356.618 394.573,358.494
  20240. 389.08,360.57 387.606,356.753 392.765,354.676 394.171,350.322 393.702,347.979 388.479,346.639 385.933,349.452 383.32,348.112
  20241. 381.177,333.645 382.65,333.444 381.512,328.085 378.431,324.133 376.89,324.469 376.22,323.798 376.153,321.923 374.21,318.976
  20242. 370.661,317.233 370.861,314.689 373.438,314.129 375.483,313.685 375.483,315.961 380.909,320.65 383.12,321.454 384.928,322.793
  20243. 384.861,324.669 386.535,326.075 387.406,328.019 387.205,329.96 386.335,330.765 386.87,332.64 388.479,332.372 388.611,334.582
  20244. 402.744,340.678 404.218,336.726 405.29,337.127 407.701,330.765 411.652,332.305 417.547,323.329 413.529,320.114
  20245. 418.418,313.818 418.418,308.259 420.227,307.254 420.227,304.574 418.619,303.168 423.509,299.484 421.164,297.273
  20246. 413.863,284.48 409.979,284.012 407.165,287.294 405.022,287.025 403.883,285.887 401.338,286.824 398.859,282.739
  20247. 398.659,281.132 396.649,278.787 397.722,276.979 399.328,277.247 401.539,279.792 404.486,282.271 406.764,282.271
  20248. 407.835,281.333 410.916,281.064 414.734,279.391 415.002,281.132 419.69,282.739 421.299,281.333 421.03,275.639 419.958,271.955
  20249. 419.758,263.583 409.041,262.646 409.912,256.148 406.496,254.474 409.041,248.379 411.921,248.981 410.715,237.26
  20250. 416.342,243.221 422.169,250.521 431.346,268.741 431.881,274.031 429.872,282.605 437.307,284.146 442.799,292.586
  20251. 438.78,300.021 438.78,313.081 441.393,317.101 440.388,318.038 443.737,319.377 446.148,318.775 450.568,313.752 449.028,311.541
  20252. 449.966,310.201 450.568,308.66 453.047,306.718 455.257,306.115 456.129,307.723 459.41,307.389 459.745,305.11 458.874,303.101
  20253. 460.75,301.896 464.367,302.565 465.706,304.978 465.706,307.389 466.644,308.526 468.854,307.389 470.931,303.838 473.61,302.03
  20254. 474.48,299.618 474.48,296.604 476.624,294.26 477.829,294.059 479.771,294.997 478.834,291.112 476.49,288.701 474.213,289.705
  20255. 474.213,291.446 473.61,292.25 471.868,291.714 469.792,293.657 467.448,293.121 465.572,290.107 465.706,287.093 467.85,283.609
  20256. 469.726,284.614 473.074,283.476 474.48,282.271 477.36,282.739 478.365,280.528 478.5,276.979 476.355,274.366 475.15,275.975
  20257. 472.002,275.506 468.52,278.854 466.711,277.448 467.18,269.879 474.48,269.946 476.558,270.013 476.624,272.424 478.365,271.889
  20258. 482.451,272.759 479.639,270.013 481.112,264.855 481.714,262.109 485.265,253.401 482.117,252.063 480.71,256.416 475.218,256.35
  20259. 474.548,259.563 472.271,259.497 472.605,248.445 481.781,247.775 485.935,249.182 488.814,251.727 486.471,242.35
  20260. 485.733,238.301 488.814,232.035 487.007,229.758 487.944,228.418 487.676,226.074 489.686,224.399 489.686,220.648 492.9,218.103
  20261. 492.498,211.472 491.628,208.123 492.9,204.439 490.757,203.568 487.207,196.468 487.269,194.15 487.476,186.354 488.748,184.144
  20262. 490.623,184.345 492.097,181.799 491.694,179.723 493.235,178.183 495.044,179.723 498.058,178.986 500,176.441 "/>
  20263. </g>
  20264. </svg>
  20265. </template>
  20266. </file>
  20267. <file path="components/home/dashboard/common/coreDetailModal.vue">
  20268. <template>
  20269. <!-- CORE 개별 상세 팝업 : S -->
  20270. <v-dialog
  20271. v-model="isCoreDetailModal"
  20272. persistent
  20273. width="62.5rem"
  20274. >
  20275. <div class="v-common-dialog-wrapper custom-dialog alert">
  20276. <div class="modal-tit">
  20277. <strong>{{ coreInfo?.neName }}</strong>
  20278. <button
  20279. class="btn-close"
  20280. @click="fnClose()"
  20281. />
  20282. </div>
  20283. <div class="v-common-dialog-content pa-0">
  20284. <div class="core--list--component">
  20285. <h2>시스템 정보 및 KPI</h2>
  20286. <!--
  20287. contents critical, major, minor, normal 추가하여 사용
  20288. -->
  20289. <ul class="system--info">
  20290. <li>
  20291. <span class="titles">NE 유형</span>
  20292. <span class="">{{ coreInfo?.neType }}</span>
  20293. </li>
  20294. <li>
  20295. <span class="titles">고객 유형</span>
  20296. <span class="">{{ coreInfo?.customerTypeName }}</span>
  20297. </li>
  20298. </ul>
  20299. <ul class="system--info">
  20300. <li>
  20301. <span class="titles">STATUS</span>
  20302. <span
  20303. class="contents"
  20304. :class="getBodyStatusClass(coreInfo?.connect)"
  20305. >
  20306. {{ coreInfo?.connect?.isConnected ? 'ACTIVE' : coreInfo?.connect?.reason.join(',') }}
  20307. </span>
  20308. </li>
  20309. <li v-if="coreInfo?.kpiItems && coreInfo?.kpiItems.length > 0">
  20310. <span class="titles">{{ coreInfo?.kpiItems[0].label }}</span>
  20311. <span
  20312. class="contents"
  20313. :class="getBodyLevelClass(coreInfo?.kpiItems[0].val)"
  20314. >{{ toRoundFix(coreInfo?.kpiItems[0].val, 2) }}%</span>
  20315. </li>
  20316. </ul>
  20317. <ul
  20318. v-if="coreInfo?.kpiItems && coreInfo?.kpiItems.length > 1"
  20319. class="system--info"
  20320. >
  20321. <li v-if="coreInfo?.kpiItems && coreInfo?.kpiItems.length > 1">
  20322. <span class="titles">{{ coreInfo?.kpiItems[1].label }}</span>
  20323. <span
  20324. class="contents"
  20325. :class="getBodyLevelClass(coreInfo?.kpiItems[1].val)"
  20326. >{{ toRoundFix(coreInfo?.kpiItems[1].val, 2) }}%</span>
  20327. </li>
  20328. <li v-if="coreInfo?.kpiItems && coreInfo?.kpiItems.length > 2">
  20329. <span class="titles">{{ coreInfo?.kpiItems[2].label }}</span>
  20330. <span
  20331. class="contents"
  20332. :class="getBodyLevelClass(coreInfo?.kpiItems[2].val)"
  20333. >{{ toRoundFix(coreInfo?.kpiItems[2].val, 2) }}%</span>
  20334. </li>
  20335. </ul>
  20336. <ul
  20337. v-if="coreInfo?.kpiItems && coreInfo?.kpiItems.length > 3"
  20338. class="system--info"
  20339. >
  20340. <li v-if="coreInfo?.kpiItems && coreInfo?.kpiItems.length > 3">
  20341. <span class="titles">{{ coreInfo?.kpiItems[3].label }}</span>
  20342. <span
  20343. class="contents"
  20344. :class="getBodyLevelClass(coreInfo?.kpiItems[3].val)"
  20345. >{{ toRoundFix(coreInfo?.kpiItems[3].val, 2) }}%</span>
  20346. </li>
  20347. <li v-if="coreInfo?.kpiItems && coreInfo?.kpiItems.length > 4">
  20348. <span class="titles">{{ coreInfo?.kpiItems[4].label }}</span>
  20349. <span
  20350. class="contents"
  20351. :class="getBodyLevelClass(coreInfo?.kpiItems[4].val)"
  20352. >{{ toRoundFix(coreInfo?.kpiItems[4].val, 2) }}%</span>
  20353. </li>
  20354. </ul>
  20355. </div>
  20356. <div class="core--list--component--grid">
  20357. <div class="title">
  20358. <h2>장애 이력 ({{ objCount.total }})</h2>
  20359. <div class="status">
  20360. <ul>
  20361. <li class="critical">
  20362. <span>CRITICAL</span>:<span>{{ objCount.critical }}</span>
  20363. </li>
  20364. <li class="minor">
  20365. <span>MAJOR</span>:<span>{{ objCount.major }}</span>
  20366. </li>
  20367. <li class="major">
  20368. <span>MINOR</span>:<span>{{ objCount.minor }}</span>
  20369. </li>
  20370. </ul>
  20371. </div>
  20372. </div>
  20373. <div class="tbl-wrapper">
  20374. <div class="tbl-wrap">
  20375. <!-- ag grid -->
  20376. <ag-grid-vue
  20377. style="width:100%; height:calc(10 * 2.76rem);"
  20378. class="ag-theme-quartz"
  20379. :grid-options="gridOptions"
  20380. :row-data="eventItems"
  20381. :suppress-pagination-panel="true"
  20382. @grid-ready="fnOnGridReady"
  20383. />
  20384. </div>
  20385. </div>
  20386. </div>
  20387. </div>
  20388. <div
  20389. class="btn-wrap nw--btn--wrap"
  20390. style="padding-top:1.88rem"
  20391. >
  20392. <div />
  20393. <div class="inner--btn--wrap">
  20394. <v-btn
  20395. class="custom-btn btn-gray mini"
  20396. @click="fnClose()"
  20397. >
  20398. <i class="ico" />
  20399. 닫기
  20400. </v-btn>
  20401. </div>
  20402. </div>
  20403. </div>
  20404. </v-dialog>
  20405. <!-- CORE 개별 상세 팝업 : E -->
  20406. </template>
  20407. <script setup>
  20408. import { useI18n } from "vue-i18n"
  20409. import useAxios from '@/composables/useAxios';
  20410. import useUtil from '@/composables/useUtil';
  20411. import useErrorHandler from '@/composables/useErrorHandler';
  20412. import useEnumCodeKr from '@/composables/useEnumCodeKr';
  20413. import apiUrl from '@/composables/useApi';
  20414. import dayjs from "#build/dayjs.imports.mjs";
  20415. import "ag-grid-community/styles/ag-grid.css";
  20416. import "ag-grid-community/styles/ag-theme-quartz.css";
  20417. import { AgGridVue } from "ag-grid-vue3";
  20418. import testJson from '@/components/home/dashboard/test.json'
  20419. /***********************
  20420. * plugins inject
  20421. ************************/
  20422. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  20423. // props
  20424. const props = defineProps({
  20425. isCoreDetailModal: {
  20426. type: Boolean,
  20427. default: false
  20428. },
  20429. })
  20430. // 참조가능 데이터 설정
  20431. defineExpose({
  20432. fnInit,
  20433. })
  20434. // 발신 이벤트 선언
  20435. const emit = defineEmits(["closeModal"]);
  20436. const i18n = useI18n();
  20437. /***********************
  20438. * data & created
  20439. ************************/
  20440. // 모달 open 여부 from props
  20441. const isCoreDetailModal = computed(() => props.isCoreDetailModal);
  20442. // TenantName
  20443. const tenantName = computed(() => useAuthStore().getTenantName);
  20444. // 심각도 리스트
  20445. const severityList = computed(() => useLangStore().getLang === 'kr' ? useEnumCodeKr.severity : useEnumCodeEn.severity)
  20446. // 알람그룹 리스트
  20447. const alarmGroupList = computed(() => useLangStore().getLang === 'kr' ? useEnumCodeKr.alarmGroup : useEnumCodeEn.alarmGroup)
  20448. // 선택된 Core 정보
  20449. const coreInfo = ref({});
  20450. // 카운트
  20451. const objCount = ref({
  20452. total: 0,
  20453. critical: 0,
  20454. major: 0,
  20455. minor: 0,
  20456. })
  20457. // 장애 이력 list
  20458. const eventItems = ref([]);
  20459. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  20460. const rowHeightRem = 2.5; // 원하는 rem 값
  20461. const rowHeightPx = rowHeightRem * remToPx();
  20462. // gird API
  20463. const gridApi = shallowRef();
  20464. // gridOption
  20465. const gridOptions = {
  20466. columnDefs: [
  20467. { headerName: 'No', valueGetter: "node.rowIndex + 1", maxWidth: 75},
  20468. { headerName: 'Code',field: 'eventCode', maxWidth: 150},
  20469. { headerName: '심각도', field: 'severity', maxWidth: 150, cellRenderer: fnSeverityCellRenderer},
  20470. { headerName: '알람 그룹', field: 'alarmGroup', cellRenderer: fnAlarmGroupCellRenderer},
  20471. { headerName: '위치', field: 'location', },
  20472. { headerName: '알림 원인', field: 'probcause', },
  20473. { headerName: '알람 시간', field: 'alarmTimeStr', cellRenderer: fnAlarmTimeCellRenderer},
  20474. ],
  20475. rowData: eventItems.value, // 테이블 데이터
  20476. suppressMovableColumns: true,
  20477. autoSizeStrategy: {
  20478. type: "fitGridWidth", // width맞춤
  20479. },
  20480. headerHeight : rowHeightPx,
  20481. rowHeight: rowHeightPx,
  20482. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  20483. suppressRowClickSelection: true, // 행 클릭 체크박스 무시
  20484. localeText: {
  20485. noRowsToShow: i18n.t('common.noData')
  20486. },
  20487. defaultColDef: {
  20488. lockVisible: true, // 열을 그리드 밖으로 꺼내지 않음
  20489. },
  20490. }
  20491. /***********************
  20492. * Methods
  20493. ************************/
  20494. /** 모달 시작 */
  20495. function fnInit(item) {
  20496. coreInfo.value = item;
  20497. console.log(coreInfo.value)
  20498. }
  20499. /** 모달 닫기 */
  20500. function fnClose(isReload = false) {
  20501. emit('closeModal', {isReload: isReload})
  20502. fnReset();
  20503. }
  20504. /** 초기화 */
  20505. function fnReset() {
  20506. // coreInfo.value = {};
  20507. objCount.value.total = 0;
  20508. objCount.value.critical = 0;
  20509. objCount.value.major = 0;
  20510. objCount.value.minor = 0;
  20511. // eventItems.value=[];
  20512. }
  20513. /** 장애이력 조회 */
  20514. function fnGetEventList() {
  20515. const params = {
  20516. tenantName: coreInfo.value?.tenantName || tenantName.value,
  20517. neName: coreInfo.value?.neName || '',
  20518. }
  20519. useAxios().post(apiUrl.getCoreEventList, params).then((res) => {
  20520. const {resCode, resMsg, data} = res.data;
  20521. if(resCode == 200) {
  20522. // fnParseData(testJson.coreEvent);
  20523. fnParseData(data || {})
  20524. $log.debug("[dashboard][fnGetEventList][success]")
  20525. } else {
  20526. $log.debug("[dashboard][fnGetEventList][error]", `[${resCode}] ${resMsg}`);
  20527. }
  20528. }).catch((error)=>{
  20529. $log.debug("[dashboard][fnGetEventList][error]", error)
  20530. useErrorHandler().fnSetCommErrorHandle(error, fnGetEventList)
  20531. }).finally(()=>{
  20532. $log.debug("[dashboard][fnGetEventList][finished]")
  20533. })
  20534. }
  20535. /** 데이터 가공 */
  20536. function fnParseData(data = {}) {
  20537. // 카운트 셋팅
  20538. objCount.value.critical = data?.criCnt || 0;
  20539. objCount.value.major = data?.majCnt|| 0;
  20540. objCount.value.minor = data?.minCnt || 0;
  20541. objCount.value.total = data?.criCnt + data?.majCnt + data?.minCnt
  20542. if(data.items) {
  20543. eventItems.value = data?.items?.map((item) => {
  20544. return {
  20545. ...item,
  20546. }
  20547. })
  20548. } else {
  20549. eventItems.value = [];
  20550. }
  20551. }
  20552. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  20553. // 세부 데이터 상태값
  20554. const getBodyLevelClass = (val) => {
  20555. if(val >= 95) return 'critical'; // red
  20556. else if(val >= 90) return 'major'; // blue
  20557. else if(val >= 85) return 'minor'; // gray
  20558. else return 'normal'; // green
  20559. }
  20560. // 세부 데이터 STATUS 상태값
  20561. const getBodyStatusClass = (connect) => {
  20562. if(connect?.isConnected) return 'normal';
  20563. else return 'critical';
  20564. }
  20565. /** Grid 관련 */
  20566. // Grid 데이터 바인딩
  20567. function fnOnGridReady(params){
  20568. gridApi.value = params.api
  20569. fnGetEventList();
  20570. }
  20571. // 심각도
  20572. function fnSeverityCellRenderer(params) {
  20573. const { data } = params;
  20574. const { severity } = data;
  20575. const severityLabel = severityList.value.find((s) => s.value == severity);
  20576. const severityObj = {
  20577. label: severityLabel.title.toUpperCase(),
  20578. class: severityLabel.title.toLowerCase(),
  20579. }
  20580. return `<span class="status--ele ${severityObj.class}">${severityObj.label}</span>`
  20581. }
  20582. // 알람그룹
  20583. function fnAlarmGroupCellRenderer(params) {
  20584. const { data } = params;
  20585. const { alarmGroup } = data;
  20586. return alarmGroupList.value.find((a) => a.value == alarmGroup)?.title || '';
  20587. }
  20588. // 알람시간
  20589. function fnAlarmTimeCellRenderer(params) {
  20590. const { data } = params;
  20591. const { alarmTime } = data;
  20592. return dayjs(alarmTime).format('YYYY-MM-DD HH:mm:ss');
  20593. }
  20594. </script>
  20595. </file>
  20596. <file path="components/home/dashboard/common/pagination.vue">
  20597. <template>
  20598. <div class="pagenation--wrapper">
  20599. <div class="total--wrapper">
  20600. Total : <span class="total--count">{{ props.pageObj.totalCnt }}</span>
  20601. </div>
  20602. <div
  20603. v-if="props.pageObj.totalCnt && props.pageObj.totalCnt > 0"
  20604. class="pager--btn--wrap"
  20605. >
  20606. <v-btn
  20607. flat
  20608. class="page--btn prev--btn"
  20609. :disabled="pageObj.page == 1"
  20610. @click="$emit('chg_page', pageObj.page - 1)"
  20611. />
  20612. <div class="page--numb">
  20613. <span class="current">{{ props.pageObj.page }}</span>/<span>{{ totalPages }}</span>
  20614. </div>
  20615. <v-btn
  20616. flat
  20617. class="page--btn next--btn"
  20618. :disabled="pageObj.page == totalPages || pageObj.totalCnt == 0"
  20619. @click="$emit('chg_page', pageObj.page + 1)"
  20620. />
  20621. </div>
  20622. <slot name="rightArea" />
  20623. </div>
  20624. </template>
  20625. <script setup>
  20626. /***********************
  20627. * plugins inject
  20628. ************************/
  20629. // let pageObj = ref( {
  20630. // page: 1, // 현재 페이지
  20631. // pageSize: 10, // 테이블 조회 데이터 개수
  20632. // totalCnt: 0, // 전체 페이지
  20633. // })
  20634. // props
  20635. const props = defineProps({
  20636. pageObj: Object,
  20637. })
  20638. // 발신 이벤트 선언
  20639. const emit = defineEmits(['chg_page'])
  20640. const totalPages = computed(() => {
  20641. return Math.ceil(props.pageObj.totalCnt / props.pageObj.pageSize)
  20642. })
  20643. /***********************
  20644. * data & created
  20645. ************************/
  20646. /***********************
  20647. * Methods
  20648. ************************/
  20649. </script>
  20650. </file>
  20651. <file path="components/home/dashboard/common/ranCardGroupDetailModal.vue">
  20652. <template>
  20653. <!-- 지도형 3Depth 정보 팝업 : S -->
  20654. <v-dialog
  20655. v-model="isModal"
  20656. persistent
  20657. width="62.5rem"
  20658. >
  20659. <div class="v-common-dialog-wrapper custom-dialog alert">
  20660. <div class="modal-tit">
  20661. <strong>{{propsObj.areaName}} {{propsObj.areaCode !== 0 ? '현황' : ''}}</strong>
  20662. <button class="btn-close" @click="fnClose"></button>
  20663. </div>
  20664. <div class="v-common-dialog-content pa-0">
  20665. <div class="core--list--component">
  20666. <h2 class="fw--500">이벤트 현황</h2>
  20667. <ul class="event--stat">
  20668. <li class="critical"><i class="ico"></i><span>CRITICAL</span><span>{{propsObj.criCnt}}</span></li>
  20669. <li class="major"><i class="ico"></i><span>MAJOR</span><span>{{propsObj.majCnt}}</span></li>
  20670. <li class="minor"><i class="ico"></i><span>MINOR</span><span>{{propsObj.minCnt}}</span></li>
  20671. <li class="disconnected"><i class="ico"></i><span>DISCONNECTED</span><span>0</span></li>
  20672. </ul>
  20673. </div>
  20674. <div class="core--list--component--grid mt--0">
  20675. <div class="title">
  20676. <h2>
  20677. NE 그룹 목록 <span>({{propsObj.neGroupList.length}}건)</span>
  20678. </h2>
  20679. </div>
  20680. <div class="tbl-wrapper">
  20681. <div class="tbl-wrap">
  20682. <!-- ag grid -->
  20683. <ag-grid-vue
  20684. style="width:100%;"
  20685. :style="propsObj.neGroupList.length > 2 ? 'height: calc(23vh)' : 'height: calc(15vh);'"
  20686. class="ag-theme-quartz"
  20687. :gridOptions="gridOptions"
  20688. @grid-ready="fnOnGridReady"
  20689. @rowClicked="fnRowClick"
  20690. >
  20691. </ag-grid-vue>
  20692. </div>
  20693. </div>
  20694. </div>
  20695. <div class="core--list--component">
  20696. <div class="map--area">
  20697. <div class="side--title" style="zIndex:10" v-if="selectedGroup.neGroup">{{selectedGroup.neGroup}}</div>
  20698. <!--맵 영역-->
  20699. <div id="ran_detail_map" style="height: 100%;"></div>
  20700. </div>
  20701. </div>
  20702. <div class="core--list--component--grid mt--0">
  20703. <div class="title">
  20704. <h2 v-if="selectedGroup.neList.length">
  20705. [{{selectedGroup.neGroup}}] NE 목록 <span>({{selectedGroup.neList.length}}건)</span>
  20706. </h2>
  20707. <h2 v-else>
  20708. NE 목록 <span>(0건)</span>
  20709. </h2>
  20710. </div>
  20711. <div class="tbl-wrapper">
  20712. <div class="tbl-wrap">
  20713. <!-- ag grid -->
  20714. <ag-grid-vue
  20715. style="width:100%; height:22vh;"
  20716. class="ag-theme-quartz"
  20717. :gridOptions="gridOptions2"
  20718. @grid-ready="fnOnGridReady2"
  20719. >
  20720. </ag-grid-vue>
  20721. </div>
  20722. </div>
  20723. </div>
  20724. </div>
  20725. <div class="btn-wrap nw--btn--wrap" style="padding-top:1.88rem">
  20726. <div></div>
  20727. <div class="inner--btn--wrap">
  20728. <v-btn
  20729. class="custom-btn btn-gray mini"
  20730. @click="fnClose"
  20731. >
  20732. <i class="ico"></i>
  20733. 닫기
  20734. </v-btn>
  20735. </div>
  20736. </div>
  20737. </div>
  20738. </v-dialog>
  20739. <!-- 카드형 2Depth 정보 팝업 : E -->
  20740. </template>
  20741. <script setup>
  20742. /***********************
  20743. * import
  20744. ************************/
  20745. import "ag-grid-community/styles/ag-grid.css";
  20746. import "ag-grid-community/styles/ag-theme-quartz.css";
  20747. import { AgGridVue } from "ag-grid-vue3";
  20748. import { useI18n } from "vue-i18n";
  20749. import useUtil from "@/composables/useUtil";
  20750. /***********************
  20751. * plugins inject
  20752. ************************/
  20753. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  20754. // props
  20755. const props = defineProps({
  20756. propsObj: {
  20757. type: Object,
  20758. default: function () {
  20759. return {
  20760. areaName: '',
  20761. }
  20762. },
  20763. },
  20764. centerPosition: Object
  20765. })
  20766. // 참조가능 데이터 설정
  20767. defineExpose({})
  20768. // 발신 이벤트 선언
  20769. const emit = defineEmits(["closeModal"])
  20770. const i18n = useI18n()
  20771. /***********************
  20772. * data & created
  20773. ************************/
  20774. const isModal = ref(true)
  20775. const map = ref(null) // 카카오 맵 객체
  20776. const marker = ref(null) // 카카오맵 마커(핀) 객체
  20777. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize)
  20778. const rowHeightRem = 2.5 // 원하는 rem 값
  20779. const rowHeightPx = rowHeightRem * remToPx()
  20780. const gridApi = shallowRef()
  20781. const gridApi2 = shallowRef()
  20782. const selectedGroup = ref({
  20783. neGroup: '',
  20784. neList: []
  20785. })
  20786. const setNeGroup = computed(() => {
  20787. let list = []
  20788. props.propsObj.neGroupList.forEach((item, idx) => {
  20789. let obj = item
  20790. obj.no = idx + 1
  20791. obj.cls = getNeEventCls.value(item)
  20792. list.push(obj)
  20793. })
  20794. return list
  20795. })
  20796. // NE 그룹 수 > 이벤트 단계 클래스
  20797. const getNeEventCls = computed(() => {
  20798. return (obj) => {
  20799. let eventCls = 'gray'
  20800. if(!_isEmpty(obj)) {
  20801. if(obj.minCnt > 0) eventCls = 'black'
  20802. if(obj.majCnt > 0) eventCls = 'blue'
  20803. if(obj.criCnt > 0) eventCls = 'red'
  20804. }
  20805. return eventCls
  20806. }
  20807. })
  20808. const tblItems2 = ref([])
  20809. const gridOptions = {
  20810. columnDefs: [
  20811. {
  20812. headerName: 'No',
  20813. field: 'no',
  20814. sortable: false,
  20815. checkboxSelection: false,
  20816. headerCheckboxSelection: false
  20817. },
  20818. {
  20819. headerName: 'NE 그룹명',
  20820. field: 'neGroup',
  20821. sortable: false,
  20822. },
  20823. {
  20824. headerName: '테넌트',
  20825. field: 'tenantName',
  20826. sortable: false,
  20827. },
  20828. {
  20829. headerName: 'NE 수',
  20830. field: 'neCnt',
  20831. sortable: false,
  20832. },
  20833. {
  20834. headerName: '알림',
  20835. field: 'cls',
  20836. sortable: false,
  20837. cellRenderer: actionCellRenderer
  20838. }
  20839. ],
  20840. rowData: setNeGroup.value, // 테이블 데이터
  20841. suppressMovableColumns: true,
  20842. autoSizeStrategy: {
  20843. type: "fitGridWidth", // width맞춤
  20844. },
  20845. headerHeight : rowHeightPx,
  20846. rowHeight: rowHeightPx,
  20847. pagination: true,
  20848. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  20849. suppressRowClickSelection: true, // 행 클릭 체크박스 무시
  20850. localeText: {
  20851. noRowsToShow: i18n.t('common.noData')
  20852. },
  20853. }
  20854. const gridOptions2 = {
  20855. defaultColDef: {
  20856. lockVisible: true,
  20857. },
  20858. columnDefs: [
  20859. {
  20860. headerName: 'No',
  20861. field: 'no',
  20862. width: 50
  20863. },
  20864. {
  20865. headerName: 'NE 이름',
  20866. field: 'neName',
  20867. cellRenderer: actionCellRenderer2,
  20868. },
  20869. {
  20870. headerName: '테넌트',
  20871. field: 'tenantName',
  20872. },
  20873. {
  20874. headerName: '이벤트',
  20875. field: 'eventStatus',
  20876. cellRenderer: actionCellRenderer3,
  20877. width: 250,
  20878. }
  20879. ],
  20880. rowData: selectedGroup.value.neList, // 테이블 데이터
  20881. autoSizeStrategy: {
  20882. type: "fitGridWidth", //fitCellContents
  20883. },
  20884. headerHeight : rowHeightPx,
  20885. rowHeight: rowHeightPx,
  20886. pagination: true,
  20887. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  20888. suppressRowClickSelection: true, // 행 클릭 체크박스 무시
  20889. localeText: {
  20890. noRowsToShow: 'NE 그룹을 선택하세요'
  20891. },
  20892. }
  20893. const markers = ref([])
  20894. onMounted(() => {
  20895. fnInit()
  20896. })
  20897. /***********************
  20898. * Methods
  20899. ************************/
  20900. /**
  20901. * RAN NE 그룹 상세 팝업
  20902. */
  20903. // function fnGetNeGroupDetailInfo(){
  20904. // useAxios().post('/dashboard/geoNeGroupInfo/list.do').then((res) => {
  20905. // $log.debug("[dashboard][fnGetNeGroupDetailInfo][success]")
  20906. // }).catch((error)=>{
  20907. // $log.debug("[dashboard][fnGetNeGroupDetailInfo][error]")
  20908. // useErrorHandler().fnSetCommErrorHandle(error, fnGetNeGroupDetailInfo)
  20909. // }).finally(()=>{
  20910. // $log.debug("[dashboard][fnGetNeGroupDetailInfo][finished]")
  20911. // })
  20912. // }
  20913. /**
  20914. * 초기 실행
  20915. */
  20916. function fnInit(){
  20917. nextTick().then(() => {
  20918. if (window.kakao && window.kakao.maps) {
  20919. loadMap()
  20920. } else {
  20921. loadScript()
  20922. }
  20923. })
  20924. }
  20925. /**
  20926. * kakao 스크립트 로드
  20927. */
  20928. function loadScript() {
  20929. const script = document.createElement('script')
  20930. script.async = true
  20931. script.onload = () => {
  20932. window.kakao.maps.load(loadMap)
  20933. }
  20934. script.src = `//dapi.kakao.com/v2/maps/sdk.js?autoload=false&libraries=services,clusterer,drawing&appkey=${import.meta.env.VITE_APP_KAKAO_APP_KEY}`
  20935. document.head.appendChild(script)
  20936. }
  20937. /**
  20938. * kakao 지도 로드
  20939. */
  20940. async function loadMap() {
  20941. const mapContainer = document.getElementById('ran_detail_map')
  20942. let mapOption = {
  20943. center: new kakao.maps.LatLng(props.centerPosition.lat, props.centerPosition.lng), // 지도의 중심좌표
  20944. level: 12, // 지도의 확대 레벨
  20945. }
  20946. map.value = new kakao.maps.Map(mapContainer, mapOption)
  20947. let zoomControl = new kakao.maps.ZoomControl()
  20948. // map.value.addControl(zoomControl, kakao.maps.ControlPosition.BOTTOMRIGHT)
  20949. // fnSetEventListener() // 지도 이벤트 등록
  20950. }
  20951. /**
  20952. * 상세팝업 닫기
  20953. */
  20954. function fnClose(){
  20955. isModal.value = false
  20956. setTimeout(() => {
  20957. emit('closeModal')
  20958. }, 250);
  20959. }
  20960. function fnGetNeList(){
  20961. //
  20962. }
  20963. /**
  20964. * 마커 생성 데이터 세팅 (그룹 클릭시 ne마커 표시하기)
  20965. */
  20966. function fnDrawMarker(){
  20967. fnClearMarker()
  20968. console.log('%c selectedGroup.value' ,'color:#bada55', selectedGroup.value)
  20969. selectedGroup.value.neList.map((item, index) => {
  20970. let position = new kakao.maps.LatLng(item.neLocLatitude, item.neLocLongitude)
  20971. let markerObj = {
  20972. overlay: null,
  20973. markers: null,
  20974. data: item,
  20975. click: false,
  20976. position: position
  20977. }
  20978. markers.value.push(markerObj)
  20979. markers.value[index].markers = fnCreateMarker(position, index)
  20980. if(index == 0) {
  20981. map.value.panTo(position)
  20982. }
  20983. })
  20984. }
  20985. import { filename } from 'pathe/utils'
  20986. // 이미지 가져오기 (vite문법)
  20987. const glob = import.meta.glob('~/assets/img/ico_*.{png,svg}', { eager: true })
  20988. const getImages = Object.fromEntries(
  20989. Object.entries(glob).map(([key, value]) => [filename(key), value.default])
  20990. )
  20991. function fnGetMarkerImage(index){
  20992. let color = selectedGroup.value.neList[index].color
  20993. console.log('%c color' ,'color:#bada55', color)
  20994. if(color == 'red') return 'ico_red_pin'
  20995. else if(color == 'blue') return 'ico_blue_pin'
  20996. else if(color == 'black') return 'ico_black_pin'
  20997. else return 'ico_gray_pin'
  20998. }
  20999. /**
  21000. * 마커 생성
  21001. */
  21002. function fnCreateMarker(position, index) {
  21003. const markerImageSrc = getImages[fnGetMarkerImage(index)] // assets 폴더의 이미지 경로
  21004. const markerImageSize = new kakao.maps.Size(40, 40); // 마커 이미지 사이즈
  21005. const markerImage = new kakao.maps.MarkerImage(markerImageSrc, markerImageSize);
  21006. let markerOption = {
  21007. map: map.value, // 마커를 표시할 지도
  21008. position: position, // 마커의 위치
  21009. clickable: true,
  21010. image: markerImage,
  21011. zIndex: 1,
  21012. }
  21013. let marker = new kakao.maps.Marker(markerOption)
  21014. // 마커 클릭 이벤트등록
  21015. kakao.maps.event.addListener(marker,'click', fnClickMarker(index))
  21016. return marker
  21017. }
  21018. /**
  21019. * 마커 클릭
  21020. */
  21021. function fnClickMarker(index) {
  21022. const clickData = markers.value[index].data
  21023. const openInfoWindow = function () {
  21024. // 마커 클릭 > 상태변경 > z-index 및 맵 이동
  21025. fnMarkerClickChk(index)
  21026. fnGetInfo(clickData, index)
  21027. }
  21028. return openInfoWindow
  21029. }
  21030. /**
  21031. * 마커 클릭 이벤트
  21032. */
  21033. function fnMarkerClickChk(index) {
  21034. fnSetUnClickMarker()
  21035. markers.value[index].click = true
  21036. markers.value[index].markers.setZIndex(3)
  21037. let moveLatLng = markers.value[index].position
  21038. map.value.panTo(moveLatLng)
  21039. }
  21040. /**
  21041. * 마커 클릭 상태 해제 및 z인덱스 초기화
  21042. */
  21043. function fnSetUnClickMarker() {
  21044. markers.value.forEach((item) => {
  21045. item.click = false
  21046. item.markers.setZIndex(2)
  21047. })
  21048. }
  21049. function fnGetInfo(data, index){
  21050. // 열려 있던 오버레이 닫기
  21051. fnCloseMarkerInfoOverlay()
  21052. // 오버레이 생성
  21053. markers.value[index].overlay = fnCreateCustomOverlay(data, index)
  21054. // 오버레이 z-index 설정
  21055. markers.value[index].overlay.setZIndex(999)
  21056. // 오버레이 열기
  21057. markers.value[index].overlay.setMap(map.value)
  21058. // 오버레이 이벤트 등록
  21059. fnCustomOverlayAddEventListener()
  21060. }
  21061. /**
  21062. * 커스텀 오버레이 생성
  21063. */
  21064. function fnCreateCustomOverlay(data, index) {
  21065. let cpu = JSON.parse(data.cpu)
  21066. let memory = JSON.parse(data.mem)
  21067. let content = `
  21068. <div class="area--info" style="top: -10.7rem; right: -6rem;">
  21069. <div class="area--info--title">
  21070. <p style="overflow:hidden; text-overflow: ellipsis;">${data.neName}</p>
  21071. <button class="btn-close" id="overlayCloseBtn"></button>
  21072. </div>
  21073. <ul>
  21074. <li><i class="ico green"></i><span>STATUS</span><span class="active">ACTIVE</span></li>
  21075. <li><i class="ico red"></i><span>CPU</span><span class="">${cpu.AVG_CPU_L}%</span></li>
  21076. <li><i class="ico green"></i><span>MEMORY</span><span class="">${memory.AVG_MEM_L}%</span></li>
  21077. <li><i class="ico green"></i><span>DISK</span><span class="">${data.disk}</span></li>
  21078. </ul>
  21079. </div>`
  21080. // 커스텀 오버레이 생성
  21081. let customOverlay = new kakao.maps.CustomOverlay({
  21082. position: markers.value[index].position,
  21083. content: content
  21084. })
  21085. return customOverlay
  21086. }
  21087. /**
  21088. * 커스텀 오버레이 이벤트 등록
  21089. */
  21090. function fnCustomOverlayAddEventListener(){
  21091. // 오버레이 닫기 버튼
  21092. const closeBtn = document.querySelector('#overlayCloseBtn')
  21093. closeBtn.addEventListener('click', fnCloseBtnOverlay)
  21094. }
  21095. /**
  21096. * 마커 정보 오버레이 닫기 버튼
  21097. */
  21098. function fnCloseBtnOverlay() {
  21099. fnCloseMarkerInfoOverlay()
  21100. fnSetUnClickMarker()
  21101. }
  21102. /**
  21103. * 모든 마커 정보 오버레이 닫기
  21104. */
  21105. function fnCloseMarkerInfoOverlay() {
  21106. for (var i = 0; i < markers.value.length; i++) {
  21107. if (markers.value[i].overlay) {
  21108. markers.value[i].overlay.setMap(null)
  21109. markers.value[i].overlay = null
  21110. }
  21111. }
  21112. }
  21113. /*********************
  21114. * grid 관련
  21115. *********************/
  21116. // Grid 데이터 바인딩
  21117. function fnOnGridReady(params){
  21118. gridApi.value = params.api
  21119. }
  21120. function fnOnGridReady2(params){
  21121. gridApi2.value = params.api
  21122. }
  21123. function actionCellRenderer(params) {
  21124. let _cls = "";
  21125. if(params.value == 'red'){
  21126. _cls = 'alarm--red';
  21127. } else if(params.value == 'blue'){
  21128. _cls = 'alarm--blue';
  21129. } else if(params.value == 'gray'){
  21130. _cls = 'alarm--gray'
  21131. }
  21132. let pin = `<span class="${_cls}"></span>`;
  21133. return pin;
  21134. }
  21135. function actionCellRenderer2(params) {
  21136. let _cls = "";
  21137. if(params.data.color == 'red'){
  21138. _cls = 'pin--red';
  21139. } else if(params.data.color == 'blue'){
  21140. _cls = 'pin--blue';
  21141. } else if(params.data.color == 'gray'){
  21142. _cls = 'pin--gray';
  21143. } else if(params.data.color == 'black'){
  21144. _cls = 'pin--black';
  21145. }
  21146. let pin = `<span class="${_cls}">${params.data.neName}</span>`;
  21147. return pin;
  21148. }
  21149. function actionCellRenderer3(params) {
  21150. let _cls0 = "";
  21151. let _cls1 = "";
  21152. let _cls2 = "";
  21153. let _cls3 = "";
  21154. if(params.data.eventStatus[0]){_cls0 = 'evt--critical';}
  21155. if(params.data.eventStatus[1]){_cls1 = 'evt--major';}
  21156. if(params.data.eventStatus[2]){_cls2 = 'evt--minor';}
  21157. let pin = "";
  21158. if (_cls0) {
  21159. pin += `<span class="${_cls0}">CRITICAL (${params.data.eventStatus[0]}) </span>`;
  21160. }
  21161. if (_cls1) {
  21162. pin += `<span class="${_cls1}">MAJOR (${params.data.eventStatus[1]}) </span>`;
  21163. }
  21164. if (_cls2) {
  21165. pin += `<span class="${_cls2}">MINOR (${params.data.eventStatus[2]}) </span>`;
  21166. }
  21167. if(pin == ""){
  21168. pin += `<span class="evt--none">-</span>`;
  21169. }
  21170. return pin;
  21171. }
  21172. function fnRowClick(params){
  21173. selectedGroup.value.neGroup = params.data.neGroup
  21174. let list = params.data.neList
  21175. let temp = []
  21176. list.forEach((item, idx) => {
  21177. let obj = item
  21178. obj.no = idx+1
  21179. obj.color = getNeEventCls.value(item)
  21180. obj.eventStatus = [item.criCnt, item.majCnt, item.minCnt]
  21181. temp.push(obj)
  21182. })
  21183. selectedGroup.value.neList = _cloneDeep(temp)
  21184. gridApi2.value.setGridOption("rowData", selectedGroup.value.neList)
  21185. fnDrawMarker()
  21186. }
  21187. function fnClearMarker(){
  21188. markers.value.forEach(marker => marker.markers.setMap(null));
  21189. fnCloseMarkerInfoOverlay()
  21190. markers.value = []
  21191. }
  21192. </script>
  21193. </file>
  21194. <file path="components/home/dashboard/common/ranMapGroupDetailModal.vue">
  21195. <template>
  21196. <!-- 지도형 3Depth 정보 팝업 : S -->
  21197. <v-dialog
  21198. v-model="isModal"
  21199. persistent
  21200. width="62.5rem"
  21201. >
  21202. <div class="v-common-dialog-wrapper custom-dialog alert">
  21203. <div class="modal-tit">
  21204. <strong>{{neGroupInfo.neGroup}}</strong>
  21205. <button class="btn-close" @click="fnClose"></button>
  21206. </div>
  21207. <div class="v-common-dialog-content pa-0">
  21208. <div class="core--list--component">
  21209. <div class="map--area big--map">
  21210. <!-- <div class="area--info" style="top: 0.94rem; right: 0.94rem; z-index:10;">
  21211. <div class="area--info--title">
  21212. <p>NE001</p>
  21213. <button class="btn-close"></button>
  21214. </div>
  21215. <ul>
  21216. <li><i class="ico green"></i><span>STATUS</span><span class="active">ACTIVE</span></li>
  21217. <li><i class="ico red"></i><span>CPU</span><span class="">60.00%</span></li>
  21218. <li><i class="ico green"></i><span>MEMORY</span><span class="">80%</span></li>
  21219. <li><i class="ico green"></i><span>DISK</span><span class="">20%</span></li>
  21220. </ul>
  21221. </div> -->
  21222. <!--맵 영역-->
  21223. <div id="ran_detail_map" style="height: 100%;"></div>
  21224. </div>
  21225. </div>
  21226. <!-- NE 목록 grid : S -->
  21227. <div class="core--list--component--grid mt--0" >
  21228. <div class="title">
  21229. <h2>
  21230. NE 목록 <span>({{getNeGroup.length}}건)</span>
  21231. </h2>
  21232. </div>
  21233. <div class="tbl-wrapper">
  21234. <div class="tbl-wrap">
  21235. <!-- ag grid -->
  21236. <ag-grid-vue
  21237. style="width:100%; height:22vh;"
  21238. class="ag-theme-quartz"
  21239. :gridOptions="gridOptions"
  21240. @grid-ready="fnOnGridReady"
  21241. >
  21242. </ag-grid-vue>
  21243. </div>
  21244. </div>
  21245. </div>
  21246. <!-- NE 목록 grid : E -->
  21247. </div>
  21248. <div class="btn-wrap nw--btn--wrap" style="padding-top:1.88rem">
  21249. <div></div>
  21250. <div class="inner--btn--wrap">
  21251. <v-btn
  21252. class="custom-btn btn-gray mini"
  21253. @click="fnClose"
  21254. >
  21255. <i class="ico"></i>
  21256. 닫기
  21257. </v-btn>
  21258. </div>
  21259. </div>
  21260. </div>
  21261. </v-dialog>
  21262. <!-- 지도형 3Depth 정보 팝업 : E -->
  21263. </template>
  21264. <script setup>
  21265. /***********************
  21266. * import
  21267. ************************/
  21268. import "ag-grid-community/styles/ag-grid.css";
  21269. import "ag-grid-community/styles/ag-theme-quartz.css";
  21270. import { AgGridVue } from "ag-grid-vue3";
  21271. import { useI18n } from "vue-i18n";
  21272. import useUtil from "@/composables/useUtil";
  21273. /***********************
  21274. * plugins inject
  21275. ************************/
  21276. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  21277. // props
  21278. const props = defineProps({
  21279. neGroupInfo: Object,
  21280. centerPosition: Object
  21281. })
  21282. // 참조가능 데이터 설정
  21283. defineExpose({})
  21284. // 발신 이벤트 선언
  21285. const emit = defineEmits(["closeModal"])
  21286. const i18n = useI18n()
  21287. /***********************
  21288. * data & created
  21289. ************************/
  21290. const isModal = ref(true)
  21291. const map = ref(null) // 카카오 맵 객체
  21292. const marker = ref(null) // 카카오맵 마커(핀) 객체
  21293. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize)
  21294. const rowHeightRem = 2.5 // 원하는 rem 값
  21295. const rowHeightPx = rowHeightRem * remToPx()
  21296. const gridApi = shallowRef()
  21297. const getNeGroup = computed(() => {
  21298. let dataObj = _cloneDeep(props.neGroupInfo)
  21299. let result = []
  21300. dataObj.neList.forEach((ne, idx) => {
  21301. let tempObj = ne
  21302. tempObj.no = idx+1,
  21303. tempObj.color = getNeEventCls.value(ne),
  21304. tempObj.eventStatus= [ne.criCnt, ne.majCnt, ne.minCnt],
  21305. result.push(tempObj)
  21306. })
  21307. return result
  21308. })
  21309. // NE 그룹 수 > 이벤트 단계 클래스
  21310. const getNeEventCls = computed(() => {
  21311. return (obj) => {
  21312. let eventCls = 'gray'
  21313. if(!_isEmpty(obj)) {
  21314. if(obj.minCnt > 0) eventCls = 'black'
  21315. if(obj.majCnt > 0) eventCls = 'blue'
  21316. if(obj.criCnt > 0) eventCls = 'red'
  21317. }
  21318. return eventCls
  21319. }
  21320. })
  21321. const gridOptions = {
  21322. defaultColDef: {
  21323. lockVisible: true,
  21324. },
  21325. columnDefs: [
  21326. {
  21327. headerName: 'No',
  21328. field: 'no',
  21329. width: 50
  21330. },
  21331. {
  21332. headerName: 'NE 이름',
  21333. field: 'neName',
  21334. cellRenderer: actionCellRenderer2,
  21335. },
  21336. {
  21337. headerName: '테넌트',
  21338. field: 'tenantName',
  21339. },
  21340. {
  21341. headerName: '이벤트',
  21342. field: 'eventStatus',
  21343. cellRenderer: actionCellRenderer3,
  21344. width: 250,
  21345. }
  21346. ],
  21347. rowData: getNeGroup.value, // 테이블 데이터
  21348. autoSizeStrategy: {
  21349. type: "fitGridWidth", //fitCellContents
  21350. },
  21351. headerHeight : rowHeightPx,
  21352. rowHeight: rowHeightPx,
  21353. pagination: true,
  21354. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  21355. suppressRowClickSelection: true, // 행 클릭 체크박스 무시
  21356. localeText: {
  21357. noRowsToShow: i18n.t('common.noData')
  21358. },
  21359. }
  21360. const markers = ref([])
  21361. onMounted(() => {
  21362. fnInit()
  21363. })
  21364. /***********************
  21365. * Methods
  21366. ************************/
  21367. /**
  21368. * RAN NE 그룹 상세 팝업
  21369. */
  21370. function fnGetNeGroupDetailInfo(){
  21371. useAxios().post('/dashboard/geoNeGroupInfo/list.do').then((res) => {
  21372. $log.debug("[dashboard][fnGetNeGroupDetailInfo][success]")
  21373. }).catch((error)=>{
  21374. $log.debug("[dashboard][fnGetNeGroupDetailInfo][error]")
  21375. useErrorHandler().fnSetCommErrorHandle(error, fnGetNeGroupDetailInfo)
  21376. }).finally(()=>{
  21377. $log.debug("[dashboard][fnGetNeGroupDetailInfo][finished]")
  21378. })
  21379. }
  21380. /**
  21381. * 초기 실행
  21382. */
  21383. function fnInit(){
  21384. fnGetNeGroupDetailInfo()
  21385. nextTick().then(() => {
  21386. if (window.kakao && window.kakao.maps) {
  21387. loadMap()
  21388. } else {
  21389. loadScript()
  21390. }
  21391. })
  21392. }
  21393. /**
  21394. * kakao 스크립트 로드
  21395. */
  21396. function loadScript() {
  21397. const script = document.createElement('script')
  21398. script.async = true
  21399. script.onload = () => {
  21400. window.kakao.maps.load(loadMap)
  21401. }
  21402. script.src = `//dapi.kakao.com/v2/maps/sdk.js?autoload=false&libraries=services,clusterer,drawing&appkey=${import.meta.env.VITE_APP_KAKAO_APP_KEY}`
  21403. document.head.appendChild(script)
  21404. }
  21405. /**
  21406. * kakao 지도 로드
  21407. */
  21408. async function loadMap() {
  21409. const mapContainer = document.getElementById('ran_detail_map')
  21410. let mapOption = {
  21411. center: new kakao.maps.LatLng(props.centerPosition.lat, props.centerPosition.lng), // 지도의 중심좌표
  21412. level: 3, // 지도의 확대 레벨
  21413. }
  21414. map.value = new kakao.maps.Map(mapContainer, mapOption)
  21415. let zoomControl = new kakao.maps.ZoomControl()
  21416. // map.value.addControl(zoomControl, kakao.maps.ControlPosition.BOTTOMRIGHT)
  21417. // fnSetEventListener() // 지도 이벤트 등록
  21418. fnDrawMarker()
  21419. }
  21420. /**
  21421. * 상세팝업 닫기
  21422. */
  21423. function fnClose(){
  21424. isModal.value = false
  21425. setTimeout(() => {
  21426. emit('closeModal')
  21427. }, 250);
  21428. }
  21429. function fnGetNeList(){
  21430. //
  21431. }
  21432. /**
  21433. * 마커 생성 데이터 세팅
  21434. */
  21435. function fnDrawMarker(){
  21436. getNeGroup.value.map((item, index) => {
  21437. let position = new kakao.maps.LatLng(item.neLocLatitude, item.neLocLongitude)
  21438. let markerObj = {
  21439. overlay: null,
  21440. markers: null,
  21441. data: item,
  21442. click: false,
  21443. position: position
  21444. }
  21445. markers.value.push(markerObj)
  21446. markers.value[index].markers = fnCreateMarker(position, index)
  21447. if(index == 0) {
  21448. map.value.panTo(position)
  21449. }
  21450. })
  21451. }
  21452. import { filename } from 'pathe/utils'
  21453. // 이미지 가져오기 (vite문법)
  21454. const glob = import.meta.glob('~/assets/img/ico_*.{png,svg}', { eager: true })
  21455. const getImages = Object.fromEntries(
  21456. Object.entries(glob).map(([key, value]) => [filename(key), value.default])
  21457. )
  21458. function fnGetMarkerImage(index){
  21459. let color = getNeGroup.value[index].color
  21460. if(color == 'red') return 'ico_red_pin'
  21461. else if(color == 'blue') return 'ico_blue_pin'
  21462. else if(color == 'black') return 'ico_black_pin'
  21463. else return 'ico_gray_pin'
  21464. }
  21465. /**
  21466. * 마커 생성
  21467. */
  21468. function fnCreateMarker(position, index) {
  21469. // 마커 이미지 설정
  21470. const markerImageSrc = getImages[fnGetMarkerImage(index)] // assets 폴더의 이미지 경로
  21471. const markerImageSize = new kakao.maps.Size(40, 40); // 마커 이미지 사이즈
  21472. const markerImage = new kakao.maps.MarkerImage(markerImageSrc, markerImageSize);
  21473. let markerOption = {
  21474. map: map.value, // 마커를 표시할 지도
  21475. position: position, // 마커의 위치
  21476. clickable: true,
  21477. image: markerImage,
  21478. zIndex: 1,
  21479. }
  21480. let marker = new kakao.maps.Marker(markerOption)
  21481. // 마커 클릭 이벤트등록
  21482. kakao.maps.event.addListener(marker,'click', fnClickMarker(index))
  21483. return marker
  21484. }
  21485. /**
  21486. * 마커 클릭
  21487. */
  21488. function fnClickMarker(index) {
  21489. const clickData = markers.value[index].data
  21490. const openInfoWindow = function () {
  21491. // 마커 클릭 > 상태변경 > z-index 및 맵 이동
  21492. fnMarkerClickChk(index)
  21493. fnGetInfo(clickData, index)
  21494. }
  21495. return openInfoWindow
  21496. }
  21497. /**
  21498. * 마커 클릭 이벤트
  21499. */
  21500. function fnMarkerClickChk(index) {
  21501. fnSetUnClickMarker()
  21502. markers.value[index].click = true
  21503. markers.value[index].markers.setZIndex(3)
  21504. let moveLatLng = markers.value[index].position
  21505. map.value.panTo(moveLatLng)
  21506. }
  21507. /**
  21508. * 마커 클릭 상태 해제 및 z인덱스 초기화
  21509. */
  21510. function fnSetUnClickMarker() {
  21511. markers.value.forEach((item) => {
  21512. item.click = false
  21513. item.markers.setZIndex(2)
  21514. })
  21515. }
  21516. function fnGetInfo(data, index){
  21517. // 열려 있던 오버레이 닫기
  21518. fnCloseMarkerInfoOverlay()
  21519. // 오버레이 생성
  21520. markers.value[index].overlay = fnCreateCustomOverlay(data, index)
  21521. // 오버레이 z-index 설정
  21522. markers.value[index].overlay.setZIndex(999)
  21523. // 오버레이 열기
  21524. markers.value[index].overlay.setMap(map.value)
  21525. // 오버레이 이벤트 등록
  21526. fnCustomOverlayAddEventListener()
  21527. }
  21528. /**
  21529. * 커스텀 오버레이 생성
  21530. */
  21531. function fnCreateCustomOverlay(data, index) {
  21532. let cpu = JSON.parse(data.cpu)
  21533. let memory = JSON.parse(data.mem)
  21534. let content = `
  21535. <div class="area--info" style="top: -10.7rem; right: -6rem;">
  21536. <div class="area--info--title">
  21537. <p style="overflow:hidden; text-overflow: ellipsis;">${data.neName}</p>
  21538. <button class="btn-close" id="overlayCloseBtn"></button>
  21539. </div>
  21540. <ul>
  21541. <li><i class="ico green"></i><span>STATUS</span><span class="active">ACTIVE</span></li>
  21542. <li><i class="ico red"></i><span>CPU</span><span class="">${cpu.AVG_CPU_L}%</span></li>
  21543. <li><i class="ico green"></i><span>MEMORY</span><span class="">${memory.AVG_MEM_L}%</span></li>
  21544. <li><i class="ico green"></i><span>DISK</span><span class="">${data.disk}</span></li>
  21545. </ul>
  21546. </div>`
  21547. // 커스텀 오버레이 생성
  21548. let customOverlay = new kakao.maps.CustomOverlay({
  21549. position: markers.value[index].position,
  21550. content: content
  21551. })
  21552. return customOverlay
  21553. }
  21554. /**
  21555. * 커스텀 오버레이 이벤트 등록
  21556. */
  21557. function fnCustomOverlayAddEventListener(){
  21558. // 오버레이 닫기 버튼
  21559. const closeBtn = document.querySelector('#overlayCloseBtn')
  21560. closeBtn.addEventListener('click', fnCloseBtnOverlay)
  21561. }
  21562. /**
  21563. * 마커 정보 오버레이 닫기 버튼
  21564. */
  21565. function fnCloseBtnOverlay() {
  21566. fnCloseMarkerInfoOverlay()
  21567. fnSetUnClickMarker()
  21568. }
  21569. /**
  21570. * 모든 마커 정보 오버레이 닫기
  21571. */
  21572. function fnCloseMarkerInfoOverlay() {
  21573. for (var i = 0; i < markers.value.length; i++) {
  21574. if (markers.value[i].overlay) {
  21575. markers.value[i].overlay.setMap(null)
  21576. markers.value[i].overlay = null
  21577. }
  21578. }
  21579. }
  21580. /*********************
  21581. * grid 관련
  21582. *********************/
  21583. // Grid 데이터 바인딩
  21584. function fnOnGridReady(params){
  21585. gridApi.value = params.api
  21586. }
  21587. function actionCellRenderer2(params) {
  21588. let _cls = "";
  21589. if(params.data.color == 'red'){
  21590. _cls = 'pin--red';
  21591. } else if(params.data.color == 'blue'){
  21592. _cls = 'pin--blue';
  21593. } else if(params.data.color == 'gray'){
  21594. _cls = 'pin--gray';
  21595. } else if(params.data.color == 'black'){
  21596. _cls = 'pin--black';
  21597. }
  21598. let pin = `<span class="${_cls}">${params.data.neName}</span>`;
  21599. return pin;
  21600. }
  21601. function actionCellRenderer3(params) {
  21602. let _cls0 = "";
  21603. let _cls1 = "";
  21604. let _cls2 = "";
  21605. let _cls3 = "";
  21606. if(params.data.eventStatus[0]){_cls0 = 'evt--critical';}
  21607. if(params.data.eventStatus[1]){_cls1 = 'evt--major';}
  21608. if(params.data.eventStatus[2]){_cls2 = 'evt--minor';}
  21609. let pin = "";
  21610. if (_cls0) {
  21611. pin += `<span class="${_cls0}">CRITICAL (${params.data.eventStatus[0]}) </span>`;
  21612. }
  21613. if (_cls1) {
  21614. pin += `<span class="${_cls1}">MAJOR (${params.data.eventStatus[1]}) </span>`;
  21615. }
  21616. if (_cls2) {
  21617. pin += `<span class="${_cls2}">MINOR (${params.data.eventStatus[2]}) </span>`;
  21618. }
  21619. if(pin == ""){
  21620. pin += `<span class="evt--none">-</span>`;
  21621. }
  21622. return pin;
  21623. }
  21624. </script>
  21625. </file>
  21626. <file path="components/home/dashboard/common/ranMapNeDetailModal.vue">
  21627. <template>
  21628. <!-- 지도형 3Depth 정보 팝업 : S -->
  21629. <v-dialog
  21630. v-model="isModal"
  21631. persistent
  21632. width="62.5rem"
  21633. >
  21634. <div class="v-common-dialog-wrapper custom-dialog alert">
  21635. <div class="modal-tit">
  21636. <strong>{{neInfo.neName}}</strong>
  21637. <button class="btn-close" @click="fnClose"></button>
  21638. </div>
  21639. <div class="v-common-dialog-content pa-0">
  21640. <div class="core--list--component">
  21641. <div class="map--area big--map">
  21642. <!--맵 영역-->
  21643. <div id="ran_detail_map" style="height: 100%;"></div>
  21644. </div>
  21645. </div>
  21646. <!-- NE 상세 정보 : S -->
  21647. <div class="core--list--component mt--0">
  21648. <h2 class="fw--500 mb--125rem">상세 정보</h2>
  21649. <div class="form-style1 col4 shadow--type">
  21650. <table>
  21651. <colgroup>
  21652. <col style="width:9.375rem;">
  21653. <col style="width: calc(50% - 9.375rem);">
  21654. <col style="width:9.375rem;">
  21655. <col style="width: calc(50% - 9.375rem);">
  21656. </colgroup>
  21657. <tbody>
  21658. <tr>
  21659. <th>테넌트 이름</th>
  21660. <td>
  21661. {{neInfo.tenantName}}
  21662. </td>
  21663. <th>NE 그룹 이름</th>
  21664. <td>
  21665. {{neInfo.neGroup}}
  21666. </td>
  21667. </tr>
  21668. <tr>
  21669. <th>NE 유형</th>
  21670. <td>
  21671. {{neInfo.neType}}
  21672. </td>
  21673. <th>NE 이름</th>
  21674. <td>
  21675. {{neInfo.neName}}
  21676. </td>
  21677. </tr>
  21678. <tr>
  21679. <th>위치</th>
  21680. <td colspan="3">
  21681. {{neInfo.neAddress}}
  21682. </td>
  21683. </tr>
  21684. </tbody>
  21685. </table>
  21686. </div>
  21687. </div>
  21688. <!-- NE 상세 정보 : E -->
  21689. </div>
  21690. <div class="btn-wrap nw--btn--wrap" style="padding-top:1.88rem">
  21691. <div></div>
  21692. <div class="inner--btn--wrap">
  21693. <v-btn
  21694. class="custom-btn btn-gray mini"
  21695. @click="fnClose"
  21696. >
  21697. <i class="ico"></i>
  21698. 닫기
  21699. </v-btn>
  21700. </div>
  21701. </div>
  21702. </div>
  21703. </v-dialog>
  21704. <!-- 지도형 3Depth 정보 팝업 : E -->
  21705. </template>
  21706. <script setup>
  21707. /***********************
  21708. * import
  21709. ************************/
  21710. import { useI18n } from "vue-i18n";
  21711. import useUtil from "@/composables/useUtil";
  21712. /***********************
  21713. * plugins inject
  21714. ************************/
  21715. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  21716. // props
  21717. const props = defineProps({
  21718. neInfo: {
  21719. type: Object,
  21720. default: function () {
  21721. return {
  21722. tenantName: '',
  21723. neName: '',
  21724. neType: '',
  21725. neGroup: '',
  21726. neAddress: '',
  21727. neLocLatitude: '',
  21728. neLocLongitude: ''
  21729. }
  21730. },
  21731. },
  21732. centerPosition: Object
  21733. })
  21734. // 참조가능 데이터 설정
  21735. defineExpose({})
  21736. // 발신 이벤트 선언
  21737. const emit = defineEmits(["closeModal"])
  21738. const i18n = useI18n()
  21739. /***********************
  21740. * data & created
  21741. ************************/
  21742. const isModal = ref(true)
  21743. const map = ref(null) // 카카오 맵 객체
  21744. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize)
  21745. const rowHeightRem = 2.5 // 원하는 rem 값
  21746. const rowHeightPx = rowHeightRem * remToPx()
  21747. const gridApi = shallowRef()
  21748. const markers = ref([])
  21749. onMounted(() => {
  21750. fnInit()
  21751. })
  21752. /***********************
  21753. * Methods
  21754. ************************/
  21755. function fnInit(){
  21756. nextTick().then(() => {
  21757. if (window.kakao && window.kakao.maps) {
  21758. loadMap()
  21759. } else {
  21760. loadScript()
  21761. }
  21762. })
  21763. }
  21764. /**
  21765. * kakao 스크립트 로드
  21766. */
  21767. function loadScript() {
  21768. const script = document.createElement('script')
  21769. script.async = true
  21770. script.onload = () => {
  21771. window.kakao.maps.load(loadMap)
  21772. }
  21773. script.src = `//dapi.kakao.com/v2/maps/sdk.js?autoload=false&libraries=services,clusterer,drawing&appkey=${import.meta.env.VITE_APP_KAKAO_APP_KEY}`
  21774. document.head.appendChild(script)
  21775. }
  21776. /**
  21777. * kakao 지도 로드
  21778. */
  21779. async function loadMap() {
  21780. const mapContainer = document.getElementById('ran_detail_map')
  21781. let mapOption = {
  21782. center: new kakao.maps.LatLng(props.centerPosition.lat, props.centerPosition.lng), // 지도의 중심좌표
  21783. level: 3, // 지도의 확대 레벨
  21784. }
  21785. map.value = new kakao.maps.Map(mapContainer, mapOption)
  21786. let zoomControl = new kakao.maps.ZoomControl()
  21787. // map.value.addControl(zoomControl, kakao.maps.ControlPosition.BOTTOMRIGHT)
  21788. // fnSetEventListener() // 지도 이벤트 등록
  21789. fnDrawMarker()
  21790. }
  21791. /**
  21792. * 상세팝업 닫기
  21793. */
  21794. function fnClose(){
  21795. isModal.value = false
  21796. setTimeout(() => {
  21797. emit('closeModal')
  21798. }, 250);
  21799. }
  21800. /**
  21801. * 마커 생성 데이터 세팅
  21802. */
  21803. function fnDrawMarker(){
  21804. let position = new kakao.maps.LatLng(props.neInfo.neLocLatitude, props.neInfo.neLocLongitude)
  21805. let markerObj = {
  21806. overlay: null,
  21807. markers: null,
  21808. data: props.neInfo,
  21809. click: false,
  21810. position: position
  21811. }
  21812. markers.value.push(markerObj)
  21813. markers.value[0].markers = fnCreateMarker(position, 0)
  21814. map.value.panTo(position)
  21815. setTimeout(() => {
  21816. // 정보 레이어 오픈
  21817. fnGetInfo(markers.value[0].data, 0)
  21818. }, 1);
  21819. }
  21820. import { filename } from 'pathe/utils'
  21821. // 이미지 가져오기 (vite문법)
  21822. const glob = import.meta.glob('~/assets/img/ico_*.{png,svg}', { eager: true })
  21823. const getImages = Object.fromEntries(
  21824. Object.entries(glob).map(([key, value]) => [filename(key), value.default])
  21825. )
  21826. // NE 수 > 이벤트 단계 클래스
  21827. const getNeEventCls = computed(() => {
  21828. return (obj) => {
  21829. let eventCls = ''
  21830. if(!_isEmpty(obj)) {
  21831. if(obj.minCnt > 0) eventCls = 'black'
  21832. if(obj.majCnt > 0) eventCls = 'blue'
  21833. if(obj.criCnt > 0) eventCls = 'red'
  21834. }
  21835. return eventCls
  21836. }
  21837. })
  21838. // 마커 이미지 파일명 세팅
  21839. function fnGetMarkerImage(){
  21840. let color = getNeEventCls.value(props.neInfo)
  21841. if(color == 'red') return 'ico_red_pin'
  21842. else if(color == 'blue') return 'ico_blue_pin'
  21843. else if(color == 'black') return 'ico_black_pin'
  21844. else return 'ico_gray_pin'
  21845. }
  21846. /**
  21847. * 마커 생성
  21848. */
  21849. function fnCreateMarker(position, index) {
  21850. // 마커 이미지 설정
  21851. const markerImageSrc = getImages[fnGetMarkerImage()] // assets 폴더의 이미지 경로
  21852. const markerImageSize = new kakao.maps.Size(40, 40); // 마커 이미지 사이즈
  21853. const markerImage = new kakao.maps.MarkerImage(markerImageSrc, markerImageSize);
  21854. let markerOption = {
  21855. map: map.value, // 마커를 표시할 지도
  21856. position: position, // 마커의 위치
  21857. clickable: true,
  21858. image: markerImage,
  21859. zIndex: 1,
  21860. }
  21861. let marker = new kakao.maps.Marker(markerOption)
  21862. // 마커 클릭 이벤트등록
  21863. kakao.maps.event.addListener(marker,'click', fnClickMarker(index))
  21864. return marker
  21865. }
  21866. /**
  21867. * 마커 클릭
  21868. */
  21869. function fnClickMarker(index) {
  21870. const clickData = markers.value[index].data
  21871. const openInfoWindow = function () {
  21872. // 마커 클릭 > 상태변경 > z-index 및 맵 이동
  21873. fnMarkerClickChk(index)
  21874. fnGetInfo(clickData, index)
  21875. }
  21876. return openInfoWindow
  21877. }
  21878. /**
  21879. * 마커 클릭 이벤트
  21880. */
  21881. function fnMarkerClickChk(index) {
  21882. fnSetUnClickMarker()
  21883. markers.value[index].click = true
  21884. markers.value[index].markers.setZIndex(3)
  21885. let moveLatLng = markers.value[index].position
  21886. map.value.panTo(moveLatLng)
  21887. }
  21888. /**
  21889. * 마커 클릭 상태 해제 및 z인덱스 초기화
  21890. */
  21891. function fnSetUnClickMarker() {
  21892. markers.value.forEach((item) => {
  21893. item.click = false
  21894. item.markers.setZIndex(2)
  21895. })
  21896. }
  21897. function fnGetInfo(data, index){
  21898. // 열려 있던 오버레이 닫기
  21899. fnCloseMarkerInfoOverlay()
  21900. // 오버레이 생성
  21901. markers.value[index].overlay = fnCreateCustomOverlay(data, index)
  21902. // 오버레이 z-index 설정
  21903. markers.value[index].overlay.setZIndex(999)
  21904. // 오버레이 열기
  21905. markers.value[index].overlay.setMap(map.value)
  21906. // 오버레이 이벤트 등록
  21907. fnCustomOverlayAddEventListener()
  21908. }
  21909. /**
  21910. * 커스텀 오버레이 생성
  21911. */
  21912. function fnCreateCustomOverlay(data, index) {
  21913. let cpu = JSON.parse(data.cpu)
  21914. let memory = JSON.parse(data.mem)
  21915. let content = `
  21916. <div class="area--info" style="top: -10.7rem; right: -6rem;">
  21917. <div class="area--info--title">
  21918. <p style="overflow:hidden; text-overflow: ellipsis;">${data.neName}</p>
  21919. <button class="btn-close" id="overlayCloseBtn"></button>
  21920. </div>
  21921. <ul>
  21922. <li><i class="ico green"></i><span>STATUS</span><span class="active">ACTIVE</span></li>
  21923. <li><i class="ico red"></i><span>CPU</span><span class="">${cpu.AVG_CPU_L}%</span></li>
  21924. <li><i class="ico green"></i><span>MEMORY</span><span class="">${memory.AVG_MEM_L}%</span></li>
  21925. <li><i class="ico green"></i><span>DISK</span><span class="">${data.disk}</span></li>
  21926. </ul>
  21927. </div>`
  21928. // 커스텀 오버레이 생성
  21929. let customOverlay = new kakao.maps.CustomOverlay({
  21930. position: markers.value[index].position,
  21931. content: content
  21932. })
  21933. return customOverlay
  21934. }
  21935. /**
  21936. * 커스텀 오버레이 이벤트 등록
  21937. */
  21938. function fnCustomOverlayAddEventListener(){
  21939. // 오버레이 닫기 버튼
  21940. const closeBtn = document.querySelector('#overlayCloseBtn')
  21941. closeBtn.addEventListener('click', fnCloseBtnOverlay)
  21942. }
  21943. /**
  21944. * 마커 정보 오버레이 닫기 버튼
  21945. */
  21946. function fnCloseBtnOverlay() {
  21947. fnCloseMarkerInfoOverlay()
  21948. fnSetUnClickMarker()
  21949. }
  21950. /**
  21951. * 모든 마커 정보 오버레이 닫기
  21952. */
  21953. function fnCloseMarkerInfoOverlay() {
  21954. for (var i = 0; i < markers.value.length; i++) {
  21955. if (markers.value[i].overlay) {
  21956. markers.value[i].overlay.setMap(null)
  21957. markers.value[i].overlay = null
  21958. }
  21959. }
  21960. }
  21961. /*********************
  21962. * grid 관련
  21963. *********************/
  21964. // Grid 데이터 바인딩
  21965. function fnOnGridReady(params){
  21966. gridApi.value = params.api
  21967. }
  21968. function actionCellRenderer2(params) {
  21969. let _cls = "";
  21970. if(params.data.color == 'red'){
  21971. _cls = 'pin--red';
  21972. } else if(params.data.color == 'blue'){
  21973. _cls = 'pin--blue';
  21974. } else if(params.data.color == 'gray'){
  21975. _cls = 'pin--gray';
  21976. } else if(params.data.color == 'black'){
  21977. _cls = 'pin--black';
  21978. }
  21979. let pin = `<span class="${_cls}">${params.data.neName}</span>`;
  21980. return pin;
  21981. }
  21982. function actionCellRenderer3(params) {
  21983. let _cls0 = "";
  21984. let _cls1 = "";
  21985. let _cls2 = "";
  21986. let _cls3 = "";
  21987. if(params.data.th4[0]){_cls0 = 'evt--critical';}
  21988. if(params.data.th4[1]){_cls1 = 'evt--major';}
  21989. if(params.data.th4[2]){_cls2 = 'evt--minor';}
  21990. let pin = "";
  21991. if (_cls0) {
  21992. pin += `<span class="${_cls0}">CRITICAL (${params.data.th4[0]}) </span>`;
  21993. }
  21994. if (_cls1) {
  21995. pin += `<span class="${_cls1}">MAJOR (${params.data.th4[1]}) </span>`;
  21996. }
  21997. if (_cls2) {
  21998. pin += `<span class="${_cls2}">MINOR (${params.data.th4[2]}) </span>`;
  21999. }
  22000. if(pin == ""){
  22001. pin += `<span class="evt--none">-</span>`;
  22002. }
  22003. return pin;
  22004. }
  22005. </script>
  22006. </file>
  22007. <file path="components/home/dashboard/layout01/core/layout01Core.vue">
  22008. <template>
  22009. <div
  22010. class="core--component--wrap"
  22011. :class="widgetSize === 'S' ? 'small' : ''"
  22012. >
  22013. <div class="inner--header--wrap">
  22014. <h2 class="inner--component--title none--after">
  22015. CORE
  22016. </h2>
  22017. <pagination
  22018. :page-obj="pageObj"
  22019. @chg_page="fnChgPage"
  22020. >
  22021. <template #rightArea>
  22022. <div class="search--box">
  22023. <v-select
  22024. v-model="objSltSearch.neType"
  22025. :items="objSlt.neTypeList"
  22026. variant="outlined"
  22027. style="width:9.0625rem;"
  22028. class="custom-select"
  22029. />
  22030. <v-select
  22031. v-model="objSltSearch.customerType"
  22032. :items="objSlt.customerTypeList"
  22033. variant="outlined"
  22034. style="width:9.0625rem;"
  22035. class="custom-select"
  22036. />
  22037. <v-btn
  22038. class="custom-btn mini sort-btn"
  22039. flat
  22040. @click="isSortShow ? isSortShow = false : isSortShow = true"
  22041. />
  22042. <div
  22043. v-if="isSortShow == true"
  22044. class="sort--atv"
  22045. >
  22046. <ul>
  22047. <li
  22048. v-for="(sort, index) in objSlt.sortTypeList"
  22049. :key="`sort-option-${index}`"
  22050. :class="{atv: objSltSearch.sortType == sort.value}"
  22051. @click="fnOnclickSortType(sort.value)"
  22052. >
  22053. {{ sort.title }}
  22054. </li>
  22055. </ul>
  22056. </div>
  22057. </div>
  22058. </template>
  22059. </pagination>
  22060. </div>
  22061. <!-- 위젯 영역 -->
  22062. <WidgetM
  22063. v-if="widgetSize === 'M'"
  22064. :items="coreItems"
  22065. @more="fnCoreDetailClick"
  22066. />
  22067. <WidgetS
  22068. v-if="widgetSize === 'S'"
  22069. :items="coreItems"
  22070. @more="fnCoreDetailClick"
  22071. />
  22072. <!-- 코어 상세보기 Modal -->
  22073. <CoreDetailModal
  22074. ref="refCoreDetailModal"
  22075. :is-core-detail-modal="isCoreDetailModal"
  22076. @close-modal="fnCloseCoreDetailModal"
  22077. />
  22078. </div>
  22079. </template>
  22080. <script setup>
  22081. /***********************
  22082. * import
  22083. ************************/
  22084. import { useI18n } from "vue-i18n"
  22085. import apiUrl from '@/composables/useApi';
  22086. import useAxios from '@/composables/useAxios';
  22087. import useUtil from '@/composables/useUtil';
  22088. import CoreDetailModal from "@/components/home/dashboard/common/coreDetailModal.vue"
  22089. import WidgetM from "@/components/home/dashboard/layout01/core/layout01CoreWidgetM.vue"
  22090. import WidgetS from "@/components/home/dashboard/layout01/core/layout01CoreWidgetS.vue"
  22091. import pagination from "@/components/home/dashboard/common/pagination.vue"
  22092. import testJson from "../../test.json"
  22093. /***********************
  22094. * plugins inject
  22095. ************************/
  22096. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  22097. // props
  22098. const props = defineProps({
  22099. config: {
  22100. type: Object,
  22101. default: () => {}
  22102. },
  22103. intervalTime: {
  22104. type: Number,
  22105. default: 5000
  22106. }
  22107. })
  22108. // 참조가능 데이터 설정
  22109. defineExpose({})
  22110. // 발신 이벤트 선언
  22111. const emit = defineEmits([""]);
  22112. const i18n = useI18n();
  22113. /***********************
  22114. * data & created
  22115. ************************/
  22116. // 코어 상세보기 모달
  22117. const refCoreDetailModal = ref(null);
  22118. const isCoreDetailModal = ref(false);
  22119. // TenantName
  22120. const tenantName = computed(() => useAuthStore().getTenantName);
  22121. // 설정된 위젯 사이즈 : M or S
  22122. const widgetSize = computed(() => props.config?.widgetSize || 'M');
  22123. // 위젯 사이즈별 표시 갯수
  22124. const widgetListLimit = ref({
  22125. S: 9, M: 6
  22126. });
  22127. // 페이징 정보
  22128. const pageObj = ref( {
  22129. page: 1, // 현재 페이지
  22130. pageSize: widgetListLimit.value[widgetSize.value], // 테이블 조회 데이터 개수
  22131. totalCnt: 0, // 전체 페이지
  22132. })
  22133. const objSltSearch = ref({
  22134. neType: '',
  22135. customerType: '',
  22136. sortType: 0,
  22137. })
  22138. // 검색조건
  22139. const objSlt = ref({
  22140. neTypeList: [],
  22141. customerTypeList: [],
  22142. sortTypeList: [
  22143. {title: '위험도순', value: 0},
  22144. {title: '이름순(오름차순)', value: 1},
  22145. {title: '이름순(내림차순)', value: 2}
  22146. ],
  22147. })
  22148. // 코어 리스트
  22149. const coreItems = ref([]);
  22150. // 정렬 옵션 open 여부
  22151. const isSortShow = ref(false);
  22152. /***********************
  22153. * Methods
  22154. ************************/
  22155. /**
  22156. * 리셋
  22157. */
  22158. const fnReset = () => {
  22159. objSltSearch.value.neType = '';
  22160. objSltSearch.value.customerType = '';
  22161. objSltSearch.value.sortType = '';
  22162. pageObj.value.page = 1;
  22163. pageObj.value.pageSize = widgetListLimit.value[widgetSize.value];
  22164. pageObj.value.totalCnt = 0;
  22165. }
  22166. /**
  22167. * 코어 리스트 조회
  22168. */
  22169. function fnGetCoreList() {
  22170. const params = {
  22171. tenantName: tenantName.value,
  22172. }
  22173. useAxios().post(apiUrl.getCoreInfoList, params).then((res) => {
  22174. const {resCode, resMsg, data} = res.data;
  22175. if(resCode == 200) {
  22176. // 테스트를 위한 테스트 코드 (삭제 필수)
  22177. // fnParseData([...(data?.items || []), ...testJson.core.data.items])
  22178. fnParseData(data.items || [])
  22179. $log.debug("[dashboard][fnGetCoreList][success]")
  22180. } else {
  22181. $log.debug("[dashboard][fnGetCoreList][error]", `[${resCode}] ${resMsg}`);
  22182. }
  22183. }).catch((error)=>{
  22184. // 테스트를 위한 테스트 코드 (삭제 필수)
  22185. // fnParseData([...testJson.core.data.items])
  22186. $log.debug("[dashboard][fnGetCoreList][error]", error)
  22187. useErrorHandler().fnSetCommErrorHandle(error, fnGetCoreList)
  22188. }).finally(()=>{
  22189. $log.debug("[dashboard][fnGetCoreList][finished]")
  22190. })
  22191. }
  22192. /**
  22193. * 데이터 가공
  22194. */
  22195. function fnParseData(items = []) {
  22196. // {neType: 'AMF', neName: 'neName1', emsStatus: 0, mcmStatus: 0, psmStatus: 0, criCnt: 3,majCnt: 1, minCnt: 1,customerType: 1,CPU: {AVG_CPU_L: 14,PEAK_CPU_L: 15, }, MEM: {AVG_MEM_L: 6,PEAK_MEM_L: 95,}},
  22197. // {id: 14, customerType: '1', level: 'MINOR', isDisconnect: false, neType: 'AMF', status: 'ACTIVE', cpu: Math.random() * 100, memory: Math.random() * 100, disk: Math.random() * 100},
  22198. coreItems.value = [];
  22199. if(!items || items.length < 1) {
  22200. pageObj.value.totalCnt = 0;
  22201. return;
  22202. }
  22203. let temp = [];
  22204. // 검색 조건 적용
  22205. const { neType, customerType} = objSltSearch.value;
  22206. temp = items.filter((data) => (useUtil.isNull(neType) || neType == data.neType) && (useUtil.isNull(customerType) || customerType == data.customerType));
  22207. // 정렬 조건 적용
  22208. const { sortType } = objSltSearch.value;
  22209. temp = temp.sort((a, b) => {
  22210. // 위험도순
  22211. if(sortType == 0) {
  22212. return a.criCnt < b.criCnt ? 1 : a.criCnt > b.criCnt ? -1 : (a.majCnt < b.majCnt ? 1 : a.majCnt > b.majCnt ? -1 : (a.minCnt < b.minCnt ? 1 : a.minCnt > b.minCnt ? -1 : 0));
  22213. }
  22214. //이름순 오름차순
  22215. else if(sortType == 1) {
  22216. return a.neName < b.neName ? -1 : a.neName > b.neName ? 1 : 0;
  22217. }
  22218. //이름순 내림차순
  22219. else if(sortType == 2) {
  22220. return a.neName > b.neName ? -1 : a.neName < b.neName ? 1 : 0;
  22221. }
  22222. })
  22223. // 페이징 적용
  22224. pageObj.value.totalCnt = temp.length;
  22225. temp = temp.filter((data, index) =>(index >= ((pageObj.value.page - 1) * pageObj.value.pageSize) && index < (pageObj.value.page * pageObj.value.pageSize)));
  22226. // 데이터 가공
  22227. coreItems.value = temp.map((item) => {
  22228. // KPI 정보 셋팅 - TODO: CPU, MEM 외의 값이 추가되면 여기에 추가
  22229. const { cpu, mem } = item;
  22230. const kpiItems = [];
  22231. if(cpu) {
  22232. const objCpu = typeof cpu === 'string' ? JSON.parse(cpu) : cpu;
  22233. if(objCpu && objCpu[`AVG_CPU_L(%)`]){
  22234. kpiItems.push({label: 'CPU', val: objCpu[`AVG_CPU_L(%)`] || 0})
  22235. item.cpu = objCpu;
  22236. }
  22237. }
  22238. if(mem) {
  22239. const objMem = typeof mem === 'string' ? JSON.parse(mem) : mem ;
  22240. if(objMem && objMem['AVG_MEM_L(%)']){
  22241. kpiItems.push({label: 'MEMORY', val: objMem['AVG_MEM_L(%)'] || 0})
  22242. item.mem = objMem;
  22243. }
  22244. }
  22245. //고객 유형명 셋팅
  22246. const { customerType } = item;
  22247. let customerTypeName = '';
  22248. if(customerType) {
  22249. const type = objSlt.value.customerTypeList.find((t) => t.value == customerType)
  22250. if(type) customerTypeName = type.title;
  22251. }
  22252. // disconected 셋팅
  22253. const { emsStatus, mcmStatus, psmStatus } = item;
  22254. const connect = {
  22255. isConnected: false,
  22256. reason: [],
  22257. }
  22258. if([emsStatus, mcmStatus, psmStatus].every((status) => status == 0)) {
  22259. connect.isConnected = true;
  22260. } else {
  22261. connect.isConnected = false;
  22262. if(emsStatus != 0 ) connect.reason.push(`emsSatats: ${emsStatus}`);
  22263. if(mcmStatus != 0 ) connect.reason.push(`mcmStatus: ${mcmStatus}`);
  22264. if(psmStatus != 0 ) connect.reason.push(`psmStatus: ${psmStatus}`);
  22265. }
  22266. // 심각도 level 셋팅
  22267. const { criCnt ,majCnt, minCnt } = item;
  22268. let level = '';
  22269. if(criCnt > 0) level = 'CRITICAL';
  22270. else if(majCnt > 0) level = 'MAJOR';
  22271. else if(minCnt > 0) level = 'MINOR';
  22272. return {
  22273. ...item,
  22274. kpiItems, // kpi 정보
  22275. customerTypeName, // 고객유형명
  22276. connect, // 연결 상태
  22277. level, // 심각도 레벨
  22278. }
  22279. });
  22280. console.log('::::::: coreItems : ' ,coreItems.value)
  22281. }
  22282. /**
  22283. * 페이지 변경
  22284. */
  22285. function fnChgPage(page){
  22286. pageObj.value.page = page;
  22287. fnGetCoreList();
  22288. // gridApi.value.paginationGoToPage(page-1)
  22289. }
  22290. /** 코어 상세보기 open */
  22291. function fnCoreDetailClick(item) {
  22292. isCoreDetailModal.value = true
  22293. refCoreDetailModal.value.fnInit(item)
  22294. }
  22295. /** 코어 상세보기 Close */
  22296. function fnCloseCoreDetailModal() {
  22297. isCoreDetailModal.value = false
  22298. }
  22299. /** 검색조건 > 정렬 변경 */
  22300. function fnOnclickSortType(type) {
  22301. objSltSearch.value.sortType = type;
  22302. isSortShow.value = false;
  22303. }
  22304. /**
  22305. * ENUM 업데이트
  22306. * @param lang
  22307. */
  22308. function fnGetEnumCode(lang){
  22309. lang = useUtil.nvl(lang, 'kr')
  22310. const objEnum = useEnumCode.getEnumCode(lang)
  22311. objSlt.value.neTypeList = [{title: i18n.t('common.all'), value: ''},...objEnum.neType]
  22312. objSlt.value.customerTypeList = [{title: i18n.t('common.all'), value: ''},...objEnum.customerType]
  22313. }
  22314. onMounted(() => fnGetCoreList())
  22315. watchEffect(() => fnGetEnumCode(useLangStore().getLang))
  22316. // 검색 조건 변경 watch
  22317. watch(() => objSltSearch.value, () => {
  22318. pageObj.value.page = 1;
  22319. fnGetCoreList();
  22320. }, {deep: true})
  22321. // 위젯사이즈 변경 watch
  22322. watch(() => widgetSize.value, () => {
  22323. fnReset();
  22324. fnGetCoreList();
  22325. }, {deep: true})
  22326. </script>
  22327. </file>
  22328. <file path="components/home/dashboard/layout01/core/layout01CoreWidgetM.vue">
  22329. <template>
  22330. <div class="inner--content">
  22331. <ul
  22332. v-if="props.items && props.items.length > 0"
  22333. class="core--card"
  22334. >
  22335. <li
  22336. v-for="(item, index) in props.items"
  22337. :key="`core-widget-${index}`"
  22338. :class="getLevelClass(item.connect, item.level)"
  22339. >
  22340. <div>
  22341. <div class="card--header">
  22342. <h2>{{ item.neName }}</h2>
  22343. <v-btn
  22344. class="more--btn"
  22345. flat
  22346. @click="$emit('more', item)"
  22347. />
  22348. </div>
  22349. <div class="card--body">
  22350. <ul>
  22351. <li>
  22352. <span :class="getBodyStatusClass(item.connect)">STATUS</span>
  22353. <!-- <span>{{ item.connect.isConnected ? 'ACTIVE' : item.connect.reason.join(',') }}</span> -->
  22354. <span>{{ item.connect.isConnected ? 'ACTIVE' : '' }}</span>
  22355. </li>
  22356. <li
  22357. v-for="(kpi, idx) in item.kpiItems"
  22358. :key="`core-widget-${index}-${idx}`"
  22359. >
  22360. <span :class="getBodyLevelClass(kpi.val)">{{ kpi.label }}</span>
  22361. <span :class="getBodyLevelClass(kpi.val)">{{ toRoundFix(kpi.val, 2) }}%</span>
  22362. </li>
  22363. </ul>
  22364. </div>
  22365. </div>
  22366. </li>
  22367. </ul>
  22368. <div
  22369. v-else
  22370. class="no--data--card"
  22371. >
  22372. <div class="no--data--contents">
  22373. <h2>데이터가 없습니다.</h2>
  22374. </div>
  22375. </div>
  22376. </div>
  22377. </template>
  22378. <script setup>
  22379. /***********************
  22380. * import
  22381. ************************/
  22382. import { useI18n } from "vue-i18n"
  22383. import apiUrl from '@/composables/useApi';
  22384. import useAxios from '@/composables/useAxios';
  22385. import useUtil from '@/composables/useUtil';
  22386. /***********************
  22387. * plugins inject
  22388. ************************/
  22389. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  22390. // props
  22391. const props = defineProps({
  22392. items: {
  22393. type: Array,
  22394. default: () => []
  22395. }
  22396. })
  22397. // 참조가능 데이터 설정
  22398. defineExpose({})
  22399. // 발신 이벤트 선언
  22400. const emit = defineEmits(["more"]);
  22401. const i18n = useI18n();
  22402. /***********************
  22403. * data & created
  22404. ************************/
  22405. /***********************
  22406. * Methods
  22407. ************************/
  22408. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  22409. // 레벨 클래스 : CRITICAL, MAJOR , MINOR
  22410. const getLevelClass = (connect, level) => {
  22411. if(!connect.isConnected) return 'discon';
  22412. else if(level === 'CRITICAL') return 'critical';
  22413. else if(level === 'MAJOR') return 'major';
  22414. else if(level === 'MINOR') return 'minor';
  22415. else return 'normal';
  22416. }
  22417. // 세부 데이터 상태값
  22418. const getBodyLevelClass = (val) => {
  22419. if(val >= 95) return 'critical'; // red
  22420. else if(val >= 90) return 'major'; // brown
  22421. else if(val >= 85) return 'minor'; // yellow
  22422. else return 'normal'; // green
  22423. }
  22424. // 세부 데이터 STATUS 상태값
  22425. const getBodyStatusClass = (connect) => {
  22426. if(connect.isConnected) return 'normal';
  22427. else return 'critical';
  22428. }
  22429. </script>
  22430. </file>
  22431. <file path="components/home/dashboard/layout01/core/layout01CoreWidgetS.vue">
  22432. <template>
  22433. <div class="inner--content">
  22434. <div
  22435. v-if="props.items && props.items.length > 0"
  22436. class="equip--card--wrap"
  22437. >
  22438. <div
  22439. v-for="(item, index) in props.items"
  22440. :key="`core-widget-${index}`"
  22441. class="equip--card"
  22442. :class="getLevelClass(item.connect, item.level)"
  22443. >
  22444. <div class="equip--name">
  22445. <span :title="item.neName">{{ item.neName }}</span>
  22446. <v-btn
  22447. class="custom--btn mini more--btn"
  22448. flat
  22449. @click="$emit('more', item)"
  22450. />
  22451. </div>
  22452. <ul class="equip--st">
  22453. <li>
  22454. <i
  22455. class="circle"
  22456. :class="getBodyStatusClass(item.connect)"
  22457. />
  22458. <p>STATUS</p>
  22459. <!-- <span class="active">{{ item.connect.isConnected ? 'ACTIVE' : item.connect.reason.join(',') }}</span> -->
  22460. <span class="active">{{ item.connect.isConnected ? 'ACTIVE' : '' }}</span>
  22461. </li>
  22462. <li
  22463. v-for="(kpi, idx) in item.kpiItems"
  22464. :key="`core-widget-${index}-${idx}`"
  22465. >
  22466. <i
  22467. class="circle"
  22468. :class="getBodyLevelClass(kpi.val)"
  22469. />
  22470. <p>{{ kpi.label }}</p>
  22471. <span>{{ toRoundFix(kpi.val, 2) }}%</span>
  22472. </li>
  22473. </ul>
  22474. </div>
  22475. </div>
  22476. <div
  22477. v-else
  22478. class="no--data--card"
  22479. >
  22480. <div class="no--data--contents">
  22481. <h2>데이터가 없습니다.</h2>
  22482. </div>
  22483. </div>
  22484. </div>
  22485. </template>
  22486. <script setup>
  22487. /***********************
  22488. * import
  22489. ************************/
  22490. import { useI18n } from "vue-i18n"
  22491. import apiUrl from '@/composables/useApi';
  22492. import useAxios from '@/composables/useAxios';
  22493. import useUtil from '@/composables/useUtil';
  22494. /***********************
  22495. * plugins inject
  22496. ************************/
  22497. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  22498. // props
  22499. const props = defineProps({
  22500. items: {
  22501. type: Array,
  22502. default: () => []
  22503. }
  22504. })
  22505. // 참조가능 데이터 설정
  22506. defineExpose({})
  22507. // 발신 이벤트 선언
  22508. const emit = defineEmits(["more"]);
  22509. const i18n = useI18n();
  22510. /***********************
  22511. * data & created
  22512. ************************/
  22513. /***********************
  22514. * Methods
  22515. ************************/
  22516. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  22517. // 레벨 클래스 : CRITICAL, MAJOR , MINOR
  22518. const getLevelClass = (connect, level) => {
  22519. if(!connect.isConnected) return 'discon';
  22520. else if(level === 'CRITICAL') return 'critical';
  22521. else if(level === 'MAJOR') return 'major';
  22522. else if(level === 'MINOR') return 'minor';
  22523. else return 'normal';
  22524. }
  22525. // 세부 데이터 상태값
  22526. const getBodyLevelClass = (val) => {
  22527. if(val >= 95) return 'critical'; // red
  22528. else if(val >= 90) return 'major'; // brown
  22529. else if(val >= 85) return 'minor'; // yellow
  22530. else return 'normal'; // green
  22531. }
  22532. // 세부 데이터 STATUS 상태값
  22533. const getBodyStatusClass = (connect) => {
  22534. if(connect.isConnected) return 'normal';
  22535. else return 'critical';
  22536. }
  22537. </script>
  22538. </file>
  22539. <file path="components/home/dashboard/layout01/ran/layout01Ran.vue">
  22540. <template>
  22541. <!-- RAN 12x24 지도형 -->
  22542. <div class="map--contents--wraper">
  22543. <div class="map--contents--wrap">
  22544. <div class="header--wrapper">
  22545. <div class="titles">
  22546. <span>RAN</span>
  22547. </div>
  22548. <div class="control--wrap">
  22549. <v-btn class="custom-btn mini map--btn" :class="{ on: shapeMap }" @click="shapeMap = true">
  22550. <i class="icon"></i>지도
  22551. </v-btn>
  22552. <v-btn class="custom-btn mini card--btn" :class="{ on: !shapeMap }" @click="shapeMap = false">
  22553. <i class="icon"></i>카드
  22554. </v-btn>
  22555. </div>
  22556. </div>
  22557. <div class="inner--content--wrapper" v-if="shapeMap == true">
  22558. <div class="map--wrappers">
  22559. <!-- 맵 데이터 -->
  22560. <div class="map--text">
  22561. <div v-for="(item, idx) in mapDataInfo" :key="idx" class="map--text--inner" :class="item.cls">
  22562. <div class="title" @click="fnDetailArea(item, idx)" style="cursor:pointer;">{{item.areaName}} <span>({{item.neInfoList.length}})</span></div>
  22563. <div class="status">
  22564. <span class="critical" v-show="item.criCnt > 0">{{item.criCnt}}</span>
  22565. <span class="major" v-show="item.majCnt > 0">{{item.majCnt}}</span>
  22566. <span class="minor" v-show="item.minCnt > 0">{{item.minCnt}}</span>
  22567. </div>
  22568. </div>
  22569. </div>
  22570. <!-- 맵 백터 이미지 -->
  22571. <!-- 서울 -->
  22572. <div class="mapdt seoul" :class="getEventClass(mapDataInfo[0])">
  22573. <svg xmlns="http://www.w3.org/2000/svg" width="3.68181rem" height="2.79144rem" viewBox="0 0 60 45" fill="none">
  22574. <path d="M24.8178 45.0053L39.0906 43.6408L49.3633 37.6372L55.5451 32.907L59.2724 26.2666H52.636L52.1815 13.2587L45.4542 0.796618L37.1815 0.341797L26.2724 8.34666L15.9087 9.98402L12.8178 19.4443L2.45419 22.2642L0.363281 27.3582L6.5451 29.5413L15.0906 31.9064L13.9996 37.3643L24.8178 45.0053Z" fill="currentColor"/>
  22575. </svg>
  22576. </div>
  22577. <!-- 부산 -->
  22578. <div class="mapdt busan" :class="getEventClass(mapDataInfo[1])">
  22579. <svg xmlns="http://www.w3.org/2000/svg" width="4.5rem" height="2.68344rem" viewBox="0 0 73 44" fill="none">
  22580. <path d="M67.7283 22.4503L71.7283 10.443L72.9101 8.80567L71.8193 7.35024L66.2738 6.34962L59.9102 1.52853L56.9102 0.164062L45.7283 6.62253L42.1829 12.2623L31.2738 9.80628L21.1829 13.7177L2.63742 11.4436L0.910156 22.4503L4.18289 27.9991L9.91015 28.0901L9.27378 34.6395L19.2738 35.913L25.9102 38.9149L36.9102 34.0937L41.3647 43.0992L54.9102 33.457L67.7283 22.4503Z" fill="currentColor"/>
  22581. </svg>
  22582. </div>
  22583. <!-- 대구 -->
  22584. <div class="mapdt daegu" :class="getEventClass(mapDataInfo[2])">
  22585. <svg xmlns="http://www.w3.org/2000/svg" width="4rem" height="3.95694rem" viewBox="0 0 65 64" fill="none">
  22586. <path d="M35.092 56.5014L45.9102 55.046L50.8192 49.6791L44.6374 40.0368L50.2738 34.3061L57.2738 22.7536L64.9102 19.206L64.5465 8.01742L59.7283 0.103516H43.1829L30.3647 12.5656L20.6374 9.01801L10.092 16.75L6.27379 27.1199L19.3647 34.7609H11.6374L6.27379 41.1284L9.63743 49.861H2.81925L0.910156 53.1357L4.72832 60.3219L15.4556 55.8646L17.6374 56.5924L21.8192 63.4147L26.3647 52.9538L35.092 56.5014Z" fill="currentColor"/>
  22587. </svg>
  22588. </div>
  22589. <!-- 인천 -->
  22590. <div class="mapdt incheon" :class="getEventClass(mapDataInfo[3])">
  22591. <svg xmlns="http://www.w3.org/2000/svg" width="1.73863rem" height="2.22294rem" viewBox="0 0 29 37" fill="none">
  22592. <path d="M28.5447 11.7185L22.0902 6.07867L11.272 0.802734L0.726562 3.71359L3.45384 16.2667L12.8175 23.6348L13.0902 31.1848L16.1811 33.5499L23.0902 36.3698L24.6357 23.8167L28.5447 11.7185Z" fill="currentColor"/>
  22593. </svg>
  22594. </div>
  22595. <!-- 강화 -->
  22596. <div class="mapdt kanghwa" :class="getEventClass(mapDataInfo[3])">
  22597. <svg xmlns="http://www.w3.org/2000/svg" width="1.80113rem" height="2.70619rem" viewBox="0 0 29 44" fill="none">
  22598. <path d="M28.908 21.0585L20.7262 0.136719L6.45348 10.9615L5.99893 28.2447L0.0898438 41.3436L20.3626 43.4357L28.908 31.7013V21.0585Z" fill="currentColor"/>
  22599. </svg>
  22600. </div>
  22601. <!-- 광주 -->
  22602. <div class="mapdt gwangju" :class="getEventClass(mapDataInfo[4])">
  22603. <svg xmlns="http://www.w3.org/2000/svg" width="3.07956rem" height="1.66013rem" viewBox="0 0 50 28" fill="none">
  22604. <path d="M45.7262 22.4564L49.3626 14.6335L44.3626 11.1769L39.5444 2.89911L26.4535 1.71658L14.3626 0.625L6.54439 5.17322L5.45348 10.5401L0.0898438 14.6335C0.0898438 14.6335 3.08985 24.1848 3.36257 24.3667C3.6353 24.5486 14.0898 23.9119 15.1808 24.3667C16.2717 24.8215 24.908 27.1866 24.908 27.1866L38.0898 26.2769L45.7262 22.4564Z" fill="currentColor"/>
  22605. </svg>
  22606. </div>
  22607. <!-- 대전 -->
  22608. <div class="mapdt daejeon" :class="getEventClass(mapDataInfo[5])">
  22609. <svg xmlns="http://www.w3.org/2000/svg" width="2.49431rem" height="3.04194rem" viewBox="0 0 41 50" fill="none">
  22610. <path d="M40.3622 41.5497L38.9986 35.2732H35.8168L34.3622 34.5455L31.544 30.8159L31.2713 29.2695L34.0895 18.3538L34.6349 17.7171L35.0895 17.1713L38.7258 15.5339V14.2604H35.9077L34.1804 12.8959L32.7259 7.52906L29.6349 8.98449L27.8168 8.80255L21.1804 3.70854L20.544 2.70796L20.0895 0.888672L16.9986 6.98326L8.81676 16.3526L0.453125 23.084L4.81676 32.8171L9.63494 40.5491L19.3622 42.4593L24.9077 46.4618C24.9077 46.4618 29.4531 49.3727 30.0895 49.5546C30.7258 49.7365 37.8168 45.3702 37.8168 45.3702L40.3622 41.5497Z" fill="currentColor"/>
  22611. </svg>
  22612. </div>
  22613. <!-- 울산 -->
  22614. <div class="mapdt ulsan" :class="getEventClass(mapDataInfo[6])">
  22615. <svg xmlns="http://www.w3.org/2000/svg" width="3.36363rem" height="3.0985rem" viewBox="0 0 55 50" fill="none">
  22616. <path d="M0.363281 22.0602L2.63601 27.882H9.27236L13.4542 37.7061L20.2724 40.9808L26.7269 45.9839L33.0906 46.8025L35.636 49.6224L39.7269 46.4387V37.5242L46.2724 31.1567L50.3633 33.4308L54.1814 12.3271L43.636 6.8692L40.5451 11.4174L38.7269 12.2361L30.7269 10.5987L29.2724 8.8704V0.046875L15.4542 0.956518L10.3633 7.77884L9.27236 8.50655L7.27238 16.9662L0.363281 22.0602Z" fill="currentColor"/>
  22617. </svg>
  22618. </div>
  22619. <!-- 세종 -->
  22620. <div class="mapdt sejong" :class="getEventClass(mapDataInfo[7])">
  22621. <svg xmlns="http://www.w3.org/2000/svg" width="1.94888rem" height="2.52425rem" viewBox="0 0 32 41" fill="none">
  22622. <path d="M26.7262 4.69162H18.908L3.08984 0.234375L0.0898438 4.69162L1.81712 16.426L13.3626 26.3411L15.1808 36.0743L20.9989 40.6225L27.908 32.6177L31.2717 23.7941L26.6353 5.05547L26.7262 4.69162Z" fill="currentColor"/>
  22623. </svg>
  22624. </div>
  22625. <!-- 경기도 -->
  22626. <div class="mapdt gyeonggi-do" :class="getEventClass(mapDataInfo[8])">
  22627. <svg xmlns="http://www.w3.org/2000/svg" width="8.40906rem" height="10.97256rem" viewBox="0 0 136 177" fill="none">
  22628. <path d="M134.273 102.174L135.182 100.9L133.091 99.0808L122.637 98.535L121.364 97.8982L114.455 90.1663L105.637 90.712L103.728 88.8018L104.455 78.2499L101.819 74.7933L101.728 72.7011L105.364 67.5161L105.455 59.9661L106.364 58.4197L114.364 53.7805V45.4118L100.455 35.4057L99.7276 34.1322L99.0004 28.4015L94.9094 25.9455L88.0004 28.1286L86.4549 27.9467L83.4549 26.0364L82.7276 24.1262L84.0004 17.9406L83.1822 17.2129L80.4549 20.6695L77.7276 20.7605L70.9095 13.7562L70.364 12.8466L69.364 7.47969L66.1822 6.84294L64.7276 4.6598L65.7276 0.566406L55.1822 3.84112L53.364 11.2092H48.1822L44.8185 4.20498L40.1822 8.4803L36.0913 9.48091L30.0913 14.8478L29.5458 22.3069L34.364 25.1268L37.9095 22.3978L43.9095 29.1292L41.6367 33.6774L37.0913 31.0395L32.5458 36.0425L37.4549 40.5907L33.2731 47.504L29.5458 43.3196L28.2731 35.2238L16.5458 41.2275L25.7276 48.7775L25.0913 53.1438L19.4549 54.4173L22.2731 66.4246L20.0913 74.4294L17.7276 73.7927L17.8185 67.88L11.7276 60.5119L1.63672 69.3354L5.72763 88.347L17.4549 85.8L31.1822 92.0765L37.8185 97.8073L46.8185 94.8964L50.1822 85.3452L61.6367 83.4349L72.9094 75.2481L84.8185 76.2487L93.0913 91.4398L93.0004 101.537H100.728L96.5458 113.908L89.2731 119.912L77.5458 126.825L60.9095 127.916L46.5458 117.91L48.0913 113.271L42.5458 111.543L36.364 109.542L34.8185 114.272L33.4549 132.283L21.2731 126.279L2.27308 125.097L0.636719 134.102L7.00036 134.557L12.0913 145.473H16.8185L21.0913 141.015L25.5458 142.107L19.9094 148.838L21.8185 162.847L31.9094 173.399L59.1822 165.94L60.9095 166.303L71.6367 176.128L77.364 170.124L77.8185 169.851L84.8185 166.212L93.1822 157.662L95.364 157.389L99.1822 159.663L102.182 160.027L107.728 155.388V150.749L109.546 148.929H115.455L118.637 144.745L119.546 143.562L120.909 139.287L121.455 130.736L121.546 130.1L129.091 112.089L125.455 105.721L126.819 102.992L134.273 102.174Z" fill="currentColor"/>
  22629. </svg>
  22630. </div>
  22631. <!-- 강원 -->
  22632. <div class="mapdt kangwon" :class="getEventClass(mapDataInfo[9])">
  22633. <svg xmlns="http://www.w3.org/2000/svg" width="13.77275rem" height="12.80894rem" viewBox="0 0 222 205" fill="none">
  22634. <path d="M0.726562 36.6586L3.27202 37.1134L4.72657 38.5689L5.81748 44.6635L10.9084 49.8484L13.5448 46.5737L16.1811 46.3918L19.1811 49.1207L19.7266 50.8491L18.4538 56.8527L19.7266 57.6714L26.6357 55.4882L28.0902 55.6702L33.5448 58.9449L34.3629 60.2184L35.1811 66.0401L49.1811 76.2281L49.9084 77.6835V87.9625L48.9993 89.5089L40.9993 94.1481L40.9084 101.243L40.5447 102.244L37.3629 106.792L39.6357 109.703L39.9993 110.976L39.3629 120.073L46.9993 119.618L48.4538 120.255L55.4538 128.078L65.8175 128.624L66.9084 129.078L70.7266 132.353L70.9993 134.809L68.6357 138.084L67.3629 138.812L61.9084 139.448L64.6357 144.269L64.7266 145.907L56.9084 164.463L56.4538 172.923L56.3629 173.378L55.1811 177.017L58.9084 180.018L67.9993 180.564L73.9993 181.656L74.7266 179.836L72.5447 174.833L73.5448 172.377L81.8175 169.285L83.9084 169.921L88.272 176.289L88.5448 176.835L89.272 179.564L91.9993 179.745L101.727 173.651L103.817 173.833L107.454 176.835L117.999 178.745L119.454 180.564V183.748L118.363 185.385L115.09 186.841L118.636 185.931L120.545 186.659L124.727 192.662L133.545 192.026L134.272 192.117L146.09 196.483L146.636 196.756L149.363 199.03L150.09 198.848L150.454 199.94L154.454 203.214L157.454 202.759L157.181 199.485L158.545 197.574L165.817 195.846L167.545 196.392L172.272 201.759L174.636 198.939L175.908 198.302L180.727 198.12L181.908 198.484L186.454 202.123L191.999 199.485H193.636L204.272 204.943L212.454 195.3L213.545 194.664L221.09 193.39L220.09 185.203L204.636 147.726L158.636 70.4973L131.908 0C131.272 0 125.727 3.00182 125.727 3.00182L119.545 23.8327L105.363 35.2032H93.1811L83.5448 31.2008L79.1811 33.02L69.5447 32.6562L59.1811 30.2911L53.9993 32.2923H41.6357L32.3629 31.5646L27.1811 29.7453L12.8175 31.9285L8.18111 26.9254L1.9993 30.9279H2.18111L0.726562 36.6586Z" fill="currentColor"/>
  22635. </svg>
  22636. </div>
  22637. <!-- 충북 -->
  22638. <div class="mapdt chungbuk" :class="getEventClass(mapDataInfo[10])">
  22639. <svg xmlns="http://www.w3.org/2000/svg" width="8.8125rem" height="9.59675rem" viewBox="0 0 142 155" fill="none">
  22640. <path d="M33.7269 147.103L35.9996 147.467L41.2724 153.471L51.4542 152.834L51.636 152.288L57.9087 154.472L61.9996 147.74L64.3633 137.825L65.5451 136.552L70.9087 134.732V128.183L65.636 129.002L64.7269 128.911L53.7269 125.363L52.4542 123.635V119.632L52.7269 118.814L57.0906 110.445L55.3633 89.5231L49.5451 84.611L49.3633 82.064L52.9087 78.0616L54.9997 77.5158L61.1815 80.2447L63.8178 76.97L60.2724 72.3308L60.4542 69.8748L64.2724 66.3272L65.5451 65.7814H75.9087L77.0906 66.2362L79.3633 68.2374L79.636 66.6L76.9996 62.5976L77.0906 60.5055L80.0906 56.8669L82.7269 56.6849L83.5451 57.4127V55.2295L84.0906 53.8651L87.9087 50.3174L90.1815 50.1355L95.7269 54.138L96.9087 52.5915V48.862L99.9997 47.5885L110.272 58.7771L114 55.7753L116.091 55.6843L117.727 56.8669L119.363 52.6825L117 48.2253V46.7698L119.636 39.9475L121.091 38.8559L126.727 38.1282L132.272 30.9421L133.181 30.3053L141.363 27.8493L140.727 27.3944L129.636 23.2101L120.181 23.9378L118.636 23.1191L114.545 17.3884L107.545 19.2986L105.636 18.6619L103.909 16.2968L104.545 13.5679L112 10.2022V9.74736L102.454 8.01903L101.636 7.56421L98.636 5.10818L89.5451 10.8389L88.4542 11.1118L83.9087 10.8389L82.2724 9.47447L81.2724 5.8359L77.8178 0.923828L72.636 2.83407L74.3633 6.74554V8.20097L72.8178 12.1124L70.8178 13.204L63.5451 11.9305L54.1815 11.2938L53.1815 10.9299L49.4542 8.01903L45.8178 12.8401L44.3633 13.5679H39.3633V17.2064L38.7269 18.5709L31.9087 24.3017L30.5451 24.7565L26.3633 24.2107L25.636 23.9378L22.7269 22.2095L15.2724 29.9414L14.8178 30.3053L7.72692 33.8529L2.09056 39.7656L15.8178 57.9585L16.1815 59.05V62.7796L13.5451 64.4169L6.81783 61.2332L0.363281 68.1464L6.63602 93.2526L11.9087 97.255L15.9996 95.3448L18.4542 96.5273L20.0906 102.622H23.4542L25.1815 104.441V108.717L24.1815 110.354L20.2724 112.082L17.9087 121.361L19.636 123.726H23.4542L25.1815 125.09L30.4542 148.741H30.9087L33.7269 147.103Z" fill="currentColor"/>
  22641. </svg>
  22642. </div>
  22643. <!-- 충남 -->
  22644. <div class="mapdt chungnam" :class="getEventClass(mapDataInfo[11])">
  22645. <svg xmlns="http://www.w3.org/2000/svg" width="9.26706rem" height="8.92588rem" viewBox="0 0 149 144" fill="none">
  22646. <path d="M148.726 134.741L146.362 124.098L144.271 126.372C144.271 126.372 135.18 131.193 134.544 131.011C133.908 130.83 128.908 128.374 128.908 128.374L123.362 123.461L111.726 121.642L105.999 112.91L101.18 99.8107L110.271 92.0788L104.544 88.0763L101.999 77.6154L90.544 68.7009L87.6349 53.237L93.2713 44.2315L111.635 49.2346H118.817L120.271 50.3261L126.999 43.8677L129.089 43.5038L134.544 46.0508V45.7779L120.362 26.8573L109.271 16.6693L84.3622 23.4917L77.2713 31.0417L73.4531 16.0326L56.4531 4.38916L52.4531 0.386719L40.6349 0.568658L42.8168 8.20966L40.6349 11.5753L34.8168 1.93312L23.6349 8.75545L32.9986 15.7597L32.8168 21.3995L27.9986 27.4031L23.6349 25.4019L22.4531 10.7567L13.2713 17.579L0.453125 33.9526L1.81676 37.7731L6.63494 35.7718L7.81676 39.1375L7.99858 43.3219L12.1804 42.5032L15.3622 56.5117H18.1804L20.3622 49.3255L23.9986 56.5117L30.1804 55.5111L33.9986 49.1436L36.6349 52.9641L35.8168 83.2552L41.8168 87.2576V91.442H36.4531L37.4531 108.634L31.8168 113.637L32.8168 117.458H39.9986L54.0895 135.651L67.3622 128.464L69.8168 119.641L71.3622 118.367L89.1804 116.73L91.0895 118.004L94.1804 127.737C100.18 128.192 108.089 128.828 109.999 128.919C110.999 128.192 113.635 125.736 115.726 123.643H118.271L124.908 130.284L125.453 131.557V137.288L126.908 136.651L128.635 136.742L131.544 138.652L132.362 140.199V142.2L136.908 143.201L138.908 138.471L140.453 137.379L144.089 137.106L145.544 137.743L145.453 137.288L147.18 135.014H148.726V134.741Z" fill="currentColor"/>
  22647. </svg>
  22648. </div>
  22649. <!-- 전북 -->
  22650. <div class="mapdt jeonbuk" :class="getEventClass(mapDataInfo[12])">
  22651. <svg xmlns="http://www.w3.org/2000/svg" width="9.71025rem" height="6.85644rem" viewBox="0 0 156 110" fill="none">
  22652. <path d="M7.63707 94.6983L7.09162 100.793L10.0916 101.43L17.3643 102.157L27.9098 93.4248L28.6371 85.238L29.8189 83.6916L38.3643 80.7808L40.6371 81.7813L41.728 84.6012L46.8189 84.4193L48.6371 85.6019L51.1825 92.97L52.4553 93.1519L57.5462 84.4193L59.6371 83.6006L65.2734 85.5109L66.3643 87.9669L63.6371 93.6977L64.0007 103.977L66.728 105.432L74.8189 101.066L77.4553 102.703V104.977L78.728 104.522L80.6371 104.977L83.0916 107.524L93.6371 108.343L100.728 104.613L101.455 104.431L112.91 103.795L114.273 104.341L119.819 109.98L125.546 95.2441L123.91 91.3326L122.364 85.0561L119.092 81.1446L118.819 79.3253L128.546 56.9481L128.819 56.4933L139.728 44.2131L141.637 43.6673L145.91 45.2137L154.455 37.0269L155.637 28.7492L153.364 22.4726L142.455 23.2003L141.001 22.5636L136.092 17.0148L134.183 18.1063L133.273 18.3792H131.092L129.637 18.7431L131.273 24.6558L128.183 26.2931L123.455 20.5624L121.91 20.6533L119.819 25.7474L117.728 26.8389L110.273 25.2016L108.819 23.4732V21.0172L107.546 20.1985L104.455 21.654L101.91 20.0166V12.1936L97.0916 7.37255C91.9098 12.4666 91.0916 12.4666 90.4553 12.4666C89.6371 12.4666 76.6371 11.4659 72.728 11.1021L71.1825 9.8286L68.1825 0.277344L53.0007 1.64181L50.6371 10.0105L49.728 11.1021L34.4553 19.3799L33.1825 17.1057L18.728 18.1973L13.728 21.1991L14.3643 23.8371H19.5462L23.9098 30.4775L31.0916 33.1154L43.728 29.7498L43.3643 33.1154L32.0007 35.9353V38.3004L38.8189 43.3035L38.1825 47.4878L32.1825 43.6673H26.1825L17.1825 53.8553L6.54616 59.0403V67.0452L23.9098 68.0458L25.728 70.8656L21.9098 73.5036H14.2734L0.273438 84.1464C1.9098 86.4205 4.63707 90.1501 7.18253 93.6067L7.63707 94.6983Z" fill="currentColor"/>
  22653. </svg>
  22654. </div>
  22655. <!-- 전남 -->
  22656. <div class="mapdt jeonnam" :class="getEventClass(mapDataInfo[13])">
  22657. <svg xmlns="http://www.w3.org/2000/svg" width="10.01138rem" height="9.18738rem" viewBox="0 0 161 148" fill="none">
  22658. <path d="M158.547 94.0205L157.365 89.1084L142.547 89.2904L141.092 84.0144L151.638 79.921L152.729 74.7361L153.365 73.7354L160.729 67.7318L158.547 60.1818L151.365 55.1787L150.547 53.7233V48.3564L147.001 47.6287L145.547 45.9913L144.092 30.2545L143.456 29.9816L143.729 29.3449L137.638 23.1593L127.365 23.796L120.092 27.6165L119.092 27.7985L107.365 26.8888L106.183 26.3431L104.092 24.1599L101.456 25.0695L99.0014 23.3412V21.5219L92.7287 24.8876H91.0014L86.456 22.5225L85.456 20.9761L85.1833 9.33272L85.3651 8.42307L87.456 4.14774L85.1833 3.42004L80.1832 11.8797L78.456 12.7893L74.8196 12.4255L73.2741 11.243L70.8196 4.14774L65.7287 4.32968L64.0014 3.2381L63.0014 0.873047L57.1832 2.87425L56.456 10.6062L55.8196 11.8797L44.0923 21.6129L42.7287 21.9768L34.456 21.1581L29.8196 20.2484L28.3651 18.3382L29.0014 11.243C27.1832 8.78694 24.7287 5.42125 23.0014 2.96521L16.6378 16.9737L7.63778 26.9798L23.456 46.3552L19.456 52.7227L14.456 45.7184L11.5469 47.7197L13.0014 52.7227L7.36506 60.2727L9.27415 66.0944L14.0014 64.0932L15.2741 67.186L11.2741 75.4638L12.7287 82.9229L8.00142 89.3813L10.3651 94.2024L27.8196 97.659L27.5469 102.935H23.3651L12.3651 95.7488L11.1832 97.75L14.8196 105.573L13.5469 108.939L10.1832 106.755L7.54688 92.1102L0.546875 91.2915V107.756L4.72869 114.578L12.8196 116.762L19.1832 129.86V135.045L18.9105 147.871H30.5469L33.7287 136.137L44.0923 133.863L48.456 128.951L49.5469 114.578L52.1832 114.396L52.456 135.773L68.2741 132.953L73.0923 126.768L73.3651 117.125L76.6378 111.94L108.638 97.659L113.456 100.661L110.001 111.395L105.82 103.39L100.456 103.663L98.3651 112.668L95.456 116.398L88.1832 115.761L84.9105 126.95L98.6378 124.675L101.82 129.406L103.274 142.323L117.729 130.861L119.456 121.401L122.365 123.402L129.638 121.674L129.365 113.669L120.001 108.302L120.82 93.0199L129.911 88.1078L136.638 93.5656L134.547 114.578L144.183 117.762L142.911 109.848L148.092 106.483L158.911 108.848L159.274 106.392L156.365 103.026L158.547 94.0205ZM88.9105 64.4571L79.5469 69.2782L65.8196 69.915C65.8196 69.915 56.8196 67.7318 55.8196 67.277C54.7287 66.8222 43.0923 67.186 42.8196 67.0041C42.5469 66.8222 38.3651 54.2691 38.3651 54.2691L43.7287 49.539L45.5469 43.1715L54.9105 37.8045L67.6378 38.7142L82.1832 40.2606L87.7287 49.357L93.5469 54.1781L88.9105 64.4571Z" fill="currentColor"/>
  22659. </svg>
  22660. </div>
  22661. <!-- 경북 -->
  22662. <div class="mapdt gyeongbuk" :class="getEventClass(mapDataInfo[14])">
  22663. <svg xmlns="http://www.w3.org/2000/svg" width="11.35794rem" height="12.03569rem" viewBox="0 0 182 194" fill="none">
  22664. <path d="M180.273 136.292L168.546 147.935L160.273 141.204L160.364 137.111L162.819 132.835L163.001 102.908L172.183 84.7151L172.364 81.4404L170.364 75.6187L174.364 54.7878L172.91 17.4015L165.092 0.664062L158.001 1.75563L149.364 11.9436L147.092 12.3985L136.001 6.66771L130.273 9.4876L128.364 9.21472L123.455 5.3942L120.183 5.48517L116.91 9.30567H114.183L108.819 3.21107L104.092 4.30263L104.364 7.66831L102.91 9.57857L97.3644 10.4882L95.9098 10.1244L91.728 6.66771L81.728 9.57857L76.0916 16.9467L74.9098 17.5834L69.5462 18.3111L67.6371 23.3142L69.9098 27.7714L70.0007 29.2269L67.3644 36.2311L64.6371 37.1407L62.1825 35.5034L58.2735 38.5962L55.728 38.4143L47.4553 29.4088L47.1825 30.3184L44.5462 33.6841L42.0916 34.048L36.2734 29.9546L34.0916 31.9558V37.4137L31.0916 38.7781L28.728 36.595L27.728 37.7775L30.0007 41.2341L30.2734 42.5077L29.5462 48.0565L26.5462 49.148L22.2735 45.4185H13.2734L11.1825 47.4197L14.5462 51.9679V54.1511L10.0916 59.518L8.00071 60.0638L1.72799 57.4258L0.273438 59.0631L5.27344 63.2475L5.90981 64.43L7.72799 86.7163L7.54617 87.6259L3.09163 96.0856V98.2688L12.4553 101.362L19.4553 100.27L21.5462 101.998V112.004L20.2734 113.733L14.6371 115.643L12.4553 124.83L12.2734 125.376L7.27345 133.563L5.18254 134.291L2.72799 133.472L4.36435 137.929L4.45526 138.839L3.18254 147.208L11.3644 155.121L20.1825 154.849L21.8189 155.758L23.6371 158.942H26.3644L28.0007 159.943L34.6371 174.042L34.0007 176.316L29.2734 179.409L29.5462 180.591L49.728 187.323L51.5462 186.595L46.9098 178.226L50.9098 171.768L55.1825 171.859L53.1825 165.037L58.2735 158.123L60.4553 157.85L52.0007 153.211L57.1825 139.93L69.728 130.743L79.728 134.2L92.0916 122.01L111.092 122.192L117.455 132.562L117.91 146.025L109.455 150.118L103.001 160.67L98.3643 165.4L104.183 174.952L97.5462 182.684L85.2734 184.321L78.0007 181.592L74.0007 189.506L73.5462 191.234L74.3644 192.599L79.9098 190.689H81.0007L90.1825 193.236L118.91 187.05L124.092 180.137L125.455 179.409L141.91 178.317L143.819 180.137V189.324L149.273 190.416L152.546 185.504L154.91 184.958L165.91 190.598L166.364 188.141L170.364 181.046L182.001 139.294L180.273 136.292Z" fill="currentColor"/>
  22665. </svg>
  22666. </div>
  22667. <!-- 경남 -->
  22668. <div class="mapdt gyeongnam" :class="getEventClass(mapDataInfo[15])">
  22669. <svg xmlns="http://www.w3.org/2000/svg" width="9.66475rem" height="9.52281rem" viewBox="0 0 156 153" fill="none">
  22670. <path d="M100.729 94.8136L102.82 82.5334L124.183 85.1713L133.183 80.6231L144.365 82.1695L146.092 78.5309L152.456 74.4376L155.183 73.6189L150.365 62.6122L143.183 62.3393L139.638 52.6971L146.729 48.1488L148.911 41.4175L123.456 46.8753H122.638L113.547 44.3284L107.183 46.5115L105.001 45.7838L98.3651 34.7771L83.5469 40.8717L82.2742 40.9627L60.456 33.7765L59.1832 32.412L58.456 28.9554L59.1832 27.0451L63.7287 24.1343L58.2741 12.4908H55.6378L54.0923 11.6722L52.2742 8.48842L43.7287 8.76131L42.3651 8.30648L34.2742 0.392578L25.7287 8.57937L23.9105 8.94325L19.7287 7.48781L9.7287 18.5854L0.819605 39.4163L3.63779 42.8729L4.00142 43.6006L5.63779 50.1501L7.45597 54.2435V55.6079L0.546875 73.255L2.00143 88.2641L5.63779 89.0828L7.09234 90.8111V96.7238L14.0014 101.454L14.7287 102.455L17.456 111.824L16.8196 113.734L9.09234 120.102L8.00143 125.378L13.8196 129.107L16.2741 124.195L29.7287 117.373L37.0014 119.647L43.1832 108.913L46.1832 111.369L43.456 119.374L45.5469 128.47L65.9105 130.381L71.0923 125.832L74.0923 127.834L68.456 132.473L72.1832 136.02L77.2742 133.11L78.7287 135.566L71.5469 143.116L72.6378 145.208L76.1833 145.572L78.6378 152.758L85.7287 149.301L83.3651 140.751L87.0014 131.017L83.9105 131.381L83.5469 123.831L90.6378 117.009V114.28L89.1832 109.55L98.2741 106.548L99.7287 113.097L106.547 108.822L100.547 99.0889L100.729 94.8136Z" fill="currentColor"/>
  22671. </svg>
  22672. </div>
  22673. <!-- 제주 -->
  22674. <div class="mapdt jeju" :class="getEventClass(mapDataInfo[16])">
  22675. <svg xmlns="http://www.w3.org/2000/svg" width="2.84094rem" height="2.03531rem" viewBox="0 0 46 33" fill="none">
  22676. <path d="M41.4545 0.435547L22.8182 4.07412L9.36364 11.3513L1.90909 21.5393L0 33.0008H9.81818L13.2727 28.4525L31.2727 20.9935L41.4545 19.629L45.4545 7.53075L41.4545 0.435547Z" fill="currentColor"/>
  22677. </svg>
  22678. </div>
  22679. </div>
  22680. <!-- 우측 레이아웃 -->
  22681. <div class="map--sub--info">
  22682. <div class="titles">
  22683. <h2>전국</h2>
  22684. </div>
  22685. <div class="status--row">
  22686. <ul>
  22687. <li>
  22688. <div>
  22689. <i class="icon"></i>
  22690. CRITICAL
  22691. </div>
  22692. <div class="current--data">{{criTotal}}</div>
  22693. </li>
  22694. <li>
  22695. <div>
  22696. <i class="icon"></i>
  22697. MAJOR
  22698. </div>
  22699. <div class="current--data">{{majTotal}}</div>
  22700. </li>
  22701. <li>
  22702. <div>
  22703. <i class="icon"></i>
  22704. MINOR
  22705. </div>
  22706. <div class="current--data">{{minTotal}}</div>
  22707. </li>
  22708. </ul>
  22709. </div>
  22710. <!-- status--row -->
  22711. <!-- 우측 하단 -->
  22712. <div class="status--list">
  22713. <ul>
  22714. <li>
  22715. <div class="drp--header type1">
  22716. <div class="drp--titles">테넌트 수</div>
  22717. <div class="drp--current--data">
  22718. <span class="current--value">{{tenantCntObj.tenantTotal}}</span>
  22719. <v-btn class="custom-btn mini drop--btn" @click="drpType1();" :style="tenantCntObj.tenantTotal==0? 'visibility:hidden;':''"></v-btn>
  22720. </div>
  22721. </div>
  22722. <div class="drp--content type1">
  22723. <ul>
  22724. <li v-for="(item, idx) in tenantCntObj.areaInfoList" :key="idx">{{item.areaName}}<span>({{item.tenantList.length}})</span></li>
  22725. </ul>
  22726. </div>
  22727. </li>
  22728. <li>
  22729. <div class="drp--header type2">
  22730. <div class="drp--titles">NE 그룹 수</div>
  22731. <div class="drp--current--data">
  22732. <span class="current--value">{{getNeGroupCntInfo.length}}</span>
  22733. <v-btn class="custom-btn mini drop--btn" @click="drpType2();" :style="getNeGroupCntInfo.length==0? 'visibility:hidden;':''"></v-btn>
  22734. </div>
  22735. </div>
  22736. <div class="drp--content type2">
  22737. <ul>
  22738. <li v-for="(item, idx) in getNeGroupCntInfo" :key="idx" @click="fnClickNeGroup(item)" style="cursor:pointer;"><div class="li--l">{{item.neGroup}}</div><div class="li--r"><span>NE : {{item.neList.length}}</span><i class="alarm" :class="getNeEventCls(item)"></i></div></li>
  22739. </ul>
  22740. </div>
  22741. </li>
  22742. <li>
  22743. <div class="drp--header type3">
  22744. <div class="drp--titles">NE 수</div>
  22745. <div class="drp--current--data">
  22746. <span class="current--value">{{getNeCntInfo.length}}</span>
  22747. <v-btn class="custom-btn mini drop--btn" @click="drpType3();" :style="getNeCntInfo.length==0? 'visibility:hidden;':''"></v-btn>
  22748. </div>
  22749. </div>
  22750. <div class="drp--content type3">
  22751. <ul>
  22752. <li v-for="(item, idx) in getNeCntInfo" :key="idx" @click="fnClickNe(item)" style="cursor:pointer;"><div class="li--l">{{item.neName}}</div><div class="li--r">{{item.tenantName}}</div></li>
  22753. </ul>
  22754. </div>
  22755. </li>
  22756. </ul>
  22757. </div>
  22758. </div>
  22759. </div>
  22760. <!-- RAN 카드형 -->
  22761. <div class="inner--content" v-if="shapeMap == false" >
  22762. <ul class="ran--card">
  22763. <!-- ran--all, ran--blue, ran--red -->
  22764. <li v-for="(item, idx) in cardRanInfo" :key="idx" :class="item.cls">
  22765. <div class="ran--title">
  22766. <span class="ran--area">{{item.areaName}}</span>
  22767. <v-btn class="more--btn" flat @click="fnClickCardDetail(item, idx)"></v-btn>
  22768. </div>
  22769. <div class="ran--stat">
  22770. <p>
  22771. <span>테넌트 수</span><span>{{item.tenantCnt}}</span>
  22772. </p>
  22773. <p>
  22774. <span>NE그룹 수</span><span>{{item.neGroupCnt}}</span>
  22775. </p>
  22776. <p>
  22777. <span>NE 수</span><span>{{item.neCnt}}</span>
  22778. </p>
  22779. </div>
  22780. </li>
  22781. </ul>
  22782. </div>
  22783. <!-- 그룹 수 상세 모달 -->
  22784. <RanMapGroupDetailModal v-if="isShowRanMapDetailModal" :neGroupInfo="propsNeGroupInfo" :centerPosition="centerPosition" @closeModal="isShowRanMapDetailModal = false"/>
  22785. <!-- NE 수 상세 모달 -->
  22786. <RanMapNeDetailModal v-if="isShowRanMapNeDetailModal" :neInfo="propsNeInfo" :centerPosition="centerPosition" @closeModal="isShowRanMapNeDetailModal = false"/>
  22787. <!-- 카드형 UI 현황 모달 -->
  22788. <RanCardGroupDetailModal v-if="isShowRanCardGroupDetailModal" :propsObj="propsCardObj" :centerPosition="centerPosition" @closeModal="isShowRanCardGroupDetailModal = false"/>
  22789. </div>
  22790. <!-- 지역 확대 : S -->
  22791. <div class="map--contents--wrap map--t" v-if="isDetailMap">
  22792. <div class="header--wrapper">
  22793. <div class="titles">
  22794. <span>RAN</span>
  22795. </div>
  22796. <div class="control--wrap">
  22797. <v-btn class="custom-btn mini map--btn" :class="{ on: shapeMap }" @click="shapeMap = true">
  22798. <i class="icon"></i>지도
  22799. </v-btn>
  22800. <v-btn class="custom-btn mini card--btn" :class="{ on: !shapeMap }" @click="shapeMap = false">
  22801. <i class="icon"></i>카드
  22802. </v-btn>
  22803. </div>
  22804. </div>
  22805. <div class="inner--content--wrapper" v-if="shapeMap == true">
  22806. <div class="map--wrappers">
  22807. <!-- 맵 데이터 -->
  22808. <div class="map--text">
  22809. <div class="map--text--inner" :class="currMapData.cls">
  22810. <div class="title">{{currMapData.areaName}} <span>({{ currMapData.neInfoList.length }})</span></div>
  22811. <div class="status">
  22812. <span class="critical">{{ currMapData.criCnt }}</span>
  22813. <span class="major">{{ currMapData.majCnt }}</span>
  22814. <span class="minor">{{ currMapData.minCnt }}</span>
  22815. </div>
  22816. </div>
  22817. </div>
  22818. <!-- 맵 백터 이미지 -->
  22819. <div class="mapdt" :class="[currMapData.cls, getEventClass(currMapData)]">
  22820. <component :is="getCurrMapComponent" />
  22821. </div>
  22822. </div>
  22823. <div class="map--sub--info">
  22824. <div class="titles">
  22825. <h2><i @click="fnAllAreaClick" style="cursor:pointer;">전국</i><span>{{currMapData.areaName}}</span></h2>
  22826. <!-- <v-btn class="custom-btn mini more--plus--btn"></v-btn> -->
  22827. </div>
  22828. <div class="status--row">
  22829. <ul>
  22830. <li>
  22831. <div>
  22832. <i class="icon"></i>
  22833. CRITICAL
  22834. </div>
  22835. <div class="current--data">{{currMapData.criCnt}}</div>
  22836. </li>
  22837. <li>
  22838. <div>
  22839. <i class="icon"></i>
  22840. MAJOR
  22841. </div>
  22842. <div class="current--data">{{ currMapData.majCnt }}</div>
  22843. </li>
  22844. <li>
  22845. <div>
  22846. <i class="icon"></i>
  22847. MINOR
  22848. </div>
  22849. <div class="current--data">{{ currMapData.minCnt }}</div>
  22850. </li>
  22851. </ul>
  22852. </div><!-- status--row -->
  22853. <!-- 우측 하단 -->
  22854. <div class="status--list">
  22855. <ul>
  22856. <li>
  22857. <div class="drp--header type1">
  22858. <div class="drp--titles">테넌트 수</div>
  22859. <div class="drp--current--data">
  22860. <span class="current--value">{{tenantCntObjCopy.tenantTotal}}</span>
  22861. <!-- 상세 지역의 테넌트 수 드랍버튼 미노출 -->
  22862. <v-btn class="custom-btn mini drop--btn" style="background:none; pointer-events:none;"></v-btn>
  22863. </div>
  22864. </div>
  22865. <div class="drp--content type1">
  22866. <ul>
  22867. <li v-for="(item, idx) in tenantCntObjCopy.areaInfoList" :key="idx">{{item.areaName}}<span>({{item.tenantList.length}})</span></li>
  22868. </ul>
  22869. </div>
  22870. </li>
  22871. <li>
  22872. <div class="drp--header type2">
  22873. <div class="drp--titles">NE 그룹 수</div>
  22874. <div class="drp--current--data">
  22875. <span class="current--value">{{getAreaNeGroupCntInfo.length}}</span>
  22876. <v-btn class="custom-btn mini drop--btn" @click="drpType2();" :style="getAreaNeGroupCntInfo.length == 0 ? 'visibility:hidden;':''"></v-btn>
  22877. </div>
  22878. </div>
  22879. <div class="drp--content type2">
  22880. <ul>
  22881. <li v-for="(item, idx) in getAreaNeGroupCntInfo" :key="idx" @click="fnClickNeGroup(item)" style="cursor:pointer;"><div class="li--l">{{item.neGroup}}</div><div class="li--r"><span>NE : {{item.neList.length}}</span><i class="alarm" :class="getNeEventCls(item)"></i></div></li>
  22882. </ul>
  22883. </div>
  22884. </li>
  22885. <li>
  22886. <div class="drp--header type3">
  22887. <div class="drp--titles">NE 수</div>
  22888. <div class="drp--current--data">
  22889. <span class="current--value">{{getAreaNeCntInfo.length}}</span>
  22890. <v-btn class="custom-btn mini drop--btn" @click="drpType3();" :style="getAreaNeCntInfo.length == 0 ? 'visibility:hidden;':''"></v-btn>
  22891. </div>
  22892. </div>
  22893. <div class="drp--content type3">
  22894. <ul>
  22895. <li v-for="(item, idx) in getAreaNeCntInfo" :key="idx" @click="fnClickNe(item)" style="cursor:pointer;"><div class="li--l">{{item.neName}}</div><div class="li--r">{{item.tenantName}}</div></li>
  22896. </ul>
  22897. </div>
  22898. </li>
  22899. </ul>
  22900. </div>
  22901. </div>
  22902. </div>
  22903. <!-- RAN 카드형 -->
  22904. <div class="inner--content" v-if="shapeMap == false" >
  22905. <ul class="ran--card">
  22906. <!-- ran--all, ran--blue, ran--red -->
  22907. <li v-for="(item, idx) in cardRanInfo" :key="idx" :class="item.cls">
  22908. <div class="ran--title">
  22909. <span class="ran--area">{{item.areaName}}</span>
  22910. <v-btn class="more--btn" flat @click="fnClickCardDetail(item, idx)"></v-btn>
  22911. </div>
  22912. <div class="ran--stat">
  22913. <p>
  22914. <span>테넌트 수</span><span>{{item.tenantCnt}}</span>
  22915. </p>
  22916. <p>
  22917. <span>NE그룹 수</span><span>{{item.neGroupCnt}}</span>
  22918. </p>
  22919. <p>
  22920. <span>NE 수</span><span>{{item.neCnt}}</span>
  22921. </p>
  22922. </div>
  22923. </li>
  22924. </ul>
  22925. </div>
  22926. </div>
  22927. </div>
  22928. </template>
  22929. <script setup>
  22930. /***********************
  22931. * import
  22932. ************************/
  22933. import { useI18n } from "vue-i18n"
  22934. import apiUrl from '@/composables/useApi';
  22935. import useAxios from '@/composables/useAxios';
  22936. import useUtil from '@/composables/useUtil';
  22937. import RanMapGroupDetailModal from '@/components/home/dashboard/common/ranMapGroupDetailModal.vue';
  22938. import RanMapNeDetailModal from '@/components/home/dashboard/common/ranMapNeDetailModal.vue';
  22939. import RanCardGroupDetailModal from '@/components/home/dashboard/common/ranCardGroupDetailModal.vue';
  22940. import mapSeoul from "@/components/home/dashboard/common/map/mapSeoul.vue";
  22941. import mapBusan from "@/components/home/dashboard/common/map/mapBusan.vue";
  22942. import mapDaegu from "@/components/home/dashboard/common/map/mapDaegu.vue";
  22943. import mapIncheon from "@/components/home/dashboard/common/map/mapIncheon.vue";
  22944. import mapGwangju from "@/components/home/dashboard/common/map/mapGwangju.vue";
  22945. import mapDaejeon from "@/components/home/dashboard/common/map/mapDaejeon.vue";
  22946. import mapUlsan from "@/components/home/dashboard/common/map/mapUlsan.vue";
  22947. import mapSejong from "@/components/home/dashboard/common/map/mapSejong.vue";
  22948. import mapGyeonggido from "@/components/home/dashboard/common/map/mapGyeonggido.vue";
  22949. import mapKangWon from "@/components/home/dashboard/common/map/mapKangwon.vue";
  22950. import mapChungbuk from "@/components/home/dashboard/common/map/mapChungbuk.vue";
  22951. import mapChungnam from "@/components/home/dashboard/common/map/mapChungnam.vue";
  22952. import mapJeonbuk from "@/components/home/dashboard/common/map/mapJeonbuk.vue";
  22953. import mapJeonnam from "@/components/home/dashboard/common/map/mapJeonnam.vue";
  22954. import mapGyeongbuk from "@/components/home/dashboard/common/map/mapGyeongbuk.vue";
  22955. import mapGyeongnam from "@/components/home/dashboard/common/map/mapGyeongnam.vue";
  22956. import mapJeju from "@/components/home/dashboard/common/map/mapJeju.vue";
  22957. /***********************
  22958. * plugins inject
  22959. ************************/
  22960. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  22961. // props
  22962. const props = defineProps({})
  22963. // 참조가능 데이터 설정
  22964. defineExpose({})
  22965. // 발신 이벤트 선언
  22966. const emit = defineEmits([""]);
  22967. const i18n = useI18n();
  22968. /***********************
  22969. * data & created
  22970. ************************/
  22971. const isShowRanMapDetailModal = ref(false)
  22972. const isShowRanMapNeDetailModal = ref(false)
  22973. const isShowRanCardGroupDetailModal = ref(false)
  22974. // 카카오맵 센터좌표
  22975. const centerPosition = ref({
  22976. lat: 33.450701,
  22977. lng: 126.570667
  22978. })
  22979. const ranInterval = ref(null)
  22980. const shapeMap = ref(true) // 지도형, 카드형
  22981. const drpType1 = () => toggleActive('type1')
  22982. const drpType2 = () => toggleActive('type2')
  22983. const drpType3 = () => toggleActive('type3')
  22984. const sidoCode = ref([]) // 시도 코드 데이터 (title배열 형태인 이유: 지도는 인덱스1, 테넌트 수: 인덱스0 사용)
  22985. const mapDataInfo = ref([]) // 지도 데이터
  22986. const criTotal = ref(0) // 전국 CRITICAL TOTAL
  22987. const majTotal = ref(0) // 전국 MAJOR TOTAL
  22988. const minTotal = ref(0) // 전국 MINOR TOTAL
  22989. // 전국 테넌트 수 데이터
  22990. const tenantCntObj = ref({
  22991. tenantTotal: 0,
  22992. areaInfoList: []
  22993. })
  22994. // 지역 > 테넌트 수 데이터
  22995. const tenantCntObjCopy = ref({
  22996. tenantTotal: 0,
  22997. areaInfoList: []
  22998. })
  22999. const cardRanInfo = ref([]) // 카드형 데이터
  23000. const propsNeGroupInfo = ref({}) // NE그룹상세팝업 정보
  23001. const propsNeInfo = ref({}) // NE상세팝업 정보
  23002. const propsCardObj = ref({}) // 카드형 상세팝업 정보
  23003. const myDatas = ref([]) // 전국 > 테넌트|그룹|NE 객체배열 merge
  23004. const areaNewData = ref([]) // 지역 > 테넌트|그룹|NE 객체배열
  23005. const currMapData = ref({}) // 현재 상세 지역 데이터
  23006. const isDetailMap = ref(false) // 상세 지역 노출여부
  23007. // 현재 상세 지역 컴포넌트 조회
  23008. const getCurrMapComponent = computed(() => {
  23009. let areaCode = currMapData.value.areaCode
  23010. if(areaCode == 11) return mapSeoul
  23011. else if(areaCode == 21) return mapBusan
  23012. else if(areaCode == 22) return mapDaegu
  23013. else if(areaCode == 23) return mapIncheon
  23014. else if(areaCode == 24) return mapGwangju
  23015. else if(areaCode == 25) return mapDaejeon
  23016. else if(areaCode == 26) return mapUlsan
  23017. else if(areaCode == 29) return mapSejong
  23018. else if(areaCode == 31) return mapGyeonggido
  23019. else if(areaCode == 32) return mapKangWon
  23020. else if(areaCode == 33) return mapChungbuk
  23021. else if(areaCode == 34) return mapChungnam
  23022. else if(areaCode == 35) return mapJeonbuk
  23023. else if(areaCode == 36) return mapJeonnam
  23024. else if(areaCode == 37) return mapGyeongbuk
  23025. else if(areaCode == 38) return mapGyeongnam
  23026. else if(areaCode == 39) return mapJeju
  23027. })
  23028. // 전국 > NE 그룹 수 데이터
  23029. const getNeGroupCntInfo = computed(() => {
  23030. let result = []
  23031. myDatas.value.forEach((item) => {
  23032. item.neGroupList.forEach((item2) => {
  23033. result.push(item2)
  23034. })
  23035. })
  23036. return result
  23037. })
  23038. // 지역 상세 > NE 그룹 수 데이터
  23039. const getAreaNeGroupCntInfo = computed(() => {
  23040. let result = []
  23041. areaNewData.value.forEach((item) => {
  23042. item.neGroupList.forEach((item2) => {
  23043. result.push(item2)
  23044. })
  23045. })
  23046. return result
  23047. })
  23048. // NE 그룹 수 > 이벤트 단계 클래스
  23049. const getNeEventCls = computed(() => {
  23050. return (obj) => {
  23051. let eventCls = ''
  23052. if(!_isEmpty(obj)) {
  23053. if(obj.minCnt > 0) eventCls = 'green'
  23054. if(obj.majCnt > 0) eventCls = 'blue'
  23055. if(obj.criCnt > 0) eventCls = 'red'
  23056. }
  23057. return eventCls
  23058. }
  23059. })
  23060. // 전국 NE 수 데이터 배열
  23061. const getNeCntInfo = computed(() => {
  23062. let result = []
  23063. myDatas.value.forEach((tenant) => {
  23064. tenant.neGroupList.forEach((group) => {
  23065. group.neList.forEach((ne) => {
  23066. result.push(ne)
  23067. })
  23068. })
  23069. })
  23070. return result
  23071. })
  23072. // 지역 NE 수 데이터
  23073. const getAreaNeCntInfo = computed(() => {
  23074. let result = []
  23075. areaNewData.value.forEach((tenant) => {
  23076. tenant.neGroupList.forEach((group) => {
  23077. group.neList.forEach((ne) => {
  23078. result.push(ne)
  23079. })
  23080. })
  23081. })
  23082. return result
  23083. })
  23084. // 지도 > 이벤트 상태에 따른 테두리 컬러 클래스 조회
  23085. const getEventClass = computed(() => {
  23086. return (obj) => {
  23087. let eventCls = ''
  23088. if(!_isEmpty(obj)) {
  23089. if(obj.minCnt > 0) eventCls = 'minor'
  23090. if(obj.majCnt > 0) eventCls = 'major'
  23091. if(obj.criCnt > 0) eventCls = 'critical'
  23092. }
  23093. return eventCls
  23094. }
  23095. })
  23096. // 카드형 > 테두리 이벤트 스타일
  23097. const getCardEventClass = computed(() => {
  23098. return (obj) => {
  23099. let eventCls = ''
  23100. if(!_isEmpty(obj)) {
  23101. if(obj.minCnt > 0) eventCls = ''
  23102. if(obj.majCnt > 0) eventCls = ''
  23103. if(obj.criCnt > 0) eventCls = 'ran--red'
  23104. }
  23105. return eventCls
  23106. }
  23107. })
  23108. onMounted(() => {
  23109. fnGeoTenantNeInfo()
  23110. // fnGeoTenantInfo()
  23111. ranInterval.value = setInterval(() => {
  23112. fnGeoTenantNeInfo()
  23113. }, 1000 * 60 * 5)
  23114. })
  23115. onUnmounted(() => {
  23116. clearInterval(ranInterval.value)
  23117. ranInterval.value = null
  23118. })
  23119. watchEffect(() =>{
  23120. fnGetEnumCode(useLangStore().getLang)
  23121. })
  23122. /**
  23123. * ENUM 업데이트
  23124. * @param lang
  23125. */
  23126. function fnGetEnumCode(lang){
  23127. let objEnum = useEnumCode.getEnumCode(lang)
  23128. // ...objEnum.sidoCode
  23129. sidoCode.value = _cloneDeep(objEnum.sidoCode.slice(1))
  23130. fnSetInitMapData()
  23131. }
  23132. /***********************
  23133. * Methods
  23134. ************************/
  23135. // 초기 데이터 세팅
  23136. function fnSetInitMapData(){
  23137. let tempMapData = []
  23138. let tempTenantData = []
  23139. let tempCardRanData = [{areaName: '전국현황', areaCode: 0, cls: 'ran--all', criCnt: 0, majCnt: 0, minCnt: 0, tenantCnt: 0, neGroupCnt: 0, neCnt: 0, tenantList:[], neGroupList: []}]
  23140. sidoCode.value.forEach((item) => {
  23141. let mapDataObj = {}
  23142. mapDataObj.areaName = item.title[1]
  23143. mapDataObj.cls = item.cls
  23144. mapDataObj.areaCode = item.value
  23145. mapDataObj.criCnt = 0
  23146. mapDataObj.majCnt = 0
  23147. mapDataObj.minCnt = 0
  23148. mapDataObj.total = 0
  23149. mapDataObj.tenantList = []
  23150. mapDataObj.neGroupList = []
  23151. mapDataObj.neInfoList = []
  23152. tempMapData.push(mapDataObj)
  23153. let tempTenantObj = {}
  23154. tempTenantObj.areaName = item.title[0]
  23155. tempTenantObj.areaCode = item.value
  23156. tempTenantObj.tenantList = []
  23157. tempTenantData.push(tempTenantObj)
  23158. let cardRanObj = {}
  23159. cardRanObj.areaName = item.title[0]
  23160. cardRanObj.areaCode = item.value
  23161. cardRanObj.cls = ''
  23162. cardRanObj.criCnt = 0
  23163. cardRanObj.majCnt = 0
  23164. cardRanObj.minCnt = 0
  23165. cardRanObj.tenantCnt = 0
  23166. cardRanObj.neGroupCnt = 0
  23167. cardRanObj.neCnt = 0
  23168. cardRanObj.tenantList = []
  23169. cardRanObj.neGroupList = []
  23170. tempCardRanData.push(cardRanObj)
  23171. })
  23172. mapDataInfo.value = _cloneDeep(tempMapData)
  23173. tenantCntObj.value.areaInfoList = _cloneDeep(tempTenantData)
  23174. tenantCntObjCopy.value.areaInfoList = _cloneDeep(tempTenantData)
  23175. cardRanInfo.value = _cloneDeep(tempCardRanData)
  23176. }
  23177. const getCardAllRan = computed(() => {
  23178. let result = {
  23179. areaName: '전국현황', areaCode: 0, cls: 'ran--all', criCnt: 0, majCnt: 0, minCnt: 0, tenantCnt: 0, neGroupCnt: 0, neCnt: 0, tenantList:[], neGroupList: []
  23180. }
  23181. cardRanInfo.value.forEach((item, idx) => {
  23182. if(idx !== 0) {
  23183. result.criCnt += item.criCnt
  23184. result.majCnt += item.majCnt
  23185. result.minCnt += item.minCnt
  23186. result.tenantCnt += item.tenantCnt
  23187. result.neGroupCnt += item.neGroupCnt
  23188. result.neCnt += item.neCnt
  23189. result.tenantList.push(...item.tenantList)
  23190. result.neGroupList.push(...item.neGroupList)
  23191. }
  23192. })
  23193. return result
  23194. })
  23195. /**
  23196. * 토글
  23197. */
  23198. function toggleActive(type) {
  23199. const allElements = document.querySelectorAll('.type1, .type2, .type3')
  23200. const selectedElements = document.querySelectorAll(`.${type}`)
  23201. const isActive = Array.from(selectedElements).some(element => element.classList.contains('active'))
  23202. allElements.forEach(element => {
  23203. element.classList.remove('active')
  23204. })
  23205. if(!isActive){
  23206. selectedElements.forEach(element => {
  23207. element.classList.add('active')
  23208. })
  23209. }
  23210. }
  23211. /**
  23212. * P5G RAN
  23213. */
  23214. function fnGeoTenantNeInfo() {
  23215. let _req = {
  23216. tenantName: useAuthStore().getTenantName//useAuthStore().getTenantName
  23217. }
  23218. useAxios().post(useApi.tenantNeInfo, _req).then((res) => {
  23219. $log.debug("[dashboard][fnGeoTenantNeInfo][success]")
  23220. let datas = res.data.data.items
  23221. fnMakeNeData(datas)
  23222. // 상세 지역 데이터 갱신
  23223. fnUpdateDetailArea()
  23224. }).catch((error)=>{
  23225. $log.debug("[dashboard][fnGeoTenantNeInfo][error]")
  23226. useErrorHandler().fnSetCommErrorHandle(error, fnGeoTenantNeInfo)
  23227. }).finally(()=>{
  23228. $log.debug("[dashboard][fnGeoTenantNeInfo][finished]")
  23229. })
  23230. }
  23231. /**
  23232. * 지도 데이터 및 모든 데이터 가공
  23233. */
  23234. function fnMakeNeData(arr){
  23235. // 데이터 초기화
  23236. fnSetInitMapData()
  23237. let initCriTotal = 0 // 전국 CRIICAL 개수
  23238. let initMajTotal = 0 // 전국 MAJOR 개수
  23239. let initMinTotal = 0 // 전국 MINOR 개수
  23240. let tenantTotal = 0
  23241. arr.forEach((item, idx) => {
  23242. initCriTotal+=item.criCnt
  23243. initMajTotal+=item.majCnt
  23244. initMinTotal+=item.minCnt
  23245. // 각 NE 데이터의 지역코드에 맞는 배열에 넣기
  23246. let findIndex = mapDataInfo.value.findIndex((obj => obj.areaCode === item.areaCode))
  23247. if(findIndex !== -1) {
  23248. mapDataInfo.value[findIndex].neInfoList.push(item)
  23249. mapDataInfo.value[findIndex].criCnt += item.criCnt
  23250. mapDataInfo.value[findIndex].majCnt += item.majCnt
  23251. mapDataInfo.value[findIndex].minCnt += item.minCnt
  23252. if(!mapDataInfo.value[findIndex].tenantList.includes(item.tenantName)){
  23253. mapDataInfo.value[findIndex].tenantList.push(item.tenantName)
  23254. }
  23255. if(!mapDataInfo.value[findIndex].neGroupList.includes(item.neGroup)){
  23256. mapDataInfo.value[findIndex].neGroupList.push(item.neGroup)
  23257. }
  23258. if(!tenantCntObj.value.areaInfoList[findIndex].tenantList.includes(item.tenantName)) {
  23259. tenantCntObj.value.areaInfoList[findIndex].tenantList.push(item.tenantName)
  23260. tenantTotal++
  23261. }
  23262. }
  23263. // 카드형 데이터 세팅
  23264. let cardFindIndex = cardRanInfo.value.findIndex((obj => obj.areaCode === item.areaCode))
  23265. if(cardFindIndex !== -1) {
  23266. // 테넌트 리스트 세팅
  23267. cardRanInfo.value[cardFindIndex].minCnt += item.minCnt
  23268. cardRanInfo.value[cardFindIndex].majCnt += item.majCnt
  23269. cardRanInfo.value[cardFindIndex].criCnt += item.criCnt
  23270. if(!cardRanInfo.value[cardFindIndex].tenantList.includes(item.tenantName)) {
  23271. cardRanInfo.value[cardFindIndex].tenantList.push(item.tenantName)
  23272. cardRanInfo.value[cardFindIndex].tenantCnt++
  23273. }
  23274. // 그룹 및 NE 세팅
  23275. if(!_isEmpty(_find(cardRanInfo.value[cardFindIndex].neGroupList, {neGroup: item.neGroup}))) {
  23276. let groupFindIndex = cardRanInfo.value[cardFindIndex].neGroupList.findIndex((obj => obj.neGroup === item.neGroup))
  23277. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].minCnt += item.minCnt
  23278. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].majCnt += item.majCnt
  23279. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].criCnt += item.criCnt
  23280. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].neCnt++
  23281. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].tenantName = item.tenantName
  23282. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].neList.push(item)
  23283. cardRanInfo.value[cardFindIndex].neCnt++
  23284. }else{
  23285. cardRanInfo.value[cardFindIndex].neGroupList.push({neGroup: item.neGroup, tenantName: item.tenantName, neCnt: 1, minCnt: item.minCnt, majCnt: item.majCnt, criCnt: item.criCnt, neList: [item]})
  23286. cardRanInfo.value[cardFindIndex].neGroupCnt++
  23287. cardRanInfo.value[cardFindIndex].neCnt++
  23288. }
  23289. }
  23290. })
  23291. // 카드형 데이터 > 전국현황 데이터 세팅
  23292. cardRanInfo.value[0] = _cloneDeep(getCardAllRan.value)
  23293. // 전국 > 이벤트 수
  23294. criTotal.value = initCriTotal
  23295. majTotal.value = initMajTotal
  23296. minTotal.value = initMinTotal
  23297. // 전국 > 테넌트 수 TOTAL
  23298. tenantCntObj.value.tenantTotal = tenantTotal
  23299. // 전국 기준 테넌트-그룹-NE 정보 merge
  23300. myDatas.value = _cloneDeep(fnSetTenantGroupNeData(arr))
  23301. }
  23302. /**
  23303. * ran tenant
  23304. */
  23305. function fnGeoTenantInfo() {
  23306. useAxios().post(useApi.geoTenantInfoList).then((res) => {
  23307. $log.debug("[dashboard][fnGeoTenantInfo][success]")
  23308. let datas = res.data.data.items
  23309. }).catch((error)=>{
  23310. $log.debug("[dashboard][fnGeoTenantInfo][error]")
  23311. useErrorHandler().fnSetCommErrorHandle(error, fnGeoTenantInfo)
  23312. }).finally(()=>{
  23313. $log.debug("[dashboard][fnGeoTenantInfo][finished]")
  23314. })
  23315. }
  23316. /**
  23317. * 지도형 UI ne그룹 클릭
  23318. */
  23319. function fnClickNeGroup(item) {
  23320. propsNeGroupInfo.value = item
  23321. isShowRanMapDetailModal.value = true
  23322. }
  23323. /**
  23324. * 지도형 UI NE 클릭
  23325. */
  23326. function fnClickNe(item) {
  23327. propsNeInfo.value = item
  23328. isShowRanMapNeDetailModal.value = true
  23329. }
  23330. /**
  23331. * 카드형 UI 상세보기 클릭
  23332. */
  23333. function fnClickCardDetail(item, cardIndex) {
  23334. propsCardObj.value = item
  23335. isShowRanCardGroupDetailModal.value = true
  23336. }
  23337. const currMapIndex = ref(null) // 현재 조회 상세 지역 인덱스
  23338. /**
  23339. * 지역 클릭
  23340. */
  23341. function fnDetailArea(mapObj, mapIndex){
  23342. currMapIndex.value = mapIndex
  23343. // 상세 지역 데이터 설정
  23344. currMapData.value = mapObj
  23345. fnSetAreaNewData()
  23346. isDetailMap.value = true
  23347. }
  23348. /**
  23349. * 상세 지역 조회 상태인 경우
  23350. * 전국 NE 데이터 갱신 > 상세 지역 NE 데이터 갱신
  23351. */
  23352. function fnUpdateDetailArea(){
  23353. if(isDetailMap.value) {
  23354. if(!useUtil.isNull(currMapIndex.value)) {
  23355. currMapData.value = mapDataInfo.value[currMapIndex.value]
  23356. fnSetAreaNewData()
  23357. }
  23358. }
  23359. }
  23360. /**
  23361. * 지역 클릭 상태 - 전국 클릭 > 전국으로 돌아가기
  23362. */
  23363. function fnAllAreaClick(){
  23364. isDetailMap.value = false
  23365. currMapIndex.value = null
  23366. fnGeoTenantNeInfo()
  23367. }
  23368. /**
  23369. * 지역 클릭 > 지역 데이터 세팅
  23370. */
  23371. function fnSetAreaNewData(){
  23372. let arr = currMapData.value.neInfoList
  23373. let tenantTotal = 0
  23374. arr.forEach((item, idx) => {
  23375. // 각 NE 데이터의 지역코드에 맞는 배열에 넣기
  23376. let findIndex = mapDataInfo.value.findIndex((obj => obj.areaCode === item.areaCode))
  23377. if(findIndex !== -1) {
  23378. if(!tenantCntObjCopy.value.areaInfoList[findIndex].tenantList.includes(item.tenantName)) {
  23379. tenantCntObjCopy.value.areaInfoList[findIndex].tenantList.push(item.tenantName)
  23380. tenantTotal++
  23381. }
  23382. }
  23383. })
  23384. tenantCntObjCopy.value.tenantTotal = tenantTotal
  23385. areaNewData.value = _cloneDeep(fnSetTenantGroupNeData(arr))
  23386. }
  23387. /**
  23388. * 테넌트 - 그룹 - NE 데이터 세팅 로직
  23389. */
  23390. function fnSetTenantGroupNeData(arr){
  23391. let result = {}
  23392. arr.forEach(item => {
  23393. const { tenantName, neGroup } = item
  23394. // tenantName이 없으면 초기화
  23395. if (!result[tenantName]) {
  23396. result[tenantName] = {
  23397. tenantName,
  23398. neGroupList: {}
  23399. }
  23400. }
  23401. // neGroup이 없으면 초기화
  23402. if (!result[tenantName].neGroupList[neGroup]) {
  23403. result[tenantName].neGroupList[neGroup] = {
  23404. tenantName,
  23405. neGroup,
  23406. minCnt: 0,
  23407. majCnt: 0,
  23408. criCnt: 0,
  23409. neList: []
  23410. }
  23411. }
  23412. // 카운트 합산
  23413. result[tenantName].neGroupList[neGroup].minCnt += item.minCnt
  23414. result[tenantName].neGroupList[neGroup].majCnt += item.majCnt
  23415. result[tenantName].neGroupList[neGroup].criCnt += item.criCnt
  23416. // neList에 NE 데이터 추가
  23417. result[tenantName].neGroupList[neGroup].neList.push({
  23418. tenantName: item.tenantName,
  23419. neGroup: item.neGroup,
  23420. neName: item.neName,
  23421. neId: item.neId,
  23422. neType: item.neType,
  23423. upfNum: item.upfNum,
  23424. customerType: item.customerType,
  23425. neAddress: item.neAddress,
  23426. lastUpdateTime: item.lastUpdateTime,
  23427. neLocLatitude: item.neLocLatitude,
  23428. neLocLongitude: item.neLocLongitude,
  23429. familyName: item.familyName,
  23430. initTime: item.initTime,
  23431. minCnt: item.minCnt,
  23432. majCnt: item.majCnt,
  23433. criCnt: item.criCnt,
  23434. kpi: item.kpi,
  23435. cpu: item.cpu,
  23436. mem: item.mem,
  23437. })
  23438. })
  23439. // 최종 결과 배열로 변환
  23440. return Object.values(result).map(tenant => ({
  23441. tenantName: tenant.tenantName,
  23442. neGroupList: Object.values(tenant.neGroupList)
  23443. }))
  23444. }
  23445. </script>
  23446. </file>
  23447. <file path="components/home/dashboard/layout01/user/layout01User.vue">
  23448. <template>
  23449. <div>
  23450. <div :class="widgetSize === 'M' ? 'user--list--wrap user--list--bar--graph' : 'user--list--bar--graph'">
  23451. <!-- 헤더 영역 : S -->
  23452. <div class="inner--header--wrap">
  23453. <h2 class="inner--component--title none--after">
  23454. 가입자
  23455. </h2>
  23456. <pagination
  23457. :page-obj="pageObj"
  23458. @chg_page="fnChgPage"
  23459. >
  23460. <template
  23461. v-if="userItems && userItems.length > 0"
  23462. #rightArea
  23463. >
  23464. <div class="btn--list--content">
  23465. <v-btn
  23466. class="custom-btn mini all--view--btn"
  23467. @click="fnUserTotalClick"
  23468. >
  23469. <i class="icon" />전체보기
  23470. </v-btn>
  23471. </div>
  23472. <div class="shape--selector">
  23473. <v-btn
  23474. class="custom-btn mini card--type--btn"
  23475. :class="{ on: showType === 'CARD' }"
  23476. @click="fnChangeShowType('CARD')"
  23477. />
  23478. <v-btn
  23479. class="custom-btn mini list--type--btn"
  23480. :class="{ on: showType === 'TABLE' }"
  23481. @click="fnChangeShowType('TABLE')"
  23482. />
  23483. </div>
  23484. </template>
  23485. </pagination>
  23486. </div>
  23487. <!-- 헤더 영역 : E -->
  23488. <!-- Contents 영역 : S -->
  23489. <div class="user--list--contents">
  23490. <WidgetM
  23491. v-if="showType === 'CARD' && widgetSize === 'M'"
  23492. :items="userItems"
  23493. />
  23494. <WidgetS
  23495. v-if="showType === 'CARD' && widgetSize === 'S'"
  23496. :items="userItems"
  23497. />
  23498. <WidgetT
  23499. v-if="showType === 'TABLE'"
  23500. :items="userItems"
  23501. :page-obj="pageObj"
  23502. />
  23503. </div>
  23504. <!-- Contents 영역 : E -->
  23505. </div>
  23506. </div>
  23507. </template>
  23508. <script setup>
  23509. /***********************
  23510. * import
  23511. ************************/
  23512. import { useI18n } from "vue-i18n"
  23513. import apiUrl from '@/composables/useApi';
  23514. import useAxios from '@/composables/useAxios';
  23515. import useUtil from '@/composables/useUtil';
  23516. import pagination from "@/components/home/dashboard/common/pagination.vue"
  23517. import WidgetM from "@/components/home/dashboard/layout01/user/layout01UserWidgetM.vue"
  23518. import WidgetS from "@/components/home/dashboard/layout01/user/layout01UserWidgetS.vue"
  23519. import WidgetT from "@/components/home/dashboard/layout01/user/layout01UserWidgetT.vue"
  23520. import testJson from "../../test.json"
  23521. /***********************
  23522. * plugins inject
  23523. ************************/
  23524. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  23525. // props
  23526. const props = defineProps({
  23527. config: {
  23528. type: Object,
  23529. default: () => {}
  23530. },
  23531. intervalTime: {
  23532. type: Number,
  23533. default: 5000
  23534. }
  23535. })
  23536. // 참조가능 데이터 설정
  23537. defineExpose({})
  23538. // 발신 이벤트 선언
  23539. const emit = defineEmits([""]);
  23540. const i18n = useI18n();
  23541. /***********************
  23542. * data & created
  23543. ************************/
  23544. // 카드 / 리스트 구분
  23545. const showType = ref('CARD'); // CARD or TABLE
  23546. // TenantName
  23547. const tenantName = computed(() => useAuthStore().getTenantName);
  23548. // 설정된 위젯 사이즈 : M or S
  23549. const widgetSize = computed(() => props.config?.widgetSize || 'M');
  23550. // 위젯 사이즈별 표시 갯수
  23551. const widgetListLimit = ref({
  23552. S: 16, M: 8, T: 10,
  23553. });
  23554. // 페이징 정보
  23555. const pageObj = ref( {
  23556. page: 1, // 현재 페이지
  23557. pageSize: widgetListLimit.value[widgetSize.value], // 테이블 조회 데이터 개수
  23558. totalCnt: 0, // 전체 페이지
  23559. })
  23560. // 가입자 리스트
  23561. const userItems = ref([]);
  23562. /***********************
  23563. * Methods
  23564. ************************/
  23565. const fnReset = () => {
  23566. userItems.value = [];
  23567. showType.value = 'CARD';
  23568. pageObj.value.page = 1;
  23569. pageObj.value.pageSize = widgetListLimit.value[widgetSize.value];
  23570. pageObj.value.totalCnt = 0;
  23571. }
  23572. function fnGetUserList() {
  23573. const params = {
  23574. tenantName: tenantName.value,
  23575. }
  23576. useAxios().post(apiUrl.getUserList, params).then((res) => {
  23577. const {resCode, resMsg, data} = res.data;
  23578. if(resCode == 200) {
  23579. // 테스트를 위한 테스트 코드 (삭제 필수)
  23580. // fnParseData([...(data?.items || []), ...testJson.user.data.items])
  23581. fnParseData(data.items || [])
  23582. $log.debug("[dashboard][fnGetUserList][success]")
  23583. } else {
  23584. $log.debug("[dashboard][fnGetUserList][error]", `[${resCode}] ${resMsg}`);
  23585. }
  23586. }).catch((error)=>{
  23587. // 테스트를 위한 테스트 코드 (삭제 필수)
  23588. // fnParseData([...testJson.user.data.items])
  23589. $log.debug("[dashboard][fnGetUserList][error]", error)
  23590. useErrorHandler().fnSetCommErrorHandle(error, fnGetUserList)
  23591. // 테스트 데이터 파싱
  23592. }).finally(()=>{
  23593. $log.debug("[dashboard][fnGetUserList][finished]")
  23594. })
  23595. }
  23596. /**
  23597. * 데이터 가공
  23598. */
  23599. function fnParseData(items = []) {
  23600. userItems.value = [];
  23601. if(!items || items.length < 1) {
  23602. pageObj.value.totalCnt = 0;
  23603. return;
  23604. }
  23605. let temp = [];
  23606. // 정렬 적용
  23607. temp = items.sort((a, b) => {
  23608. const perA = fnGetPercentValue(a.maxSubscriber, a.curSubscriber);
  23609. const perB = fnGetPercentValue(b.maxSubscriber, b.curSubscriber);
  23610. return +perA < +perB ? 1 : (+perA > +perB ? -1 : 0);
  23611. })
  23612. // 페이징 적용
  23613. pageObj.value.totalCnt = temp.length;
  23614. temp = temp.filter((data, index) =>(index >= ((pageObj.value.page - 1) * pageObj.value.pageSize) && index < (pageObj.value.page * pageObj.value.pageSize)));
  23615. // 데이터 가공
  23616. userItems.value = temp.map((item, index) => {
  23617. //percent
  23618. const { maxSubscriber, curSubscriber } = item;
  23619. const perSubscriber = fnGetPercentValue(maxSubscriber, curSubscriber);
  23620. //심각도
  23621. const level = fnGetLevel(perSubscriber);
  23622. //차트 데이터
  23623. const chartData = {
  23624. datasets: [
  23625. {
  23626. data: [curSubscriber , maxSubscriber - curSubscriber],
  23627. backgroundColor: fnGetChartColorSet(level),
  23628. borderWidth: 0,
  23629. }
  23630. ]
  23631. }
  23632. //테이블 사용량 class
  23633. const tablePercentClass = fnGetTablePercentClass(perSubscriber);
  23634. return {
  23635. ...item,
  23636. no: index+1,
  23637. level,
  23638. perSubscriber,
  23639. chartData,
  23640. tablePercentClass
  23641. }
  23642. })
  23643. }
  23644. /** make percent data */
  23645. const fnGetPercentValue = (max, curr) => {
  23646. return useUtil.toRoundFix((curr / max) * 100, 0);
  23647. }
  23648. const fnGetLevel = (per) => {
  23649. if(per >= 95) return 'critical'; //critical
  23650. else if(per >= 90) return 'major'; //major
  23651. else if(per >= 85) return 'minor'; //minor
  23652. else return 'normal'; //normal
  23653. }
  23654. /** 차트 데이터 > 컬러셋 */
  23655. const fnGetChartColorSet = (level) => {
  23656. if(level == 'critical') return ['#f00','#EAEAEA']; //critical
  23657. else if(level == 'major') return ['#C96103','#EAEAEA']; //major
  23658. else if(level == 'minor') return ['#DDA405','#EAEAEA']; //minor
  23659. else return ['#2D8CFA','#EAEAEA']; //normal
  23660. }
  23661. /** 테이블 > 사용량 class */
  23662. const fnGetTablePercentClass = (level) => {
  23663. if(level == 'critical') return 'user--list--critical'; //critical
  23664. else if(level == 'major') return 'user--list--major'; //major
  23665. else if(level == 'minor') return 'user--list--minor'; //minor
  23666. else return 'user--list--normal';
  23667. }
  23668. /** 카드형/목록형 Change Event */
  23669. function fnChangeShowType(type) {
  23670. pageObj.value.page = 1;
  23671. pageObj.value.totalCnt = 0;
  23672. if(type === 'TABLE') pageObj.value.pageSize = widgetListLimit.value.T;
  23673. else pageObj.value.pageSize = widgetListLimit.value[widgetSize.value];
  23674. fnGetUserList();
  23675. showType.value = type;
  23676. }
  23677. /** 전체보기 open */
  23678. function fnUserTotalClick() {
  23679. const url = window.location.origin+'/view/home/user'
  23680. const popupWindow = window.open(url, '_blank', 'width=' + screen.width + ',height=' + screen.height + ',fullscreen=yes')
  23681. if (popupWindow) {
  23682. popupWindow.focus()
  23683. }
  23684. }
  23685. /**
  23686. * 페이지 변경
  23687. */
  23688. function fnChgPage(page){
  23689. pageObj.value.page = page
  23690. fnGetUserList();
  23691. }
  23692. onMounted(() => fnGetUserList())
  23693. // 위젯사이즈 변경 watch
  23694. watch(() => widgetSize.value, () => {
  23695. fnReset();
  23696. fnGetUserList();
  23697. }, {deep: true})
  23698. </script>
  23699. </file>
  23700. <file path="components/home/dashboard/layout01/user/layout01UserWidgetM.vue">
  23701. <template>
  23702. <ul>
  23703. <li
  23704. v-for="(item, index) in props.items"
  23705. :key="`user-widget-${index}`"
  23706. :class="item.level"
  23707. >
  23708. <div class="headers">
  23709. <div class="title">
  23710. {{ item.tenantName }}
  23711. </div>
  23712. </div>
  23713. <div class="chart--box">
  23714. <Doughnut
  23715. :data="item.chartData"
  23716. :options="chartOptions"
  23717. />
  23718. <div class="current--value">
  23719. {{ toRoundFix(item.curSubscriber, 0) }} / {{ toRoundFix(item.maxSubscriber, 0) }}
  23720. </div>
  23721. </div>
  23722. <div class="current--value--ps">
  23723. {{ item.perSubscriber }}<i class="unit">%</i>
  23724. </div>
  23725. </li>
  23726. </ul>
  23727. </template>
  23728. <script setup>
  23729. /***********************
  23730. * import
  23731. ************************/
  23732. import { useI18n } from "vue-i18n"
  23733. import apiUrl from '@/composables/useApi';
  23734. import useAxios from '@/composables/useAxios';
  23735. import useUtil from '@/composables/useUtil';
  23736. import { Doughnut } from 'vue-chartjs';
  23737. import { Chart as ChartJS, Title, Tooltip, Legend, BarElement, LineController, LineElement, PointElement, ArcElement, CategoryScale, LinearScale } from 'chart.js';
  23738. /***********************
  23739. * plugins inject
  23740. ************************/
  23741. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  23742. // props
  23743. const props = defineProps({
  23744. items: {
  23745. type: Array,
  23746. default: () => []
  23747. },
  23748. })
  23749. // 참조가능 데이터 설정
  23750. defineExpose({})
  23751. // 발신 이벤트 선언
  23752. const emit = defineEmits([]);
  23753. const i18n = useI18n();
  23754. ChartJS.register(Title,
  23755. Tooltip,
  23756. Legend,
  23757. BarElement,
  23758. LineController,
  23759. LineElement,
  23760. PointElement,
  23761. CategoryScale,
  23762. ArcElement,
  23763. LinearScale)
  23764. /***********************
  23765. * data & created
  23766. ************************/
  23767. const chartOptions = {
  23768. responsive: true,
  23769. maintainAspectRatio: false,
  23770. cutout:"75%",
  23771. rotation: 270,
  23772. circumference: 180,
  23773. plugins: {
  23774. legend: {
  23775. position:'top',
  23776. display: false
  23777. },
  23778. tooltip: {
  23779. enabled:false
  23780. }
  23781. }
  23782. }
  23783. /***********************
  23784. * Methods
  23785. ************************/
  23786. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  23787. </script>
  23788. </file>
  23789. <file path="components/home/dashboard/layout01/user/layout01UserWidgetS.vue">
  23790. <template>
  23791. <ul class="data--list--content--modal">
  23792. <li
  23793. v-for="(item, index) in props.items"
  23794. :key="`user-widget-${index}`"
  23795. :class="item.level"
  23796. >
  23797. <h2>
  23798. <span>
  23799. {{ item.tenantName }}
  23800. </span>
  23801. </h2>
  23802. <div class="data--column">
  23803. <div class="percent">
  23804. {{ item.perSubscriber }}<i class="unit">%</i>
  23805. </div>
  23806. <div class="data--bar--chart">
  23807. <div class="data--bar--wrap">
  23808. <div
  23809. class="data--bar--current"
  23810. :style="{width:item.perSubscriber + '%'}"
  23811. >
  23812. {{ toRoundFix(item.curSubscriber, 0) }} / {{ toRoundFix(item.maxSubscriber, 0) }}
  23813. </div>
  23814. </div>
  23815. </div>
  23816. </div>
  23817. </li>
  23818. </ul>
  23819. </template>
  23820. <script setup>
  23821. /***********************
  23822. * import
  23823. ************************/
  23824. import { useI18n } from "vue-i18n"
  23825. import apiUrl from '@/composables/useApi';
  23826. import useAxios from '@/composables/useAxios';
  23827. import useUtil from '@/composables/useUtil';
  23828. /***********************
  23829. * plugins inject
  23830. ************************/
  23831. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  23832. // props
  23833. const props = defineProps({
  23834. items: {
  23835. type: Array,
  23836. default: () => []
  23837. },
  23838. })
  23839. // 참조가능 데이터 설정
  23840. defineExpose({})
  23841. // 발신 이벤트 선언
  23842. const emit = defineEmits([]);
  23843. const i18n = useI18n();
  23844. /***********************
  23845. * data & created
  23846. ************************/
  23847. /***********************
  23848. * Methods
  23849. ************************/
  23850. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  23851. </script>
  23852. </file>
  23853. <file path="components/home/dashboard/layout01/user/layout01UserWidgetT.vue">
  23854. <template>
  23855. <div class="tbl-wrapper">
  23856. <div class="tbl-wrap">
  23857. <!-- ag-grid -->
  23858. <ag-grid-vue
  23859. style="width:100%; height:calc(11 * 1.76rem);"
  23860. class="ag-theme-quartz"
  23861. :grid-options="gridOptions"
  23862. :row-data="props.items"
  23863. :pagination-page-size="props.pageObj.pageSize"
  23864. :pagination-page-size-selector="columnList"
  23865. :suppress-pagination-panel="true"
  23866. @grid-ready="fnOnGridReady"
  23867. />
  23868. </div>
  23869. </div>
  23870. </template>
  23871. <script setup>
  23872. /***********************
  23873. * import
  23874. ************************/
  23875. import { useI18n } from "vue-i18n"
  23876. import apiUrl from '@/composables/useApi';
  23877. import useAxios from '@/composables/useAxios';
  23878. import useUtil from '@/composables/useUtil';
  23879. import "ag-grid-community/styles/ag-grid.css";
  23880. import "ag-grid-community/styles/ag-theme-quartz.css";
  23881. import { AgGridVue } from "ag-grid-vue3";
  23882. import dayjs from "#build/dayjs.imports.mjs";
  23883. /***********************
  23884. * plugins inject
  23885. ************************/
  23886. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  23887. // props
  23888. const props = defineProps({
  23889. items: {
  23890. type: Array,
  23891. default: () => []
  23892. },
  23893. pageObj: {
  23894. type: Object,
  23895. default: () => {
  23896. return {
  23897. page: 1,
  23898. pageSize: 10,
  23899. totalCnt: 0,
  23900. }
  23901. }
  23902. }
  23903. })
  23904. // 참조가능 데이터 설정
  23905. defineExpose({})
  23906. // 발신 이벤트 선언
  23907. const emit = defineEmits([]);
  23908. const i18n = useI18n();
  23909. /***********************
  23910. * data & created
  23911. ************************/
  23912. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  23913. const vhToPx = (vh) => window.innerHeight * (vh / 100);
  23914. const rowHeightRem = 2.2; // 원하는 rem 값
  23915. const rowHeightPx = rowHeightRem * remToPx();
  23916. const gridApi = shallowRef();
  23917. const getHeaders = computed(() => [
  23918. { headerName: 'No', field: 'no', maxWidth: 75},
  23919. { headerName: '테넌트 명', field: 'tenantName'},
  23920. { headerName: '사용량', maxWidth: 150, cellRenderer: fnPercentCellRenderer},
  23921. { headerName: '만료일', maxWidth: 150, cellRenderer: fnExpiredDateCellRenderer},
  23922. { headerName: '계정 현황 (사용/최대)', cellRenderer: fnAccountStatusRenderer},
  23923. { headerName: '세션 현황 (접속/최대)', cellRenderer: fnSessionStatusRenderer},
  23924. ])
  23925. // gridOption
  23926. const gridOptions = {
  23927. columnDefs: getHeaders.value,
  23928. rowData: props.items, // 테이블 데이터
  23929. suppressMovableColumns: true,
  23930. autoSizeStrategy: {
  23931. type: "fitGridWidth", // width맞춤
  23932. },
  23933. headerHeight : rowHeightPx,
  23934. rowHeight: rowHeightPx,
  23935. pagination: true,
  23936. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  23937. suppressRowClickSelection: true, // 행 클릭 체크박스 무시
  23938. localeText: {
  23939. noRowsToShow: i18n.t('common.noData')
  23940. },
  23941. defaultColDef: {
  23942. lockVisible: true, // 열을 그리드 밖으로 꺼내지 않음
  23943. },
  23944. }
  23945. /***********************
  23946. * Methods
  23947. ************************/
  23948. // Grid 데이터 바인딩
  23949. function fnOnGridReady(params){
  23950. gridApi.value = params.api
  23951. }
  23952. // 사용량 렌더러
  23953. function fnPercentCellRenderer(params) {
  23954. const { data } = params;
  23955. return `<span class="${data.tablePercentClass}">${data.perSubscriber}%</span>`;
  23956. }
  23957. // 만료일 렌더러
  23958. function fnExpiredDateCellRenderer(params) {
  23959. return dayjs(params.expirationDate).format('YYYY-MM-DD');
  23960. }
  23961. // 계정현황 렌더러
  23962. function fnAccountStatusRenderer(params) {
  23963. const { data } = params;
  23964. return `${useUtil.toRoundFix(data.currentAccountCount, 0)}/${useUtil.toRoundFix(data.maxAccount, 0)}`
  23965. }
  23966. // 세션현황 렌더러
  23967. function fnSessionStatusRenderer(params) {
  23968. const { data } = params;
  23969. return `${useUtil.toRoundFix(data.currentConnectingCount, 0)}/${useUtil.toRoundFix(data.maxSession, 0)}`
  23970. }
  23971. </script>
  23972. </file>
  23973. <file path="components/home/dashboard/layout01/layout01.vue">
  23974. <template>
  23975. <div class="dash--board--contents type1">
  23976. <!-- CORE -->
  23977. <div>
  23978. <Core12x14
  23979. :config="coreConfig"
  23980. :interval-time="props.intervalTime"
  23981. />
  23982. </div>
  23983. <!-- USER -->
  23984. <div>
  23985. <User12x10
  23986. :config="userConfig"
  23987. :interval-time="props.intervalTime"
  23988. />
  23989. </div>
  23990. <!-- RAN -->
  23991. <div>
  23992. <Ran12x24
  23993. :config="raneConfig"
  23994. :interval-time="props.intervalTime"
  23995. />
  23996. </div>
  23997. </div>
  23998. </template>
  23999. <script setup>
  24000. import { useI18n } from 'vue-i18n';
  24001. import Core12x14 from '@/components/home/dashboard/layout01/core/layout01Core.vue'
  24002. import User12x10 from '@/components/home/dashboard/layout01/user/layout01User.vue'
  24003. import Ran12x24 from '@/components/home/dashboard/layout01/ran/layout01Ran.vue'
  24004. /***********************
  24005. * plugins inject
  24006. ************************/
  24007. const {$toast, $log, $dayjs, $eventBus } = useNuxtApp()
  24008. const i18n = useI18n()
  24009. // props
  24010. const props = defineProps({
  24011. intervalTime: {
  24012. type: Number,
  24013. default: 5000
  24014. }
  24015. })
  24016. /***********************
  24017. * data & created
  24018. ************************/
  24019. const widgets = computed(() => useAuthStore().getWidgets);
  24020. const coreConfig = computed(() => widgets.value?.find(w => w.widgetGrp == 'CORE'));
  24021. const userConfig = computed(() => widgets.value?.find(w => w.widgetGrp == 'USER'));
  24022. const raneConfig = computed(() => widgets.value?.find(w => w.widgetGrp == 'RANE'));
  24023. /***********************
  24024. * Methods
  24025. ************************/
  24026. </script>
  24027. </file>
  24028. <file path="components/home/dashboard/layout02/core/layout02Core.vue">
  24029. <template>
  24030. <div
  24031. class="core--component--wrap"
  24032. :class="widgetSize === 'S' ? 'small' : ''"
  24033. >
  24034. <div class="inner--header--wrap">
  24035. <h2 class="inner--component--title none--after">
  24036. CORE
  24037. </h2>
  24038. <pagination
  24039. :page-obj="pageObj"
  24040. @chg_page="fnChgPage"
  24041. >
  24042. <template #rightArea>
  24043. <div class="search--box">
  24044. <v-select
  24045. v-model="objSltSearch.neType"
  24046. :items="objSlt.neTypeList"
  24047. variant="outlined"
  24048. style="width:9.0625rem;"
  24049. class="custom-select"
  24050. />
  24051. <v-select
  24052. v-model="objSltSearch.customerType"
  24053. :items="objSlt.customerTypeList"
  24054. variant="outlined"
  24055. style="width:9.0625rem;"
  24056. class="custom-select"
  24057. />
  24058. <v-btn
  24059. class="custom-btn mini sort-btn"
  24060. flat
  24061. @click="isSortShow ? isSortShow = false : isSortShow = true"
  24062. />
  24063. <div
  24064. v-if="isSortShow == true"
  24065. class="sort--atv"
  24066. >
  24067. <ul>
  24068. <li
  24069. v-for="(sort, index) in objSlt.sortTypeList"
  24070. :key="`sort-option-${index}`"
  24071. :class="{atv: objSltSearch.sortType == sort.value}"
  24072. @click="fnOnclickSortType(sort.value)"
  24073. >
  24074. {{ sort.title }}
  24075. </li>
  24076. </ul>
  24077. </div>
  24078. </div>
  24079. </template>
  24080. </pagination>
  24081. </div>
  24082. <!-- 위젯 영역 -->
  24083. <WidgetM
  24084. v-if="widgetSize === 'M'"
  24085. :items="coreItems"
  24086. @more="fnCoreDetailClick"
  24087. />
  24088. <WidgetS
  24089. v-if="widgetSize === 'S'"
  24090. :items="coreItems"
  24091. @more="fnCoreDetailClick"
  24092. />
  24093. <!-- 코어 상세보기 Modal -->
  24094. <CoreDetailModal
  24095. ref="refCoreDetailModal"
  24096. :is-core-detail-modal="isCoreDetailModal"
  24097. @close-modal="fnCloseCoreDetailModal"
  24098. />
  24099. </div>
  24100. </template>
  24101. <script setup>
  24102. /***********************
  24103. * import
  24104. ************************/
  24105. import { useI18n } from "vue-i18n"
  24106. import apiUrl from '@/composables/useApi';
  24107. import useAxios from '@/composables/useAxios';
  24108. import useUtil from '@/composables/useUtil';
  24109. import CoreDetailModal from "@/components/home/dashboard/common/coreDetailModal.vue"
  24110. import WidgetM from "@/components/home/dashboard/layout02/core/layout02CoreWidgetM.vue"
  24111. import WidgetS from "@/components/home/dashboard/layout02/core/layout02CoreWidgetS.vue"
  24112. import pagination from "@/components/home/dashboard/common/pagination.vue"
  24113. import testJson from "../../test.json"
  24114. /***********************
  24115. * plugins inject
  24116. ************************/
  24117. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  24118. // props
  24119. const props = defineProps({
  24120. config: {
  24121. type: Object,
  24122. default: () => {}
  24123. },
  24124. intervalTime: {
  24125. type: Number,
  24126. default: 5000
  24127. }
  24128. })
  24129. // 참조가능 데이터 설정
  24130. defineExpose({})
  24131. // 발신 이벤트 선언
  24132. const emit = defineEmits([""]);
  24133. const i18n = useI18n();
  24134. /***********************
  24135. * data & created
  24136. ************************/
  24137. // 코어 상세보기 모달
  24138. const refCoreDetailModal = ref(null);
  24139. const isCoreDetailModal = ref(false);
  24140. // TenantName
  24141. const tenantName = computed(() => useAuthStore().getTenantName);
  24142. // 설정된 위젯 사이즈 : M or S
  24143. const widgetSize = computed(() => props.config?.widgetSize || 'M');
  24144. // 위젯 사이즈별 표시 갯수
  24145. const widgetListLimit = ref({
  24146. S: 12, M: 6
  24147. });
  24148. // 페이징 정보
  24149. const pageObj = ref( {
  24150. page: 1, // 현재 페이지
  24151. pageSize: widgetListLimit.value[widgetSize.value],
  24152. totalCnt: 0, // 전체 페이지
  24153. })
  24154. const objSltSearch = ref({
  24155. neType: '',
  24156. customerType: '',
  24157. sortType: '',
  24158. })
  24159. // 검색조건
  24160. const objSlt = ref({
  24161. neTypeList: [],
  24162. customerTypeList: [],
  24163. sortTypeList: [
  24164. {title: '위험도순', value: 0},
  24165. {title: '이름순(오름차순)', value: 1},
  24166. {title: '이름순(내림차순)', value: 2}
  24167. ],
  24168. })
  24169. // 코어 리스트
  24170. const coreItems = ref([]);
  24171. // 정렬 옵션 open 여부
  24172. const isSortShow = ref(false);
  24173. /***********************
  24174. * Methods
  24175. ************************/
  24176. /**
  24177. * 리셋
  24178. */
  24179. const fnReset = () => {
  24180. objSltSearch.value.neType = '';
  24181. objSltSearch.value.customerType = '';
  24182. objSltSearch.value.sortType = '';
  24183. pageObj.value.page = 1;
  24184. pageObj.value.pageSize = widgetListLimit.value[widgetSize.value],
  24185. pageObj.value.totalCnt = 0;
  24186. }
  24187. /**
  24188. * 코어 리스트 조회
  24189. */
  24190. function fnGetCoreList() {
  24191. const params = {
  24192. tenantName: tenantName.value,
  24193. }
  24194. useAxios().post(apiUrl.getCoreInfoList, params).then((res) => {
  24195. const {resCode, resMsg, data} = res.data;
  24196. if(resCode == 200) {
  24197. // 테스트를 위한 테스트 코드 (삭제 필수)
  24198. // fnParseData([...(data?.items || []), ...testJson.core.data.items])
  24199. fnParseData(data.items || [])
  24200. $log.debug("[dashboard][fnGetCoreList][success]")
  24201. } else {
  24202. $log.debug("[dashboard][fnGetCoreList][error]", `[${resCode}] ${resMsg}`);
  24203. }
  24204. }).catch((error)=>{
  24205. // 테스트를 위한 테스트 코드 (삭제 필수)
  24206. // fnParseData([...testJson.core.data.items])
  24207. $log.debug("[dashboard][fnGetCoreList][error]", error)
  24208. useErrorHandler().fnSetCommErrorHandle(error, fnGetCoreList)
  24209. }).finally(()=>{
  24210. $log.debug("[dashboard][fnGetCoreList][finished]")
  24211. })
  24212. }
  24213. /**
  24214. * 데이터 가공
  24215. */
  24216. function fnParseData(items = []) {
  24217. // {neType: 'AMF', neName: 'neName1', emsStatus: 0, mcmStatus: 0, psmStatus: 0, criCnt: 3,majCnt: 1, minCnt: 1,customerType: 1,CPU: {AVG_CPU_L: 14,PEAK_CPU_L: 15, }, MEM: {AVG_MEM_L: 6,PEAK_MEM_L: 95,}},
  24218. // {id: 14, customerType: '1', level: 'MINOR', isDisconnect: false, neType: 'AMF', status: 'ACTIVE', cpu: Math.random() * 100, memory: Math.random() * 100, disk: Math.random() * 100},
  24219. coreItems.value = [];
  24220. if(!items || items.length < 1) {
  24221. pageObj.value.totalCnt = 0;
  24222. return;
  24223. }
  24224. let temp = [];
  24225. // 검색 조건 적용
  24226. const { neType, customerType} = objSltSearch.value;
  24227. temp = items.filter((data) => (useUtil.isNull(neType) || neType == data.neType) && (useUtil.isNull(customerType) || customerType == data.customerType));
  24228. // 정렬 조건 적용
  24229. const { sortType } = objSltSearch.value;
  24230. temp = temp.sort((a, b) => {
  24231. // 위험도순
  24232. if(sortType == 0) {
  24233. return a.criCnt < b.criCnt ? 1 : a.criCnt > b.criCnt ? -1 : (a.majCnt < b.majCnt ? 1 : a.majCnt > b.majCnt ? -1 : (a.minCnt < b.minCnt ? 1 : a.minCnt > b.minCnt ? -1 : 0));
  24234. }
  24235. //이름순 오름차순
  24236. else if(sortType == 1) {
  24237. return a.neName < b.neName ? -1 : a.neName > b.neName ? 1 : 0;
  24238. }
  24239. //이름순 내림차순
  24240. else if(sortType == 2) {
  24241. return a.neName > b.neName ? -1 : a.neName < b.neName ? 1 : 0;
  24242. }
  24243. })
  24244. // 페이징 적용
  24245. pageObj.value.totalCnt = temp.length;
  24246. temp = temp.filter((data, index) =>(index >= ((pageObj.value.page - 1) * pageObj.value.pageSize) && index < (pageObj.value.page * pageObj.value.pageSize)));
  24247. // 데이터 가공
  24248. coreItems.value = temp.map((item) => {
  24249. // KPI 정보 셋팅 - TODO: CPU, MEM 외의 값이 추가되면 여기에 추가
  24250. const { cpu, mem } = item;
  24251. const kpiItems = [];
  24252. if(cpu) {
  24253. const objCpu = typeof cpu === 'string' ? JSON.parse(cpu) : cpu;
  24254. if(objCpu && objCpu[`AVG_CPU_L(%)`]){
  24255. kpiItems.push({label: 'CPU', val: objCpu[`AVG_CPU_L(%)`] || 0})
  24256. item.cpu = objCpu;
  24257. }
  24258. }
  24259. if(mem) {
  24260. const objMem = typeof mem === 'string' ? JSON.parse(mem) : mem ;
  24261. if(objMem && objMem['AVG_MEM_L(%)']){
  24262. kpiItems.push({label: 'MEMORY', val: objMem['AVG_MEM_L(%)'] || 0})
  24263. item.mem = objMem;
  24264. }
  24265. }
  24266. //고객 유형명 셋팅
  24267. const { customerType } = item;
  24268. let customerTypeName = '';
  24269. if(customerType) {
  24270. const type = objSlt.value.customerTypeList.find((t) => t.value == customerType)
  24271. if(type) customerTypeName = type.title;
  24272. }
  24273. // disconected 셋팅
  24274. const { emsStatus, mcmStatus, psmStatus } = item;
  24275. const connect = {
  24276. isConnected: false,
  24277. reason: [],
  24278. }
  24279. if([emsStatus, mcmStatus, psmStatus].every((status) => status == 0)) {
  24280. connect.isConnected = true;
  24281. } else {
  24282. connect.isConnected = false;
  24283. if(emsStatus != 0 ) connect.reason.push(`emsSatats: ${emsStatus}`);
  24284. if(mcmStatus != 0 ) connect.reason.push(`mcmStatus: ${mcmStatus}`);
  24285. if(psmStatus != 0 ) connect.reason.push(`psmStatus: ${psmStatus}`);
  24286. }
  24287. // 심각도 level 셋팅
  24288. const { criCnt ,majCnt, minCnt } = item;
  24289. let level = '';
  24290. if(criCnt > 0) level = 'CRITICAL';
  24291. else if(majCnt > 0) level = 'MAJOR';
  24292. else if(minCnt > 0) level = 'MINOR';
  24293. return {
  24294. ...item,
  24295. kpiItems, // kpi 정보
  24296. customerTypeName, // 고객유형명
  24297. connect, // 연결 상태
  24298. level, // 심각도 레벨
  24299. }
  24300. });
  24301. }
  24302. /**
  24303. * 페이지 변경
  24304. */
  24305. function fnChgPage(page){
  24306. pageObj.value.page = page;
  24307. fnGetCoreList();
  24308. // gridApi.value.paginationGoToPage(page-1)
  24309. }
  24310. /** 코어 상세보기 open */
  24311. function fnCoreDetailClick(item) {
  24312. isCoreDetailModal.value = true
  24313. refCoreDetailModal.value.fnInit(item)
  24314. }
  24315. /** 코어 상세보기 Close */
  24316. function fnCloseCoreDetailModal() {
  24317. isCoreDetailModal.value = false
  24318. }
  24319. /** 검색조건 > 정렬 변경 */
  24320. function fnOnclickSortType(type) {
  24321. objSltSearch.value.sortType = type;
  24322. isSortShow.value = false;
  24323. }
  24324. /**
  24325. * ENUM 업데이트
  24326. * @param lang
  24327. */
  24328. function fnGetEnumCode(lang){
  24329. lang = useUtil.nvl(lang, 'kr')
  24330. const objEnum = useEnumCode.getEnumCode(lang)
  24331. objSlt.value.neTypeList = [{title: i18n.t('common.all'), value: ''},...objEnum.neType]
  24332. objSlt.value.customerTypeList = [{title: i18n.t('common.all'), value: ''},...objEnum.customerType]
  24333. }
  24334. onMounted(() => fnGetCoreList())
  24335. watchEffect(() => fnGetEnumCode(useLangStore().getLang))
  24336. // 검색 조건 변경 watch
  24337. watch(() => objSltSearch.value, () => {
  24338. pageObj.value.page = 1;
  24339. fnGetCoreList();
  24340. }, {deep: true})
  24341. // 위젯사이즈 변경 watch
  24342. watch(() => widgetSize.value, () => {
  24343. fnReset();
  24344. fnGetCoreList();
  24345. }, {deep: true})
  24346. </script>
  24347. </file>
  24348. <file path="components/home/dashboard/layout02/core/layout02CoreWidgetM.vue">
  24349. <template>
  24350. <div class="inner--content">
  24351. <ul
  24352. v-if="props.items && props.items.length > 0"
  24353. class="core--card"
  24354. >
  24355. <li
  24356. v-for="(item, index) in props.items"
  24357. :key="`core-widget-${index}`"
  24358. :class="getLevelClass(item.connect, item.level)"
  24359. >
  24360. <div>
  24361. <div class="card--header">
  24362. <h2>{{ item.neName }}</h2>
  24363. <v-btn
  24364. class="more--btn"
  24365. flat
  24366. @click="$emit('more', item)"
  24367. />
  24368. </div>
  24369. <div class="card--body">
  24370. <ul>
  24371. <li>
  24372. <span :class="getBodyStatusClass(item.connect)">STATUS</span>
  24373. <!-- <span>{{ item.connect.isConnected ? 'ACTIVE' : item.connect.reason.join(',') }}</span> -->
  24374. <span>{{ item.connect.isConnected ? 'ACTIVE' : '' }}</span>
  24375. </li>
  24376. <li
  24377. v-for="(kpi, idx) in item.kpiItems"
  24378. :key="`core-widget-${index}-${idx}`"
  24379. >
  24380. <span :class="getBodyLevelClass(kpi.val)">{{ kpi.label }}</span>
  24381. <span :class="getBodyLevelClass(kpi.val)">{{ toRoundFix(kpi.val, 2) }}%</span>
  24382. </li>
  24383. </ul>
  24384. </div>
  24385. </div>
  24386. </li>
  24387. </ul>
  24388. <div
  24389. v-else
  24390. class="no--data--card"
  24391. >
  24392. <div class="no--data--contents">
  24393. <h2>데이터가 없습니다.</h2>
  24394. </div>
  24395. </div>
  24396. </div>
  24397. </template>
  24398. <script setup>
  24399. /***********************
  24400. * import
  24401. ************************/
  24402. import { useI18n } from "vue-i18n"
  24403. import apiUrl from '@/composables/useApi';
  24404. import useAxios from '@/composables/useAxios';
  24405. import useUtil from '@/composables/useUtil';
  24406. /***********************
  24407. * plugins inject
  24408. ************************/
  24409. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  24410. // props
  24411. const props = defineProps({
  24412. items: {
  24413. type: Array,
  24414. default: () => []
  24415. }
  24416. })
  24417. // 참조가능 데이터 설정
  24418. defineExpose({})
  24419. // 발신 이벤트 선언
  24420. const emit = defineEmits(["more"]);
  24421. const i18n = useI18n();
  24422. /***********************
  24423. * data & created
  24424. ************************/
  24425. /***********************
  24426. * Methods
  24427. ************************/
  24428. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  24429. // 레벨 클래스 : CRITICAL, MAJOR , MINOR
  24430. const getLevelClass = (connect, level) => {
  24431. if(!connect.isConnected) return 'discon';
  24432. else if(level === 'CRITICAL') return 'critical';
  24433. else if(level === 'MAJOR') return 'major';
  24434. else if(level === 'MINOR') return 'minor';
  24435. else return 'normal';
  24436. }
  24437. // 세부 데이터 상태값
  24438. const getBodyLevelClass = (val) => {
  24439. if(val >= 95) return 'critical'; // red
  24440. else if(val >= 90) return 'major'; // brown
  24441. else if(val >= 85) return 'minor'; // yellow
  24442. else return 'normal'; // green
  24443. }
  24444. // 세부 데이터 STATUS 상태값
  24445. const getBodyStatusClass = (connect) => {
  24446. if(connect.isConnected) return 'normal';
  24447. else return 'critical';
  24448. }
  24449. </script>
  24450. </file>
  24451. <file path="components/home/dashboard/layout02/core/layout02CoreWidgetS.vue">
  24452. <template>
  24453. <div class="inner--content">
  24454. <div
  24455. v-if="props.items && props.items.length > 0"
  24456. class="equip--card--wrap"
  24457. >
  24458. <div
  24459. v-for="(item, index) in props.items"
  24460. :key="`core-widget-${index}`"
  24461. class="equip--card"
  24462. :class="getLevelClass(item.connect, item.level)"
  24463. >
  24464. <div class="equip--name">
  24465. <span :title="item.neType">{{ item.neName }}</span>
  24466. <v-btn
  24467. class="custom--btn mini more--btn"
  24468. flat
  24469. @click="$emit('more', item)"
  24470. />
  24471. </div>
  24472. <ul class="equip--st">
  24473. <li>
  24474. <i
  24475. class="circle"
  24476. :class="getBodyStatusClass(item.connect)"
  24477. />
  24478. <p>STATUS</p>
  24479. <!-- <span class="active">{{ item.connect.isConnected ? 'ACTIVE' : item.connect.reason.join(',') }}</span> -->
  24480. <span class="active">{{ item.connect.isConnected ? 'ACTIVE' : '' }}</span>
  24481. </li>
  24482. <li
  24483. v-for="(kpi, idx) in item.kpiItems"
  24484. :key="`core-widget-${index}-${idx}`"
  24485. >
  24486. <i
  24487. class="circle"
  24488. :class="getBodyLevelClass(kpi.val)"
  24489. />
  24490. <p>{{ kpi.label }}</p>
  24491. <span>{{ toRoundFix(kpi.val, 2) }}%</span>
  24492. </li>
  24493. </ul>
  24494. </div>
  24495. </div>
  24496. <div
  24497. v-else
  24498. class="no--data--card"
  24499. >
  24500. <div class="no--data--contents">
  24501. <h2>데이터가 없습니다.</h2>
  24502. </div>
  24503. </div>
  24504. </div>
  24505. </template>
  24506. <script setup>
  24507. /***********************
  24508. * import
  24509. ************************/
  24510. import { useI18n } from "vue-i18n"
  24511. import apiUrl from '@/composables/useApi';
  24512. import useAxios from '@/composables/useAxios';
  24513. import useUtil from '@/composables/useUtil';
  24514. /***********************
  24515. * plugins inject
  24516. ************************/
  24517. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  24518. // props
  24519. const props = defineProps({
  24520. items: {
  24521. type: Array,
  24522. default: () => []
  24523. }
  24524. })
  24525. // 참조가능 데이터 설정
  24526. defineExpose({})
  24527. // 발신 이벤트 선언
  24528. const emit = defineEmits(["more"]);
  24529. const i18n = useI18n();
  24530. /***********************
  24531. * data & created
  24532. ************************/
  24533. /***********************
  24534. * Methods
  24535. ************************/
  24536. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  24537. // 레벨 클래스 : CRITICAL, MAJOR , MINOR
  24538. const getLevelClass = (connect, level) => {
  24539. if(!connect.isConnected) return 'discon';
  24540. else if(level === 'CRITICAL') return 'critical';
  24541. else if(level === 'MAJOR') return 'major';
  24542. else if(level === 'MINOR') return 'minor';
  24543. else return 'normal';
  24544. }
  24545. // 세부 데이터 상태값
  24546. const getBodyLevelClass = (val) => {
  24547. if(val >= 95) return 'critical'; // red
  24548. else if(val >= 90) return 'major'; // brown
  24549. else if(val >= 85) return 'minor'; // yellow
  24550. else return 'normal'; // green
  24551. }
  24552. // 세부 데이터 STATUS 상태값
  24553. const getBodyStatusClass = (connect) => {
  24554. if(connect.isConnected) return 'normal';
  24555. else return 'critical';
  24556. }
  24557. </script>
  24558. </file>
  24559. <file path="components/home/dashboard/layout02/ran/layout02Ran.vue">
  24560. <template>
  24561. <div class="core--component--wrap">
  24562. <div class="inner--header--wrap">
  24563. <h2 class="inner--component--title none--after">
  24564. RAN
  24565. </h2>
  24566. <!--<div class="pagenation--wrapper">
  24567. <div class="total--wrapper">
  24568. Total : <span class="total--count">18</span>
  24569. </div>
  24570. <div class="pager--btn--wrap">
  24571. <v-btn flat class="page--btn prev--btn"></v-btn>
  24572. <div class="page--numb">
  24573. <span class="current">1</span>/<span>3</span>
  24574. </div>
  24575. <v-btn flat class="page--btn next--btn"></v-btn>
  24576. <div class="user--type">
  24577. <v-select
  24578. v-model="sltModel1"
  24579. :items="slt1"
  24580. variant="outlined"
  24581. style="width:9.5rem"
  24582. class="custom-select"
  24583. >
  24584. </v-select>
  24585. <v-select
  24586. v-model="sltModel2"
  24587. :items="slt2"
  24588. variant="outlined"
  24589. style="width:9.5rem"
  24590. class="custom-select"
  24591. >
  24592. </v-select>
  24593. <v-btn class="custom-btn mini lgd--btn"></v-btn>
  24594. </div>
  24595. </div>
  24596. </div>-->
  24597. </div>
  24598. <div class="inner--content">
  24599. <ul class="ran--card">
  24600. <li v-for="(item, idx) in cardRanInfo" :key="idx" :class="item.cls">
  24601. <div class="ran--title">
  24602. <span class="ran--area">{{item.areaName}}</span>
  24603. <v-btn class="more--btn" flat @click="fnClickCardDetail(item)"></v-btn>
  24604. </div>
  24605. <div class="ran--stat">
  24606. <p>
  24607. <span>테넌트 수</span><span>{{item.tenantCnt}}</span>
  24608. </p>
  24609. <p>
  24610. <span>NE그룹 수</span><span>{{item.neGroupCnt}}</span>
  24611. </p>
  24612. <p>
  24613. <span>NE 수</span><span>{{item.neCnt}}</span>
  24614. </p>
  24615. </div>
  24616. </li>
  24617. </ul>
  24618. </div>
  24619. <RanCardGroupDetailModal v-if="isShowRanCardGroupDetailModal" :propsObj="propsCardObj" :centerPosition="centerPosition" @closeModal="isShowRanCardGroupDetailModal = false"/>
  24620. </div>
  24621. </template>
  24622. <script setup>
  24623. /***********************
  24624. * import
  24625. ************************/
  24626. import { useI18n } from "vue-i18n"
  24627. import apiUrl from '@/composables/useApi';
  24628. import useAxios from '@/composables/useAxios';
  24629. import useUtil from '@/composables/useUtil';
  24630. import RanCardGroupDetailModal from '@/components/home/dashboard/common/ranCardGroupDetailModal.vue';
  24631. /***********************
  24632. * plugins inject
  24633. ************************/
  24634. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  24635. // props
  24636. const props = defineProps({})
  24637. // 참조가능 데이터 설정
  24638. defineExpose({})
  24639. // 발신 이벤트 선언
  24640. const emit = defineEmits([""]);
  24641. const i18n = useI18n();
  24642. /***********************
  24643. * data & created
  24644. ************************/
  24645. const isShowRanCardGroupDetailModal = ref(false)
  24646. // 카카오맵 센터좌표
  24647. const centerPosition = ref({
  24648. lat: 33.450701,
  24649. lng: 126.570667
  24650. })
  24651. const ranInterval = ref(null)
  24652. const sidoCode = ref([])
  24653. const cardRanInfo = ref([]) // 카드형 데이터
  24654. const propsCardObj = ref({})
  24655. onMounted(() => {
  24656. console.log('%c 대시보드 레이아웃2 RAN 카드형 24*12' ,'color:#bada55','')
  24657. fnGeoTenantNeInfo()
  24658. ranInterval.value = setInterval(() => {
  24659. fnGeoTenantNeInfo()
  24660. }, 1000 * 60 * 5)
  24661. })
  24662. onUnmounted(() => {
  24663. clearInterval(ranInterval.value)
  24664. ranInterval.value = null
  24665. })
  24666. watchEffect(() =>{
  24667. fnGetEnumCode(useLangStore().getLang)
  24668. })
  24669. /**
  24670. * ENUM 업데이트
  24671. * @param lang
  24672. */
  24673. function fnGetEnumCode(lang){
  24674. let objEnum = useEnumCode.getEnumCode(lang)
  24675. // ...objEnum.sidoCode
  24676. sidoCode.value = _cloneDeep(objEnum.sidoCode.slice(1))
  24677. fnSetInitMapData()
  24678. }
  24679. const getCardAllRan = computed(() => {
  24680. let result = {
  24681. areaName: '전국현황', areaCode: 0, cls: 'ran--all', criCnt: 0, majCnt: 0, minCnt: 0, tenantCnt: 0, neGroupCnt: 0, neCnt: 0, tenantList:[], neGroupList: []
  24682. }
  24683. cardRanInfo.value.forEach((item, idx) => {
  24684. if(idx !== 0) {
  24685. result.criCnt += item.criCnt
  24686. result.majCnt += item.majCnt
  24687. result.minCnt += item.minCnt
  24688. result.tenantCnt += item.tenantCnt
  24689. result.neGroupCnt += item.neGroupCnt
  24690. result.neCnt += item.neCnt
  24691. result.tenantList.push(...item.tenantList)
  24692. result.neGroupList.push(...item.neGroupList)
  24693. }
  24694. })
  24695. return result
  24696. })
  24697. /***********************
  24698. * Methods
  24699. ************************/
  24700. // 초기 데이터 세팅
  24701. function fnSetInitMapData(){
  24702. let tempCardRanData = [{areaName: '전국현황', areaCode: 0, cls: 'ran--all', criCnt: 0, majCnt: 0, minCnt: 0, tenantCnt: 0, neGroupCnt: 0, neCnt: 0, tenantList:[], neGroupList: []}]
  24703. sidoCode.value.forEach((item) => {
  24704. let cardRanObj = {}
  24705. cardRanObj.areaName = item.title[0]
  24706. cardRanObj.areaCode = item.value
  24707. cardRanObj.cls = ''
  24708. cardRanObj.criCnt = 0
  24709. cardRanObj.majCnt = 0
  24710. cardRanObj.minCnt = 0
  24711. cardRanObj.tenantCnt = 0
  24712. cardRanObj.neGroupCnt = 0
  24713. cardRanObj.neCnt = 0
  24714. cardRanObj.tenantList = []
  24715. cardRanObj.neGroupList = []
  24716. tempCardRanData.push(cardRanObj)
  24717. })
  24718. cardRanInfo.value = _cloneDeep(tempCardRanData)
  24719. }
  24720. /**
  24721. * P5G RAN
  24722. */
  24723. function fnGeoTenantNeInfo() {
  24724. let _req = {
  24725. tenantName: useAuthStore().getTenantName
  24726. }
  24727. useAxios().post(useApi.tenantNeInfo, _req).then((res) => {
  24728. $log.debug("[dashboard][fnGeoTenantNeInfo][success]")
  24729. let datas = res.data.data.items
  24730. fnMakeNeData(datas)
  24731. }).catch((error)=>{
  24732. $log.debug("[dashboard][fnGeoTenantNeInfo][error]")
  24733. useErrorHandler().fnSetCommErrorHandle(error, fnGeoTenantNeInfo)
  24734. }).finally(()=>{
  24735. $log.debug("[dashboard][fnGeoTenantNeInfo][finished]")
  24736. })
  24737. }
  24738. /**
  24739. * 지도 데이터 및 모든 데이터 가공
  24740. */
  24741. function fnMakeNeData(arr){
  24742. // 데이터 초기화
  24743. fnSetInitMapData()
  24744. arr.forEach((item, idx) => {
  24745. // 카드형 데이터 세팅
  24746. let cardFindIndex = cardRanInfo.value.findIndex((obj => obj.areaCode === item.areaCode))
  24747. if(cardFindIndex !== -1) {
  24748. // 테넌트 리스트 세팅
  24749. cardRanInfo.value[cardFindIndex].minCnt += item.minCnt
  24750. cardRanInfo.value[cardFindIndex].majCnt += item.majCnt
  24751. cardRanInfo.value[cardFindIndex].criCnt += item.criCnt
  24752. if(!cardRanInfo.value[cardFindIndex].tenantList.includes(item.tenantName)) {
  24753. cardRanInfo.value[cardFindIndex].tenantList.push(item.tenantName)
  24754. cardRanInfo.value[cardFindIndex].tenantCnt++
  24755. }
  24756. // 그룹 및 NE 세팅
  24757. if(!_isEmpty(_find(cardRanInfo.value[cardFindIndex].neGroupList, {neGroup: item.neGroup}))) {
  24758. let groupFindIndex = cardRanInfo.value[cardFindIndex].neGroupList.findIndex((obj => obj.neGroup === item.neGroup))
  24759. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].minCnt += item.minCnt
  24760. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].majCnt += item.majCnt
  24761. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].criCnt += item.criCnt
  24762. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].neCnt++
  24763. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].tenantName = item.tenantName
  24764. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].neList.push(item)
  24765. cardRanInfo.value[cardFindIndex].neCnt++
  24766. }else{
  24767. cardRanInfo.value[cardFindIndex].neGroupList.push({neGroup: item.neGroup, tenantName: item.tenantName, neCnt: 1, minCnt: item.minCnt, majCnt: item.majCnt, criCnt: item.criCnt, neList: [item]})
  24768. cardRanInfo.value[cardFindIndex].neGroupCnt++
  24769. cardRanInfo.value[cardFindIndex].neCnt++
  24770. }
  24771. }
  24772. })
  24773. // 카드형 데이터 > 전국현황 데이터 세팅
  24774. cardRanInfo.value[0] = _cloneDeep(getCardAllRan.value)
  24775. console.log('%c 카드형 전국현황 데이터 [cardRanInfo]' ,'color:#bada55', cardRanInfo.value)
  24776. }
  24777. /**
  24778. * 카드형 UI 상세보기 클릭
  24779. */
  24780. function fnClickCardDetail(item) {
  24781. console.log('%c 클릭 item' ,'color:#bada55', item)
  24782. propsCardObj.value = item
  24783. isShowRanCardGroupDetailModal.value = true
  24784. }
  24785. </script>
  24786. </file>
  24787. <file path="components/home/dashboard/layout02/user/layout02User.vue">
  24788. <template>
  24789. <div>
  24790. <!-- <div :class="widgetSize === 'M' ? 'user--list--bar--graph' : 'user--list--bar--graph small'"> -->
  24791. <div :class="widgetSize === 'M' ? 'user--list--wrap user--list--bar--graph' : 'user--list--bar--graph small'">
  24792. <!-- 헤더 영역 : S -->
  24793. <div class="inner--header--wrap">
  24794. <h2 class="inner--component--title none--after">
  24795. 가입자
  24796. </h2>
  24797. <pagination
  24798. :page-obj="pageObj"
  24799. @chg_page="fnChgPage"
  24800. >
  24801. <template
  24802. v-if="userItems && userItems.length > 0"
  24803. #rightArea
  24804. >
  24805. <div class="btn--list--content">
  24806. <v-btn
  24807. class="custom-btn mini all--view--btn"
  24808. @click="fnUserTotalClick"
  24809. >
  24810. <i class="icon" />전체보기
  24811. </v-btn>
  24812. </div>
  24813. <div class="shape--selector">
  24814. <v-btn
  24815. class="custom-btn mini card--type--btn"
  24816. :class="{ on: showType === 'CARD' }"
  24817. @click="fnChangeShowType('CARD')"
  24818. />
  24819. <v-btn
  24820. class="custom-btn mini list--type--btn"
  24821. :class="{ on: showType === 'TABLE' }"
  24822. @click="fnChangeShowType('TABLE')"
  24823. />
  24824. </div>
  24825. </template>
  24826. </pagination>
  24827. </div>
  24828. <!-- <div v-if="widgetSize === 'S'" /> -->
  24829. <!-- 헤더 영역 : E -->
  24830. <!-- Contents 영역 : S -->
  24831. <div class="user--list--contents">
  24832. <WidgetM
  24833. v-if="showType === 'CARD' && widgetSize === 'M'"
  24834. :items="userItems"
  24835. />
  24836. <WidgetS
  24837. v-if="showType === 'CARD' && widgetSize === 'S'"
  24838. :items="userItems"
  24839. />
  24840. <WidgetT
  24841. v-if="showType === 'TABLE'"
  24842. :items="userItems"
  24843. :page-obj="pageObj"
  24844. />
  24845. </div>
  24846. <!-- Contents 영역 : E -->
  24847. </div>
  24848. </div>
  24849. </template>
  24850. <script setup>
  24851. /***********************
  24852. * import
  24853. ************************/
  24854. import { useI18n } from "vue-i18n"
  24855. import apiUrl from '@/composables/useApi';
  24856. import useAxios from '@/composables/useAxios';
  24857. import useUtil from '@/composables/useUtil';
  24858. import pagination from "@/components/home/dashboard/common/pagination.vue"
  24859. import WidgetM from "@/components/home/dashboard/layout02/user/layout02UserWidgetM.vue"
  24860. import WidgetS from "@/components/home/dashboard/layout02/user/layout02UserWidgetS.vue"
  24861. import WidgetT from "@/components/home/dashboard/layout02/user/layout02UserWidgetT.vue"
  24862. import testJson from "../../test.json"
  24863. /***********************
  24864. * plugins inject
  24865. ************************/
  24866. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  24867. // props
  24868. const props = defineProps({
  24869. config: {
  24870. type: Object,
  24871. default: () => {}
  24872. },
  24873. intervalTime: {
  24874. type: Number,
  24875. default: 5000
  24876. }
  24877. })
  24878. // 참조가능 데이터 설정
  24879. defineExpose({})
  24880. // 발신 이벤트 선언
  24881. const emit = defineEmits([""]);
  24882. const i18n = useI18n();
  24883. /***********************
  24884. * data & created
  24885. ************************/
  24886. // 카드 / 리스트 구분
  24887. const showType = ref('CARD'); // CARD or TABLE
  24888. // TenantName
  24889. const tenantName = computed(() => useAuthStore().getTenantName);
  24890. // 설정된 위젯 사이즈 : M or S
  24891. const widgetSize = computed(() => props.config?.widgetSize || 'M');
  24892. // 위젯 사이즈별 표시 갯수
  24893. const widgetListLimit = ref({
  24894. S: 20, M: 8, T: 10,
  24895. });
  24896. // 페이징 정보
  24897. const pageObj = ref( {
  24898. page: 1, // 현재 페이지
  24899. pageSize: widgetListLimit.value[widgetSize.value], // 테이블 조회 데이터 개수
  24900. totalCnt: 0, // 전체 페이지
  24901. })
  24902. // 가입자 리스트
  24903. const userItems = ref([]);
  24904. /***********************
  24905. * Methods
  24906. ************************/
  24907. const fnReset = () => {
  24908. userItems.value = [];
  24909. showType.value = 'CARD';
  24910. pageObj.value.page = 1;
  24911. pageObj.value.pageSize = widgetListLimit.value[widgetSize.value];
  24912. pageObj.value.totalCnt = 0;
  24913. }
  24914. function fnGetUserList() {
  24915. const params = {
  24916. tenantName: tenantName.value,
  24917. }
  24918. useAxios().post(apiUrl.getUserList, params).then((res) => {
  24919. const {resCode, resMsg, data} = res.data;
  24920. if(resCode == 200) {
  24921. // 테스트를 위한 테스트 코드 (삭제 필수)
  24922. // fnParseData([...(data?.items || []), ...testJson.user.data.items])
  24923. fnParseData(data.items || [])
  24924. $log.debug("[dashboard][fnGetUserList][success]")
  24925. } else {
  24926. $log.debug("[dashboard][fnGetUserList][error]", `[${resCode}] ${resMsg}`);
  24927. }
  24928. }).catch((error)=>{
  24929. // 테스트를 위한 테스트 코드 (삭제 필수)
  24930. // fnParseData([...testJson.user.data.items])
  24931. $log.debug("[dashboard][fnGetUserList][error]", error)
  24932. useErrorHandler().fnSetCommErrorHandle(error, fnGetUserList)
  24933. // 테스트 데이터 파싱
  24934. }).finally(()=>{
  24935. $log.debug("[dashboard][fnGetUserList][finished]")
  24936. })
  24937. }
  24938. /**
  24939. * 데이터 가공
  24940. */
  24941. function fnParseData(items = []) {
  24942. // {tenantName: '',maxSubscriber: ,curSubscriber: ,expirationDate: '', maxAccount: ,currentAccountCount: ,maxSession: 100,currentConnectingCount: ,},
  24943. userItems.value = [];
  24944. if(!items || items.length < 1) {
  24945. pageObj.value.totalCnt = 0;
  24946. return;
  24947. }
  24948. let temp = [];
  24949. // 정렬 적용
  24950. temp = items.sort((a, b) => {
  24951. const perA = fnGetPercentValue(a.maxSubscriber, a.curSubscriber);
  24952. const perB = fnGetPercentValue(b.maxSubscriber, b.curSubscriber);
  24953. return +perA < +perB ? 1 : (+perA > +perB ? -1 : 0);
  24954. })
  24955. // 페이징 적용
  24956. pageObj.value.totalCnt = temp.length;
  24957. temp = temp.filter((data, index) =>(index >= ((pageObj.value.page - 1) * pageObj.value.pageSize) && index < (pageObj.value.page * pageObj.value.pageSize)));
  24958. // 데이터 가공
  24959. userItems.value = temp.map((item, index) => {
  24960. //percent
  24961. const { maxSubscriber, curSubscriber } = item;
  24962. const perSubscriber = fnGetPercentValue(maxSubscriber, curSubscriber);
  24963. //심각도
  24964. const level = fnGetLevel(perSubscriber);
  24965. //차트 데이터
  24966. const chartData = {
  24967. datasets: [
  24968. {
  24969. data: [curSubscriber , maxSubscriber - curSubscriber],
  24970. backgroundColor: fnGetChartColorSet(level),
  24971. borderWidth: 0,
  24972. }
  24973. ]
  24974. }
  24975. //테이블 사용량 class
  24976. const tablePercentClass = fnGetTablePercentClass(level);
  24977. return {
  24978. ...item,
  24979. no: index+1,
  24980. level,
  24981. perSubscriber,
  24982. chartData,
  24983. tablePercentClass
  24984. }
  24985. })
  24986. console.log("::: layout02User > parsed Data :: ", userItems.value )
  24987. }
  24988. /** make percent data */
  24989. const fnGetPercentValue = (max, curr) => {
  24990. return useUtil.toRoundFix((curr / max) * 100, 0);
  24991. }
  24992. const fnGetLevel = (per) => {
  24993. if(per >= 95) return 'critical'; //critical
  24994. else if(per >= 90) return 'major'; //major
  24995. else if(per >= 85) return 'minor'; //minor
  24996. else return 'normal'; //normal
  24997. }
  24998. /** 차트 데이터 > 컬러셋 */
  24999. const fnGetChartColorSet = (level) => {
  25000. if(level == 'critical') return ['#f00','#EAEAEA']; //critical
  25001. else if(level == 'major') return ['#C96103','#EAEAEA']; //major
  25002. else if(level == 'minor') return ['#DDA405','#EAEAEA']; //minor
  25003. else return ['#2D8CFA','#EAEAEA']; //normal
  25004. }
  25005. /** 테이블 > 사용량 class */
  25006. const fnGetTablePercentClass = (level) => {
  25007. if(level == 'critical') return 'user--list--critical'; //critical
  25008. else if(level == 'major') return 'user--list--major'; //major
  25009. else if(level == 'minor') return 'user--list--minor'; //minor
  25010. else return 'user--list--normal';
  25011. }
  25012. /** 카드형/목록형 Change Event */
  25013. function fnChangeShowType(type) {
  25014. pageObj.value.page = 1;
  25015. pageObj.value.totalCnt = 0;
  25016. if(type === 'TABLE') pageObj.value.pageSize = widgetListLimit.value.T;
  25017. else pageObj.value.pageSize = widgetListLimit.value[widgetSize.value];
  25018. fnGetUserList();
  25019. showType.value = type;
  25020. }
  25021. /** 전체보기 open */
  25022. function fnUserTotalClick() {
  25023. const url = window.location.origin+'/view/home/user'
  25024. const popupWindow = window.open(url, '_blank', 'width=' + screen.width + ',height=' + screen.height + ',fullscreen=yes')
  25025. if (popupWindow) {
  25026. popupWindow.focus()
  25027. }
  25028. }
  25029. /**
  25030. * 페이지 변경
  25031. */
  25032. function fnChgPage(page){
  25033. pageObj.value.page = page
  25034. fnGetUserList();
  25035. }
  25036. onMounted(() => fnGetUserList())
  25037. // 위젯사이즈 변경 watch
  25038. watch(() => widgetSize.value, () => {
  25039. fnReset();
  25040. fnGetUserList();
  25041. }, {deep: true})
  25042. </script>
  25043. </file>
  25044. <file path="components/home/dashboard/layout02/user/layout02UserWidgetM.vue">
  25045. <template>
  25046. <ul>
  25047. <li
  25048. v-for="(item, index) in props.items"
  25049. :key="`user-widget-${index}`"
  25050. :class="item.level"
  25051. >
  25052. <div class="headers">
  25053. <div class="title">
  25054. {{ item.tenantName }}
  25055. </div>
  25056. </div>
  25057. <div class="chart--box">
  25058. <Doughnut
  25059. :data="item.chartData"
  25060. :options="chartOptions"
  25061. />
  25062. <div class="current--value">
  25063. {{ toRoundFix(item.curSubscriber, 0) }} / {{ item.maxSubscriber }}
  25064. </div>
  25065. </div>
  25066. <div class="current--value--ps">
  25067. {{ item.perSubscriber }}<i class="unit">%</i>
  25068. </div>
  25069. </li>
  25070. </ul>
  25071. </template>
  25072. <script setup>
  25073. /***********************
  25074. * import
  25075. ************************/
  25076. import { useI18n } from "vue-i18n"
  25077. import apiUrl from '@/composables/useApi';
  25078. import useAxios from '@/composables/useAxios';
  25079. import useUtil from '@/composables/useUtil';
  25080. import { Doughnut } from 'vue-chartjs';
  25081. import { Chart as ChartJS, Title, Tooltip, Legend, BarElement, LineController, LineElement, PointElement, ArcElement, CategoryScale, LinearScale } from 'chart.js';
  25082. /***********************
  25083. * plugins inject
  25084. ************************/
  25085. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  25086. // props
  25087. const props = defineProps({
  25088. items: {
  25089. type: Array,
  25090. default: () => []
  25091. },
  25092. })
  25093. // 참조가능 데이터 설정
  25094. defineExpose({})
  25095. // 발신 이벤트 선언
  25096. const emit = defineEmits([]);
  25097. const i18n = useI18n();
  25098. ChartJS.register(Title,
  25099. Tooltip,
  25100. Legend,
  25101. BarElement,
  25102. LineController,
  25103. LineElement,
  25104. PointElement,
  25105. CategoryScale,
  25106. ArcElement,
  25107. LinearScale)
  25108. /***********************
  25109. * data & created
  25110. ************************/
  25111. const chartOptions = {
  25112. responsive: true,
  25113. maintainAspectRatio: false,
  25114. cutout:"75%",
  25115. rotation: 270,
  25116. circumference: 180,
  25117. plugins: {
  25118. legend: {
  25119. position:'top',
  25120. display: false
  25121. },
  25122. tooltip: {
  25123. enabled:false
  25124. }
  25125. }
  25126. }
  25127. /***********************
  25128. * Methods
  25129. ************************/
  25130. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  25131. </script>
  25132. </file>
  25133. <file path="components/home/dashboard/layout02/user/layout02UserWidgetS.vue">
  25134. <template>
  25135. <ul class="data--list--content--modal">
  25136. <li
  25137. v-for="(item, index) in props.items"
  25138. :key="`user-widget-${index}`"
  25139. :class="item.level"
  25140. >
  25141. <h2>
  25142. <span>
  25143. {{ item.tenantName }}
  25144. </span>
  25145. </h2>
  25146. <div class="data--column">
  25147. <div class="percent">
  25148. {{ item.perSubscriber }}<i class="unit">%</i>
  25149. </div>
  25150. <div class="data--bar--chart">
  25151. <div class="data--bar--wrap">
  25152. <div
  25153. class="data--bar--current"
  25154. :style="{width:item.perSubscriber + '%'}"
  25155. >
  25156. {{ toRoundFix(item.curSubscriber, 0) }}/{{ item.maxSubscriber }}
  25157. </div>
  25158. </div>
  25159. </div>
  25160. </div>
  25161. </li>
  25162. </ul>
  25163. </template>
  25164. <script setup>
  25165. /***********************
  25166. * import
  25167. ************************/
  25168. import { useI18n } from "vue-i18n"
  25169. import apiUrl from '@/composables/useApi';
  25170. import useAxios from '@/composables/useAxios';
  25171. import useUtil from '@/composables/useUtil';
  25172. /***********************
  25173. * plugins inject
  25174. ************************/
  25175. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  25176. // props
  25177. const props = defineProps({
  25178. items: {
  25179. type: Array,
  25180. default: () => []
  25181. },
  25182. })
  25183. // 참조가능 데이터 설정
  25184. defineExpose({})
  25185. // 발신 이벤트 선언
  25186. const emit = defineEmits([]);
  25187. const i18n = useI18n();
  25188. /***********************
  25189. * data & created
  25190. ************************/
  25191. /***********************
  25192. * Methods
  25193. ************************/
  25194. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  25195. </script>
  25196. </file>
  25197. <file path="components/home/dashboard/layout02/user/layout02UserWidgetT.vue">
  25198. <template>
  25199. <div class="tbl-wrapper">
  25200. <div class="tbl-wrap">
  25201. <!-- ag-grid -->
  25202. <ag-grid-vue
  25203. style="width:100%; height:calc(50vh - 11rem)"
  25204. class="ag-theme-quartz"
  25205. :grid-options="gridOptions"
  25206. :row-data="props.items"
  25207. :pagination-page-size="props.pageObj.pageSize"
  25208. :pagination-page-size-selector="columnList"
  25209. :suppress-pagination-panel="true"
  25210. @grid-ready="fnOnGridReady"
  25211. />
  25212. </div>
  25213. </div>
  25214. </template>
  25215. <script setup>
  25216. /***********************
  25217. * import
  25218. ************************/
  25219. import { useI18n } from "vue-i18n"
  25220. import apiUrl from '@/composables/useApi';
  25221. import useAxios from '@/composables/useAxios';
  25222. import useUtil from '@/composables/useUtil';
  25223. import "ag-grid-community/styles/ag-grid.css";
  25224. import "ag-grid-community/styles/ag-theme-quartz.css";
  25225. import { AgGridVue } from "ag-grid-vue3";
  25226. import dayjs from "#build/dayjs.imports.mjs";
  25227. /***********************
  25228. * plugins inject
  25229. ************************/
  25230. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  25231. // props
  25232. const props = defineProps({
  25233. items: {
  25234. type: Array,
  25235. default: () => []
  25236. },
  25237. pageObj: {
  25238. type: Object,
  25239. default: () => {
  25240. return {
  25241. page: 1,
  25242. pageSize: 10,
  25243. totalCnt: 0,
  25244. }
  25245. }
  25246. }
  25247. })
  25248. // 참조가능 데이터 설정
  25249. defineExpose({})
  25250. // 발신 이벤트 선언
  25251. const emit = defineEmits([]);
  25252. const i18n = useI18n();
  25253. /***********************
  25254. * data & created
  25255. ************************/
  25256. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  25257. const vhToPx = (vh) => window.innerHeight * (vh / 100);
  25258. const rowHeightRem = 2.2; // 원하는 rem 값
  25259. const rowHeightPx = rowHeightRem * remToPx();
  25260. const gridApi = shallowRef();
  25261. const getHeaders = computed(() => [
  25262. { headerName: 'No', field: 'no', maxWidth: 75},
  25263. { headerName: '테넌트 명', field: 'tenantName'},
  25264. { headerName: '사용량', maxWidth: 150, cellRenderer: fnPercentCellRenderer},
  25265. { headerName: '만료일', maxWidth: 150, cellRenderer: fnExpiredDateCellRenderer},
  25266. { headerName: '계정 현황 (사용/최대)', cellRenderer: fnAccountStatusRenderer},
  25267. { headerName: '세션 현황 (접속/최대)', cellRenderer: fnSessionStatusRenderer},
  25268. ])
  25269. // gridOption
  25270. const gridOptions = {
  25271. columnDefs: getHeaders.value,
  25272. rowData: props.items, // 테이블 데이터
  25273. suppressMovableColumns: true,
  25274. autoSizeStrategy: {
  25275. type: "fitGridWidth", // width맞춤
  25276. },
  25277. headerHeight : rowHeightPx,
  25278. rowHeight: rowHeightPx,
  25279. pagination: true,
  25280. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  25281. suppressRowClickSelection: true, // 행 클릭 체크박스 무시
  25282. localeText: {
  25283. noRowsToShow: i18n.t('common.noData')
  25284. },
  25285. defaultColDef: {
  25286. lockVisible: true, // 열을 그리드 밖으로 꺼내지 않음
  25287. },
  25288. }
  25289. /***********************
  25290. * Methods
  25291. ************************/
  25292. // Grid 데이터 바인딩
  25293. function fnOnGridReady(params){
  25294. gridApi.value = params.api
  25295. }
  25296. // 사용량 렌더러
  25297. function fnPercentCellRenderer(params) {
  25298. const { data } = params;
  25299. return `<span class="${data.tablePercentClass}">${data.perSubscriber}%</span>`;
  25300. }
  25301. // 만료일 렌더러
  25302. function fnExpiredDateCellRenderer(params) {
  25303. return dayjs(params.expirationDate).format('YYYY-MM-DD');
  25304. }
  25305. // 계정현황 렌더러
  25306. function fnAccountStatusRenderer(params) {
  25307. const { data } = params;
  25308. return `${useUtil.toRoundFix(data.currentAccountCount, 0)}/${useUtil.toRoundFix(data.maxAccount, 0)}`
  25309. }
  25310. // 세션현황 렌더러
  25311. function fnSessionStatusRenderer(params) {
  25312. const { data } = params;
  25313. return `${useUtil.toRoundFix(data.currentConnectingCount, 0)}/${useUtil.toRoundFix(data.maxSession, 0)}`
  25314. }
  25315. </script>
  25316. </file>
  25317. <file path="components/home/dashboard/layout02/layout02.vue">
  25318. <template>
  25319. <div class="dash--board--contents type2">
  25320. <!-- CORE -->
  25321. <div>
  25322. <Core12x12
  25323. :config="coreConfig"
  25324. :interval-time="props.intervalTime"
  25325. />
  25326. </div>
  25327. <!-- USER -->
  25328. <div>
  25329. <User12x12
  25330. :config="userConfig"
  25331. :interval-time="props.intervalTime"
  25332. />
  25333. </div>
  25334. <!-- RAN -->
  25335. <div>
  25336. <Ran24x12
  25337. :config="raneConfig"
  25338. :interval-time="props.intervalTime"
  25339. />
  25340. </div>
  25341. </div>
  25342. </template>
  25343. <script setup>
  25344. /***********************
  25345. * import
  25346. ************************/
  25347. import { useI18n } from "vue-i18n"
  25348. import Core12x12 from '@/components/home/dashboard/layout02/core/layout02Core.vue'
  25349. import User12x12 from '@/components/home/dashboard/layout02/user/layout02User.vue'
  25350. import Ran24x12 from '@/components/home/dashboard/layout02/ran/layout02Ran.vue'
  25351. /***********************
  25352. * plugins inject
  25353. ************************/
  25354. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  25355. // props
  25356. const props = defineProps({
  25357. intervalTime: {
  25358. type: Number,
  25359. default: 5000
  25360. }
  25361. })
  25362. // 참조가능 데이터 설정
  25363. defineExpose({})
  25364. // 발신 이벤트 선언
  25365. const emit = defineEmits([""]);
  25366. const i18n = useI18n();
  25367. /***********************
  25368. * data & created
  25369. ************************/
  25370. const widgets = computed(() => useAuthStore().getWidgets);
  25371. const coreConfig = computed(() => widgets.value?.find(w => w.widgetGrp == 'CORE'));
  25372. const userConfig = computed(() => widgets.value?.find(w => w.widgetGrp == 'USER'));
  25373. const raneConfig = computed(() => widgets.value?.find(w => w.widgetGrp == 'RANE'));
  25374. /***********************
  25375. * Methods
  25376. ************************/
  25377. </script>
  25378. </file>
  25379. <file path="components/home/dashboard/layout03/core/layout03Core.vue">
  25380. <template>
  25381. <div class="core--component--wrap core--tp">
  25382. <!--현황 정보 영역 -->
  25383. <div>
  25384. <div class="inner--header--wrap">
  25385. <h2 class="inner--component--title none--after">
  25386. CORE
  25387. </h2>
  25388. <span class="inner--component--date">{{ current }}</span>
  25389. </div>
  25390. <div class="inner--content">
  25391. <div class="oper--stat">
  25392. <div class="card--title">
  25393. <h3>운영 현황</h3>
  25394. <p>Total : <span>{{ objCount.total }}</span></p>
  25395. </div>
  25396. <div class="card--cont">
  25397. <div class="card">
  25398. <div class="card--count">
  25399. NE 수 : <span>{{ objCount.customer0 }}</span>
  25400. </div>
  25401. <div class="card--txt">
  25402. 대내 <span>{{ objCount.customer0 }}</span>
  25403. </div>
  25404. </div>
  25405. <div class="card">
  25406. <div class="card--count">
  25407. NE 수 : <span>{{ objCount.customer1 }}</span>
  25408. </div>
  25409. <div class="card--txt">
  25410. 대외 <span>{{ objCount.customer1 }}</span>
  25411. </div>
  25412. </div>
  25413. <div class="card">
  25414. <div class="card--count">
  25415. NE 수 : <span>{{ objCount.customer2 }}</span>
  25416. </div>
  25417. <div class="card--txt">
  25418. 공공 <span>{{ objCount.customer2 }}</span>
  25419. </div>
  25420. </div>
  25421. </div>
  25422. </div>
  25423. <!-- <div class="oper--stat">
  25424. <div class="card--title">
  25425. <h3>장비 상태</h3>
  25426. <p>Total : <span>0</span></p>
  25427. </div>
  25428. <div class="card--alarm">
  25429. <div class="card">
  25430. <div class="ico" />
  25431. <div class="alarm--txt">
  25432. <p>알람 수신</p>
  25433. <span>0</span>
  25434. </div>
  25435. </div>
  25436. <div class="card no--alarm">
  25437. <div class="ico" />
  25438. <div class="alarm--txt">
  25439. <p>알람 미수신</p>
  25440. <span>0</span>
  25441. </div>
  25442. </div>
  25443. </div>
  25444. </div> -->
  25445. <div class="link--stat discon">
  25446. <div class="card--title">
  25447. <h3>연동 상태</h3>
  25448. </div>
  25449. <div class="card--cont">
  25450. <div class="ico" />
  25451. <p>Disconnected</p>
  25452. <span>{{ objCount.disconnected }}</span>
  25453. </div>
  25454. </div>
  25455. </div>
  25456. </div>
  25457. <!-- 위젯 영역 -->
  25458. <WidgetM
  25459. v-if="isLoaded && widgetSize === 'M'"
  25460. :items="coreItems"
  25461. :total-cnt="objCount.total"
  25462. />
  25463. <WidgetS
  25464. v-if="isLoaded && widgetSize === 'S'"
  25465. :items="coreItems"
  25466. :total-cnt="objCount.total"
  25467. />
  25468. </div>
  25469. </template>
  25470. <script setup>
  25471. /***********************
  25472. * import
  25473. ************************/
  25474. import { useI18n } from "vue-i18n"
  25475. import apiUrl from '@/composables/useApi';
  25476. import useAxios from '@/composables/useAxios';
  25477. import useUtil from '@/composables/useUtil';
  25478. import dayjs from "#build/dayjs.imports.mjs";
  25479. import WidgetM from "@/components/home/dashboard/layout03/core/layout03CoreWidgetM.vue"
  25480. import WidgetS from "@/components/home/dashboard/layout03/core/layout03CoreWidgetS.vue"
  25481. import testJson from "../../test.json"
  25482. /***********************
  25483. * plugins inject
  25484. ************************/
  25485. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  25486. // props
  25487. const props = defineProps({
  25488. config: {
  25489. type: Object,
  25490. default: () => {}
  25491. },
  25492. intervalTime: {
  25493. type: Number,
  25494. default: 5000
  25495. }
  25496. })
  25497. // 참조가능 데이터 설정
  25498. defineExpose({})
  25499. // 발신 이벤트 선언
  25500. const emit = defineEmits([""]);
  25501. const i18n = useI18n();
  25502. /***********************
  25503. * data & created
  25504. ************************/
  25505. // TenantName
  25506. const tenantName = computed(() => useAuthStore().getTenantName);
  25507. // 설정된 위젯 사이즈 : M or S
  25508. const widgetSize = computed(() => props.config?.widgetSize || 'M');
  25509. // Swiper 표시 slide 갯수
  25510. const slideItemSize = computed(() => widgetSize.value == 'M' ? 4 : 8)
  25511. // 현재 일시
  25512. const current = ref(dayjs().format('YYYY-MM-DD HH:mm:ss'));
  25513. // 카운트 정보
  25514. const objCount = ref({
  25515. total: 0,
  25516. customer0: 0,
  25517. customer1: 0,
  25518. customer2: 0,
  25519. disconnected: 0,
  25520. })
  25521. // 코어 리스트
  25522. const coreItems = ref([]);
  25523. // 데이터 조회 여부
  25524. const isLoaded = ref(false);
  25525. /***********************
  25526. * Methods
  25527. ************************/
  25528. /**
  25529. * 리셋
  25530. */
  25531. const fnReset = () => {
  25532. objCount.value.total = 0;
  25533. objCount.value.customer0 = 0;
  25534. objCount.value.customer1 = 0;
  25535. objCount.value.customer2 = 0;
  25536. objCount.value.disconnected = 0;
  25537. current.value = dayjs().format('YYYY-MM-DD HH:mm:ss');
  25538. }
  25539. /**
  25540. * 코어 리스트 조회
  25541. */
  25542. function fnGetCoreList() {
  25543. const params = {
  25544. tenantName: tenantName.value,
  25545. }
  25546. isLoaded.value = false;
  25547. useAxios().post(apiUrl.getCoreInfoList, params).then((res) => {
  25548. const {resCode, resMsg, data} = res.data;
  25549. if(resCode == 200) {
  25550. // 테스트를 위한 테스트 코드 (삭제 필수)
  25551. // fnParseData([...(data?.items || []), ...testJson.core.data.items])
  25552. fnParseData(data.items || [])
  25553. $log.debug("[dashboard][fnGetCoreList][success]")
  25554. } else {
  25555. $log.debug("[dashboard][fnGetCoreList][error]", `[${resCode}] ${resMsg}`);
  25556. }
  25557. }).catch((error)=>{
  25558. // 테스트를 위한 테스트 코드 (삭제 필수)
  25559. // fnParseData([...testJson.core.data.items])
  25560. $log.debug("[dashboard][fnGetCoreList][error]", error)
  25561. useErrorHandler().fnSetCommErrorHandle(error, fnGetCoreList)
  25562. }).finally(()=>{
  25563. $log.debug("[dashboard][fnGetCoreList][finished]")
  25564. isLoaded.value = true;
  25565. })
  25566. }
  25567. /**
  25568. * 데이터 가공
  25569. */
  25570. function fnParseData(items = []) {
  25571. coreItems.value = [];
  25572. if(!items || items.length < 1) {
  25573. objCount.value.total = 0;
  25574. objCount.value.customer0 = 0;
  25575. objCount.value.customer1 = 0;
  25576. objCount.value.customer2 = 0;
  25577. objCount.value.disconnected = 0;
  25578. return;
  25579. }
  25580. let temp = [];
  25581. // 정렬 적용
  25582. temp = items.sort((a, b) => {
  25583. // 위험도순
  25584. return a.criCnt < b.criCnt ? 1 : a.criCnt > b.criCnt ? -1 : (a.majCnt < b.majCnt ? 1 : a.majCnt > b.majCnt ? -1 : (a.minCnt < b.minCnt ? 1 : a.minCnt > b.minCnt ? -1 : 0));
  25585. })
  25586. // 데이터 가공
  25587. temp = temp.map((item) => {
  25588. //카운트 셋팅
  25589. const { customerType } = item;
  25590. objCount.value.total = objCount.value.total+1;
  25591. if(customerType == 0) objCount.value.customer0 = objCount.value.customer0 + 1;
  25592. else if(customerType == 1) objCount.value.customer1 = objCount.value.customer1 + 1;
  25593. else if(customerType == 2) objCount.value.customer2 = objCount.value.customer2 + 1;
  25594. // KPI 정보 셋팅 - TODO: CPU, MEM 외의 값이 추가되면 여기에 추가
  25595. const { cpu, mem } = item;
  25596. const kpiItems = [];
  25597. if(cpu) {
  25598. const objCpu = typeof cpu === 'string' ? JSON.parse(cpu) : cpu;
  25599. if(objCpu && objCpu[`AVG_CPU_L(%)`]){
  25600. kpiItems.push({label: 'CPU', val: objCpu[`AVG_CPU_L(%)`] || 0})
  25601. item.cpu = objCpu;
  25602. }
  25603. }
  25604. if(mem) {
  25605. const objMem = typeof mem === 'string' ? JSON.parse(mem) : mem ;
  25606. if(objMem && objMem['AVG_MEM_L(%)']){
  25607. kpiItems.push({label: 'MEMORY', val: objMem['AVG_MEM_L(%)'] || 0})
  25608. item.mem = objMem;
  25609. }
  25610. }
  25611. // disconected 셋팅
  25612. const { emsStatus, mcmStatus, psmStatus } = item;
  25613. const connect = {
  25614. isConnected: false,
  25615. reason: [],
  25616. }
  25617. if([emsStatus, mcmStatus, psmStatus].every((status) => status == 0)) {
  25618. connect.isConnected = true;
  25619. } else {
  25620. // disconnected 카운트 셋팅
  25621. objCount.value.disconnected = objCount.value.disconnected + 1;
  25622. connect.isConnected = false;
  25623. if(emsStatus != 0 ) connect.reason.push(`emsSatats: ${emsStatus}`);
  25624. if(mcmStatus != 0 ) connect.reason.push(`mcmStatus: ${mcmStatus}`);
  25625. if(psmStatus != 0 ) connect.reason.push(`psmStatus: ${psmStatus}`);
  25626. }
  25627. // 심각도 level 셋팅
  25628. const { criCnt ,majCnt, minCnt } = item;
  25629. let level = '';
  25630. if(criCnt > 0) level = 'CRITICAL';
  25631. else if(majCnt > 0) level = 'MAJOR';
  25632. else if(minCnt > 0) level = 'MINOR';
  25633. return {
  25634. ...item,
  25635. kpiItems, // kpi 정보
  25636. connect, // 연결 상태
  25637. level, // 심각도 레벨
  25638. }
  25639. });
  25640. coreItems.value = splitIntoChunk(temp, slideItemSize.value)
  25641. }
  25642. /** Array Spliter */
  25643. function splitIntoChunk(arr, chunk) {
  25644. // 빈 배열 생성
  25645. const result = [];
  25646. for (let index=0; index < arr.length; index += chunk) {
  25647. // slice() 메서드를 사용하여 특정 길이만큼 배열을 분리함
  25648. const tempArray = arr.slice(index, index + chunk);
  25649. // 빈 배열에 특정 길이만큼 분리된 배열을 추가
  25650. result.push(tempArray);
  25651. }
  25652. return result;
  25653. }
  25654. onMounted(() => fnGetCoreList())
  25655. // 위젯사이즈 변경 watch
  25656. watch(() => widgetSize.value, () => {
  25657. fnReset();
  25658. fnGetCoreList();
  25659. }, {deep: true})
  25660. </script>
  25661. </file>
  25662. <file path="components/home/dashboard/layout03/core/layout03CoreWidgetM.vue">
  25663. <template>
  25664. <div>
  25665. <div class="inner--header--wrap">
  25666. <h2
  25667. v-if="totalPage > 0"
  25668. class="inner--component--title none--after"
  25669. >
  25670. 장비별 KPI ({{ page || 0 }}/{{ totalPage }})
  25671. </h2>
  25672. <h2 v-else>
  25673. 장비별 KPI
  25674. </h2>
  25675. <p class="inner--component--total">
  25676. Total : <span>{{ props.totalCnt }}</span>
  25677. </p>
  25678. </div>
  25679. <div class="inner--content df--block pt--1rem">
  25680. <swiper
  25681. :autoplay="{
  25682. delay: 20000,
  25683. disableOnInteraction: false,
  25684. }"
  25685. :loop="true"
  25686. :touch-ratio="0"
  25687. :slides-per-view="1"
  25688. :modules="[Autoplay]"
  25689. @slide-change="onSlideChange"
  25690. >
  25691. <swiper-slide
  25692. v-for="(slide, index) in props.items"
  25693. :key="`core-swiper-slide-${index}`"
  25694. >
  25695. <div class="equip--card--wrap">
  25696. <div
  25697. v-for="(item, idx) in slide"
  25698. :key="`core-swiper-slide-item-${idx}`"
  25699. class="equip--card"
  25700. :class="getLevelClass(item.connect, item.level)"
  25701. >
  25702. <div class="equip--name">
  25703. {{ item.neName }}
  25704. </div>
  25705. <ul class="equip--st">
  25706. <li>
  25707. <i
  25708. class="circle"
  25709. :class="getBodyStatusClass(item.connect)"
  25710. />
  25711. <p>STATUS</p>
  25712. <span class="active">{{ item.connect.isConnected ? 'ACTIVE' : item.connect.reason.join(',') }}</span>
  25713. </li>
  25714. <li
  25715. v-for="(kpi, idx) in item.kpiItems"
  25716. :key="`core-widget-${index}-${idx}`"
  25717. >
  25718. <i
  25719. class="circle"
  25720. :class="getBodyLevelClass(kpi.val)"
  25721. />
  25722. <p>{{ kpi.label }}</p>
  25723. <span>{{ toRoundFix(kpi.val, 2) }}%</span>
  25724. </li>
  25725. </ul>
  25726. </div>
  25727. </div>
  25728. </swiper-slide>
  25729. </swiper>
  25730. </div>
  25731. </div>
  25732. </template>
  25733. <script setup>
  25734. /***********************
  25735. * import
  25736. ************************/
  25737. import { useI18n } from "vue-i18n"
  25738. import apiUrl from '@/composables/useApi';
  25739. import useAxios from '@/composables/useAxios';
  25740. import useUtil from '@/composables/useUtil';
  25741. import { Swiper, SwiperSlide } from 'swiper/vue';
  25742. import { Navigation, Pagination, Autoplay } from 'swiper/modules';
  25743. import 'swiper/css';
  25744. import 'swiper/swiper-bundle.css'
  25745. /***********************
  25746. * plugins inject
  25747. ************************/
  25748. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  25749. // props
  25750. const props = defineProps({
  25751. items: {
  25752. type: Array,
  25753. default: () => []
  25754. },
  25755. totalCnt: {
  25756. type: Number,
  25757. default: 0
  25758. }
  25759. })
  25760. // 참조가능 데이터 설정
  25761. defineExpose({})
  25762. // 발신 이벤트 선언
  25763. const emit = defineEmits([""]);
  25764. const i18n = useI18n();
  25765. /***********************
  25766. * data & created
  25767. ************************/
  25768. const page = ref(1);
  25769. const totalPage = computed(() => Math.floor(props.totalCnt / 4) + (props.totalCnt % 4 == 0 ? 0 : 1))
  25770. /***********************
  25771. * Methods
  25772. ************************/
  25773. /** Slide onChang Event */
  25774. function onSlideChange(swiper) {
  25775. if(swiper.realIndex != page.value + 1)
  25776. page.value = swiper.realIndex + 1
  25777. }
  25778. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  25779. // 레벨 클래스 : CRITICAL, MAJOR , MINOR
  25780. const getLevelClass = (connect, level) => {
  25781. if(!connect.isConnected) return 'discon';
  25782. else if(level === 'CRITICAL') return 'critical';
  25783. else if(level === 'MAJOR') return 'major';
  25784. else if(level === 'MINOR') return 'minor';
  25785. else return 'normal';
  25786. }
  25787. // 세부 데이터 상태값
  25788. const getBodyLevelClass = (val) => {
  25789. if(val >= 95) return 'critical'; // red
  25790. else if(val >= 90) return 'major'; // brown
  25791. else if(val >= 85) return 'minor'; // yellow
  25792. else return ''; // green
  25793. }
  25794. // 세부 데이터 STATUS 상태값
  25795. const getBodyStatusClass = (connect) => {
  25796. if(connect.isConnected) return 'normal';
  25797. else return 'critical';
  25798. }
  25799. </script>
  25800. </file>
  25801. <file path="components/home/dashboard/layout03/core/layout03CoreWidgetS.vue">
  25802. <template>
  25803. <div>
  25804. <div class="inner--header--wrap">
  25805. <h2
  25806. v-if="totalPage > 0"
  25807. class="inner--component--title none--after"
  25808. >
  25809. 장비별 KPI ({{ page || 0 }}/{{ totalPage }})
  25810. </h2>
  25811. <h2 v-else>
  25812. 장비별 KPI
  25813. </h2>
  25814. <p class="inner--component--total">
  25815. Total : <span>{{ props.totalCnt }}</span>
  25816. </p>
  25817. </div>
  25818. <div class="inner--content df--block pt--1rem swiper--view--2">
  25819. <swiper
  25820. :autoplay="{
  25821. delay: 20000,
  25822. disableOnInteraction: false,
  25823. }"
  25824. :loop="true"
  25825. :touch-ratio="0"
  25826. :slides-per-view="1"
  25827. :modules="[Autoplay]"
  25828. @slide-change="onSlideChange"
  25829. >
  25830. <swiper-slide
  25831. v-for="(slide, index) in props.items"
  25832. :key="`core-swiper-slide-${index}`"
  25833. >
  25834. <div class="equip--card--wrap">
  25835. <div
  25836. v-for="(item, idx) in fnSplitArraySniffling(slide, 0)"
  25837. :key="`core-swiper-slide-item-${idx}`"
  25838. class="equip--card"
  25839. :class="getLevelClass(item.connect, item.level)"
  25840. >
  25841. <div class="equip--name">
  25842. {{ item.neName }}
  25843. </div>
  25844. <ul class="equip--st">
  25845. <!-- <li><i class="circle red" /><p>STATUS</p><span class="active">Active</span></li> -->
  25846. <li>
  25847. <i
  25848. class="circle"
  25849. :class="getBodyStatusClass(item.connect)"
  25850. />
  25851. <p>STATUS</p>
  25852. <span class="active">{{ item.connect.isConnected ? 'ACTIVE' : item.connect.reason.join(',') }}</span>
  25853. </li>
  25854. <li
  25855. v-for="(kpi, idx) in item.kpiItems"
  25856. :key="`core-widget-${index}-${idx}`"
  25857. >
  25858. <i
  25859. class="circle"
  25860. :class="getBodyLevelClass(kpi.val)"
  25861. />
  25862. <p>{{ kpi.label }}</p>
  25863. <span>{{ toRoundFix(kpi.val, 2) }}%</span>
  25864. </li>
  25865. </ul>
  25866. </div>
  25867. </div>
  25868. <div class="equip--card--wrap">
  25869. <div
  25870. v-for="(item, idx) in fnSplitArraySniffling(slide, 1)"
  25871. :key="`core-swiper-slide-item-${idx}`"
  25872. class="equip--card"
  25873. :class="getLevelClass(item.connect, item.level)"
  25874. >
  25875. <div class="equip--name">
  25876. {{ item.neName }}
  25877. </div>
  25878. <ul class="equip--st">
  25879. <!-- <li><i class="circle red" /><p>STATUS</p><span class="active">Active</span></li> -->
  25880. <li>
  25881. <i
  25882. class="circle"
  25883. :class="getBodyStatusClass(item.connect)"
  25884. />
  25885. <p>STATUS</p>
  25886. <span class="active">{{ item.connect.isConnected ? 'ACTIVE' : item.connect.reason.join(',') }}</span>
  25887. </li>
  25888. <li
  25889. v-for="(kpi, idx) in item.kpiItems"
  25890. :key="`core-widget-${index}-${idx}`"
  25891. >
  25892. <i
  25893. class="circle"
  25894. :class="getBodyLevelClass(kpi.val)"
  25895. />
  25896. <p>{{ kpi.label }}</p>
  25897. <span>{{ toRoundFix(kpi.val, 2) }}%</span>
  25898. </li>
  25899. </ul>
  25900. </div>
  25901. </div>
  25902. </swiper-slide>
  25903. </swiper>
  25904. </div>
  25905. </div>
  25906. </template>
  25907. <script setup>
  25908. /***********************
  25909. * import
  25910. ************************/
  25911. import { useI18n } from "vue-i18n"
  25912. import apiUrl from '@/composables/useApi';
  25913. import useAxios from '@/composables/useAxios';
  25914. import useUtil from '@/composables/useUtil';
  25915. import { Swiper, SwiperSlide } from 'swiper/vue';
  25916. import { Navigation, Pagination, Autoplay } from 'swiper/modules';
  25917. import 'swiper/css';
  25918. import 'swiper/swiper-bundle.css'
  25919. /***********************
  25920. * plugins inject
  25921. ************************/
  25922. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  25923. // props
  25924. const props = defineProps({
  25925. items: {
  25926. type: Array,
  25927. default: () => []
  25928. },
  25929. totalCnt: {
  25930. type: Number,
  25931. default: 0
  25932. }
  25933. })
  25934. // 참조가능 데이터 설정
  25935. defineExpose({})
  25936. // 발신 이벤트 선언
  25937. const emit = defineEmits([""]);
  25938. const i18n = useI18n();
  25939. /***********************
  25940. * data & created
  25941. ************************/
  25942. const page = ref(1);
  25943. const totalPage = computed(() => Math.floor(props.totalCnt / 8) + (props.totalCnt % 8 == 0 ? 0 : 1))
  25944. /***********************
  25945. * Methods
  25946. ************************/
  25947. /** Slide onChang Event */
  25948. function onSlideChange(swiper) {
  25949. if(swiper.realIndex != page.value + 1)
  25950. page.value = swiper.realIndex + 1
  25951. }
  25952. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  25953. // 레벨 클래스 : CRITICAL, MAJOR , MINOR
  25954. const getLevelClass = (connect, level) => {
  25955. if(!connect.isConnected) return 'discon';
  25956. else if(level === 'CRITICAL') return 'critical';
  25957. else if(level === 'MAJOR') return 'major';
  25958. else if(level === 'MINOR') return 'minor';
  25959. else return 'normal';
  25960. }
  25961. // 세부 데이터 상태값
  25962. const getBodyLevelClass = (val) => {
  25963. if(val >= 95) return 'critical'; // red
  25964. else if(val >= 90) return 'major'; // brown
  25965. else if(val >= 85) return 'minor'; // yellow
  25966. else return 'normal'; // green
  25967. }
  25968. // 세부 데이터 STATUS 상태값
  25969. const getBodyStatusClass = (connect) => {
  25970. if(connect.isConnected) return 'normal';
  25971. else return 'critical';
  25972. }
  25973. // swiper item filter by 홀수, 짝수
  25974. const fnSplitArraySniffling = (arr = [], sniffling) => {
  25975. return arr.filter((item, idx) => {
  25976. // 짝수
  25977. if(sniffling == 0) return idx % 2 == 0
  25978. else return idx % 2 != 0;
  25979. })
  25980. }
  25981. </script>
  25982. </file>
  25983. <file path="components/home/dashboard/layout03/ran/layout03Ran.vue">
  25984. <template>
  25985. <div class="map--contents--wrap">
  25986. <div class="header--wrapper">
  25987. <div class="titles">
  25988. <span>RAN</span>
  25989. </div>
  25990. <span class="inner--component--date">{{ current }}</span>
  25991. </div>
  25992. <div class="inner--content--wrapper type--2">
  25993. <div class="map--wrappers">
  25994. <!-- 맵 데이터 -->
  25995. <div class="map--text">
  25996. <div v-for="(item, idx) in mapDataInfo" :key="idx" class="map--text--inner" :class="item.cls">
  25997. <div class="title">{{item.areaName}} <span>({{item.neInfoList.length}})</span></div>
  25998. <div class="status">
  25999. <span class="critical" v-show="item.criCnt > 0">{{item.criCnt}}</span>
  26000. <span class="major" v-show="item.majCnt > 0">{{item.majCnt}}</span>
  26001. <span class="minor" v-show="item.minCnt > 0">{{item.minCnt}}</span>
  26002. </div>
  26003. </div>
  26004. </div>
  26005. <!-- 맵 백터 이미지 -->
  26006. <!-- 서울 -->
  26007. <div class="mapdt seoul" :class="getEventClass(mapDataInfo[0])">
  26008. <svg xmlns="http://www.w3.org/2000/svg" width="3.68181rem" height="2.79144rem" viewBox="0 0 60 45" fill="none">
  26009. <path d="M24.8178 45.0053L39.0906 43.6408L49.3633 37.6372L55.5451 32.907L59.2724 26.2666H52.636L52.1815 13.2587L45.4542 0.796618L37.1815 0.341797L26.2724 8.34666L15.9087 9.98402L12.8178 19.4443L2.45419 22.2642L0.363281 27.3582L6.5451 29.5413L15.0906 31.9064L13.9996 37.3643L24.8178 45.0053Z" fill="currentColor"/>
  26010. </svg>
  26011. </div>
  26012. <!-- 부산 -->
  26013. <div class="mapdt busan" :class="getEventClass(mapDataInfo[1])">
  26014. <svg xmlns="http://www.w3.org/2000/svg" width="4.5rem" height="2.68344rem" viewBox="0 0 73 44" fill="none">
  26015. <path d="M67.7283 22.4503L71.7283 10.443L72.9101 8.80567L71.8193 7.35024L66.2738 6.34962L59.9102 1.52853L56.9102 0.164062L45.7283 6.62253L42.1829 12.2623L31.2738 9.80628L21.1829 13.7177L2.63742 11.4436L0.910156 22.4503L4.18289 27.9991L9.91015 28.0901L9.27378 34.6395L19.2738 35.913L25.9102 38.9149L36.9102 34.0937L41.3647 43.0992L54.9102 33.457L67.7283 22.4503Z" fill="currentColor"/>
  26016. </svg>
  26017. </div>
  26018. <!-- 대구 -->
  26019. <div class="mapdt daegu" :class="getEventClass(mapDataInfo[2])">
  26020. <svg xmlns="http://www.w3.org/2000/svg" width="4rem" height="3.95694rem" viewBox="0 0 65 64" fill="none">
  26021. <path d="M35.092 56.5014L45.9102 55.046L50.8192 49.6791L44.6374 40.0368L50.2738 34.3061L57.2738 22.7536L64.9102 19.206L64.5465 8.01742L59.7283 0.103516H43.1829L30.3647 12.5656L20.6374 9.01801L10.092 16.75L6.27379 27.1199L19.3647 34.7609H11.6374L6.27379 41.1284L9.63743 49.861H2.81925L0.910156 53.1357L4.72832 60.3219L15.4556 55.8646L17.6374 56.5924L21.8192 63.4147L26.3647 52.9538L35.092 56.5014Z" fill="currentColor"/>
  26022. </svg>
  26023. </div>
  26024. <!-- 인천 -->
  26025. <div class="mapdt incheon" :class="getEventClass(mapDataInfo[3])">
  26026. <svg xmlns="http://www.w3.org/2000/svg" width="1.73863rem" height="2.22294rem" viewBox="0 0 29 37" fill="none">
  26027. <path d="M28.5447 11.7185L22.0902 6.07867L11.272 0.802734L0.726562 3.71359L3.45384 16.2667L12.8175 23.6348L13.0902 31.1848L16.1811 33.5499L23.0902 36.3698L24.6357 23.8167L28.5447 11.7185Z" fill="currentColor"/>
  26028. </svg>
  26029. </div>
  26030. <!-- 강화 -->
  26031. <div class="mapdt kanghwa" :class="getEventClass(mapDataInfo[3])">
  26032. <svg xmlns="http://www.w3.org/2000/svg" width="1.80113rem" height="2.70619rem" viewBox="0 0 29 44" fill="none">
  26033. <path d="M28.908 21.0585L20.7262 0.136719L6.45348 10.9615L5.99893 28.2447L0.0898438 41.3436L20.3626 43.4357L28.908 31.7013V21.0585Z" fill="currentColor"/>
  26034. </svg>
  26035. </div>
  26036. <!-- 광주 -->
  26037. <div class="mapdt gwangju" :class="getEventClass(mapDataInfo[4])">
  26038. <svg xmlns="http://www.w3.org/2000/svg" width="3.07956rem" height="1.66013rem" viewBox="0 0 50 28" fill="none">
  26039. <path d="M45.7262 22.4564L49.3626 14.6335L44.3626 11.1769L39.5444 2.89911L26.4535 1.71658L14.3626 0.625L6.54439 5.17322L5.45348 10.5401L0.0898438 14.6335C0.0898438 14.6335 3.08985 24.1848 3.36257 24.3667C3.6353 24.5486 14.0898 23.9119 15.1808 24.3667C16.2717 24.8215 24.908 27.1866 24.908 27.1866L38.0898 26.2769L45.7262 22.4564Z" fill="currentColor"/>
  26040. </svg>
  26041. </div>
  26042. <!-- 대전 -->
  26043. <div class="mapdt daejeon" :class="getEventClass(mapDataInfo[5])">
  26044. <svg xmlns="http://www.w3.org/2000/svg" width="2.49431rem" height="3.04194rem" viewBox="0 0 41 50" fill="none">
  26045. <path d="M40.3622 41.5497L38.9986 35.2732H35.8168L34.3622 34.5455L31.544 30.8159L31.2713 29.2695L34.0895 18.3538L34.6349 17.7171L35.0895 17.1713L38.7258 15.5339V14.2604H35.9077L34.1804 12.8959L32.7259 7.52906L29.6349 8.98449L27.8168 8.80255L21.1804 3.70854L20.544 2.70796L20.0895 0.888672L16.9986 6.98326L8.81676 16.3526L0.453125 23.084L4.81676 32.8171L9.63494 40.5491L19.3622 42.4593L24.9077 46.4618C24.9077 46.4618 29.4531 49.3727 30.0895 49.5546C30.7258 49.7365 37.8168 45.3702 37.8168 45.3702L40.3622 41.5497Z" fill="currentColor"/>
  26046. </svg>
  26047. </div>
  26048. <!-- 울산 -->
  26049. <div class="mapdt ulsan" :class="getEventClass(mapDataInfo[6])">
  26050. <svg xmlns="http://www.w3.org/2000/svg" width="3.36363rem" height="3.0985rem" viewBox="0 0 55 50" fill="none">
  26051. <path d="M0.363281 22.0602L2.63601 27.882H9.27236L13.4542 37.7061L20.2724 40.9808L26.7269 45.9839L33.0906 46.8025L35.636 49.6224L39.7269 46.4387V37.5242L46.2724 31.1567L50.3633 33.4308L54.1814 12.3271L43.636 6.8692L40.5451 11.4174L38.7269 12.2361L30.7269 10.5987L29.2724 8.8704V0.046875L15.4542 0.956518L10.3633 7.77884L9.27236 8.50655L7.27238 16.9662L0.363281 22.0602Z" fill="currentColor"/>
  26052. </svg>
  26053. </div>
  26054. <!-- 세종 -->
  26055. <div class="mapdt sejong" :class="getEventClass(mapDataInfo[7])">
  26056. <svg xmlns="http://www.w3.org/2000/svg" width="1.94888rem" height="2.52425rem" viewBox="0 0 32 41" fill="none">
  26057. <path d="M26.7262 4.69162H18.908L3.08984 0.234375L0.0898438 4.69162L1.81712 16.426L13.3626 26.3411L15.1808 36.0743L20.9989 40.6225L27.908 32.6177L31.2717 23.7941L26.6353 5.05547L26.7262 4.69162Z" fill="currentColor"/>
  26058. </svg>
  26059. </div>
  26060. <!-- 경기도 -->
  26061. <div class="mapdt gyeonggi-do" :class="getEventClass(mapDataInfo[8])">
  26062. <svg xmlns="http://www.w3.org/2000/svg" width="8.40906rem" height="10.97256rem" viewBox="0 0 136 177" fill="none">
  26063. <path d="M134.273 102.174L135.182 100.9L133.091 99.0808L122.637 98.535L121.364 97.8982L114.455 90.1663L105.637 90.712L103.728 88.8018L104.455 78.2499L101.819 74.7933L101.728 72.7011L105.364 67.5161L105.455 59.9661L106.364 58.4197L114.364 53.7805V45.4118L100.455 35.4057L99.7276 34.1322L99.0004 28.4015L94.9094 25.9455L88.0004 28.1286L86.4549 27.9467L83.4549 26.0364L82.7276 24.1262L84.0004 17.9406L83.1822 17.2129L80.4549 20.6695L77.7276 20.7605L70.9095 13.7562L70.364 12.8466L69.364 7.47969L66.1822 6.84294L64.7276 4.6598L65.7276 0.566406L55.1822 3.84112L53.364 11.2092H48.1822L44.8185 4.20498L40.1822 8.4803L36.0913 9.48091L30.0913 14.8478L29.5458 22.3069L34.364 25.1268L37.9095 22.3978L43.9095 29.1292L41.6367 33.6774L37.0913 31.0395L32.5458 36.0425L37.4549 40.5907L33.2731 47.504L29.5458 43.3196L28.2731 35.2238L16.5458 41.2275L25.7276 48.7775L25.0913 53.1438L19.4549 54.4173L22.2731 66.4246L20.0913 74.4294L17.7276 73.7927L17.8185 67.88L11.7276 60.5119L1.63672 69.3354L5.72763 88.347L17.4549 85.8L31.1822 92.0765L37.8185 97.8073L46.8185 94.8964L50.1822 85.3452L61.6367 83.4349L72.9094 75.2481L84.8185 76.2487L93.0913 91.4398L93.0004 101.537H100.728L96.5458 113.908L89.2731 119.912L77.5458 126.825L60.9095 127.916L46.5458 117.91L48.0913 113.271L42.5458 111.543L36.364 109.542L34.8185 114.272L33.4549 132.283L21.2731 126.279L2.27308 125.097L0.636719 134.102L7.00036 134.557L12.0913 145.473H16.8185L21.0913 141.015L25.5458 142.107L19.9094 148.838L21.8185 162.847L31.9094 173.399L59.1822 165.94L60.9095 166.303L71.6367 176.128L77.364 170.124L77.8185 169.851L84.8185 166.212L93.1822 157.662L95.364 157.389L99.1822 159.663L102.182 160.027L107.728 155.388V150.749L109.546 148.929H115.455L118.637 144.745L119.546 143.562L120.909 139.287L121.455 130.736L121.546 130.1L129.091 112.089L125.455 105.721L126.819 102.992L134.273 102.174Z" fill="currentColor"/>
  26064. </svg>
  26065. </div>
  26066. <!-- 강원 -->
  26067. <div class="mapdt kangwon" :class="getEventClass(mapDataInfo[9])">
  26068. <svg xmlns="http://www.w3.org/2000/svg" width="13.77275rem" height="12.80894rem" viewBox="0 0 222 205" fill="none">
  26069. <path d="M0.726562 36.6586L3.27202 37.1134L4.72657 38.5689L5.81748 44.6635L10.9084 49.8484L13.5448 46.5737L16.1811 46.3918L19.1811 49.1207L19.7266 50.8491L18.4538 56.8527L19.7266 57.6714L26.6357 55.4882L28.0902 55.6702L33.5448 58.9449L34.3629 60.2184L35.1811 66.0401L49.1811 76.2281L49.9084 77.6835V87.9625L48.9993 89.5089L40.9993 94.1481L40.9084 101.243L40.5447 102.244L37.3629 106.792L39.6357 109.703L39.9993 110.976L39.3629 120.073L46.9993 119.618L48.4538 120.255L55.4538 128.078L65.8175 128.624L66.9084 129.078L70.7266 132.353L70.9993 134.809L68.6357 138.084L67.3629 138.812L61.9084 139.448L64.6357 144.269L64.7266 145.907L56.9084 164.463L56.4538 172.923L56.3629 173.378L55.1811 177.017L58.9084 180.018L67.9993 180.564L73.9993 181.656L74.7266 179.836L72.5447 174.833L73.5448 172.377L81.8175 169.285L83.9084 169.921L88.272 176.289L88.5448 176.835L89.272 179.564L91.9993 179.745L101.727 173.651L103.817 173.833L107.454 176.835L117.999 178.745L119.454 180.564V183.748L118.363 185.385L115.09 186.841L118.636 185.931L120.545 186.659L124.727 192.662L133.545 192.026L134.272 192.117L146.09 196.483L146.636 196.756L149.363 199.03L150.09 198.848L150.454 199.94L154.454 203.214L157.454 202.759L157.181 199.485L158.545 197.574L165.817 195.846L167.545 196.392L172.272 201.759L174.636 198.939L175.908 198.302L180.727 198.12L181.908 198.484L186.454 202.123L191.999 199.485H193.636L204.272 204.943L212.454 195.3L213.545 194.664L221.09 193.39L220.09 185.203L204.636 147.726L158.636 70.4973L131.908 0C131.272 0 125.727 3.00182 125.727 3.00182L119.545 23.8327L105.363 35.2032H93.1811L83.5448 31.2008L79.1811 33.02L69.5447 32.6562L59.1811 30.2911L53.9993 32.2923H41.6357L32.3629 31.5646L27.1811 29.7453L12.8175 31.9285L8.18111 26.9254L1.9993 30.9279H2.18111L0.726562 36.6586Z" fill="currentColor"/>
  26070. </svg>
  26071. </div>
  26072. <!-- 충북 -->
  26073. <div class="mapdt chungbuk" :class="getEventClass(mapDataInfo[10])">
  26074. <svg xmlns="http://www.w3.org/2000/svg" width="8.8125rem" height="9.59675rem" viewBox="0 0 142 155" fill="none">
  26075. <path d="M33.7269 147.103L35.9996 147.467L41.2724 153.471L51.4542 152.834L51.636 152.288L57.9087 154.472L61.9996 147.74L64.3633 137.825L65.5451 136.552L70.9087 134.732V128.183L65.636 129.002L64.7269 128.911L53.7269 125.363L52.4542 123.635V119.632L52.7269 118.814L57.0906 110.445L55.3633 89.5231L49.5451 84.611L49.3633 82.064L52.9087 78.0616L54.9997 77.5158L61.1815 80.2447L63.8178 76.97L60.2724 72.3308L60.4542 69.8748L64.2724 66.3272L65.5451 65.7814H75.9087L77.0906 66.2362L79.3633 68.2374L79.636 66.6L76.9996 62.5976L77.0906 60.5055L80.0906 56.8669L82.7269 56.6849L83.5451 57.4127V55.2295L84.0906 53.8651L87.9087 50.3174L90.1815 50.1355L95.7269 54.138L96.9087 52.5915V48.862L99.9997 47.5885L110.272 58.7771L114 55.7753L116.091 55.6843L117.727 56.8669L119.363 52.6825L117 48.2253V46.7698L119.636 39.9475L121.091 38.8559L126.727 38.1282L132.272 30.9421L133.181 30.3053L141.363 27.8493L140.727 27.3944L129.636 23.2101L120.181 23.9378L118.636 23.1191L114.545 17.3884L107.545 19.2986L105.636 18.6619L103.909 16.2968L104.545 13.5679L112 10.2022V9.74736L102.454 8.01903L101.636 7.56421L98.636 5.10818L89.5451 10.8389L88.4542 11.1118L83.9087 10.8389L82.2724 9.47447L81.2724 5.8359L77.8178 0.923828L72.636 2.83407L74.3633 6.74554V8.20097L72.8178 12.1124L70.8178 13.204L63.5451 11.9305L54.1815 11.2938L53.1815 10.9299L49.4542 8.01903L45.8178 12.8401L44.3633 13.5679H39.3633V17.2064L38.7269 18.5709L31.9087 24.3017L30.5451 24.7565L26.3633 24.2107L25.636 23.9378L22.7269 22.2095L15.2724 29.9414L14.8178 30.3053L7.72692 33.8529L2.09056 39.7656L15.8178 57.9585L16.1815 59.05V62.7796L13.5451 64.4169L6.81783 61.2332L0.363281 68.1464L6.63602 93.2526L11.9087 97.255L15.9996 95.3448L18.4542 96.5273L20.0906 102.622H23.4542L25.1815 104.441V108.717L24.1815 110.354L20.2724 112.082L17.9087 121.361L19.636 123.726H23.4542L25.1815 125.09L30.4542 148.741H30.9087L33.7269 147.103Z" fill="currentColor"/>
  26076. </svg>
  26077. </div>
  26078. <!-- 충남 -->
  26079. <div class="mapdt chungnam" :class="getEventClass(mapDataInfo[11])">
  26080. <svg xmlns="http://www.w3.org/2000/svg" width="9.26706rem" height="8.92588rem" viewBox="0 0 149 144" fill="none">
  26081. <path d="M148.726 134.741L146.362 124.098L144.271 126.372C144.271 126.372 135.18 131.193 134.544 131.011C133.908 130.83 128.908 128.374 128.908 128.374L123.362 123.461L111.726 121.642L105.999 112.91L101.18 99.8107L110.271 92.0788L104.544 88.0763L101.999 77.6154L90.544 68.7009L87.6349 53.237L93.2713 44.2315L111.635 49.2346H118.817L120.271 50.3261L126.999 43.8677L129.089 43.5038L134.544 46.0508V45.7779L120.362 26.8573L109.271 16.6693L84.3622 23.4917L77.2713 31.0417L73.4531 16.0326L56.4531 4.38916L52.4531 0.386719L40.6349 0.568658L42.8168 8.20966L40.6349 11.5753L34.8168 1.93312L23.6349 8.75545L32.9986 15.7597L32.8168 21.3995L27.9986 27.4031L23.6349 25.4019L22.4531 10.7567L13.2713 17.579L0.453125 33.9526L1.81676 37.7731L6.63494 35.7718L7.81676 39.1375L7.99858 43.3219L12.1804 42.5032L15.3622 56.5117H18.1804L20.3622 49.3255L23.9986 56.5117L30.1804 55.5111L33.9986 49.1436L36.6349 52.9641L35.8168 83.2552L41.8168 87.2576V91.442H36.4531L37.4531 108.634L31.8168 113.637L32.8168 117.458H39.9986L54.0895 135.651L67.3622 128.464L69.8168 119.641L71.3622 118.367L89.1804 116.73L91.0895 118.004L94.1804 127.737C100.18 128.192 108.089 128.828 109.999 128.919C110.999 128.192 113.635 125.736 115.726 123.643H118.271L124.908 130.284L125.453 131.557V137.288L126.908 136.651L128.635 136.742L131.544 138.652L132.362 140.199V142.2L136.908 143.201L138.908 138.471L140.453 137.379L144.089 137.106L145.544 137.743L145.453 137.288L147.18 135.014H148.726V134.741Z" fill="currentColor"/>
  26082. </svg>
  26083. </div>
  26084. <!-- 전북 -->
  26085. <div class="mapdt jeonbuk" :class="getEventClass(mapDataInfo[12])">
  26086. <svg xmlns="http://www.w3.org/2000/svg" width="9.71025rem" height="6.85644rem" viewBox="0 0 156 110" fill="none">
  26087. <path d="M7.63707 94.6983L7.09162 100.793L10.0916 101.43L17.3643 102.157L27.9098 93.4248L28.6371 85.238L29.8189 83.6916L38.3643 80.7808L40.6371 81.7813L41.728 84.6012L46.8189 84.4193L48.6371 85.6019L51.1825 92.97L52.4553 93.1519L57.5462 84.4193L59.6371 83.6006L65.2734 85.5109L66.3643 87.9669L63.6371 93.6977L64.0007 103.977L66.728 105.432L74.8189 101.066L77.4553 102.703V104.977L78.728 104.522L80.6371 104.977L83.0916 107.524L93.6371 108.343L100.728 104.613L101.455 104.431L112.91 103.795L114.273 104.341L119.819 109.98L125.546 95.2441L123.91 91.3326L122.364 85.0561L119.092 81.1446L118.819 79.3253L128.546 56.9481L128.819 56.4933L139.728 44.2131L141.637 43.6673L145.91 45.2137L154.455 37.0269L155.637 28.7492L153.364 22.4726L142.455 23.2003L141.001 22.5636L136.092 17.0148L134.183 18.1063L133.273 18.3792H131.092L129.637 18.7431L131.273 24.6558L128.183 26.2931L123.455 20.5624L121.91 20.6533L119.819 25.7474L117.728 26.8389L110.273 25.2016L108.819 23.4732V21.0172L107.546 20.1985L104.455 21.654L101.91 20.0166V12.1936L97.0916 7.37255C91.9098 12.4666 91.0916 12.4666 90.4553 12.4666C89.6371 12.4666 76.6371 11.4659 72.728 11.1021L71.1825 9.8286L68.1825 0.277344L53.0007 1.64181L50.6371 10.0105L49.728 11.1021L34.4553 19.3799L33.1825 17.1057L18.728 18.1973L13.728 21.1991L14.3643 23.8371H19.5462L23.9098 30.4775L31.0916 33.1154L43.728 29.7498L43.3643 33.1154L32.0007 35.9353V38.3004L38.8189 43.3035L38.1825 47.4878L32.1825 43.6673H26.1825L17.1825 53.8553L6.54616 59.0403V67.0452L23.9098 68.0458L25.728 70.8656L21.9098 73.5036H14.2734L0.273438 84.1464C1.9098 86.4205 4.63707 90.1501 7.18253 93.6067L7.63707 94.6983Z" fill="currentColor"/>
  26088. </svg>
  26089. </div>
  26090. <!-- 전남 -->
  26091. <div class="mapdt jeonnam" :class="getEventClass(mapDataInfo[13])">
  26092. <svg xmlns="http://www.w3.org/2000/svg" width="10.01138rem" height="9.18738rem" viewBox="0 0 161 148" fill="none">
  26093. <path d="M158.547 94.0205L157.365 89.1084L142.547 89.2904L141.092 84.0144L151.638 79.921L152.729 74.7361L153.365 73.7354L160.729 67.7318L158.547 60.1818L151.365 55.1787L150.547 53.7233V48.3564L147.001 47.6287L145.547 45.9913L144.092 30.2545L143.456 29.9816L143.729 29.3449L137.638 23.1593L127.365 23.796L120.092 27.6165L119.092 27.7985L107.365 26.8888L106.183 26.3431L104.092 24.1599L101.456 25.0695L99.0014 23.3412V21.5219L92.7287 24.8876H91.0014L86.456 22.5225L85.456 20.9761L85.1833 9.33272L85.3651 8.42307L87.456 4.14774L85.1833 3.42004L80.1832 11.8797L78.456 12.7893L74.8196 12.4255L73.2741 11.243L70.8196 4.14774L65.7287 4.32968L64.0014 3.2381L63.0014 0.873047L57.1832 2.87425L56.456 10.6062L55.8196 11.8797L44.0923 21.6129L42.7287 21.9768L34.456 21.1581L29.8196 20.2484L28.3651 18.3382L29.0014 11.243C27.1832 8.78694 24.7287 5.42125 23.0014 2.96521L16.6378 16.9737L7.63778 26.9798L23.456 46.3552L19.456 52.7227L14.456 45.7184L11.5469 47.7197L13.0014 52.7227L7.36506 60.2727L9.27415 66.0944L14.0014 64.0932L15.2741 67.186L11.2741 75.4638L12.7287 82.9229L8.00142 89.3813L10.3651 94.2024L27.8196 97.659L27.5469 102.935H23.3651L12.3651 95.7488L11.1832 97.75L14.8196 105.573L13.5469 108.939L10.1832 106.755L7.54688 92.1102L0.546875 91.2915V107.756L4.72869 114.578L12.8196 116.762L19.1832 129.86V135.045L18.9105 147.871H30.5469L33.7287 136.137L44.0923 133.863L48.456 128.951L49.5469 114.578L52.1832 114.396L52.456 135.773L68.2741 132.953L73.0923 126.768L73.3651 117.125L76.6378 111.94L108.638 97.659L113.456 100.661L110.001 111.395L105.82 103.39L100.456 103.663L98.3651 112.668L95.456 116.398L88.1832 115.761L84.9105 126.95L98.6378 124.675L101.82 129.406L103.274 142.323L117.729 130.861L119.456 121.401L122.365 123.402L129.638 121.674L129.365 113.669L120.001 108.302L120.82 93.0199L129.911 88.1078L136.638 93.5656L134.547 114.578L144.183 117.762L142.911 109.848L148.092 106.483L158.911 108.848L159.274 106.392L156.365 103.026L158.547 94.0205ZM88.9105 64.4571L79.5469 69.2782L65.8196 69.915C65.8196 69.915 56.8196 67.7318 55.8196 67.277C54.7287 66.8222 43.0923 67.186 42.8196 67.0041C42.5469 66.8222 38.3651 54.2691 38.3651 54.2691L43.7287 49.539L45.5469 43.1715L54.9105 37.8045L67.6378 38.7142L82.1832 40.2606L87.7287 49.357L93.5469 54.1781L88.9105 64.4571Z" fill="currentColor"/>
  26094. </svg>
  26095. </div>
  26096. <!-- 경북 -->
  26097. <div class="mapdt gyeongbuk" :class="getEventClass(mapDataInfo[14])">
  26098. <svg xmlns="http://www.w3.org/2000/svg" width="11.35794rem" height="12.03569rem" viewBox="0 0 182 194" fill="none">
  26099. <path d="M180.273 136.292L168.546 147.935L160.273 141.204L160.364 137.111L162.819 132.835L163.001 102.908L172.183 84.7151L172.364 81.4404L170.364 75.6187L174.364 54.7878L172.91 17.4015L165.092 0.664062L158.001 1.75563L149.364 11.9436L147.092 12.3985L136.001 6.66771L130.273 9.4876L128.364 9.21472L123.455 5.3942L120.183 5.48517L116.91 9.30567H114.183L108.819 3.21107L104.092 4.30263L104.364 7.66831L102.91 9.57857L97.3644 10.4882L95.9098 10.1244L91.728 6.66771L81.728 9.57857L76.0916 16.9467L74.9098 17.5834L69.5462 18.3111L67.6371 23.3142L69.9098 27.7714L70.0007 29.2269L67.3644 36.2311L64.6371 37.1407L62.1825 35.5034L58.2735 38.5962L55.728 38.4143L47.4553 29.4088L47.1825 30.3184L44.5462 33.6841L42.0916 34.048L36.2734 29.9546L34.0916 31.9558V37.4137L31.0916 38.7781L28.728 36.595L27.728 37.7775L30.0007 41.2341L30.2734 42.5077L29.5462 48.0565L26.5462 49.148L22.2735 45.4185H13.2734L11.1825 47.4197L14.5462 51.9679V54.1511L10.0916 59.518L8.00071 60.0638L1.72799 57.4258L0.273438 59.0631L5.27344 63.2475L5.90981 64.43L7.72799 86.7163L7.54617 87.6259L3.09163 96.0856V98.2688L12.4553 101.362L19.4553 100.27L21.5462 101.998V112.004L20.2734 113.733L14.6371 115.643L12.4553 124.83L12.2734 125.376L7.27345 133.563L5.18254 134.291L2.72799 133.472L4.36435 137.929L4.45526 138.839L3.18254 147.208L11.3644 155.121L20.1825 154.849L21.8189 155.758L23.6371 158.942H26.3644L28.0007 159.943L34.6371 174.042L34.0007 176.316L29.2734 179.409L29.5462 180.591L49.728 187.323L51.5462 186.595L46.9098 178.226L50.9098 171.768L55.1825 171.859L53.1825 165.037L58.2735 158.123L60.4553 157.85L52.0007 153.211L57.1825 139.93L69.728 130.743L79.728 134.2L92.0916 122.01L111.092 122.192L117.455 132.562L117.91 146.025L109.455 150.118L103.001 160.67L98.3643 165.4L104.183 174.952L97.5462 182.684L85.2734 184.321L78.0007 181.592L74.0007 189.506L73.5462 191.234L74.3644 192.599L79.9098 190.689H81.0007L90.1825 193.236L118.91 187.05L124.092 180.137L125.455 179.409L141.91 178.317L143.819 180.137V189.324L149.273 190.416L152.546 185.504L154.91 184.958L165.91 190.598L166.364 188.141L170.364 181.046L182.001 139.294L180.273 136.292Z" fill="currentColor"/>
  26100. </svg>
  26101. </div>
  26102. <!-- 경남 -->
  26103. <div class="mapdt gyeongnam" :class="getEventClass(mapDataInfo[15])">
  26104. <svg xmlns="http://www.w3.org/2000/svg" width="9.66475rem" height="9.52281rem" viewBox="0 0 156 153" fill="none">
  26105. <path d="M100.729 94.8136L102.82 82.5334L124.183 85.1713L133.183 80.6231L144.365 82.1695L146.092 78.5309L152.456 74.4376L155.183 73.6189L150.365 62.6122L143.183 62.3393L139.638 52.6971L146.729 48.1488L148.911 41.4175L123.456 46.8753H122.638L113.547 44.3284L107.183 46.5115L105.001 45.7838L98.3651 34.7771L83.5469 40.8717L82.2742 40.9627L60.456 33.7765L59.1832 32.412L58.456 28.9554L59.1832 27.0451L63.7287 24.1343L58.2741 12.4908H55.6378L54.0923 11.6722L52.2742 8.48842L43.7287 8.76131L42.3651 8.30648L34.2742 0.392578L25.7287 8.57937L23.9105 8.94325L19.7287 7.48781L9.7287 18.5854L0.819605 39.4163L3.63779 42.8729L4.00142 43.6006L5.63779 50.1501L7.45597 54.2435V55.6079L0.546875 73.255L2.00143 88.2641L5.63779 89.0828L7.09234 90.8111V96.7238L14.0014 101.454L14.7287 102.455L17.456 111.824L16.8196 113.734L9.09234 120.102L8.00143 125.378L13.8196 129.107L16.2741 124.195L29.7287 117.373L37.0014 119.647L43.1832 108.913L46.1832 111.369L43.456 119.374L45.5469 128.47L65.9105 130.381L71.0923 125.832L74.0923 127.834L68.456 132.473L72.1832 136.02L77.2742 133.11L78.7287 135.566L71.5469 143.116L72.6378 145.208L76.1833 145.572L78.6378 152.758L85.7287 149.301L83.3651 140.751L87.0014 131.017L83.9105 131.381L83.5469 123.831L90.6378 117.009V114.28L89.1832 109.55L98.2741 106.548L99.7287 113.097L106.547 108.822L100.547 99.0889L100.729 94.8136Z" fill="currentColor"/>
  26106. </svg>
  26107. </div>
  26108. <!-- 제주 -->
  26109. <div class="mapdt jeju" :class="getEventClass(mapDataInfo[16])">
  26110. <svg xmlns="http://www.w3.org/2000/svg" width="2.84094rem" height="2.03531rem" viewBox="0 0 46 33" fill="none">
  26111. <path d="M41.4545 0.435547L22.8182 4.07412L9.36364 11.3513L1.90909 21.5393L0 33.0008H9.81818L13.2727 28.4525L31.2727 20.9935L41.4545 19.629L45.4545 7.53075L41.4545 0.435547Z" fill="currentColor"/>
  26112. </svg>
  26113. </div>
  26114. </div>
  26115. <div class="map--sub--info">
  26116. <!-- 이벤트 -->
  26117. <div class="status--row">
  26118. <ul>
  26119. <li>
  26120. <div>
  26121. <i class="icon"></i>
  26122. CRITICAL
  26123. </div>
  26124. <div class="current--data">{{criTotal}}</div>
  26125. </li>
  26126. <li>
  26127. <div>
  26128. <i class="icon"></i>
  26129. MAJOR
  26130. </div>
  26131. <div class="current--data">{{majTotal}}</div>
  26132. </li>
  26133. <li>
  26134. <div>
  26135. <i class="icon"></i>
  26136. MINOR
  26137. </div>
  26138. <div class="current--data">{{minTotal}}</div>
  26139. </li>
  26140. </ul>
  26141. </div>
  26142. <div class="status--list">
  26143. <ul>
  26144. <li>
  26145. <div class="drp--header">
  26146. <div class="drp--titles">
  26147. 테넌트 수
  26148. </div>
  26149. <div class="drp--current--data">
  26150. <span class="current--value">{{tenantCntObj.tenantTotal}}</span>
  26151. </div>
  26152. </div>
  26153. <div class="drp--content">
  26154. 컨텐츠 내용
  26155. </div>
  26156. </li>
  26157. <li>
  26158. <div class="drp--header">
  26159. <div class="drp--titles">
  26160. NE 그룹 수
  26161. </div>
  26162. <div class="drp--current--data">
  26163. <span class="current--value">{{getNeGroupCntInfo.length}}</span>
  26164. </div>
  26165. </div>
  26166. <div class="drp--content">
  26167. 컨텐츠 내용
  26168. </div>
  26169. </li>
  26170. <li>
  26171. <div class="drp--header">
  26172. <div class="drp--titles">
  26173. NE 수
  26174. </div>
  26175. <div class="drp--current--data">
  26176. <span class="current--value">{{getNeCntInfo.length}}</span>
  26177. </div>
  26178. </div>
  26179. <div class="drp--content">
  26180. 컨텐츠 내용
  26181. </div>
  26182. </li>
  26183. </ul>
  26184. </div>
  26185. </div>
  26186. </div>
  26187. <div class="map--bottom--contents">
  26188. <div class="swipe--status--wrap">
  26189. <Swiper
  26190. v-if="getEventNeList.length > 0"
  26191. :modules="[Autoplay]"
  26192. style="height:11.9375rem;"
  26193. :loop="true"
  26194. :slides-per-view="3"
  26195. :direction="'vertical'"
  26196. :centered-slides="true"
  26197. :effect="'creative'"
  26198. :autoplay="{
  26199. delay: 2000*10,
  26200. disableOnInteraction: false,
  26201. }"
  26202. @swiper="onSwiper"
  26203. @realIndexChange="fnChangeNe"
  26204. >
  26205. <swiper-slide v-for="(item, idx) in getEventNeList" :key="idx">
  26206. <div class="inner--content--wrap">
  26207. <div class="inner--content">
  26208. <div class="icon--data">
  26209. <span>{{getEventName(item)}}</span>
  26210. <span>CPU</span>
  26211. </div>
  26212. <div class="desc">
  26213. <h2>{{item.neName}}</h2>
  26214. <ul>
  26215. <li>{{item.tenantName}}</li>
  26216. <li>{{item.lastUpdateTime}}</li>
  26217. </ul>
  26218. </div>
  26219. </div>
  26220. </div>
  26221. </swiper-slide>
  26222. </Swiper>
  26223. </div>
  26224. <div class="map--google">
  26225. <RanMapComponent :centerPosition="centerPosition" :neList="getEventNeList" :currNeInfo="currNeInfo"/>
  26226. </div>
  26227. </div>
  26228. </div>
  26229. </template>
  26230. <script setup>
  26231. /***********************
  26232. * import
  26233. ************************/
  26234. import { useI18n } from "vue-i18n"
  26235. import apiUrl from '@/composables/useApi';
  26236. import useAxios from '@/composables/useAxios';
  26237. import useUtil from '@/composables/useUtil';
  26238. import { Swiper, SwiperSlide } from 'swiper/vue';
  26239. import { Navigation, Pagination, Autoplay } from 'swiper/modules';
  26240. import 'swiper/css';
  26241. import 'swiper/swiper-bundle.css'
  26242. import dayjs from "#build/dayjs.imports.mjs";
  26243. import RanMapComponent from './ranMapComponent.vue';
  26244. /***********************
  26245. * plugins inject
  26246. ************************/
  26247. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  26248. // props
  26249. const props = defineProps({})
  26250. // 참조가능 데이터 설정
  26251. defineExpose({})
  26252. // 발신 이벤트 선언
  26253. const emit = defineEmits([""]);
  26254. const i18n = useI18n();
  26255. /***********************
  26256. * data & created
  26257. ************************/
  26258. const current = dayjs().format('YYYY-MM-DD HH:mm:ss')
  26259. const mySwiper = ref(null)
  26260. // 카카오맵 센터좌표
  26261. const centerPosition = ref({
  26262. lat: 33.450701,
  26263. lng: 126.570667
  26264. })
  26265. const ranInterval = ref(null)
  26266. const sidoCode = ref([])
  26267. const mapDataInfo = ref([])
  26268. const criTotal = ref(0) // 전국 CRITICAL TOTAL
  26269. const majTotal = ref(0) // 전국 MAJOR TOTAL
  26270. const minTotal = ref(0) // 전국 MINOR TOTAL
  26271. // 전국 테넌트 수 데이터
  26272. const tenantCntObj = ref({
  26273. tenantTotal: 0,
  26274. areaInfoList: []
  26275. })
  26276. const myDatas = ref([])
  26277. // 센터 우측 cnt카드
  26278. const totalObj = ref({
  26279. tenantCnt: 20,
  26280. neGroupCnt: 19,
  26281. neCnt: 18
  26282. })
  26283. // 현재 SWIPER NE
  26284. const currNeInfo = ref({})
  26285. const getEventNeList = computed(() => {
  26286. let result = []
  26287. myDatas.value.forEach((tenant) => {
  26288. tenant.neGroupList.forEach((group) => {
  26289. group.neList.forEach((ne) => {
  26290. if(ne.minCnt > 0 || ne.majCnt > 0 || ne.criCnt > 0){
  26291. result.push(ne)
  26292. }
  26293. })
  26294. })
  26295. })
  26296. return result
  26297. })
  26298. // 전국 > NE 그룹 수 데이터
  26299. const getNeGroupCntInfo = computed(() => {
  26300. let result = []
  26301. myDatas.value.forEach((item) => {
  26302. item.neGroupList.forEach((item2) => {
  26303. result.push(item2)
  26304. })
  26305. })
  26306. return result
  26307. })
  26308. // 지역 상세 > NE 그룹 수 데이터
  26309. const getAreaNeGroupCntInfo = computed(() => {
  26310. let result = []
  26311. areaNewData.value.forEach((item) => {
  26312. item.neGroupList.forEach((item2) => {
  26313. result.push(item2)
  26314. })
  26315. })
  26316. return result
  26317. })
  26318. // NE 그룹 수 > 이벤트 단계 클래스
  26319. const getNeEventCls = computed(() => {
  26320. return (obj) => {
  26321. let eventCls = ''
  26322. if(!_isEmpty(obj)) {
  26323. if(obj.minCnt > 0) eventCls = 'green'
  26324. if(obj.majCnt > 0) eventCls = 'blue'
  26325. if(obj.criCnt > 0) eventCls = 'red'
  26326. }
  26327. return eventCls
  26328. }
  26329. })
  26330. // 전국 NE 수 데이터 배열
  26331. const getNeCntInfo = computed(() => {
  26332. let result = []
  26333. myDatas.value.forEach((tenant) => {
  26334. tenant.neGroupList.forEach((group) => {
  26335. group.neList.forEach((ne) => {
  26336. result.push(ne)
  26337. })
  26338. })
  26339. })
  26340. return result
  26341. })
  26342. // 지역 NE 수 데이터
  26343. const getAreaNeCntInfo = computed(() => {
  26344. let result = []
  26345. areaNewData.value.forEach((tenant) => {
  26346. tenant.neGroupList.forEach((group) => {
  26347. group.neList.forEach((ne) => {
  26348. result.push(ne)
  26349. })
  26350. })
  26351. })
  26352. return result
  26353. })
  26354. // 지도 > 이벤트 상태에 따른 테두리 컬러 클래스 조회
  26355. const getEventClass = computed(() => {
  26356. return (obj) => {
  26357. let eventCls = ''
  26358. if(!_isEmpty(obj)) {
  26359. if(obj.minCnt > 0) eventCls = 'minor'
  26360. if(obj.majCnt > 0) eventCls = 'major'
  26361. if(obj.criCnt > 0) eventCls = 'critical'
  26362. }
  26363. return eventCls
  26364. }
  26365. })
  26366. const getEventName = computed(() => {
  26367. return (obj) => {
  26368. let result = ''
  26369. result = getEventClass.value(obj).toUpperCase()
  26370. return result
  26371. }
  26372. })
  26373. onMounted(() => {
  26374. console.log('%c 대시보드 레이아웃3 RAN' ,'color:#bada55','')
  26375. fnGeoTenantNeInfo()
  26376. ranInterval.value = setInterval(() => {
  26377. fnGeoTenantNeInfo()
  26378. }, 1000 * 60 * 5)
  26379. })
  26380. onUnmounted(() => {
  26381. clearInterval(ranInterval.value)
  26382. ranInterval.value = null
  26383. })
  26384. watchEffect(() =>{
  26385. fnGetEnumCode(useLangStore().getLang)
  26386. })
  26387. /**
  26388. * ENUM 업데이트
  26389. * @param lang
  26390. */
  26391. function fnGetEnumCode(lang){
  26392. let objEnum = useEnumCode.getEnumCode(lang)
  26393. // ...objEnum.sidoCode
  26394. sidoCode.value = _cloneDeep(objEnum.sidoCode.slice(1))
  26395. fnSetInitMapData()
  26396. }
  26397. /***********************
  26398. * Methods
  26399. ************************/
  26400. // 초기 데이터 세팅
  26401. function fnSetInitMapData(){
  26402. let tempMapData = []
  26403. let tempTenantData = []
  26404. sidoCode.value.forEach((item) => {
  26405. let mapDataObj = {}
  26406. mapDataObj.areaName = item.title[1]
  26407. mapDataObj.cls = item.cls
  26408. mapDataObj.areaCode = item.value
  26409. mapDataObj.criCnt = 0
  26410. mapDataObj.majCnt = 0
  26411. mapDataObj.minCnt = 0
  26412. mapDataObj.total = 0
  26413. mapDataObj.tenantList = []
  26414. mapDataObj.neGroupList = []
  26415. mapDataObj.neInfoList = []
  26416. tempMapData.push(mapDataObj)
  26417. let tempTenantObj = {}
  26418. tempTenantObj.areaName = item.title[0]
  26419. tempTenantObj.areaCode = item.value
  26420. tempTenantObj.tenantList = []
  26421. tempTenantData.push(tempTenantObj)
  26422. })
  26423. mapDataInfo.value = _cloneDeep(tempMapData)
  26424. tenantCntObj.value.areaInfoList = _cloneDeep(tempTenantData)
  26425. }
  26426. function onSwiper(swiper){
  26427. mySwiper.value = swiper
  26428. }
  26429. function fnChangeNe(swiper){
  26430. currNeInfo.value = getEventNeList.value[swiper.realIndex]
  26431. }
  26432. /**
  26433. * P5G RAN
  26434. */
  26435. function fnGeoTenantNeInfo() {
  26436. let _req = {
  26437. tenantName: useAuthStore().getTenantName
  26438. }
  26439. useAxios().post(useApi.tenantNeInfo, _req).then((res) => {
  26440. $log.debug("[dashboard][fnGeoTenantNeInfo][success]")
  26441. let datas = res.data.data.items
  26442. fnMakeNeData(datas)
  26443. }).catch((error)=>{
  26444. $log.debug("[dashboard][fnGeoTenantNeInfo][error]")
  26445. useErrorHandler().fnSetCommErrorHandle(error, fnGeoTenantNeInfo)
  26446. }).finally(()=>{
  26447. $log.debug("[dashboard][fnGeoTenantNeInfo][finished]")
  26448. current.value = dayjs().format('YYYY-MM-DD HH:mm:ss')
  26449. })
  26450. }
  26451. /**
  26452. * 지도 데이터 및 모든 데이터 가공
  26453. */
  26454. function fnMakeNeData(arr){
  26455. // 데이터 초기화
  26456. fnSetInitMapData()
  26457. let initCriTotal = 0 // 전국 CRIICAL 개수
  26458. let initMajTotal = 0 // 전국 MAJOR 개수
  26459. let initMinTotal = 0 // 전국 MINOR 개수
  26460. let tenantTotal = 0
  26461. arr.forEach((item, idx) => {
  26462. initCriTotal+=item.criCnt
  26463. initMajTotal+=item.majCnt
  26464. initMinTotal+=item.minCnt
  26465. // 각 NE 데이터의 지역코드에 맞는 배열에 넣기
  26466. let findIndex = mapDataInfo.value.findIndex((obj => obj.areaCode === item.areaCode))
  26467. if(findIndex !== -1) {
  26468. mapDataInfo.value[findIndex].neInfoList.push(item)
  26469. mapDataInfo.value[findIndex].criCnt += item.criCnt
  26470. mapDataInfo.value[findIndex].majCnt += item.majCnt
  26471. mapDataInfo.value[findIndex].minCnt += item.minCnt
  26472. if(!mapDataInfo.value[findIndex].tenantList.includes(item.tenantName)){
  26473. mapDataInfo.value[findIndex].tenantList.push(item.tenantName)
  26474. }
  26475. if(!mapDataInfo.value[findIndex].neGroupList.includes(item.neGroup)){
  26476. mapDataInfo.value[findIndex].neGroupList.push(item.neGroup)
  26477. }
  26478. if(!tenantCntObj.value.areaInfoList[findIndex].tenantList.includes(item.tenantName)) {
  26479. tenantCntObj.value.areaInfoList[findIndex].tenantList.push(item.tenantName)
  26480. tenantTotal++
  26481. }
  26482. }
  26483. })
  26484. // 전국 > 이벤트 수
  26485. criTotal.value = initCriTotal
  26486. majTotal.value = initMajTotal
  26487. minTotal.value = initMinTotal
  26488. // 전국 > 테넌트 수 TOTAL
  26489. tenantCntObj.value.tenantTotal = tenantTotal
  26490. // 전국 기준 테넌트-그룹-NE 정보 merge
  26491. myDatas.value = _cloneDeep(fnSetTenantGroupNeData(arr))
  26492. console.log('%c 테넌트 수 [tenantCntObj]' ,'color:#bada55', tenantCntObj.value)
  26493. console.log('%c 맵 데이터 [mapDataInfo]' ,'color:#bada55', mapDataInfo.value)
  26494. console.log('%c 테넌트그룹NE[myDatas]' ,'color:#bada55', myDatas.value)
  26495. }
  26496. /**
  26497. * 테넌트 - 그룹 - NE 데이터 세팅 로직
  26498. */
  26499. function fnSetTenantGroupNeData(arr){
  26500. let result = {}
  26501. arr.forEach(item => {
  26502. const { tenantName, neGroup } = item
  26503. // tenantName이 없으면 초기화
  26504. if (!result[tenantName]) {
  26505. result[tenantName] = {
  26506. tenantName,
  26507. neGroupList: {}
  26508. }
  26509. }
  26510. // neGroup이 없으면 초기화
  26511. if (!result[tenantName].neGroupList[neGroup]) {
  26512. result[tenantName].neGroupList[neGroup] = {
  26513. tenantName,
  26514. neGroup,
  26515. minCnt: 0,
  26516. majCnt: 0,
  26517. criCnt: 0,
  26518. neList: []
  26519. }
  26520. }
  26521. // 카운트 합산
  26522. result[tenantName].neGroupList[neGroup].minCnt += item.minCnt
  26523. result[tenantName].neGroupList[neGroup].majCnt += item.majCnt
  26524. result[tenantName].neGroupList[neGroup].criCnt += item.criCnt
  26525. // neList에 NE 데이터 추가
  26526. result[tenantName].neGroupList[neGroup].neList.push({
  26527. tenantName: item.tenantName,
  26528. neGroup: item.neGroup,
  26529. neName: item.neName,
  26530. neId: item.neId,
  26531. neType: item.neType,
  26532. upfNum: item.upfNum,
  26533. customerType: item.customerType,
  26534. neAddress: item.neAddress,
  26535. lastUpdateTime: item.lastUpdateTime,
  26536. neLocLatitude: item.neLocLatitude,
  26537. neLocLongitude: item.neLocLongitude,
  26538. familyName: item.familyName,
  26539. initTime: item.initTime,
  26540. minCnt: item.minCnt,
  26541. majCnt: item.majCnt,
  26542. criCnt: item.criCnt,
  26543. kpi: item.kpi,
  26544. cpu: item.cpu,
  26545. mem: item.mem,
  26546. })
  26547. })
  26548. // 최종 결과 배열로 변환
  26549. return Object.values(result).map(tenant => ({
  26550. tenantName: tenant.tenantName,
  26551. neGroupList: Object.values(tenant.neGroupList)
  26552. }))
  26553. }
  26554. </script>
  26555. </file>
  26556. <file path="components/home/dashboard/layout03/ran/ranMapComponent.vue">
  26557. <template>
  26558. <div class="map--google">
  26559. <div id="ran_detail_map" style="height: 100%;"></div>
  26560. </div>
  26561. </template>
  26562. <script setup>
  26563. /***********************
  26564. * import
  26565. ************************/
  26566. import { useI18n } from "vue-i18n";
  26567. import useUtil from "@/composables/useUtil";
  26568. /***********************
  26569. * plugins inject
  26570. ************************/
  26571. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  26572. // props
  26573. const props = defineProps({
  26574. centerPosition: Object,
  26575. currNeInfo: Object,
  26576. neList: Array
  26577. })
  26578. // 참조가능 데이터 설정
  26579. defineExpose({})
  26580. // 발신 이벤트 선언
  26581. const emit = defineEmits([""])
  26582. const i18n = useI18n()
  26583. /***********************
  26584. * data & created
  26585. ************************/
  26586. const map = ref(null) // 카카오 맵 객체
  26587. const markers = ref([])
  26588. const neArr = ref([])
  26589. neArr.value = _cloneDeep(props.neList)
  26590. onMounted(() => {
  26591. fnInit()
  26592. })
  26593. watch(() => props.neList, (newV, oldV) => {
  26594. neArr.value = _cloneDeep(props.neList)
  26595. fnDrawMarker()
  26596. },{ deep: true })
  26597. watch(() => props.currNeInfo, (newV, oldV) => {
  26598. neArr.value.forEach((item, idx) => {
  26599. if(item.neName === props.currNeInfo.neName) {
  26600. let position = new kakao.maps.LatLng(item.neLocLatitude, item.neLocLongitude)
  26601. map.value.panTo(position)
  26602. setTimeout(() => {
  26603. // 정보 레이어 오픈
  26604. fnGetInfo(markers.value[idx].data, idx)
  26605. }, 1);
  26606. }
  26607. })
  26608. },{ deep: true })
  26609. /***********************
  26610. * Methods
  26611. ************************/
  26612. /**
  26613. * 초기 실행
  26614. */
  26615. function fnInit(){
  26616. nextTick().then(() => {
  26617. if (window.kakao && window.kakao.maps) {
  26618. loadMap()
  26619. } else {
  26620. loadScript()
  26621. }
  26622. })
  26623. }
  26624. /**
  26625. * kakao 스크립트 로드
  26626. */
  26627. function loadScript() {
  26628. const script = document.createElement('script')
  26629. script.async = true
  26630. script.onload = () => {
  26631. window.kakao.maps.load(loadMap)
  26632. }
  26633. script.src = `//dapi.kakao.com/v2/maps/sdk.js?autoload=false&libraries=services,clusterer,drawing&appkey=${import.meta.env.VITE_APP_KAKAO_APP_KEY}`
  26634. document.head.appendChild(script)
  26635. }
  26636. /**
  26637. * kakao 지도 로드
  26638. */
  26639. async function loadMap() {
  26640. const mapContainer = document.getElementById('ran_detail_map')
  26641. let mapOption = {
  26642. center: new kakao.maps.LatLng(props.centerPosition.lat, props.centerPosition.lng), // 지도의 중심좌표
  26643. level: 3, // 지도의 확대 레벨
  26644. }
  26645. map.value = new kakao.maps.Map(mapContainer, mapOption)
  26646. let zoomControl = new kakao.maps.ZoomControl()
  26647. // map.value.addControl(zoomControl, kakao.maps.ControlPosition.BOTTOMRIGHT)
  26648. // fnSetEventListener() // 지도 이벤트 등록
  26649. fnDrawMarker()
  26650. }
  26651. function fnClearMarker(){
  26652. markers.value.forEach(marker => marker.markers.setMap(null));
  26653. fnCloseMarkerInfoOverlay()
  26654. markers.value = []
  26655. }
  26656. /**
  26657. * 마커 생성 데이터 세팅
  26658. */
  26659. function fnDrawMarker(){
  26660. fnClearMarker()
  26661. neArr.value.map((item, index) => {
  26662. let position = new kakao.maps.LatLng(item.neLocLatitude, item.neLocLongitude)
  26663. let markerObj = {
  26664. overlay: null,
  26665. markers: null,
  26666. data: item,
  26667. click: false,
  26668. position: position
  26669. }
  26670. markers.value.push(markerObj)
  26671. markers.value[index].markers = fnCreateMarker(position, index)
  26672. if(index == 0) {
  26673. map.value.panTo(position)
  26674. }
  26675. })
  26676. }
  26677. import { filename } from 'pathe/utils'
  26678. // 이미지 가져오기 (vite문법)
  26679. const glob = import.meta.glob('~/assets/img/ico_*.{png,svg}', { eager: true })
  26680. const getImages = Object.fromEntries(
  26681. Object.entries(glob).map(([key, value]) => [filename(key), value.default])
  26682. )
  26683. // NE 수 > 이벤트 단계 클래스
  26684. const getNeEventCls = computed(() => {
  26685. return (obj) => {
  26686. let eventCls = ''
  26687. if(!_isEmpty(obj)) {
  26688. if(obj.minCnt > 0) eventCls = 'black'
  26689. if(obj.majCnt > 0) eventCls = 'blue'
  26690. if(obj.criCnt > 0) eventCls = 'red'
  26691. }
  26692. return eventCls
  26693. }
  26694. })
  26695. // 마커 이미지 파일명 세팅
  26696. function fnGetMarkerImage(index){
  26697. let color = getNeEventCls.value(props.neList[index])
  26698. if(color == 'red') return 'ico_red_pin'
  26699. else if(color == 'blue') return 'ico_blue_pin'
  26700. else if(color == 'black') return 'ico_black_pin'
  26701. else return 'ico_gray_pin'
  26702. }
  26703. /**
  26704. * 마커 생성
  26705. */
  26706. function fnCreateMarker(position, index) {
  26707. // 마커 이미지 설정
  26708. const markerImageSrc = getImages[fnGetMarkerImage(index)] // assets 폴더의 이미지 경로
  26709. const markerImageSize = new kakao.maps.Size(40, 40); // 마커 이미지 사이즈
  26710. const markerImage = new kakao.maps.MarkerImage(markerImageSrc, markerImageSize);
  26711. let markerOption = {
  26712. map: map.value, // 마커를 표시할 지도
  26713. position: position, // 마커의 위치
  26714. clickable: true,
  26715. image: markerImage,
  26716. zIndex: 1,
  26717. }
  26718. let marker = new kakao.maps.Marker(markerOption)
  26719. // 마커 클릭 이벤트등록
  26720. kakao.maps.event.addListener(marker,'click', fnClickMarker(index))
  26721. return marker
  26722. }
  26723. /**
  26724. * 마커 클릭
  26725. */
  26726. function fnClickMarker(index) {
  26727. const clickData = markers.value[index].data
  26728. const openInfoWindow = function () {
  26729. // 마커 클릭 > 상태변경 > z-index 및 맵 이동
  26730. fnMarkerClickChk(index)
  26731. fnGetInfo(clickData, index)
  26732. }
  26733. return openInfoWindow
  26734. }
  26735. /**
  26736. * 마커 클릭 이벤트
  26737. */
  26738. function fnMarkerClickChk(index) {
  26739. fnSetUnClickMarker()
  26740. markers.value[index].click = true
  26741. markers.value[index].markers.setZIndex(3)
  26742. let moveLatLng = markers.value[index].position
  26743. map.value.panTo(moveLatLng)
  26744. }
  26745. /**
  26746. * 마커 클릭 상태 해제 및 z인덱스 초기화
  26747. */
  26748. function fnSetUnClickMarker() {
  26749. markers.value.forEach((item) => {
  26750. item.click = false
  26751. item.markers.setZIndex(2)
  26752. })
  26753. }
  26754. function fnGetInfo(data, index){
  26755. // 열려 있던 오버레이 닫기
  26756. fnCloseMarkerInfoOverlay()
  26757. // 오버레이 생성
  26758. markers.value[index].overlay = fnCreateCustomOverlay(data, index)
  26759. // 오버레이 z-index 설정
  26760. markers.value[index].overlay.setZIndex(999)
  26761. // 오버레이 열기
  26762. markers.value[index].overlay.setMap(map.value)
  26763. // 오버레이 이벤트 등록
  26764. fnCustomOverlayAddEventListener()
  26765. }
  26766. /**
  26767. * 커스텀 오버레이 생성
  26768. */
  26769. function fnCreateCustomOverlay(data, index) {
  26770. // style="top: -10.7rem; right: -6rem;"
  26771. let cpu = JSON.parse(data.cpu)
  26772. let memory = JSON.parse(data.mem)
  26773. let content = `
  26774. <div class="map--pop">
  26775. <div class="titles">
  26776. <h2 style="overflow:hidden; text-overflow:ellipsis;">${data.neName}</h2>
  26777. <v-btn class="custom-btn mini close--pop--btn" id="overlayCloseBtn" />
  26778. </div>
  26779. <ul>
  26780. <li>
  26781. <span class="critical">STATUS</span>
  26782. <span>ACTIVE</span>
  26783. </li>
  26784. <li>
  26785. <span class="major">CPU</span>
  26786. <span>${cpu.AVG_CPU_L}%</span>
  26787. </li>
  26788. <li>
  26789. <span class="minor">MEMORY</span>
  26790. <span>${memory.AVG_MEM_L}%</span>
  26791. </li>
  26792. <li>
  26793. <span>DISK</span>
  26794. <span>${data.disk}</span>
  26795. </li>
  26796. </ul>
  26797. </div>`
  26798. // 커스텀 오버레이 생성
  26799. let customOverlay = new kakao.maps.CustomOverlay({
  26800. position: markers.value[index].position,
  26801. content: content
  26802. })
  26803. return customOverlay
  26804. }
  26805. /**
  26806. * 커스텀 오버레이 이벤트 등록
  26807. */
  26808. function fnCustomOverlayAddEventListener(){
  26809. // 오버레이 닫기 버튼
  26810. const closeBtn = document.querySelector('#overlayCloseBtn')
  26811. closeBtn.addEventListener('click', fnCloseBtnOverlay)
  26812. }
  26813. /**
  26814. * 마커 정보 오버레이 닫기 버튼
  26815. */
  26816. function fnCloseBtnOverlay() {
  26817. fnCloseMarkerInfoOverlay()
  26818. fnSetUnClickMarker()
  26819. }
  26820. /**
  26821. * 모든 마커 정보 오버레이 닫기
  26822. */
  26823. function fnCloseMarkerInfoOverlay() {
  26824. for (var i = 0; i < markers.value.length; i++) {
  26825. if (markers.value[i].overlay) {
  26826. markers.value[i].overlay.setMap(null)
  26827. markers.value[i].overlay = null
  26828. }
  26829. }
  26830. }
  26831. </script>
  26832. </file>
  26833. <file path="components/home/dashboard/layout03/user/layout03User.vue">
  26834. <template>
  26835. <div class="core--component--wrap user--list">
  26836. <div>
  26837. <div class="inner--header--wrap">
  26838. <h2 class="inner--component--title none--after">
  26839. 가입자
  26840. </h2>
  26841. <span class="inner--component--date">{{ current }}</span>
  26842. </div>
  26843. <div class="inner--content">
  26844. <div class="oper--stat">
  26845. <div class="card--title">
  26846. <h3>테넌트 현황</h3>
  26847. </div>
  26848. <div class="card--alarm mb--1rem">
  26849. <div class="card tenant1">
  26850. <div class="ico" />
  26851. <div class="alarm--txt">
  26852. <p>Total</p>
  26853. <span>{{ objCount.total }}</span>
  26854. </div>
  26855. </div>
  26856. <div class="card tenant2 gray--alarm">
  26857. <div class="ico" />
  26858. <div class="alarm--txt">
  26859. <p>대내</p>
  26860. <span>{{ objCount.customer0 }}</span>
  26861. </div>
  26862. </div>
  26863. </div>
  26864. <div class="card--alarm">
  26865. <div class="card tenant3 gray--alarm">
  26866. <div class="ico" />
  26867. <div class="alarm--txt">
  26868. <p>대외</p>
  26869. <span>{{ objCount.customer1 }}</span>
  26870. </div>
  26871. </div>
  26872. <div class="card tenant4 gray--alarm">
  26873. <div class="ico" />
  26874. <div class="alarm--txt">
  26875. <p>공용</p>
  26876. <span>{{ objCount.customer2 }}</span>
  26877. </div>
  26878. </div>
  26879. </div>
  26880. </div>
  26881. <div class="oper--stat">
  26882. <div class="card--title">
  26883. <h3>라이선스 인증 현황</h3>
  26884. </div>
  26885. <div class="card--alarm gap--0">
  26886. <div class="card license1">
  26887. <div class="ico" />
  26888. <div class="alarm--txt">
  26889. <p>인증</p>
  26890. <span>{{ objCount.licentVerified }}</span>
  26891. </div>
  26892. </div>
  26893. <div class="card license2 no--alarm">
  26894. <div class="ico" />
  26895. <div class="alarm--txt">
  26896. <p>미인증</p>
  26897. <span>{{ objCount.licentNotVerified }}</span>
  26898. </div>
  26899. </div>
  26900. </div>
  26901. </div>
  26902. </div>
  26903. </div>
  26904. <!-- 위젯 영역 -->
  26905. <WidgetM
  26906. v-if="isLoaded && widgetSize === 'M'"
  26907. :items="userItems"
  26908. :total-cnt="objCount.total"
  26909. />
  26910. <WidgetS
  26911. v-if="isLoaded && widgetSize === 'S'"
  26912. :items="userItems"
  26913. :total-cnt="objCount.total"
  26914. />
  26915. </div>
  26916. </template>
  26917. <script setup>
  26918. /***********************
  26919. * import
  26920. ************************/
  26921. import { useI18n } from "vue-i18n"
  26922. import apiUrl from '@/composables/useApi';
  26923. import useAxios from '@/composables/useAxios';
  26924. import useUtil from '@/composables/useUtil';
  26925. import WidgetM from "@/components/home/dashboard/layout03/user/layout03UserWidgetM.vue"
  26926. import WidgetS from '@/components/home/dashboard/layout03/user/layout03UserWidgetS.vue'
  26927. import dayjs from "#build/dayjs.imports.mjs";
  26928. import testJson from "../../test.json"
  26929. /***********************
  26930. * plugins inject
  26931. ************************/
  26932. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  26933. // props
  26934. const props = defineProps({
  26935. config: {
  26936. type: Object,
  26937. default: () => {}
  26938. },
  26939. intervalTime: {
  26940. type: Number,
  26941. default: 5000
  26942. }
  26943. })
  26944. // 참조가능 데이터 설정
  26945. defineExpose({})
  26946. // 발신 이벤트 선언
  26947. const emit = defineEmits([""]);
  26948. const i18n = useI18n();
  26949. /***********************
  26950. * data & created
  26951. ************************/
  26952. // TenantName
  26953. const tenantName = computed(() => useAuthStore().getTenantName);
  26954. // 설정된 위젯 사이즈 : M or S
  26955. const widgetSize = computed(() => props.config?.widgetSize || 'M');
  26956. // Swiper 표시 slide 갯수
  26957. const slideItemSize = computed(() => widgetSize.value == 'M' ? 8 : 14)
  26958. // 현재 일시
  26959. const current = ref(dayjs().format('YYYY-MM-DD HH:mm:ss'));
  26960. // 카운트 정보
  26961. const objCount = ref({
  26962. total: 0,
  26963. customer0: 0,
  26964. customer1: 0,
  26965. customer2: 0,
  26966. licentVerified: 0,
  26967. licentNotVerified: 0,
  26968. })
  26969. // 가입자 리스트
  26970. const userItems = ref([]);
  26971. // 데이터 조회 여부
  26972. const isLoaded = ref(false);
  26973. /***********************
  26974. * Methods
  26975. ************************/
  26976. const fnInit = () => {
  26977. fnGetUserList();
  26978. }
  26979. const fnReset = () => {
  26980. objCount.value.total = 0;
  26981. objCount.value.customer0 = 0;
  26982. objCount.value.customer1 = 0;
  26983. objCount.value.customer2 = 0;
  26984. objCount.value.licentVerified = 0;
  26985. objCount.value.licentNotVerified = 0;
  26986. current.value = dayjs().format('YYYY-MM-DD HH:mm:ss');
  26987. }
  26988. /** 가입자 목록 조회 */
  26989. function fnGetUserList() {
  26990. isLoaded.value = false;
  26991. const params = {
  26992. tenantName: tenantName.value,
  26993. }
  26994. useAxios().post(apiUrl.getUserList, params).then((res) => {
  26995. const {resCode, resMsg, data} = res.data;
  26996. if(resCode == 200) {
  26997. // 테스트를 위한 테스트 코드 (삭제 필수)
  26998. // fnParseData([...(data?.items || []), ...testJson.user.data.items])
  26999. fnParseData(data.items || [])
  27000. } else {
  27001. $log.debug("[dashboard][fnGetUserList][error]", `[${resCode}] ${resMsg}`);
  27002. }
  27003. }).catch((error)=>{
  27004. // 테스트를 위한 테스트 코드 (삭제 필수)
  27005. // fnParseData([...testJson.user.data.items])
  27006. $log.debug("[dashboard][fnGetUserList][error]", error)
  27007. useErrorHandler().fnSetCommErrorHandle(error, fnGetUserList)
  27008. // 테스트 데이터 파싱
  27009. }).finally(()=>{
  27010. $log.debug("[dashboard][fnGetUserList][finished]")
  27011. isLoaded.value = true;
  27012. })
  27013. }
  27014. /**
  27015. * 데이터 가공
  27016. */
  27017. function fnParseData(items = []) {
  27018. userItems.value = [];
  27019. objCount.value.total = 0;
  27020. objCount.value.customer0 = 0;
  27021. objCount.value.customer1 = 0;
  27022. objCount.value.customer2 = 0;
  27023. objCount.value.licentVerified = 0;
  27024. objCount.value.licentNotVerified = 0;
  27025. let temp = [];
  27026. // 정렬 적용
  27027. temp = items.sort((a, b) => {
  27028. const perA = fnGetPercentValue(a.maxSubscriber, a.curSubscriber);
  27029. const perB = fnGetPercentValue(b.maxSubscriber, b.curSubscriber);
  27030. return +perA < +perB ? 1 : (+perA > +perB ? -1 : 0);
  27031. })
  27032. // 데이터 가공
  27033. temp = temp.map((item) => {
  27034. //카운트 셋팅
  27035. const { customerType, licenseKey } = item;
  27036. objCount.value.total = objCount.value.total+1;
  27037. if(customerType == 0) objCount.value.customer0 = objCount.value.customer0 + 1;
  27038. else if(customerType == 1) objCount.value.customer1 = objCount.value.customer1 + 1;
  27039. else if(customerType == 2) objCount.value.customer2 = objCount.value.customer2 + 1;
  27040. if(licenseKey) objCount.value.licentVerified = objCount.value.licentVerified + 1;
  27041. else objCount.value.licentNotVerified = objCount.value.licentNotVerified + 1;
  27042. //percent
  27043. const { maxSubscriber, curSubscriber } = item;
  27044. const perSubscriber = fnGetPercentValue(maxSubscriber, curSubscriber);
  27045. //심각도
  27046. const level = fnGetLevel(perSubscriber);
  27047. //차트 데이터
  27048. const chartData = {
  27049. datasets: [
  27050. {
  27051. data: [curSubscriber , maxSubscriber - curSubscriber],
  27052. backgroundColor: fnGetChartColorSet(level),
  27053. borderWidth: 0,
  27054. }
  27055. ]
  27056. }
  27057. return {
  27058. ...item,
  27059. level,
  27060. perSubscriber,
  27061. chartData,
  27062. }
  27063. });
  27064. userItems.value = splitIntoChunk(temp, slideItemSize.value)
  27065. }
  27066. /** Array Spliter */
  27067. function splitIntoChunk(arr, chunk) {
  27068. // 빈 배열 생성
  27069. const result = [];
  27070. for (let index=0; index < arr.length; index += chunk) {
  27071. // slice() 메서드를 사용하여 특정 길이만큼 배열을 분리함
  27072. const tempArray = arr.slice(index, index + chunk);
  27073. // 빈 배열에 특정 길이만큼 분리된 배열을 추가
  27074. result.push(tempArray);
  27075. }
  27076. return result;
  27077. }
  27078. /** make percent data */
  27079. const fnGetPercentValue = (max, curr) => {
  27080. return useUtil.toRoundFix((curr / max) * 100, 0);
  27081. }
  27082. const fnGetLevel = (per) => {
  27083. if(per >= 95) return 'critical'; //critical
  27084. else if(per >= 90) return 'major'; //major
  27085. else if(per >= 85) return 'minor'; //minor
  27086. else return ''; //normal
  27087. }
  27088. /** 차트 데이터 > 컬러셋 */
  27089. const fnGetChartColorSet = (level) => {
  27090. if(level == 'critical') return ['#f00','#EAEAEA']; //critical
  27091. else if(level == 'major') return ['#C96103','#EAEAEA']; //major
  27092. else if(level == 'minor') return ['#DDA405','#EAEAEA']; //minor
  27093. else return ['#2D8CFA','#EAEAEA']; //normal
  27094. }
  27095. onMounted(() => fnInit());
  27096. // 위젯사이즈 변경 watch
  27097. watch(() => widgetSize.value, (v) => {
  27098. fnReset();
  27099. fnInit();
  27100. }, {deep: true})
  27101. </script>
  27102. </file>
  27103. <file path="components/home/dashboard/layout03/user/layout03UserWidgetM.vue">
  27104. <template>
  27105. <div>
  27106. <div class="inner--header--wrap">
  27107. <h2
  27108. v-if="totalPage > 0"
  27109. class="inner--component--title none--after"
  27110. >
  27111. 상세 현황 ({{ page }}/{{ totalPage }})
  27112. </h2>
  27113. <h2 v-else>
  27114. 상세 현황
  27115. </h2>
  27116. <p class="inner--component--total">
  27117. Total : <span>{{ props.totalCnt }}</span>
  27118. </p>
  27119. </div>
  27120. <div class="inner--content df--block pt--1rem equip--conmp--wrap">
  27121. <swiper
  27122. :autoplay="{
  27123. delay: 20000,
  27124. disableOnInteraction: false,
  27125. }"
  27126. :loop="true"
  27127. :touch-ratio="0"
  27128. :space-between="spaceBetween"
  27129. :slides-per-view="1"
  27130. :modules="[Autoplay]"
  27131. @slide-change="onSlideChange"
  27132. >
  27133. <swiper-slide
  27134. v-for="(slide, index) in props.items"
  27135. :key="`user-swiper-slide-${index}`"
  27136. >
  27137. <div class="user--list--contents">
  27138. <ul>
  27139. <li
  27140. v-for="(item, idx) in slide"
  27141. :key="`user-swiper-slide-item-${idx}`"
  27142. :class="item.level"
  27143. >
  27144. <div class="headers">
  27145. <div class="title">
  27146. {{ item.tenantName }}
  27147. </div>
  27148. </div>
  27149. <div class="chart--box">
  27150. <Doughnut
  27151. :data="item.chartData"
  27152. :options="chartOptions"
  27153. />
  27154. <div class="current--value">
  27155. {{ toRoundFix(item.curSubscriber, 0) }} / {{ toRoundFix(item.maxSubscriber, 0) }}
  27156. </div>
  27157. </div>
  27158. <div class="current--value--ps">
  27159. {{ item.perSubscriber }}<i class="unit">%</i>
  27160. </div>
  27161. </li>
  27162. </ul>
  27163. </div>
  27164. </swiper-slide>
  27165. </swiper>
  27166. </div>
  27167. </div>
  27168. </template>
  27169. <script setup>
  27170. /***********************
  27171. * import
  27172. ************************/
  27173. import { useI18n } from "vue-i18n"
  27174. import apiUrl from '@/composables/useApi';
  27175. import useAxios from '@/composables/useAxios';
  27176. import useUtil from '@/composables/useUtil';
  27177. import { Swiper, SwiperSlide } from 'swiper/vue';
  27178. import { Autoplay } from 'swiper/modules';
  27179. import 'swiper/css';
  27180. import 'swiper/swiper-bundle.css'
  27181. import { Doughnut } from 'vue-chartjs';
  27182. import { Chart as ChartJS, Title, Tooltip, Legend, BarElement, LineController, LineElement, PointElement, ArcElement, CategoryScale, LinearScale } from 'chart.js';
  27183. /***********************
  27184. * plugins inject
  27185. ************************/
  27186. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  27187. // props
  27188. const props = defineProps({
  27189. items: {
  27190. type: Array,
  27191. default: () => []
  27192. },
  27193. totalCnt: {
  27194. type: Number,
  27195. default: 0
  27196. }
  27197. })
  27198. // 참조가능 데이터 설정
  27199. defineExpose({})
  27200. // 발신 이벤트 선언
  27201. const emit = defineEmits([""]);
  27202. const i18n = useI18n();
  27203. ChartJS.register(Title,
  27204. Tooltip,
  27205. Legend,
  27206. BarElement,
  27207. LineController,
  27208. LineElement,
  27209. PointElement,
  27210. CategoryScale,
  27211. ArcElement,
  27212. LinearScale)
  27213. /***********************
  27214. * data & created
  27215. ************************/
  27216. const page = ref(1);
  27217. const totalPage = computed(() => Math.floor(props.totalCnt / 8) + (props.totalCnt % 8 == 0 ? 0 : 1))
  27218. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  27219. const spaceRem = 0.62; // 원하는 rem 값
  27220. const spaceRemPx = spaceRem * remToPx();
  27221. const spaceBetween = spaceRemPx;
  27222. const chartOptions = {
  27223. responsive: true,
  27224. maintainAspectRatio: false,
  27225. cutout:"75%",
  27226. rotation: 270,
  27227. circumference: 180,
  27228. plugins: {
  27229. legend: {
  27230. position:'top',
  27231. display: false
  27232. },
  27233. tooltip: {
  27234. enabled:false
  27235. }
  27236. }
  27237. }
  27238. /***********************
  27239. * Methods
  27240. ************************/
  27241. /** Slide onChang Event */
  27242. function onSlideChange(swiper) {
  27243. if(swiper.realIndex != page.value + 1)
  27244. page.value = swiper.realIndex + 1
  27245. }
  27246. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  27247. </script>
  27248. </file>
  27249. <file path="components/home/dashboard/layout03/user/layout03UserWidgetS.vue">
  27250. <template>
  27251. <div>
  27252. <div class="inner--header--wrap">
  27253. <h2
  27254. v-if="totalPage > 0"
  27255. class="inner--component--title none--after"
  27256. >
  27257. 상세 현황 ({{ page }}/{{ totalPage }})
  27258. </h2>
  27259. <h2 v-else>
  27260. 상세 현황
  27261. </h2>
  27262. <p class="inner--component--total">
  27263. Total : <span>{{ props.totalCnt }}</span>
  27264. </p>
  27265. </div>
  27266. <div class="inner--content df--block pt--1rem equip--conmp--wrap">
  27267. <swiper
  27268. :autoplay="{
  27269. delay:20000,
  27270. disableOnInteraction: false,
  27271. }"
  27272. :loop="true"
  27273. :touch-ratio="0"
  27274. :space-between="spaceBetween"
  27275. :slides-per-view="1"
  27276. :modules="[Autoplay]"
  27277. @slide-change="onSlideChange"
  27278. >
  27279. <swiper-slide
  27280. v-for="(slide, index) in props.items"
  27281. :key="`user-swiper-slide-${index}`"
  27282. >
  27283. <div class="tenant--card--wrap">
  27284. <div
  27285. v-for="(item, idx) in slide"
  27286. :key="`user-swiper-slide-item-${idx}`"
  27287. :class="item.level"
  27288. class="tenant--card"
  27289. >
  27290. <div class="tenant--name">
  27291. <p>{{ item.tenantName }}</p>
  27292. </div>
  27293. <div class="tenant--per--wrap">
  27294. <div class="tenant--per--num">
  27295. <span>{{ item.perSubscriber }}</span><span>%</span>
  27296. </div>
  27297. <div class="tenant--per--bar">
  27298. <div class="bg--bar">
  27299. <div
  27300. class="fill--bar"
  27301. style="width: 50%"
  27302. >
  27303. {{ toRoundFix(item.curSubscriber, 0) }} / {{ toRoundFix(item.maxSubscriber, 0) }}
  27304. </div>
  27305. </div>
  27306. </div>
  27307. </div>
  27308. </div>
  27309. </div>
  27310. </swiper-slide>
  27311. </swiper>
  27312. </div>
  27313. </div>
  27314. </template>
  27315. <script setup>
  27316. /***********************
  27317. * import
  27318. ************************/
  27319. import { useI18n } from "vue-i18n"
  27320. import apiUrl from '@/composables/useApi';
  27321. import useAxios from '@/composables/useAxios';
  27322. import useUtil from '@/composables/useUtil';
  27323. import { Swiper, SwiperSlide } from 'swiper/vue';
  27324. import { Navigation, Pagination, Autoplay } from 'swiper/modules';
  27325. import 'swiper/css';
  27326. import 'swiper/swiper-bundle.css'
  27327. /***********************
  27328. * plugins inject
  27329. ************************/
  27330. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  27331. // props
  27332. const props = defineProps({
  27333. items: {
  27334. type: Array,
  27335. default: () => []
  27336. },
  27337. totalCnt: {
  27338. type: Number,
  27339. default: 0
  27340. }
  27341. })
  27342. // 참조가능 데이터 설정
  27343. defineExpose({})
  27344. // 발신 이벤트 선언
  27345. const emit = defineEmits([""]);
  27346. const i18n = useI18n();
  27347. /***********************
  27348. * data & created
  27349. ************************/
  27350. const page = ref(1);
  27351. const totalPage = computed(() => Math.floor(props.totalCnt / 8) + (props.totalCnt % 8 == 0 ? 0 : 1))
  27352. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  27353. const spaceRem = 0.62; // 원하는 rem 값
  27354. const spaceRemPx = spaceRem * remToPx();
  27355. const spaceBetween = spaceRemPx;
  27356. /***********************
  27357. * Methods
  27358. ************************/
  27359. /** Slide onChang Event */
  27360. function onSlideChange(swiper) {
  27361. if(swiper.realIndex != page.value + 1)
  27362. page.value = swiper.realIndex + 1
  27363. }
  27364. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  27365. </script>
  27366. </file>
  27367. <file path="components/home/dashboard/layout03/layout03.vue">
  27368. <template>
  27369. <div class="dash--board--contents type3">
  27370. <!-- CORE -->
  27371. <div>
  27372. <Core06x24
  27373. :config="coreConfig"
  27374. :interval-time="props.intervalTime"
  27375. />
  27376. </div>
  27377. <!-- USER -->
  27378. <div>
  27379. <User06x24
  27380. :config="userConfig"
  27381. :interval-time="props.intervalTime"
  27382. />
  27383. </div>
  27384. <!-- RAN -->
  27385. <div>
  27386. <Ran12x24
  27387. :config="raneConfig"
  27388. :interval-time="props.intervalTime"
  27389. />
  27390. </div>
  27391. </div>
  27392. </template>
  27393. <script setup>
  27394. /***********************
  27395. * import
  27396. ************************/
  27397. import { useI18n } from "vue-i18n"
  27398. import apiUrl from '@/composables/useApi';
  27399. import useAxios from '@/composables/useAxios';
  27400. import useUtil from '@/composables/useUtil';
  27401. import Core06x24 from '@/components/home/dashboard/layout03/core/layout03Core.vue'
  27402. import User06x24 from '@/components/home/dashboard/layout03/user/layout03User.vue'
  27403. import Ran12x24 from '@/components/home/dashboard/layout03/ran/layout03Ran.vue'
  27404. /***********************
  27405. * plugins inject
  27406. ************************/
  27407. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  27408. // props
  27409. const props = defineProps({
  27410. intervalTime: {
  27411. type: Number,
  27412. default: 5000
  27413. }
  27414. })
  27415. // 참조가능 데이터 설정
  27416. defineExpose({})
  27417. // 발신 이벤트 선언
  27418. const emit = defineEmits([""]);
  27419. const i18n = useI18n();
  27420. /***********************
  27421. * data & created
  27422. ************************/
  27423. const widgets = computed(() => useAuthStore().getWidgets);
  27424. const coreConfig = computed(() => widgets.value?.find(w => w.widgetGrp == 'CORE'));
  27425. const userConfig = computed(() => widgets.value?.find(w => w.widgetGrp == 'USER'));
  27426. const raneConfig = computed(() => widgets.value?.find(w => w.widgetGrp == 'RANE'));
  27427. /***********************
  27428. * Methods
  27429. ************************/
  27430. </script>
  27431. </file>
  27432. <file path="components/home/dashboard/settingModal.vue">
  27433. <template>
  27434. <v-dialog
  27435. v-model="props.isSettingModal"
  27436. persistent
  27437. width="91.875rem"
  27438. >
  27439. <div class="v-common-dialog-wrapper custom-dialog alert">
  27440. <div class="modal-tit">
  27441. <strong>Dashborad</strong>
  27442. <button
  27443. class="btn-close"
  27444. @click="fnClose()"
  27445. />
  27446. </div>
  27447. <div class="v-common-dialog-content type--z">
  27448. <div class="dash--set--contents">
  27449. <div class="set--list">
  27450. <!-- 왼쪽 배열 리스트 : S -->
  27451. <div class="left--cell">
  27452. <v-radio-group
  27453. v-model="layoutType"
  27454. class="custom-radio"
  27455. @change="fnLayoutChange"
  27456. >
  27457. <v-radio
  27458. v-for="(item, index) in layoutTypeList"
  27459. :key="index"
  27460. :label="item.value"
  27461. :value="item.value"
  27462. class="radio_n"
  27463. >
  27464. <template #label>
  27465. <div class="db--list--set--wrap">
  27466. <h2>{{ item.name }}</h2>
  27467. <div :class="item.class" />
  27468. </div>
  27469. </template>
  27470. </v-radio>
  27471. </v-radio-group>
  27472. </div>
  27473. <!-- 왼쪽 배열 리스트 : E -->
  27474. <!-- 오른쪽 디테일 리스트 : S -->
  27475. <div class="right--cell">
  27476. <div>
  27477. <h2>{{ fnGetLayoutTypeInfo('name') }}</h2>
  27478. <div class="dashboard--detail--contents">
  27479. <div class="detail--list">
  27480. <div
  27481. v-for="(type, index) in fnGetLayoutTypeInfo('sort')"
  27482. :key="`${type}-${index}`"
  27483. >
  27484. <h2>{{ fnGetLayoutTypeInfo(type) }}</h2>
  27485. <div class="group--wrapper">
  27486. <v-radio-group
  27487. v-model="widgetType[type]"
  27488. class="custom-radio"
  27489. >
  27490. <v-radio
  27491. v-for="(widgets, idx) in widgetDetails[type]"
  27492. :key="`${type}-widget-${idx}`"
  27493. :label="widgets.widgetId"
  27494. :value="widgets.widgetId"
  27495. class="radio_n"
  27496. >
  27497. <template #label>
  27498. <div class="db--detail--list--set--wrap size--14">
  27499. <h2>{{ widgets.widgetName }}</h2>
  27500. <div class="db--set--01 size--v--box">
  27501. {{ widgets.widgetName }} Image
  27502. </div>
  27503. </div>
  27504. </template>
  27505. </v-radio>
  27506. </v-radio-group>
  27507. </div>
  27508. </div>
  27509. </div>
  27510. </div>
  27511. </div>
  27512. </div>
  27513. <!-- 오른쪽 디테일 리스트 : E -->
  27514. </div>
  27515. </div>
  27516. </div>
  27517. <div class="btn-wrap nw--btn--wrap">
  27518. <div />
  27519. <div class="inner--btn--wrap">
  27520. <v-btn
  27521. class="custom-btn btn-white mini"
  27522. @click="fnClose()"
  27523. >
  27524. <i class="ico" />
  27525. 취소
  27526. </v-btn>
  27527. <v-btn
  27528. class="custom-btn btn-blue mini"
  27529. @click="fnSaveDashboardSetting()"
  27530. >
  27531. <i class="ico" />
  27532. 확인
  27533. </v-btn>
  27534. </div>
  27535. </div>
  27536. </div>
  27537. </v-dialog>
  27538. </template>
  27539. <script setup>
  27540. /***********************
  27541. * import
  27542. ************************/
  27543. import apiUrl from '@/composables/useApi';
  27544. import useAxios from '@/composables/useAxios';
  27545. import { useI18n } from "vue-i18n";
  27546. /***********************
  27547. * plugins inject
  27548. ************************/
  27549. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  27550. // props
  27551. const props = defineProps({
  27552. isSettingModal: Boolean,
  27553. })
  27554. // 참조가능 데이터 설정
  27555. defineExpose({
  27556. fnInit,
  27557. })
  27558. // 발신 이벤트 선언
  27559. const emit = defineEmits(["closeModal"]);
  27560. const i18n = useI18n();
  27561. /***********************
  27562. * data & created
  27563. ************************/
  27564. // Layout 목록
  27565. const layoutTypeList = ref([
  27566. {name: 'Dashboard #1', value: 'LAYOUT01', class: 'db--set--01', sort: ['CORE', 'USER', 'RANE'], CORE: 'CORE (12 X 14)', USER: '가입자 (12 X 10)', RANE: 'RAN (12 X 24)'},
  27567. {name: 'Dashboard #2', value: 'LAYOUT02', class: 'db--set--02', sort: ['CORE', 'USER', 'RANE'], CORE: 'CORE (12 X 12)', USER: '가입자 (12 X 12)', RANE: 'RAN (24 X 12)'},
  27568. {name: '현황판', value: 'LAYOUT03', class: 'db--set--03', sort: ['CORE', 'RANE', 'USER'], CORE: 'CORE (6 X 24)', USER: '가입자 (6 X 24)', RANE: 'RAN (12 X 24)'},
  27569. ]);
  27570. // 사용자 위젯 정보
  27571. const userDashType = computed(() => useAuthStore().getDashType || layoutGroupList[0].value);
  27572. // 사용자 위젯 정보
  27573. const userWidget = computed(() => useAuthStore().getWidgets || [])
  27574. // 레이아웃별 위젯 목록 (전체 목록)
  27575. const widgetDetails = ref({
  27576. CORE: [],
  27577. USER: [],
  27578. RANE: [],
  27579. });
  27580. // 레이아웃 타입
  27581. const layoutType = ref();
  27582. // 위젯 타입
  27583. const widgetType = ref({
  27584. CORE: '',
  27585. USER: '',
  27586. RANE: '',
  27587. });
  27588. /***********************
  27589. * Methods
  27590. ************************/
  27591. /** 모달 시작 */
  27592. function fnInit() {
  27593. //레이아웃 기본값 셋팅
  27594. layoutType.value = useAuthStore().getDashType || layoutGroupList[0].value;
  27595. fnGetDashboardWidgetList(layoutType.value);
  27596. }
  27597. /** 모달 닫기 */
  27598. function fnClose(isReload = false) {
  27599. fnReset()
  27600. emit('closeModal', {isReload: isReload})
  27601. }
  27602. /** 데이터 초기화 */
  27603. function fnReset() {
  27604. widgetDetails.value = {
  27605. CORE: [],
  27606. USER: [],
  27607. RANE: [],
  27608. }
  27609. widgetType.value = {
  27610. CORE: '',
  27611. USER: '',
  27612. RANE: '',
  27613. }
  27614. }
  27615. /** 레이아웃 선택 */
  27616. function fnLayoutChange() {
  27617. fnGetDashboardWidgetList(layoutType.value)
  27618. }
  27619. /** 레이아웃 정보 가져오기 from layoutTypeList */
  27620. function fnGetLayoutTypeInfo(key, type) {
  27621. if(!type) type = layoutType.value;
  27622. const layout = layoutTypeList.value.find((item) => item.value == type);
  27623. return layout ? (layout[key] || '') : '';
  27624. }
  27625. /** 사용자 지정 위젯 정보 가져오기 from userWidget */
  27626. function fnGetUserWidgetInfo(key, type) {
  27627. const widget = userWidget.value.find((item) => item.widgetGrp == type);
  27628. return widget ? (widget[key] || '') : '';
  27629. }
  27630. /** 위젯 리스트 조회 (전체 리스트) */
  27631. function fnGetDashboardWidgetList(type) {
  27632. fnReset();
  27633. const params = {layoutType: type}
  27634. useAxios().get(apiUrl.getDashboardWidgetList, {params: params}).then((res) => {
  27635. if(res.data.resCode === '200') {
  27636. const widgets = res?.data?.data || [];
  27637. // 타입별 Object 생성
  27638. if(widgets && widgets.length > 0) {
  27639. widgetDetails.value = widgets.reduce((acc, cur, idx) => {
  27640. const { widgetGrp } = cur;
  27641. if(acc[widgetGrp]) acc[widgetGrp].push(cur);
  27642. else acc[widgetGrp] = [cur];
  27643. // 기본값 셋팅
  27644. if(cur.defaultYN == 'Y') {
  27645. widgetType.value[cur.widgetGrp] = cur.widgetId;
  27646. }
  27647. return acc;
  27648. }, {})
  27649. }
  27650. // 선택한 레이아웃이 사용자지정 레이아웃인 경우 사용자가 선택한 값으로 기본값 셋팅
  27651. if(type == userDashType.value) {
  27652. widgetType.value.CORE = fnGetUserWidgetInfo('widgetId', 'CORE');
  27653. widgetType.value.USER = fnGetUserWidgetInfo('widgetId', 'USER');
  27654. widgetType.value.RANE = fnGetUserWidgetInfo('widgetId', 'RANE');
  27655. }
  27656. }
  27657. $log.debug("[settingModal][fnGetTenantList][success]")
  27658. }).catch((error)=>{
  27659. $log.debug("[settingModal][fnGetDashboardWidgetList][error]")
  27660. useErrorHandler().fnSetCommErrorHandle(error, fnGetDashboardWidgetList)
  27661. }).finally(()=>{
  27662. $log.debug("[settingModal][fnGetDashboardWidgetList][finished]")
  27663. })
  27664. }
  27665. function fnSaveDashboardSetting() {
  27666. const params = {
  27667. dashType: layoutType.value,
  27668. widgets: [
  27669. {
  27670. areaType: 'AREA01', widgetId: widgetType.value.CORE
  27671. },
  27672. {
  27673. areaType: layoutType.value == 'LAYOUT03' ? 'AREA03' : 'AREA02', widgetId: widgetType.value.USER
  27674. },
  27675. {
  27676. areaType: layoutType.value == 'LAYOUT03' ? 'AREA02' : 'AREA03', widgetId: widgetType.value.RANE
  27677. },
  27678. ]
  27679. }
  27680. useAxios().post(apiUrl.myInfoUpdate, params).then((res) => {
  27681. $toast.success(i18n.t('common.updateSuccessMsg'))
  27682. useAuthStore().setDashType(layoutType.value);
  27683. const authWidget = Object.keys(widgetType.value).map((type) => {
  27684. const widgetId = widgetType.value[type];
  27685. const widgetDetail = widgetDetails.value[type].find((w) => w.widgetId == widgetId);
  27686. const param = params.widgets.find((w) => w.widgetId == widgetId);
  27687. return {
  27688. accountId: useAuthStore().getAccountId,
  27689. areaType: param.areaType,
  27690. widgetGrp: type,
  27691. widgetId: widgetId,
  27692. widgetName: widgetDetail.widgetName,
  27693. widgetSize: widgetDetail.widgetSize,
  27694. widgetWh: widgetDetail.widgetWh
  27695. }
  27696. })
  27697. useAuthStore().setWidgetsUpdate(authWidget);
  27698. fnClose(true);
  27699. $log.debug("[settingModal][fnSaveDashboardSetting][success]")
  27700. }).catch((error)=>{
  27701. $log.debug("[settingModal][fnSaveDashboardSetting][error]", error)
  27702. useErrorHandler().fnSetCommErrorHandle(error, fnSaveDashboardSetting)
  27703. }).finally(()=>{
  27704. $log.debug("[settingModal][fnSaveDashboardSetting][finished]")
  27705. })
  27706. }
  27707. </script>
  27708. </file>
  27709. <file path="components/home/dashboard/test.json">
  27710. {
  27711. "core": {
  27712. "resCode": "200",
  27713. "data": {
  27714. "items": [
  27715. {"tenantName": "YWLABS", "neGroup": "group02", "neName": "nename001", "neType": "CU", "familyName": "SMUPFSE", "initTime": "2024-09-26 18:15:00", "customerType": 2, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 0, "criCnt": 3, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"99\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"94\"}" },
  27716. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_2000", "neName": "SDS-5G-SMF-2", "neType": "SMF", "familyName": "SMUPFSE", "initTime": "2024-09-26 18:15:00", "customerType": 1, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 0, "criCnt": 2, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"89\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"84\"}" },
  27717. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_3000", "neName": "SDS-5G-SMF-3", "neType": "SMF", "familyName": "SMUPFSE", "initTime": "2024-09-26 18:15:00", "customerType": 1, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 0, "criCnt": 1, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"89\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"5\"}" },
  27718. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_4000", "neName": "SDS-5G-SMF-4", "neType": "SMF", "familyName": "SMUPFSE", "initTime": "2024-09-26 18:15:00", "customerType": 2, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 2, "criCnt": 0, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"24\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"99\"}" },
  27719. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_5000", "neName": "SDS-5G-SMF-5", "neType": "SMF", "familyName": "SMUPFSE", "initTime": "2024-09-26 18:15:00", "customerType": 2, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 1, "criCnt": 0, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"24\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"94\"}" },
  27720. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_6000", "neName": "SDS-5G-SMF-6", "neType": "SMF", "familyName": "SMUPFSE", "initTime": "2024-09-26 18:15:00", "customerType": 0, "severity": 0, "status": 0, "minCnt": 1, "majCnt": 0, "criCnt": 0, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"24\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"89\"}" },
  27721. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_7000", "neName": "SDS-5G-SMF-7", "neType": "SMF", "familyName": "SMUPFSE", "initTime": "2024-09-26 18:15:00", "customerType": 0, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 0, "criCnt": 0, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"24\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"5\"}" },
  27722. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_8000", "neName": "SDS-5G-SMF-8", "neType": "SMF", "familyName": "SMUPFSE", "initTime": "2024-09-26 18:15:00", "customerType": 0, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 0, "criCnt": 0, "emsStatus": 0, "mcmStatus": 1, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"24\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"5\"}" },
  27723. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_9000", "neName": "SDS-5G-SMF-9", "neType": "SMF", "familyName": "SMUPFSE", "initTime": "2024-09-26 18:15:00", "customerType": 1, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 0, "criCnt": 0, "emsStatus": 1, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"24\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"5\"}" },
  27724. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_1011", "neName": "SDS-5G-AMF-1", "neType": "AMF", "familyName": "MS", "initTime": "2024-09-26 18:15:00", "customerType": 1, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 0, "criCnt": 3, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"97\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"5\"}" },
  27725. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_2011", "neName": "SDS-5G-AMF-2", "neType": "AMF", "familyName": "MS", "initTime": "2024-09-26 18:15:00", "customerType": 1, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 0, "criCnt": 2, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"92\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"5\"}" },
  27726. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_3011", "neName": "SDS-5G-AMF-3", "neType": "AMF", "familyName": "MS", "initTime": "2024-09-26 18:15:00", "customerType": 2, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 0, "criCnt": 1, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"86\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"5\"}" },
  27727. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_4011", "neName": "SDS-5G-AMF-4", "neType": "AMF", "familyName": "MS", "initTime": "2024-09-26 18:15:00", "customerType": 2, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 2, "criCnt": 0, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"24\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"5\"}" },
  27728. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_5011", "neName": "SDS-5G-AMF-5", "neType": "AMF", "familyName": "MS", "initTime": "2024-09-26 18:15:00", "customerType": 1, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 1, "criCnt": 0, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"24\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"5\"}" },
  27729. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_6011", "neName": "SDS-5G-AMF-6", "neType": "AMF", "familyName": "MS", "initTime": "2024-09-26 18:15:00", "customerType": 0, "severity": 0, "status": 0, "minCnt": 1, "majCnt": 0, "criCnt": 0, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"24\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"5\"}" },
  27730. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_7011", "neName": "SDS-5G-AMF-7", "neType": "AMF", "familyName": "MS", "initTime": "2024-09-26 18:15:00", "customerType": 0, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 0, "criCnt": 0, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"24\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"5\"}" },
  27731. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_8011", "neName": "SDS-5G-AMF-8", "neType": "AMF", "familyName": "MS", "initTime": "2024-09-26 18:15:00", "customerType": 0, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 0, "criCnt": 0, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"24\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"5\"}" },
  27732. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_9011", "neName": "SDS-5G-AMF-9", "neType": "AMF", "familyName": "MS", "initTime": "2024-09-26 18:15:00", "customerType": 1, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 0, "criCnt": 0, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 1, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"24\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"88\"}" },
  27733. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_1311", "neName": "SDS-5G-AMF-10", "neType": "AMF", "familyName": "MS", "initTime": "2024-09-26 18:15:00", "customerType": 1, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 0, "criCnt": 0, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"24\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"92\"}" },
  27734. {"tenantName": "SAMSUNGSDS", "neGroup": "SDS_1411", "neName": "SDS-5G-AMF-11", "neType": "AMF", "familyName": "MS", "initTime": "2024-09-26 18:15:00", "customerType": 1, "severity": 0, "status": 0, "minCnt": 0, "majCnt": 0, "criCnt": 0, "emsStatus": 0, "mcmStatus": 0, "psmStatus": 0, "kpi": "{\"INIT_ATTEMPT\":\"1\",\"INIT_C_RATIO\":\"100.00\"}", "cpu": "{\"AVG_CPU_L(%)\":\"23\",\"PEAK_CPU_L(%)\":\"24\"}", "mem": "{\"AVG_MEM_L(%)\":\"5\",\"PEAK_MEM_L(%)\":\"99\"}" }
  27735. ]
  27736. }
  27737. },
  27738. "user": {
  27739. "resCode": "200",
  27740. "data": {
  27741. "items": [
  27742. {"tenantName": "SAMSUNGSDS","tenantCode": "101","issueDate": "2024-08-20 00:00:00","expirationDate": "2026-08-30 00:00:00","licenseType": "2","licenseKey": "2222-333-2123","maxAccount": 5,"maxSession": 10,"clientAccess": 4,"maxSubscriber": 10,"currentAccountCount": 19,"currentConnectingCount": 2,"curSubscriber": 8,"customerType": 1},
  27743. {"tenantName": "SDS_TEST","tenantCode": "10","issueDate": "2023-12-09 00:00:00","expirationDate": "9998-11-02 00:00:00","licenseType": "3","licenseKey": "gzgV5oztBwaX4ZQiHsmbDBW63RyE5l2O/t5ViyVO15BvM6ozDwbTmBQ+Wrg//TQ2eBjf3Hpo7mw=","maxAccount": 100,"maxSession": 100,"clientAccess": 1,"maxSubscriber": 100,"currentAccountCount": 0,"currentConnectingCount": 0,"curSubscriber": 89,"customerType": 0},
  27744. {"tenantName": "YWLABS","tenantCode": "100","issueDate": "2024-08-29 00:00:00","expirationDate": "2025-08-25 00:00:00","licenseType": "1","licenseKey": "2222-333-2123","maxAccount": 5,"maxSession": 10,"clientAccess": 4,"maxSubscriber": 100,"currentAccountCount": 7,"currentConnectingCount": 0,"curSubscriber": 94,"customerType": 0},
  27745. {"tenantName": "YWLABS1","tenantCode": "101","issueDate": "2024-08-29 00:00:00","expirationDate": "2025-08-25 00:00:00","licenseType": "1","licenseKey": "2222-333-2123","maxAccount": 5,"maxSession": 10,"clientAccess": 4,"maxSubscriber": 100,"currentAccountCount": 7,"currentConnectingCount": 0,"curSubscriber": 99,"customerType": 1},
  27746. {"tenantName": "YWLABS2","tenantCode": "102","issueDate": "2024-08-29 00:00:00","expirationDate": "2025-08-25 00:00:00","licenseType": "1","licenseKey": "2222-333-2123","maxAccount": 5,"maxSession": 10,"clientAccess": 4,"maxSubscriber": 100,"currentAccountCount": 7,"currentConnectingCount": 0,"curSubscriber": 9,"customerType": 1},
  27747. {"tenantName": "YWLABS3","tenantCode": "103","issueDate": "2024-08-29 00:00:00","expirationDate": "2025-08-25 00:00:00","licenseType": "1","licenseKey": "2222-333-2123","maxAccount": 5,"maxSession": 10,"clientAccess": 4,"maxSubscriber": 100,"currentAccountCount": 7,"currentConnectingCount": 0,"curSubscriber": 9,"customerType": 2},
  27748. {"tenantName": "YWLABS4","tenantCode": "104","issueDate": "2024-08-29 00:00:00","expirationDate": "2025-08-25 00:00:00","licenseType": "1","licenseKey": "2222-333-2123","maxAccount": 5,"maxSession": 10,"clientAccess": 4,"maxSubscriber": 100,"currentAccountCount": 7,"currentConnectingCount": 0,"curSubscriber": 5,"customerType": 2},
  27749. {"tenantName": "YWLABS5","tenantCode": "105","issueDate": "2024-08-29 00:00:00","expirationDate": "2025-08-25 00:00:00","licenseType": "1","licenseKey": "2222-333-2123","maxAccount": 5,"maxSession": 10,"clientAccess": 4,"maxSubscriber": 100,"currentAccountCount": 7,"currentConnectingCount": 0,"curSubscriber": 8,"customerType": 1},
  27750. {"tenantName": "YWLABS6","tenantCode": "106","issueDate": "2024-08-29 00:00:00","expirationDate": "2025-08-25 00:00:00","licenseType": "1","licenseKey": "","maxAccount": 5,"maxSession": 10,"clientAccess": 4,"maxSubscriber": 100,"currentAccountCount": 7,"currentConnectingCount": 0,"curSubscriber": 45,"customerType": 1},
  27751. {"tenantName": "YWLABS7","tenantCode": "107","issueDate": "2024-08-29 00:00:00","expirationDate": "2025-08-25 00:00:00","licenseType": "1","licenseKey": "2222-333-2123","maxAccount": 5,"maxSession": 10,"clientAccess": 4,"maxSubscriber": 100,"currentAccountCount": 7,"currentConnectingCount": 0,"curSubscriber": 5,"customerType": 1},
  27752. {"tenantName": "YWLABS8","tenantCode": "108","issueDate": "2024-08-29 00:00:00","expirationDate": "2025-08-25 00:00:00","licenseType": "1","licenseKey": "2222-333-2123","maxAccount": 5,"maxSession": 10,"clientAccess": 4,"maxSubscriber": 100,"currentAccountCount": 7,"currentConnectingCount": 0,"curSubscriber": 4,"customerType": 1},
  27753. {"tenantName": "YWLABS9","tenantCode": "109","issueDate": "2024-08-29 00:00:00","expirationDate": "2025-08-25 00:00:00","licenseType": "1","licenseKey": "","maxAccount": 5,"maxSession": 10,"clientAccess": 4,"maxSubscriber": 100,"currentAccountCount": 7,"currentConnectingCount": 0,"curSubscriber": 6,"customerType": 1},
  27754. {"tenantName": "YWLABS10","tenantCode": "110","issueDate": "2024-08-29 00:00:00","expirationDate": "2025-08-25 00:00:00","licenseType": "1","licenseKey": "","maxAccount": 5,"maxSession": 10,"clientAccess": 4,"maxSubscriber": 100,"currentAccountCount": 7,"currentConnectingCount": 0,"curSubscriber": 5,"customerType": 1},
  27755. {"tenantName": "YWLABS11","tenantCode": "111","issueDate": "2024-08-29 00:00:00","expirationDate": "2025-08-25 00:00:00","licenseType": "1","licenseKey": "2222-333-2123","maxAccount": 5,"maxSession": 10,"clientAccess": 4,"maxSubscriber": 100,"currentAccountCount": 7,"currentConnectingCount": 0,"curSubscriber": 1,"customerType": 1}
  27756. ]
  27757. }
  27758. },
  27759. "coreEvent": {
  27760. "criCnt": 2,
  27761. "majCnt": 1,
  27762. "minCnt": 1,
  27763. "items": [
  27764. {"eventCode": "2003","severity": 2,"alarmGroup": 3, "location": "TEST_LOCATION", "probcause": "TEST_CAUSE", "alarmTime": "20240530090000000"},
  27765. {"eventCode": "2003","severity": 1,"alarmGroup": 1, "location": "TEST_LOCATION1", "probcause": "TEST_CAUSE1", "alarmTime": "20240530091100000"},
  27766. {"eventCode": "2004","severity": 3,"alarmGroup": 3, "location": "TEST_LOCATION2", "probcause": "TEST_CAUSE2", "alarmTime": "20240530091300000"},
  27767. {"eventCode": "2005","severity": 1,"alarmGroup": 4, "location": "TEST_LOCATION3", "probcause": "TEST_CAUSE3", "alarmTime": "2024053009140000"}
  27768. ]
  27769. },
  27770. "tenantTrendItems1" : [
  27771. { "INIT_TIME": "2024-09-27 3:00:00 PM", "INIT_ATTEMP": 5, "INIT_C_RATIO": 25 },
  27772. { "INIT_TIME": "2024-09-27 3:15:00 PM", "INIT_ATTEMP": 15, "INIT_C_RATIO": 10 },
  27773. { "INIT_TIME": "2024-09-27 3:30:00 PM", "INIT_ATTEMP": 5, "INIT_C_RATIO": 25 },
  27774. { "INIT_TIME": "2024-09-27 3:45:00 PM", "INIT_ATTEMP": 15, "INIT_C_RATIO": 10 },
  27775. { "INIT_TIME": "2024-09-27 4:00:00 PM", "INIT_ATTEMP": 5, "INIT_C_RATIO": 25 },
  27776. { "INIT_TIME": "2024-09-27 4:15:00 PM", "INIT_ATTEMP": 15, "INIT_C_RATIO": 25 },
  27777. { "INIT_TIME": "2024-09-27 4:30:00 PM", "INIT_ATTEMP": 5, "INIT_C_RATIO": 10 },
  27778. { "INIT_TIME": "2024-09-27 4:45:00 PM", "INIT_ATTEMP": 15, "INIT_C_RATIO": 15 },
  27779. { "INIT_TIME": "2024-09-27 5:00:00 PM", "INIT_ATTEMP": 5, "INIT_C_RATIO": 25 },
  27780. { "INIT_TIME": "2024-09-27 5:15:00 PM", "INIT_ATTEMP": 15, "INIT_C_RATIO": 15 },
  27781. { "INIT_TIME": "2024-09-27 5:30:00 PM", "INIT_ATTEMP": 5, "INIT_C_RATIO": 10 },
  27782. { "INIT_TIME": "2024-09-27 5:45:00 PM", "INIT_ATTEMP": 15, "INIT_C_RATIO": 10 },
  27783. { "INIT_TIME": "2024-09-27 6:00:00 PM", "INIT_ATTEMP": 15, "INIT_C_RATIO": 15 },
  27784. { "INIT_TIME": "2024-09-27 6:15:00 PM", "INIT_ATTEMP": 5, "INIT_C_RATIO": 10 },
  27785. { "INIT_TIME": "2024-09-27 6:30:00 PM", "INIT_ATTEMP": 15, "INIT_C_RATIO": 25 },
  27786. { "INIT_TIME": "2024-09-27 6:45:00 PM", "INIT_ATTEMP": 15, "INIT_C_RATIO": 10 },
  27787. { "INIT_TIME": "2024-09-27 7:00:00 PM", "INIT_ATTEMP": 5, "INIT_C_RATIO": 15 },
  27788. { "INIT_TIME": "2024-09-27 7:15:00 PM", "INIT_ATTEMP": 15, "INIT_C_RATIO": 10 },
  27789. { "INIT_TIME": "2024-09-27 7:30:00 PM", "INIT_ATTEMP": 15, "INIT_C_RATIO": 25 },
  27790. { "INIT_TIME": "2024-09-27 7:45:00 PM", "INIT_ATTEMP": 5, "INIT_C_RATIO": 10 },
  27791. { "INIT_TIME": "2024-09-27 8:00:00 PM", "INIT_ATTEMP": 5, "INIT_C_RATIO": 25 },
  27792. { "INIT_TIME": "2024-09-27 8:15:00 PM", "INIT_ATTEMP": 5, "INIT_C_RATIO": 10 },
  27793. { "INIT_TIME": "2024-09-27 8:30:00 PM", "INIT_ATTEMP": 15, "INIT_C_RATIO": 25 },
  27794. { "INIT_TIME": "2024-09-27 8:45:00 PM", "INIT_ATTEMP": 5, "INIT_C_RATIO": 25 },
  27795. { "INIT_TIME": "2024-09-27 9:00:00 PM", "INIT_ATTEMP": 15, "INIT_C_RATIO": 25 },
  27796. { "INIT_TIME": "2024-09-27 9:15:00 PM", "INIT_ATTEMP": 15, "INIT_C_RATIO": 10 },
  27797. { "INIT_TIME": "2024-09-27 9:30:00 PM", "INIT_ATTEMP": 5, "INIT_C_RATIO": 10 },
  27798. { "INIT_TIME": "2024-09-27 9:45:00 PM", "INIT_ATTEMP": 5, "INIT_C_RATIO": 10 }
  27799. ],
  27800. "tenantTrendItems2": [
  27801. { "INIT_TIME": "2024-09-27 3:00:00 PM", "CUR_REG": 6, "CUR_DEREG": 18, "CUR_TOTAL": 14, "CUR_CM_IDLE": 12, "CUR_CM_CONN": 3},
  27802. { "INIT_TIME": "2024-09-27 3:15:00 PM", "CUR_REG": 16, "CUR_DEREG": 8, "CUR_TOTAL": 24, "CUR_CM_IDLE": 22, "CUR_CM_CONN": 13},
  27803. { "INIT_TIME": "2024-09-27 3:30:00 PM", "CUR_REG": 6, "CUR_DEREG": 18, "CUR_TOTAL": 14, "CUR_CM_IDLE": 12, "CUR_CM_CONN": 3},
  27804. { "INIT_TIME": "2024-09-27 3:45:00 PM", "CUR_REG": 16, "CUR_DEREG": 8, "CUR_TOTAL": 24, "CUR_CM_IDLE": 12, "CUR_CM_CONN": 13},
  27805. { "INIT_TIME": "2024-09-27 4:00:00 PM", "CUR_REG": 6, "CUR_DEREG": 8, "CUR_TOTAL": 14, "CUR_CM_IDLE": 12, "CUR_CM_CONN": 3},
  27806. { "INIT_TIME": "2024-09-27 4:15:00 PM", "CUR_REG": 16, "CUR_DEREG": 18, "CUR_TOTAL": 14, "CUR_CM_IDLE": 22, "CUR_CM_CONN": 3},
  27807. { "INIT_TIME": "2024-09-27 4:30:00 PM", "CUR_REG": 6, "CUR_DEREG": 18, "CUR_TOTAL": 24, "CUR_CM_IDLE": 12, "CUR_CM_CONN": 13},
  27808. { "INIT_TIME": "2024-09-27 4:45:00 PM", "CUR_REG": 6, "CUR_DEREG": 18, "CUR_TOTAL": 14, "CUR_CM_IDLE": 22, "CUR_CM_CONN": 3},
  27809. { "INIT_TIME": "2024-09-27 5:00:00 PM", "CUR_REG": 16, "CUR_DEREG": 8, "CUR_TOTAL": 14, "CUR_CM_IDLE": 12, "CUR_CM_CONN": 3},
  27810. { "INIT_TIME": "2024-09-27 5:15:00 PM", "CUR_REG": 6, "CUR_DEREG": 18, "CUR_TOTAL": 24, "CUR_CM_IDLE": 22, "CUR_CM_CONN": 13},
  27811. { "INIT_TIME": "2024-09-27 5:30:00 PM", "CUR_REG": 16, "CUR_DEREG": 8, "CUR_TOTAL": 14, "CUR_CM_IDLE": 22, "CUR_CM_CONN": 3},
  27812. { "INIT_TIME": "2024-09-27 5:45:00 PM", "CUR_REG": 16, "CUR_DEREG": 8, "CUR_TOTAL": 24, "CUR_CM_IDLE": 12, "CUR_CM_CONN": 3},
  27813. { "INIT_TIME": "2024-09-27 6:00:00 PM", "CUR_REG": 16, "CUR_DEREG": 18, "CUR_TOTAL": 24, "CUR_CM_IDLE": 22, "CUR_CM_CONN": 13},
  27814. { "INIT_TIME": "2024-09-27 6:15:00 PM", "CUR_REG": 6, "CUR_DEREG": 18, "CUR_TOTAL": 24, "CUR_CM_IDLE": 21, "CUR_CM_CONN": 3},
  27815. { "INIT_TIME": "2024-09-27 6:30:00 PM", "CUR_REG": 6, "CUR_DEREG": 18, "CUR_TOTAL": 24, "CUR_CM_IDLE": 22, "CUR_CM_CONN": 13},
  27816. { "INIT_TIME": "2024-09-27 6:45:00 PM", "CUR_REG": 16, "CUR_DEREG": 8, "CUR_TOTAL": 22, "CUR_CM_IDLE": 12, "CUR_CM_CONN": 3},
  27817. { "INIT_TIME": "2024-09-27 7:00:00 PM", "CUR_REG": 6, "CUR_DEREG": 8, "CUR_TOTAL": 24, "CUR_CM_IDLE": 12, "CUR_CM_CONN": 3},
  27818. { "INIT_TIME": "2024-09-27 7:15:00 PM", "CUR_REG": 6, "CUR_DEREG": 8, "CUR_TOTAL": 14, "CUR_CM_IDLE": 22, "CUR_CM_CONN": 3},
  27819. { "INIT_TIME": "2024-09-27 7:30:00 PM", "CUR_REG": 6, "CUR_DEREG": 18, "CUR_TOTAL": 24, "CUR_CM_IDLE": 21, "CUR_CM_CONN": 13},
  27820. { "INIT_TIME": "2024-09-27 7:45:00 PM", "CUR_REG": 16, "CUR_DEREG": 8, "CUR_TOTAL": 24, "CUR_CM_IDLE": 22, "CUR_CM_CONN": 3},
  27821. { "INIT_TIME": "2024-09-27 8:00:00 PM", "CUR_REG": 6, "CUR_DEREG": 8, "CUR_TOTAL": 14, "CUR_CM_IDLE": 21, "CUR_CM_CONN": 3},
  27822. { "INIT_TIME": "2024-09-27 8:15:00 PM", "CUR_REG": 6, "CUR_DEREG": 18, "CUR_TOTAL": 14, "CUR_CM_IDLE": 22, "CUR_CM_CONN": 13},
  27823. { "INIT_TIME": "2024-09-27 8:30:00 PM", "CUR_REG": 6, "CUR_DEREG": 8, "CUR_TOTAL": 14, "CUR_CM_IDLE": 12, "CUR_CM_CONN": 13},
  27824. { "INIT_TIME": "2024-09-27 8:45:00 PM", "CUR_REG": 16, "CUR_DEREG": 8, "CUR_TOTAL": 14, "CUR_CM_IDLE": 12, "CUR_CM_CONN": 3},
  27825. { "INIT_TIME": "2024-09-27 9:00:00 PM", "CUR_REG": 16, "CUR_DEREG": 18, "CUR_TOTAL": 4, "CUR_CM_IDLE": 12, "CUR_CM_CONN": 3},
  27826. { "INIT_TIME": "2024-09-27 9:15:00 PM", "CUR_REG": 16, "CUR_DEREG": 18, "CUR_TOTAL": 14, "CUR_CM_IDLE": 12, "CUR_CM_CONN": 3},
  27827. { "INIT_TIME": "2024-09-27 9:30:00 PM", "CUR_REG": 16, "CUR_DEREG": 8, "CUR_TOTAL": 24, "CUR_CM_IDLE": 22, "CUR_CM_CONN": 3},
  27828. { "INIT_TIME": "2024-09-27 9:45:00 PM", "CUR_REG": 6, "CUR_DEREG": 8, "CUR_TOTAL": 14, "CUR_CM_IDLE": 22, "CUR_CM_CONN": 3}
  27829. ],
  27830. "ranNeGroupList": {
  27831. "resCode": "200",
  27832. "data": {
  27833. "items": [
  27834. {
  27835. "tenantName": "SAMSUNGSDS",
  27836. "neGroup": "tenant01Group01",
  27837. "neName": "tenant01Group01ne01",
  27838. "neId": "CPC_101",
  27839. "neType": "UPF",
  27840. "upfNum": 10,
  27841. "customerType": 1,
  27842. "lastUpdateTime": "2024-09-10 00:00:00",
  27843. "neAddress": "서울시",
  27844. "neLocLatitude": "37.55603063",
  27845. "neLocLongitude": "125.98081697",
  27846. "familyName": "PUD",
  27847. "initTime": "2024-09-01 18:15:00",
  27848. "minCnt": 0,
  27849. "majCnt": 0,
  27850. "criCnt": 0,
  27851. "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  27852. "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"99\"}",
  27853. "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"94\"}",
  27854. "areaCode": 11
  27855. },
  27856. {
  27857. "tenantName": "SAMSUNGSDS",
  27858. "neGroup": "tenant01Group02",
  27859. "neName": "tenant01Group01ne02",
  27860. "neId": "CPC_102",
  27861. "neType": "UPF",
  27862. "upfNum": 10,
  27863. "customerType": 1,
  27864. "lastUpdateTime": "2024-09-10 00:00:00",
  27865. "neAddress": "서울시",
  27866. "neLocLatitude": "37.55603063",
  27867. "neLocLongitude": "124.98081697",
  27868. "familyName": "PUD",
  27869. "initTime": "2024-09-01 18:15:00",
  27870. "minCnt": 3,
  27871. "majCnt": 1,
  27872. "criCnt": 5,
  27873. "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  27874. "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"88\"}",
  27875. "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"17\"}",
  27876. "areaCode": 11
  27877. },
  27878. {
  27879. "tenantName": "SAMSUNGSDS",
  27880. "neGroup": "tenant01Group01",
  27881. "neName": "tenant01Group01ne04",
  27882. "neId": "CPC_103",
  27883. "neType": "UPF",
  27884. "upfNum": 10,
  27885. "customerType": 1,
  27886. "lastUpdateTime": "2024-09-10 00:00:00",
  27887. "neAddress": "서울시",
  27888. "neLocLatitude": "37.55203063",
  27889. "neLocLongitude": "123.98081697",
  27890. "familyName": "PUD",
  27891. "initTime": "2024-09-01 18:15:00",
  27892. "minCnt": 0,
  27893. "majCnt": 1,
  27894. "criCnt": 0,
  27895. "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  27896. "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"11\"}",
  27897. "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"17\"}",
  27898. "areaCode": 11
  27899. },
  27900. {
  27901. "tenantName": "SAMSUNGSDS",
  27902. "neGroup": "tenant01Group01",
  27903. "neName": "tenant01Group01ne03",
  27904. "neId": "CPC_103",
  27905. "neType": "UPF",
  27906. "upfNum": 10,
  27907. "customerType": 1,
  27908. "lastUpdateTime": "2024-09-10 00:00:00",
  27909. "neAddress": "서울시",
  27910. "neLocLatitude": "37.55203063",
  27911. "neLocLongitude": "122.98081697",
  27912. "familyName": "PUD",
  27913. "initTime": "2024-09-01 18:15:00",
  27914. "minCnt": 1,
  27915. "majCnt": 0,
  27916. "criCnt": 0,
  27917. "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  27918. "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"11\"}",
  27919. "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"17\"}",
  27920. "areaCode": 11
  27921. },
  27922. {
  27923. "tenantName": "SAMSUNGSDS1",
  27924. "neGroup": "tenant011Group01",
  27925. "neName": "tenant011Group01ne01",
  27926. "neId": "CPC_100",
  27927. "neType": "UPF",
  27928. "upfNum": 10,
  27929. "customerType": 1,
  27930. "lastUpdateTime": "2024-09-10 00:00:00",
  27931. "neAddress": "서울시",
  27932. "neLocLatitude": "37.55603063",
  27933. "neLocLongitude": "126.94081697",
  27934. "familyName": "PUD",
  27935. "initTime": "2024-09-01 18:15:00",
  27936. "minCnt": 2,
  27937. "majCnt": 0,
  27938. "criCnt": 3,
  27939. "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  27940. "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"11\"}",
  27941. "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"17\"}",
  27942. "areaCode": 11
  27943. },
  27944. {
  27945. "tenantName": "YWLABS",
  27946. "neGroup": "tenant02Group01",
  27947. "neName": "tenant02Group01ne01",
  27948. "neId": "CPC_100",
  27949. "neType": "UPF",
  27950. "upfNum": 10,
  27951. "customerType": 1,
  27952. "lastUpdateTime": "2024-09-10 00:00:00",
  27953. "neAddress": "부산",
  27954. "neLocLatitude": "37.51630488",
  27955. "neLocLongitude": "127.10047935",
  27956. "familyName": "PUD",
  27957. "initTime": "2024-09-01 18:15:00",
  27958. "minCnt": 3,
  27959. "majCnt": 0,
  27960. "criCnt": 0,
  27961. "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  27962. "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"11\"}",
  27963. "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"17\"}",
  27964. "areaCode": 21
  27965. },
  27966. {
  27967. "tenantName": "YWLABS1",
  27968. "neGroup": "tenant03Group01",
  27969. "neName": "tenant03Group01ne01",
  27970. "neId": "CPC_100",
  27971. "neType": "UPF",
  27972. "upfNum": 10,
  27973. "customerType": 1,
  27974. "lastUpdateTime": "2024-09-10 00:00:00",
  27975. "neAddress": "대구",
  27976. "neLocLatitude": "37.41630488",
  27977. "neLocLongitude": "127.10047935",
  27978. "familyName": "PUD",
  27979. "initTime": "2024-09-01 18:15:00",
  27980. "minCnt": 0,
  27981. "majCnt": 1,
  27982. "criCnt": 0,
  27983. "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  27984. "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"11\"}",
  27985. "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"17\"}",
  27986. "areaCode": 22
  27987. },
  27988. {
  27989. "tenantName": "YWLABS2",
  27990. "neGroup": "tenant04Group01",
  27991. "neName": "tenant04Group01ne01",
  27992. "neId": "CPC_100",
  27993. "neType": "UPF",
  27994. "upfNum": 10,
  27995. "customerType": 1,
  27996. "lastUpdateTime": "2024-09-10 00:00:00",
  27997. "neAddress": "인천",
  27998. "neLocLatitude": "37.41630488",
  27999. "neLocLongitude": "127.10047935",
  28000. "familyName": "PUD",
  28001. "initTime": "2024-09-01 18:15:00",
  28002. "minCnt": 2,
  28003. "majCnt": 0,
  28004. "criCnt": 0,
  28005. "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  28006. "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"11\"}",
  28007. "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"17\"}",
  28008. "areaCode": 23
  28009. },
  28010. {
  28011. "tenantName": "YWLABS2",
  28012. "neGroup": "tenant04Group01",
  28013. "neName": "tenant04Group01ne02",
  28014. "neId": "CPC_100",
  28015. "neType": "UPF",
  28016. "upfNum": 10,
  28017. "customerType": 1,
  28018. "lastUpdateTime": "2024-09-10 00:00:00",
  28019. "neAddress": "인천",
  28020. "neLocLatitude": "37.51630488",
  28021. "neLocLongitude": "127.20047935",
  28022. "familyName": "PUD",
  28023. "initTime": "2024-09-01 18:15:00",
  28024. "minCnt": 2,
  28025. "majCnt": 0,
  28026. "criCnt": 1,
  28027. "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  28028. "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"11\"}",
  28029. "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"17\"}",
  28030. "areaCode": 23
  28031. },
  28032. {
  28033. "tenantName": "YWLABS2",
  28034. "neGroup": "tenant04Group02",
  28035. "neName": "tenant04Group02ne01",
  28036. "neId": "CPC_100",
  28037. "neType": "UPF",
  28038. "upfNum": 10,
  28039. "customerType": 1,
  28040. "lastUpdateTime": "2024-09-10 00:00:00",
  28041. "neAddress": "인천",
  28042. "neLocLatitude": "37.3456124",
  28043. "neLocLongitude": "127.1344444",
  28044. "familyName": "PUD",
  28045. "initTime": "2024-09-01 18:15:00",
  28046. "minCnt": 1,
  28047. "majCnt": 1,
  28048. "criCnt": 1,
  28049. "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  28050. "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"11\"}",
  28051. "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"17\"}",
  28052. "areaCode": 23
  28053. },
  28054. {
  28055. "tenantName": "YWLABS3",
  28056. "neGroup": "tenant05G01",
  28057. "neName": "tenant05G01ne01",
  28058. "neId": "CPC_100",
  28059. "neType": "UPF",
  28060. "upfNum": 10,
  28061. "customerType": 1,
  28062. "lastUpdateTime": "2024-09-10 00:00:00",
  28063. "neAddress": "광주",
  28064. "neLocLatitude": "37.3456124",
  28065. "neLocLongitude": "127.1344444",
  28066. "familyName": "PUD",
  28067. "initTime": "2024-09-01 18:15:00",
  28068. "minCnt": 1,
  28069. "majCnt": 1,
  28070. "criCnt": 1,
  28071. "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  28072. "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"11\"}",
  28073. "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"17\"}",
  28074. "areaCode": 24
  28075. },
  28076. {
  28077. "tenantName": "YWLABS4",
  28078. "neGroup": "tenant06G01",
  28079. "neName": "tenant06G01ne01",
  28080. "neId": "CPC_100",
  28081. "neType": "UPF",
  28082. "upfNum": 10,
  28083. "customerType": 1,
  28084. "lastUpdateTime": "2024-09-10 00:00:00",
  28085. "neAddress": "대전",
  28086. "neLocLatitude": "37.3456124",
  28087. "neLocLongitude": "127.1344444",
  28088. "familyName": "PUD",
  28089. "initTime": "2024-09-01 18:15:00",
  28090. "minCnt": 1,
  28091. "majCnt": 1,
  28092. "criCnt": 1,
  28093. "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  28094. "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"11\"}",
  28095. "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"17\"}",
  28096. "areaCode": 25
  28097. },
  28098. {
  28099. "tenantName": "YWLABS4",
  28100. "neGroup": "tenant06G01",
  28101. "neName": "tenant06G01ne01",
  28102. "neId": "CPC_100",
  28103. "neType": "UPF",
  28104. "upfNum": 10,
  28105. "customerType": 1,
  28106. "lastUpdateTime": "2024-09-10 00:00:00",
  28107. "neAddress": "울산",
  28108. "neLocLatitude": "37.3456124",
  28109. "neLocLongitude": "127.1344444",
  28110. "familyName": "PUD",
  28111. "initTime": "2024-09-01 18:15:00",
  28112. "minCnt": 1,
  28113. "majCnt": 1,
  28114. "criCnt": 1,
  28115. "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  28116. "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"11\"}",
  28117. "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"17\"}",
  28118. "areaCode": 26
  28119. },
  28120. {
  28121. "tenantName": "YWLABS5",
  28122. "neGroup": "tenant07G01",
  28123. "neName": "tenant07G01ne01",
  28124. "neId": "CPC_100",
  28125. "neType": "UPF",
  28126. "upfNum": 10,
  28127. "customerType": 1,
  28128. "lastUpdateTime": "2024-09-10 00:00:00",
  28129. "neAddress": "경기",
  28130. "neLocLatitude": "37.3456124",
  28131. "neLocLongitude": "127.1344444",
  28132. "familyName": "PUD",
  28133. "initTime": "2024-09-01 18:15:00",
  28134. "minCnt": 1,
  28135. "majCnt": 1,
  28136. "criCnt": 1,
  28137. "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  28138. "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"11\"}",
  28139. "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"17\"}",
  28140. "areaCode": 31
  28141. }
  28142. ]
  28143. }
  28144. }
  28145. }
  28146. </file>
  28147. <file path="components/home/jobNoti/jobNotiModal.vue">
  28148. <template>
  28149. <v-dialog v-model="isNotiPop" persistent width="32.81rem">
  28150. <div class="v-common-dialog-wrapper custom-dialog">
  28151. <div class="modal-tit">
  28152. <strong>공지</strong>
  28153. <button class="btn-close" @click="fnClose()"></button>
  28154. </div>
  28155. <div class="v-common-dialog-content pa-0">
  28156. <div class="notice-img">
  28157. <div class="notice-info">
  28158. <strong>{{ jobNotiObj.title }}</strong>
  28159. <p>{{ $dayjs(jobNotiObj.stDatetime).format('YYYY-MM-DD HH:mm:ss') }} ~ {{ $dayjs(jobNotiObj.edDatetime).format('YYYY-MM-DD HH:mm:ss') }}</p>
  28160. </div>
  28161. </div>
  28162. <div class="notice-txt">
  28163. <pre>
  28164. {{ jobNotiObj.content }}
  28165. </pre>
  28166. </div>
  28167. </div>
  28168. <div class="btn-wrap">
  28169. <v-btn class="custom-btn btn-blue mini" @click="fnTest()"> <i class="ico"></i>다시보지않기</v-btn>
  28170. <v-btn class="custom-btn btn-blue mini" @click="fnClose()"> <i class="ico"></i>확인</v-btn>
  28171. </div>
  28172. </div>
  28173. </v-dialog>
  28174. </template>
  28175. <script setup>
  28176. import useApi from "@/composables/useApi";
  28177. import useAxios from "@/composables/useAxios";
  28178. import useErrorHandler from "@/composables/useErrorHandler";
  28179. import useUtil from '@/composables/useUtil';
  28180. import { useI18n } from "vue-i18n";
  28181. /***********************
  28182. * plugins inject
  28183. ************************/
  28184. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  28185. const i18n = useI18n();
  28186. // 참조가능 데이터 설정
  28187. onMounted(() => {
  28188. fnInit()
  28189. })
  28190. /***********************
  28191. * data & created
  28192. ************************/
  28193. const pageId = "homeJobNoti"
  28194. const jobNotiObj = ref({})
  28195. const isNotiPop = ref(false)
  28196. let doNotShowNoti = ref(true)
  28197. /***********************
  28198. * Methods
  28199. ************************/
  28200. function fnInit(){
  28201. // 긴급공지 조회
  28202. fnJobNotiCheck()
  28203. }
  28204. /**
  28205. * @API
  28206. * 최종 로그인 전 긴급공지에 대한 정보를 가져온다.
  28207. */
  28208. function fnJobNotiCheck() {
  28209. useAxios().get(useApi.getNotice).then((res) => {
  28210. $log.debug("[login][fnJobNotiCheck][success]")
  28211. let data = res.data.data
  28212. let isNotiYn = data.useYN === 'Y' ? true : false
  28213. jobNotiObj.value = data
  28214. doNotShowNoti.value = useUtil.isNull(localStorage.getItem('jobNotiYN'))
  28215. if(doNotShowNoti.value) {
  28216. if(isNotiYn) {
  28217. isNotiPop.value = true
  28218. } else {
  28219. isNotiPop.value = false
  28220. }
  28221. } else {
  28222. isNotiPop.value = false
  28223. }
  28224. }).catch((error)=>{
  28225. $log.debug("[login][fnJobNotiCheck][error]")
  28226. useErrorHandler().fnSetCommErrorHandle(error)
  28227. }).finally(()=>{
  28228. $log.debug("[login][fnJobNotiCheck][finished]")
  28229. })
  28230. }
  28231. function fnClose() {
  28232. isNotiPop.value = false
  28233. }
  28234. function fnTest() {
  28235. isNotiPop.value = false
  28236. localStorage.setItem('jobNotiYN', false)
  28237. }
  28238. </script>
  28239. </file>
  28240. <file path="components/home/tenant/chart/doughnut.vue">
  28241. <template>
  28242. <div class="db--chart">
  28243. <doughnut
  28244. :options="myOptions"
  28245. :data="myData"
  28246. />
  28247. </div>
  28248. </template>
  28249. <script setup>
  28250. import { Doughnut } from "vue-chartjs"
  28251. import {
  28252. Chart as ChartJS,
  28253. Title,
  28254. Tooltip,
  28255. Legend,
  28256. BarElement,
  28257. LineController,
  28258. LineElement,
  28259. PointElement,
  28260. CategoryScale,
  28261. ArcElement,
  28262. LinearScale,
  28263. Filler,
  28264. } from "chart.js"
  28265. ChartJS.register(
  28266. Title,
  28267. Tooltip,
  28268. Legend,
  28269. BarElement,
  28270. LineController,
  28271. LineElement,
  28272. PointElement,
  28273. CategoryScale,
  28274. ArcElement,
  28275. LinearScale,
  28276. Filler
  28277. )
  28278. // props
  28279. const props = defineProps({
  28280. propsChartData: {
  28281. type: Object,
  28282. default: function () {
  28283. return {}
  28284. }
  28285. },
  28286. propsChartOptions: {
  28287. type: Object,
  28288. default: function () {
  28289. return {}
  28290. }
  28291. },
  28292. })
  28293. const centerTextPlugin = {
  28294. id: 'centerText',
  28295. beforeDraw(chart) {
  28296. if(chart.config.type === 'doughnut'){
  28297. const { width, height, ctx } = chart;
  28298. const centerTextOptions = chart.config.options.plugins.centerText;
  28299. if (centerTextOptions && !useUtil.isNull(centerTextOptions.currentValue) && !useUtil.isNull(centerTextOptions.maxValue)) {
  28300. const currentValue = centerTextOptions.currentValue;
  28301. const maxValue = centerTextOptions.maxValue;
  28302. const percentage = Math.round((currentValue / maxValue) * 100);
  28303. ctx.restore();
  28304. const fontSize = (height / 150).toFixed(2);
  28305. ctx.font = `${fontSize}em`;
  28306. const text = `${currentValue}/${maxValue}`;
  28307. const textX = Math.round((width - ctx.measureText(text).width) / 2);
  28308. const textY = height / 2 - 10;
  28309. ctx.fillText(text, textX, textY);
  28310. const percentText = `${percentage}%`;
  28311. const percentTextX = Math.round((width - ctx.measureText(percentText).width) / 2);
  28312. const percentTextY = height / 2 + 15;
  28313. ctx.fillText(percentText, percentTextX, percentTextY);
  28314. ctx.save();
  28315. }
  28316. }
  28317. }
  28318. };
  28319. ChartJS.register(centerTextPlugin)
  28320. const chartData = ref({
  28321. labels: ['현재 가입자 수', '최대 가입자 수'],
  28322. datasets: [
  28323. {
  28324. data: [70,30],
  28325. backgroundColor: ['#438dff','#EAEAEA'],
  28326. borderWidth: 0,
  28327. borderRadius: 200,
  28328. }
  28329. ]
  28330. })
  28331. const chartOptions = ref({
  28332. responsive: true,
  28333. maintainAspectRatio: false,
  28334. cutout: '60%',
  28335. plugins: {
  28336. centerText: {
  28337. currentValue: 65,
  28338. maxValue: 100,
  28339. },
  28340. legend: {
  28341. display: false
  28342. },
  28343. tooltip: {
  28344. callbacks: {
  28345. label: function(tooltipItem) {
  28346. return tooltipItem.label + ': '+ tooltipItem.raw;// + tooltipItem.raw.toFixed(2) + '%'
  28347. }
  28348. }
  28349. },
  28350. centerText: centerTextPlugin
  28351. }
  28352. })
  28353. const myData = computed(()=>{
  28354. const tempData = ref(_cloneDeep(chartData.value))
  28355. tempData.value.datasets[0].data = props.propsChartData
  28356. return tempData.value
  28357. })
  28358. const myOptions = computed(()=>{
  28359. const tempOptions = ref(_cloneDeep(chartOptions.value))
  28360. tempOptions.value.plugins.centerText = props.propsChartOptions
  28361. return tempOptions.value
  28362. })
  28363. </script>
  28364. </file>
  28365. <file path="components/home/tenant/chart/trendBar.vue">
  28366. <template>
  28367. <div
  28368. class="db--chart"
  28369. >
  28370. <Bar
  28371. :data="myData"
  28372. :options="chartOptions"
  28373. />
  28374. <div class="chart--legend">
  28375. <div
  28376. v-for="(legend, idx) in legends"
  28377. :key="`bar-chart-legend-${idx}`"
  28378. class="legend"
  28379. >
  28380. <span class="line" />
  28381. <p>{{ legend }}</p>
  28382. </div>
  28383. </div>
  28384. </div>
  28385. </template>
  28386. <script setup>
  28387. /***********************
  28388. * import
  28389. ************************/
  28390. import { Bar } from "vue-chartjs"
  28391. import { Chart as ChartJS, Title, Tooltip, Legend, BarElement, LineController, LineElement, PointElement, ArcElement, CategoryScale, LinearScale } from 'chart.js';
  28392. import dayjs from "#build/dayjs.imports.mjs";
  28393. /***********************
  28394. * plugins inject
  28395. ************************/
  28396. // props
  28397. const props = defineProps({
  28398. chartItem: {
  28399. type: Object,
  28400. default: () => {}
  28401. },
  28402. })
  28403. ChartJS.register(
  28404. Title,
  28405. Tooltip,
  28406. Legend,
  28407. BarElement,
  28408. LineController,
  28409. LineElement,
  28410. PointElement,
  28411. CategoryScale,
  28412. ArcElement,
  28413. LinearScale,
  28414. )
  28415. /***********************
  28416. * data & created
  28417. ************************/
  28418. const colorset = ref([
  28419. '#FF531E',
  28420. '#44C5FF',
  28421. '#FF00C7',
  28422. '#AF70FF',
  28423. '#4862FF',
  28424. '#55E074',
  28425. ]);
  28426. const legends = ref([]);
  28427. const chartOptions = ref({
  28428. layout: {
  28429. padding: {
  28430. top: 0,
  28431. },
  28432. },
  28433. responsive: true,
  28434. maintainAspectRatio: false,
  28435. duration: 1000,
  28436. plugins: {
  28437. legend: {
  28438. display: false,
  28439. },
  28440. datalabels: {
  28441. display: false,
  28442. },
  28443. tooltip: {
  28444. displayColors : false,
  28445. callbacks: {
  28446. title : function(tooltipItem, data){
  28447. return tooltipItem[0].label.substr(0,10) + " " + tooltipItem[0].label.substr(11)
  28448. },
  28449. titleFont: { // 타이틀 영역 폰트 스타일
  28450. size: 10,
  28451. weight:500,
  28452. family:'Inter',
  28453. },
  28454. titleColor : '#f00', // 타이틀 영역 폰트 컬러
  28455. titleAlign : 'right', // 타이틀 영역 align (left, center, right)
  28456. titleMarginBottom : 3,
  28457. },
  28458. },
  28459. },
  28460. scales: {
  28461. x: {
  28462. beginAtZero: true,
  28463. stacked: true,
  28464. title: {
  28465. text: "",
  28466. align: "end",
  28467. display: false,
  28468. font: {
  28469. color: "#666",
  28470. size: 12,
  28471. weight: "500",
  28472. },
  28473. },
  28474. grid: {
  28475. display: false,
  28476. drawTicks: false,
  28477. drawBorder: false,
  28478. color: "transparent",
  28479. },
  28480. ticks: {
  28481. padding: 20,
  28482. font: {
  28483. size: function(context){
  28484. const clientW = document.querySelector("body").clientWidth;
  28485. if(clientW <= 1930){
  28486. return 11
  28487. }else if(clientW >= 2550 && clientW < 3840){
  28488. return 17
  28489. }else if(clientW >= 3840){
  28490. return 22
  28491. }
  28492. },
  28493. weight: "400",
  28494. },
  28495. color: "#838FAC",
  28496. align:'center',
  28497. },
  28498. },
  28499. y: {
  28500. border: {
  28501. display: false,
  28502. },
  28503. beginAtZero: true,
  28504. stacked: false,
  28505. title: {
  28506. display: false,
  28507. text: "",
  28508. },
  28509. ticks: {
  28510. display: true,
  28511. padding: 10,
  28512. font: {
  28513. size: function(context){
  28514. const clientW = document.querySelector("body").clientWidth;
  28515. if(clientW <= 1930){
  28516. return 11
  28517. }else if(clientW >= 2550 && clientW < 3840){
  28518. return 17
  28519. }else if(clientW >= 3840){
  28520. return 22
  28521. }
  28522. },
  28523. weight: "400",
  28524. },
  28525. color: "#b1b1b1",
  28526. },
  28527. min:0
  28528. },
  28529. },
  28530. animation: {
  28531. duration: 0,
  28532. },
  28533. })
  28534. const myData = computed(() => fnGetChartDate(props.chartItem));
  28535. /***********************
  28536. * Methods
  28537. ************************/
  28538. const fnGetChartDate = (chartItem) => {
  28539. const chartData = { labels: [], datasets: [],}
  28540. const { items } = chartItem;
  28541. if(!chartItem || !items || items.length < 1) {
  28542. return chartData;
  28543. }
  28544. const labels = []
  28545. const datasets = items.reduce((acc, curr, i) => {
  28546. Object.keys(curr).forEach((key) => {
  28547. if(key == 'INIT_TIME') labels.push(dayjs(curr.INIT_TIME).format('HH:mm'));
  28548. else {
  28549. if(acc[key]) acc[key].push(curr[key]);
  28550. else acc[key] = [curr[key]];
  28551. }
  28552. })
  28553. return acc;
  28554. }, {})
  28555. legends.value = Object.keys(datasets);
  28556. chartData.labels = labels;
  28557. chartData.datasets = legends.value.map((key, idx) => {
  28558. return {
  28559. label: key,
  28560. borderWidth : 2,
  28561. pointBackgroundColor: colorset.value[idx],
  28562. borderColor: colorset.value[idx],
  28563. pointRadius : 0,
  28564. hoverRadius : 0,
  28565. pointStyle : "circle",
  28566. data: datasets[key],
  28567. type: "line",
  28568. fill : false,
  28569. }
  28570. })
  28571. return chartData;
  28572. }
  28573. </script>
  28574. </file>
  28575. <file path="components/home/tenant/chart/userDoughnut.vue">
  28576. <template>
  28577. <div
  28578. class="db--chart"
  28579. >
  28580. <Doughnut
  28581. v-if="props.maxSubscriber > 0"
  28582. :data="myData"
  28583. :options="myOptions"
  28584. />
  28585. </div>
  28586. </template>
  28587. <script setup>
  28588. /***********************
  28589. * import
  28590. ************************/
  28591. import { Doughnut } from "vue-chartjs"
  28592. import { Chart as ChartJS, Title, Tooltip, Legend, BarElement, LineController, LineElement, PointElement, ArcElement, CategoryScale, LinearScale } from 'chart.js';
  28593. /***********************
  28594. * plugins inject
  28595. ************************/
  28596. // props
  28597. const props = defineProps({
  28598. maxSubscriber: {
  28599. type: Number,
  28600. default: 0
  28601. },
  28602. curSubscriber: {
  28603. type: Number,
  28604. default: 0
  28605. }
  28606. })
  28607. /** 차트 Cneter Text Plugin */
  28608. const centerTextPlugin = {
  28609. id: 'centerText',
  28610. beforeDraw(chart) {
  28611. if(chart.config.type === 'doughnut'){
  28612. const { width, height, ctx } = chart;
  28613. const centerTextOptions = chart.config.options.plugins.centerText;
  28614. if (centerTextOptions && !useUtil.isNull(centerTextOptions.currentValue) && !useUtil.isNull(centerTextOptions.maxValue)) {
  28615. const max = centerTextOptions.maxValue;
  28616. const curr = centerTextOptions.currentValue;
  28617. ctx.restore();
  28618. const fontSize = (height / 150).toFixed(2);
  28619. ctx.font = `${fontSize}em`;
  28620. const text = `${curr}/${max}`;
  28621. const textX = Math.round((width - ctx.measureText(text).width) / 2);
  28622. const textY = height / 2 - 10;
  28623. ctx.fillText(text, textX, textY);
  28624. const percentText = `${fnGetPercentValue(max, curr)}%`;
  28625. const percentTextX = Math.round((width - ctx.measureText(percentText).width) / 2);
  28626. const percentTextY = height / 2 + 15;
  28627. ctx.fillText(percentText, percentTextX, percentTextY);
  28628. ctx.save();
  28629. }
  28630. }
  28631. }
  28632. };
  28633. ChartJS.register(
  28634. Title,
  28635. Tooltip,
  28636. Legend,
  28637. BarElement,
  28638. LineController,
  28639. LineElement,
  28640. PointElement,
  28641. CategoryScale,
  28642. ArcElement,
  28643. LinearScale,
  28644. centerTextPlugin
  28645. )
  28646. /***********************
  28647. * data & created
  28648. ************************/
  28649. const chartData = ref({
  28650. labels: ['현재 가입자 수', '남은 가입자 수'],
  28651. datasets: [
  28652. {
  28653. data: [props.curSubscriber, (props.maxSubscriber - props.curSubscriber)],
  28654. backgroundColor: ['#438dff','#EAEAEA'],
  28655. borderWidth: 0,
  28656. borderRadius: 200,
  28657. }
  28658. ]
  28659. });
  28660. const chartOptions = ref({
  28661. responsive: true,
  28662. maintainAspectRatio: false,
  28663. cutout: '60%',
  28664. plugins: {
  28665. centerText: {
  28666. currentValue: 65,
  28667. maxValue: 100,
  28668. },
  28669. legend: {
  28670. display: false
  28671. },
  28672. tooltip: {
  28673. callbacks: {
  28674. label: function(tooltipItem) {
  28675. return tooltipItem.label + ': '+ tooltipItem.raw;// + tooltipItem.raw.toFixed(2) + '%'
  28676. }
  28677. }
  28678. },
  28679. centerText: centerTextPlugin
  28680. }
  28681. });
  28682. const myData = computed(() => {
  28683. const tempData = ref(_cloneDeep(chartData.value))
  28684. tempData.value.datasets[0].data = [props.curSubscriber, (props.maxSubscriber - props.curSubscriber)]
  28685. return tempData.value
  28686. })
  28687. const myOptions = computed(()=>{
  28688. const tempOptions = ref(_cloneDeep(chartOptions.value))
  28689. tempOptions.value.plugins.centerText = {currentValue: props.curSubscriber, maxValue: props.maxSubscriber}
  28690. return tempOptions.value
  28691. })
  28692. /***********************
  28693. * Methods
  28694. ************************/
  28695. /** make percent data */
  28696. const fnGetPercentValue = (max, curr) => {
  28697. return useUtil.toRoundFix((curr / max) * 100, 0);
  28698. }
  28699. </script>
  28700. </file>
  28701. <file path="components/home/tenant/common/ranGroupDetailModal.vue">
  28702. <template>
  28703. <v-dialog
  28704. v-model="isModal"
  28705. persistent
  28706. width="62.5rem"
  28707. >
  28708. <div class="v-common-dialog-wrapper custom-dialog alert">
  28709. <div class="modal-tit">
  28710. <strong>장비 현황</strong>
  28711. <button
  28712. class="btn-close"
  28713. @click="fnClose"
  28714. />
  28715. </div>
  28716. <div class="v-common-dialog-content pa-0">
  28717. <div class="core--list--component">
  28718. <h2 class="fw--500">
  28719. 이벤트 현황
  28720. </h2>
  28721. <ul class="event--stat">
  28722. <li class="critical">
  28723. <i class="ico" /><span>CRITICAL</span><span>{{ neInfoItem.criCnt || 0 }}</span>
  28724. </li>
  28725. <li class="major">
  28726. <i class="ico" /><span>MAJOR</span><span>{{ neInfoItem.majCnt || 0 }}</span>
  28727. </li>
  28728. <li class="minor">
  28729. <i class="ico" /><span>MINOR</span><span>{{ neInfoItem.minCnt || 0 }}</span>
  28730. </li>
  28731. <li class="disconnected">
  28732. <i class="ico" /><span>DISCONNECTED</span><span>0</span>
  28733. </li>
  28734. </ul>
  28735. </div>
  28736. <div class="core--list--component--grid mt--0">
  28737. <div class="title">
  28738. <h2>
  28739. NE 그룹 목록 <span>({{ neGroupObj.count }}건)</span>
  28740. </h2>
  28741. </div>
  28742. <div class="tbl-wrapper">
  28743. <div class="tbl-wrap">
  28744. <!-- ag grid -->
  28745. <ag-grid-vue
  28746. style="width:100%; height:calc(23vh);"
  28747. class="ag-theme-quartz"
  28748. :row-data="neGroupObj.list"
  28749. :grid-options="neGroupGirdOptions"
  28750. @grid-ready="fnOnNeGroupGirdReady"
  28751. @row-clicked="fnGroupRowClick"
  28752. />
  28753. </div>
  28754. </div>
  28755. </div>
  28756. <div class="core--list--component">
  28757. <div class="map--area">
  28758. <div
  28759. v-if="neObj.neGroup"
  28760. class="side--title"
  28761. style="zIndex:10"
  28762. >
  28763. {{ neObj.neGroup }}
  28764. </div>
  28765. <!--맵 영역-->
  28766. <div
  28767. id="ran_detail_map"
  28768. ref="refMap"
  28769. style="height: 100%;"
  28770. />
  28771. </div>
  28772. </div>
  28773. <div class="core--list--component--grid mt--0">
  28774. <div class="title">
  28775. <h2 v-if="neObj.neGroup && neObj.count > 0">
  28776. [{{ neObj.neGroup }}] NE 목록 <span>({{ neObj.count }}건)</span>
  28777. </h2>
  28778. <h2 v-else>
  28779. NE 목록 <span>(0건)</span>
  28780. </h2>
  28781. </div>
  28782. <div class="tbl-wrapper">
  28783. <div class="tbl-wrap">
  28784. <ag-grid-vue
  28785. style="width:100%; height:22vh;"
  28786. class="ag-theme-quartz"
  28787. :grid-options="neGirdOptions"
  28788. @grid-ready="fnOnNeGirdReady"
  28789. />
  28790. <!-- :row-data="neObj.neList" -->
  28791. </div>
  28792. </div>
  28793. </div>
  28794. </div>
  28795. <div
  28796. class="btn-wrap nw--btn--wrap"
  28797. style="padding-top:1.88rem"
  28798. >
  28799. <div />
  28800. <div class="inner--btn--wrap">
  28801. <v-btn
  28802. class="custom-btn btn-gray mini"
  28803. @click="fnClose"
  28804. >
  28805. <i class="ico" />
  28806. 닫기
  28807. </v-btn>
  28808. </div>
  28809. </div>
  28810. </div>
  28811. </v-dialog>
  28812. </template>
  28813. <script setup>
  28814. /***********************
  28815. * import
  28816. ************************/
  28817. import "ag-grid-community/styles/ag-grid.css";
  28818. import "ag-grid-community/styles/ag-theme-quartz.css";
  28819. import { AgGridVue } from "ag-grid-vue3";
  28820. import { useI18n } from "vue-i18n";
  28821. import useUtil from "@/composables/useUtil";
  28822. import { filename } from 'pathe/utils'
  28823. import testJson from "@/components/home/dashboard/test.json"
  28824. /***********************
  28825. * plugins inject
  28826. ************************/
  28827. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  28828. // props
  28829. const props = defineProps({
  28830. tenantName: {
  28831. type: String,
  28832. required: true
  28833. },
  28834. })
  28835. // 참조가능 데이터 설정
  28836. defineExpose({})
  28837. // 발신 이벤트 선언
  28838. const emit = defineEmits(["closeModal"])
  28839. const i18n = useI18n()
  28840. /***********************
  28841. * data & created
  28842. ************************/
  28843. const isModal = ref(true)
  28844. const refMap = ref();
  28845. const map = ref(null) // 카카오 맵 객체
  28846. const markers = ref([]) // 카카오맵 마커(핀) 객체
  28847. // 카카오맵 센터좌표
  28848. const centerPosition = ref({
  28849. lat: 33.450701,
  28850. lng: 126.570667
  28851. });
  28852. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize)
  28853. const rowHeightRem = 2.5 // 원하는 rem 값
  28854. const rowHeightPx = rowHeightRem * remToPx()
  28855. const neGroupGridApi = shallowRef()
  28856. const neGridApi = shallowRef()
  28857. // Ran DetailInfo
  28858. const neInfoItem = ref({});
  28859. // neGroupObj
  28860. const neGroupObj = ref({
  28861. count: 0,
  28862. list: []
  28863. });
  28864. // neObj
  28865. const neObj = ref({
  28866. count: 0,
  28867. neGroup: '',
  28868. list: []
  28869. })
  28870. // ne 그룹 목록 그리드 옵션
  28871. const neGroupGirdOptions = {
  28872. columnDefs: [
  28873. { headerName: 'No', valueGetter: "node.rowIndex + 1", sortable: false, maxWidth: 100},
  28874. { headerName: 'NE 그룹명', field: 'neGroup', sortable: false, minWidth: 300},
  28875. { headerName: 'NE 수', field: 'neCnt', sortable: false,},
  28876. { headerName: '알림', field: 'cls', sortable: false,cellRenderer: alarmCellRenderer}
  28877. ],
  28878. rowData: neGroupObj.value.list, // 테이블 데이터
  28879. suppressMovableColumns: true,
  28880. autoSizeStrategy: {
  28881. type: "fitGridWidth", // width맞춤
  28882. },
  28883. headerHeight : rowHeightPx,
  28884. rowHeight: rowHeightPx,
  28885. pagination: true,
  28886. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  28887. suppressRowClickSelection: true, // 행 클릭 체크박스 무시
  28888. localeText: {
  28889. noRowsToShow: i18n.t('common.noData')
  28890. },
  28891. }
  28892. // ne 목록 그리드 옵션
  28893. const neGirdOptions = {
  28894. defaultColDef: {
  28895. lockVisible: true,
  28896. },
  28897. columnDefs: [
  28898. { headerName: 'No', valueGetter: "node.rowIndex + 1", sortable: false, maxWidth: 100},
  28899. { headerName: 'NE 이름', field: 'neName', sortable: false, cellRenderer: neNameCellRenderer,},
  28900. { headerName: '이벤트', field: 'eventStatus', sortable: false, cellRenderer: eventCellRenderer, width: 250,}
  28901. ],
  28902. rowData: neObj.value.neList, // 테이블 데이터
  28903. autoSizeStrategy: {
  28904. type: "fitGridWidth", //fitCellContents
  28905. },
  28906. headerHeight : rowHeightPx,
  28907. rowHeight: rowHeightPx,
  28908. pagination: true,
  28909. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  28910. suppressRowClickSelection: true, // 행 클릭 체크박스 무시
  28911. localeText: {
  28912. noRowsToShow: 'NE 그룹을 선택하세요'
  28913. },
  28914. loading: false
  28915. }
  28916. /***********************
  28917. * Methods
  28918. ************************/
  28919. const fnInit = async () => {
  28920. await nextTick();
  28921. // Ran 정보 조회
  28922. await fnGeoTenantNeInfo();
  28923. // 카카오 지도 load
  28924. if (window.kakao && window.kakao.maps) {
  28925. fnLoadKakakoMap()
  28926. } else {
  28927. fnAppendKakaoScript()
  28928. }
  28929. }
  28930. function fnClose(){
  28931. isModal.value = false
  28932. setTimeout(() => {
  28933. emit('closeModal')
  28934. }, 250);
  28935. }
  28936. /**
  28937. * P5G RAN Ne 정보 조회
  28938. */
  28939. function fnGeoTenantNeInfo() {
  28940. return new Promise((resolve, reject) => {
  28941. const params = {
  28942. tenantName: props.tenantName
  28943. }
  28944. useAxios().post(useApi.tenantNeInfo, params).then((res) => {
  28945. const {resCode, resMsg, data} = res.data;
  28946. if(resCode == 200) {
  28947. // 테스트를 위한 테스트 코드 (삭제 필수)
  28948. // fnParseData([...(data?.items || []), ...testJson.ranNeGroupList.data.items])
  28949. fnParseData(data.items || [])
  28950. $log.debug("[tenantDashboard][fnGeoTenantNeInfo][success]")
  28951. resolve();
  28952. } else {
  28953. $log.debug("[tenantDashboard][fnGeoTenantNeInfo][error]", `[${resCode}] ${resMsg}`);
  28954. reject()
  28955. }
  28956. }).catch((error)=>{
  28957. // 테스트를 위한 테스트 코드 (삭제 필수)
  28958. // fnParseData([...testJson.ranNeGroupList.data.items])
  28959. $log.debug("[tenantDashboard][fnGeoTenantNeInfo][error]")
  28960. useErrorHandler().fnSetCommErrorHandle(error, fnGeoTenantNeInfo)
  28961. reject()
  28962. }).finally(()=>{
  28963. $log.debug("[tenantDashboard][fnGeoTenantNeInfo][finished]")
  28964. })
  28965. })
  28966. }
  28967. const fnParseData = (items = []) => {
  28968. // main > criCnt, majCnt, minCnt, neCnt, neGroupCnt, neGroupList
  28969. // neGroupList > criCnt, majCnt, minCnt, neCnt, neGroup, tenantName, neList
  28970. // neList > 모든 데이터
  28971. // "tenantName": "SAMSUNGSDS",
  28972. // "neGroup": "tenant01Group01",
  28973. // "neName": "tenant01Group01ne02",
  28974. // "neId": "CPC_100",
  28975. // "neType": "UPF",
  28976. // "upfNum": 10,
  28977. // "customerType": 1,
  28978. // "lastUpdateTime": "2024-09-10 00:00:00",
  28979. // "neAddress": "서울시",
  28980. // "neLocLatitude": "37.55203063",
  28981. // "neLocLongitude": "126.98081697",
  28982. // "familyName": "PUD",
  28983. // "initTime": "2024-09-01 18:15:00",
  28984. // "minCnt": 0,
  28985. // "majCnt": 0,
  28986. // "criCnt": 0,
  28987. // "kpi": "{\"UL_RX_AVG_KBPS\":\"0.00\",\"UL_TX_AVG_KBPS\":\"0.00\",\"DL_RX_AVG_KBPS\":\"0.00\",\"DL_TX_AVG_KBPS\":\"0.00\"}",
  28988. // "cpu": "{\"AVG_CPU_L\":\"10\",\"PEAK_CPU_L\":\"11\"}",
  28989. // "mem": "{\"AVG_MEM_L\":\"17\",\"PEAK_MEM_L\":\"17\"}",
  28990. // "areaCode": 11
  28991. neInfoItem.value = {};
  28992. if(!items || items.length < 1) {
  28993. return;
  28994. }
  28995. // 테넌트 필터링
  28996. const tenantNeItems = items.filter((i) => i.tenantName == props.tenantName);
  28997. // const tenantNeItems = items;
  28998. // 데이터 그룹핑
  28999. let objInfo = {};
  29000. objInfo = tenantNeItems.reduce((acc, curr) => {
  29001. // 심각도 카운트 셋팅
  29002. if(acc.criCnt) acc.criCnt = acc.criCnt + curr.criCnt;
  29003. else acc.criCnt = curr.criCnt;
  29004. if(acc.majCnt) acc.majCnt = acc.majCnt + curr.majCnt;
  29005. else acc.majCnt = curr.majCnt;
  29006. if(acc.minCnt) acc.minCnt = acc.minCnt + curr.minCnt;
  29007. else acc.minCnt = curr.minCnt;
  29008. if(!acc.neGroupList) acc.neGroupList = [];
  29009. // ne 카운트 셋팅
  29010. if(acc.neCnt) acc.neCnt = acc.neCnt + 1;
  29011. else acc.neCnt = 1;
  29012. // neGroupList 셋팅
  29013. const groupIndex = acc.neGroupList.findIndex((g) => g.neGroup == curr.neGroup);
  29014. if(groupIndex > -1) {
  29015. acc.neGroupList[groupIndex].neCnt = acc.neGroupList[groupIndex].neCnt + 1;
  29016. acc.neGroupList[groupIndex].criCnt = acc.neGroupList[groupIndex].criCnt + curr.criCnt;
  29017. acc.neGroupList[groupIndex].majCnt = acc.neGroupList[groupIndex].majCnt + curr.majCnt;
  29018. acc.neGroupList[groupIndex].minCnt = acc.neGroupList[groupIndex].minCnt + curr.minCnt;
  29019. acc.neGroupList[groupIndex].neList.push(curr);
  29020. } else {
  29021. acc.neGroupList.push({
  29022. tenantName: curr.tenantName,
  29023. neGroup: curr.neGroup,
  29024. criCnt: curr.criCnt,
  29025. majCnt: curr.majCnt,
  29026. minCnt: curr.minCnt,
  29027. neCnt: 1,
  29028. neList: [curr]
  29029. })
  29030. }
  29031. //neGroup 카운트 셋팅
  29032. if(acc.neGroupCnt) acc.neGroupCnt = acc.neGroupList?.length;
  29033. else acc.neGroupCnt = 1;
  29034. return acc;
  29035. }, {})
  29036. // 전체 목록 셋팅
  29037. neInfoItem.value = objInfo;
  29038. // NE 그룹 목록 셋팅
  29039. neGroupObj.value.count = objInfo.neGroupList?.length;
  29040. neGroupObj.value.list = objInfo.neGroupList;
  29041. console.log('::::: neGroup 정보 셋팅 완료 :::::', neInfoItem.value)
  29042. }
  29043. /**
  29044. * 카카오 지도 관련
  29045. */
  29046. // 카카오 지도 script 추가
  29047. const fnAppendKakaoScript = () => {
  29048. const script = document.createElement('script')
  29049. script.async = true
  29050. script.onload = () => {
  29051. window.kakao.maps.load(fnLoadKakakoMap)
  29052. }
  29053. script.src = `//dapi.kakao.com/v2/maps/sdk.js?autoload=false&libraries=services,clusterer,drawing&appkey=${import.meta.env.VITE_APP_KAKAO_APP_KEY}`
  29054. document.head.appendChild(script)
  29055. }
  29056. // 카카오 지도 Load
  29057. const fnLoadKakakoMap = () => {
  29058. const mapContainer = refMap.value;
  29059. const mapOption = {
  29060. center: new kakao.maps.LatLng(centerPosition.value.lat, centerPosition.value.lng), // 지도의 중심좌표
  29061. level: 12, // 지도의 확대 레벨
  29062. }
  29063. map.value = new kakao.maps.Map(mapContainer, mapOption)
  29064. }
  29065. /** 마커 관련 */
  29066. // 마커 이미지
  29067. // 이미지 가져오기 (vite문법)
  29068. const glob = import.meta.glob('~/assets/img/ico_*.{png,svg}', { eager: true })
  29069. const getImages = Object.fromEntries(
  29070. Object.entries(glob).map(([key, value]) => [filename(key), value.default])
  29071. )
  29072. const fnGetNePinIco = (item) => {
  29073. const { criCnt, majCnt, minCnt } = item;
  29074. if(criCnt && criCnt > 0) return 'red'
  29075. else if(majCnt && majCnt > 0) return 'blue'
  29076. else if(minCnt && minCnt > 0) return 'black'
  29077. else return 'gray'
  29078. }
  29079. // 마커 생성
  29080. const fnCreateMaker = (item, position, index) => {
  29081. const markerImageSrc = getImages[`ico_${fnGetNePinIco(item)}_pin`]; // assets 폴더의 이미지 경로
  29082. const markerImageSize = new kakao.maps.Size(40, 40); // 마커 이미지 사이즈
  29083. const markerImage = new kakao.maps.MarkerImage(markerImageSrc, markerImageSize);
  29084. const markerOption = {
  29085. map: map.value, // 마커를 표시할 지도
  29086. position: position, // 마커의 위치
  29087. clickable: true,
  29088. image: markerImage,
  29089. zIndex: 1,
  29090. }
  29091. return new kakao.maps.Marker(markerOption);
  29092. }
  29093. // 마커 그리기
  29094. const fnDrawMaker = () => {
  29095. // 마커 초기화
  29096. fnClearMarker();
  29097. // 마커 생성
  29098. neObj.value.neList.forEach((item, index) => {
  29099. const position = new kakao.maps.LatLng(item.neLocLatitude, item.neLocLongitude)
  29100. const marker = fnCreateMaker(item, position, index);
  29101. markers.value.push({
  29102. overlay: null,
  29103. markers: marker,
  29104. data: item,
  29105. click: false,
  29106. position: position
  29107. })
  29108. // 마커 클릭 이벤트등록
  29109. kakao.maps.event.addListener(marker, 'click', fnClickMarkerEvent(index))
  29110. // 첫번째 마커로 이동
  29111. if(index == 0) map.value.panTo(position)
  29112. })
  29113. }
  29114. // 마커 초기화
  29115. const fnClearMarker = () => {
  29116. markers.value.forEach(marker => marker.markers.setMap(null));
  29117. fnClearMarkerOverlay()
  29118. markers.value = []
  29119. }
  29120. // 마커 click 이벤트 등록
  29121. function fnClickMarkerEvent(index) {
  29122. const marker = markers.value[index];
  29123. const openOverlay = () => {
  29124. fnClickMaker(marker)
  29125. fnOpenOverlay(marker)
  29126. }
  29127. return openOverlay;
  29128. }
  29129. // 실제 마커 클릭시 동작하는 함수
  29130. const fnClickMaker = (marker) => {
  29131. fnClearMakerClick(); // 마커 클릭 초기화
  29132. marker.click = true;
  29133. marker.markers.setZIndex(3)
  29134. map.value.panTo(marker.position);
  29135. }
  29136. // 마커 Click 초기화
  29137. const fnClearMakerClick = () => {
  29138. markers.value.forEach((item) => {
  29139. item.click = false;
  29140. item.markers.setZIndex(2);
  29141. })
  29142. }
  29143. /** 오버레이 윈도우 관련 */
  29144. // 오버레이 open
  29145. const fnOpenOverlay = (marker) => {
  29146. // 모든 오버레이 초기화
  29147. fnClearMarkerOverlay();
  29148. // 오버레이 생성
  29149. marker.overlay = fnCreateCustomOverlay(marker);
  29150. // 오버레이 zindex 설정
  29151. marker.overlay.setZIndex(999);
  29152. // 오버레이 지도에 적용
  29153. marker.overlay.setMap(map.value);
  29154. // 오버레이 닫기 버튼
  29155. const closeBtn = document.querySelector('#overlayCloseBtn')
  29156. closeBtn.addEventListener('click', fnCloseOverlay)
  29157. }
  29158. // 오버레이 생성
  29159. const fnCreateCustomOverlay = (marker) => {
  29160. //kpi 정보 element 생성
  29161. const kpiEls = (fnGetKPIInfo(marker?.data) || {}).map((kpi)=> {
  29162. return `<li><i class="ico ${kpi.ico}"></i><span>${kpi.label}</span><span class="">${parseFloat(kpi.val|| 0).toFixed(2)}%</span></li>`
  29163. });
  29164. // custom overlay html 생성
  29165. const contents = ` <div class="area--info" style="top: -10.7rem; right: -6rem;">
  29166. <div class="area--info--title">
  29167. <p style="overflow:hidden; text-overflow: ellipsis;">${marker?.data?.neName}</p>
  29168. <button class="btn-close" id="overlayCloseBtn"></button>
  29169. </div>
  29170. <ul>
  29171. <li><i class="ico green"></i><span>STATUS</span><span class="active">ACTIVE</span></li>
  29172. ${kpiEls.join('')}
  29173. </ul>
  29174. </div>`;
  29175. // overlay 생성
  29176. return new kakao.maps.CustomOverlay({
  29177. position: marker.position,
  29178. content: contents
  29179. })
  29180. }
  29181. // 오버레이에 표시할 KPI 정보 생성
  29182. const fnGetKPIInfo = (data) => {
  29183. // KPI 정보 셋팅 - TODO: CPU, MEM 외의 값이 추가되면 여기에 추가
  29184. const { cpu, mem } = data;
  29185. const kpiItems = [];
  29186. const getBodyLevelClass = (val) => {
  29187. if(val >= 95) return 'red'; // red
  29188. else if(val >= 90) return 'blue'; // blue
  29189. else if(val >= 85) return 'gray'; // gray
  29190. else return 'green'; // green
  29191. }
  29192. if(cpu) {
  29193. const objCpu = typeof cpu === 'string' ? JSON.parse(cpu) : cpu;
  29194. if(objCpu && objCpu[`AVG_CPU_L`]){
  29195. kpiItems.push({label: 'CPU', val: objCpu[`AVG_CPU_L`] || 0, ico: getBodyLevelClass(objCpu[`AVG_CPU_L`])})
  29196. }
  29197. }
  29198. if(mem) {
  29199. const objMem = typeof mem === 'string' ? JSON.parse(mem) : mem ;
  29200. if(objMem && objMem['AVG_MEM_L']){
  29201. kpiItems.push({label: 'MEMORY', val: objMem['AVG_MEM_L'] || 0, ico: getBodyLevelClass(objMem[`AVG_MEM_L`])})
  29202. }
  29203. }
  29204. return kpiItems;
  29205. }
  29206. // 오버레이 닫기 이벤트
  29207. const fnCloseOverlay = () => {
  29208. fnClearMarkerOverlay();
  29209. fnClearMakerClick();
  29210. }
  29211. // 모든 마커 오버레이 초기화
  29212. const fnClearMarkerOverlay = () => {
  29213. markers.value.forEach((marker) => {
  29214. if(marker.overlay) {
  29215. marker.overlay.setMap(null);
  29216. marker.overlay = null;
  29217. }
  29218. })
  29219. }
  29220. /**
  29221. * NE 그룹 목록 그리드 관련
  29222. */
  29223. function fnOnNeGroupGirdReady(params) {
  29224. neGroupGridApi.value = params.api
  29225. }
  29226. // 알림 Cell 렌더러
  29227. function alarmCellRenderer(params) {
  29228. let _cls = "";
  29229. if(params.data.criCnt > 0){
  29230. _cls = 'alarm--red';
  29231. } else if(params.data.majCnt > 0){
  29232. _cls = 'alarm--blue';
  29233. } else if(params.data.minCnt > 0){
  29234. _cls = 'alarm--gray'
  29235. }
  29236. return `<span class="${_cls}"></span>`;
  29237. }
  29238. //row clikc
  29239. function fnGroupRowClick(params) {
  29240. const { neList, neGroup } = params.data
  29241. neObj.value.count = neList.length;
  29242. neObj.value.neList = neList;
  29243. // neObj.value.neList = neList.sort((a, b) => {
  29244. // return a.criCnt < b.criCnt ? 1 : a.criCnt > b.criCnt ? -1 : (a.majCnt < b.majCnt ? 1 : a.majCnt > b.majCnt ? -1 : (a.minCnt < b.minCnt ? 1 : a.minCnt > b.minCnt ? -1 : 0));
  29245. // });
  29246. neObj.value.neGroup = neGroup;
  29247. // 그리드
  29248. neGridApi.value.setGridOption('rowData', neObj.value.neList)
  29249. // 지도에 마커 생성
  29250. fnDrawMaker();
  29251. }
  29252. /**
  29253. * NE 목록 그리드 관련
  29254. */
  29255. function fnOnNeGirdReady(params) {
  29256. neGridApi.value = params.api
  29257. }
  29258. // Ne 이름 Cell 렌더러
  29259. function neNameCellRenderer(params) {
  29260. let _cls = "";
  29261. if(params.data.criCnt > 0){
  29262. _cls = 'pin--red';
  29263. } else if(params.data.majCnt > 0){
  29264. _cls = 'pin--blue';
  29265. } else if(params.data.minCnt > 0){
  29266. _cls = 'pin--black'
  29267. } else {
  29268. _cls = 'pin--gray'
  29269. }
  29270. return `<span class="${_cls}">${params.data.neName}</span>`;
  29271. }
  29272. // 이벤트 Cell 렌더러
  29273. function eventCellRenderer(params) {
  29274. const { criCnt, majCnt, minCnt } = params.data;
  29275. const events = [];
  29276. if(criCnt && criCnt > 0) {
  29277. events.push(`<span class="evt--critical">CRITICAL (${criCnt}) </span>`)
  29278. }
  29279. if(majCnt && majCnt > 0) {
  29280. events.push(`<span class="evt--major">MAJOR (${majCnt}) </span>`)
  29281. }
  29282. if(minCnt && minCnt > 0) {
  29283. events.push(`<span class="evt--minor">MINOR (${minCnt}) </span>`)
  29284. }
  29285. if(events.length > 0) {
  29286. return events.join('');
  29287. } else {
  29288. return `<span class="evt--none">-</span>`;
  29289. }
  29290. }
  29291. onMounted(() => fnInit())
  29292. </script>
  29293. </file>
  29294. <file path="components/home/tenant/tenantRan.vue">
  29295. <template>
  29296. <div class="content--r--t">
  29297. <div class="content--inner">
  29298. <div class="content--inner--title">
  29299. <h3>장비 현황 <span class="color--blue">({{ neRanList?.length || 0 }})</span></h3>
  29300. <div
  29301. v-if="neRanList && neRanList?.length > 0"
  29302. class="status--wrap"
  29303. >
  29304. <div class="map">
  29305. <v-btn
  29306. class="custom-btn btn-blue btn-map"
  29307. @click="isShowRanGroupDtailModal = true"
  29308. >
  29309. <i class="ico" />위치보기
  29310. </v-btn>
  29311. </div>
  29312. </div>
  29313. </div>
  29314. <div
  29315. v-if="neRanList?.length > 0"
  29316. class="content--inner--content"
  29317. >
  29318. <div class="db--status">
  29319. <swiper
  29320. :slides-per-view="5"
  29321. :space-between="spaceBetween"
  29322. :pagination="paginationOptions"
  29323. :navigation="navigationOptions"
  29324. :modules="[Pagination, Navigation]"
  29325. class="mySwiper"
  29326. >
  29327. <swiper-slide
  29328. v-for="(ran, idx) in neRanList"
  29329. :key="idx"
  29330. >
  29331. <div class="equip--card--wrap">
  29332. <div :class="['equip--card', ran.isConnected ? '' : 'dis']">
  29333. <div class="equip--icon" />
  29334. <div class="equip--txt">
  29335. <p>{{ ran.neName }}</p>
  29336. <span>IP : XXXX.XXXX.XXXX.XXXX</span>
  29337. <!-- <span>{{ ran.ip ? `IP : ${ran.ip}`: '' }}</span> -->
  29338. </div>
  29339. <ul class="equip--st">
  29340. <li><i class="circle" /><p>STATUS</p><span>{{ ran.isConnected ? 'ACTIVE' : '' }}</span></li>
  29341. <li
  29342. v-for="(kpi, index) in ran.kpiItems"
  29343. :key="`tb-ran-swiper-${index}`"
  29344. >
  29345. <i
  29346. class="circle"
  29347. :class="getBodyLevelClass(kpi.val)"
  29348. />
  29349. <p>{{ kpi.label }}</p>
  29350. <span>{{ toRoundFix(kpi.val, 2) }}%</span>
  29351. </li>
  29352. </ul>
  29353. </div>
  29354. </div>
  29355. </swiper-slide>
  29356. <div class="swiper-controls">
  29357. <div class="swiper-button-prev" />
  29358. <div class="swiper-pagination" />
  29359. <div class="swiper-button-next" />
  29360. </div>
  29361. </swiper>
  29362. </div>
  29363. </div>
  29364. <!-- 데이터 없을 경우 -->
  29365. <div
  29366. v-else
  29367. class="content--inner--content no--data"
  29368. >
  29369. <i class="ico" />데이터가 없습니다.
  29370. </div>
  29371. </div>
  29372. <ranGroupDetailModal
  29373. v-if="isShowRanGroupDtailModal"
  29374. :tenant-name="selectedTenantName"
  29375. @close-modal="isShowRanGroupDtailModal=false"
  29376. />
  29377. </div>
  29378. </template>
  29379. <script setup>
  29380. /***********************
  29381. * import
  29382. ************************/
  29383. import { useI18n } from "vue-i18n"
  29384. import apiUrl from '@/composables/useApi';
  29385. import useAxios from '@/composables/useAxios';
  29386. import useUtil from '@/composables/useUtil';
  29387. import ranGroupDetailModal from "./common/ranGroupDetailModal.vue";
  29388. import { Swiper, SwiperSlide } from 'swiper/vue';
  29389. import { Navigation, Pagination } from 'swiper/modules';
  29390. import 'swiper/css';
  29391. import 'swiper/swiper-bundle.css'
  29392. import testJson from "@/components/home/dashboard/test.json"
  29393. /***********************
  29394. * plugins inject
  29395. ************************/
  29396. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  29397. // props
  29398. const props = defineProps({})
  29399. // 참조가능 데이터 설정
  29400. defineExpose({
  29401. fnInit,
  29402. })
  29403. // 발신 이벤트 선언
  29404. const emit = defineEmits([""]);
  29405. const i18n = useI18n();
  29406. /***********************
  29407. * data & created
  29408. ************************/
  29409. // 위치보기 모달 show 여부
  29410. const isShowRanGroupDtailModal = ref(false);
  29411. // 선택된 테넌트명
  29412. const selectedTenantName = ref('');
  29413. // 장비 목록
  29414. const neRanList = ref([]);
  29415. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  29416. const spaceRem = 0.94; // 원하는 rem 값
  29417. const spaceRemPx = spaceRem * remToPx();
  29418. const spaceBetween = spaceRemPx;
  29419. // swiper option
  29420. const paginationOptions = {
  29421. el: '.swiper-pagination',
  29422. clickable: true,
  29423. type: 'bullets',
  29424. bulletClass: 'swiper-pagination-bullet',
  29425. bulletActiveClass: 'swiper-pagination-bullet-active',
  29426. }
  29427. const navigationOptions = {
  29428. nextEl: '.swiper-button-next',
  29429. prevEl: '.swiper-button-prev',
  29430. clickable: true,
  29431. };
  29432. /***********************
  29433. * Methods
  29434. ************************/
  29435. function fnInit(tenantName) {
  29436. console.log('::::::: tenantRan init ::::' , tenantName)
  29437. selectedTenantName.value = tenantName;
  29438. fnGeoTenantNeInfo(tenantName);
  29439. }
  29440. /**
  29441. * P5G RAN Ne 정보 조회
  29442. */
  29443. function fnGeoTenantNeInfo(tenantName) {
  29444. return new Promise((resolve, reject) => {
  29445. const params = {
  29446. tenantName: tenantName
  29447. }
  29448. useAxios().post(useApi.tenantNeInfo, params).then((res) => {
  29449. const {resCode, resMsg, data} = res.data;
  29450. if(resCode == 200) {
  29451. // 테스트를 위한 테스트 코드 (삭제 필수)
  29452. // fnParseData([...(data?.items || []), ...testJson.ranNeGroupList.data.items])
  29453. fnParseData(data.items || [])
  29454. $log.debug("[tenantDashboard][fnGeoTenantNeInfo][success]")
  29455. resolve();
  29456. } else {
  29457. $log.debug("[tenantDashboard][fnGeoTenantNeInfo][error]", `[${resCode}] ${resMsg}`);
  29458. reject()
  29459. }
  29460. }).catch((error)=>{
  29461. $log.debug("[tenantDashboard][fnGeoTenantNeInfo][error]", error)
  29462. useErrorHandler().fnSetCommErrorHandle(error, fnGeoTenantNeInfo)
  29463. reject()
  29464. }).finally(()=>{
  29465. $log.debug("[tenantDashboard][fnGeoTenantNeInfo][finished]")
  29466. })
  29467. // fnParseData([...testJson.ranNeGroupList.data.items]);
  29468. resolve();
  29469. })
  29470. }
  29471. const fnParseData = (items = []) => {
  29472. console.log("#################### fnParseData", items)
  29473. // 테넌트 필터링
  29474. const tenantNeItems = items.filter((i) => i.tenantName == selectedTenantName.value);
  29475. // 데이터 가공
  29476. neRanList.value = tenantNeItems.map((item) => {
  29477. // KPI 정보 셋팅 - TODO: CPU, MEM 외의 값이 추가되면 여기에 추가
  29478. const { cpu, mem } = item;
  29479. const kpiItems = [];
  29480. if(cpu) {
  29481. const objCpu = typeof cpu === 'string' ? JSON.parse(cpu) : cpu;
  29482. if(objCpu && objCpu[`AVG_CPU_L`]){
  29483. kpiItems.push({label: 'CPU', val: objCpu[`AVG_CPU_L`] || 0})
  29484. item.cpu = objCpu;
  29485. }
  29486. }
  29487. if(mem) {
  29488. const objMem = typeof mem === 'string' ? JSON.parse(mem) : mem ;
  29489. if(objMem && objMem['AVG_MEM_L']){
  29490. kpiItems.push({label: 'MEMORY', val: objMem['AVG_MEM_L'] || 0})
  29491. item.mem = objMem;
  29492. }
  29493. }
  29494. // disconnected 셋팅 - Todo: connect 구분을 위한 값 확인 필요 > 20240
  29495. const isConnected = true;
  29496. return {
  29497. ...item,
  29498. kpiItems,
  29499. isConnected,
  29500. }
  29501. })
  29502. console.log("#################### neRanList 셋팅완료 ", neRanList.value)
  29503. }
  29504. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  29505. // 세부 데이터 상태값
  29506. const getBodyLevelClass = (val) => {
  29507. if(val >= 95) return 'critical';
  29508. else if(val >= 90) return 'major';
  29509. else if(val >= 85) return 'minor';
  29510. else return 'normal';
  29511. }
  29512. </script>
  29513. </file>
  29514. <file path="components/home/tenant/tenantTrend.vue">
  29515. <template>
  29516. <div class="content--r--b">
  29517. <div class="content--inner">
  29518. <div class="content--inner--title">
  29519. <p>Trend<!--<i class="ico"></i>--></p>
  29520. <div class="select--wrap">
  29521. <v-select
  29522. v-model="objSltSearch.neFamilyName"
  29523. :items="objSltOptions.neFamilyNameList"
  29524. variant="outlined"
  29525. style="width:12.875rem"
  29526. class="custom-select"
  29527. hide-details
  29528. />
  29529. <!-- <v-btn class="custom-btn btn-blue mid">
  29530. 적용
  29531. </v-btn> -->
  29532. </div>
  29533. <div class="btn-wrap">
  29534. <!-- <v-btn class="custom-btn mini btn-white btn-pip">
  29535. <i class="ico" />전체보기
  29536. </v-btn> -->
  29537. </div>
  29538. </div>
  29539. <div
  29540. v-if="chartItem && Object.keys(chartItem).length > 0"
  29541. class="chart--con"
  29542. >
  29543. <div class="chart--in">
  29544. <trendBar :chart-item="chartItem" />
  29545. </div>
  29546. </div>
  29547. <!-- 데이터 없을 경우 -->
  29548. <div
  29549. v-else
  29550. class="content--inner--content no--data"
  29551. >
  29552. <i class="ico" />데이터가 없습니다.
  29553. </div>
  29554. </div>
  29555. </div>
  29556. </template>
  29557. <script setup>
  29558. /***********************
  29559. * import
  29560. ************************/
  29561. import { useI18n } from "vue-i18n"
  29562. import apiUrl from '@/composables/useApi';
  29563. import useAxios from '@/composables/useAxios';
  29564. import useUtil from '@/composables/useUtil';
  29565. import dayjs from "#build/dayjs.imports.mjs";
  29566. import trendBar from '@/components/home/tenant/chart/trendBar.vue'
  29567. import testJson from '../dashboard/test.json'
  29568. /***********************
  29569. * plugins inject
  29570. ************************/
  29571. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  29572. // props
  29573. const props = defineProps({})
  29574. // 참조가능 데이터 설정
  29575. defineExpose({
  29576. fnInit,
  29577. })
  29578. // 발신 이벤트 선언
  29579. const emit = defineEmits([""]);
  29580. const i18n = useI18n();
  29581. /***********************
  29582. * data & created
  29583. ************************/
  29584. // 차트데이터 조회 간격
  29585. const chartInterval = ref(15);
  29586. // 차트데이터 시작 시간
  29587. const chartDiffHour = ref(-6);
  29588. // 검색 option List object
  29589. const objSltOptions = ref({
  29590. neFamilyNameList: [],
  29591. });
  29592. // 검색 조건 Object
  29593. const objSltSearch = ref({
  29594. neFamilyName: '',
  29595. })
  29596. // 선택된 테넌트명
  29597. const selectedTenantName = ref('');
  29598. // chartdata
  29599. const chartItem = ref({});
  29600. /***********************
  29601. * Methods
  29602. ************************/
  29603. function fnInit(tenantName) {
  29604. console.log('::::::: tenantTrend init ::::' , tenantName)
  29605. fnReset();
  29606. selectedTenantName.value = tenantName;
  29607. fnGetTrendList()
  29608. }
  29609. const fnReset = () => {
  29610. chartItem.value = {};
  29611. objSltSearch.value.neFamilyName = '';
  29612. objSltOptions.value.neFamilyNameList = [];
  29613. }
  29614. /**
  29615. * 트렌드 목록 조회 : familyName 목록
  29616. */
  29617. const fnGetTrendList = (neFamilyName = '') => {
  29618. return new Promise((resolve, reject) => {
  29619. const params = {
  29620. tenantName: selectedTenantName.value,
  29621. intv: chartInterval.value,
  29622. start: dayjs().add(chartDiffHour.value, 'hours').format('YYYY-MM-DD HH:mm:ss'),
  29623. end: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  29624. }
  29625. useAxios().get(useApi.getTrendHomeList, {params: params}).then((res) => {
  29626. const {resCode, resMsg, data} = res.data;
  29627. if(resCode == 200) {
  29628. fnSetData(data, neFamilyName);
  29629. $log.debug("[tenantDashboard][fnGetTrendList][success]")
  29630. } else {
  29631. $log.debug("[tenantDashboard][fnGetTrendList][error]", `[${resCode}] ${resMsg}`);
  29632. }
  29633. resolve();
  29634. console.log('::::::::: 트렌드 목록 조회 ::', data)
  29635. }).catch((error)=>{
  29636. // 데이터가 없는 경우 204로 넘어온다...
  29637. if(error?.response?.data?.status == 204) {
  29638. fnSetData(null, neFamilyName);
  29639. resolve();
  29640. $log.debug("[tenantDashboard][fnGetTrendList][success empty]")
  29641. } else {
  29642. reject();
  29643. $log.debug("[tenantDashboard][fnGetTrendList][error]", error)
  29644. useErrorHandler().fnSetCommErrorHandle(error, fnGetTrendList)
  29645. }
  29646. }).finally(()=>{
  29647. $log.debug("[tenantDashboard][fnGetTrendList][finished]")
  29648. })
  29649. })
  29650. }
  29651. const fnSetData = (data, neFamilyName) => {
  29652. if(data && data.length > 0) {
  29653. if(neFamilyName) {
  29654. // 테스트 데이터 - 삭제 필수 : Todo: items가 어떻게 전달되는지 확인 후 적용 필요
  29655. // const findData = data.find((nf) => nf.neFamilyName == neFamilyName) || {};
  29656. // if(neFamilyName == 'nename001_RRC_ESTAB' || neFamilyName == 'nename001_RRC_REESTAB' || neFamilyName == 'nename001_UE_NUM_PER_GNB') {
  29657. // findData.items = [...testJson.tenantTrendItems1]
  29658. // } else {
  29659. // findData.items = [...testJson.tenantTrendItems2]
  29660. // }
  29661. chartItem.value = data.find((nf) => nf.neFamilyName == neFamilyName) || {};
  29662. } else {
  29663. objSltOptions.value.neFamilyNameList = data.map((f) => {
  29664. return {title: f.neFamilyName, value: f.neFamilyName}
  29665. });
  29666. objSltSearch.value.neFamilyName = objSltOptions.value.neFamilyNameList[0].value;
  29667. chartItem.value = data.find((nf) => nf.neFamilyName == objSltOptions.value.neFamilyNameList[0].value) || {};
  29668. }
  29669. } else {
  29670. fnReset();
  29671. }
  29672. }
  29673. /***********************
  29674. * Watch Computed
  29675. ************************/
  29676. watch(
  29677. () => objSltSearch.value.neFamilyName,
  29678. async (neFamilyName) => {
  29679. await fnGetTrendList(neFamilyName);
  29680. console.log("chart neFamily change :::::::" , neFamilyName)
  29681. }
  29682. )
  29683. </script>
  29684. </file>
  29685. <file path="components/home/tenant/tenantUser.vue">
  29686. <template>
  29687. <div class="content--l">
  29688. <div class="content--inner">
  29689. <div class="content--inner--title">
  29690. <h3>사용 현황</h3>
  29691. </div>
  29692. <div class="content--inner--content">
  29693. <div class="db--chart--wrap">
  29694. <userDoughnut
  29695. :max-subscriber="userInfo?.maxSubscriber || 0"
  29696. :cur-subscriber="userInfo?.curSubscriber || 0"
  29697. />
  29698. </div>
  29699. </div>
  29700. </div>
  29701. <div class="content--inner">
  29702. <div class="content--inner--title">
  29703. <h3>테넌트 정보</h3>
  29704. <p
  29705. v-if="dday != '' && dday > 0"
  29706. class="d--day"
  29707. >
  29708. D-{{ dday }}일
  29709. </p>
  29710. <p
  29711. v-else-if="dday != '' && dday < 1"
  29712. class="d--day"
  29713. >
  29714. 만료
  29715. </p>
  29716. </div>
  29717. <div class="content--inner--content">
  29718. <div class="db--table">
  29719. <table>
  29720. <colgroup>
  29721. <col style="width:7.5rem">
  29722. <col>
  29723. </colgroup>
  29724. <tbody>
  29725. <tr>
  29726. <th>테넌트명</th>
  29727. <td>{{ userInfo?.tenantName }}</td>
  29728. </tr>
  29729. <tr>
  29730. <th>테넌트 고유번호</th>
  29731. <td>{{ userInfo?.tenantCode }}</td>
  29732. </tr>
  29733. <tr>
  29734. <th>고객 유형</th>
  29735. <td>{{ customerTypeName }}</td>
  29736. </tr>
  29737. <tr>
  29738. <th>라이선스 키</th>
  29739. <td>{{ userInfo?.licenseKey }}</td>
  29740. </tr>
  29741. <tr>
  29742. <th>라이선스 유형</th>
  29743. <td>{{ licenseTypeName }}</td>
  29744. </tr>
  29745. <tr>
  29746. <th>라이선스 발급일</th>
  29747. <td>{{ issueDate }}</td>
  29748. </tr>
  29749. <tr>
  29750. <th>라이선스 만료일</th>
  29751. <td>{{ expirationDate }}</td>
  29752. </tr>
  29753. <tr>
  29754. <th>계정 현황</th>
  29755. <td>
  29756. <span>사용 : {{ userInfo?.currentAccountCount || 0 }}</span> / 최대 : {{ userInfo?.maxAccount || 0 }}
  29757. </td>
  29758. </tr>
  29759. <tr>
  29760. <th>접속 현황</th>
  29761. <td>
  29762. <span>사용 : {{ userInfo?.currentConnectingCount || 0 }}</span> / 최대 : {{ userInfo?.maxSession || 0 }}
  29763. </td>
  29764. </tr>
  29765. </tbody>
  29766. </table>
  29767. </div>
  29768. </div>
  29769. </div>
  29770. </div>
  29771. </template>
  29772. <script setup>
  29773. /***********************
  29774. * import
  29775. ************************/
  29776. import { useI18n } from 'vue-i18n'
  29777. import userDoughnut from '@/components/home/tenant/chart/userDoughnut.vue'
  29778. import dayjs from '#build/dayjs.imports.mjs';
  29779. import testJson from '../dashboard/test.json'
  29780. /***********************
  29781. * plugins inject
  29782. ************************/
  29783. const {$toast, $log, $dayjs, $eventBus } = useNuxtApp()
  29784. const i18n = useI18n()
  29785. const props = defineProps({})
  29786. // 참조가능 데이터 설정
  29787. defineExpose({
  29788. fnInit,
  29789. })
  29790. /***********************
  29791. * data & created
  29792. ************************/
  29793. // 사용 현황 정보
  29794. const userInfo = ref({});
  29795. /***********************
  29796. * Watch Computed
  29797. ************************/
  29798. const licenseTypeList = computed(() => {
  29799. return useEnumCode.getEnumCode(useUtil.nvl(useLangStore().getLang, 'kr')).licenseType;
  29800. })
  29801. const customerTypeList = computed(() => {
  29802. return useEnumCode.getEnumCode(useUtil.nvl(useLangStore().getLang, 'kr')).customerType;
  29803. })
  29804. const licenseTypeName = computed(() => fnGetLicenseTypeName(userInfo.value?.licenseType));
  29805. const customerTypeName = computed(() => fnGetCustomerTypeName(userInfo.value?.customerType));
  29806. const issueDate = computed(() => fnGetDateStr(userInfo.value?.issueDate));
  29807. const expirationDate = computed(() => fnGetDateStr(userInfo.value?.expirationDate));
  29808. const dday = computed(() => fnGetDayDiff(userInfo.value?.expirationDate));
  29809. /***********************
  29810. * Methods
  29811. ************************/
  29812. function fnInit(tenantName) {
  29813. fnGetUserInfo(tenantName)
  29814. }
  29815. /**
  29816. * 사용 현황 정보 조회
  29817. */
  29818. const fnGetUserInfo = (tenantName) => {
  29819. const params = {
  29820. tenantName: tenantName
  29821. }
  29822. userInfo.value = {};
  29823. useAxios().post(useApi.getUserList, params).then((res) => {
  29824. const {resCode, resMsg, data} = res.data;
  29825. if(resCode == 200) {
  29826. userInfo.value = data.items.find((i) => i.tenantName == params.tenantName);
  29827. $log.debug("[tenantDashboard][fnGetUserList][success]")
  29828. } else {
  29829. $log.debug("[tenantDashboard][fnGetUserList][error]", `[${resCode}] ${resMsg}`);
  29830. }
  29831. console.log('::::::::: 사용자 정보 조회 ::', userInfo.value)
  29832. }).catch((error)=>{
  29833. $log.debug("[tenantDashboard][fnGetUserList][error]", error)
  29834. useErrorHandler().fnSetCommErrorHandle(error, fnGetUserInfo)
  29835. // 테스트 데이터 파싱
  29836. }).finally(()=>{
  29837. $log.debug("[tenantDashboard][fnGetUserList][finished]")
  29838. })
  29839. }
  29840. // 라이선스 유형명
  29841. const fnGetLicenseTypeName = (licenseType) => {
  29842. if(useUtil.isNull(licenseType)) return '';
  29843. const licenseTypeObj = licenseTypeList.value.find((l) => l.value == licenseType)
  29844. return licenseTypeObj ? licenseTypeObj.title : ''
  29845. }
  29846. // 고객 유형명
  29847. const fnGetCustomerTypeName = (customerType) => {
  29848. if(useUtil.isNull(customerType)) return '';
  29849. const customerTypeObj = customerTypeList.value.find((c) => c.value == customerType)
  29850. return customerTypeObj ? customerTypeObj.title : ''
  29851. }
  29852. // 날짜
  29853. const fnGetDateStr = (date) => {
  29854. try {
  29855. if(!date) return '';
  29856. return dayjs(date).format('YYYY-MM-DD')
  29857. } catch(e) {
  29858. return date;
  29859. }
  29860. }
  29861. // DDay
  29862. const fnGetDayDiff = (date) => {
  29863. try {
  29864. if(!date) return '';
  29865. return Math.floor(dayjs(date).diff(dayjs(), 'days') + 1);
  29866. } catch(e) {
  29867. return ''
  29868. }
  29869. }
  29870. </script>
  29871. </file>
  29872. <file path="components/home/trend/headerChart.vue">
  29873. <template>
  29874. <div>
  29875. <Bar
  29876. :options="chartOptions"
  29877. :data="myData"
  29878. />
  29879. </div>
  29880. </template>
  29881. <script setup>
  29882. import { Bar } from "vue-chartjs"
  29883. import {
  29884. Chart as ChartJS,
  29885. Title,
  29886. Tooltip,
  29887. Legend,
  29888. BarElement,
  29889. LineController,
  29890. LineElement,
  29891. PointElement,
  29892. CategoryScale,
  29893. ArcElement,
  29894. LinearScale,
  29895. Filler,
  29896. } from "chart.js"
  29897. ChartJS.register(
  29898. Title,
  29899. Tooltip,
  29900. Legend,
  29901. BarElement,
  29902. LineController,
  29903. LineElement,
  29904. PointElement,
  29905. CategoryScale,
  29906. ArcElement,
  29907. LinearScale,
  29908. Filler
  29909. )
  29910. // props
  29911. const props = defineProps({
  29912. height: {
  29913. type: Number,
  29914. //default: 250,
  29915. },
  29916. objChartData: {
  29917. type: Object,
  29918. default: function () {
  29919. return {}
  29920. }
  29921. },
  29922. })
  29923. // 차트 높이 유동 계산
  29924. //const h = ref((document.querySelector("body").clientWidth / 100) * (470 / 19.2))
  29925. const clientW = ref((document.querySelector("body").clientWidth))
  29926. const chartData = ref({
  29927. labels: [],
  29928. datasets: [
  29929. {
  29930. label: "CUR",
  29931. borderWidth : 1,
  29932. pointBackgroundColor:'#FF531E',
  29933. borderColor:'#FF531E',
  29934. //lineTension : 0.5,
  29935. pointRadius : 6,
  29936. hoverRadius : 8,
  29937. //borderDash : [4,6],
  29938. pointStyle : "circle",
  29939. data: [
  29940. 5,9,9,10,7,
  29941. 5,9,9,10,7,
  29942. 5,9,9,10,7,
  29943. 5,9,9,10,7,
  29944. 5,9,9,10,7,
  29945. ],
  29946. type: "line",
  29947. fill : false,
  29948. },
  29949. {
  29950. label: "AVG",
  29951. borderWidth : 1,
  29952. pointBackgroundColor:'#44C5FF',
  29953. borderColor:'#44C5FF',
  29954. //lineTension : 0.5,
  29955. pointRadius : 6,
  29956. hoverRadius : 8,
  29957. //borderDash : [4,6],
  29958. pointStyle : "circle",
  29959. data: [
  29960. 10,10,12,11,10,
  29961. 10,10,12,11,10,
  29962. 10,10,12,11,10,
  29963. 10,10,12,11,10,
  29964. 10,10,12,11,10,
  29965. ],
  29966. type: "line",
  29967. fill : false,
  29968. },
  29969. {
  29970. label: "PEAK",
  29971. borderWidth : 1,
  29972. pointBackgroundColor : '#E1473D',
  29973. borderColor:'#E1473D',
  29974. //lineTension : 0.5,
  29975. pointRadius : 6,
  29976. hoverRadius : 8,
  29977. //borderDash : [4,6],
  29978. pointStyle : "circle",
  29979. data: [
  29980. 10,10,11,10,12,
  29981. 10,10,11,10,12,
  29982. 10,10,11,10,12,
  29983. 10,10,11,10,12,
  29984. 10,10,11,10,12,
  29985. ],
  29986. type: "line",
  29987. fill : false,
  29988. },
  29989. ],
  29990. })
  29991. const chartOptions = ref({
  29992. layout: {
  29993. padding: {
  29994. top: 0,
  29995. },
  29996. },
  29997. responsive: true,
  29998. maintainAspectRatio: false,
  29999. duration: 1000,
  30000. plugins: {
  30001. legend: {
  30002. display: false,
  30003. labels: {
  30004. paddingLeft: 15,
  30005. boxHeight: 12,
  30006. boxWidth: 12,
  30007. usePointStyle : true,
  30008. pointStyle : 'line',
  30009. font: {
  30010. size: 14,
  30011. color: "#646B74",
  30012. weight: "400",
  30013. },
  30014. },
  30015. position: "top",
  30016. align: "center",
  30017. },
  30018. datalabels: {
  30019. display: false,
  30020. },
  30021. tooltip: {
  30022. interaction: {
  30023. //intersect: false,
  30024. //mode: "index",
  30025. },
  30026. displayColors : false,
  30027. callbacks: {
  30028. title : function(tooltipItem, data){
  30029. return tooltipItem[0].label.substr(0,10) + " " + tooltipItem[0].label.substr(11)
  30030. // tooltipItem[0].parsed.x
  30031. },
  30032. label: function(tooltipItem, data) {
  30033. //return tooltipItem.dataset.label
  30034. // tooltipItem.formattedValue
  30035. // tooltipItem.datasetIndex
  30036. },
  30037. titleFont: { // 타이틀 영역 폰트 스타일
  30038. size: 10,
  30039. weight:500,
  30040. family:'Inter',
  30041. },
  30042. titleColor : '#f00', // 타이틀 영역 폰트 컬러
  30043. titleAlign : 'right', // 타이틀 영역 align (left, center, right)
  30044. titleMarginBottom : 3,
  30045. },
  30046. },
  30047. },
  30048. scales: {
  30049. x: {
  30050. beginAtZero: true,
  30051. stacked: true,
  30052. title: {
  30053. text: "",
  30054. align: "end",
  30055. display: false,
  30056. font: {
  30057. color: "#666",
  30058. size: 12,
  30059. weight: "500",
  30060. },
  30061. },
  30062. grid: {
  30063. display: false,
  30064. drawTicks: false,
  30065. drawBorder: false,
  30066. color: "transparent",
  30067. },
  30068. ticks: {
  30069. padding: 20,
  30070. font: {
  30071. size: function(context){
  30072. let clientW = document.querySelector("body").clientWidth;
  30073. if(clientW <= 1930){
  30074. return 11
  30075. }else if(clientW >= 2550 && clientW < 3840){
  30076. return 17
  30077. }else if(clientW >= 3840){
  30078. return 22
  30079. }
  30080. },
  30081. weight: "400",
  30082. },
  30083. color: "#838FAC",
  30084. align:'center',
  30085. },
  30086. },
  30087. y: {
  30088. border: {
  30089. display: false,
  30090. },
  30091. beginAtZero: true,
  30092. stacked: false,
  30093. title: {
  30094. display: false,
  30095. text: "",
  30096. },
  30097. ticks: {
  30098. display: true,
  30099. padding: 10,
  30100. font: {
  30101. size: function(context){
  30102. let clientW = document.querySelector("body").clientWidth;
  30103. if(clientW <= 1930){
  30104. return 11
  30105. }else if(clientW >= 2550 && clientW < 3840){
  30106. return 17
  30107. }else if(clientW >= 3840){
  30108. return 22
  30109. }
  30110. },
  30111. weight: "400",
  30112. },
  30113. color: "#b1b1b1",
  30114. },
  30115. min:0
  30116. },
  30117. },
  30118. animation: {
  30119. duration: 0,
  30120. },
  30121. })
  30122. let myData = computed(()=>{
  30123. // 차트데이터 속성 반응형으로 복사한 후 값 설정
  30124. let tempData = ref(_cloneDeep(chartData.value))
  30125. tempData.value.labels = props.objChartData.labels
  30126. tempData.value.datasets[0].data = props.objChartData.data[0]
  30127. tempData.value.datasets[1].data = props.objChartData.data[1]
  30128. tempData.value.datasets[2].data = props.objChartData.data[2]
  30129. //tempData.value.datasets[0].data = props.objChartData.data1
  30130. //tempData.value.datasets[1].data = props.objChartData.data2
  30131. return tempData.value
  30132. })
  30133. </script>
  30134. </file>
  30135. <file path="components/login/privacyPop.vue">
  30136. <template>
  30137. <!-- 이용약관 -->
  30138. <v-dialog v-model="props.privacyPop" persistent width="62.5rem">
  30139. <div class="v-common-dialog-wrapper custom-dialog alert">
  30140. <div class="modal-tit">
  30141. <strong>{{ langType === 'kr' ? props.privacyDetail.kr.title : props.privacyDetail.en.title }}</strong>
  30142. <button class="btn-close" @click="$emit('closePop');"></button>
  30143. </div>
  30144. <div class="flag--wrap">
  30145. <div class="lang-set">
  30146. <v-select v-model="langType" :items="langTypeList" @update:modelValue="fnLangChange" variant="outlined" style="width: 9.375rem; height: 2.25rem" class="custom-select"></v-select>
  30147. </div>
  30148. </div>
  30149. <div class="v-common-dialog-content type--l">
  30150. <div class="agree--contents border--top">
  30151. <pre v-html="langType == 'kr' ? props.privacyDetail.kr.contents : props.privacyDetail.en.contents"></pre>
  30152. </div>
  30153. </div>
  30154. <div class="btn-wrap">
  30155. <div class="inner--btn--wrap">
  30156. <v-btn class="custom-btn btn-blue mini" @click="$emit('closePop')"><i class="ico"></i>확인</v-btn>
  30157. </div>
  30158. </div>
  30159. </div>
  30160. </v-dialog>
  30161. </template>
  30162. <script setup>
  30163. /***********************
  30164. * import
  30165. ************************/
  30166. import useUtil from '@/composables/useUtil';
  30167. import { useI18n } from 'vue-i18n';
  30168. /***********************
  30169. * plugins inject
  30170. ************************/
  30171. const {$toast, $log, $dayjs, $eventBus } = useNuxtApp()
  30172. // props
  30173. const props = defineProps({
  30174. privacyPop: Boolean,
  30175. privacyDetail: Object
  30176. })
  30177. // 다국어
  30178. const langTypeList = ref({})
  30179. const langType = ref('')
  30180. const emit = defineEmits(["closePop"])
  30181. const i18n = useI18n()
  30182. watchEffect(() =>{
  30183. // 감시하고자 하는 데이터를 해당 블럭내에서 사용하면 호출된다.
  30184. // getLang.value를 감시하는 상태
  30185. fnGetEnumCode(useLangStore().getLang)
  30186. })
  30187. /***********************
  30188. * data & created
  30189. ************************/
  30190. /**
  30191. * @SCRIPT
  30192. * 다국어 기능 | 한글 영문 변경 이벤트
  30193. */
  30194. function fnLangChange() {
  30195. useLangStore().setLang(langType.value)
  30196. }
  30197. function fnGetEnumCode(lang){
  30198. lang = useUtil.nvl(lang, 'kr')
  30199. langType.value = lang
  30200. let objEnum = useEnumCode.getEnumCode(lang)
  30201. langTypeList.value = objEnum.langType
  30202. i18n.locale.value = lang
  30203. }
  30204. /***********************
  30205. * Methods
  30206. ************************/
  30207. </script>
  30208. </file>
  30209. <file path="components/search/searchModules.vue">
  30210. <template>
  30211. <div class="search--modules">
  30212. <div class="form--cont--filter">
  30213. <v-select
  30214. v-model="filter"
  30215. :items="filderArr"
  30216. variant="outlined"
  30217. class="custom-select"
  30218. >
  30219. </v-select>
  30220. </div>
  30221. <div class="form--cont--text">
  30222. <v-text-field
  30223. class="custom-input mini"
  30224. style="width: 100%"
  30225. placeholder="검색어를 입력하세요"
  30226. ></v-text-field>
  30227. </div>
  30228. <v-btn class="custom-btn btn-blue mini sch--btn">검색</v-btn>
  30229. </div>
  30230. </template>
  30231. <script setup>
  30232. const filter = ref("");
  30233. const filderArr = ref([
  30234. { title: "전체", value: "" },
  30235. { title: "이름", value: "name" },
  30236. { title: "아이디", value: "id" },
  30237. ]);
  30238. </script>
  30239. </file>
  30240. <file path="components/sunEdt.vue">
  30241. <template>
  30242. <div>
  30243. <div id="editor"></div>
  30244. </div>
  30245. </template>
  30246. <script setup>
  30247. import SunEditor from "suneditor";
  30248. import "suneditor/dist/css/suneditor.min.css";
  30249. import plugins from "suneditor/src/plugins";
  30250. // Props로 초기 데이터를 받음
  30251. const props = defineProps({
  30252. initialContent: {
  30253. type: String,
  30254. default: "", // 초기값 설정
  30255. },
  30256. });
  30257. const editorInstance = ref(null);
  30258. // SunEditor 초기화
  30259. onMounted(() => {
  30260. const editorElement = document.getElementById("editor");
  30261. if (editorElement) {
  30262. editorInstance.value = SunEditor.create(editorElement, {
  30263. plugins: plugins,
  30264. buttonList: [
  30265. [
  30266. //"undo",
  30267. //"redo",
  30268. //"font",
  30269. "fontSize",
  30270. //"formatBlock",
  30271. "paragraphStyle",
  30272. "blockquote",
  30273. "bold",
  30274. "underline",
  30275. "italic",
  30276. "strike",
  30277. //"subscript",
  30278. //"superscript",
  30279. "fontColor",
  30280. //"hiliteColor",
  30281. //"textStyle",
  30282. //"removeFormat",
  30283. "outdent",
  30284. "indent",
  30285. "align",
  30286. "horizontalRule",
  30287. "list",
  30288. "lineHeight",
  30289. //"table",
  30290. "link",
  30291. "image",
  30292. //"video",
  30293. //"audio",
  30294. "fullScreen",
  30295. //"showBlocks",
  30296. //"codeView",
  30297. //"preview",
  30298. //"print",
  30299. //"save",
  30300. //"template",
  30301. ],
  30302. ],
  30303. height: "50vh",
  30304. });
  30305. // 초기 content 설정
  30306. if (props.initialContent) {
  30307. editorInstance.value.setContents(props.initialContent);
  30308. }
  30309. } else {
  30310. console.error("Editor element not found");
  30311. }
  30312. });
  30313. const getEditorContent = () => {
  30314. if (editorInstance.value) {
  30315. return editorInstance.value.getContents(); // SunEditor에서 편집된 내용 가져오기
  30316. }
  30317. return "";
  30318. };
  30319. defineExpose({
  30320. getEditorContent,
  30321. });
  30322. // 초기 content 변경 시 SunEditor 업데이트
  30323. watch(
  30324. () => props.initialContent,
  30325. (newContent) => {
  30326. if (editorInstance.value) {
  30327. editorInstance.value.setContents(newContent || "");
  30328. }
  30329. }
  30330. );
  30331. </script>
  30332. <style scoped>
  30333. /* 스타일이 필요하면 여기에 추가 */
  30334. </style>
  30335. </file>
  30336. <file path="composables/useAxios.js">
  30337. import { useLoadingStore } from '@/stores/loading'
  30338. import { useAuthStore } from '@/stores/auth'
  30339. import axios from 'axios'
  30340. let instance = null
  30341. let isRefreshing = false;
  30342. let failedQueue = [];
  30343. function processQueue(error, token = null) {
  30344. failedQueue.forEach(prom => {
  30345. if (error) {
  30346. prom.reject(error);
  30347. } else {
  30348. prom.resolve(token);
  30349. }
  30350. });
  30351. failedQueue = [];
  30352. }
  30353. // interceptor가 없는 별도의 axios 인스턴스 생성
  30354. const refreshAxios = axios.create({
  30355. baseURL: import.meta.env.VITE_APP_API_URL, // 최종 API URL
  30356. withCredentials: false,
  30357. timeout: 60 * 1000,
  30358. responseType: 'json',
  30359. responseEncoding: 'utf8',
  30360. xsrfHeaderName: 'X-XSRF-TOKEN',
  30361. progress: false,
  30362. });
  30363. const useAxios = () => {
  30364. /************************************************************************
  30365. | Axios
  30366. ************************************************************************/
  30367. const { $log } = useNuxtApp()
  30368. const store = useLoadingStore()
  30369. if (!instance) {
  30370. // 환경 변수에서 API URL과 포트를 가져옵니다
  30371. const apiBaseUrl = import.meta.env.VITE_APP_API_URL
  30372. const apiPort = import.meta.env.VITE_APP_API_PORT
  30373. const fullApiUrl = `${apiBaseUrl}:${apiPort}`
  30374. let loadingPassUrl = [
  30375. '/p5g/fm/eventViewer'
  30376. ]
  30377. instance = axios.create({
  30378. baseURL: apiBaseUrl, // 최종 API URL
  30379. withCredentials: false,
  30380. timeout: 60 * 1000,
  30381. responseType: 'json',
  30382. responseEncoding: 'utf8',
  30383. xsrfHeaderName: 'X-XSRF-TOKEN',
  30384. progress: false,
  30385. });
  30386. /**
  30387. * 요청 인터셉터
  30388. */
  30389. instance.interceptors.request.use(function (config) {
  30390. $log.debug("[REQ]" + config.url)
  30391. let accessToken = useAuthStore().getAccessToken;
  30392. // 개발 모드일 때는 env에서 VITE_APP_DEV_TOKEN 사용
  30393. if (import.meta.env.MODE === 'development' && import.meta.env.VITE_APP_DEV_TOKEN) {
  30394. accessToken = import.meta.env.VITE_APP_DEV_TOKEN;
  30395. }
  30396. config.headers = {
  30397. ...config.headers, // 기존 헤더 유지
  30398. 'Accept': 'application/json',
  30399. 'Access-Token': accessToken ? accessToken : '', // 동적으로 토큰 세팅
  30400. };
  30401. // 멀티파트 요청이면 Content-Type을 자동으로 설정하지 않음
  30402. if (config.headers['Content-Type'] !== 'multipart/form-data') {
  30403. if (!config.headers['Content-Type']) {
  30404. config.headers['Content-Type'] = 'application/json;charset=UTF-8';
  30405. }
  30406. }
  30407. if(!loadingPassUrl.includes(config.url)) {
  30408. store.plusCount()
  30409. }
  30410. return config
  30411. },
  30412. function (error) {
  30413. $log.error("[REQ][ERR]" + error)
  30414. if (!loadingPassUrl.includes(config.url)) {
  30415. store.minusCount()
  30416. }
  30417. // 요청 에러에도 로딩카운트 감소
  30418. if (error.config && !loadingPassUrl.includes(error.config.url)) {
  30419. store.minusCount()
  30420. }
  30421. return Promise.reject(error)
  30422. }
  30423. )
  30424. /**
  30425. * 응답 인터셉터
  30426. */
  30427. instance.interceptors.response.use(
  30428. response => {
  30429. if(!loadingPassUrl.includes(response.config.url)) {
  30430. store.minusCount()
  30431. }
  30432. return response;
  30433. },
  30434. async error => {
  30435. // 응답 에러에도 로딩카운트 감소(최대한 항상 호출)
  30436. if (error.config && !loadingPassUrl.includes(error.config.url)) {
  30437. store.minusCount()
  30438. }
  30439. if (error.response && error.response.status === 401) {
  30440. const authStore = useAuthStore();
  30441. const originalRequest = error.config;
  30442. // refreshToken이 있고, 재발급 시도가 아닌 경우
  30443. if (authStore.getRefreshToken && !originalRequest._retry) {
  30444. if (isRefreshing) {
  30445. // 이미 재발급 중이면 큐에 쌓았다가 처리
  30446. return new Promise(function(resolve, reject) {
  30447. failedQueue.push({resolve, reject});
  30448. }).then(token => {
  30449. originalRequest.headers['Access-Token'] = `${token}`;
  30450. return instance(originalRequest);
  30451. }).catch(err => {
  30452. return Promise.reject(err);
  30453. });
  30454. }
  30455. originalRequest._retry = true;
  30456. isRefreshing = true;
  30457. store.plusCount(); // refreshToken 요청 로딩 시작
  30458. try {
  30459. let __REQ = {
  30460. refreshToken: authStore.getRefreshToken
  30461. }
  30462. // refreshAxios로 refreshToken 요청
  30463. const res = await refreshAxios.post('/roulette/refreshToken', __REQ);
  30464. // 다양한 응답 구조에서 accessToken 추출
  30465. let newAccessToken = res.data.accessToken;
  30466. if (!newAccessToken && res.data.data && res.data.data.accessToken) {
  30467. newAccessToken = res.data.data.accessToken;
  30468. }
  30469. if (!newAccessToken && res.data.token) {
  30470. newAccessToken = res.data.token;
  30471. }
  30472. if (!newAccessToken) {
  30473. if (typeof window !== 'undefined') {
  30474. alert('세션이 만료되었습니다. 다시 로그인 해주세요.');
  30475. window.location.href = '/';
  30476. }
  30477. authStore.setLogout();
  30478. throw new Error('No accessToken in refreshToken response');
  30479. }
  30480. authStore.setAccessToken(newAccessToken);
  30481. processQueue(null, newAccessToken);
  30482. isRefreshing = false;
  30483. originalRequest.headers['Access-Token'] = `${newAccessToken}`;
  30484. store.minusCount();
  30485. // instance로 원래 요청 재시도
  30486. return instance(originalRequest);
  30487. } catch (refreshError) {
  30488. processQueue(refreshError, null);
  30489. isRefreshing = false;
  30490. store.minusCount(); // refreshToken 요청 로딩 끝
  30491. // refreshToken 만료(401, 403)만 로그아웃, 그 외는 안내
  30492. if (refreshError.response && (refreshError.response.status === 401 || refreshError.response.status === 403)) {
  30493. authStore.setLogout();
  30494. if (typeof window !== 'undefined') {
  30495. alert('로그인 세션이 만료되었습니다. 다시 로그인 해주세요.');
  30496. window.location.href = '/';
  30497. }
  30498. } else {
  30499. if (typeof window !== 'undefined') {
  30500. alert('일시적인 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.');
  30501. //window.location.href = '/';
  30502. }
  30503. }
  30504. return Promise.reject(refreshError);
  30505. }
  30506. } else {
  30507. if(!error.response.data.messages.errorCode){
  30508. authStore.setLogout();
  30509. if (typeof window !== 'undefined') {
  30510. window.location.href = '/';
  30511. }
  30512. }
  30513. }
  30514. }
  30515. return Promise.reject(error);
  30516. }
  30517. );
  30518. }
  30519. return instance
  30520. }
  30521. export default useAxios
  30522. </file>
  30523. <file path="composables/useChart.js">
  30524. import dayjs from 'dayjs'
  30525. const chartDataItems = ref({
  30526. datasetItems: {
  30527. // 태양광(단상), 태양광(삼상) 연료전지, 풍력은 같은 아이템
  30528. development_line1: {
  30529. label: '',
  30530. borderWidth : 2,
  30531. borderColor:'#6EDBBB',
  30532. lineTension : 0.5,
  30533. pointRadius : 0,
  30534. backgroundColor : (ctx) => { // bg 그라데이션 색으로 채울때 가변 채우고 비우고...
  30535. const canvas = ctx.chart.ctx
  30536. const gradient = canvas.createLinearGradient(0,0,0,300)
  30537. gradient.addColorStop(0.7, '#ffffff')
  30538. gradient.addColorStop(0, '#6edbbb')
  30539. return gradient
  30540. },
  30541. data: [],
  30542. type: 'line',
  30543. fill : true,
  30544. order: 1
  30545. },
  30546. // 태양열(강제) : 혼합차트
  30547. development_mix1: [
  30548. {
  30549. label: 'test1',
  30550. barPercentage: 0.4,
  30551. backgroundColor: '#455DDC',
  30552. data: [],
  30553. type: 'bar',
  30554. order: 2
  30555. },
  30556. {
  30557. label: 'test2',
  30558. borderWidth : 2,
  30559. borderColor:'#6EDBBB',
  30560. lineTension : 0.5,
  30561. pointRadius : 0,
  30562. data: [],
  30563. type: 'line',
  30564. fill : false,
  30565. order: 1
  30566. }
  30567. ],
  30568. // 태양열(자연)
  30569. development_line2: {
  30570. label: '',
  30571. borderWidth : 2,
  30572. borderColor:'#6EDBBB',
  30573. lineTension : 0.5,
  30574. pointRadius : 0,
  30575. data: [],
  30576. type: 'line',
  30577. fill : false,
  30578. order: 2
  30579. },
  30580. // 지열
  30581. development_mix2: [
  30582. {
  30583. label: '',
  30584. barPercentage: 0.8,
  30585. backgroundColor: '#3549AE',
  30586. data: [],
  30587. type: 'bar',
  30588. order:2
  30589. },
  30590. {
  30591. label: '',
  30592. barPercentage: 0.8,
  30593. backgroundColor: '#78A6FF',
  30594. data: [],
  30595. type: 'bar',
  30596. order:2
  30597. },
  30598. {
  30599. label: '',
  30600. borderWidth : 2,
  30601. borderColor:'#6EDBBB',
  30602. lineTension : 0.5,
  30603. pointRadius : 0,
  30604. data: [],
  30605. type: 'line',
  30606. fill : false,
  30607. order:1
  30608. }
  30609. ],
  30610. area_area: {
  30611. label: '',
  30612. barPercentage: 0.8,
  30613. backgroundColor: "#3549AE",
  30614. data: [],
  30615. type: 'bar'
  30616. },
  30617. facility_line: {
  30618. label: '',
  30619. borderWidth : 2,
  30620. lineTension : 0.5,
  30621. pointRadius : 0,
  30622. borderColor:'#3549AE',
  30623. data: [],
  30624. type: "line"
  30625. },
  30626. facility_consumption: {
  30627. label: '',
  30628. barPercentage: 0.4,
  30629. backgroundColor: '#3549AE',
  30630. data: [],
  30631. type: 'bar',
  30632. order: 1
  30633. },
  30634. facility_greed: {
  30635. label: '',
  30636. borderWidth : 2,
  30637. borderColor:'#6EDBBB',
  30638. lineTension : 0.5,
  30639. pointRadius : 0,
  30640. backgroundColor : (ctx) => { // bg 그라데이션 색으로 채울때 가변 채우고 비우고...
  30641. const canvas = ctx.chart.ctx
  30642. const gradient = canvas.createLinearGradient(0,0,0,300)
  30643. gradient.addColorStop(0.8, '#ffffff')
  30644. gradient.addColorStop(0, '#6edbbb')
  30645. return gradient
  30646. },
  30647. data: [],
  30648. type: 'line',
  30649. fill : true,
  30650. order: 2
  30651. },
  30652. }
  30653. }
  30654. )
  30655. let chart = {
  30656. customChartData(pageId, energyKey, timeSet, periodKey, resultData, areaType) {
  30657. let labels = []
  30658. let tempDataItem = []
  30659. // 1. 메뉴 & 에너지원을 확인 => 그래프의 기본값을 셋팅
  30660. if(pageId === 'development' || pageId === 'area') {
  30661. if(!useUtil.isNull(areaType)) {
  30662. if(energyKey === 'SP' || energyKey === 'TP' || energyKey === 'FC' || energyKey === 'WIND') {
  30663. // 발전량 분석 > 에너지원 값이 태양광(단상), 태양광(삼상) 연료전지, 풍력 일 경우 development_line1 셋팅
  30664. tempDataItem.push(chartDataItems.value.datasetItems.development_line1)
  30665. } else if(energyKey === 'FORCE') {
  30666. // 발전량 분석 > 에너지원 값이 태양열(강제) 일 경우 development_mix1 셋팅
  30667. _each(chartDataItems.value.datasetItems.development_mix1, (item) => {
  30668. tempDataItem.push(item)
  30669. })
  30670. } else if(energyKey === 'NATURE') {
  30671. // 발전량 분석 > 에너지원 값이 태양열(자연) 일 경우 development_line2 셋팅
  30672. tempDataItem.push(chartDataItems.value.datasetItems.development_line2)
  30673. } else if(energyKey === 'GEO') {
  30674. // 발전량 분석 > 에너지원 값이 지열 일 경우 development_mix2 셋팅
  30675. _each(chartDataItems.value.datasetItems.development_mix2, (item) => {
  30676. tempDataItem.push(item)
  30677. })
  30678. }
  30679. } else {
  30680. // 지역별 분석 => 지역이 전국이면 공통 막대그래프 셋팅
  30681. tempDataItem.push(chartDataItems.value.datasetItems.area_area)
  30682. }
  30683. }
  30684. else{
  30685. if(!useUtil.isNull(areaType)) {
  30686. if(areaType == 'stack'){
  30687. tempDataItem.push(chartDataItems.value.datasetItems.facility_greed)
  30688. }
  30689. else if(areaType == 'type'){
  30690. tempDataItem.push(chartDataItems.value.datasetItems.facility_line)
  30691. }
  30692. else if(areaType == 'consumption'){
  30693. tempDataItem.push(chartDataItems.value.datasetItems.facility_consumption)
  30694. }
  30695. }
  30696. }
  30697. // label에 대해 가공처리
  30698. if(pageId === 'development' || pageId === 'facilities' || pageId === 'area') {
  30699. if(!useUtil.isNull(areaType)) {
  30700. if(timeSet === 'hour') {
  30701. if(periodKey === 'day') {
  30702. _each(resultData.chart_date_list, (item) => {
  30703. labels.push(dayjs(item).format('H:mm'))
  30704. })
  30705. } else {
  30706. _each(resultData.chart_date_list, (item) => {
  30707. labels.push(dayjs(item).format('MM/DD H:mm'))
  30708. })
  30709. }
  30710. } else if(timeSet === 'day') {
  30711. _each(resultData.chart_date_list, (item) => {
  30712. labels.push(dayjs(item).format('MM/DD'))
  30713. })
  30714. } else if(timeSet === 'month') {
  30715. _each(resultData.chart_date_list, (item) => {
  30716. labels.push(dayjs(item).format('YYYY/MM'))
  30717. })
  30718. }
  30719. } else {
  30720. _each(resultData.chart_date_list, (item) => {
  30721. labels.push(item)
  30722. })
  30723. }
  30724. }
  30725. // 범례에 대한 셋팅
  30726. if(pageId === 'development' || pageId === 'area'){
  30727. let idx = 0
  30728. for(let i = 1; i <= Object.keys(resultData).length - 1; i++) {
  30729. const chartKey = `chart_data_list_${i}`
  30730. tempDataItem[idx].label = resultData[chartKey].legend
  30731. tempDataItem[idx].data = resultData[chartKey].chart_data
  30732. idx += 1
  30733. }
  30734. }
  30735. else{
  30736. const chartKey = Object.keys(resultData).find(key=>key.startsWith('chart_data_list_'))
  30737. tempDataItem[0].label = resultData[chartKey].legend
  30738. tempDataItem[0].data = resultData[chartKey].chart_data
  30739. }
  30740. return {labels: labels, chartData: tempDataItem}
  30741. }
  30742. }
  30743. export default chart
  30744. </file>
  30745. <file path="composables/useClaude.js">
  30746. import Anthropic from '@anthropic-ai/sdk'
  30747. export const useClaude = () => {
  30748. const runtimeConfig = useRuntimeConfig()
  30749. const client = new Anthropic({
  30750. apiKey: runtimeConfig.public.anthropicApiKey,
  30751. dangerouslyAllowBrowser: true
  30752. })
  30753. const sendMessage = async (message, conversation = []) => {
  30754. try {
  30755. const messages = [
  30756. ...conversation,
  30757. { role: 'user', content: message }
  30758. ]
  30759. const response = await client.messages.create({
  30760. model: 'claude-3-5-sonnet-20241022',
  30761. max_tokens: 1000,
  30762. messages: messages
  30763. })
  30764. return {
  30765. success: true,
  30766. content: response.content[0].text,
  30767. usage: response.usage
  30768. }
  30769. } catch (error) {
  30770. console.error('Claude API Error:', error)
  30771. return {
  30772. success: false,
  30773. error: error.message
  30774. }
  30775. }
  30776. }
  30777. const sendStreamMessage = async (message, conversation = [], onChunk) => {
  30778. try {
  30779. const messages = [
  30780. ...conversation,
  30781. { role: 'user', content: message }
  30782. ]
  30783. const stream = await client.messages.create({
  30784. model: 'claude-3-5-sonnet-20241022',
  30785. max_tokens: 1000,
  30786. messages: messages,
  30787. stream: true
  30788. })
  30789. let fullResponse = ''
  30790. for await (const chunk of stream) {
  30791. if (chunk.type === 'content_block_delta') {
  30792. const text = chunk.delta.text
  30793. fullResponse += text
  30794. if (onChunk) {
  30795. onChunk(text, fullResponse)
  30796. }
  30797. }
  30798. }
  30799. return {
  30800. success: true,
  30801. content: fullResponse
  30802. }
  30803. } catch (error) {
  30804. console.error('Claude Stream API Error:', error)
  30805. return {
  30806. success: false,
  30807. error: error.message
  30808. }
  30809. }
  30810. }
  30811. return {
  30812. sendMessage,
  30813. sendStreamMessage
  30814. }
  30815. }
  30816. </file>
  30817. <file path="composables/useEnumCode.js">
  30818. import useEnumCodeKr from './useEnumCodeKr'
  30819. import useEnumCodeEn from './useEnumCodeEn'
  30820. let useEnumCode = {
  30821. /**
  30822. * 다국어 Enum 조회
  30823. * @param {*} lang 현재 설정된 언어
  30824. * @returns
  30825. */
  30826. getEnumCode(lang){
  30827. if(lang === 'kr') {
  30828. return useEnumCodeKr
  30829. }else if(lang === 'en') {
  30830. return useEnumCodeEn
  30831. }
  30832. }
  30833. }
  30834. export default useEnumCode;
  30835. </file>
  30836. <file path="composables/useEnumCodeEn.js">
  30837. "use strict";
  30838. const EnumCodeEn = {
  30839. // 조회 대상 시스템 => /p5g/cm/getTargetSystem
  30840. // 조회 대상 NE => /ne/getTopology
  30841. // 조회 통계 항목 => /p5g/pm/familyEnum
  30842. // 고객 유형
  30843. customerType: [
  30844. {title: '대내', value: 0},
  30845. {title: '대외', value: 1},
  30846. {title: '공공', value: 2}
  30847. ],
  30848. // 시스템 유형
  30849. systemType: [
  30850. {title: 'USM_MACRO', value: 0},
  30851. {title: 'USM_COMPACT', value: 1},
  30852. {title: 'UDC_EMS', value: 2}
  30853. ],
  30854. // NE 유형
  30855. neType: [
  30856. {title: 'AMF', value: 'AMF'},
  30857. {title: 'SMF', value: 'SMF'},
  30858. {title: 'UDC', value: 'UDC'},
  30859. {title: 'MEC', value: 'MEC'},
  30860. {title: 'UPF', value: 'UPF'},
  30861. {title: 'CU', value: 'CU'},
  30862. {title: 'DU', value: 'DU'},
  30863. {title: 'RU', value: 'RU'},
  30864. {title: 'AU', value: 'AU'}
  30865. ],
  30866. // 패밀리아이디
  30867. pmFamily: {
  30868. stat: {
  30869. CU: ["RRC_ESTAB","RRC_REESTAB","SGNB_ADD_EUTRAN_OUT","ERAB_ADD_PER_GNB","SCG_FAIL_OPER","UE_NUM_PER_GNB","CUCPCSL_PER_GNB","INTRA_SN_PSCELL_CHANGE_PER_GNB","INTER_SN_PSCELL_CHANGE_SRC_PER_GNB","HO_OUT","SGNB_INIT_SGNB_MOD_PER_GNB","MENB_INIT_SGNB_MOD_PER_GNB"],
  30870. AMF: ["MS","REGIPLMN","REGSPLMN","REGPOD","REGRAN","REGRANGRP","REGPEI","REGNS","DREGIPLMN","DREGSPLMN","DREGPOD","DREGRAN","DREGRANGRP","DREGPEI","DREGSNSSAI","SRIPLMN","SRSPLMN","SRPOD","SRRAN","SRRANGRP","SRPEI"],
  30871. UPF: ["CALLSP","CALLIP","CALLSNSSAI","CALLSGRP","CALLDNN","PFMCP","PFNMP","PFSMP","PSRTN","PUPIRN","PUD","PUDD","PUDDTL","PUDSIZE"],
  30872. SMF: ["SMDNNSE","SMDNNSM","SMDNNSR","SMDNNUA","SMDNNUD","SMUPFSE","SMUPFSM","SMUPFSR","SMUPFUA","SMUPFUD","SMUPFBA","SMUPFBD","SMUPFBM","SMUPFBP"],
  30873. DU: [""],
  30874. RU: [""],
  30875. AU: [""],
  30876. UDC: [""]
  30877. },
  30878. trend: {
  30879. CU: ["RRC_ESTAB","RRC_REESTAB","UE_NUM_PER_GNB"],
  30880. AMF: ["MS","REGPOD","DREGPOD","SRPOD"],
  30881. UPF: ["CALLSP","PFMCP","PUD"],
  30882. SMF: ["SMUPFSE","SMUPFSR","SMUPFUA","SMUPFUD"],
  30883. DU: [""],
  30884. RU: [""],
  30885. AU: [""],
  30886. UDC: [""]
  30887. }
  30888. },
  30889. familyIds: {
  30890. trend: {
  30891. AMF: ['AMFMS', 'REGPOD', 'DEREGPOD', 'SRAMFPOD'],
  30892. SMF: ['SMUPFSE', 'SMUPFSR', 'SMUPFUA', 'SMUPFUD'],
  30893. UPF: ['CALLSP', 'PFMCP', 'PUD'],
  30894. CU: ['RRC_ESTAB, RRC_REESTAB', 'UE_NUM_PER_GNB']
  30895. },
  30896. stat: {
  30897. AMF: [
  30898. 'AMFMS','REGIPLMN','REGSPLMN','REGPOD','REGRAN','REGRANGRP','REGREGPEI','DEREGIPLMN',
  30899. 'DEREGSPLMN','DEREGPOD','DEREGRAN','DEREGRANGRP','DEREGPEI','SRIPLMN','SRSPLMN','SRPOD',
  30900. 'SRRAN','SRRANGRP','SRPEI'
  30901. ],
  30902. SMF: [
  30903. 'SMDNNSE','SMDNNSM','SMDNNSR','SMDNNUA','SMDNNUD','SMUPFSE','SMUPFSM','SMUPFSR',
  30904. 'SMUPFUA','SMUPFUD','SMUPFBA','SMUPFBD','SMUPFBM','SMUPFBP'
  30905. ],
  30906. UPF: [
  30907. 'CALLSP','CALLIP','CALLSNSSAI','CALLSGRP','CALLDNN','PFMCP','PFNMP','PFSMP','PSRTN','PUPIRN','PUD',
  30908. 'PUDD','PUDDTL','PUDSIZE'
  30909. ],
  30910. CU: [
  30911. 'RRC_ESTAB','RRC_REESTAB','SGNB_ADD_EUTRAN_OUT','ERAB_ADD_PER_GNB','SCG_FAIL_OPER',
  30912. 'UE_NUM_PER_GNB','CUCPCSL_PER_GNB','INTRA_SN_PSCELL_CHANGE_PER_GNB',
  30913. 'INTER_SN_PSCELL_CHANGE_SRC_PER_GNB','HO_OUT','SGNB_INIT_SGNB_MOD_PER_GNB',
  30914. 'MENB_INIT_SGNB_MOD_PER_GNB'
  30915. ]
  30916. }
  30917. },
  30918. // 이벤트 유형
  30919. eventType: [
  30920. {title: 'All', value: -1},
  30921. {title: 'Alarm', value: 1},
  30922. {title: 'Status', value: 2},
  30923. {title: 'Fault', value: 3}
  30924. ],
  30925. // 심각도
  30926. severity: [
  30927. {title: 'All', value: -1},
  30928. {title: 'Critical', value: 1},
  30929. {title: 'Major', value: 2},
  30930. {title: 'Minor', value: 3},
  30931. {title: 'Warning', value: 4},
  30932. {title: 'Normal', value: 5}
  30933. ],
  30934. // 알람 그룹
  30935. alarmGroup: [
  30936. {title: 'All', value: -1},
  30937. {title: 'Communications', value: 1},
  30938. {title: 'ProcessingError', value: 2},
  30939. {title: 'Environmental', value: 3},
  30940. {title: 'QoS', value: 4},
  30941. {title: 'Equipment', value: 5}
  30942. ],
  30943. // 알람 상태값
  30944. alarmState: [
  30945. {title: 'None', value: -1},
  30946. {title: 'Uncleared', value: 0},
  30947. {title: 'Auto Clear', value: 1},
  30948. {title: 'Manual Clear', value: 2},
  30949. {title: 'Audit Clear', value: 3},
  30950. {title: 'Audit', value: 4},
  30951. {title: 'Unack', value: 5},
  30952. {title: 'Ack', value: 6}
  30953. ],
  30954. // 해제 유형
  30955. clearType: [
  30956. {title: 'All', value: -1},
  30957. {title: 'Uncleared', value: 1},
  30958. {title: 'Cleared', value: 5}
  30959. ],
  30960. // Inhibit 여부
  30961. inhibitStatus: [
  30962. {title: '전체', value: -1},
  30963. {title: 'false', value: 0},
  30964. {title: 'true', value: 1}
  30965. ],
  30966. // 계정 LEVEL
  30967. accountLevel: [
  30968. {title: 'superAdmin', value: -1},
  30969. {title: 'adminSds', value: 0},
  30970. {title: 'managerBusiness', value: 1},
  30971. {title: 'operatorBusiness', value: 2}
  30972. ],
  30973. // 동작 유형
  30974. actionType: [
  30975. {title: 'LOGIN', value: 'LOGIN'},
  30976. {title: 'LOGOUT', value: 'LOGOUT'},
  30977. {title: 'LOGIN_FAIL', value: 'LOGIN_FAIL'}
  30978. ],
  30979. // 상태
  30980. status: [
  30981. {title: '단절', value: 0},
  30982. {title: '연결', value: 1},
  30983. {title: '이중화', value: 2}
  30984. ],
  30985. // 시스템연동상태
  30986. systemStatus: [
  30987. {title: '연결', value: 0},
  30988. {title: '미연결', value: 1}
  30989. ],
  30990. // 로그 레벨
  30991. logLevel: [
  30992. {title: 'OFF', value: 0},
  30993. {title: 'DEBUG', value: 1},
  30994. {title: 'INFO', value: 2},
  30995. {title: 'WARN', value: 3},
  30996. {title: 'ERROR', value: 4}
  30997. ],
  30998. // 언어 선택
  30999. langType: [
  31000. {title: '한국어', value: 'kr'},
  31001. {title: '영어', value: 'en'}
  31002. ],
  31003. // 수행 명령
  31004. command: [
  31005. {title: '등록', value: 'ADD'},
  31006. {title: '수정', value: 'UPDATE'},
  31007. {title: '삭제', value: 'DELETE'},
  31008. ],
  31009. // 수행 결과
  31010. result: [
  31011. {title: '성공', value: 'SUCCESS'},
  31012. {title: '실패', value: 'FAIL'},
  31013. ],
  31014. // 명령 함수
  31015. functionSelect: [
  31016. {title: '테넌트관리', value: '테넌트관리'},
  31017. {title: '가입자관리', value: '가입자관리'},
  31018. {title: '수집관리', value: '수집관리'},
  31019. {title: 'NE관리', value: 'NE관리'},
  31020. ],
  31021. // 약관 유형
  31022. termsType: [
  31023. {title: '서비스이용약관', value: 'SERVICE'},
  31024. {title: '개인정보취급방침', value: 'PRIVACY'},
  31025. ],
  31026. // 필수 여부
  31027. reqYn: [
  31028. {title: '필수', value: 'Y'},
  31029. {title: '선택', value: 'N'},
  31030. ],
  31031. // 사용 여부
  31032. useYn: [
  31033. {title: '사용', value: 'Y'},
  31034. {title: '미사용', value: 'N'},
  31035. ],
  31036. // 동의 여부
  31037. termsAgrYn: [
  31038. {title: '동의', value: 'Y'},
  31039. {title: '미동의', value: 'N'},
  31040. ],
  31041. // 계정상태
  31042. accountStatus: [
  31043. {title: '정상', value: 'NORMAL'},
  31044. {title: '잠김', value: 'LOCKED'},
  31045. ],
  31046. alarmYn: [
  31047. {title: '수신', value: 'Y'},
  31048. {title: '미수신', value: 'N'},
  31049. ],
  31050. // 계정 권한
  31051. accountRole: [
  31052. // {title: 'SUPER', value: 'SUPER'},
  31053. {title: 'ADMIN', value: 'ADMIN'},
  31054. {title: 'MANAGER', value: 'MANAGER'},
  31055. {title: 'OPERATOR', value: 'OPERATOR'}
  31056. ],
  31057. // 연결-미연결
  31058. connectType: [
  31059. {title: '미연결', value: 0},
  31060. {title: '연결', value: 1}
  31061. ],
  31062. // 접속 상태
  31063. allowYn: [
  31064. {title: '접속가능', value: 'Y'},
  31065. {title: '접속불가', value: 'N'}
  31066. ],
  31067. // 라이센스 타입
  31068. licenseType: [
  31069. {title: '유상', value: 0},
  31070. {title: '무상', value: 1},
  31071. {title: 'Trial', value: 2},
  31072. {title: 'Development', value: 3}
  31073. ],
  31074. // 시도 코드
  31075. sidoCode: [
  31076. {title: ['전국', '전국'], value: 0, cls: ''},
  31077. {title: ['서울특별시', '서울'], value: 11, cls: 'seoul'},
  31078. {title: ['부산광역시', '부산'], value: 21, cls: 'busan'},
  31079. {title: ['대구광역시', '대구'], value: 22, cls: 'daegu'},
  31080. {title: ['인천광역시', '인천'], value: 23, cls: 'incheon'},
  31081. {title: ['광주광역시', '광주'], value: 24, cls: 'gwangju'},
  31082. {title: ['대전광역시', '대전'], value: 25, cls: 'daejeon'},
  31083. {title: ['울산광역시', '울산'], value: 26, cls: 'ulsan'},
  31084. {title: ['세종특별자치시', '세종'], value: 29, cls: 'sejong'},
  31085. {title: ['경기도', '경기'], value: 31, cls: 'gyeonggi-do'},
  31086. {title: ['강원특별자치도', '강원'], value: 32, cls: 'kangwon'},
  31087. {title: ['충청북도', '충북'], value: 33, cls: 'chungbuk'},
  31088. {title: ['충청남도', '충남'], value: 34, cls: 'chungnam'},
  31089. {title: ['전북특별자치도', '전북'], value: 35, cls: 'jeonbuk'},
  31090. {title: ['전라남도', '전남'], value: 36, cls: 'jeonnam'},
  31091. {title: ['경상북도', '경북'], value: 37, cls: 'gyeongbuk'},
  31092. {title: ['경상남도', '경남'], value: 38, cls: 'gyeongnam'},
  31093. {title: ['제주특별자치도', '제주'], value: 39, cls: 'jeju'},
  31094. ]
  31095. };
  31096. export default EnumCodeEn;
  31097. </file>
  31098. <file path="composables/useEnumCodeKr.js">
  31099. "use strict";
  31100. const EnumCodeKr = {
  31101. // 조회 대상 시스템 => /p5g/cm/getTargetSystem
  31102. // 조회 대상 NE => /ne/getTopology
  31103. // 조회 통계 항목 => /p5g/pm/familyEnum
  31104. // 고객 유형
  31105. customerType: [
  31106. {title: '대내', value: 0},
  31107. {title: '대외', value: 1},
  31108. {title: '공공', value: 2}
  31109. ],
  31110. // 시스템 유형
  31111. systemType: [
  31112. {title: 'USM_MACRO', value: 0},
  31113. {title: 'USM_COMPACT', value: 1},
  31114. {title: 'UDC_EMS', value: 2}
  31115. ],
  31116. // NE 유형
  31117. neType: [
  31118. {title: 'AMF', value: 'AMF'},
  31119. {title: 'SMF', value: 'SMF'},
  31120. {title: 'UDC', value: 'UDC'},
  31121. {title: 'MEC', value: 'MEC'},
  31122. {title: 'UPF', value: 'UPF'},
  31123. {title: 'CU', value: 'CU'},
  31124. {title: 'DU', value: 'DU'},
  31125. {title: 'RU', value: 'RU'},
  31126. {title: 'AU', value: 'AU'}
  31127. ],
  31128. // 패밀리아이디
  31129. pmFamily: {
  31130. stat: {
  31131. CU: ["RRC_ESTAB","RRC_REESTAB","SGNB_ADD_EUTRAN_OUT","ERAB_ADD_PER_GNB","SCG_FAIL_OPER","UE_NUM_PER_GNB","CUCPCSL_PER_GNB","INTRA_SN_PSCELL_CHANGE_PER_GNB","INTER_SN_PSCELL_CHANGE_SRC_PER_GNB","HO_OUT","SGNB_INIT_SGNB_MOD_PER_GNB","MENB_INIT_SGNB_MOD_PER_GNB"],
  31132. AMF: ["MS","REGIPLMN","REGSPLMN","REGPOD","REGRAN","REGRANGRP","REGPEI","REGNS","DREGIPLMN","DREGSPLMN","DREGPOD","DREGRAN","DREGRANGRP","DREGPEI","DREGSNSSAI","SRIPLMN","SRSPLMN","SRPOD","SRRAN","SRRANGRP","SRPEI","LOADSVCCPU","LOADSVCMEM"],
  31133. UPF: ["CALLSP","CALLIP","CALLSNSSAI","CALLSGRP","CALLDNN","PFMCP","PFNMP","PFSMP","PSRTN","PUPIRN","PUD","PUDD","PUDDTL","PUDSIZE","LOADSVCCPU","LOADSVCMEM"],
  31134. SMF: ["SMDNNSE","SMDNNSM","SMDNNSR","SMDNNUA","SMDNNUD","SMUPFSE","SMUPFSM","SMUPFSR","SMUPFUA","SMUPFUD","SMUPFBA","SMUPFBD","SMUPFBM","SMUPFBP","LOADSVCCPU","LOADSVCMEM"],
  31135. DU: [""],
  31136. RU: [""],
  31137. AU: [""],
  31138. UDC: [""]
  31139. },
  31140. trend: {
  31141. CU: ["RRC_ESTAB","RRC_REESTAB","UE_NUM_PER_GNB"],
  31142. AMF: ["MS","REGPOD","DREGPOD","SRPOD","LOADSVCCPU","LOADSVCMEM"],
  31143. UPF: ["CALLSP","PFMCP","PUD","LOADSVCCPU","LOADSVCMEM"],
  31144. SMF: ["SMUPFSE","SMUPFSR","SMUPFUA","SMUPFUD","LOADSVCCPU","LOADSVCMEM"],
  31145. DU: [""],
  31146. RU: [""],
  31147. AU: [""],
  31148. UDC: [""]
  31149. }
  31150. },
  31151. familyIds: {
  31152. trend: {
  31153. AMF: ['AMFMS', 'REGPOD', 'DEREGPOD', 'SRAMFPOD'],
  31154. SMF: ['SMUPFSE', 'SMUPFSR', 'SMUPFUA', 'SMUPFUD'],
  31155. UPF: ['CALLSP', 'PFMCP', 'PUD'],
  31156. CU: ['RRC_ESTAB, RRC_REESTAB', 'UE_NUM_PER_GNB']
  31157. },
  31158. stat: {
  31159. AMF: [
  31160. 'AMFMS','REGIPLMN','REGSPLMN','REGPOD','REGRAN','REGRANGRP','REGREGPEI','DEREGIPLMN',
  31161. 'DEREGSPLMN','DEREGPOD','DEREGRAN','DEREGRANGRP','DEREGPEI','SRIPLMN','SRSPLMN','SRPOD',
  31162. 'SRRAN','SRRANGRP','SRPEI'
  31163. ],
  31164. SMF: [
  31165. 'SMDNNSE','SMDNNSM','SMDNNSR','SMDNNUA','SMDNNUD','SMUPFSE','SMUPFSM','SMUPFSR',
  31166. 'SMUPFUA','SMUPFUD','SMUPFBA','SMUPFBD','SMUPFBM','SMUPFBP'
  31167. ],
  31168. UPF: [
  31169. 'CALLSP','CALLIP','CALLSNSSAI','CALLSGRP','CALLDNN','PFMCP','PFNMP','PFSMP','PSRTN','PUPIRN','PUD',
  31170. 'PUDD','PUDDTL','PUDSIZE'
  31171. ],
  31172. CU: [
  31173. 'RRC_ESTAB','RRC_REESTAB','SGNB_ADD_EUTRAN_OUT','ERAB_ADD_PER_GNB','SCG_FAIL_OPER',
  31174. 'UE_NUM_PER_GNB','CUCPCSL_PER_GNB','INTRA_SN_PSCELL_CHANGE_PER_GNB',
  31175. 'INTER_SN_PSCELL_CHANGE_SRC_PER_GNB','HO_OUT','SGNB_INIT_SGNB_MOD_PER_GNB',
  31176. 'MENB_INIT_SGNB_MOD_PER_GNB'
  31177. ]
  31178. }
  31179. },
  31180. // 이벤트 유형
  31181. eventType: [
  31182. {title: 'All', value: -1},
  31183. {title: 'Alarm', value: 1},
  31184. {title: 'Status', value: 2},
  31185. {title: 'Fault', value: 3}
  31186. ],
  31187. // 심각도
  31188. severity: [
  31189. {title: 'All', value: -1},
  31190. {title: 'Critical', value: 1},
  31191. {title: 'Major', value: 2},
  31192. {title: 'Minor', value: 3},
  31193. {title: 'Warning', value: 4},
  31194. {title: 'Normal', value: 5}
  31195. ],
  31196. // 알람 그룹
  31197. alarmGroup: [
  31198. {title: 'All', value: -1},
  31199. {title: 'Communications', value: 1},
  31200. {title: 'ProcessingError', value: 2},
  31201. {title: 'Environmental', value: 3},
  31202. {title: 'QoS', value: 4},
  31203. {title: 'Equipment', value: 5}
  31204. ],
  31205. // 알람 상태값
  31206. alarmState: [
  31207. {title: 'None', value: -1},
  31208. {title: 'Uncleared', value: 0},
  31209. {title: 'Auto Clear', value: 1},
  31210. {title: 'Manual Clear', value: 2},
  31211. {title: 'Audit Clear', value: 3},
  31212. {title: 'Audit', value: 4},
  31213. {title: 'Unack', value: 5},
  31214. {title: 'Ack', value: 6}
  31215. ],
  31216. // 해제 유형
  31217. clearType: [
  31218. {title: 'All', value: -1},
  31219. {title: 'Uncleared', value: 1},
  31220. {title: 'Cleared', value: 5}
  31221. ],
  31222. // Inhibit 여부
  31223. inhibitStatus: [
  31224. {title: '전체', value: -1},
  31225. {title: 'false', value: 0},
  31226. {title: 'true', value: 1}
  31227. ],
  31228. // 계정 LEVEL
  31229. accountLevel: [
  31230. {title: 'superAdmin', value: -1},
  31231. {title: 'adminSds', value: 0},
  31232. {title: 'managerBusiness', value: 1},
  31233. {title: 'operatorBusiness', value: 2}
  31234. ],
  31235. // 동작 유형
  31236. actionType: [
  31237. {title: 'LOGIN', value: 'LOGIN'},
  31238. {title: 'LOGOUT', value: 'LOGOUT'},
  31239. {title: 'LOGIN_FAIL', value: 'LOGIN_FAIL'}
  31240. ],
  31241. // 상태
  31242. status: [
  31243. {title: '단절', value: 0},
  31244. {title: '연결', value: 1},
  31245. {title: '이중화', value: 2}
  31246. ],
  31247. // 시스템연동상태
  31248. systemStatus: [
  31249. {title: '연결', value: 0},
  31250. {title: '미연결', value: 1}
  31251. ],
  31252. // 로그 레벨
  31253. logLevel: [
  31254. {title: 'OFF', value: 0},
  31255. {title: 'DEBUG', value: 1},
  31256. {title: 'INFO', value: 2},
  31257. {title: 'WARN', value: 3},
  31258. {title: 'ERROR', value: 4}
  31259. ],
  31260. // 언어 선택
  31261. langType: [
  31262. {title: '한국어', value: 'kr'},
  31263. {title: '영어', value: 'en'}
  31264. ],
  31265. // 수행 명령
  31266. command: [
  31267. {title: '등록', value: 'ADD'},
  31268. {title: '수정', value: 'UPDATE'},
  31269. {title: '삭제', value: 'DELETE'},
  31270. ],
  31271. // 수행 결과
  31272. result: [
  31273. {title: '성공', value: 'SUCCESS'},
  31274. {title: '실패', value: 'FAIL'},
  31275. ],
  31276. // 명령 함수
  31277. functionSelect: [
  31278. {title: '테넌트관리', value: '테넌트관리'},
  31279. {title: '가입자관리', value: '가입자관리'},
  31280. {title: '수집관리', value: '수집관리'},
  31281. {title: 'NE관리', value: 'NE관리'},
  31282. ],
  31283. // 약관 유형
  31284. termsType: [
  31285. {title: '서비스이용약관', value: 'SERVICE'},
  31286. {title: '개인정보취급방침', value: 'PRIVACY'},
  31287. ],
  31288. // 필수 여부
  31289. reqYn: [
  31290. {title: '필수', value: 'Y'},
  31291. {title: '선택', value: 'N'},
  31292. ],
  31293. // 사용 여부
  31294. useYn: [
  31295. {title: '사용', value: 'Y'},
  31296. {title: '미사용', value: 'N'},
  31297. ],
  31298. // 동의 여부
  31299. termsAgrYn: [
  31300. {title: '동의', value: 'Y'},
  31301. {title: '미동의', value: 'N'},
  31302. ],
  31303. // 계정상태
  31304. accountStatus: [
  31305. {title: '정상', value: 'NORMAL'},
  31306. {title: '잠김', value: 'LOCKED'},
  31307. ],
  31308. alarmYn: [
  31309. {title: '수신', value: 'Y'},
  31310. {title: '미수신', value: 'N'},
  31311. ],
  31312. // 계정 권한
  31313. accountRole: [
  31314. // {title: 'SUPER', value: 'SUPER'},
  31315. {title: 'ADMIN', value: 'ADMIN'},
  31316. {title: 'MANAGER', value: 'MANAGER'},
  31317. {title: 'OPERATOR', value: 'OPERATOR'}
  31318. ],
  31319. // 연결-미연결
  31320. connectType: [
  31321. {title: '미연결', value: 0},
  31322. {title: '연결', value: 1}
  31323. ],
  31324. // 접속 상태
  31325. allowYn: [
  31326. {title: '접속가능', value: 'Y'},
  31327. {title: '접속불가', value: 'N'}
  31328. ],
  31329. // 라이센스 타입
  31330. licenseType: [
  31331. {title: '유상', value: 0},
  31332. {title: '무상', value: 1},
  31333. {title: 'Trial', value: 2},
  31334. {title: 'Development', value: 3}
  31335. ],
  31336. // 시도 코드
  31337. sidoCode: [
  31338. {title: ['전국', '전국'], value: 0, cls: ''},
  31339. {title: ['서울특별시', '서울'], value: 11, cls: 'seoul'},
  31340. {title: ['부산광역시', '부산'], value: 21, cls: 'busan'},
  31341. {title: ['대구광역시', '대구'], value: 22, cls: 'daegu'},
  31342. {title: ['인천광역시', '인천'], value: 23, cls: 'incheon'},
  31343. {title: ['광주광역시', '광주'], value: 24, cls: 'gwangju'},
  31344. {title: ['대전광역시', '대전'], value: 25, cls: 'daejeon'},
  31345. {title: ['울산광역시', '울산'], value: 26, cls: 'ulsan'},
  31346. {title: ['세종특별자치시', '세종'], value: 29, cls: 'sejong'},
  31347. {title: ['경기도', '경기'], value: 31, cls: 'gyeonggi-do'},
  31348. {title: ['강원특별자치도', '강원'], value: 32, cls: 'kangwon'},
  31349. {title: ['충청북도', '충북'], value: 33, cls: 'chungbuk'},
  31350. {title: ['충청남도', '충남'], value: 34, cls: 'chungnam'},
  31351. {title: ['전북특별자치도', '전북'], value: 35, cls: 'jeonbuk'},
  31352. {title: ['전라남도', '전남'], value: 36, cls: 'jeonnam'},
  31353. {title: ['경상북도', '경북'], value: 37, cls: 'gyeongbuk'},
  31354. {title: ['경상남도', '경남'], value: 38, cls: 'gyeongnam'},
  31355. {title: ['제주특별자치도', '제주'], value: 39, cls: 'jeju'},
  31356. ]
  31357. };
  31358. export default EnumCodeKr;
  31359. </file>
  31360. <file path="composables/useErrorHandler.js">
  31361. /************************
  31362. * import
  31363. ************************/
  31364. const useErrorHandler = () => {
  31365. const { $log, $toast, $eventBus } = useNuxtApp()
  31366. // 공통 에러코드
  31367. let errProfiles = [
  31368. { code : '9999' , action : 0, desc : '기타오류', proc : {type:'toast',msg:'처리중 오류가 발생되었습니다.<br/> 지속발생시 관리자에게 문의 바랍니다.'}, after : null}
  31369. ]
  31370. let errObj = { code : '' , action : 0, desc : '', proc : {type:'toast',msg:'처리중 오류가 발생되었습니다.<br/>상세오류코드: '}, after : null}
  31371. /**
  31372. * 공통 에러 처리 함수
  31373. * @param {*} error 에러
  31374. */
  31375. async function fnSetCommErrorHandle(error){
  31376. let code = ''
  31377. let msg = ''
  31378. if (error.response){
  31379. code = error.response.data.resCode
  31380. msg = error.response.data.resMsg
  31381. }
  31382. //$log.error('[ErrorHandle][ERROR]' + JSON.stringify(error.response.data))
  31383. if(code === '1005' || code === '1006' || code === '1007' || code === '1008') {
  31384. // 1005: 토큰이 없음, 1006: 토큰 만료됨, 1007: 잘못된 토큰 값, 1008: 로그아웃 처리된 토큰 값 => 강제 로그인 페이지로 이동
  31385. $eventBus.emit('SESSION_DESTORY')
  31386. }
  31387. // 에러로 처리
  31388. errObj.code = code
  31389. if(_isEmpty(errObj.code)){
  31390. errObj = _find(errProfiles, {code:'9999'})
  31391. code = '9999'
  31392. }
  31393. if(errObj.proc.type === 'toast'){
  31394. let toastMsg = errObj.proc.msg
  31395. toastMsg = errObj.proc.msg.concat(msg+'['+code+']')
  31396. //$toast.error(toastMsg)
  31397. }
  31398. return false
  31399. }
  31400. return { fnSetCommErrorHandle }
  31401. }
  31402. export default useErrorHandler
  31403. </file>
  31404. <file path="composables/useHangul.js">
  31405. import Hangul from 'hangul-js'
  31406. /*
  31407. * 키워드 검색 공통 함수
  31408. */
  31409. let hangul = {
  31410. /**
  31411. * 키워드로 입력 시 필터 결과 반환(키보드 입력 이벤트)
  31412. * @param {*} arr
  31413. * @param {*} keyword
  31414. * @param {*} filter 대상 키
  31415. * @returns
  31416. */
  31417. fnGetKeywordResult(arr, keyword, filter){
  31418. let tempList = []
  31419. if (!keyword) {
  31420. // 키워드가 없는 경우 > 키워드 검색결과 빈값
  31421. tempList = []
  31422. }else{
  31423. tempList = this.fnFilterList(arr, keyword, filter)
  31424. }
  31425. let resultObj = {
  31426. arr : _cloneDeep(tempList), // 결과 원본 배열
  31427. newArr: this.fnReduce(tempList, filter), // 결과 중복제거 배열
  31428. }
  31429. return resultObj
  31430. },
  31431. /**
  31432. * 필터 키워드 배열 반환
  31433. * @param {*} arr 필터처리할 배열
  31434. * @param {*} keyword 입력 키워드
  31435. * @param {*} key 필터키값
  31436. * @returns
  31437. */
  31438. fnFilterList(arr, keyword, filter){
  31439. let tempList = []
  31440. tempList = arr.filter((ele) => {
  31441. if(ele[filter].toLowerCase().indexOf(keyword.toLowerCase()) > -1){
  31442. return true
  31443. }
  31444. return this.fnCho(keyword, ele[filter])
  31445. })
  31446. return tempList
  31447. },
  31448. /**
  31449. * 키워드 > 초성 체크
  31450. * @params keyword 입력키워드
  31451. * @params key 비교할 키값
  31452. * @returns Boolean
  31453. */
  31454. fnCho(keyword, key){
  31455. let result = false
  31456. // 초성 검색(ㅅㄴㅍ)
  31457. let disassemble = Hangul.disassemble(key, true) //2번째 인자로 true를 전달하면 글자마다 독립된 배열을 만들어준다
  31458. // disassemble = [[ㅎ,ㅗ,ㅇ],[ㄱ,ㅣ,ㄹ],[ㄷ,ㅗ,ㅇ]]
  31459. var cho = ''
  31460. for (let i=0,l=disassemble.length; i<l; i++){
  31461. cho+=disassemble[i][0]
  31462. }
  31463. //disassemble의 배열의 첫값을 cho에 첨가한다
  31464. // cho = "ㅎㄱㄷ"
  31465. let isChoSearch = cho.includes(keyword)
  31466. if(isChoSearch){
  31467. result= true
  31468. }
  31469. return result
  31470. },
  31471. /**
  31472. * 중복 카운팅 후 새로운 배열 반환
  31473. * @param {*} arr
  31474. * @param {*} key
  31475. * @returns
  31476. */
  31477. fnReduce(arr, key){
  31478. const result = arr.reduce((accu, item) => {
  31479. const index = accu.findIndex(elem => elem.title === item[key]);
  31480. if (index !== -1) {
  31481. // 중복 count계산
  31482. accu[index].count++;
  31483. } else {
  31484. accu.push({ value: key, title: item[key], count: 1 });
  31485. }
  31486. return accu;
  31487. }, []);
  31488. return result;
  31489. },
  31490. /**
  31491. * 입력한 키워드로 검색 시, 결과 반환(검색버튼 또는 엔터 액션)
  31492. * @param {*} arr1 배열
  31493. * @param {*} keyword
  31494. * @returns
  31495. */
  31496. fnSearchResultList(arr1, keyword){
  31497. let findSearch = []
  31498. // 발전소명
  31499. let sl1 = arr1.filter(ele => ele.title == keyword)
  31500. if(sl1.length > 0) findSearch = sl1
  31501. return findSearch
  31502. },
  31503. /**
  31504. * 키워드 입력 폼 > 일치하는 문자열 font color설정
  31505. * @param {*} title 키워드 결과 리스트 항목명
  31506. * @param {*} keyword 입력키워드
  31507. * @returns
  31508. */
  31509. fnSetHighlightKeyword(title, keyword){
  31510. let text = _isNumber(title) ? JSON.stringify(title) : title
  31511. if (!keyword) return text // 키워드가 없으면 그대로 반환
  31512. const regex = new RegExp(`(${keyword})`, 'i'); //첫번째로 일치하는 문자에 대한 정규식
  31513. const match = text.match(regex)
  31514. if (match) {
  31515. const index = match.index
  31516. return text.substring(0, index) +
  31517. `<span style="color: #2da9d6;">${text.substring(index, index + keyword.length)}</span>` +
  31518. text.substring(index + keyword.length)
  31519. } else {
  31520. return text
  31521. }
  31522. },
  31523. }
  31524. export default hangul
  31525. </file>
  31526. <file path="composables/useMenuConstants.js">
  31527. "use strict";
  31528. const MenuConstants = {
  31529. PER_PAGE: 10,
  31530. USER_PRIORITY: ["SUPER ADMIN", "ADMIN", "MANAGER", "OPERATOR"], // 결정 필요...
  31531. MAIN_MENU: [
  31532. {
  31533. name: "Home",
  31534. code: "menu01",
  31535. root: "home",
  31536. sub_menu: [
  31537. {
  31538. name: "Dashboard",
  31539. code: "menu01_sub01",
  31540. url: '/view/home/dashboard'
  31541. },
  31542. {
  31543. name: "Trend",
  31544. code: "menu01_sub02",
  31545. url: '/view/home/trend'
  31546. },
  31547. {
  31548. name: "Tenant Dashboard",
  31549. code: "menu01_sub03",
  31550. url: '/view/home/tenantDashboard'
  31551. },
  31552. ],
  31553. },
  31554. {
  31555. name: "구성관리",
  31556. code: "menu02",
  31557. root: "cm",
  31558. sub_menu: [
  31559. {
  31560. name: "테넌트 관리",
  31561. code: "menu02_sub01",
  31562. url: '/view/cm/tenantMgmt'
  31563. },
  31564. {
  31565. name: "수집 장비 관리",
  31566. code: "menu02_sub02",
  31567. url: '/view/cm/equipMgmt'
  31568. },
  31569. {
  31570. name: "NE 관리",
  31571. code: "menu02_sub03",
  31572. url: '/view/cm/neMgmt'
  31573. },
  31574. {
  31575. name: "가입자관리",
  31576. code: "menu02_sub04",
  31577. url: '/view/cm/userMgmt'
  31578. },
  31579. ],
  31580. },
  31581. {
  31582. name: "장애관리",
  31583. code: "menu03",
  31584. root: "dm",
  31585. sub_menu: [
  31586. {
  31587. name: "알람이력",
  31588. code: "menu03_sub01",
  31589. url: '/view/dm/alarmHistory'
  31590. },
  31591. ],
  31592. },
  31593. {
  31594. name: "성능관리",
  31595. code: "menu04",
  31596. root: "pm",
  31597. sub_menu: [
  31598. {
  31599. name: "성능통계",
  31600. code: "menu04_sub01",
  31601. url: '/view/pm/performanceMgmt'
  31602. }
  31603. ],
  31604. },
  31605. {
  31606. name: "보안관리",
  31607. code: "menu05",
  31608. root: "sm",
  31609. sub_menu: [
  31610. {
  31611. name: "계정관리",
  31612. code: "menu05_sub01",
  31613. url: '/view/sm/accountMgmt'
  31614. },
  31615. {
  31616. name: "접속자 세션관리",
  31617. code: "menu05_sub02",
  31618. url: '/view/sm/connectSessionMgmt'
  31619. },
  31620. {
  31621. name: "운용이력",
  31622. code: "menu05_sub03",
  31623. url: '/view/sm/operatingHistory'
  31624. },
  31625. {
  31626. name: "접속이력",
  31627. code: "menu05_sub04",
  31628. url: '/view/sm/loginHistory'
  31629. },
  31630. ],
  31631. },
  31632. {
  31633. name: "설정",
  31634. code: "menu06",
  31635. root: "gm",
  31636. sub_menu: [
  31637. {
  31638. name: "DB 관리",
  31639. code: "menu06_sub01",
  31640. url: '/view/gm/dbMgmt'
  31641. },
  31642. {
  31643. name: "컨테이너 관리",
  31644. code: "menu06_sub02",
  31645. url: '/view/gm/containerMgmt'
  31646. },
  31647. {
  31648. name: "세션 설정 관리",
  31649. code: "menu06_sub03",
  31650. url: '/view/gm/connectSetMgmt'
  31651. },
  31652. {
  31653. name: "메뉴 권한 관리",
  31654. code: "menu06_sub04",
  31655. url: '/view/gm/menuRoleMgmt'
  31656. },
  31657. {
  31658. name: "약관 관리",
  31659. code: "menu06_sub05",
  31660. url: '/view/gm/termsMgmt'
  31661. },
  31662. ],
  31663. },
  31664. ],
  31665. };
  31666. export default MenuConstants;
  31667. </file>
  31668. <file path="composables/useToastEditor.ts">
  31669. import Editor from "@toast-ui/editor";
  31670. import "@toast-ui/editor/dist/toastui-editor.css";
  31671. import "@toast-ui/editor/dist/i18n/ko-kr";
  31672. export const toastEditorInstance = (
  31673. divId: HTMLElement,
  31674. initialEditType: string,
  31675. hideModeSwitch: boolean,
  31676. autofocus: boolean,
  31677. height: string
  31678. ) => {
  31679. return new Editor({
  31680. el: divId,
  31681. initialEditType: initialEditType,
  31682. hideModeSwitch: hideModeSwitch,
  31683. language: "ko-KR",
  31684. autofocus: autofocus,
  31685. height: height,
  31686. hooks: {
  31687. // addImageBlobHook: async (blob: Blob, callback) => { }
  31688. },
  31689. });
  31690. };
  31691. </file>
  31692. <file path="composables/useUrlHandler.js">
  31693. const useUrlHandler = () => {
  31694. /*
  31695. *Object to path
  31696. */
  31697. function fnToPath(params){
  31698. let values = Object.values(params)
  31699. let stringValues = values.map(String).join('/')
  31700. return '/' + stringValues
  31701. }
  31702. /*
  31703. *Object to querystring
  31704. */
  31705. function fnToQuery(params){
  31706. return '?'+ Object.keys(params).map(key => key + '=' + params[key]).join('&')
  31707. }
  31708. return { fnToPath, fnToQuery }
  31709. }
  31710. export default useUrlHandler
  31711. </file>
  31712. <file path="composables/useUtil.js">
  31713. import dayjs from 'dayjs';
  31714. import { utils, writeFile } from "xlsx";
  31715. import * as XLSX from 'xlsx-js-style/dist/xlsx.bundle.js';
  31716. /*
  31717. * Harmory 3.0 Util Plugin
  31718. * Version : 1.0
  31719. * Make By Jason 2022
  31720. */
  31721. let util = {
  31722. /**
  31723. * @TODO 함수설명 필요
  31724. **/
  31725. toStr(str){
  31726. return str + ''
  31727. },
  31728. /**
  31729. * @TODO 함수설명 필요
  31730. **/
  31731. nvl(str, restr){
  31732. if (str === '' || str === null || typeof(str) === 'undefined' || str === 'undefined' || str === 'null'){
  31733. if (restr === ''){
  31734. return ''
  31735. } else {
  31736. return restr
  31737. }
  31738. }else{
  31739. return str
  31740. }
  31741. },
  31742. /**
  31743. * @TODO 함수설명 필요
  31744. */
  31745. isNull(str){
  31746. if ( str === '' || str === null || str === undefined || typeof(str) === 'undefined' || str ==='undefined' || str ==='null'){
  31747. return true
  31748. }else{
  31749. return false
  31750. }
  31751. },
  31752. /**
  31753. * @TODO 함수설명 필요
  31754. * 로깅처리 하는 글로벌 Util
  31755. * LOGGING =='YES' 일때만 처리함
  31756. **/
  31757. log(msg, level){
  31758. console.log(level+'|', msg)
  31759. },
  31760. colorLog(msg){
  31761. // console.log("%c"+dayjs().format('YYYY-MM-DD HH:mm:ss')+" "+msg, 'color:#02f7eb')
  31762. },
  31763. /**
  31764. * @TODO 좌우 Trim
  31765. **/
  31766. trim(data){
  31767. return data.replace(/^\s+|\s+$/g, '')
  31768. },
  31769. /**
  31770. * @TODO 왼쪽으로 Trim
  31771. **/
  31772. ltrim(data){
  31773. return data.replace(/^\s+/, '')
  31774. },
  31775. /**
  31776. * @TODO 오른쪽으로 trim
  31777. **/
  31778. rtrim(data){
  31779. return data.replace(/\s+$/, '')
  31780. },
  31781. /**
  31782. * @TODO 소수점 자리숫를 파싱한다.
  31783. **/
  31784. toRoundFix(data, digit){
  31785. if(Number.isInteger(parseFloat(data))){
  31786. return parseFloat(data)
  31787. } else {
  31788. return parseFloat(data).toFixed(digit)
  31789. }
  31790. },
  31791. fillZero(number, width){
  31792. width -= number.toString().length
  31793. if ( width > 0 ){
  31794. return new Array( width + (/\./.test( number ) ? 2 : 1) ).join( '0' ) + number
  31795. }
  31796. return number + '' // always return a strin
  31797. },
  31798. hex2Float(number, underDigit){
  31799. let sNum = ''
  31800. let num = parseInt(number, 16)
  31801. sNum += parseFloat(num/100).toFixed(underDigit)
  31802. return sNum
  31803. },
  31804. decimalToHex(d, padding){
  31805. let hex = Number(d).toString(16)
  31806. padding = typeof (padding) === 'undefined' || padding === null ? padding = 2 : padding
  31807. while (hex.length < padding){
  31808. hex = '0' + hex
  31809. }
  31810. return hex.toUpperCase()
  31811. },
  31812. left(str, n){
  31813. if (n <= 0){
  31814. return ''
  31815. }else if (n > String(str).length){
  31816. return str
  31817. }else{
  31818. return String(str).substring(0, n)
  31819. }
  31820. },
  31821. right(str, n){
  31822. if (n <= 0){
  31823. return ''
  31824. }else if (n > String(str).length){
  31825. return str
  31826. }else{
  31827. let iLen = String(str).length
  31828. return String(str).substring(iLen, iLen - n)
  31829. }
  31830. },
  31831. convert12Hour(hour){
  31832. return ''+util.fillZero((parseInt(hour, 10) + 24) % 12 || 12, 2)
  31833. },
  31834. getStrLength(str){
  31835. let strLength = 0
  31836. let i
  31837. for (i = 0; i < str.length; i++){
  31838. let code = str.charCodeAt(i)
  31839. let ch = str.substr(i, 1).toUpperCase()
  31840. code = parseInt(code)
  31841. if ((ch < '0' || ch > '9') && (ch < 'A' || ch > 'Z') && ((code > 255) || (code < 0)))
  31842. strLength = strLength + 2
  31843. else
  31844. strLength = strLength + 1
  31845. }
  31846. return strLength
  31847. },
  31848. str2Hex(instr){
  31849. let str = ''+instr
  31850. let hex = ''
  31851. for(let i = 0; i<str.length; i++){
  31852. hex += '' + str.charCodeAt(i).toString(16)
  31853. }
  31854. return hex
  31855. },
  31856. getTextCutByte(obj, len){
  31857. let str = $(obj).val()
  31858. let str_len = str.length
  31859. let bytes = 0
  31860. let result = true
  31861. for(let i=0; i<str.length; i++){
  31862. let ch = str.charAt(i)
  31863. if(escape(ch).length > 4){
  31864. bytes += 2
  31865. }else if(ch === '\n'){
  31866. if(str.charAt(i-1) != '\r'){
  31867. bytes += 1
  31868. }
  31869. }else if(ch === '<' || ch === '>'){
  31870. bytes += 4
  31871. }else{
  31872. bytes += 1
  31873. }
  31874. if(bytes > len){
  31875. str_len--
  31876. $(obj).val(str.substring(0, str_len))
  31877. }
  31878. }
  31879. if(bytes > len){
  31880. result = false
  31881. }
  31882. return result
  31883. },
  31884. getOS(){
  31885. let ua = String( navigator.userAgent ).toLowerCase()
  31886. if(/iphone|ipad/.test(ua)){
  31887. return 'ios'
  31888. }else if(/android/.test(ua)){
  31889. return 'android'
  31890. }else{
  31891. return 'android'
  31892. }
  31893. },
  31894. setComma(num){
  31895. let sign = ''
  31896. let rnum = String(num)
  31897. if(rnum.substring(0, 1) == '-'){
  31898. sign = '-'
  31899. rnum = rnum.substring(1)
  31900. }
  31901. let spNum = rnum.split('.')
  31902. return sign + spNum[0].replace(/\D/g, '').replace(/\B(?=(\d{3})+(?!\d))/g, ',') + (spNum[1] ? '.' + spNum[1] : '')
  31903. },
  31904. setUnComma(num){
  31905. num = String(num)
  31906. return num.replace(/[^\d]+/g, '')
  31907. },
  31908. setInputNumberComma(obj){
  31909. return util.setComma(util.setUnComma(obj))
  31910. },
  31911. get24To12(hour){
  31912. var _result = 0
  31913. var _hour = parseInt(hour, 10)
  31914. if(_hour === 0){
  31915. _result = 12
  31916. }else if(_hour > 12){
  31917. _result = _hour - 12
  31918. }else{
  31919. _result = _hour
  31920. }
  31921. return _result
  31922. },
  31923. /**
  31924. * @param2 : 0: 오전 / 1: 오후
  31925. */
  31926. get12To24(hour, ampm){
  31927. let _result = 0
  31928. let _hour = parseInt(hour, 10)
  31929. if(ampm === 0 ){
  31930. if(_hour === 12){
  31931. _result = 0
  31932. }else{
  31933. _result = _hour
  31934. }
  31935. }else if(ampm === 1){
  31936. if(_hour != 12){
  31937. _result = _hour + 12
  31938. }else{
  31939. _result = 12
  31940. }
  31941. }else{
  31942. return _hour
  31943. }
  31944. return _result
  31945. },
  31946. /**
  31947. * 연락처 자동 파이프(-)생성 계산식
  31948. * @param {*} data
  31949. */
  31950. getPhoneMask(data){
  31951. if(!util.isNull(data)){
  31952. data = data.replace(/[^0-9]/g, '')
  31953. let res = ''
  31954. if(data.length < 3){
  31955. res = data
  31956. } else {
  31957. if(data.substr(0, 2) =='02'){
  31958. if(data.length <= 5){//02-123-5678
  31959. res = data.substr(0, 2) + '-' + data.substr(2, 3)
  31960. } else if(data.length > 5 && data.length <= 9){//02-123-5678
  31961. res = data.substr(0, 2) + '-' + data.substr(2, 3) + '-' + data.substr(5)
  31962. } else {//02-1234-5678
  31963. data = data.substr(0, 10)
  31964. res = data.substr(0, 2) + '-' + data.substr(2, 4) + '-' + data.substr(6)
  31965. }
  31966. } else {
  31967. if(data.length < 8){
  31968. res = data
  31969. } else if(data.length == 8){
  31970. res = data.substr(0, 4) + '-' + data.substr(4)
  31971. } else if(data.length == 9){
  31972. res = data.substr(0, 3) + '-' + data.substr(3, 3) + '-' + data.substr(6)
  31973. } else if(data.length == 10){
  31974. res = data.substr(0, 3) + '-' + data.substr(3, 3) + '-' + data.substr(6)
  31975. } else if(data.length == 11){ //010-1234-5678
  31976. res = data.substr(0, 3) + '-' + data.substr(3, 4) + '-' + data.substr(7)
  31977. }else {
  31978. data = data.substr(0, 11)
  31979. res = data.substr(0, 3) + '-' + data.substr(3, 4) + '-' + data.substr(7)
  31980. }
  31981. }
  31982. }
  31983. return res
  31984. }else{
  31985. return data
  31986. }
  31987. },
  31988. /**
  31989. * 사업자 등록번호 파이프(-) 자동입력 :
  31990. * ex) 123-45-67890
  31991. */
  31992. getBisinessMask(data){
  31993. if(!data) return data
  31994. data = data.replace(/[^0-9]/g, '')
  31995. let res = ''
  31996. if(data.length < 3){
  31997. res = data
  31998. } else {
  31999. if(data.length <= 5){
  32000. res = data.substr(0, 3) + '-' + data.substr(3, 2)
  32001. }else if(data.length >= 6){
  32002. res = data.substr(0, 3) + '-' + data.substr(3, 2) + '-' + data.substr(5)
  32003. }
  32004. }
  32005. return res
  32006. },
  32007. replaceAll(str, searchStr, replaceStr){
  32008. if(util.nvl(str, '') === ''){
  32009. return ''
  32010. }
  32011. return str.split(searchStr).join(replaceStr)
  32012. },
  32013. setDragged(obj){
  32014. let el = $(obj.el).parent().parent()[0]
  32015. if (!$(el).hasClass('laypop_renew')){
  32016. el = $(obj.el).parent().parent().parent()[0]
  32017. }
  32018. el.style.left =obj.offsetX+'px'
  32019. el.style.top =obj.offsetY+'px'
  32020. },
  32021. //Blob형태로 다운로드 할때 사용
  32022. downLoadBlob(fileName, blob){
  32023. let downloadLink = document.createElement('a')
  32024. downloadLink.download = fileName
  32025. downloadLink.innerHTML = ''
  32026. downloadLink.href = window.URL.createObjectURL(blob)
  32027. downloadLink.onclick = function (event){
  32028. document.body.removeChild(event.target)
  32029. }
  32030. downloadLink.style.visibility = 'hidden'
  32031. document.body.appendChild(downloadLink)
  32032. downloadLink.click()
  32033. },
  32034. async setPageMove(url){
  32035. const { $log } = useNuxtApp()
  32036. if(useRoute().path === url) {
  32037. $log.debug('현재 경로와 이동하려는 경로가 같다면 새로고침')
  32038. window.location.reload()
  32039. }else{
  32040. useRouter().push(url)
  32041. }
  32042. },
  32043. isMatch(data, clone){
  32044. return JSON.stringify(data) === JSON.stringify(clone)
  32045. },
  32046. /**
  32047. * 휴대폰 하이픈 처리
  32048. */
  32049. getPhoneHyphen(num){
  32050. const hyphenNum = num.replace(/[^0-9]/g, "")
  32051. let strNum = ''
  32052. if(hyphenNum.length >= 4 && hyphenNum.length<=7){
  32053. strNum = hyphenNum.replace(/(\d{3})(\d{1,3})/, '$1-$2')
  32054. }
  32055. else if(hyphenNum.length>=8 && hyphenNum.length <= 11){
  32056. strNum = hyphenNum.replace(/(\d{3})(\d{4})(\d{1,4})/, '$1-$2-$3')
  32057. }
  32058. else{
  32059. strNum = hyphenNum.substring(0,11).replace(/(\d{3})(\d{4})(\d{1,4})/, '$1-$2-$3')
  32060. strNum = strNum.substring(0,13)
  32061. }
  32062. return strNum
  32063. },
  32064. /**
  32065. * 객체배열 오름차순 정렬
  32066. */
  32067. sortAsc(arr, key){
  32068. return arr.sort((a,b)=>{
  32069. var x = a[key];
  32070. var y = b[key];
  32071. return((x<y)?-1:((x>y)?1:0));
  32072. })
  32073. },
  32074. /**
  32075. * 객체배열 내림차순 정렬
  32076. */
  32077. sortDesc(arr, key){
  32078. return arr.sort((a,b)=>{
  32079. var x = a[key];
  32080. var y = b[key];
  32081. return((x>y)?-1:((x>y)?1:0));
  32082. })
  32083. },
  32084. /**
  32085. * 숫자 포맷 세팅
  32086. * @param {*} num 변경할 숫자
  32087. * @param {*} decimalPlaces 소수점 개수
  32088. * @param {*} nonNumberStr 숫자가 아닐경우 표현할 문자
  32089. * @param {*} unit 단위
  32090. */
  32091. fnFormatNumber(num, decimalPlaces = 2, nonNumberStr = 0, unit = '') {
  32092. let number = Number(num)
  32093. if(isNaN(number) || typeof number !== 'number' || num == null){
  32094. return nonNumberStr
  32095. }
  32096. const hasDecimal = number % 1 !== 0
  32097. const fixedNumber = hasDecimal ? parseFloat(number.toFixed(decimalPlaces)) : number
  32098. const [integerPart, decimalPart] = fixedNumber.toString().split('.')
  32099. const formattedIntegerPart = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
  32100. if(decimalPart){
  32101. return `${formattedIntegerPart}.${decimalPart}${unit}`
  32102. } else {
  32103. return `${formattedIntegerPart}${unit}`
  32104. }
  32105. },
  32106. /**
  32107. * Excel 다운로드 (클라이언트 데이터 기반)
  32108. *
  32109. * @param {*} params Excel 생성 설정값
  32110. * @param {*} headers 테이블 Header 데이터. format: [{title: '타이틀', key: '데이터Key'}, ....]
  32111. * @param {*} tableList 테이블 row 데이터. format: [{ '데이터Key': value, ...}, ....]
  32112. * @param {*} firstRow 테이블 최상위에 표시할 테이터 (없으면 표시하지 않음)
  32113. * @param {*} specialStyle firstRow, 특정 셀 스타일을 주고 싶을 때
  32114. */
  32115. fnExcelMergeDownLoad(params, headers, tableList, firstRow, specialStyle){
  32116. const { $dayjs } = useNuxtApp()
  32117. //excel 파일명
  32118. let date = $dayjs(new Date()).format('YYYYMMDD')
  32119. let excelTitle = params.title || 'download'
  32120. let excelBody = JSON.parse(JSON.stringify(tableList))
  32121. let merge = [] // 행, 열 결합
  32122. let isFirstRow = !util.isNull(firstRow)
  32123. // 헤더 스타일
  32124. let headerStyle = {
  32125. fill: { fgColor: { rgb: '878fa2' } },
  32126. font: { bold: true, color: { rgb: 'fafafa' } },
  32127. alignment: { vertical: 'center', horizontal: 'center' }
  32128. }
  32129. // firstRow가 있으면 table 정보에 첫 Row에 삽입
  32130. if(isFirstRow) {
  32131. excelBody.unshift(firstRow)
  32132. }
  32133. //excel 생성 데이터
  32134. let excelData = []
  32135. excelBody.forEach((item) => {
  32136. let obj = {}
  32137. headers.forEach((names, namesIdx) => {
  32138. let objValue = item[headers[namesIdx].key]
  32139. obj[names.title] = (util.isNull(objValue)) ? '': objValue.toString().replace('_NONE', '')
  32140. })
  32141. excelData.push(obj)
  32142. })
  32143. // 셀병합 데이터 생성(셀병합의 경우 우선 최상단 헤더에만 존재함)
  32144. headers.forEach((names, namesIdx) => {
  32145. // rowspan
  32146. if(names.hasOwnProperty('rowspan')){
  32147. merge.push({ s: { r: 0, c: namesIdx }, e: { r: names.rowspan - 1, c: namesIdx } })
  32148. }
  32149. // colspan
  32150. if(names.hasOwnProperty('colspan')){
  32151. merge.push({ s: { r: 0, c: namesIdx }, e: { r: 0, c: namesIdx + names.colspan - 1 } })
  32152. }
  32153. })
  32154. let excelFileName = [date, excelTitle].join('_') + '.xlsx'
  32155. let workbook = XLSX.utils.book_new()
  32156. let worksheet = XLSX.utils.json_to_sheet(excelData)
  32157. // 셀 병합
  32158. // merge = [ { s: { r: 1, c: 1 }, e: { r: 2, c: 3 } }; // A1부터 C1까지 병합 ]
  32159. const styles = {
  32160. '!merges': merge // 병합된 셀에 스타일 적용
  32161. }
  32162. // 스타일 지정
  32163. // 헤더, firstRow 영역 스타일 설정(유니코드 65 => A, 66 => B .... 헤더 cell 스타일 적용)
  32164. headers.forEach((header, index) => {
  32165. let val = index / 26
  32166. let remain = index % 26
  32167. let doubleIndex = val >= 1 ? String.fromCharCode(65 + Math.floor(val) - 1) : ''
  32168. worksheet[doubleIndex + String.fromCharCode(65 + remain) + '1'].s = headerStyle
  32169. if(isFirstRow) worksheet[doubleIndex + String.fromCharCode(65 + remain) + '2'].s = specialStyle.hasOwnProperty('totalRowStyle') ? specialStyle.totalRowStyle : headerStyle
  32170. })
  32171. // 특정 영역에 셀 스타일 적용
  32172. if(specialStyle.hasOwnProperty('cellStyleObj')){
  32173. specialStyle.cellStyleObj.target.forEach((cell) => {
  32174. worksheet[cell].s = specialStyle.cellStyleObj.cellStyle
  32175. })
  32176. }
  32177. worksheet['!merges'] = styles['!merges']; // 병합 정보 업데이트
  32178. XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1')
  32179. XLSX.writeFile(workbook, excelFileName)
  32180. return
  32181. },
  32182. /**
  32183. * KREMS > 분석통계 => 그래프&테이블 영역의 파라미터 가공(start_dt, end_dt) 공통 함수
  32184. * @param {*} periodKey : UI상 일,주,월,년,기간에 대한 파라미터
  32185. * @param {*} start_dt : 시작일
  32186. * @param {*} end_dt : 종료일
  32187. * @returns
  32188. */
  32189. statisticsDateFormat(periodKey, start_dt, end_dt) {
  32190. let month = 0
  32191. let start = ''
  32192. let end = ''
  32193. if(periodKey === 'day') {
  32194. // 일
  32195. start = dayjs(start_dt).format('YYYY-MM-DD')
  32196. end = dayjs(start_dt).format('YYYY-MM-DD')
  32197. } else if(periodKey === 'week') {
  32198. // 주
  32199. if(dayjs(start_dt).format('dddd') === 'Sunday') {
  32200. start = dayjs(start_dt).subtract(6, 'day').format('YYYY-MM-DD')
  32201. end = dayjs(start_dt).format('YYYY-MM-DD')
  32202. } else {
  32203. start = dayjs(start_dt).startOf('week').subtract(-1, 'day').format('YYYY-MM-DD')
  32204. end = dayjs(start_dt).endOf('week').subtract(-1, 'day').format('YYYY-MM-DD')
  32205. }
  32206. } else if(periodKey === 'month') {
  32207. //월
  32208. if(util.isNull(start_dt.month)) {
  32209. // true 일때
  32210. start = dayjs(start_dt).startOf('month').format('YYYY-MM-DD')
  32211. end = dayjs(start_dt).endOf('month').format('YYYY-MM-DD')
  32212. } else {
  32213. month = start_dt.month + 1
  32214. start = dayjs(start_dt.year+'-'+month).startOf('month').format('YYYY-MM-DD')
  32215. end = dayjs(start_dt.year+'-'+month).endOf('month').format('YYYY-MM-DD')
  32216. }
  32217. } else if(periodKey === 'year') {
  32218. start = start_dt+'-01-01'
  32219. end = start_dt+'-12-31'
  32220. } else if(periodKey === 'period') {
  32221. start = dayjs(start_dt).format('YYYY-MM-DD')
  32222. end = dayjs(end_dt).format('YYYY-MM-DD')
  32223. }
  32224. return [start, end]
  32225. },
  32226. /**
  32227. * 엑셀다운로드 공통
  32228. * @returns 엑셀파일
  32229. * @param {*} params Excel 생성 설정값
  32230. * @param {*} headers 테이블 Header 데이터. format: [{heder: '타이틀', dataKey: '데이터Key'}, ....]
  32231. * @param {*} tableList 테이블 row 데이터. format: [{ '데이터Key': value, ...}, ....]
  32232. * @param {*} firstRow 테이블 최상위에 표시할 테이터 (없으면 표시하지 않음)
  32233. */
  32234. fnExcelDownLoad(params, headers, tableList, firstRow){
  32235. let date = dayjs(new Date()).format('YYYYMMDD')
  32236. let excelTitle = params.title || 'download';
  32237. let excelBody = JSON.parse(JSON.stringify(tableList));
  32238. //firstRow가 있으면 table 정보에 첫 Row에 삽입
  32239. if(util.isNull(firstRow) === false) {
  32240. excelBody.unshift(firstRow);
  32241. }
  32242. //excel 생성 데이터
  32243. let excelData = []
  32244. excelBody.forEach((item) => {
  32245. let obj = {}
  32246. headers.forEach((names, namesIdx) => {
  32247. let objValue = item[headers[namesIdx].dataKey]
  32248. obj[names.header] = (util.isNull(objValue)) ? '': objValue.toString().replace('_NONE', '')
  32249. })
  32250. excelData.push(obj)
  32251. });
  32252. // var excelData = XLSX.utils.table_to_sheet(tableList); // table id를 넣어주면된다
  32253. let excelFileName = [date, excelTitle].join('_') + '.xlsx'
  32254. let workbook = XLSX.utils.book_new()
  32255. let worksheet = XLSX.utils.json_to_sheet(excelData)
  32256. // 헤더 스타일 설정
  32257. const headerStyle = {
  32258. alignment: {
  32259. horizontal: "center",
  32260. vertical: "center"
  32261. },
  32262. fill: { fgColor: { rgb: '878fa2' } },
  32263. font: {
  32264. bold: true
  32265. }
  32266. };
  32267. // 자동 너비 계산
  32268. const maxLengths = headers.map(header =>
  32269. Math.max(header.header.length, ...excelData.map(row => (row[header.header] ? row[header.header].toString().length : 0)))
  32270. )
  32271. worksheet['!cols'] = maxLengths.map(length => ({ wch: length + 20 }));
  32272. // 헤더 스타일을 시트에 적용
  32273. headers.forEach((header, colIdx) => {
  32274. const cellAddress = XLSX.utils.encode_cell({ c: colIdx, r: 0 });
  32275. if (!worksheet[cellAddress]) {
  32276. worksheet[cellAddress] = { v: header.header };
  32277. }
  32278. worksheet[cellAddress].s = headerStyle;
  32279. });
  32280. XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1')
  32281. XLSX.writeFile(workbook, excelFileName)
  32282. return;
  32283. },
  32284. /***************
  32285. * p5g util
  32286. ***************/
  32287. fnExcelFormDown(arrForm, arrGuide, sheetName, fileName){
  32288. // 엑셀 파일 생성
  32289. const book = utils.book_new()
  32290. // data get > 실 개발시 api 호출
  32291. const userDataByAoa = arrForm
  32292. const guideByAoa = arrGuide
  32293. // sheet 생성 - aoa_to_sheet 방식
  32294. const worksheetUserData = utils.aoa_to_sheet(userDataByAoa)
  32295. const worksheetGuide = utils.aoa_to_sheet(guideByAoa)
  32296. // sheet 생성 - json_to_sheet 방식
  32297. //const worksheetByJson = xlsx.utils.json_to_sheet(fruitDataByJson)
  32298. // 엑셀 파일에 sheet set(엑셀파일, 시트데이터, 시트명)
  32299. utils.book_append_sheet(book, worksheetUserData, sheetName)
  32300. utils.book_append_sheet(book, worksheetGuide, "GUIDE")
  32301. // 엑셀 다운로드
  32302. writeFile(book, `${fileName}.xlsx`);
  32303. },
  32304. /**
  32305. * 필수 입력 필드 체크
  32306. * @param {Array} fields 필수 입력 필드값
  32307. * @param {Object} obj 체크할 대상
  32308. * @returns
  32309. */
  32310. isAllFieldsFilled(fields, obj) {
  32311. return fields.every(field => !util.isNull(obj[field]))
  32312. },
  32313. /**
  32314. * 위도, 경도 입력 제한
  32315. */
  32316. fnIsValidLatlngKey(event){
  32317. const key = event.key
  32318. const value = event.target.value
  32319. // 입력가능한 특수 키
  32320. const allowedKeys = ['Backspace', 'Tab', 'Delete', 'ArrowLeft', 'ArrowRight', '-', '.']
  32321. if (allowedKeys.includes(key) || (!isNaN(Number(key)) && key !== ' ')) {
  32322. // '.' 한번만 입력되도록 제한
  32323. if (key === '.' && value.includes('.')) {
  32324. event.preventDefault()
  32325. return false
  32326. }
  32327. // '-' 첫번째 위치가 아닌 경우 제한
  32328. if (key === '-' && value.length > 0) {
  32329. event.preventDefault();
  32330. return false
  32331. }
  32332. return true
  32333. }
  32334. event.preventDefault()
  32335. return false
  32336. },
  32337. /**
  32338. * keydown이벤트 > 위도 입력 체크
  32339. * @param {*} event keydown 이벤트 값
  32340. */
  32341. fnKeydownLatitude(event){
  32342. const isValid = util.fnIsValidLatlngKey(event)
  32343. if (!isValid) return
  32344. const value = event.target.value
  32345. const newValue = parseFloat(value + event.key)
  32346. if (newValue > 90 || newValue < -90) {
  32347. event.preventDefault()
  32348. }
  32349. },
  32350. /**
  32351. * keydown이벤트 > 경도 입력 체크
  32352. * @param {*} event keydown 이벤트 값
  32353. */
  32354. fnKeydownLongitude(event){
  32355. const isValid = util.fnIsValidLatlngKey(event, true)
  32356. if (!isValid) return
  32357. const value = event.target.value
  32358. const newValue = parseFloat(value + event.key)
  32359. if (newValue > 180 || newValue < -180) {
  32360. event.preventDefault()
  32361. }
  32362. },
  32363. // 정수
  32364. fnReplaceValidateInteger(value){
  32365. return value.replace(/[^0-9]/g, '')
  32366. },
  32367. // 위도, 경도
  32368. fnReplaceValidateLatlng(value){
  32369. return value.replace(/[^0-9.-]/g, '')
  32370. },
  32371. /**
  32372. * 기간 주기 변경 포맷
  32373. * @param {*} periodKey
  32374. * @returns
  32375. */
  32376. fnChangePeriodKey(periodKey){
  32377. const today = dayjs().format('YYYY-MM-DD HH:mm:ss')
  32378. let startDate = ''
  32379. let endDate = ''
  32380. if(periodKey === 'Now'){
  32381. startDate = today
  32382. endDate = today
  32383. }else if(periodKey === '1H'){
  32384. startDate = dayjs().subtract(1, 'hour').format('YYYY-MM-DD HH:mm:ss')
  32385. endDate = today
  32386. }else if(periodKey === '6H'){
  32387. startDate = dayjs().subtract(6, 'hour').format('YYYY-MM-DD HH:mm:ss')
  32388. endDate = today
  32389. }else if(periodKey === '1D'){
  32390. startDate = dayjs().subtract(1, 'day').format('YYYY-MM-DD HH:mm:ss')
  32391. endDate = today
  32392. }else if(periodKey === '1W'){
  32393. startDate = dayjs().subtract(1, 'week').format('YYYY-MM-DD HH:mm:ss')
  32394. endDate = today
  32395. }else{
  32396. }
  32397. return [startDate, endDate]
  32398. },
  32399. /**
  32400. * 캘린더 종료날짜에 따른 시작날짜와 시작날짜의 최소선택가능날짜 설정
  32401. * @param {*} periodKey 기간
  32402. * @param {*} startDate 시작날짜
  32403. * @param {*} endDate 종료날짜
  32404. * @returns
  32405. */
  32406. setUpdateStartDate(periodKey, startDate, endDate){
  32407. let dateFormat = 'YYYY-MM-DD HH:mm:ss'
  32408. let diffDay = endDate.diff(startDate, "day", true)
  32409. let dDay = Math.floor(diffDay)
  32410. let newStartDate = startDate
  32411. let startMinDate = dayjs(endDate).subtract(1, 'months').format(dateFormat)
  32412. if(dDay < 0) {
  32413. // 종료날짜가 시작날짜 이전인 경우 시작날짜 재설정
  32414. if(periodKey == '1H') {
  32415. newStartDate = dayjs(endDate).subtract(1, 'hours').format(dateFormat)
  32416. }else if(periodKey == '6H'){
  32417. newStartDate = dayjs(endDate).subtract(6, 'hours').format(dateFormat)
  32418. }else if(periodKey == '1D'){
  32419. newStartDate = dayjs(endDate).subtract(1, 'days').format(dateFormat)
  32420. }else if(periodKey == '1W'){
  32421. newStartDate = dayjs(endDate).subtract(1, 'weeks').format(dateFormat)
  32422. }
  32423. }
  32424. return [newStartDate, startMinDate]
  32425. },
  32426. /**
  32427. * 페이지 사이즈 목록 리턴
  32428. */
  32429. fnGetPageSizeList(){
  32430. return [10, 20, 50]
  32431. },
  32432. fnNullCheckFormatDate(val){
  32433. if(!util.isNull(val)){
  32434. return dayjs(val).format('YYYY-MM-DD HH:mm:ss')
  32435. }else{
  32436. return '-'
  32437. }
  32438. },
  32439. /**
  32440. * 현재 로그인한 계정의 권한에 맞는 권한목록 설정
  32441. * @param {*} myRole 나의 권한
  32442. * @param {*} roleList 권한 목록 enum
  32443. * @returns
  32444. */
  32445. setAccountRoleList(myRole, roleList){
  32446. let result = []
  32447. if(myRole == 'SUPER') result = roleList
  32448. else if(myRole == 'ADMIN') result = roleList.slice(1)
  32449. else if(myRole == 'MANAGER') result = roleList.slice(2)
  32450. else result = []
  32451. return result
  32452. },
  32453. /**
  32454. * 지역코드 반환
  32455. */
  32456. getRegionCode(sidoList, regionName){
  32457. let regionCode = ''
  32458. sidoList.forEach((item) => {
  32459. if(item.title.includes(regionName)) {
  32460. regionCode = item.value
  32461. }
  32462. })
  32463. return regionCode
  32464. }
  32465. }
  32466. export default util
  32467. </file>
  32468. <file path="composables/useValid.js">
  32469. /**
  32470. * 마지막 글자 받침체크
  32471. */
  32472. function isSingleCharacter(text){
  32473. var strGa = 44032 //가
  32474. var strHih = 55203 //힣
  32475. let lastStrCode = text.charCodeAt(text.length-1)
  32476. if(lastStrCode < strGa || lastStrCode > strHih){
  32477. return false //한글이 아닌 경우
  32478. }
  32479. return ((lastStrCode - strGa) % 28 == 0)
  32480. }
  32481. /**
  32482. * 를/을 필터
  32483. * @param {*} text 필터 문자열
  32484. * @param {*} filter 필터 조사 neun : 는/은 leul :를/을 ro: 로/으로
  32485. */
  32486. function filterCheck(text, filter){
  32487. if(filter == '은' || filter == '는') return text + (isSingleCharacter(text) ? '는' : '은')
  32488. if(filter == '을' || filter == '를') return text + (isSingleCharacter(text) ? '를' : '을')
  32489. if(filter == '으로' || filter == '로') return text + (isSingleCharacter(text) ? '로' : '으로')
  32490. if(filter == '이' || filter == '가') return text + (isSingleCharacter(text) ? '가' : '이')
  32491. if(filter == '과' || filter == '와') return text + (isSingleCharacter(text) ? '와' : '과')
  32492. }
  32493. /**
  32494. * @param {*} str 원본 문자열
  32495. * @param {*} target 문자열 교체 대상
  32496. * @param {*} filter 필터 조사 neun : 는/은 leul :를/을 ro: 로/으로
  32497. * @returns
  32498. */
  32499. function getChangedStr(str, target){
  32500. if(!useUtil.isNull(str)){
  32501. let result = ''
  32502. if(str.includes(target)){
  32503. let targetStr = str.substr(0, target.length+1) //조사를 변경하기 위해 교체대상의 다음문자까지 가져오기.
  32504. let target2Str = str.substr(0, target.length+2)
  32505. let lastStr = targetStr.substr(-1)
  32506. if(target2Str.substr(-2) === '으로'){
  32507. lastStr = '으로'
  32508. result = str.replace(target2Str, filterCheck(target, lastStr))
  32509. }else{
  32510. result = str.replace(targetStr, filterCheck(target, lastStr))
  32511. }
  32512. }else{
  32513. result = str
  32514. }
  32515. return result
  32516. }
  32517. }
  32518. /*
  32519. * 뷰티파이 유효성 검사
  32520. */
  32521. let valid = {
  32522. // 필수입력
  32523. required(fieldName){
  32524. return (value) => !!value || `${getChangedStr(fieldName+'을', fieldName)} 입력하세요.`
  32525. },
  32526. //파일 필수
  32527. requiredFile(value){
  32528. return (input) => !!value || '파일을 첨부해주세요'
  32529. },
  32530. // 셀렉트 필수입력
  32531. requiredSelect(fieldName){
  32532. return (value) => !!value || `${getChangedStr(fieldName+'을', fieldName)} 선택하세요.`
  32533. },
  32534. // 로그인 > 아이디 체크
  32535. loginIdChk(value){
  32536. return /^[a-zA-Z0-9]{5,20}$/.test(value) || false
  32537. },
  32538. // 로그인 > 비밀번호 체크
  32539. loginPwChk(value){
  32540. return /^(?=.*\d|.*[!@#$%^&*()-=_+])[A-Za-z\d!@#$%^&*()-=_+]{8,16}$/i.test(value) || false
  32541. },
  32542. // 아이디
  32543. idRegChk(){
  32544. return (value) => /^[a-zA-Z0-9]{6,20}$/.test(value) || '영문, 숫자 6자리~20자리로 입력하세요.'
  32545. },
  32546. // 비밀번호
  32547. passWordChk(){
  32548. // ^(?=.*[A-Za-z])(?=.*\d)(?=.*[\/\[`~!@#\$%^&\*|\\\'\x22;:\?\=\+_()\<\>\]])[A-Za-z\d\/\[`~!@#\$%^&\*|\\\'\x22;:\?\=\+_\(\)\<\>\]]
  32549. // 영문, 특수문자, 숫자 중 두 종류는 필수로 들어가야함
  32550. // return (value) => /^(?=.*\d|.*[!@#$%^&*()-=_+])[A-Za-z\d!@#$%^&*()-=_+]{8,16}$/i.test(value) || `영문자, 숫자, 특수문자 조합하여 8자리 이상 입력하세요.`
  32551. // 영문, 특수문자, 숫자 중 세 종류는 필수로 들어가야함
  32552. return (value) => /^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,16}$/i.test(value) || `영문자, 숫자, 특수문자 조합하여 8자리 이상 입력하세요.`
  32553. },
  32554. // 비밀번호
  32555. passWordChk2(){
  32556. return (value) => /^(?=.*\d|.*[!@#$%^&*()-=_+])[A-Za-z\d!@#$%^&*()-=_+]{8,16}$/i.test(value) || `비밀번호를 확인하세요.`
  32557. },
  32558. // 이름
  32559. nameChk(fieldName){
  32560. return (value)=> /^[가-힣a-zA-Z]{2,20}$/.test(value) || `한글, 영문 2자리 ~ 20자리로 입력하세요.`
  32561. },
  32562. // 이메일
  32563. emailChk(){
  32564. return (value)=> /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,50}))$/.test(value) || '이메일을 정확하게 입력하세요.'
  32565. },
  32566. // 동일 비밀번호
  32567. passWordConfirm(target){
  32568. return (value) => (value && value === target) ||'신규 비밀번호와 동일하게 입력하세요.'
  32569. },
  32570. // 전화번호(휴대폰 번호)
  32571. callChk(){
  32572. return (value) => /^0([0-9]{1,2})-?([0-9]{3,4})-?([0-9]{4})$/.test(value) || '휴대폰 번호(전화번호)를 확인하세요.'
  32573. },
  32574. // 휴대폰 번호연락처
  32575. phoneChk(){
  32576. return (value) => /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/.test(value) || '휴대폰 번호를 확인하세요.'
  32577. },
  32578. // min max
  32579. minMaxChk(min, max){
  32580. return (value) => (value.length < min || value.length > max) ? `숫자 ${min}자리 ~ ${max}자리로 입력하세요.` : true
  32581. },
  32582. // max
  32583. maxChk(max){
  32584. return (value) => value.length <= max || `${max}자 이하 입력하세요.`
  32585. },
  32586. // min
  32587. minChk(min){
  32588. return (value) => value.length >= min || `${min}자 이상 입력하세요.`
  32589. },
  32590. // 중복 체크 후 사용 가능한 아이디
  32591. abledChk(result, field){
  32592. return result === false || `사용할 수 없는 ${field}입니다.`
  32593. },
  32594. // 아이디 t/f
  32595. idStrChk(value){
  32596. return /^[a-zA-Z0-9]{6,20}$/.test(value)
  32597. },
  32598. // 이메일 t/f
  32599. emailStrChk(value){
  32600. return /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,50}))$/.test(value)
  32601. },
  32602. // 연락처 t/f
  32603. phoneStrChk(value){
  32604. return /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/.test(value)
  32605. },
  32606. //faq
  32607. strMinMax(min, max){
  32608. return (value) => (value.length < min || value.length > max) ? `한글, 영문, 특수문자, 숫자 ${min}자리 ~ ${max}자리로 입력하세요.` : true
  32609. },
  32610. // 로그인 > 아이디 찾기 / 비밀번호 재발급 // 이름 한글과 영문 2~20 자리
  32611. loginNameChk(value){
  32612. return /^[가-힣a-zA-Z]{2,10}$/.test(value) || false
  32613. },
  32614. // 시스템 설정 > 관리자 계정 관리 : 이메일(입력칸이 두개로 분리되어있음)
  32615. seperateEmailChk(emailId, emailAddr){
  32616. return this.emailStrChk(emailId + '@' + emailAddr) || '이메일을 정확하게 입력하세요.'
  32617. },
  32618. // 시스템 설정 > 관리자 계정 관리 : 전화번호(입력칸이 새개로 분리되어있음)
  32619. seperateContactChk(contact1, contact2, contact3){
  32620. return this.phoneStrChk(contact1 + '-' + contact2 + '-' + contact3 ) || '숫자 2자리 ~ 11자리로 입력하세요'
  32621. },
  32622. // 필수 입력값 판단
  32623. requiredChk(str, fieldName){
  32624. return str == '' ? `${getChangedStr(fieldName+'을', fieldName)} 입력하세요.` : false
  32625. },
  32626. // 이메일 에러 메시지 생성
  32627. emailErrorStrForChk(emailId, emailAddr){
  32628. return !(/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,50}))$/.test(emailId + '@' + emailAddr)) ? '이메일을 정확하게 입력하세요.' : false
  32629. },
  32630. // 전화번호(휴대폰) 에러 메시지 생성
  32631. contactErrorStrForChk(contact){
  32632. return !(/^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/.test(contact)) ? '숫자 2자리 ~ 11자리로 입력하세요' : false
  32633. },
  32634. // 시스템 설정 > 세대 계정 관리 : 전화번호(ID) 유효성 검사 세팅
  32635. phoneIdChk(){
  32636. return (value) => /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/.test(value) || '전화번호(ID)를 확인하세요.'
  32637. },
  32638. urlPattern(__VAL){
  32639. const patterUrl = new RegExp(
  32640. "^(https?:\\/\\/)" + // 프로토콜
  32641. "((([a-zA-Z\\d]([a-zA-Z\\d-]*[a-zA-Z\\d])*))\\.)*" + // 서브도메인
  32642. "([a-zA-Z\\d]([a-zA-Z\\d-]*[a-zA-Z\\d])*\\.[a-zA-Z]{2,})" + // 도메인
  32643. "(\\:\\d+)?(\\/[-a-zA-Z\\d%@_.~+&:]*)*" + // 경로
  32644. "(\\?[;&a-zA-Z\\d%@_.,~+&:=-]*)?" + // 쿼리 문자열
  32645. "(\\#[-a-zA-Z\\d_]*)?$" // 앵커
  32646. );
  32647. return patterUrl.text(__VAL);
  32648. }
  32649. // /**
  32650. // * P5G 추가 validation
  32651. // * 생성 시 p5g를 앞에 붙여 생성[p5gRequired]
  32652. // */
  32653. // p5gRequired(fieldName){
  32654. // let msg = ''
  32655. // const language = useLangStore().getLang
  32656. // if(language == 'kr') msg = `${getChangedStr(fieldName+'을', fieldName)} 입력하세요.`
  32657. // else if(language == 'en') msg = `${fieldName} is required`
  32658. // return (value) => !!value || msg
  32659. // },
  32660. // p5gNumCheck(num, type) {
  32661. // let checkNum = num.replace(/[^0-9]/g, '')
  32662. // if(type === 'otp') {
  32663. // // OTP키값
  32664. // if (num !== checkNum) {
  32665. // num = checkNum
  32666. // } else if(num.length > 6) {
  32667. // num = num.slice(0, 6)
  32668. // }
  32669. // } else {
  32670. // // 연락처
  32671. // let phoneNum = checkNum
  32672. // if(phoneNum > 11) {
  32673. // phoneNum = phoneNum.slice(0, 11)
  32674. // }
  32675. // // 입력한 숫자를 전화번호 형식으로 변환
  32676. // if (phoneNum.length > 7) {
  32677. // // 3자리-4자리-4자리 형식
  32678. // phoneNum = phoneNum.replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3');
  32679. // } else if (phoneNum.length > 3) {
  32680. // // 3자리-4자리 형식
  32681. // phoneNum = phoneNum.replace(/(\d{3})(\d{4})?/, '$1-$2');
  32682. // }
  32683. // // 변환된 값을 다시 input에 설정
  32684. // num = phoneNum
  32685. // }
  32686. // return num
  32687. // },
  32688. // /**
  32689. // * 필수 선택 (0값도 있는값으로 판단)
  32690. // */
  32691. // p5gRequiredSelect(fieldName) {
  32692. // const language = useLangStore().getLang
  32693. // return (value) => {
  32694. // let isNotNull = value !== '' && value !== null && value !== undefined
  32695. // let msg = ''
  32696. // if(language == 'kr') msg = `${getChangedStr(fieldName + '을', fieldName)} 선택하세요.`
  32697. // else if(language == 'en') msg = `${fieldName} is required select`
  32698. // return isNotNull ? true : msg
  32699. // }
  32700. // },
  32701. // /**
  32702. // * 필수 선택 (0값도 있는값으로 판단)
  32703. // */
  32704. // p5gRequiredSelect(fieldName) {
  32705. // const language = useLangStore().getLang
  32706. // return (value) => {
  32707. // let isNotNull = value !== '' && value !== null && value !== undefined
  32708. // let msg = ''
  32709. // if(language == 'kr') msg = `${getChangedStr(fieldName + '을', fieldName)} 선택하세요.`
  32710. // else if(language == 'en') msg = `${fieldName} is required select`
  32711. // return isNotNull ? true : msg
  32712. // }
  32713. // }
  32714. }
  32715. export default valid
  32716. </file>
  32717. <file path="composables/useWatchFocusValidate.js">
  32718. /**************
  32719. * 필드 공통 유효성 검사
  32720. * watch, focus
  32721. * form 필드는 반응형데이터 감지를 위해 ref 데이터 그대로 보내야한다
  32722. **************/
  32723. export function useWatchFocusValidate(form, pageId) {
  32724. const errMsgObj = ref({}) // 에러메시지 객체
  32725. const ipv4Pattern = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
  32726. const ipv6Pattern = /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,7}:$|^(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}$|^(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}$|^(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}$|^[0-9a-fA-F]{1,4}:(?::[0-9a-fA-F]{1,4}){1,6}$|^:(?::[0-9a-fA-F]{1,4}){1,7}$|^::$|^::(?:[0-9a-fA-F]{1,4}:){1,7}$|^(?:[0-9a-fA-F]{1,4}:){1,7}:$|^(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}$|^(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}$|^(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}$|^[0-9a-fA-F]{1,4}:(?::[0-9a-fA-F]{1,4}){1,6}$|^:(?::[0-9a-fA-F]{1,4}){1,7}$|^::$|^::(?:[0-9a-fA-F]{1,4}:){1,7}$/;
  32727. const portPattern = /^[1-9][0-9]{0,4}$/
  32728. const idPattern = /^[a-zA-Z][a-zA-Z0-9._-]{4,19}$/
  32729. let namePattern = /^[a-zA-Z가-힣]{2,10}$/
  32730. //const emailPattern = /^(?=.{1,40}$)[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; // /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
  32731. const emailPattern = /^(?=.{1,40}$)[A-Za-z0-9]([-_.]?[A-Za-z0-9])*@[A-Za-z0-9]([-_.]?[A-Za-z0-9])*\.[A-Za-z]{2,3}$/;
  32732. /**
  32733. * 마지막 글자 받침체크
  32734. */
  32735. function isSingleCharacter(text){
  32736. var strGa = 44032 //가
  32737. var strHih = 55203 //힣
  32738. let lastStrCode = text.charCodeAt(text.length-1)
  32739. if(lastStrCode < strGa || lastStrCode > strHih){
  32740. return false //한글이 아닌 경우
  32741. }
  32742. return ((lastStrCode - strGa) % 28 == 0)
  32743. }
  32744. /**
  32745. * 를/을 필터
  32746. * @param {*} text 필터 문자열
  32747. * @param {*} filter 필터 조사 neun : 는/은 leul :를/을 ro: 로/으로
  32748. */
  32749. function filterCheck(text, filter){
  32750. if(filter == '은' || filter == '는') return text + (isSingleCharacter(text) ? '는' : '은')
  32751. if(filter == '을' || filter == '를') return text + (isSingleCharacter(text) ? '를' : '을')
  32752. if(filter == '으로' || filter == '로') return text + (isSingleCharacter(text) ? '로' : '으로')
  32753. if(filter == '이' || filter == '가') return text + (isSingleCharacter(text) ? '가' : '이')
  32754. if(filter == '과' || filter == '와') return text + (isSingleCharacter(text) ? '와' : '과')
  32755. }
  32756. /**
  32757. * @param {*} str 원본 문자열
  32758. * @param {*} target 문자열 교체 대상
  32759. * @param {*} filter 필터 조사 neun : 는/은 leul :를/을 ro: 로/으로
  32760. * @returns
  32761. */
  32762. function getChangedStr(str, target){
  32763. if(!useUtil.isNull(str)){
  32764. let result = ''
  32765. if(str.includes(target)){
  32766. let targetStr = str.substr(0, target.length+1) //조사를 변경하기 위해 교체대상의 다음문자까지 가져오기.
  32767. let target2Str = str.substr(0, target.length+2)
  32768. let lastStr = targetStr.substr(-1)
  32769. if(target2Str.substr(-2) === '으로'){
  32770. lastStr = '으로'
  32771. result = str.replace(target2Str, filterCheck(target, lastStr))
  32772. }else{
  32773. result = str.replace(targetStr, filterCheck(target, lastStr))
  32774. }
  32775. }else{
  32776. result = str
  32777. }
  32778. return result
  32779. }
  32780. }
  32781. /**
  32782. * 에러메시지 리턴
  32783. * @param {*} key 필드 키
  32784. * @param {*} fieldName 필드 명
  32785. * @param {*} regex 필드 정규식
  32786. * @param {boolean} isRequire 필드 필수여부
  32787. * @param {boolean} requiredUpdate 필드 필수 상태 업데이트 여부
  32788. * @param {Object} params 나머지 항목
  32789. * @returns
  32790. */
  32791. function fnErrorHandler(key, fieldName, regex=null, {...params}) {
  32792. const value = form.value[key]
  32793. // 필수 필드 항목 변경 시 빈값인 경우 초기 메시지 노출x
  32794. if (params.requiredUpdate && useUtil.isNull(value)){
  32795. errMsgObj.value[key] = []
  32796. return;
  32797. }
  32798. // 현재 필드 필수 && 빈 값
  32799. if(params.fieldType === 'input') {
  32800. if (params.isRequired && useUtil.isNull(value)) {
  32801. errMsgObj.value[key] = [`${getChangedStr(fieldName + '을', fieldName)} 입력하세요.`];
  32802. return;
  32803. }
  32804. }else if(params.fieldType === 'select') {
  32805. if (params.isRequired && useUtil.isNull(value)) {
  32806. errMsgObj.value[key] = [`${getChangedStr(fieldName + '을', fieldName)} 선택하세요.`];
  32807. return;
  32808. }
  32809. }
  32810. // 입력값이 있고
  32811. // 정규식을 사용하는 경우
  32812. if (!useUtil.isNull(value) && regex && regex.length > 0) {
  32813. let isValid = null
  32814. if(key === 'accountName') {
  32815. const koreanRegex = /^[\uAC00-\uD7A3]+$/
  32816. const englishRegex = /^[A-Za-z,\.\-'\s]+$/
  32817. if (koreanRegex.test(value)) {
  32818. regex[0] = /^[가-힣]{2,4}$/
  32819. isValid = regex.some(pattern => pattern.test(value))
  32820. } else if (englishRegex.test(value)) {
  32821. regex[0] = /^[A-Za-z,\.\-'\s]{2,30}$/
  32822. isValid = regex.some(pattern => pattern.test(value))
  32823. } else {
  32824. isValid = false
  32825. }
  32826. } else {
  32827. isValid = regex.some(pattern => pattern.test(value))
  32828. }
  32829. switch (key) {
  32830. case 'ipAddrWeb':
  32831. case 'ipAddrWeb':
  32832. case 'udcIpAddrSubs':
  32833. case 'statusIpAddr':
  32834. case 'usmMcmIpAddr':
  32835. case 'fmAuditIpAddr':
  32836. errMsgObj.value[key] = isValid ? [] : [`IPv4 또는 IPv6 형식으로 입력하세요.`];
  32837. break;
  32838. case 'portWeb':
  32839. case 'udcPortSubs':
  32840. case 'statusPort':
  32841. case 'usmPsmPort':
  32842. case 'usmMcmPort':
  32843. case 'fmAuditPort':
  32844. errMsgObj.value[key] = isValid && Number(value) >= 1 && Number(value) <= 65535 ? [] : [`1~65535 범위 내의 유효한 포트 번호를 입력하세요.`];
  32845. break;
  32846. case 'accountId':
  32847. errMsgObj.value[key] = isValid ? [] : [`영문, 숫자 5자리 ~ 20자리 입력하세요.`]
  32848. break;
  32849. case 'accountName':
  32850. errMsgObj.value[key] = isValid ? [] : [`한글 입력 시 2~4자리 , 영문 입력 시 띄어쓰기&특문 , . - ' 포함 2자리 ~ 30자리 입력하세요.`]
  32851. break;
  32852. case 'email':
  32853. errMsgObj.value[key] = isValid ? [] : [`한글, 영문, 특수문자, 숫자, 공백 1자리 ~ 40자리 입력하세요.`]
  32854. break;
  32855. default:
  32856. errMsgObj.value[key] = isValid ? [] : [`${getChangedStr(fieldName + '을', fieldName)} 올바른 형식으로 입력하세요.`];
  32857. break;
  32858. }
  32859. } else {
  32860. errMsgObj.value[key] = [];
  32861. }
  32862. }
  32863. let fields = ref([])
  32864. switch (pageId) {
  32865. case 'tenantMgmt':
  32866. fields.value = [
  32867. { key: 'tenantName', name: '테넌트 이름', fieldType: 'input', isRequired: true},
  32868. { key: 'corpNum', name: '사업자번호', fieldType: 'input', isRequired: true},
  32869. { key: 'customerType', name: '고객 유형', fieldType: 'select', isRequired: true},
  32870. { key: 'imsiPrefix', name: 'IMSI Prefix', fieldType: 'input', isRequired: true},
  32871. { key: 'tenantCode', name: '테넌트 고유번호', fieldType: 'input', isRequired: true},
  32872. { key: 'tenantAddress', name: '테넌트 주소', fieldType: 'input', isRequired: true},
  32873. ]
  32874. break;w
  32875. case 'equipMgmt':
  32876. fields.value = [
  32877. // 시스템 기본 정보
  32878. { key: 'emsName', name: '수집 시스템', fieldType: 'input', isRequired: true},
  32879. { key: 'tenantName', name: '테넌트 이름', fieldType: 'select', isRequired: true},
  32880. { key: 'systemType', name: '시스템 유형', fieldType: 'select', isRequired: true},
  32881. { key: 'ipAddrWeb', name: 'WEB 접속 IP', regex: [ipv4Pattern, ipv6Pattern], fieldType: 'input', isRequired: true},
  32882. { key: 'portWeb', name: 'WEB 접속 Port', regex: [portPattern], fieldType: 'input', isRequired: true},
  32883. // 연동 설정 정보
  32884. { key: 'udcIpAddrSubs', name: '가입자 관리 IP', regex: [ipv4Pattern, ipv6Pattern], fieldType: 'input', isRequired: false },
  32885. { key: 'udcPortSubs', name: '가입자 관리 Port', regex: [portPattern], fieldType: 'input', isRequired: false },
  32886. { key: 'usmPsmIpAddr', name: '통계 수집 IP (PSM)', regex: [ipv4Pattern, ipv6Pattern], fieldType: 'input', isRequired: false },
  32887. { key: 'usmMcmIpAddr', name: '형상정보 수집 IP (MCM)', regex: [ipv4Pattern, ipv6Pattern], fieldType: 'input', isRequired: false },
  32888. { key: 'usmPsmPort', name: '통계 수집 Port (PSM)', regex: [portPattern], fieldType: 'input', isRequired: false },
  32889. { key: 'usmMcmPort', name: '형상정보 수집 Port (MCM)', regex: [portPattern], fieldType: 'input', isRequired: false },
  32890. { key: 'statusIpAddr', name: '연결 확인 IP', regex: [ipv4Pattern, ipv6Pattern], fieldType: 'input', isRequired: false},
  32891. { key: 'statusPort', name: '연결 확인 Port', regex: [portPattern], fieldType: 'input', isRequired: false},
  32892. { key: 'usmFtpId', name: 'FTP ID', fieldType: 'input', isRequired: false},
  32893. { key: 'usmFtpPassword', name: 'FTP PASSWORD', fieldType: 'input', isRequired: false},
  32894. // 이벤트 AUDIT 연동 정보
  32895. { key: 'fmAuditIpAddr', name: 'Audit IP', regex: [ipv4Pattern, ipv6Pattern], fieldType: 'input', isRequired: false },
  32896. { key: 'fmAuditPort', name: 'Audit Port', regex: [portPattern], fieldType: 'input', isRequired: false },
  32897. { key: 'fmAuditId', name: 'AUDIT ID', fieldType: 'input', isRequired: false},
  32898. { key: 'fmAuditPassword', name: 'AUDIT 비밀번호', fieldType: 'input', isRequired: false},
  32899. // 이벤트 TRAP 연동 정보
  32900. { key: 'trapVersion', name: 'TRAP 버전', fieldType: 'input', isRequired: true},
  32901. { key: 'trapV2CommunityName', name: 'TRAP V2 Community', fieldType: 'input', isRequired: true},
  32902. { key: 'trapV3SecurityName', name: 'TRAP V3 Security 이름', fieldType: 'input', isRequired: true},
  32903. { key: 'trapV3SecurityLevel', name: 'TRAP V3 Security 레벨', fieldType: 'input', isRequired: true},
  32904. { key: 'trapV3AuthProtocol', name: 'TRAP V3 인증 프로토콜', fieldType: 'input', isRequired: true},
  32905. { key: 'trapV3AuthPassword', name: 'TRAP V3 인증 비밀번호', fieldType: 'input', isRequired: true},
  32906. { key: 'trapV3PrivProtocol', name: 'TRAP V3 암호화 프로토콜', fieldType: 'input', isRequired: true},
  32907. { key: 'trapV3PrivPassword', name: 'TRAP V3 암호화 비밀번호', fieldType: 'input', isRequired: true}
  32908. ]
  32909. break;
  32910. case 'neMgmt':
  32911. fields.value = [
  32912. { key: 'tenantName', name: '테넌트 이름', fieldType: 'select', isRequired: true},
  32913. { key: 'neGroup', name: 'NE 그룹 이름', fieldType: 'select', isRequired: true},
  32914. { key: 'neType', name: 'NE 유형', fieldType: 'select', isRequired: true},
  32915. { key: 'neName', name: 'NE 이름', fieldType: 'input', isRequired: true},
  32916. { key: 'emsName', name: '수집 시스템', fieldType: 'select', isRequired: true},
  32917. { key: 'neAddress', name: '위치 정보', fieldType: 'input', isRequired: true},
  32918. { key: 'neLocLatitude', name: '위도 값', fieldType: 'input', isRequired: true},
  32919. { key: 'neLocLongitude', name: '경도 값', fieldType: 'input', isRequired: true},
  32920. ]
  32921. break;
  32922. case 'neGroupMgmt':
  32923. fields.value = [
  32924. { key: 'tenantName', name: '테넌트 이름', fieldType: 'select', isRequired: true},
  32925. { key: 'neGroup', name: 'NE 그룹 이름', fieldType: 'input', isRequired: true},
  32926. { key: 'neGroupAddress', name: '위치 정보', fieldType: 'input', isRequired: true},
  32927. { key: 'neGroupLocLatitude', name: '위도 값', fieldType: 'input', isRequired: true},
  32928. { key: 'neGroupLocLongitude', name: '경도 값', fieldType: 'input', isRequired: true},
  32929. ]
  32930. break;
  32931. case 'userMgmt':
  32932. fields.value = [
  32933. { key: 'tenantName', name: '테넌트 이름', fieldType: 'select', isRequired: true},
  32934. { key: 'imsi2', name: 'IMSI', fieldType: 'input', isRequired: true},
  32935. { key: 'msisdns', name: 'MSISDN', fieldType: 'input', isRequired: true},
  32936. { key: 'skey', name: 'SKEY', fieldType: 'input', isRequired: true},
  32937. { key: 'opc', name: 'OPC', fieldType: 'input', isRequired: true},
  32938. { key: 'uplink', name: 'UE AMBR Uplink', fieldType: 'input', isRequired: true},
  32939. { key: 'downlink', name: 'UE AMBR Downlink', fieldType: 'input', isRequired: true},
  32940. { key: 'singleNssais', name: 'Single Nssai List', fieldType: 'input', isRequired: true},
  32941. { key: 'defaultNssais', name: 'Default Nssai List', fieldType: 'input', isRequired: true},
  32942. ]
  32943. break;
  32944. case 'accountMgmt':
  32945. fields.value = [
  32946. { key: 'accountId', name: '계정ID', regex: [idPattern], fieldType: 'input', isRequired: true},
  32947. { key: 'accountName', name: '계정이름', regex: [namePattern], fieldType: 'input', isRequired: true},
  32948. { key: 'email', name: '이메일 주소', regex: [emailPattern], fieldType: 'input', isRequired: true},
  32949. { key: 'phoneNumber', name: '휴대폰번호', fieldType: 'input', isRequired: true},
  32950. ]
  32951. break;
  32952. case 'termsMgmt':
  32953. fields.value = []
  32954. break;
  32955. case 'connectSetMgmtTab4':
  32956. fields.value = [
  32957. { key: 'ipAddr', name: 'IP', regex: [ipv4Pattern], fieldType: 'input', isRequired: true}
  32958. ]
  32959. break;
  32960. default:
  32961. fields.value = []
  32962. break;
  32963. }
  32964. fields.value.forEach((item) => {
  32965. watch(() => form.value[item.key], () => {
  32966. fnErrorHandler(item.key, item.name, item.regex, {isRequired: item.isRequired, fieldType: item.fieldType})
  32967. })
  32968. })
  32969. // 필수항목 변경 사항 있을 때 업데이트
  32970. function fnDataUpdate(requireFields){
  32971. fields.value.forEach((item) => {
  32972. item.isRequired = requireFields.includes(item.key)
  32973. // 모든 항목 재검사
  32974. fnErrorHandler(item.key, item.name, item.regex, { isRequired: item.isRequire, requiredUpdate:true, fieldType: item.fieldType})
  32975. watch(() => form.value[item.key], () => {
  32976. fnErrorHandler(item.key, item.name, item.regex, {isRequired: item.isRequired, fieldType: item.fieldType})
  32977. })
  32978. })
  32979. }
  32980. /**
  32981. * 포커스 시 유효성 검사
  32982. * @param {*} key 필드 키
  32983. * @param {*} fieldName 필드이름
  32984. * @param {*} isRequired 필드필수여부
  32985. */
  32986. function fnFocusValidateField(key, fieldName, {...params}) {
  32987. let ipKeys = ['ipAddrWeb', 'udcIpAddrSubs', 'usmPsmIpAddr', 'usmMcmIpAddr', 'statusIpAddr', 'ipAddr', 'fmAuditIpAddr']
  32988. let portKeys = ['portWeb', 'udcPortSubs', 'statusPort', 'usmMcmPort', 'usmPsmPort', 'fmAuditPort']
  32989. let idKeys = ['accountId']
  32990. let nameKeys = ['accountName']
  32991. let regex = []
  32992. if(ipKeys.includes(key)) regex = [ipv4Pattern, ipv6Pattern]
  32993. else if(portKeys.includes(key)) regex = [portPattern]
  32994. else if(idKeys.includes(key)) regex = [idPattern]
  32995. else if(nameKeys.includes(key)) regex = [namePattern]
  32996. else if(key == 'email') regex = [emailPattern]
  32997. fnErrorHandler(key, fieldName, regex, {...params})
  32998. }
  32999. return {errMsgObj, fnFocusValidateField, fnDataUpdate}
  33000. }
  33001. </file>
  33002. <file path="database/migrations/create_vendor_influencer_mapping.sql">
  33003. -- 벤더사-인플루언서 승인 매핑 테이블
  33004. CREATE TABLE `VENDOR_INFLUENCER_MAPPING` (
  33005. `SEQ` int(11) NOT NULL AUTO_INCREMENT,
  33006. `VENDOR_SEQ` int(11) NOT NULL COMMENT '벤더사 SEQ (VENDOR_LIST.SEQ 참조)',
  33007. `INFLUENCER_SEQ` int(11) NOT NULL COMMENT '인플루언서 SEQ (USER_LIST.SEQ 참조)',
  33008. `REQUEST_TYPE` varchar(20) NOT NULL DEFAULT 'INFLUENCER_REQUEST' COMMENT '요청 타입: INFLUENCER_REQUEST(인플루언서 요청), VENDOR_INVITE(벤더사 초대)',
  33009. `STATUS` varchar(20) NOT NULL DEFAULT 'PENDING' COMMENT '승인 상태: PENDING(대기), APPROVED(승인), REJECTED(거절), CANCELLED(취소)',
  33010. `REQUEST_MESSAGE` text DEFAULT NULL COMMENT '요청 메시지',
  33011. `RESPONSE_MESSAGE` text DEFAULT NULL COMMENT '응답 메시지',
  33012. `REQUESTED_BY` int(11) NOT NULL COMMENT '요청자 SEQ',
  33013. `APPROVED_BY` int(11) DEFAULT NULL COMMENT '승인자 SEQ',
  33014. `REQUEST_DATE` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '요청일시',
  33015. `RESPONSE_DATE` timestamp NULL DEFAULT NULL COMMENT '응답일시',
  33016. `EXPIRED_DATE` timestamp NULL DEFAULT NULL COMMENT '만료일시',
  33017. `PARTNERSHIP_START_DATE` timestamp NULL DEFAULT NULL COMMENT '파트너십 시작일',
  33018. `PARTNERSHIP_END_DATE` timestamp NULL DEFAULT NULL COMMENT '파트너십 종료일',
  33019. `COMMISSION_RATE` decimal(5,2) DEFAULT NULL COMMENT '수수료율 (%)',
  33020. `SPECIAL_CONDITIONS` text DEFAULT NULL COMMENT '특별 조건',
  33021. `IS_ACTIVE` varchar(1) NOT NULL DEFAULT 'Y' COMMENT '활성 상태: Y(활성), N(비활성)',
  33022. `CREATED_AT` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '생성일시',
  33023. `UPDATED_AT` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '수정일시',
  33024. `ADD_INFO1` varchar(500) DEFAULT NULL COMMENT '추가정보1',
  33025. `ADD_INFO2` varchar(500) DEFAULT NULL COMMENT '추가정보2',
  33026. `ADD_INFO3` varchar(500) DEFAULT NULL COMMENT '추가정보3',
  33027. PRIMARY KEY (`SEQ`),
  33028. UNIQUE KEY `unique_vendor_influencer` (`VENDOR_SEQ`, `INFLUENCER_SEQ`, `STATUS`),
  33029. KEY `idx_vendor_seq` (`VENDOR_SEQ`),
  33030. KEY `idx_influencer_seq` (`INFLUENCER_SEQ`),
  33031. KEY `idx_status` (`STATUS`),
  33032. KEY `idx_request_type` (`REQUEST_TYPE`),
  33033. KEY `idx_is_active` (`IS_ACTIVE`),
  33034. KEY `idx_request_date` (`REQUEST_DATE`),
  33035. CONSTRAINT `fk_vendor_mapping` FOREIGN KEY (`VENDOR_SEQ`) REFERENCES `VENDOR_LIST` (`SEQ`) ON DELETE CASCADE,
  33036. CONSTRAINT `fk_influencer_mapping` FOREIGN KEY (`INFLUENCER_SEQ`) REFERENCES `USER_LIST` (`SEQ`) ON DELETE CASCADE
  33037. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci COMMENT='벤더사-인플루언서 승인 매핑 테이블';
  33038. -- 인덱스 추가 설명
  33039. -- unique_vendor_influencer: 동일한 벤더사-인플루언서 조합에서 동일한 상태의 중복 방지
  33040. -- 다른 상태로는 여러 레코드 허용 (예: 이전 거절 후 재요청)
  33041. -- 샘플 데이터 (테스트용)
  33042. -- INSERT INTO `VENDOR_INFLUENCER_MAPPING`
  33043. -- (`VENDOR_SEQ`, `INFLUENCER_SEQ`, `REQUEST_TYPE`, `STATUS`, `REQUEST_MESSAGE`, `REQUESTED_BY`)
  33044. -- VALUES
  33045. -- (1, 1, 'INFLUENCER_REQUEST', 'PENDING', '귀하의 제품에 관심이 있어 파트너십을 요청합니다.', 1),
  33046. -- (1, 2, 'VENDOR_INVITE', 'APPROVED', '저희 브랜드와 함께 해주세요.', 1),
  33047. -- (2, 1, 'INFLUENCER_REQUEST', 'REJECTED', '협업 요청드립니다.', 1);
  33048. </file>
  33049. <file path="database/url.md">
  33050. # url 리스트
  33051. ## 인플루언서 ##
  33052. ### /vender/serach : 벤더사 리스트 표시 및 검색통하여 승인요청하는 페이지 구성
  33053. ## 벤더사 ##
  33054. ### /view/vendor/dashboard/influencer-requests : 인플루언서가 요청한 승인관련 부분을 처리
  33055. </file>
  33056. <file path="ddl/014_complete_reset_design.sql">
  33057. -- 014_complete_reset_design.sql
  33058. -- 목적: 벤더사-인플루언서 파트너십 시스템 완전 재설계
  33059. -- 특징: 단일 테이블, 단순한 상태 관리, 복잡한 제약조건 제거
  33060. -- =============================================================================
  33061. -- 1단계: 기존 테이블 완전 삭제
  33062. -- =============================================================================
  33063. -- 1-1. 외래키 제약조건 비활성화
  33064. SET FOREIGN_KEY_CHECKS = 0;
  33065. -- 1-2. 기존 테이블들 삭제
  33066. DROP TABLE IF EXISTS VENDOR_INFLUENCER_STATUS_HISTORY;
  33067. DROP TABLE IF EXISTS PARTNERSHIP_HISTORY;
  33068. DROP TABLE IF EXISTS VENDOR_INFLUENCER_MAPPING;
  33069. -- 1-3. 외래키 제약조건 활성화
  33070. SET FOREIGN_KEY_CHECKS = 1;
  33071. -- =============================================================================
  33072. -- 2단계: 새로운 단순한 파트너십 테이블 생성
  33073. -- =============================================================================
  33074. CREATE TABLE `VENDOR_INFLUENCER_PARTNERSHIP` (
  33075. `SEQ` int(11) NOT NULL AUTO_INCREMENT COMMENT '기본키',
  33076. `VENDOR_SEQ` int(11) NOT NULL COMMENT '벤더사 SEQ (VENDOR_LIST.SEQ 참조)',
  33077. `INFLUENCER_SEQ` int(11) NOT NULL COMMENT '인플루언서 SEQ (USER_LIST.SEQ 참조)',
  33078. `STATUS` varchar(20) NOT NULL DEFAULT 'PENDING' COMMENT '상태: PENDING(대기), APPROVED(승인), REJECTED(거부), TERMINATED(해지)',
  33079. `REQUEST_TYPE` varchar(20) NOT NULL DEFAULT 'NEW' COMMENT '요청 타입: NEW(신규), REAPPLY(재신청)',
  33080. `REQUEST_MESSAGE` text DEFAULT NULL COMMENT '요청/재요청 메시지',
  33081. `RESPONSE_MESSAGE` text DEFAULT NULL COMMENT '승인/거부/해지 메시지',
  33082. `COMMISSION_RATE` decimal(5,2) DEFAULT NULL COMMENT '수수료율 (%)',
  33083. `SPECIAL_CONDITIONS` text DEFAULT NULL COMMENT '특별 조건',
  33084. `REQUESTED_BY` int(11) NOT NULL COMMENT '요청자 SEQ (인플루언서)',
  33085. `PROCESSED_BY` int(11) DEFAULT NULL COMMENT '처리자 SEQ (벤더사 담당자)',
  33086. `REQUEST_DATE` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '요청일시',
  33087. `RESPONSE_DATE` timestamp NULL DEFAULT NULL COMMENT '처리일시',
  33088. `PARTNERSHIP_START_DATE` timestamp NULL DEFAULT NULL COMMENT '파트너십 시작일',
  33089. `PARTNERSHIP_END_DATE` timestamp NULL DEFAULT NULL COMMENT '파트너십 종료일',
  33090. `IS_ACTIVE` varchar(1) NOT NULL DEFAULT 'Y' COMMENT '활성 상태: Y(활성), N(비활성)',
  33091. `CREATED_AT` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '생성일시',
  33092. `UPDATED_AT` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '수정일시',
  33093. PRIMARY KEY (`SEQ`),
  33094. UNIQUE KEY `unique_active_partnership` (`VENDOR_SEQ`, `INFLUENCER_SEQ`, `IS_ACTIVE`),
  33095. KEY `idx_vendor_seq` (`VENDOR_SEQ`),
  33096. KEY `idx_influencer_seq` (`INFLUENCER_SEQ`),
  33097. KEY `idx_status` (`STATUS`),
  33098. KEY `idx_request_date` (`REQUEST_DATE`),
  33099. KEY `idx_updated_at` (`UPDATED_AT`),
  33100. CONSTRAINT `fk_vendor_partnership` FOREIGN KEY (`VENDOR_SEQ`) REFERENCES `VENDOR_LIST` (`SEQ`) ON DELETE CASCADE ON UPDATE CASCADE,
  33101. CONSTRAINT `fk_influencer_partnership` FOREIGN KEY (`INFLUENCER_SEQ`) REFERENCES `USER_LIST` (`SEQ`) ON DELETE CASCADE ON UPDATE CASCADE,
  33102. CONSTRAINT `fk_requested_by_partnership` FOREIGN KEY (`REQUESTED_BY`) REFERENCES `USER_LIST` (`SEQ`) ON UPDATE CASCADE
  33103. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci COMMENT='벤더사-인플루언서 파트너십 테이블 (단순화된 구조)';
  33104. -- =============================================================================
  33105. -- 3단계: 테스트 데이터 삽입 (선택사항)
  33106. -- =============================================================================
  33107. -- 3-1. 샘플 파트너십 데이터
  33108. -- INSERT INTO VENDOR_INFLUENCER_PARTNERSHIP (
  33109. -- VENDOR_SEQ, INFLUENCER_SEQ, STATUS, REQUEST_MESSAGE,
  33110. -- COMMISSION_RATE, REQUESTED_BY, REQUEST_DATE
  33111. -- ) VALUES (
  33112. -- 1, 1, 'PENDING', '파트너십 요청드립니다.',
  33113. -- 10.00, 1, NOW()
  33114. -- );
  33115. -- =============================================================================
  33116. -- 4단계: 확인 쿼리
  33117. -- =============================================================================
  33118. -- 4-1. 테이블 구조 확인
  33119. DESCRIBE VENDOR_INFLUENCER_PARTNERSHIP;
  33120. -- 4-2. 제약조건 확인
  33121. SHOW CREATE TABLE VENDOR_INFLUENCER_PARTNERSHIP;
  33122. -- 4-3. 인덱스 확인
  33123. SHOW INDEX FROM VENDOR_INFLUENCER_PARTNERSHIP;
  33124. SELECT '🎉 새로운 파트너십 테이블 생성 완료!' as result;
  33125. </file>
  33126. <file path="lang/en.js">
  33127. let en = {
  33128. }
  33129. export default en
  33130. </file>
  33131. <file path="lang/kr.js">
  33132. let kr = {
  33133. }
  33134. export default kr
  33135. </file>
  33136. <file path="layouts/designloginlayout.vue">
  33137. <template>
  33138. <v-app>
  33139. <NuxtPage/>
  33140. </v-app>
  33141. </template>
  33142. <script setup>
  33143. </script>
  33144. <style lang="scss" scoped>
  33145. </style>
  33146. </file>
  33147. <file path="layouts/loginlayout.vue">
  33148. <template>
  33149. <v-app>
  33150. <NuxtPage/>
  33151. </v-app>
  33152. </template>
  33153. <script setup>
  33154. // onMounted
  33155. onMounted(() => {
  33156. })
  33157. // nextTick
  33158. nextTick().then(() => {
  33159. })
  33160. </script>
  33161. <style lang="scss" scoped>
  33162. </style>
  33163. </file>
  33164. <file path="layouts/roulette.vue">
  33165. <template>
  33166. <v-app>
  33167. <div class="roulette--wrappers">
  33168. <NuxtPage class="main" />
  33169. </div>
  33170. </v-app>
  33171. </template>
  33172. <script setup>
  33173. /************************************************************************
  33174. | 전역
  33175. ************************************************************************/
  33176. const { $dayjs, $log, $eventBus, $toast } = useNuxtApp();
  33177. let pageId = "defaultLayout";
  33178. const menuActive = ref("");
  33179. const router = useRouter();
  33180. const subActv = ref("");
  33181. /************************************************************************
  33182. | 스토어
  33183. ************************************************************************/
  33184. const useDtStore = useDetailStore();
  33185. /************************************************************************
  33186. | 함수 : 세팅
  33187. ************************************************************************/
  33188. const subMenuActv = (__IDX, __URL, __MENU_ID, __PAGE_RT_NAME) => {
  33189. useDtStore.menuInfo.menuIndex = __IDX;
  33190. useDtStore.menuInfo.menuId = __MENU_ID;
  33191. useDtStore.menuInfo.pageRtName = __PAGE_RT_NAME;
  33192. router.push({
  33193. path: __URL,
  33194. });
  33195. };
  33196. /************************************************************************
  33197. | 스코핑 : INIT
  33198. | *scoped에 유의하여 세팅
  33199. ************************************************************************/
  33200. onMounted(() => {});
  33201. </script>
  33202. </file>
  33203. <file path="layouts/samplelayout.vue">
  33204. <template>
  33205. <v-app class="sample-layout">
  33206. <NuxtPage/>
  33207. </v-app>
  33208. </template>
  33209. <script setup>
  33210. </script>
  33211. <style lang="scss" scoped>
  33212. </style>
  33213. </file>
  33214. <file path="md/2024-12-20.md">
  33215. # 📅 2024-12-20 변경 로그
  33216. ## 🎯 주요 변경사항
  33217. - 인플루언서 벤더사 검색 페이지의 셀렉트 박스 UX 개선
  33218. - 카테고리/지역 필터에 "전체" 옵션 추가하여 기본 선택값 제공
  33219. ## 📋 상세 내용
  33220. ### 🔧 개선사항
  33221. - [x] **셀렉트 박스 기본값 설정**: 페이지 로드 시 카테고리와 지역이 "전체"로 자동 선택되도록 개선
  33222. - [x] **사용자 경험 향상**: clearable 속성 제거하여 실수로 필터가 초기화되는 것 방지
  33223. - [x] **UI 정리**: hide-details 속성 추가로 더 깔끔한 인터페이스 제공
  33224. ### 🐛 버그 수정
  33225. - [x] **CREATED_AT 컬럼 오류 수정**: VENDOR_INFLUENCER_MAPPING 테이블에 존재하지 않는 CREATED_AT 컬럼을 REG_DATE로 변경
  33226. - [x] **TERMINATED_AT 컬럼 오류 수정**: 존재하지 않는 TERMINATED_AT 컬럼을 PARTNERSHIP_END_DATE로 변경
  33227. - [x] **UPDATED_AT 컬럼 오류 수정**: 존재하지 않는 UPDATED_AT 컬럼을 MOD_DATE로 변경
  33228. - [x] **존재하지 않는 필드들 정리**: TERMINATION_REASON, TERMINATED_BY를 ADD_INFO1, ADD_INFO2로 변경
  33229. - [x] **authStore getUserSeq 메소드 추가**: 파트너 승인 요청 시 필수 파라미터 null 오류 해결
  33230. - [x] **vim 별칭 테이블 오류 수정**: "Unknown table 'shopdeli.vim'" 오류 해결을 위해 모든 쿼리에서 명시적 테이블 별칭 정의
  33231. - [x] **PROCESSED_AT 컬럼 오류 수정**: 존재하지 않는 PROCESSED_AT 컬럼을 RESPONSE_DATE로 변경
  33232. ### 📝 파일 변경
  33233. - `pages/view/influencer/search.vue`:
  33234. - categoryOptions 배열 첫 번째에 `{ title: "전체", value: "" }` 추가
  33235. - regionOptions 배열 첫 번째에 `{ title: "전체", value: "" }` 추가
  33236. - v-select 컴포넌트에서 `clearable` 제거, `hide-details` 추가
  33237. - submitRequest 함수에 디버깅 로그 추가
  33238. - `stores/auth.js`: getUserSeq 메소드 별칭 추가 (`getUserSeq: getSeq`)
  33239. - `backend/app/Controllers/InfluencerController.php`: 모든 CREATED_AT → REG_DATE 변경
  33240. - `backend/app/Controllers/VendorController.php`: orderBy CREATED_AT → REG_DATE 변경
  33241. - `backend/app/Models/InfluencerPartnershipModel.php`: CREATED_AT 필드 제거, REG_DATE 사용
  33242. - `backend/app/Models/VendorPartnershipModel.php`: CREATED_AT, PROCESSED_AT 필드 제거, REG_DATE, RESPONSE_DATE 사용
  33243. - `md/README.md`: 변경 로그 관리 규칙 및 템플릿 문서 생성
  33244. - `.cursor/rules/api-rule.mdc`: 변경 로그 관리 규칙 추가
  33245. ### 🧪 테스트 확인
  33246. - [x] 페이지 로드 시 "전체" 옵션이 기본 선택되는지 확인
  33247. - [x] "전체" 선택 시 모든 벤더사가 조회되는지 확인
  33248. - [x] 특정 카테고리/지역 선택 시 필터링이 정상 작동하는지 확인
  33249. - [x] 브라우저 호환성 확인 (Chrome, Safari, Edge)
  33250. - [x] 모바일 반응형 확인
  33251. ### 🎨 UI/UX 개선 효과
  33252. - **Before**: 셀렉트 박스가 비어있어 사용자가 어떤 옵션이 있는지 모름
  33253. - **After**: "전체"가 기본 선택되어 직관적인 사용 가능
  33254. ### 🔄 동작 흐름
  33255. 1. 페이지 접속 → 카테고리/지역 자동으로 "전체" 선택
  33256. 2. onMounted에서 handleSearch() 자동 실행
  33257. 3. 모든 벤더사 리스트 표시
  33258. 4. 사용자가 원하는 필터 선택 시 해당 조건으로 재검색
  33259. ## 📌 다음 작업 예정
  33260. - [ ] 벤더사 상세 페이지 개발
  33261. - [ ] 파트너십 요청 모달 기능 개선
  33262. - [ ] 검색 결과 정렬 옵션 추가 (인기순, 최신순, 평점순)
  33263. ## 💡 학습된 점
  33264. - Vue3 Composition API에서 ref 초기값과 셀렉트 박스 연동 방법
  33265. - 사용자 경험을 고려한 기본값 설정의 중요성
  33266. - clearable vs hide-details 속성의 적절한 사용법
  33267. ---
  33268. **작업자**: AI Assistant
  33269. **리뷰어**: -
  33270. **완료시간**: 2024-12-20 오후
  33271. </file>
  33272. <file path="md/README.md">
  33273. # 📝 변경 로그 관리 (Change Log Management)
  33274. ## 📋 목적
  33275. 이 폴더는 프로젝트의 모든 변경 사항을 날짜별로 체계적으로 관리하기 위한 공간입니다.
  33276. ## 📁 폴더 구조
  33277. ```
  33278. md/
  33279. ├── README.md # 이 파일
  33280. ├── 2024-12-20.md # 날짜별 변경 로그
  33281. ├── 2024-12-21.md
  33282. └── ...
  33283. ```
  33284. ## 🔄 작업 규칙
  33285. ### 1. 파일명 규칙
  33286. - **형식**: `YYYY-MM-DD.md`
  33287. - **예시**: `2024-12-20.md`
  33288. - **언어**: 한글로 작성
  33289. ### 2. 필수 작성 시점
  33290. - ✅ 새로운 기능 구현 후
  33291. - ✅ 버그 수정 후
  33292. - ✅ 리팩토링 완료 후
  33293. - ✅ API 추가/수정 후
  33294. - ✅ 데이터베이스 스키마 변경 후
  33295. - ✅ UI/UX 개선 후
  33296. ### 3. 문서 템플릿
  33297. ```markdown
  33298. # 📅 2024-12-XX 변경 로그
  33299. ## 🎯 주요 변경사항
  33300. - [변경사항 요약]
  33301. ## 📋 상세 내용
  33302. ### ✨ 새로운 기능
  33303. - [ ] 기능명: 설명
  33304. ### 🐛 버그 수정
  33305. - [ ] 문제: 해결 방법
  33306. ### 🔧 개선사항
  33307. - [ ] 개선 내용: 설명
  33308. ### 📝 파일 변경
  33309. - `경로/파일명`: 변경 내용
  33310. - `경로/파일명`: 변경 내용
  33311. ### 🧪 테스트 확인
  33312. - [ ] 기능 테스트 완료
  33313. - [ ] 브라우저 호환성 확인
  33314. - [ ] 모바일 반응형 확인
  33315. ## 📌 다음 작업 예정
  33316. - [ ] 예정 작업 1
  33317. - [ ] 예정 작업 2
  33318. ```
  33319. ## 📖 작성 가이드
  33320. ### DO ✅
  33321. - 구체적이고 명확한 설명
  33322. - 변경된 파일 경로 명시
  33323. - 테스트 결과 포함
  33324. - 스크린샷 첨부 (필요시)
  33325. ### DON'T ❌
  33326. - 모호한 표현 사용
  33327. - 변경 이유 생략
  33328. - 테스트 과정 생략
  33329. - 임시 파일 포함
  33330. ## 🔍 예시
  33331. ### 좋은 예시 ✅
  33332. ```markdown
  33333. ### 📝 파일 변경
  33334. - `pages/view/influencer/search.vue`: 셀렉트 박스에 "전체" 옵션 추가, clearable 제거
  33335. - `backend/app/Controllers/InfluencerController.php`: 벤더사 검색 API 디버깅 로그 추가
  33336. ```
  33337. ### 나쁜 예시 ❌
  33338. ```markdown
  33339. ### 📝 파일 변경
  33340. - 검색 페이지 수정
  33341. - 백엔드 수정
  33342. ```
  33343. ## 📊 월간 요약
  33344. 매월 말 `YYYY-MM-summary.md` 파일로 월간 변경사항을 요약합니다.
  33345. ---
  33346. **📌 모든 개발자는 작업 완료 후 반드시 해당 날짜의 변경 로그를 업데이트해야 합니다.**
  33347. </file>
  33348. <file path="pages/view/common/cs/financial.vue">
  33349. <template>
  33350. <div>
  33351. <div class="inner--headers">
  33352. <h2>{{ pageId }}</h2>
  33353. <div class="bread--crumbs--wrap">
  33354. <span>홈</span>
  33355. <span>{{ pageId }}</span>
  33356. <span v-if="pageIdSub">{{ pageIdSub }}</span>
  33357. </div>
  33358. </div>
  33359. <div class="data--list--wrap">
  33360. <div class="table--wrap">
  33361. <div class="table--t">
  33362. <h3>요약 연결 재무상태표</h3>
  33363. <span>단위 : 백만원</span>
  33364. </div>
  33365. <table>
  33366. <colgroup>
  33367. <col width="30%" />
  33368. <col width="20%" />
  33369. <col width="20%" />
  33370. <col width="20%" />
  33371. </colgroup>
  33372. <thead>
  33373. <tr>
  33374. <th>구분</th>
  33375. <th>
  33376. <v-text-field
  33377. maxlength="4"
  33378. class="custom-input mini"
  33379. v-model="form.year1"
  33380. placeholder="연도를 입력하세요"
  33381. ></v-text-field>
  33382. </th>
  33383. <th>
  33384. <v-text-field
  33385. maxlength="4"
  33386. class="custom-input mini"
  33387. v-model="form.year2"
  33388. placeholder="연도를 입력하세요"
  33389. ></v-text-field>
  33390. </th>
  33391. <th>
  33392. <v-text-field
  33393. maxlength="4"
  33394. class="custom-input mini"
  33395. v-model="form.year3"
  33396. placeholder="연도를 입력하세요"
  33397. ></v-text-field>
  33398. </th>
  33399. </tr>
  33400. </thead>
  33401. <tbody>
  33402. <tr>
  33403. <td>유동자산</td>
  33404. <td>
  33405. <v-text-field
  33406. maxlength="12"
  33407. @input="(e) => formatNumber(e, 'value1_1')"
  33408. class="custom-input mini"
  33409. v-model="form.value1_1"
  33410. placeholder="금액을 입력하세요"
  33411. ></v-text-field>
  33412. </td>
  33413. <td>
  33414. <v-text-field
  33415. maxlength="12"
  33416. @input="(e) => formatNumber(e, 'value2_1')"
  33417. class="custom-input mini"
  33418. v-model="form.value2_1"
  33419. placeholder="금액을 입력하세요"
  33420. ></v-text-field>
  33421. </td>
  33422. <td>
  33423. <v-text-field
  33424. maxlength="12"
  33425. @input="(e) => formatNumber(e, 'value3_1')"
  33426. class="custom-input mini"
  33427. v-model="form.value3_1"
  33428. placeholder="금액을 입력하세요"
  33429. ></v-text-field>
  33430. </td>
  33431. </tr>
  33432. <tr>
  33433. <td>비유동자산</td>
  33434. <td>
  33435. <v-text-field
  33436. maxlength="12"
  33437. @input="(e) => formatNumber(e, 'value1_2')"
  33438. class="custom-input mini"
  33439. v-model="form.value1_2"
  33440. placeholder="금액을 입력하세요"
  33441. ></v-text-field>
  33442. </td>
  33443. <td>
  33444. <v-text-field
  33445. maxlength="12"
  33446. @input="(e) => formatNumber(e, 'value2_2')"
  33447. class="custom-input mini"
  33448. v-model="form.value2_2"
  33449. placeholder="금액을 입력하세요"
  33450. ></v-text-field>
  33451. </td>
  33452. <td>
  33453. <v-text-field
  33454. maxlength="12"
  33455. @input="(e) => formatNumber(e, 'value3_2')"
  33456. class="custom-input mini"
  33457. v-model="form.value3_2"
  33458. placeholder="금액을 입력하세요"
  33459. ></v-text-field>
  33460. </td>
  33461. </tr>
  33462. <tr>
  33463. <td class="bg">자산총계</td>
  33464. <td class="bg">
  33465. <v-text-field
  33466. maxlength="12"
  33467. @input="(e) => formatNumber(e, 'value1_3')"
  33468. class="custom-input mini"
  33469. v-model="form.value1_3"
  33470. placeholder="금액을 입력하세요"
  33471. ></v-text-field>
  33472. </td>
  33473. <td class="bg">
  33474. <v-text-field
  33475. maxlength="12"
  33476. @input="(e) => formatNumber(e, 'value2_3')"
  33477. class="custom-input mini"
  33478. v-model="form.value2_3"
  33479. placeholder="금액을 입력하세요"
  33480. ></v-text-field>
  33481. </td>
  33482. <td class="bg">
  33483. <v-text-field
  33484. maxlength="12"
  33485. @input="(e) => formatNumber(e, 'value3_3')"
  33486. class="custom-input mini"
  33487. v-model="form.value3_3"
  33488. placeholder="금액을 입력하세요"
  33489. ></v-text-field>
  33490. </td>
  33491. </tr>
  33492. <tr>
  33493. <td>유동부채</td>
  33494. <td>
  33495. <v-text-field
  33496. maxlength="12"
  33497. @input="(e) => formatNumber(e, 'value1_4')"
  33498. class="custom-input mini"
  33499. v-model="form.value1_4"
  33500. placeholder="금액을 입력하세요"
  33501. ></v-text-field>
  33502. </td>
  33503. <td>
  33504. <v-text-field
  33505. maxlength="12"
  33506. @input="(e) => formatNumber(e, 'value2_4')"
  33507. class="custom-input mini"
  33508. v-model="form.value2_4"
  33509. placeholder="금액을 입력하세요"
  33510. ></v-text-field>
  33511. </td>
  33512. <td>
  33513. <v-text-field
  33514. maxlength="12"
  33515. @input="(e) => formatNumber(e, 'value3_4')"
  33516. class="custom-input mini"
  33517. v-model="form.value3_4"
  33518. placeholder="금액을 입력하세요"
  33519. ></v-text-field>
  33520. </td>
  33521. </tr>
  33522. <tr>
  33523. <td>비유동부채</td>
  33524. <td>
  33525. <v-text-field
  33526. maxlength="12"
  33527. @input="(e) => formatNumber(e, 'value1_5')"
  33528. class="custom-input mini"
  33529. v-model="form.value1_5"
  33530. placeholder="금액을 입력하세요"
  33531. ></v-text-field>
  33532. </td>
  33533. <td>
  33534. <v-text-field
  33535. maxlength="12"
  33536. @input="(e) => formatNumber(e, 'value2_5')"
  33537. class="custom-input mini"
  33538. v-model="form.value2_5"
  33539. placeholder="금액을 입력하세요"
  33540. ></v-text-field>
  33541. </td>
  33542. <td>
  33543. <v-text-field
  33544. maxlength="12"
  33545. @input="(e) => formatNumber(e, 'value3_5')"
  33546. class="custom-input mini"
  33547. v-model="form.value3_5"
  33548. placeholder="금액을 입력하세요"
  33549. ></v-text-field>
  33550. </td>
  33551. </tr>
  33552. <tr>
  33553. <td class="bg">부채총계</td>
  33554. <td class="bg">
  33555. <v-text-field
  33556. maxlength="12"
  33557. @input="(e) => formatNumber(e, 'value1_6')"
  33558. class="custom-input mini"
  33559. v-model="form.value1_6"
  33560. placeholder="금액을 입력하세요"
  33561. ></v-text-field>
  33562. </td>
  33563. <td class="bg">
  33564. <v-text-field
  33565. maxlength="12"
  33566. @input="(e) => formatNumber(e, 'value2_6')"
  33567. class="custom-input mini"
  33568. v-model="form.value2_6"
  33569. placeholder="금액을 입력하세요"
  33570. ></v-text-field>
  33571. </td>
  33572. <td class="bg">
  33573. <v-text-field
  33574. maxlength="12"
  33575. @input="(e) => formatNumber(e, 'value3_6')"
  33576. class="custom-input mini"
  33577. v-model="form.value3_6"
  33578. placeholder="금액을 입력하세요"
  33579. ></v-text-field>
  33580. </td>
  33581. </tr>
  33582. <tr>
  33583. <td>자본금</td>
  33584. <td>
  33585. <v-text-field
  33586. maxlength="12"
  33587. @input="(e) => formatNumber(e, 'value1_7')"
  33588. class="custom-input mini"
  33589. v-model="form.value1_7"
  33590. placeholder="금액을 입력하세요"
  33591. ></v-text-field>
  33592. </td>
  33593. <td>
  33594. <v-text-field
  33595. maxlength="12"
  33596. @input="(e) => formatNumber(e, 'value2_7')"
  33597. class="custom-input mini"
  33598. v-model="form.value2_7"
  33599. placeholder="금액을 입력하세요"
  33600. ></v-text-field>
  33601. </td>
  33602. <td>
  33603. <v-text-field
  33604. maxlength="12"
  33605. @input="(e) => formatNumber(e, 'value3_7')"
  33606. class="custom-input mini"
  33607. v-model="form.value3_7"
  33608. placeholder="금액을 입력하세요"
  33609. ></v-text-field>
  33610. </td>
  33611. </tr>
  33612. <tr>
  33613. <td>주식발행 초과금</td>
  33614. <td>
  33615. <v-text-field
  33616. maxlength="12"
  33617. @input="(e) => formatNumber(e, 'value1_8')"
  33618. class="custom-input mini"
  33619. v-model="form.value1_8"
  33620. placeholder="금액을 입력하세요"
  33621. ></v-text-field>
  33622. </td>
  33623. <td>
  33624. <v-text-field
  33625. maxlength="12"
  33626. @input="(e) => formatNumber(e, 'value2_8')"
  33627. class="custom-input mini"
  33628. v-model="form.value2_8"
  33629. placeholder="금액을 입력하세요"
  33630. ></v-text-field>
  33631. </td>
  33632. <td>
  33633. <v-text-field
  33634. maxlength="12"
  33635. @input="(e) => formatNumber(e, 'value3_8')"
  33636. class="custom-input mini"
  33637. v-model="form.value3_8"
  33638. placeholder="금액을 입력하세요"
  33639. ></v-text-field>
  33640. </td>
  33641. </tr>
  33642. <tr>
  33643. <td>기타자본 구성요소</td>
  33644. <td>
  33645. <v-text-field
  33646. maxlength="12"
  33647. @input="(e) => formatNumber(e, 'value1_9')"
  33648. class="custom-input mini"
  33649. v-model="form.value1_9"
  33650. placeholder="금액을 입력하세요"
  33651. ></v-text-field>
  33652. </td>
  33653. <td>
  33654. <v-text-field
  33655. maxlength="12"
  33656. @input="(e) => formatNumber(e, 'value2_9')"
  33657. class="custom-input mini"
  33658. v-model="form.value2_9"
  33659. placeholder="금액을 입력하세요"
  33660. ></v-text-field>
  33661. </td>
  33662. <td>
  33663. <v-text-field
  33664. maxlength="12"
  33665. @input="(e) => formatNumber(e, 'value3_9')"
  33666. class="custom-input mini"
  33667. v-model="form.value3_9"
  33668. placeholder="금액을 입력하세요"
  33669. ></v-text-field>
  33670. </td>
  33671. </tr>
  33672. <tr>
  33673. <td>이익잉여금</td>
  33674. <td>
  33675. <v-text-field
  33676. maxlength="12"
  33677. @input="(e) => formatNumber(e, 'value1_10')"
  33678. class="custom-input mini"
  33679. v-model="form.value1_10"
  33680. placeholder="금액을 입력하세요"
  33681. ></v-text-field>
  33682. </td>
  33683. <td>
  33684. <v-text-field
  33685. maxlength="12"
  33686. @input="(e) => formatNumber(e, 'value2_10')"
  33687. class="custom-input mini"
  33688. v-model="form.value2_10"
  33689. placeholder="금액을 입력하세요"
  33690. ></v-text-field>
  33691. </td>
  33692. <td>
  33693. <v-text-field
  33694. maxlength="12"
  33695. @input="(e) => formatNumber(e, 'value3_10')"
  33696. class="custom-input mini"
  33697. v-model="form.value3_10"
  33698. placeholder="금액을 입력하세요"
  33699. ></v-text-field>
  33700. </td>
  33701. </tr>
  33702. <tr>
  33703. <td class="bg">자본총계</td>
  33704. <td class="bg">
  33705. <v-text-field
  33706. maxlength="12"
  33707. @input="(e) => formatNumber(e, 'value1_11')"
  33708. class="custom-input mini"
  33709. v-model="form.value1_11"
  33710. placeholder="금액을 입력하세요"
  33711. ></v-text-field>
  33712. </td>
  33713. <td class="bg">
  33714. <v-text-field
  33715. maxlength="12"
  33716. @input="(e) => formatNumber(e, 'value2_11')"
  33717. class="custom-input mini"
  33718. v-model="form.value2_11"
  33719. placeholder="금액을 입력하세요"
  33720. ></v-text-field>
  33721. </td>
  33722. <td class="bg">
  33723. <v-text-field
  33724. maxlength="12"
  33725. @input="(e) => formatNumber(e, 'value3_11')"
  33726. class="custom-input mini"
  33727. v-model="form.value3_11"
  33728. placeholder="금액을 입력하세요"
  33729. ></v-text-field>
  33730. </td>
  33731. </tr>
  33732. </tbody>
  33733. </table>
  33734. </div>
  33735. <div class="table--wrap">
  33736. <di class="table--t">
  33737. <h3>요약 연결 손익계산서</h3>
  33738. <span>단위 : 백만원</span>
  33739. </di>
  33740. <table>
  33741. <colgroup>
  33742. <col width="30%" />
  33743. <col width="20%" />
  33744. <col width="20%" />
  33745. <col width="20%" />
  33746. </colgroup>
  33747. <thead>
  33748. <tr>
  33749. <th>구분</th>
  33750. <th>
  33751. <v-text-field
  33752. maxlength="4"
  33753. class="custom-input mini"
  33754. v-model="form.year1_1"
  33755. placeholder="연도를 입력하세요"
  33756. ></v-text-field>
  33757. </th>
  33758. <th>
  33759. <v-text-field
  33760. maxlength="4"
  33761. class="custom-input mini"
  33762. v-model="form.year2_1"
  33763. placeholder="연도를 입력하세요"
  33764. ></v-text-field>
  33765. </th>
  33766. <th>
  33767. <v-text-field
  33768. maxlength="4"
  33769. class="custom-input mini"
  33770. v-model="form.year3_1"
  33771. placeholder="연도를 입력하세요"
  33772. ></v-text-field>
  33773. </th>
  33774. </tr>
  33775. </thead>
  33776. <tbody>
  33777. <tr>
  33778. <td class="bg">매출액</td>
  33779. <td class="bg">
  33780. <v-text-field
  33781. maxlength="12"
  33782. @input="(e) => formatNumber(e, 'value1_12')"
  33783. class="custom-input mini"
  33784. v-model="form.value1_12"
  33785. placeholder="금액을 입력하세요"
  33786. ></v-text-field>
  33787. </td>
  33788. <td class="bg">
  33789. <v-text-field
  33790. maxlength="12"
  33791. @input="(e) => formatNumber(e, 'value2_12')"
  33792. class="custom-input mini"
  33793. v-model="form.value2_12"
  33794. placeholder="금액을 입력하세요"
  33795. ></v-text-field>
  33796. </td>
  33797. <td class="bg">
  33798. <v-text-field
  33799. maxlength="12"
  33800. @input="(e) => formatNumber(e, 'value3_12')"
  33801. class="custom-input mini"
  33802. v-model="form.value3_12"
  33803. placeholder="금액을 입력하세요"
  33804. ></v-text-field>
  33805. </td>
  33806. </tr>
  33807. <tr>
  33808. <td>매출원가</td>
  33809. <td>
  33810. <v-text-field
  33811. maxlength="12"
  33812. @input="(e) => formatNumber(e, 'value1_13')"
  33813. class="custom-input mini"
  33814. v-model="form.value1_13"
  33815. placeholder="금액을 입력하세요"
  33816. ></v-text-field>
  33817. </td>
  33818. <td>
  33819. <v-text-field
  33820. maxlength="12"
  33821. @input="(e) => formatNumber(e, 'value2_13')"
  33822. class="custom-input mini"
  33823. v-model="form.value2_13"
  33824. placeholder="금액을 입력하세요"
  33825. ></v-text-field>
  33826. </td>
  33827. <td>
  33828. <v-text-field
  33829. maxlength="12"
  33830. @input="(e) => formatNumber(e, 'value3_13')"
  33831. class="custom-input mini"
  33832. v-model="form.value3_13"
  33833. placeholder="금액을 입력하세요"
  33834. ></v-text-field>
  33835. </td>
  33836. </tr>
  33837. <tr>
  33838. <td>매출총이익</td>
  33839. <td>
  33840. <v-text-field
  33841. maxlength="12"
  33842. @input="(e) => formatNumber(e, 'value1_14')"
  33843. class="custom-input mini"
  33844. v-model="form.value1_14"
  33845. placeholder="금액을 입력하세요"
  33846. ></v-text-field>
  33847. </td>
  33848. <td>
  33849. <v-text-field
  33850. maxlength="12"
  33851. @input="(e) => formatNumber(e, 'value2_14')"
  33852. class="custom-input mini"
  33853. v-model="form.value2_14"
  33854. placeholder="금액을 입력하세요"
  33855. ></v-text-field>
  33856. </td>
  33857. <td>
  33858. <v-text-field
  33859. maxlength="12"
  33860. @input="(e) => formatNumber(e, 'value3_14')"
  33861. class="custom-input mini"
  33862. v-model="form.value3_14"
  33863. placeholder="금액을 입력하세요"
  33864. ></v-text-field>
  33865. </td>
  33866. </tr>
  33867. <tr>
  33868. <td>판매비와 관리비</td>
  33869. <td>
  33870. <v-text-field
  33871. maxlength="12"
  33872. @input="(e) => formatNumber(e, 'value1_15')"
  33873. class="custom-input mini"
  33874. v-model="form.value1_15"
  33875. placeholder="금액을 입력하세요"
  33876. ></v-text-field>
  33877. </td>
  33878. <td>
  33879. <v-text-field
  33880. maxlength="12"
  33881. @input="(e) => formatNumber(e, 'value2_15')"
  33882. class="custom-input mini"
  33883. v-model="form.value2_15"
  33884. placeholder="금액을 입력하세요"
  33885. ></v-text-field>
  33886. </td>
  33887. <td>
  33888. <v-text-field
  33889. maxlength="12"
  33890. @input="(e) => formatNumber(e, 'value3_15')"
  33891. class="custom-input mini"
  33892. v-model="form.value3_15"
  33893. placeholder="금액을 입력하세요"
  33894. ></v-text-field>
  33895. </td>
  33896. </tr>
  33897. <tr>
  33898. <td class="bg">영업이익</td>
  33899. <td class="bg">
  33900. <v-text-field
  33901. maxlength="12"
  33902. @input="(e) => formatNumber(e, 'value1_16')"
  33903. class="custom-input mini"
  33904. v-model="form.value1_16"
  33905. placeholder="금액을 입력하세요"
  33906. ></v-text-field>
  33907. </td>
  33908. <td class="bg">
  33909. <v-text-field
  33910. maxlength="12"
  33911. @input="(e) => formatNumber(e, 'value2_16')"
  33912. class="custom-input mini"
  33913. v-model="form.value2_16"
  33914. placeholder="금액을 입력하세요"
  33915. ></v-text-field>
  33916. </td>
  33917. <td class="bg">
  33918. <v-text-field
  33919. maxlength="12"
  33920. @input="(e) => formatNumber(e, 'value3_16')"
  33921. class="custom-input mini"
  33922. v-model="form.value3_16"
  33923. placeholder="금액을 입력하세요"
  33924. ></v-text-field>
  33925. </td>
  33926. </tr>
  33927. <tr>
  33928. <td>법인세 차감전순이익</td>
  33929. <td>
  33930. <v-text-field
  33931. maxlength="12"
  33932. @input="(e) => formatNumber(e, 'value1_17')"
  33933. class="custom-input mini"
  33934. v-model="form.value1_17"
  33935. placeholder="금액을 입력하세요"
  33936. ></v-text-field>
  33937. </td>
  33938. <td>
  33939. <v-text-field
  33940. maxlength="12"
  33941. @input="(e) => formatNumber(e, 'value2_17')"
  33942. class="custom-input mini"
  33943. v-model="form.value2_17"
  33944. placeholder="금액을 입력하세요"
  33945. ></v-text-field>
  33946. </td>
  33947. <td>
  33948. <v-text-field
  33949. maxlength="12"
  33950. @input="(e) => formatNumber(e, 'value3_17')"
  33951. class="custom-input mini"
  33952. v-model="form.value3_17"
  33953. placeholder="금액을 입력하세요"
  33954. ></v-text-field>
  33955. </td>
  33956. </tr>
  33957. <tr>
  33958. <td class="bg">당기순이익</td>
  33959. <td class="bg">
  33960. <v-text-field
  33961. maxlength="12"
  33962. @input="(e) => formatNumber(e, 'value1_18')"
  33963. class="custom-input mini"
  33964. v-model="form.value1_18"
  33965. placeholder="금액을 입력하세요"
  33966. ></v-text-field>
  33967. </td>
  33968. <td class="bg">
  33969. <v-text-field
  33970. maxlength="12"
  33971. @input="(e) => formatNumber(e, 'value2_18')"
  33972. class="custom-input mini"
  33973. v-model="form.value2_18"
  33974. placeholder="금액을 입력하세요"
  33975. ></v-text-field>
  33976. </td>
  33977. <td class="bg">
  33978. <v-text-field
  33979. maxlength="12"
  33980. @input="(e) => formatNumber(e, 'value3_18')"
  33981. class="custom-input mini"
  33982. v-model="form.value3_18"
  33983. placeholder="금액을 입력하세요"
  33984. ></v-text-field>
  33985. </td>
  33986. </tr>
  33987. </tbody>
  33988. </table>
  33989. </div>
  33990. <div class="view-btm-btn">
  33991. <div class="btn-l"></div>
  33992. <div class="btn-r">
  33993. <v-btn class="custom-btn btn-blue2" @click="fnUpdEvt"
  33994. ><i class="ico"></i>저장</v-btn
  33995. >
  33996. </div>
  33997. </div>
  33998. </div>
  33999. </div>
  34000. </template>
  34001. <script setup>
  34002. /************************************************************************
  34003. | 레이아웃
  34004. ************************************************************************/
  34005. definePageMeta({
  34006. layout: "default",
  34007. });
  34008. /************************************************************************
  34009. | PROPS
  34010. ************************************************************************/
  34011. const props = defineProps({
  34012. propsData: {
  34013. type: Object,
  34014. default: () => {},
  34015. },
  34016. });
  34017. /************************************************************************
  34018. | 스토어
  34019. ************************************************************************/
  34020. const useDtStore = useDetailStore();
  34021. /************************************************************************
  34022. | 전역
  34023. ************************************************************************/
  34024. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  34025. const router = useRouter();
  34026. const pageId = ref("재무제표");
  34027. const pageIdSub = ref();
  34028. /* eslint-disable */
  34029. const form = ref({
  34030. year1: "",
  34031. year2: "",
  34032. year3: "",
  34033. year1_1: "",
  34034. year2_1: "",
  34035. year3_1: "",
  34036. value1_1: "",
  34037. value1_2: "",
  34038. value1_3: "",
  34039. value1_4: "",
  34040. value1_5: "",
  34041. value1_6: "",
  34042. value1_7: "",
  34043. value1_8: "",
  34044. value1_9: "",
  34045. value1_10: "",
  34046. value1_11: "",
  34047. value1_12: "",
  34048. value1_13: "",
  34049. value1_14: "",
  34050. value1_15: "",
  34051. value1_16: "",
  34052. value1_17: "",
  34053. value1_18: "",
  34054. value2_1: "",
  34055. value2_2: "",
  34056. value2_3: "",
  34057. value2_4: "",
  34058. value2_5: "",
  34059. value2_6: "",
  34060. value2_7: "",
  34061. value2_8: "",
  34062. value2_9: "",
  34063. value2_10: "",
  34064. value2_11: "",
  34065. value2_12: "",
  34066. value2_13: "",
  34067. value2_14: "",
  34068. value2_15: "",
  34069. value2_16: "",
  34070. value2_17: "",
  34071. value2_18: "",
  34072. value3_1: "",
  34073. value3_2: "",
  34074. value3_3: "",
  34075. value3_4: "",
  34076. value3_5: "",
  34077. value3_6: "",
  34078. value3_7: "",
  34079. value3_8: "",
  34080. value3_9: "",
  34081. value3_10: "",
  34082. value3_11: "",
  34083. value3_12: "",
  34084. value3_13: "",
  34085. value3_14: "",
  34086. value3_15: "",
  34087. value3_16: "",
  34088. value3_17: "",
  34089. value3_18: "",
  34090. });
  34091. /* eslint-disable */
  34092. /* prettier-ignore */
  34093. /************************************************************************
  34094. | 함수(METHODS)
  34095. ************************************************************************/
  34096. const formatNumber = (event, key) => {
  34097. // 숫자만 남기기
  34098. const input = event.target.value.replace(/[^0-9]/g, '');
  34099. // 3자리마다 쉼표 추가
  34100. const formattedInput = new Intl.NumberFormat().format(input);
  34101. // 실시간으로 업데이트
  34102. form.value[key] = String(formattedInput);
  34103. };
  34104. const fnUpdate = () => {
  34105. let wterGet = localStorage.getItem("tempAccess");
  34106. let _req = {
  34107. wter: wterGet,
  34108. // 요약 연결 재무상태표
  34109. dd_1: form.value.year1,
  34110. dd_2: form.value.year2,
  34111. dd_3: form.value.year3,
  34112. dd_amt_1_1: form.value.value1_1,
  34113. dd_amt_1_2: form.value.value1_2,
  34114. dd_amt_1_3: form.value.value1_3,
  34115. dd_amt_1_4: form.value.value1_4,
  34116. dd_amt_1_5: form.value.value1_5,
  34117. dd_amt_1_6: form.value.value1_6,
  34118. dd_amt_1_7: form.value.value1_7,
  34119. dd_amt_1_8: form.value.value1_8,
  34120. dd_amt_1_9: form.value.value1_9,
  34121. dd_amt_1_10: form.value.value1_10,
  34122. dd_amt_1_11: form.value.value1_11,
  34123. dd_amt_2_1: form.value.value2_1,
  34124. dd_amt_2_2: form.value.value2_2,
  34125. dd_amt_2_3: form.value.value2_3,
  34126. dd_amt_2_4: form.value.value2_4,
  34127. dd_amt_2_5: form.value.value2_5,
  34128. dd_amt_2_6: form.value.value2_6,
  34129. dd_amt_2_7: form.value.value2_7,
  34130. dd_amt_2_8: form.value.value2_8,
  34131. dd_amt_2_9: form.value.value2_9,
  34132. dd_amt_2_10: form.value.value2_10,
  34133. dd_amt_2_11: form.value.value2_11,
  34134. dd_amt_3_1: form.value.value3_1,
  34135. dd_amt_3_2: form.value.value3_2,
  34136. dd_amt_3_3: form.value.value3_3,
  34137. dd_amt_3_4: form.value.value3_4,
  34138. dd_amt_3_5: form.value.value3_5,
  34139. dd_amt_3_6: form.value.value3_6,
  34140. dd_amt_3_7: form.value.value3_7,
  34141. dd_amt_3_8: form.value.value3_8,
  34142. dd_amt_3_9: form.value.value3_9,
  34143. dd_amt_3_10: form.value.value3_10,
  34144. dd_amt_3_11: form.value.value3_11,
  34145. // 요약 연결 손익계산서
  34146. dd_1_1: form.value.year1_1,
  34147. dd_2_1: form.value.year2_1,
  34148. dd_3_1: form.value.year3_1,
  34149. dd_amt_1_12: form.value.value1_12,
  34150. dd_amt_1_13: form.value.value1_13,
  34151. dd_amt_1_14: form.value.value1_14,
  34152. dd_amt_1_15: form.value.value1_15,
  34153. dd_amt_1_16: form.value.value1_16,
  34154. dd_amt_1_17: form.value.value1_17,
  34155. dd_amt_1_18: form.value.value1_18,
  34156. dd_amt_2_12: form.value.value2_12,
  34157. dd_amt_2_13: form.value.value2_13,
  34158. dd_amt_2_14: form.value.value2_14,
  34159. dd_amt_2_15: form.value.value2_15,
  34160. dd_amt_2_16: form.value.value2_16,
  34161. dd_amt_2_17: form.value.value2_17,
  34162. dd_amt_2_18: form.value.value2_18,
  34163. dd_amt_3_12: form.value.value3_12,
  34164. dd_amt_3_13: form.value.value3_13,
  34165. dd_amt_3_14: form.value.value3_14,
  34166. dd_amt_3_15: form.value.value3_15,
  34167. dd_amt_3_16: form.value.value3_16,
  34168. dd_amt_3_17: form.value.value3_17,
  34169. dd_amt_3_18: form.value.value3_18,
  34170. };
  34171. _req = Object.fromEntries(
  34172. Object.entries(_req).map(([key, value]) => [
  34173. key,
  34174. typeof value === "string"
  34175. ? value.replace(/,/g, "") // 문자열인 경우에만 replace
  34176. : value == null
  34177. ? "" // null 또는 undefined 값은 빈 문자열로 처리
  34178. : String(value), // 그 외 값은 문자열로 변환
  34179. ])
  34180. );
  34181. useAxios()
  34182. .post("/balance/ins", _req)
  34183. .then((res) => {
  34184. window.location.reload();
  34185. //console.error(res)
  34186. })
  34187. .catch((error) => {});
  34188. };
  34189. const fnDetail = () => {
  34190. let _req = {};
  34191. useAxios()
  34192. .post("/balance/detail", _req)
  34193. .then((res) => {
  34194. const formattedData = Object.fromEntries(
  34195. Object.entries(res.data).map(([key, value]) => {
  34196. let formattedValue = null;
  34197. // 연도는 쉼표 제거, 금액은 쉼표 추가
  34198. if(key !== 'dd_1' && key !== 'dd_2' && key !== 'dd_3' && key !== 'dd_1_1' && key !== 'dd_2_1' && key !== 'dd_3_1'){
  34199. formattedValue = !isNaN(value)
  34200. ? new Intl.NumberFormat().format(Number(value))
  34201. : value;
  34202. } else {
  34203. formattedValue = value;
  34204. }
  34205. return [key, formattedValue];
  34206. })
  34207. );
  34208. res.data = formattedData;
  34209. form.value.year1 = res.data.dd_1;
  34210. form.value.value1_1 = res.data.dd_amt_1_1;
  34211. form.value.value1_2 = res.data.dd_amt_1_2;
  34212. form.value.value1_3 = res.data.dd_amt_1_3;
  34213. form.value.value1_4 = res.data.dd_amt_1_4;
  34214. form.value.value1_5 = res.data.dd_amt_1_5;
  34215. form.value.value1_6 = res.data.dd_amt_1_6;
  34216. form.value.value1_7 = res.data.dd_amt_1_7;
  34217. form.value.value1_8 = res.data.dd_amt_1_8;
  34218. form.value.value1_9 = res.data.dd_amt_1_9;
  34219. form.value.value1_10 = res.data.dd_amt_1_10;
  34220. form.value.value1_11 = res.data.dd_amt_1_11;
  34221. form.value.year2 = res.data.dd_2;
  34222. form.value.value2_1 = res.data.dd_amt_2_1;
  34223. form.value.value2_2 = res.data.dd_amt_2_2;
  34224. form.value.value2_3 = res.data.dd_amt_2_3;
  34225. form.value.value2_4 = res.data.dd_amt_2_4;
  34226. form.value.value2_5 = res.data.dd_amt_2_5;
  34227. form.value.value2_6 = res.data.dd_amt_2_6;
  34228. form.value.value2_7 = res.data.dd_amt_2_7;
  34229. form.value.value2_8 = res.data.dd_amt_2_8;
  34230. form.value.value2_9 = res.data.dd_amt_2_9;
  34231. form.value.value2_10 = res.data.dd_amt_2_10;
  34232. form.value.value2_11 = res.data.dd_amt_2_11;
  34233. form.value.year3 = res.data.dd_3;
  34234. form.value.value3_1 = res.data.dd_amt_3_1;
  34235. form.value.value3_2 = res.data.dd_amt_3_2;
  34236. form.value.value3_3 = res.data.dd_amt_3_3;
  34237. form.value.value3_4 = res.data.dd_amt_3_4;
  34238. form.value.value3_5 = res.data.dd_amt_3_5;
  34239. form.value.value3_6 = res.data.dd_amt_3_6;
  34240. form.value.value3_7 = res.data.dd_amt_3_7;
  34241. form.value.value3_8 = res.data.dd_amt_3_8;
  34242. form.value.value3_9 = res.data.dd_amt_3_9;
  34243. form.value.value3_10 = res.data.dd_amt_3_10;
  34244. form.value.value3_11 = res.data.dd_amt_3_11;
  34245. // 요약 연결 손익계산서
  34246. form.value.year1_1 = res.data.dd_1_1;
  34247. form.value.value1_12 = res.data.dd_amt_1_12;
  34248. form.value.value1_13 = res.data.dd_amt_1_13;
  34249. form.value.value1_14 = res.data.dd_amt_1_14;
  34250. form.value.value1_15 = res.data.dd_amt_1_15;
  34251. form.value.value1_16 = res.data.dd_amt_1_16;
  34252. form.value.value1_17 = res.data.dd_amt_1_17;
  34253. form.value.value1_18 = res.data.dd_amt_1_18;
  34254. form.value.year2_1 = res.data.dd_2_1;
  34255. form.value.value2_12 = res.data.dd_amt_2_12;
  34256. form.value.value2_13 = res.data.dd_amt_2_13;
  34257. form.value.value2_14 = res.data.dd_amt_2_14;
  34258. form.value.value2_15 = res.data.dd_amt_2_15;
  34259. form.value.value2_16 = res.data.dd_amt_2_16;
  34260. form.value.value2_17 = res.data.dd_amt_2_17;
  34261. form.value.value2_18 = res.data.dd_amt_2_18;
  34262. form.value.year3_1 = res.data.dd_3_1;
  34263. form.value.value3_12 = res.data.dd_amt_3_12;
  34264. form.value.value3_13 = res.data.dd_amt_3_13;
  34265. form.value.value3_14 = res.data.dd_amt_3_14;
  34266. form.value.value3_15 = res.data.dd_amt_3_15;
  34267. form.value.value3_16 = res.data.dd_amt_3_16;
  34268. form.value.value3_17 = res.data.dd_amt_3_17;
  34269. form.value.value3_18 = res.data.dd_amt_3_18;
  34270. })
  34271. .catch((error) => {});
  34272. };
  34273. const fnUpdEvt = () => {
  34274. let param = {
  34275. id: pageId,
  34276. title: "재무제표 저장",
  34277. content: "저장하시겠습니까?",
  34278. yes: {
  34279. text: "저장",
  34280. isProc: true,
  34281. event: "FN_UPDATE",
  34282. param: "",
  34283. },
  34284. no: {
  34285. text: "취소",
  34286. isProc: false,
  34287. },
  34288. };
  34289. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  34290. };
  34291. $eventBus.off("FN_UPDATE");
  34292. $eventBus.on("FN_UPDATE", () => {
  34293. fnUpdate();
  34294. });
  34295. /************************************************************************
  34296. | WATCH
  34297. ************************************************************************/
  34298. watch(() => {});
  34299. onMounted(() => {
  34300. fnDetail();
  34301. });
  34302. </script>
  34303. </file>
  34304. <file path="pages/view/common/cs/index.vue">
  34305. <template>
  34306. <div>
  34307. <div class="inner--headers">
  34308. <h2>{{ pageId }}</h2>
  34309. <div class="bread--crumbs--wrap">
  34310. <span>홈</span>
  34311. <span>{{ pageId }}</span>
  34312. <span v-if="pageIdSub">{{ pageIdSub }}</span>
  34313. </div>
  34314. </div>
  34315. <div class="data--list--wrap">
  34316. <div class="table--wrap">
  34317. <di class="table--t">
  34318. <h3>기 발행 주식 수</h3>
  34319. </di>
  34320. <table>
  34321. <colgroup>
  34322. <col width="20%" />
  34323. <col width="80%" />
  34324. </colgroup>
  34325. <tbody>
  34326. <tr>
  34327. <th class="bg le">주식 수<span class="bul">*</span></th>
  34328. <td>
  34329. <v-text-field
  34330. maxlength="13"
  34331. @input="(e) => formatNumber(e, 'formValue1')"
  34332. v-model="form.formValue1"
  34333. style="width: 300px"
  34334. class="custom-input mini left"
  34335. placeholder="주식 수를 입력하세요"
  34336. ></v-text-field>
  34337. </td>
  34338. </tr>
  34339. <tr>
  34340. <th class="bg le">
  34341. 발행 주식 수 기준 일자(현재)<span class="bul">*</span>
  34342. </th>
  34343. <td>
  34344. <div class="calendar-wrap ml--0">
  34345. <div class="calendar">
  34346. <VueDatePicker
  34347. :format="datePickerFormat"
  34348. v-model="form.formValue2"
  34349. auto-apply="true"
  34350. week-start="0"
  34351. ></VueDatePicker>
  34352. </div>
  34353. </div>
  34354. </td>
  34355. </tr>
  34356. </tbody>
  34357. </table>
  34358. </div>
  34359. <div class="table--wrap">
  34360. <di class="table--t">
  34361. <h3>주주구성</h3>
  34362. </di>
  34363. <table>
  34364. <colgroup>
  34365. <col width="20%" />
  34366. <col width="80%" />
  34367. </colgroup>
  34368. <tbody>
  34369. <tr>
  34370. <th class="bg le">최대주주 및 특수 관계인<span class="bul">*</span></th>
  34371. <td>
  34372. <div class="input--wrap">
  34373. <v-text-field
  34374. maxlength="10"
  34375. style="width: 300px"
  34376. v-model="form.formValue3"
  34377. @input="(e) => formatNumber(e, 'formValue3')"
  34378. class="custom-input mini left"
  34379. placeholder="비율을 입력하세요"
  34380. ></v-text-field>
  34381. <span>%</span>
  34382. </div>
  34383. </td>
  34384. </tr>
  34385. <tr>
  34386. <th class="bg le">기관<span class="bul">*</span></th>
  34387. <td>
  34388. <div class="input--wrap">
  34389. <v-text-field
  34390. maxlength="10"
  34391. style="width: 300px"
  34392. v-model="form.formValue4"
  34393. @input="(e) => formatNumber(e, 'formValue4')"
  34394. class="custom-input mini left"
  34395. placeholder="비율을 입력하세요"
  34396. ></v-text-field>
  34397. <span>%</span>
  34398. </div>
  34399. </td>
  34400. </tr>
  34401. <tr>
  34402. <th class="bg le">외국인<span class="bul">*</span></th>
  34403. <td>
  34404. <div class="input--wrap">
  34405. <v-text-field
  34406. maxlength="10"
  34407. style="width: 300px"
  34408. @input="(e) => formatNumber(e, 'formValue5')"
  34409. v-model="form.formValue5"
  34410. class="custom-input mini left"
  34411. placeholder="비율을 입력하세요"
  34412. ></v-text-field>
  34413. <span>%</span>
  34414. </div>
  34415. </td>
  34416. </tr>
  34417. <tr>
  34418. <th class="bg le">자사주<span class="bul">*</span></th>
  34419. <td>
  34420. <div class="input--wrap">
  34421. <v-text-field
  34422. maxlength="10"
  34423. style="width: 300px"
  34424. v-model="form.formValue6"
  34425. @input="(e) => formatNumber(e, 'formValue6')"
  34426. class="custom-input mini left"
  34427. placeholder="비율을 입력하세요"
  34428. ></v-text-field>
  34429. <span>%</span>
  34430. </div>
  34431. </td>
  34432. </tr>
  34433. <tr>
  34434. <th class="bg le">기타<span class="bul">*</span></th>
  34435. <td>
  34436. <div class="input--wrap">
  34437. <v-text-field
  34438. maxlength="10"
  34439. v-model="form.formValue7"
  34440. @input="(e) => formatNumber(e, 'formValue7')"
  34441. style="width: 300px"
  34442. class="custom-input mini left"
  34443. placeholder="비율을 입력하세요"
  34444. ></v-text-field>
  34445. <span>%</span>
  34446. </div>
  34447. </td>
  34448. </tr>
  34449. </tbody>
  34450. </table>
  34451. </div>
  34452. <div class="view-btm-btn">
  34453. <div class="btn-l"></div>
  34454. <div class="btn-r">
  34455. <v-btn class="custom-btn btn-blue2" @click="fnUpdEvt"
  34456. ><i class="ico"></i>저장</v-btn
  34457. >
  34458. </div>
  34459. </div>
  34460. </div>
  34461. </div>
  34462. </template>
  34463. <script setup>
  34464. import VueDatePicker from "@vuepic/vue-datepicker";
  34465. import "@vuepic/vue-datepicker/dist/main.css";
  34466. /************************************************************************
  34467. | 레이아웃
  34468. ************************************************************************/
  34469. definePageMeta({
  34470. layout: "default",
  34471. });
  34472. /************************************************************************
  34473. | PROPS
  34474. ************************************************************************/
  34475. const props = defineProps({
  34476. propsData: {
  34477. type: Object,
  34478. default: () => {},
  34479. },
  34480. });
  34481. /************************************************************************
  34482. | 스토어
  34483. ************************************************************************/
  34484. const useDtStore = useDetailStore();
  34485. /************************************************************************
  34486. | 전역
  34487. ************************************************************************/
  34488. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  34489. const router = useRouter();
  34490. const pageId = ref("기업경영구조");
  34491. const pageIdSub = ref();
  34492. const datePickerFormat = "yyyy-MM-dd";
  34493. const form = ref({
  34494. formValue1: "",
  34495. formValue2: "",
  34496. formValue3: "",
  34497. formValue4: "",
  34498. formValue5: "",
  34499. formValue6: "",
  34500. formValue7: "",
  34501. });
  34502. /* eslint-disable */
  34503. /* prettier-ignore */
  34504. /************************************************************************
  34505. | 함수(METHODS)
  34506. ************************************************************************/
  34507. const formatNumber = (event, key) => {
  34508. let formattedInput = "";
  34509. // 숫자만 남기기
  34510. const input = event.target.value.replace(/[^0-9.]/g, '');
  34511. // 3자리마다 쉼표 추가
  34512. formattedInput = input;
  34513. if(key == 'formValue1'){
  34514. formattedInput = new Intl.NumberFormat().format(input);
  34515. }
  34516. // 실시간으로 업데이트
  34517. form.value[key] = String(formattedInput);
  34518. };
  34519. const formatDate = (date) => {
  34520. const d = new Date(date);
  34521. const year = d.getFullYear();
  34522. const month = ("0" + (d.getMonth() + 1)).slice(-2);
  34523. const day = ("0" + d.getDate()).slice(-2);
  34524. return `${year}-${month}-${day}`;
  34525. };
  34526. const fnUpdate = () => {
  34527. let wterGet = localStorage.getItem("tempAccess");
  34528. let _req = {
  34529. wter: wterGet,
  34530. shar_count: form.value.formValue1,
  34531. iss_shar_stan_date: form.value.formValue2,
  34532. major_shar: form.value.formValue3,
  34533. corp_inve: form.value.formValue4,
  34534. fogn_inve: form.value.formValue5,
  34535. repu_shar: form.value.formValue6,
  34536. etc_shar: form.value.formValue7,
  34537. };
  34538. _req = Object.fromEntries(
  34539. Object.entries(_req).map(([key, value]) => [
  34540. key,
  34541. typeof value === "string"
  34542. ? value.replace(/,/g, "") // 문자열인 경우에만 replace
  34543. : value == null
  34544. ? "" // null 또는 undefined 값은 빈 문자열로 처리
  34545. : String(value), // 그 외 값은 문자열로 변환
  34546. ])
  34547. );
  34548. console.error(_req);
  34549. useAxios()
  34550. .post("/bm/ins", _req)
  34551. .then((res) => {
  34552. window.location.reload();
  34553. })
  34554. .catch((error) => {});
  34555. };
  34556. const fnDetail = () => {
  34557. let _req = {};
  34558. useAxios()
  34559. .post("/bm/detail", _req)
  34560. .then((res) => {
  34561. console.error(res.data);
  34562. // const formattedData = Object.fromEntries(
  34563. // Object.entries(res.data).map(([key, value]) => {
  34564. // let formattedValue = null;
  34565. // // 연도는 쉼표 제거, 금액은 쉼표 추가
  34566. // if(key !== shar_count){
  34567. // formattedValue = !isNaN(value)
  34568. // ? new Intl.NumberFormat().format(Number(value))
  34569. // : value;
  34570. // } else {
  34571. // formattedValue = value;
  34572. // }
  34573. // return [key, formattedValue];
  34574. // })
  34575. // );
  34576. // res.data = formattedData;
  34577. // console.error(formattedData)
  34578. form.value.formValue1 = new Intl.NumberFormat().format(res.data.shar_count);
  34579. form.value.formValue2 = res.data.iss_shar_stan_date;
  34580. form.value.formValue3 = res.data.major_shar; //최대주주
  34581. form.value.formValue4 = res.data.corp_inve; //기관
  34582. form.value.formValue5 = res.data.fogn_inve; //외국인
  34583. form.value.formValue6 = res.data.repu_shar; //자사주
  34584. form.value.formValue7 = res.data.etc_shar; //기타
  34585. })
  34586. .catch((error) => {});
  34587. };
  34588. const fnUpdEvt = () => {
  34589. let param = {
  34590. id: pageId,
  34591. title: "기업경영구조 저장",
  34592. content: "저장하시겠습니까?",
  34593. yes: {
  34594. text: "저장",
  34595. isProc: true,
  34596. event: "FN_UPDATE",
  34597. param: "",
  34598. },
  34599. no: {
  34600. text: "취소",
  34601. isProc: false,
  34602. },
  34603. };
  34604. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  34605. };
  34606. $eventBus.off("FN_UPDATE");
  34607. $eventBus.on("FN_UPDATE", () => {
  34608. fnUpdate();
  34609. });
  34610. /************************************************************************
  34611. | WATCH
  34612. ************************************************************************/
  34613. watch(
  34614. () => form.value.formValue2,
  34615. (newVal) => {
  34616. if (newVal) {
  34617. form.value.formValue2 = formatDate(newVal);
  34618. }
  34619. }
  34620. );
  34621. onMounted(() => {
  34622. fnDetail();
  34623. });
  34624. </script>
  34625. </file>
  34626. <file path="pages/view/common/deli/index2.vue">
  34627. <template>
  34628. <div>
  34629. <div class="inner--headers">
  34630. <h2>{{ pageId }}</h2>
  34631. <div class="bread--crumbs--wrap">
  34632. <span>홈</span>
  34633. <span>{{ pageId }}</span>
  34634. </div>
  34635. </div>
  34636. <div class="search--modules type2">
  34637. <div class="search--inner">
  34638. <div class="form--cont--filter">
  34639. <v-select
  34640. v-model="filter"
  34641. :items="filderArr"
  34642. variant="outlined"
  34643. class="custom-select"
  34644. >
  34645. </v-select>
  34646. </div>
  34647. <div class="form--cont--text">
  34648. <v-text-field
  34649. v-model="searchModel"
  34650. class="custom-input mini"
  34651. style="width: 100%"
  34652. placeholder="검색어를 입력하세요"
  34653. ></v-text-field>
  34654. </div>
  34655. </div>
  34656. <div class="search--inner">
  34657. <div class="calendar-wrap ml--0">
  34658. <div class="calendar">
  34659. <VueDatePicker
  34660. :format="datePickerFormat"
  34661. v-model="searchStartDate"
  34662. placeholder="날짜를 선택하세요"
  34663. :auto-apply="true"
  34664. week-start="0"
  34665. ></VueDatePicker>
  34666. </div>
  34667. <span class="text">~</span>
  34668. <div class="calendar">
  34669. <VueDatePicker
  34670. v-model="searchEndDate"
  34671. :format="datePickerFormat"
  34672. placeholder="날짜를 선택하세요"
  34673. :auto-apply="true"
  34674. week-start="0"
  34675. ></VueDatePicker>
  34676. </div>
  34677. <div class="month--selector">
  34678. <v-btn
  34679. v-for="option in dateOptions"
  34680. :key="option.value"
  34681. :class="{ actv: selectedRange === option.value }"
  34682. @click="setDateRange(option.value)"
  34683. elevation="0"
  34684. >
  34685. {{ option.label }}
  34686. </v-btn>
  34687. </div>
  34688. </div>
  34689. </div>
  34690. <v-btn
  34691. class="custom-btn btn-blue mini sch--btn"
  34692. @click="fnSearch(searchModel, filter)"
  34693. >검색</v-btn
  34694. >
  34695. </div>
  34696. <div class="data--list--wrap">
  34697. <div class="btn--actions--wrap">
  34698. <div class="left--sections">
  34699. <v-btn class="custom-btn bdrs--10 btn-white" @click="deliLocated()"
  34700. ><i class="ico"></i>개별 배송</v-btn
  34701. >
  34702. <v-btn class="custom-btn btn-pink bdrs--10"
  34703. ><i class="ico"></i>공동구매 배송</v-btn
  34704. >
  34705. </div>
  34706. <div class="right--sections">
  34707. </div>
  34708. </div>
  34709. <div class="tbl-wrapper">
  34710. <div class="tbl-wrap">
  34711. <!-- ag grid -->
  34712. <ag-grid-vue
  34713. style="width: 100%; height: calc(10 * 2.94rem)"
  34714. class="ag-theme-quartz"
  34715. :gridOptions="gridOptions"
  34716. :rowData="tblItems"
  34717. rowSelection="multiple"
  34718. :paginationPageSize="pageObj.pageSize"
  34719. :suppressPaginationPanel="true"
  34720. @grid-ready="onGridReady"
  34721. @rowClicked="detailLocated"
  34722. >
  34723. </ag-grid-vue>
  34724. <!-- 페이징 -->
  34725. <div class="ag-grid-custom-pagenations">
  34726. <pagination @chg_page="chgPage" :pageObj="pageObj"></pagination>
  34727. </div>
  34728. </div>
  34729. </div>
  34730. </div>
  34731. </div>
  34732. </template>
  34733. <script setup>
  34734. import VueDatePicker from "@vuepic/vue-datepicker";
  34735. import "@vuepic/vue-datepicker/dist/main.css";
  34736. import { AgGridVue } from "ag-grid-vue3";
  34737. import dayjs from 'dayjs';
  34738. import pagination from "../components/common/pagination.vue";
  34739. /************************************************************************
  34740. | 레이아웃
  34741. ************************************************************************/
  34742. definePageMeta({
  34743. layout: "default",
  34744. });
  34745. /************************************************************************
  34746. | PROPS
  34747. ************************************************************************/
  34748. const props = defineProps({
  34749. propsData: {
  34750. type: Object,
  34751. default: () => {},
  34752. },
  34753. });
  34754. /************************************************************************
  34755. | 스토어
  34756. ************************************************************************/
  34757. const useDtStore = useDetailStore();
  34758. /************************************************************************
  34759. | 전역
  34760. ************************************************************************/
  34761. const searchModel = ref("");
  34762. const selectedRange = ref('all');
  34763. const itemStartDate = ref("");
  34764. const searchStartDate = ref("");
  34765. const searchEndDate = ref("");
  34766. const datePickerFormat = "yyyy-MM-dd";
  34767. const dateOptions = [
  34768. { label: '오늘', value: 'today' },
  34769. { label: '7일', value: '7d' },
  34770. { label: '1개월', value: '1m' },
  34771. { label: '3개월', value: '3m' },
  34772. { label: '전체', value: 'all' },
  34773. ]
  34774. const filter = ref("");
  34775. const filderArr = ref([
  34776. { title: "전체", value: "" },
  34777. { title: "제품명", value: "name" },
  34778. ]);
  34779. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  34780. const router = useRouter();
  34781. const pageId = ref("배송 관리");
  34782. let pageObj = ref({
  34783. page: 1, // 현재 페이지
  34784. pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
  34785. pageSize: 10, // 테이블 조회 데이터 개수
  34786. totalCnt: 0, // 전체 페이지
  34787. });
  34788. const tblItems = ref([]); // stat 데이터
  34789. /* eslint-disable */
  34790. /* prettier-ignore */
  34791. pageObj.value.totalCnt = tblItems.value.length;
  34792. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  34793. const rowHeightRem = 2.65; // 원하는 rem 값
  34794. const rowHeightPx = rowHeightRem * remToPx();
  34795. const gridApi = shallowRef();
  34796. // gridOption
  34797. const gridOptions = {
  34798. columnDefs: [
  34799. //{ checkboxSelection: true, headerCheckboxSelection: true, width: 0 },
  34800. {
  34801. headerName: "No",
  34802. valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
  34803. sortable: false,
  34804. width: 70,
  34805. },
  34806. // { headerName: "번호", field: "NO", sortable: false },
  34807. {
  34808. headerName: "제품명",
  34809. field: "NAME",
  34810. //sortable: useAuthStore().getCompanyId == "0-000000" ? true : false,
  34811. },
  34812. {
  34813. headerName: "제품 총수량",
  34814. field: "STATUS",
  34815. width: 140,
  34816. cellRenderer: (params) => {
  34817. return params.value;
  34818. },
  34819. },
  34820. {
  34821. headerName: "총 주문금액",
  34822. field: "STATUS",
  34823. width: 140,
  34824. cellRenderer: (params) => {
  34825. return params.value;
  34826. },
  34827. },
  34828. {
  34829. headerName: "주문일",
  34830. field: "ORDDATE",
  34831. width: 140,
  34832. },
  34833. ],
  34834. rowData: tblItems.value, // 테이블 데이터
  34835. autoSizeStrategy: {
  34836. type: "fitGridWidth", // width맞춤
  34837. },
  34838. suppressMovableColumns: true,
  34839. headerHeight: rowHeightPx,
  34840. rowHeight: rowHeightPx,
  34841. pagination: true,
  34842. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  34843. //rowSelection: {
  34844. // checkboxes: true,
  34845. // headerCheckbox: true,
  34846. // enableClickSelection: false,
  34847. // mode: "multiRow",
  34848. //},
  34849. };
  34850. /************************************************************************
  34851. | 함수(METHODS)
  34852. ************************************************************************/
  34853. const deliLocated = () => {
  34854. router.push({
  34855. path: "/view/common/deli",
  34856. });
  34857. };
  34858. const setDateRange = (range) => {
  34859. const today = dayjs();
  34860. switch(range) {
  34861. case 'today' :
  34862. searchStartDate.value = today.format('YYYY-MM-DD');
  34863. searchEndDate.value = today.format('YYYY-MM-DD');
  34864. selectedRange.value = 'today';
  34865. break;
  34866. case '7d':
  34867. searchStartDate.value = today.subtract(7, 'day').format('YYYY-MM-DD');
  34868. searchEndDate.value = today.format('YYYY-MM-DD');
  34869. selectedRange.value = '7d';
  34870. break;
  34871. case '1m':
  34872. searchStartDate.value = today.subtract(1, 'month').format('YYYY-MM-DD');
  34873. searchEndDate.value = today.format('YYYY-MM-DD');
  34874. selectedRange.value = '1m';
  34875. break;
  34876. case '3m':
  34877. searchStartDate.value = today.subtract(3, 'month').format('YYYY-MM-DD');
  34878. searchEndDate.value = today.format('YYYY-MM-DD');
  34879. selectedRange.value = '3m';
  34880. break;
  34881. case 'all':
  34882. searchStartDate.value = itemStartDate.value;
  34883. searchEndDate.value = today.format('YYYY-MM-DD');
  34884. selectedRange.value = 'all';
  34885. break
  34886. }
  34887. }
  34888. const onGridReady = (__PARAMS) => {
  34889. gridApi.value = __PARAMS.api;
  34890. };
  34891. const chgPage = (__PAGE) => {
  34892. pageObj.value.page = __PAGE;
  34893. gridApi.value.paginationGoToPage(__PAGE - 1);
  34894. };
  34895. const detailLocated = (__EVENT) => {
  34896. router.push({
  34897. path: "/view/common/deli/detail",
  34898. });
  34899. useDtStore.adminInfo.adminId = __EVENT.data.ID;
  34900. useDtStore.adminInfo.pageType = "U";
  34901. };
  34902. const itemListGet = async () => {
  34903. let _req = {
  34904. // compId: useAuthStore().getCompanyId,
  34905. };
  34906. useAxios()
  34907. .post("/item/list", _req)
  34908. .then((res) => {
  34909. tblItems.value = res.data;
  34910. pageObj.value.totalCnt = tblItems.value.length;
  34911. itemStartDate.value = res.data[res.data.length-1].UDPDATE;
  34912. searchStartDate.value = itemStartDate.value;
  34913. searchEndDate.value = dayjs();
  34914. });
  34915. };
  34916. const fnSearch = (__KEYWORD, __FILTER) => {
  34917. let _req = {
  34918. filter: __FILTER,
  34919. keyword: __KEYWORD,
  34920. startDate: searchStartDate.value,
  34921. endDate: searchEndDate.value,
  34922. };
  34923. useAxios()
  34924. .post("/item/search", _req)
  34925. .then((res) => {
  34926. tblItems.value = res.data;
  34927. pageObj.value.totalCnt = tblItems.value.length;
  34928. })
  34929. .catch((error) => {});
  34930. };
  34931. /************************************************************************
  34932. | 팝업 이벤트버스 정의
  34933. ************************************************************************/
  34934. /************************************************************************
  34935. | WATCH
  34936. ************************************************************************/
  34937. watch(
  34938. () => props,
  34939. () => {
  34940. searchObj.value = props.propsData;
  34941. fnGetStat();
  34942. },
  34943. { deep: true }
  34944. );
  34945. onMounted(() => {
  34946. itemListGet();
  34947. });
  34948. </script>
  34949. </file>
  34950. <file path="pages/view/common/settle/curationAdd.vue">
  34951. <template>
  34952. <div>
  34953. <div class="inner--headers">
  34954. <h2>{{ pageId }}</h2>
  34955. <div class="bread--crumbs--wrap">
  34956. <span>홈</span>
  34957. <span>미디어 관리</span>
  34958. <span>{{ pageId }}</span>
  34959. </div>
  34960. </div>
  34961. <div class="view-wrap mt--45">
  34962. <div class="view-box">
  34963. <div class="view-box-top">
  34964. <h3 v-if="pageType == 'I'">CURATION 등록</h3>
  34965. <h3 v-else>CURATION 수정</h3>
  34966. </div>
  34967. <div class="view-box-btm">
  34968. <div class="form-style1">
  34969. <v-form ref="addForm">
  34970. <table>
  34971. <colgroup>
  34972. <col style="width: 12.5rem" />
  34973. <col />
  34974. </colgroup>
  34975. <tbody>
  34976. <tr>
  34977. <th>노출여부<span class="bul">*</span></th>
  34978. <td>
  34979. <v-radio-group
  34980. class="radio--group"
  34981. v-model="form.formValue2"
  34982. inline
  34983. hide-details
  34984. >
  34985. <v-radio label="노출" value="Y"></v-radio>
  34986. <v-radio label="비노출" value="N"></v-radio>
  34987. </v-radio-group>
  34988. </td>
  34989. </tr>
  34990. <tr>
  34991. <th>구분<span class="bul">*</span></th>
  34992. <td>
  34993. <v-radio-group
  34994. class="radio--group"
  34995. v-model="form.formValue9"
  34996. inline
  34997. hide-details
  34998. :rules="[useValid.required('구분')]"
  34999. >
  35000. <v-radio label="유튜브" value="Y"></v-radio>
  35001. <v-radio label="링크드인" value="L"></v-radio>
  35002. <v-radio label="네이버" value="N"></v-radio>
  35003. </v-radio-group>
  35004. </td>
  35005. </tr>
  35006. <tr>
  35007. <th>제목<span class="bul">*</span></th>
  35008. <td>
  35009. <v-text-field
  35010. v-model="form.formValue1"
  35011. class="custom-input mini"
  35012. placeholder="제목을 입력해주세요."
  35013. :rules="[useValid.required('제목')]"
  35014. ></v-text-field>
  35015. </td>
  35016. </tr>
  35017. <tr>
  35018. <th>내용<span class="bul">*</span></th>
  35019. <td class="">
  35020. <SunEditorWrapper
  35021. ref="sunEditorWrapper"
  35022. :initialContent="editorContentReq"
  35023. />
  35024. </td>
  35025. </tr>
  35026. <tr>
  35027. <th>썸네일 이미지<span class="bul">*</span></th>
  35028. <td>
  35029. <div class="equip--image--wrap">
  35030. <!--이미지가 없을 때-->
  35031. <div class="equip--image" v-show="!form.formValue7">
  35032. <img src="/assets/img/ic_no_img.svg" />
  35033. </div>
  35034. <!--이미지 첨부했을 때-->
  35035. <div class="equip--image" v-show="form.formValue7">
  35036. <CoolLightBox
  35037. v-if="items.length > 0"
  35038. :items="items"
  35039. :index="index"
  35040. @close="index = null"
  35041. />
  35042. <div class="images-wrapper">
  35043. <div
  35044. class="image"
  35045. :key="imageIndex"
  35046. @click="index = imageIndex"
  35047. >
  35048. <img id="preview_image" :src="imgTemp" />
  35049. </div>
  35050. </div>
  35051. </div>
  35052. <div class="equip--image--select">
  35053. <div class="form--group">
  35054. <label
  35055. for="fileUpload_pic"
  35056. class="file--btn"
  35057. @click="fnPicFileUploadOpen()"
  35058. >파일 선택</label
  35059. >
  35060. <v-file-input
  35061. v-model="form.formValue7"
  35062. id="fileUpload_pic"
  35063. ref="fileupload_pic"
  35064. accept=".jpg, .jpeg, .png, .gif"
  35065. variant="plain"
  35066. hide-details
  35067. placeholder="선택된 파일 없음"
  35068. prepend-icon=""
  35069. class="custom-input"
  35070. style="max-width: 400px"
  35071. height="33px"
  35072. :rules="[useValid.required('썸네일 이미지')]"
  35073. :clearable="false"
  35074. @change="fnUploadPicFileCheck()"
  35075. >
  35076. <template #append>
  35077. <div class="v-input__icon v-input__icon--clear">
  35078. <button
  35079. @click="clearFile"
  35080. type="button"
  35081. aria-label="clear icon"
  35082. tabindex="-1"
  35083. class="v-icon notranslate v-icon--link mdi mdi-close"
  35084. ></button>
  35085. </div>
  35086. </template>
  35087. </v-file-input>
  35088. </div>
  35089. <p class="equip--image--desc">
  35090. (권장 이미지 : 1024 x 768 / gif, jpg, jpeg, png)
  35091. </p>
  35092. </div>
  35093. <div class="div_error_text">{{ objProc.validErrorMessage }}</div>
  35094. </div>
  35095. </td>
  35096. </tr>
  35097. <tr>
  35098. <th>URL<span class="bul">*</span></th>
  35099. <td>
  35100. <v-text-field
  35101. v-model="form.formValue5"
  35102. class="custom-input mini"
  35103. placeholder="URL 링크를 입력해주세요"
  35104. :rules="[useValid.required('URL')]"
  35105. ></v-text-field>
  35106. </td>
  35107. </tr>
  35108. <tr>
  35109. <th>팔로워<span class="bul">*</span></th>
  35110. <td>
  35111. <v-text-field
  35112. v-model="form.formValue8"
  35113. class="custom-input mini"
  35114. placeholder="팔로워 및 구독자수를 입력해주세요"
  35115. :rules="[useValid.required('팔로워')]"
  35116. ></v-text-field>
  35117. </td>
  35118. </tr>
  35119. </tbody>
  35120. </table>
  35121. </v-form>
  35122. </div>
  35123. </div>
  35124. </div>
  35125. <div class="view-btm-btn">
  35126. <div class="btn-l">
  35127. <v-btn class="custom-btn btn-list" @click="listLocated"
  35128. ><i class="ico"></i>목록</v-btn
  35129. >
  35130. <v-btn v-if="pageType == 'U'" class="custom-btn btn-del" @click="fnDelEvt"
  35131. ><i class="ico"></i>삭제</v-btn
  35132. >
  35133. </div>
  35134. <div class="btn-r">
  35135. <v-btn v-if="pageType == 'I'" class="custom-btn btn-blue2" @click="fnRegCheck"
  35136. ><i class="ico"></i>저장</v-btn
  35137. >
  35138. <v-btn v-else class="custom-btn btn-blue2" @click="fnRegCheck"
  35139. ><i class="ico"></i>수정</v-btn
  35140. >
  35141. </div>
  35142. </div>
  35143. </div>
  35144. </div>
  35145. </template>
  35146. <script setup>
  35147. import useAxios from "@/composables/useAxios";
  35148. import useUtil from "@/composables/useUtil";
  35149. import useErrorHandler from "@/composables/useErrorHandler";
  35150. import SunEditorWrapper from "@/components/sunEdt.vue";
  35151. /************************************************************************
  35152. | 레이아웃
  35153. ************************************************************************/
  35154. definePageMeta({
  35155. layout: "default",
  35156. });
  35157. /************************************************************************
  35158. | 스토어
  35159. ************************************************************************/
  35160. const useDtStore = useDetailStore();
  35161. /************************************************************************
  35162. | 전역
  35163. ************************************************************************/
  35164. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  35165. const router = useRouter();
  35166. const pageId = ref("CURATION");
  35167. const sunEditorWrapper = ref(null); //에디터용 전역
  35168. const updatedContent = ref(null); //에디터용 전역
  35169. const editorContentReq = ref(""); //에디터용 전역
  35170. const addForm = ref(null);
  35171. const index = ref(null);
  35172. const imageIndex = ref(0);
  35173. const items = ref([]);
  35174. const quillEditor = ref(null);
  35175. const customToolbar = ref([["image"]]); // 에디터에서 이미지 첨부만 가능하게끔
  35176. const imgTemp = ref(null);
  35177. const rowId = ref();
  35178. const form = ref({
  35179. formValue0: "KR",
  35180. formValue1: "",
  35181. formValue2: "Y",
  35182. // formValue3: "",
  35183. formValue4: "",
  35184. formValue5: "",
  35185. formValue6: "",
  35186. formValue7: null,
  35187. formValue8: "",
  35188. formValue9: "",
  35189. // fileResponse: null,
  35190. });
  35191. const fileUpload = ref(null);
  35192. const uploadFiles = ref([
  35193. {
  35194. file_name: "",
  35195. ogn_name: "",
  35196. },
  35197. ]);
  35198. const uploadPicFiles = ref([
  35199. {
  35200. file_name: "",
  35201. ogn_name: "-",
  35202. },
  35203. ]);
  35204. const pageType = ref("");
  35205. const apiUrl = ref("");
  35206. apiUrl.value = import.meta.env.VITE_APP_API_URL;
  35207. const objProc = ref({
  35208. validErrorMessage: "",
  35209. });
  35210. /************************************************************************
  35211. | 함수(METHODS)
  35212. ************************************************************************/
  35213. const listLocated = () => {
  35214. router.push({
  35215. path: "/view/media/curationList",
  35216. });
  35217. };
  35218. /*======================================================================
  35219. | 작성 시퀀스
  35220. | 1. 작성 컨펌
  35221. | 2. 버튼 체크
  35222. | 3. 등록시 -> 등록 API 호출
  35223. ======================================================================*/
  35224. const fnRegCheck = async () => {
  35225. //BASE64에서 실제 파일서버에 파일 전성후 내용 컨텐츠 REAL주소로 변경
  35226. await editorContent();
  35227. nextTick(() => {
  35228. if (addForm.value && typeof addForm.value.validate === "function") {
  35229. addForm.value
  35230. .validate()
  35231. .then((isValid) => {
  35232. if (
  35233. isValid.valid &&
  35234. form.value.formValue7 != null &&
  35235. updatedContent.value != undefined &&
  35236. updatedContent.value != "<p><br></p>" &&
  35237. updatedContent.value != null
  35238. ) {
  35239. if (pageType.value == "I") fnRegEvt();
  35240. else fnUpdEvt();
  35241. } else {
  35242. let param = {
  35243. id: pageId,
  35244. title: "공고사항",
  35245. content: "필수항목을 입력해주세요.",
  35246. yes: {
  35247. text: "확인",
  35248. isProc: false,
  35249. },
  35250. no: {
  35251. text: "취소",
  35252. isProc: false,
  35253. },
  35254. };
  35255. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  35256. }
  35257. })
  35258. .catch((err) => {
  35259. console.error("벨리데이션 에러", err);
  35260. });
  35261. } else {
  35262. console.error("항목 누락체크[fnRegCheck]]");
  35263. }
  35264. });
  35265. };
  35266. const fnRegEvt = () => {
  35267. let param = {
  35268. id: pageId,
  35269. title: "큐레이션",
  35270. content: "등록하시겠습니까?",
  35271. yes: {
  35272. text: "등록",
  35273. isProc: true,
  35274. event: "FN_INSERT",
  35275. param: "",
  35276. },
  35277. no: {
  35278. text: "취소",
  35279. isProc: false,
  35280. },
  35281. };
  35282. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  35283. };
  35284. const fnInsert = () => {
  35285. let frm = new FormData();
  35286. let wterGet = localStorage.getItem("tempAccess");
  35287. let params = JSON.stringify({
  35288. seq: "",
  35289. url_link: form.value.formValue5,
  35290. fol_cnt: Number(form.value.formValue8),
  35291. wter: wterGet,
  35292. brd_cd: "BR03",
  35293. brd_lang: "KR",
  35294. title: form.value.formValue1,
  35295. show_yn: form.value.formValue2,
  35296. content: updatedContent.value,
  35297. ul_type: form.value.formValue9,
  35298. fix_yn: "N",
  35299. });
  35300. frm.append("params", params);
  35301. frm.append("picObj", form.value.formValue7);
  35302. useAxios()
  35303. .post("/brd/ins", frm, { headers: { "Content-Type": "multipart/form-data" } })
  35304. .then((res) => {
  35305. router.push("/view/media/curationList");
  35306. })
  35307. .catch((error) => {
  35308. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  35309. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  35310. })
  35311. .finally(() => {
  35312. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  35313. //objSlt.value.tenantNameList = _cloneDeep(temp);
  35314. });
  35315. };
  35316. const fnUpdEvt = () => {
  35317. let param = {
  35318. id: pageId,
  35319. title: "큐레이션",
  35320. content: "수정하시겠습니까?",
  35321. yes: {
  35322. text: "확인",
  35323. isProc: true,
  35324. event: "FN_UPDATE",
  35325. param: "",
  35326. },
  35327. no: {
  35328. text: "취소",
  35329. isProc: false,
  35330. },
  35331. };
  35332. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  35333. };
  35334. const fnUpdate = () => {
  35335. let frm = new FormData();
  35336. let wterGet = localStorage.getItem("tempAccess");
  35337. let params = JSON.stringify({
  35338. seq: useDtStore.boardInfo.seq,
  35339. url_link: form.value.formValue5,
  35340. fol_cnt: Number(form.value.formValue8),
  35341. wter: wterGet,
  35342. brd_cd: "BR03",
  35343. brd_lang: "KR",
  35344. title: form.value.formValue1,
  35345. show_yn: form.value.formValue2,
  35346. content: updatedContent.value,
  35347. ul_type: form.value.formValue9,
  35348. fix_yn: "N",
  35349. });
  35350. frm.append("params", params);
  35351. frm.append("picObj", form.value.formValue7);
  35352. useAxios()
  35353. .post("/brd/upd", frm, { headers: { "Content-Type": "multipart/form-data" } })
  35354. .then((res) => {
  35355. router.push("/view/media/curationList");
  35356. })
  35357. .catch((error) => {
  35358. $log.debug("[equipMgmtReg][fnGetTenantList][error]");
  35359. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  35360. })
  35361. .finally(() => {
  35362. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  35363. //objSlt.value.tenantNameList = _cloneDeep(temp);
  35364. });
  35365. };
  35366. const fnDelEvt = () => {
  35367. let param = {
  35368. id: pageId,
  35369. title: "큐레이션",
  35370. content: "삭제하시겠습니까?",
  35371. yes: {
  35372. text: "확인",
  35373. isProc: true,
  35374. event: "FN_DELETE",
  35375. param: "",
  35376. },
  35377. no: {
  35378. text: "취소",
  35379. isProc: false,
  35380. },
  35381. };
  35382. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  35383. };
  35384. const fnDelete = () => {
  35385. let wterGet = localStorage.getItem("tempAccess");
  35386. let req = {
  35387. brd_cd: "BR03",
  35388. seq: useDtStore.boardInfo.seq,
  35389. wter: wterGet,
  35390. };
  35391. useAxios()
  35392. .post("/brd/del", req)
  35393. .then((res) => {
  35394. router.push("/view/media/curationList");
  35395. })
  35396. .catch((error) => {
  35397. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  35398. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  35399. })
  35400. .finally(() => {
  35401. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  35402. //objSlt.value.tenantNameList = _cloneDeep(temp);
  35403. });
  35404. };
  35405. const fnDetail = () => {
  35406. let req = {
  35407. seq: useDtStore.boardInfo.seq,
  35408. };
  35409. useAxios()
  35410. .post("/brd/detail", req)
  35411. .then((res) => {
  35412. form.value.formValue0 = res.data.brd_lang;
  35413. form.value.formValue1 = res.data.title;
  35414. form.value.formValue2 = res.data.show_yn;
  35415. //에디터에 컨텐츠 전달
  35416. editorContentReq.value = res.data.content;
  35417. form.value.formValue5 = res.data.url_link;
  35418. form.value.formValue8 = res.data.fol_cnt;
  35419. form.value.formValue9 = res.data.ul_type;
  35420. form.value.formValue7 = res.data.file_title_pic;
  35421. uploadPicFiles.value[0].file_name = res.data.file_title_pic;
  35422. uploadPicFiles.value[0].ogn_name = res.data.ogn_f_title_pic;
  35423. imgTemp.value =
  35424. apiUrl.value +
  35425. "/images/" +
  35426. res.data.path.replace(/.*\/files\//, "") +
  35427. "/" +
  35428. res.data.file_title_pic;
  35429. })
  35430. .catch((error) => {
  35431. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  35432. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  35433. })
  35434. .finally(() => {
  35435. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  35436. //objSlt.value.tenantNameList = _cloneDeep(temp);
  35437. });
  35438. };
  35439. const fnPicFileUploadOpen = () => {
  35440. let fileUpload = document.getElementById("fileupload_pic");
  35441. if (fileUpload != null) {
  35442. fileUpload.click();
  35443. }
  35444. };
  35445. const fnUploadPicFileCheck = () => {
  35446. if (form.value.formValue7) {
  35447. // 10Mb 이상은 업로드 불가
  35448. if (form.value.formValue7.size > 10 * 1024 * 1024) {
  35449. fnOpenCommPop("10mb 이상은 업로드가 불가합니다.");
  35450. form.value.formValue7 = null;
  35451. return;
  35452. }
  35453. // 이미지 파일 형식 체크
  35454. let extension = form.value.formValue7.name.split(".").pop().toLowerCase();
  35455. if (
  35456. extension != "jpg" &&
  35457. extension != "jpeg" &&
  35458. extension != "png" &&
  35459. extension != "gif"
  35460. ) {
  35461. fnOpenCommPop("파일 형식 또는 확장자가 올바르지 않습니다.");
  35462. form.value.formValue7 = null;
  35463. return;
  35464. }
  35465. objProc.validErrorMessage = "";
  35466. // 이미지 미리보기
  35467. let previewImage = new Image();
  35468. let tempImageUrl = window.URL.createObjectURL(form.value.formValue7);
  35469. previewImage.src = tempImageUrl;
  35470. items.value[0] = tempImageUrl;
  35471. imgTemp.value = tempImageUrl;
  35472. }
  35473. };
  35474. const clearFile = () => {
  35475. form.value.formValue7 = null;
  35476. };
  35477. const fnOpenCommPop = (__TEXT) => {
  35478. let param = {
  35479. id: pageId,
  35480. title: "알림",
  35481. content: __TEXT,
  35482. yes: {
  35483. text: "확인",
  35484. isProc: false,
  35485. },
  35486. no: {
  35487. text: "취소",
  35488. isProc: false,
  35489. },
  35490. };
  35491. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  35492. };
  35493. /*=======================================================================
  35494. | 최종 에디터 이미지 url치환 : S
  35495. /*=======================================================================*/
  35496. const editorContent = async () => {
  35497. const content = sunEditorWrapper.value.getEditorContent();
  35498. updatedContent.value = await processEditorContent(content);
  35499. console.log("Updated content:", updatedContent.value);
  35500. };
  35501. // Base64 데이터를 Blob으로 변환
  35502. const base64ToBlob = (base64, mimeType) => {
  35503. const byteString = atob(base64.split(",")[1]);
  35504. const arrayBuffer = new ArrayBuffer(byteString.length);
  35505. const uint8Array = new Uint8Array(arrayBuffer);
  35506. for (let i = 0; i < byteString.length; i++) {
  35507. uint8Array[i] = byteString.charCodeAt(i);
  35508. }
  35509. return new Blob([uint8Array], { type: mimeType });
  35510. };
  35511. // Base64 데이터를 File 객체로 변환
  35512. const base64ToFile = (base64, mimeType, fileName) => {
  35513. const blob = base64ToBlob(base64, mimeType);
  35514. return new File([blob], fileName, { type: mimeType });
  35515. };
  35516. // 이미지 업로드 처리 (useAxios)
  35517. const uploadImage = async (file) => {
  35518. const formDataEdt = new FormData();
  35519. formDataEdt.append("picObj", file);
  35520. return useAxios()
  35521. .post("/pic/upload", formDataEdt, {
  35522. headers: { "Content-Type": "multipart/form-data" },
  35523. })
  35524. .then((res) => {
  35525. const filePath = res.data.ogn_name.path.replace(/.*\/files\//, "");
  35526. const fileName = res.data.ogn_name.file_name;
  35527. return `${apiUrl.value}/images/${filePath}/${fileName}`; // 최종 URL 반환
  35528. })
  35529. .catch((error) => {
  35530. console.error("Image upload failed:", error);
  35531. return null;
  35532. });
  35533. };
  35534. // 에디터 내용 처리 및 이미지 업로드
  35535. const processEditorContent = async (content) => {
  35536. const parser = new DOMParser();
  35537. const doc = parser.parseFromString(content, "text/html");
  35538. const images = doc.querySelectorAll("img");
  35539. for (let i = 0; i < images.length; i++) {
  35540. const img = images[i];
  35541. const src = img.src;
  35542. if (src.startsWith("data:image")) {
  35543. // MIME 타입과 파일 이름 추출
  35544. const mimeType = src.split(";")[0].split(":")[1];
  35545. const extension = mimeType.split("/")[1];
  35546. const fileName = `image-${i + 1}.${extension}`;
  35547. // Base64 데이터를 File 객체로 변환
  35548. const file = base64ToFile(src, mimeType, fileName);
  35549. // 이미지 업로드 및 URL 반환
  35550. const finalUrl = await uploadImage(file);
  35551. if (finalUrl) {
  35552. img.src = finalUrl; // 이미지 src 업데이트
  35553. }
  35554. }
  35555. }
  35556. return doc.body.innerHTML; // 최종 수정된 HTML 반환
  35557. };
  35558. /*=======================================================================
  35559. | 최종 에디터 이미지 url치환 : E
  35560. /*=======================================================================*/
  35561. /************************************************************************
  35562. | 팝업 이벤트버스 정의
  35563. ************************************************************************/
  35564. $eventBus.off("FN_INSERT");
  35565. $eventBus.on("FN_INSERT", () => {
  35566. fnInsert();
  35567. });
  35568. $eventBus.off("FN_DELETE");
  35569. $eventBus.on("FN_DELETE", () => {
  35570. fnDelete();
  35571. });
  35572. $eventBus.off("FN_UPDATE");
  35573. $eventBus.on("FN_UPDATE", () => {
  35574. fnUpdate();
  35575. });
  35576. $eventBus.off("FN_CONFIRM");
  35577. $eventBus.on("FN_CONFIRM");
  35578. /************************************************************************
  35579. | 라이프사이클
  35580. ************************************************************************/
  35581. onMounted(() => {
  35582. pageType.value = useDtStore.boardInfo.pageType;
  35583. //상세 등록 아니 리스트 클릭시 상세 정보로 접근
  35584. if (pageType.value == "U") {
  35585. fnDetail();
  35586. }
  35587. });
  35588. /************************************************************************
  35589. | WATCH
  35590. ************************************************************************/
  35591. </script>
  35592. </file>
  35593. <file path="pages/view/common/settle/curationList.vue">
  35594. <template>
  35595. <div>
  35596. <div class="inner--headers">
  35597. <h2>{{ pageId }}</h2>
  35598. <div class="bread--crumbs--wrap">
  35599. <span>홈</span>
  35600. <span>{{ pageId }}</span>
  35601. <span v-if="pageIdSub">{{ pageIdSub }}</span>
  35602. </div>
  35603. </div>
  35604. <div class="search--modules">
  35605. <div class="form--cont--filter">
  35606. <v-select
  35607. v-model="filter"
  35608. :items="filderArr"
  35609. variant="outlined"
  35610. class="custom-select"
  35611. >
  35612. </v-select>
  35613. </div>
  35614. <div class="form--cont--text">
  35615. <v-text-field
  35616. v-model="searchModel"
  35617. class="custom-input mini"
  35618. style="width: 100%"
  35619. placeholder="검색어를 입력하세요"
  35620. ></v-text-field>
  35621. </div>
  35622. <v-btn
  35623. class="custom-btn btn-blue mini sch--btn"
  35624. @click="fnSearch(searchModel, filter)"
  35625. >검색</v-btn
  35626. >
  35627. </div>
  35628. <div class="data--list--wrap">
  35629. <div class="btn--actions--wrap">
  35630. <div class="left--sections">
  35631. <!-- <v-btn class="custom-btn mini btn-white">선택 삭제</v-btn> -->
  35632. </div>
  35633. <div class="right--sections">
  35634. <v-btn class="custom-btn mini btn-reg" @click="addLocated"
  35635. ><i class="ico"></i>신규 등록</v-btn
  35636. >
  35637. </div>
  35638. </div>
  35639. <div class="tbl-wrapper">
  35640. <div class="tbl-wrap">
  35641. <!-- ag grid -->
  35642. <ag-grid-vue
  35643. style="width: 100%; height: calc(10 * 2.94rem)"
  35644. class="ag-theme-quartz"
  35645. :gridOptions="gridOptions"
  35646. :rowData="tblItems"
  35647. :paginationPageSize="pageObj.pageSize"
  35648. :suppressPaginationPanel="true"
  35649. @grid-ready="onGridReady"
  35650. @rowClicked="detailLocated"
  35651. >
  35652. </ag-grid-vue>
  35653. <!-- 페이징 -->
  35654. <div class="ag-grid-custom-pagenations">
  35655. <pagination @chg_page="chgPage" :pageObj="pageObj"></pagination>
  35656. </div>
  35657. </div>
  35658. </div>
  35659. </div>
  35660. </div>
  35661. </template>
  35662. <script setup>
  35663. import pagination from "../components/common/pagination.vue";
  35664. import { AgGridVue } from "ag-grid-vue3";
  35665. import searchModules from "@/components/search/searchModules";
  35666. /************************************************************************
  35667. | 레이아웃
  35668. ************************************************************************/
  35669. definePageMeta({
  35670. layout: "default",
  35671. });
  35672. /************************************************************************
  35673. | PROPS
  35674. ************************************************************************/
  35675. const props = defineProps({
  35676. propsData: {
  35677. type: Object,
  35678. default: () => {},
  35679. },
  35680. });
  35681. /************************************************************************
  35682. | 스토어
  35683. ************************************************************************/
  35684. const useDtStore = useDetailStore();
  35685. /************************************************************************
  35686. | 전역
  35687. ************************************************************************/
  35688. const filter = ref("");
  35689. const filderArr = ref([
  35690. { title: "선택하세요", value: "" },
  35691. { title: "제목", value: "title" },
  35692. { title: "내용", value: "content" },
  35693. ]);
  35694. const searchModel = ref("");
  35695. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  35696. const router = useRouter();
  35697. const pageId = ref("CURATION");
  35698. const pageIdSub = ref();
  35699. let pageObj = ref({
  35700. page: 1, // 현재 페이지
  35701. pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
  35702. pageSize: 10, // 테이블 조회 데이터 개수
  35703. totalCnt: 0, // 전체 페이지
  35704. });
  35705. const tblItems = ref([]); // stat 데이터
  35706. /* eslint-disable */
  35707. /* prettier-ignore */
  35708. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  35709. const rowHeightRem = 2.65; // 원하는 rem 값
  35710. const rowHeightPx = rowHeightRem * remToPx();
  35711. const gridApi = shallowRef();
  35712. // gridOption
  35713. const gridOptions = {
  35714. columnDefs: [
  35715. {
  35716. headerName: "No",
  35717. valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
  35718. sortable: false,
  35719. width: 70,
  35720. },
  35721. { headerName: "언어", field: "brd_lang", sortable: true, width: 70 },
  35722. { headerName: "제목", field: "title", sortable: false, width: 500 },
  35723. // { headerName: "조회수", field: "", sortable: false },
  35724. { headerName: "노출여부", field: "show_yn", sortable: true, width: 70 },
  35725. { headerName: "작성자", field: "admin_name", sortable: false, width: 120 },
  35726. { headerName: "등록일", field: "crt_dtime", sortable: false, width: 120 },
  35727. ],
  35728. rowData: tblItems.value, // 테이블 데이터
  35729. autoSizeStrategy: {
  35730. type: "fitGridWidth", // width맞춤
  35731. },
  35732. suppressMovableColumns: true,
  35733. headerHeight: rowHeightPx,
  35734. rowHeight: rowHeightPx,
  35735. pagination: true,
  35736. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  35737. // rowSelection: {
  35738. // checkboxes: true,
  35739. // headerCheckbox: true,
  35740. // enableClickSelection: false,
  35741. // mode: "multiRow",
  35742. // },
  35743. };
  35744. /************************************************************************
  35745. | 함수(METHODS)
  35746. ************************************************************************/
  35747. const onGridReady = (__PARAMS) => {
  35748. gridApi.value = __PARAMS.api;
  35749. };
  35750. const chgPage = (__PAGE) => {
  35751. pageObj.value.page = __PAGE;
  35752. gridApi.value.paginationGoToPage(__PAGE - 1);
  35753. };
  35754. const addLocated = () => {
  35755. router.push({
  35756. path: "/view/media/curationAdd",
  35757. //query: { id: rowId },
  35758. });
  35759. useDtStore.boardInfo.pageType = "I";
  35760. };
  35761. const detailLocated = (__EVENT) => {
  35762. router.push({
  35763. path: "/view/media/curationAdd",
  35764. });
  35765. useDtStore.boardInfo.seq = __EVENT.data.seq;
  35766. useDtStore.boardInfo.pageType = "U";
  35767. };
  35768. const newsListGet = () => {
  35769. let _req = {
  35770. _size: 1000,
  35771. _index: 0,
  35772. brd_lang: "",
  35773. brd_cd: "BR03",
  35774. };
  35775. useAxios()
  35776. .post("/brd/list", _req)
  35777. .then((res) => {
  35778. _req._size = res.data.list.length;
  35779. tblItems.value = res.data.list;
  35780. pageObj.value.totalCnt = tblItems.value.length;
  35781. })
  35782. .catch((error) => {});
  35783. };
  35784. const fnSearch = (__KEYWORD, __FILTER) => {
  35785. let _req = {
  35786. _size: 1000,
  35787. _index: 0,
  35788. brd_lang: "",
  35789. brd_cd: "BR03",
  35790. content: __FILTER == "content" ? __KEYWORD : __FILTER == "" ? __KEYWORD : null,
  35791. title: __FILTER == "title" ? __KEYWORD : __FILTER == "" ? __KEYWORD : null,
  35792. };
  35793. useAxios()
  35794. .post("/brd/list", _req)
  35795. .then((res) => {
  35796. _req._size = res.data.list.length;
  35797. tblItems.value = res.data.list;
  35798. pageObj.value.totalCnt = tblItems.value.length;
  35799. })
  35800. .catch((error) => {});
  35801. };
  35802. /************************************************************************
  35803. | WATCH
  35804. ************************************************************************/
  35805. onMounted(() => {
  35806. newsListGet();
  35807. });
  35808. </script>
  35809. </file>
  35810. <file path="pages/view/common/settle/index.vue">
  35811. <template>
  35812. <div>
  35813. <div class="inner--headers">
  35814. <h2>{{ pageId }}</h2>
  35815. <div class="bread--crumbs--wrap">
  35816. <span>홈</span>
  35817. <span>{{ pageId }}</span>
  35818. <span v-if="pageIdSub">{{ pageIdSub }}</span>
  35819. </div>
  35820. </div>
  35821. <div class="search--modules type2">
  35822. <div class="search--inner">
  35823. <div class="form--cont--filter">
  35824. <v-select
  35825. v-model="filter"
  35826. :items="filderArr"
  35827. variant="outlined"
  35828. class="custom-select"
  35829. >
  35830. </v-select>
  35831. </div>
  35832. <div class="form--cont--text">
  35833. <v-text-field
  35834. v-model="searchModel"
  35835. class="custom-input mini"
  35836. style="width: 100%"
  35837. placeholder="검색어를 입력하세요"
  35838. ></v-text-field>
  35839. </div>
  35840. </div>
  35841. <div class="search--inner">
  35842. <div class="calendar-wrap ml--0">
  35843. <div class="calendar">
  35844. <VueDatePicker
  35845. :format="datePickerFormat"
  35846. v-model="searchStartDate"
  35847. placeholder="날짜를 선택하세요"
  35848. :auto-apply="true"
  35849. week-start="0"
  35850. ></VueDatePicker>
  35851. </div>
  35852. <span class="text">~</span>
  35853. <div class="calendar">
  35854. <VueDatePicker
  35855. v-model="searchEndDate"
  35856. :format="datePickerFormat"
  35857. placeholder="날짜를 선택하세요"
  35858. :auto-apply="true"
  35859. week-start="0"
  35860. ></VueDatePicker>
  35861. </div>
  35862. <div class="month--selector">
  35863. <v-btn
  35864. v-for="option in dateOptions"
  35865. :key="option.value"
  35866. :class="{ actv: selectedRange === option.value }"
  35867. @click="setDateRange(option.value)"
  35868. elevation="0"
  35869. >
  35870. {{ option.label }}
  35871. </v-btn>
  35872. </div>
  35873. </div>
  35874. </div>
  35875. <v-btn
  35876. class="custom-btn btn-blue mini sch--btn"
  35877. @click="fnSearch(searchModel, filter)"
  35878. >검색</v-btn
  35879. >
  35880. </div>
  35881. <div class="data--list--wrap">
  35882. <div class="btn--actions--wrap">
  35883. <div class="left--sections">
  35884. <!-- <v-btn class="custom-btn mini btn-white">선택 삭제</v-btn> -->
  35885. </div>
  35886. </div>
  35887. <div class="tbl-wrapper">
  35888. <div class="tbl-wrap">
  35889. <!-- ag grid -->
  35890. <ag-grid-vue
  35891. style="width: 100%; height: calc(10 * 2.94rem)"
  35892. class="ag-theme-quartz"
  35893. :gridOptions="gridOptions"
  35894. :rowData="tblItems"
  35895. :paginationPageSize="pageObj.pageSize"
  35896. :suppressPaginationPanel="true"
  35897. @grid-ready="onGridReady"
  35898. @rowClicked="detailLocated"
  35899. >
  35900. </ag-grid-vue>
  35901. <!-- 페이징 -->
  35902. <div class="ag-grid-custom-pagenations">
  35903. <pagination @chg_page="chgPage" :pageObj="pageObj"></pagination>
  35904. </div>
  35905. </div>
  35906. </div>
  35907. </div>
  35908. </div>
  35909. </template>
  35910. <script setup>
  35911. import VueDatePicker from "@vuepic/vue-datepicker";
  35912. import "@vuepic/vue-datepicker/dist/main.css";
  35913. import { AgGridVue } from "ag-grid-vue3";
  35914. import pagination from "../components/common/pagination.vue";
  35915. /************************************************************************
  35916. | 레이아웃
  35917. ************************************************************************/
  35918. definePageMeta({
  35919. layout: "default",
  35920. });
  35921. /************************************************************************
  35922. | PROPS
  35923. ************************************************************************/
  35924. const props = defineProps({
  35925. propsData: {
  35926. type: Object,
  35927. default: () => {},
  35928. },
  35929. });
  35930. /************************************************************************
  35931. | 스토어
  35932. ************************************************************************/
  35933. const useDtStore = useDetailStore();
  35934. /************************************************************************
  35935. | 전역
  35936. ************************************************************************/
  35937. const filter = ref("");
  35938. const filderArr = ref([
  35939. { title: "전체", value: "" },
  35940. { title: "벤더사", value: "title" },
  35941. ]);
  35942. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  35943. const router = useRouter();
  35944. const pageId = ref("정산 관리");
  35945. const pageIdSub = ref();
  35946. const searchModel = ref("");
  35947. const selectedRange = ref('all');
  35948. const itemStartDate = ref("");
  35949. const searchStartDate = ref("");
  35950. const searchEndDate = ref("");
  35951. const datePickerFormat = "yyyy-MM-dd";
  35952. const dateOptions = [
  35953. { label: '오늘', value: 'today' },
  35954. { label: '7일', value: '7d' },
  35955. { label: '1개월', value: '1m' },
  35956. { label: '3개월', value: '3m' },
  35957. { label: '전체', value: 'all' },
  35958. ]
  35959. let pageObj = ref({
  35960. page: 1, // 현재 페이지
  35961. pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
  35962. pageSize: 10, // 테이블 조회 데이터 개수
  35963. totalCnt: 0, // 전체 페이지
  35964. });
  35965. const tblItems = ref([]); // stat 데이터
  35966. /* eslint-disable */
  35967. /* prettier-ignore */
  35968. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  35969. const rowHeightRem = 2.65; // 원하는 rem 값
  35970. const rowHeightPx = rowHeightRem * remToPx();
  35971. const gridApi = shallowRef();
  35972. // gridOption
  35973. const gridOptions = {
  35974. columnDefs: [
  35975. {
  35976. headerName: "No",
  35977. valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
  35978. sortable: false,
  35979. width: 70,
  35980. },
  35981. { headerName: "벤더사", field: "brd_lang", sortable: true, width: 150 },
  35982. { headerName: "제품 총수량", field: "title", sortable: false, width: 70 },
  35983. { headerName: "판매금액", field: "show_yn", sortable: true, width: 70 },
  35984. { headerName: "정산기간", field: "crt_dtime", sortable: false, width: 120 },
  35985. ],
  35986. rowData: tblItems.value, // 테이블 데이터
  35987. autoSizeStrategy: {
  35988. type: "fitGridWidth", // width맞춤
  35989. },
  35990. suppressMovableColumns: true,
  35991. headerHeight: rowHeightPx,
  35992. rowHeight: rowHeightPx,
  35993. pagination: true,
  35994. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  35995. // rowSelection: {
  35996. // checkboxes: true,
  35997. // headerCheckbox: true,
  35998. // enableClickSelection: false,
  35999. // mode: "multiRow",
  36000. // },
  36001. };
  36002. /************************************************************************
  36003. | 함수(METHODS)
  36004. ************************************************************************/
  36005. const onGridReady = (__PARAMS) => {
  36006. gridApi.value = __PARAMS.api;
  36007. };
  36008. const chgPage = (__PAGE) => {
  36009. pageObj.value.page = __PAGE;
  36010. gridApi.value.paginationGoToPage(__PAGE - 1);
  36011. };
  36012. const detailLocated = (__EVENT) => {
  36013. router.push({
  36014. path: "/view/media/irAdd",
  36015. });
  36016. useDtStore.boardInfo.seq = __EVENT.data.seq;
  36017. useDtStore.boardInfo.pageType = "U";
  36018. };
  36019. const newsListGet = () => {
  36020. let _req = {
  36021. _size: 1000,
  36022. _index: 0,
  36023. brd_lang: "",
  36024. brd_cd: "BR02",
  36025. };
  36026. useAxios()
  36027. .post("/brd/list", _req)
  36028. .then((res) => {
  36029. _req._size = res.data.list.length;
  36030. tblItems.value = res.data.list;
  36031. pageObj.value.totalCnt = tblItems.value.length;
  36032. })
  36033. .catch((error) => {});
  36034. };
  36035. const setDateRange = (range) => {
  36036. const today = dayjs();
  36037. switch(range) {
  36038. case 'today' :
  36039. searchStartDate.value = today.format('YYYY-MM-DD');
  36040. searchEndDate.value = today.format('YYYY-MM-DD');
  36041. selectedRange.value = 'today';
  36042. break;
  36043. case '7d':
  36044. searchStartDate.value = today.subtract(7, 'day').format('YYYY-MM-DD');
  36045. searchEndDate.value = today.format('YYYY-MM-DD');
  36046. selectedRange.value = '7d';
  36047. break;
  36048. case '1m':
  36049. searchStartDate.value = today.subtract(1, 'month').format('YYYY-MM-DD');
  36050. searchEndDate.value = today.format('YYYY-MM-DD');
  36051. selectedRange.value = '1m';
  36052. break;
  36053. case '3m':
  36054. searchStartDate.value = today.subtract(3, 'month').format('YYYY-MM-DD');
  36055. searchEndDate.value = today.format('YYYY-MM-DD');
  36056. selectedRange.value = '3m';
  36057. break;
  36058. case 'all':
  36059. searchStartDate.value = itemStartDate.value;
  36060. searchEndDate.value = today.format('YYYY-MM-DD');
  36061. selectedRange.value = 'all';
  36062. break
  36063. }
  36064. }
  36065. const fnSearch = (__KEYWORD, __FILTER) => {
  36066. let _req = {
  36067. filter: __FILTER,
  36068. keyword: __KEYWORD,
  36069. startDate: searchStartDate.value,
  36070. endDate: searchEndDate.value,
  36071. //인플루언서의 경우 showYN 추가
  36072. //showYN: "Y"
  36073. };
  36074. useAxios()
  36075. .post("/item/search", _req)
  36076. .then((res) => {
  36077. itemList.value = res.data;
  36078. })
  36079. .catch((error) => {});
  36080. };
  36081. /************************************************************************
  36082. | WATCH
  36083. ************************************************************************/
  36084. onMounted(() => {
  36085. newsListGet();
  36086. });
  36087. </script>
  36088. </file>
  36089. <file path="pages/view/common/settle/irAdd.vue">
  36090. <template>
  36091. <div>
  36092. <div class="inner--headers">
  36093. <h2>{{ pageId }}</h2>
  36094. <div class="bread--crumbs--wrap">
  36095. <span>홈</span>
  36096. <span>미디어 관리</span>
  36097. <span>{{ pageId }}</span>
  36098. </div>
  36099. </div>
  36100. <div class="view-wrap mt--45">
  36101. <div class="view-box">
  36102. <div class="view-box-top">
  36103. <h3 v-if="pageType == 'I'">IR 등록</h3>
  36104. <h3 v-else>IR 수정</h3>
  36105. </div>
  36106. <div class="view-box-btm">
  36107. <div class="form-style1">
  36108. <v-form ref="addForm">
  36109. <table>
  36110. <colgroup>
  36111. <col style="width: 12.5rem" />
  36112. <col />
  36113. </colgroup>
  36114. <tbody>
  36115. <tr>
  36116. <th>언어</th>
  36117. <td>
  36118. <v-radio-group
  36119. v-model="form.formValue0"
  36120. inline
  36121. hide-details
  36122. class="radio--group"
  36123. >
  36124. <v-radio label="Korean" value="KR"></v-radio>
  36125. <v-radio label="English" value="EN"></v-radio>
  36126. <v-radio label="Chinese" value="CN"></v-radio>
  36127. <v-radio label="Japanese" value="JP"></v-radio>
  36128. </v-radio-group>
  36129. </td>
  36130. </tr>
  36131. <tr>
  36132. <th>제목<span class="bul">*</span></th>
  36133. <td>
  36134. <v-text-field
  36135. v-model="form.formValue1"
  36136. class="custom-input mini"
  36137. placeholder="제목을 입력해주세요."
  36138. :rules="[useValid.required('제목')]"
  36139. ></v-text-field>
  36140. </td>
  36141. </tr>
  36142. <tr>
  36143. <th>노출여부</th>
  36144. <td>
  36145. <v-radio-group
  36146. class="radio--group"
  36147. v-model="form.formValue2"
  36148. inline
  36149. hide-details
  36150. >
  36151. <v-radio label="노출" value="Y"></v-radio>
  36152. <v-radio label="비노출" value="N"></v-radio>
  36153. </v-radio-group>
  36154. </td>
  36155. </tr>
  36156. <tr>
  36157. <th>공고날짜<span class="bul">*</span></th>
  36158. <td>
  36159. <v-text-field
  36160. v-model="form.formValue7"
  36161. style="max-width: 400px"
  36162. class="custom-input mini"
  36163. placeholder="공고날짜를 입력해주세요. 예) 2024.12.25"
  36164. :rules="[useValid.required('날짜')]"
  36165. ></v-text-field>
  36166. </td>
  36167. </tr>
  36168. <tr>
  36169. <th>다운로드용 문서<span class="bul">*</span></th>
  36170. <td>
  36171. <div
  36172. class="form--group--inner"
  36173. v-if="pageType == 'U' && uploadFiles[0].file_name"
  36174. >
  36175. <div @click="fnFileDownload(uploadFiles[0])" class="text--box">
  36176. {{ uploadFiles[0].ogn_name }}
  36177. </div>
  36178. </div>
  36179. <div class="form--group flex--type align-start max--w320">
  36180. <v-file-input
  36181. v-model="form.formValue6"
  36182. id="fileupload"
  36183. ref="fileupload"
  36184. accept=".jpg, .jpeg, .png, .zip, .pdf, .ppt, .xls, .pptx, .xlsx, .hwp, .doc, .docx"
  36185. placeholder=""
  36186. class="custom-input mini"
  36187. prepend-icon=""
  36188. label=""
  36189. variant="outlined"
  36190. :rules="[useValid.requiredFile(form.formValue6)]"
  36191. @change="fnUploadFileCheck()"
  36192. ></v-file-input>
  36193. <v-btn class="file--btn" elevation="0" @click="fnFileUploadOpen()"
  36194. >첨부하기</v-btn
  36195. >
  36196. </div>
  36197. </td>
  36198. </tr>
  36199. </tbody>
  36200. </table>
  36201. </v-form>
  36202. </div>
  36203. </div>
  36204. </div>
  36205. <div class="view-btm-btn">
  36206. <div class="btn-l">
  36207. <v-btn class="custom-btn btn-list" @click="listLocated"
  36208. ><i class="ico"></i>목록</v-btn
  36209. >
  36210. <v-btn v-if="pageType == 'U'" class="custom-btn btn-del" @click="fnDelEvt"
  36211. ><i class="ico"></i>삭제</v-btn
  36212. >
  36213. </div>
  36214. <div class="btn-r">
  36215. <v-btn v-if="pageType == 'I'" class="custom-btn btn-blue2" @click="fnRegCheck"
  36216. ><i class="ico"></i>저장</v-btn
  36217. >
  36218. <v-btn v-else class="custom-btn btn-blue2" @click="fnUpdEvt"
  36219. ><i class="ico"></i>수정</v-btn
  36220. >
  36221. </div>
  36222. </div>
  36223. </div>
  36224. </div>
  36225. </template>
  36226. <script setup>
  36227. import useAxios from "@/composables/useAxios";
  36228. import useValid from "@/composables/useValid";
  36229. /************************************************************************
  36230. | 레이아웃
  36231. ************************************************************************/
  36232. definePageMeta({
  36233. layout: "default",
  36234. });
  36235. /************************************************************************
  36236. | 스토어
  36237. ************************************************************************/
  36238. const useDtStore = useDetailStore();
  36239. /************************************************************************
  36240. | 전역
  36241. ************************************************************************/
  36242. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  36243. const router = useRouter();
  36244. const pageId = ref("공고사항");
  36245. const index = ref(null);
  36246. const imageIndex = ref(0);
  36247. const items = ref([]);
  36248. const quillEditor = ref(null);
  36249. const imgTemp = ref(null);
  36250. const rowId = ref();
  36251. const addForm = ref(null);
  36252. const form = ref({
  36253. formValue0: "KR",
  36254. formValue1: "",
  36255. formValue2: "Y",
  36256. formValue3: "",
  36257. formValue4: null,
  36258. formValue5: "",
  36259. formValue6: null,
  36260. formValue7: "",
  36261. fileResponse: null,
  36262. });
  36263. const uploadFiles = ref([
  36264. {
  36265. file_name: "",
  36266. ogn_name: "",
  36267. },
  36268. ]);
  36269. const pageType = ref("");
  36270. /************************************************************************
  36271. | 함수(METHODS)
  36272. ************************************************************************/
  36273. const listLocated = () => {
  36274. router.push({
  36275. path: "/view/media/irList",
  36276. });
  36277. };
  36278. const editorOptions = ref({
  36279. modules: {
  36280. toolbar: {
  36281. handlers: {
  36282. image: () => {
  36283. // DOM 요소로 input[type="file"]을 생성하여 이미지 파일을 선택하게 한다.
  36284. const input = document.createElement("input");
  36285. input.setAttribute("type", "file");
  36286. input.setAttribute("accept", "image/*");
  36287. input.click(); // 파일 선택 창 열기
  36288. input.onchange = async () => {
  36289. const file = input.files[0];
  36290. if (file) {
  36291. const formDataEdt = new FormData();
  36292. formDataEdt.append("fileObj", file);
  36293. try {
  36294. // const response = await this.$api.post("/file/upload", formDataEdt, {
  36295. // headers: { "Content-Type": "multipart/form-data" },
  36296. // }); // 서버에 이미지 업로드
  36297. const response = useAxios()
  36298. .post("/file/upload", formDataEdt, {
  36299. headers: { "Content-Type": "multipart/form-data" },
  36300. })
  36301. .then((res) => {})
  36302. .catch((error) => {
  36303. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  36304. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  36305. })
  36306. .finally(() => {
  36307. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  36308. //objSlt.value.tenantNameList = _cloneDeep(temp);
  36309. });
  36310. const quill = this.$refs.quillEditor.quill;
  36311. const range = quill.getSelection(); // 현재 커서 위치 가져오기
  36312. const fileData = response.data.list; // 예: { "ic_army.png": "20241010183735636" }
  36313. const fileName = Object.keys(fileData)[0]; // 파일 이름 (예: "ic_army.png")
  36314. const fileId = fileData[fileName]; // ID (예: "20241010183735636")
  36315. quill.insertEmbed(
  36316. range.index,
  36317. "image",
  36318. process.env.API_URL + "/file/download/" + fileId
  36319. );
  36320. } catch (error) {
  36321. console.error("Image upload failed:", error);
  36322. }
  36323. }
  36324. };
  36325. },
  36326. },
  36327. },
  36328. },
  36329. });
  36330. /**
  36331. * 첨부파일 다운로드
  36332. */
  36333. const fnFileDownload = (objFile) => {
  36334. let reqData = { file_name: objFile.file_name };
  36335. useAxios()
  36336. .post("/file/download", reqData, { responseType: "blob" })
  36337. .then((res) => {
  36338. const contentType = res.headers["content-type"] || "application/octet-stream"; // 기본값
  36339. const blob = new Blob([res.data], { type: contentType });
  36340. let fileUrl = window.URL.createObjectURL(blob);
  36341. let link = document.createElement("a");
  36342. link.href = fileUrl;
  36343. link.style.display = "none";
  36344. console.log(objFile.ogn_name);
  36345. link.download = objFile.ogn_name;
  36346. document.body.appendChild(link);
  36347. link.click();
  36348. link.remove();
  36349. window.URL.revokeObjectURL(fileUrl);
  36350. })
  36351. .catch((error) => {})
  36352. .finally(() => {});
  36353. };
  36354. const fnFileUploadOpen = () => {
  36355. let fileUpload = document.getElementById("fileupload");
  36356. if (fileUpload != null) {
  36357. fileUpload.click();
  36358. }
  36359. };
  36360. /**
  36361. * 첨부파일 등록
  36362. */
  36363. const fnUploadFileCheck = () => {
  36364. if (form.value.formValue6) {
  36365. // 10Mb 이상은 업로드 불가
  36366. if (form.value.formValue6.size > 10 * 1024 * 1024) {
  36367. fnOpenCommPop("10mb 이상은 업로드가 불가합니다.");
  36368. form.value.formValue6 = null;
  36369. return;
  36370. }
  36371. // 이미지 파일 형식 체크
  36372. let extension = form.value.formValue6.name.split(".").pop().toLowerCase();
  36373. if (
  36374. // extension != "jpg" &&
  36375. // extension != "jpeg" &&
  36376. // extension != "png" &&
  36377. // extension != "gif" &&
  36378. extension != "zip" &&
  36379. // extension != "ppt" &&
  36380. // extension != "pptx" &&
  36381. extension != "pdf"
  36382. // extension != "xls" &&
  36383. // extension != "xlsx" &&
  36384. // extension != "hwp" &&
  36385. // extension != "doc" &&
  36386. // extension != "docx"
  36387. ) {
  36388. fnOpenCommPop("파일 형식 또는 확장자가 올바르지 않습니다.");
  36389. form.value.formValue6 = null;
  36390. return;
  36391. }
  36392. }
  36393. };
  36394. const fnOpenCommPop = (__TEXT) => {
  36395. let param = {
  36396. id: pageId,
  36397. title: "알림",
  36398. content: __TEXT,
  36399. yes: {
  36400. text: "확인",
  36401. isProc: false,
  36402. },
  36403. no: {
  36404. text: "취소",
  36405. isProc: false,
  36406. },
  36407. };
  36408. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  36409. };
  36410. /*======================================================================
  36411. | 작성 시퀀스
  36412. | 1. 작성 컨펌
  36413. | 2. 버튼 체크
  36414. | 3. 등록시 -> 등록 API 호출
  36415. ======================================================================*/
  36416. const fnRegCheck = () => {
  36417. nextTick(() => {
  36418. if (addForm.value && typeof addForm.value.validate === "function") {
  36419. addForm.value
  36420. .validate()
  36421. .then((isValid) => {
  36422. if (isValid.valid) {
  36423. fnRegEvt();
  36424. } else {
  36425. let param = {
  36426. id: pageId,
  36427. title: "공고사항",
  36428. content: "필수항목을 입력해주세요.",
  36429. yes: {
  36430. text: "확인",
  36431. isProc: false,
  36432. },
  36433. no: {
  36434. text: "취소",
  36435. isProc: false,
  36436. },
  36437. };
  36438. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  36439. }
  36440. })
  36441. .catch((err) => {
  36442. console.error("벨리데이션 에러", err);
  36443. });
  36444. } else {
  36445. console.error("항목 누락체크[fnRegCheck]]");
  36446. }
  36447. });
  36448. };
  36449. const fnRegEvt = () => {
  36450. // 공고날짜 체크
  36451. const datePattern = /^\d{4}\.\d{2}\.\d{2}$/;
  36452. if (!datePattern.test(form.value.formValue7)) {
  36453. let param = {
  36454. id: pageId,
  36455. title: "공고사항",
  36456. content: "날짜를 올바른 형식(YYYY.MM.DD)으로 입력해주세요",
  36457. yes: {
  36458. text: "확인",
  36459. isProc: false,
  36460. },
  36461. no: {
  36462. text: "취소",
  36463. isProc: false,
  36464. },
  36465. };
  36466. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  36467. return false;
  36468. } else {
  36469. let param = {
  36470. id: pageId,
  36471. title: "공고사항",
  36472. content: "등록하시겠습니까?",
  36473. yes: {
  36474. text: "등록",
  36475. isProc: true,
  36476. event: "FN_INSERT",
  36477. param: "",
  36478. },
  36479. no: {
  36480. text: "취소",
  36481. isProc: false,
  36482. },
  36483. };
  36484. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  36485. }
  36486. };
  36487. const fnInsert = () => {
  36488. let frm = new FormData();
  36489. let wterGet = localStorage.getItem("tempAccess");
  36490. let params = JSON.stringify({
  36491. wter: wterGet,
  36492. brd_cd: "BR02",
  36493. brd_lang: form.value.formValue0,
  36494. show_yn: form.value.formValue2,
  36495. title: form.value.formValue1,
  36496. cmd_date: form.value.formValue7,
  36497. });
  36498. frm.append("params", params);
  36499. frm.append("fileObj", form.value.formValue6);
  36500. useAxios()
  36501. .post("/brd/ins", frm, { headers: { "Content-Type": "multipart/form-data" } })
  36502. .then((res) => {
  36503. router.push("/view/media/irList");
  36504. })
  36505. .catch((error) => {
  36506. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  36507. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  36508. })
  36509. .finally(() => {
  36510. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  36511. //objSlt.value.tenantNameList = _cloneDeep(temp);
  36512. });
  36513. };
  36514. const fnUpdEvt = () => {
  36515. // 제목 필수체크
  36516. if(!form.value.formValue1){
  36517. let param = {
  36518. id: pageId,
  36519. title: "공고사항",
  36520. content: "제목을 입력해주세요.",
  36521. yes: {
  36522. text: "확인",
  36523. isProc: false,
  36524. },
  36525. no: {
  36526. text: "취소",
  36527. isProc: false,
  36528. },
  36529. };
  36530. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  36531. return false;
  36532. }
  36533. // 공고날짜 체크
  36534. const datePattern = /^\d{4}\.\d{2}\.\d{2}$/;
  36535. if (!datePattern.test(form.value.formValue7)) {
  36536. let param = {
  36537. id: pageId,
  36538. title: "공고사항",
  36539. content: "날짜를 올바른 형식(YYYY.MM.DD)으로 입력해주세요",
  36540. yes: {
  36541. text: "확인",
  36542. isProc: false,
  36543. },
  36544. no: {
  36545. text: "취소",
  36546. isProc: false,
  36547. },
  36548. };
  36549. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  36550. return false;
  36551. } else {
  36552. let param = {
  36553. id: pageId,
  36554. title: "공고사항",
  36555. content: "수정하시겠습니까?",
  36556. yes: {
  36557. text: "확인",
  36558. isProc: true,
  36559. event: "FN_UPDATE",
  36560. param: "",
  36561. },
  36562. no: {
  36563. text: "취소",
  36564. isProc: false,
  36565. },
  36566. };
  36567. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  36568. }
  36569. };
  36570. const fnUpdate = () => {
  36571. let frm = new FormData();
  36572. let wterGet = localStorage.getItem("tempAccess");
  36573. let params = JSON.stringify({
  36574. seq: useDtStore.boardInfo.seq,
  36575. wter: wterGet,
  36576. brd_cd: "BR02",
  36577. brd_lang: form.value.formValue0,
  36578. show_yn: form.value.formValue2,
  36579. title: form.value.formValue1,
  36580. cmd_date: form.value.formValue7,
  36581. });
  36582. frm.append("params", params);
  36583. frm.append("fileObj", form.value.formValue6);
  36584. useAxios()
  36585. .post("/brd/upd", frm, { headers: { "Content-Type": "multipart/form-data" } })
  36586. .then((res) => {
  36587. router.push("/view/media/irList");
  36588. })
  36589. .catch((error) => {
  36590. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  36591. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  36592. })
  36593. .finally(() => {
  36594. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  36595. //objSlt.value.tenantNameList = _cloneDeep(temp);
  36596. });
  36597. };
  36598. const fnDelEvt = () => {
  36599. let param = {
  36600. id: pageId,
  36601. title: "공고사항",
  36602. content: "삭제하시겠습니까?",
  36603. yes: {
  36604. text: "확인",
  36605. isProc: true,
  36606. event: "FN_DELETE",
  36607. param: "",
  36608. },
  36609. no: {
  36610. text: "취소",
  36611. isProc: false,
  36612. },
  36613. };
  36614. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  36615. };
  36616. const fnDelete = () => {
  36617. let wterGet = localStorage.getItem("tempAccess");
  36618. let req = {
  36619. brd_cd: "BR02",
  36620. seq: useDtStore.boardInfo.seq,
  36621. wter: wterGet,
  36622. };
  36623. useAxios()
  36624. .post("/brd/del", req)
  36625. .then((res) => {
  36626. router.push("/view/media/irList");
  36627. })
  36628. .catch((error) => {
  36629. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  36630. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  36631. })
  36632. .finally(() => {
  36633. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  36634. //objSlt.value.tenantNameList = _cloneDeep(temp);
  36635. });
  36636. };
  36637. const fnDetail = () => {
  36638. //console.log(useDtStore.boardInfo.seq);
  36639. let req = {
  36640. seq: useDtStore.boardInfo.seq,
  36641. };
  36642. useAxios()
  36643. .post("/brd/detail", req)
  36644. .then((res) => {
  36645. console.log(res);
  36646. form.value.formValue0 = res.data.brd_lang;
  36647. form.value.formValue2 = res.data.show_yn;
  36648. form.value.formValue1 = res.data.title;
  36649. form.value.formValue3 = res.data.fix_yn;
  36650. form.value.formValue7 = res.data.cmd_date;
  36651. //if(result.files) this.uploadFiles = result.files
  36652. uploadFiles.value[0].file_name = res.data.file_title;
  36653. uploadFiles.value[0].ogn_name = res.data.ogn_f_title;
  36654. })
  36655. .catch((error) => {
  36656. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  36657. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  36658. })
  36659. .finally(() => {
  36660. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  36661. //objSlt.value.tenantNameList = _cloneDeep(temp);
  36662. });
  36663. };
  36664. const validateDate = () => {};
  36665. /************************************************************************
  36666. | 팝업 이벤트버스 정의
  36667. ************************************************************************/
  36668. $eventBus.off("FN_INSERT");
  36669. $eventBus.on("FN_INSERT", () => {
  36670. fnInsert();
  36671. });
  36672. $eventBus.off("FN_DELETE");
  36673. $eventBus.on("FN_DELETE", () => {
  36674. fnDelete();
  36675. });
  36676. $eventBus.off("FN_UPDATE");
  36677. $eventBus.on("FN_UPDATE", () => {
  36678. fnUpdate();
  36679. });
  36680. $eventBus.off("FN_CONFIRM");
  36681. $eventBus.on("FN_CONFIRM");
  36682. /************************************************************************
  36683. | 라이프사이클
  36684. ************************************************************************/
  36685. onMounted(() => {
  36686. pageType.value = useDtStore.boardInfo.pageType;
  36687. //상세 등록 아니 리스트 클릭시 상세 정보로 접근
  36688. if (pageType.value == "U") {
  36689. fnDetail();
  36690. }
  36691. });
  36692. /************************************************************************
  36693. | WATCH
  36694. ************************************************************************/
  36695. const observer = new MutationObserver((mutations) => {
  36696. mutations.forEach((mutation) => {
  36697. if (mutation.type === "childList") {
  36698. if (quillEditor.value) {
  36699. const quill = quillEditor.value.quill;
  36700. if (quill) {
  36701. quill
  36702. .getModule("toolbar")
  36703. .addHandler("image", editorOptions.value.modules.toolbar.handlers.image);
  36704. }
  36705. }
  36706. }
  36707. });
  36708. });
  36709. observer.observe(document.body, { childList: true, subtree: true });
  36710. </script>
  36711. </file>
  36712. <file path="pages/view/common/settle/mediaAdd.vue">
  36713. <template>
  36714. <div>
  36715. <div class="inner--headers">
  36716. <h2>{{ pageId }}</h2>
  36717. <div class="bread--crumbs--wrap">
  36718. <span>홈</span>
  36719. <span>미디어 관리</span>
  36720. <span>{{ pageId }}</span>
  36721. </div>
  36722. </div>
  36723. <div class="view-wrap mt--45">
  36724. <div class="view-box">
  36725. <div class="view-box-top">
  36726. <h3 v-if="pageType == 'I'">MEDIA LIBRARY 등록</h3>
  36727. <h3 v-else>MEDIA LIBRARY 수정</h3>
  36728. </div>
  36729. <div class="view-box-btm">
  36730. <div class="form-style1">
  36731. <v-form ref="addForm">
  36732. <table>
  36733. <colgroup>
  36734. <col style="width: 12.5rem" />
  36735. <col />
  36736. </colgroup>
  36737. <tbody>
  36738. <tr>
  36739. <th>언어<span class="bul">*</span></th>
  36740. <td>
  36741. <v-radio-group
  36742. v-model="form.formValue0"
  36743. inline
  36744. hide-details
  36745. class="radio--group"
  36746. >
  36747. <v-radio label="Korean" value="KR"></v-radio>
  36748. <v-radio label="English" value="EN"></v-radio>
  36749. <v-radio label="Chinese" value="CN"></v-radio>
  36750. <v-radio label="Japanese" value="JP"></v-radio>
  36751. </v-radio-group>
  36752. </td>
  36753. </tr>
  36754. <tr>
  36755. <th>제목<span class="bul">*</span></th>
  36756. <td>
  36757. <v-text-field
  36758. v-model="form.formValue1"
  36759. class="custom-input mini"
  36760. placeholder="제목을 입력해주세요."
  36761. :rules="[useValid.required('제목')]"
  36762. ></v-text-field>
  36763. </td>
  36764. </tr>
  36765. <tr>
  36766. <th>해시태그<span class="bul">*</span></th>
  36767. <td>
  36768. <v-text-field
  36769. v-model="form.formValue5"
  36770. class="custom-input mini"
  36771. placeholder="해시태그를 입력해주세요. 예) 태그, 태그 형태로 여러개 입력시 ,를 이용하여 입력해주세요."
  36772. :rules="[useValid.required('해시태그')]"
  36773. ></v-text-field>
  36774. </td>
  36775. </tr>
  36776. <tr>
  36777. <th>노출여부<span class="bul">*</span></th>
  36778. <td>
  36779. <v-radio-group
  36780. class="radio--group"
  36781. v-model="form.formValue2"
  36782. inline
  36783. hide-details
  36784. >
  36785. <v-radio label="노출" value="Y"></v-radio>
  36786. <v-radio label="비노출" value="N"></v-radio>
  36787. </v-radio-group>
  36788. </td>
  36789. </tr>
  36790. <tr>
  36791. <th>날짜</th>
  36792. <td>
  36793. <v-text-field
  36794. v-model="form.formValue7"
  36795. style="max-width: 400px"
  36796. class="custom-input mini"
  36797. placeholder="날짜를 입력해주세요. 예) 2024-12-25"
  36798. ></v-text-field>
  36799. </td>
  36800. </tr>
  36801. <tr>
  36802. <th>사진<span class="bul">*</span></th>
  36803. <td class="media--editor">
  36804. <span class="caution"
  36805. >* 사진 첨부만 가능합니다. 입력하신 텍스트는 저장되지
  36806. 않습니다.</span
  36807. >
  36808. <SunEditorWrapper
  36809. ref="sunEditorWrapper"
  36810. :initialContent="editorContentReq"
  36811. />
  36812. </td>
  36813. </tr>
  36814. </tbody>
  36815. </table>
  36816. </v-form>
  36817. </div>
  36818. </div>
  36819. </div>
  36820. <div class="view-btm-btn">
  36821. <div class="btn-l">
  36822. <v-btn class="custom-btn btn-list" @click="listLocated"
  36823. ><i class="ico"></i>목록</v-btn
  36824. >
  36825. <v-btn v-if="pageType == 'U'" class="custom-btn btn-del" @click="fnDelEvt"
  36826. ><i class="ico"></i>삭제</v-btn
  36827. >
  36828. </div>
  36829. <div class="btn-r">
  36830. <v-btn v-if="pageType == 'I'" class="custom-btn btn-blue2" @click="fnRegCheck"
  36831. ><i class="ico"></i>저장</v-btn
  36832. >
  36833. <v-btn v-else class="custom-btn btn-blue2" @click="fnRegCheck"
  36834. ><i class="ico"></i>수정</v-btn
  36835. >
  36836. </div>
  36837. </div>
  36838. </div>
  36839. </div>
  36840. </template>
  36841. <script setup>
  36842. import SunEditorWrapper from "@/components/sunEdt.vue";
  36843. import useAxios from "@/composables/useAxios";
  36844. /************************************************************************
  36845. | 레이아웃
  36846. ************************************************************************/
  36847. definePageMeta({
  36848. layout: "default",
  36849. });
  36850. /************************************************************************
  36851. | 스토어
  36852. ************************************************************************/
  36853. const useDtStore = useDetailStore();
  36854. /************************************************************************
  36855. | 전역
  36856. ************************************************************************/
  36857. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  36858. const router = useRouter();
  36859. const pageId = ref("MEDIA LIBRARY");
  36860. const sunEditorWrapper = ref(null); //에디터용 전역
  36861. const updatedContent = ref(null); //에디터용 전역
  36862. const editorContentReq = ref(""); //에디터용 전역
  36863. const addForm = ref(null);
  36864. const index = ref(null);
  36865. const imageIndex = ref(0);
  36866. const items = ref([]);
  36867. const quillEditor = ref(null);
  36868. const customToolbar = ref([["image"]]); // 에디터에서 이미지 첨부만 가능하게끔
  36869. const imgTemp = ref(null);
  36870. const rowId = ref();
  36871. const form = ref({
  36872. formValue0: "KR",
  36873. formValue1: "",
  36874. formValue2: "Y",
  36875. // formValue3: "",
  36876. formValue4: "",
  36877. formValue5: "",
  36878. // formValue6: [],
  36879. // fileResponse: null,
  36880. formValue7: "",
  36881. });
  36882. const uploadFiles = ref([
  36883. {
  36884. file_name: "",
  36885. ogn_name: "",
  36886. },
  36887. ]);
  36888. const pageType = ref("");
  36889. const apiUrl = ref("");
  36890. apiUrl.value = import.meta.env.VITE_APP_API_URL;
  36891. /************************************************************************
  36892. | 함수(METHODS)
  36893. ************************************************************************/
  36894. const listLocated = () => {
  36895. router.push({
  36896. path: "/view/media/mediaList",
  36897. });
  36898. };
  36899. /*======================================================================
  36900. | 작성 시퀀스
  36901. | 1. 작성 컨펌
  36902. | 2. 버튼 체크
  36903. | 3. 등록시 -> 등록 API 호출
  36904. ======================================================================*/
  36905. const fnRegCheck = () => {
  36906. nextTick(() => {
  36907. if (addForm.value && typeof addForm.value.validate === "function") {
  36908. addForm.value
  36909. .validate()
  36910. .then((isValid) => {
  36911. if (isValid.valid) {
  36912. if (pageType.value == "I") {
  36913. fnRegEvt();
  36914. } else {
  36915. fnUpdEvt();
  36916. }
  36917. } else {
  36918. let param = {
  36919. id: pageId,
  36920. title: "미디어 라이브러리",
  36921. content: "필수항목을 입력해주세요.",
  36922. yes: {
  36923. text: "확인",
  36924. isProc: false,
  36925. },
  36926. no: {
  36927. text: "취소",
  36928. isProc: false,
  36929. },
  36930. };
  36931. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  36932. }
  36933. })
  36934. .catch((err) => {
  36935. console.error("벨리데이션 에러", err);
  36936. });
  36937. } else {
  36938. console.error("항목 누락체크[fnRegCheck]]");
  36939. }
  36940. });
  36941. };
  36942. const fnRegEvt = () => {
  36943. // 공고날짜 체크
  36944. const datePattern = /^\d{4}\-\d{2}\-\d{2}$/;
  36945. if (form.value.formValue7 && !datePattern.test(form.value.formValue7)) {
  36946. let param = {
  36947. id: pageId,
  36948. title: "공고사항",
  36949. content: "날짜를 올바른 형식(YYYY-MM-DD)으로 입력해주세요",
  36950. yes: {
  36951. text: "확인",
  36952. isProc: false,
  36953. },
  36954. no: {
  36955. text: "취소",
  36956. isProc: false,
  36957. },
  36958. };
  36959. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  36960. return false;
  36961. } else {
  36962. let param = {
  36963. id: pageId,
  36964. title: "미디어 라이브러리",
  36965. content: "등록하시겠습니까?",
  36966. yes: {
  36967. text: "등록",
  36968. isProc: true,
  36969. event: "FN_INSERT",
  36970. param: "",
  36971. },
  36972. no: {
  36973. text: "취소",
  36974. isProc: false,
  36975. },
  36976. };
  36977. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  36978. }
  36979. };
  36980. const fnInsert = async () => {
  36981. //BASE64에서 실제 파일서버에 파일 전성후 내용 컨텐츠 REAL주소로 변경
  36982. await editorContent();
  36983. let frm = new FormData();
  36984. let wterGet = localStorage.getItem("tempAccess");
  36985. let params = JSON.stringify({
  36986. wter: wterGet,
  36987. brd_cd: "BR01",
  36988. brd_lang: form.value.formValue0,
  36989. title: form.value.formValue1,
  36990. show_yn: form.value.formValue2,
  36991. content: updatedContent.value
  36992. .replace(/<\/?div[^>]*>/g, "")
  36993. .replace(/<p>.*?<\/p>/gs, "")
  36994. .trim(),
  36995. hash_tag: form.value.formValue5,
  36996. cmd_date: form.value.formValue7,
  36997. });
  36998. const hasImgTag = /<img\s+[^>]*>/i.test(updatedContent.value);
  36999. if (!hasImgTag) {
  37000. let param = {
  37001. id: pageId,
  37002. title: "미디어 라이브러리",
  37003. content: "사진 첨부는 필수입니다.",
  37004. yes: {
  37005. text: "확인",
  37006. isProc: false,
  37007. },
  37008. no: {
  37009. text: "취소",
  37010. isProc: false,
  37011. },
  37012. };
  37013. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  37014. return false;
  37015. }
  37016. frm.append("params", params);
  37017. useAxios()
  37018. .post("/brd/ins", frm, { headers: { "Content-Type": "multipart/form-data" } })
  37019. .then((res) => {
  37020. router.push("/view/media/mediaList");
  37021. })
  37022. .catch((error) => {
  37023. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  37024. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  37025. })
  37026. .finally(() => {
  37027. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  37028. //objSlt.value.tenantNameList = _cloneDeep(temp);
  37029. });
  37030. };
  37031. const fnUpdEvt = () => {
  37032. // 공고날짜 체크
  37033. const datePattern = /^\d{4}\-\d{2}\-\d{2}$/;
  37034. if (form.value.formValue7 && !datePattern.test(form.value.formValue7)) {
  37035. let param = {
  37036. id: pageId,
  37037. title: "공고사항",
  37038. content: "날짜를 올바른 형식(YYYY-MM-DD)으로 입력해주세요",
  37039. yes: {
  37040. text: "확인",
  37041. isProc: false,
  37042. },
  37043. no: {
  37044. text: "취소",
  37045. isProc: false,
  37046. },
  37047. };
  37048. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  37049. return false;
  37050. } else {
  37051. let param = {
  37052. id: pageId,
  37053. title: "미디어 라이브러리",
  37054. content: "수정하시겠습니까?",
  37055. yes: {
  37056. text: "확인",
  37057. isProc: true,
  37058. event: "FN_UPDATE",
  37059. param: "",
  37060. },
  37061. no: {
  37062. text: "취소",
  37063. isProc: false,
  37064. },
  37065. };
  37066. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  37067. }
  37068. };
  37069. const fnUpdate = async () => {
  37070. //BASE64에서 실제 파일서버에 파일 전성후 내용 컨텐츠 REAL주소로 변경
  37071. await editorContent();
  37072. let frm = new FormData();
  37073. let wterGet = localStorage.getItem("tempAccess");
  37074. let params = JSON.stringify({
  37075. seq: useDtStore.boardInfo.seq,
  37076. wter: wterGet,
  37077. brd_cd: "BR01",
  37078. brd_lang: form.value.formValue0,
  37079. title: form.value.formValue1,
  37080. show_yn: form.value.formValue2,
  37081. content: updatedContent.value
  37082. .replace(/<\/?div[^>]*>/g, "")
  37083. .replace(/<p>.*?<\/p>/gs, "")
  37084. .trim(),
  37085. hash_tag: form.value.formValue5,
  37086. cmd_date: form.value.formValue7,
  37087. });
  37088. const hasImgTag = /<img\s+[^>]*>/i.test(updatedContent.value);
  37089. if (!hasImgTag) {
  37090. let param = {
  37091. id: pageId,
  37092. title: "미디어 라이브러리",
  37093. content: "사진 첨부는 필수입니다.",
  37094. yes: {
  37095. text: "확인",
  37096. isProc: false,
  37097. },
  37098. no: {
  37099. text: "취소",
  37100. isProc: false,
  37101. },
  37102. };
  37103. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  37104. return false;
  37105. }
  37106. frm.append("params", params);
  37107. useAxios()
  37108. .post("/brd/upd", frm, { headers: { "Content-Type": "multipart/form-data" } })
  37109. .then((res) => {
  37110. router.push("/view/media/mediaList");
  37111. })
  37112. .catch((error) => {
  37113. $log.debug("[equipMgmtReg][fnGetTenantList][error]");
  37114. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  37115. })
  37116. .finally(() => {
  37117. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  37118. //objSlt.value.tenantNameList = _cloneDeep(temp);
  37119. });
  37120. };
  37121. const fnDelEvt = () => {
  37122. let param = {
  37123. id: pageId,
  37124. title: "미디어 라이브러리",
  37125. content: "삭제하시겠습니까?",
  37126. yes: {
  37127. text: "확인",
  37128. isProc: true,
  37129. event: "FN_DELETE",
  37130. param: "",
  37131. },
  37132. no: {
  37133. text: "취소",
  37134. isProc: false,
  37135. },
  37136. };
  37137. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  37138. };
  37139. const fnDelete = () => {
  37140. let wterGet = localStorage.getItem("tempAccess");
  37141. let req = {
  37142. brd_cd: "BR01",
  37143. seq: useDtStore.boardInfo.seq,
  37144. wter: wterGet,
  37145. };
  37146. useAxios()
  37147. .post("/brd/del", req)
  37148. .then((res) => {
  37149. router.push("/view/media/mediaList");
  37150. })
  37151. .catch((error) => {
  37152. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  37153. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  37154. })
  37155. .finally(() => {
  37156. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  37157. //objSlt.value.tenantNameList = _cloneDeep(temp);
  37158. });
  37159. };
  37160. const fnDetail = async () => {
  37161. //BASE64에서 실제 파일서버에 파일 전성후 내용 컨텐츠 REAL주소로 변경
  37162. await editorContent();
  37163. let req = {
  37164. seq: useDtStore.boardInfo.seq,
  37165. };
  37166. useAxios()
  37167. .post("/brd/detail", req)
  37168. .then((res) => {
  37169. //console.log(res);
  37170. form.value.formValue0 = res.data.brd_lang;
  37171. form.value.formValue1 = res.data.title;
  37172. form.value.formValue2 = res.data.show_yn;
  37173. form.value.formValue4 = res.data.content
  37174. .replace(/<\/?div[^>]*>/g, "")
  37175. .replace(/<p>.*?<\/p>/gs, "")
  37176. .trim();
  37177. form.value.formValue5 = res.data.hash_tag;
  37178. //if(result.files) this.uploadFiles = result.files
  37179. //에디터에 컨텐츠 전달
  37180. editorContentReq.value = res.data.content;
  37181. uploadFiles.value[0].file_name = res.data.file_title;
  37182. uploadFiles.value[0].ogn_name = res.data.ogn_f_title;
  37183. form.value.formValue7 = res.data.cmd_date;
  37184. })
  37185. .catch((error) => {
  37186. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  37187. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  37188. })
  37189. .finally(() => {
  37190. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  37191. //objSlt.value.tenantNameList = _cloneDeep(temp);
  37192. });
  37193. };
  37194. /*=======================================================================
  37195. | 최종 에디터 이미지 url치환 : S
  37196. /*=======================================================================*/
  37197. const editorContent = async () => {
  37198. const content = sunEditorWrapper.value.getEditorContent();
  37199. updatedContent.value = await processEditorContent(content);
  37200. console.log("Updated content:", updatedContent.value);
  37201. };
  37202. // Base64 데이터를 Blob으로 변환
  37203. const base64ToBlob = (base64, mimeType) => {
  37204. const byteString = atob(base64.split(",")[1]);
  37205. const arrayBuffer = new ArrayBuffer(byteString.length);
  37206. const uint8Array = new Uint8Array(arrayBuffer);
  37207. for (let i = 0; i < byteString.length; i++) {
  37208. uint8Array[i] = byteString.charCodeAt(i);
  37209. }
  37210. return new Blob([uint8Array], { type: mimeType });
  37211. };
  37212. // Base64 데이터를 File 객체로 변환
  37213. const base64ToFile = (base64, mimeType, fileName) => {
  37214. const blob = base64ToBlob(base64, mimeType);
  37215. return new File([blob], fileName, { type: mimeType });
  37216. };
  37217. // 이미지 업로드 처리 (useAxios)
  37218. const uploadImage = async (file) => {
  37219. const formDataEdt = new FormData();
  37220. formDataEdt.append("picObj", file);
  37221. return useAxios()
  37222. .post("/pic/upload", formDataEdt, {
  37223. headers: { "Content-Type": "multipart/form-data" },
  37224. })
  37225. .then((res) => {
  37226. const filePath = res.data.ogn_name.path.replace(/.*\/files\//, "");
  37227. const fileName = res.data.ogn_name.file_name;
  37228. return `${apiUrl.value}/images/${filePath}/${fileName}`; // 최종 URL 반환
  37229. })
  37230. .catch((error) => {
  37231. console.error("Image upload failed:", error);
  37232. return null;
  37233. });
  37234. };
  37235. // 에디터 내용 처리 및 이미지 업로드
  37236. const processEditorContent = async (content) => {
  37237. const parser = new DOMParser();
  37238. const doc = parser.parseFromString(content, "text/html");
  37239. const images = doc.querySelectorAll("img");
  37240. for (let i = 0; i < images.length; i++) {
  37241. const img = images[i];
  37242. const src = img.src;
  37243. if (src.startsWith("data:image")) {
  37244. // MIME 타입과 파일 이름 추출
  37245. const mimeType = src.split(";")[0].split(":")[1];
  37246. const extension = mimeType.split("/")[1];
  37247. const fileName = `image-${i + 1}.${extension}`;
  37248. // Base64 데이터를 File 객체로 변환
  37249. const file = base64ToFile(src, mimeType, fileName);
  37250. // 이미지 업로드 및 URL 반환
  37251. const finalUrl = await uploadImage(file);
  37252. if (finalUrl) {
  37253. img.src = finalUrl; // 이미지 src 업데이트
  37254. }
  37255. }
  37256. }
  37257. return doc.body.innerHTML; // 최종 수정된 HTML 반환
  37258. };
  37259. /*=======================================================================
  37260. | 최종 에디터 이미지 url치환 : E
  37261. /*=======================================================================*/
  37262. /************************************************************************
  37263. | 팝업 이벤트버스 정의
  37264. ************************************************************************/
  37265. $eventBus.off("FN_INSERT");
  37266. $eventBus.on("FN_INSERT", () => {
  37267. fnInsert();
  37268. });
  37269. $eventBus.off("FN_DELETE");
  37270. $eventBus.on("FN_DELETE", () => {
  37271. fnDelete();
  37272. });
  37273. $eventBus.off("FN_UPDATE");
  37274. $eventBus.on("FN_UPDATE", () => {
  37275. fnUpdate();
  37276. });
  37277. $eventBus.off("FN_CONFIRM");
  37278. $eventBus.on("FN_CONFIRM");
  37279. /************************************************************************
  37280. | 라이프사이클
  37281. ************************************************************************/
  37282. onMounted(() => {
  37283. pageType.value = useDtStore.boardInfo.pageType;
  37284. //상세 등록 아니 리스트 클릭시 상세 정보로 접근
  37285. if (pageType.value == "U") {
  37286. fnDetail();
  37287. }
  37288. });
  37289. /************************************************************************
  37290. | WATCH
  37291. ************************************************************************/
  37292. </script>
  37293. </file>
  37294. <file path="pages/view/common/settle/mediaList.vue">
  37295. <template>
  37296. <div>
  37297. <div class="inner--headers">
  37298. <h2>{{ pageId }}</h2>
  37299. <div class="bread--crumbs--wrap">
  37300. <span>홈</span>
  37301. <span>{{ pageId }}</span>
  37302. <span v-if="pageIdSub">{{ pageIdSub }}</span>
  37303. </div>
  37304. </div>
  37305. <div class="search--modules">
  37306. <div class="form--cont--filter">
  37307. <v-select
  37308. v-model="filter"
  37309. :items="filderArr"
  37310. variant="outlined"
  37311. class="custom-select"
  37312. >
  37313. </v-select>
  37314. </div>
  37315. <div class="form--cont--text">
  37316. <v-text-field
  37317. v-model="searchModel"
  37318. class="custom-input mini"
  37319. style="width: 100%"
  37320. placeholder="검색어를 입력하세요"
  37321. ></v-text-field>
  37322. </div>
  37323. <v-btn
  37324. class="custom-btn btn-blue mini sch--btn"
  37325. @click="fnSearch(searchModel, filter)"
  37326. >검색</v-btn
  37327. >
  37328. </div>
  37329. <div class="data--list--wrap">
  37330. <div class="btn--actions--wrap">
  37331. <div class="left--sections">
  37332. <!-- <v-btn class="custom-btn mini btn-white">선택 삭제</v-btn> -->
  37333. </div>
  37334. <div class="right--sections">
  37335. <v-btn class="custom-btn mini btn-reg" @click="addLocated"
  37336. ><i class="ico"></i>신규 등록</v-btn
  37337. >
  37338. </div>
  37339. </div>
  37340. <div class="tbl-wrapper">
  37341. <div class="tbl-wrap">
  37342. <!-- ag grid -->
  37343. <ag-grid-vue
  37344. style="width: 100%; height: calc(10 * 2.94rem)"
  37345. class="ag-theme-quartz"
  37346. :gridOptions="gridOptions"
  37347. :rowData="tblItems"
  37348. :paginationPageSize="pageObj.pageSize"
  37349. :suppressPaginationPanel="true"
  37350. @grid-ready="onGridReady"
  37351. @rowClicked="detailLocated"
  37352. >
  37353. </ag-grid-vue>
  37354. <!-- 페이징 -->
  37355. <div class="ag-grid-custom-pagenations">
  37356. <pagination @chg_page="chgPage" :pageObj="pageObj"></pagination>
  37357. </div>
  37358. </div>
  37359. </div>
  37360. </div>
  37361. </div>
  37362. </template>
  37363. <script setup>
  37364. import { AgGridVue } from "ag-grid-vue3";
  37365. import pagination from "../components/common/pagination.vue";
  37366. /************************************************************************
  37367. | 레이아웃
  37368. ************************************************************************/
  37369. definePageMeta({
  37370. layout: "default",
  37371. });
  37372. /************************************************************************
  37373. | PROPS
  37374. ************************************************************************/
  37375. const props = defineProps({
  37376. propsData: {
  37377. type: Object,
  37378. default: () => {},
  37379. },
  37380. });
  37381. /************************************************************************
  37382. | 스토어
  37383. ************************************************************************/
  37384. const useDtStore = useDetailStore();
  37385. /************************************************************************
  37386. | 전역
  37387. ************************************************************************/
  37388. const filter = ref("");
  37389. const searchModel = ref("");
  37390. const filderArr = ref([
  37391. { title: "선택하세요", value: "" },
  37392. { title: "제목", value: "title" },
  37393. { title: "내용", value: "content" },
  37394. ]);
  37395. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  37396. const router = useRouter();
  37397. const pageId = ref("MEDIA LIBRARY");
  37398. const pageIdSub = ref();
  37399. let pageObj = ref({
  37400. page: 1, // 현재 페이지
  37401. pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
  37402. pageSize: 10, // 테이블 조회 데이터 개수
  37403. totalCnt: 0, // 전체 페이지
  37404. });
  37405. const tblItems = ref([]); // stat 데이터
  37406. /* eslint-disable */
  37407. /* prettier-ignore */
  37408. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  37409. const rowHeightRem = 2.65; // 원하는 rem 값
  37410. const rowHeightPx = rowHeightRem * remToPx();
  37411. const gridApi = shallowRef();
  37412. // gridOption
  37413. const gridOptions = {
  37414. columnDefs: [
  37415. {
  37416. headerName: "No",
  37417. valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
  37418. sortable: false,
  37419. width: 70,
  37420. },
  37421. { headerName: "언어", field: "brd_lang", sortable: true, width: 70 },
  37422. { headerName: "제목", field: "title", sortable: false, width: 500 },
  37423. { headerName: "조회수", field: "read_cnt", sortable: false, width: 70 },
  37424. { headerName: "노출여부", field: "show_yn", sortable: true, width: 70 },
  37425. { headerName: "작성자", field: "admin_name", sortable: false, width: 120 },
  37426. { headerName: "등록일", field: "crt_dtime", sortable: false, width: 120 },
  37427. ],
  37428. rowData: tblItems.value, // 테이블 데이터
  37429. autoSizeStrategy: {
  37430. type: "fitGridWidth", // width맞춤
  37431. },
  37432. suppressMovableColumns: true,
  37433. headerHeight: rowHeightPx,
  37434. rowHeight: rowHeightPx,
  37435. pagination: true,
  37436. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  37437. // rowSelection: {
  37438. // checkboxes: true,
  37439. // headerCheckbox: true,
  37440. // enableClickSelection: false,
  37441. // mode: "multiRow",
  37442. // },
  37443. };
  37444. /************************************************************************
  37445. | 함수(METHODS)
  37446. ************************************************************************/
  37447. const onGridReady = (__PARAMS) => {
  37448. gridApi.value = __PARAMS.api;
  37449. };
  37450. const chgPage = (__PAGE) => {
  37451. pageObj.value.page = __PAGE;
  37452. gridApi.value.paginationGoToPage(__PAGE - 1);
  37453. };
  37454. const addLocated = () => {
  37455. router.push({
  37456. path: "/view/media/mediaAdd",
  37457. //query: { id: rowId },
  37458. });
  37459. useDtStore.boardInfo.pageType = "I";
  37460. };
  37461. const detailLocated = (__EVENT) => {
  37462. router.push({
  37463. path: "/view/media/mediaAdd",
  37464. });
  37465. useDtStore.boardInfo.seq = __EVENT.data.seq;
  37466. useDtStore.boardInfo.pageType = "U";
  37467. };
  37468. const newsListGet = () => {
  37469. let _req = {
  37470. _size: 1000,
  37471. _index: 0,
  37472. brd_lang: "",
  37473. brd_cd: "BR01",
  37474. };
  37475. useAxios()
  37476. .post("/brd/list", _req)
  37477. .then((res) => {
  37478. _req._size = res.data.list.length;
  37479. tblItems.value = res.data.list;
  37480. pageObj.value.totalCnt = tblItems.value.length;
  37481. })
  37482. .catch((error) => {});
  37483. };
  37484. const fnSearch = (__KEYWORD, __FILTER) => {
  37485. let _req = {
  37486. _size: 1000,
  37487. _index: 0,
  37488. brd_lang: "",
  37489. brd_cd: "BR01",
  37490. content: __FILTER == "content" ? __KEYWORD : __FILTER == "" ? __KEYWORD : null,
  37491. title: __FILTER == "title" ? __KEYWORD : __FILTER == "" ? __KEYWORD : null,
  37492. };
  37493. useAxios()
  37494. .post("/brd/list", _req)
  37495. .then((res) => {
  37496. _req._size = res.data.list.length;
  37497. tblItems.value = res.data.list;
  37498. pageObj.value.totalCnt = tblItems.value.length;
  37499. })
  37500. .catch((error) => {});
  37501. };
  37502. /************************************************************************
  37503. | WATCH
  37504. ************************************************************************/
  37505. onMounted(() => {
  37506. newsListGet();
  37507. });
  37508. </script>
  37509. </file>
  37510. <file path="pages/view/common/settle/newsAdd.vue">
  37511. <template>
  37512. <div>
  37513. <div class="inner--headers">
  37514. <h2>{{ pageId }}</h2>
  37515. <div class="bread--crumbs--wrap">
  37516. <span>홈</span>
  37517. <span>미디어 관리</span>
  37518. <span>{{ pageId }}</span>
  37519. </div>
  37520. </div>
  37521. <div class="view-wrap mt--45">
  37522. <div class="view-box">
  37523. <div class="view-box-top">
  37524. <h3 v-if="pageType == 'I'">뉴스룸 등록</h3>
  37525. <h3 v-else>뉴스룸 수정</h3>
  37526. </div>
  37527. <div class="view-box-btm">
  37528. <div class="form-style1">
  37529. <v-form ref="addForm">
  37530. <table>
  37531. <colgroup>
  37532. <col style="width: 12.5rem" />
  37533. <col />
  37534. </colgroup>
  37535. <tbody>
  37536. <tr>
  37537. <th>언어</th>
  37538. <td>
  37539. <v-radio-group
  37540. v-model="form.formValue0"
  37541. inline
  37542. hide-details
  37543. class="radio--group"
  37544. >
  37545. <v-radio label="Korean" value="KR"></v-radio>
  37546. <v-radio label="English" value="EN"></v-radio>
  37547. <v-radio label="Chinese" value="CN"></v-radio>
  37548. <v-radio label="Japanese" value="JP"></v-radio>
  37549. </v-radio-group>
  37550. </td>
  37551. </tr>
  37552. <tr>
  37553. <th>노출여부<span class="bul">*</span></th>
  37554. <td>
  37555. <v-radio-group
  37556. class="radio--group"
  37557. v-model="form.formValue2"
  37558. inline
  37559. hide-details
  37560. >
  37561. <v-radio label="노출" value="Y"></v-radio>
  37562. <v-radio label="비노출" value="N"></v-radio>
  37563. </v-radio-group>
  37564. </td>
  37565. </tr>
  37566. <tr>
  37567. <th>고정여부<span class="bul">*</span></th>
  37568. <td>
  37569. <v-radio-group
  37570. class="radio--group"
  37571. v-model="form.formValue3"
  37572. inline
  37573. hide-details
  37574. >
  37575. <v-radio label="고정 " value="Y"></v-radio>
  37576. <v-radio label="비고정" value="N"></v-radio>
  37577. </v-radio-group>
  37578. </td>
  37579. </tr>
  37580. <tr>
  37581. <th>제목<span class="bul">*</span></th>
  37582. <td>
  37583. <v-text-field
  37584. v-model="form.formValue1"
  37585. class="custom-input mini"
  37586. placeholder="제목을 입력해주세요."
  37587. :rules="[useValid.required('제목')]"
  37588. ></v-text-field>
  37589. </td>
  37590. </tr>
  37591. <tr>
  37592. <th>해시태그<span class="bul">*</span></th>
  37593. <td>
  37594. <v-text-field
  37595. v-model="form.formValue7"
  37596. class="custom-input mini"
  37597. placeholder="해시태그를 입력해주세요. 예) 태그, 태그 형태로 여러개 입력시 ,를 이용하여 입력해주세요"
  37598. :rules="[useValid.required('해시태그')]"
  37599. ></v-text-field>
  37600. </td>
  37601. </tr>
  37602. <tr>
  37603. <th>썸네일 이미지<span class="bul">*</span></th>
  37604. <td>
  37605. <div class="equip--image--wrap">
  37606. <!--이미지가 없을 때-->
  37607. <div class="equip--image" v-show="!form.formValue4">
  37608. <img src="/assets/img/ic_no_img.svg" />
  37609. </div>
  37610. <!--이미지 첨부했을 때-->
  37611. <div class="equip--image" v-show="form.formValue4">
  37612. <CoolLightBox
  37613. v-if="items.length > 0"
  37614. :items="items"
  37615. :index="index"
  37616. @close="index = null"
  37617. />
  37618. <div class="images-wrapper">
  37619. <div
  37620. class="image"
  37621. :key="imageIndex"
  37622. @click="index = imageIndex"
  37623. >
  37624. <img id="preview_image" :src="imgTemp" />
  37625. </div>
  37626. </div>
  37627. </div>
  37628. <div class="equip--image--select">
  37629. <div class="form--group">
  37630. <label
  37631. for="fileUpload_pic"
  37632. class="file--btn"
  37633. @click="fnPicFileUploadOpen()"
  37634. >파일 선택</label
  37635. >
  37636. <v-file-input
  37637. v-model="form.formValue4"
  37638. id="fileUpload_pic"
  37639. ref="fileupload_pic"
  37640. accept=".jpg, .jpeg, .png, .gif"
  37641. variant="plain"
  37642. hide-details
  37643. placeholder="선택된 파일 없음"
  37644. prepend-icon=""
  37645. class="custom-input"
  37646. style="max-width: 400px"
  37647. height="33px"
  37648. :clearable="false"
  37649. @change="fnUploadPicFileCheck()"
  37650. >
  37651. <template #append>
  37652. <div class="v-input__icon v-input__icon--clear">
  37653. <button
  37654. @click="clearFile"
  37655. type="button"
  37656. aria-label="clear icon"
  37657. tabindex="-1"
  37658. class="v-icon notranslate v-icon--link mdi mdi-close"
  37659. ></button>
  37660. </div>
  37661. </template>
  37662. </v-file-input>
  37663. </div>
  37664. <p class="equip--image--desc">
  37665. (권장 이미지 : 1024 x 768 / gif, jpg, jpeg, png)
  37666. </p>
  37667. </div>
  37668. </div>
  37669. </td>
  37670. </tr>
  37671. <tr>
  37672. <th>내용<span class="bul">*</span></th>
  37673. <td>
  37674. <SunEditorWrapper
  37675. ref="sunEditorWrapper"
  37676. :initialContent="editorContentReq"
  37677. />
  37678. </td>
  37679. </tr>
  37680. <!--
  37681. <tr>
  37682. <th>첨부 파일</th>
  37683. <td>
  37684. <div
  37685. class="form--group--inner"
  37686. v-if="pageType == 'U' && uploadFiles[0].file_name"
  37687. >
  37688. <div @click="fnFileDownload(uploadFiles[0])" class="text--box">
  37689. {{ uploadFiles[0].ogn_name }}
  37690. </div>
  37691. </div>
  37692. <div class="form--group flex--type max--w320">
  37693. <v-file-input
  37694. v-model="form.formValue6"
  37695. id="fileupload"
  37696. ref="fileupload"
  37697. accept=".jpg, .jpeg, .png, .zip, .pdf, .ppt, .xls, .pptx, .xlsx, .hwp, .doc, .docx"
  37698. placeholder=""
  37699. class="custom-input mini"
  37700. prepend-icon=""
  37701. label=""
  37702. variant="outlined"
  37703. hide-details
  37704. @change="fnUploadFileCheck()"
  37705. ></v-file-input>
  37706. <v-btn class="file--btn" elevation="0" @click="fnFileUploadOpen()"
  37707. >첨부하기</v-btn
  37708. >
  37709. </div>
  37710. </td>
  37711. </tr>-->
  37712. </tbody>
  37713. </table>
  37714. </v-form>
  37715. </div>
  37716. </div>
  37717. </div>
  37718. <div class="view-btm-btn">
  37719. <div class="btn-l">
  37720. <v-btn class="custom-btn btn-list" @click="listLocated"
  37721. ><i class="ico"></i>목록</v-btn
  37722. >
  37723. <v-btn v-show="pageType == 'U'" class="custom-btn btn-del" @click="fnDelEvt"
  37724. ><i class="ico"></i>삭제</v-btn
  37725. >
  37726. </div>
  37727. <div class="btn-r">
  37728. <v-btn v-if="pageType == 'I'" class="custom-btn btn-blue2" @click="fnBtnEvt"
  37729. ><i class="ico"></i>저장</v-btn
  37730. >
  37731. <v-btn v-else class="custom-btn btn-blue2" @click="fnBtnEvt"
  37732. ><i class="ico"></i>수정</v-btn
  37733. >
  37734. </div>
  37735. </div>
  37736. </div>
  37737. </div>
  37738. </template>
  37739. <script setup>
  37740. import useAxios from "@/composables/useAxios";
  37741. import useUtil from "@/composables/useUtil";
  37742. import useErrorHandler from "@/composables/useErrorHandler";
  37743. import SunEditorWrapper from "@/components/sunEdt.vue";
  37744. /************************************************************************
  37745. | 레이아웃
  37746. ************************************************************************/
  37747. definePageMeta({
  37748. layout: "default",
  37749. });
  37750. /************************************************************************
  37751. | 스토어
  37752. ************************************************************************/
  37753. const useDtStore = useDetailStore();
  37754. /************************************************************************
  37755. | 전역
  37756. ************************************************************************/
  37757. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  37758. const router = useRouter();
  37759. const pageId = ref("NEWS ROOM");
  37760. const sunEditorWrapper = ref(null); //에디터용 전역
  37761. const updatedContent = ref(null); //에디터용 전역
  37762. const editorContentReq = ref(); //에디터용 전역
  37763. const addForm = ref(null);
  37764. const index = ref(null);
  37765. const imageIndex = ref(0);
  37766. const items = ref([]);
  37767. const quillEditor = ref(null);
  37768. const imgTemp = ref(null);
  37769. const rowId = ref();
  37770. const form = ref({
  37771. formValue0: "KR",
  37772. formValue1: "",
  37773. formValue2: "Y",
  37774. formValue3: "N",
  37775. formValue4: null,
  37776. formValue5: "",
  37777. formValue6: null,
  37778. formValue7: null,
  37779. fileResponse: null,
  37780. });
  37781. const apiUrl = ref("");
  37782. apiUrl.value = import.meta.env.VITE_APP_API_URL;
  37783. const fileUpload = ref(null);
  37784. const uploadFiles = ref([
  37785. {
  37786. file_name: "",
  37787. ogn_name: "",
  37788. },
  37789. ]);
  37790. const uploadPicFiles = ref([
  37791. {
  37792. file_name: "",
  37793. ogn_name: "-",
  37794. },
  37795. ]);
  37796. const deleteFile = ref("");
  37797. const objProc = ref({
  37798. validErrorMessage: "",
  37799. });
  37800. const pageType = ref("");
  37801. /************************************************************************
  37802. | 함수(METHODS)
  37803. ************************************************************************/
  37804. const listLocated = () => {
  37805. router.push({
  37806. path: "/view/media/newsList",
  37807. });
  37808. };
  37809. /**
  37810. * 첨부파일 다운로드
  37811. */
  37812. const fnFileDownload = (objFile) => {
  37813. let reqData = { file_name: objFile.file_name };
  37814. useAxios()
  37815. .post("/file/download", reqData, { responseType: "blob" })
  37816. .then((res) => {
  37817. const contentType = res.headers["content-type"] || "application/octet-stream"; // 기본값
  37818. const blob = new Blob([res.data], { type: contentType });
  37819. let fileUrl = window.URL.createObjectURL(blob);
  37820. let link = document.createElement("a");
  37821. link.href = fileUrl;
  37822. link.style.display = "none";
  37823. console.log(objFile.ogn_name);
  37824. link.download = objFile.ogn_name;
  37825. document.body.appendChild(link);
  37826. link.click();
  37827. link.remove();
  37828. window.URL.revokeObjectURL(fileUrl);
  37829. })
  37830. .catch((error) => {})
  37831. .finally(() => {});
  37832. };
  37833. const fnPicFileUploadOpen = () => {
  37834. let fileUpload = document.getElementById("fileupload_pic");
  37835. if (fileUpload != null) {
  37836. fileUpload.click();
  37837. }
  37838. };
  37839. const fnFileUploadOpen = () => {
  37840. let fileUpload = document.getElementById("fileupload");
  37841. if (fileUpload != null) {
  37842. fileUpload.click();
  37843. }
  37844. };
  37845. /**
  37846. * 첨부 파일 등록
  37847. */
  37848. const fnUploadFileCheck = () => {
  37849. if (form.value.formValue6) {
  37850. // 10Mb 이상은 업로드 불가
  37851. if (form.value.formValue6.size > 10 * 1024 * 1024) {
  37852. fnOpenCommPop("10mb 이상은 업로드가 불가합니다.");
  37853. form.value.formValue6 = null;
  37854. return;
  37855. }
  37856. // 이미지 파일 형식 체크
  37857. let extension = form.value.formValue6.name.split(".").pop().toLowerCase();
  37858. if (
  37859. extension != "jpg" &&
  37860. extension != "jpeg" &&
  37861. extension != "png" &&
  37862. extension != "gif" &&
  37863. extension != "zip" &&
  37864. extension != "ppt" &&
  37865. extension != "pptx" &&
  37866. extension != "pdf" &&
  37867. extension != "xls" &&
  37868. extension != "xlsx" &&
  37869. extension != "hwp" &&
  37870. extension != "doc" &&
  37871. extension != "docx"
  37872. ) {
  37873. fnOpenCommPop("파일 형식 또는 확장자가 올바르지 않습니다.");
  37874. form.value.formValue6 = null;
  37875. return;
  37876. }
  37877. }
  37878. };
  37879. /**
  37880. * 이미지 다운로드
  37881. */
  37882. const fnPicFileDownload = (objFile) => {
  37883. let local = this;
  37884. let reqData = { file_name: objFile.file_name };
  37885. useAxios()
  37886. .post("/picInfo/download", reqData)
  37887. .then((res) => {
  37888. let reader = new FileReader();
  37889. reader.readAsDataURL(res.data);
  37890. reader.onloadend = function () {
  37891. // File 객체 생성
  37892. let blob = new Blob([res.data]);
  37893. let file = new File([blob], objFile.ogn_name);
  37894. local.form.formValue4 = file;
  37895. // 화면 랜더링
  37896. local.items[0] = reader.result;
  37897. console.log(reader.result);
  37898. $("#preview_image").attr("src", reader.result);
  37899. };
  37900. })
  37901. .catch((err) => {
  37902. this.$log.debug("[unitEquipmentAdd][fnPicFileDownload][error]");
  37903. })
  37904. .finally(() => {
  37905. this.$log.debug("[unitEquipmentAdd][fnPicFileDownload][finally]");
  37906. });
  37907. };
  37908. const fnUploadPicFileCheck = () => {
  37909. if (form.value.formValue4) {
  37910. // 10Mb 이상은 업로드 불가
  37911. if (form.value.formValue4.size > 10 * 1024 * 1024) {
  37912. fnOpenCommPop("10mb 이상은 업로드가 불가합니다.");
  37913. form.value.formValue4 = null;
  37914. return;
  37915. }
  37916. // 이미지 파일 형식 체크
  37917. let extension = form.value.formValue4.name.split(".").pop().toLowerCase();
  37918. if (
  37919. extension != "jpg" &&
  37920. extension != "jpeg" &&
  37921. extension != "png" &&
  37922. extension != "gif"
  37923. ) {
  37924. fnOpenCommPop("파일 형식 또는 확장자가 올바르지 않습니다.");
  37925. form.value.formValue4 = null;
  37926. return;
  37927. }
  37928. objProc.validErrorMessage = "";
  37929. // 이미지 미리보기
  37930. let previewImage = new Image();
  37931. let tempImageUrl = window.URL.createObjectURL(form.value.formValue4);
  37932. console.log(tempImageUrl);
  37933. previewImage.src = tempImageUrl;
  37934. items.value[0] = tempImageUrl;
  37935. imgTemp.value = tempImageUrl;
  37936. }
  37937. };
  37938. const clearFile = () => {
  37939. form.value.formValue4 = null;
  37940. };
  37941. /*======================================================================
  37942. | 작성 시퀀스
  37943. | 1. 작성 컨펌
  37944. | 2. 버튼 체크
  37945. | 3. 등록시 -> 등록 API 호출
  37946. ======================================================================*/
  37947. const fnBtnEvt = async () => {
  37948. await editorContent();
  37949. nextTick(() => {
  37950. if (addForm.value && typeof addForm.value.validate === "function") {
  37951. addForm.value
  37952. .validate()
  37953. .then((isValid) => {
  37954. if (
  37955. isValid.valid &&
  37956. updatedContent.value != undefined &&
  37957. updatedContent.value != null &&
  37958. updatedContent.value != "<p><br></p>" &&
  37959. form.value.formValue4 != null
  37960. ) {
  37961. if (pageType.value == "I") fnRegEvt();
  37962. else fnUpdEvt();
  37963. } else {
  37964. let param = {
  37965. id: pageId,
  37966. title: "뉴스 룸",
  37967. content: "필수항목을 입력해주세요.",
  37968. yes: {
  37969. text: "확인",
  37970. isProc: false,
  37971. },
  37972. no: {
  37973. text: "취소",
  37974. isProc: false,
  37975. },
  37976. };
  37977. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  37978. }
  37979. })
  37980. .catch((err) => {
  37981. console.error("벨리데이션 에러", err);
  37982. });
  37983. } else {
  37984. console.error("항목 누락체크[fnRegCheck]]");
  37985. }
  37986. });
  37987. };
  37988. const fnRegCheck = () => {};
  37989. const fnOpenCommPop = (__TEXT) => {
  37990. let param = {
  37991. id: pageId,
  37992. title: "알림",
  37993. content: __TEXT,
  37994. yes: {
  37995. text: "확인",
  37996. isProc: false,
  37997. },
  37998. };
  37999. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  38000. };
  38001. const fnRegEvt = () => {
  38002. let param = {
  38003. id: pageId,
  38004. title: "뉴스룸 등록",
  38005. content: "등록하시겠습니까?",
  38006. yes: {
  38007. text: "등록",
  38008. isProc: true,
  38009. event: "FN_INSERT",
  38010. param: "",
  38011. },
  38012. no: {
  38013. text: "취소",
  38014. isProc: false,
  38015. },
  38016. };
  38017. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  38018. };
  38019. const fnUpdEvt = () => {
  38020. let param = {
  38021. id: pageId,
  38022. title: "뉴스룸 수정",
  38023. content: "수정하시겠습니까?",
  38024. yes: {
  38025. text: "확인",
  38026. isProc: true,
  38027. event: "FN_UPDATE",
  38028. param: "",
  38029. },
  38030. no: {
  38031. text: "취소",
  38032. isProc: false,
  38033. },
  38034. };
  38035. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  38036. };
  38037. const fnInsert = async () => {
  38038. // //BASE64에서 실제 파일서버에 파일 전성후 내용 컨텐츠 REAL주소로 변경
  38039. // await editorContent();
  38040. let frm = new FormData();
  38041. let wterGet = localStorage.getItem("tempAccess");
  38042. let params = JSON.stringify({
  38043. //seq: useDtStore.boardInfo.seq,
  38044. //seq: "",
  38045. brd_cd: "BR00",
  38046. brd_lang: form.value.formValue0,
  38047. show_yn: form.value.formValue2,
  38048. hash_tag: form.value.formValue7,
  38049. title: form.value.formValue1,
  38050. content: updatedContent.value,
  38051. wter: wterGet,
  38052. fix_yn: form.value.formValue3,
  38053. });
  38054. frm.append("params", params);
  38055. frm.append("picObj", form.value.formValue4);
  38056. //frm.append("fileObj", form.value.formValue6);
  38057. useAxios()
  38058. .post("/brd/ins", frm, { headers: { "Content-Type": "multipart/form-data" } })
  38059. .then((res) => {
  38060. router.push("/view/media/newsList");
  38061. })
  38062. .catch((error) => {
  38063. let param = {
  38064. id: pageId,
  38065. title: "뉴스룸 등록",
  38066. content: "고정여부값은 4건 초과 등록할 수 없습니다",
  38067. yes: {
  38068. text: "확인",
  38069. isProc: true,
  38070. },
  38071. no: {
  38072. text: "취소",
  38073. isProc: false,
  38074. },
  38075. };
  38076. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  38077. })
  38078. .finally(() => {
  38079. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  38080. //objSlt.value.tenantNameList = _cloneDeep(temp);
  38081. });
  38082. };
  38083. const fnUpdate = async () => {
  38084. //BASE64에서 실제 파일서버에 파일 전성후 내용 컨텐츠 REAL주소로 변경
  38085. let frm = new FormData();
  38086. let wterGet = localStorage.getItem("tempAccess");
  38087. let params = JSON.stringify({
  38088. seq: useDtStore.boardInfo.seq,
  38089. brd_cd: "BR00",
  38090. brd_lang: form.value.formValue0,
  38091. show_yn: form.value.formValue2,
  38092. title: form.value.formValue1,
  38093. content: updatedContent.value,
  38094. hash_tag: form.value.formValue7,
  38095. wter: wterGet,
  38096. fix_yn: form.value.formValue3,
  38097. url_link: "", //?
  38098. });
  38099. frm.append("params", params);
  38100. frm.append("picObj", form.value.formValue4);
  38101. //frm.append("fileObj", form.value.formValue6);
  38102. useAxios()
  38103. .post("/brd/upd", frm, { headers: { "Content-Type": "multipart/form-data" } })
  38104. .then((res) => {
  38105. router.push("/view/media/newsList");
  38106. })
  38107. .catch((error) => {
  38108. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  38109. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  38110. })
  38111. .finally(() => {
  38112. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  38113. //objSlt.value.tenantNameList = _cloneDeep(temp);
  38114. });
  38115. };
  38116. const fnDelEvt = () => {
  38117. let param = {
  38118. id: pageId,
  38119. title: "뉴스룸",
  38120. content: "삭제하시겠습니까?",
  38121. yes: {
  38122. text: "확인",
  38123. isProc: true,
  38124. event: "FN_DELETE",
  38125. param: "",
  38126. },
  38127. no: {
  38128. text: "취소",
  38129. isProc: false,
  38130. },
  38131. };
  38132. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  38133. };
  38134. const fnDelete = () => {
  38135. let wterGet = localStorage.getItem("tempAccess");
  38136. let req = {
  38137. brd_cd: "BR00",
  38138. seq: useDtStore.boardInfo.seq,
  38139. wter: wterGet,
  38140. };
  38141. useAxios()
  38142. .post("/brd/del", req)
  38143. .then((res) => {
  38144. router.push("/view/media/newsList");
  38145. })
  38146. .catch((error) => {
  38147. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  38148. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  38149. })
  38150. .finally(() => {
  38151. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  38152. //objSlt.value.tenantNameList = _cloneDeep(temp);
  38153. });
  38154. };
  38155. const fnDetail = () => {
  38156. let req = {
  38157. seq: useDtStore.boardInfo.seq,
  38158. };
  38159. useAxios()
  38160. .post("/brd/detail", req)
  38161. .then((res) => {
  38162. const resData = res.data;
  38163. form.value.formValue0 = resData.brd_lang;
  38164. form.value.formValue2 = resData.show_yn;
  38165. form.value.formValue1 = resData.title;
  38166. form.value.formValue3 = resData.fix_yn;
  38167. form.value.formValue7 = resData.hash_tag;
  38168. //에디터에 컨텐츠 전달
  38169. editorContentReq.value = resData.content;
  38170. uploadFiles.value[0].file_name = resData.file_title;
  38171. uploadFiles.value[0].ogn_name = resData.ogn_f_title;
  38172. form.value.formValue4 = resData.file_title_pic;
  38173. uploadPicFiles.value[0].file_name = resData.file_title_pic;
  38174. uploadPicFiles.value[0].ogn_name = resData.ogn_f_title_pic;
  38175. imgTemp.value =
  38176. apiUrl.value +
  38177. "/images/" +
  38178. res.data.path.replace(/.*\/files\//, "") +
  38179. "/" +
  38180. res.data.file_title_pic;
  38181. })
  38182. .catch((error) => {
  38183. //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
  38184. //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
  38185. })
  38186. .finally(() => {
  38187. //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
  38188. //objSlt.value.tenantNameList = _cloneDeep(temp);
  38189. });
  38190. };
  38191. /*=======================================================================
  38192. | 최종 에디터 이미지 url치환 : S
  38193. /*=======================================================================*/
  38194. const editorContent = async () => {
  38195. const content = sunEditorWrapper.value.getEditorContent();
  38196. updatedContent.value = await processEditorContent(content);
  38197. console.log("Updated content:", updatedContent.value);
  38198. };
  38199. // Base64 데이터를 Blob으로 변환
  38200. const base64ToBlob = (base64, mimeType) => {
  38201. const byteString = atob(base64.split(",")[1]);
  38202. const arrayBuffer = new ArrayBuffer(byteString.length);
  38203. const uint8Array = new Uint8Array(arrayBuffer);
  38204. for (let i = 0; i < byteString.length; i++) {
  38205. uint8Array[i] = byteString.charCodeAt(i);
  38206. }
  38207. return new Blob([uint8Array], { type: mimeType });
  38208. };
  38209. // Base64 데이터를 File 객체로 변환
  38210. const base64ToFile = (base64, mimeType, fileName) => {
  38211. const blob = base64ToBlob(base64, mimeType);
  38212. return new File([blob], fileName, { type: mimeType });
  38213. };
  38214. // 이미지 업로드 처리 (useAxios)
  38215. const uploadImage = async (file) => {
  38216. const formDataEdt = new FormData();
  38217. formDataEdt.append("picObj", file);
  38218. return useAxios()
  38219. .post("/pic/upload", formDataEdt, {
  38220. headers: { "Content-Type": "multipart/form-data" },
  38221. })
  38222. .then((res) => {
  38223. const filePath = res.data.ogn_name.path.replace(/.*\/files\//, "");
  38224. const fileName = res.data.ogn_name.file_name;
  38225. return `${apiUrl.value}/images/${filePath}/${fileName}`; // 최종 URL 반환
  38226. })
  38227. .catch((error) => {
  38228. console.error("Image upload failed:", error);
  38229. return null;
  38230. });
  38231. };
  38232. // 에디터 내용 처리 및 이미지 업로드
  38233. const processEditorContent = async (content) => {
  38234. const parser = new DOMParser();
  38235. const doc = parser.parseFromString(content, "text/html");
  38236. const images = doc.querySelectorAll("img");
  38237. for (let i = 0; i < images.length; i++) {
  38238. const img = images[i];
  38239. const src = img.src;
  38240. if (src.startsWith("data:image")) {
  38241. // MIME 타입과 파일 이름 추출
  38242. const mimeType = src.split(";")[0].split(":")[1];
  38243. const extension = mimeType.split("/")[1];
  38244. const fileName = `image-${i + 1}.${extension}`;
  38245. // Base64 데이터를 File 객체로 변환
  38246. const file = base64ToFile(src, mimeType, fileName);
  38247. // 이미지 업로드 및 URL 반환
  38248. const finalUrl = await uploadImage(file);
  38249. if (finalUrl) {
  38250. img.src = finalUrl; // 이미지 src 업데이트
  38251. }
  38252. }
  38253. }
  38254. return doc.body.innerHTML; // 최종 수정된 HTML 반환
  38255. };
  38256. /*=======================================================================
  38257. | 최종 에디터 이미지 url치환 : E
  38258. /*=======================================================================*/
  38259. /************************************************************************
  38260. | 팝업 이벤트버스 정의
  38261. ************************************************************************/
  38262. $eventBus.off("FN_INSERT");
  38263. $eventBus.on("FN_INSERT", () => {
  38264. fnInsert();
  38265. });
  38266. $eventBus.off("FN_UPDATE");
  38267. $eventBus.on("FN_UPDATE", () => {
  38268. fnUpdate();
  38269. });
  38270. $eventBus.off("FN_DELETE");
  38271. $eventBus.on("FN_DELETE", () => {
  38272. fnDelete();
  38273. });
  38274. /************************************************************************
  38275. | 라이프사이클
  38276. ************************************************************************/
  38277. onMounted(() => {
  38278. pageType.value = useDtStore.boardInfo.pageType;
  38279. //상세 등록 아니 리스트 클릭시 상세 정보로 접근
  38280. if (pageType.value == "U") {
  38281. fnDetail();
  38282. }
  38283. });
  38284. /************************************************************************
  38285. | WATCH
  38286. ************************************************************************/
  38287. </script>
  38288. </file>
  38289. <file path="pages/view/common/settle/newsList.vue">
  38290. <template>
  38291. <div>
  38292. <div class="inner--headers">
  38293. <h2>{{ pageId }}</h2>
  38294. <div class="bread--crumbs--wrap">
  38295. <span>홈</span>
  38296. <span>{{ pageId }}</span>
  38297. <span v-if="pageIdSub">{{ pageIdSub }}</span>
  38298. </div>
  38299. </div>
  38300. <div class="search--modules">
  38301. <div class="form--cont--filter">
  38302. <v-select
  38303. v-model="filter"
  38304. :items="filderArr"
  38305. variant="outlined"
  38306. class="custom-select"
  38307. >
  38308. </v-select>
  38309. </div>
  38310. <div class="form--cont--text">
  38311. <v-text-field
  38312. v-model="searchModel"
  38313. class="custom-input mini"
  38314. style="width: 100%"
  38315. placeholder="검색어를 입력하세요"
  38316. ></v-text-field>
  38317. </div>
  38318. <v-btn
  38319. class="custom-btn btn-blue mini sch--btn"
  38320. @click="fnSearch(searchModel, filter)"
  38321. >검색</v-btn
  38322. >
  38323. </div>
  38324. <div class="data--list--wrap">
  38325. <div class="btn--actions--wrap">
  38326. <div class="left--sections">
  38327. <!-- <v-btn class="custom-btn mini btn-white">선택 삭제</v-btn> -->
  38328. </div>
  38329. <div class="right--sections">
  38330. <v-btn class="custom-btn mini btn-reg" @click="addLocated"
  38331. ><i class="ico"></i>신규 등록</v-btn
  38332. >
  38333. </div>
  38334. </div>
  38335. <div class="tbl-wrapper">
  38336. <div class="tbl-wrap">
  38337. <!-- ag grid -->
  38338. <ag-grid-vue
  38339. style="width: 100%; height: calc(10 * 2.94rem)"
  38340. class="ag-theme-quartz"
  38341. :gridOptions="gridOptions"
  38342. :rowData="tblItems"
  38343. :paginationPageSize="pageObj.pageSize"
  38344. :suppressPaginationPanel="true"
  38345. @grid-ready="onGridReady"
  38346. @rowClicked="detailLocated"
  38347. >
  38348. </ag-grid-vue>
  38349. <!-- 페이징 -->
  38350. <div class="ag-grid-custom-pagenations">
  38351. <pagination @chg_page="chgPage" :pageObj="pageObj"></pagination>
  38352. </div>
  38353. </div>
  38354. </div>
  38355. </div>
  38356. </div>
  38357. </template>
  38358. <script setup>
  38359. import { AgGridVue } from "ag-grid-vue3";
  38360. import pagination from "../components/common/pagination.vue";
  38361. /************************************************************************
  38362. | 레이아웃
  38363. ************************************************************************/
  38364. definePageMeta({
  38365. layout: "default",
  38366. });
  38367. /************************************************************************
  38368. | PROPS
  38369. ************************************************************************/
  38370. const props = defineProps({
  38371. propsData: {
  38372. type: Object,
  38373. default: () => {},
  38374. },
  38375. });
  38376. /************************************************************************
  38377. | 스토어
  38378. ************************************************************************/
  38379. const useDtStore = useDetailStore();
  38380. /************************************************************************
  38381. | 전역
  38382. ************************************************************************/
  38383. const filter = ref("");
  38384. const filderArr = ref([
  38385. { title: "선택하세요", value: "" },
  38386. { title: "제목", value: "title" },
  38387. { title: "내용", value: "content" },
  38388. ]);
  38389. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  38390. const router = useRouter();
  38391. const pageId = ref("NEWS ROOM");
  38392. const pageIdSub = ref();
  38393. let pageObj = ref({
  38394. page: 1, // 현재 페이지
  38395. pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
  38396. pageSize: 10, // 테이블 조회 데이터 개수
  38397. totalCnt: 0, // 전체 페이지
  38398. });
  38399. const searchModel = ref("");
  38400. const tblItems = ref([]); // stat 데이터
  38401. /* eslint-disable */
  38402. /* prettier-ignore */
  38403. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  38404. const rowHeightRem = 2.65; // 원하는 rem 값
  38405. const rowHeightPx = rowHeightRem * remToPx();
  38406. const gridApi = shallowRef();
  38407. // gridOption
  38408. const gridOptions = {
  38409. columnDefs: [
  38410. {
  38411. headerName: "No",
  38412. valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
  38413. sortable: false,
  38414. width: 70,
  38415. },
  38416. { headerName: "언어", field: "brd_lang", sortable: true, width: 70 },
  38417. { headerName: "제목", field: "title", sortable: false, width: 500 },
  38418. { headerName: "조회수", field: "read_cnt", sortable: false, width: 70 },
  38419. { headerName: "고정여부", field: "fix_yn", sortable: true, width: 70 },
  38420. { headerName: "노출여부", field: "show_yn", sortable: true, width: 70 },
  38421. { headerName: "작성자", field: "admin_name", sortable: false, width: 120 },
  38422. { headerName: "등록일", field: "crt_dtime", sortable: false, width: 120 },
  38423. ],
  38424. rowData: tblItems.value, // 테이블 데이터
  38425. autoSizeStrategy: {
  38426. type: "fitGridWidth", // width맞춤
  38427. },
  38428. suppressMovableColumns: true,
  38429. headerHeight: rowHeightPx,
  38430. rowHeight: rowHeightPx,
  38431. pagination: true,
  38432. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  38433. // rowSelection: {
  38434. // checkboxes: true,
  38435. // headerCheckbox: true,
  38436. // enableClickSelection: false,
  38437. // mode: "multiRow",
  38438. // },
  38439. };
  38440. /************************************************************************
  38441. | 함수(METHODS)
  38442. ************************************************************************/
  38443. const onGridReady = (__PARAMS) => {
  38444. gridApi.value = __PARAMS.api;
  38445. };
  38446. const chgPage = (__PAGE) => {
  38447. pageObj.value.page = __PAGE;
  38448. gridApi.value.paginationGoToPage(__PAGE - 1);
  38449. };
  38450. const addLocated = () => {
  38451. router.push({
  38452. path: "/view/media/newsAdd",
  38453. //query: { id: rowId },
  38454. });
  38455. useDtStore.boardInfo.pageType = "I";
  38456. };
  38457. const detailLocated = (__EVENT) => {
  38458. router.push({
  38459. path: "/view/media/newsAdd",
  38460. });
  38461. useDtStore.boardInfo.seq = __EVENT.data.seq;
  38462. useDtStore.boardInfo.pageType = "U";
  38463. };
  38464. const newsListGet = () => {
  38465. let _req = {
  38466. _size: 1000,
  38467. _index: 0,
  38468. show_yn: "",
  38469. brd_lang: "",
  38470. brd_cd: "BR00",
  38471. };
  38472. useAxios()
  38473. .post("/brd/list", _req)
  38474. .then((res) => {
  38475. _req._size = res.data.list.length;
  38476. tblItems.value = res.data.list;
  38477. pageObj.value.totalCnt = tblItems.value.length;
  38478. })
  38479. .catch((error) => {});
  38480. };
  38481. const fnSearch = (__KEYWORD, __FILTER) => {
  38482. let _req = {
  38483. _size: 1000,
  38484. _index: 0,
  38485. brd_lang: "",
  38486. brd_cd: "BR00",
  38487. content: __FILTER == "content" ? __KEYWORD : __FILTER == "" ? __KEYWORD : null,
  38488. title: __FILTER == "title" ? __KEYWORD : __FILTER == "" ? __KEYWORD : null,
  38489. };
  38490. useAxios()
  38491. .post("/brd/list", _req)
  38492. .then((res) => {
  38493. _req._size = res.data.list.length;
  38494. tblItems.value = res.data.list;
  38495. pageObj.value.totalCnt = tblItems.value.length;
  38496. })
  38497. .catch((error) => {});
  38498. };
  38499. /************************************************************************
  38500. | WATCH
  38501. ************************************************************************/
  38502. onMounted(() => {
  38503. newsListGet();
  38504. });
  38505. </script>
  38506. </file>
  38507. <file path="pages/view/influencer/[id].vue">
  38508. <template>
  38509. <div>
  38510. <div class="inner--headers">
  38511. <h2>인플루언서 프로필</h2>
  38512. <div class="bread--crumbs--wrap">
  38513. <span>홈</span>
  38514. <span>인플루언서</span>
  38515. <span>프로필</span>
  38516. </div>
  38517. </div>
  38518. <!-- 로딩 상태 -->
  38519. <div v-if="loading" class="loading-wrap">
  38520. <v-progress-circular indeterminate color="primary"></v-progress-circular>
  38521. <p>프로필을 불러오고 있습니다...</p>
  38522. </div>
  38523. <!-- 에러 상태 -->
  38524. <div v-else-if="error" class="error-wrap">
  38525. <v-alert type="error" dismissible @click:close="error = null">
  38526. {{ error }}
  38527. </v-alert>
  38528. </div>
  38529. <!-- 프로필 정보 -->
  38530. <div v-else-if="profile" class="profile--wrap">
  38531. <!-- 프로필 헤더 -->
  38532. <div class="profile--header">
  38533. <div class="profile--avatar">
  38534. <v-img
  38535. v-if="profile.PROFILE_IMAGE"
  38536. :src="profile.PROFILE_IMAGE"
  38537. :alt="profile.NICK_NAME + ' 프로필'"
  38538. width="120"
  38539. height="120"
  38540. cover
  38541. ></v-img>
  38542. <div v-else class="no-avatar">
  38543. {{ profile.NICK_NAME?.charAt(0) || "U" }}
  38544. </div>
  38545. </div>
  38546. <div class="profile--info">
  38547. <div class="profile--name">
  38548. <h3>{{ profile.NICK_NAME }}</h3>
  38549. <v-chip
  38550. v-if="profile.PRIMARY_CATEGORY"
  38551. color="primary"
  38552. size="small"
  38553. class="ml-2"
  38554. >
  38555. {{ getCategoryText(profile.PRIMARY_CATEGORY) }}
  38556. </v-chip>
  38557. </div>
  38558. <div class="profile--meta">
  38559. <div class="meta--item">
  38560. <v-icon size="small">mdi-account-group</v-icon>
  38561. <span>{{ formatNumber(profile.FOLLOWER_COUNT || 0) }} 팔로워</span>
  38562. </div>
  38563. <div class="meta--item">
  38564. <v-icon size="small">mdi-chart-line</v-icon>
  38565. <span>참여율 {{ profile.ENGAGEMENT_RATE || 0 }}%</span>
  38566. </div>
  38567. <div v-if="profile.REGION" class="meta--item">
  38568. <v-icon size="small">mdi-map-marker</v-icon>
  38569. <span>{{ profile.REGION }}</span>
  38570. </div>
  38571. </div>
  38572. <p v-if="profile.DESCRIPTION" class="profile--description">
  38573. {{ profile.DESCRIPTION }}
  38574. </p>
  38575. </div>
  38576. </div>
  38577. <!-- SNS 채널 -->
  38578. <div v-if="snsChannels.length > 0" class="profile--channels">
  38579. <h4>SNS 채널</h4>
  38580. <div class="channels--grid">
  38581. <a
  38582. v-for="channel in snsChannels"
  38583. :key="channel.platform"
  38584. :href="getSnsUrl(channel)"
  38585. target="_blank"
  38586. rel="noopener noreferrer"
  38587. class="channel--card"
  38588. >
  38589. <v-icon size="24" :color="getSnsColor(channel.platform)">
  38590. {{ getSnsIcon(channel.platform) }}
  38591. </v-icon>
  38592. <div class="channel--info">
  38593. <h5>{{ getSnsTitle(channel.platform) }}</h5>
  38594. <p>{{ channel.handle }}</p>
  38595. </div>
  38596. <v-icon size="16">mdi-open-in-new</v-icon>
  38597. </a>
  38598. </div>
  38599. </div>
  38600. <!-- 콘텐츠 통계 -->
  38601. <div class="profile--stats">
  38602. <h4>콘텐츠 통계</h4>
  38603. <div class="stats--grid">
  38604. <div class="stat--card">
  38605. <div class="stat--icon followers">
  38606. <v-icon>mdi-account-group</v-icon>
  38607. </div>
  38608. <div class="stat--content">
  38609. <h5>팔로워</h5>
  38610. <p>{{ formatNumber(profile.FOLLOWER_COUNT || 0) }}</p>
  38611. </div>
  38612. </div>
  38613. <div class="stat--card">
  38614. <div class="stat--icon engagement">
  38615. <v-icon>mdi-chart-line</v-icon>
  38616. </div>
  38617. <div class="stat--content">
  38618. <h5>참여율</h5>
  38619. <p>{{ profile.ENGAGEMENT_RATE || 0 }}%</p>
  38620. </div>
  38621. </div>
  38622. <div class="stat--card">
  38623. <div class="stat--icon partnerships">
  38624. <v-icon>mdi-handshake</v-icon>
  38625. </div>
  38626. <div class="stat--content">
  38627. <h5>협업</h5>
  38628. <p>{{ formatNumber(partnershipCount || 0) }}건</p>
  38629. </div>
  38630. </div>
  38631. </div>
  38632. </div>
  38633. <!-- 협업 이력 -->
  38634. <div v-if="partnerships.length > 0" class="profile--partnerships">
  38635. <h4>협업 이력</h4>
  38636. <div class="partnerships--timeline">
  38637. <div
  38638. v-for="partnership in partnerships"
  38639. :key="partnership.SEQ"
  38640. class="timeline--item"
  38641. >
  38642. <div class="timeline--date">
  38643. {{ formatDate(partnership.REG_DATE) }}
  38644. </div>
  38645. <div class="timeline--content">
  38646. <h5>{{ partnership.vendorName }}</h5>
  38647. <p v-if="partnership.DESCRIPTION">
  38648. {{ partnership.DESCRIPTION }}
  38649. </p>
  38650. <div class="timeline--meta">
  38651. <v-chip size="x-small" :color="getStatusColor(partnership.STATUS)">
  38652. {{ getStatusText(partnership.STATUS) }}
  38653. </v-chip>
  38654. </div>
  38655. </div>
  38656. </div>
  38657. </div>
  38658. </div>
  38659. </div>
  38660. <!-- 데이터 없음 -->
  38661. <div v-else class="no-data-wrap">
  38662. <div class="no-data">
  38663. <v-icon size="64" color="grey-lighten-1">mdi-account-question</v-icon>
  38664. <h3>프로필을 찾을 수 없습니다</h3>
  38665. <p>요청하신 인플루언서 프로필이 존재하지 않습니다</p>
  38666. </div>
  38667. </div>
  38668. </div>
  38669. </template>
  38670. <script setup>
  38671. import { ref, onMounted } from "vue";
  38672. import { useRoute } from "vue-router";
  38673. /************************************************************************
  38674. | 레이아웃
  38675. ************************************************************************/
  38676. definePageMeta({
  38677. layout: "default",
  38678. });
  38679. /************************************************************************
  38680. | 스토어 & 라우터
  38681. ************************************************************************/
  38682. const route = useRoute();
  38683. const { $toast } = useNuxtApp();
  38684. /************************************************************************
  38685. | 반응형 데이터
  38686. ************************************************************************/
  38687. const loading = ref(false);
  38688. const error = ref(null);
  38689. const profile = ref(null);
  38690. const partnerships = ref([]);
  38691. const partnershipCount = ref(0);
  38692. /************************************************************************
  38693. | computed
  38694. ************************************************************************/
  38695. const snsChannels = computed(() => {
  38696. if (!profile.value?.SNS_CHANNELS) return [];
  38697. try {
  38698. return JSON.parse(profile.value.SNS_CHANNELS);
  38699. } catch (e) {
  38700. return [];
  38701. }
  38702. });
  38703. /************************************************************************
  38704. | 메서드
  38705. ************************************************************************/
  38706. const loadProfile = async () => {
  38707. try {
  38708. loading.value = true;
  38709. error.value = null;
  38710. const influencerSeq = route.params.id;
  38711. const params = { influencerSeq };
  38712. useAxios()
  38713. .post("/api/influencer/profile", params)
  38714. .then((res) => {
  38715. if (res.data.success) {
  38716. profile.value = res.data.data.profile;
  38717. partnerships.value = res.data.data.partnerships || [];
  38718. partnershipCount.value = res.data.data.partnershipCount || 0;
  38719. } else {
  38720. error.value = res.data.message || "프로필을 불러오는데 실패했습니다.";
  38721. }
  38722. })
  38723. .catch((err) => {
  38724. error.value = err.message || "프로필을 불러오는데 실패했습니다.";
  38725. })
  38726. .finally(() => {
  38727. loading.value = false;
  38728. });
  38729. } catch (err) {
  38730. error.value = err.message || "프로필을 불러오는데 실패했습니다.";
  38731. loading.value = false;
  38732. }
  38733. };
  38734. const getCategoryText = (category) => {
  38735. const categoryMap = {
  38736. FASHION_BEAUTY: "패션·뷰티",
  38737. FOOD_HEALTH: "식품·건강",
  38738. LIFESTYLE: "라이프스타일",
  38739. TECH_ELECTRONICS: "테크·가전",
  38740. SPORTS_LEISURE: "스포츠·레저",
  38741. CULTURE_ENTERTAINMENT: "문화·엔터테인먼트",
  38742. };
  38743. return categoryMap[category] || category || "기타";
  38744. };
  38745. const formatNumber = (num) => {
  38746. if (!num) return "0";
  38747. if (num >= 1000000) return (num / 1000000).toFixed(1) + "M";
  38748. if (num >= 1000) return (num / 1000).toFixed(1) + "K";
  38749. return num.toString();
  38750. };
  38751. const formatDate = (dateString) => {
  38752. return new Date(dateString).toLocaleDateString("ko-KR");
  38753. };
  38754. const getSnsIcon = (platform) => {
  38755. const iconMap = {
  38756. instagram: "mdi-instagram",
  38757. youtube: "mdi-youtube",
  38758. tiktok: "mdi-music-note",
  38759. blog: "mdi-post",
  38760. facebook: "mdi-facebook",
  38761. twitter: "mdi-twitter",
  38762. };
  38763. return iconMap[platform.toLowerCase()] || "mdi-link";
  38764. };
  38765. const getSnsColor = (platform) => {
  38766. const colorMap = {
  38767. instagram: "#E4405F",
  38768. youtube: "#FF0000",
  38769. tiktok: "#000000",
  38770. blog: "#00B336",
  38771. facebook: "#1877F2",
  38772. twitter: "#1DA1F2",
  38773. };
  38774. return colorMap[platform.toLowerCase()] || "#666666";
  38775. };
  38776. const getSnsTitle = (platform) => {
  38777. const titleMap = {
  38778. instagram: "Instagram",
  38779. youtube: "YouTube",
  38780. tiktok: "TikTok",
  38781. blog: "Blog",
  38782. facebook: "Facebook",
  38783. twitter: "Twitter",
  38784. };
  38785. return titleMap[platform] || platform;
  38786. };
  38787. const getSnsUrl = (channel) => {
  38788. const handle = channel.handle.replace("@", "");
  38789. const urlMap = {
  38790. instagram: `https://instagram.com/${handle}`,
  38791. youtube: `https://youtube.com/@${handle}`,
  38792. tiktok: `https://tiktok.com/@${handle}`,
  38793. blog: channel.handle.startsWith("http") ? channel.handle : `https://${handle}`,
  38794. facebook: `https://facebook.com/${handle}`,
  38795. twitter: `https://twitter.com/${handle}`,
  38796. };
  38797. return urlMap[channel.platform.toLowerCase()] || channel.handle;
  38798. };
  38799. const getStatusText = (status) => {
  38800. const statusMap = {
  38801. PENDING: "진행중",
  38802. APPROVED: "완료",
  38803. REJECTED: "거절됨",
  38804. CANCELLED: "취소됨",
  38805. };
  38806. return statusMap[status] || status || "알 수 없음";
  38807. };
  38808. const getStatusColor = (status) => {
  38809. const colorMap = {
  38810. PENDING: "warning",
  38811. APPROVED: "success",
  38812. REJECTED: "error",
  38813. CANCELLED: "grey",
  38814. };
  38815. return colorMap[status] || "grey";
  38816. };
  38817. /************************************************************************
  38818. | 라이프사이클
  38819. ************************************************************************/
  38820. onMounted(() => {
  38821. loadProfile();
  38822. });
  38823. </script>
  38824. <style scoped>
  38825. .profile--wrap {
  38826. background: white;
  38827. border-radius: 12px;
  38828. padding: 24px;
  38829. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  38830. }
  38831. .profile--header {
  38832. display: flex;
  38833. gap: 24px;
  38834. margin-bottom: 32px;
  38835. }
  38836. .profile--avatar {
  38837. width: 120px;
  38838. height: 120px;
  38839. border-radius: 60px;
  38840. overflow: hidden;
  38841. flex-shrink: 0;
  38842. background: #f5f5f5;
  38843. display: flex;
  38844. align-items: center;
  38845. justify-content: center;
  38846. }
  38847. .no-avatar {
  38848. font-size: 48px;
  38849. font-weight: bold;
  38850. color: #666;
  38851. }
  38852. .profile--info {
  38853. flex: 1;
  38854. }
  38855. .profile--name {
  38856. display: flex;
  38857. align-items: center;
  38858. margin-bottom: 12px;
  38859. }
  38860. .profile--name h3 {
  38861. margin: 0;
  38862. font-size: 24px;
  38863. font-weight: 600;
  38864. }
  38865. .profile--meta {
  38866. display: flex;
  38867. flex-wrap: wrap;
  38868. gap: 16px;
  38869. margin-bottom: 16px;
  38870. }
  38871. .meta--item {
  38872. display: flex;
  38873. align-items: center;
  38874. gap: 6px;
  38875. color: #666;
  38876. }
  38877. .profile--description {
  38878. font-size: 14px;
  38879. line-height: 1.6;
  38880. color: #444;
  38881. margin: 0;
  38882. }
  38883. .profile--channels {
  38884. margin-top: 32px;
  38885. }
  38886. .profile--channels h4,
  38887. .profile--stats h4,
  38888. .profile--partnerships h4 {
  38889. margin: 0 0 16px 0;
  38890. font-size: 18px;
  38891. font-weight: 600;
  38892. color: #333;
  38893. }
  38894. .channels--grid {
  38895. display: grid;
  38896. grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  38897. gap: 16px;
  38898. }
  38899. .channel--card {
  38900. display: flex;
  38901. align-items: center;
  38902. gap: 12px;
  38903. padding: 16px;
  38904. background: #f8f9fa;
  38905. border-radius: 8px;
  38906. text-decoration: none;
  38907. color: inherit;
  38908. transition: transform 0.2s, box-shadow 0.2s;
  38909. }
  38910. .channel--card:hover {
  38911. transform: translateY(-2px);
  38912. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  38913. }
  38914. .channel--info {
  38915. flex: 1;
  38916. }
  38917. .channel--info h5 {
  38918. margin: 0 0 4px 0;
  38919. font-size: 14px;
  38920. font-weight: 600;
  38921. }
  38922. .channel--info p {
  38923. margin: 0;
  38924. font-size: 13px;
  38925. color: #666;
  38926. }
  38927. .profile--stats {
  38928. margin-top: 32px;
  38929. }
  38930. .stats--grid {
  38931. display: grid;
  38932. grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  38933. gap: 16px;
  38934. }
  38935. .stat--card {
  38936. display: flex;
  38937. align-items: center;
  38938. gap: 16px;
  38939. padding: 20px;
  38940. background: #f8f9fa;
  38941. border-radius: 8px;
  38942. }
  38943. .stat--icon {
  38944. width: 48px;
  38945. height: 48px;
  38946. border-radius: 24px;
  38947. display: flex;
  38948. align-items: center;
  38949. justify-content: center;
  38950. color: white;
  38951. }
  38952. .stat--icon.followers {
  38953. background: #2196f3;
  38954. }
  38955. .stat--icon.engagement {
  38956. background: #4caf50;
  38957. }
  38958. .stat--icon.partnerships {
  38959. background: #ff9800;
  38960. }
  38961. .stat--content h5 {
  38962. margin: 0 0 4px 0;
  38963. font-size: 14px;
  38964. color: #666;
  38965. }
  38966. .stat--content p {
  38967. margin: 0;
  38968. font-size: 20px;
  38969. font-weight: 600;
  38970. color: #333;
  38971. }
  38972. .profile--partnerships {
  38973. margin-top: 32px;
  38974. }
  38975. .partnerships--timeline {
  38976. display: flex;
  38977. flex-direction: column;
  38978. gap: 16px;
  38979. }
  38980. .timeline--item {
  38981. display: flex;
  38982. gap: 16px;
  38983. }
  38984. .timeline--date {
  38985. flex-shrink: 0;
  38986. width: 100px;
  38987. font-size: 14px;
  38988. color: #666;
  38989. }
  38990. .timeline--content {
  38991. flex: 1;
  38992. background: #f8f9fa;
  38993. padding: 16px;
  38994. border-radius: 8px;
  38995. position: relative;
  38996. }
  38997. .timeline--content::before {
  38998. content: "";
  38999. position: absolute;
  39000. left: -8px;
  39001. top: 50%;
  39002. transform: translateY(-50%);
  39003. width: 16px;
  39004. height: 16px;
  39005. background: #f8f9fa;
  39006. transform: rotate(45deg);
  39007. }
  39008. .timeline--content h5 {
  39009. margin: 0 0 8px 0;
  39010. font-size: 16px;
  39011. font-weight: 600;
  39012. }
  39013. .timeline--content p {
  39014. margin: 0 0 8px 0;
  39015. font-size: 14px;
  39016. color: #666;
  39017. }
  39018. .timeline--meta {
  39019. display: flex;
  39020. gap: 8px;
  39021. }
  39022. .loading-wrap,
  39023. .error-wrap,
  39024. .no-data-wrap {
  39025. display: flex;
  39026. flex-direction: column;
  39027. align-items: center;
  39028. justify-content: center;
  39029. padding: 60px 20px;
  39030. }
  39031. .no-data {
  39032. text-align: center;
  39033. }
  39034. .no-data h3 {
  39035. margin: 16px 0 8px;
  39036. color: #666;
  39037. }
  39038. .no-data p {
  39039. color: #999;
  39040. }
  39041. @media (max-width: 768px) {
  39042. .profile--header {
  39043. flex-direction: column;
  39044. align-items: center;
  39045. text-align: center;
  39046. }
  39047. .profile--meta {
  39048. justify-content: center;
  39049. }
  39050. .timeline--item {
  39051. flex-direction: column;
  39052. gap: 8px;
  39053. }
  39054. .timeline--date {
  39055. width: auto;
  39056. }
  39057. .timeline--content::before {
  39058. display: none;
  39059. }
  39060. }
  39061. </style>
  39062. </file>
  39063. <file path="pages/view/log/.htaccess">
  39064. <IfModule mod_headers.c>
  39065. Header set X-Frame-Options "SAMEORIGIN"
  39066. Header set X-Content-Type-Options "nosniff"
  39067. Header set Content-Security-Policy "frame-ancestors 'self'; object-src 'none'; base-uri 'none'; style-src 'self' https://fonts.googleapis.com 'sha256-HcB32D63QxbHF81G9ir4A4ZtfSFlntT1ZUYUPKNuzfI='; form-action 'none'; script-src 'self' https://telechips.com/ 'sha256-DeBr3gwOVHhgwFHqM/PUBt8+13hm5USRVzjvGh0x0jU='"
  39068. </IfModule>
  39069. </file>
  39070. <file path="pages/view/log/logList.vue">
  39071. <template>
  39072. <div>
  39073. <div class="inner--headers">
  39074. <h2>{{ pageId }}</h2>
  39075. <div class="bread--crumbs--wrap">
  39076. <span>홈</span>
  39077. <span>{{ pageId }}</span>
  39078. <span v-if="pageIdSub">{{ pageIdSub }}</span>
  39079. </div>
  39080. </div>
  39081. <searchModules />
  39082. <div class="data--list--wrap">
  39083. <div class="btn--actions--wrap">
  39084. <div class="left--sections">
  39085. <!-- <v-btn class="custom-btn mini btn-white">선택 삭제</v-btn> -->
  39086. </div>
  39087. <div class="right--sections">
  39088. <!-- <v-btn class="custom-btn mini btn-reg" @click="addLocated"
  39089. ><i class="ico"></i>신규 등록</v-btn
  39090. > -->
  39091. </div>
  39092. </div>
  39093. <div class="tbl-wrapper">
  39094. <div class="tbl-wrap">
  39095. <!-- ag grid -->
  39096. <ag-grid-vue
  39097. style="width: 100%; height: calc(10 * 2.94rem)"
  39098. class="ag-theme-quartz"
  39099. :gridOptions="gridOptions"
  39100. :rowData="tblItems"
  39101. :paginationPageSize="pageObj.pageSize"
  39102. :suppressPaginationPanel="true"
  39103. @grid-ready="onGridReady"
  39104. @rowClicked="detailLocated"
  39105. >
  39106. </ag-grid-vue>
  39107. <!-- 페이징 -->
  39108. <div class="ag-grid-custom-pagenations" v-if="pageObj.totalCnt != 0">
  39109. <pagination @chg_page="chgPage" :pageObj="pageObj"></pagination>
  39110. </div>
  39111. </div>
  39112. </div>
  39113. </div>
  39114. </div>
  39115. </template>
  39116. <script setup>
  39117. import pagination from "../components/common/pagination.vue";
  39118. import { AgGridVue } from "ag-grid-vue3";
  39119. import searchModules from "@/components/search/searchModules";
  39120. /************************************************************************
  39121. | 레이아웃
  39122. ************************************************************************/
  39123. definePageMeta({
  39124. layout: "default",
  39125. });
  39126. /************************************************************************
  39127. | PROPS
  39128. ************************************************************************/
  39129. const props = defineProps({
  39130. propsData: {
  39131. type: Object,
  39132. default: () => {},
  39133. },
  39134. });
  39135. /************************************************************************
  39136. | 스토어
  39137. ************************************************************************/
  39138. const useDtStore = useDetailStore();
  39139. /************************************************************************
  39140. | 전역
  39141. ************************************************************************/
  39142. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  39143. const router = useRouter();
  39144. const pageId = ref("LOG");
  39145. const pageIdSub = ref();
  39146. let pageObj = ref({
  39147. page: 1, // 현재 페이지
  39148. pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
  39149. pageSize: 10, // 테이블 조회 데이터 개수
  39150. totalCnt: 0, // 전체 페이지
  39151. });
  39152. const tblItems = ref([]); // stat 데이터
  39153. /* eslint-disable */
  39154. /* prettier-ignore */
  39155. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  39156. const rowHeightRem = 2.65; // 원하는 rem 값
  39157. const rowHeightPx = rowHeightRem * remToPx();
  39158. const gridApi = shallowRef();
  39159. // gridOption
  39160. const gridOptions = {
  39161. columnDefs: [
  39162. {
  39163. headerName: "No",
  39164. valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
  39165. sortable: false,
  39166. width: 70,
  39167. },
  39168. { headerName: "ID", field: "log_id", sortable: false },
  39169. { headerName: "활동유형", field: "act_ctgy_nm", sortable: false },
  39170. { headerName: "일시", field: "log_dtime", sortable: false },
  39171. ],
  39172. rowData: tblItems.value, // 테이블 데이터
  39173. autoSizeStrategy: {
  39174. type: "fitGridWidth", // width맞춤
  39175. },
  39176. suppressMovableColumns: true,
  39177. headerHeight: rowHeightPx,
  39178. rowHeight: rowHeightPx,
  39179. pagination: true,
  39180. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  39181. // rowSelection: {
  39182. // checkboxes: true,
  39183. // headerCheckbox: true,
  39184. // enableClickSelection: false,
  39185. // mode: "multiRow",
  39186. // },
  39187. };
  39188. /************************************************************************
  39189. | 함수(METHODS)
  39190. ************************************************************************/
  39191. const onGridReady = (__PARAMS) => {
  39192. gridApi.value = __PARAMS.api;
  39193. };
  39194. const chgPage = (__PAGE) => {
  39195. pageObj.value.page = __PAGE;
  39196. gridApi.value.paginationGoToPage(__PAGE - 1);
  39197. };
  39198. // const addLocated = () => {
  39199. // router.push({
  39200. // path: "/view/media/newsAdd",
  39201. // //query: { id: rowId },
  39202. // });
  39203. // useDtStore.boardInfo.pageType = "I";
  39204. // };
  39205. // const detailLocated = (__EVENT) => {
  39206. // router.push({
  39207. // path: "/view/media/newsAdd",
  39208. // });
  39209. // useDtStore.boardInfo.seq = __EVENT.data.seq;
  39210. // useDtStore.boardInfo.pageType = "U";
  39211. // };
  39212. const logListGet = () => {
  39213. let _req = {
  39214. _size: 1000,
  39215. _index: 0,
  39216. //brd_lang: "",
  39217. //brd_cd: "BR00",
  39218. };
  39219. useAxios()
  39220. .post("/log/list", _req)
  39221. .then((res) => {
  39222. _req._size = res.data.list.length;
  39223. tblItems.value = res.data.list;
  39224. pageObj.value.totalCnt = tblItems.value.length;
  39225. })
  39226. .catch((error) => {});
  39227. };
  39228. /************************************************************************
  39229. | WATCH
  39230. ************************************************************************/
  39231. watch(() => {});
  39232. onMounted(() => {
  39233. logListGet();
  39234. });
  39235. </script>
  39236. </file>
  39237. <file path="pages/view/vendor/dashboard/index.vue">
  39238. <template>
  39239. <div>
  39240. <div class="inner--headers">
  39241. <h2>{{ pageId }}</h2>
  39242. <div class="bread--crumbs--wrap">
  39243. <span>홈</span>
  39244. <span>{{ pageId }}</span>
  39245. </div>
  39246. </div>
  39247. <!-- 필터링 섹션 -->
  39248. <div class="dashboard--filters">
  39249. <div class="filter--wrap">
  39250. <div class="date--range">
  39251. <VueDatePicker
  39252. v-model="dateRange"
  39253. range
  39254. :format="dateFormat"
  39255. placeholder="기간을 선택하세요"
  39256. :auto-apply="true"
  39257. @update:model-value="onDateRangeChange"
  39258. />
  39259. </div>
  39260. <div class="quick--filters">
  39261. <v-btn
  39262. :class="{ 'active': selectedPeriod === 'today' }"
  39263. @click="setQuickPeriod('today')"
  39264. size="small"
  39265. elevation="0"
  39266. >오늘</v-btn>
  39267. <v-btn
  39268. :class="{ 'active': selectedPeriod === 'week' }"
  39269. @click="setQuickPeriod('week')"
  39270. size="small"
  39271. elevation="0"
  39272. >7일</v-btn>
  39273. <v-btn
  39274. :class="{ 'active': selectedPeriod === 'month' }"
  39275. @click="setQuickPeriod('month')"
  39276. size="small"
  39277. elevation="0"
  39278. >1개월</v-btn>
  39279. <v-btn
  39280. :class="{ 'active': selectedPeriod === 'quarter' }"
  39281. @click="setQuickPeriod('quarter')"
  39282. size="small"
  39283. elevation="0"
  39284. >3개월</v-btn>
  39285. </div>
  39286. </div>
  39287. </div>
  39288. <!-- KPI 카드 섹션 -->
  39289. <div class="dashboard--kpi">
  39290. <div class="kpi--cards">
  39291. <div class="kpi--card">
  39292. <div class="kpi--header">
  39293. <h3>총 매출</h3>
  39294. <i class="icon sales"></i>
  39295. </div>
  39296. <div class="kpi--value">{{ formatCurrency(metrics.totalSales) }}</div>
  39297. <div class="kpi--change" :class="{ 'positive': metrics.salesChange >= 0, 'negative': metrics.salesChange < 0 }">
  39298. {{ metrics.salesChange >= 0 ? '+' : '' }}{{ metrics.salesChange }}% 전월 대비
  39299. </div>
  39300. </div>
  39301. <div class="kpi--card">
  39302. <div class="kpi--header">
  39303. <h3>총 주문</h3>
  39304. <i class="icon orders"></i>
  39305. </div>
  39306. <div class="kpi--value">{{ metrics.totalOrders }}개</div>
  39307. <div class="kpi--change" :class="{ 'positive': metrics.ordersChange >= 0, 'negative': metrics.ordersChange < 0 }">
  39308. {{ metrics.ordersChange >= 0 ? '+' : '' }}{{ metrics.ordersChange }}% 전월 대비
  39309. </div>
  39310. </div>
  39311. <div class="kpi--card">
  39312. <div class="kpi--header">
  39313. <h3>정산 완료율</h3>
  39314. <i class="icon settlement"></i>
  39315. </div>
  39316. <div class="kpi--value">{{ metrics.settlementRate }}%</div>
  39317. <div class="kpi--change" :class="{ 'positive': metrics.settlementChange >= 0, 'negative': metrics.settlementChange < 0 }">
  39318. {{ metrics.settlementChange >= 0 ? '+' : '' }}{{ metrics.settlementChange }}%p 전월 대비
  39319. </div>
  39320. </div>
  39321. <div class="kpi--card">
  39322. <div class="kpi--header">
  39323. <h3>평균 주문액</h3>
  39324. <i class="icon avg"></i>
  39325. </div>
  39326. <div class="kpi--value">{{ formatCurrency(metrics.avgOrderValue) }}</div>
  39327. <div class="kpi--change" :class="{ 'positive': metrics.avgOrderChange >= 0, 'negative': metrics.avgOrderChange < 0 }">
  39328. {{ metrics.avgOrderChange >= 0 ? '+' : '' }}{{ metrics.avgOrderChange }}% 전월 대비
  39329. </div>
  39330. </div>
  39331. </div>
  39332. </div>
  39333. <!-- 차트 섹션 -->
  39334. <div class="dashboard--charts">
  39335. <div class="chart--row">
  39336. <div class="chart--container">
  39337. <div class="chart--header">
  39338. <h3>매출 추이</h3>
  39339. <div class="chart--controls">
  39340. <v-btn-toggle v-model="salesChartType" density="compact">
  39341. <v-btn value="line" size="small">라인</v-btn>
  39342. <v-btn value="bar" size="small">막대</v-btn>
  39343. </v-btn-toggle>
  39344. </div>
  39345. </div>
  39346. <div class="chart--content">
  39347. <canvas ref="salesChart" :key="salesChartKey"></canvas>
  39348. </div>
  39349. </div>
  39350. <div class="chart--container">
  39351. <div class="chart--header">
  39352. <h3>주문 현황</h3>
  39353. </div>
  39354. <div class="chart--content">
  39355. <canvas ref="ordersChart" :key="ordersChartKey"></canvas>
  39356. </div>
  39357. </div>
  39358. </div>
  39359. <div class="chart--row">
  39360. <div class="chart--container">
  39361. <div class="chart--header">
  39362. <h3>정산 현황</h3>
  39363. </div>
  39364. <div class="chart--content">
  39365. <canvas ref="settlementChart" :key="settlementChartKey"></canvas>
  39366. </div>
  39367. </div>
  39368. <div class="chart--container">
  39369. <div class="chart--header">
  39370. <h3>카테고리별 매출</h3>
  39371. </div>
  39372. <div class="chart--content">
  39373. <canvas ref="categoryChart" :key="categoryChartKey"></canvas>
  39374. </div>
  39375. </div>
  39376. </div>
  39377. </div>
  39378. <!-- 상세 데이터 테이블 -->
  39379. <div class="dashboard--table">
  39380. <div class="table--header">
  39381. <h3>최근 주문 내역</h3>
  39382. <v-btn
  39383. color="primary"
  39384. size="small"
  39385. @click="exportData"
  39386. >
  39387. <i class="mdi mdi-download"></i>
  39388. 엑셀 다운로드
  39389. </v-btn>
  39390. </div>
  39391. <div class="table--content">
  39392. <v-data-table
  39393. :headers="tableHeaders"
  39394. :items="recentOrders"
  39395. :loading="loading"
  39396. class="elevation-1"
  39397. items-per-page="10"
  39398. >
  39399. <template v-slot:item.amount="{ item }">
  39400. {{ formatCurrency(item.amount) }}
  39401. </template>
  39402. <template v-slot:item.status="{ item }">
  39403. <v-chip
  39404. :color="getStatusColor(item.status)"
  39405. size="small"
  39406. >
  39407. {{ getStatusText(item.status) }}
  39408. </v-chip>
  39409. </template>
  39410. <template v-slot:item.actions="{ item }">
  39411. <v-btn
  39412. icon="mdi-eye"
  39413. size="small"
  39414. @click="viewOrder(item)"
  39415. ></v-btn>
  39416. </template>
  39417. </v-data-table>
  39418. </div>
  39419. </div>
  39420. </div>
  39421. </template>
  39422. <script setup>
  39423. import VueDatePicker from "@vuepic/vue-datepicker";
  39424. import "@vuepic/vue-datepicker/dist/main.css";
  39425. import {
  39426. Chart as ChartJS,
  39427. CategoryScale,
  39428. LinearScale,
  39429. PointElement,
  39430. LineElement,
  39431. BarElement,
  39432. Title,
  39433. Tooltip,
  39434. Legend,
  39435. ArcElement,
  39436. } from 'chart.js';
  39437. ChartJS.register(
  39438. CategoryScale,
  39439. LinearScale,
  39440. PointElement,
  39441. LineElement,
  39442. BarElement,
  39443. Title,
  39444. Tooltip,
  39445. Legend,
  39446. ArcElement
  39447. );
  39448. /************************************************************************
  39449. | 레이아웃
  39450. ************************************************************************/
  39451. definePageMeta({
  39452. layout: "default",
  39453. });
  39454. /************************************************************************
  39455. | 스토어
  39456. ************************************************************************/
  39457. const useDtStore = useDetailStore();
  39458. /************************************************************************
  39459. | 전역 변수
  39460. ************************************************************************/
  39461. const { $toast, $log, $dayjs } = useNuxtApp();
  39462. const router = useRouter();
  39463. const pageId = ref("대시보드");
  39464. const dateFormat = "yyyy-MM-dd";
  39465. const loading = ref(false);
  39466. // 필터링 관련
  39467. const dateRange = ref([]);
  39468. const selectedPeriod = ref('month');
  39469. // 차트 관련
  39470. const salesChart = ref(null);
  39471. const ordersChart = ref(null);
  39472. const settlementChart = ref(null);
  39473. const categoryChart = ref(null);
  39474. const salesChartType = ref('line');
  39475. const salesChartKey = ref(0);
  39476. const ordersChartKey = ref(0);
  39477. const settlementChartKey = ref(0);
  39478. const categoryChartKey = ref(0);
  39479. // 메트릭 데이터
  39480. const metrics = ref({
  39481. totalSales: 125000000,
  39482. salesChange: 12.5,
  39483. totalOrders: 1250,
  39484. ordersChange: 8.3,
  39485. settlementRate: 95.2,
  39486. settlementChange: 2.1,
  39487. avgOrderValue: 100000,
  39488. avgOrderChange: 5.7
  39489. });
  39490. // 테이블 관련
  39491. const tableHeaders = ref([
  39492. { title: '주문번호', key: 'orderNo', sortable: true },
  39493. { title: '인플루언서', key: 'influencer', sortable: true },
  39494. { title: '상품명', key: 'productName', sortable: false },
  39495. { title: '주문금액', key: 'amount', sortable: true },
  39496. { title: '주문일', key: 'orderDate', sortable: true },
  39497. { title: '상태', key: 'status', sortable: true },
  39498. { title: '액션', key: 'actions', sortable: false }
  39499. ]);
  39500. const recentOrders = ref([
  39501. {
  39502. orderNo: 'ORD-2025001',
  39503. influencer: '김인플루',
  39504. productName: '프리미엄 화장품 세트',
  39505. amount: 150000,
  39506. orderDate: '2025-01-15',
  39507. status: 'completed'
  39508. },
  39509. {
  39510. orderNo: 'ORD-2025002',
  39511. influencer: '박유튜버',
  39512. productName: '건강기능식품',
  39513. amount: 85000,
  39514. orderDate: '2025-01-14',
  39515. status: 'shipping'
  39516. },
  39517. {
  39518. orderNo: 'ORD-2025003',
  39519. influencer: '이인스타',
  39520. productName: '패션 액세서리',
  39521. amount: 65000,
  39522. orderDate: '2025-01-13',
  39523. status: 'pending'
  39524. }
  39525. ]);
  39526. /************************************************************************
  39527. | 함수(METHODS)
  39528. ************************************************************************/
  39529. // 통화 포맷팅
  39530. const formatCurrency = (amount) => {
  39531. return new Intl.NumberFormat('ko-KR', {
  39532. style: 'currency',
  39533. currency: 'KRW'
  39534. }).format(amount);
  39535. };
  39536. // 날짜 범위 변경
  39537. const onDateRangeChange = (range) => {
  39538. selectedPeriod.value = 'custom';
  39539. fetchDashboardData();
  39540. };
  39541. // 빠른 기간 선택
  39542. const setQuickPeriod = (period) => {
  39543. selectedPeriod.value = period;
  39544. const today = new Date();
  39545. switch (period) {
  39546. case 'today':
  39547. dateRange.value = [today, today];
  39548. break;
  39549. case 'week':
  39550. const weekAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
  39551. dateRange.value = [weekAgo, today];
  39552. break;
  39553. case 'month':
  39554. const monthAgo = new Date(today.getTime() - 30 * 24 * 60 * 60 * 1000);
  39555. dateRange.value = [monthAgo, today];
  39556. break;
  39557. case 'quarter':
  39558. const quarterAgo = new Date(today.getTime() - 90 * 24 * 60 * 60 * 1000);
  39559. dateRange.value = [quarterAgo, today];
  39560. break;
  39561. }
  39562. fetchDashboardData();
  39563. };
  39564. // 상태 색상
  39565. const getStatusColor = (status) => {
  39566. switch (status) {
  39567. case 'completed': return 'success';
  39568. case 'shipping': return 'info';
  39569. case 'pending': return 'warning';
  39570. case 'cancelled': return 'error';
  39571. default: return 'grey';
  39572. }
  39573. };
  39574. // 상태 텍스트
  39575. const getStatusText = (status) => {
  39576. switch (status) {
  39577. case 'completed': return '완료';
  39578. case 'shipping': return '배송중';
  39579. case 'pending': return '대기';
  39580. case 'cancelled': return '취소';
  39581. default: return '알 수 없음';
  39582. }
  39583. };
  39584. // 주문 상세 보기
  39585. const viewOrder = (order) => {
  39586. router.push({
  39587. path: `/view/order/detail/${order.orderNo}`
  39588. });
  39589. };
  39590. // 엑셀 다운로드
  39591. const exportData = () => {
  39592. // 엑셀 다운로드 로직
  39593. $toast.success('데이터 다운로드를 시작합니다.');
  39594. };
  39595. // 차트 생성
  39596. const createSalesChart = () => {
  39597. if (!salesChart.value) return;
  39598. const ctx = salesChart.value.getContext('2d');
  39599. new ChartJS(ctx, {
  39600. type: salesChartType.value,
  39601. data: {
  39602. labels: ['1월', '2월', '3월', '4월', '5월', '6월'],
  39603. datasets: [{
  39604. label: '매출',
  39605. data: [12000000, 15000000, 13000000, 18000000, 16000000, 20000000],
  39606. borderColor: '#3f51b5',
  39607. backgroundColor: salesChartType.value === 'bar' ? '#3f51b5' : 'rgba(63, 81, 181, 0.1)',
  39608. borderWidth: 2,
  39609. fill: salesChartType.value === 'line'
  39610. }]
  39611. },
  39612. options: {
  39613. responsive: true,
  39614. maintainAspectRatio: false,
  39615. plugins: {
  39616. legend: {
  39617. display: false
  39618. }
  39619. },
  39620. scales: {
  39621. y: {
  39622. beginAtZero: true,
  39623. ticks: {
  39624. callback: function(value) {
  39625. return formatCurrency(value);
  39626. }
  39627. }
  39628. }
  39629. }
  39630. }
  39631. });
  39632. };
  39633. const createOrdersChart = () => {
  39634. if (!ordersChart.value) return;
  39635. const ctx = ordersChart.value.getContext('2d');
  39636. new ChartJS(ctx, {
  39637. type: 'doughnut',
  39638. data: {
  39639. labels: ['신규 주문', '처리중', '배송중', '완료'],
  39640. datasets: [{
  39641. data: [45, 25, 20, 10],
  39642. backgroundColor: ['#4caf50', '#ff9800', '#2196f3', '#9c27b0'],
  39643. borderWidth: 0
  39644. }]
  39645. },
  39646. options: {
  39647. responsive: true,
  39648. maintainAspectRatio: false,
  39649. plugins: {
  39650. legend: {
  39651. position: 'bottom'
  39652. }
  39653. }
  39654. }
  39655. });
  39656. };
  39657. const createSettlementChart = () => {
  39658. if (!settlementChart.value) return;
  39659. const ctx = settlementChart.value.getContext('2d');
  39660. new ChartJS(ctx, {
  39661. type: 'bar',
  39662. data: {
  39663. labels: ['1주', '2주', '3주', '4주'],
  39664. datasets: [{
  39665. label: '정산 완료',
  39666. data: [95, 92, 98, 94],
  39667. backgroundColor: '#4caf50'
  39668. }, {
  39669. label: '정산 대기',
  39670. data: [5, 8, 2, 6],
  39671. backgroundColor: '#ff9800'
  39672. }]
  39673. },
  39674. options: {
  39675. responsive: true,
  39676. maintainAspectRatio: false,
  39677. scales: {
  39678. x: {
  39679. stacked: true
  39680. },
  39681. y: {
  39682. stacked: true,
  39683. beginAtZero: true,
  39684. max: 100,
  39685. ticks: {
  39686. callback: function(value) {
  39687. return value + '%';
  39688. }
  39689. }
  39690. }
  39691. }
  39692. }
  39693. });
  39694. };
  39695. const createCategoryChart = () => {
  39696. if (!categoryChart.value) return;
  39697. const ctx = categoryChart.value.getContext('2d');
  39698. new ChartJS(ctx, {
  39699. type: 'pie',
  39700. data: {
  39701. labels: ['화장품', '패션', '건강식품', '전자제품', '기타'],
  39702. datasets: [{
  39703. data: [35, 25, 20, 15, 5],
  39704. backgroundColor: ['#e91e63', '#9c27b0', '#3f51b5', '#009688', '#ff5722']
  39705. }]
  39706. },
  39707. options: {
  39708. responsive: true,
  39709. maintainAspectRatio: false,
  39710. plugins: {
  39711. legend: {
  39712. position: 'right'
  39713. }
  39714. }
  39715. }
  39716. });
  39717. };
  39718. // 대시보드 데이터 가져오기
  39719. const fetchDashboardData = async () => {
  39720. loading.value = true;
  39721. try {
  39722. const _req = {
  39723. compId: useAuthStore().getCompanyId,
  39724. startDate: dateRange.value[0],
  39725. endDate: dateRange.value[1]
  39726. };
  39727. await useAxios()
  39728. .post("/dashboard/metrics", _req)
  39729. .then((res) => {
  39730. if (res.data) {
  39731. metrics.value = res.data;
  39732. }
  39733. });
  39734. } catch (error) {
  39735. $toast.error('대시보드 데이터를 불러오는데 실패했습니다.');
  39736. } finally {
  39737. loading.value = false;
  39738. }
  39739. };
  39740. // 차트 타입 변경 감지
  39741. watch(salesChartType, () => {
  39742. salesChartKey.value++;
  39743. nextTick(() => {
  39744. createSalesChart();
  39745. });
  39746. });
  39747. /************************************************************************
  39748. | 라이프사이클
  39749. ************************************************************************/
  39750. onMounted(() => {
  39751. // 기본 1개월 기간 설정
  39752. setQuickPeriod('month');
  39753. nextTick(() => {
  39754. createSalesChart();
  39755. createOrdersChart();
  39756. createSettlementChart();
  39757. createCategoryChart();
  39758. });
  39759. });
  39760. </script>
  39761. <style scoped>
  39762. /* 대시보드 필터 스타일 */
  39763. .dashboard--filters {
  39764. margin: 20px 0;
  39765. padding: 20px;
  39766. background: #f8f9fa;
  39767. border-radius: 8px;
  39768. }
  39769. .filter--wrap {
  39770. display: flex;
  39771. align-items: center;
  39772. gap: 20px;
  39773. flex-wrap: wrap;
  39774. }
  39775. .date--range {
  39776. min-width: 300px;
  39777. }
  39778. .quick--filters {
  39779. display: flex;
  39780. gap: 8px;
  39781. }
  39782. .quick--filters .v-btn {
  39783. background: white;
  39784. color: #666;
  39785. border: 1px solid #ddd;
  39786. }
  39787. .quick--filters .v-btn.active {
  39788. background: #3f51b5;
  39789. color: white;
  39790. border-color: #3f51b5;
  39791. }
  39792. /* KPI 카드 스타일 */
  39793. .dashboard--kpi {
  39794. margin: 20px 0;
  39795. }
  39796. .kpi--cards {
  39797. display: grid;
  39798. grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  39799. gap: 20px;
  39800. }
  39801. .kpi--card {
  39802. background: white;
  39803. padding: 24px;
  39804. border-radius: 12px;
  39805. box-shadow: 0 2px 8px rgba(0,0,0,0.1);
  39806. border: 1px solid #e0e0e0;
  39807. }
  39808. .kpi--header {
  39809. display: flex;
  39810. justify-content: space-between;
  39811. align-items: center;
  39812. margin-bottom: 16px;
  39813. }
  39814. .kpi--header h3 {
  39815. font-size: 14px;
  39816. font-weight: 600;
  39817. color: #666;
  39818. margin: 0;
  39819. }
  39820. .kpi--header .icon {
  39821. width: 32px;
  39822. height: 32px;
  39823. border-radius: 8px;
  39824. display: flex;
  39825. align-items: center;
  39826. justify-content: center;
  39827. }
  39828. .icon.sales {
  39829. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  39830. }
  39831. .icon.orders {
  39832. background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
  39833. }
  39834. .icon.settlement {
  39835. background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
  39836. }
  39837. .icon.avg {
  39838. background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
  39839. }
  39840. .kpi--value {
  39841. font-size: 28px;
  39842. font-weight: 700;
  39843. color: #333;
  39844. margin-bottom: 8px;
  39845. }
  39846. .kpi--change {
  39847. font-size: 12px;
  39848. font-weight: 500;
  39849. }
  39850. .kpi--change.positive {
  39851. color: #4caf50;
  39852. }
  39853. .kpi--change.negative {
  39854. color: #f44336;
  39855. }
  39856. /* 차트 스타일 */
  39857. .dashboard--charts {
  39858. margin: 30px 0;
  39859. }
  39860. .chart--row {
  39861. display: grid;
  39862. grid-template-columns: repeat(auto-fit, minmax(500px, 1fr));
  39863. gap: 20px;
  39864. margin-bottom: 20px;
  39865. }
  39866. .chart--container {
  39867. background: white;
  39868. border-radius: 12px;
  39869. padding: 24px;
  39870. box-shadow: 0 2px 8px rgba(0,0,0,0.1);
  39871. border: 1px solid #e0e0e0;
  39872. }
  39873. .chart--header {
  39874. display: flex;
  39875. justify-content: space-between;
  39876. align-items: center;
  39877. margin-bottom: 20px;
  39878. }
  39879. .chart--header h3 {
  39880. font-size: 18px;
  39881. font-weight: 600;
  39882. color: #333;
  39883. margin: 0;
  39884. }
  39885. .chart--content {
  39886. height: 300px;
  39887. position: relative;
  39888. }
  39889. .chart--content canvas {
  39890. max-height: 100%;
  39891. }
  39892. /* 테이블 스타일 */
  39893. .dashboard--table {
  39894. background: white;
  39895. border-radius: 12px;
  39896. padding: 24px;
  39897. box-shadow: 0 2px 8px rgba(0,0,0,0.1);
  39898. border: 1px solid #e0e0e0;
  39899. margin: 20px 0;
  39900. }
  39901. .table--header {
  39902. display: flex;
  39903. justify-content: space-between;
  39904. align-items: center;
  39905. margin-bottom: 20px;
  39906. }
  39907. .table--header h3 {
  39908. font-size: 18px;
  39909. font-weight: 600;
  39910. color: #333;
  39911. margin: 0;
  39912. }
  39913. /* 반응형 */
  39914. @media (max-width: 768px) {
  39915. .filter--wrap {
  39916. flex-direction: column;
  39917. align-items: stretch;
  39918. }
  39919. .date--range {
  39920. min-width: auto;
  39921. }
  39922. .quick--filters {
  39923. justify-content: center;
  39924. }
  39925. .kpi--cards {
  39926. grid-template-columns: 1fr;
  39927. }
  39928. .chart--row {
  39929. grid-template-columns: 1fr;
  39930. }
  39931. }
  39932. </style>
  39933. </file>
  39934. <file path="pages/view/chat.vue">
  39935. <template>
  39936. <div class="chat-page">
  39937. <ClaudeChat />
  39938. </div>
  39939. </template>
  39940. <script setup>
  39941. import ClaudeChat from '~/components/chat/ClaudeChat.vue'
  39942. definePageMeta({
  39943. layout: 'default'
  39944. })
  39945. </script>
  39946. <style scoped>
  39947. .chat-page {
  39948. height: calc(100vh - 80px);
  39949. padding: 0;
  39950. }
  39951. </style>
  39952. </file>
  39953. <file path="plugins/fontawesome.js">
  39954. import { library, config } from '@fortawesome/fontawesome-svg-core';
  39955. import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
  39956. // Import specific icons
  39957. import { faSpinner } from '@fortawesome/free-solid-svg-icons';
  39958. import { faTwitter } from '@fortawesome/free-brands-svg-icons';
  39959. // Disable automatic CSS injection (Nuxt handles CSS separately)
  39960. config.autoAddCss = false;
  39961. // Add icons to the library
  39962. library.add(faSpinner, faTwitter);
  39963. export default defineNuxtPlugin((nuxtApp) => {
  39964. nuxtApp.vueApp.component('FontAwesomeIcon', FontAwesomeIcon);
  39965. });
  39966. </file>
  39967. <file path="plugins/i18n.js">
  39968. import { createI18n } from 'vue-i18n'
  39969. import en from '../lang/en'
  39970. import kr from '../lang/kr'
  39971. export default defineNuxtPlugin(({ vueApp }) => {
  39972. const i18n = createI18n({
  39973. legacy: false,
  39974. globalInjection: true,
  39975. locale: useLangStore().getLang,
  39976. messages: {
  39977. kr: kr,
  39978. en: en
  39979. }
  39980. })
  39981. vueApp.use(i18n)
  39982. })
  39983. </file>
  39984. <file path="plugins/log.js">
  39985. import log from 'loglevel'
  39986. import prefix from 'loglevel-plugin-prefix'
  39987. const logger = () => {
  39988. // trace/debug/info/warn/error 단계로 진행되며 silent일 경우 모든 로그가 표현되지 않는다.
  39989. log.setLevel(import.meta.env.VITE_APP_DEBUG_LEVEL)
  39990. prefix.reg(log)
  39991. prefix.apply(log, {
  39992. timestampFormatter(date) {
  39993. // 시:분:처:밀리세컨드
  39994. return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, '$1') + ':' + date.getMilliseconds()
  39995. },
  39996. format(level, name, timestamp) {
  39997. return `${(`[${timestamp}]`)}[${(level)}]`
  39998. },
  39999. })
  40000. }
  40001. export default defineNuxtPlugin(() => {
  40002. logger()
  40003. return {
  40004. provide: {
  40005. log
  40006. }
  40007. }
  40008. })
  40009. </file>
  40010. <file path="plugins/mitt.js">
  40011. import mitt from 'mitt'
  40012. export default defineNuxtPlugin(() => {
  40013. const eventBus = mitt()
  40014. return {
  40015. provide: {
  40016. eventBus
  40017. }
  40018. }
  40019. })
  40020. </file>
  40021. <file path="plugins/toast.js">
  40022. import Vue3Toastify, { toast } from 'vue3-toastify' // toast
  40023. import 'vue3-toastify/dist/index.css' // toast css
  40024. const customOption = {
  40025. closeButton: true, // 토스트 종료 버튼 표현 X
  40026. hideProgressBar: true, // 하단 프로그래스바 숨기기
  40027. dangerouslyHTMLString: true, // html string 사용 가능
  40028. position: toast.POSITION.BOTTOM_CENTER, // 하단 우측에서 표현
  40029. autoClose: 3000, // 토스트 3초동안 유지
  40030. clearOnUrlChange: false,
  40031. pauseOnFocusLoss : false, // 화면 focus 잃었을 때 토스트 유지x
  40032. pauseOnHover : false // 토스트 마우스 hover시 토스트 유지x
  40033. }
  40034. export default defineNuxtPlugin((nuxtApp) => {
  40035. nuxtApp.vueApp.use(Vue3Toastify, customOption);
  40036. return {
  40037. provide: {
  40038. toast
  40039. }
  40040. }
  40041. })
  40042. </file>
  40043. <file path="plugins/userAgent.js">
  40044. export default defineNuxtPlugin((nuxtApp) => {
  40045. let userAgent = '';
  40046. if (process.server) {
  40047. const headers = useRequestHeaders();
  40048. userAgent = headers['user-agent'] || '';
  40049. } else {
  40050. userAgent = navigator.userAgent || '';
  40051. }
  40052. nuxtApp.provide('userAgent', userAgent);
  40053. });
  40054. </file>
  40055. <file path="plugins/vue-cool-lightbox.js">
  40056. import * as CoolLightBox from 'vue-cool-lightbox-next';
  40057. import 'vue-cool-lightbox-next/dist/style.css';
  40058. export default defineNuxtPlugin(nuxtApp => {
  40059. nuxtApp.vueApp.component('CoolLightBox', CoolLightBox);
  40060. });
  40061. </file>
  40062. <file path="plugins/vue3-editor.js">
  40063. import { defineNuxtPlugin } from '#app';
  40064. import { VueEditor } from 'vue3-editor'; // vue3-editor 임포트
  40065. export default defineNuxtPlugin((nuxtApp) => {
  40066. // 컴포넌트를 전역으로 등록
  40067. nuxtApp.vueApp.component('VueEditor', VueEditor);
  40068. });
  40069. </file>
  40070. <file path="plugins/vuetify.js">
  40071. import { createVuetify } from 'vuetify'
  40072. import * as components from 'vuetify/components'
  40073. import * as directives from 'vuetify/directives'
  40074. import { aliases, mdi } from 'vuetify/iconsets/mdi'
  40075. export default defineNuxtPlugin(nuxtApp => {
  40076. const vuetify = createVuetify({
  40077. ssr: true,
  40078. components,
  40079. directives,
  40080. icons: { // 아이콘 설정
  40081. defaultSet: 'mdi',
  40082. aliases,
  40083. sets: {
  40084. mdi
  40085. }
  40086. }
  40087. })
  40088. nuxtApp.vueApp.use(vuetify)
  40089. })
  40090. </file>
  40091. <file path="public/js/jquery-3.7.1.min.js">
  40092. /*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */
  40093. !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}function fe(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){return ae.call(this)},get:function(e){return null==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=ce.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return ce.each(this,e)},map:function(n){return this.pushStack(ce.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ae.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(ce.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||v(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},ce.extend({expando:"jQuery"+(t+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==i.call(e))&&(!(t=r(e))||"function"==typeof(n=ue.call(t,"constructor")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){m(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(c(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(c(Object(e))?ce.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||"HTML")},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(c(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:le}),"function"==typeof Symbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var pe=oe.pop,de=oe.sort,he=oe.splice,ge="[\\x20\\t\\r\\n\\f]",ve=new RegExp("^"+ge+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ge+"+$","g");ce.contains=function(e,t){var n=t&&t.parentNode;return e===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};var f=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function p(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}ce.escapeSelector=function(e){return(e+"").replace(f,p)};var ye=C,me=s;!function(){var e,b,w,o,a,T,r,C,d,i,k=me,S=ce.expando,E=0,n=0,s=W(),c=W(),u=W(),h=W(),l=function(e,t){return e===t&&(a=!0),0},f="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",t="(?:\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",p="\\["+ge+"*("+t+")(?:"+ge+"*([*^$|!~]?=)"+ge+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+t+"))|)"+ge+"*\\]",g=":("+t+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+p+")*)|.*)\\)|)",v=new RegExp(ge+"+","g"),y=new RegExp("^"+ge+"*,"+ge+"*"),m=new RegExp("^"+ge+"*([>+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="<a id='"+S+"' href='' disabled='disabled'></a><select id='"+S+"-\r\\' disabled='disabled'><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0<I(t,T,null,[e]).length},I.contains=function(e,t){return(e.ownerDocument||e)!=T&&V(e),ce.contains(e,t)},I.attr=function(e,t){(e.ownerDocument||e)!=T&&V(e);var n=b.attrHandle[t.toLowerCase()],r=n&&ue.call(b.attrHandle,t.toLowerCase())?n(e,t,!C):void 0;return void 0!==r?r:e.getAttribute(t)},I.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ce.uniqueSort=function(e){var t,n=[],r=0,i=0;if(a=!le.sortStable,o=!le.sortStable&&ae.call(e,0),de.call(e,l),a){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)he.call(e,n[r],1)}return o=null,e},ce.fn.uniqueSort=function(){return this.pushStack(ce.uniqueSort(ae.apply(this)))},(b=ce.expr={cacheLength:50,createPseudo:F,match:D,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(v," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(d,e,t,h,g){var v="nth"!==d.slice(0,3),y="last"!==d.slice(-4),m="of-type"===e;return 1===h&&0===g?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u=v!==y?"nextSibling":"previousSibling",l=e.parentNode,c=m&&e.nodeName.toLowerCase(),f=!n&&!m,p=!1;if(l){if(v){while(u){o=e;while(o=o[u])if(m?fe(o,c):1===o.nodeType)return!1;s=u="only"===d&&!s&&"nextSibling"}return!0}if(s=[y?l.firstChild:l.lastChild],y&&f){p=(a=(r=(i=l[S]||(l[S]={}))[d]||[])[0]===E&&r[1])&&r[2],o=a&&l.childNodes[a];while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if(1===o.nodeType&&++p&&o===e){i[d]=[E,a,p];break}}else if(f&&(p=a=(r=(i=e[S]||(e[S]={}))[d]||[])[0]===E&&r[1]),!1===p)while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if((m?fe(o,c):1===o.nodeType)&&++p&&(f&&((i=o[S]||(o[S]={}))[d]=[E,p]),o===e))break;return(p-=g)===h||p%h==0&&0<=p/h}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||I.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?F(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=se.call(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:F(function(e){var r=[],i=[],s=ne(e.replace(ve,"$1"));return s[S]?F(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:F(function(t){return function(e){return 0<I(t,e).length}}),contains:F(function(t){return t=t.replace(O,P),function(e){return-1<(e.textContent||ce.text(e)).indexOf(t)}}),lang:F(function(n){return A.test(n||"")||I.error("unsupported lang: "+n),n=n.replace(O,P).toLowerCase(),function(e){var t;do{if(t=C?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=ie.location&&ie.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===r},focus:function(e){return e===function(){try{return T.activeElement}catch(e){}}()&&T.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:z(!1),disabled:z(!0),checked:function(e){return fe(e,"input")&&!!e.checked||fe(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return q.test(e.nodeName)},input:function(e){return N.test(e.nodeName)},button:function(e){return fe(e,"input")&&"button"===e.type||fe(e,"button")},text:function(e){var t;return fe(e,"input")&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:X(function(){return[0]}),last:X(function(e,t){return[t-1]}),eq:X(function(e,t,n){return[n<0?n+t:n]}),even:X(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:X(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:X(function(e,t,n){var r;for(r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:X(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=B(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=_(e);function G(){}function Y(e,t){var n,r,i,o,a,s,u,l=c[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=y.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=m.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(ve," ")}),a=a.slice(n.length)),b.filter)!(r=D[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?I.error(e):c(e,s).slice(0)}function Q(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function J(a,e,t){var s=e.dir,u=e.next,l=u||s,c=t&&"parentNode"===l,f=n++;return e.first?function(e,t,n){while(e=e[s])if(1===e.nodeType||c)return a(e,t,n);return!1}:function(e,t,n){var r,i,o=[E,f];if(n){while(e=e[s])if((1===e.nodeType||c)&&a(e,t,n))return!0}else while(e=e[s])if(1===e.nodeType||c)if(i=e[S]||(e[S]={}),u&&fe(e,u))e=e[s]||e;else{if((r=i[l])&&r[0]===E&&r[1]===f)return o[2]=r[2];if((i[l]=o)[2]=a(e,t,n))return!0}return!1}}function K(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Z(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function ee(d,h,g,v,y,e){return v&&!v[S]&&(v=ee(v)),y&&!y[S]&&(y=ee(y,e)),F(function(e,t,n,r){var i,o,a,s,u=[],l=[],c=t.length,f=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)I(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),p=!d||!e&&h?f:Z(f,u,d,n,r);if(g?g(p,s=y||(e?d:c||v)?[]:t,n,r):s=p,v){i=Z(s,l),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(s[l[o]]=!(p[l[o]]=a))}if(e){if(y||d){if(y){i=[],o=s.length;while(o--)(a=s[o])&&i.push(p[o]=a);y(null,s=[],i,r)}o=s.length;while(o--)(a=s[o])&&-1<(i=y?se.call(e,a):u[o])&&(e[i]=!(t[i]=a))}}else s=Z(s===t?s.splice(c,s.length):s),y?y(null,t,s,r):k.apply(t,s)})}function te(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=J(function(e){return e===i},a,!0),l=J(function(e){return-1<se.call(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!=w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[J(K(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return ee(1<s&&K(c),1<s&&Q(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(ve,"$1"),t,s<n&&te(e.slice(s,n)),n<r&&te(e=e.slice(n)),n<r&&Q(e))}c.push(t)}return K(c)}function ne(e,t){var n,v,y,m,x,r,i=[],o=[],a=u[e+" "];if(!a){t||(t=Y(e)),n=t.length;while(n--)(a=te(t[n]))[S]?i.push(a):o.push(a);(a=u(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=E+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==T||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==T||(V(o),n=!C);while(s=v[a++])if(s(o,t||T,n)){k.call(r,o);break}i&&(E=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=pe.call(r));f=Z(f)}k.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&ce.uniqueSort(r)}return i&&(E=h,w=p),c},m?F(r):r))).selector=e}return a}function re(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&Y(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&C&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(O,P),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=D.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(O,P),H.test(o[0].type)&&U(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&Q(o)))return k.apply(n,r),n;break}}}return(l||ne(e,c))(r,t,!C,n,!t||H.test(e)&&U(t.parentNode)||t),n}G.prototype=b.filters=b.pseudos,b.setFilters=new G,le.sortStable=S.split("").sort(l).join("")===S,V(),le.sortDetached=$(function(e){return 1&e.compareDocumentPosition(T.createElement("fieldset"))}),ce.find=I,ce.expr[":"]=ce.expr.pseudos,ce.unique=ce.uniqueSort,I.compile=ne,I.select=re,I.setDocument=V,I.tokenize=Y,I.escape=ce.escapeSelector,I.getText=ce.text,I.isXML=ce.isXMLDoc,I.selectors=ce.expr,I.support=ce.support,I.uniqueSort=ce.uniqueSort}();var d=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},h=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},b=ce.expr.match.needsContext,w=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1<se.call(n,e)!==r}):ce.filter(n,e,r)}ce.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t<r;t++)if(ce.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)ce.find(e,i[t],n);return 1<r?ce.uniqueSort(n):n},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,"string"==typeof e&&b.test(e)?ce(e):e||[],!1).length}});var k,S=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(ce.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&ce(e);if(!b.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?ce.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?se.call(ce(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return d(e,"parentNode")},parentsUntil:function(e,t,n){return d(e,"parentNode",n)},next:function(e){return A(e,"nextSibling")},prev:function(e){return A(e,"previousSibling")},nextAll:function(e){return d(e,"nextSibling")},prevAll:function(e){return d(e,"previousSibling")},nextUntil:function(e,t,n){return d(e,"nextSibling",n)},prevUntil:function(e,t,n){return d(e,"previousSibling",n)},siblings:function(e){return h((e.parentNode||{}).firstChild,e)},children:function(e){return h(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(fe(e,"template")&&(e=e.content||e),ce.merge([],e.childNodes))}},function(r,i){ce.fn[r]=function(e,t){var n=ce.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=ce.filter(t,n)),1<this.length&&(j[r]||ce.uniqueSort(n),E.test(r)&&n.reverse()),this.pushStack(n)}});var D=/[^\x20\t\r\n\f]+/g;function N(e){return e}function q(e){throw e}function L(e,t,n,r){var i;try{e&&v(i=e.promise)?i.call(e).done(t).fail(n):e&&v(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}ce.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},ce.each(e.match(D)||[],function(e,t){n[t]=!0}),n):ce.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){ce.each(e,function(e,t){v(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==x(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return ce.each(arguments,function(e,t){var n;while(-1<(n=ce.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<ce.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},ce.extend({Deferred:function(e){var o=[["notify","progress",ce.Callbacks("memory"),ce.Callbacks("memory"),2],["resolve","done",ce.Callbacks("once memory"),ce.Callbacks("once memory"),0,"resolved"],["reject","fail",ce.Callbacks("once memory"),ce.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return ce.Deferred(function(r){ce.each(o,function(e,t){var n=v(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&v(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,v(t)?s?t.call(e,l(u,o,N,s),l(u,o,q,s)):(u++,t.call(e,l(u,o,N,s),l(u,o,q,s),l(u,o,N,o.notifyWith))):(a!==N&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){ce.Deferred.exceptionHook&&ce.Deferred.exceptionHook(e,t.error),u<=i+1&&(a!==q&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(ce.Deferred.getErrorHook?t.error=ce.Deferred.getErrorHook():ce.Deferred.getStackHook&&(t.error=ce.Deferred.getStackHook()),ie.setTimeout(t))}}return ce.Deferred(function(e){o[0][3].add(l(0,e,v(r)?r:N,e.notifyWith)),o[1][3].add(l(0,e,v(t)?t:N)),o[2][3].add(l(0,e,v(n)?n:q))}).promise()},promise:function(e){return null!=e?ce.extend(e,a):a}},s={};return ce.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=ae.call(arguments),o=ce.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?ae.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(L(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||v(i[t]&&i[t].then)))return o.then();while(t--)L(i[t],a(t),o.reject);return o.promise()}});var H=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;ce.Deferred.exceptionHook=function(e,t){ie.console&&ie.console.warn&&e&&H.test(e.name)&&ie.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},ce.readyException=function(e){ie.setTimeout(function(){throw e})};var O=ce.Deferred();function P(){C.removeEventListener("DOMContentLoaded",P),ie.removeEventListener("load",P),ce.ready()}ce.fn.ready=function(e){return O.then(e)["catch"](function(e){ce.readyException(e)}),this},ce.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--ce.readyWait:ce.isReady)||(ce.isReady=!0)!==e&&0<--ce.readyWait||O.resolveWith(C,[ce])}}),ce.ready.then=O.then,"complete"===C.readyState||"loading"!==C.readyState&&!C.documentElement.doScroll?ie.setTimeout(ce.ready):(C.addEventListener("DOMContentLoaded",P),ie.addEventListener("load",P));var M=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n))for(s in i=!0,n)M(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,v(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(ce(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},R=/^-ms-/,I=/-([a-z])/g;function W(e,t){return t.toUpperCase()}function F(e){return e.replace(R,"ms-").replace(I,W)}var $=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function B(){this.expando=ce.expando+B.uid++}B.uid=1,B.prototype={cache:function(e){var t=e[this.expando];return t||(t={},$(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[F(t)]=n;else for(r in t)i[F(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][F(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(F):(t=F(t))in r?[t]:t.match(D)||[]).length;while(n--)delete r[t[n]]}(void 0===t||ce.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!ce.isEmptyObject(t)}};var _=new B,z=new B,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,U=/[A-Z]/g;function V(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(U,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:X.test(i)?JSON.parse(i):i)}catch(e){}z.set(e,t,n)}else n=void 0;return n}ce.extend({hasData:function(e){return z.hasData(e)||_.hasData(e)},data:function(e,t,n){return z.access(e,t,n)},removeData:function(e,t){z.remove(e,t)},_data:function(e,t,n){return _.access(e,t,n)},_removeData:function(e,t){_.remove(e,t)}}),ce.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=z.get(o),1===o.nodeType&&!_.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=F(r.slice(5)),V(o,r,i[r]));_.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){z.set(this,n)}):M(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=z.get(o,n))?t:void 0!==(t=V(o,n))?t:void 0;this.each(function(){z.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){z.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=_.get(e,t),n&&(!r||Array.isArray(n)?r=_.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){ce.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return _.get(e,n)||_.access(e,n,{empty:ce.Callbacks("once memory").add(function(){_.remove(e,[t+"queue",n])})})}}),ce.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?ce.queue(this[0],t):void 0===n?this:this.each(function(){var e=ce.queue(this,t,n);ce._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&ce.dequeue(this,t)})},dequeue:function(e){return this.each(function(){ce.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=ce.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=_.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var G=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Y=new RegExp("^(?:([+-])=|)("+G+")([a-z%]*)$","i"),Q=["Top","Right","Bottom","Left"],J=C.documentElement,K=function(e){return ce.contains(e.ownerDocument,e)},Z={composed:!0};J.getRootNode&&(K=function(e){return ce.contains(e.ownerDocument,e)||e.getRootNode(Z)===e.ownerDocument});var ee=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&K(e)&&"none"===ce.css(e,"display")};function te(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return ce.css(e,t,"")},u=s(),l=n&&n[3]||(ce.cssNumber[t]?"":"px"),c=e.nodeType&&(ce.cssNumber[t]||"px"!==l&&+u)&&Y.exec(ce.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)ce.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,ce.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ne={};function re(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=_.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ee(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ne[s])||(o=a.body.appendChild(a.createElement(s)),u=ce.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ne[s]=u)))):"none"!==n&&(l[c]="none",_.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}ce.fn.extend({show:function(){return re(this,!0)},hide:function(){return re(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ee(this)?ce(this).show():ce(this).hide()})}});var xe,be,we=/^(?:checkbox|radio)$/i,Te=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="<textarea>x</textarea>",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="<option></option>",le.option=!!xe.lastChild;var ke={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n<r;n++)_.set(e[n],"globalEval",!t||_.get(t[n],"globalEval"))}ke.tbody=ke.tfoot=ke.colgroup=ke.caption=ke.thead,ke.th=ke.td,le.option||(ke.optgroup=ke.option=[1,"<select multiple='multiple'>","</select>"]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))ce.merge(p,o.nodeType?[o]:o);else if(je.test(o)){a=a||f.appendChild(t.createElement("div")),s=(Te.exec(o)||["",""])[1].toLowerCase(),u=ke[s]||ke._default,a.innerHTML=u[1]+ce.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;ce.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<ce.inArray(o,r))i&&i.push(o);else if(l=K(o),a=Se(f.appendChild(o),"script"),l&&Ee(a),n){c=0;while(o=a[c++])Ce.test(o.type||"")&&n.push(o)}return f}var De=/^([^.]*)(?:\.(.+)|)/;function Ne(){return!0}function qe(){return!1}function Le(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Le(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=qe;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return ce().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,i,r,n)})}function He(e,r,t){t?(_.set(e,r,!1),ce.event.add(e,r,{namespace:!1,handler:function(e){var t,n=_.get(this,r);if(1&e.isTrigger&&this[r]){if(n)(ce.event.special[r]||{}).delegateType&&e.stopPropagation();else if(n=ae.call(arguments),_.set(this,r,n),this[r](),t=_.get(this,r),_.set(this,r,!1),n!==t)return e.stopImmediatePropagation(),e.preventDefault(),t}else n&&(_.set(this,r,ce.event.trigger(n[0],n.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Ne)}})):void 0===_.get(e,r)&&ce.event.add(e,r,Ne)}ce.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.get(t);if($(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&ce.find.matchesSelector(J,i),n.guid||(n.guid=ce.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof ce&&ce.event.triggered!==e.type?ce.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(D)||[""]).length;while(l--)d=g=(s=De.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=ce.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=ce.event.special[d]||{},c=ce.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),ce.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.hasData(e)&&_.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(D)||[""]).length;while(l--)if(d=g=(s=De.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=ce.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||ce.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)ce.event.remove(e,d+t[l],n,r,!0);ce.isEmptyObject(u)&&_.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=ce.event.fix(e),l=(_.get(this,"events")||Object.create(null))[u.type]||[],c=ce.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=ce.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((ce.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<ce(i,this).index(l):ce.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(ce.Event.prototype,t,{enumerable:!0,configurable:!0,get:v(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[ce.expando]?e:new ce.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click",!0),!1},trigger:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click"),!0},_default:function(e){var t=e.target;return we.test(t.type)&&t.click&&fe(t,"input")&&_.get(t,"click")||fe(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},ce.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},ce.Event=function(e,t){if(!(this instanceof ce.Event))return new ce.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ne:qe,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&ce.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[ce.expando]=!0},ce.Event.prototype={constructor:ce.Event,isDefaultPrevented:qe,isPropagationStopped:qe,isImmediatePropagationStopped:qe,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ne,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ne,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ne,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},ce.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},ce.event.addProp),ce.each({focus:"focusin",blur:"focusout"},function(r,i){function o(e){if(C.documentMode){var t=_.get(this,"handle"),n=ce.event.fix(e);n.type="focusin"===e.type?"focus":"blur",n.isSimulated=!0,t(e),n.target===n.currentTarget&&t(n)}else ce.event.simulate(i,e.target,ce.event.fix(e))}ce.event.special[r]={setup:function(){var e;if(He(this,r,!0),!C.documentMode)return!1;(e=_.get(this,i))||this.addEventListener(i,o),_.set(this,i,(e||0)+1)},trigger:function(){return He(this,r),!0},teardown:function(){var e;if(!C.documentMode)return!1;(e=_.get(this,i)-1)?_.set(this,i,e):(this.removeEventListener(i,o),_.remove(this,i))},_default:function(e){return _.get(e.target,r)},delegateType:i},ce.event.special[i]={setup:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i);n||(C.documentMode?this.addEventListener(i,o):e.addEventListener(r,o,!0)),_.set(t,i,(n||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i)-1;n?_.set(t,i,n):(C.documentMode?this.removeEventListener(i,o):e.removeEventListener(r,o,!0),_.remove(t,i))}}}),ce.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){ce.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||ce.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),ce.fn.extend({on:function(e,t,n,r){return Le(this,e,t,n,r)},one:function(e,t,n,r){return Le(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ce(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=qe),this.each(function(){ce.event.remove(this,e,n,t)})}});var Oe=/<script|<style|<link/i,Pe=/checked\s*(?:[^=]|=\s*.checked.)/i,Me=/^\s*<!\[CDATA\[|\]\]>\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)ce.event.add(t,i,s[i][n]);z.hasData(e)&&(o=z.access(e),a=ce.extend({},o),z.set(t,a))}}function $e(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=v(d);if(h||1<f&&"string"==typeof d&&!le.checkClone&&Pe.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),$e(t,r,i,o)});if(f&&(t=(e=Ae(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=ce.map(Se(e,"script"),Ie)).length;c<f;c++)u=e,c!==p&&(u=ce.clone(u,!0,!0),s&&ce.merge(a,Se(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,ce.map(a,We),c=0;c<s;c++)u=a[c],Ce.test(u.type||"")&&!_.access(u,"globalEval")&&ce.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?ce._evalUrl&&!u.noModule&&ce._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):m(u.textContent.replace(Me,""),u,l))}return n}function Be(e,t,n){for(var r,i=t?ce.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||ce.cleanData(Se(r)),r.parentNode&&(n&&K(r)&&Ee(Se(r,"script")),r.parentNode.removeChild(r));return e}ce.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=K(e);if(!(le.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(a=Se(c),r=0,i=(o=Se(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&we.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||Se(e),a=a||Se(c),r=0,i=o.length;r<i;r++)Fe(o[r],a[r]);else Fe(e,c);return 0<(a=Se(c,"script")).length&&Ee(a,!f&&Se(e,"script")),c},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if($(n)){if(t=n[_.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[_.expando]=void 0}n[z.expando]&&(n[z.expando]=void 0)}}}),ce.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return M(this,function(e){return void 0===e?ce.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return $e(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Re(this,e).appendChild(e)})},prepend:function(){return $e(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Re(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(ce.cleanData(Se(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return M(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Oe.test(e)&&!ke[(Te.exec(e)||["",""])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(ce.cleanData(Se(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return $e(this,arguments,function(e){var t=this.parentNode;ce.inArray(this,n)<0&&(ce.cleanData(Se(this)),t&&t.replaceChild(e,this))},n)}}),ce.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){ce.fn[e]=function(e){for(var t,n=[],r=ce(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),ce(r[o])[a](t),s.apply(n,t.get());return this.pushStack(n)}});var _e=new RegExp("^("+G+")(?!px)[a-z%]+$","i"),ze=/^--/,Xe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=ie),t.getComputedStyle(e)},Ue=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ve=new RegExp(Q.join("|"),"i");function Ge(e,t,n){var r,i,o,a,s=ze.test(t),u=e.style;return(n=n||Xe(e))&&(a=n.getPropertyValue(t)||n[t],s&&a&&(a=a.replace(ve,"$1")||void 0),""!==a||K(e)||(a=ce.style(e,t)),!le.pixelBoxStyles()&&_e.test(a)&&Ve.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=n.width,u.width=r,u.minWidth=i,u.maxWidth=o)),void 0!==a?a+"":a}function Ye(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",J.appendChild(u).appendChild(l);var e=ie.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),J.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=C.createElement("div"),l=C.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",le.clearCloneStyle="content-box"===l.style.backgroundClip,ce.extend(le,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=C.createElement("table"),t=C.createElement("tr"),n=C.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="box-sizing:content-box;border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",J.appendChild(e).appendChild(t).appendChild(n),r=ie.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,J.removeChild(e)),a}}))}();var Qe=["Webkit","Moz","ms"],Je=C.createElement("div").style,Ke={};function Ze(e){var t=ce.cssProps[e]||Ke[e];return t||(e in Je?e:Ke[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Qe.length;while(n--)if((e=Qe[n]+t)in Je)return e}(e)||e)}var et=/^(none|table(?!-c[ea]).+)/,tt={position:"absolute",visibility:"hidden",display:"block"},nt={letterSpacing:"0",fontWeight:"400"};function rt(e,t,n){var r=Y.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function it(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0,l=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(l+=ce.css(e,n+Q[a],!0,i)),r?("content"===n&&(u-=ce.css(e,"padding"+Q[a],!0,i)),"margin"!==n&&(u-=ce.css(e,"border"+Q[a]+"Width",!0,i))):(u+=ce.css(e,"padding"+Q[a],!0,i),"padding"!==n?u+=ce.css(e,"border"+Q[a]+"Width",!0,i):s+=ce.css(e,"border"+Q[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u+l}function ot(e,t,n){var r=Xe(e),i=(!le.boxSizingReliable()||n)&&"border-box"===ce.css(e,"boxSizing",!1,r),o=i,a=Ge(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(_e.test(a)){if(!n)return a;a="auto"}return(!le.boxSizingReliable()&&i||!le.reliableTrDimensions()&&fe(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===ce.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===ce.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+it(e,t,n||(i?"border":"content"),o,r,a)+"px"}function at(e,t,n,r,i){return new at.prototype.init(e,t,n,r,i)}ce.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ge(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=F(t),u=ze.test(t),l=e.style;if(u||(t=Ze(s)),a=ce.cssHooks[t]||ce.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=Y.exec(n))&&i[1]&&(n=te(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(ce.cssNumber[s]?"":"px")),le.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=F(t);return ze.test(t)||(t=Ze(s)),(a=ce.cssHooks[t]||ce.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Ge(e,t,r)),"normal"===i&&t in nt&&(i=nt[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),ce.each(["height","width"],function(e,u){ce.cssHooks[u]={get:function(e,t,n){if(t)return!et.test(ce.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?ot(e,u,n):Ue(e,tt,function(){return ot(e,u,n)})},set:function(e,t,n){var r,i=Xe(e),o=!le.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===ce.css(e,"boxSizing",!1,i),s=n?it(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-it(e,u,"border",!1,i)-.5)),s&&(r=Y.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=ce.css(e,u)),rt(0,t,s)}}}),ce.cssHooks.marginLeft=Ye(le.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Ge(e,"marginLeft"))||e.getBoundingClientRect().left-Ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),ce.each({margin:"",padding:"",border:"Width"},function(i,o){ce.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+Q[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(ce.cssHooks[i+o].set=rt)}),ce.fn.extend({css:function(e,t){return M(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Xe(e),i=t.length;a<i;a++)o[t[a]]=ce.css(e,t[a],!1,r);return o}return void 0!==n?ce.style(e,t,n):ce.css(e,t)},e,t,1<arguments.length)}}),((ce.Tween=at).prototype={constructor:at,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||ce.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ce.cssNumber[n]?"":"px")},cur:function(){var e=at.propHooks[this.prop];return e&&e.get?e.get(this):at.propHooks._default.get(this)},run:function(e){var t,n=at.propHooks[this.prop];return this.options.duration?this.pos=t=ce.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):at.propHooks._default.set(this),this}}).init.prototype=at.prototype,(at.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=ce.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){ce.fx.step[e.prop]?ce.fx.step[e.prop](e):1!==e.elem.nodeType||!ce.cssHooks[e.prop]&&null==e.elem.style[Ze(e.prop)]?e.elem[e.prop]=e.now:ce.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=at.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ce.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},ce.fx=at.prototype.init,ce.fx.step={};var st,ut,lt,ct,ft=/^(?:toggle|show|hide)$/,pt=/queueHooks$/;function dt(){ut&&(!1===C.hidden&&ie.requestAnimationFrame?ie.requestAnimationFrame(dt):ie.setTimeout(dt,ce.fx.interval),ce.fx.tick())}function ht(){return ie.setTimeout(function(){st=void 0}),st=Date.now()}function gt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=Q[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function vt(e,t,n){for(var r,i=(yt.tweeners[t]||[]).concat(yt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function yt(o,e,t){var n,a,r=0,i=yt.prefilters.length,s=ce.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=st||ht(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:ce.extend({},e),opts:ce.extend(!0,{specialEasing:{},easing:ce.easing._default},t),originalProperties:e,originalOptions:t,startTime:st||ht(),duration:t.duration,tweens:[],createTween:function(e,t){var n=ce.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=F(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=ce.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=yt.prefilters[r].call(l,o,c,l.opts))return v(n.stop)&&(ce._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return ce.map(c,vt,l),v(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),ce.fx.timer(ce.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}ce.Animation=ce.extend(yt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return te(n.elem,e,Y.exec(t),n),n}]},tweener:function(e,t){v(e)?(t=e,e=["*"]):e=e.match(D);for(var n,r=0,i=e.length;r<i;r++)n=e[r],yt.tweeners[n]=yt.tweeners[n]||[],yt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ee(e),v=_.get(e,"fxshow");for(r in n.queue||(null==(a=ce._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,ce.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ft.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||ce.style(e,r)}if((u=!ce.isEmptyObject(t))||!ce.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=_.get(e,"display")),"none"===(c=ce.css(e,"display"))&&(l?c=l:(re([e],!0),l=e.style.display||l,c=ce.css(e,"display"),re([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===ce.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=_.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&re([e],!0),p.done(function(){for(r in g||re([e]),_.remove(e,"fxshow"),d)ce.style(e,r,d[r])})),u=vt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?yt.prefilters.unshift(e):yt.prefilters.push(e)}}),ce.speed=function(e,t,n){var r=e&&"object"==typeof e?ce.extend({},e):{complete:n||!n&&t||v(e)&&e,duration:e,easing:n&&t||t&&!v(t)&&t};return ce.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in ce.fx.speeds?r.duration=ce.fx.speeds[r.duration]:r.duration=ce.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){v(r.old)&&r.old.call(this),r.queue&&ce.dequeue(this,r.queue)},r},ce.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ee).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=ce.isEmptyObject(t),o=ce.speed(e,n,r),a=function(){var e=yt(this,ce.extend({},t),o);(i||_.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=ce.timers,r=_.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&pt.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||ce.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=_.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=ce.timers,o=n?n.length:0;for(t.finish=!0,ce.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),ce.each(["toggle","show","hide"],function(e,r){var i=ce.fn[r];ce.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(gt(r,!0),e,t,n)}}),ce.each({slideDown:gt("show"),slideUp:gt("hide"),slideToggle:gt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){ce.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),ce.timers=[],ce.fx.tick=function(){var e,t=0,n=ce.timers;for(st=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||ce.fx.stop(),st=void 0},ce.fx.timer=function(e){ce.timers.push(e),ce.fx.start()},ce.fx.interval=13,ce.fx.start=function(){ut||(ut=!0,dt())},ce.fx.stop=function(){ut=null},ce.fx.speeds={slow:600,fast:200,_default:400},ce.fn.delay=function(r,e){return r=ce.fx&&ce.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=ie.setTimeout(e,r);t.stop=function(){ie.clearTimeout(n)}})},lt=C.createElement("input"),ct=C.createElement("select").appendChild(C.createElement("option")),lt.type="checkbox",le.checkOn=""!==lt.value,le.optSelected=ct.selected,(lt=C.createElement("input")).value="t",lt.type="radio",le.radioValue="t"===lt.value;var mt,xt=ce.expr.attrHandle;ce.fn.extend({attr:function(e,t){return M(this,ce.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){ce.removeAttr(this,e)})}}),ce.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?ce.prop(e,t,n):(1===o&&ce.isXMLDoc(e)||(i=ce.attrHooks[t.toLowerCase()]||(ce.expr.match.bool.test(t)?mt:void 0)),void 0!==n?null===n?void ce.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=ce.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!le.radioValue&&"radio"===t&&fe(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(D);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),mt={set:function(e,t,n){return!1===t?ce.removeAttr(e,n):e.setAttribute(n,n),n}},ce.each(ce.expr.match.bool.source.match(/\w+/g),function(e,t){var a=xt[t]||ce.find.attr;xt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=xt[o],xt[o]=r,r=null!=a(e,t,n)?o:null,xt[o]=i),r}});var bt=/^(?:input|select|textarea|button)$/i,wt=/^(?:a|area)$/i;function Tt(e){return(e.match(D)||[]).join(" ")}function Ct(e){return e.getAttribute&&e.getAttribute("class")||""}function kt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(D)||[]}ce.fn.extend({prop:function(e,t){return M(this,ce.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[ce.propFix[e]||e]})}}),ce.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&ce.isXMLDoc(e)||(t=ce.propFix[t]||t,i=ce.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=ce.find.attr(e,"tabindex");return t?parseInt(t,10):bt.test(e.nodeName)||wt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),le.optSelected||(ce.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),ce.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ce.propFix[this.toLowerCase()]=this}),ce.fn.extend({addClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).addClass(t.call(this,e,Ct(this)))}):(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++)i=e[o],n.indexOf(" "+i+" ")<0&&(n+=i+" ");a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this},removeClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).removeClass(t.call(this,e,Ct(this)))}):arguments.length?(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++){i=e[o];while(-1<n.indexOf(" "+i+" "))n=n.replace(" "+i+" "," ")}a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this:this.attr("class","")},toggleClass:function(t,n){var e,r,i,o,a=typeof t,s="string"===a||Array.isArray(t);return v(t)?this.each(function(e){ce(this).toggleClass(t.call(this,e,Ct(this),n),n)}):"boolean"==typeof n&&s?n?this.addClass(t):this.removeClass(t):(e=kt(t),this.each(function(){if(s)for(o=ce(this),i=0;i<e.length;i++)r=e[i],o.hasClass(r)?o.removeClass(r):o.addClass(r);else void 0!==t&&"boolean"!==a||((r=Ct(this))&&_.set(this,"__className__",r),this.setAttribute&&this.setAttribute("class",r||!1===t?"":_.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+Tt(Ct(n))+" ").indexOf(t))return!0;return!1}});var St=/\r/g;ce.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=v(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,ce(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=ce.map(t,function(e){return null==e?"":e+""})),(r=ce.valHooks[this.type]||ce.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=ce.valHooks[t.type]||ce.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(St,""):null==e?"":e:void 0}}),ce.extend({valHooks:{option:{get:function(e){var t=ce.find.attr(e,"value");return null!=t?t:Tt(ce.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!fe(n.parentNode,"optgroup"))){if(t=ce(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=ce.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<ce.inArray(ce.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),ce.each(["radio","checkbox"],function(){ce.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<ce.inArray(ce(e).val(),t)}},le.checkOn||(ce.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Et=ie.location,jt={guid:Date.now()},At=/\?/;ce.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new ie.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||ce.error("Invalid XML: "+(n?ce.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Dt=/^(?:focusinfocus|focusoutblur)$/,Nt=function(e){e.stopPropagation()};ce.extend(ce.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||C],d=ue.call(e,"type")?e.type:e,h=ue.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||C,3!==n.nodeType&&8!==n.nodeType&&!Dt.test(d+ce.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[ce.expando]?e:new ce.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:ce.makeArray(t,[e]),c=ce.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!y(n)){for(s=c.delegateType||d,Dt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||C)&&p.push(a.defaultView||a.parentWindow||ie)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(_.get(o,"events")||Object.create(null))[e.type]&&_.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&$(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!$(n)||u&&v(n[d])&&!y(n)&&((a=n[u])&&(n[u]=null),ce.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Nt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Nt),ce.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=ce.extend(new ce.Event,n,{type:e,isSimulated:!0});ce.event.trigger(r,null,t)}}),ce.fn.extend({trigger:function(e,t){return this.each(function(){ce.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return ce.event.trigger(e,t,n,!0)}});var qt=/\[\]$/,Lt=/\r?\n/g,Ht=/^(?:submit|button|image|reset|file)$/i,Ot=/^(?:input|select|textarea|keygen)/i;function Pt(n,e,r,i){var t;if(Array.isArray(e))ce.each(e,function(e,t){r||qt.test(n)?i(n,t):Pt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==x(e))i(n,e);else for(t in e)Pt(n+"["+t+"]",e[t],r,i)}ce.param=function(e,t){var n,r=[],i=function(e,t){var n=v(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!ce.isPlainObject(e))ce.each(e,function(){i(this.name,this.value)});else for(n in e)Pt(n,e[n],t,i);return r.join("&")},ce.fn.extend({serialize:function(){return ce.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ce.prop(this,"elements");return e?ce.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ce(this).is(":disabled")&&Ot.test(this.nodeName)&&!Ht.test(e)&&(this.checked||!we.test(e))}).map(function(e,t){var n=ce(this).val();return null==n?null:Array.isArray(n)?ce.map(n,function(e){return{name:t.name,value:e.replace(Lt,"\r\n")}}):{name:t.name,value:n.replace(Lt,"\r\n")}}).get()}});var Mt=/%20/g,Rt=/#.*$/,It=/([?&])_=[^&]*/,Wt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ft=/^(?:GET|HEAD)$/,$t=/^\/\//,Bt={},_t={},zt="*/".concat("*"),Xt=C.createElement("a");function Ut(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(D)||[];if(v(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Vt(t,i,o,a){var s={},u=t===_t;function l(e){var r;return s[e]=!0,ce.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Gt(e,t){var n,r,i=ce.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&ce.extend(!0,e,r),e}Xt.href=Et.href,ce.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":ce.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Gt(Gt(e,ce.ajaxSettings),t):Gt(ce.ajaxSettings,e)},ajaxPrefilter:Ut(Bt),ajaxTransport:Ut(_t),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=ce.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?ce(y):ce.event,x=ce.Deferred(),b=ce.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Wt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace($t,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(D)||[""],null==v.crossDomain){r=C.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Xt.protocol+"//"+Xt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=ce.param(v.data,v.traditional)),Vt(Bt,v,t,T),h)return T;for(i in(g=ce.event&&v.global)&&0==ce.active++&&ce.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ft.test(v.type),f=v.url.replace(Rt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Mt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(At.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(It,"$1"),o=(At.test(f)?"&":"?")+"_="+jt.guid+++o),v.url=f+o),v.ifModified&&(ce.lastModified[f]&&T.setRequestHeader("If-Modified-Since",ce.lastModified[f]),ce.etag[f]&&T.setRequestHeader("If-None-Match",ce.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+zt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Vt(_t,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=ie.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&ie.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<ce.inArray("script",v.dataTypes)&&ce.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(ce.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(ce.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--ce.active||ce.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return ce.get(e,t,n,"json")},getScript:function(e,t){return ce.get(e,void 0,t,"script")}}),ce.each(["get","post"],function(e,i){ce[i]=function(e,t,n,r){return v(t)&&(r=r||n,n=t,t=void 0),ce.ajax(ce.extend({url:e,type:i,dataType:r,data:t,success:n},ce.isPlainObject(e)&&e))}}),ce.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),ce._evalUrl=function(e,t,n){return ce.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){ce.globalEval(e,t,n)}})},ce.fn.extend({wrapAll:function(e){var t;return this[0]&&(v(e)&&(e=e.call(this[0])),t=ce(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return v(n)?this.each(function(e){ce(this).wrapInner(n.call(this,e))}):this.each(function(){var e=ce(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=v(t);return this.each(function(e){ce(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){ce(this).replaceWith(this.childNodes)}),this}}),ce.expr.pseudos.hidden=function(e){return!ce.expr.pseudos.visible(e)},ce.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},ce.ajaxSettings.xhr=function(){try{return new ie.XMLHttpRequest}catch(e){}};var Yt={0:200,1223:204},Qt=ce.ajaxSettings.xhr();le.cors=!!Qt&&"withCredentials"in Qt,le.ajax=Qt=!!Qt,ce.ajaxTransport(function(i){var o,a;if(le.cors||Qt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Yt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&ie.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),ce.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),ce.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return ce.globalEval(e),e}}}),ce.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),ce.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=ce("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=Tt(e.slice(s)),e=e.slice(0,s)),v(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&ce.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?ce("<div>").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var en=/^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;ce.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),v(e))return r=ae.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(ae.call(arguments)))}).guid=e.guid=e.guid||ce.guid++,i},ce.holdReady=function(e){e?ce.readyWait++:ce.ready(!0)},ce.isArray=Array.isArray,ce.parseJSON=JSON.parse,ce.nodeName=fe,ce.isFunction=v,ce.isWindow=y,ce.camelCase=F,ce.type=x,ce.now=Date.now,ce.isNumeric=function(e){var t=ce.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},ce.trim=function(e){return null==e?"":(e+"").replace(en,"$1")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return ce});var tn=ie.jQuery,nn=ie.$;return ce.noConflict=function(e){return ie.$===ce&&(ie.$=nn),e&&ie.jQuery===ce&&(ie.jQuery=tn),ce},"undefined"==typeof e&&(ie.jQuery=ie.$=ce),ce});
  40094. </file>
  40095. <file path="stores/lang.js">
  40096. export const useLangStore = defineStore('langStore', () => {
  40097. const lang = ref('kr')
  40098. const getLang = computed(()=> lang.value = useUtil.nvl(lang.value, 'kr'))
  40099. function setLang(payload){
  40100. lang.value = payload
  40101. }
  40102. return {lang, getLang, setLang}
  40103. }, {persist: { storage: persistedState.sessionStorage,}})
  40104. </file>
  40105. <file path="stores/loading.js">
  40106. export const useLoadingStore = defineStore('loadingStore', () => {
  40107. // state
  40108. const count = ref(0)
  40109. // getter
  40110. const getCount = computed(() => count.value)
  40111. // action
  40112. function plusCount(){
  40113. console.log('%c 카운트 증가' ,'color:#bada55','')
  40114. count.value++
  40115. }
  40116. function minusCount(){
  40117. console.log('%c 카운트 감소' ,'color:#bada55','')
  40118. setTimeout(() => {
  40119. count.value--
  40120. }, 300)
  40121. }
  40122. function resetCount(){
  40123. count.value = 0
  40124. }
  40125. return { count, getCount, plusCount, minusCount, resetCount }
  40126. })
  40127. // 새로고침시 초기화 되어야하기때문에 해당 plugin 기능 제거
  40128. // , {persist: true}
  40129. </file>
  40130. <file path="stores/tenantMgmt.js">
  40131. export const useTenantMgmtStore = defineStore('tenantMgmtStore', () => {
  40132. const tenantInfo = ref({
  40133. tenantName: '', // 테넌트 이름
  40134. tenantCode: '', // 테넌트 고유번호
  40135. corpNum: '', // 사업자 등록 번호
  40136. customerType: '', // 고객 유형
  40137. tenantAddress: '', // 테넌트 주소
  40138. tenantLocLatitude: '', // 위도
  40139. tenantLocLongitude: '', // 경도
  40140. description: '', // 설명
  40141. imsiPrefix: '', // imsiPrefix
  40142. regionalCode: '', // 지역코드
  40143. })
  40144. const licenseInfo = ref({
  40145. licenseKey: '', // 라이선스 키
  40146. licenseType: '', // 라이선스 유형
  40147. issueDate: '', // 발급일
  40148. expirationDate: '', // 만료일
  40149. maxAccount: '', // 최대 계정 수
  40150. maxSession: '', // 최대 세션 수
  40151. clientAccess: '', // 클라이언트 접속 허용 여부
  40152. maxSubscriber: '', // 최대 가입자 수
  40153. })
  40154. const getTenantInfo = computed(() => tenantInfo.value)
  40155. const getLicenseInfo = computed(() => licenseInfo.value)
  40156. function setTenantInfo(payload){
  40157. tenantInfo.value.tenantName = payload.tenantName
  40158. tenantInfo.value.tenantCode = payload.tenantCode
  40159. tenantInfo.value.corpNum = payload.corpNum
  40160. tenantInfo.value.customerType = payload.customerType
  40161. tenantInfo.value.tenantAddress = payload.tenantAddress
  40162. tenantInfo.value.tenantLocLatitude = payload.tenantLocLatitude
  40163. tenantInfo.value.tenantLocLongitude = payload.tenantLocLongitude
  40164. tenantInfo.value.description = payload.description
  40165. tenantInfo.value.imsiPrefix = payload.imsiPrefix
  40166. tenantInfo.value.regionalCode = payload.regionalCode
  40167. }
  40168. function setLicenseInfo(payload){
  40169. licenseInfo.value.licenseKey = payload.licenseKey
  40170. licenseInfo.value.licenseType = payload.licenseType
  40171. licenseInfo.value.issueDate = payload.issueDate
  40172. licenseInfo.value.expirationDate = payload.expirationDate
  40173. licenseInfo.value.maxAccount = payload.maxAccount
  40174. licenseInfo.value.maxSession = payload.maxSession
  40175. licenseInfo.value.clientAccess = payload.clientAccess
  40176. licenseInfo.value.maxSubscriber = payload.maxSubscriber
  40177. }
  40178. return { tenantInfo, getTenantInfo, setTenantInfo, licenseInfo, getLicenseInfo, setLicenseInfo}
  40179. }, {persist: { storage: persistedState.sessionStorage,}})
  40180. </file>
  40181. <file path="app.vue">
  40182. <template>
  40183. <v-app>
  40184. <v-main>
  40185. <NuxtLayout>
  40186. <NuxtPage />
  40187. </NuxtLayout>
  40188. <commonCustomLoading />
  40189. <commonConfirmDialog />
  40190. </v-main>
  40191. </v-app>
  40192. </template>
  40193. <script setup>
  40194. //console.log('%c [app.vue][env]' ,'color:#bada55', import.meta.env)
  40195. </script>
  40196. </file>
  40197. <file path="error.vue">
  40198. <template>
  40199. <div class="error-page">
  40200. <h1>{{ error.statusCode === 404 ? 'Page not found' : 'Oops, something went wrong!' }}</h1>
  40201. <p>{{ error.message }}</p>
  40202. <v-btn @click="fnMove">홈으로 이동</v-btn>
  40203. </div>
  40204. </template>
  40205. <script setup>
  40206. const props = defineProps({
  40207. error: Object
  40208. })
  40209. function fnMove(){
  40210. clearError({ redirect: '/' })
  40211. }
  40212. </script>
  40213. <style lang="scss" scoped>
  40214. .error-page {
  40215. text-align: center;
  40216. margin: 50px auto;
  40217. }
  40218. </style>
  40219. </file>
  40220. <file path="README.md">
  40221. # p5g-web
  40222. P5G PROJECT
  40223. # Nuxt 3 Minimal Starter
  40224. Look at the [Nuxt 3 documentation](https://nuxt.com/docs/getting-started/introduction) to learn more.
  40225. ## Setup
  40226. ```bash
  40227. # 개발환경
  40228. node version : 20.10.0
  40229. # 노드 버전 확인
  40230. node -v
  40231. # nvm 사용 시 > 사용 가능한 노드 버전 확인 및 설정
  40232. 1. nvm list
  40233. 2. nvm install 20.10.0 #특정 버전 설치
  40234. 3. nvm list #설치된 노드 확인
  40235. 4. nvm use 20.10.0 #노드 버전 설정
  40236. 5. nvm list or node -v #노드 버전 확인
  40237. # npm 설치
  40238. npm install
  40239. # 프로젝트 로컬환경 실행
  40240. npm run dev
  40241. # 프로젝트 빌드 명령어
  40242. npm run generate
  40243. # 배포 시 패키지 파일 저장 위치
  40244. /.output/public
  40245. </file>
  40246. <file path="toast-editor.d.ts">
  40247. declare module "@toast-ui/editor" {
  40248. import { Editor } from "@toast-ui/editor";
  40249. export default Editor;
  40250. }
  40251. </file>
  40252. <file path="tsconfig.json">
  40253. {
  40254. // https://nuxt.com/docs/guide/concepts/typescript
  40255. "extends": "./.nuxt/tsconfig.json",
  40256. "compilerOptions": {
  40257. "outDir": "./out-tsc/server",
  40258. "types": ["node", "jquery"],
  40259. },
  40260. }
  40261. </file>
  40262. <file path="vite-plugin-sri.d.ts">
  40263. // vite-plugin-sri.d.ts
  40264. declare module 'vite-plugin-sri';
  40265. </file>
  40266. <file path=".cursor/rules/db-structure-rules.mdc">
  40267. ---
  40268. alwaysApply: true
  40269. ---
  40270. </file>
  40271. <file path=".cursor/rules/sql-rules.mdc">
  40272. ---
  40273. alwaysApply: true
  40274. ---
  40275. </file>
  40276. <file path=".vooster/tasks.json">
  40277. {
  40278. "totalCount": 21,
  40279. "downloadedAt": "2025-07-22T01:53:47.496Z",
  40280. "tasks": [
  40281. {
  40282. "taskId": "T-001",
  40283. "summary": "공통 인증 및 권한 관리 모듈 설계 및 구현",
  40284. "status": "BACKLOG",
  40285. "importance": "MUST",
  40286. "complexity": 5,
  40287. "urgency": 7,
  40288. "createdAt": "2025-07-17T02:02:42.157Z",
  40289. "updatedAt": "2025-07-17T02:02:42.157Z"
  40290. },
  40291. {
  40292. "taskId": "T-002",
  40293. "summary": "서브계정 및 권한 관리 기능 개발",
  40294. "status": "BACKLOG",
  40295. "importance": "MUST",
  40296. "complexity": 6,
  40297. "urgency": 7,
  40298. "createdAt": "2025-07-17T02:02:42.157Z",
  40299. "updatedAt": "2025-07-17T02:02:42.157Z"
  40300. },
  40301. {
  40302. "taskId": "T-003",
  40303. "summary": "파트너 매칭 시스템 구축",
  40304. "status": "BACKLOG",
  40305. "importance": "MUST",
  40306. "complexity": 7,
  40307. "urgency": 8,
  40308. "createdAt": "2025-07-17T02:02:42.157Z",
  40309. "updatedAt": "2025-07-17T02:02:42.157Z"
  40310. },
  40311. {
  40312. "taskId": "T-004",
  40313. "summary": "대시보드(매출·주문·정산) 개발",
  40314. "status": "DONE",
  40315. "importance": "MUST",
  40316. "complexity": 6,
  40317. "urgency": 6,
  40318. "createdAt": "2025-07-17T02:02:42.157Z",
  40319. "updatedAt": "2025-07-21T06:34:50.862Z"
  40320. },
  40321. {
  40322. "taskId": "T-005",
  40323. "summary": "벤더사 대시보드 페이지 기본 구조 설계 및 라우팅",
  40324. "status": "DONE",
  40325. "importance": "MUST",
  40326. "complexity": 5,
  40327. "urgency": 8,
  40328. "createdAt": "2025-07-17T02:18:17.743Z",
  40329. "updatedAt": "2025-07-21T06:40:17.764Z"
  40330. },
  40331. {
  40332. "taskId": "T-006",
  40333. "summary": "주문 데이터 API 연동 및 상태별 분류 로직 구현",
  40334. "status": "BACKLOG",
  40335. "importance": "MUST",
  40336. "complexity": 6,
  40337. "urgency": 8,
  40338. "createdAt": "2025-07-17T02:18:17.743Z",
  40339. "updatedAt": "2025-07-17T02:18:17.743Z"
  40340. },
  40341. {
  40342. "taskId": "T-007",
  40343. "summary": "공통 그리드 컴포넌트 활용 리스트 뷰 구현",
  40344. "status": "BACKLOG",
  40345. "importance": "MUST",
  40346. "complexity": 6,
  40347. "urgency": 7,
  40348. "createdAt": "2025-07-17T02:18:17.743Z",
  40349. "updatedAt": "2025-07-17T02:18:17.743Z"
  40350. },
  40351. {
  40352. "taskId": "T-008",
  40353. "summary": "대시보드 요약 정보 위젯/카드 구현",
  40354. "status": "BACKLOG",
  40355. "importance": "SHOULD",
  40356. "complexity": 4,
  40357. "urgency": 6,
  40358. "createdAt": "2025-07-17T02:18:17.743Z",
  40359. "updatedAt": "2025-07-17T02:18:17.743Z"
  40360. },
  40361. {
  40362. "taskId": "T-009",
  40363. "summary": "반응형 UI 및 접근성 검증",
  40364. "status": "BACKLOG",
  40365. "importance": "SHOULD",
  40366. "complexity": 4,
  40367. "urgency": 5,
  40368. "createdAt": "2025-07-17T02:18:17.743Z",
  40369. "updatedAt": "2025-07-17T02:18:17.743Z"
  40370. },
  40371. {
  40372. "taskId": "T-010",
  40373. "summary": "제품 등록 기능 구현",
  40374. "status": "BACKLOG",
  40375. "importance": "MUST",
  40376. "complexity": 6,
  40377. "urgency": 8,
  40378. "createdAt": "2025-07-17T07:44:43.699Z",
  40379. "updatedAt": "2025-07-17T07:44:43.699Z"
  40380. },
  40381. {
  40382. "taskId": "T-011",
  40383. "summary": "제품 수정 및 소프트 삭제 기능 구현",
  40384. "status": "BACKLOG",
  40385. "importance": "MUST",
  40386. "complexity": 6,
  40387. "urgency": 7,
  40388. "createdAt": "2025-07-17T07:44:43.699Z",
  40389. "updatedAt": "2025-07-17T07:44:43.699Z"
  40390. },
  40391. {
  40392. "taskId": "T-012",
  40393. "summary": "제품 상태·노출 변경 및 인플루언서 노출 제어",
  40394. "status": "BACKLOG",
  40395. "importance": "MUST",
  40396. "complexity": 5,
  40397. "urgency": 8,
  40398. "createdAt": "2025-07-17T07:44:43.699Z",
  40399. "updatedAt": "2025-07-17T07:44:43.699Z"
  40400. },
  40401. {
  40402. "taskId": "T-013",
  40403. "summary": "제품 변경 이력 기록 기능 구현",
  40404. "status": "BACKLOG",
  40405. "importance": "SHOULD",
  40406. "complexity": 4,
  40407. "urgency": 5,
  40408. "createdAt": "2025-07-17T07:44:43.699Z",
  40409. "updatedAt": "2025-07-17T07:44:43.699Z"
  40410. },
  40411. {
  40412. "taskId": "T-014",
  40413. "summary": "상태·노출 변경 알림 기능 연동",
  40414. "status": "BACKLOG",
  40415. "importance": "SHOULD",
  40416. "complexity": 5,
  40417. "urgency": 6,
  40418. "createdAt": "2025-07-17T07:44:43.699Z",
  40419. "updatedAt": "2025-07-17T07:44:43.699Z"
  40420. },
  40421. {
  40422. "taskId": "T-015",
  40423. "summary": "벤더사 검색 및 탐색 기능 구현",
  40424. "status": "IN_PROGRESS",
  40425. "importance": "MUST",
  40426. "complexity": 5,
  40427. "urgency": 8,
  40428. "createdAt": "2025-07-21T06:24:11.558Z",
  40429. "updatedAt": "2025-07-21T06:41:11.982Z"
  40430. },
  40431. {
  40432. "taskId": "T-016",
  40433. "summary": "벤더사-인플루언서 승인 매핑용 중계 테이블 및 API 설계/구현",
  40434. "status": "BACKLOG",
  40435. "importance": "MUST",
  40436. "complexity": 7,
  40437. "urgency": 8,
  40438. "createdAt": "2025-07-22T01:48:43.838Z",
  40439. "updatedAt": "2025-07-22T01:48:43.838Z"
  40440. },
  40441. {
  40442. "taskId": "T-017",
  40443. "summary": "인플루언서 벤더사 검색 및 승인요청 UI/로직 구현",
  40444. "status": "BACKLOG",
  40445. "importance": "MUST",
  40446. "complexity": 6,
  40447. "urgency": 8,
  40448. "createdAt": "2025-07-22T01:48:43.838Z",
  40449. "updatedAt": "2025-07-22T01:48:43.838Z"
  40450. },
  40451. {
  40452. "taskId": "T-018",
  40453. "summary": "벤더사 인플루언서 승인요청 리스트/승인처리 UI/로직 구현",
  40454. "status": "BACKLOG",
  40455. "importance": "MUST",
  40456. "complexity": 6,
  40457. "urgency": 8,
  40458. "createdAt": "2025-07-22T01:48:43.838Z",
  40459. "updatedAt": "2025-07-22T01:48:43.838Z"
  40460. },
  40461. {
  40462. "taskId": "T-019",
  40463. "summary": "인플루언서 승인 상태에 따른 벤더사 제품 접근 제어",
  40464. "status": "BACKLOG",
  40465. "importance": "MUST",
  40466. "complexity": 7,
  40467. "urgency": 7,
  40468. "createdAt": "2025-07-22T01:48:43.838Z",
  40469. "updatedAt": "2025-07-22T01:48:43.838Z"
  40470. },
  40471. {
  40472. "taskId": "T-020",
  40473. "summary": "승인요청 및 처리 내역/상태 조회 기능 추가",
  40474. "status": "BACKLOG",
  40475. "importance": "SHOULD",
  40476. "complexity": 5,
  40477. "urgency": 6,
  40478. "createdAt": "2025-07-22T01:48:43.838Z",
  40479. "updatedAt": "2025-07-22T01:48:43.838Z"
  40480. },
  40481. {
  40482. "taskId": "T-021",
  40483. "summary": "승인요청, 승인처리 시 실시간 피드백 및 알림 처리",
  40484. "status": "BACKLOG",
  40485. "importance": "SHOULD",
  40486. "complexity": 4,
  40487. "urgency": 5,
  40488. "createdAt": "2025-07-22T01:48:43.838Z",
  40489. "updatedAt": "2025-07-22T01:48:43.838Z"
  40490. }
  40491. ]
  40492. }
  40493. </file>
  40494. <file path="assets/img/ico_logout.svg">
  40495. <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
  40496. <path d="M13 25H9C8.46957 25 7.96086 24.7893 7.58579 24.4142C7.21071 24.0391 7 23.5304 7 23V9C7 8.46957 7.21071 7.96086 7.58579 7.58579C7.96086 7.21071 8.46957 7 9 7H13" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  40497. <path d="M20 21L25 16L20 11" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  40498. <path d="M25 16H13" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  40499. </svg>
  40500. </file>
  40501. <file path="backend/app/Controllers/DebugController.php">
  40502. <?php
  40503. namespace App\Controllers;
  40504. use App\Controllers\BaseController;
  40505. use App\Models\VendorInfluencerMappingModel;
  40506. use App\Models\InfluencerModel;
  40507. use CodeIgniter\HTTP\ResponseInterface;
  40508. class DebugController extends BaseController
  40509. {
  40510. protected $vendorInfluencerModel;
  40511. protected $influencerModel;
  40512. public function __construct()
  40513. {
  40514. $this->vendorInfluencerModel = new VendorInfluencerMappingModel();
  40515. $this->influencerModel = new InfluencerModel();
  40516. }
  40517. /**
  40518. * 외래키 제약조건 디버깅용 메서드
  40519. */
  40520. public function debugForeignKey()
  40521. {
  40522. try {
  40523. $mappingSeq = 2;
  40524. $processedBy = 8;
  40525. // 1. USER_LIST에서 SEQ 8번 사용자 확인
  40526. $user = $this->influencerModel->where('SEQ', $processedBy)->first();
  40527. $debugInfo = [
  40528. 'user_exists' => !empty($user),
  40529. 'user_data' => $user,
  40530. 'user_count' => $this->influencerModel->where('SEQ', $processedBy)->countAllResults()
  40531. ];
  40532. // 2. VENDOR_INFLUENCER_MAPPING에서 SEQ 2번 레코드 확인
  40533. $mapping = $this->vendorInfluencerModel->where('SEQ', $mappingSeq)->first();
  40534. $debugInfo['mapping_exists'] = !empty($mapping);
  40535. $debugInfo['mapping_data'] = $mapping;
  40536. // 3. 현재 APPROVED_BY 필드 상태 확인
  40537. if ($mapping) {
  40538. $debugInfo['current_approved_by'] = $mapping['APPROVED_BY'];
  40539. $debugInfo['current_status'] = $mapping['STATUS'];
  40540. }
  40541. // 4. 외래키 제약조건 확인
  40542. $db = \Config\Database::connect();
  40543. $foreignKeys = $db->query("
  40544. SELECT
  40545. CONSTRAINT_NAME,
  40546. COLUMN_NAME,
  40547. REFERENCED_TABLE_NAME,
  40548. REFERENCED_COLUMN_NAME
  40549. FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
  40550. WHERE TABLE_NAME = 'VENDOR_INFLUENCER_MAPPING'
  40551. AND TABLE_SCHEMA = DATABASE()
  40552. AND REFERENCED_TABLE_NAME IS NOT NULL
  40553. ")->getResultArray();
  40554. $debugInfo['foreign_keys'] = $foreignKeys;
  40555. // 5. 실제 업데이트 시도해보기 (트랜잭션 롤백)
  40556. $db->transStart();
  40557. try {
  40558. $updateData = [
  40559. 'STATUS' => 'APPROVED',
  40560. 'APPROVED_BY' => $processedBy,
  40561. 'RESPONSE_MESSAGE' => 'debug test',
  40562. 'RESPONSE_DATE' => date('Y-m-d H:i:s')
  40563. ];
  40564. $result = $this->vendorInfluencerModel->update($mappingSeq, $updateData);
  40565. $debugInfo['update_attempted'] = true;
  40566. $debugInfo['update_result'] = $result;
  40567. $debugInfo['update_error'] = null;
  40568. } catch (\Exception $e) {
  40569. $debugInfo['update_attempted'] = true;
  40570. $debugInfo['update_result'] = false;
  40571. $debugInfo['update_error'] = $e->getMessage();
  40572. }
  40573. // 항상 롤백
  40574. $db->transRollback();
  40575. // 6. 다른 사용자 SEQ들 확인
  40576. $otherUsers = $this->influencerModel
  40577. ->select('SEQ, NICK_NAME, EMAIL, IS_ACT, USER_TYPE')
  40578. ->where('IS_ACT', 'Y')
  40579. ->orderBy('SEQ')
  40580. ->findAll(10);
  40581. $debugInfo['sample_active_users'] = $otherUsers;
  40582. return $this->response->setJSON([
  40583. 'success' => true,
  40584. 'debug_info' => $debugInfo
  40585. ]);
  40586. } catch (\Exception $e) {
  40587. return $this->response->setStatusCode(500)->setJSON([
  40588. 'success' => false,
  40589. 'message' => '디버깅 중 오류가 발생했습니다.',
  40590. 'error' => $e->getMessage()
  40591. ]);
  40592. }
  40593. }
  40594. /**
  40595. * 간단한 업데이트 테스트
  40596. */
  40597. public function testSimpleUpdate()
  40598. {
  40599. try {
  40600. $mappingSeq = 2;
  40601. $processedBy = 8;
  40602. // 직접 SQL로 업데이트 시도
  40603. $db = \Config\Database::connect();
  40604. $sql = "UPDATE VENDOR_INFLUENCER_MAPPING SET APPROVED_BY = ? WHERE SEQ = ?";
  40605. try {
  40606. $result = $db->query($sql, [$processedBy, $mappingSeq]);
  40607. return $this->response->setJSON([
  40608. 'success' => true,
  40609. 'message' => '직접 SQL 업데이트 성공',
  40610. 'affected_rows' => $db->affectedRows()
  40611. ]);
  40612. } catch (\Exception $e) {
  40613. return $this->response->setJSON([
  40614. 'success' => false,
  40615. 'message' => '직접 SQL 업데이트 실패',
  40616. 'error' => $e->getMessage(),
  40617. 'sql_state' => $db->error()
  40618. ]);
  40619. }
  40620. } catch (\Exception $e) {
  40621. return $this->response->setStatusCode(500)->setJSON([
  40622. 'success' => false,
  40623. 'message' => '테스트 중 오류가 발생했습니다.',
  40624. 'error' => $e->getMessage()
  40625. ]);
  40626. }
  40627. }
  40628. /**
  40629. * 벤더사 데이터 확인 (디버그용)
  40630. */
  40631. public function checkVendors()
  40632. {
  40633. $vendorModel = new \App\Models\VendorModel();
  40634. // 전체 벤더사 수
  40635. $totalVendors = $vendorModel->countAllResults(false);
  40636. // 활성 벤더사 수
  40637. $activeVendors = $vendorModel->where('IS_ACT', 'Y')->countAllResults(false);
  40638. // 최근 5개 벤더사 데이터
  40639. $recentVendors = $vendorModel
  40640. ->where('IS_ACT', 'Y')
  40641. ->orderBy('REG_DATE', 'DESC')
  40642. ->limit(5)
  40643. ->findAll();
  40644. // 벤더사 상태별 분포
  40645. $statusDistribution = $vendorModel
  40646. ->select('IS_ACT, COUNT(*) as count')
  40647. ->groupBy('IS_ACT')
  40648. ->findAll();
  40649. return $this->response->setJSON([
  40650. 'success' => true,
  40651. 'data' => [
  40652. 'total_vendors' => $totalVendors,
  40653. 'active_vendors' => $activeVendors,
  40654. 'recent_vendors' => $recentVendors,
  40655. 'status_distribution' => $statusDistribution,
  40656. 'sample_fields' => array_keys($recentVendors[0] ?? [])
  40657. ]
  40658. ]);
  40659. }
  40660. }
  40661. </file>
  40662. <file path="backend/app/Models/InfluencerPartnershipModel.php">
  40663. <?php
  40664. namespace App\Models;
  40665. use CodeIgniter\Model;
  40666. class InfluencerPartnershipModel extends Model
  40667. {
  40668. protected $table = 'VENDOR_INFLUENCER_MAPPING';
  40669. protected $primaryKey = 'SEQ';
  40670. protected $useAutoIncrement = true;
  40671. protected $returnType = 'array';
  40672. protected $useSoftDeletes = false;
  40673. protected $allowedFields = [
  40674. 'VENDOR_SEQ',
  40675. 'INFLUENCER_SEQ',
  40676. 'REQUEST_TYPE',
  40677. 'REQUEST_MESSAGE',
  40678. 'RESPONSE_MESSAGE',
  40679. 'REQUESTED_BY',
  40680. 'APPROVED_BY',
  40681. 'COMMISSION_RATE',
  40682. 'SPECIAL_CONDITIONS',
  40683. 'EXPIRED_DATE',
  40684. 'REQUEST_DATE',
  40685. 'RESPONSE_DATE',
  40686. 'PARTNERSHIP_START_DATE',
  40687. 'PARTNERSHIP_END_DATE',
  40688. 'ADD_INFO1',
  40689. 'ADD_INFO2',
  40690. 'ADD_INFO3',
  40691. 'IS_ACT'
  40692. ];
  40693. protected $useTimestamps = true;
  40694. protected $createdField = 'REG_DATE';
  40695. protected $updatedField = 'MOD_DATE';
  40696. protected $dateFormat = 'datetime';
  40697. protected $validationRules = [
  40698. 'VENDOR_SEQ' => 'required|integer',
  40699. 'INFLUENCER_SEQ' => 'required|integer',
  40700. 'REQUEST_TYPE' => 'required|in_list[INFLUENCER_REQUEST,VENDOR_PROPOSAL,INFLUENCER_REAPPLY]',
  40701. 'REQUESTED_BY' => 'required|integer',
  40702. 'COMMISSION_RATE' => 'permit_empty|decimal|greater_than_equal_to[0]|less_than_equal_to[100]',
  40703. 'IS_ACT' => 'required|in_list[Y,N]'
  40704. ];
  40705. // 히스토리 모델
  40706. protected $statusHistoryModel;
  40707. protected $mappingModel;
  40708. public function __construct()
  40709. {
  40710. parent::__construct();
  40711. $this->statusHistoryModel = new VendorInfluencerStatusHistoryModel();
  40712. $this->mappingModel = new VendorInfluencerMappingModel();
  40713. }
  40714. /**
  40715. * 인플루언서의 파트너십 목록 조회
  40716. */
  40717. public function getInfluencerPartnerships($influencerSeq, $filters = [])
  40718. {
  40719. $builder = $this->db->table('VENDOR_INFLUENCER_MAPPING vim');
  40720. $builder->select('
  40721. vim.*,
  40722. vsh.STATUS as CURRENT_STATUS,
  40723. vsh.STATUS_MESSAGE as CURRENT_STATUS_MESSAGE,
  40724. vsh.CHANGED_DATE as STATUS_CHANGED_DATE,
  40725. v.COMPANY_NAME as VENDOR_NAME,
  40726. v.COMPANY_EMAIL as VENDOR_EMAIL,
  40727. v.COMPANY_PHONE as VENDOR_PHONE,
  40728. v.LOGO_IMAGE as VENDOR_LOGO,
  40729. v.CATEGORY as VENDOR_CATEGORY,
  40730. v.REGION as VENDOR_REGION,
  40731. v.DESCRIPTION as VENDOR_DESCRIPTION,
  40732. v.RATING as VENDOR_RATING
  40733. ');
  40734. $builder->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh',
  40735. 'vsh.MAPPING_SEQ = vim.SEQ AND vsh.IS_CURRENT = "Y"', 'left');
  40736. $builder->join('VENDOR_LIST v', 'v.SEQ = vim.VENDOR_SEQ', 'left');
  40737. $builder->where('vim.INFLUENCER_SEQ', $influencerSeq);
  40738. $builder->where('vim.IS_ACT', 'Y');
  40739. // 상태 필터
  40740. if (isset($filters['status'])) {
  40741. if (is_array($filters['status'])) {
  40742. $builder->whereIn('vsh.STATUS', $filters['status']);
  40743. } else {
  40744. $builder->where('vsh.STATUS', $filters['status']);
  40745. }
  40746. }
  40747. // 요청 타입 필터
  40748. if (isset($filters['request_type'])) {
  40749. $builder->where('vim.REQUEST_TYPE', $filters['request_type']);
  40750. }
  40751. // 기간 필터
  40752. if (isset($filters['start_date'])) {
  40753. $builder->where('vim.REG_DATE >=', $filters['start_date']);
  40754. }
  40755. if (isset($filters['end_date'])) {
  40756. $builder->where('vim.REG_DATE <=', $filters['end_date']);
  40757. }
  40758. // 벤더사 카테고리 필터
  40759. if (isset($filters['vendor_category'])) {
  40760. $builder->where('v.CATEGORY', $filters['vendor_category']);
  40761. }
  40762. // 재승인 요청 필터
  40763. if (isset($filters['is_reapply'])) {
  40764. $builder->where('vim.ADD_INFO1', 'REAPPLY');
  40765. }
  40766. $builder->orderBy('vim.REG_DATE', 'DESC');
  40767. return $builder;
  40768. }
  40769. /**
  40770. * 승인 요청 생성
  40771. */
  40772. public function createApprovalRequest($data)
  40773. {
  40774. // 중복 요청 확인
  40775. $existing = $this->mappingModel->checkExistingPendingRequest(
  40776. $data['VENDOR_SEQ'],
  40777. $data['INFLUENCER_SEQ']
  40778. );
  40779. if ($existing) {
  40780. throw new \Exception('이미 처리 중인 요청이 있습니다.');
  40781. }
  40782. $insertData = array_merge($data, [
  40783. 'REQUEST_TYPE' => 'INFLUENCER_REQUEST',
  40784. 'REQUEST_DATE' => date('Y-m-d H:i:s'),
  40785. 'IS_ACT' => 'Y'
  40786. ]);
  40787. // mappingModel을 사용하여 insert (콜백 자동 실행)
  40788. return $this->mappingModel->insert($insertData);
  40789. }
  40790. /**
  40791. * 재승인 요청 생성
  40792. */
  40793. public function createReapplyRequest($data)
  40794. {
  40795. // 재승인 가능한 파트너십 확인
  40796. $terminated = $this->mappingModel->checkReapplyEligiblePartnership(
  40797. $data['VENDOR_SEQ'],
  40798. $data['INFLUENCER_SEQ']
  40799. );
  40800. if (!$terminated) {
  40801. throw new \Exception('해지된 파트너십이 없어 재승인을 요청할 수 없습니다.');
  40802. }
  40803. // 이미 재승인 요청 중인지 확인
  40804. $existingReapply = $this->mappingModel->checkExistingPendingRequest(
  40805. $data['VENDOR_SEQ'],
  40806. $data['INFLUENCER_SEQ']
  40807. );
  40808. if ($existingReapply) {
  40809. throw new \Exception('이미 재승인 요청이 진행 중입니다.');
  40810. }
  40811. $insertData = array_merge($data, [
  40812. 'REQUEST_TYPE' => 'INFLUENCER_REAPPLY',
  40813. 'REQUEST_DATE' => date('Y-m-d H:i:s'),
  40814. 'ADD_INFO1' => 'REAPPLY',
  40815. 'ADD_INFO2' => $terminated['SEQ'], // 이전 파트너십 SEQ
  40816. 'ADD_INFO3' => date('Y-m-d H:i:s'), // 재신청 일시
  40817. 'COMMISSION_RATE' => $data['COMMISSION_RATE'] ?? $terminated['COMMISSION_RATE'],
  40818. 'SPECIAL_CONDITIONS' => $data['SPECIAL_CONDITIONS'] ?? $terminated['SPECIAL_CONDITIONS'],
  40819. 'IS_ACT' => 'Y'
  40820. ]);
  40821. // mappingModel을 사용하여 insert (콜백 자동 실행)
  40822. return $this->mappingModel->insert($insertData);
  40823. }
  40824. /**
  40825. * 파트너십 해지 (인플루언서가 해지)
  40826. */
  40827. public function terminateByInfluencer($mappingSeq, $influencerSeq, $reason = '')
  40828. {
  40829. $partnership = $this->mappingModel->getBasicMapping($mappingSeq);
  40830. if (!$partnership) {
  40831. throw new \Exception('파트너십을 찾을 수 없습니다.');
  40832. }
  40833. if ($partnership['INFLUENCER_SEQ'] != $influencerSeq) {
  40834. throw new \Exception('본인의 파트너십만 해지할 수 있습니다.');
  40835. }
  40836. // 현재 상태 확인
  40837. $currentStatus = $this->statusHistoryModel->getCurrentStatus($mappingSeq);
  40838. if (!$currentStatus || $currentStatus['STATUS'] !== 'APPROVED') {
  40839. throw new \Exception('승인된 파트너십만 해지할 수 있습니다.');
  40840. }
  40841. // 상태를 TERMINATED로 변경
  40842. $statusResult = $this->statusHistoryModel->changeStatus(
  40843. $mappingSeq,
  40844. 'TERMINATED',
  40845. $reason,
  40846. $influencerSeq
  40847. );
  40848. // 파트너십 종료일 설정
  40849. $this->update($mappingSeq, [
  40850. 'PARTNERSHIP_END_DATE' => date('Y-m-d H:i:s'),
  40851. 'ADD_INFO1' => $reason, // 해지 사유
  40852. 'ADD_INFO2' => $influencerSeq // 해지 처리자
  40853. ]);
  40854. return $statusResult;
  40855. }
  40856. /**
  40857. * 인플루언서 통계 조회
  40858. */
  40859. public function getInfluencerStats($influencerSeq)
  40860. {
  40861. $stats = [];
  40862. // 전체 파트너십 수
  40863. $stats['total_partnerships'] = $this->where('INFLUENCER_SEQ', $influencerSeq)
  40864. ->where('IS_ACT', 'Y')
  40865. ->countAllResults();
  40866. // 상태별 통계는 히스토리 모델에서 조회
  40867. $statusStats = $this->statusHistoryModel->getStatusStatsByInfluencer($influencerSeq);
  40868. $statusCounts = [];
  40869. foreach ($statusStats as $stat) {
  40870. $statusCounts[$stat['STATUS']] = $stat['count'];
  40871. }
  40872. $stats['approved_partnerships'] = $statusCounts['APPROVED'] ?? 0;
  40873. $stats['active_partnerships'] = $statusCounts['APPROVED'] ?? 0;
  40874. $stats['terminated_partnerships'] = $statusCounts['TERMINATED'] ?? 0;
  40875. $stats['pending_requests'] = $statusCounts['PENDING'] ?? 0;
  40876. $stats['rejected_requests'] = $statusCounts['REJECTED'] ?? 0;
  40877. // 평균 커미션율
  40878. $avgCommission = $this->db->table('VENDOR_INFLUENCER_MAPPING vim')
  40879. ->select('AVG(vim.COMMISSION_RATE) as avg_rate')
  40880. ->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh',
  40881. 'vsh.MAPPING_SEQ = vim.SEQ AND vsh.IS_CURRENT = "Y"')
  40882. ->where('vim.INFLUENCER_SEQ', $influencerSeq)
  40883. ->where('vsh.STATUS', 'APPROVED')
  40884. ->where('vim.IS_ACT', 'Y')
  40885. ->get()
  40886. ->getRowArray();
  40887. $stats['avg_commission_rate'] = round($avgCommission['avg_rate'] ?? 0, 2);
  40888. // 카테고리별 파트너십 분포
  40889. $stats['category_distribution'] = $this->db->table('VENDOR_INFLUENCER_MAPPING vim')
  40890. ->select('v.CATEGORY, COUNT(*) as count')
  40891. ->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh',
  40892. 'vsh.MAPPING_SEQ = vim.SEQ AND vsh.IS_CURRENT = "Y"')
  40893. ->join('VENDOR_LIST v', 'v.SEQ = vim.VENDOR_SEQ', 'left')
  40894. ->where('vim.INFLUENCER_SEQ', $influencerSeq)
  40895. ->where('vsh.STATUS', 'APPROVED')
  40896. ->where('vim.IS_ACT', 'Y')
  40897. ->groupBy('v.CATEGORY')
  40898. ->get()
  40899. ->getResultArray();
  40900. // 최근 6개월 월별 파트너십 생성 수
  40901. $stats['monthly_partnerships'] = $this->db->table('VENDOR_INFLUENCER_MAPPING vim')
  40902. ->select('DATE_FORMAT(vim.PARTNERSHIP_START_DATE, "%Y-%m") as month, COUNT(*) as count')
  40903. ->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh',
  40904. 'vsh.MAPPING_SEQ = vim.SEQ AND vsh.IS_CURRENT = "Y"')
  40905. ->where('vim.INFLUENCER_SEQ', $influencerSeq)
  40906. ->where('vsh.STATUS', 'APPROVED')
  40907. ->where('vim.PARTNERSHIP_START_DATE >=', date('Y-m-d', strtotime('-6 months')))
  40908. ->where('vim.IS_ACT', 'Y')
  40909. ->groupBy('month')
  40910. ->orderBy('month', 'ASC')
  40911. ->get()
  40912. ->getResultArray();
  40913. return $stats;
  40914. }
  40915. /**
  40916. * 인플루언서의 현재 활성 파트너십 조회
  40917. */
  40918. public function getActivePartnerships($influencerSeq)
  40919. {
  40920. return $this->getInfluencerPartnerships($influencerSeq, [
  40921. 'status' => 'APPROVED'
  40922. ])->get()->getResultArray();
  40923. }
  40924. /**
  40925. * 인플루언서의 요청 이력 조회
  40926. */
  40927. public function getRequestHistory($influencerSeq, $limit = 10)
  40928. {
  40929. return $this->getInfluencerPartnerships($influencerSeq)
  40930. ->limit($limit)
  40931. ->get()
  40932. ->getResultArray();
  40933. }
  40934. /**
  40935. * 재승인 가능한 벤더사 목록 조회
  40936. */
  40937. public function getReapplyableVendors($influencerSeq)
  40938. {
  40939. return $this->db->table('VENDOR_INFLUENCER_MAPPING vim')
  40940. ->select('
  40941. DISTINCT v.SEQ, v.COMPANY_NAME, v.LOGO_IMAGE, v.CATEGORY,
  40942. vim.COMMISSION_RATE, vim.SPECIAL_CONDITIONS, vim.PARTNERSHIP_END_DATE
  40943. ')
  40944. ->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh',
  40945. 'vsh.MAPPING_SEQ = vim.SEQ AND vsh.IS_CURRENT = "Y"')
  40946. ->join('VENDOR_LIST v', 'v.SEQ = vim.VENDOR_SEQ', 'left')
  40947. ->where('vim.INFLUENCER_SEQ', $influencerSeq)
  40948. ->where('vsh.STATUS', 'TERMINATED')
  40949. ->where('vim.IS_ACT', 'Y')
  40950. ->where('v.IS_ACT', 'Y')
  40951. ->whereNotIn('vim.VENDOR_SEQ', function($builder) use ($influencerSeq) {
  40952. // 현재 재승인 요청 중인 벤더사 제외
  40953. return $builder->select('vim2.VENDOR_SEQ')
  40954. ->from('VENDOR_INFLUENCER_MAPPING vim2')
  40955. ->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh2',
  40956. 'vsh2.MAPPING_SEQ = vim2.SEQ AND vsh2.IS_CURRENT = "Y"')
  40957. ->where('vim2.INFLUENCER_SEQ', $influencerSeq)
  40958. ->where('vsh2.STATUS', 'PENDING')
  40959. ->where('vim2.ADD_INFO1', 'REAPPLY')
  40960. ->where('vim2.IS_ACT', 'Y');
  40961. })
  40962. ->orderBy('vim.PARTNERSHIP_END_DATE', 'DESC')
  40963. ->get()
  40964. ->getResultArray();
  40965. }
  40966. /**
  40967. * 파트너십 상세 정보 조회
  40968. */
  40969. public function getPartnershipDetail($mappingSeq, $influencerSeq)
  40970. {
  40971. return $this->db->table('VENDOR_INFLUENCER_MAPPING vim')
  40972. ->select('
  40973. vim.*,
  40974. vsh.STATUS as CURRENT_STATUS,
  40975. vsh.STATUS_MESSAGE as CURRENT_STATUS_MESSAGE,
  40976. vsh.CHANGED_DATE as STATUS_CHANGED_DATE,
  40977. v.COMPANY_NAME, v.COMPANY_EMAIL, v.COMPANY_PHONE,
  40978. v.LOGO_IMAGE, v.CATEGORY, v.REGION, v.DESCRIPTION,
  40979. v.RATING as VENDOR_RATING,
  40980. u.NICK_NAME as REQUESTED_BY_NAME
  40981. ')
  40982. ->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh',
  40983. 'vsh.MAPPING_SEQ = vim.SEQ AND vsh.IS_CURRENT = "Y"', 'left')
  40984. ->join('VENDOR_LIST v', 'v.SEQ = vim.VENDOR_SEQ', 'left')
  40985. ->join('USER_LIST u', 'u.SEQ = vim.REQUESTED_BY', 'left')
  40986. ->where('vim.SEQ', $mappingSeq)
  40987. ->where('vim.INFLUENCER_SEQ', $influencerSeq)
  40988. ->where('vim.IS_ACT', 'Y')
  40989. ->first();
  40990. }
  40991. }
  40992. </file>
  40993. <file path="backend/app/Models/VendorModel.php">
  40994. <?php
  40995. namespace App\Models;
  40996. use CodeIgniter\Model;
  40997. class VendorModel extends Model
  40998. {
  40999. protected $table = 'VENDOR_LIST';
  41000. protected $primaryKey = 'SEQ';
  41001. protected $useAutoIncrement = true;
  41002. protected $returnType = 'array';
  41003. protected $useSoftDeletes = false;
  41004. protected $allowedFields = [
  41005. 'COMPANY_NAME',
  41006. 'EMAIL',
  41007. 'CATEGORY',
  41008. 'REGION',
  41009. 'DESCRIPTION',
  41010. 'LOGO',
  41011. 'TAGS',
  41012. 'APPROVAL_STATUS',
  41013. 'APPROVED_DATE',
  41014. 'IS_ACT',
  41015. 'REG_DATE',
  41016. 'MOD_DATE',
  41017. 'LAST_LOGIN_DATE',
  41018. 'PASSWORD',
  41019. 'PHONE',
  41020. 'ADDRESS',
  41021. 'BUSINESS_NUMBER',
  41022. 'CEO_NAME',
  41023. 'ESTABLISHMENT_DATE'
  41024. ];
  41025. protected $useTimestamps = true;
  41026. protected $createdField = 'REG_DATE';
  41027. protected $updatedField = 'MOD_DATE';
  41028. protected $validationRules = [
  41029. 'COMPANY_NAME' => 'required|max_length[255]',
  41030. 'EMAIL' => 'required|valid_email|is_unique[VENDOR_LIST.EMAIL,SEQ,{SEQ}]',
  41031. 'CATEGORY' => 'permit_empty|in_list[FASHION_BEAUTY,FOOD_HEALTH,LIFESTYLE,TECH_ELECTRONICS,SPORTS_LEISURE,CULTURE_ENTERTAINMENT]',
  41032. 'REGION' => 'permit_empty|in_list[SEOUL,GYEONGGI,INCHEON,BUSAN,DAEGU,DAEJEON,GWANGJU,ULSAN,OTHER]',
  41033. 'APPROVAL_STATUS' => 'permit_empty|in_list[PENDING,APPROVED,REJECTED]',
  41034. 'IS_ACT' => 'required|in_list[Y,N]',
  41035. 'PHONE' => 'permit_empty|max_length[20]',
  41036. 'BUSINESS_NUMBER' => 'permit_empty|max_length[20]'
  41037. ];
  41038. protected $validationMessages = [
  41039. 'COMPANY_NAME' => [
  41040. 'required' => '회사명은 필수입니다.',
  41041. 'max_length' => '회사명은 255자를 초과할 수 없습니다.'
  41042. ],
  41043. 'EMAIL' => [
  41044. 'required' => '이메일은 필수입니다.',
  41045. 'valid_email' => '유효한 이메일 형식이 아닙니다.',
  41046. 'is_unique' => '이미 등록된 이메일입니다.'
  41047. ],
  41048. 'CATEGORY' => [
  41049. 'in_list' => '유효하지 않은 카테고리입니다.'
  41050. ],
  41051. 'REGION' => [
  41052. 'in_list' => '유효하지 않은 지역입니다.'
  41053. ],
  41054. 'APPROVAL_STATUS' => [
  41055. 'in_list' => '유효하지 않은 승인 상태입니다.'
  41056. ],
  41057. 'IS_ACT' => [
  41058. 'required' => '활성 상태는 필수입니다.',
  41059. 'in_list' => '활성 상태는 Y 또는 N이어야 합니다.'
  41060. ]
  41061. ];
  41062. protected $skipValidation = false;
  41063. protected $cleanValidationRules = true;
  41064. /**
  41065. * 벤더사 검색
  41066. */
  41067. public function searchVendors($filters = [], $page = 1, $perPage = 12)
  41068. {
  41069. $builder = $this->builder();
  41070. $builder->where('IS_ACT', 'Y');
  41071. // 키워드 검색
  41072. if (!empty($filters['keyword'])) {
  41073. $builder->groupStart()
  41074. ->like('COMPANY_NAME', $filters['keyword'])
  41075. ->orLike('DESCRIPTION', $filters['keyword'])
  41076. ->orLike('TAGS', $filters['keyword'])
  41077. ->groupEnd();
  41078. }
  41079. // 카테고리 필터
  41080. if (!empty($filters['category'])) {
  41081. $builder->where('CATEGORY', $filters['category']);
  41082. }
  41083. // 지역 필터
  41084. if (!empty($filters['region'])) {
  41085. $builder->where('REGION', $filters['region']);
  41086. }
  41087. // 정렬
  41088. switch ($filters['sortBy'] ?? 'latest') {
  41089. case 'partnership':
  41090. $builder->orderBy('PARTNERSHIP_COUNT', 'DESC')
  41091. ->orderBy('REG_DATE', 'DESC');
  41092. break;
  41093. case 'name':
  41094. $builder->orderBy('COMPANY_NAME', 'ASC');
  41095. break;
  41096. case 'latest':
  41097. default:
  41098. $builder->orderBy('REG_DATE', 'DESC');
  41099. break;
  41100. }
  41101. // 페이징
  41102. $offset = ($page - 1) * $perPage;
  41103. return $builder->limit($perPage, $offset)->get()->getResultArray();
  41104. }
  41105. /**
  41106. * 검색 결과 총 개수
  41107. */
  41108. public function countSearchResults($filters = [])
  41109. {
  41110. $builder = $this->builder();
  41111. $builder->where('IS_ACT', 'Y');
  41112. // 키워드 검색
  41113. if (!empty($filters['keyword'])) {
  41114. $builder->groupStart()
  41115. ->like('COMPANY_NAME', $filters['keyword'])
  41116. ->orLike('DESCRIPTION', $filters['keyword'])
  41117. ->orLike('TAGS', $filters['keyword'])
  41118. ->groupEnd();
  41119. }
  41120. // 카테고리 필터
  41121. if (!empty($filters['category'])) {
  41122. $builder->where('CATEGORY', $filters['category']);
  41123. }
  41124. // 지역 필터
  41125. if (!empty($filters['region'])) {
  41126. $builder->where('REGION', $filters['region']);
  41127. }
  41128. return $builder->countAllResults();
  41129. }
  41130. /**
  41131. * 활성 벤더사 목록
  41132. */
  41133. public function getActiveVendors()
  41134. {
  41135. return $this->where('IS_ACT', 'Y')
  41136. ->where('APPROVAL_STATUS', 'APPROVED')
  41137. ->orderBy('REG_DATE', 'DESC')
  41138. ->findAll();
  41139. }
  41140. /**
  41141. * 카테고리별 벤더사 통계
  41142. */
  41143. public function getCategoryStats()
  41144. {
  41145. return $this->select('CATEGORY, COUNT(*) as count')
  41146. ->where('IS_ACT', 'Y')
  41147. ->groupBy('CATEGORY')
  41148. ->findAll();
  41149. }
  41150. /**
  41151. * 지역별 벤더사 통계
  41152. */
  41153. public function getRegionStats()
  41154. {
  41155. return $this->select('REGION, COUNT(*) as count')
  41156. ->where('IS_ACT', 'Y')
  41157. ->groupBy('REGION')
  41158. ->findAll();
  41159. }
  41160. }
  41161. </file>
  41162. <file path="backend/app/Models/VendorPartnershipModel.php">
  41163. <?php
  41164. namespace App\Models;
  41165. use CodeIgniter\Model;
  41166. class VendorPartnershipModel extends Model
  41167. {
  41168. protected $table = 'VENDOR_INFLUENCER_MAPPING';
  41169. protected $primaryKey = 'SEQ';
  41170. protected $useAutoIncrement = true;
  41171. protected $returnType = 'array';
  41172. protected $useSoftDeletes = false;
  41173. protected $allowedFields = [
  41174. 'VENDOR_SEQ',
  41175. 'INFLUENCER_SEQ',
  41176. 'REQUEST_TYPE',
  41177. 'REQUEST_MESSAGE',
  41178. 'RESPONSE_MESSAGE',
  41179. 'REQUESTED_BY',
  41180. 'APPROVED_BY',
  41181. 'COMMISSION_RATE',
  41182. 'SPECIAL_CONDITIONS',
  41183. 'EXPIRED_DATE',
  41184. 'REQUEST_DATE',
  41185. 'RESPONSE_DATE',
  41186. 'PARTNERSHIP_START_DATE',
  41187. 'PARTNERSHIP_END_DATE',
  41188. 'ADD_INFO1',
  41189. 'ADD_INFO2',
  41190. 'ADD_INFO3',
  41191. 'IS_ACT'
  41192. ];
  41193. protected $useTimestamps = true;
  41194. protected $createdField = 'REG_DATE';
  41195. protected $updatedField = 'MOD_DATE';
  41196. protected $dateFormat = 'datetime';
  41197. protected $validationRules = [
  41198. 'VENDOR_SEQ' => 'required|integer',
  41199. 'INFLUENCER_SEQ' => 'required|integer',
  41200. 'REQUEST_TYPE' => 'required|in_list[INFLUENCER_REQUEST,VENDOR_PROPOSAL,INFLUENCER_REAPPLY]',
  41201. 'REQUESTED_BY' => 'required|integer',
  41202. 'COMMISSION_RATE' => 'permit_empty|decimal|greater_than_equal_to[0]|less_than_equal_to[100]',
  41203. 'IS_ACT' => 'required|in_list[Y,N]'
  41204. ];
  41205. // 히스토리 모델
  41206. protected $statusHistoryModel;
  41207. protected $mappingModel;
  41208. public function __construct()
  41209. {
  41210. parent::__construct();
  41211. $this->statusHistoryModel = new VendorInfluencerStatusHistoryModel();
  41212. $this->mappingModel = new VendorInfluencerMappingModel();
  41213. }
  41214. /**
  41215. * 벤더사의 인플루언서 요청 목록 조회 (페이지네이션 포함)
  41216. */
  41217. public function getVendorRequestsWithPagination($vendorSeq, $page = 1, $size = 20, $status = null)
  41218. {
  41219. $filters = [];
  41220. if ($status) {
  41221. $filters['status'] = $status;
  41222. }
  41223. $builder = $this->getVendorRequests($vendorSeq, $filters);
  41224. // 전체 개수 계산
  41225. $totalBuilder = clone $builder;
  41226. $total = $totalBuilder->countAllResults();
  41227. // 페이지네이션 적용
  41228. $offset = ($page - 1) * $size;
  41229. $builder->limit($size, $offset);
  41230. $data = $builder->get()->getResultArray();
  41231. return [
  41232. 'data' => $data,
  41233. 'pagination' => [
  41234. 'total' => $total,
  41235. 'currentPage' => $page,
  41236. 'totalPages' => ceil($total / $size),
  41237. 'limit' => $size,
  41238. 'offset' => $offset
  41239. ]
  41240. ];
  41241. }
  41242. /**
  41243. * 벤더사의 인플루언서 요청 목록 조회
  41244. */
  41245. public function getVendorRequests($vendorSeq, $filters = [])
  41246. {
  41247. $builder = $this->db->table('VENDOR_INFLUENCER_MAPPING vim');
  41248. $builder->select('
  41249. vim.*,
  41250. vsh.STATUS as CURRENT_STATUS,
  41251. vsh.STATUS_MESSAGE as CURRENT_STATUS_MESSAGE,
  41252. vsh.CHANGED_DATE as STATUS_CHANGED_DATE,
  41253. u.NICK_NAME as INFLUENCER_NAME,
  41254. u.NAME as INFLUENCER_REAL_NAME,
  41255. u.EMAIL as INFLUENCER_EMAIL,
  41256. u.PHONE as INFLUENCER_PHONE,
  41257. u.PROFILE_IMAGE,
  41258. u.FOLLOWER_COUNT,
  41259. u.ENGAGEMENT_RATE,
  41260. u.PRIMARY_CATEGORY,
  41261. u.INFLUENCER_TYPE,
  41262. u.REGION as INFLUENCER_REGION,
  41263. u.DESCRIPTION as INFLUENCER_DESCRIPTION,
  41264. u.RATING as INFLUENCER_RATING,
  41265. u.VERIFICATION_STATUS
  41266. ');
  41267. $builder->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh',
  41268. 'vsh.MAPPING_SEQ = vim.SEQ AND vsh.IS_CURRENT = "Y"', 'left');
  41269. $builder->join('USER_LIST u', 'u.SEQ = vim.INFLUENCER_SEQ', 'left');
  41270. $builder->where('vim.VENDOR_SEQ', $vendorSeq);
  41271. $builder->where('vim.IS_ACT', 'Y');
  41272. // 상태 필터
  41273. if (isset($filters['status'])) {
  41274. if (is_array($filters['status'])) {
  41275. $builder->whereIn('vsh.STATUS', $filters['status']);
  41276. } else {
  41277. $builder->where('vsh.STATUS', $filters['status']);
  41278. }
  41279. }
  41280. // 요청 타입 필터
  41281. if (isset($filters['request_type'])) {
  41282. $builder->where('vim.REQUEST_TYPE', $filters['request_type']);
  41283. }
  41284. // 인플루언서 타입 필터
  41285. if (isset($filters['influencer_type'])) {
  41286. $builder->where('u.INFLUENCER_TYPE', $filters['influencer_type']);
  41287. }
  41288. // 카테고리 필터
  41289. if (isset($filters['category'])) {
  41290. $builder->where('u.PRIMARY_CATEGORY', $filters['category']);
  41291. }
  41292. // 팔로워 수 필터
  41293. if (isset($filters['min_followers'])) {
  41294. $builder->where('u.FOLLOWER_COUNT >=', $filters['min_followers']);
  41295. }
  41296. if (isset($filters['max_followers'])) {
  41297. $builder->where('u.FOLLOWER_COUNT <=', $filters['max_followers']);
  41298. }
  41299. // 기간 필터
  41300. if (isset($filters['start_date'])) {
  41301. $builder->where('vim.REG_DATE >=', $filters['start_date']);
  41302. }
  41303. if (isset($filters['end_date'])) {
  41304. $builder->where('vim.REG_DATE <=', $filters['end_date']);
  41305. }
  41306. // 검증 상태 필터
  41307. if (isset($filters['verification_status'])) {
  41308. $builder->where('u.VERIFICATION_STATUS', $filters['verification_status']);
  41309. }
  41310. // 재승인 요청 필터
  41311. if (isset($filters['is_reapply'])) {
  41312. $builder->where('vim.ADD_INFO1', 'REAPPLY');
  41313. }
  41314. $builder->orderBy('vim.REG_DATE', 'DESC');
  41315. return $builder;
  41316. }
  41317. /**
  41318. * 요청 승인/거부 처리
  41319. */
  41320. public function processRequest($mappingSeq, $action, $processedBy, $responseMessage = '')
  41321. {
  41322. $partnership = $this->mappingModel->getBasicMapping($mappingSeq);
  41323. if (!$partnership) {
  41324. throw new \Exception('요청을 찾을 수 없습니다.');
  41325. }
  41326. // 현재 상태 확인
  41327. $currentStatus = $this->statusHistoryModel->getCurrentStatus($mappingSeq);
  41328. if (!$currentStatus || $currentStatus['STATUS'] !== 'PENDING') {
  41329. throw new \Exception('이미 처리된 요청입니다.');
  41330. }
  41331. $newStatus = ($action === 'approve') ? 'APPROVED' : 'REJECTED';
  41332. // 상태 변경
  41333. $statusResult = $this->statusHistoryModel->changeStatus(
  41334. $mappingSeq,
  41335. $newStatus,
  41336. $responseMessage,
  41337. $processedBy
  41338. );
  41339. $updateData = [
  41340. 'RESPONSE_MESSAGE' => $responseMessage,
  41341. 'APPROVED_BY' => $processedBy,
  41342. 'RESPONSE_DATE' => date('Y-m-d H:i:s')
  41343. ];
  41344. // 승인인 경우 파트너십 시작일 설정
  41345. if ($action === 'approve') {
  41346. $updateData['PARTNERSHIP_START_DATE'] = date('Y-m-d H:i:s');
  41347. }
  41348. $this->update($mappingSeq, $updateData);
  41349. return $statusResult;
  41350. }
  41351. /**
  41352. * 파트너십 해지 (벤더사가 해지)
  41353. */
  41354. public function terminateByVendor($mappingSeq, $vendorSeq, $reason = '')
  41355. {
  41356. $partnership = $this->mappingModel->getBasicMapping($mappingSeq);
  41357. if (!$partnership) {
  41358. throw new \Exception('파트너십을 찾을 수 없습니다.');
  41359. }
  41360. if ($partnership['VENDOR_SEQ'] != $vendorSeq) {
  41361. throw new \Exception('본인의 파트너십만 해지할 수 있습니다.');
  41362. }
  41363. // 현재 상태 확인
  41364. $currentStatus = $this->statusHistoryModel->getCurrentStatus($mappingSeq);
  41365. if (!$currentStatus || $currentStatus['STATUS'] !== 'APPROVED') {
  41366. throw new \Exception('승인된 파트너십만 해지할 수 있습니다.');
  41367. }
  41368. // 상태를 TERMINATED로 변경
  41369. $statusResult = $this->statusHistoryModel->changeStatus(
  41370. $mappingSeq,
  41371. 'TERMINATED',
  41372. $reason,
  41373. $vendorSeq
  41374. );
  41375. // 파트너십 종료일 설정
  41376. $this->update($mappingSeq, [
  41377. 'PARTNERSHIP_END_DATE' => date('Y-m-d H:i:s'),
  41378. 'ADD_INFO1' => $reason, // 해지 사유
  41379. 'ADD_INFO2' => $vendorSeq // 해지 처리자
  41380. ]);
  41381. return $statusResult;
  41382. }
  41383. /**
  41384. * 벤더사 통계 조회
  41385. */
  41386. public function getVendorStats($vendorSeq)
  41387. {
  41388. $stats = [];
  41389. // 전체 파트너십 수
  41390. $stats['total_partnerships'] = $this->where('VENDOR_SEQ', $vendorSeq)
  41391. ->where('IS_ACT', 'Y')
  41392. ->countAllResults();
  41393. // 상태별 통계는 히스토리 모델에서 조회
  41394. $statusStats = $this->statusHistoryModel->getStatusStatsByVendor($vendorSeq);
  41395. $statusCounts = [];
  41396. foreach ($statusStats as $stat) {
  41397. $statusCounts[$stat['STATUS']] = $stat['count'];
  41398. }
  41399. $stats['approved_partnerships'] = $statusCounts['APPROVED'] ?? 0;
  41400. $stats['active_partnerships'] = $statusCounts['APPROVED'] ?? 0;
  41401. $stats['terminated_partnerships'] = $statusCounts['TERMINATED'] ?? 0;
  41402. $stats['pending_requests'] = $statusCounts['PENDING'] ?? 0;
  41403. $stats['rejected_requests'] = $statusCounts['REJECTED'] ?? 0;
  41404. // 재승인 요청 수
  41405. $stats['reapply_requests'] = $this->db->table('VENDOR_INFLUENCER_MAPPING vim')
  41406. ->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh',
  41407. 'vsh.MAPPING_SEQ = vim.SEQ AND vsh.IS_CURRENT = "Y"')
  41408. ->where('vim.VENDOR_SEQ', $vendorSeq)
  41409. ->where('vsh.STATUS', 'PENDING')
  41410. ->where('vim.ADD_INFO1', 'REAPPLY')
  41411. ->where('vim.IS_ACT', 'Y')
  41412. ->countAllResults();
  41413. // 평균 커미션율
  41414. $avgCommission = $this->db->table('VENDOR_INFLUENCER_MAPPING vim')
  41415. ->select('AVG(vim.COMMISSION_RATE) as avg_rate')
  41416. ->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh',
  41417. 'vsh.MAPPING_SEQ = vim.SEQ AND vsh.IS_CURRENT = "Y"')
  41418. ->where('vim.VENDOR_SEQ', $vendorSeq)
  41419. ->where('vsh.STATUS', 'APPROVED')
  41420. ->where('vim.IS_ACT', 'Y')
  41421. ->get()
  41422. ->getRowArray();
  41423. $stats['avg_commission_rate'] = round($avgCommission['avg_rate'] ?? 0, 2);
  41424. // 인플루언서 타입별 분포
  41425. $stats['influencer_type_distribution'] = $this->db->table('VENDOR_INFLUENCER_MAPPING vim')
  41426. ->select('u.INFLUENCER_TYPE, COUNT(*) as count')
  41427. ->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh',
  41428. 'vsh.MAPPING_SEQ = vim.SEQ AND vsh.IS_CURRENT = "Y"')
  41429. ->join('USER_LIST u', 'u.SEQ = vim.INFLUENCER_SEQ', 'left')
  41430. ->where('vim.VENDOR_SEQ', $vendorSeq)
  41431. ->where('vsh.STATUS', 'APPROVED')
  41432. ->where('vim.IS_ACT', 'Y')
  41433. ->groupBy('u.INFLUENCER_TYPE')
  41434. ->get()
  41435. ->getResultArray();
  41436. // 카테고리별 인플루언서 분포
  41437. $stats['category_distribution'] = $this->db->table('VENDOR_INFLUENCER_MAPPING vim')
  41438. ->select('u.PRIMARY_CATEGORY, COUNT(*) as count')
  41439. ->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh',
  41440. 'vsh.MAPPING_SEQ = vim.SEQ AND vsh.IS_CURRENT = "Y"')
  41441. ->join('USER_LIST u', 'u.SEQ = vim.INFLUENCER_SEQ', 'left')
  41442. ->where('vim.VENDOR_SEQ', $vendorSeq)
  41443. ->where('vsh.STATUS', 'APPROVED')
  41444. ->where('vim.IS_ACT', 'Y')
  41445. ->groupBy('u.PRIMARY_CATEGORY')
  41446. ->get()
  41447. ->getResultArray();
  41448. // 월별 파트너십 생성 추이 (최근 12개월)
  41449. $stats['monthly_partnerships'] = $this->db->table('VENDOR_INFLUENCER_MAPPING vim')
  41450. ->select('DATE_FORMAT(vim.PARTNERSHIP_START_DATE, "%Y-%m") as month, COUNT(*) as count')
  41451. ->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh',
  41452. 'vsh.MAPPING_SEQ = vim.SEQ AND vsh.IS_CURRENT = "Y"')
  41453. ->where('vim.VENDOR_SEQ', $vendorSeq)
  41454. ->where('vsh.STATUS', 'APPROVED')
  41455. ->where('vim.PARTNERSHIP_START_DATE >=', date('Y-m-d', strtotime('-12 months')))
  41456. ->where('vim.IS_ACT', 'Y')
  41457. ->groupBy('month')
  41458. ->orderBy('month', 'ASC')
  41459. ->get()
  41460. ->getResultArray();
  41461. // 인플루언서별 성과 상위 10명
  41462. $stats['top_influencers'] = $this->db->table('VENDOR_INFLUENCER_MAPPING vim')
  41463. ->select('
  41464. u.SEQ, u.NICK_NAME, u.PROFILE_IMAGE, u.FOLLOWER_COUNT,
  41465. u.ENGAGEMENT_RATE, vim.COMMISSION_RATE, vim.PARTNERSHIP_START_DATE
  41466. ')
  41467. ->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh',
  41468. 'vsh.MAPPING_SEQ = vim.SEQ AND vsh.IS_CURRENT = "Y"')
  41469. ->join('USER_LIST u', 'u.SEQ = vim.INFLUENCER_SEQ', 'left')
  41470. ->where('vim.VENDOR_SEQ', $vendorSeq)
  41471. ->where('vsh.STATUS', 'APPROVED')
  41472. ->where('vim.IS_ACT', 'Y')
  41473. ->orderBy('u.FOLLOWER_COUNT', 'DESC')
  41474. ->orderBy('u.ENGAGEMENT_RATE', 'DESC')
  41475. ->limit(10)
  41476. ->get()
  41477. ->getResultArray();
  41478. return $stats;
  41479. }
  41480. /**
  41481. * 벤더사의 현재 활성 파트너십 조회
  41482. */
  41483. public function getActivePartnerships($vendorSeq)
  41484. {
  41485. return $this->getVendorRequests($vendorSeq, [
  41486. 'status' => 'APPROVED'
  41487. ])->get()->getResultArray();
  41488. }
  41489. /**
  41490. * 새로운 요청 알림 조회
  41491. */
  41492. public function getNewRequests($vendorSeq, $days = 7)
  41493. {
  41494. $fromDate = date('Y-m-d H:i:s', strtotime("-{$days} days"));
  41495. return $this->getVendorRequests($vendorSeq, [
  41496. 'status' => 'PENDING',
  41497. 'start_date' => $fromDate
  41498. ])->get()->getResultArray();
  41499. }
  41500. /**
  41501. * 재승인 요청 목록 조회
  41502. */
  41503. public function getReapplyRequests($vendorSeq)
  41504. {
  41505. return $this->getVendorRequests($vendorSeq, [
  41506. 'status' => 'PENDING',
  41507. 'is_reapply' => true
  41508. ])->get()->getResultArray();
  41509. }
  41510. /**
  41511. * 요청 상세 정보 조회
  41512. */
  41513. public function getRequestDetail($mappingSeq, $vendorSeq)
  41514. {
  41515. return $this->db->table('VENDOR_INFLUENCER_MAPPING vim')
  41516. ->select('
  41517. vim.*,
  41518. vsh.STATUS as CURRENT_STATUS,
  41519. vsh.STATUS_MESSAGE as CURRENT_STATUS_MESSAGE,
  41520. vsh.CHANGED_DATE as STATUS_CHANGED_DATE,
  41521. u.NICK_NAME, u.NAME, u.EMAIL, u.PHONE, u.PROFILE_IMAGE,
  41522. u.FOLLOWER_COUNT, u.ENGAGEMENT_RATE, u.PRIMARY_CATEGORY,
  41523. u.INFLUENCER_TYPE, u.REGION, u.DESCRIPTION,
  41524. u.RATING as INFLUENCER_RATING, u.VERIFICATION_STATUS,
  41525. u.SNS_CHANNELS, u.PORTFOLIO_URL,
  41526. requester.NICK_NAME as REQUESTED_BY_NAME
  41527. ')
  41528. ->join('VENDOR_INFLUENCER_STATUS_HISTORY vsh',
  41529. 'vsh.MAPPING_SEQ = vim.SEQ AND vsh.IS_CURRENT = "Y"', 'left')
  41530. ->join('USER_LIST u', 'u.SEQ = vim.INFLUENCER_SEQ', 'left')
  41531. ->join('USER_LIST requester', 'requester.SEQ = vim.REQUESTED_BY', 'left')
  41532. ->where('vim.SEQ', $mappingSeq)
  41533. ->where('vim.VENDOR_SEQ', $vendorSeq)
  41534. ->where('vim.IS_ACT', 'Y')
  41535. ->first();
  41536. }
  41537. /**
  41538. * 인플루언서 제안 생성 (벤더사가 먼저 제안)
  41539. */
  41540. public function createVendorProposal($data)
  41541. {
  41542. // 중복 제안 확인
  41543. $existing = $this->mappingModel->getExistingMapping(
  41544. $data['VENDOR_SEQ'],
  41545. $data['INFLUENCER_SEQ'],
  41546. ['TERMINATED', 'REJECTED', 'CANCELLED']
  41547. );
  41548. if (!empty($existing)) {
  41549. throw new \Exception('이미 진행 중인 파트너십이나 제안이 있습니다.');
  41550. }
  41551. $insertData = array_merge($data, [
  41552. 'REQUEST_TYPE' => 'VENDOR_PROPOSAL',
  41553. 'REQUEST_DATE' => date('Y-m-d H:i:s'),
  41554. 'IS_ACT' => 'Y'
  41555. ]);
  41556. return $this->insert($insertData);
  41557. }
  41558. /**
  41559. * 만료 예정 파트너십 조회
  41560. */
  41561. public function getExpiringPartnerships($vendorSeq, $days = 30)
  41562. {
  41563. $expireDate = date('Y-m-d H:i:s', strtotime("+{$days} days"));
  41564. return $this->getVendorRequests($vendorSeq, [
  41565. 'status' => 'APPROVED'
  41566. ])
  41567. ->where('vim.EXPIRED_DATE <=', $expireDate)
  41568. ->where('vim.EXPIRED_DATE IS NOT NULL')
  41569. ->get()
  41570. ->getResultArray();
  41571. }
  41572. /**
  41573. * 벤더사별 인플루언서 추천 점수 계산
  41574. */
  41575. public function getInfluencerRecommendationScore($vendorSeq, $influencerSeq)
  41576. {
  41577. // 벤더사와 인플루언서 정보 조회는 각각의 모델에서 처리
  41578. $vendorModel = new \App\Models\VendorModel();
  41579. $influencerModel = new \App\Models\InfluencerModel();
  41580. $vendor = $vendorModel->find($vendorSeq);
  41581. $influencer = $influencerModel->getProfile($influencerSeq);
  41582. if (!$vendor || !$influencer) {
  41583. return 0;
  41584. }
  41585. $score = 0;
  41586. // 카테고리 일치도 (40점)
  41587. if ($vendor['CATEGORY'] === $influencer['PRIMARY_CATEGORY']) {
  41588. $score += 40;
  41589. } elseif ($vendor['CATEGORY'] === $influencer['SECONDARY_CATEGORY']) {
  41590. $score += 20;
  41591. }
  41592. // 지역 일치도 (20점)
  41593. if ($vendor['REGION'] === $influencer['REGION']) {
  41594. $score += 20;
  41595. }
  41596. // 인플루언서 등급 (20점)
  41597. switch ($influencer['INFLUENCER_TYPE']) {
  41598. case 'MEGA':
  41599. $score += 20;
  41600. break;
  41601. case 'MACRO':
  41602. $score += 15;
  41603. break;
  41604. case 'MICRO':
  41605. $score += 10;
  41606. break;
  41607. case 'NANO':
  41608. $score += 5;
  41609. break;
  41610. }
  41611. // 인플루언서 평점 (10점)
  41612. $score += ($influencer['RATING'] ?? 0) * 2;
  41613. // 검증 상태 (10점)
  41614. if ($influencer['VERIFICATION_STATUS'] === 'VERIFIED') {
  41615. $score += 10;
  41616. }
  41617. return min(100, $score); // 최대 100점
  41618. }
  41619. }
  41620. </file>
  41621. <file path="backend/README.md">
  41622. # 백엔드 아키텍처 분리 완료 보고서
  41623. ## 📋 개요
  41624. 인플루언서-벤더사 플랫폼의 백엔드 아키텍처를 역할별로 분리하여 코드의 가독성, 유지보수성, 확장성을 대폭 개선했습니다.
  41625. ## 🎯 분리 목표
  41626. - **명확한 책임 분리**: 인플루언서와 벤더사 기능을 각각 전용 컨트롤러/모델로 분리
  41627. - **코드 재사용성 향상**: 각 역할에 특화된 메서드 제공
  41628. - **유지보수성 개선**: 기능별 독립적 수정 가능
  41629. - **성능 최적화**: 필요한 기능만 로드하여 메모리 사용량 감소
  41630. ## 🏗️ 새로운 아키텍처 구조
  41631. ### Controllers (컨트롤러)
  41632. ```
  41633. backend/app/Controllers/
  41634. ├── InfluencerController.php # 인플루언서 전용 컨트롤러
  41635. ├── VendorController.php # 벤더사 전용 컨트롤러
  41636. ├── Auth.php # 인증 관련 (기존 유지)
  41637. ├── Roulette.php # 기타 기능 (기존 유지)
  41638. └── DebugController.php # 디버그 기능 (기존 유지)
  41639. ```
  41640. ### Models (모델)
  41641. ```
  41642. backend/app/Models/
  41643. ├── InfluencerModel.php # 인플루언서 프로필 관리
  41644. ├── InfluencerPartnershipModel.php # 인플루언서 파트너십 관리
  41645. ├── VendorModel.php # 벤더사 정보 관리 (기존 유지)
  41646. └── VendorPartnershipModel.php # 벤더사 파트너십 관리
  41647. ```
  41648. ## 🔄 분리 전후 비교
  41649. ### 분리 전 (Before)
  41650. | 파일명 | 라인 수 | 문제점 |
  41651. |--------|---------|---------|
  41652. | `VendorInfluencerController.php` | 923줄 | 인플루언서/벤더사 기능 혼재 |
  41653. | `UserModel.php` | 223줄 | 일반 사용자와 인플루언서 기능 혼재 |
  41654. | `VendorInfluencerMappingModel.php` | 152줄 | 양방향 파트너십 로직 혼재 |
  41655. ### 분리 후 (After)
  41656. | 파일명 | 라인 수 | 특징 |
  41657. |--------|---------|------|
  41658. | `InfluencerController.php` | 484줄 | 인플루언서 전용 기능만 포함 |
  41659. | `VendorController.php` | 316줄 | 벤더사 전용 기능만 포함 |
  41660. | `InfluencerModel.php` | 300줄 | 인플루언서 프로필 관리 특화 |
  41661. | `InfluencerPartnershipModel.php` | 353줄 | 인플루언서 관점 파트너십 관리 |
  41662. | `VendorPartnershipModel.php` | 456줄 | 벤더사 관점 파트너십 관리 |
  41663. ## 📊 기능별 상세 분리
  41664. ### InfluencerController (인플루언서 전용)
  41665. - ✅ `searchVendors()` - 벤더사 검색
  41666. - ✅ `createApprovalRequest()` - 승인 요청 생성
  41667. - ✅ `createReapplyRequest()` - 재승인 요청
  41668. - ✅ `getMyPartnerships()` - 본인 파트너십 목록
  41669. - ✅ `terminatePartnership()` - 파트너십 해지
  41670. ### VendorController (벤더사 전용)
  41671. - ✅ `getInfluencerRequests()` - 인플루언서 요청 목록 조회
  41672. - ✅ `processInfluencerRequest()` - 요청 승인/거부
  41673. - ✅ `terminatePartnership()` - 파트너십 해지
  41674. ### InfluencerModel (인플루언서 프로필)
  41675. - ✅ `getInfluencers()` - 인플루언서 목록 (필터링)
  41676. - ✅ `getProfile()` - 프로필 조회
  41677. - ✅ `verifyLogin()` - 로그인 검증
  41678. - ✅ `getTopInfluencers()` - 랭킹 조회
  41679. - ✅ `updateVerificationStatus()` - 검증 상태 업데이트
  41680. ### InfluencerPartnershipModel (인플루언서 파트너십)
  41681. - ✅ `getInfluencerPartnerships()` - 파트너십 목록
  41682. - ✅ `createApprovalRequest()` - 승인 요청 생성
  41683. - ✅ `createReapplyRequest()` - 재승인 요청 생성
  41684. - ✅ `terminateByInfluencer()` - 인플루언서 해지
  41685. - ✅ `getInfluencerStats()` - 통계 조회
  41686. - ✅ `getReapplyableVendors()` - 재승인 가능 벤더사
  41687. ### VendorPartnershipModel (벤더사 파트너십)
  41688. - ✅ `getVendorRequests()` - 벤더사 요청 목록
  41689. - ✅ `processRequest()` - 요청 승인/거부 처리
  41690. - ✅ `terminateByVendor()` - 벤더사 해지
  41691. - ✅ `getVendorStats()` - 벤더사 통계
  41692. - ✅ `createVendorProposal()` - 벤더사 제안 생성
  41693. - ✅ `getInfluencerRecommendationScore()` - 추천 점수 계산
  41694. ## 🛣️ API 엔드포인트 구조
  41695. ### 인플루언서 전용 API
  41696. ```
  41697. POST /api/influencer/search-vendors # 벤더사 검색
  41698. POST /api/influencer/create-request # 승인 요청
  41699. POST /api/influencer/reapply-request # 재승인 요청
  41700. POST /api/influencer/my-partnerships # 파트너십 목록
  41701. POST /api/influencer/terminate # 파트너십 해지
  41702. ```
  41703. ### 벤더사 전용 API
  41704. ```
  41705. POST /api/vendor/influencer-requests # 인플루언서 요청 목록
  41706. POST /api/vendor/process-request # 요청 승인/거부
  41707. POST /api/vendor/terminate # 파트너십 해지
  41708. ```
  41709. ### 호환성 유지 API
  41710. ```
  41711. POST /api/vendor-influencer/* # 기존 API 엔드포인트 호환성 유지
  41712. ```
  41713. ## 🗑️ 삭제된 파일들
  41714. ### 제거된 파일 목록
  41715. - ❌ `VendorInfluencerController.php` (923줄) → 기능 분리 완료
  41716. - ❌ `UserModel.php` (223줄) → `InfluencerModel.php`로 대체
  41717. - ❌ `VendorInfluencerMappingModel.php` (152줄) → Partnership 모델들로 대체
  41718. ### 정리된 라우트
  41719. ```php
  41720. // 비활성화된 라우트들 (삭제된 컨트롤러 참조)
  41721. // $routes->post('detail', 'VendorInfluencerController::getDetail');
  41722. // $routes->post('cancel', 'VendorInfluencerController::cancelRequest');
  41723. // $routes->post('stats', 'VendorInfluencerController::getStats');
  41724. // $routes->post('history/(:num)', 'VendorInfluencerController::getHistory/$1');
  41725. ```
  41726. ## 📈 개선 효과
  41727. ### 1. 코드 가독성 향상
  41728. - **분리 전**: 923줄의 거대한 컨트롤러 → 기능 파악 어려움
  41729. - **분리 후**: 300-500줄 내외의 역할별 컨트롤러 → 명확한 기능 구분
  41730. ### 2. 유지보수성 개선
  41731. - **분리 전**: 한 파일 수정 시 다른 기능에 영향 우려
  41732. - **분리 후**: 역할별 독립적 수정 가능
  41733. ### 3. 성능 최적화
  41734. - **분리 전**: 불필요한 기능까지 메모리에 로드
  41735. - **분리 후**: 필요한 기능만 선택적 로드
  41736. ### 4. 테스트 용이성
  41737. - **분리 전**: 복잡한 의존성으로 단위 테스트 어려움
  41738. - **분리 후**: 각 역할별 독립적 테스트 가능
  41739. ## 🔮 향후 확장 계획
  41740. ### 1. 추가 모델 분리 가능성
  41741. - `ProductModel` - 상품 관리
  41742. - `OrderModel` - 주문 관리
  41743. - `SettlementModel` - 정산 관리
  41744. - `NotificationModel` - 알림 관리
  41745. ### 2. 서비스 레이어 도입
  41746. ```
  41747. Services/
  41748. ├── InfluencerService.php
  41749. ├── VendorService.php
  41750. ├── PartnershipService.php
  41751. └── NotificationService.php
  41752. ```
  41753. ### 3. Repository 패턴 적용
  41754. - 데이터 액세스 로직 추상화
  41755. - 다양한 데이터 소스 지원 (MySQL, Redis 등)
  41756. ## ✅ 검증 완료 사항
  41757. ### 1. 컴파일 검증
  41758. - ✅ PHP 문법 오류 없음
  41759. - ✅ 클래스 임포트 정상
  41760. - ✅ 메서드 호출 정상
  41761. ### 2. 기능 검증
  41762. - ✅ 인플루언서 벤더사 검색 기능
  41763. - ✅ 승인 요청 생성 기능
  41764. - ✅ 재승인 요청 기능
  41765. - ✅ 파트너십 관리 기능
  41766. ### 3. 호환성 검증
  41767. - ✅ 기존 API 엔드포인트 호환성 유지
  41768. - ✅ 기존 데이터베이스 스키마와 호환
  41769. ## 📝 마무리
  41770. 이번 백엔드 아키텍처 분리를 통해 **단일 책임 원칙(SRP)** 을 준수하고, **개방-폐쇄 원칙(OCP)** 을 적용하여 확장 가능한 구조를 구축했습니다.
  41771. 각 컨트롤러와 모델이 명확한 역할을 가지게 되어 개발 생산성이 향상되고, 신규 기능 추가 시 기존 코드에 미치는 영향을 최소화할 수 있게 되었습니다.
  41772. ---
  41773. **최종 업데이트**: 2024년 12월
  41774. **작성자**: AI 개발팀
  41775. **버전**: v2.0.0
  41776. </file>
  41777. <file path="components/common/leftMenu.vue">
  41778. <template>
  41779. <section class="left-menu" :class="[shortType ? 'short' : '']">
  41780. <div class="left-menu-user">
  41781. <h1 class="logo"><span style="cursor: pointer" @click="fnMoveHome()">P5G</span></h1>
  41782. <div class="user">
  41783. <i class="ico"></i>
  41784. <span class="type">{{ useAuthStore().getAccountId }}</span>
  41785. <!-- <span class="name">{{ useAuthStore().getAccountName }}</span> -->
  41786. </div>
  41787. </div>
  41788. <nav class="left-navi">
  41789. <ul class="depth1" v-if="shortType == false">
  41790. <li
  41791. v-for="(item, index) in arrMenuLists"
  41792. :key="index"
  41793. :id="'menu_' + item.menu_seq"
  41794. :class="item.menu_url.indexOf(currentTopMenuLocation) > -1 ? 'active' : ''"
  41795. >
  41796. <span class="menu-name" @click="fnMenuEvent(item)"
  41797. ><i :class="'ico ico' + (index + 1)"></i>{{ item.menu_nm }}</span
  41798. >
  41799. <div
  41800. class="depth2"
  41801. :style="
  41802. item.menu_url.indexOf(currentTopMenuLocation) > -1
  41803. ? 'display: block'
  41804. : 'display: none'
  41805. "
  41806. >
  41807. <ul>
  41808. <li
  41809. v-for="(itemSub, indexSub) in item.sub"
  41810. :key="indexSub"
  41811. @click="fnMenuEvent(itemSub)"
  41812. :class="currentMenuLocation == itemSub.menu_url ? 'active' : ''"
  41813. >
  41814. {{ itemSub.menu_nm }}
  41815. </li>
  41816. </ul>
  41817. </div>
  41818. </li>
  41819. </ul>
  41820. <!-- <ul class="depth1" v-else>
  41821. <li v-for="(item, index) in arrMenuLists" :key="index" :id="'menu_'+item.menu_seq" :class="item.menu_url.indexOf(currentTopMenuLocation) > -1 ? 'active' : ''">
  41822. <span class="menu-name" @click="focusIn(index)"><i :class="'ico ico'+(index+1)"></i></span>
  41823. <div class="depth2">
  41824. <strong>{{item.menu_nm}}</strong>
  41825. <ul>
  41826. <li v-for="(itemSub, indexSub) in item.sub" :key="indexSub" @click="fnMenuEvent(itemSub)" :class="currentMenuLocation == itemSub.menu_url ? 'active' : ''">{{itemSub.menu_nm}}</li>
  41827. </ul>
  41828. </div>
  41829. </li>
  41830. </ul> -->
  41831. <ul class="depth1" v-else>
  41832. <li
  41833. v-for="(item, index) in arrMenuLists"
  41834. style="width: 62px"
  41835. :key="index"
  41836. @mouseover="focusIn(index)"
  41837. @mouseleave="twoDept = null"
  41838. :id="'menu_' + item.menu_seq"
  41839. :class="item.menu_url.indexOf(currentTopMenuLocation) > -1 ? 'active' : ''"
  41840. >
  41841. <span class="menu-name"><i :class="'ico ico' + (index + 1)"></i></span>
  41842. <div
  41843. v-if="twoDept == index"
  41844. class="depth2"
  41845. @mouseover="focusIn(index)"
  41846. style="display: block"
  41847. >
  41848. <strong>{{ item.menu_nm }}</strong>
  41849. <ul>
  41850. <li
  41851. v-for="(itemSub, indexSub) in item.sub"
  41852. :key="indexSub"
  41853. @click="fnMenuEvent(itemSub)"
  41854. :class="currentMenuLocation == itemSub.menu_url ? 'active' : ''"
  41855. >
  41856. {{ itemSub.menu_nm }}
  41857. </li>
  41858. </ul>
  41859. </div>
  41860. </li>
  41861. </ul>
  41862. </nav>
  41863. <div class="left-btm">
  41864. <v-btn
  41865. class="custom-btn btn-white"
  41866. v-if="shortType == false"
  41867. @click="logoutPop = true"
  41868. >로그아웃</v-btn
  41869. >
  41870. <button
  41871. style="visibility: hidden"
  41872. class="btn-logout"
  41873. v-else
  41874. @click="logoutPop = true"
  41875. ></button>
  41876. <v-btn
  41877. class="custom-btn btn-white btn-back"
  41878. @click="shortType = !shortType"
  41879. ></v-btn>
  41880. </div>
  41881. </section>
  41882. <v-dialog v-model="logoutPop" persistent width="350">
  41883. <div class="v-common-dialog-wrapper custom-dialog">
  41884. <strong class="modal-tit"> </strong>
  41885. <div class="v-common-dialog-content">
  41886. <p class="modal-txt">시스템에서 로그아웃 하시겠습니까?</p>
  41887. </div>
  41888. <div class="btn-wrap">
  41889. <v-btn class="custom-btn btn-white" @click="logoutPop = false"> 취소 </v-btn>
  41890. <v-btn @click="fnLogout()" class="custom-btn btn-purple"> 확인 </v-btn>
  41891. </div>
  41892. </div>
  41893. </v-dialog>
  41894. </template>
  41895. <script setup>
  41896. /************************
  41897. * import
  41898. ************************/
  41899. import { useRoute } from "vue-router";
  41900. import useAxios from "~/composables/useAxios";
  41901. import useErrorHandler from "~/composables/useErrorHandler";
  41902. /************************
  41903. * plugins inject
  41904. ************************/
  41905. const { $dayjs, $log, $eventBus, $toast } = useNuxtApp();
  41906. const route = useRoute();
  41907. /************************
  41908. * data & created
  41909. ************************/
  41910. let pageId = "leftMenu";
  41911. let logoutPop = ref(false);
  41912. let arrMenuLists = ref([]);
  41913. let currentTopMenuLocation = ref("");
  41914. let currentMenuLocation = ref("");
  41915. let shortType = ref(false);
  41916. let twoDept = ref(null);
  41917. /***********
  41918. * watch
  41919. ***********/
  41920. watch(
  41921. route,
  41922. (newv, oldv) => {
  41923. let arrPaths = newv.path.split("/").filter((str) => str !== "");
  41924. currentTopMenuLocation.value = `/${arrPaths[0]}`;
  41925. currentMenuLocation.value = `/${arrPaths[0]}/${arrPaths[1]}`;
  41926. },
  41927. { deep: true, immediate: true }
  41928. );
  41929. /************************
  41930. * Methods
  41931. ************************/
  41932. // 메뉴 목록 조회하기
  41933. function fnGetMenu() {
  41934. console.log("%c [print][]", "color:#10cdbc", "좌측메뉴 조회하기");
  41935. useAxios()
  41936. .post("/menu/selectMenuList")
  41937. .then((res) => {
  41938. $log.debug("[leftMenu][fnGetMenu][success]");
  41939. let arrRes = res.data.data;
  41940. arrRes.forEach((item, index) => {
  41941. if (item.p_menu_seq == 0) {
  41942. item.sub = [];
  41943. arrMenuLists.value.push(item);
  41944. }
  41945. });
  41946. arrMenuLists.value.forEach((item, index) => {
  41947. arrRes.forEach((itemSub, indexSub) => {
  41948. if (item.menu_seq == itemSub.p_menu_seq) {
  41949. if (arrMenuLists.value[index].menu_url == "") {
  41950. arrMenuLists.value[index].menu_url = itemSub.menu_url;
  41951. }
  41952. arrMenuLists.value[index].sub.push(itemSub);
  41953. }
  41954. });
  41955. });
  41956. })
  41957. .catch((error) => {
  41958. $log.debug("[leftMenu][fnGetMenu][error]");
  41959. useErrorHandler().fnSetCommErrorHandle(error, fnGetMenu);
  41960. })
  41961. .finally(() => {
  41962. $log.debug("[leftMenu][fnGetMenu][finished]");
  41963. });
  41964. }
  41965. // 메뉴 이벤트 처리
  41966. function fnMenuEvent(obj) {
  41967. if (obj.p_menu_seq == 0) {
  41968. // top menu
  41969. $(".depth1 > li").removeClass("active");
  41970. $(".depth2").hide();
  41971. let elTopMenu = $("#menu_" + obj.menu_seq);
  41972. if (elTopMenu.hasClass("active")) {
  41973. elTopMenu.removeClass("active");
  41974. elTopMenu.find(".depth2").hide();
  41975. } else {
  41976. elTopMenu.addClass("active");
  41977. if (obj.sub && obj.sub.length > 0) {
  41978. elTopMenu.find(".depth2").show();
  41979. }
  41980. }
  41981. } else {
  41982. // sub menu
  41983. useUtil.setPageMove(obj.menu_url);
  41984. }
  41985. }
  41986. function focusIn(idx) {
  41987. /*for(let i = 0; i < document.getElementsByClassName("depth2").length; i++){
  41988. document.getElementsByClassName("depth2")[i].style.display = "none"
  41989. }*/
  41990. // if(document.getElementsByClassName("depth2")[idx].style.display == 'block'){
  41991. // document.getElementsByClassName("depth2")[idx].style.display = "none"
  41992. // }else{
  41993. // for(let i = 0; i < document.getElementsByClassName("depth2").length; i++){
  41994. // document.getElementsByClassName("depth2")[i].style.display = "none"
  41995. // }
  41996. // document.getElementsByClassName("depth2")[idx].style.display = "block"
  41997. // }
  41998. twoDept.value = idx;
  41999. }
  42000. // 메인 화면으로 이동
  42001. function fnMoveHome() {
  42002. useUtil.setPageMove(useAuthStore().getRedirectPage);
  42003. }
  42004. // 로그아웃
  42005. function fnLogout() {
  42006. const { logout } = useLogout()
  42007. logout()
  42008. }
  42009. </script>
  42010. <style lang="scss" scoped></style>
  42011. </file>
  42012. <file path="composables/useApi.js">
  42013. "use strict";
  42014. const API_ENDPOINTS = {
  42015. //뉴스룸
  42016. newsInsert: ``,
  42017. // 벤더사 관련 API
  42018. vendors: {
  42019. // 벤더사 검색 및 목록 조회
  42020. search: '/vendors',
  42021. // 벤더사 상세 조회
  42022. detail: '/vendors/:id',
  42023. // 벤더사 등록
  42024. create: '/vendors',
  42025. // 벤더사 수정
  42026. update: '/vendors/:id',
  42027. // 벤더사 삭제
  42028. delete: '/vendors/:id',
  42029. // 벤더사 카테고리 목록
  42030. categories: '/vendors/categories',
  42031. },
  42032. };
  42033. export default API_ENDPOINTS;
  42034. </file>
  42035. <file path="layouts/default.vue">
  42036. <template>
  42037. <v-app>
  42038. <div class="container">
  42039. <headerLayout />
  42040. <div class="content">
  42041. <NuxtPage class="main" />
  42042. </div>
  42043. <!-- <footerLayout /> -->
  42044. </div>
  42045. </v-app>
  42046. </template>
  42047. <script setup>
  42048. import headerLayout from "@/components/common/header";
  42049. /************************************************************************
  42050. | 전역
  42051. ************************************************************************/
  42052. const { $dayjs, $log, $eventBus, $toast } = useNuxtApp();
  42053. let pageId = "defaultLayout";
  42054. const menuActive = ref("");
  42055. const router = useRouter();
  42056. const subActv = ref("");
  42057. /************************************************************************
  42058. | 스토어
  42059. ************************************************************************/
  42060. const useDtStore = useDetailStore();
  42061. /************************************************************************
  42062. | 함수 : 세팅
  42063. ************************************************************************/
  42064. const subMenuActv = (__IDX, __URL, __MENU_ID, __PAGE_RT_NAME, __PAGE_STATUS) => {
  42065. useDtStore.menuInfo.menuIndex = __IDX;
  42066. useDtStore.menuInfo.menuId = __MENU_ID;
  42067. useDtStore.menuInfo.pageRtName = __PAGE_RT_NAME;
  42068. useDtStore.menuInfo.pageStatus = __PAGE_STATUS;
  42069. router.push({
  42070. path: __URL,
  42071. });
  42072. };
  42073. /************************************************************************
  42074. | 스코핑 : INIT
  42075. | *scoped에 유의하여 세팅
  42076. ************************************************************************/
  42077. onMounted(() => {});
  42078. </script>
  42079. </file>
  42080. <file path="pages/view/common/deli/index.vue">
  42081. <template>
  42082. <div>
  42083. <div class="inner--headers">
  42084. <h2>{{ pageId }}</h2>
  42085. <div class="bread--crumbs--wrap">
  42086. <span>홈</span>
  42087. <span>{{ pageId }}</span>
  42088. </div>
  42089. </div>
  42090. <div class="search--modules type2">
  42091. <div class="search--inner">
  42092. <div class="form--cont--filter">
  42093. <v-select
  42094. v-model="filter"
  42095. :items="filderArr"
  42096. variant="outlined"
  42097. class="custom-select"
  42098. >
  42099. </v-select>
  42100. </div>
  42101. <div class="form--cont--text">
  42102. <v-text-field
  42103. v-model="searchModel"
  42104. class="custom-input mini"
  42105. style="width: 100%"
  42106. placeholder="검색어를 입력하세요"
  42107. ></v-text-field>
  42108. </div>
  42109. </div>
  42110. <div class="search--inner">
  42111. <div class="calendar-wrap ml--0">
  42112. <div class="calendar">
  42113. <VueDatePicker
  42114. :format="datePickerFormat"
  42115. v-model="searchStartDate"
  42116. placeholder="날짜를 선택하세요"
  42117. :auto-apply="true"
  42118. week-start="0"
  42119. ></VueDatePicker>
  42120. </div>
  42121. <span class="text">~</span>
  42122. <div class="calendar">
  42123. <VueDatePicker
  42124. v-model="searchEndDate"
  42125. :format="datePickerFormat"
  42126. placeholder="날짜를 선택하세요"
  42127. :auto-apply="true"
  42128. week-start="0"
  42129. ></VueDatePicker>
  42130. </div>
  42131. <div class="month--selector">
  42132. <v-btn
  42133. v-for="option in dateOptions"
  42134. :key="option.value"
  42135. :class="{ actv: selectedRange === option.value }"
  42136. @click="setDateRange(option.value)"
  42137. elevation="0"
  42138. >
  42139. {{ option.label }}
  42140. </v-btn>
  42141. </div>
  42142. </div>
  42143. </div>
  42144. <v-btn
  42145. class="custom-btn btn-blue mini sch--btn"
  42146. @click="fnSearch(searchModel, filter)"
  42147. >검색</v-btn
  42148. >
  42149. </div>
  42150. <div class="data--list--wrap">
  42151. <div class="btn--actions--wrap">
  42152. <div class="left--sections">
  42153. <v-btn class="custom-btn btn-pink bdrs--10"
  42154. ><i class="ico"></i>개별 배송</v-btn
  42155. >
  42156. <v-btn class="custom-btn bdrs--10 btn-white" @click="deliLocated()"
  42157. ><i class="ico"></i>공동구매 배송</v-btn
  42158. >
  42159. </div>
  42160. <div class="right--sections">
  42161. </div>
  42162. </div>
  42163. <div class="tbl-wrapper">
  42164. <div class="tbl-wrap">
  42165. <!-- ag grid -->
  42166. <ag-grid-vue
  42167. style="width: 100%; height: calc(10 * 2.94rem)"
  42168. class="ag-theme-quartz"
  42169. :gridOptions="gridOptions"
  42170. :rowData="tblItems"
  42171. rowSelection="multiple"
  42172. :paginationPageSize="pageObj.pageSize"
  42173. :suppressPaginationPanel="true"
  42174. @grid-ready="onGridReady"
  42175. @rowClicked="detailLocated"
  42176. >
  42177. </ag-grid-vue>
  42178. <!-- 페이징 -->
  42179. <div class="ag-grid-custom-pagenations">
  42180. <pagination @chg_page="chgPage" :pageObj="pageObj"></pagination>
  42181. </div>
  42182. </div>
  42183. </div>
  42184. </div>
  42185. </div>
  42186. </template>
  42187. <script setup>
  42188. import VueDatePicker from "@vuepic/vue-datepicker";
  42189. import "@vuepic/vue-datepicker/dist/main.css";
  42190. import { AgGridVue } from "ag-grid-vue3";
  42191. import dayjs from 'dayjs';
  42192. import pagination from "../components/common/pagination.vue";
  42193. /************************************************************************
  42194. | 레이아웃
  42195. ************************************************************************/
  42196. definePageMeta({
  42197. layout: "default",
  42198. });
  42199. /************************************************************************
  42200. | PROPS
  42201. ************************************************************************/
  42202. const props = defineProps({
  42203. propsData: {
  42204. type: Object,
  42205. default: () => {},
  42206. },
  42207. });
  42208. /************************************************************************
  42209. | 스토어
  42210. ************************************************************************/
  42211. const useDtStore = useDetailStore();
  42212. const useAtStore = useAuthStore();
  42213. /************************************************************************
  42214. | 전역
  42215. ************************************************************************/
  42216. const memberType = useAtStore.auth.memberType;
  42217. const memberSeq = useAtStore.auth.seq;
  42218. const searchModel = ref("");
  42219. const selectedRange = ref('all');
  42220. const itemStartDate = ref("");
  42221. const searchStartDate = ref("");
  42222. const searchEndDate = ref("");
  42223. const datePickerFormat = "yyyy-MM-dd";
  42224. const dateOptions = [
  42225. { label: '오늘', value: 'today' },
  42226. { label: '7일', value: '7d' },
  42227. { label: '1개월', value: '1m' },
  42228. { label: '3개월', value: '3m' },
  42229. { label: '전체', value: 'all' },
  42230. ]
  42231. const filter = ref("");
  42232. const filderArr = ref([
  42233. { title: "전체", value: "" },
  42234. { title: "제품명", value: "name" },
  42235. ]);
  42236. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  42237. const router = useRouter();
  42238. const pageId = ref("배송 관리");
  42239. let pageObj = ref({
  42240. page: 1, // 현재 페이지
  42241. pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
  42242. pageSize: 10, // 테이블 조회 데이터 개수
  42243. totalCnt: 0, // 전체 페이지
  42244. });
  42245. const tblItems = ref([]); // stat 데이터
  42246. /* eslint-disable */
  42247. /* prettier-ignore */
  42248. pageObj.value.totalCnt = tblItems.value.length;
  42249. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  42250. const rowHeightRem = 2.65; // 원하는 rem 값
  42251. const rowHeightPx = rowHeightRem * remToPx();
  42252. const gridApi = shallowRef();
  42253. // gridOption
  42254. const gridOptions = {
  42255. columnDefs: [
  42256. //{ checkboxSelection: true, headerCheckboxSelection: true, width: 0 },
  42257. {
  42258. headerName: "No",
  42259. valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
  42260. sortable: false,
  42261. width: 70,
  42262. },
  42263. // { headerName: "번호", field: "NO", sortable: false },
  42264. {
  42265. headerName: "제품명",
  42266. field: "NAME",
  42267. //sortable: useAuthStore().getCompanyId == "0-000000" ? true : false,
  42268. },
  42269. {
  42270. headerName: "제품 총수량",
  42271. field: "sum_qty",
  42272. width: 140,
  42273. cellRenderer: (params) => {
  42274. return Number(params.value).toLocaleString();
  42275. },
  42276. },
  42277. {
  42278. headerName: "총 주문금액",
  42279. field: "sum_total",
  42280. width: 140,
  42281. cellRenderer: (params) => {
  42282. return Number(params.value).toLocaleString();
  42283. },
  42284. },
  42285. {
  42286. headerName: "주문일",
  42287. field: "latest_reg_date",
  42288. width: 140,
  42289. },
  42290. ],
  42291. rowData: tblItems.value, // 테이블 데이터
  42292. autoSizeStrategy: {
  42293. type: "fitGridWidth", // width맞춤
  42294. },
  42295. suppressMovableColumns: true,
  42296. headerHeight: rowHeightPx,
  42297. rowHeight: rowHeightPx,
  42298. pagination: true,
  42299. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  42300. //rowSelection: {
  42301. // checkboxes: true,
  42302. // headerCheckbox: true,
  42303. // enableClickSelection: false,
  42304. // mode: "multiRow",
  42305. //},
  42306. };
  42307. /************************************************************************
  42308. | 함수(METHODS)
  42309. ************************************************************************/
  42310. const deliLocated = () => {
  42311. router.push({
  42312. path: "/view/common/deli/index2",
  42313. });
  42314. };
  42315. const setDateRange = (range) => {
  42316. const today = dayjs();
  42317. switch(range) {
  42318. case 'today' :
  42319. searchStartDate.value = today.format('YYYY-MM-DD');
  42320. searchEndDate.value = today.format('YYYY-MM-DD');
  42321. selectedRange.value = 'today';
  42322. break;
  42323. case '7d':
  42324. searchStartDate.value = today.subtract(7, 'day').format('YYYY-MM-DD');
  42325. searchEndDate.value = today.format('YYYY-MM-DD');
  42326. selectedRange.value = '7d';
  42327. break;
  42328. case '1m':
  42329. searchStartDate.value = today.subtract(1, 'month').format('YYYY-MM-DD');
  42330. searchEndDate.value = today.format('YYYY-MM-DD');
  42331. selectedRange.value = '1m';
  42332. break;
  42333. case '3m':
  42334. searchStartDate.value = today.subtract(3, 'month').format('YYYY-MM-DD');
  42335. searchEndDate.value = today.format('YYYY-MM-DD');
  42336. selectedRange.value = '3m';
  42337. break;
  42338. case 'all':
  42339. searchStartDate.value = itemStartDate.value;
  42340. searchEndDate.value = today.format('YYYY-MM-DD');
  42341. selectedRange.value = 'all';
  42342. break
  42343. }
  42344. }
  42345. const onGridReady = (__PARAMS) => {
  42346. gridApi.value = __PARAMS.api;
  42347. };
  42348. const chgPage = (__PAGE) => {
  42349. pageObj.value.page = __PAGE;
  42350. gridApi.value.paginationGoToPage(__PAGE - 1);
  42351. };
  42352. const detailLocated = (__EVENT) => {
  42353. router.push({
  42354. path: "/view/common/deli/detail",
  42355. });
  42356. useDtStore.boardInfo.seq = __EVENT.data.SEQ;
  42357. };
  42358. const itemListGet = async () => {
  42359. let _req = {
  42360. // compId: useAuthStore().getCompanyId,
  42361. INF_SEQ: ""
  42362. };
  42363. if (memberType === "INFLUENCER"){
  42364. _req.INF_SEQ = memberSeq;
  42365. }
  42366. useAxios()
  42367. .post("/deli/itemlist", _req)
  42368. .then((res) => {
  42369. tblItems.value = res.data;
  42370. pageObj.value.totalCnt = tblItems.value.length;
  42371. itemStartDate.value = res.data[res.data.length-1].UDPDATE;
  42372. searchStartDate.value = itemStartDate.value;
  42373. searchEndDate.value = dayjs();
  42374. });
  42375. };
  42376. const fnSearch = (__KEYWORD, __FILTER) => {
  42377. let _req = {
  42378. filter: __FILTER,
  42379. keyword: __KEYWORD,
  42380. startDate: searchStartDate.value,
  42381. endDate: searchEndDate.value,
  42382. };
  42383. useAxios()
  42384. .post("/item/search", _req)
  42385. .then((res) => {
  42386. tblItems.value = res.data;
  42387. pageObj.value.totalCnt = tblItems.value.length;
  42388. })
  42389. .catch((error) => {});
  42390. };
  42391. /************************************************************************
  42392. | 팝업 이벤트버스 정의
  42393. ************************************************************************/
  42394. /************************************************************************
  42395. | WATCH
  42396. ************************************************************************/
  42397. watch(
  42398. () => props,
  42399. () => {
  42400. searchObj.value = props.propsData;
  42401. fnGetStat();
  42402. },
  42403. { deep: true }
  42404. );
  42405. onMounted(() => {
  42406. itemListGet();
  42407. });
  42408. </script>
  42409. </file>
  42410. <file path="pages/view/common/item/add.vue">
  42411. <template>
  42412. <div>
  42413. <div class="inner--headers">
  42414. <h2>{{ pageId }}</h2>
  42415. <div class="bread--crumbs--wrap">
  42416. <span>홈</span>
  42417. <span>제품 관리</span>
  42418. <span>{{ pageId }}</span>
  42419. </div>
  42420. </div>
  42421. <div class="data--list--wrap">
  42422. <div class="table--wrap">
  42423. <v-form ref="addForm">
  42424. <table>
  42425. <colgroup>
  42426. <col width="20%" />
  42427. <col width="80%" />
  42428. </colgroup>
  42429. <tbody>
  42430. <tr>
  42431. <th class="bg le">제품명<span v-if="pageType !== 'D'" class="bul">*</span></th>
  42432. <td v-if="pageType == 'D'">
  42433. {{ form.formValue1 }}
  42434. </td>
  42435. <td v-else>
  42436. <div class="input--wrap">
  42437. <v-text-field
  42438. maxlength="50"
  42439. v-model="form.formValue1"
  42440. :rules="[useValid.required('제품명')]"
  42441. class="custom-input mini left"
  42442. placeholder="제품명을 입력하세요"
  42443. ></v-text-field>
  42444. </div>
  42445. </td>
  42446. </tr>
  42447. <tr>
  42448. <th class="bg le">공급가<span v-if="pageType !== 'D'" class="bul">*</span></th>
  42449. <td v-if="pageType == 'D'">
  42450. {{ Number(form.formValue2).toLocaleString() }}
  42451. </td>
  42452. <td v-else>
  42453. <div class="input--wrap">
  42454. <v-text-field
  42455. maxlength="50"
  42456. v-model="form.formValue2"
  42457. style="width: 20%"
  42458. :rules="[useValid.required('공급가')]"
  42459. class="custom-input mini left"
  42460. placeholder="공급가를 입력하세요"
  42461. ></v-text-field>
  42462. </div>
  42463. </td>
  42464. </tr>
  42465. <tr>
  42466. <th class="bg le">판매가<span v-if="pageType !== 'D'" class="bul">*</span></th>
  42467. <td v-if="pageType == 'D'">
  42468. {{ Number(form.formValue3).toLocaleString() }}
  42469. </td>
  42470. <td v-else>
  42471. <div class="input--wrap">
  42472. <v-text-field
  42473. maxlength="50"
  42474. v-model="form.formValue3"
  42475. style="width: 20%"
  42476. :rules="[useValid.required('판매가')]"
  42477. class="custom-input mini left"
  42478. placeholder="판매가를 입력하세요"
  42479. ></v-text-field>
  42480. </div>
  42481. </td>
  42482. </tr>
  42483. <tr>
  42484. <th class="bg le">배송비<span v-if="pageType !== 'D'" class="bul">*</span></th>
  42485. <td v-if="pageType == 'D'">
  42486. {{ form.formValue4 }}
  42487. </td>
  42488. <td v-else>
  42489. <div class="input--wrap">
  42490. <v-textarea
  42491. v-model="form.formValue4"
  42492. class="custom-textarea"
  42493. no-resize=""
  42494. placeholder="배송비를 입력해주세요"
  42495. :rules="[useValid.required('배송비')]"
  42496. ></v-textarea>
  42497. </div>
  42498. </td>
  42499. </tr>
  42500. <tr>
  42501. <th class="bg le">썸네일 이미지</th>
  42502. <td>
  42503. <div class="equip--image--wrap">
  42504. <!--이미지가 없을 때-->
  42505. <div class="equip--image" v-show="!form.formValue5">
  42506. <img src="/assets/img/ic_no_img.svg" />
  42507. </div>
  42508. <!--이미지 첨부했을 때-->
  42509. <div class="equip--image" v-show="form.formValue5">
  42510. <div class="images-wrapper">
  42511. <img id="preview_image" :src="imgTemp" />
  42512. </div>
  42513. </div>
  42514. <div class="equip--image--select" v-if="pageType !== 'D'">
  42515. <div class="form--group">
  42516. <label
  42517. for="fileUpload_pic"
  42518. class="file--btn"
  42519. @click="fnPicFileUploadOpen()"
  42520. >파일 선택</label
  42521. >
  42522. <v-file-input
  42523. v-model="form.formValue5"
  42524. id="fileUpload_pic"
  42525. ref="fileupload_pic"
  42526. accept=".jpg, .jpeg, .png, .gif"
  42527. variant="plain"
  42528. hide-details
  42529. placeholder="선택된 파일 없음"
  42530. prepend-icon=""
  42531. class="custom-input"
  42532. style="max-width: 400px"
  42533. height="33px"
  42534. :clearable="false"
  42535. @change="fnUploadPicFileCheck()"
  42536. >
  42537. <!-- <template #append>
  42538. <div class="v-input__icon v-input__icon--clear">
  42539. <button
  42540. @click="clearFile"
  42541. type="button"
  42542. aria-label="clear icon"
  42543. tabindex="-1"
  42544. class="v-icon notranslate v-icon--link mdi mdi-close"
  42545. ></button>
  42546. </div>
  42547. </template> -->
  42548. </v-file-input>
  42549. </div>
  42550. <p class="equip--image--desc">
  42551. (권장 이미지 : gif, jpg, jpeg, png)
  42552. </p>
  42553. </div>
  42554. </div>
  42555. </td>
  42556. </tr>
  42557. <tr>
  42558. <th class="bg le">소타이틀<span v-if="pageType !== 'D'" class="bul">*</span></th>
  42559. <td v-if="pageType == 'D'">
  42560. {{ form.formValue6 }}
  42561. </td>
  42562. <td v-else>
  42563. <div class="input--wrap">
  42564. <v-text-field
  42565. v-model="form.formValue6"
  42566. class="custom-input mini"
  42567. placeholder="소타이틀을 입력해주세요"
  42568. :rules="[useValid.required('소타이틀')]"
  42569. ></v-text-field>
  42570. </div>
  42571. </td>
  42572. </tr>
  42573. <tr>
  42574. <th class="bg le">상세 다운로드</th>
  42575. <td>
  42576. <div class="input--wrap" style="width: 50%">
  42577. <v-file-input
  42578. v-if="pageType !== 'D'"
  42579. v-model="form.formValue7"
  42580. label="파일은 압축(zip)해서 첨부해 주세요."
  42581. accept=".zip"
  42582. variant="outlined"
  42583. hide-details=""
  42584. density="comfortable"
  42585. ></v-file-input>
  42586. <div class="down--file" @click="fnDownloadFile()">
  42587. <span>{{ zipInfo.original_name }}</span>
  42588. </div>
  42589. </div>
  42590. </td>
  42591. </tr>
  42592. <tr>
  42593. <th class="bg le">상세 내용<span v-if="pageType !== 'D'" class="bul">*</span></th>
  42594. <td v-if="pageType == 'D'">
  42595. <div v-html="editorContentReq"></div>
  42596. </td>
  42597. <td v-else>
  42598. <SunEditorWrapper
  42599. ref="sunEditorWrapper"
  42600. :initialContent="editorContentReq"
  42601. />
  42602. </td>
  42603. </tr>
  42604. <tr>
  42605. <th class="bg le">상태<span v-if="pageType !== 'D'" class="bul">*</span></th>
  42606. <td v-if="pageType == 'D'">
  42607. {{ form.formValue8 == '0' ? '판매중' : '품절' }}
  42608. </td>
  42609. <td v-else>
  42610. <div class="input--wrap" style="width: 20%">
  42611. <v-select
  42612. variant="outlined"
  42613. class="custom-select"
  42614. v-model="form.formValue8"
  42615. :items="form.formValue8Arr"
  42616. >
  42617. </v-select>
  42618. </div>
  42619. </td>
  42620. </tr>
  42621. <tr v-if="pageType !== 'D'">
  42622. <th class="bg le">노출 상태<span v-if="pageType !== 'D'" class="bul">*</span></th>
  42623. <td>
  42624. <div class="input--wrap" style="width: 20%">
  42625. <v-select
  42626. variant="outlined"
  42627. style="width: 20%"
  42628. class="custom-select"
  42629. v-model="form.formValue9"
  42630. :items="form.formValue9Arr"
  42631. >
  42632. </v-select>
  42633. </div>
  42634. </td>
  42635. </tr>
  42636. <tr>
  42637. <th class="bg le">업데이트 내역</th>
  42638. <td v-if="pageType == 'D'">
  42639. {{ form.formValue10 }}
  42640. </td>
  42641. <td v-else>
  42642. <div class="input--wrap">
  42643. <v-textarea
  42644. v-model="form.formValue10"
  42645. class="custom-textarea"
  42646. no-resize=""
  42647. placeholder="업데이트 내역을 입력해주세요"
  42648. ></v-textarea>
  42649. </div>
  42650. </td>
  42651. </tr>
  42652. </tbody>
  42653. </table>
  42654. </v-form>
  42655. </div>
  42656. <div class="view-btm-btn">
  42657. <div class="btn-l">
  42658. <v-btn class="custom-btn btn-list" @click="listLocated"
  42659. ><i class="ico"></i>목록</v-btn
  42660. >
  42661. <v-btn v-show="pageType == 'U'" class="custom-btn btn-del" @click="fnDelEvt"
  42662. ><i class="ico"></i>삭제</v-btn
  42663. >
  42664. </div>
  42665. <div class="btn-r">
  42666. <v-btn v-if="pageType !== 'D'" class="custom-btn btn-blue2" @click="fnBtnEvt"
  42667. ><i class="ico"></i>저장</v-btn
  42668. >
  42669. </div>
  42670. </div>
  42671. </div>
  42672. </div>
  42673. </template>
  42674. <script setup>
  42675. import SunEditorWrapper from "@/components/sunEdt.vue";
  42676. import useAxios from "@/composables/useAxios";
  42677. /************************************************************************
  42678. | 레이아웃
  42679. ************************************************************************/
  42680. definePageMeta({
  42681. layout: "default",
  42682. });
  42683. /************************************************************************
  42684. | 스토어
  42685. ************************************************************************/
  42686. const useDtStore = useDetailStore();
  42687. /************************************************************************
  42688. | 전역
  42689. ************************************************************************/
  42690. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  42691. const router = useRouter();
  42692. const pageId = ref("");
  42693. const sunEditorWrapper = ref(null); //에디터용 전역
  42694. const updatedContent = ref(null); //에디터용 전역
  42695. const editorContentReq = ref(); //에디터용 전역
  42696. const addForm = ref(null);
  42697. const index = ref(null);
  42698. const imageIndex = ref(0);
  42699. const items = ref([]);
  42700. const quillEditor = ref(null);
  42701. const imgTemp = ref("");
  42702. const zipInfo = ref({
  42703. file_path: "",
  42704. original_name: ""
  42705. })
  42706. const rowId = ref();
  42707. const form = ref({
  42708. formValue1: "",
  42709. formValue2: "",
  42710. formValue3: "",
  42711. formValue4: "",
  42712. formValue5: null,
  42713. formValue6: "",
  42714. formValue7: null,
  42715. formValue8: "0",
  42716. formValue8Arr: [
  42717. { title: "판매중", value: "0" },
  42718. { title: "품절", value: "1" },
  42719. ],
  42720. formValue9: "Y",
  42721. formValue9Arr: [
  42722. { title: "노출", value: "Y" },
  42723. { title: "비노출", value: "N" },
  42724. ],
  42725. formValue10: "",
  42726. });
  42727. const apiUrl = ref("");
  42728. apiUrl.value = import.meta.env.VITE_APP_API_URL;
  42729. const objProc = ref({
  42730. validErrorMessage: "",
  42731. });
  42732. const pageType = ref("");
  42733. /************************************************************************
  42734. | 함수(METHODS)
  42735. ************************************************************************/
  42736. const listLocated = () => {
  42737. router.push({
  42738. path: "/view/common/item",
  42739. });
  42740. };
  42741. const fnPicFileUploadOpen = () => {
  42742. let fileUpload = document.getElementById("fileupload_pic");
  42743. if (fileUpload != null) {
  42744. fileUpload.click();
  42745. }
  42746. };
  42747. const fnUploadPicFileCheck = () => {
  42748. if (form.value.formValue5) {
  42749. // 10Mb 이상은 업로드 불가
  42750. if (form.value.formValue5.size > 10 * 1024 * 1024) {
  42751. fnOpenCommPop("10mb 이상은 업로드가 불가합니다.");
  42752. form.value.formValue5 = null;
  42753. return;
  42754. }
  42755. // 이미지 파일 형식 체크
  42756. let extension = form.value.formValue5.name.split(".").pop().toLowerCase();
  42757. if (
  42758. extension != "jpg" &&
  42759. extension != "jpeg" &&
  42760. extension != "png" &&
  42761. extension != "gif"
  42762. ) {
  42763. fnOpenCommPop("파일 형식 또는 확장자가 올바르지 않습니다.");
  42764. form.value.formValue5 = null;
  42765. return;
  42766. }
  42767. objProc.validErrorMessage = "";
  42768. // 이미지 미리보기
  42769. let previewImage = new Image();
  42770. let tempImageUrl = window.URL.createObjectURL(form.value.formValue5);
  42771. //console.log(tempImageUrl);
  42772. previewImage.src = tempImageUrl;
  42773. items.value[0] = tempImageUrl;
  42774. imgTemp.value = tempImageUrl;
  42775. }
  42776. };
  42777. const clearFile = () => {
  42778. form.value.formValue5 = null;
  42779. };
  42780. const fnDownloadFile = () => {
  42781. window.location.href = `https://shopdeli.mycafe24.com/item/download/${zipInfo.value.file_path}`;
  42782. }
  42783. /*======================================================================
  42784. | 작성 시퀀스
  42785. | 1. 작성 컨펌
  42786. | 2. 버튼 체크
  42787. | 3. 등록시 -> 등록 API 호출
  42788. ======================================================================*/
  42789. const fnBtnEvt = async () => {
  42790. await editorContent();
  42791. nextTick(() => {
  42792. if (addForm.value && typeof addForm.value.validate === "function") {
  42793. addForm.value
  42794. .validate()
  42795. .then((isValid) => {
  42796. if (
  42797. isValid.valid &&
  42798. updatedContent.value != undefined &&
  42799. updatedContent.value != null &&
  42800. updatedContent.value != "<p><br></p>" &&
  42801. form.value.formValue4 != null
  42802. ) {
  42803. if (pageType.value == "I") fnRegEvt();
  42804. else fnUpdEvt();
  42805. } else {
  42806. let param = {
  42807. id: pageId,
  42808. title: pageId,
  42809. content: "필수항목을 입력해주세요.",
  42810. yes: {
  42811. text: "확인",
  42812. isProc: false,
  42813. }
  42814. };
  42815. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  42816. }
  42817. })
  42818. .catch((err) => {
  42819. });
  42820. } else {
  42821. }
  42822. });
  42823. };
  42824. const fnOpenCommPop = (__TEXT) => {
  42825. let param = {
  42826. id: pageId,
  42827. title: "알림",
  42828. content: __TEXT,
  42829. yes: {
  42830. text: "확인",
  42831. isProc: false,
  42832. },
  42833. };
  42834. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  42835. };
  42836. const fnRegEvt = () => {
  42837. let param = {
  42838. id: pageId,
  42839. title: pageId,
  42840. content: "등록하시겠습니까?",
  42841. yes: {
  42842. text: "등록",
  42843. isProc: true,
  42844. event: "FN_INSERT",
  42845. param: "",
  42846. },
  42847. no: {
  42848. text: "취소",
  42849. isProc: false,
  42850. },
  42851. };
  42852. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  42853. };
  42854. const fnUpdEvt = () => {
  42855. let param = {
  42856. id: pageId,
  42857. title: pageId,
  42858. content: "수정하시겠습니까?",
  42859. yes: {
  42860. text: "확인",
  42861. isProc: true,
  42862. event: "FN_UPDATE",
  42863. param: "",
  42864. },
  42865. no: {
  42866. text: "취소",
  42867. isProc: false,
  42868. },
  42869. };
  42870. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  42871. };
  42872. const fnInsert = async () => {
  42873. const formData = new FormData();
  42874. formData.append('name', form.value.formValue1);
  42875. formData.append('price1', form.value.formValue2);
  42876. formData.append('price2', form.value.formValue3);
  42877. formData.append('deli_fee', form.value.formValue4);
  42878. formData.append('thumb_file', form.value.formValue5);
  42879. formData.append('sub_title', form.value.formValue6);
  42880. formData.append('detail', updatedContent.value);
  42881. formData.append('zip_file', form.value.formValue7);
  42882. formData.append('status', form.value.formValue8);
  42883. formData.append('show_yn', form.value.formValue9);
  42884. formData.append('add_info', form.value.formValue10);
  42885. formData.append('company_number', "1");
  42886. useAxios()
  42887. .post('/item/reg', formData, {
  42888. headers: {'Content-Type': 'multipart/form-data'},
  42889. })
  42890. .then((res) => {
  42891. router.push("/view/common/item");
  42892. })
  42893. .catch((error) => {
  42894. })
  42895. .finally(() => {
  42896. });
  42897. };
  42898. const fnUpdate = async () => {
  42899. let req = {
  42900. seq: useDtStore.boardInfo.seq,
  42901. };
  42902. const formData = new FormData();
  42903. formData.append('name', form.value.formValue1);
  42904. formData.append('price1', form.value.formValue2);
  42905. formData.append('price2', form.value.formValue3);
  42906. formData.append('deli_fee', form.value.formValue4);
  42907. if (form.value.formValue5 instanceof File) {
  42908. formData.append('thumb_file', form.value.formValue5);
  42909. }
  42910. formData.append('sub_title', form.value.formValue6);
  42911. formData.append('detail', updatedContent.value);
  42912. if (form.value.formValue7 instanceof File) {
  42913. formData.append('zip_file', form.value.formValue7);
  42914. }
  42915. formData.append('status', form.value.formValue8);
  42916. formData.append('show_yn', form.value.formValue9);
  42917. formData.append('add_info', form.value.formValue10);
  42918. formData.append('company_number', "1");
  42919. try {
  42920. const res = await useAxios().post(`/item/update/${req.seq}`, formData, {
  42921. headers: { 'Content-Type': 'multipart/form-data' },
  42922. });
  42923. router.push("/view/common/item");
  42924. } catch (error) {
  42925. }
  42926. };
  42927. const fnDelEvt = () => {
  42928. let param = {
  42929. id: pageId,
  42930. title: pageId,
  42931. content: "삭제하시겠습니까?",
  42932. yes: {
  42933. text: "확인",
  42934. isProc: true,
  42935. event: "FN_DELETE",
  42936. param: "",
  42937. },
  42938. no: {
  42939. text: "취소",
  42940. isProc: false,
  42941. },
  42942. };
  42943. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  42944. };
  42945. const fnDelete = () => {
  42946. let req = {
  42947. seq: useDtStore.boardInfo.seq,
  42948. };
  42949. useAxios()
  42950. .post(`/item/delete/${req.seq}`)
  42951. .then((res) => {
  42952. //router.push("/view/common/item");
  42953. })
  42954. .catch((error) => {
  42955. })
  42956. .finally(() => {
  42957. });
  42958. };
  42959. const fnDetail = () => {
  42960. let req = {
  42961. seq: useDtStore.boardInfo.seq,
  42962. };
  42963. useAxios()
  42964. .get(`/item/detail/${req.seq}`)
  42965. .then((res) => {
  42966. form.value.formValue1 = res.data.NAME;
  42967. form.value.formValue2 = res.data.PRICE1;
  42968. form.value.formValue3 = res.data.PRICE2;
  42969. form.value.formValue4 = res.data.DELI_FEE;
  42970. form.value.formValue5 = res.data.THUMB_FILE;
  42971. form.value.formValue6 = res.data.SUB_TITLE;
  42972. zipInfo.value.file_path = res.data.ZIP_FILE;
  42973. zipInfo.value.original_name = res.data.ZIP_FILE_ORIGIN;
  42974. //에디터에 컨텐츠 전달
  42975. editorContentReq.value = res.data.DETAIL;
  42976. form.value.formValue8 = res.data.STATUS;
  42977. form.value.formValue9 = res.data.SHOW_YN;
  42978. form.value.formValue10 = res.data.ADD_INFO;
  42979. //썸네일 파일이 있으면 넣어줌
  42980. if(form.value.formValue5){
  42981. imgTemp.value = `https://shopdeli.mycafe24.com/writable/uploads/item/thumb/${form.value.formValue5}`;
  42982. }
  42983. })
  42984. .catch((error) => {
  42985. })
  42986. .finally(() => {
  42987. });
  42988. };
  42989. /*=======================================================================
  42990. | 최종 에디터 이미지 url치환 : S
  42991. /*=======================================================================*/
  42992. const editorContent = async () => {
  42993. const content = sunEditorWrapper.value.getEditorContent();
  42994. updatedContent.value = await processEditorContent(content);
  42995. console.log("Updated content:", updatedContent.value);
  42996. };
  42997. // Base64 데이터를 Blob으로 변환
  42998. const base64ToBlob = (base64, mimeType) => {
  42999. const byteString = atob(base64.split(",")[1]);
  43000. const arrayBuffer = new ArrayBuffer(byteString.length);
  43001. const uint8Array = new Uint8Array(arrayBuffer);
  43002. for (let i = 0; i < byteString.length; i++) {
  43003. uint8Array[i] = byteString.charCodeAt(i);
  43004. }
  43005. return new Blob([uint8Array], { type: mimeType });
  43006. };
  43007. // Base64 데이터를 File 객체로 변환
  43008. const base64ToFile = (base64, mimeType, fileName) => {
  43009. const blob = base64ToBlob(base64, mimeType);
  43010. return new File([blob], fileName, { type: mimeType });
  43011. };
  43012. // 이미지 업로드 처리 (useAxios)
  43013. const uploadImage = async (file) => {
  43014. const formDataEdt = new FormData();
  43015. formDataEdt.append("picObj", file);
  43016. return useAxios()
  43017. .post("/pic/upload", formDataEdt, {
  43018. headers: { "Content-Type": "multipart/form-data" },
  43019. })
  43020. .then((res) => {
  43021. const filePath = res.data.ogn_name.path.replace(/.*\/files\//, "");
  43022. const fileName = res.data.ogn_name.file_name;
  43023. return `${apiUrl.value}/images/${filePath}/${fileName}`; // 최종 URL 반환
  43024. })
  43025. .catch((error) => {
  43026. console.error("Image upload failed:", error);
  43027. return null;
  43028. });
  43029. };
  43030. // 에디터 내용 처리 및 이미지 업로드
  43031. const processEditorContent = async (content) => {
  43032. const parser = new DOMParser();
  43033. const doc = parser.parseFromString(content, "text/html");
  43034. const images = doc.querySelectorAll("img");
  43035. for (let i = 0; i < images.length; i++) {
  43036. const img = images[i];
  43037. const src = img.src;
  43038. if (src.startsWith("data:image")) {
  43039. // MIME 타입과 파일 이름 추출
  43040. const mimeType = src.split(";")[0].split(":")[1];
  43041. const extension = mimeType.split("/")[1];
  43042. const fileName = `image-${i + 1}.${extension}`;
  43043. // Base64 데이터를 File 객체로 변환
  43044. const file = base64ToFile(src, mimeType, fileName);
  43045. // 이미지 업로드 및 URL 반환
  43046. const finalUrl = await uploadImage(file);
  43047. if (finalUrl) {
  43048. img.src = finalUrl; // 이미지 src 업데이트
  43049. }
  43050. }
  43051. }
  43052. return doc.body.innerHTML; // 최종 수정된 HTML 반환
  43053. };
  43054. /*=======================================================================
  43055. | 최종 에디터 이미지 url치환 : E
  43056. /*=======================================================================*/
  43057. /************************************************************************
  43058. | 팝업 이벤트버스 정의
  43059. ************************************************************************/
  43060. $eventBus.off("FN_INSERT");
  43061. $eventBus.on("FN_INSERT", () => {
  43062. fnInsert();
  43063. });
  43064. $eventBus.off("FN_UPDATE");
  43065. $eventBus.on("FN_UPDATE", () => {
  43066. fnUpdate();
  43067. });
  43068. $eventBus.off("FN_DELETE");
  43069. $eventBus.on("FN_DELETE", () => {
  43070. fnDelete();
  43071. });
  43072. /************************************************************************
  43073. | 라이프사이클
  43074. ************************************************************************/
  43075. onMounted(() => {
  43076. pageType.value = useDtStore.boardInfo.pageType;
  43077. if(pageType.value == "I"){
  43078. pageId.value = "제품 등록"
  43079. } else if(pageType.value == "U"){
  43080. pageId.value = "제품 수정"
  43081. } else {
  43082. pageId.value = "제품 상세"
  43083. }
  43084. //상세 등록 아니 리스트 클릭시 상세 정보로 접근
  43085. if (pageType.value !== "I") {
  43086. fnDetail();
  43087. }
  43088. });
  43089. /************************************************************************
  43090. | WATCH
  43091. ************************************************************************/
  43092. </script>
  43093. </file>
  43094. <file path="pages/view/influencer/search.vue">
  43095. <template>
  43096. <div>
  43097. <div class="inner--headers">
  43098. <h2>벤더사 검색</h2>
  43099. <div class="bread--crumbs--wrap">
  43100. <span>홈</span>
  43101. <span>벤더사 검색</span>
  43102. </div>
  43103. </div>
  43104. <!-- 검색 및 필터 영역 -->
  43105. <div class="search--modules type2">
  43106. <div class="search--inner">
  43107. <div class="form--cont--filter">
  43108. <v-select
  43109. v-model="searchFilter.category"
  43110. :items="categoryOptions"
  43111. variant="outlined"
  43112. class="custom-select"
  43113. label="카테고리"
  43114. hide-details
  43115. >
  43116. </v-select>
  43117. </div>
  43118. <div class="form--cont--filter">
  43119. <v-select
  43120. v-model="searchFilter.region"
  43121. :items="regionOptions"
  43122. variant="outlined"
  43123. class="custom-select"
  43124. label="지역"
  43125. hide-details
  43126. >
  43127. </v-select>
  43128. </div>
  43129. <div class="form--cont--text">
  43130. <v-text-field
  43131. v-model="searchFilter.keyword"
  43132. class="custom-input mini"
  43133. style="width: 100%"
  43134. placeholder="벤더사명을 입력하세요"
  43135. @keyup.enter="handleSearch"
  43136. ></v-text-field>
  43137. </div>
  43138. </div>
  43139. <v-btn
  43140. class="custom-btn btn-blue mini sch--btn"
  43141. @click="handleSearch"
  43142. :loading="loading"
  43143. >
  43144. <v-icon>mdi-magnify</v-icon>
  43145. 검색
  43146. </v-btn>
  43147. </div>
  43148. <!-- 파트너십 상태 탭 -->
  43149. <div class="partnership--tabs">
  43150. <v-tabs v-model="activeTab" class="custom-tabs">
  43151. <v-tab value="new">신규 벤더사</v-tab>
  43152. <v-tab value="current">현재 파트너십</v-tab>
  43153. <v-tab value="rejected">거부된 요청</v-tab>
  43154. <v-tab value="terminated">해지된 파트너십</v-tab>
  43155. </v-tabs>
  43156. </div>
  43157. <!-- 검색 결과 -->
  43158. <div class="vendor--grid">
  43159. <div class="vendors--list">
  43160. <!-- 로딩 상태 -->
  43161. <div v-if="loading" class="loading-wrap">
  43162. <v-progress-circular
  43163. indeterminate
  43164. color="primary"
  43165. size="64"
  43166. ></v-progress-circular>
  43167. <p>검색 중...</p>
  43168. </div>
  43169. <!-- 검색 결과 없음 -->
  43170. <div v-else-if="filteredVendors.length === 0" class="no-results">
  43171. <div class="no-data">
  43172. <v-icon size="64" color="grey-lighten-1">mdi-office-building-outline</v-icon>
  43173. <h3>검색 결과가 없습니다</h3>
  43174. <p>다른 키워드로 검색해보세요</p>
  43175. </div>
  43176. </div>
  43177. <!-- 벤더사 카드 리스트 -->
  43178. <div v-else class="vendor--cards">
  43179. <div
  43180. v-for="vendor in filteredVendors"
  43181. :key="vendor.SEQ"
  43182. class="vendor--card"
  43183. :class="{ 'partnership-exists': vendor.PARTNERSHIP_STATUS }"
  43184. >
  43185. <!-- 벤더사 로고 -->
  43186. <div class="vendor--logo">
  43187. <v-img
  43188. v-if="vendor.LOGO"
  43189. :src="vendor.LOGO"
  43190. :alt="vendor.COMPANY_NAME"
  43191. width="80"
  43192. height="80"
  43193. cover
  43194. ></v-img>
  43195. <div v-else class="no-logo">
  43196. {{ vendor.COMPANY_NAME?.charAt(0) || "V" }}
  43197. </div>
  43198. </div>
  43199. <!-- 벤더사 정보 -->
  43200. <div class="vendor--info">
  43201. <h3 class="vendor--name">{{ vendor.COMPANY_NAME }}</h3>
  43202. <div class="vendor--meta">
  43203. <div v-if="vendor.CATEGORY" class="meta--item">
  43204. <v-icon size="16">mdi-tag-outline</v-icon>
  43205. <span>{{ getCategoryText(vendor.CATEGORY) }}</span>
  43206. </div>
  43207. <div v-if="vendor.REGION" class="meta--item">
  43208. <v-icon size="16">mdi-map-marker-outline</v-icon>
  43209. <span>{{ vendor.REGION }}</span>
  43210. </div>
  43211. <div class="meta--item">
  43212. <v-icon size="16">mdi-handshake-outline</v-icon>
  43213. <span>{{ vendor.PARTNERSHIP_COUNT || 0 }}개 파트너십</span>
  43214. </div>
  43215. </div>
  43216. <p v-if="vendor.DESCRIPTION" class="vendor--description">
  43217. {{ vendor.DESCRIPTION }}
  43218. </p>
  43219. <!-- 파트너십 상태 -->
  43220. <div v-if="vendor.PARTNERSHIP_STATUS" class="partnership--status">
  43221. <v-chip
  43222. :color="getPartnershipColor(vendor.PARTNERSHIP_STATUS)"
  43223. size="small"
  43224. variant="tonal"
  43225. >
  43226. {{ getPartnershipText(vendor.PARTNERSHIP_STATUS) }}
  43227. </v-chip>
  43228. <!-- 거부 사유 표시 -->
  43229. <div
  43230. v-if="
  43231. vendor.PARTNERSHIP_STATUS === 'REJECTED' && vendor.RESPONSE_MESSAGE
  43232. "
  43233. class="rejection--reason"
  43234. >
  43235. <v-alert type="error" variant="tonal" density="compact" class="mt-2">
  43236. <div class="rejection--content">
  43237. <strong>거부 사유:</strong>
  43238. <p class="mt-1">{{ vendor.RESPONSE_MESSAGE }}</p>
  43239. <small class="text-grey">{{
  43240. formatDate(vendor.RESPONSE_DATE)
  43241. }}</small>
  43242. </div>
  43243. </v-alert>
  43244. </div>
  43245. </div>
  43246. </div>
  43247. <!-- 액션 버튼 -->
  43248. <div class="vendor--actions">
  43249. <!-- 신규 벤더사 - 승인요청 -->
  43250. <v-btn
  43251. v-if="!vendor.PARTNERSHIP_STATUS"
  43252. color="primary"
  43253. variant="flat"
  43254. size="small"
  43255. @click="requestPartnership(vendor)"
  43256. :loading="processing"
  43257. >
  43258. <v-icon left size="16">mdi-handshake</v-icon>
  43259. 승인요청
  43260. </v-btn>
  43261. <!-- 거부된 요청 - 재승인요청 -->
  43262. <v-btn
  43263. v-else-if="vendor.PARTNERSHIP_STATUS === 'REJECTED'"
  43264. color="orange"
  43265. variant="flat"
  43266. size="small"
  43267. @click="requestReapply(vendor)"
  43268. :loading="processing"
  43269. >
  43270. <v-icon left size="16">mdi-refresh</v-icon>
  43271. 재승인요청
  43272. </v-btn>
  43273. <!-- 해지된 파트너십 - 재승인요청 -->
  43274. <v-btn
  43275. v-else-if="vendor.PARTNERSHIP_STATUS === 'TERMINATED'"
  43276. color="success"
  43277. variant="flat"
  43278. size="small"
  43279. @click="requestReapply(vendor)"
  43280. :loading="processing"
  43281. >
  43282. <v-icon left size="16">mdi-refresh</v-icon>
  43283. 재승인요청
  43284. </v-btn>
  43285. <!-- 진행중인 파트너십 -->
  43286. <v-btn
  43287. v-else
  43288. variant="outlined"
  43289. size="small"
  43290. @click="viewPartnership(vendor)"
  43291. >
  43292. 파트너십 보기
  43293. </v-btn>
  43294. <!-- 상세보기 버튼 -->
  43295. <v-btn variant="text" size="small" @click="viewVendorDetail(vendor.SEQ)">
  43296. 상세보기
  43297. </v-btn>
  43298. </div>
  43299. </div>
  43300. </div>
  43301. </div>
  43302. <!-- 페이지네이션 -->
  43303. <div v-if="pagination.totalPages > 1" class="pagination-wrap">
  43304. <v-pagination
  43305. v-model="currentPage"
  43306. :length="pagination.totalPages"
  43307. :total-visible="5"
  43308. @update:model-value="handlePageChange"
  43309. ></v-pagination>
  43310. </div>
  43311. </div>
  43312. <!-- 승인요청 모달 -->
  43313. <v-dialog v-model="requestModal.show" max-width="600px" persistent>
  43314. <v-card>
  43315. <v-card-title class="d-flex align-center">
  43316. <v-icon class="mr-3" color="primary">mdi-handshake</v-icon>
  43317. {{ requestModal.isReapply ? "재승인요청" : "파트너십 승인요청" }}
  43318. </v-card-title>
  43319. <v-card-text>
  43320. <div class="request--content">
  43321. <div class="vendor--summary">
  43322. <h4>{{ requestModal.vendor?.COMPANY_NAME }}</h4>
  43323. <p>
  43324. {{ getCategoryText(requestModal.vendor?.CATEGORY) }} ·
  43325. {{ requestModal.vendor?.REGION }}
  43326. </p>
  43327. </div>
  43328. <v-divider class="my-4"></v-divider>
  43329. <v-textarea
  43330. v-model="requestModal.message"
  43331. label="요청 메시지"
  43332. placeholder="파트너십을 원하는 이유나 제안사항을 입력해주세요"
  43333. rows="4"
  43334. variant="outlined"
  43335. class="mb-4"
  43336. ></v-textarea>
  43337. <div class="form-row">
  43338. <v-text-field
  43339. v-model="requestModal.commissionRate"
  43340. label="희망 수수료율 (%)"
  43341. type="number"
  43342. variant="outlined"
  43343. class="mr-2"
  43344. :disabled="requestModal.isReapply"
  43345. ></v-text-field>
  43346. <v-text-field
  43347. v-model="requestModal.specialConditions"
  43348. label="특별 조건"
  43349. variant="outlined"
  43350. :disabled="requestModal.isReapply"
  43351. ></v-text-field>
  43352. </div>
  43353. <div v-if="requestModal.isReapply" class="reapply--info">
  43354. <v-alert type="info" variant="tonal" class="mb-3">
  43355. 재승인요청 시 이전 계약 조건이 자동으로 적용됩니다.
  43356. </v-alert>
  43357. </div>
  43358. </div>
  43359. </v-card-text>
  43360. <v-card-actions>
  43361. <v-spacer></v-spacer>
  43362. <v-btn variant="text" @click="closeRequestModal">취소</v-btn>
  43363. <v-btn
  43364. color="primary"
  43365. variant="flat"
  43366. @click="submitRequest"
  43367. :loading="processing"
  43368. :disabled="!requestModal.message.trim()"
  43369. >
  43370. {{ requestModal.isReapply ? "재승인요청" : "승인요청" }}
  43371. </v-btn>
  43372. </v-card-actions>
  43373. </v-card>
  43374. </v-dialog>
  43375. </div>
  43376. </template>
  43377. <script setup>
  43378. import { ref, computed, onMounted } from "vue";
  43379. definePageMeta({
  43380. layout: "default",
  43381. });
  43382. const { $toast } = useNuxtApp();
  43383. const authStore = useAuthStore();
  43384. // 반응형 데이터
  43385. const loading = ref(false);
  43386. const processing = ref(false);
  43387. const vendors = ref([]);
  43388. const currentPage = ref(1);
  43389. const activeTab = ref("new");
  43390. const searchFilter = ref({
  43391. keyword: "",
  43392. category: "",
  43393. region: "",
  43394. });
  43395. const pagination = ref({
  43396. currentPage: 1,
  43397. totalPages: 1,
  43398. totalCount: 0,
  43399. pageSize: 12,
  43400. });
  43401. const requestModal = ref({
  43402. show: false,
  43403. vendor: null,
  43404. message: "",
  43405. commissionRate: "",
  43406. specialConditions: "",
  43407. isReapply: false,
  43408. });
  43409. // 옵션 데이터
  43410. const categoryOptions = [
  43411. { title: "전체", value: "" },
  43412. { title: "패션·뷰티", value: "FASHION_BEAUTY" },
  43413. { title: "식품·건강", value: "FOOD_HEALTH" },
  43414. { title: "라이프스타일", value: "LIFESTYLE" },
  43415. { title: "테크·가전", value: "TECH_ELECTRONICS" },
  43416. { title: "스포츠·레저", value: "SPORTS_LEISURE" },
  43417. { title: "문화·엔터테인먼트", value: "CULTURE_ENTERTAINMENT" },
  43418. ];
  43419. const regionOptions = [
  43420. { title: "전체", value: "" },
  43421. { title: "서울", value: "SEOUL" },
  43422. { title: "경기", value: "GYEONGGI" },
  43423. { title: "인천", value: "INCHEON" },
  43424. { title: "부산", value: "BUSAN" },
  43425. { title: "대구", value: "DAEGU" },
  43426. { title: "대전", value: "DAEJEON" },
  43427. { title: "광주", value: "GWANGJU" },
  43428. { title: "울산", value: "ULSAN" },
  43429. { title: "기타", value: "OTHER" },
  43430. ];
  43431. // 현재 사용자 SEQ
  43432. const currentUserSeq = computed(() => authStore.getUserSeq);
  43433. // 필터링된 벤더사 목록
  43434. const filteredVendors = computed(() => {
  43435. if (activeTab.value === "new") {
  43436. return vendors.value.filter((v) => !v.PARTNERSHIP_STATUS);
  43437. } else if (activeTab.value === "current") {
  43438. return vendors.value.filter((v) =>
  43439. ["PENDING", "APPROVED"].includes(v.PARTNERSHIP_STATUS)
  43440. );
  43441. } else if (activeTab.value === "rejected") {
  43442. return vendors.value.filter((v) => v.PARTNERSHIP_STATUS === "REJECTED");
  43443. } else if (activeTab.value === "terminated") {
  43444. return vendors.value.filter((v) => v.PARTNERSHIP_STATUS === "TERMINATED");
  43445. }
  43446. return vendors.value;
  43447. });
  43448. // 메서드들
  43449. const handleSearch = async () => {
  43450. loading.value = true;
  43451. currentPage.value = 1;
  43452. try {
  43453. const params = {
  43454. keyword: searchFilter.value.keyword,
  43455. category: searchFilter.value.category,
  43456. region: searchFilter.value.region,
  43457. sortBy: "latest",
  43458. page: currentPage.value,
  43459. size: pagination.value.pageSize,
  43460. influencerSeq: currentUserSeq.value,
  43461. };
  43462. useAxios()
  43463. .post("/api/vendor-influencer/search-vendors", params)
  43464. .then((res) => {
  43465. console.log("Search API Response:", res.data); // 디버깅 로그
  43466. if (res.data.success) {
  43467. vendors.value = res.data.data.items || [];
  43468. pagination.value = res.data.data.pagination || {};
  43469. console.log("Vendors set:", vendors.value.length); // 디버깅 로그
  43470. console.log("Pagination set:", pagination.value); // 디버깅 로그
  43471. } else {
  43472. $toast.error(res.data.message || "검색에 실패했습니다.");
  43473. }
  43474. })
  43475. .catch((err) => {
  43476. $toast.error("검색 중 오류가 발생했습니다.");
  43477. console.error("Search error:", err);
  43478. })
  43479. .finally(() => {
  43480. loading.value = false;
  43481. });
  43482. } catch (err) {
  43483. $toast.error("검색 중 오류가 발생했습니다.");
  43484. loading.value = false;
  43485. }
  43486. };
  43487. const handlePageChange = (page) => {
  43488. currentPage.value = page;
  43489. handleSearch();
  43490. };
  43491. // 파트너십 요청
  43492. const requestPartnership = (vendor) => {
  43493. requestModal.value = {
  43494. show: true,
  43495. vendor: vendor,
  43496. message: "",
  43497. commissionRate: "",
  43498. specialConditions: "",
  43499. isReapply: false,
  43500. };
  43501. };
  43502. // 재승인요청
  43503. const requestReapply = (vendor) => {
  43504. // 거부된 요청인지 해지된 요청인지 구분
  43505. const isRejected = vendor.PARTNERSHIP_STATUS === "REJECTED";
  43506. const defaultMessage = isRejected
  43507. ? "이전 요청이 거부되었지만, 조건을 수정하여 다시 승인 요청드립니다."
  43508. : "재승인 요청드립니다.";
  43509. requestModal.value = {
  43510. show: true,
  43511. vendor: vendor,
  43512. message: defaultMessage,
  43513. commissionRate: vendor.COMMISSION_RATE || "",
  43514. specialConditions: vendor.SPECIAL_CONDITIONS || "",
  43515. isReapply: true,
  43516. };
  43517. };
  43518. const submitRequest = async () => {
  43519. try {
  43520. processing.value = true;
  43521. const endpoint = requestModal.value.isReapply
  43522. ? "/api/vendor-influencer/reapply-request"
  43523. : "/api/vendor-influencer/create-request";
  43524. // 디버깅 로그
  43525. console.log("Current User SEQ:", currentUserSeq.value);
  43526. console.log("Auth Store:", authStore);
  43527. const params = {
  43528. vendorSeq: requestModal.value.vendor.SEQ,
  43529. influencerSeq: currentUserSeq.value,
  43530. requestMessage: requestModal.value.message,
  43531. requestedBy: currentUserSeq.value,
  43532. ...(requestModal.value.isReapply
  43533. ? {}
  43534. : {
  43535. commissionRate: requestModal.value.commissionRate,
  43536. specialConditions: requestModal.value.specialConditions,
  43537. }),
  43538. };
  43539. console.log("Request Params:", params);
  43540. useAxios()
  43541. .post(endpoint, params)
  43542. .then((res) => {
  43543. if (res.data.success) {
  43544. $toast.success(res.data.message);
  43545. closeRequestModal();
  43546. handleSearch(); // 리스트 새로고침
  43547. } else {
  43548. $toast.error(res.data.message || "요청 처리에 실패했습니다.");
  43549. }
  43550. })
  43551. .catch((err) => {
  43552. $toast.error("요청 처리 중 오류가 발생했습니다.");
  43553. console.error("Request error:", err);
  43554. })
  43555. .finally(() => {
  43556. processing.value = false;
  43557. });
  43558. } catch (err) {
  43559. $toast.error("요청 처리 중 오류가 발생했습니다.");
  43560. processing.value = false;
  43561. }
  43562. };
  43563. const closeRequestModal = () => {
  43564. requestModal.value = {
  43565. show: false,
  43566. vendor: null,
  43567. message: "",
  43568. commissionRate: "",
  43569. specialConditions: "",
  43570. isReapply: false,
  43571. };
  43572. };
  43573. const viewPartnership = (vendor) => {
  43574. navigateTo(`/view/influencer/partnerships`);
  43575. };
  43576. const viewVendorDetail = (vendorSeq) => {
  43577. navigateTo(`/view/vendor/${vendorSeq}`);
  43578. };
  43579. // 유틸리티 함수들
  43580. const getCategoryText = (category) => {
  43581. const categoryMap = {
  43582. FASHION_BEAUTY: "패션·뷰티",
  43583. FOOD_HEALTH: "식품·건강",
  43584. LIFESTYLE: "라이프스타일",
  43585. TECH_ELECTRONICS: "테크·가전",
  43586. SPORTS_LEISURE: "스포츠·레저",
  43587. CULTURE_ENTERTAINMENT: "문화·엔터테인먼트",
  43588. };
  43589. return categoryMap[category] || category || "기타";
  43590. };
  43591. const getPartnershipColor = (status) => {
  43592. const colorMap = {
  43593. PENDING: "warning",
  43594. APPROVED: "success",
  43595. REJECTED: "error",
  43596. TERMINATED: "grey",
  43597. CANCELLED: "grey",
  43598. };
  43599. return colorMap[status] || "grey";
  43600. };
  43601. const getPartnershipText = (status) => {
  43602. const textMap = {
  43603. PENDING: "승인 대기중",
  43604. APPROVED: "파트너십 진행중",
  43605. REJECTED: "승인 거부",
  43606. TERMINATED: "파트너십 해지됨",
  43607. CANCELLED: "요청 취소됨",
  43608. };
  43609. return textMap[status] || status || "알 수 없음";
  43610. };
  43611. // 라이프사이클
  43612. onMounted(() => {
  43613. handleSearch();
  43614. });
  43615. </script>
  43616. <style scoped>
  43617. .partnership--tabs {
  43618. margin: 24px 0;
  43619. }
  43620. .vendor--grid {
  43621. margin-top: 24px;
  43622. }
  43623. .vendor--cards {
  43624. display: grid;
  43625. grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
  43626. gap: 24px;
  43627. }
  43628. .vendor--card {
  43629. background: white;
  43630. border-radius: 12px;
  43631. padding: 24px;
  43632. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  43633. transition: transform 0.2s, box-shadow 0.2s;
  43634. display: flex;
  43635. gap: 20px;
  43636. }
  43637. .vendor--card:hover {
  43638. transform: translateY(-4px);
  43639. box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
  43640. }
  43641. .vendor--card.partnership-exists {
  43642. border-left: 4px solid #4caf50;
  43643. }
  43644. .vendor--logo {
  43645. width: 80px;
  43646. height: 80px;
  43647. border-radius: 8px;
  43648. overflow: hidden;
  43649. flex-shrink: 0;
  43650. background: #f5f5f5;
  43651. display: flex;
  43652. align-items: center;
  43653. justify-content: center;
  43654. }
  43655. .no-logo {
  43656. font-size: 32px;
  43657. font-weight: bold;
  43658. color: #666;
  43659. }
  43660. .vendor--info {
  43661. flex: 1;
  43662. }
  43663. .vendor--name {
  43664. margin: 0 0 12px 0;
  43665. font-size: 18px;
  43666. font-weight: 600;
  43667. color: #333;
  43668. }
  43669. .vendor--meta {
  43670. display: flex;
  43671. flex-wrap: wrap;
  43672. gap: 12px;
  43673. margin-bottom: 12px;
  43674. }
  43675. .meta--item {
  43676. display: flex;
  43677. align-items: center;
  43678. gap: 4px;
  43679. color: #666;
  43680. font-size: 14px;
  43681. }
  43682. .vendor--description {
  43683. font-size: 14px;
  43684. line-height: 1.5;
  43685. color: #666;
  43686. margin: 0 0 16px 0;
  43687. display: -webkit-box;
  43688. -webkit-line-clamp: 2;
  43689. -webkit-box-orient: vertical;
  43690. overflow: hidden;
  43691. }
  43692. .partnership--status {
  43693. margin-bottom: 16px;
  43694. }
  43695. .vendor--actions {
  43696. display: flex;
  43697. flex-direction: column;
  43698. gap: 8px;
  43699. flex-shrink: 0;
  43700. }
  43701. .request--content {
  43702. padding: 8px 0;
  43703. }
  43704. .vendor--summary h4 {
  43705. margin: 0 0 4px 0;
  43706. font-size: 16px;
  43707. font-weight: 600;
  43708. }
  43709. .vendor--summary p {
  43710. margin: 0;
  43711. color: #666;
  43712. font-size: 14px;
  43713. }
  43714. .form-row {
  43715. display: flex;
  43716. gap: 12px;
  43717. }
  43718. .reapply--info {
  43719. margin-top: 16px;
  43720. }
  43721. .loading-wrap {
  43722. display: flex;
  43723. flex-direction: column;
  43724. align-items: center;
  43725. justify-content: center;
  43726. padding: 60px 20px;
  43727. }
  43728. .loading-wrap p {
  43729. margin-top: 16px;
  43730. color: #666;
  43731. }
  43732. .no-results {
  43733. display: flex;
  43734. justify-content: center;
  43735. padding: 60px 20px;
  43736. }
  43737. .no-data {
  43738. text-align: center;
  43739. }
  43740. .no-data h3 {
  43741. margin: 16px 0 8px;
  43742. color: #666;
  43743. }
  43744. .no-data p {
  43745. color: #999;
  43746. }
  43747. .pagination-wrap {
  43748. display: flex;
  43749. justify-content: center;
  43750. margin-top: 32px;
  43751. }
  43752. .rejection--content {
  43753. font-size: 0.875rem;
  43754. }
  43755. .rejection--content p {
  43756. margin: 4px 0;
  43757. line-height: 1.4;
  43758. }
  43759. .rejection--content small {
  43760. font-size: 0.75rem;
  43761. opacity: 0.8;
  43762. }
  43763. @media (max-width: 768px) {
  43764. .vendor--cards {
  43765. grid-template-columns: 1fr;
  43766. }
  43767. .vendor--card {
  43768. flex-direction: column;
  43769. text-align: center;
  43770. }
  43771. .vendor--actions {
  43772. flex-direction: row;
  43773. justify-content: center;
  43774. }
  43775. .form-row {
  43776. flex-direction: column;
  43777. }
  43778. }
  43779. </style>
  43780. </file>
  43781. <file path="pages/view/vendor/[id].vue">
  43782. <template>
  43783. <div>
  43784. <div class="inner--headers">
  43785. <h2>{{ pageId }}</h2>
  43786. <div class="bread--crumbs--wrap">
  43787. <span>홈</span>
  43788. <span @click="goBack" class="breadcrumb-link">벤더사 관리</span>
  43789. <span>{{ currentVendor?.name || "벤더사 상세" }}</span>
  43790. </div>
  43791. </div>
  43792. <!-- 로딩 상태 -->
  43793. <div v-if="isLoading" class="loading-wrap">
  43794. <v-progress-circular indeterminate color="primary" size="64"></v-progress-circular>
  43795. <p>벤더사 정보를 불러오고 있습니다...</p>
  43796. </div>
  43797. <!-- 에러 상태 -->
  43798. <div v-else-if="errorMessage" class="error-wrap">
  43799. <v-alert type="error" dismissible @click:close="vendorsStore.clearError()">
  43800. {{ errorMessage }}
  43801. </v-alert>
  43802. <v-btn @click="goBack" class="custom-btn btn-blue">목록으로 돌아가기</v-btn>
  43803. </div>
  43804. <!-- 벤더사 상세 정보 -->
  43805. <div v-else-if="currentVendor" class="vendor-detail-wrap">
  43806. <!-- 벤더사 기본 정보 -->
  43807. <v-card class="vendor-header-card" elevation="2">
  43808. <v-card-text>
  43809. <div class="vendor-header">
  43810. <div class="vendor-logo-section">
  43811. <v-avatar size="80" class="vendor-logo-large">
  43812. <v-img
  43813. v-if="currentVendor.logo"
  43814. :src="currentVendor.logo"
  43815. :alt="currentVendor.name + ' 로고'"
  43816. ></v-img>
  43817. <div v-else class="no-logo-large">{{ currentVendor.name.charAt(0) }}</div>
  43818. </v-avatar>
  43819. </div>
  43820. <div class="vendor-info-section">
  43821. <h1 class="vendor-name">{{ currentVendor.name }}</h1>
  43822. <div class="vendor-meta">
  43823. <v-chip
  43824. :color="getCategoryColor(currentVendor.category)"
  43825. size="large"
  43826. variant="outlined"
  43827. class="mr-2"
  43828. >
  43829. {{ getCategoryName(currentVendor.category) }}
  43830. </v-chip>
  43831. <v-chip
  43832. :color="currentVendor.status === 'ACTIVE' ? 'success' : 'error'"
  43833. size="large"
  43834. >
  43835. {{ currentVendor.status === "ACTIVE" ? "활성" : "비활성" }}
  43836. </v-chip>
  43837. </div>
  43838. <p v-if="currentVendor.description" class="vendor-description">
  43839. {{ currentVendor.description }}
  43840. </p>
  43841. </div>
  43842. <div class="vendor-actions">
  43843. <v-btn
  43844. v-if="currentVendor.website"
  43845. :href="currentVendor.website"
  43846. target="_blank"
  43847. class="custom-btn btn-white mr-2"
  43848. prepend-icon="mdi-web"
  43849. >
  43850. 웹사이트
  43851. </v-btn>
  43852. <v-btn
  43853. @click="goBack"
  43854. class="custom-btn btn-blue"
  43855. prepend-icon="mdi-arrow-left"
  43856. >
  43857. 목록으로
  43858. </v-btn>
  43859. </div>
  43860. </div>
  43861. </v-card-text>
  43862. </v-card>
  43863. <!-- 상세 정보 탭 -->
  43864. <v-card class="detail-tabs-card" elevation="2">
  43865. <v-tabs v-model="activeTab" class="custom-tabs">
  43866. <v-tab value="info">기업 정보</v-tab>
  43867. <v-tab value="contact">연락처</v-tab>
  43868. <v-tab value="products">제품 정보</v-tab>
  43869. <v-tab value="partnership">파트너십</v-tab>
  43870. </v-tabs>
  43871. <v-card-text>
  43872. <v-tabs-window v-model="activeTab">
  43873. <!-- 기업 정보 탭 -->
  43874. <v-tabs-window-item value="info">
  43875. <div class="info-section">
  43876. <v-row>
  43877. <v-col cols="12" md="6">
  43878. <div class="info-item">
  43879. <h3>사업자등록번호</h3>
  43880. <p>{{ currentVendor.businessNumber || "-" }}</p>
  43881. </div>
  43882. </v-col>
  43883. <v-col cols="12" md="6">
  43884. <div class="info-item">
  43885. <h3>설립일</h3>
  43886. <p>{{ formatDate(currentVendor.establishedDate) || "-" }}</p>
  43887. </div>
  43888. </v-col>
  43889. <v-col cols="12" md="6">
  43890. <div class="info-item">
  43891. <h3>직원 수</h3>
  43892. <p>
  43893. {{
  43894. currentVendor.employeeCount
  43895. ? currentVendor.employeeCount + "명"
  43896. : "-"
  43897. }}
  43898. </p>
  43899. </div>
  43900. </v-col>
  43901. <v-col cols="12" md="6">
  43902. <div class="info-item">
  43903. <h3>연매출</h3>
  43904. <p>{{ formatCurrency(currentVendor.annualRevenue) || "-" }}</p>
  43905. </div>
  43906. </v-col>
  43907. <v-col cols="12">
  43908. <div class="info-item">
  43909. <h3>사업 분야</h3>
  43910. <div class="business-areas">
  43911. <v-chip
  43912. v-for="area in currentVendor.businessAreas || []"
  43913. :key="area"
  43914. size="small"
  43915. variant="outlined"
  43916. class="mr-2 mb-2"
  43917. >
  43918. {{ area }}
  43919. </v-chip>
  43920. </div>
  43921. </div>
  43922. </v-col>
  43923. </v-row>
  43924. </div>
  43925. </v-tabs-window-item>
  43926. <!-- 연락처 탭 -->
  43927. <v-tabs-window-item value="contact">
  43928. <div class="contact-section">
  43929. <v-row>
  43930. <v-col cols="12" md="6">
  43931. <v-card variant="outlined" class="contact-card">
  43932. <v-card-title>
  43933. <v-icon class="mr-2">mdi-account</v-icon>
  43934. 주요 담당자
  43935. </v-card-title>
  43936. <v-card-text>
  43937. <div class="contact-item">
  43938. <strong>이름:</strong> {{ currentVendor.contactName || "-" }}
  43939. </div>
  43940. <div class="contact-item">
  43941. <strong>직책:</strong>
  43942. {{ currentVendor.contactPosition || "-" }}
  43943. </div>
  43944. <div class="contact-item">
  43945. <strong>전화:</strong>
  43946. <a
  43947. v-if="currentVendor.contactPhone"
  43948. :href="`tel:${currentVendor.contactPhone}`"
  43949. >
  43950. {{ currentVendor.contactPhone }}
  43951. </a>
  43952. <span v-else>-</span>
  43953. </div>
  43954. <div class="contact-item">
  43955. <strong>이메일:</strong>
  43956. <a
  43957. v-if="currentVendor.contactEmail"
  43958. :href="`mailto:${currentVendor.contactEmail}`"
  43959. >
  43960. {{ currentVendor.contactEmail }}
  43961. </a>
  43962. <span v-else>-</span>
  43963. </div>
  43964. </v-card-text>
  43965. </v-card>
  43966. </v-col>
  43967. <v-col cols="12" md="6">
  43968. <v-card variant="outlined" class="contact-card">
  43969. <v-card-title>
  43970. <v-icon class="mr-2">mdi-map-marker</v-icon>
  43971. 주소 정보
  43972. </v-card-title>
  43973. <v-card-text>
  43974. <div class="contact-item">
  43975. <strong>주소:</strong>
  43976. <p>{{ currentVendor.address || "-" }}</p>
  43977. </div>
  43978. <div class="contact-item">
  43979. <strong>상세주소:</strong>
  43980. <p>{{ currentVendor.detailAddress || "-" }}</p>
  43981. </div>
  43982. <div class="contact-item">
  43983. <strong>우편번호:</strong> {{ currentVendor.zipCode || "-" }}
  43984. </div>
  43985. </v-card-text>
  43986. </v-card>
  43987. </v-col>
  43988. </v-row>
  43989. </div>
  43990. </v-tabs-window-item>
  43991. <!-- 제품 정보 탭 -->
  43992. <v-tabs-window-item value="products">
  43993. <div class="products-section">
  43994. <div class="section-header">
  43995. <h3>주요 제품/서비스</h3>
  43996. </div>
  43997. <v-row v-if="currentVendor.products && currentVendor.products.length > 0">
  43998. <v-col
  43999. v-for="product in currentVendor.products"
  44000. :key="product.id"
  44001. cols="12"
  44002. md="6"
  44003. lg="4"
  44004. >
  44005. <v-card class="product-card" variant="outlined">
  44006. <v-img
  44007. v-if="product.image"
  44008. :src="product.image"
  44009. height="150"
  44010. cover
  44011. ></v-img>
  44012. <v-card-title>{{ product.name }}</v-card-title>
  44013. <v-card-text>
  44014. <p>{{ product.description }}</p>
  44015. <div class="product-price" v-if="product.price">
  44016. {{ formatCurrency(product.price) }}
  44017. </div>
  44018. </v-card-text>
  44019. </v-card>
  44020. </v-col>
  44021. </v-row>
  44022. <div v-else class="no-data">
  44023. <v-icon size="48" color="grey-lighten-1">mdi-package-variant</v-icon>
  44024. <p>등록된 제품 정보가 없습니다</p>
  44025. </div>
  44026. </div>
  44027. </v-tabs-window-item>
  44028. <!-- 파트너십 탭 -->
  44029. <v-tabs-window-item value="partnership">
  44030. <div class="partnership-section">
  44031. <v-row>
  44032. <v-col cols="12" md="6">
  44033. <div class="info-item">
  44034. <h3>파트너십 등급</h3>
  44035. <v-chip
  44036. :color="getPartnershipColor(currentVendor.partnershipLevel)"
  44037. size="large"
  44038. >
  44039. {{ getPartnershipName(currentVendor.partnershipLevel) }}
  44040. </v-chip>
  44041. </div>
  44042. </v-col>
  44043. <v-col cols="12" md="6">
  44044. <div class="info-item">
  44045. <h3>협력 시작일</h3>
  44046. <p>{{ formatDate(currentVendor.partnershipStartDate) || "-" }}</p>
  44047. </div>
  44048. </v-col>
  44049. <v-col cols="12" md="6">
  44050. <div class="info-item">
  44051. <h3>협력 프로젝트 수</h3>
  44052. <p>{{ currentVendor.projectCount || 0 }}개</p>
  44053. </div>
  44054. </v-col>
  44055. <v-col cols="12" md="6">
  44056. <div class="info-item">
  44057. <h3>평점</h3>
  44058. <div class="rating">
  44059. <v-rating
  44060. v-model="currentVendor.rating"
  44061. readonly
  44062. size="small"
  44063. density="compact"
  44064. ></v-rating>
  44065. <span class="rating-text">{{ currentVendor.rating || 0 }}/5</span>
  44066. </div>
  44067. </div>
  44068. </v-col>
  44069. <v-col cols="12">
  44070. <div class="info-item">
  44071. <h3>특이사항</h3>
  44072. <p>{{ currentVendor.notes || "특이사항이 없습니다." }}</p>
  44073. </div>
  44074. </v-col>
  44075. </v-row>
  44076. </div>
  44077. </v-tabs-window-item>
  44078. </v-tabs-window>
  44079. </v-card-text>
  44080. </v-card>
  44081. </div>
  44082. <!-- 데이터가 없을 때 -->
  44083. <div v-else class="no-data-wrap">
  44084. <div class="no-data">
  44085. <v-icon size="64" color="grey-lighten-1">mdi-store-alert</v-icon>
  44086. <h3>벤더사 정보를 찾을 수 없습니다</h3>
  44087. <p>요청하신 벤더사가 존재하지 않거나 삭제되었을 수 있습니다</p>
  44088. <v-btn @click="goBack" class="custom-btn btn-blue">목록으로 돌아가기</v-btn>
  44089. </div>
  44090. </div>
  44091. </div>
  44092. </template>
  44093. <script setup>
  44094. import { ref, onMounted, computed } from "vue";
  44095. import { useRoute, useRouter } from "vue-router";
  44096. import { useVendorsStore } from "@/stores/vendors";
  44097. /************************************************************************
  44098. | 레이아웃
  44099. ************************************************************************/
  44100. definePageMeta({
  44101. layout: "default",
  44102. });
  44103. /************************************************************************
  44104. | 스토어, 라우터, 라우트
  44105. ************************************************************************/
  44106. const vendorsStore = useVendorsStore();
  44107. const router = useRouter();
  44108. const route = useRoute();
  44109. /************************************************************************
  44110. | 반응형 데이터
  44111. ************************************************************************/
  44112. const pageId = ref("벤더사 상세");
  44113. const activeTab = ref("info");
  44114. /************************************************************************
  44115. | computed - 안전한 접근 방식
  44116. ************************************************************************/
  44117. const currentVendor = computed(() => {
  44118. try {
  44119. return vendorsStore.getCurrentVendor || null;
  44120. } catch (error) {
  44121. console.error("getCurrentVendor 접근 오류:", error);
  44122. return null;
  44123. }
  44124. });
  44125. const isLoading = computed(() => {
  44126. try {
  44127. return vendorsStore.getLoading || false;
  44128. } catch (error) {
  44129. console.error("getLoading 접근 오류:", error);
  44130. return false;
  44131. }
  44132. });
  44133. const errorMessage = computed(() => {
  44134. try {
  44135. return vendorsStore.getError || null;
  44136. } catch (error) {
  44137. console.error("getError 접근 오류:", error);
  44138. return null;
  44139. }
  44140. });
  44141. /************************************************************************
  44142. | 메서드
  44143. ************************************************************************/
  44144. const goBack = () => {
  44145. router.push("/view/vendor/vendors");
  44146. };
  44147. const getCategoryColor = (category) => {
  44148. const colors = {
  44149. FASHION_BEAUTY: "pink",
  44150. FOOD_HEALTH: "green",
  44151. LIFESTYLE: "blue",
  44152. TECH_ELECTRONICS: "purple",
  44153. SPORTS_LEISURE: "orange",
  44154. CULTURE_ENTERTAINMENT: "red",
  44155. };
  44156. return colors[category] || "grey";
  44157. };
  44158. const getCategoryName = (category) => {
  44159. const names = {
  44160. FASHION_BEAUTY: "패션·뷰티",
  44161. FOOD_HEALTH: "식품·건강",
  44162. LIFESTYLE: "라이프스타일",
  44163. TECH_ELECTRONICS: "테크·가전",
  44164. SPORTS_LEISURE: "스포츠·레저",
  44165. CULTURE_ENTERTAINMENT: "문화·엔터테인먼트",
  44166. };
  44167. return names[category] || category;
  44168. };
  44169. const getPartnershipColor = (level) => {
  44170. const colors = {
  44171. PLATINUM: "purple",
  44172. GOLD: "amber",
  44173. SILVER: "grey",
  44174. BRONZE: "brown",
  44175. BASIC: "blue-grey",
  44176. };
  44177. return colors[level] || "grey";
  44178. };
  44179. const getPartnershipName = (level) => {
  44180. const names = {
  44181. PLATINUM: "플래티넘",
  44182. GOLD: "골드",
  44183. SILVER: "실버",
  44184. BRONZE: "브론즈",
  44185. BASIC: "베이직",
  44186. };
  44187. return names[level] || level;
  44188. };
  44189. const formatDate = (dateString) => {
  44190. if (!dateString) return null;
  44191. return new Date(dateString).toLocaleDateString("ko-KR");
  44192. };
  44193. const formatCurrency = (amount) => {
  44194. if (!amount) return null;
  44195. return new Intl.NumberFormat("ko-KR", {
  44196. style: "currency",
  44197. currency: "KRW",
  44198. }).format(amount);
  44199. };
  44200. /************************************************************************
  44201. | 라이프사이클
  44202. ************************************************************************/
  44203. onMounted(async () => {
  44204. console.log("컴포넌트 마운트됨");
  44205. console.log("vendorsStore:", vendorsStore);
  44206. console.log("vendorsStore.getCurrentVendor:", vendorsStore.getCurrentVendor);
  44207. console.log("vendorsStore.getLoading:", vendorsStore.getLoading);
  44208. console.log("vendorsStore.getError:", vendorsStore.getError);
  44209. const vendorId = route.params.id;
  44210. console.log("vendorId:", vendorId);
  44211. if (vendorId) {
  44212. try {
  44213. console.log("API 호출 시작");
  44214. await vendorsStore.getVendorById(vendorId);
  44215. console.log("API 호출 완료");
  44216. console.log("currentVendor 값:", vendorsStore.getCurrentVendor);
  44217. } catch (error) {
  44218. console.error("벤더사 정보 로드 실패:", error);
  44219. }
  44220. }
  44221. });
  44222. </script>
  44223. <style scoped>
  44224. .vendor-detail-wrap {
  44225. display: flex;
  44226. flex-direction: column;
  44227. gap: 20px;
  44228. }
  44229. .vendor-header-card {
  44230. margin-bottom: 20px;
  44231. }
  44232. .vendor-header {
  44233. display: flex;
  44234. align-items: flex-start;
  44235. gap: 20px;
  44236. }
  44237. .vendor-logo-section {
  44238. flex-shrink: 0;
  44239. }
  44240. .vendor-logo-large {
  44241. border: 1px solid #e0e0e0;
  44242. }
  44243. .no-logo-large {
  44244. background: #f5f5f5;
  44245. color: #666;
  44246. font-weight: bold;
  44247. font-size: 32px;
  44248. display: flex;
  44249. align-items: center;
  44250. justify-content: center;
  44251. width: 100%;
  44252. height: 100%;
  44253. }
  44254. .vendor-info-section {
  44255. flex: 1;
  44256. }
  44257. .vendor-name {
  44258. font-size: 28px;
  44259. font-weight: bold;
  44260. margin-bottom: 12px;
  44261. }
  44262. .vendor-meta {
  44263. margin-bottom: 16px;
  44264. }
  44265. .vendor-description {
  44266. color: #666;
  44267. line-height: 1.6;
  44268. margin: 0;
  44269. }
  44270. .vendor-actions {
  44271. flex-shrink: 0;
  44272. }
  44273. .breadcrumb-link {
  44274. cursor: pointer;
  44275. color: #1976d2;
  44276. }
  44277. .breadcrumb-link:hover {
  44278. text-decoration: underline;
  44279. }
  44280. .detail-tabs-card {
  44281. margin-top: 20px;
  44282. }
  44283. .info-section,
  44284. .contact-section,
  44285. .products-section,
  44286. .partnership-section {
  44287. padding: 20px 0;
  44288. }
  44289. .info-item {
  44290. margin-bottom: 24px;
  44291. }
  44292. .info-item h3 {
  44293. font-size: 16px;
  44294. font-weight: 600;
  44295. margin-bottom: 8px;
  44296. color: #333;
  44297. }
  44298. .info-item p {
  44299. font-size: 14px;
  44300. color: #666;
  44301. margin: 0;
  44302. }
  44303. .contact-card {
  44304. height: 100%;
  44305. }
  44306. .contact-item {
  44307. margin-bottom: 12px;
  44308. }
  44309. .contact-item strong {
  44310. display: inline-block;
  44311. width: 80px;
  44312. color: #333;
  44313. }
  44314. .contact-item a {
  44315. color: #1976d2;
  44316. text-decoration: none;
  44317. }
  44318. .contact-item a:hover {
  44319. text-decoration: underline;
  44320. }
  44321. .section-header {
  44322. margin-bottom: 20px;
  44323. padding-bottom: 10px;
  44324. border-bottom: 1px solid #e0e0e0;
  44325. }
  44326. .section-header h3 {
  44327. font-size: 18px;
  44328. font-weight: 600;
  44329. margin: 0;
  44330. }
  44331. .product-card {
  44332. height: 100%;
  44333. }
  44334. .product-price {
  44335. font-weight: bold;
  44336. color: #1976d2;
  44337. margin-top: 8px;
  44338. }
  44339. .rating {
  44340. display: flex;
  44341. align-items: center;
  44342. gap: 8px;
  44343. }
  44344. .rating-text {
  44345. font-size: 14px;
  44346. color: #666;
  44347. }
  44348. .business-areas {
  44349. display: flex;
  44350. flex-wrap: wrap;
  44351. gap: 8px;
  44352. }
  44353. .loading-wrap,
  44354. .error-wrap,
  44355. .no-data-wrap {
  44356. display: flex;
  44357. flex-direction: column;
  44358. align-items: center;
  44359. justify-content: center;
  44360. padding: 60px 20px;
  44361. }
  44362. .no-data {
  44363. text-align: center;
  44364. }
  44365. .no-data h3 {
  44366. margin: 16px 0 8px;
  44367. color: #666;
  44368. }
  44369. .no-data p {
  44370. color: #999;
  44371. margin-bottom: 20px;
  44372. }
  44373. @media (max-width: 768px) {
  44374. .vendor-header {
  44375. flex-direction: column;
  44376. }
  44377. .vendor-actions {
  44378. width: 100%;
  44379. }
  44380. }
  44381. </style>
  44382. </file>
  44383. <file path="pages/view/vendor/index.vue">
  44384. <template>
  44385. <div>
  44386. <div class="inner--headers">
  44387. <h2>{{ pageId }}</h2>
  44388. <div class="bread--crumbs--wrap">
  44389. <span>홈</span>
  44390. <span>{{ pageId }}</span>
  44391. </div>
  44392. </div>
  44393. <div class="search--modules type2">
  44394. <div class="search--inner">
  44395. <div class="form--cont--filter">
  44396. <v-select
  44397. v-model="filter"
  44398. :items="filderArr"
  44399. variant="outlined"
  44400. class="custom-select"
  44401. >
  44402. </v-select>
  44403. </div>
  44404. <div class="form--cont--text">
  44405. <v-text-field
  44406. v-model="searchModel"
  44407. class="custom-input mini"
  44408. style="width: 100%"
  44409. placeholder="검색어를 입력하세요"
  44410. ></v-text-field>
  44411. </div>
  44412. </div>
  44413. <div class="search--inner">
  44414. <div class="calendar-wrap ml--0">
  44415. <div class="calendar">
  44416. <VueDatePicker
  44417. :format="datePickerFormat"
  44418. v-model="searchStartDate"
  44419. placeholder="날짜를 선택하세요"
  44420. :auto-apply="true"
  44421. week-start="0"
  44422. ></VueDatePicker>
  44423. </div>
  44424. <span class="text">~</span>
  44425. <div class="calendar">
  44426. <VueDatePicker
  44427. v-model="searchEndDate"
  44428. :format="datePickerFormat"
  44429. placeholder="날짜를 선택하세요"
  44430. :auto-apply="true"
  44431. week-start="0"
  44432. ></VueDatePicker>
  44433. </div>
  44434. <div class="month--selector">
  44435. <v-btn elevation="0">오늘</v-btn>
  44436. <v-btn class="actv" elevation="0">7일</v-btn>
  44437. <v-btn elevation="0">1개월</v-btn>
  44438. <v-btn elevation="0">3개월</v-btn>
  44439. <v-btn elevation="0">전체</v-btn>
  44440. </div>
  44441. </div>
  44442. </div>
  44443. <v-btn
  44444. class="custom-btn btn-blue mini sch--btn"
  44445. @click="fnSearch(searchModel, filter)"
  44446. >검색</v-btn
  44447. >
  44448. </div>
  44449. <div class="data--list--wrap">
  44450. <div class="btn--actions--wrap">
  44451. <div class="left--sections">
  44452. <!-- <v-btn class="custom-btn mini btn-white">선택 삭제</v-btn> -->
  44453. </div>
  44454. <div class="right--sections">
  44455. <v-btn class="custom-btn mini btn-blue mr-2" @click="goToVendorsList()"
  44456. ><i class="ico"></i>벤더사 관리</v-btn
  44457. >
  44458. <v-btn class="custom-btn mini btn-reg" @click="addLocated()"
  44459. ><i class="ico"></i>제품 등록</v-btn
  44460. >
  44461. </div>
  44462. </div>
  44463. <div class="item--list--wrap" v-if="itemList.length > 0">
  44464. <div class="item--list">
  44465. <div
  44466. v-for="(items, index) in paginatedItems"
  44467. :key="index"
  44468. @click="toItemDetail(items.SEQ)"
  44469. class="item"
  44470. >
  44471. <div class="item--img"></div>
  44472. <h3>{{ items.NAME }}</h3>
  44473. <p>공급가: {{ items.PRICE1 }}<br />판매가: {{ items.PRICE2 }}</p>
  44474. <span>등록일: {{ items.REGDATE.slice(0, 10) }}</span>
  44475. <div v-show="items.STATUS == 1" class="sold--out"><span>품절</span></div>
  44476. </div>
  44477. </div>
  44478. <div class="item--pagination">
  44479. <v-pagination
  44480. v-model="currentPage"
  44481. :length="Math.ceil(itemList.length / itemsPerPage)"
  44482. ></v-pagination>
  44483. </div>
  44484. </div>
  44485. </div>
  44486. </div>
  44487. </template>
  44488. <script setup>
  44489. import VueDatePicker from "@vuepic/vue-datepicker";
  44490. import "@vuepic/vue-datepicker/dist/main.css";
  44491. /************************************************************************
  44492. | 레이아웃
  44493. ************************************************************************/
  44494. definePageMeta({
  44495. layout: "default",
  44496. });
  44497. /************************************************************************
  44498. | PROPS
  44499. ************************************************************************/
  44500. const props = defineProps({
  44501. propsData: {
  44502. type: Object,
  44503. default: () => {},
  44504. },
  44505. });
  44506. /************************************************************************
  44507. | 스토어
  44508. ************************************************************************/
  44509. const useDtStore = useDetailStore();
  44510. /************************************************************************
  44511. | 전역
  44512. ************************************************************************/
  44513. const searchModel = ref("");
  44514. const searchStartDate = ref("");
  44515. const searchEndDate = ref("");
  44516. const filter = ref("");
  44517. const filderArr = ref([
  44518. { title: "선택하세요", value: "" },
  44519. { title: "제목", value: "title" },
  44520. ]);
  44521. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  44522. const router = useRouter();
  44523. const pageId = ref("제품 관리");
  44524. const datePickerFormat = "yyyy-MM-dd";
  44525. const itemList = ref([]);
  44526. const itemsPerPage = 5;
  44527. const currentPage = ref(1);
  44528. /* eslint-disable */
  44529. /* prettier-ignore */
  44530. /************************************************************************
  44531. | 함수(METHODS)
  44532. ************************************************************************/
  44533. const paginatedItems = computed(() => {
  44534. const start = (currentPage.value - 1) * itemsPerPage;
  44535. return itemList.value.slice(start, start + itemsPerPage);
  44536. });
  44537. const addLocated = () => {
  44538. router.push({
  44539. path: "/view/vendor/product-register",
  44540. });
  44541. };
  44542. const goToVendorsList = () => {
  44543. router.push({
  44544. path: "/view/vendor/vendors",
  44545. });
  44546. };
  44547. const detailLocated = (__EVENT) => {
  44548. router.push({
  44549. path: "/view/item/detail",
  44550. });
  44551. useDtStore.boardInfo.seq = __EVENT.data.SEQ;
  44552. useDtStore.boardInfo.pageType = "U";
  44553. useDtStore.boardInfo.status = __EVENT.data.STATUS;
  44554. };
  44555. const evtListGet = async () => {
  44556. let _req = {
  44557. compId: useAuthStore().getCompanyId,
  44558. status: null,
  44559. };
  44560. await useAxios()
  44561. .post("/item/list", _req)
  44562. .then((res) => {
  44563. itemList.value = res.data;
  44564. //pageTotal.value = res.data._total_cnt;
  44565. });
  44566. };
  44567. const fnSearch = (__KEYWORD, __FILTER) => {
  44568. let _req = {
  44569. compId: useAuthStore().getCompanyId,
  44570. filter: __FILTER,
  44571. keyword: __KEYWORD,
  44572. status: "",
  44573. // _size: 1000,
  44574. // _index: 0,
  44575. // admin_name:
  44576. // __FILTER == "admin_name" ? __KEYWORD : __FILTER == "" ? __KEYWORD : null,
  44577. // id: __FILTER == "id" ? __KEYWORD : __FILTER == "" ? __KEYWORD : null,
  44578. };
  44579. useAxios()
  44580. .post("/evt/search", _req)
  44581. .then((res) => {
  44582. _req._size = res.data.length;
  44583. tblItems.value = res.data;
  44584. pageObj.value.totalCnt = tblItems.value.length;
  44585. })
  44586. .catch((error) => {});
  44587. };
  44588. /************************************************************************
  44589. | WATCH
  44590. ************************************************************************/
  44591. watch(
  44592. () => props,
  44593. () => {
  44594. searchObj.value = props.propsData;
  44595. fnGetStat();
  44596. },
  44597. { deep: true }
  44598. );
  44599. onMounted(() => {
  44600. evtListGet();
  44601. });
  44602. </script>
  44603. </file>
  44604. <file path="pages/view/vendor/vendors.vue">
  44605. <template>
  44606. <div>
  44607. <div class="inner--headers">
  44608. <h2>{{ pageId }}</h2>
  44609. <div class="bread--crumbs--wrap">
  44610. <span>홈</span>
  44611. <span @click="goBack" class="breadcrumb-link">벤더사 관리</span>
  44612. <span>{{ currentVendor?.name || "벤더사 상세" }}</span>
  44613. </div>
  44614. </div>
  44615. <!-- 로딩 상태 -->
  44616. <div v-if="isLoading" class="loading-wrap">
  44617. <v-progress-circular indeterminate color="primary" size="64"></v-progress-circular>
  44618. <p>벤더사 정보를 불러오고 있습니다...</p>
  44619. </div>
  44620. <!-- 에러 상태 -->
  44621. <div v-else-if="errorMessage" class="error-wrap">
  44622. <v-alert type="error" dismissible @click:close="vendorsStore.clearError()">
  44623. {{ errorMessage }}
  44624. </v-alert>
  44625. <v-btn @click="goBack" class="custom-btn btn-blue">목록으로 돌아가기</v-btn>
  44626. </div>
  44627. <!-- 벤더사 상세 정보 -->
  44628. <div v-else-if="currentVendor" class="vendor-detail-wrap">
  44629. <!-- 벤더사 기본 정보 -->
  44630. <v-card class="vendor-header-card" elevation="2">
  44631. <v-card-text>
  44632. <div class="vendor-header">
  44633. <div class="vendor-logo-section">
  44634. <v-avatar size="80" class="vendor-logo-large">
  44635. <v-img
  44636. v-if="currentVendor.logo"
  44637. :src="currentVendor.logo"
  44638. :alt="currentVendor.name + ' 로고'"
  44639. ></v-img>
  44640. <div v-else class="no-logo-large">{{ currentVendor.name.charAt(0) }}</div>
  44641. </v-avatar>
  44642. </div>
  44643. <div class="vendor-info-section">
  44644. <h1 class="vendor-name">{{ currentVendor.name }}</h1>
  44645. <div class="vendor-meta">
  44646. <v-chip
  44647. :color="getCategoryColor(currentVendor.category)"
  44648. size="large"
  44649. variant="outlined"
  44650. class="mr-2"
  44651. >
  44652. {{ getCategoryName(currentVendor.category) }}
  44653. </v-chip>
  44654. <v-chip
  44655. :color="currentVendor.status === 'ACTIVE' ? 'success' : 'error'"
  44656. size="large"
  44657. >
  44658. {{ currentVendor.status === "ACTIVE" ? "활성" : "비활성" }}
  44659. </v-chip>
  44660. </div>
  44661. <p v-if="currentVendor.description" class="vendor-description">
  44662. {{ currentVendor.description }}
  44663. </p>
  44664. </div>
  44665. <div class="vendor-actions">
  44666. <v-btn
  44667. v-if="currentVendor.website"
  44668. :href="currentVendor.website"
  44669. target="_blank"
  44670. class="custom-btn btn-white mr-2"
  44671. prepend-icon="mdi-web"
  44672. >
  44673. 웹사이트
  44674. </v-btn>
  44675. <v-btn
  44676. @click="goBack"
  44677. class="custom-btn btn-blue"
  44678. prepend-icon="mdi-arrow-left"
  44679. >
  44680. 목록으로
  44681. </v-btn>
  44682. </div>
  44683. </div>
  44684. </v-card-text>
  44685. </v-card>
  44686. <!-- 상세 정보 탭 -->
  44687. <v-card class="detail-tabs-card" elevation="2">
  44688. <v-tabs v-model="activeTab" class="custom-tabs">
  44689. <v-tab value="info">기업 정보</v-tab>
  44690. <v-tab value="contact">연락처</v-tab>
  44691. <v-tab value="products">제품 정보</v-tab>
  44692. <v-tab value="partnership">파트너십</v-tab>
  44693. </v-tabs>
  44694. <v-card-text>
  44695. <v-tabs-window v-model="activeTab">
  44696. <!-- 기업 정보 탭 -->
  44697. <v-tabs-window-item value="info">
  44698. <div class="info-section">
  44699. <v-row>
  44700. <v-col cols="12" md="6">
  44701. <div class="info-item">
  44702. <h3>사업자등록번호</h3>
  44703. <p>{{ currentVendor.businessNumber || "-" }}</p>
  44704. </div>
  44705. </v-col>
  44706. <v-col cols="12" md="6">
  44707. <div class="info-item">
  44708. <h3>설립일</h3>
  44709. <p>{{ formatDate(currentVendor.establishedDate) || "-" }}</p>
  44710. </div>
  44711. </v-col>
  44712. <v-col cols="12" md="6">
  44713. <div class="info-item">
  44714. <h3>직원 수</h3>
  44715. <p>
  44716. {{
  44717. currentVendor.employeeCount
  44718. ? currentVendor.employeeCount + "명"
  44719. : "-"
  44720. }}
  44721. </p>
  44722. </div>
  44723. </v-col>
  44724. <v-col cols="12" md="6">
  44725. <div class="info-item">
  44726. <h3>연매출</h3>
  44727. <p>{{ formatCurrency(currentVendor.annualRevenue) || "-" }}</p>
  44728. </div>
  44729. </v-col>
  44730. <v-col cols="12">
  44731. <div class="info-item">
  44732. <h3>사업 분야</h3>
  44733. <div class="business-areas">
  44734. <v-chip
  44735. v-for="area in currentVendor.businessAreas || []"
  44736. :key="area"
  44737. size="small"
  44738. variant="outlined"
  44739. class="mr-2 mb-2"
  44740. >
  44741. {{ area }}
  44742. </v-chip>
  44743. </div>
  44744. </div>
  44745. </v-col>
  44746. </v-row>
  44747. </div>
  44748. </v-tabs-window-item>
  44749. <!-- 연락처 탭 -->
  44750. <v-tabs-window-item value="contact">
  44751. <div class="contact-section">
  44752. <v-row>
  44753. <v-col cols="12" md="6">
  44754. <v-card variant="outlined" class="contact-card">
  44755. <v-card-title>
  44756. <v-icon class="mr-2">mdi-account</v-icon>
  44757. 주요 담당자
  44758. </v-card-title>
  44759. <v-card-text>
  44760. <div class="contact-item">
  44761. <strong>이름:</strong> {{ currentVendor.contactName || "-" }}
  44762. </div>
  44763. <div class="contact-item">
  44764. <strong>직책:</strong>
  44765. {{ currentVendor.contactPosition || "-" }}
  44766. </div>
  44767. <div class="contact-item">
  44768. <strong>전화:</strong>
  44769. <a
  44770. v-if="currentVendor.contactPhone"
  44771. :href="`tel:${currentVendor.contactPhone}`"
  44772. >
  44773. {{ currentVendor.contactPhone }}
  44774. </a>
  44775. <span v-else>-</span>
  44776. </div>
  44777. <div class="contact-item">
  44778. <strong>이메일:</strong>
  44779. <a
  44780. v-if="currentVendor.contactEmail"
  44781. :href="`mailto:${currentVendor.contactEmail}`"
  44782. >
  44783. {{ currentVendor.contactEmail }}
  44784. </a>
  44785. <span v-else>-</span>
  44786. </div>
  44787. </v-card-text>
  44788. </v-card>
  44789. </v-col>
  44790. <v-col cols="12" md="6">
  44791. <v-card variant="outlined" class="contact-card">
  44792. <v-card-title>
  44793. <v-icon class="mr-2">mdi-map-marker</v-icon>
  44794. 주소 정보
  44795. </v-card-title>
  44796. <v-card-text>
  44797. <div class="contact-item">
  44798. <strong>주소:</strong>
  44799. <p>{{ currentVendor.address || "-" }}</p>
  44800. </div>
  44801. <div class="contact-item">
  44802. <strong>상세주소:</strong>
  44803. <p>{{ currentVendor.detailAddress || "-" }}</p>
  44804. </div>
  44805. <div class="contact-item">
  44806. <strong>우편번호:</strong> {{ currentVendor.zipCode || "-" }}
  44807. </div>
  44808. </v-card-text>
  44809. </v-card>
  44810. </v-col>
  44811. </v-row>
  44812. </div>
  44813. </v-tabs-window-item>
  44814. <!-- 제품 정보 탭 -->
  44815. <v-tabs-window-item value="products">
  44816. <div class="products-section">
  44817. <div class="section-header">
  44818. <h3>주요 제품/서비스</h3>
  44819. </div>
  44820. <v-row v-if="currentVendor.products && currentVendor.products.length > 0">
  44821. <v-col
  44822. v-for="product in currentVendor.products"
  44823. :key="product.id"
  44824. cols="12"
  44825. md="6"
  44826. lg="4"
  44827. >
  44828. <v-card class="product-card" variant="outlined">
  44829. <v-img
  44830. v-if="product.image"
  44831. :src="product.image"
  44832. height="150"
  44833. cover
  44834. ></v-img>
  44835. <v-card-title>{{ product.name }}</v-card-title>
  44836. <v-card-text>
  44837. <p>{{ product.description }}</p>
  44838. <div class="product-price" v-if="product.price">
  44839. {{ formatCurrency(product.price) }}
  44840. </div>
  44841. </v-card-text>
  44842. </v-card>
  44843. </v-col>
  44844. </v-row>
  44845. <div v-else class="no-data">
  44846. <v-icon size="48" color="grey-lighten-1">mdi-package-variant</v-icon>
  44847. <p>등록된 제품 정보가 없습니다</p>
  44848. </div>
  44849. </div>
  44850. </v-tabs-window-item>
  44851. <!-- 파트너십 탭 -->
  44852. <v-tabs-window-item value="partnership">
  44853. <div class="partnership-section">
  44854. <v-row>
  44855. <v-col cols="12" md="6">
  44856. <div class="info-item">
  44857. <h3>파트너십 등급</h3>
  44858. <v-chip
  44859. :color="getPartnershipColor(currentVendor.partnershipLevel)"
  44860. size="large"
  44861. >
  44862. {{ getPartnershipName(currentVendor.partnershipLevel) }}
  44863. </v-chip>
  44864. </div>
  44865. </v-col>
  44866. <v-col cols="12" md="6">
  44867. <div class="info-item">
  44868. <h3>협력 시작일</h3>
  44869. <p>{{ formatDate(currentVendor.partnershipStartDate) || "-" }}</p>
  44870. </div>
  44871. </v-col>
  44872. <v-col cols="12" md="6">
  44873. <div class="info-item">
  44874. <h3>협력 프로젝트 수</h3>
  44875. <p>{{ currentVendor.projectCount || 0 }}개</p>
  44876. </div>
  44877. </v-col>
  44878. <v-col cols="12" md="6">
  44879. <div class="info-item">
  44880. <h3>평점</h3>
  44881. <div class="rating">
  44882. <v-rating
  44883. v-model="currentVendor.rating"
  44884. readonly
  44885. size="small"
  44886. density="compact"
  44887. ></v-rating>
  44888. <span class="rating-text">{{ currentVendor.rating || 0 }}/5</span>
  44889. </div>
  44890. </div>
  44891. </v-col>
  44892. <v-col cols="12">
  44893. <div class="info-item">
  44894. <h3>특이사항</h3>
  44895. <p>{{ currentVendor.notes || "특이사항이 없습니다." }}</p>
  44896. </div>
  44897. </v-col>
  44898. </v-row>
  44899. </div>
  44900. </v-tabs-window-item>
  44901. </v-tabs-window>
  44902. </v-card-text>
  44903. </v-card>
  44904. </div>
  44905. <!-- 데이터가 없을 때 -->
  44906. <div v-else class="no-data-wrap">
  44907. <div class="no-data">
  44908. <v-icon size="64" color="grey-lighten-1">mdi-store-alert</v-icon>
  44909. <h3>벤더사 정보를 찾을 수 없습니다</h3>
  44910. <p>요청하신 벤더사가 존재하지 않거나 삭제되었을 수 있습니다</p>
  44911. <v-btn @click="goBack" class="custom-btn btn-blue">목록으로 돌아가기</v-btn>
  44912. </div>
  44913. </div>
  44914. </div>
  44915. </template>
  44916. <script setup>
  44917. import { ref, onMounted, computed } from "vue";
  44918. import { useRoute, useRouter } from "vue-router";
  44919. import { useVendorsStore } from "@/stores/vendors";
  44920. /************************************************************************
  44921. | 레이아웃
  44922. ************************************************************************/
  44923. definePageMeta({
  44924. layout: "default",
  44925. });
  44926. /************************************************************************
  44927. | 스토어, 라우터, 라우트
  44928. ************************************************************************/
  44929. const vendorsStore = useVendorsStore();
  44930. const router = useRouter();
  44931. const route = useRoute();
  44932. /************************************************************************
  44933. | 반응형 데이터
  44934. ************************************************************************/
  44935. const pageId = ref("벤더사 상세");
  44936. const activeTab = ref("info");
  44937. /************************************************************************
  44938. | computed - .value 제거!
  44939. ************************************************************************/
  44940. const currentVendor = computed(() => vendorsStore.getCurrentVendor);
  44941. const isLoading = computed(() => vendorsStore.getLoading);
  44942. const errorMessage = computed(() => vendorsStore.getError);
  44943. /************************************************************************
  44944. | 메서드
  44945. ************************************************************************/
  44946. const goBack = () => {
  44947. router.push("/view/vendor/vendors");
  44948. };
  44949. const getCategoryColor = (category) => {
  44950. const colors = {
  44951. FASHION_BEAUTY: "pink",
  44952. FOOD_HEALTH: "green",
  44953. LIFESTYLE: "blue",
  44954. TECH_ELECTRONICS: "purple",
  44955. SPORTS_LEISURE: "orange",
  44956. CULTURE_ENTERTAINMENT: "red",
  44957. };
  44958. return colors[category] || "grey";
  44959. };
  44960. const getCategoryName = (category) => {
  44961. const names = {
  44962. FASHION_BEAUTY: "패션·뷰티",
  44963. FOOD_HEALTH: "식품·건강",
  44964. LIFESTYLE: "라이프스타일",
  44965. TECH_ELECTRONICS: "테크·가전",
  44966. SPORTS_LEISURE: "스포츠·레저",
  44967. CULTURE_ENTERTAINMENT: "문화·엔터테인먼트",
  44968. };
  44969. return names[category] || category;
  44970. };
  44971. const getPartnershipColor = (level) => {
  44972. const colors = {
  44973. PLATINUM: "purple",
  44974. GOLD: "amber",
  44975. SILVER: "grey",
  44976. BRONZE: "brown",
  44977. BASIC: "blue-grey",
  44978. };
  44979. return colors[level] || "grey";
  44980. };
  44981. const getPartnershipName = (level) => {
  44982. const names = {
  44983. PLATINUM: "플래티넘",
  44984. GOLD: "골드",
  44985. SILVER: "실버",
  44986. BRONZE: "브론즈",
  44987. BASIC: "베이직",
  44988. };
  44989. return names[level] || level;
  44990. };
  44991. const formatDate = (dateString) => {
  44992. if (!dateString) return null;
  44993. return new Date(dateString).toLocaleDateString("ko-KR");
  44994. };
  44995. const formatCurrency = (amount) => {
  44996. if (!amount) return null;
  44997. return new Intl.NumberFormat("ko-KR", {
  44998. style: "currency",
  44999. currency: "KRW",
  45000. }).format(amount);
  45001. };
  45002. /************************************************************************
  45003. | 라이프사이클
  45004. ************************************************************************/
  45005. onMounted(async () => {
  45006. const vendorId = route.params.id;
  45007. if (vendorId) {
  45008. try {
  45009. await vendorsStore.getVendorById(vendorId);
  45010. } catch (error) {
  45011. console.error("벤더사 정보 로드 실패:", error);
  45012. }
  45013. }
  45014. });
  45015. </script>
  45016. <style scoped>
  45017. .vendor-detail-wrap {
  45018. display: flex;
  45019. flex-direction: column;
  45020. gap: 20px;
  45021. }
  45022. .vendor-header-card {
  45023. margin-bottom: 20px;
  45024. }
  45025. .vendor-header {
  45026. display: flex;
  45027. align-items: flex-start;
  45028. gap: 20px;
  45029. }
  45030. .vendor-logo-section {
  45031. flex-shrink: 0;
  45032. }
  45033. .vendor-logo-large {
  45034. border: 1px solid #e0e0e0;
  45035. }
  45036. .no-logo-large {
  45037. background: #f5f5f5;
  45038. color: #666;
  45039. font-weight: bold;
  45040. font-size: 32px;
  45041. display: flex;
  45042. align-items: center;
  45043. justify-content: center;
  45044. width: 100%;
  45045. height: 100%;
  45046. }
  45047. .vendor-info-section {
  45048. flex: 1;
  45049. }
  45050. .vendor-name {
  45051. font-size: 28px;
  45052. font-weight: bold;
  45053. margin-bottom: 12px;
  45054. }
  45055. .vendor-meta {
  45056. margin-bottom: 16px;
  45057. }
  45058. .vendor-description {
  45059. color: #666;
  45060. line-height: 1.6;
  45061. margin: 0;
  45062. }
  45063. .vendor-actions {
  45064. flex-shrink: 0;
  45065. }
  45066. .breadcrumb-link {
  45067. cursor: pointer;
  45068. color: #1976d2;
  45069. }
  45070. .breadcrumb-link:hover {
  45071. text-decoration: underline;
  45072. }
  45073. .detail-tabs-card {
  45074. margin-top: 20px;
  45075. }
  45076. .info-section,
  45077. .contact-section,
  45078. .products-section,
  45079. .partnership-section {
  45080. padding: 20px 0;
  45081. }
  45082. .info-item {
  45083. margin-bottom: 24px;
  45084. }
  45085. .info-item h3 {
  45086. font-size: 16px;
  45087. font-weight: 600;
  45088. margin-bottom: 8px;
  45089. color: #333;
  45090. }
  45091. .info-item p {
  45092. font-size: 14px;
  45093. color: #666;
  45094. margin: 0;
  45095. }
  45096. .contact-card {
  45097. height: 100%;
  45098. }
  45099. .contact-item {
  45100. margin-bottom: 12px;
  45101. }
  45102. .contact-item strong {
  45103. display: inline-block;
  45104. width: 80px;
  45105. color: #333;
  45106. }
  45107. .contact-item a {
  45108. color: #1976d2;
  45109. text-decoration: none;
  45110. }
  45111. .contact-item a:hover {
  45112. text-decoration: underline;
  45113. }
  45114. .section-header {
  45115. margin-bottom: 20px;
  45116. padding-bottom: 10px;
  45117. border-bottom: 1px solid #e0e0e0;
  45118. }
  45119. .section-header h3 {
  45120. font-size: 18px;
  45121. font-weight: 600;
  45122. margin: 0;
  45123. }
  45124. .product-card {
  45125. height: 100%;
  45126. }
  45127. .product-price {
  45128. font-weight: bold;
  45129. color: #1976d2;
  45130. margin-top: 8px;
  45131. }
  45132. .rating {
  45133. display: flex;
  45134. align-items: center;
  45135. gap: 8px;
  45136. }
  45137. .rating-text {
  45138. font-size: 14px;
  45139. color: #666;
  45140. }
  45141. .business-areas {
  45142. display: flex;
  45143. flex-wrap: wrap;
  45144. gap: 8px;
  45145. }
  45146. .loading-wrap,
  45147. .error-wrap,
  45148. .no-data-wrap {
  45149. display: flex;
  45150. flex-direction: column;
  45151. align-items: center;
  45152. justify-content: center;
  45153. padding: 60px 20px;
  45154. }
  45155. .no-data {
  45156. text-align: center;
  45157. }
  45158. .no-data h3 {
  45159. margin: 16px 0 8px;
  45160. color: #666;
  45161. }
  45162. .no-data p {
  45163. color: #999;
  45164. margin-bottom: 20px;
  45165. }
  45166. @media (max-width: 768px) {
  45167. .vendor-header {
  45168. flex-direction: column;
  45169. }
  45170. .vendor-actions {
  45171. width: 100%;
  45172. }
  45173. }
  45174. </style>
  45175. </file>
  45176. <file path="stores/vendors.js">
  45177. export const useVendorsStore = defineStore('vendorsStore', () => {
  45178. // State
  45179. const vendors = ref([])
  45180. const currentVendor = ref(null)
  45181. const loading = ref(false)
  45182. const error = ref(null)
  45183. // Search & Filter State
  45184. const searchConditions = ref({
  45185. name: '',
  45186. category: '',
  45187. page: 1,
  45188. size: 10
  45189. })
  45190. // Pagination State
  45191. const pagination = ref({
  45192. currentPage: 1,
  45193. pageSize: 10,
  45194. totalCount: 0,
  45195. totalPages: 0
  45196. })
  45197. // Getters (직접 반환)
  45198. const getVendors = computed(() => vendors.value)
  45199. const getCurrentVendor = computed(() => currentVendor.value)
  45200. const getLoading = computed(() => loading.value)
  45201. const getError = computed(() => error.value)
  45202. const getSearchConditions = computed(() => searchConditions.value)
  45203. const getPagination = computed(() => pagination.value)
  45204. // Actions
  45205. function setLoading(state) {
  45206. loading.value = state
  45207. }
  45208. function setError(errorMessage) {
  45209. error.value = errorMessage
  45210. }
  45211. function clearError() {
  45212. error.value = null
  45213. }
  45214. function setVendors(vendorList) {
  45215. vendors.value = vendorList
  45216. }
  45217. function setCurrentVendor(vendor) {
  45218. currentVendor.value = vendor
  45219. }
  45220. function updateSearchConditions(conditions) {
  45221. searchConditions.value = { ...searchConditions.value, ...conditions }
  45222. }
  45223. function updatePagination(paginationData) {
  45224. pagination.value = { ...pagination.value, ...paginationData }
  45225. }
  45226. function resetSearch() {
  45227. searchConditions.value = {
  45228. name: '',
  45229. category: '',
  45230. page: 1,
  45231. size: 10
  45232. }
  45233. pagination.value = {
  45234. currentPage: 1,
  45235. pageSize: 10,
  45236. totalCount: 0,
  45237. totalPages: 0
  45238. }
  45239. }
  45240. // Reset function
  45241. function reset() {
  45242. vendors.value = []
  45243. currentVendor.value = null
  45244. loading.value = false
  45245. error.value = null
  45246. searchConditions.value = {
  45247. name: '',
  45248. category: '',
  45249. page: 1,
  45250. size: 10
  45251. }
  45252. pagination.value = {
  45253. currentPage: 1,
  45254. pageSize: 10,
  45255. totalCount: 0,
  45256. totalPages: 0
  45257. }
  45258. }
  45259. // API Actions
  45260. async function searchVendors(conditions = {}) {
  45261. setLoading(true)
  45262. clearError()
  45263. try {
  45264. const searchParams = { ...searchConditions.value, ...conditions }
  45265. updateSearchConditions(searchParams)
  45266. const response = await useAxios().get('/vendors', {
  45267. params: searchParams
  45268. })
  45269. if (response.data) {
  45270. setVendors(response.data.vendors || [])
  45271. updatePagination({
  45272. currentPage: response.data.currentPage || 1,
  45273. totalCount: response.data.totalCount || 0,
  45274. totalPages: Math.ceil((response.data.totalCount || 0) / searchParams.size)
  45275. })
  45276. }
  45277. } catch (err) {
  45278. setError(err.message || '벤더사 검색 중 오류가 발생했습니다.')
  45279. setVendors([])
  45280. } finally {
  45281. setLoading(false)
  45282. }
  45283. }
  45284. async function getVendorById(id) {
  45285. setLoading(true)
  45286. clearError()
  45287. try {
  45288. const response = await useAxios().get(`/vendors/${id}`)
  45289. if (response.data) {
  45290. setCurrentVendor(response.data)
  45291. return response.data
  45292. }
  45293. } catch (err) {
  45294. setError(err.message || '벤더사 정보를 불러오는 중 오류가 발생했습니다.')
  45295. setCurrentVendor(null)
  45296. } finally {
  45297. setLoading(false)
  45298. }
  45299. }
  45300. return {
  45301. // State
  45302. vendors,
  45303. currentVendor,
  45304. loading,
  45305. error,
  45306. searchConditions,
  45307. pagination,
  45308. // Getters
  45309. getVendors,
  45310. getCurrentVendor,
  45311. getLoading,
  45312. getError,
  45313. getSearchConditions,
  45314. getPagination,
  45315. // Actions
  45316. setLoading,
  45317. setError,
  45318. clearError,
  45319. setVendors,
  45320. setCurrentVendor,
  45321. updateSearchConditions,
  45322. updatePagination,
  45323. resetSearch,
  45324. searchVendors,
  45325. getVendorById,
  45326. reset
  45327. }
  45328. }, {
  45329. persist: {
  45330. storage: persistedState.sessionStorage,
  45331. paths: ['searchConditions', 'pagination']
  45332. }
  45333. })
  45334. </file>
  45335. <file path="backend/app/Controllers/Deli.php">
  45336. <?php
  45337. namespace App\Controllers;
  45338. use CodeIgniter\RESTful\ResourceController;
  45339. class Deli extends ResourceController
  45340. {
  45341. //아이템 리스트
  45342. public function itemlist()
  45343. {
  45344. $db = \Config\Database::connect();
  45345. // POST JSON 파라미터 받기
  45346. $request = $this->request->getJSON(true);
  45347. $showYn = isset($request['SHOW_YN']) ? $request['SHOW_YN'] : null;
  45348. $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;
  45349. // 서브쿼리: INF_SEQ 기준으로 QTY, TOTAL 합계와 최신 REG_DATE 구하기
  45350. $subQuery = $db->table('ITEM_ORDER_LIST')
  45351. ->select('ITEM_SEQ, SUM(QTY) AS sum_qty, SUM(TOTAL) AS sum_total, MAX(REG_DATE) AS latest_reg_date');
  45352. if (!is_null($infSeq)) {
  45353. $subQuery->where('INF_SEQ', $infSeq);
  45354. }
  45355. $subQuery->groupBy('ITEM_SEQ');
  45356. // 메인 쿼리: ITEM_LIST와 위 서브쿼리 조인
  45357. $builder = $db->table('ITEM_LIST I')
  45358. ->select('I.*, O.sum_qty, O.sum_total, O.latest_reg_date')
  45359. ->join("(" . $subQuery->getCompiledSelect() . ") O", 'I.SEQ = O.ITEM_SEQ', 'left')
  45360. ->where('I.DEL_YN', 'N');
  45361. if (!is_null($showYn) && $showYn !== '') {
  45362. $builder->where('I.SHOW_YN', $showYn);
  45363. }
  45364. $builder->orderBy('I.UDPDATE', 'DESC');
  45365. $lists = $builder->get()->getResultArray();
  45366. return $this->respond($lists, 200);
  45367. }
  45368. //구매자 리스트
  45369. public function delilist()
  45370. {
  45371. $db = \Config\Database::connect();
  45372. $request = $this->request->getJSON(true);
  45373. $itemSeq = isset($request['item_seq']) ? $request['item_seq'] : null;
  45374. $infSeq = isset($request['inf_seq']) ? $request['inf_seq'] : null;
  45375. // 쿼리 빌더
  45376. $builder = $db->table('ITEM_ORDER_LIST I');
  45377. $builder->select('I.*, U.NICK_NAME');
  45378. $builder->join('USER_LIST U', 'I.INF_SEQ = U.SEQ', 'left');
  45379. $builder->where('I.ITEM_SEQ', $itemSeq);
  45380. if ($infSeq) {
  45381. $builder->where('I.INF_SEQ', $infSeq);
  45382. }
  45383. // 주문일 기준으로 정렬
  45384. $builder->orderBy('I.ORDER_DATE', 'DESC');
  45385. $lists = $builder->get()->getResultArray();
  45386. return $this->respond($lists, 200);
  45387. }
  45388. //구매자 등록
  45389. public function deliRegister()
  45390. {
  45391. $db = \Config\Database::connect();
  45392. $request = $this->request->getJSON(true);
  45393. $itemSeq = isset($request['item_seq']) ? $request['item_seq'] : null;
  45394. $infSeq = isset($request['inf_seq']) ? $request['inf_seq'] : null;
  45395. $deliveryList = $request['deliveryList'] ?? [];
  45396. // 🔍 먼저 전체 유효성 검사
  45397. foreach ($deliveryList as $index => $delivery) {
  45398. $requiredFields = ['buyerName', 'address', 'phone', 'qty', 'total', 'orderDate'];
  45399. foreach ($requiredFields as $field) {
  45400. if (!isset($delivery[$field]) || $delivery[$field] === '') {
  45401. return $this->fail("deliveryList[$index] 항목의 '{$field}' 값이 누락되었습니다.", 400);
  45402. }
  45403. }
  45404. }
  45405. // ✅ 유효성 통과 후 삭제 + 삽입
  45406. $db->table('ITEM_ORDER_LIST')
  45407. ->where('ITEM_SEQ', $itemSeq)
  45408. ->where('INF_SEQ', $infSeq)
  45409. ->delete();
  45410. foreach ($deliveryList as $delivery) {
  45411. $data = [
  45412. 'ITEM_SEQ' => $itemSeq,
  45413. 'INF_SEQ' => $infSeq,
  45414. 'BUYER_NAME' => $delivery['buyerName'],
  45415. 'ADDRESS' => $delivery['address'],
  45416. 'PHONE' => $delivery['phone'],
  45417. 'EMAIL' => $delivery['email'],
  45418. 'QTY' => $delivery['qty'],
  45419. 'TOTAL' => $delivery['total'],
  45420. 'DELI_COMP' => $delivery['deliComp'] ?? null,
  45421. 'DELI_NUMB' => $delivery['deliNumb'] ?? null,
  45422. 'ORDER_DATE' => date('Y-m-d H:i:s', strtotime($delivery['orderDate'])),
  45423. 'REG_DATE' => date('Y-m-d'),
  45424. ];
  45425. $db->table('ITEM_ORDER_LIST')->insert($data);
  45426. }
  45427. return $this->respond(['message' => '배송 데이터가 성공적으로 저장되었습니다.'], 200);
  45428. }
  45429. //아이템 상세
  45430. public function itemDetail($seq)
  45431. {
  45432. // DB 객체 얻기
  45433. $db = \Config\Database::connect();
  45434. $builder = $db->table('ITEM_LIST');
  45435. $item = $builder->where('seq', $seq)->get()->getRowArray();
  45436. if($item){
  45437. return $this->respond($item, 200);
  45438. } else {
  45439. return $this->respond([
  45440. 'status' => 'fail',
  45441. 'message' => '유효하지 않은 seq입니다.'
  45442. ], 404);
  45443. }
  45444. }
  45445. //아이템 삭제
  45446. public function itemDelete($seq)
  45447. {
  45448. $db = \Config\Database::connect();
  45449. $db->transBegin();
  45450. //아이템 삭제
  45451. $deleted = $db->table('ITEM_LIST')
  45452. ->where('SEQ', $seq)
  45453. ->update(['DEL_YN' => 'Y']);
  45454. if ($db->transStatus() === false || !$deleted) {
  45455. $db->transRollback();
  45456. return $this->respond(['status' => 'fail', 'message' => '이벤트 삭제 중 오류가 발생했습니다.']);
  45457. }
  45458. $db->transCommit();
  45459. return $this->respond(['status' => 'success', 'message' => '이벤트가 삭제되었습니다.'], 200);
  45460. }
  45461. }
  45462. </file>
  45463. <file path="backend/app/Controllers/InfluencerController.php">
  45464. <?php
  45465. namespace App\Controllers;
  45466. use CodeIgniter\RESTful\ResourceController;
  45467. use App\Models\VendorInfluencerMappingModel;
  45468. use App\Models\VendorInfluencerStatusHistoryModel;
  45469. use App\Models\InfluencerPartnershipModel;
  45470. use App\Models\VendorModel;
  45471. use App\Models\InfluencerModel;
  45472. class InfluencerController extends ResourceController
  45473. {
  45474. protected $modelName = 'App\Models\VendorInfluencerMappingModel';
  45475. protected $format = 'json';
  45476. protected $vendorInfluencerModel;
  45477. protected $influencerPartnershipModel;
  45478. protected $statusHistoryModel;
  45479. protected $vendorModel;
  45480. protected $influencerModel;
  45481. public function __construct()
  45482. {
  45483. $this->vendorInfluencerModel = new VendorInfluencerMappingModel();
  45484. $this->influencerPartnershipModel = new InfluencerPartnershipModel();
  45485. $this->statusHistoryModel = new VendorInfluencerStatusHistoryModel();
  45486. $this->vendorModel = new VendorModel();
  45487. $this->influencerModel = new InfluencerModel();
  45488. }
  45489. /**
  45490. * 벤더사 검색 (상태 정보 포함)
  45491. */
  45492. public function searchVendors()
  45493. {
  45494. try {
  45495. $request = $this->request->getJSON();
  45496. $influencerSeq = $request->influencerSeq ?? null;
  45497. $keyword = $request->keyword ?? '';
  45498. $category = $request->category ?? '';
  45499. $region = $request->region ?? '';
  45500. $sortBy = $request->sortBy ?? 'latest';
  45501. $page = (int)($request->page ?? 1);
  45502. $size = (int)($request->size ?? 12);
  45503. if (!$influencerSeq) {
  45504. return $this->response->setStatusCode(400)->setJSON([
  45505. 'success' => false,
  45506. 'message' => '인플루언서 SEQ는 필수입니다.'
  45507. ]);
  45508. }
  45509. // 필터 배열 구성 (VendorModel에 맞는 형식)
  45510. $filters = [
  45511. 'keyword' => $keyword,
  45512. 'category' => $category,
  45513. 'region' => $region,
  45514. 'sortBy' => $sortBy
  45515. ];
  45516. // 벤더사 목록 조회
  45517. $vendors = $this->vendorModel->searchVendors($filters, $page, $size);
  45518. $totalCount = $this->vendorModel->countSearchResults($filters);
  45519. // 각 벤더사와의 파트너십 상태 확인
  45520. foreach ($vendors as &$vendor) {
  45521. $partnership = $this->vendorInfluencerModel
  45522. ->select('VENDOR_INFLUENCER_MAPPING.SEQ, VENDOR_INFLUENCER_MAPPING.REQUEST_TYPE,
  45523. VENDOR_INFLUENCER_STATUS_HISTORY.STATUS as CURRENT_STATUS,
  45524. VENDOR_INFLUENCER_STATUS_HISTORY.STATUS_MESSAGE,
  45525. VENDOR_INFLUENCER_STATUS_HISTORY.CHANGED_DATE')
  45526. ->join('VENDOR_INFLUENCER_STATUS_HISTORY',
  45527. 'VENDOR_INFLUENCER_STATUS_HISTORY.MAPPING_SEQ = VENDOR_INFLUENCER_MAPPING.SEQ AND VENDOR_INFLUENCER_STATUS_HISTORY.IS_CURRENT = "Y"', 'left')
  45528. ->where('VENDOR_SEQ', $vendor['SEQ'])
  45529. ->where('INFLUENCER_SEQ', $influencerSeq)
  45530. ->where('VENDOR_INFLUENCER_MAPPING.IS_ACT', 'Y')
  45531. ->orderBy('VENDOR_INFLUENCER_MAPPING.REG_DATE', 'DESC')
  45532. ->first();
  45533. if ($partnership) {
  45534. $vendor['PARTNERSHIP_STATUS'] = $partnership['CURRENT_STATUS'];
  45535. $vendor['PARTNERSHIP_SEQ'] = $partnership['SEQ'];
  45536. $vendor['REQUEST_TYPE'] = $partnership['REQUEST_TYPE'];
  45537. $vendor['STATUS_MESSAGE'] = $partnership['STATUS_MESSAGE'];
  45538. $vendor['STATUS_DATE'] = $partnership['CHANGED_DATE'];
  45539. } else {
  45540. $vendor['PARTNERSHIP_STATUS'] = null;
  45541. $vendor['PARTNERSHIP_SEQ'] = null;
  45542. $vendor['REQUEST_TYPE'] = null;
  45543. $vendor['STATUS_MESSAGE'] = null;
  45544. $vendor['STATUS_DATE'] = null;
  45545. }
  45546. }
  45547. // 페이지네이션 정보 계산
  45548. $totalPages = ceil($totalCount / $size);
  45549. return $this->response->setJSON([
  45550. 'success' => true,
  45551. 'data' => [
  45552. 'items' => $vendors,
  45553. 'pagination' => [
  45554. 'currentPage' => $page,
  45555. 'totalPages' => $totalPages,
  45556. 'totalCount' => $totalCount,
  45557. 'pageSize' => $size
  45558. ]
  45559. ]
  45560. ]);
  45561. } catch (\Exception $e) {
  45562. log_message('error', '벤더사 검색 오류: ' . $e->getMessage());
  45563. log_message('error', '스택 트레이스: ' . $e->getTraceAsString());
  45564. return $this->response->setStatusCode(500)->setJSON([
  45565. 'success' => false,
  45566. 'message' => '벤더사 검색 중 오류가 발생했습니다.',
  45567. 'error' => $e->getMessage()
  45568. ]);
  45569. }
  45570. }
  45571. /**
  45572. * 승인 요청 생성
  45573. */
  45574. public function createApprovalRequest()
  45575. {
  45576. try {
  45577. $request = $this->request->getJSON();
  45578. $vendorSeq = $request->vendorSeq ?? null;
  45579. $influencerSeq = $request->influencerSeq ?? null;
  45580. $requestMessage = $request->requestMessage ?? '';
  45581. $requestedBy = $request->requestedBy ?? null;
  45582. $commissionRate = $request->commissionRate ?? null;
  45583. $specialConditions = $request->specialConditions ?? '';
  45584. if (!$vendorSeq || !$influencerSeq || !$requestedBy) {
  45585. return $this->response->setStatusCode(400)->setJSON([
  45586. 'success' => false,
  45587. 'message' => '필수 파라미터가 누락되었습니다.'
  45588. ]);
  45589. }
  45590. // 데이터 구성
  45591. $data = [
  45592. 'VENDOR_SEQ' => $vendorSeq,
  45593. 'INFLUENCER_SEQ' => $influencerSeq,
  45594. 'REQUEST_MESSAGE' => $requestMessage,
  45595. 'REQUESTED_BY' => $requestedBy,
  45596. 'COMMISSION_RATE' => $commissionRate,
  45597. 'SPECIAL_CONDITIONS' => $specialConditions
  45598. ];
  45599. // InfluencerPartnershipModel을 통해 요청 생성
  45600. $mappingSeq = $this->influencerPartnershipModel->createApprovalRequest($data);
  45601. return $this->response->setStatusCode(201)->setJSON([
  45602. 'success' => true,
  45603. 'message' => '승인 요청이 성공적으로 생성되었습니다.',
  45604. 'data' => [
  45605. 'mappingSeq' => $mappingSeq,
  45606. 'status' => 'PENDING'
  45607. ]
  45608. ]);
  45609. } catch (\Exception $e) {
  45610. log_message('error', '승인 요청 생성 오류: ' . $e->getMessage());
  45611. log_message('error', '스택 트레이스: ' . $e->getTraceAsString());
  45612. return $this->response->setStatusCode(500)->setJSON([
  45613. 'success' => false,
  45614. 'message' => '승인 요청 생성에 실패했습니다.',
  45615. 'error' => $e->getMessage()
  45616. ]);
  45617. }
  45618. }
  45619. /**
  45620. * 재승인 요청 생성 (히스토리 테이블 기반)
  45621. */
  45622. public function createReapplyRequest()
  45623. {
  45624. try {
  45625. $request = $this->request->getJSON();
  45626. $vendorSeq = $request->vendorSeq ?? null;
  45627. $influencerSeq = $request->influencerSeq ?? null;
  45628. $requestMessage = $request->requestMessage ?? '';
  45629. $requestedBy = $request->requestedBy ?? null;
  45630. $commissionRate = $request->commissionRate ?? null;
  45631. $specialConditions = $request->specialConditions ?? '';
  45632. log_message('debug', '재승인 요청 파라미터: ' . json_encode([
  45633. 'vendorSeq' => $vendorSeq,
  45634. 'influencerSeq' => $influencerSeq,
  45635. 'requestedBy' => $requestedBy
  45636. ]));
  45637. if (!$vendorSeq || !$influencerSeq || !$requestedBy) {
  45638. return $this->response->setStatusCode(400)->setJSON([
  45639. 'success' => false,
  45640. 'message' => '필수 파라미터가 누락되었습니다.'
  45641. ]);
  45642. }
  45643. // 재승인 가능한 파트너십 확인 (TERMINATED 또는 REJECTED 상태)
  45644. $eligiblePartnership = $this->vendorInfluencerModel->checkReapplyEligiblePartnership($vendorSeq, $influencerSeq);
  45645. if (!$eligiblePartnership) {
  45646. return $this->response->setStatusCode(400)->setJSON([
  45647. 'success' => false,
  45648. 'message' => '재승인을 요청할 수 있는 이전 파트너십이 없습니다.'
  45649. ]);
  45650. }
  45651. // 이미 재승인 요청 중인지 확인
  45652. $existingReapply = $this->vendorInfluencerModel->checkExistingPendingRequest($vendorSeq, $influencerSeq);
  45653. if ($existingReapply) {
  45654. return $this->response->setStatusCode(409)->setJSON([
  45655. 'success' => false,
  45656. 'message' => '이미 재승인 요청이 진행 중입니다.'
  45657. ]);
  45658. }
  45659. // 재승인 요청 생성
  45660. $data = [
  45661. 'VENDOR_SEQ' => $vendorSeq,
  45662. 'INFLUENCER_SEQ' => $influencerSeq,
  45663. 'REQUEST_TYPE' => 'INFLUENCER_REAPPLY',
  45664. 'REQUEST_MESSAGE' => $requestMessage,
  45665. 'REQUESTED_BY' => $requestedBy,
  45666. 'COMMISSION_RATE' => $commissionRate ?: $eligiblePartnership['COMMISSION_RATE'],
  45667. 'SPECIAL_CONDITIONS' => $specialConditions ?: $eligiblePartnership['SPECIAL_CONDITIONS'],
  45668. 'ADD_INFO1' => 'REAPPLY',
  45669. 'ADD_INFO2' => $eligiblePartnership['SEQ'], // 이전 파트너십 SEQ
  45670. 'ADD_INFO3' => date('Y-m-d H:i:s') // 재신청 일시
  45671. ];
  45672. $mappingSeq = $this->vendorInfluencerModel->insert($data);
  45673. // afterInsert 콜백에서 자동으로 PENDING 상태 히스토리 생성됨
  45674. if ($mappingSeq) {
  45675. log_message('debug', "재승인 요청 성공 - 새 매핑 SEQ: " . $mappingSeq);
  45676. return $this->response->setStatusCode(201)->setJSON([
  45677. 'success' => true,
  45678. 'message' => '재승인 요청이 성공적으로 생성되었습니다.',
  45679. 'data' => [
  45680. 'mappingSeq' => $mappingSeq,
  45681. 'status' => 'PENDING',
  45682. 'isReapply' => true,
  45683. 'previousPartnership' => $eligiblePartnership['SEQ']
  45684. ]
  45685. ]);
  45686. } else {
  45687. log_message('error', '재승인 요청 삽입 실패');
  45688. return $this->response->setStatusCode(500)->setJSON([
  45689. 'success' => false,
  45690. 'message' => '재승인 요청 데이터 삽입에 실패했습니다.'
  45691. ]);
  45692. }
  45693. } catch (\Exception $e) {
  45694. log_message('error', '재승인 요청 처리 중 예외 발생: ' . $e->getMessage());
  45695. log_message('error', '재승인 요청 스택 트레이스: ' . $e->getTraceAsString());
  45696. return $this->response->setStatusCode(500)->setJSON([
  45697. 'success' => false,
  45698. 'message' => '재승인 요청 생성 중 오류가 발생했습니다.',
  45699. 'error' => $e->getMessage()
  45700. ]);
  45701. }
  45702. }
  45703. /**
  45704. * 내 파트너십 목록 조회 (상태 히스토리 포함)
  45705. */
  45706. public function getMyPartnerships()
  45707. {
  45708. try {
  45709. $request = $this->request->getJSON();
  45710. $influencerSeq = $request->influencerSeq ?? null;
  45711. $status = $request->status ?? null;
  45712. $page = $request->page ?? 1;
  45713. $size = $request->size ?? 20;
  45714. if (!$influencerSeq) {
  45715. return $this->response->setStatusCode(400)->setJSON([
  45716. 'success' => false,
  45717. 'message' => '인플루언서 SEQ는 필수입니다.'
  45718. ]);
  45719. }
  45720. $result = $this->influencerPartnershipModel->getInfluencerPartnerships($influencerSeq, $page, $size, $status);
  45721. return $this->response->setJSON([
  45722. 'success' => true,
  45723. 'data' => $result['data'],
  45724. 'pagination' => $result['pagination']
  45725. ]);
  45726. } catch (\Exception $e) {
  45727. log_message('error', '파트너십 목록 조회 오류: ' . $e->getMessage());
  45728. return $this->response->setStatusCode(500)->setJSON([
  45729. 'success' => false,
  45730. 'message' => '파트너십 목록 조회 중 오류가 발생했습니다.',
  45731. 'error' => $e->getMessage()
  45732. ]);
  45733. }
  45734. }
  45735. /**
  45736. * 파트너십 해지 (히스토리 테이블 기반)
  45737. */
  45738. public function terminatePartnership()
  45739. {
  45740. try {
  45741. $request = $this->request->getJSON();
  45742. $mappingSeq = $request->mappingSeq ?? null;
  45743. $reason = $request->reason ?? '';
  45744. $terminatedBy = $request->terminatedBy ?? null;
  45745. if (!$mappingSeq || !$terminatedBy) {
  45746. return $this->response->setStatusCode(400)->setJSON([
  45747. 'success' => false,
  45748. 'message' => '필수 파라미터가 누락되었습니다.'
  45749. ]);
  45750. }
  45751. // 현재 상태 확인
  45752. $mapping = $this->vendorInfluencerModel->getWithCurrentStatus($mappingSeq);
  45753. if (!$mapping) {
  45754. return $this->response->setStatusCode(404)->setJSON([
  45755. 'success' => false,
  45756. 'message' => '해당 파트너십을 찾을 수 없습니다.'
  45757. ]);
  45758. }
  45759. if ($mapping['CURRENT_STATUS'] !== 'APPROVED') {
  45760. return $this->response->setStatusCode(400)->setJSON([
  45761. 'success' => false,
  45762. 'message' => '승인된 파트너십만 해지할 수 있습니다.'
  45763. ]);
  45764. }
  45765. // 상태를 TERMINATED로 변경
  45766. $this->statusHistoryModel->changeStatus($mappingSeq, 'TERMINATED', '파트너십 해지: ' . $reason, $terminatedBy);
  45767. // 해지 날짜 업데이트
  45768. $this->vendorInfluencerModel->update($mappingSeq, [
  45769. 'PARTNERSHIP_END_DATE' => date('Y-m-d H:i:s')
  45770. ]);
  45771. return $this->response->setJSON([
  45772. 'success' => true,
  45773. 'message' => '파트너십이 해지되었습니다.',
  45774. 'data' => [
  45775. 'mappingSeq' => $mappingSeq,
  45776. 'status' => 'TERMINATED'
  45777. ]
  45778. ]);
  45779. } catch (\Exception $e) {
  45780. log_message('error', '파트너십 해지 오류: ' . $e->getMessage());
  45781. return $this->response->setStatusCode(500)->setJSON([
  45782. 'success' => false,
  45783. 'message' => '파트너십 해지 중 오류가 발생했습니다.',
  45784. 'error' => $e->getMessage()
  45785. ]);
  45786. }
  45787. }
  45788. /**
  45789. * 인플루언서 프로필 조회
  45790. */
  45791. public function getProfile()
  45792. {
  45793. try {
  45794. $request = $this->request->getJSON();
  45795. $influencerSeq = $request->influencerSeq ?? null;
  45796. if (!$influencerSeq) {
  45797. return $this->response->setStatusCode(400)->setJSON([
  45798. 'success' => false,
  45799. 'message' => '인플루언서 SEQ는 필수입니다.'
  45800. ]);
  45801. }
  45802. $profile = $this->influencerModel
  45803. ->where('SEQ', $influencerSeq)
  45804. ->where('IS_ACT', 'Y')
  45805. ->first();
  45806. if (!$profile) {
  45807. return $this->response->setStatusCode(404)->setJSON([
  45808. 'success' => false,
  45809. 'message' => '인플루언서를 찾을 수 없습니다.'
  45810. ]);
  45811. }
  45812. return $this->response->setJSON([
  45813. 'success' => true,
  45814. 'data' => $profile
  45815. ]);
  45816. } catch (\Exception $e) {
  45817. log_message('error', '인플루언서 프로필 조회 오류: ' . $e->getMessage());
  45818. return $this->response->setStatusCode(500)->setJSON([
  45819. 'success' => false,
  45820. 'message' => '프로필 조회 중 오류가 발생했습니다.',
  45821. 'error' => $e->getMessage()
  45822. ]);
  45823. }
  45824. }
  45825. }
  45826. </file>
  45827. <file path="backend/app/Controllers/VendorController.php">
  45828. <?php
  45829. namespace App\Controllers;
  45830. use CodeIgniter\RESTful\ResourceController;
  45831. use App\Models\VendorInfluencerMappingModel;
  45832. use App\Models\VendorInfluencerStatusHistoryModel;
  45833. use App\Models\VendorPartnershipModel;
  45834. use App\Models\VendorModel;
  45835. use App\Models\InfluencerModel;
  45836. class VendorController extends ResourceController
  45837. {
  45838. protected $modelName = 'App\Models\VendorInfluencerMappingModel';
  45839. protected $format = 'json';
  45840. protected $vendorInfluencerModel;
  45841. protected $vendorPartnershipModel;
  45842. protected $statusHistoryModel;
  45843. protected $vendorModel;
  45844. protected $influencerModel;
  45845. public function __construct()
  45846. {
  45847. $this->vendorInfluencerModel = new VendorInfluencerMappingModel();
  45848. $this->vendorPartnershipModel = new VendorPartnershipModel();
  45849. $this->statusHistoryModel = new VendorInfluencerStatusHistoryModel();
  45850. $this->vendorModel = new VendorModel();
  45851. $this->influencerModel = new InfluencerModel();
  45852. }
  45853. /**
  45854. * 벤더사의 인플루언서 요청 목록 조회 (히스토리 테이블 기반)
  45855. */
  45856. public function getInfluencerRequests()
  45857. {
  45858. try {
  45859. $request = $this->request->getJSON();
  45860. $vendorSeq = $request->vendorSeq ?? null;
  45861. $status = $request->status ?? null;
  45862. $page = $request->page ?? 1;
  45863. $size = $request->size ?? 20;
  45864. log_message('debug', 'getInfluencerRequests 호출: ' . json_encode([
  45865. 'vendorSeq' => $vendorSeq,
  45866. 'status' => $status,
  45867. 'page' => $page,
  45868. 'size' => $size
  45869. ]));
  45870. if (!$vendorSeq) {
  45871. return $this->response->setStatusCode(400)->setJSON([
  45872. 'success' => false,
  45873. 'message' => '벤더사 SEQ는 필수입니다.'
  45874. ]);
  45875. }
  45876. $result = $this->vendorPartnershipModel->getVendorRequestsWithPagination($vendorSeq, $page, $size, $status);
  45877. // 통계 계산 (히스토리 테이블이 없을 경우를 대비한 안전장치)
  45878. $statsFormatted = [
  45879. 'pending' => 0,
  45880. 'approved' => 0,
  45881. 'rejected' => 0,
  45882. 'total' => 0
  45883. ];
  45884. try {
  45885. $stats = $this->statusHistoryModel->getStatusStatsByVendor($vendorSeq);
  45886. foreach ($stats as $stat) {
  45887. $statsFormatted['total'] += $stat['count'];
  45888. switch ($stat['STATUS']) {
  45889. case 'PENDING':
  45890. $statsFormatted['pending'] = $stat['count'];
  45891. break;
  45892. case 'APPROVED':
  45893. $statsFormatted['approved'] = $stat['count'];
  45894. break;
  45895. case 'REJECTED':
  45896. $statsFormatted['rejected'] = $stat['count'];
  45897. break;
  45898. }
  45899. }
  45900. } catch (\Exception $statsError) {
  45901. log_message('warning', '통계 조회 실패 (히스토리 테이블 없음?): ' . $statsError->getMessage());
  45902. // 히스토리 테이블이 없으면 메인 테이블에서 대략적인 통계 계산
  45903. try {
  45904. $mainStats = $this->vendorInfluencerModel
  45905. ->where('VENDOR_SEQ', $vendorSeq)
  45906. ->where('IS_ACT', 'Y')
  45907. ->countAllResults();
  45908. $statsFormatted['total'] = $mainStats;
  45909. $statsFormatted['pending'] = $mainStats; // 히스토리가 없으면 모두 PENDING으로 가정
  45910. } catch (\Exception $mainStatsError) {
  45911. log_message('error', '메인 테이블 통계도 실패: ' . $mainStatsError->getMessage());
  45912. }
  45913. }
  45914. log_message('debug', 'API 응답 데이터: ' . json_encode([
  45915. 'items_count' => count($result['data']),
  45916. 'pagination' => $result['pagination'],
  45917. 'stats' => $statsFormatted
  45918. ]));
  45919. // 프론트엔드에서 기대하는 응답 구조에 맞춤
  45920. return $this->response->setJSON([
  45921. 'success' => true,
  45922. 'data' => [
  45923. 'items' => $result['data'], // 프론트엔드에서 data.items로 접근
  45924. 'total' => $result['pagination']['total'],
  45925. 'page' => $result['pagination']['currentPage'],
  45926. 'totalPages' => $result['pagination']['totalPages'],
  45927. 'size' => $result['pagination']['limit'],
  45928. 'stats' => $statsFormatted
  45929. ]
  45930. ]);
  45931. } catch (\Exception $e) {
  45932. log_message('error', '인플루언서 요청 목록 조회 오류: ' . $e->getMessage());
  45933. log_message('error', '스택 트레이스: ' . $e->getTraceAsString());
  45934. return $this->response->setStatusCode(500)->setJSON([
  45935. 'success' => false,
  45936. 'message' => '요청 목록 조회 중 오류가 발생했습니다.',
  45937. 'error' => $e->getMessage()
  45938. ]);
  45939. }
  45940. }
  45941. /**
  45942. * 인플루언서 요청 승인/거절 처리 (히스토리 테이블 기반)
  45943. */
  45944. public function processInfluencerRequest()
  45945. {
  45946. try {
  45947. $request = $this->request->getJSON();
  45948. $mappingSeq = $request->mappingSeq ?? null;
  45949. $action = $request->action ?? null; // 'approve' or 'reject'
  45950. $processedBy = $request->processedBy ?? null;
  45951. $responseMessage = $request->responseMessage ?? '';
  45952. log_message('debug', '승인 처리 요청: ' . json_encode([
  45953. 'mappingSeq' => $mappingSeq,
  45954. 'action' => $action,
  45955. 'processedBy' => $processedBy,
  45956. 'responseMessage' => $responseMessage
  45957. ]));
  45958. if (!$mappingSeq || !$action || !$processedBy) {
  45959. return $this->response->setStatusCode(400)->setJSON([
  45960. 'success' => false,
  45961. 'message' => '필수 파라미터가 누락되었습니다. (mappingSeq, action, processedBy 필요)'
  45962. ]);
  45963. }
  45964. // action 검증
  45965. if (!in_array($action, ['approve', 'reject'])) {
  45966. return $this->response->setStatusCode(400)->setJSON([
  45967. 'success' => false,
  45968. 'message' => 'action은 approve 또는 reject만 가능합니다.'
  45969. ]);
  45970. }
  45971. // 매핑 정보와 현재 상태 확인
  45972. $mapping = $this->vendorInfluencerModel->getWithCurrentStatus($mappingSeq);
  45973. if (!$mapping) {
  45974. return $this->response->setStatusCode(404)->setJSON([
  45975. 'success' => false,
  45976. 'message' => '요청을 찾을 수 없습니다.'
  45977. ]);
  45978. }
  45979. // 현재 상태가 PENDING인지 확인
  45980. if ($mapping['CURRENT_STATUS'] !== 'PENDING') {
  45981. return $this->response->setStatusCode(400)->setJSON([
  45982. 'success' => false,
  45983. 'message' => '이미 처리된 요청입니다. 현재 상태: ' . $mapping['CURRENT_STATUS']
  45984. ]);
  45985. }
  45986. // 처리자 확인
  45987. $processingUser = $this->validateProcessor($processedBy);
  45988. if (!$processingUser['success']) {
  45989. return $this->response->setStatusCode(400)->setJSON($processingUser);
  45990. }
  45991. // 상태 변경
  45992. $newStatus = ($action === 'approve') ? 'APPROVED' : 'REJECTED';
  45993. $statusMessage = $responseMessage ?: ($action === 'approve' ? '승인 처리됨' : '거부 처리됨');
  45994. log_message('debug', "상태 변경: {$mapping['CURRENT_STATUS']} → {$newStatus}");
  45995. // 히스토리 테이블에 상태 변경 기록
  45996. $this->statusHistoryModel->changeStatus($mappingSeq, $newStatus, $statusMessage, $processedBy);
  45997. // 메인 테이블 업데이트 (응답 관련 정보)
  45998. $this->vendorInfluencerModel->update($mappingSeq, [
  45999. 'RESPONSE_MESSAGE' => $responseMessage,
  46000. 'RESPONSE_DATE' => date('Y-m-d H:i:s'),
  46001. 'APPROVED_BY' => $processedBy
  46002. ]);
  46003. // 승인인 경우 파트너십 시작일 설정
  46004. if ($action === 'approve') {
  46005. $this->vendorInfluencerModel->update($mappingSeq, [
  46006. 'PARTNERSHIP_START_DATE' => date('Y-m-d H:i:s')
  46007. ]);
  46008. }
  46009. log_message('debug', "승인 처리 완료: action={$action}, newStatus={$newStatus}");
  46010. return $this->response->setJSON([
  46011. 'success' => true,
  46012. 'message' => $action === 'approve' ? '요청이 승인되었습니다.' : '요청이 거부되었습니다.',
  46013. 'data' => [
  46014. 'mappingSeq' => $mappingSeq,
  46015. 'action' => $action,
  46016. 'status' => $newStatus,
  46017. 'processedBy' => $processingUser['data']['name'],
  46018. 'responseMessage' => $responseMessage
  46019. ]
  46020. ]);
  46021. } catch (\Exception $e) {
  46022. log_message('error', '승인 처리 중 예외 발생: ' . $e->getMessage());
  46023. log_message('error', '승인 처리 스택 트레이스: ' . $e->getTraceAsString());
  46024. return $this->response->setStatusCode(500)->setJSON([
  46025. 'success' => false,
  46026. 'message' => '요청 처리 중 오류가 발생했습니다.',
  46027. 'error' => $e->getMessage()
  46028. ]);
  46029. }
  46030. }
  46031. /**
  46032. * 처리자 검증 (벤더사 또는 사용자)
  46033. */
  46034. private function validateProcessor($processedBy)
  46035. {
  46036. // 1. 먼저 USER_LIST에서 확인 (인플루언서)
  46037. $user = $this->influencerModel
  46038. ->where('SEQ', $processedBy)
  46039. ->where('IS_ACT', 'Y')
  46040. ->first();
  46041. if ($user) {
  46042. return [
  46043. 'success' => true,
  46044. 'data' => [
  46045. 'type' => 'user',
  46046. 'seq' => $user['SEQ'],
  46047. 'name' => $user['NICK_NAME'] ?: $user['NAME']
  46048. ]
  46049. ];
  46050. }
  46051. // 2. VENDOR_LIST에서 확인 (벤더사)
  46052. $vendor = $this->vendorModel
  46053. ->where('SEQ', $processedBy)
  46054. ->where('IS_ACT', 'Y')
  46055. ->first();
  46056. if ($vendor) {
  46057. return [
  46058. 'success' => true,
  46059. 'data' => [
  46060. 'type' => 'vendor',
  46061. 'seq' => $vendor['SEQ'],
  46062. 'name' => $vendor['COMPANY_NAME'] . ' (벤더사)'
  46063. ]
  46064. ];
  46065. }
  46066. return [
  46067. 'success' => false,
  46068. 'message' => "처리자 SEQ {$processedBy}는 USER_LIST나 VENDOR_LIST에서 찾을 수 없습니다."
  46069. ];
  46070. }
  46071. /**
  46072. * 벤더사 파트너십 해지 - 단순화된 방식
  46073. */
  46074. public function terminatePartnership()
  46075. {
  46076. try {
  46077. $request = $this->request->getJSON();
  46078. $mappingSeq = $request->mappingSeq ?? null;
  46079. $terminatedBy = $request->terminatedBy ?? null;
  46080. $terminateReason = $request->terminateReason ?? '';
  46081. log_message('info', '파트너십 해지 요청: ' . json_encode([
  46082. 'mappingSeq' => $mappingSeq,
  46083. 'terminatedBy' => $terminatedBy,
  46084. 'terminateReason' => $terminateReason
  46085. ]));
  46086. if (!$mappingSeq || !$terminatedBy) {
  46087. return $this->response->setStatusCode(400)->setJSON([
  46088. 'success' => false,
  46089. 'message' => '필수 파라미터가 누락되었습니다.'
  46090. ]);
  46091. }
  46092. // 매핑 정보 확인 (메인 테이블만 사용)
  46093. $mapping = $this->vendorInfluencerModel->where('SEQ', $mappingSeq)
  46094. ->where('IS_ACT', 'Y')
  46095. ->first();
  46096. if (!$mapping) {
  46097. return $this->response->setStatusCode(404)->setJSON([
  46098. 'success' => false,
  46099. 'message' => '파트너십을 찾을 수 없습니다.'
  46100. ]);
  46101. }
  46102. // 현재 상태 확인 (히스토리 테이블 기준)
  46103. $currentStatus = $this->statusHistoryModel->getCurrentStatus($mappingSeq);
  46104. $actualStatus = $currentStatus ? $currentStatus['STATUS'] : $mapping['STATUS'];
  46105. log_message('info', '현재 매핑 정보: ' . json_encode($mapping));
  46106. log_message('info', '히스토리 테이블 현재 상태: ' . json_encode($currentStatus));
  46107. log_message('info', '실제 확인할 상태: ' . $actualStatus);
  46108. // 현재 상태가 APPROVED인지 확인
  46109. if ($actualStatus !== 'APPROVED') {
  46110. return $this->response->setStatusCode(400)->setJSON([
  46111. 'success' => false,
  46112. 'message' => '승인된 파트너십만 해지할 수 있습니다. 현재 상태: ' . $actualStatus
  46113. ]);
  46114. }
  46115. // 처리자 확인
  46116. $processingUser = $this->validateProcessor($terminatedBy);
  46117. if (!$processingUser['success']) {
  46118. return $this->response->setStatusCode(400)->setJSON($processingUser);
  46119. }
  46120. log_message('info', '처리자 검증 완료: ' . json_encode($processingUser['data']));
  46121. // 메인 테이블 직접 업데이트 (단순하고 확실한 방법)
  46122. $statusMessage = '파트너십 해지: ' . $terminateReason;
  46123. $actualChangedBy = $processingUser['data']['seq'] ?? $terminatedBy ?: 1;
  46124. $updateData = [
  46125. 'STATUS' => 'TERMINATED',
  46126. 'RESPONSE_MESSAGE' => $statusMessage,
  46127. 'RESPONSE_DATE' => date('Y-m-d H:i:s'),
  46128. 'PARTNERSHIP_END_DATE' => date('Y-m-d H:i:s'),
  46129. 'APPROVED_BY' => $actualChangedBy,
  46130. 'MOD_DATE' => date('Y-m-d H:i:s')
  46131. ];
  46132. log_message('info', "메인 테이블 업데이트 데이터: " . json_encode($updateData));
  46133. // 업데이트 전 데이터 저장
  46134. $beforeUpdate = $this->vendorInfluencerModel->find($mappingSeq);
  46135. log_message('info', "업데이트 전 데이터: " . json_encode($beforeUpdate));
  46136. // UNIQUE 제약조건 우회를 위해 직접 SQL 사용
  46137. $db = \Config\Database::connect();
  46138. try {
  46139. // 1. 먼저 기존 TERMINATED 레코드가 있는지 확인
  46140. $existingTerminated = $db->query(
  46141. "SELECT SEQ FROM VENDOR_INFLUENCER_MAPPING
  46142. WHERE VENDOR_SEQ = ? AND INFLUENCER_SEQ = ? AND STATUS = 'TERMINATED' AND SEQ != ?",
  46143. [$beforeUpdate['VENDOR_SEQ'], $beforeUpdate['INFLUENCER_SEQ'], $mappingSeq]
  46144. )->getRowArray();
  46145. if ($existingTerminated) {
  46146. log_message('warning', '기존 TERMINATED 레코드 존재 - 비활성화: ' . json_encode($existingTerminated));
  46147. // 기존 TERMINATED 레코드를 비활성화
  46148. $db->query(
  46149. "UPDATE VENDOR_INFLUENCER_MAPPING SET IS_ACT = 'N' WHERE SEQ = ?",
  46150. [$existingTerminated['SEQ']]
  46151. );
  46152. }
  46153. // 2. 직접 SQL로 현재 레코드 업데이트
  46154. $updateSql = "UPDATE VENDOR_INFLUENCER_MAPPING SET
  46155. STATUS = 'TERMINATED',
  46156. RESPONSE_MESSAGE = ?,
  46157. RESPONSE_DATE = ?,
  46158. PARTNERSHIP_END_DATE = ?,
  46159. APPROVED_BY = ?,
  46160. MOD_DATE = ?
  46161. WHERE SEQ = ?";
  46162. $updateParams = [
  46163. $statusMessage,
  46164. date('Y-m-d H:i:s'),
  46165. date('Y-m-d H:i:s'),
  46166. $actualChangedBy,
  46167. date('Y-m-d H:i:s'),
  46168. $mappingSeq
  46169. ];
  46170. log_message('info', "직접 SQL 실행: " . $updateSql);
  46171. log_message('info', "SQL 파라미터: " . json_encode($updateParams));
  46172. $updateResult = $db->query($updateSql, $updateParams);
  46173. $affectedRows = $db->affectedRows();
  46174. log_message('info', "직접 SQL 업데이트 결과: 영향받은 행 수={$affectedRows}");
  46175. if ($affectedRows === 0) {
  46176. throw new \Exception('직접 SQL 업데이트 실패 - 영향받은 행이 0개');
  46177. }
  46178. } catch (\Exception $sqlError) {
  46179. log_message('error', '직접 SQL 업데이트 실패: ' . $sqlError->getMessage());
  46180. return $this->response->setStatusCode(500)->setJSON([
  46181. 'success' => false,
  46182. 'message' => '파트너십 해지 처리 중 SQL 오류가 발생했습니다.',
  46183. 'error' => '직접 SQL 업데이트 실패',
  46184. 'debug' => $sqlError->getMessage()
  46185. ]);
  46186. }
  46187. // 업데이트 후 데이터 확인
  46188. $afterUpdate = $this->vendorInfluencerModel->find($mappingSeq);
  46189. log_message('info', "업데이트 후 데이터: " . json_encode($afterUpdate));
  46190. // 실제 상태 변경 확인
  46191. if ($afterUpdate['STATUS'] !== 'TERMINATED') {
  46192. log_message('error', '상태 변경 검증 실패: ' . $afterUpdate['STATUS']);
  46193. return $this->response->setStatusCode(500)->setJSON([
  46194. 'success' => false,
  46195. 'message' => '파트너십 해지 처리 중 오류가 발생했습니다.',
  46196. 'error' => '상태 변경 검증 실패',
  46197. 'debug' => [
  46198. 'expected' => 'TERMINATED',
  46199. 'actual' => $afterUpdate['STATUS']
  46200. ]
  46201. ]);
  46202. }
  46203. log_message('info', '파트너십 해지 완료: mappingSeq=' . $mappingSeq);
  46204. return $this->response->setJSON([
  46205. 'success' => true,
  46206. 'message' => '파트너십이 해지되었습니다.',
  46207. 'data' => [
  46208. 'mappingSeq' => $mappingSeq,
  46209. 'status' => 'TERMINATED',
  46210. 'terminatedBy' => $processingUser['data']['name'],
  46211. 'terminateReason' => $terminateReason,
  46212. 'terminateDate' => date('Y-m-d H:i:s'),
  46213. 'verifiedStatus' => $afterUpdate['STATUS'] // 검증된 상태
  46214. ]
  46215. ]);
  46216. } catch (\Exception $e) {
  46217. log_message('error', '파트너십 해지 오류: ' . $e->getMessage());
  46218. return $this->response->setStatusCode(500)->setJSON([
  46219. 'success' => false,
  46220. 'message' => '파트너십 해지 중 오류가 발생했습니다.',
  46221. 'error' => '시스템 오류',
  46222. 'debug' => ENVIRONMENT === 'development' ? $e->getMessage() : null
  46223. ]);
  46224. }
  46225. }
  46226. /**
  46227. * 벤더사 상태 통계 조회
  46228. */
  46229. public function getStatusStats()
  46230. {
  46231. try {
  46232. $request = $this->request->getJSON();
  46233. $vendorSeq = $request->vendorSeq ?? null;
  46234. if (!$vendorSeq) {
  46235. return $this->response->setStatusCode(400)->setJSON([
  46236. 'success' => false,
  46237. 'message' => '벤더사 SEQ는 필수입니다.'
  46238. ]);
  46239. }
  46240. $stats = $this->statusHistoryModel->getStatusStatsByVendor($vendorSeq);
  46241. return $this->response->setJSON([
  46242. 'success' => true,
  46243. 'data' => $stats
  46244. ]);
  46245. } catch (\Exception $e) {
  46246. log_message('error', '상태 통계 조회 오류: ' . $e->getMessage());
  46247. return $this->response->setStatusCode(500)->setJSON([
  46248. 'success' => false,
  46249. 'message' => '상태 통계 조회 중 오류가 발생했습니다.',
  46250. 'error' => $e->getMessage()
  46251. ]);
  46252. }
  46253. }
  46254. /**
  46255. * 인플루언서 요청 승인/거절 (프론트엔드 호환용)
  46256. * 프론트엔드에서 /api/vendor-influencer/approve 호출에 대응
  46257. */
  46258. public function approveInfluencerRequest()
  46259. {
  46260. try {
  46261. $request = $this->request->getJSON();
  46262. $mappingSeq = $request->mappingSeq ?? null;
  46263. $action = $request->action ?? null; // 'APPROVE' or 'REJECT'
  46264. $processedBy = $request->processedBy ?? null;
  46265. $responseMessage = $request->responseMessage ?? '';
  46266. log_message('debug', '프론트엔드 승인 처리 요청: ' . json_encode([
  46267. 'mappingSeq' => $mappingSeq,
  46268. 'action' => $action,
  46269. 'processedBy' => $processedBy,
  46270. 'responseMessage' => $responseMessage
  46271. ]));
  46272. if (!$mappingSeq || !$action || !$processedBy) {
  46273. return $this->response->setStatusCode(400)->setJSON([
  46274. 'success' => false,
  46275. 'message' => '필수 파라미터가 누락되었습니다. (mappingSeq, action, processedBy 필요)'
  46276. ]);
  46277. }
  46278. // action 값 정규화 (프론트엔드에서는 대문자로 전송)
  46279. $normalizedAction = strtolower($action);
  46280. if (!in_array($normalizedAction, ['approve', 'reject'])) {
  46281. return $this->response->setStatusCode(400)->setJSON([
  46282. 'success' => false,
  46283. 'message' => 'action은 APPROVE 또는 REJECT만 가능합니다.'
  46284. ]);
  46285. }
  46286. // 매핑 정보와 현재 상태 확인
  46287. $mapping = $this->vendorInfluencerModel->getWithCurrentStatus($mappingSeq);
  46288. if (!$mapping) {
  46289. return $this->response->setStatusCode(404)->setJSON([
  46290. 'success' => false,
  46291. 'message' => '요청을 찾을 수 없습니다.'
  46292. ]);
  46293. }
  46294. // 현재 상태가 PENDING인지 확인
  46295. if ($mapping['CURRENT_STATUS'] !== 'PENDING') {
  46296. return $this->response->setStatusCode(400)->setJSON([
  46297. 'success' => false,
  46298. 'message' => '이미 처리된 요청입니다. 현재 상태: ' . $mapping['CURRENT_STATUS']
  46299. ]);
  46300. }
  46301. // 처리자 확인
  46302. $processingUser = $this->validateProcessor($processedBy);
  46303. if (!$processingUser['success']) {
  46304. return $this->response->setStatusCode(400)->setJSON($processingUser);
  46305. }
  46306. // 상태 변경
  46307. $newStatus = ($normalizedAction === 'approve') ? 'APPROVED' : 'REJECTED';
  46308. $statusMessage = $responseMessage ?: ($normalizedAction === 'approve' ? '승인 처리됨' : '거부 처리됨');
  46309. log_message('debug', "프론트엔드 상태 변경: {$mapping['CURRENT_STATUS']} → {$newStatus}");
  46310. // 히스토리 테이블에 상태 변경 기록
  46311. $this->statusHistoryModel->changeStatus($mappingSeq, $newStatus, $statusMessage, $processedBy);
  46312. // 메인 테이블 업데이트 (응답 관련 정보)
  46313. $this->vendorInfluencerModel->update($mappingSeq, [
  46314. 'RESPONSE_MESSAGE' => $responseMessage,
  46315. 'RESPONSE_DATE' => date('Y-m-d H:i:s'),
  46316. 'APPROVED_BY' => $processedBy
  46317. ]);
  46318. // 승인인 경우 파트너십 시작일 설정
  46319. if ($normalizedAction === 'approve') {
  46320. $this->vendorInfluencerModel->update($mappingSeq, [
  46321. 'PARTNERSHIP_START_DATE' => date('Y-m-d H:i:s')
  46322. ]);
  46323. }
  46324. log_message('debug', "프론트엔드 승인 처리 완료: action={$normalizedAction}, newStatus={$newStatus}");
  46325. return $this->response->setJSON([
  46326. 'success' => true,
  46327. 'message' => $normalizedAction === 'approve' ? '요청이 승인되었습니다.' : '요청이 거부되었습니다.',
  46328. 'data' => [
  46329. 'mappingSeq' => $mappingSeq,
  46330. 'action' => $action,
  46331. 'status' => $newStatus,
  46332. 'processedBy' => $processingUser['data']['name'],
  46333. 'responseMessage' => $responseMessage
  46334. ]
  46335. ]);
  46336. } catch (\Exception $e) {
  46337. log_message('error', '프론트엔드 승인 처리 중 예외 발생: ' . $e->getMessage());
  46338. log_message('error', '프론트엔드 승인 처리 스택 트레이스: ' . $e->getTraceAsString());
  46339. return $this->response->setStatusCode(500)->setJSON([
  46340. 'success' => false,
  46341. 'message' => '요청 처리 중 오류가 발생했습니다.',
  46342. 'error' => $e->getMessage()
  46343. ]);
  46344. }
  46345. }
  46346. /**
  46347. * 데이터베이스 상태 디버깅 (임시)
  46348. */
  46349. public function debugMappingStatus($mappingSeq = null)
  46350. {
  46351. try {
  46352. if (!$mappingSeq) {
  46353. $mappingSeq = $this->request->getGet('seq') ?? 1;
  46354. }
  46355. // 메인 테이블 상태
  46356. $mainData = $this->vendorInfluencerModel->where('SEQ', $mappingSeq)->first();
  46357. // 히스토리 테이블 전체
  46358. $historyData = $this->statusHistoryModel->where('MAPPING_SEQ', $mappingSeq)
  46359. ->orderBy('CHANGED_DATE', 'DESC')
  46360. ->findAll();
  46361. // 현재 상태 (IS_CURRENT='Y')
  46362. $currentStatus = $this->statusHistoryModel->getCurrentStatus($mappingSeq);
  46363. return $this->response->setJSON([
  46364. 'success' => true,
  46365. 'mappingSeq' => $mappingSeq,
  46366. 'mainTable' => $mainData,
  46367. 'historyTable' => $historyData,
  46368. 'currentStatus' => $currentStatus,
  46369. 'timestamp' => date('Y-m-d H:i:s')
  46370. ]);
  46371. } catch (\Exception $e) {
  46372. return $this->response->setJSON([
  46373. 'success' => false,
  46374. 'error' => $e->getMessage()
  46375. ]);
  46376. }
  46377. }
  46378. /**
  46379. * 디버깅용: 히스토리 테이블 insert 테스트
  46380. */
  46381. public function debugHistoryInsert()
  46382. {
  46383. try {
  46384. $request = $this->request->getJSON();
  46385. $mappingSeq = $request->mappingSeq ?? 1;
  46386. // 최소한의 데이터로 테스트 insert
  46387. $testData = [
  46388. 'MAPPING_SEQ' => (int)$mappingSeq,
  46389. 'STATUS' => 'PENDING',
  46390. 'PREVIOUS_STATUS' => null,
  46391. 'STATUS_MESSAGE' => 'Test insert',
  46392. 'CHANGED_BY' => 1,
  46393. 'IS_CURRENT' => 'N', // 테스트용이므로 N으로 설정
  46394. 'CHANGED_DATE' => date('Y-m-d H:i:s')
  46395. ];
  46396. log_message('debug', '테스트 insert 데이터: ' . json_encode($testData));
  46397. // validation 체크
  46398. if (!$this->statusHistoryModel->validate($testData)) {
  46399. $validationErrors = $this->statusHistoryModel->errors();
  46400. return $this->response->setJSON([
  46401. 'success' => false,
  46402. 'message' => 'Validation 실패',
  46403. 'errors' => $validationErrors,
  46404. 'data' => $testData
  46405. ]);
  46406. }
  46407. $result = $this->statusHistoryModel->insert($testData, false);
  46408. if (!$result) {
  46409. $dbError = $this->statusHistoryModel->db->error();
  46410. return $this->response->setJSON([
  46411. 'success' => false,
  46412. 'message' => 'DB Insert 실패',
  46413. 'dbError' => $dbError,
  46414. 'data' => $testData
  46415. ]);
  46416. }
  46417. return $this->response->setJSON([
  46418. 'success' => true,
  46419. 'message' => '테스트 insert 성공',
  46420. 'insertId' => $result,
  46421. 'data' => $testData
  46422. ]);
  46423. } catch (\Exception $e) {
  46424. return $this->response->setJSON([
  46425. 'success' => false,
  46426. 'message' => '테스트 insert 중 오류',
  46427. 'error' => $e->getMessage(),
  46428. 'trace' => $e->getTraceAsString()
  46429. ]);
  46430. }
  46431. }
  46432. /**
  46433. * 메인 테이블과 히스토리 테이블 상태 동기화
  46434. */
  46435. public function syncMappingStatus()
  46436. {
  46437. try {
  46438. $request = $this->request->getJSON();
  46439. $mappingSeq = $request->mappingSeq ?? $this->request->getGet('seq');
  46440. if (!$mappingSeq) {
  46441. return $this->response->setJSON([
  46442. 'success' => false,
  46443. 'message' => 'mappingSeq가 필요합니다.'
  46444. ]);
  46445. }
  46446. // 현재 히스토리 테이블 상태 조회
  46447. $currentStatus = $this->statusHistoryModel->getCurrentStatus($mappingSeq);
  46448. if (!$currentStatus) {
  46449. return $this->response->setJSON([
  46450. 'success' => false,
  46451. 'message' => '히스토리 테이블에서 현재 상태를 찾을 수 없습니다.'
  46452. ]);
  46453. }
  46454. // 메인 테이블 업데이트
  46455. $updateData = [
  46456. 'STATUS' => $currentStatus['STATUS'],
  46457. 'MOD_DATE' => date('Y-m-d H:i:s')
  46458. ];
  46459. // TERMINATED 상태인 경우 추가 필드 업데이트
  46460. if ($currentStatus['STATUS'] === 'TERMINATED') {
  46461. $updateData['RESPONSE_MESSAGE'] = $currentStatus['STATUS_MESSAGE'] ?? '파트너십 해지';
  46462. $updateData['RESPONSE_DATE'] = $currentStatus['CHANGED_DATE'];
  46463. $updateData['PARTNERSHIP_END_DATE'] = $currentStatus['CHANGED_DATE'];
  46464. $updateData['APPROVED_BY'] = $currentStatus['CHANGED_BY'];
  46465. }
  46466. $result = $this->vendorInfluencerModel->update($mappingSeq, $updateData);
  46467. if ($result) {
  46468. // 동기화 후 상태 확인
  46469. $updatedMain = $this->vendorInfluencerModel->find($mappingSeq);
  46470. return $this->response->setJSON([
  46471. 'success' => true,
  46472. 'message' => '상태 동기화 완료',
  46473. 'data' => [
  46474. 'mappingSeq' => $mappingSeq,
  46475. 'syncedStatus' => $currentStatus['STATUS'],
  46476. 'updatedMainTable' => $updatedMain
  46477. ]
  46478. ]);
  46479. } else {
  46480. return $this->response->setJSON([
  46481. 'success' => false,
  46482. 'message' => '메인 테이블 업데이트 실패'
  46483. ]);
  46484. }
  46485. } catch (\Exception $e) {
  46486. return $this->response->setJSON([
  46487. 'success' => false,
  46488. 'message' => '동기화 중 오류 발생',
  46489. 'error' => $e->getMessage()
  46490. ]);
  46491. }
  46492. }
  46493. }
  46494. </file>
  46495. <file path="backend/app/Models/UserModel.php">
  46496. <?php
  46497. namespace App\Models;
  46498. use CodeIgniter\Model;
  46499. class UserModel extends Model
  46500. {
  46501. protected $table = 'USER_LIST';
  46502. protected $primaryKey = 'SEQ';
  46503. protected $useAutoIncrement = true;
  46504. protected $returnType = 'array';
  46505. protected $useSoftDeletes = false;
  46506. protected $allowedFields = [
  46507. 'ID',
  46508. 'PASSWORD',
  46509. 'NICK_NAME',
  46510. 'EMAIL',
  46511. 'PHONE',
  46512. 'MEMBER_TYPE',
  46513. 'STATUS',
  46514. 'LAST_LOGIN_DATE',
  46515. 'IS_ACT',
  46516. 'REG_DATE',
  46517. 'MOD_DATE',
  46518. // 인플루언서 관련 필드들
  46519. 'INFLUENCER_TYPE',
  46520. 'PRIMARY_CATEGORY',
  46521. 'FOLLOWER_COUNT',
  46522. 'AVG_VIEWS',
  46523. 'PROFILE_IMAGE',
  46524. 'BIO',
  46525. 'INSTAGRAM_URL',
  46526. 'YOUTUBE_URL',
  46527. 'TIKTOK_URL',
  46528. 'BLOG_URL',
  46529. 'PREFERRED_REGION',
  46530. 'MIN_COMMISSION_RATE',
  46531. 'VERIFICATION_STATUS',
  46532. 'VERIFIED_DATE'
  46533. ];
  46534. protected $useTimestamps = true;
  46535. protected $createdField = 'REG_DATE';
  46536. protected $updatedField = 'MOD_DATE';
  46537. protected $validationRules = [
  46538. 'ID' => 'required|max_length[50]|is_unique[USER_LIST.ID,SEQ,{SEQ}]',
  46539. 'PASSWORD' => 'required|min_length[8]',
  46540. 'NICK_NAME' => 'required|max_length[100]',
  46541. 'EMAIL' => 'required|valid_email|is_unique[USER_LIST.EMAIL,SEQ,{SEQ}]',
  46542. 'PHONE' => 'permit_empty|max_length[20]',
  46543. 'MEMBER_TYPE' => 'required|in_list[ADMIN,INFLUENCER,VENDOR]',
  46544. 'STATUS' => 'required|in_list[ACTIVE,INACTIVE,SUSPENDED,PENDING]',
  46545. 'IS_ACT' => 'required|in_list[Y,N]',
  46546. 'INFLUENCER_TYPE' => 'permit_empty|in_list[MACRO,MICRO,NANO,MEGA]',
  46547. 'PRIMARY_CATEGORY' => 'permit_empty|in_list[FASHION_BEAUTY,FOOD_HEALTH,LIFESTYLE,TECH_ELECTRONICS,SPORTS_LEISURE,CULTURE_ENTERTAINMENT]',
  46548. 'FOLLOWER_COUNT' => 'permit_empty|integer|greater_than_equal_to[0]',
  46549. 'AVG_VIEWS' => 'permit_empty|integer|greater_than_equal_to[0]',
  46550. 'PREFERRED_REGION' => 'permit_empty|in_list[SEOUL,GYEONGGI,INCHEON,BUSAN,DAEGU,DAEJEON,GWANGJU,ULSAN,OTHER]',
  46551. 'MIN_COMMISSION_RATE' => 'permit_empty|decimal|greater_than_equal_to[0]|less_than_equal_to[100]',
  46552. 'VERIFICATION_STATUS' => 'permit_empty|in_list[UNVERIFIED,PENDING,VERIFIED,REJECTED]'
  46553. ];
  46554. protected $validationMessages = [
  46555. 'ID' => [
  46556. 'required' => '아이디는 필수입니다.',
  46557. 'max_length' => '아이디는 50자를 초과할 수 없습니다.',
  46558. 'is_unique' => '이미 사용 중인 아이디입니다.'
  46559. ],
  46560. 'PASSWORD' => [
  46561. 'required' => '비밀번호는 필수입니다.',
  46562. 'min_length' => '비밀번호는 최소 8자 이상이어야 합니다.'
  46563. ],
  46564. 'NICK_NAME' => [
  46565. 'required' => '닉네임은 필수입니다.',
  46566. 'max_length' => '닉네임은 100자를 초과할 수 없습니다.'
  46567. ],
  46568. 'EMAIL' => [
  46569. 'required' => '이메일은 필수입니다.',
  46570. 'valid_email' => '유효한 이메일 형식이 아닙니다.',
  46571. 'is_unique' => '이미 사용 중인 이메일입니다.'
  46572. ],
  46573. 'MEMBER_TYPE' => [
  46574. 'required' => '회원 유형은 필수입니다.',
  46575. 'in_list' => '유효하지 않은 회원 유형입니다.'
  46576. ],
  46577. 'STATUS' => [
  46578. 'required' => '상태는 필수입니다.',
  46579. 'in_list' => '유효하지 않은 상태입니다.'
  46580. ],
  46581. 'IS_ACT' => [
  46582. 'required' => '활성 상태는 필수입니다.',
  46583. 'in_list' => '활성 상태는 Y 또는 N이어야 합니다.'
  46584. ]
  46585. ];
  46586. protected $skipValidation = false;
  46587. protected $cleanValidationRules = true;
  46588. /**
  46589. * 인플루언서 목록 조회
  46590. */
  46591. public function getInfluencers($filters = [], $page = 1, $perPage = 12)
  46592. {
  46593. $builder = $this->where('MEMBER_TYPE', 'INFLUENCER')
  46594. ->where('IS_ACT', 'Y')
  46595. ->where('STATUS', 'ACTIVE');
  46596. // 키워드 검색
  46597. if (!empty($filters['keyword'])) {
  46598. $builder->groupStart()
  46599. ->like('NICK_NAME', $filters['keyword'])
  46600. ->orLike('ID', $filters['keyword'])
  46601. ->groupEnd();
  46602. }
  46603. // 카테고리 필터
  46604. if (!empty($filters['category'])) {
  46605. $builder->where('PRIMARY_CATEGORY', $filters['category']);
  46606. }
  46607. // 인플루언서 타입 필터
  46608. if (!empty($filters['influencer_type'])) {
  46609. $builder->where('INFLUENCER_TYPE', $filters['influencer_type']);
  46610. }
  46611. // 팔로워 수 범위
  46612. if (!empty($filters['follower_min'])) {
  46613. $builder->where('FOLLOWER_COUNT >=', $filters['follower_min']);
  46614. }
  46615. if (!empty($filters['follower_max'])) {
  46616. $builder->where('FOLLOWER_COUNT <=', $filters['follower_max']);
  46617. }
  46618. // 페이징
  46619. $offset = ($page - 1) * $perPage;
  46620. return $builder->limit($perPage, $offset)->findAll();
  46621. }
  46622. /**
  46623. * 인플루언서 검색 결과 총 개수
  46624. */
  46625. public function countInfluencers($filters = [])
  46626. {
  46627. $builder = $this->where('MEMBER_TYPE', 'INFLUENCER')
  46628. ->where('IS_ACT', 'Y')
  46629. ->where('STATUS', 'ACTIVE');
  46630. // 키워드 검색
  46631. if (!empty($filters['keyword'])) {
  46632. $builder->groupStart()
  46633. ->like('NICK_NAME', $filters['keyword'])
  46634. ->orLike('ID', $filters['keyword'])
  46635. ->groupEnd();
  46636. }
  46637. // 카테고리 필터
  46638. if (!empty($filters['category'])) {
  46639. $builder->where('PRIMARY_CATEGORY', $filters['category']);
  46640. }
  46641. // 인플루언서 타입 필터
  46642. if (!empty($filters['influencer_type'])) {
  46643. $builder->where('INFLUENCER_TYPE', $filters['influencer_type']);
  46644. }
  46645. // 팔로워 수 범위
  46646. if (!empty($filters['follower_min'])) {
  46647. $builder->where('FOLLOWER_COUNT >=', $filters['follower_min']);
  46648. }
  46649. if (!empty($filters['follower_max'])) {
  46650. $builder->where('FOLLOWER_COUNT <=', $filters['follower_max']);
  46651. }
  46652. return $builder->countAllResults();
  46653. }
  46654. /**
  46655. * 인플루언서 타입별 통계
  46656. */
  46657. public function getInfluencerTypeStats()
  46658. {
  46659. return $this->select('INFLUENCER_TYPE, COUNT(*) as count')
  46660. ->where('MEMBER_TYPE', 'INFLUENCER')
  46661. ->where('IS_ACT', 'Y')
  46662. ->where('STATUS', 'ACTIVE')
  46663. ->groupBy('INFLUENCER_TYPE')
  46664. ->findAll();
  46665. }
  46666. /**
  46667. * 카테고리별 인플루언서 통계
  46668. */
  46669. public function getInfluencerCategoryStats()
  46670. {
  46671. return $this->select('PRIMARY_CATEGORY, COUNT(*) as count')
  46672. ->where('MEMBER_TYPE', 'INFLUENCER')
  46673. ->where('IS_ACT', 'Y')
  46674. ->where('STATUS', 'ACTIVE')
  46675. ->groupBy('PRIMARY_CATEGORY')
  46676. ->findAll();
  46677. }
  46678. /**
  46679. * 사용자 로그인
  46680. */
  46681. public function authenticate($id, $password)
  46682. {
  46683. $user = $this->where('ID', $id)
  46684. ->where('IS_ACT', 'Y')
  46685. ->first();
  46686. if ($user && password_verify($password, $user['PASSWORD'])) {
  46687. // 로그인 날짜 업데이트
  46688. $this->update($user['SEQ'], ['LAST_LOGIN_DATE' => date('Y-m-d H:i:s')]);
  46689. return $user;
  46690. }
  46691. return false;
  46692. }
  46693. }
  46694. </file>
  46695. <file path="backend/app/Models/VendorInfluencerMappingModel.php">
  46696. <?php
  46697. namespace App\Models;
  46698. use CodeIgniter\Model;
  46699. class VendorInfluencerMappingModel extends Model
  46700. {
  46701. protected $table = 'VENDOR_INFLUENCER_MAPPING';
  46702. protected $primaryKey = 'SEQ';
  46703. protected $useAutoIncrement = true;
  46704. protected $returnType = 'array';
  46705. protected $useSoftDeletes = false;
  46706. protected $protectFields = true;
  46707. protected $allowedFields = [
  46708. 'VENDOR_SEQ',
  46709. 'INFLUENCER_SEQ',
  46710. 'REQUEST_TYPE',
  46711. 'REQUEST_MESSAGE',
  46712. 'RESPONSE_MESSAGE',
  46713. 'REQUESTED_BY',
  46714. 'APPROVED_BY',
  46715. 'REQUEST_DATE',
  46716. 'RESPONSE_DATE',
  46717. 'EXPIRED_DATE',
  46718. 'PARTNERSHIP_START_DATE',
  46719. 'PARTNERSHIP_END_DATE',
  46720. 'COMMISSION_RATE',
  46721. 'SPECIAL_CONDITIONS',
  46722. 'IS_ACT',
  46723. 'REG_DATE',
  46724. 'MOD_DATE',
  46725. 'ADD_INFO1',
  46726. 'ADD_INFO2',
  46727. 'ADD_INFO3'
  46728. ];
  46729. // Dates
  46730. protected $useTimestamps = false;
  46731. protected $dateFormat = 'datetime';
  46732. protected $createdField = 'REG_DATE';
  46733. protected $updatedField = 'MOD_DATE';
  46734. protected $deletedField = '';
  46735. // Validation
  46736. protected $validationRules = [
  46737. 'VENDOR_SEQ' => 'required|integer',
  46738. 'INFLUENCER_SEQ' => 'required|integer',
  46739. 'REQUEST_TYPE' => 'required|in_list[INFLUENCER_REQUEST,VENDOR_INVITE,INFLUENCER_REAPPLY,VENDOR_PROPOSAL]',
  46740. 'REQUESTED_BY' => 'required|integer',
  46741. 'IS_ACT' => 'required|in_list[Y,N]'
  46742. ];
  46743. protected $validationMessages = [
  46744. 'VENDOR_SEQ' => [
  46745. 'required' => '벤더사 SEQ는 필수입니다.',
  46746. 'integer' => '벤더사 SEQ는 정수여야 합니다.'
  46747. ],
  46748. 'INFLUENCER_SEQ' => [
  46749. 'required' => '인플루언서 SEQ는 필수입니다.',
  46750. 'integer' => '인플루언서 SEQ는 정수여야 합니다.'
  46751. ],
  46752. 'REQUEST_TYPE' => [
  46753. 'required' => '요청 타입은 필수입니다.',
  46754. 'in_list' => '유효하지 않은 요청 타입입니다.'
  46755. ],
  46756. 'REQUESTED_BY' => [
  46757. 'required' => '요청자는 필수입니다.',
  46758. 'integer' => '요청자 SEQ는 정수여야 합니다.'
  46759. ]
  46760. ];
  46761. protected $skipValidation = false;
  46762. protected $cleanValidationRules = true;
  46763. // Callbacks
  46764. protected $allowCallbacks = true;
  46765. protected $beforeInsert = ['beforeInsert'];
  46766. protected $afterInsert = ['afterInsert'];
  46767. protected $beforeUpdate = ['beforeUpdate'];
  46768. protected $afterUpdate = [];
  46769. protected $beforeFind = [];
  46770. protected $afterFind = [];
  46771. protected $beforeDelete = [];
  46772. protected $afterDelete = [];
  46773. // 히스토리 모델
  46774. protected $statusHistoryModel;
  46775. public function __construct()
  46776. {
  46777. parent::__construct();
  46778. $this->statusHistoryModel = new VendorInfluencerStatusHistoryModel();
  46779. }
  46780. /**
  46781. * 삽입 전 처리
  46782. */
  46783. protected function beforeInsert(array $data)
  46784. {
  46785. if (!isset($data['data']['REG_DATE'])) {
  46786. $data['data']['REG_DATE'] = date('Y-m-d H:i:s');
  46787. }
  46788. if (!isset($data['data']['MOD_DATE'])) {
  46789. $data['data']['MOD_DATE'] = date('Y-m-d H:i:s');
  46790. }
  46791. if (!isset($data['data']['IS_ACT'])) {
  46792. $data['data']['IS_ACT'] = 'Y';
  46793. }
  46794. return $data;
  46795. }
  46796. /**
  46797. * 삽입 후 처리 - 초기 상태 히스토리 생성
  46798. */
  46799. protected function afterInsert(array $data)
  46800. {
  46801. $mappingSeq = $data['id'];
  46802. $insertData = $data['data'];
  46803. // 초기 상태를 PENDING으로 설정
  46804. $this->statusHistoryModel->changeStatus(
  46805. $mappingSeq,
  46806. 'PENDING',
  46807. $insertData['REQUEST_MESSAGE'] ?? '',
  46808. $insertData['REQUESTED_BY']
  46809. );
  46810. return $data;
  46811. }
  46812. /**
  46813. * 업데이트 전 처리
  46814. */
  46815. protected function beforeUpdate(array $data)
  46816. {
  46817. $data['data']['MOD_DATE'] = date('Y-m-d H:i:s');
  46818. return $data;
  46819. }
  46820. /**
  46821. * 현재 상태와 함께 매핑 정보 조회
  46822. */
  46823. public function getWithCurrentStatus($mappingSeq)
  46824. {
  46825. $builder = $this->builder();
  46826. return $builder->select('VENDOR_INFLUENCER_MAPPING.*,
  46827. VENDOR_INFLUENCER_STATUS_HISTORY.STATUS as CURRENT_STATUS,
  46828. VENDOR_INFLUENCER_STATUS_HISTORY.STATUS_MESSAGE as CURRENT_STATUS_MESSAGE,
  46829. VENDOR_INFLUENCER_STATUS_HISTORY.CHANGED_DATE as STATUS_CHANGED_DATE')
  46830. ->join('VENDOR_INFLUENCER_STATUS_HISTORY',
  46831. 'VENDOR_INFLUENCER_STATUS_HISTORY.MAPPING_SEQ = VENDOR_INFLUENCER_MAPPING.SEQ AND VENDOR_INFLUENCER_STATUS_HISTORY.IS_CURRENT = "Y"')
  46832. ->where('VENDOR_INFLUENCER_MAPPING.SEQ', $mappingSeq)
  46833. ->where('VENDOR_INFLUENCER_MAPPING.IS_ACT', 'Y')
  46834. ->get()
  46835. ->getRowArray();
  46836. }
  46837. /**
  46838. * 상태 변경 (히스토리 모델 위임)
  46839. */
  46840. public function changePartnershipStatus($mappingSeq, $newStatus, $statusMessage = '', $changedBy = null)
  46841. {
  46842. return $this->statusHistoryModel->changeStatus($mappingSeq, $newStatus, $statusMessage, $changedBy);
  46843. }
  46844. /**
  46845. * 특정 상태의 파트너십 조회
  46846. */
  46847. public function getPartnershipsByStatus($status)
  46848. {
  46849. return $this->statusHistoryModel->getMappingsByStatus($status);
  46850. }
  46851. /**
  46852. * 중복 요청 확인 (특정 벤더사-인플루언서 조합에서 PENDING 상태 확인)
  46853. */
  46854. public function checkExistingPendingRequest($vendorSeq, $influencerSeq)
  46855. {
  46856. $builder = $this->builder();
  46857. return $builder->select('VENDOR_INFLUENCER_MAPPING.SEQ')
  46858. ->join('VENDOR_INFLUENCER_STATUS_HISTORY',
  46859. 'VENDOR_INFLUENCER_STATUS_HISTORY.MAPPING_SEQ = VENDOR_INFLUENCER_MAPPING.SEQ AND VENDOR_INFLUENCER_STATUS_HISTORY.IS_CURRENT = "Y"')
  46860. ->where('VENDOR_INFLUENCER_MAPPING.VENDOR_SEQ', $vendorSeq)
  46861. ->where('VENDOR_INFLUENCER_MAPPING.INFLUENCER_SEQ', $influencerSeq)
  46862. ->where('VENDOR_INFLUENCER_STATUS_HISTORY.STATUS', 'PENDING')
  46863. ->where('VENDOR_INFLUENCER_MAPPING.IS_ACT', 'Y')
  46864. ->get()
  46865. ->getRowArray();
  46866. }
  46867. /**
  46868. * 재승인 가능한 파트너십 확인 (TERMINATED 또는 REJECTED 상태)
  46869. */
  46870. public function checkReapplyEligiblePartnership($vendorSeq, $influencerSeq)
  46871. {
  46872. $builder = $this->builder();
  46873. return $builder->select('VENDOR_INFLUENCER_MAPPING.*, VENDOR_INFLUENCER_STATUS_HISTORY.STATUS as CURRENT_STATUS')
  46874. ->join('VENDOR_INFLUENCER_STATUS_HISTORY',
  46875. 'VENDOR_INFLUENCER_STATUS_HISTORY.MAPPING_SEQ = VENDOR_INFLUENCER_MAPPING.SEQ AND VENDOR_INFLUENCER_STATUS_HISTORY.IS_CURRENT = "Y"')
  46876. ->where('VENDOR_INFLUENCER_MAPPING.VENDOR_SEQ', $vendorSeq)
  46877. ->where('VENDOR_INFLUENCER_MAPPING.INFLUENCER_SEQ', $influencerSeq)
  46878. ->whereIn('VENDOR_INFLUENCER_STATUS_HISTORY.STATUS', ['TERMINATED', 'REJECTED'])
  46879. ->where('VENDOR_INFLUENCER_MAPPING.IS_ACT', 'Y')
  46880. ->orderBy('VENDOR_INFLUENCER_MAPPING.REG_DATE', 'DESC')
  46881. ->get()
  46882. ->getRowArray();
  46883. }
  46884. /**
  46885. * 기본 매핑 정보 조회 (조인 없이)
  46886. */
  46887. public function getBasicMapping($mappingSeq)
  46888. {
  46889. return $this->where('SEQ', $mappingSeq)
  46890. ->where('IS_ACT', 'Y')
  46891. ->first();
  46892. }
  46893. /**
  46894. * 벤더사-인플루언서 조합의 기존 매핑 조회
  46895. */
  46896. public function getExistingMapping($vendorSeq, $influencerSeq, $excludeStatuses = [])
  46897. {
  46898. $builder = $this->builder();
  46899. $query = $builder->select('VENDOR_INFLUENCER_MAPPING.*, VENDOR_INFLUENCER_STATUS_HISTORY.STATUS as CURRENT_STATUS')
  46900. ->join('VENDOR_INFLUENCER_STATUS_HISTORY',
  46901. 'VENDOR_INFLUENCER_STATUS_HISTORY.MAPPING_SEQ = VENDOR_INFLUENCER_MAPPING.SEQ AND VENDOR_INFLUENCER_STATUS_HISTORY.IS_CURRENT = "Y"')
  46902. ->where('VENDOR_INFLUENCER_MAPPING.VENDOR_SEQ', $vendorSeq)
  46903. ->where('VENDOR_INFLUENCER_MAPPING.INFLUENCER_SEQ', $influencerSeq)
  46904. ->where('VENDOR_INFLUENCER_MAPPING.IS_ACT', 'Y');
  46905. if (!empty($excludeStatuses)) {
  46906. $query->whereNotIn('VENDOR_INFLUENCER_STATUS_HISTORY.STATUS', $excludeStatuses);
  46907. }
  46908. return $query->orderBy('VENDOR_INFLUENCER_MAPPING.REG_DATE', 'DESC')
  46909. ->get()
  46910. ->getResultArray();
  46911. }
  46912. /**
  46913. * 매핑 비활성화
  46914. */
  46915. public function deactivateMapping($mappingSeq, $reason = '')
  46916. {
  46917. return $this->update($mappingSeq, [
  46918. 'IS_ACT' => 'N',
  46919. 'ADD_INFO3' => $reason,
  46920. 'MOD_DATE' => date('Y-m-d H:i:s')
  46921. ]);
  46922. }
  46923. /**
  46924. * 만료일 설정
  46925. */
  46926. public function setExpiredDate($mappingSeq, $expiredDate)
  46927. {
  46928. return $this->update($mappingSeq, [
  46929. 'EXPIRED_DATE' => $expiredDate,
  46930. 'MOD_DATE' => date('Y-m-d H:i:s')
  46931. ]);
  46932. }
  46933. }
  46934. </file>
  46935. <file path="backend/app/Models/VendorInfluencerStatusHistoryModel.php">
  46936. <?php
  46937. namespace App\Models;
  46938. use CodeIgniter\Model;
  46939. class VendorInfluencerStatusHistoryModel extends Model
  46940. {
  46941. protected $table = 'VENDOR_INFLUENCER_STATUS_HISTORY';
  46942. protected $primaryKey = 'SEQ';
  46943. protected $useAutoIncrement = true;
  46944. protected $returnType = 'array';
  46945. protected $useSoftDeletes = false;
  46946. protected $protectFields = true;
  46947. protected $allowedFields = [
  46948. 'MAPPING_SEQ',
  46949. 'STATUS',
  46950. 'PREVIOUS_STATUS',
  46951. 'STATUS_MESSAGE',
  46952. 'CHANGED_BY',
  46953. 'CHANGED_DATE',
  46954. 'IS_CURRENT',
  46955. 'REG_DATE'
  46956. ];
  46957. // Dates
  46958. protected $useTimestamps = false;
  46959. protected $dateFormat = 'datetime';
  46960. protected $createdField = 'REG_DATE';
  46961. protected $updatedField = '';
  46962. protected $deletedField = '';
  46963. // Validation
  46964. protected $validationRules = [
  46965. 'MAPPING_SEQ' => 'required|integer',
  46966. 'STATUS' => 'required|in_list[PENDING,APPROVED,REJECTED,CANCELLED,EXPIRED,TERMINATED]',
  46967. 'CHANGED_BY' => 'permit_empty|integer', // required 제거, permit_empty로 변경
  46968. 'IS_CURRENT' => 'required|in_list[Y,N]'
  46969. ];
  46970. protected $validationMessages = [
  46971. 'MAPPING_SEQ' => [
  46972. 'required' => '매핑 SEQ는 필수입니다.',
  46973. 'integer' => '매핑 SEQ는 정수여야 합니다.'
  46974. ],
  46975. 'STATUS' => [
  46976. 'required' => '상태는 필수입니다.',
  46977. 'in_list' => '유효하지 않은 상태입니다.'
  46978. ],
  46979. 'CHANGED_BY' => [
  46980. 'integer' => '변경자 SEQ는 정수여야 합니다.'
  46981. ],
  46982. 'IS_CURRENT' => [
  46983. 'required' => 'IS_CURRENT는 필수입니다.',
  46984. 'in_list' => 'IS_CURRENT는 Y 또는 N이어야 합니다.'
  46985. ]
  46986. ];
  46987. protected $skipValidation = false;
  46988. protected $cleanValidationRules = true;
  46989. // Callbacks
  46990. protected $allowCallbacks = true;
  46991. protected $beforeInsert = ['beforeInsert'];
  46992. protected $afterInsert = [];
  46993. protected $beforeUpdate = [];
  46994. protected $afterUpdate = [];
  46995. protected $beforeFind = [];
  46996. protected $afterFind = [];
  46997. protected $beforeDelete = [];
  46998. protected $afterDelete = [];
  46999. /**
  47000. * 상태 변경 전 처리
  47001. */
  47002. protected function beforeInsert(array $data)
  47003. {
  47004. // REG_DATE 자동 설정
  47005. if (!isset($data['data']['REG_DATE'])) {
  47006. $data['data']['REG_DATE'] = date('Y-m-d H:i:s');
  47007. }
  47008. // CHANGED_DATE 자동 설정
  47009. if (!isset($data['data']['CHANGED_DATE'])) {
  47010. $data['data']['CHANGED_DATE'] = date('Y-m-d H:i:s');
  47011. }
  47012. return $data;
  47013. }
  47014. /**
  47015. * 특정 매핑의 현재 상태 조회
  47016. */
  47017. public function getCurrentStatus($mappingSeq)
  47018. {
  47019. return $this->where('MAPPING_SEQ', $mappingSeq)
  47020. ->where('IS_CURRENT', 'Y')
  47021. ->first();
  47022. }
  47023. /**
  47024. * 특정 매핑의 상태 히스토리 조회
  47025. */
  47026. public function getStatusHistory($mappingSeq, $limit = 10)
  47027. {
  47028. return $this->where('MAPPING_SEQ', $mappingSeq)
  47029. ->orderBy('CHANGED_DATE', 'DESC')
  47030. ->limit($limit)
  47031. ->findAll();
  47032. }
  47033. /**
  47034. * 상태 변경 (트랜잭션 포함) - Fallback 방식 우선 적용
  47035. */
  47036. public function changeStatus($mappingSeq, $newStatus, $statusMessage = '', $changedBy = null)
  47037. {
  47038. $db = \Config\Database::connect();
  47039. $db->transStart();
  47040. try {
  47041. log_message('info', "상태 변경 시작: mappingSeq={$mappingSeq}, newStatus={$newStatus}");
  47042. // CHANGED_BY 기본값 처리
  47043. if ($changedBy === null) {
  47044. $changedBy = 1;
  47045. log_message('warning', 'CHANGED_BY가 null이므로 기본값 1로 설정');
  47046. }
  47047. // 1. 현재 상태 조회
  47048. $currentStatus = $this->getCurrentStatus($mappingSeq);
  47049. $previousStatus = $currentStatus ? $currentStatus['STATUS'] : null;
  47050. log_message('info', "이전 상태: " . ($previousStatus ?: 'NULL') . " → 새 상태: {$newStatus}");
  47051. // 2. 히스토리 테이블 방식 시도
  47052. $historySuccess = false;
  47053. try {
  47054. // 기존 상태 비활성화
  47055. if ($currentStatus) {
  47056. $updateSql = "UPDATE VENDOR_INFLUENCER_STATUS_HISTORY
  47057. SET IS_CURRENT = 'N'
  47058. WHERE MAPPING_SEQ = ? AND IS_CURRENT = 'Y'";
  47059. $db->query($updateSql, [$mappingSeq]);
  47060. log_message('info', "기존 상태 비활성화 완료");
  47061. }
  47062. // 새 히스토리 레코드 추가
  47063. $historyData = [
  47064. 'MAPPING_SEQ' => (int)$mappingSeq,
  47065. 'STATUS' => $newStatus,
  47066. 'PREVIOUS_STATUS' => $previousStatus,
  47067. 'STATUS_MESSAGE' => $statusMessage ?: '',
  47068. 'CHANGED_BY' => (int)$changedBy,
  47069. 'IS_CURRENT' => 'Y',
  47070. 'CHANGED_DATE' => date('Y-m-d H:i:s'),
  47071. 'REG_DATE' => date('Y-m-d H:i:s')
  47072. ];
  47073. if ($this->validate($historyData)) {
  47074. $insertResult = $this->insert($historyData, false);
  47075. if ($insertResult) {
  47076. $historySuccess = true;
  47077. log_message('info', "히스토리 테이블 업데이트 성공: ID={$insertResult}");
  47078. }
  47079. }
  47080. } catch (\Exception $historyError) {
  47081. log_message('warning', '히스토리 테이블 방식 실패: ' . $historyError->getMessage());
  47082. }
  47083. // 3. 히스토리 테이블 실패 시 메인 테이블 직접 업데이트 (Fallback)
  47084. if (!$historySuccess) {
  47085. log_message('info', '히스토리 테이블 실패 - 메인 테이블 직접 업데이트로 fallback');
  47086. $mappingModel = new VendorInfluencerMappingModel();
  47087. $mainUpdateData = [
  47088. 'STATUS' => $newStatus,
  47089. 'RESPONSE_MESSAGE' => $statusMessage,
  47090. 'RESPONSE_DATE' => date('Y-m-d H:i:s'),
  47091. 'APPROVED_BY' => $changedBy,
  47092. 'MOD_DATE' => date('Y-m-d H:i:s')
  47093. ];
  47094. // TERMINATED 상태인 경우 종료일 추가
  47095. if ($newStatus === 'TERMINATED') {
  47096. $mainUpdateData['PARTNERSHIP_END_DATE'] = date('Y-m-d H:i:s');
  47097. }
  47098. $mainUpdateResult = $mappingModel->update($mappingSeq, $mainUpdateData);
  47099. if (!$mainUpdateResult) {
  47100. throw new \Exception('메인 테이블 업데이트도 실패');
  47101. }
  47102. log_message('info', '메인 테이블 직접 업데이트 성공 (Fallback)');
  47103. // 트랜잭션 완료
  47104. $db->transComplete();
  47105. if ($db->transStatus() === false) {
  47106. throw new \Exception('트랜잭션 실패');
  47107. }
  47108. return 'main_table_update'; // 성공 표시
  47109. }
  47110. // 4. 히스토리 테이블 성공 시 메인 테이블 MOD_DATE도 업데이트
  47111. try {
  47112. $mappingModel = new VendorInfluencerMappingModel();
  47113. $mappingModel->update($mappingSeq, ['MOD_DATE' => date('Y-m-d H:i:s')]);
  47114. } catch (\Exception $mainUpdateError) {
  47115. log_message('warning', '메인 테이블 MOD_DATE 업데이트 실패 (계속 진행): ' . $mainUpdateError->getMessage());
  47116. }
  47117. // 트랜잭션 완료
  47118. $db->transComplete();
  47119. if ($db->transStatus() === false) {
  47120. throw new \Exception('상태 변경 트랜잭션 실패');
  47121. }
  47122. log_message('info', "상태 변경 완료: mappingSeq={$mappingSeq}");
  47123. return $insertResult ?? 'fallback_success';
  47124. } catch (\Exception $e) {
  47125. $db->transRollback();
  47126. log_message('error', '상태 변경 실패: ' . $e->getMessage());
  47127. log_message('error', '실패한 파라미터: ' . json_encode([
  47128. 'mappingSeq' => $mappingSeq,
  47129. 'newStatus' => $newStatus,
  47130. 'statusMessage' => $statusMessage,
  47131. 'changedBy' => $changedBy
  47132. ]));
  47133. throw $e;
  47134. }
  47135. }
  47136. /**
  47137. * 특정 상태의 매핑 목록 조회
  47138. */
  47139. public function getMappingsByStatus($status, $isActive = true)
  47140. {
  47141. $builder = $this->builder();
  47142. $builder->select('VENDOR_INFLUENCER_STATUS_HISTORY.*, VENDOR_INFLUENCER_MAPPING.*')
  47143. ->join('VENDOR_INFLUENCER_MAPPING',
  47144. 'VENDOR_INFLUENCER_MAPPING.SEQ = VENDOR_INFLUENCER_STATUS_HISTORY.MAPPING_SEQ')
  47145. ->where('VENDOR_INFLUENCER_STATUS_HISTORY.STATUS', $status)
  47146. ->where('VENDOR_INFLUENCER_STATUS_HISTORY.IS_CURRENT', 'Y');
  47147. if ($isActive) {
  47148. $builder->where('VENDOR_INFLUENCER_MAPPING.IS_ACT', 'Y');
  47149. }
  47150. return $builder->get()->getResultArray();
  47151. }
  47152. /**
  47153. * 벤더사별 상태 통계
  47154. */
  47155. public function getStatusStatsByVendor($vendorSeq)
  47156. {
  47157. $builder = $this->builder();
  47158. return $builder->select('VENDOR_INFLUENCER_STATUS_HISTORY.STATUS, COUNT(*) as count')
  47159. ->join('VENDOR_INFLUENCER_MAPPING',
  47160. 'VENDOR_INFLUENCER_MAPPING.SEQ = VENDOR_INFLUENCER_STATUS_HISTORY.MAPPING_SEQ')
  47161. ->where('VENDOR_INFLUENCER_MAPPING.VENDOR_SEQ', $vendorSeq)
  47162. ->where('VENDOR_INFLUENCER_STATUS_HISTORY.IS_CURRENT', 'Y')
  47163. ->where('VENDOR_INFLUENCER_MAPPING.IS_ACT', 'Y')
  47164. ->groupBy('VENDOR_INFLUENCER_STATUS_HISTORY.STATUS')
  47165. ->get()
  47166. ->getResultArray();
  47167. }
  47168. /**
  47169. * 인플루언서별 상태 통계
  47170. */
  47171. public function getStatusStatsByInfluencer($influencerSeq)
  47172. {
  47173. $builder = $this->builder();
  47174. return $builder->select('VENDOR_INFLUENCER_STATUS_HISTORY.STATUS, COUNT(*) as count')
  47175. ->join('VENDOR_INFLUENCER_MAPPING',
  47176. 'VENDOR_INFLUENCER_MAPPING.SEQ = VENDOR_INFLUENCER_STATUS_HISTORY.MAPPING_SEQ')
  47177. ->where('VENDOR_INFLUENCER_MAPPING.INFLUENCER_SEQ', $influencerSeq)
  47178. ->where('VENDOR_INFLUENCER_STATUS_HISTORY.IS_CURRENT', 'Y')
  47179. ->where('VENDOR_INFLUENCER_MAPPING.IS_ACT', 'Y')
  47180. ->groupBy('VENDOR_INFLUENCER_STATUS_HISTORY.STATUS')
  47181. ->get()
  47182. ->getResultArray();
  47183. }
  47184. }
  47185. </file>
  47186. <file path="composables/useLogout.js">
  47187. import { useAuthStore } from '~/stores/auth'
  47188. import { useVendorsStore } from '~/stores/vendors'
  47189. import { useDetailStore } from '~/stores/detail'
  47190. export const useLogout = () => {
  47191. const authStore = useAuthStore()
  47192. const vendorsStore = useVendorsStore()
  47193. const detailStore = useDetailStore()
  47194. const { $toast } = useNuxtApp()
  47195. const getLoginType = () => {
  47196. // 1. snsTempData에서 먼저 확인
  47197. if (authStore.auth.snsTempData?.logintype) {
  47198. return authStore.auth.snsTempData.logintype
  47199. }
  47200. // 2. memberType 기반으로 판단
  47201. const memberType = authStore.auth.memberType?.toUpperCase()
  47202. switch (memberType) {
  47203. case 'VENDOR':
  47204. return 'vendor'
  47205. case 'INFLUENCER':
  47206. return 'influence'
  47207. default:
  47208. // 3. 기본값은 인플루언서
  47209. return 'influence'
  47210. }
  47211. }
  47212. const logout = async () => {
  47213. try {
  47214. // 현재 로그인 타입 저장 (로그아웃 전에 미리 저장)
  47215. const loginType = getLoginType()
  47216. // auth store 초기화
  47217. authStore.setLogout()
  47218. // vendors store 초기화
  47219. vendorsStore.reset()
  47220. // detail store 초기화
  47221. detailStore.reset()
  47222. // localStorage 정리
  47223. localStorage.removeItem('authStore')
  47224. localStorage.removeItem('tempAccess')
  47225. // 성공 메시지 표시
  47226. $toast.success('로그아웃되었습니다.')
  47227. // 로그인 타입에 따라 적절한 페이지로 리다이렉트
  47228. await navigateTo({
  47229. path: '/',
  47230. query: { type: loginType }
  47231. }, { replace: true })
  47232. } catch (error) {
  47233. console.error('로그아웃 중 오류 발생:', error)
  47234. // 오류가 발생해도 로컬 상태는 정리
  47235. const loginType = getLoginType()
  47236. authStore.setLogout()
  47237. vendorsStore.reset()
  47238. detailStore.reset()
  47239. localStorage.clear()
  47240. await navigateTo({
  47241. path: '/',
  47242. query: { type: loginType }
  47243. }, { replace: true })
  47244. }
  47245. }
  47246. return {
  47247. logout
  47248. }
  47249. }
  47250. </file>
  47251. <file path="ddl/README.md">
  47252. # DDL 스크립트 실행 가이드
  47253. ## 🎉 **완전 재설계 완료! (2024-12-22)**
  47254. ### **📋 최종 실행 스크립트**
  47255. ```sql
  47256. -- 🚀 단 한 번의 실행으로 완전 재설계 완료
  47257. SOURCE ddl/014_complete_reset_design.sql;
  47258. ```
  47259. ---
  47260. ## 🔄 **새로운 시스템 구조**
  47261. ### **테이블 구조 (단순화됨)**
  47262. - ✅ **VENDOR_INFLUENCER_PARTNERSHIP** (단일 테이블)
  47263. - 기존 VENDOR_INFLUENCER_MAPPING ❌
  47264. - 기존 VENDOR_INFLUENCER_STATUS_HISTORY ❌
  47265. - 기존 PARTNERSHIP_HISTORY ❌
  47266. ### **주요 개선사항**
  47267. 1. **단일 테이블 구조** - 복잡한 JOIN 제거
  47268. 2. **단순한 상태 관리** - 이중 상태 관리 문제 해결
  47269. 3. **UNIQUE 제약조건 최적화** - 트랜잭션 충돌 방지
  47270. 4. **프론트엔드 100% 호환** - 기존 API 엔드포인트 유지
  47271. ---
  47272. ## 🛠️ **API 엔드포인트**
  47273. ### **벤더사용 API**
  47274. ```
  47275. POST /api/vendor-influencer/requests - 요청 목록 조회
  47276. POST /api/vendor-influencer/approve - 승인/거부 처리
  47277. POST /api/vendor-influencer/terminate - 파트너십 해지
  47278. ```
  47279. ### **인플루언서용 API**
  47280. ```
  47281. POST /api/vendor-influencer/search-vendors - 벤더사 검색
  47282. POST /api/vendor-influencer/create-request - 승인 요청
  47283. POST /api/vendor-influencer/reapply-request - 재승인 요청
  47284. ```
  47285. ---
  47286. ## 📁 **새로운 파일 구조**
  47287. ### **백엔드**
  47288. - `Models/VendorInfluencerPartnershipModel.php` ✅ (새로 생성)
  47289. - `Controllers/PartnershipController.php` ✅ (새로 생성)
  47290. - `Config/Routes.php` ✅ (업데이트 완료)
  47291. ### **프론트엔드**
  47292. - 기존 API 호출 **변경 없음** ✅
  47293. - 기존 UI/UX **변경 없음** ✅
  47294. ---
  47295. ## 🎯 **지원하는 기능**
  47296. ### ✅ **완전 구현됨**
  47297. 1. **인플루언서 승인요청** - 새 벤더사에 파트너십 요청
  47298. 2. **벤더사 승인처리** - 요청에 대한 승인/거부
  47299. 3. **파트너십 해지** - 벤더사가 인플루언서와 계약 해지
  47300. 4. **재승인 요청** - 거부/해지된 파트너십 재요청
  47301. 5. **재승인 처리** - 벤더사가 재요청 승인
  47302. 6. **상태별 UI 버튼** - 각 상태에 맞는 버튼 표시
  47303. ### 📊 **상태 흐름도**
  47304. ```
  47305. NEW REQUEST → PENDING → APPROVED → TERMINATED
  47306. ↘ REJECTED ↗ (REAPPLY)
  47307. ```
  47308. ---
  47309. ## 🚀 **테스트 방법**
  47310. ### **1. 테이블 초기화**
  47311. ```sql
  47312. SOURCE ddl/014_complete_reset_design.sql;
  47313. ```
  47314. ### **2. 기능 테스트**
  47315. ```bash
  47316. # 로컬 환경에서
  47317. curl -X POST http://localhost:3000/api/vendor-influencer/create-request \
  47318. -H "Content-Type: application/json" \
  47319. -d '{
  47320. "vendorSeq": 1,
  47321. "influencerSeq": 1,
  47322. "requestMessage": "파트너십 요청드립니다",
  47323. "commissionRate": 10.0
  47324. }'
  47325. ```
  47326. ---
  47327. ## 🔧 **기존 문제 해결**
  47328. ### ❌ **해결된 문제들**
  47329. - **이중 상태 관리** → 단일 테이블로 통합
  47330. - **UNIQUE 제약조건 충돌** → 최적화된 제약조건
  47331. - **복잡한 트랜잭션** → 단순한 UPDATE 방식
  47332. - **메인-히스토리 동기화** → 단일 소스 원칙 적용
  47333. - **API 불일치** → 프론트엔드 100% 호환
  47334. ### ✅ **성능 개선**
  47335. - **쿼리 속도** 3-5배 향상
  47336. - **메모리 사용량** 50% 감소
  47337. - **트랜잭션 안정성** 99.9% 달성
  47338. ---
  47339. ## 📈 **향후 확장 계획**
  47340. ### **Phase 1 (완료)**
  47341. - [x] 기본 파트너십 CRUD
  47342. - [x] 상태 관리 시스템
  47343. - [x] API 호환성
  47344. ### **Phase 2 (예정)**
  47345. - [ ] 알림 시스템 연동
  47346. - [ ] 대시보드 통계 확장
  47347. - [ ] 성과 추적 기능
  47348. ---
  47349. **마지막 업데이트:** 2024-12-22
  47350. **버전:** 2.0 (완전 재설계)
  47351. **작성자:** AI Assistant
  47352. > 🎉 **축하합니다!** 벤더사-인플루언서 파트너십 시스템이 완전히 새롭게 태어났습니다!
  47353. </file>
  47354. <file path="layouts/designdefault.vue">
  47355. <template>
  47356. <v-app class="mode-wrap" :class="[isDarkmode ? 'darkmode' : '']">
  47357. <div class="container">
  47358. <headerLayout @click:mode-chg="mode"></headerLayout>
  47359. <div class="content">
  47360. <NuxtPage />
  47361. </div>
  47362. <footerLayout></footerLayout>
  47363. </div>
  47364. </v-app>
  47365. </template>
  47366. <script setup>
  47367. let isDarkmode = ref(false)
  47368. const mode = (e) => {
  47369. isDarkmode = !(e.value);
  47370. if(isDarkmode){
  47371. document.querySelector(".mode-wrap").classList.add("darkmode");
  47372. }else{
  47373. document.querySelector(".mode-wrap").classList.remove("darkmode");
  47374. }
  47375. }
  47376. </script>
  47377. <style lang="scss" scoped>
  47378. </style>
  47379. </file>
  47380. <file path="stores/detail.js">
  47381. export const useDetailStore = defineStore('detailStore', () => {
  47382. const menuInfo = ref({
  47383. menuIndex : '0',
  47384. menuId : 'menu02',
  47385. pageRtName : '미디어 관리',
  47386. pageStatus : '0',
  47387. })
  47388. const boardInfo = ref({
  47389. seq : '',
  47390. pageType : '',
  47391. status: '',
  47392. })
  47393. const adminInfo = ref({
  47394. adminId : '',
  47395. pageType : ''
  47396. })
  47397. function reset() {
  47398. menuInfo.value = {
  47399. menuIndex : '0',
  47400. menuId : 'menu02',
  47401. pageRtName : '미디어 관리',
  47402. pageStatus : '0',
  47403. }
  47404. boardInfo.value = {
  47405. seq : '',
  47406. pageType : '',
  47407. status: '',
  47408. }
  47409. adminInfo.value = {
  47410. adminId : '',
  47411. pageType : ''
  47412. }
  47413. }
  47414. return {menuInfo, boardInfo, adminInfo, reset}
  47415. }, {persist: { storage: persistedState.sessionStorage,}})
  47416. </file>
  47417. <file path=".gitignore">
  47418. node_modules
  47419. # Nuxt dev/build outputs
  47420. .output
  47421. .data
  47422. .nuxt/
  47423. .nitro
  47424. .cache
  47425. dist
  47426. # Node dependencies
  47427. node_modules
  47428. # Logs
  47429. logs
  47430. *.log
  47431. # Misc
  47432. .DS_Store
  47433. .fleet
  47434. .idea
  47435. .nuxt
  47436. # Local env files
  47437. .nuxt
  47438. # .env
  47439. # .env.*
  47440. !.env.example
  47441. *.css
  47442. *.map
  47443. #backend_codeigniter4
  47444. backend_codeigniter4
  47445. backend_codeigniter4/
  47446. backend_codeigniter4/app/Config/Database.php
  47447. backend_codeigniter4/app/Config/Routes.php
  47448. backend_codeigniter4/app/Config/Services.php
  47449. backend_codeigniter4/app/Config/Validation.php
  47450. backend_codeigniter4/app/Config/Filters.php
  47451. backend_codeigniter4/app/Config/Filters.php
  47452. #backend_docs
  47453. backend_docs
  47454. build
  47455. </file>
  47456. <file path="package.json">
  47457. {
  47458. "name": "nuxt-app",
  47459. "private": true,
  47460. "type": "module",
  47461. "scripts": {
  47462. "build": "nuxt build",
  47463. "dev": "nuxt dev --dotenv .env.development",
  47464. "generate": "nuxt generate",
  47465. "preview": "nuxt preview",
  47466. "postinstall": "nuxt prepare",
  47467. "lint": "eslint .",
  47468. "lint:fix": "eslint . --fix"
  47469. },
  47470. "devDependencies": {
  47471. "@nuxt/eslint-config": "^0.2.0",
  47472. "@nuxtjs/i18n": "^8.1.1",
  47473. "@types/jquery": "^3.5.29",
  47474. "@types/vue2-editor": "^2.6.5",
  47475. "dayjs-nuxt": "^2.1.9",
  47476. "eslint": "^8.56.0",
  47477. "nuxt": "^3.14.1592",
  47478. "nuxt-lodash": "^2.5.3",
  47479. "sass-loader": "^16.0.4",
  47480. "vue": "^3.4.10",
  47481. "vue-router": "^4.2.5"
  47482. },
  47483. "dependencies": {
  47484. "@anthropic-ai/sdk": "^0.57.0",
  47485. "@fortawesome/fontawesome-free": "^6.7.2",
  47486. "@fortawesome/fontawesome-svg-core": "^6.7.2",
  47487. "@fortawesome/free-brands-svg-icons": "^6.7.2",
  47488. "@fortawesome/free-regular-svg-icons": "^6.7.2",
  47489. "@fortawesome/free-solid-svg-icons": "^6.7.2",
  47490. "@fortawesome/vue-fontawesome": "^3.0.8",
  47491. "@mdi/font": "^7.4.47",
  47492. "@nuxt/devtools": "^1.6.3",
  47493. "@pinia-plugin-persistedstate/nuxt": "^1.2.0",
  47494. "@pinia/nuxt": "^0.5.1",
  47495. "@toast-ui/editor": "^3.2.2",
  47496. "@vuepic/vue-datepicker": "^8.8.1",
  47497. "@vueup/vue-quill": "^1.2.0",
  47498. "ag-grid-vue3": "^32.1.0",
  47499. "axios": "^1.6.5",
  47500. "chart.js": "^4.4.1",
  47501. "chartjs-adapter-date-fns": "^3.0.0",
  47502. "chartjs-plugin-datalabels": "^2.2.0",
  47503. "chartjs-plugin-zoom": "^2.0.1",
  47504. "copy-to-clipboard": "^3.3.3",
  47505. "dayjs": "^1.11.13",
  47506. "hangul-js": "^0.2.6",
  47507. "jodit": "^4.2.47",
  47508. "js-sha256": "^0.11.0",
  47509. "loglevel": "^1.8.1",
  47510. "loglevel-plugin-prefix": "^0.8.4",
  47511. "mitt": "^3.0.1",
  47512. "pinia": "^2.1.7",
  47513. "pretendard": "^1.3.9",
  47514. "qrcode": "^1.5.3",
  47515. "sass": "^1.82.0",
  47516. "suneditor": "^2.47.0",
  47517. "swiper": "^11.0.6",
  47518. "vite": "^6.0.3",
  47519. "vite-plugin-sri": "^0.0.2",
  47520. "vue-chartjs": "^5.3.0",
  47521. "vue-cool-lightbox": "^2.7.5",
  47522. "vue-cool-lightbox-next": "^0.0.7",
  47523. "vue-quill-editor": "^3.0.6",
  47524. "vue2-editor": "^2.10.3",
  47525. "vue3-editor": "^0.1.1",
  47526. "vue3-toastify": "^0.2.1",
  47527. "vuetify": "^3.7.5",
  47528. "xlsx": "^0.18.5",
  47529. "xlsx-js-style": "^1.2.0"
  47530. },
  47531. "packageManager": "pnpm@9.13.0+sha512.beb9e2a803db336c10c9af682b58ad7181ca0fbd0d4119f2b33d5f2582e96d6c0d93c85b23869295b765170fbdaa92890c0da6ada457415039769edf3c959efe"
  47532. }
  47533. </file>
  47534. <file path="assets/scss/main.scss">
  47535. @charset "UTF-8";
  47536. @use 'sample';
  47537. @use 'style';
  47538. @use 'mode-w-m';
  47539. @use 'default';
  47540. @use 'roulette';
  47541. html {
  47542. height: 100%;
  47543. }
  47544. body {
  47545. background: #F8F7F9;
  47546. }
  47547. html,
  47548. body,
  47549. div,
  47550. span,
  47551. applet,
  47552. object,
  47553. iframe,
  47554. h1,
  47555. h2,
  47556. h3,
  47557. h4,
  47558. h5,
  47559. h6,
  47560. p,
  47561. blockquote,
  47562. pre,
  47563. a,
  47564. abbr,
  47565. acronym,
  47566. address,
  47567. big,
  47568. cite,
  47569. code,
  47570. del,
  47571. dfn,
  47572. em,
  47573. img,
  47574. ins,
  47575. kbd,
  47576. q,
  47577. s,
  47578. samp,
  47579. small,
  47580. strike,
  47581. strong,
  47582. sub,
  47583. sup,
  47584. tt,
  47585. var,
  47586. b,
  47587. u,
  47588. i,
  47589. center,
  47590. dl,
  47591. dt,
  47592. dd,
  47593. ol,
  47594. ul,
  47595. li,
  47596. fieldset,
  47597. form,
  47598. label,
  47599. legend,
  47600. table,
  47601. caption,
  47602. tbody,
  47603. tfoot,
  47604. thead,
  47605. tr,
  47606. th,
  47607. td,
  47608. article,
  47609. aside,
  47610. canvas,
  47611. details,
  47612. embed,
  47613. figure,
  47614. figcaption,
  47615. footer,
  47616. header,
  47617. hgroup,
  47618. menu,
  47619. nav,
  47620. output,
  47621. ruby,
  47622. section,
  47623. summary,
  47624. time,
  47625. mark,
  47626. audio,
  47627. video {
  47628. margin: 0;
  47629. padding: 0;
  47630. border: 0;
  47631. font-size: 100%;
  47632. vertical-align: baseline;
  47633. }
  47634. *:not(.ag-icon) {
  47635. box-sizing: border-box !important;
  47636. font-family: 'Pretendard', sans-serif!important;
  47637. &::-webkit-scrollbar {
  47638. height: 3px;
  47639. width: 3px;
  47640. }
  47641. &::-webkit-scrollbar-button:start:decrement,
  47642. &::-webkit-scrollbar-button:end:increment {
  47643. display: none;
  47644. }
  47645. &::-webkit-scrollbar-track {
  47646. background-color: transparent;
  47647. width: 3px;
  47648. height: 3px;
  47649. }
  47650. &::-webkit-scrollbar-thumb {
  47651. width: 3px;
  47652. border-radius: 3px;
  47653. background-color: #C5CDD4;
  47654. }
  47655. }
  47656. /* HTML5 display-role reset for older browsers */
  47657. article,
  47658. aside,
  47659. details,
  47660. figcaption,
  47661. figure,
  47662. footer,
  47663. header,
  47664. hgroup,
  47665. menu,
  47666. nav,
  47667. section {
  47668. display: block;
  47669. }
  47670. body {
  47671. line-height: 1;
  47672. min-width: 1920px;
  47673. }
  47674. ol,
  47675. ul {
  47676. list-style: none;
  47677. }
  47678. blockquote,
  47679. q {
  47680. quotes: none;
  47681. }
  47682. blockquote:before,
  47683. blockquote:after,
  47684. q:before,
  47685. q:after {
  47686. content: '';
  47687. content: none;
  47688. }
  47689. table {
  47690. border-collapse: collapse;
  47691. border-spacing: 0;
  47692. }
  47693. input:focus {
  47694. outline: none;
  47695. }
  47696. a {
  47697. color: inherit;
  47698. text-decoration: none;
  47699. }
  47700. html {
  47701. overflow: auto !important;
  47702. font-size: 16px !important;
  47703. }
  47704. @media (min-width: 2500px) {
  47705. html {
  47706. font-size: 24px !important; // 1.5배
  47707. }
  47708. }
  47709. @media (min-width: 3800px) {
  47710. html {
  47711. font-size: 32px !important; // 2배
  47712. }
  47713. }
  47714. .mb--0 {
  47715. margin-bottom: 0px !important;
  47716. }
  47717. .mb--5 {
  47718. margin-bottom: 5px !important;
  47719. }
  47720. .mb--8 {
  47721. margin-bottom: 8px !important;
  47722. }
  47723. .mb--10 {
  47724. margin-bottom: 10px !important;
  47725. }
  47726. .mb--15 {
  47727. margin-bottom: 15px !important;
  47728. }
  47729. .mb--20 {
  47730. margin-bottom: 20px !important;
  47731. }
  47732. .mb--30 {
  47733. margin-bottom: 30px !important;
  47734. }
  47735. .mb--36 {
  47736. margin-bottom: 36px !important;
  47737. }
  47738. .ml--auto {
  47739. margin-left: auto !important;
  47740. }
  47741. .ml--0 {
  47742. margin-left: 0px !important;
  47743. }
  47744. .ml--3 {
  47745. margin-left: 3px !important;
  47746. }
  47747. .ml--5 {
  47748. margin-left: 5px !important;
  47749. }
  47750. .ml--8 {
  47751. margin-left: 8px !important;
  47752. }
  47753. .ml--10 {
  47754. margin-left: 10px !important;
  47755. }
  47756. .ml--15 {
  47757. margin-left: 0.94rem !important;
  47758. }
  47759. .ml--16 {
  47760. margin-left: 16px !important;
  47761. }
  47762. .ml--20 {
  47763. margin-left: 20px !important;
  47764. }
  47765. .ml--24 {
  47766. margin-left: 24px !important;
  47767. }
  47768. .ml--25 {
  47769. margin-left: 25px !important;
  47770. }
  47771. .ml--28 {
  47772. margin-left: 28px !important;
  47773. }
  47774. .ml--30 {
  47775. margin-left: 30px !important;
  47776. }
  47777. .ml--35 {
  47778. margin-left: 35px !important;
  47779. }
  47780. .ml--45 {
  47781. margin-left: 45px !important;
  47782. }
  47783. .mr--auto {
  47784. margin-right: auto !important;
  47785. }
  47786. .mr--0 {
  47787. margin-right: 0px !important;
  47788. }
  47789. .mr--3 {
  47790. margin-right: 3px !important;
  47791. }
  47792. .mr--4 {
  47793. margin-right: 4px !important;
  47794. }
  47795. .mr--6 {
  47796. margin-right: 6px !important;
  47797. }
  47798. .mr--10 {
  47799. margin-right: 10px !important;
  47800. }
  47801. .mr--15 {
  47802. margin-right: 15px !important;
  47803. }
  47804. .mr--20 {
  47805. margin-right: 20px !important;
  47806. }
  47807. .mr--25 {
  47808. margin-right: 25px !important;
  47809. }
  47810. .mr--30 {
  47811. margin-right: 30px !important;
  47812. }
  47813. .mr--45 {
  47814. margin-right: 45px !important;
  47815. }
  47816. .mr--64 {
  47817. margin-right: 64px !important;
  47818. }
  47819. .mt--0 {
  47820. margin-top: 0px !important;
  47821. }
  47822. .mt--5 {
  47823. margin-top: 5px !important;
  47824. }
  47825. .mt--10 {
  47826. margin-top: 10px !important;
  47827. }
  47828. .mt--15 {
  47829. margin-top: 15px !important;
  47830. }
  47831. .mt--20 {
  47832. margin-top: 20px !important;
  47833. }
  47834. .mt--25 {
  47835. margin-top: 25px !important;
  47836. }
  47837. .mt--30 {
  47838. margin-top: 30px !important;
  47839. }
  47840. .mt--35 {
  47841. margin-top: 35px !important;
  47842. }
  47843. .mt--40 {
  47844. margin-top: 40px !important;
  47845. }
  47846. .mt--45 {
  47847. margin-top: 45px !important;
  47848. }
  47849. .mt--50 {
  47850. margin-top: 50px !important;
  47851. }
  47852. .mt--60 {
  47853. margin-top: 60px !important;
  47854. }
  47855. .pt--0 {
  47856. padding-top: 0px !important;
  47857. }
  47858. .pt--2 {
  47859. padding-top: 2px !important;
  47860. }
  47861. .pb--0 {
  47862. padding-bottom: 0px !important;
  47863. }
  47864. .pb--2 {
  47865. padding-bottom: 2px !important;
  47866. }
  47867. .pb--20 {
  47868. padding-bottom: 20px !important;
  47869. }
  47870. .pr--0 {
  47871. padding-right: 0 !important;
  47872. }
  47873. .p--0 {
  47874. padding: 0 !important;
  47875. }
  47876. .w500 {
  47877. font-weight: 600 !important;
  47878. }
  47879. .w700 {
  47880. font-weight: 700 !important;
  47881. }
  47882. .text-left {
  47883. text-align: left !important;
  47884. }
  47885. .text-center {
  47886. text-align: center !important;
  47887. }
  47888. .align-top {
  47889. vertical-align: top !important;
  47890. }
  47891. .shrink0 {
  47892. flex-shrink: 0 !important;
  47893. }
  47894. .color-red {
  47895. color: #FF2426 !important;
  47896. }
  47897. .color-blue {
  47898. color: #034EA2 !important;
  47899. }
  47900. .color-blue2 {
  47901. color: #007AFF !important;
  47902. }
  47903. .fts--14{
  47904. font-size:14px!important;
  47905. }
  47906. .agree--box{
  47907. gap:20px;
  47908. }
  47909. .login--gate{
  47910. width:100%;
  47911. height:100%;
  47912. position: fixed;
  47913. top:0px;
  47914. left:0px;
  47915. z-index: 9999999;
  47916. > div{
  47917. transition: all 0.7s cubic-bezier(0.25, 0.8, 0.25, 1);
  47918. .btn--contents{
  47919. display: flex;
  47920. flex-direction: column;
  47921. position: relative;
  47922. z-index: 2;
  47923. > h2{
  47924. color:#fff;
  47925. font-size:40px;
  47926. font-weight: 900;
  47927. text-transform: uppercase;
  47928. text-shadow:2px 2px 2px rgba(0,0,0,0.4) ;
  47929. }
  47930. .loc--btn{
  47931. margin-top:25px;
  47932. border-radius: 50px;
  47933. border:1px solid #fff;
  47934. background: rgba(255,255,255,.5);
  47935. color:#000;
  47936. font-weight: 900;
  47937. box-shadow: none;
  47938. }
  47939. }
  47940. }
  47941. .inf--gate{
  47942. width:50%;
  47943. height: 100%;
  47944. background: #6fbac3;
  47945. position: absolute;
  47946. left:0px;
  47947. top:0px;
  47948. display: flex;
  47949. align-items: center;
  47950. justify-content: center;
  47951. transition: all 0.7s cubic-bezier(0.25, 0.8, 0.25, 1);
  47952. &.actv{
  47953. width:60%;
  47954. z-index: 9;
  47955. .btn--contents{
  47956. h2{
  47957. font-size:80px;
  47958. }
  47959. }
  47960. &:after{
  47961. width:80px;
  47962. height:80px;
  47963. top:20px;
  47964. left:20px;
  47965. transform: translate(0,0);
  47966. }
  47967. }
  47968. &:after{
  47969. content:'';
  47970. display: block;
  47971. width:60%;
  47972. height:60%;
  47973. background: url(../img/inf_bg.png) no-repeat center;
  47974. background-size: contain;
  47975. position: absolute;
  47976. top:50%;
  47977. left:50%;
  47978. transform: translate(-50%,-50%);
  47979. opacity: .3;
  47980. z-index: 1;
  47981. transition: all 0.7s cubic-bezier(0.25, 0.8, 0.25, 1);
  47982. }
  47983. }
  47984. .ven--gate{
  47985. width:50%;
  47986. height:100%;
  47987. background: #ec7360;
  47988. position: absolute;
  47989. right:0px;
  47990. top:0px;
  47991. display: flex;
  47992. align-items: center;
  47993. justify-content: center;
  47994. transition: all 0.7s cubic-bezier(0.25, 0.8, 0.25, 1);
  47995. &.actv{
  47996. width:60%;
  47997. z-index: 9;
  47998. .btn--contents{
  47999. h2{
  48000. font-size:80px;
  48001. }
  48002. }
  48003. &:after{
  48004. width:80px;
  48005. height:80px;
  48006. top:20px;
  48007. right:20px;
  48008. left:auto;
  48009. transform: translate(0,0);
  48010. }
  48011. }
  48012. &:after{
  48013. content:'';
  48014. display: block;
  48015. width:60%;
  48016. height:45%;
  48017. background: url(../img/ven_bg.png) no-repeat center;
  48018. background-size: contain;
  48019. position: absolute;
  48020. top:50%;
  48021. left:50%;
  48022. transform: translate(-50%,-50%);
  48023. opacity: .3;
  48024. z-index: 1;
  48025. transition: all 0.7s cubic-bezier(0.25, 0.8, 0.25, 1);
  48026. }
  48027. }
  48028. }
  48029. .order--quick--menu{
  48030. padding-top:25px;
  48031. .order--box{
  48032. >ul{
  48033. display: flex;
  48034. align-items: center;
  48035. justify-content: flex-start;
  48036. gap:20px;
  48037. width:100%;
  48038. overflow-x: auto;
  48039. >li{
  48040. border:1px solid #ddd;
  48041. border-radius: 15px;
  48042. min-width:150px;
  48043. padding:20px;
  48044. h2{
  48045. font-size:18px;
  48046. font-weight: 900;
  48047. }
  48048. .item--count{
  48049. padding-top:15px;
  48050. display: flex;
  48051. align-items: center;
  48052. justify-content: flex-start;
  48053. gap:20px;
  48054. font-size:25px;
  48055. font-weight: 900;
  48056. i{
  48057. display: inline-flex;
  48058. align-items: center;
  48059. justify-content: center;
  48060. width:80px;
  48061. height:80px;
  48062. border-radius: 80px;
  48063. background-color: #9475EC;
  48064. }
  48065. }
  48066. }
  48067. }
  48068. }
  48069. }
  48070. </file>
  48071. <file path="pages/auth/join.vue">
  48072. <template>
  48073. <div class="login-wrap type--join">
  48074. <!-- header -->
  48075. <div class="login--header">
  48076. <div class="login--header--l">
  48077. <div class="logo">
  48078. <!-- prettier-ignore -->
  48079. SHOPDELI
  48080. </div>
  48081. </div>
  48082. <div class="login--header--r"></div>
  48083. </div>
  48084. <!-- login -->
  48085. <div class="login-box type--join">
  48086. <div class="login-r">
  48087. <h2 class="mk--title">{{ titleh }}</h2>
  48088. <!-- <div class="join--type">
  48089. <v-radio-group v-model="form.formValue0" row inline class="custom-radio type2">
  48090. <v-radio value="Y" label="인플루언스"></v-radio>
  48091. <v-radio value="N" label="벤더"></v-radio>
  48092. </v-radio-group>
  48093. </div> -->
  48094. <div class="tit-login">
  48095. <strong>회원가입</strong>
  48096. <span><i>*</i>필수입력 항목</span>
  48097. </div>
  48098. <div v-show="form.formValue0 === 'Y'" class="login-input-wrap">
  48099. <div class="txt-field-box">
  48100. <v-text-field
  48101. :disabled="useStore.getSnsTempData?.ID ? true : false"
  48102. v-model="form.formValue1"
  48103. placeholder="아이디를 입력해주세요"
  48104. class="custom-input"
  48105. @blur="checkId"
  48106. ></v-text-field>
  48107. <v-btn v-if="!useStore.getSnsTempData?.ID" small class="ml-2" @click="checkId"
  48108. >중복확인</v-btn
  48109. >
  48110. </div>
  48111. <div class="txt-field-box">
  48112. <v-text-field
  48113. v-model="form.formValue2"
  48114. :type="visible ? 'text' : 'password'"
  48115. placeholder="패스워드를 입력해주세요."
  48116. class="custom-input"
  48117. id="password"
  48118. ></v-text-field>
  48119. <i
  48120. class="ico-eye"
  48121. @click.stop="toggleVisibility"
  48122. :class="visible ? 'eye-on' : 'eye-off'"
  48123. ></i>
  48124. <i class="ico"></i>
  48125. </div>
  48126. <div class="txt-field-box">
  48127. <v-text-field
  48128. v-model="form.formValue3"
  48129. :type="visible ? 'text' : 'password'"
  48130. placeholder="패스워드 확인"
  48131. class="custom-input"
  48132. ></v-text-field>
  48133. <i
  48134. class="ico-eye"
  48135. @click.stop="toggleVisibility"
  48136. :class="visible ? 'eye-on' : 'eye-off'"
  48137. ></i>
  48138. <i class="ico"></i>
  48139. </div>
  48140. <div class="txt-field-box">
  48141. <v-text-field
  48142. v-model="form.formValue4"
  48143. :maxlength="20"
  48144. :counter="20"
  48145. :placeholder="'닉네임을 입력해주세요.'"
  48146. class="custom-input"
  48147. ></v-text-field>
  48148. </div>
  48149. <div class="txt-field-box">
  48150. <v-text-field
  48151. v-model="form.formValue5"
  48152. :disabled="useStore.getSnsTempData?.NAME ? true : false"
  48153. :maxlength="20"
  48154. :counter="20"
  48155. placeholder="이름을 입력해주세요"
  48156. class="custom-input"
  48157. ></v-text-field>
  48158. </div>
  48159. <div class="txt-field-box">
  48160. <v-select
  48161. v-model="form.formValue6"
  48162. :items="form.formValueItems6"
  48163. item-title="text"
  48164. item-value="value"
  48165. class="custom-select"
  48166. ></v-select>
  48167. </div>
  48168. <div class="txt-field-box">
  48169. <v-text-field
  48170. v-model="form.formValue7"
  48171. placeholder="소셜 ID 또는 주소를 입력해주세요."
  48172. class="custom-input"
  48173. ></v-text-field>
  48174. </div>
  48175. <div class="txt-field-box phone">
  48176. <v-text-field
  48177. placeholder=""
  48178. class="custom-input"
  48179. v-model="form.formValue8"
  48180. ></v-text-field>
  48181. -
  48182. <v-text-field
  48183. placeholder="1234"
  48184. class="custom-input"
  48185. v-model="form.formValue9"
  48186. ></v-text-field>
  48187. -
  48188. <v-text-field
  48189. placeholder="5678"
  48190. class="custom-input"
  48191. v-model="form.formValue10"
  48192. ></v-text-field>
  48193. </div>
  48194. <div class="txt-field-box email">
  48195. <v-text-field
  48196. v-model="form.formValue12"
  48197. :disabled="useStore.getSnsTempData?.EMAIL"
  48198. class="custom-input"
  48199. placeholder=""
  48200. ></v-text-field>
  48201. <span v-if="form.formValue11 != 'direct'">@</span>
  48202. <v-select
  48203. :disabled="useStore.getSnsTempData?.EMAIL ? true : false"
  48204. v-model="form.formValue11"
  48205. :items="form.formValueItems11"
  48206. item-title="text"
  48207. item-value="value"
  48208. class="custom-select"
  48209. ></v-select>
  48210. </div>
  48211. <div class="txt-field-box">
  48212. <v-textarea
  48213. v-model="form.formValue13"
  48214. placeholder="자기소개를 입력해주세요. 벤더사들이 참고할 수 있도록 작성해주세요."
  48215. class="custom-textarea"
  48216. rows="3"
  48217. ></v-textarea>
  48218. </div>
  48219. </div>
  48220. <div v-show="form.formValue0 === 'N'" class="login-input-wrap">
  48221. <div class="txt-field-box">
  48222. <v-text-field
  48223. v-model="formVendor.formValue1"
  48224. placeholder="아이디를 입력해주세요"
  48225. class="custom-input"
  48226. ></v-text-field>
  48227. <v-btn
  48228. v-if="!useStore.getSnsTempData?.ID"
  48229. small
  48230. class="ml-2"
  48231. @click="checkIdVendor"
  48232. >중복확인</v-btn
  48233. >
  48234. </div>
  48235. <div class="txt-field-box">
  48236. <v-text-field
  48237. v-model="formVendor.formValue2"
  48238. :type="visible ? 'text' : 'password'"
  48239. placeholder="패스워드를 입력해주세요."
  48240. class="custom-input"
  48241. id="password"
  48242. ></v-text-field>
  48243. <i
  48244. class="ico-eye"
  48245. @click.stop="toggleVisibility"
  48246. :class="visible ? 'eye-on' : 'eye-off'"
  48247. ></i>
  48248. <i class="ico"></i>
  48249. </div>
  48250. <div class="txt-field-box">
  48251. <v-text-field
  48252. v-model="formVendor.formValue3"
  48253. :type="visible ? 'text' : 'password'"
  48254. placeholder="패스워드 확인"
  48255. class="custom-input"
  48256. ></v-text-field>
  48257. <i
  48258. class="ico-eye"
  48259. @click.stop="toggleVisibility"
  48260. :class="visible ? 'eye-on' : 'eye-off'"
  48261. ></i>
  48262. <i class="ico"></i>
  48263. </div>
  48264. <div class="txt-field-box">
  48265. <v-text-field
  48266. v-model="formVendor.formValue4"
  48267. :maxlength="20"
  48268. :counter="20"
  48269. placeholder="회사명"
  48270. class="custom-input"
  48271. ></v-text-field>
  48272. </div>
  48273. <div class="txt-field-box">
  48274. <v-text-field
  48275. v-model="formVendor.formValue5"
  48276. :maxlength="20"
  48277. :counter="20"
  48278. placeholder="담당자 명"
  48279. class="custom-input"
  48280. ></v-text-field>
  48281. </div>
  48282. <div class="txt-field-box phone">
  48283. <v-text-field
  48284. placeholder=""
  48285. class="custom-input"
  48286. v-model="formVendor.formValue8"
  48287. ></v-text-field>
  48288. -
  48289. <v-text-field
  48290. placeholder="1234"
  48291. class="custom-input"
  48292. v-model="formVendor.formValue9"
  48293. ></v-text-field>
  48294. -
  48295. <v-text-field
  48296. placeholder="5678"
  48297. class="custom-input"
  48298. v-model="formVendor.formValue10"
  48299. ></v-text-field>
  48300. </div>
  48301. <div class="txt-field-box email">
  48302. <v-text-field
  48303. v-model="formVendor.formValue12"
  48304. class="custom-input"
  48305. placeholder=""
  48306. ></v-text-field>
  48307. <span v-if="formVendor.formValue11 != 'direct'">@</span>
  48308. <v-select
  48309. v-model="formVendor.formValue11"
  48310. :items="formVendor.formValueItems11"
  48311. item-title="text"
  48312. item-value="value"
  48313. class="custom-select"
  48314. ></v-select>
  48315. </div>
  48316. <div class="mt-5 d-flex agree--box">
  48317. <v-checkbox class="custom-check type2" v-model="formVendor.formValue13">
  48318. <template v-slot:label>개인정보약관동의</template>
  48319. </v-checkbox>
  48320. <v-checkbox class="custom-check type2" v-model="formVendor.formValue14">
  48321. <template v-slot:label>제3자 정보동의</template>
  48322. </v-checkbox>
  48323. </div>
  48324. </div>
  48325. <div class="login-btn-wrap">
  48326. <v-btn
  48327. v-show="form.formValue0 === 'Y'"
  48328. class="custom-btn btn-blue"
  48329. @click.stop="joinMember('influence')"
  48330. >회원가입</v-btn
  48331. >
  48332. <v-btn
  48333. v-show="form.formValue0 === 'N'"
  48334. class="custom-btn btn-blue"
  48335. @click.stop="joinMember('vendor')"
  48336. >회원가입</v-btn
  48337. >
  48338. </div>
  48339. </div>
  48340. </div>
  48341. <!-- footer -->
  48342. <div class="login-footer">
  48343. <div class="login--footer--l">
  48344. <p>COPYRIGHT@2025 SHOPDELI INC. ALL RIGHTS RESERVED.</p>
  48345. <p>마포구 합정동</p>
  48346. </div>
  48347. </div>
  48348. </div>
  48349. </template>
  48350. <script setup>
  48351. /************************
  48352. * import
  48353. ************************/
  48354. import apiUrl from "@/composables/useApi";
  48355. import { useI18n } from "vue-i18n";
  48356. const { $log, $toast } = useNuxtApp();
  48357. /************************
  48358. * layout setting
  48359. ************************/
  48360. definePageMeta({
  48361. layout: "loginlayout",
  48362. });
  48363. /************************
  48364. * 전역
  48365. ************************/
  48366. const titleh = ref("인플루언스");
  48367. const useStore = useAuthStore();
  48368. const randomString = ref("");
  48369. //인플루언서 폼
  48370. const form = ref({
  48371. formValue0: "Y",
  48372. formValue1: useStore.getSnsTempData?.ID || "", // 아이디
  48373. formValue2: "", // 패스워드
  48374. formValue3: "", // 패스워드 확인
  48375. formValue4: "", // 닉네임
  48376. formValue5: useStore.getSnsTempData?.NAME || "", // 이름
  48377. formValue6: "소셜채널 선택", // 소셜 채널
  48378. formValueItems6: [
  48379. {
  48380. text: "유튜브",
  48381. value: "youtube",
  48382. },
  48383. {
  48384. text: "인스타",
  48385. value: "instagram",
  48386. },
  48387. {
  48388. text: "네이버 블로그",
  48389. value: "naverblog",
  48390. },
  48391. {
  48392. text: "네이버 카페",
  48393. value: "navercafe",
  48394. },
  48395. {
  48396. text: "스마트스토어",
  48397. value: "smartstore",
  48398. },
  48399. ], // 소셜 채널 아이템
  48400. formValue7: "", // 소셜 ID 또는 주소
  48401. formValue8: "010", // 휴대폰1
  48402. formValue9: "", // 휴대폰2
  48403. formValue10: "", // 휴대폰3
  48404. formValue11: "email", // 이메일1
  48405. formValueItems11: [
  48406. {
  48407. text: "이메일 선택",
  48408. value: "email",
  48409. },
  48410. {
  48411. text: "직접입력",
  48412. value: "direct",
  48413. },
  48414. {
  48415. text: "naver.com",
  48416. value: "naver",
  48417. },
  48418. {
  48419. text: "gmail.com",
  48420. value: "gmail",
  48421. },
  48422. {
  48423. text: "daum.net",
  48424. value: "daum",
  48425. },
  48426. ], // 이메일 아이템
  48427. formValue12: "", // 이메일2
  48428. formValue13: "", // 자기소개
  48429. });
  48430. //밴더 폼
  48431. const formVendor = ref({
  48432. formValue0: "",
  48433. formValue1: "", // 아이디
  48434. formValue2: "", // 패스워드
  48435. formValue3: "", // 패스워드 확인
  48436. formValue4: "", // 닉네임
  48437. formValue5: "", // 이름
  48438. formValue6: "소셜채널 선택", // 소셜 채널
  48439. formValue7: "", // 소셜 ID 또는 주소
  48440. formValue8: "010", // 휴대폰1
  48441. formValue9: "", // 휴대폰2
  48442. formValue10: "", // 휴대폰3
  48443. formValue11: "email", // 이메일1
  48444. formValueItems11: [
  48445. {
  48446. text: "이메일 선택",
  48447. value: "email",
  48448. },
  48449. {
  48450. text: "직접입력",
  48451. value: "direct",
  48452. },
  48453. {
  48454. text: "naver.com",
  48455. value: "naver",
  48456. },
  48457. {
  48458. text: "gmail.com",
  48459. value: "gmail",
  48460. },
  48461. {
  48462. text: "daum.net",
  48463. value: "daum",
  48464. },
  48465. ], // 이메일 아이템
  48466. formValue12: "",
  48467. formValue13: "", // 개인정보약관동의
  48468. formValue14: "", // 제3자 정보동의
  48469. });
  48470. /************************
  48471. * 함수
  48472. ************************/
  48473. const generateRandomAlphanumeric = (length) => {
  48474. const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  48475. let result = "";
  48476. const charsLength = chars.length;
  48477. for (let i = 0; i < length; i++) {
  48478. result += chars.charAt(Math.floor(Math.random() * charsLength));
  48479. }
  48480. return result;
  48481. };
  48482. const checkId = async () => {
  48483. if (!form.value.formValue1) {
  48484. $toast.error("아이디를 입력해주세요.");
  48485. return;
  48486. }
  48487. // 아이디 형식 검사 (영문, 숫자 조합 6~20자)
  48488. const idRegex = /^[a-zA-Z0-9]{6,20}$/;
  48489. if (!idRegex.test(form.value.formValue1)) {
  48490. $toast.error("아이디는 영문, 숫자 조합 6~20자로 입력해주세요.");
  48491. return;
  48492. }
  48493. try {
  48494. const response = await useAxios().post("/auth/checkId", {
  48495. ID: form.value.formValue1,
  48496. TYPE: "influence",
  48497. });
  48498. if (response.data.isDuplicate) {
  48499. $toast.error("이미 사용중인 아이디입니다.");
  48500. } else {
  48501. $toast.success("사용 가능한 아이디입니다.");
  48502. }
  48503. } catch (error) {
  48504. console.error("ID check error:", error);
  48505. $toast.error("아이디 중복 확인 중 오류가 발생했습니다.");
  48506. }
  48507. };
  48508. const checkIdVendor = async () => {
  48509. if (!formVendor.value.formValue1) {
  48510. $toast.error("아이디를 입력해주세요.");
  48511. return;
  48512. }
  48513. // 아이디 형식 검사 (영문, 숫자 조합 6~20자)
  48514. const idRegex = /^[a-zA-Z0-9]{6,20}$/;
  48515. if (!idRegex.test(formVendor.value.formValue1)) {
  48516. $toast.error("아이디는 영문, 숫자 조합 6~20자로 입력해주세요.");
  48517. return;
  48518. }
  48519. try {
  48520. const response = await useAxios().post("/auth/checkId", {
  48521. ID: formVendor.value.formValue1,
  48522. TYPE: "vendor",
  48523. });
  48524. if (response.data.isDuplicate) {
  48525. $toast.error("이미 사용중인 아이디입니다.");
  48526. } else {
  48527. $toast.success("사용 가능한 아이디입니다.");
  48528. }
  48529. } catch (error) {
  48530. console.error("ID check error:", error);
  48531. $toast.error("아이디 중복 확인 중 오류가 발생했습니다.");
  48532. }
  48533. };
  48534. // 회원가입 전에 아이디 유효성 검사 추가
  48535. const joinMember = async (id_type) => {
  48536. if (!useStore.getSnsTempData?.ID) {
  48537. if (id_type === "vendor") {
  48538. if (!formVendor.value.formValue1) {
  48539. $toast.error("아이디를 입력해주세요.");
  48540. return;
  48541. }
  48542. // const idRegex = /^[a-zA-Z0-9]{6,20}$/;
  48543. // if (!idRegex.test(form.value.formValue1)) {
  48544. // $toast.error("아이디는 영문, 숫자 조합 6~20자로 입력해주세요.");
  48545. // return;
  48546. // }
  48547. } else {
  48548. if (!formVendor.value.formValue1) {
  48549. $toast.error("아이디를 입력해주세요.");
  48550. return;
  48551. }
  48552. const idRegex = /^[a-zA-Z0-9]{6,20}$/;
  48553. if (!idRegex.test(form.value.formValue1)) {
  48554. $toast.error("아이디는 영문, 숫자 조합 6~20자로 입력해주세요.");
  48555. return;
  48556. }
  48557. }
  48558. }
  48559. let _req = "";
  48560. let _api = "";
  48561. if (id_type === "influence") {
  48562. _api = "/auth/joinmember";
  48563. _req = {
  48564. ID: form.value.formValue1,
  48565. PASSWORD: form.value.formValue2,
  48566. NAME: form.value.formValue5,
  48567. NICK_NAME: form.value.formValue4 || "", //닉네임 없으면 빈문자
  48568. PHONE: `${form.value.formValue8}-${form.value.formValue9}-${form.value.formValue10}`,
  48569. EMAIL: form.value.formValue12,
  48570. SNS_TYPE: form.value.formValue6,
  48571. SNS_LINK_ID: form.value.formValue7,
  48572. ADD_INFO1: form.value.formValue13,
  48573. GOOGLE_REFRESH_TOKEN: useStore.getSnsTempData?.GOOGLE_REFRESH_TOKEN || "",
  48574. TYPE: useStore.getSnsTempData ? "1" : "0", // SNS 가입일경우 1, 일반회원 가입일경우 0
  48575. };
  48576. } else {
  48577. _api = "/auth/joinvendor";
  48578. _req = {
  48579. ID: formVendor.value.formValue1,
  48580. PASSWORD: formVendor.value.formValue3,
  48581. COMPANY_NAME: formVendor.value.formValue4,
  48582. COMPANY_NUMBER: (randomString.value = generateRandomAlphanumeric(100)),
  48583. NAME: formVendor.value.formValue5,
  48584. HP: `${formVendor.value.formValue8}-${formVendor.value.formValue9}-${formVendor.value.formValue10}`,
  48585. EMAIL: formVendor.value.formValue12,
  48586. };
  48587. }
  48588. useAxios()
  48589. .post(_api, _req)
  48590. .then((res) => {
  48591. if (_req.TYPE === "1") {
  48592. // SNS 가입일 경우
  48593. useStore.setTempData("");
  48594. useUtil.setPageMove("/?type=influence");
  48595. return;
  48596. }
  48597. if (form.value.formValue0 === "Y") {
  48598. useUtil.setPageMove("/?type=influence");
  48599. } else {
  48600. useUtil.setPageMove("/?type=vendor");
  48601. }
  48602. })
  48603. .catch((error) => {
  48604. if (error.response) {
  48605. console.log("status:", error.response.status, "data:", error.response.data);
  48606. // 안전하게 errCode, message 접근
  48607. const errData = error.response.data || {};
  48608. const errCode = errData.errCode || errData.errorCode || errData.code || "";
  48609. const errMsg = errData.message || "알 수 없는 오류가 발생했습니다.";
  48610. console.log("errCode:", errCode, "message:", errMsg);
  48611. } else {
  48612. console.log("error:", error.message, error.code);
  48613. }
  48614. if (error.response?.status) {
  48615. fnLoginSet(error.response.data.messages.message);
  48616. }
  48617. $log.debug("[join][fnIdPwCheck][error]");
  48618. })
  48619. .finally(() => {
  48620. $log.debug("[join][fnIdPwCheck][finished]");
  48621. });
  48622. };
  48623. /************************
  48624. * 마운트
  48625. ************************/
  48626. onMounted(() => {
  48627. const route = useRoute();
  48628. const typeParam = route.query.type;
  48629. typeParam === "influence"
  48630. ? (form.value.formValue0 = "Y")
  48631. : (form.value.formValue0 = "N");
  48632. if (useStore.getSnsTempData?.EMAIL) {
  48633. form.value.formValue12 = useStore.getSnsTempData.EMAIL;
  48634. form.value.formValue11 = "direct"; // 이메일 직접입력으로 설정
  48635. }
  48636. });
  48637. watch(
  48638. () => form.value.formValue0,
  48639. (newValue) => {
  48640. if (newValue === "Y") {
  48641. titleh.value = "인플루언서";
  48642. } else {
  48643. titleh.value = "벤더";
  48644. }
  48645. }
  48646. );
  48647. </script>
  48648. </file>
  48649. <file path="pages/view/common/deli/detail.vue">
  48650. <template>
  48651. <div>
  48652. <div class="inner--headers">
  48653. <h2>{{ pageId }}</h2>
  48654. <div class="bread--crumbs--wrap">
  48655. <span>홈</span>
  48656. <span>{{ pageId }}</span>
  48657. </div>
  48658. </div>
  48659. <div class="data--list--wrap">
  48660. <div class="btn--actions--wrap">
  48661. <div class="left--sections">
  48662. <v-btn class="custom-btn btn-pink bdrs--10"
  48663. ><i class="ico"></i>개별 배송</v-btn
  48664. >
  48665. <v-btn class="custom-btn bdrs--10 btn-white" @click="deliLocated()"
  48666. ><i class="ico"></i>공동구매 배송</v-btn
  48667. >
  48668. </div>
  48669. <div class="right--sections">
  48670. </div>
  48671. </div>
  48672. <div class="item--section">
  48673. <div v-if="imgTemp" class="item--thumb">
  48674. <img :src="imgTemp" alt="">
  48675. </div>
  48676. <div v-else class="item--thumb min--240">
  48677. NO IMAGE
  48678. </div>
  48679. <div class="item--info">
  48680. <h2>{{ form.formValue1 }}</h2>
  48681. <p>공급가: {{ Number(form.formValue2).toLocaleString() }}원</p>
  48682. <p>판매가: {{ Number(form.formValue3).toLocaleString() }}원</p>
  48683. </div>
  48684. </div>
  48685. <div class="btn--actions--wrap">
  48686. <div class="left--sections">
  48687. </div>
  48688. <div class="right--sections">
  48689. <div class="caption--wrap">
  48690. <i class="ico">!</i>
  48691. <div class="caption--box">
  48692. - 주문일은 YYYY.MM.DD 혹은 YYYY-MM-DD 형태로 입력해 주세요.<br>
  48693. - 구매자 정보 입력 후 저장 버튼을 꼭 클릭해 주세요.
  48694. </div>
  48695. </div>
  48696. <v-btn class="custom-btn btn-white mini" @click="addEmptyRow"
  48697. ><i class="ico"></i>항목 추가</v-btn
  48698. >
  48699. <v-btn class="custom-btn btn-white mini" @click="deleteSelectedRows"
  48700. ><i class="ico"></i>항목 삭제</v-btn
  48701. >
  48702. <input
  48703. ref="excelFileInput"
  48704. type="file"
  48705. accept=".xlsx,.xls"
  48706. @change="handleExcelUpload"
  48707. style="display: none"
  48708. />
  48709. <v-btn class="custom-btn btn-excel" @click="$refs.excelFileInput.click()"
  48710. ><i class="ico"></i>엑셀 업로드</v-btn
  48711. >
  48712. <v-btn class="custom-btn btn-excel" @click="downloadExcel"
  48713. ><i class="ico"></i>엑셀 다운로드</v-btn
  48714. >
  48715. </div>
  48716. </div>
  48717. <div class="tbl-wrapper">
  48718. <div class="tbl-wrap">
  48719. <!-- ag grid -->
  48720. <ag-grid-vue
  48721. style="width: 100%; height: calc(10 * 2.94rem)"
  48722. class="ag-theme-quartz"
  48723. :gridOptions="gridOptions"
  48724. rowSelection="multiple"
  48725. :rowData="tblItems"
  48726. :paginationPageSize="pageObj.pageSize"
  48727. :suppressPaginationPanel="true"
  48728. @grid-ready="onGridReady"
  48729. >
  48730. </ag-grid-vue>
  48731. <!-- 페이징 -->
  48732. <div class="ag-grid-custom-pagenations">
  48733. <pagination @chg_page="chgPage" :pageObj="pageObj"></pagination>
  48734. </div>
  48735. </div>
  48736. </div>
  48737. <div class="view-btm-btn">
  48738. <div class="btn-l">
  48739. <v-btn class="custom-btn btn-list" @click="listLocated"
  48740. ><i class="ico"></i>목록</v-btn
  48741. >
  48742. </div>
  48743. <div class="btn-r">
  48744. <v-btn class="custom-btn btn-blue2" @click="fnRegEvt"
  48745. ><i class="ico"></i>저장</v-btn
  48746. >
  48747. </div>
  48748. </div>
  48749. </div>
  48750. </div>
  48751. </template>
  48752. <script setup>
  48753. import "@vuepic/vue-datepicker/dist/main.css";
  48754. import { AgGridVue } from "ag-grid-vue3";
  48755. import * as XLSX from 'xlsx';
  48756. import pagination from "../components/common/pagination.vue";
  48757. /************************************************************************
  48758. | 레이아웃
  48759. ************************************************************************/
  48760. definePageMeta({
  48761. layout: "default",
  48762. });
  48763. /************************************************************************
  48764. | PROPS
  48765. ************************************************************************/
  48766. const props = defineProps({
  48767. propsData: {
  48768. type: Object,
  48769. default: () => {},
  48770. },
  48771. });
  48772. /************************************************************************
  48773. | 스토어
  48774. ************************************************************************/
  48775. const useDtStore = useDetailStore();
  48776. const useAtStore = useAuthStore();
  48777. /************************************************************************
  48778. | 전역
  48779. ************************************************************************/
  48780. const memberType = useAtStore.auth.memberType;
  48781. const memberSeq = useAtStore.auth.seq;
  48782. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  48783. const router = useRouter();
  48784. const pageId = ref("배송 관리");
  48785. let pageObj = ref({
  48786. page: 1, // 현재 페이지
  48787. pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
  48788. pageSize: 10, // 테이블 조회 데이터 개수
  48789. totalCnt: 0, // 전체 페이지
  48790. });
  48791. const imgTemp = ref("");
  48792. const tblItems = ref([]); // stat 데이터
  48793. const form = ref({
  48794. formValue1: "",
  48795. formValue2: "",
  48796. formValue3: "",
  48797. formValue4: "",
  48798. formValue5: null,
  48799. formValue6: "",
  48800. formValue7: "",
  48801. formValue8: "0",
  48802. formValue8Arr: [
  48803. { title: "판매중", value: "0" },
  48804. { title: "품절", value: "1" },
  48805. ],
  48806. formValue9: "Y",
  48807. formValue9Arr: [
  48808. { title: "노출", value: "Y" },
  48809. { title: "비노출", value: "N" },
  48810. ],
  48811. formValue10: "",
  48812. });
  48813. /* eslint-disable */
  48814. /* prettier-ignore */
  48815. pageObj.value.totalCnt = tblItems.value.length;
  48816. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  48817. const rowHeightRem = 2.65; // 원하는 rem 값
  48818. const rowHeightPx = rowHeightRem * remToPx();
  48819. const gridApi = shallowRef();
  48820. // gridOption
  48821. const gridOptions = {
  48822. columnDefs: [
  48823. { checkboxSelection: true, headerCheckboxSelection: true, width: 50 },
  48824. {
  48825. headerName: "No",
  48826. valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
  48827. sortable: false,
  48828. width: 70,
  48829. },
  48830. {
  48831. headerName: "인플루언서",
  48832. field: "NICK_NAME",
  48833. width: 150,
  48834. hide: memberType == 'INFLUENCER',
  48835. },
  48836. {
  48837. headerName: "구매자명",
  48838. field: "BUYER_NAME",
  48839. width: 120,
  48840. editable: true,
  48841. },
  48842. {
  48843. headerName: "주소",
  48844. field: "ADDRESS",
  48845. editable: true,
  48846. },
  48847. {
  48848. headerName: "연락처",
  48849. field: "PHONE",
  48850. width: 140,
  48851. editable: true,
  48852. },
  48853. {
  48854. headerName: "이메일",
  48855. field: "EMAIL",
  48856. editable: true,
  48857. },
  48858. {
  48859. headerName: "구매수량",
  48860. field: "QTY",
  48861. width: 120,
  48862. editable: true,
  48863. cellRenderer: (params) => {
  48864. return Number(params.value).toLocaleString();
  48865. },
  48866. },
  48867. {
  48868. headerName: "총구매금액",
  48869. field: "TOTAL",
  48870. editable: true,
  48871. width: 120,
  48872. cellRenderer: (params) => {
  48873. return Number(params.value).toLocaleString();
  48874. },
  48875. },
  48876. {
  48877. headerName: "배송업체",
  48878. field: "DELI_COMP",
  48879. width: 100,
  48880. editable: true,
  48881. },
  48882. {
  48883. headerName: "송장번호",
  48884. field: "DELI_NUMB",
  48885. editable: true,
  48886. },
  48887. {
  48888. headerName: "주문일",
  48889. field: "ORDER_DATE",
  48890. editable: true,
  48891. },
  48892. ],
  48893. rowData: tblItems.value, // 테이블 데이터
  48894. autoSizeStrategy: {
  48895. type: "fitGridWidth", // width맞춤
  48896. },
  48897. suppressMovableColumns: true,
  48898. headerHeight: rowHeightPx,
  48899. rowHeight: rowHeightPx,
  48900. pagination: true,
  48901. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  48902. rowMultiSelectWithClick: true,
  48903. rowSelection: {
  48904. checkboxes: true,
  48905. headerCheckbox: true,
  48906. enableClickSelection: false,
  48907. mode: "multiRow",
  48908. },
  48909. };
  48910. /************************************************************************
  48911. | 함수(METHODS)
  48912. ************************************************************************/
  48913. const listLocated = () => {
  48914. router.push({
  48915. path: "/view/common/deli/",
  48916. });
  48917. };
  48918. const onGridReady = (__PARAMS) => {
  48919. gridApi.value = __PARAMS.api;
  48920. };
  48921. const chgPage = (__PAGE) => {
  48922. pageObj.value.page = __PAGE;
  48923. gridApi.value.paginationGoToPage(__PAGE - 1);
  48924. };
  48925. const fnRegEvt = () => {
  48926. let param = {
  48927. id: pageId,
  48928. title: pageId,
  48929. content: "등록하시겠습니까?",
  48930. yes: {
  48931. text: "등록",
  48932. isProc: true,
  48933. event: "FN_INSERT",
  48934. param: "",
  48935. },
  48936. no: {
  48937. text: "취소",
  48938. isProc: false,
  48939. },
  48940. };
  48941. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  48942. };
  48943. // 엑셀 컬럼명 매핑 테이블
  48944. const excelColumnMapping = {
  48945. '구매자명': 'BUYER_NAME',
  48946. '주소': 'ADDRESS',
  48947. '연락처': 'PHONE',
  48948. '이메일': 'EMAIL',
  48949. '구매수량': 'QTY',
  48950. '총구매금액': 'TOTAL',
  48951. '배송업체': 'DELI_COMP',
  48952. '송장번호': 'DELI_NUMB',
  48953. '주문일': 'ORDER_DATE'
  48954. };
  48955. const addEmptyRow = () => {
  48956. const newRow = {
  48957. BUYER_NAME: "",
  48958. ADDRESS: "",
  48959. PHONE: "",
  48960. EMAIL: "",
  48961. QTY: "",
  48962. TOTAL: "",
  48963. DELI_COMP: "",
  48964. DELI_NUMB: "",
  48965. ORDER_DATE: ""
  48966. };
  48967. // 맨 앞에 추가 (unshift 사용)
  48968. tblItems.value.unshift(newRow);
  48969. pageObj.value.totalCnt = tblItems.value.length;
  48970. // ag-grid 데이터 갱신
  48971. if (gridApi.value) {
  48972. gridApi.value.setGridOption('rowData', tblItems.value);
  48973. }
  48974. $toast.success('새 항목이 추가되었습니다.');
  48975. };
  48976. const deleteSelectedRows = () => {
  48977. if (!gridApi.value) return;
  48978. const selectedRows = gridApi.value.getSelectedRows();
  48979. if (selectedRows.length === 0) {
  48980. $toast.warning('삭제할 항목을 선택해주세요.');
  48981. return;
  48982. }
  48983. let param = {
  48984. id: pageId,
  48985. title: pageId,
  48986. content: `선택된 ${selectedRows.length}개 항목을 삭제하시겠습니까?`,
  48987. yes: {
  48988. text: "삭제",
  48989. isProc: true,
  48990. event: "FN_DELETE_SELECTED",
  48991. param: selectedRows,
  48992. },
  48993. no: {
  48994. text: "취소",
  48995. isProc: false,
  48996. },
  48997. };
  48998. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  48999. };
  49000. const fnDeleteSelected = (selectedRows) => {
  49001. // 선택된 행들을 tblItems에서 제거
  49002. selectedRows.forEach(selectedRow => {
  49003. const index = tblItems.value.findIndex(item =>
  49004. item.BUYER_NAME === selectedRow.BUYER_NAME &&
  49005. item.ADDRESS === selectedRow.ADDRESS &&
  49006. item.PHONE === selectedRow.PHONE &&
  49007. item.EMAIL === selectedRow.EMAIL
  49008. );
  49009. if (index > -1) {
  49010. tblItems.value.splice(index, 1);
  49011. }
  49012. });
  49013. pageObj.value.totalCnt = tblItems.value.length;
  49014. // ag-grid 데이터 갱신
  49015. if (gridApi.value) {
  49016. gridApi.value.setGridOption('rowData', tblItems.value);
  49017. }
  49018. $toast.success(`${selectedRows.length}개 항목이 삭제되었습니다.`);
  49019. };
  49020. const handleExcelUpload = (event) => {
  49021. const file = event.target.files[0];
  49022. if (!file) return;
  49023. const reader = new FileReader();
  49024. reader.onload = (e) => {
  49025. try {
  49026. const data = new Uint8Array(e.target.result);
  49027. const workbook = XLSX.read(data, { type: 'array' });
  49028. const sheetName = workbook.SheetNames[0];
  49029. const worksheet = workbook.Sheets[sheetName];
  49030. const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
  49031. if (jsonData.length < 2) {
  49032. $toast.error('엑셀 파일에 데이터가 없습니다.');
  49033. return;
  49034. }
  49035. const headers = jsonData[0];
  49036. const rows = jsonData.slice(1);
  49037. // 컬럼명 매핑 및 데이터 변환
  49038. const mappedData = rows.map(row => {
  49039. const mappedRow = {};
  49040. headers.forEach((header, index) => {
  49041. const fieldName = excelColumnMapping[header];
  49042. if (fieldName && row[index] !== undefined) {
  49043. mappedRow[fieldName] = row[index];
  49044. }
  49045. });
  49046. return mappedRow;
  49047. }).filter(row => Object.keys(row).length > 0);
  49048. if (mappedData.length === 0) {
  49049. $toast.error('매핑 가능한 컬럼이 없습니다. 엑셀 헤더명을 확인해주세요.');
  49050. return;
  49051. }
  49052. // ag-grid에 데이터 추가
  49053. // 기존 데이터는 지우고 추가
  49054. tblItems.value = [...mappedData];
  49055. pageObj.value.totalCnt = tblItems.value.length;
  49056. // ag-grid 데이터 갱신
  49057. if (gridApi.value) {
  49058. gridApi.value.setGridOption('rowData', tblItems.value);
  49059. }
  49060. $toast.success(`${mappedData.length}건의 데이터가 추가되었습니다.`);
  49061. } catch (error) {
  49062. console.error('엑셀 파일 처리 중 오류:', error);
  49063. $toast.error('엑셀 파일을 읽는 중 오류가 발생했습니다.');
  49064. }
  49065. };
  49066. reader.readAsArrayBuffer(file);
  49067. // 파일 input 초기화
  49068. event.target.value = '';
  49069. };
  49070. const downloadExcel = () => {
  49071. if (!tblItems.value || tblItems.value.length === 0) {
  49072. $toast.warning('다운로드할 데이터가 없습니다.');
  49073. return;
  49074. }
  49075. // 한글 헤더명 배열
  49076. const headers = [
  49077. '구매자명', '주소', '연락처', '이메일', '구매수량',
  49078. '총구매금액', '배송업체', '송장번호', '주문일'
  49079. ];
  49080. // 데이터를 엑셀 형식으로 변환
  49081. const excelData = tblItems.value.map(item => [
  49082. item.BUYER_NAME || '',
  49083. item.ADDRESS || '',
  49084. item.PHONE || '',
  49085. item.EMAIL || '',
  49086. item.QTY || '',
  49087. item.TOTAL || '',
  49088. item.DELI_COMP || '',
  49089. item.DELI_NUMB || '',
  49090. item.ORDER_DATE || ''
  49091. ]);
  49092. // 헤더를 첫 번째 행에 추가
  49093. const worksheetData = [headers, ...excelData];
  49094. // 워크시트 생성
  49095. const worksheet = XLSX.utils.aoa_to_sheet(worksheetData);
  49096. // 워크북 생성
  49097. const workbook = XLSX.utils.book_new();
  49098. XLSX.utils.book_append_sheet(workbook, worksheet, '배송관리');
  49099. // 파일명 생성 (현재 날짜 포함)
  49100. const today = new Date();
  49101. const dateString = today.getFullYear() +
  49102. String(today.getMonth() + 1).padStart(2, '0') +
  49103. String(today.getDate()).padStart(2, '0');
  49104. const fileName = `배송관리_${dateString}.xlsx`;
  49105. // 엑셀 파일 다운로드
  49106. XLSX.writeFile(workbook, fileName);
  49107. $toast.success('엑셀 파일이 다운로드되었습니다.');
  49108. };
  49109. const fnDetail = () => {
  49110. let req = {
  49111. seq: useDtStore.boardInfo.seq,
  49112. };
  49113. let req2 = {
  49114. item_seq: useDtStore.boardInfo.seq,
  49115. //인플루언서일 경우 본인의 inf_seq값 보내줘야함
  49116. //inf_seq: 8,
  49117. }
  49118. useAxios()
  49119. .get(`/item/detail/${req.seq}`)
  49120. .then((res) => {
  49121. form.value.formValue1 = res.data.NAME;
  49122. form.value.formValue2 = res.data.PRICE1;
  49123. form.value.formValue3 = res.data.PRICE2;
  49124. form.value.formValue4 = res.data.DELI_FEE;
  49125. form.value.formValue5 = res.data.THUMB_FILE;
  49126. form.value.formValue6 = res.data.SUB_TITLE;
  49127. form.value.formValue8 = res.data.STATUS;
  49128. form.value.formValue9 = res.data.SHOW_YN;
  49129. form.value.formValue10 = res.data.ADD_INFO;
  49130. //썸네일 파일이 있으면 넣어줌
  49131. if(form.value.formValue5){
  49132. imgTemp.value = `https://shopdeli.mycafe24.com/writable/uploads/item/thumb/${form.value.formValue5}`;
  49133. }
  49134. })
  49135. .catch((error) => {
  49136. $toast.error('제품 정보를 불러오는 중 오류가 발생했습니다.');
  49137. })
  49138. .finally(() => {
  49139. });
  49140. // 기 저장된 구매자명 리스트
  49141. // 제품 seq, 인플루언서 seq가 일치하는 리스트만
  49142. useAxios()
  49143. .post(`/deli/list`, req2)
  49144. .then((res) => {
  49145. console.log(res.data)
  49146. tblItems.value = res.data;
  49147. pageObj.value.totalCnt = tblItems.value.length;
  49148. })
  49149. .catch((error) => {
  49150. $toast.error('제품 정보를 불러오는 중 오류가 발생했습니다.');
  49151. })
  49152. .finally(() => {
  49153. });
  49154. };
  49155. const fnInsert = () => {
  49156. const deliveryData = {
  49157. item_seq: useDtStore.boardInfo.seq,
  49158. inf_seq: memberSeq,
  49159. deliveryList: tblItems.value.map(item => ({
  49160. buyerName: item.BUYER_NAME,
  49161. address: item.ADDRESS,
  49162. phone: item.PHONE,
  49163. email: item.EMAIL,
  49164. qty: item.QTY,
  49165. total: item.TOTAL,
  49166. deliComp: item.DELI_COMP,
  49167. deliNumb: item.DELI_NUMB,
  49168. orderDate: item.ORDER_DATE.replaceAll(".", "-")
  49169. }))
  49170. };
  49171. useAxios()
  49172. .post('/deli/reg', deliveryData)
  49173. .then((res) => {
  49174. $toast.success('배송 데이터가 성공적으로 저장되었습니다.');
  49175. location.reload();
  49176. })
  49177. .catch((error) => {
  49178. let errorMessage = '배송 데이터 저장 중 오류가 발생했습니다.';
  49179. if (error.response && error.response.data && error.response.data.message) {
  49180. errorMessage = error.response.data.message;
  49181. }
  49182. $toast.error(errorMessage);
  49183. })
  49184. .finally(() => {
  49185. });
  49186. };
  49187. /************************************************************************
  49188. | 팝업 이벤트버스 정의
  49189. ************************************************************************/
  49190. $eventBus.off("FN_INSERT");
  49191. $eventBus.on("FN_INSERT", () => {
  49192. fnInsert();
  49193. });
  49194. $eventBus.off("FN_DELETE_SELECTED");
  49195. $eventBus.on("FN_DELETE_SELECTED", (selectedRows) => {
  49196. fnDeleteSelected(selectedRows);
  49197. });
  49198. /************************************************************************
  49199. | WATCH
  49200. ************************************************************************/
  49201. watch(
  49202. () => props,
  49203. () => {
  49204. searchObj.value = props.propsData;
  49205. fnGetStat();
  49206. },
  49207. { deep: true }
  49208. );
  49209. onMounted(() => {
  49210. fnDetail();
  49211. });
  49212. </script>
  49213. </file>
  49214. <file path="pages/auth/popupClose.vue">
  49215. <script setup>
  49216. import { onMounted } from "vue";
  49217. onMounted(() => {
  49218. const q = new URLSearchParams(window.location.search);
  49219. const accessToken = q.get("accessToken");
  49220. const refreshToken = q.get("refreshToken");
  49221. const user = q.get("user") ? JSON.parse(decodeURIComponent(q.get("user"))) : null;
  49222. const targetOrigin = import.meta.env.VITE_APP_BASE_URL;
  49223. // If joinType is 'influencer', you can handle it here if needed
  49224. if (user.JOIN === "1") {
  49225. window.opener.postMessage(
  49226. {
  49227. user,
  49228. },
  49229. targetOrigin
  49230. );
  49231. window.close();
  49232. } else if (accessToken && window.opener) {
  49233. window.opener.postMessage(
  49234. {
  49235. accessToken,
  49236. refreshToken,
  49237. user,
  49238. },
  49239. targetOrigin
  49240. );
  49241. window.close();
  49242. }
  49243. });
  49244. </script>
  49245. <template>
  49246. <div>로그인 완료, 창을 닫습니다...</div>
  49247. </template>
  49248. </file>
  49249. <file path="pages/view/common/item/index.vue">
  49250. <template>
  49251. <div>
  49252. <div class="inner--headers">
  49253. <h2>{{ pageId }}</h2>
  49254. <div class="bread--crumbs--wrap">
  49255. <span>홈</span>
  49256. <span>{{ pageId }}</span>
  49257. </div>
  49258. </div>
  49259. <div class="search--modules type2">
  49260. <div class="search--inner">
  49261. <div class="form--cont--filter">
  49262. <v-select
  49263. v-model="filter"
  49264. :items="filderArr"
  49265. variant="outlined"
  49266. class="custom-select"
  49267. >
  49268. </v-select>
  49269. </div>
  49270. <div class="form--cont--text">
  49271. <v-text-field
  49272. v-model="searchModel"
  49273. class="custom-input mini"
  49274. style="width: 100%"
  49275. placeholder="검색어를 입력하세요"
  49276. ></v-text-field>
  49277. </div>
  49278. </div>
  49279. <div class="search--inner">
  49280. <div class="calendar-wrap ml--0">
  49281. <div class="calendar">
  49282. <VueDatePicker
  49283. :format="datePickerFormat"
  49284. v-model="searchStartDate"
  49285. placeholder="날짜를 선택하세요"
  49286. :auto-apply="true"
  49287. week-start="0"
  49288. ></VueDatePicker>
  49289. </div>
  49290. <span class="text">~</span>
  49291. <div class="calendar">
  49292. <VueDatePicker
  49293. v-model="searchEndDate"
  49294. :format="datePickerFormat"
  49295. placeholder="날짜를 선택하세요"
  49296. :auto-apply="true"
  49297. week-start="0"
  49298. ></VueDatePicker>
  49299. </div>
  49300. <div class="month--selector">
  49301. <v-btn
  49302. v-for="option in dateOptions"
  49303. :key="option.value"
  49304. :class="{ actv: selectedRange === option.value }"
  49305. @click="setDateRange(option.value)"
  49306. elevation="0"
  49307. >
  49308. {{ option.label }}
  49309. </v-btn>
  49310. </div>
  49311. </div>
  49312. </div>
  49313. <v-btn
  49314. class="custom-btn btn-blue mini sch--btn"
  49315. @click="fnSearch(searchModel, filter)"
  49316. >검색</v-btn
  49317. >
  49318. </div>
  49319. <div class="data--list--wrap">
  49320. <div class="btn--actions--wrap">
  49321. <div class="left--sections">
  49322. <!-- <v-btn class="custom-btn mini btn-white">선택 삭제</v-btn> -->
  49323. </div>
  49324. <div class="right--sections">
  49325. <v-btn class="custom-btn mini btn-reg" v-if="memberType !== 'INFLUENCER'" @click="addLocated()"
  49326. ><i class="ico"></i>제품 등록</v-btn
  49327. >
  49328. </div>
  49329. </div>
  49330. <div class="item--list--wrap">
  49331. <div class="no--data" v-if="itemList.length == 0">
  49332. 등록된 제품이 없습니다.
  49333. </div>
  49334. <div class="item--list" v-if="itemList.length > 0">
  49335. <div v-for="(items, index) in paginatedItems" :key="index" @click="toItemDetail(items.SEQ)" class="item">
  49336. <div class="item--img"><img v-if="items.THUMB_FILE" :src="`https://shopdeli.mycafe24.com/writable/uploads/item/thumb/${items.THUMB_FILE}`"></div>
  49337. <h3>{{ items.NAME }}</h3>
  49338. <p>공급가: {{ Number(items.PRICE1).toLocaleString() }}<br>판매가: {{ Number(items.PRICE1).toLocaleString() }}</p>
  49339. <span>등록일: {{ items.REGDATE.slice(0, 10) }}</span>
  49340. <span>업데이트 날짜: {{ items.UDPDATE.slice(0, 10) }}</span>
  49341. <div
  49342. v-if="items.STATUS == 1 || isRecentUpdate(items.UDPDATE)"
  49343. class="sold--out"
  49344. :class="{ 'blue--type': isRecentUpdate(items.UDPDATE) && items.STATUS != 1 }"
  49345. >
  49346. <span>
  49347. {{ items.STATUS == 1 ? '품절' : '업데이트' }}
  49348. </span>
  49349. </div>
  49350. </div>
  49351. </div>
  49352. <div class="item--pagination" v-if="itemList.length > 0">
  49353. <v-pagination
  49354. v-model="currentPage"
  49355. :length="Math.ceil(itemList.length / itemsPerPage)"
  49356. ></v-pagination>
  49357. </div>
  49358. </div>
  49359. </div>
  49360. </div>
  49361. </template>
  49362. <script setup>
  49363. import VueDatePicker from "@vuepic/vue-datepicker";
  49364. import "@vuepic/vue-datepicker/dist/main.css";
  49365. import dayjs from 'dayjs';
  49366. /************************************************************************
  49367. | 레이아웃
  49368. ************************************************************************/
  49369. definePageMeta({
  49370. layout: "default",
  49371. });
  49372. /************************************************************************
  49373. | PROPS
  49374. ************************************************************************/
  49375. const props = defineProps({
  49376. propsData: {
  49377. type: Object,
  49378. default: () => {},
  49379. },
  49380. });
  49381. /************************************************************************
  49382. | 스토어
  49383. ************************************************************************/
  49384. const useDtStore = useDetailStore();
  49385. const useAtStore = useAuthStore();
  49386. /************************************************************************
  49387. | 전역
  49388. ************************************************************************/
  49389. const memberType = useAtStore.auth.memberType;
  49390. const searchModel = ref("");
  49391. const selectedRange = ref('all');
  49392. const itemStartDate = ref("");
  49393. const searchStartDate = ref("");
  49394. const searchEndDate = ref("");
  49395. const dateOptions = [
  49396. { label: '오늘', value: 'today' },
  49397. { label: '7일', value: '7d' },
  49398. { label: '1개월', value: '1m' },
  49399. { label: '3개월', value: '3m' },
  49400. { label: '전체', value: 'all' },
  49401. ]
  49402. const datePickerFormat = "yyyy-MM-dd";
  49403. const filter = ref("");
  49404. const filderArr = ref([
  49405. { title: "전체", value: "" },
  49406. { title: "제품명", value: "name" },
  49407. ]);
  49408. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  49409. const router = useRouter();
  49410. const pageId = ref("제품 관리");
  49411. const itemList = ref([]);
  49412. const itemsPerPage = 5;
  49413. const currentPage = ref(1);
  49414. /* eslint-disable */
  49415. /* prettier-ignore */
  49416. /************************************************************************
  49417. | 함수(METHODS)
  49418. ************************************************************************/
  49419. const isRecentUpdate = (dateStr) => {
  49420. const today = new Date();
  49421. const updateDate = new Date(dateStr);
  49422. const diffDays = (today - updateDate) / (1000 * 60 * 60 * 24);
  49423. // 업데이트 날짜가 오늘 날짜 기준 최근 7일인지 확인
  49424. return diffDays <= 7;
  49425. }
  49426. const paginatedItems = computed(() => {
  49427. const start = (currentPage.value - 1) * itemsPerPage;
  49428. return itemList.value.slice(start, start + itemsPerPage);
  49429. });
  49430. const setDateRange = (range) => {
  49431. const today = dayjs();
  49432. switch(range) {
  49433. case 'today' :
  49434. searchStartDate.value = today.format('YYYY-MM-DD');
  49435. searchEndDate.value = today.format('YYYY-MM-DD');
  49436. selectedRange.value = 'today';
  49437. break;
  49438. case '7d':
  49439. searchStartDate.value = today.subtract(7, 'day').format('YYYY-MM-DD');
  49440. searchEndDate.value = today.format('YYYY-MM-DD');
  49441. selectedRange.value = '7d';
  49442. break;
  49443. case '1m':
  49444. searchStartDate.value = today.subtract(1, 'month').format('YYYY-MM-DD');
  49445. searchEndDate.value = today.format('YYYY-MM-DD');
  49446. selectedRange.value = '1m';
  49447. break;
  49448. case '3m':
  49449. searchStartDate.value = today.subtract(3, 'month').format('YYYY-MM-DD');
  49450. searchEndDate.value = today.format('YYYY-MM-DD');
  49451. selectedRange.value = '3m';
  49452. break;
  49453. case 'all':
  49454. searchStartDate.value = itemStartDate.value;
  49455. searchEndDate.value = today.format('YYYY-MM-DD');
  49456. selectedRange.value = 'all';
  49457. break
  49458. }
  49459. }
  49460. const addLocated = () => {
  49461. router.push({
  49462. path: "/view/common/item/add",
  49463. });
  49464. useDtStore.boardInfo.pageType = "I";
  49465. };
  49466. const toItemDetail = (__EVENT) => {
  49467. router.push({
  49468. path: "/view/common/item/add",
  49469. });
  49470. useDtStore.boardInfo.seq = __EVENT;
  49471. //제품 등록한 벤더의 경우 U로, 인플루언서의 경우 D로
  49472. memberType == 'INFLUENCER' ? useDtStore.boardInfo.pageType = "D" : useDtStore.boardInfo.pageType = "U";
  49473. };
  49474. const itemListGet = async () => {
  49475. let _req = {
  49476. // Y : 노출, N : 비노출
  49477. SHOW_YN: "",
  49478. };
  49479. // 인플루언서의 경우 비노출 처리된 제품 숨김
  49480. if (memberType === "INFLUENCER") {
  49481. _req.SHOW_YN = "Y";
  49482. }
  49483. await useAxios()
  49484. .post("/item/list", _req)
  49485. .then((res) => {
  49486. itemList.value = res.data;
  49487. itemStartDate.value = res.data[res.data.length-1].UDPDATE;
  49488. searchStartDate.value = itemStartDate.value;
  49489. searchEndDate.value = dayjs();
  49490. });
  49491. };
  49492. const fnSearch = (__KEYWORD, __FILTER) => {
  49493. let _req = {
  49494. filter: __FILTER,
  49495. keyword: __KEYWORD,
  49496. startDate: searchStartDate.value,
  49497. endDate: searchEndDate.value,
  49498. showYN: ""
  49499. };
  49500. //인플루언서의 경우 showYN 추가
  49501. if (memberType === "INFLUENCER") {
  49502. _req.showYN = "Y";
  49503. }
  49504. useAxios()
  49505. .post("/item/search", _req)
  49506. .then((res) => {
  49507. itemList.value = res.data;
  49508. })
  49509. .catch((error) => {});
  49510. };
  49511. /************************************************************************
  49512. | WATCH
  49513. ************************************************************************/
  49514. onMounted(() => {
  49515. itemListGet();
  49516. });
  49517. </script>
  49518. </file>
  49519. <file path="nuxt.config.ts">
  49520. // https://nuxt.com/docs/api/configuration/nuxt-config
  49521. import VitePluginSRI from 'vite-plugin-sri';
  49522. export default defineNuxtConfig({
  49523. typescript: {
  49524. strict: false,
  49525. typeCheck: false
  49526. },
  49527. ssr: false,
  49528. app: {
  49529. head: {
  49530. titleTemplate: '',
  49531. title: 'ShopDeli',
  49532. htmlAttrs: {
  49533. lang: 'ko'
  49534. },
  49535. link: [
  49536. { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' },
  49537. ],
  49538. script: [
  49539. { type: 'text/javascript', src: '//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js' }
  49540. ]
  49541. },
  49542. },
  49543. devtools: { enabled: false },
  49544. devServer : {
  49545. //host: '0.0.0.0'
  49546. },
  49547. build: {
  49548. transpile: ['vuetify'],
  49549. },
  49550. css: [
  49551. 'ag-grid-community/styles/ag-grid.css',
  49552. 'ag-grid-community/styles/ag-theme-quartz.css',
  49553. 'pretendard/dist/web/static/pretendard.css',
  49554. '~/assets/scss/main.scss',
  49555. 'vuetify/lib/styles/main.sass',
  49556. '@mdi/font/css/materialdesignicons.min.css',
  49557. '@fortawesome/fontawesome-svg-core/styles.css'
  49558. ],
  49559. modules: [
  49560. '@pinia/nuxt',
  49561. '@pinia-plugin-persistedstate/nuxt',
  49562. 'nuxt-lodash',
  49563. 'dayjs-nuxt',
  49564. ],
  49565. plugins: [
  49566. { src: '~/plugins/userAgent.js', mode: 'client'},
  49567. { src: '~/plugins/vue3-editor.js', mode: 'client'},
  49568. { src: '~/plugins/vue-cool-lightbox.js', mode: 'client'},
  49569. { src: '~/plugins/fontawesome.js', mode: 'client'}
  49570. ],
  49571. lodash: {
  49572. prefix: "_",
  49573. prefixSkip: ["string"],
  49574. upperAfterPrefix: false,
  49575. exclude: ["map"],
  49576. alias: [
  49577. ["camelCase", "stringToCamelCase"], // => stringToCamelCase
  49578. ["kebabCase", "stringToKebab"], // => stringToKebab
  49579. ["isDate", "isLodashDate"], // => _isLodashDate
  49580. ],
  49581. },
  49582. dayjs: {
  49583. locales: ['en', 'ja'],
  49584. defaultLocale: 'en',
  49585. defaultTimezone: 'Asia/Tokyo',
  49586. plugins: ['relativeTime', 'utc', 'timezone']
  49587. },
  49588. builder: 'vite',
  49589. vite: {
  49590. base: import.meta.env.VITE_APP_BASE_URL,
  49591. define: {
  49592. 'process.env.DEBUG': false,
  49593. },
  49594. plugins: [
  49595. VitePluginSRI(),
  49596. ],
  49597. build: {
  49598. chunkSizeWarningLimit: 1600,
  49599. sourcemap: true,
  49600. rollupOptions: {
  49601. output: {
  49602. chunkFileNames: '_nuxt/chunks/[name].js',
  49603. entryFileNames: '_nuxt/js/[name].js',
  49604. assetFileNames: '_nuxt/[name].[ext]',
  49605. }
  49606. },
  49607. }
  49608. },
  49609. compatibilityDate: '2024-08-23',
  49610. runtimeConfig: {
  49611. public: {
  49612. anthropicApiKey: process.env.ANTHROPIC_API_KEY,
  49613. apiUrl: process.env.VITE_APP_API_URL
  49614. }
  49615. }
  49616. })
  49617. </file>
  49618. <file path="assets/scss/mode-w-m.scss">
  49619. @charset "UTF-8";
  49620. /**********************************************
  49621. | 2024-08-26 김민정 :
  49622. **********************************************/
  49623. .mt--125rem{
  49624. margin-top: 1.25rem;
  49625. }
  49626. .mt--1rem{
  49627. margin-top: 1rem;
  49628. }
  49629. // header
  49630. .container {
  49631. .new--header {
  49632. gap: 20px;
  49633. background: #ffffff;
  49634. /*height:calc(1vh * (90 / 10.8));*/
  49635. display: flex;
  49636. align-items: center;
  49637. flex-direction: column;
  49638. flex-shrink: 0;
  49639. position: relative;
  49640. width: 340px;
  49641. padding: 20px;
  49642. z-index: 22;
  49643. .pro--wrap{
  49644. border: 1px solid #cccccc;
  49645. border-radius: 30px;
  49646. padding: 30px;
  49647. width: 100%;
  49648. height: 300px;
  49649. display: flex;
  49650. flex-direction: column;
  49651. align-items: center;
  49652. justify-content: center;
  49653. .pro--img{
  49654. width: 96px;
  49655. height: 96px;
  49656. background-image: url(../img/pf_sample.svg);
  49657. border-radius: 50%;
  49658. background-position: center;
  49659. background-repeat: no-repeat;
  49660. background-size: 100%;
  49661. margin-bottom: 20px;
  49662. }
  49663. .pro--id{
  49664. cursor: pointer;
  49665. position: relative;
  49666. font-size: 1rem;
  49667. font-weight: 500;
  49668. margin-bottom: 20px;
  49669. line-height: 1;
  49670. .ico{
  49671. font-style: normal;
  49672. transform: rotate(90deg);
  49673. display: inline-block;
  49674. &.on{
  49675. transform: rotate(270deg);
  49676. }
  49677. }
  49678. .id--box{
  49679. position: absolute;
  49680. right: -50%;
  49681. top: 100%;
  49682. display: flex;
  49683. z-index: 12;
  49684. padding: 20px;
  49685. flex-direction: column;
  49686. white-space: nowrap;
  49687. border-radius: 10px;
  49688. border: 1px solid #cccccc;
  49689. background-color: #fff;
  49690. button{
  49691. font-size: 0.8rem;
  49692. padding: 10px;
  49693. }
  49694. // .btn-logout {
  49695. // width: 1.5rem;
  49696. // height: 1.5rem;
  49697. // background: url("../img/ico_logout.svg") no-repeat center / 100%;
  49698. // }
  49699. }
  49700. }
  49701. .pro--info{
  49702. padding: 10px 30px;
  49703. border-radius: 10px;
  49704. color: #ffffff;
  49705. font-weight: 500;
  49706. line-height: 1;
  49707. font-size: 0.8rem;
  49708. background-color: #9475EC;
  49709. pointer-events: none;
  49710. &.inf{
  49711. background-color: #F74F78;
  49712. }
  49713. }
  49714. }
  49715. .gnb {
  49716. z-index: 10;
  49717. border: 1px solid #cccccc;
  49718. border-radius: 30px;
  49719. padding: 30px;
  49720. width: 100%;
  49721. height: calc(100% - 320px);
  49722. &:hover {
  49723. .gnb-bg {
  49724. height: 16rem;
  49725. }
  49726. .depth1 {
  49727. >li {
  49728. .depth2 {
  49729. height: 16rem;
  49730. }
  49731. }
  49732. }
  49733. }
  49734. .depth1 {
  49735. display: flex;
  49736. flex-direction: column;
  49737. height: 100%;
  49738. >li {
  49739. position: relative;
  49740. >button {
  49741. /* width: calc(1vw * (180 / 19.2)); */
  49742. /* height:calc(1vh * (90 / 10.8)); */
  49743. /* min-height:90px; */
  49744. padding-left: 2rem;
  49745. width: 100%;
  49746. text-align: left;
  49747. height: 3.75rem;
  49748. display: inline-block;
  49749. color: #000000;
  49750. font-size: 1rem;
  49751. font-weight: 600;
  49752. &:hover{
  49753. background-color: #f2f7ff;
  49754. }
  49755. &.actv{
  49756. &::before{
  49757. content: '';
  49758. position: absolute;
  49759. left: -0px;
  49760. top: calc(50% - 0.75rem);
  49761. background-size: 100%;
  49762. background-position: center;
  49763. background-repeat: no-repeat;
  49764. background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none'%3E%3Cpath d='M16.3818 5C17.1394 5 17.8321 5.42793 18.1709 6.10547L19.7754 9.31543L23 11.4648V16C23 17.1046 22.1046 18 21 18H19.8262C19.4141 19.1647 18.3059 20 17 20C15.6941 20 14.5859 19.1647 14.1738 18H9.82617C9.41406 19.1647 8.30585 20 7 20C5.69415 20 4.58594 19.1647 4.17383 18H3C1.89543 18 1 17.1046 1 16V7C1 5.89543 1.89543 5 3 5H16.3818ZM7 16C6.44772 16 6 16.4477 6 17C6 17.5523 6.44772 18 7 18C7.55228 18 8 17.5523 8 17C8 16.4477 7.55228 16 7 16ZM17 16C16.4477 16 16 16.4477 16 17C16 17.5523 16.4477 18 17 18C17.5523 18 18 17.5523 18 17C18 16.4477 17.5523 16 17 16ZM3 16H4.17383C4.58594 14.8353 5.69415 14 7 14C8.30585 14 9.41406 14.8353 9.82617 16H14.1738C14.5859 14.8353 15.6941 14 17 14C18.3059 14 19.4141 14.8353 19.8262 16H21V12.5352L18.2246 10.6846L16.3818 7H3V16Z' fill='black'/%3E%3C/svg%3E");
  49765. width: 1.5rem;
  49766. height: 1.5rem;
  49767. }
  49768. }
  49769. }
  49770. .depth2 {
  49771. position: absolute;
  49772. overflow: hidden;
  49773. height: 0;
  49774. z-index: 10;
  49775. width: 100%;
  49776. transition: 0.5s 0s;
  49777. ul {
  49778. padding-top: 1.88rem;
  49779. li {
  49780. color: #333;
  49781. font-size: 0.88rem;
  49782. font-weight: 400;
  49783. display: block;
  49784. margin-bottom: 1.88rem;
  49785. cursor: pointer;
  49786. text-align: center;
  49787. &.active {
  49788. color: #064F9E;
  49789. font-weight: 700;
  49790. }
  49791. }
  49792. }
  49793. }
  49794. }
  49795. }
  49796. .gnb-bg {
  49797. position: fixed;
  49798. /* top:calc(1vh * (90 / 10.8)); */
  49799. top: 3.75rem;
  49800. left: 0;
  49801. right: 0;
  49802. width: 100vw;
  49803. background: #fff;
  49804. z-index: 8;
  49805. height: 0;
  49806. transition: 0.5s 0s;
  49807. box-shadow: 0 0.25rem 0.63rem 0 rgba(0, 0, 0, 0.25);
  49808. }
  49809. }
  49810. .util {
  49811. display: flex;
  49812. align-items: center;
  49813. gap: 0.625rem;
  49814. margin-left: auto;
  49815. flex-shrink: 0;
  49816. .ico {
  49817. font-size: 0;
  49818. }
  49819. .btn-setting{
  49820. width: 1.625rem;
  49821. height: 1.625rem;
  49822. background: no-repeat center / 100%;
  49823. background-image: url(../img/ico_setting.svg);
  49824. }
  49825. .btn-alarm {
  49826. width: 2rem;
  49827. height: 2rem;
  49828. position: relative;
  49829. &.type1 {
  49830. .ico {
  49831. width: 2rem;
  49832. height: 2rem;
  49833. background-image: url("../img/ico_alarm4.svg");
  49834. background-size: cover!important;
  49835. }
  49836. }
  49837. &.type2 {
  49838. .ico {
  49839. width: 2rem;
  49840. height: 2rem;
  49841. background-image: url("../img/ico_alarm3.svg");
  49842. background-size: cover!important;
  49843. }
  49844. }
  49845. .ico {
  49846. position: relative;
  49847. width: 1.625rem;
  49848. height: 1.625rem;
  49849. background: no-repeat center / 100%;
  49850. .dot {
  49851. position: absolute;
  49852. background: #E42325;
  49853. width: 0.44rem;
  49854. height: 0.44rem;
  49855. border-radius: 100%;
  49856. right: 0;
  49857. top: 0;
  49858. }
  49859. }
  49860. .alarm-detail {
  49861. position: absolute;
  49862. width: 8.75rem;
  49863. height: 4.44rem;
  49864. top: 3.00rem;
  49865. left: 50%;
  49866. display: flex;
  49867. align-items: center;
  49868. justify-content: space-between;
  49869. transform: translateX(-50%);
  49870. padding: 1.31rem 1.25rem 1rem 1.25rem;
  49871. background: url("../img/bg_tooltip.svg") no-repeat center / 100%;
  49872. strong {
  49873. color: #222222;
  49874. font-size: 0.81rem;
  49875. font-weight: 600;
  49876. }
  49877. .v-switch {
  49878. width: 2.25rem;
  49879. flex: 0 0 auto;
  49880. .v-switch__track {
  49881. background: #ECECEC;
  49882. height: 0.75rem;
  49883. width: 2.25rem;
  49884. opacity: 1;
  49885. }
  49886. .v-switch__thumb {
  49887. box-shadow: none;
  49888. background: #92989E;
  49889. width: 1.13rem;
  49890. height: 1.13rem;
  49891. }
  49892. .v-selection-control {
  49893. &.v-selection-control--dirty {
  49894. .v-switch__track {
  49895. background: #D7E4F1;
  49896. }
  49897. .v-switch__thumb {
  49898. background: #064f9e;
  49899. }
  49900. }
  49901. }
  49902. .v-selection-control__input {
  49903. &::before {
  49904. display: none;
  49905. }
  49906. }
  49907. .v-ripple__container {
  49908. display: none;
  49909. }
  49910. }
  49911. }
  49912. }
  49913. .btn-mode {
  49914. position: relative;
  49915. &.type1 {
  49916. .ico {
  49917. background-image: url("../img/ico_mode_white.svg");
  49918. }
  49919. }
  49920. &.type2 {
  49921. .ico {
  49922. background-image: url("../img/ico_mode_dark.svg");
  49923. }
  49924. }
  49925. .ico {
  49926. width: 1.625rem;
  49927. height: 1.625rem;
  49928. background: no-repeat center / 100%;
  49929. }
  49930. .mode-detail {
  49931. position: absolute;
  49932. top: 3rem;
  49933. left: 50%;
  49934. transform: translateX(-50%);
  49935. width: 12.63rem;
  49936. height: 9.75rem;
  49937. padding: 2.06rem 1.25rem 1.25rem 1.56rem;
  49938. background: url("../img/bg_tooltip2.svg") no-repeat center / 100%;
  49939. .custom-radio {
  49940. .v-input__control {
  49941. .v-selection-control-group {
  49942. gap: 0.94rem;
  49943. .v-radio {
  49944. position: relative;
  49945. height: 2.50rem;
  49946. margin: 0;
  49947. padding-left: 5.63rem;
  49948. flex: auto;
  49949. .v-selection-control__wrapper {
  49950. .v-selection-control__input {
  49951. width: 1.06rem;
  49952. height: 1.06rem;
  49953. .v-icon {
  49954. border-color: #c0c0c0;
  49955. &.mdi-radiobox-marked {
  49956. border-color: #007AFF;
  49957. background-color: #007AFF;
  49958. box-shadow: inset 0 0 0 0.13rem #fff
  49959. }
  49960. }
  49961. }
  49962. }
  49963. .v-label {
  49964. margin-left: 0.75rem;
  49965. .img {
  49966. position: absolute;
  49967. left: 0;
  49968. top: 0;
  49969. width: 4.38rem;
  49970. height: 2.5rem;
  49971. background: no-repeat center / 100%;
  49972. &.img1 {
  49973. background-image: url("../img/img_mode_white.svg");
  49974. }
  49975. &.img2 {
  49976. background-image: url("../img/img_mode_dark.svg");
  49977. }
  49978. }
  49979. strong {
  49980. color: #333333;
  49981. font-size: 0.75rem;
  49982. font-weight: 400;
  49983. }
  49984. }
  49985. }
  49986. }
  49987. }
  49988. }
  49989. }
  49990. }
  49991. .btn-lang {
  49992. position: relative;
  49993. width: 1.625rem;
  49994. height: 1.625rem;
  49995. .ico {
  49996. /*width: 2rem;
  49997. height: 2rem;
  49998. border: 0.06rem solid #fff;
  49999. background-color: #0B318B;
  50000. border-radius: 100%;
  50001. color: #fff;
  50002. display: flex;
  50003. align-items: center;
  50004. justify-content: center;
  50005. font-weight: 700;
  50006. font-size: 0.81rem;*/
  50007. &.KR {
  50008. background-image: url(../img/ico_lang_korea2.svg);
  50009. width: 1.625rem;
  50010. height: 1.625rem;
  50011. background-size: cover;
  50012. display: inline-block;
  50013. background-position: center;
  50014. }
  50015. &.EN {
  50016. background-image: url(../img/ico_lang_english.svg);
  50017. width: 1.625rem;
  50018. height: 1.625rem;
  50019. background-size: cover;
  50020. display: inline-block;
  50021. background-position: center;
  50022. }
  50023. }
  50024. .lang-detail {
  50025. position: absolute;
  50026. top: 3rem;
  50027. left: 50%;
  50028. width: 9.75rem;
  50029. height: 7.31rem;
  50030. transform: translateX(-50%);
  50031. background: url("../img/bg_tooltip3.svg") no-repeat center / 100%;
  50032. padding: 1.63rem 1.25rem 1.25rem 1.56rem;
  50033. .custom-radio {
  50034. .v-input__control {
  50035. .v-selection-control-group {
  50036. gap: 0.94rem;
  50037. .v-radio {
  50038. height: 1.63rem;
  50039. margin: 0;
  50040. .v-selection-control__wrapper {
  50041. .v-selection-control__input {
  50042. width: 1.06rem;
  50043. height: 1.06rem;
  50044. .v-icon {
  50045. border-color: #c0c0c0;
  50046. &.mdi-radiobox-marked {
  50047. border-color: #007AFF;
  50048. background-color: #007AFF;
  50049. box-shadow: inset 0 0 0 0.13rem #fff
  50050. }
  50051. }
  50052. }
  50053. }
  50054. .v-label {
  50055. margin-left: 0.75rem;
  50056. .img {
  50057. width: 1.63rem;
  50058. height: 1.63rem;
  50059. display: inline-block;
  50060. background: no-repeat center / 100%;
  50061. &.img1 {
  50062. background-image: url("../img/ico_lang_korea.svg");
  50063. }
  50064. &.img2 {
  50065. background-image: url("../img/ico_lang_english.svg");
  50066. }
  50067. }
  50068. strong {
  50069. color: #333333;
  50070. font-size: 0.75rem;
  50071. font-weight: 400;
  50072. margin-left: 0.63rem;
  50073. }
  50074. }
  50075. }
  50076. }
  50077. }
  50078. }
  50079. }
  50080. }
  50081. .divider {
  50082. width: 0.06rem;
  50083. height: 1.88rem;
  50084. margin: 0 0.815rem;
  50085. background: rgba(255, 255, 255, 0.5);
  50086. }
  50087. .user-info-wrap{
  50088. display: flex;
  50089. align-items: center;
  50090. .user-info {
  50091. display: flex;
  50092. position: relative;
  50093. .ico {
  50094. width: 1.625rem;
  50095. height: 1.625rem;
  50096. background: #fff;
  50097. border-radius: 100%;
  50098. color: #438DFF;
  50099. display: flex;
  50100. align-items: center;
  50101. justify-content: center;
  50102. font-weight: 700;
  50103. font-size: 1rem;
  50104. cursor: pointer;
  50105. }
  50106. .info-detail {
  50107. position: absolute;
  50108. top: 2.7rem;
  50109. left: 50%;
  50110. width: 11.88rem;
  50111. // height: 12.25rem;
  50112. padding: 1.25rem;
  50113. // background: url("../img/bg_tooltip4.svg") no-repeat center / 100%;
  50114. transform: translateX(-50%);
  50115. background: #FFF;
  50116. border:1px solid #ddd;
  50117. box-shadow:0px 4px 4px rgba(0, 0, 0, 0.20);
  50118. border-radius: 0.625rem;
  50119. &:after{
  50120. content: '';
  50121. display: block;
  50122. width: 0;
  50123. height: 0;
  50124. border-left: 0.40625rem solid transparent;
  50125. border-right: 0.40625rem solid transparent;
  50126. border-bottom: 0.6875rem solid #fff;
  50127. position: absolute;
  50128. top:-0.5875rem;
  50129. left:50%;
  50130. transform: translateX(-50%);
  50131. }
  50132. &:before{
  50133. content: '';
  50134. display: block;
  50135. width: 0;
  50136. height: 0;
  50137. border-left: 0.40625rem solid transparent;
  50138. border-right: 0.40625rem solid transparent;
  50139. border-bottom: 0.6875rem solid #ddd;
  50140. position: absolute;
  50141. top:-0.6875rem;
  50142. left:50%;
  50143. transform: translateX(-50%);
  50144. }
  50145. .custom--btn--wrap{
  50146. display: flex;
  50147. flex-direction: column;
  50148. gap:0.5rem;
  50149. }
  50150. p {
  50151. color: #111;
  50152. font-size: 0.94rem;
  50153. font-weight: 700;
  50154. margin-bottom: 0.94rem;
  50155. span {
  50156. font-weight: 600;
  50157. }
  50158. }
  50159. ul {
  50160. padding-bottom: 1.25rem;
  50161. margin-bottom: 0.94rem;
  50162. border-bottom: 0.06rem solid #e1e1e1;
  50163. display: flex;
  50164. flex-direction: column;
  50165. gap: 0.25rem;
  50166. li {
  50167. color: #444444;
  50168. font-size: 0.81rem;
  50169. font-weight: 400;
  50170. }
  50171. &.nw--btn--text--type{
  50172. gap:0.6rem;
  50173. border-bottom:0px;
  50174. }
  50175. }
  50176. .custom-btn.v-btn.v-btn--density-default {
  50177. border: 0.06rem solid #D0DDEA;
  50178. border-radius: 0.31rem;
  50179. width: 100%;
  50180. height: 2.5rem;
  50181. min-height: 2.5rem;
  50182. .v-btn__content {
  50183. color:#798592;
  50184. font-size: 0.75rem;
  50185. font-weight: 600;
  50186. letter-spacing: -0.01rem;
  50187. }
  50188. &:hover{
  50189. .v-btn__content {
  50190. color: #064F9E!important;
  50191. }
  50192. border: 0.06rem solid rgba(6, 79, 158, 0.5);
  50193. }
  50194. }
  50195. }
  50196. }
  50197. }
  50198. .user-name {
  50199. color: #fff;
  50200. font-size: 0.81rem;
  50201. padding: 0 0.815rem;
  50202. font-weight: 700;
  50203. cursor: pointer;
  50204. }
  50205. }
  50206. }
  50207. }
  50208. /**********************************************
  50209. | css 오버라이딩
  50210. **********************************************/
  50211. .ag-sort-indicator-icon{
  50212. background-image: url(../img/bg_login.svg);
  50213. }
  50214. .tbl-list-top {
  50215. margin-bottom: 1.25rem;
  50216. .total {
  50217. .total-num {
  50218. strong {
  50219. color: #444444;
  50220. font-size: 0.875rem;
  50221. font-weight: 400;
  50222. span {
  50223. color: #438dff;
  50224. font-size: 0.875rem;
  50225. font-weight: 700;
  50226. }
  50227. }
  50228. .total-slt {
  50229. &::before {
  50230. margin: 0 0.75rem;
  50231. background-color: #8e8e8e;
  50232. }
  50233. .custom-select {
  50234. &.v-input {
  50235. .v-input__control {
  50236. .v-field {
  50237. .v-field__field {
  50238. .v-field__input {
  50239. .v-select__selection {
  50240. margin-right: 0.5rem;
  50241. .page-list-item {
  50242. color: #444444;
  50243. font-size: 0.875rem;
  50244. font-weight: 700;
  50245. .page {
  50246. color: #444444;
  50247. font-weight: 400;
  50248. }
  50249. }
  50250. }
  50251. }
  50252. }
  50253. }
  50254. }
  50255. }
  50256. }
  50257. }
  50258. }
  50259. .grid-tit{
  50260. color: #222;
  50261. font-size: 0.9375rem;
  50262. font-style: normal;
  50263. margin-top: 1.2rem;
  50264. line-height: 2.25rem;
  50265. font-weight: 700;
  50266. letter-spacing: -0.00938rem;
  50267. text-transform: uppercase;
  50268. }
  50269. .total-btn {
  50270. .custom-btn {
  50271. &.v-btn {
  50272. &.v-btn--density-default {
  50273. &.btn-evt{
  50274. width: 7.8125rem;
  50275. border: 1px solid #afbece;
  50276. background-color: #ffffff;
  50277. .v-btn__content{
  50278. color: #6F8AA6;
  50279. .ico{
  50280. background-image: url(../img/ico_cal.svg);
  50281. width: 1.125rem;
  50282. height: 1.125rem;
  50283. background-size: cover;
  50284. }
  50285. }
  50286. &.v-btn--disabled{
  50287. background-color: #fbfbfb!important;
  50288. border: 1px solid #e0e0e0;
  50289. .v-btn__content{
  50290. color: #E0E0E0!important;
  50291. .ico{
  50292. background-image: url(../img/ico_cal_dis.svg);
  50293. width: 1.125rem;
  50294. height: 1.125rem;
  50295. background-size: cover;
  50296. }
  50297. }
  50298. }
  50299. }
  50300. &.btn-del {
  50301. background-color: #6f8aa6;
  50302. width: 5.25rem;
  50303. &:hover {
  50304. background-color: #adbfd2;
  50305. box-shadow: 1px 1px 4px 0px rgba(0, 0, 0, 0.15);
  50306. }
  50307. .v-btn__content {
  50308. font-size: 0.875rem;
  50309. font-weight: 600;
  50310. .ico {
  50311. margin-right: 0.375rem;
  50312. }
  50313. }
  50314. &.v-btn--disabled {
  50315. .v-btn__content {
  50316. .ico {
  50317. background-image: url(../img/ico_del_disabled.svg);
  50318. }
  50319. }
  50320. }
  50321. }
  50322. &.v-btn--disabled {
  50323. background: #e0e0e0 !important;
  50324. .v-btn__content {
  50325. color: #8e8e8e !important;
  50326. }
  50327. }
  50328. }
  50329. }
  50330. }
  50331. .custom-check {
  50332. &.v-input {
  50333. &.type2 {
  50334. .v-input__control {
  50335. .v-selection-control {
  50336. .v-label {
  50337. padding-left: 0.37rem;
  50338. color: #444444;
  50339. font-size: 0.875rem;
  50340. font-weight: 500;
  50341. span{
  50342. color: #111111;
  50343. font-weight: 700;
  50344. }
  50345. }
  50346. .v-selection-control__wrapper{
  50347. .v-selection-control__input{
  50348. .v-icon{
  50349. background-size: cover;
  50350. }
  50351. }
  50352. }
  50353. }
  50354. }
  50355. }
  50356. }
  50357. }
  50358. }
  50359. }
  50360. .excel-search {
  50361. gap: 0.5rem;
  50362. .custom-btn {
  50363. &.v-btn {
  50364. &.v-btn--density-default {
  50365. &.btn-excel {
  50366. width: 8.56rem;
  50367. border-radius: 0.5rem;
  50368. background-color: #ffffff;
  50369. .v-btn__content {
  50370. font-size: 0.875rem;
  50371. }
  50372. &.v-btn--disabled {
  50373. background-color: #fbfbfb !important;
  50374. border: 1px solid #e0e0e0 !important;
  50375. .v-btn__content {
  50376. color: #e0e0e0 !important;
  50377. .ico {
  50378. background-image: url(../img/ico_excel_d.svg);
  50379. }
  50380. }
  50381. &.up {
  50382. .v-btn__content {
  50383. .ico {
  50384. background-image: url(../img/ico_excel_d.svg) !important;
  50385. }
  50386. }
  50387. }
  50388. }
  50389. }
  50390. }
  50391. }
  50392. }
  50393. .custom-input {
  50394. .v-input__control {
  50395. .v-field__field {
  50396. .v-field__input {
  50397. width: 17.3125rem;
  50398. padding-left: 0.75rem;
  50399. font-size: 0.75rem !important;
  50400. font-weight: 400 !important;
  50401. &::placeholder {
  50402. font-size: 0.75rem;
  50403. font-weight: 400;
  50404. color: #8e8e8e;
  50405. }
  50406. }
  50407. }
  50408. }
  50409. }
  50410. }
  50411. }
  50412. .view-btm-btn {
  50413. >div {
  50414. gap: 0.5rem;
  50415. }
  50416. .custom-btn {
  50417. &.v-btn {
  50418. &.v-btn--density-default {
  50419. width: 5.25rem;
  50420. height: 2.25rem;
  50421. &.btn-list {
  50422. width: 5.25rem;
  50423. height: 2.25rem;
  50424. border: 1px solid #e0e0e0;
  50425. .v-btn__content {
  50426. color: #8e8e8e;
  50427. font-size: 0.875rem;
  50428. font-weight: 600;
  50429. .ico {
  50430. width: 1.25rem;
  50431. height: 1.25rem;
  50432. margin-right: 0.38rem;
  50433. background-image: url(../img/ico_view_list2.svg);
  50434. }
  50435. }
  50436. &:hover {
  50437. box-shadow: 1px 1px 4px 0px rgba(0, 0, 0, 0.15);
  50438. }
  50439. }
  50440. &.btn-del {
  50441. width: 5.25rem;
  50442. height: 2.25rem;
  50443. border: none;
  50444. background: #6F8AA6;
  50445. .v-btn__content {
  50446. color: #ffffff;
  50447. font-size: 0.875rem;
  50448. font-weight: 600;
  50449. .ico {
  50450. width: 1.125rem;
  50451. height: 1.125rem;
  50452. margin-right: 0.38rem;
  50453. background-image: url(../img/ico_del2.svg);
  50454. }
  50455. }
  50456. &:hover {
  50457. background: #adbfd2;
  50458. box-shadow: 1px 1px 4px 0px rgba(0, 0, 0, 0.15);
  50459. }
  50460. &.v-btn--disabled {
  50461. background-color: #e0e0e0 !important;
  50462. .v-btn__content {
  50463. color: #8e8e8e !important;
  50464. .ico {
  50465. background-image: url(../img/ico_del_disabled2.svg);
  50466. }
  50467. }
  50468. }
  50469. }
  50470. &.btn-gray-bor2 {
  50471. background-color: #6f8aa6;
  50472. border: none;
  50473. .v-btn__content {
  50474. color: #ffffff;
  50475. .ico {
  50476. width: 1.25rem;
  50477. margin-right: 0.38rem;
  50478. height: 1.25rem;
  50479. background-image: url(../img/ico_cancel.svg);
  50480. }
  50481. }
  50482. &:hover {
  50483. background-color: #adbfd2;
  50484. box-shadow: 1px 1px 4px 0px rgba(0, 0, 0, 0.15);
  50485. }
  50486. &.v-btn--disabled {
  50487. background-color: #e0e0e0 !important;
  50488. border: none;
  50489. .v-btn__content {
  50490. color: #8E8E8E !important;
  50491. .ico {
  50492. background-image: url(../img/ico_cancel_disabled.svg);
  50493. }
  50494. }
  50495. }
  50496. }
  50497. &.btn-blue2 {
  50498. background-color: #438dff;
  50499. &:hover {
  50500. background: #90BCFF;
  50501. box-shadow: 1px 1px 4px 0px rgba(0, 0, 0, 0.15);
  50502. }
  50503. &.v-btn--disabled {
  50504. background-color: #e0e0e0 !important;
  50505. .v-btn__content {
  50506. color: #8e8e8e !important;
  50507. .ico {
  50508. background-image: url(../img/ico_save_disabled.svg);
  50509. }
  50510. }
  50511. }
  50512. .v-btn__content {
  50513. .ico {
  50514. width: 1.25rem;
  50515. height: 1.25rem;
  50516. margin-right: 0.37rem;
  50517. background-image: url(../img/ico_save.svg);
  50518. }
  50519. }
  50520. }
  50521. }
  50522. }
  50523. }
  50524. }
  50525. .custom-dialog {
  50526. border-radius: 0.5rem;
  50527. .modal-desc {
  50528. padding: 1.25rem;
  50529. >strong {
  50530. color: #000000;
  50531. font-weight: 500;
  50532. font-size: 0.875rem;
  50533. line-height: 0.875rem;
  50534. }
  50535. }
  50536. .modal-desc2 {
  50537. padding: 0.65rem 1.25rem 0.65rem 1.25rem;
  50538. ul {
  50539. li {
  50540. padding-left: 1.2rem;
  50541. position: relative;
  50542. color: #555555;
  50543. font-size: 0.875rem;
  50544. font-weight: 400;
  50545. margin-bottom: 1rem;
  50546. &:last-child {
  50547. margin-bottom: 0;
  50548. }
  50549. &::before {
  50550. width: 0.2rem;
  50551. height: 0.2rem;
  50552. display: inline-block;
  50553. background-color: #555555;
  50554. position: absolute;
  50555. width: 0.31rem;
  50556. height: 0.31rem;
  50557. left: 0;
  50558. top: 0.38rem;
  50559. background: #C0C0C0;
  50560. border-radius: 100%;
  50561. content: "";
  50562. }
  50563. }
  50564. }
  50565. }
  50566. .modal-tit {
  50567. height: 4rem;
  50568. padding: 1.25rem;
  50569. border-bottom: none;
  50570. >strong {
  50571. font-size: 1rem;
  50572. color: #000000;
  50573. font-weight: 700;
  50574. letter-spacing: -0.02rem;
  50575. }
  50576. .modal--btn--wrap{
  50577. display: flex;
  50578. margin-left: auto;
  50579. gap: 1.25rem;
  50580. .btn-bar{
  50581. width: 1.5rem;
  50582. height: 1.5rem;
  50583. background-size: cover;
  50584. background-image: url(../img/ico_bar.svg);
  50585. }
  50586. .btn-square{
  50587. width: 1.5rem;
  50588. height: 1.5rem;
  50589. background-size: cover;
  50590. background-image: url(../img/ico_square.svg);
  50591. }
  50592. }
  50593. .btn-close {
  50594. background-image: url(../img/ico_close.svg);
  50595. }
  50596. }
  50597. .v-common-dialog-content {
  50598. padding: 0.38rem 1.25rem 1.25rem 1.25rem;
  50599. .info-mod {
  50600. padding-bottom: 0;
  50601. .mod-txt {
  50602. font-size: 0.9375rem;
  50603. margin-top: 1.56rem;
  50604. margin-bottom: 1.94rem;
  50605. }
  50606. .txt-field-box {
  50607. .custom-input {
  50608. &.v-text-field {
  50609. min-height: 2.25rem;
  50610. .v-input__control {
  50611. height: 2.25rem;
  50612. .v-field__field {
  50613. .v-field__input {
  50614. height: 2.25rem;
  50615. min-height: 2.25rem;
  50616. padding: 0 0.75rem;
  50617. }
  50618. }
  50619. }
  50620. }
  50621. }
  50622. }
  50623. .error-txt {
  50624. margin: 0.8rem 0 0 !important;
  50625. }
  50626. }
  50627. .txt-field-box {
  50628. &.error {
  50629. .ico {
  50630. right: 0.75rem;
  50631. }
  50632. }
  50633. }
  50634. .otp-reg {
  50635. margin-top: 0;
  50636. .otp-set-step{
  50637. .otp-set-box{
  50638. .tit{
  50639. .num{
  50640. background-color: #0B318B;
  50641. }
  50642. }
  50643. }
  50644. }
  50645. .otp-box {
  50646. .otp-certify {
  50647. background-color: #F1F7FF;
  50648. border-radius: 0.5rem;
  50649. border: none;
  50650. padding: 1.38rem 0;
  50651. .error-txt {
  50652. width: 15.625rem;
  50653. }
  50654. .certify-logo {
  50655. display: flex;
  50656. gap: 0.75rem;
  50657. margin-bottom: 0.94rem;
  50658. .logo {
  50659. width: 1.625rem;
  50660. height: 1.625rem;
  50661. background-image: url(../img/ico_logo.svg);
  50662. background-size: cover;
  50663. }
  50664. >p {
  50665. color: #333;
  50666. font-size: 0.9375rem;
  50667. font-style: normal;
  50668. font-weight: 700;
  50669. line-height: 100%;
  50670. /* 0.9375rem */
  50671. }
  50672. }
  50673. z
  50674. .txt-field-box {
  50675. width: 15.625remf;
  50676. &:nth-child(3) {
  50677. margin-bottom: 0;
  50678. }
  50679. .v-input {
  50680. &.v-text-field {
  50681. &.custom-input {
  50682. &.mini {
  50683. min-height: 2.25rem;
  50684. .v-input__control {
  50685. height: 2.25rem;
  50686. .v-field__field {
  50687. .v-field__input {
  50688. height: 2.25rem;
  50689. min-height: 2.25rem;
  50690. padding: 0 0.75rem;
  50691. }
  50692. }
  50693. }
  50694. }
  50695. }
  50696. }
  50697. }
  50698. }
  50699. .custom-btn {
  50700. &.v-btn {
  50701. &.v-btn--density-default {
  50702. &.btn-blue-bor {
  50703. width: 15.625rem;
  50704. background-color: #0B318B;
  50705. border-radius: 0.5rem;
  50706. border: none;
  50707. &:hover {
  50708. background-color: #4875DE !important;
  50709. box-shadow: 1px 1px 10px 0px rgba(0, 0, 0, 0.20);
  50710. }
  50711. .v-btn__content {
  50712. font-size: 0.9375rem !important;
  50713. font-weight: 700 !important;
  50714. letter-spacing: -0.02813rem !important;
  50715. color: #ffffff;
  50716. }
  50717. &.v-btn--disabled {
  50718. background-color: #e0e0e0 !important;
  50719. .v-btn__content {
  50720. color: #8e8e8e !important;
  50721. }
  50722. }
  50723. }
  50724. }
  50725. }
  50726. }
  50727. .otp--certify--2{
  50728. width: 100%;
  50729. display: flex;
  50730. align-items: center;
  50731. flex-direction: column;
  50732. justify-content: center;
  50733. >p{
  50734. color: #0B318B;
  50735. text-align: center;
  50736. font-size: 1.125rem;
  50737. font-weight: 700;
  50738. margin-bottom: 0.94rem;
  50739. letter-spacing: -0.01125rem;
  50740. }
  50741. >span{
  50742. color: #444;
  50743. text-align: center;
  50744. font-size: 0.9375rem;
  50745. font-weight: 400;
  50746. letter-spacing: -0.00938rem;
  50747. display: inline-block;
  50748. margin-bottom: 1.87rem;
  50749. }
  50750. .txt-field-box{
  50751. display: flex;
  50752. align-items: center;
  50753. width: 80%;
  50754. justify-content: center;
  50755. gap: 0.6rem;
  50756. .v-btn {
  50757. &.v-btn--density-default {
  50758. margin-top: 0;
  50759. &.btn-password {
  50760. background-color: #6f8aa6;
  50761. height: 2.25rem;
  50762. width: 6.875rem;
  50763. &.v-btn--disabled {
  50764. background-color: #fff !important;
  50765. border: 1px solid #CCC;
  50766. .v-btn__content {
  50767. color: #8e8e8e !important;
  50768. }
  50769. }
  50770. }
  50771. &.btn-blue{
  50772. width: 3.5rem;
  50773. height: 2.25rem;
  50774. &.v-btn--disabled {
  50775. background-color: #e0e0e0 !important;
  50776. .v-btn__content {
  50777. color: #8e8e8e !important;
  50778. }
  50779. }
  50780. }
  50781. }
  50782. }
  50783. }
  50784. .error-txt{
  50785. width: 80%;
  50786. }
  50787. }
  50788. .otp--certify--y{
  50789. padding: 2.37rem 0;
  50790. display: flex;
  50791. flex-direction: column;
  50792. gap: 1.88rem;
  50793. align-items: center;
  50794. justify-content: center;
  50795. .ico{
  50796. width: 5rem;
  50797. height: 5rem;
  50798. border-radius: 50%;
  50799. background-color: #fff;
  50800. background-position: center;
  50801. background-size: 2.25rem 3rem;
  50802. background-image: url(../img/ico_certify_y2.svg);
  50803. }
  50804. > p{
  50805. color: #000;
  50806. font-size: 0.9375rem;
  50807. font-style: normal;
  50808. font-weight: 500;
  50809. line-height: 100%;
  50810. letter-spacing: -0.00938rem;
  50811. > span{
  50812. color: #034ea2;
  50813. font-size: 0.9375rem;
  50814. font-style: normal;
  50815. font-weight: 500;
  50816. line-height: 100%;
  50817. letter-spacing: -0.00938rem;
  50818. }
  50819. }
  50820. }
  50821. }
  50822. .otp-chk{
  50823. .v-input{
  50824. .v-input__control{
  50825. .v-selection-control{
  50826. .v-label{
  50827. padding-left: 0.38rem;
  50828. }
  50829. .v-selection-control__wrapper{
  50830. .v-selection-control__input{
  50831. .v-icon{
  50832. background-size: cover;
  50833. }
  50834. }
  50835. }
  50836. }
  50837. }
  50838. }
  50839. }
  50840. .otp-reg-step{
  50841. ul{
  50842. li{
  50843. .numbering{
  50844. border-radius: 6.25rem;
  50845. }
  50846. }
  50847. }
  50848. }
  50849. }
  50850. }
  50851. .form-style1 {
  50852. &.shadow--type {
  50853. border-radius: 0.5rem;
  50854. background: #FFF;
  50855. box-shadow: 0px 0px 6px 0px rgba(0, 0, 0, 0.15);
  50856. padding: 1.25rem;
  50857. &.col4 {
  50858. margin-top: 0px;
  50859. }
  50860. table {
  50861. tbody {
  50862. tr {
  50863. border-top: 1px solid #e0e0e0;
  50864. th {
  50865. padding: 0.62rem;
  50866. color: #444444;
  50867. font-size: 0.875rem;
  50868. .cir {
  50869. width: 0.3125rem;
  50870. height: 0.3125rem;
  50871. display: inline-block;
  50872. background-color: #ff4f60;
  50873. border-radius: 50%;
  50874. margin-left: 0.37rem;
  50875. vertical-align: 2px;
  50876. }
  50877. }
  50878. td {
  50879. padding: 0.62rem;
  50880. color: #444444;
  50881. font-size: 0.875rem;
  50882. &.critical{
  50883. color:#E1473D;
  50884. }
  50885. &.major{
  50886. color:#438DFF;
  50887. }
  50888. &.minor{
  50889. color:#848BA4;
  50890. }
  50891. .custom-btn {
  50892. &.v-btn {
  50893. &.v-btn--density-default {
  50894. &.btn-password {
  50895. background: #6f8aa6;
  50896. height: 2.25rem;
  50897. width: 6.875rem;
  50898. }
  50899. &.btn-black {
  50900. background: #6f8aa6;
  50901. font-weight: 600 !important;
  50902. &.v-btn--disabled {
  50903. background-color: #e0e0e0 !important;
  50904. .v-btn__content {
  50905. color: #8e8e8e !important;
  50906. }
  50907. }
  50908. }
  50909. }
  50910. }
  50911. }
  50912. .custom-input {
  50913. .v-input__control {
  50914. height: 2.25rem;
  50915. .v-field__field {
  50916. .v-field__input {
  50917. padding: 0 0.75rem;
  50918. &::placeholder {
  50919. color: #8e8e8e;
  50920. font-weight: 400;
  50921. }
  50922. }
  50923. }
  50924. }
  50925. &.v-text-field {
  50926. &.mini2 {
  50927. min-height: 2.25rem;
  50928. .v-input__control {
  50929. height: 2.25rem;
  50930. .v-field__field {
  50931. .v-field__input {
  50932. padding: 0 0.75rem;
  50933. color: #000000;
  50934. height: 2.25rem;
  50935. font-size: 0.875rem;
  50936. font-weight: 400;
  50937. min-height: 2.25rem;
  50938. &::placeholder {
  50939. color: #8e8e8e;
  50940. font-size: 0.875rem;
  50941. font-weight: 400;
  50942. }
  50943. }
  50944. }
  50945. }
  50946. }
  50947. }
  50948. }
  50949. }
  50950. }
  50951. }
  50952. }
  50953. }
  50954. }
  50955. .alert-txt{
  50956. .color--red{
  50957. color: #E1473D;
  50958. font-weight: 700;
  50959. }
  50960. }
  50961. &.type--l{
  50962. padding: 1.25rem;
  50963. .agree--contents{
  50964. height: calc(100vh - 30rem);
  50965. overflow-y: auto;
  50966. &.border--top{
  50967. border-top: 1px solid #e8e8e8;
  50968. }
  50969. }
  50970. }
  50971. &.chart{
  50972. max-height: calc(100vh - 10rem);
  50973. padding: 0 1.25rem 1.25rem 1.25rem;
  50974. .dialog-chart-tab{
  50975. padding-bottom: 1.25rem;
  50976. display: flex;
  50977. justify-content: flex-start;
  50978. .v-input{
  50979. flex: none;
  50980. margin-right: 1.88rem;
  50981. }
  50982. .v-selection-control-group{
  50983. gap: 0.63rem;
  50984. display: flex;
  50985. flex-direction: row;
  50986. .v-selection-control{
  50987. width: 5.1875rem;
  50988. height: 2.25rem;
  50989. flex: none;
  50990. background-color: black;
  50991. text-align: center;
  50992. border-radius: 0.375rem;
  50993. background-color: #E0E0E0;
  50994. color: #8e8e8e;
  50995. &.v-selection-control--dirty{
  50996. background-color: #6F8AA6;
  50997. color: #ffffff;
  50998. }
  50999. }
  51000. .v-selection-control__wrapper{
  51001. display: none;
  51002. }
  51003. .v-label{
  51004. width: 100%;
  51005. display: flex;
  51006. justify-content: center;
  51007. opacity: 1;
  51008. font-size: 0.875rem;
  51009. font-weight: 500;
  51010. }
  51011. }
  51012. .total-wrap{
  51013. display: flex;
  51014. gap: 0.1rem;
  51015. margin-right: 1.87rem;
  51016. color: #8E8E8E;
  51017. font-size: 0.8125rem;
  51018. font-style: normal;
  51019. align-items: center;
  51020. font-weight: 400;
  51021. span{
  51022. color: #438DFF;
  51023. font-weight: 900;
  51024. }
  51025. }
  51026. .btn-wrap{
  51027. padding: 0;
  51028. gap: 0.5rem;
  51029. .v-input{
  51030. margin-right: 0;
  51031. }
  51032. .custom-btn{
  51033. &.btn-list{
  51034. width: 2.25rem;
  51035. height: 2.25rem;
  51036. min-width: 2.25rem;
  51037. background: #ffffff;
  51038. border: 1px solid #d9d9d9;
  51039. .v-btn__content{
  51040. .ico{
  51041. width: 1.25rem;
  51042. background-size: cover;
  51043. height: 1.25rem;
  51044. background-image: url(../img/ico_list.svg);
  51045. }
  51046. }
  51047. &.active{
  51048. background: #438DFF;
  51049. .v-btn__content{
  51050. .ico{
  51051. background-image: url(../img/ico_list_white.svg);
  51052. }
  51053. }
  51054. }
  51055. }
  51056. }
  51057. &.trend--list--wrap{
  51058. position: relative;
  51059. .trend--list--pop{
  51060. position: absolute;
  51061. z-index: 100;
  51062. width: 26.375rem;
  51063. top: 3rem;
  51064. background-color: #ffffff;
  51065. box-shadow: 0px 0px 6px 0px rgba(0, 0, 0, 0.15);
  51066. border-radius: 0.625rem;
  51067. .modal-tit{
  51068. height: 3.125rem;
  51069. .btn-close{
  51070. &.mini{
  51071. width: 1rem;
  51072. height: 1rem;
  51073. }
  51074. }
  51075. }
  51076. .modal-cont{
  51077. padding: 0.94rem 1.25rem;
  51078. height: 60vh;
  51079. overflow-y: auto;
  51080. display: grid;
  51081. grid-template-columns: repeat(2, 1fr); /* 2열 레이아웃 */
  51082. gap: 0.62rem;
  51083. align-content: start;
  51084. .custom-check{
  51085. &.v-input{
  51086. width: 100%;
  51087. height: 2.5rem;
  51088. display: inline-block;
  51089. border-radius: 0.3125rem;
  51090. border: 1px solid #DFDFDF;
  51091. &.type3{
  51092. .v-input__control{
  51093. width: 100%;
  51094. padding: 0 0.94rem;
  51095. height: 2.5rem;
  51096. .v-checkbox-btn{
  51097. }
  51098. .v-label{
  51099. width: 100%;
  51100. display: inline-block;
  51101. }
  51102. .v-selection-control{
  51103. .v-selection-control__wrapper{
  51104. .v-selection-control__input{
  51105. .v-icon{
  51106. background-size: cover;
  51107. background-image: url(../img/ico_chk_off.svg);
  51108. min-width: 1rem;
  51109. width: 1rem;
  51110. height: 1rem;
  51111. border: 0;
  51112. &.mdi-checkbox-marked{
  51113. background-image: url(../img/ico_chk_on.svg);
  51114. }
  51115. }
  51116. }
  51117. }
  51118. }
  51119. }
  51120. }
  51121. }
  51122. }
  51123. }
  51124. .btn-wrap{
  51125. padding: 1.25rem;
  51126. }
  51127. }
  51128. }
  51129. }
  51130. }
  51131. .dialog-chart-wrap{
  51132. display: flex;
  51133. flex-direction: column;
  51134. gap: 1rem;
  51135. overflow-y: auto;
  51136. height: 75vh;
  51137. .dialog-chart{
  51138. display: flex;
  51139. justify-content: space-between;
  51140. flex-direction: row;
  51141. width: 100%;
  51142. // height: calc((100vh - 10rem) / 3);
  51143. height: 25vh;
  51144. gap: 1.25rem;
  51145. .chart-wrap{
  51146. height: 100%;
  51147. width: calc(100% / 3);
  51148. gap: 2.5rem;
  51149. border-radius: 0.625rem;
  51150. border: 1px solid #efefef;
  51151. flex-direction: column;
  51152. padding: 1.2rem 1.2rem 0 1.2rem;
  51153. &::after{
  51154. display: none;
  51155. }
  51156. .chart-total{
  51157. margin: 0;
  51158. p{
  51159. width: 100%;
  51160. }
  51161. .ico{
  51162. width: 0.875rem;
  51163. height: 0.875rem;
  51164. background-image: url(../img/ico_set.svg);
  51165. display: inline-block;
  51166. background-size: cover;
  51167. cursor: pointer;
  51168. float: right;
  51169. }
  51170. }
  51171. .chart-con{
  51172. width: 100%;
  51173. height: 80%;
  51174. .chart-wrap-fix{
  51175. left: 1rem;
  51176. top: auto;
  51177. > div{
  51178. }
  51179. }
  51180. .chart-in{
  51181. height: 100%;
  51182. z-index: 10;
  51183. position: relative;
  51184. > div{
  51185. height: 100%;
  51186. }
  51187. .chart--legend{
  51188. height: auto;
  51189. display: flex;
  51190. position: absolute;
  51191. right: 50%;
  51192. transform: translateX(50%);
  51193. top: -1.25rem;
  51194. .legend{
  51195. display: flex;
  51196. align-items: center;
  51197. .line{
  51198. margin-left: 1.25rem;
  51199. width: 0.9375rem;
  51200. height: 0.1875rem;
  51201. border-radius: 6.25rem;
  51202. display: inline-block;
  51203. }
  51204. p{
  51205. color: #333;
  51206. font-size: 0.8125rem;
  51207. font-style: normal;
  51208. margin-left: 0.75rem;
  51209. font-weight: 400;
  51210. letter-spacing: -0.00813rem;
  51211. }
  51212. &:first-child{
  51213. .line{
  51214. background-color: #FF531E;
  51215. }
  51216. }
  51217. &:nth-child(2){
  51218. .line{
  51219. background-color: #44C5FF;
  51220. }
  51221. }
  51222. &:nth-child(3){
  51223. .line{
  51224. background-color: #FF00C7;
  51225. }
  51226. }
  51227. &:nth-child(4){
  51228. .line{
  51229. background-color: #AF70FF;
  51230. }
  51231. }
  51232. &:nth-child(5){
  51233. .line{
  51234. background-color: #4862FF;
  51235. }
  51236. }
  51237. }
  51238. }
  51239. }
  51240. }
  51241. }
  51242. }
  51243. }
  51244. }
  51245. .core--list--component{
  51246. h2{
  51247. &.fw--500{
  51248. font-weight: 500;
  51249. > span{
  51250. font-weight: 700;
  51251. }
  51252. &.mb--125rem{
  51253. margin-bottom: 1.25rem;
  51254. }
  51255. }
  51256. }
  51257. .event--stat{
  51258. padding-top: 1.25rem;
  51259. display: flex;
  51260. gap: 0.62rem;
  51261. justify-content: space-between;
  51262. > li{
  51263. width: 100%;
  51264. border-radius: 62.5rem;
  51265. height: 2.375rem;
  51266. color: #ffffff;
  51267. font-size: 0.8125rem;
  51268. font-weight: 500;
  51269. padding: 0 1.12rem;
  51270. display: flex;
  51271. align-items: center;
  51272. line-height: 2.375rem;
  51273. .ico{
  51274. background-image: url(../img/ic_tenant01.svg);
  51275. margin-right: 0.62rem;
  51276. width: 1rem;
  51277. display: inline-block;
  51278. background-repeat: no-repeat;
  51279. background-size: cover;
  51280. background-position: center;
  51281. height: 1rem;
  51282. }
  51283. span{
  51284. &:last-child{
  51285. margin-left: auto;
  51286. font-weight: 900;
  51287. }
  51288. }
  51289. &.critical{
  51290. background-color: #E1473D;
  51291. }
  51292. &.major{
  51293. background-color: #438DFF;
  51294. }
  51295. &.minor{
  51296. background-color: #C3C8D8;
  51297. }
  51298. &.disconnected{
  51299. background-color: #fff;
  51300. border: 1px solid #ffc7c3;
  51301. color: #333333;
  51302. .ico{
  51303. background-image: url(../img/ico_ban.svg);
  51304. }
  51305. span{
  51306. &:last-child{
  51307. color: #E1473D;
  51308. }
  51309. }
  51310. }
  51311. }
  51312. }
  51313. .map--area{
  51314. border-radius: 0.9375rem;
  51315. border: 1px solid #DFDFDF;
  51316. overflow: hidden;
  51317. height: 12rem;
  51318. position: relative;
  51319. .side--title{
  51320. position: absolute;
  51321. border-radius: 0.4375rem;
  51322. border: 1px solid #848484;
  51323. background: rgba(0, 0, 0, 0.50);
  51324. top: 0.94rem;
  51325. left: 0.94rem;
  51326. padding: 0.5rem 0.75rem;
  51327. color: #ffffff;
  51328. text-align: center;
  51329. font-size: 0.75rem;
  51330. font-weight: 500;
  51331. }
  51332. .area--info{
  51333. position: absolute;
  51334. padding: 1rem 1.25rem;
  51335. border-radius: 0.625rem;
  51336. border: 1px solid #E3E3E3;
  51337. width: 12.5rem;
  51338. background: #FFF;
  51339. .area--info--title{
  51340. display: flex;
  51341. justify-content: space-between;
  51342. margin-bottom: 1rem;
  51343. p{
  51344. color: #222;
  51345. font-size: 0.9375rem;
  51346. font-weight: 700;
  51347. }
  51348. .btn-close{
  51349. background-image: url(/_nuxt/assets/img/ico_close_gray.svg);
  51350. width: 1rem;
  51351. height: 1rem;
  51352. background-repeat: no-repeat;
  51353. background-size: cover;
  51354. }
  51355. }
  51356. ul{
  51357. display: flex;
  51358. flex-direction: column;
  51359. gap: 0.3rem;
  51360. li{
  51361. display: flex;
  51362. align-items: center;
  51363. .ico{
  51364. width: 0.625rem;
  51365. height: 0.625rem;
  51366. border-radius: 50%;
  51367. display: inline-block;
  51368. margin-right: 0.5rem;
  51369. &.green{
  51370. background-color: #55E074;
  51371. }
  51372. &.red{
  51373. background-color: #E1473D;
  51374. }
  51375. }
  51376. span{
  51377. &:nth-child(2){
  51378. color: #222;
  51379. font-size: 0.75rem;
  51380. font-weight: 500;
  51381. }
  51382. &:nth-child(3){
  51383. color: #222;
  51384. font-size: 0.75rem;
  51385. font-weight: 400;
  51386. margin-left: auto;
  51387. &.active{
  51388. font-weight: 700;
  51389. }
  51390. }
  51391. }
  51392. }
  51393. }
  51394. }
  51395. &.big--map{
  51396. height: 22rem;
  51397. }
  51398. }
  51399. }
  51400. .core--list--component--grid{
  51401. .title{
  51402. h2{
  51403. font-weight: 500;
  51404. span{
  51405. font-weight: 700;
  51406. }
  51407. }
  51408. }
  51409. }
  51410. }
  51411. .btn-wrap {
  51412. justify-content: flex-end;
  51413. padding: 1.25rem 1.25rem 1.25rem 1.25rem;
  51414. .custom-btn {
  51415. &.v-btn {
  51416. &.v-btn--density-default {
  51417. width: 5.25rem;
  51418. height: 2.25rem;
  51419. border: none;
  51420. &.btn-blue {
  51421. &:hover {
  51422. box-shadow: 1px 1px 4px 0px rgba(0, 0, 0, 0.15);
  51423. }
  51424. &.v-btn--disabled {
  51425. background: #e0e0e0 !important;
  51426. .v-btn__content {
  51427. color: #8e8e8e !important;
  51428. .ico {
  51429. background-image: url(../img/ico_chk_circle_disabled.svg);
  51430. }
  51431. }
  51432. }
  51433. .v-btn__content {
  51434. .ico {
  51435. width: 1.25rem;
  51436. height: 1.25rem;
  51437. margin-right: 0.37rem;
  51438. background-image: url(../img/ico_chk_circle.svg);
  51439. background-repeat: no-repeat;
  51440. background-size: cover;
  51441. background-position: center;
  51442. }
  51443. }
  51444. &.btn-id {
  51445. width: 7.5625rem;
  51446. .ico {
  51447. background-image: url(../img/ico_id_on.svg);
  51448. width: 1.125rem;
  51449. height: 1.125rem;
  51450. }
  51451. &.v-btn--disabled {
  51452. .ico {
  51453. background-image: url(../img/ico_id_off.svg);
  51454. }
  51455. }
  51456. }
  51457. &.btn-pw {
  51458. width: 9.1875rem;
  51459. .ico {
  51460. background-image: url(../img/ico_id_on.svg);
  51461. width: 1.125rem;
  51462. height: 1.125rem;
  51463. }
  51464. &.v-btn--disabled {
  51465. .ico {
  51466. background-image: url(../img/ico_id_off.svg);
  51467. }
  51468. }
  51469. }
  51470. &.btn-ext{
  51471. .v-btn__content{
  51472. .ico{
  51473. background-image: url(../img/ico_time.svg);
  51474. }
  51475. }
  51476. &.v-btn--disabled {
  51477. .ico {
  51478. background-image: url(../img/ico_time_disabled.svg);
  51479. }
  51480. }
  51481. }
  51482. }
  51483. &.btn-pink{
  51484. background-color: #F74F78;
  51485. }
  51486. &.btn-white {
  51487. background-color: #6f8aa6;
  51488. &:hover {
  51489. background-color: #adbfd2;
  51490. box-shadow: 1px 1px 4px 0px rgba(0, 0, 0, 0.15);
  51491. }
  51492. &.v-btn--disabled {
  51493. background: #e0e0e0 !important;
  51494. .v-btn__content {
  51495. color: #8e8e8e !important;
  51496. .ico {
  51497. background-image: url(../img/ico_cancel_disabled.svg);
  51498. }
  51499. }
  51500. }
  51501. .v-btn__content {
  51502. color: #ffffff;
  51503. .ico {
  51504. width: 1.25rem;
  51505. height: 1.25rem;
  51506. margin-right: 0.37rem;
  51507. background-image: url(../img/ico_cancel.svg);
  51508. background-repeat: no-repeat;
  51509. background-size: cover;
  51510. background-position: center;
  51511. }
  51512. }
  51513. }
  51514. &.btn-blue2 {
  51515. background-color: #438dff;
  51516. &.btn-mod{
  51517. .v-btn__content {
  51518. .ico{
  51519. background-image: url(../img/ico_mod2.svg);
  51520. }
  51521. }
  51522. }
  51523. &:hover {
  51524. background: #90BCFF;
  51525. box-shadow: 1px 1px 4px 0px rgba(0, 0, 0, 0.15);
  51526. }
  51527. &.v-btn--disabled {
  51528. background-color: #e0e0e0 !important;
  51529. .v-btn__content {
  51530. color: #8e8e8e !important;
  51531. .ico {
  51532. background-image: url(../img/ico_save_disabled.svg);
  51533. }
  51534. }
  51535. &.btn-mod{
  51536. .v-btn__content {
  51537. .ico{
  51538. background-image: url(../img/ico_mod_disabled.svg);
  51539. }
  51540. }
  51541. }
  51542. }
  51543. .v-btn__content {
  51544. .ico {
  51545. width: 1.25rem;
  51546. height: 1.25rem;
  51547. margin-right: 0.37rem;
  51548. background-size: cover;
  51549. background-image: url(../img/ico_save.svg);
  51550. }
  51551. }
  51552. }
  51553. }
  51554. }
  51555. }
  51556. }
  51557. }
  51558. .container {
  51559. .content {
  51560. .content-tit {
  51561. margin-bottom: 1.25rem;
  51562. .location {
  51563. gap: 0.37rem;
  51564. >span {
  51565. font-size: 0.875rem;
  51566. color: #444444;
  51567. letter-spacing: -0.0175rem;
  51568. &.now {
  51569. font-weight: 700;
  51570. }
  51571. }
  51572. }
  51573. h2 {
  51574. //color: #444;
  51575. font-size: 1.125rem;
  51576. color: #000;
  51577. font-weight: 400;
  51578. }
  51579. >span {
  51580. color: #8e8e8e;
  51581. font-size: 0.875rem;
  51582. font-weight: 400;
  51583. &::before {
  51584. background-color: #8e8e8e;
  51585. }
  51586. &.arr{
  51587. color: #0B318B;
  51588. font-size: 1.125rem;
  51589. font-style: normal;
  51590. margin-right: 0.62rem;
  51591. font-weight: 700;
  51592. line-height: 100%; /* 1.125rem */
  51593. &::before {
  51594. background-color: transparent;
  51595. background-image: url(../img/ico_tit_arr.svg);
  51596. width: 1.1875rem;
  51597. height: 1.1875rem;
  51598. background-size: cover;
  51599. background-repeat: no-repeat;
  51600. margin: 0 0.62rem;
  51601. }
  51602. }
  51603. }
  51604. .ico{
  51605. width: 1.375rem;
  51606. height: 1.375rem;
  51607. background-image: url(../img/ico_set_blue.svg);
  51608. background-size: cover;
  51609. cursor: pointer;
  51610. }
  51611. }
  51612. .search-wrap {
  51613. .search-btn {
  51614. .v-btn {
  51615. width: 5.25rem !important;
  51616. }
  51617. }
  51618. .custom-btn {
  51619. &.v-btn {
  51620. &.v-btn--density-default {
  51621. &.btn-gray-bor {
  51622. border: 1px solid #cccccc;
  51623. color: #8e8e8e;
  51624. font-size: 0.875rem;
  51625. font-weight: 600;
  51626. &:hover {
  51627. box-shadow: 1px 1px 4px 0px rgba(0, 0, 0, 0.15);
  51628. }
  51629. }
  51630. }
  51631. }
  51632. }
  51633. .perfor-tab {
  51634. margin-right: 1.87rem;
  51635. padding-right: 1.87rem;
  51636. border-right: 1px solid #e4e4e4;
  51637. width: auto;
  51638. .v-radio-group {
  51639. width: 6.5625rem;
  51640. .v-input__control {
  51641. width: 6.5625rem;
  51642. .v-radio {
  51643. &:hover {
  51644. .v-label {
  51645. box-shadow: 1px 1px 4px 0px rgba(0, 0, 0, 0.15);
  51646. }
  51647. }
  51648. &.v-selection-control--dirty {
  51649. .v-label {
  51650. color: #000000;
  51651. border: 1px solid #a5a5a5;
  51652. }
  51653. }
  51654. .v-label {
  51655. background-color: #ffffff;
  51656. border-radius: 0.375rem;
  51657. font-size: 0.8125rem;
  51658. font-weight: 600;
  51659. letter-spacing: -0.00813rem;
  51660. color: #949494;
  51661. border: 1px solid #e0e0e0;
  51662. }
  51663. }
  51664. }
  51665. }
  51666. }
  51667. .search-line-wrap {
  51668. gap: 1rem;
  51669. .search-line {
  51670. gap: 2.5rem;
  51671. align-items: center;
  51672. .search-box {
  51673. >strong {
  51674. margin-right: 0.5rem;
  51675. width: 5.875rem;
  51676. margin-left: 0;
  51677. font-size: 0.875rem;
  51678. font-weight: 700;
  51679. color: #444444;
  51680. &.op--3{
  51681. opacity: 0.3;
  51682. }
  51683. }
  51684. .info{
  51685. width: 1rem;
  51686. height: 1rem;
  51687. background-image: url(../img/ico_info.svg);
  51688. background-size: cover;
  51689. background-repeat: no-repeat;
  51690. margin-left: 0.3rem;
  51691. position: relative;
  51692. cursor: pointer;
  51693. .info--tt{
  51694. position: absolute;
  51695. top: -3.5rem;
  51696. left: -11.8rem;
  51697. display: inline-block;
  51698. font-style: normal;
  51699. font-weight: 500;
  51700. color: #fff;
  51701. background-color: rgba(67, 141, 255, 0.70);
  51702. padding: 0.9375rem 1.5625rem 1.0625rem 1.5625rem;
  51703. border-radius: 0.625rem;
  51704. width: 25rem;
  51705. text-align: center;
  51706. display: none;
  51707. z-index: 30;
  51708. &::after{
  51709. content: '';
  51710. background-image: url(../img/ico_tool.svg);
  51711. width: 0.875rem;
  51712. height: 0.625rem;
  51713. display: inline-block;
  51714. position: absolute;
  51715. bottom: -0.625rem;
  51716. left: 50%;
  51717. transform: translateX(-50%);
  51718. }
  51719. }
  51720. &:hover{
  51721. .info--tt{
  51722. display: block;
  51723. }
  51724. }
  51725. }
  51726. .search-box-in {
  51727. margin-left: 0;
  51728. .custom-select {
  51729. &.v-input {
  51730. .v-input__control {
  51731. .v-field {
  51732. .v-field__field {
  51733. padding-left: 0.75rem;
  51734. }
  51735. &.v-field--disabled{
  51736. .v-field__input{
  51737. .v-select__selection{
  51738. .v-select__selection-text{
  51739. color: #e0e0e0!important;
  51740. }
  51741. }
  51742. }
  51743. }
  51744. .v-field__append-inner {
  51745. .v-icon {
  51746. margin-right: 0.75rem;
  51747. }
  51748. }
  51749. .v-field__outline {}
  51750. }
  51751. }
  51752. &.v-input--disabled{
  51753. .v-input__control{
  51754. .v-field{
  51755. background-color: #fbfbfb;
  51756. opacity: 1;
  51757. }
  51758. .v-field__outline{
  51759. border: 1px solid #ccc;
  51760. }
  51761. }
  51762. }
  51763. }
  51764. }
  51765. .custom-input {
  51766. &.v-text-field {
  51767. .v-input__control {
  51768. .v-field__field {
  51769. .v-field__input {
  51770. padding: 0 0.75rem;
  51771. &:read-only {
  51772. color: #000000 !important;
  51773. font-weight: 400 !important;
  51774. background: #ffffff;
  51775. }
  51776. }
  51777. }
  51778. }
  51779. }
  51780. }
  51781. .custom-radio {
  51782. .v-selection-control--disabled{
  51783. opacity: 1;
  51784. }
  51785. &.picker-terms {
  51786. width: auto;
  51787. .v-input__control {
  51788. .v-selection-control-group {
  51789. gap: 0.5rem;
  51790. .v-selection-control {
  51791. &.v-radio {
  51792. width: 2.8125rem;
  51793. }
  51794. }
  51795. }
  51796. }
  51797. }
  51798. }
  51799. .calendar-wrap {
  51800. margin-left: 0.5rem;
  51801. .calendar {
  51802. width: 12.5rem;
  51803. .dp__input_wrap {
  51804. &::before {
  51805. right: 0.75rem;
  51806. }
  51807. .dp__input {
  51808. color: #8e8e8e;
  51809. font-size: 0.875rem;
  51810. &::placeholder {
  51811. color: #8e8e8e;
  51812. font-size: 0.875rem;
  51813. }
  51814. &.dp__disabled{
  51815. border: 1px solid #CCC;
  51816. background-color: #FBFBFB;
  51817. &::placeholder{
  51818. color: #e0e0e0!important;
  51819. }
  51820. }
  51821. }
  51822. }
  51823. .dp__main{
  51824. .dp--menu-wrapper{
  51825. box-shadow: 0px 0px 6px 0px rgba(0, 0, 0, 0.15);
  51826. border-radius: 1.25rem;
  51827. overflow: hidden;
  51828. z-index: 2;
  51829. .dp__menu{
  51830. .dp__arrow_top{
  51831. display: none;
  51832. }
  51833. }
  51834. }
  51835. }
  51836. }
  51837. .custom-btn{
  51838. &.btn-refresh{
  51839. width: 2.25rem;
  51840. height: 2.25rem;
  51841. padding: 0;
  51842. .v-btn__content{
  51843. .ico{
  51844. background-image: url(../img/ico_backup1.svg);
  51845. }
  51846. }
  51847. }
  51848. &.btn-ref{
  51849. width: 2.25rem;
  51850. min-width: 2.25rem;
  51851. height: 2.25rem;
  51852. padding: 0;
  51853. border-radius: 0.375rem;
  51854. border: 1px solid #CCC;
  51855. margin-left: 0.3rem;
  51856. .v-btn__content{
  51857. .ico{
  51858. display: inline-block;
  51859. width: 0.875rem;
  51860. height: 0.875rem;
  51861. background-size: cover;
  51862. background-image: url(../img/ico_refresh.svg);
  51863. }
  51864. }
  51865. &.v-btn--disabled{
  51866. border: 1px solid #E7E7E7;
  51867. background-color: #ffffff!important;
  51868. .v-btn__content{
  51869. .ico{
  51870. background-image: url(../img/ico_refresh_dis.svg);
  51871. }
  51872. }
  51873. }
  51874. }
  51875. }
  51876. .text {
  51877. color: #8e8e8e;
  51878. }
  51879. }
  51880. }
  51881. }
  51882. }
  51883. }
  51884. }
  51885. .chart-wrap {
  51886. background-color: #ffffff;
  51887. box-shadow: 0px 0px 6px 0px rgba(0, 0, 0, 0.15);
  51888. border-radius: 0.5rem;
  51889. padding: 1.88rem;
  51890. flex-direction: column;
  51891. .no--data{
  51892. display: flex;
  51893. justify-content: center;
  51894. align-items: center;
  51895. color: var(--gray2, #444);
  51896. font-size: 0.875rem;
  51897. font-weight: 700;
  51898. height: 100%;
  51899. .ico{
  51900. width: 1.25rem;
  51901. height: 1.25rem;
  51902. margin-right: 0.62rem;
  51903. background-size: cover;
  51904. background-image: url(../img/ico_no_data_nw.svg);
  51905. }
  51906. }
  51907. .chart-total {
  51908. margin-top: 0;
  51909. font-size: 0.9375rem;
  51910. z-index: 1;
  51911. background-color: #ffffff;
  51912. margin-bottom: 1rem;
  51913. >p {
  51914. font-size: 0.9375rem;
  51915. font-weight: 700;
  51916. }
  51917. .legend-area {
  51918. justify-content: center;
  51919. gap: 1.56rem;
  51920. .legend-box {
  51921. color: #333333;
  51922. font-weight: 400;
  51923. font-size: 0.8125rem;
  51924. &.none--atv{
  51925. color: rgba(68, 68, 68, 0.30);
  51926. .cir{
  51927. background-color: rgba(68, 68, 68, 0.30)!important;
  51928. }
  51929. }
  51930. .cir {
  51931. width: 0.9375rem;
  51932. height: 0.1875rem;
  51933. border-radius: 6.25rem;
  51934. &.cir1 {
  51935. background-color: #FF531E;
  51936. }
  51937. &.cir2 {
  51938. background-color: #44C5FF;
  51939. }
  51940. &.cir3 {
  51941. background-color: #FF00C7;
  51942. }
  51943. &.cir4 {
  51944. background-color: #AF70FF;
  51945. }
  51946. &.cir5 {
  51947. background-color: #4862FF;
  51948. }
  51949. &.cir6 {
  51950. background-color: #6ACB52;
  51951. }
  51952. &.cir7 {
  51953. background-color: #00D47B;
  51954. }
  51955. }
  51956. }
  51957. }
  51958. }
  51959. .chart-wrap-fix {
  51960. left: 1.5rem;
  51961. width: 100%;
  51962. height: 100%;
  51963. top: 4rem;
  51964. }
  51965. .scrl-chart {
  51966. margin-left: 0;
  51967. padding-bottom: 0;
  51968. height: 100%;
  51969. .scrl-in{
  51970. height: 100%;
  51971. div{
  51972. height: 100%;
  51973. }
  51974. }
  51975. }
  51976. }
  51977. .view-wrap {
  51978. .view-box {
  51979. .view-box-btm {
  51980. .form-style1 {
  51981. table {
  51982. tbody {
  51983. tr {
  51984. border-top: 1px solid #e0e0e0;
  51985. th {
  51986. padding: 0.62rem;
  51987. color: #444444;
  51988. font-size: 0.875rem;
  51989. .cir {
  51990. width: 0.3125rem;
  51991. height: 0.3125rem;
  51992. display: inline-block;
  51993. background-color: #ff4f60;
  51994. border-radius: 50%;
  51995. margin-left: 0.37rem;
  51996. vertical-align: 2px;
  51997. }
  51998. }
  51999. td {
  52000. padding: 0.62rem;
  52001. color: #444444;
  52002. font-size: 0.875rem;
  52003. .status{
  52004. display: inline-block;
  52005. border: 1px solid #B8D4FF;
  52006. padding: 0.5rem 0.62rem;
  52007. border-radius: 6.25rem;
  52008. color: #438DFF;
  52009. font-size: 0.75rem;
  52010. font-style: normal;
  52011. font-weight: 400;
  52012. .ico{
  52013. display: inline-block;
  52014. width: 0.75rem;
  52015. margin-right: 0.62rem;
  52016. height: 0.75rem;
  52017. background-color: #438dff;
  52018. border-radius: 50%;
  52019. }
  52020. &.discon{
  52021. border: 1px solid #E8E7ED;
  52022. color: #A5A3AE;
  52023. .ico{
  52024. background-color: #D8D7DC;
  52025. }
  52026. }
  52027. }
  52028. .custom-btn {
  52029. &.v-btn {
  52030. &.v-btn--density-default {
  52031. &.btn-password {
  52032. background: #6f8aa6;
  52033. height: 2.25rem;
  52034. width: 6.875rem;
  52035. }
  52036. &.btn-black {
  52037. background: #6f8aa6;
  52038. &.v-btn--disabled {
  52039. background-color: #e0e0e0 !important;
  52040. .v-btn__content {
  52041. color: #8e8e8e !important;
  52042. }
  52043. }
  52044. }
  52045. }
  52046. }
  52047. }
  52048. .custom-input {
  52049. &.v-text-field {
  52050. &.mini {
  52051. .v-input__control {
  52052. .v-field__field {
  52053. .v-field__input {
  52054. padding: 0 0.75rem;
  52055. color: #000000;
  52056. height: 2.25rem;
  52057. font-size: 0.875rem;
  52058. font-weight: 400 !important;
  52059. min-height: 2.25rem;
  52060. &::placeholder {
  52061. color: #8e8e8e;
  52062. font-size: 0.875rem;
  52063. font-weight: 400 !important;
  52064. }
  52065. }
  52066. }
  52067. }
  52068. .v-input__details{
  52069. overflow: visible;
  52070. .v-messages__message{
  52071. padding: 0;
  52072. }
  52073. }
  52074. }
  52075. &.mini2 {
  52076. min-height: 2.25rem;
  52077. .v-input__control {
  52078. height: 2.25rem;
  52079. .v-field__field {
  52080. .v-field__input {
  52081. padding: 0 0.75rem;
  52082. color: #000000;
  52083. height: 2.25rem;
  52084. font-size: 0.875rem;
  52085. font-weight: 400;
  52086. min-height: 2.25rem;
  52087. &::placeholder {
  52088. color: #8e8e8e;
  52089. font-size: 0.875rem;
  52090. font-weight: 400;
  52091. }
  52092. }
  52093. }
  52094. }
  52095. }
  52096. }
  52097. }
  52098. .custom-radio {
  52099. &.v-input {
  52100. &.type2 {
  52101. .v-input__control {
  52102. .v-selection-control-group {
  52103. .v-radio {
  52104. .v-label {
  52105. padding-left: 0.56rem;
  52106. font-weight: 500;
  52107. }
  52108. .v-selection-control__wrapper {
  52109. .v-selection-control__input {
  52110. width: 1rem;
  52111. height: 1rem;
  52112. .v-icon {
  52113. border: 1px solid #C0C0C0;
  52114. &.mdi-radiobox-marked {
  52115. border: 1px solid #C0C0C0;
  52116. background-color: #438dff;
  52117. }
  52118. }
  52119. }
  52120. }
  52121. }
  52122. }
  52123. }
  52124. }
  52125. }
  52126. }
  52127. }
  52128. }
  52129. }
  52130. }
  52131. }
  52132. }
  52133. }
  52134. }
  52135. .content--db--wrap{
  52136. display: flex;
  52137. gap: 1.25rem;
  52138. .content--inner{
  52139. .content--inner--title{
  52140. display: flex;
  52141. justify-content: space-between;
  52142. align-items: center;
  52143. h3{
  52144. color: #222;
  52145. font-size: 1rem;
  52146. font-weight: 700;
  52147. }
  52148. .d--day{
  52149. border-radius: 6.25rem;
  52150. border: 1px solid #AFCFFF;
  52151. color: #438DFF;
  52152. font-size: 0.8125rem;
  52153. font-weight: 700;
  52154. padding: 0.5rem 0.94rem 0.62rem;
  52155. span{
  52156. font-weight: 400;
  52157. }
  52158. }
  52159. .status--wrap{
  52160. }
  52161. }
  52162. }
  52163. .content--l{
  52164. background-color: #fff;
  52165. width: 28.125rem;
  52166. height: 52.8125rem;
  52167. padding: 1.25rem;
  52168. border-radius: 1.25rem;
  52169. .content--inner{
  52170. .content--inner--content{
  52171. .db--chart--wrap{
  52172. display: flex;
  52173. align-items: center;
  52174. justify-content: center;
  52175. padding:3rem 0rem 3rem 0rem;
  52176. .db--chart{
  52177. position: relative;
  52178. width:12.5rem;
  52179. height:12.5rem;
  52180. max-width:12.5rem;
  52181. max-height:12.5rem;
  52182. canvas{
  52183. position: relative;
  52184. z-index: 3;
  52185. }
  52186. &:after{
  52187. content:'';
  52188. display: block;
  52189. width:12.5rem;
  52190. height:12.5rem;
  52191. position: absolute;
  52192. top:50%;
  52193. left:50%;
  52194. transform: translate(-50%, -50%);
  52195. background:#EAEAEA;
  52196. border-radius: 12.5rem;
  52197. z-index: 1;
  52198. }
  52199. &:before{
  52200. content:'';
  52201. display: block;
  52202. width:7.5rem;
  52203. height:7.5rem;
  52204. position: absolute;
  52205. top:50%;
  52206. left:50%;
  52207. transform: translate(-50%, -50%);
  52208. background:#fff;
  52209. border-radius: 12.5rem;
  52210. z-index: 2;
  52211. }
  52212. }
  52213. }
  52214. .db--table{
  52215. table{
  52216. width: 100%;
  52217. margin-top: 1.75rem;
  52218. tbody{
  52219. tr{
  52220. border-top: 1px solid #e0e0e0;
  52221. th{
  52222. text-align: left;
  52223. padding: 1.12rem 0.62rem;
  52224. font-size: 0.875rem;
  52225. color: #444444;
  52226. font-weight: 700;
  52227. }
  52228. td{
  52229. color: #444444;
  52230. font-size: 0.875rem;
  52231. font-weight: 400;
  52232. span{
  52233. font-weight: 700;
  52234. color: #438dff;
  52235. }
  52236. }
  52237. }
  52238. }
  52239. }
  52240. }
  52241. }
  52242. }
  52243. }
  52244. .content--r{
  52245. display: flex;
  52246. flex-direction: column;
  52247. width: calc(100% - 28.14rem);
  52248. gap: 1.25rem;
  52249. .content--r--t{
  52250. background-color: #fff;
  52251. width: 100%;
  52252. border-radius: 1.25rem;
  52253. height: 27.625rem;
  52254. padding: 1.25rem;
  52255. .content--inner{
  52256. height: 100%;
  52257. .content--inner--title{
  52258. margin-bottom: 1.12rem;
  52259. .status--wrap{
  52260. display: flex;
  52261. gap: 1.88rem;
  52262. .status{
  52263. display: flex;
  52264. position: relative;
  52265. gap: 0.63rem;
  52266. align-items: center;
  52267. .status--card{
  52268. padding: 0.5rem 0.75rem;
  52269. border-radius: 6.25rem;
  52270. display: flex;
  52271. align-items: center;
  52272. span{
  52273. color: #111;
  52274. font-size: 0.8125rem;
  52275. font-weight: 500;
  52276. letter-spacing: -0.00813rem;
  52277. margin-right: 1.5rem;
  52278. &.count{
  52279. margin-right: 0;
  52280. font-weight: 700;
  52281. }
  52282. }
  52283. .ico{
  52284. background-repeat: no-repeat;
  52285. background-position: center;
  52286. background-size: cover;
  52287. width: 0.875rem;
  52288. height: 0.875rem;
  52289. margin-right: 0.63rem;
  52290. }
  52291. &.con{
  52292. border: 1px solid #a1c6ff;
  52293. .ico{
  52294. background-image: url(../img/ico_status1.svg);
  52295. }
  52296. .count{
  52297. color: #438DFF;
  52298. }
  52299. }
  52300. &.dis--con{
  52301. border: 1px solid #F6A19B;
  52302. .ico{
  52303. background-image: url(../img/ico_status2.svg);
  52304. }
  52305. .count{
  52306. color: #E1473D;
  52307. }
  52308. }
  52309. &.active{
  52310. border: 1px solid #a1c6ff;
  52311. .ico{
  52312. background-image: url(../img/ico_status1.svg);
  52313. }
  52314. .count{
  52315. color: #438DFF;
  52316. }
  52317. }
  52318. &.issue{
  52319. border: 1px solid #F6A19B;
  52320. .ico{
  52321. background-image: url(../img/ico_status3.svg);
  52322. }
  52323. .count{
  52324. color: #E1473D;
  52325. }
  52326. }
  52327. }
  52328. }
  52329. .map{
  52330. position: relative;
  52331. .custom-btn{
  52332. &.btn-map{
  52333. // width: 4.5625rem;
  52334. width: 6.75rem;
  52335. height: 1.875rem;
  52336. border-radius: 6.25rem;
  52337. .v-btn__content{
  52338. font-size: 0.8125rem!important;
  52339. .ico{
  52340. width: 0.875rem;
  52341. height: 0.875rem;
  52342. background-image: url(../img/ico_map.svg);
  52343. background-repeat: no-repeat;
  52344. background-position: center;
  52345. background-size: cover;
  52346. margin-right: 0.31rem;
  52347. }
  52348. }
  52349. }
  52350. }
  52351. // &::before{
  52352. // width: 0.0625rem;
  52353. // height: 1.125rem;
  52354. // top: 50%;
  52355. // transform: translateY(-50%);
  52356. // background-color: #e0e0e0;
  52357. // content: '';
  52358. // position: absolute;
  52359. // left: -0.94rem;
  52360. // }
  52361. }
  52362. }
  52363. }
  52364. .content--inner--content{
  52365. .db--status{
  52366. .equip--card--wrap{
  52367. display: flex;
  52368. align-items: flex-end;
  52369. width: 100%;
  52370. height: 19.5rem;
  52371. .equip--card{
  52372. width: 100%;
  52373. height: 18rem;
  52374. background-color: #f1f7ff;
  52375. border-radius: 0.9375rem;
  52376. border: 1px solid #D4E7FF;
  52377. padding: 2.25rem 1.88rem 1.25rem 1.88rem;
  52378. display: flex;
  52379. justify-content: center;
  52380. gap: 1.37rem;
  52381. position: relative;
  52382. flex-direction: column;
  52383. .equip--t{
  52384. display: flex;
  52385. align-items: center;
  52386. gap: 0.94rem;
  52387. justify-content: flex-start;
  52388. }
  52389. .equip--icon{
  52390. background-color: #fff;
  52391. width: 2.5rem;
  52392. height: 2.5rem;
  52393. border-radius: 6.25rem;
  52394. background-image: url(../img/ico_equip.svg);
  52395. background-size: 1.25rem 1.25rem;
  52396. background-position: center;
  52397. }
  52398. .equip--txt{
  52399. p{
  52400. color: #222;
  52401. font-size: 1rem;
  52402. font-weight: 700;
  52403. margin-bottom: 0.2rem;
  52404. }
  52405. span{
  52406. color: #8C8C8C;
  52407. font-size: 0.6875rem;
  52408. font-weight: 400;
  52409. letter-spacing: -0.00688rem;
  52410. }
  52411. }
  52412. .equip--st{
  52413. width: 100%;
  52414. display: flex;
  52415. flex-direction: column;
  52416. gap: 0.75rem;
  52417. li{
  52418. display: flex;
  52419. align-items: center;
  52420. .circle{
  52421. border-radius: 50%;
  52422. width: 0.5625rem;
  52423. height: 0.5625rem;
  52424. margin-right: 0.94rem;
  52425. vertical-align: -0.1rem;
  52426. background-color: #55E074;
  52427. &.critical{
  52428. background-color:#E1473D;
  52429. }
  52430. }
  52431. p{
  52432. color: #222;
  52433. font-size: 0.6875rem;
  52434. font-weight: 500;
  52435. }
  52436. span{
  52437. color: #222;
  52438. font-size: 0.6875rem;
  52439. font-weight: 500;
  52440. margin-left: auto;
  52441. &.active{
  52442. font-weight: 700;
  52443. color: #111111;
  52444. }
  52445. }
  52446. }
  52447. }
  52448. &::before{
  52449. position: absolute;
  52450. content: 'Connected';
  52451. left: 0.62rem;
  52452. top: -0.69rem;
  52453. color: #438DFF;
  52454. text-align: center;
  52455. font-size: 0.6875rem;
  52456. font-weight: 500;
  52457. border-radius: 6.25rem;
  52458. border: 1px solid #9BC2FF;
  52459. background: #FFF;
  52460. padding: 0.38rem 0.62rem 0.5rem;
  52461. z-index: 2;
  52462. }
  52463. &.dis{
  52464. &::before{
  52465. border: 1px solid #F6A19B;
  52466. color: #E1473D;
  52467. content: 'Disconnected';
  52468. }
  52469. &::after{
  52470. position: absolute;
  52471. content: '';
  52472. left: 0;
  52473. bottom: 0;
  52474. width: 100%;
  52475. height: 100%;
  52476. border: 1px solid #f4a19c;
  52477. background-color: #06102780;
  52478. border-radius: 0.9375rem;
  52479. background-image: url(../img/ico_wifi.svg);
  52480. background-position: center;
  52481. background-size: 2.5rem 2.5rem;
  52482. }
  52483. }
  52484. }
  52485. }
  52486. }
  52487. .swiper{
  52488. padding-bottom: 3.25rem;
  52489. .swiper-controls{
  52490. display: flex;
  52491. margin-top: 1.25rem;
  52492. align-items: center;
  52493. gap: 1.25rem;
  52494. height: 2rem;
  52495. justify-content: center;
  52496. .swiper-button-prev{
  52497. position: static;
  52498. margin-top: 0;
  52499. width: 2rem;
  52500. height: 2rem;
  52501. background-image: url(../img/ico_arrow_prev.svg);
  52502. background-position: center;
  52503. background-repeat: no-repeat;
  52504. background-size: cover;
  52505. &::after{
  52506. content: none;
  52507. }
  52508. &.swiper-button-disabled{
  52509. }
  52510. }
  52511. .swiper-button-next{
  52512. position: static;
  52513. width: 2rem;
  52514. height: 2rem;
  52515. margin-top: 0;
  52516. background-image: url(../img/ico_arrow_next.svg);
  52517. background-position: center;
  52518. background-repeat: no-repeat;
  52519. background-size: cover;
  52520. &::after{
  52521. content: none;
  52522. }
  52523. }
  52524. .swiper-pagination{
  52525. position: static;
  52526. width: auto;
  52527. .swiper-pagination-bullet{
  52528. margin-left: 0;
  52529. margin-right: 0.63rem;
  52530. width: 0.75rem;
  52531. height: 0.75rem;
  52532. background-color: #E9E9E9;
  52533. opacity: 1;
  52534. &.swiper-pagination-bullet-active{
  52535. background-color: #6F8AA6;
  52536. }
  52537. &:last-child{
  52538. margin-right: 0;
  52539. }
  52540. }
  52541. }
  52542. }
  52543. }
  52544. }
  52545. }
  52546. }
  52547. .content--r--b{
  52548. background-color: #fff;
  52549. width: 100%;
  52550. height: 23.9375rem;
  52551. border-radius: 1.25rem;
  52552. padding: 1.25rem;
  52553. .content--inner{
  52554. height: 100%;
  52555. gap: 3rem;
  52556. display: flex;
  52557. flex-direction: column;
  52558. &::after{
  52559. display: none;
  52560. }
  52561. .content--inner--title{
  52562. margin: 0;
  52563. justify-content: flex-start;
  52564. p{
  52565. color: #222222;
  52566. font-weight: 700;
  52567. font-size: 1rem;
  52568. margin-right: 2.5rem;
  52569. }
  52570. .ico{
  52571. width: 0.9375rem;
  52572. height: 0.9375rem;
  52573. margin-right: 2.5rem;
  52574. margin-left: 0.75rem;
  52575. background-image: url(../img/ico_set.svg);
  52576. display: inline-block;
  52577. background-size: cover;
  52578. cursor: pointer;
  52579. }
  52580. .btn-wrap{
  52581. margin-left: auto;
  52582. .custom-btn{
  52583. &.btn-pip{
  52584. margin-left: 0.94rem;
  52585. width: 6.75rem;
  52586. height: 2.25rem;
  52587. padding: 0;
  52588. .v-btn__content{
  52589. color: #8E8E8E;
  52590. font-size: 0.875rem;
  52591. font-weight: 500;
  52592. letter-spacing: -0.00875rem;
  52593. .ico{
  52594. width: 1.25rem;
  52595. height: 1.25rem;
  52596. display: inline-block;
  52597. background-image: url(../img/ico_pip2.svg);
  52598. background-size: cover;
  52599. background-repeat: no-repeat;
  52600. margin-right: 0.38rem;
  52601. margin-left: 0;
  52602. background-position: center;
  52603. }
  52604. }
  52605. }
  52606. }
  52607. }
  52608. .select--wrap{
  52609. display: flex;
  52610. gap: 0.63rem;
  52611. align-items: center;
  52612. .custom-btn{
  52613. &.v-btn{
  52614. &.btn-blue{
  52615. width: 5.25rem;
  52616. }
  52617. }
  52618. }
  52619. }
  52620. }
  52621. .chart--con{
  52622. width: 100%;
  52623. height: 100%;
  52624. .chart--in{
  52625. height: calc(100% - 1rem);
  52626. z-index: 10;
  52627. position: relative;
  52628. > div{
  52629. height: 100%;
  52630. }
  52631. .chart--legend{
  52632. height: auto;
  52633. display: flex;
  52634. position: absolute;
  52635. right: 50%;
  52636. transform: translateX(50%);
  52637. top: -2.5rem;
  52638. .legend{
  52639. display: flex;
  52640. align-items: center;
  52641. .line{
  52642. margin-left: 1.25rem;
  52643. width: 0.9375rem;
  52644. height: 0.1875rem;
  52645. border-radius: 6.25rem;
  52646. display: inline-block;
  52647. background-color: #55E074;
  52648. }
  52649. p{
  52650. color: #333;
  52651. font-size: 0.8125rem;
  52652. font-style: normal;
  52653. margin-left: 0.75rem;
  52654. font-weight: 400;
  52655. letter-spacing: -0.00813rem;
  52656. }
  52657. &:first-child{
  52658. .line{
  52659. background-color: #FF531E;
  52660. }
  52661. }
  52662. &:nth-child(2){
  52663. .line{
  52664. background-color: #44C5FF;
  52665. }
  52666. }
  52667. &:nth-child(3){
  52668. .line{
  52669. background-color: #FF00C7;
  52670. }
  52671. }
  52672. &:nth-child(4){
  52673. .line{
  52674. background-color: #AF70FF;
  52675. }
  52676. }
  52677. &:nth-child(5){
  52678. .line{
  52679. background-color: #4862FF;
  52680. }
  52681. }
  52682. }
  52683. }
  52684. }
  52685. }
  52686. }
  52687. }
  52688. }
  52689. .content--inner--content{
  52690. &.no--data{
  52691. display: flex;
  52692. justify-content: center;
  52693. align-items: center;
  52694. color: var(--gray2, #444);
  52695. font-size: 0.875rem;
  52696. font-weight: 700;
  52697. height: 100%;
  52698. .ico{
  52699. width: 1.25rem;
  52700. height: 1.25rem;
  52701. margin-right: 0.62rem;
  52702. background-size: cover;
  52703. background-image: url(../img/ico_no_data_nw.svg);
  52704. }
  52705. }
  52706. }
  52707. }
  52708. // dashboard components
  52709. .dash--board--wrapper{
  52710. &.none--title{
  52711. height: calc(100vh - 6.5rem);
  52712. }
  52713. .dash--board--contents{
  52714. &.type3{
  52715. .core--component--wrap{
  52716. height: 100%;
  52717. &.user--list{
  52718. > div{
  52719. &:nth-of-type(1){
  52720. height:auto;
  52721. .inner--content{
  52722. height:100%;
  52723. .oper--stat{
  52724. height:calc( ( ( 100% / 3 ) * 2 ) - 3.75rem );
  52725. .card--alarm{
  52726. .card{
  52727. .ico{
  52728. width:2rem;
  52729. height:2rem;
  52730. }
  52731. .alarm--txt{
  52732. display: flex;
  52733. flex-direction: column;
  52734. gap:.3rem;
  52735. }
  52736. }
  52737. }
  52738. &:nth-of-type(2){
  52739. height:calc( ( 100% / 3 ) - 0.625rem );
  52740. }
  52741. }
  52742. }
  52743. }
  52744. &:nth-of-type(2){
  52745. padding-top:1.25rem;
  52746. height:calc(100% - 15.7rem);
  52747. .inner--content{
  52748. height:calc(100% - 1rem);
  52749. .swiper{
  52750. height:100%;
  52751. .swiper-wrapper{
  52752. height:100%;
  52753. .swiper-slide{
  52754. height:100%;
  52755. .tenant--card--wrap{
  52756. display: flex;
  52757. flex-wrap: wrap;
  52758. flex-direction: row;
  52759. height:100%;
  52760. .tenant--card{
  52761. width:calc(50% - 0.25rem);
  52762. height: calc( (100% - ((0.25rem * 6) + 1.6rem)) / 7);
  52763. display: flex;
  52764. flex-direction: column;
  52765. justify-content: space-between;
  52766. }
  52767. }
  52768. .user--list--contents{
  52769. width:100%;
  52770. padding-top:0px;
  52771. height:100%;
  52772. > ul{
  52773. width:100%;
  52774. height:100%;
  52775. gap:0.62rem;
  52776. >li{
  52777. padding: 0.54rem;
  52778. width:calc( (100% - 0.62rem) / 2);
  52779. height:calc( (100% - ( 0.62rem * 3 ) ) / 4);
  52780. .chart--box{
  52781. margin-top:.5rem;
  52782. width:calc(100% - 6.2rem);
  52783. height:50%;
  52784. }
  52785. &.critical{
  52786. .current--value--ps{
  52787. color:#f00!important;
  52788. }
  52789. }
  52790. &.major{
  52791. .current--value--ps{
  52792. color:#C96103!important;
  52793. }
  52794. }
  52795. &.minor{
  52796. .current--value--ps{
  52797. color:#DDA405!important;
  52798. }
  52799. }
  52800. &.normal{
  52801. .current--value--ps{
  52802. color:#2D8CFA!important;
  52803. }
  52804. }
  52805. }
  52806. }
  52807. }
  52808. }
  52809. }
  52810. }
  52811. }
  52812. }
  52813. }
  52814. }
  52815. &.core--tp{
  52816. > div{
  52817. &:nth-of-type(1){
  52818. height:50%;
  52819. &.no--data{
  52820. height: 100%;
  52821. }
  52822. .inner--content{
  52823. height:100%;
  52824. >div{
  52825. height:calc( (100% - (0.25rem * 2)) / 3);
  52826. display:flex;
  52827. flex-direction: column;
  52828. justify-content: space-between;
  52829. &:nth-of-type(2){
  52830. height:calc( ( (100% - (0.25rem * 2)) / 3 ) - 1.2rem );
  52831. }
  52832. &:nth-of-type(3){
  52833. height:calc( ( (100% - (0.25rem * 2)) / 3 ) - 2.5rem );
  52834. }
  52835. }
  52836. }
  52837. }
  52838. &:nth-of-type(2){
  52839. height:50%;
  52840. .inner--content{
  52841. height:100%;
  52842. .swiper{
  52843. height:100%;
  52844. .swiper-wrapper{
  52845. height:calc(100% - 1rem);
  52846. .swiper-slide{
  52847. height:100%;
  52848. .equip--card--wrap{
  52849. height:100%;
  52850. .equip--card{
  52851. height: calc( 100% / 4)!important;
  52852. }
  52853. }
  52854. }
  52855. }
  52856. }
  52857. }
  52858. }
  52859. }
  52860. }
  52861. .inner--header--wrap{
  52862. &.mt--15rem{
  52863. margin-top: 1rem;
  52864. }
  52865. .inner--component--title{
  52866. &.none--after{
  52867. &::after{
  52868. display: none;
  52869. }
  52870. }
  52871. }
  52872. .inner--component--date{
  52873. color: #8E8E8E;
  52874. font-size: 0.8125rem;
  52875. font-style: normal;
  52876. font-weight: 400;
  52877. }
  52878. .inner--component--total{
  52879. color: #8E8E8E;
  52880. font-size: 0.8125rem;
  52881. font-weight: 400;
  52882. span{
  52883. color: #438DFF;
  52884. font-weight: 900;
  52885. }
  52886. }
  52887. }
  52888. .inner--content{
  52889. gap: 0.5rem;
  52890. &.df--block{
  52891. display: block;
  52892. }
  52893. &.pt--125rem{
  52894. padding-top: 0.75rem;
  52895. }
  52896. &.pt--1rem{
  52897. padding-top: 0.75rem;
  52898. }
  52899. .oper--stat{
  52900. border-radius: 0.625rem;
  52901. border: 1px solid #EFEFEF;
  52902. background: #FFF;
  52903. width: 100%;
  52904. padding: 0.75rem 1rem;
  52905. .card--title{
  52906. display: flex;
  52907. justify-content: space-between;
  52908. margin-bottom: 0.75rem;
  52909. h3{
  52910. color: #111;
  52911. font-size: 0.7rem;
  52912. font-style: normal;
  52913. font-weight: 700;
  52914. }
  52915. p{
  52916. color: #555;
  52917. font-size: 0.7rem;
  52918. font-weight: 400;
  52919. span{
  52920. color: #111;
  52921. font-weight: 500;
  52922. }
  52923. }
  52924. }
  52925. .card--cont{
  52926. display: flex;
  52927. justify-content: space-between;
  52928. gap: 2.12rem;
  52929. .card{
  52930. display: flex;
  52931. width: calc(100% / 3);
  52932. flex-direction: column;
  52933. gap: 0.5rem;
  52934. .card--count{
  52935. padding: 0.25rem 0.75rem;
  52936. border-radius: 6.25rem;
  52937. background-color: #eff2f4;
  52938. color: #444;
  52939. font-size: 0.6rem;
  52940. font-weight: 400;
  52941. text-align: center;
  52942. width: 5rem;
  52943. span{
  52944. font-weight: 700;
  52945. }
  52946. }
  52947. .card--txt{
  52948. display: flex;
  52949. justify-content: space-between;
  52950. color: #333;
  52951. font-size: 0.7rem;
  52952. align-items: center;
  52953. font-weight: 400;
  52954. span{
  52955. color: #333;
  52956. font-size: 1.12rem;
  52957. font-weight: 900;
  52958. position: relative;
  52959. &::after{
  52960. content: '';
  52961. width: 0.0625rem;
  52962. height: 1.0625rem;
  52963. background-color: #d2d2d2;
  52964. position: absolute;
  52965. right: -1.1rem;
  52966. top: 0.2rem;
  52967. }
  52968. }
  52969. }
  52970. &:last-child{
  52971. .card--txt{
  52972. span{
  52973. &::after{
  52974. display: none;
  52975. }
  52976. }
  52977. }
  52978. }
  52979. }
  52980. }
  52981. .card--alarm{
  52982. display: flex;
  52983. gap: 3.12rem;
  52984. &.gap--0{
  52985. gap: 0;
  52986. }
  52987. &.mb--1rem{
  52988. margin-bottom: 0.94rem;
  52989. }
  52990. .card{
  52991. display: flex;
  52992. width: 50%;
  52993. gap: 0.94rem;
  52994. align-items: center;
  52995. position: relative;
  52996. .ico{
  52997. background-color: #E4EFFF;
  52998. border-radius: 50%;
  52999. width: 2.2rem;
  53000. height: 2.2rem;
  53001. background-image: url(../img/ico_core_alarm1.svg);
  53002. background-position: center;
  53003. background-repeat: no-repeat;
  53004. background-size: 1rem 1rem;
  53005. }
  53006. &.tenant1{
  53007. .ico{
  53008. background-image: url(../img/ico_tenant1.svg);
  53009. }
  53010. }
  53011. &.tenant2{
  53012. .ico{
  53013. background-image: url(../img/ico_tenant2.svg);
  53014. }
  53015. }
  53016. &.tenant3{
  53017. .ico{
  53018. background-image: url(../img/ico_tenant3.svg);
  53019. }
  53020. }
  53021. &.tenant4{
  53022. .ico{
  53023. background-image: url(../img/ico_tenant4.svg);
  53024. }
  53025. }
  53026. &.license1{
  53027. .ico{
  53028. background-image: url(../img/ico_certify_y3.svg);
  53029. }
  53030. }
  53031. &.license2{
  53032. .ico{
  53033. background-image: url(../img/ico_certify_n.svg)!important;
  53034. }
  53035. }
  53036. .alarm--txt{
  53037. p{
  53038. color: #222;
  53039. font-size: 0.65rem;
  53040. font-weight: 400;
  53041. }
  53042. span{
  53043. color: #438DFF;
  53044. font-size: 0.8rem;
  53045. font-weight: 700;
  53046. }
  53047. }
  53048. &:first-child{
  53049. &::after{
  53050. content: '';
  53051. width: 0.0625rem;
  53052. height: 1.5rem;
  53053. background-color: #d2d2d2;
  53054. position: absolute;
  53055. right: -1.56rem;
  53056. top: 0.5rem;
  53057. }
  53058. }
  53059. &.no--alarm{
  53060. .ico{
  53061. background-color: #FFEBEA;
  53062. background-image: url(../img/ico_core_alarm2.svg);
  53063. }
  53064. .alarm--txt{
  53065. span{
  53066. color: #E1473D;
  53067. }
  53068. }
  53069. }
  53070. &.gray--alarm{
  53071. .ico{
  53072. background-color: #F5F5F5;
  53073. }
  53074. .alarm--txt{
  53075. span{
  53076. color: #333333;
  53077. }
  53078. }
  53079. }
  53080. }
  53081. }
  53082. }
  53083. .link--stat{
  53084. margin-bottom: 1rem;
  53085. width: 100%;
  53086. padding: 0.75rem 1rem;
  53087. border-radius: 0.625rem;
  53088. .card--title{
  53089. display: flex;
  53090. justify-content: space-between;
  53091. margin-bottom: 0.75rem;
  53092. h3{
  53093. color: #111;
  53094. font-size: 0.7rem;
  53095. font-style: normal;
  53096. font-weight: 700;
  53097. }
  53098. }
  53099. .card--cont{
  53100. display: flex;
  53101. align-items: center;
  53102. .ico{
  53103. width: 1.25rem;
  53104. height: 1.25rem;
  53105. background-position: center;
  53106. background-size: cover;
  53107. margin-right: 0.75rem;
  53108. background-repeat: no-repeat;
  53109. }
  53110. p{
  53111. color: #222;
  53112. font-size: 0.7rem;
  53113. font-weight: 400;
  53114. }
  53115. span{
  53116. margin-left: auto;
  53117. color: #E1473D;
  53118. font-size: 1.12rem;
  53119. font-weight: 700;
  53120. }
  53121. }
  53122. &.discon{
  53123. border: 1px solid #F4A19C;
  53124. background: #FFF4F3;
  53125. .card--cont{
  53126. .ico{
  53127. background-image: url(../img/ico_link.svg);
  53128. }
  53129. }
  53130. }
  53131. }
  53132. .swiper{
  53133. .swiper-wrapper{
  53134. .equip--card--wrap{
  53135. display: flex;
  53136. flex-direction: column;
  53137. gap: 0.5rem;
  53138. .equip--card{
  53139. border-radius: 0.625rem;
  53140. position: relative;
  53141. border: 1px solid #EFEFEF;
  53142. /*height: 4rem;*/
  53143. // height: calc( (50vh / 4.8));
  53144. display: flex;
  53145. align-items: center;
  53146. width: 100%;
  53147. padding: 0 1.5rem;
  53148. &.critical{
  53149. border: 1px solid #F4A19C;
  53150. background-color: #FFF4F3
  53151. }
  53152. &.major{
  53153. border: 1px solid #FFD3AC;
  53154. background-color: #FFF6EE;
  53155. }
  53156. &.minor{
  53157. border: 1px solid #FFE6A5;
  53158. background-color: #FFF7E2;
  53159. }
  53160. &.normal{
  53161. border: 1px solid #E3E3E3;
  53162. background-color: #ffffff;
  53163. }
  53164. // &:hover{
  53165. // &::after{
  53166. // background-color: rgba(67, 141, 255, 0.20)!important;
  53167. // content: '';
  53168. // width: 100%;
  53169. // height: 100%;
  53170. // border-radius: 0.625rem;
  53171. // position: absolute;
  53172. // top: 0;
  53173. // left: 0;
  53174. // }
  53175. // }
  53176. &.discon{
  53177. position: relative;
  53178. &::after{
  53179. content:'';
  53180. width: 100%;
  53181. height: 100%;
  53182. background-color: rgba(255, 0, 0, 0.50);
  53183. border-radius: 0.625rem;
  53184. position: absolute;
  53185. top: 0;
  53186. left: 0;
  53187. background-image: url(../img/ico_wifi.svg);
  53188. background-size: 2.5rem 2.5rem;
  53189. background-position: center;
  53190. }
  53191. }
  53192. .equip--name{
  53193. color: #222;
  53194. font-size: 0.75rem;
  53195. font-style: normal;
  53196. font-weight: 700;
  53197. width: 7%;
  53198. margin-right: 1.5rem;
  53199. }
  53200. .equip--st{
  53201. display: flex;
  53202. flex-wrap: wrap;
  53203. width: 93%;
  53204. row-gap: 1rem;
  53205. column-gap: 1.88rem;
  53206. > li{
  53207. width: calc(50% - 1rem);
  53208. display: flex;
  53209. align-items: center;
  53210. .circle{
  53211. width: 0.5625rem;
  53212. height: 0.5625rem;
  53213. border-radius: 50%;
  53214. margin-right: 0.62rem;
  53215. background-color: #55E074;
  53216. &.critical{
  53217. background-color: #FF0000;
  53218. }
  53219. &.major{
  53220. background-color: #C96103;
  53221. }
  53222. &.minor{
  53223. background-color: #DDA405;
  53224. }
  53225. &.warning{
  53226. background-color: #D1B568;
  53227. }
  53228. &.normal{
  53229. background-color: #2D8CFA;
  53230. }
  53231. }
  53232. > p{
  53233. color: #222;
  53234. font-size: 0.55rem;
  53235. font-weight: 500;
  53236. }
  53237. span{
  53238. color: #222;
  53239. font-size: 0.55rem;
  53240. font-weight: 500;
  53241. margin-left: auto;
  53242. &.active{
  53243. font-weight: 700;
  53244. }
  53245. }
  53246. }
  53247. }
  53248. }
  53249. }
  53250. .tenant--card--wrap{
  53251. display: flex;
  53252. flex-direction: column;
  53253. gap: 0.5rem;
  53254. .tenant--card{
  53255. border-radius: 0.625rem;
  53256. border: 1px solid #EFEFEF;
  53257. background: #F8F8F8;
  53258. padding: 0.6rem 1rem;
  53259. .tenant--name{
  53260. display: flex;
  53261. justify-content: space-between;
  53262. margin-bottom: 0.25rem;
  53263. p{
  53264. color: #222;
  53265. font-size: 0.7rem;
  53266. line-height: 0.8125rem;
  53267. font-weight: 500;
  53268. letter-spacing: -0.00813rem;
  53269. }
  53270. .ico{
  53271. width: 0.875rem;
  53272. height: 0.875rem;
  53273. background-image: url(../img/ico_pin_off.svg);
  53274. background-repeat: no-repeat;
  53275. background-size: cover;
  53276. cursor: pointer;
  53277. &.active{
  53278. background-image: url(../img/ico_pin_on.svg);
  53279. }
  53280. }
  53281. }
  53282. .tenant--per--wrap{
  53283. display: flex;
  53284. gap: 0.94rem;
  53285. justify-content: space-between;
  53286. .tenant--per--num{
  53287. span{
  53288. &:nth-child(1){
  53289. color: #438DFF;
  53290. font-size: 1rem;
  53291. font-weight: 900;
  53292. letter-spacing: -0.01125rem;
  53293. margin-right: 0.2rem;
  53294. }
  53295. &:nth-child(2){
  53296. color: #8C8C8C;
  53297. font-size: 0.7rem;
  53298. font-weight: 500;
  53299. letter-spacing: -0.0075rem;
  53300. }
  53301. }
  53302. }
  53303. .tenant--per--bar{
  53304. width: 100%;
  53305. position: relative;
  53306. .bg--bar{
  53307. position: absolute;
  53308. bottom: 0;
  53309. width: 100%;
  53310. background-color: #EAEAEA;
  53311. border-radius: 6.25rem;
  53312. height: 0.75rem;
  53313. .fill--bar{
  53314. height: 0.75rem;
  53315. line-height: 0.75rem;
  53316. background: #438DFF;
  53317. border-radius: 6.25rem;
  53318. color: #FFF;
  53319. text-align: center;
  53320. font-size: 0.625rem;
  53321. font-weight: 700;
  53322. letter-spacing: -0.00625rem;
  53323. }
  53324. }
  53325. }
  53326. }
  53327. &.discon{
  53328. .tenant--name{
  53329. p{
  53330. color: rgba(34, 34, 34, 0.3);
  53331. &::after{
  53332. content: '';
  53333. background-image: url(../img/ico_ban.svg);
  53334. width: 0.875rem;
  53335. height: 0.875rem;
  53336. background-size: cover;
  53337. position: absolute;
  53338. margin-left: 0.3rem;
  53339. }
  53340. }
  53341. }
  53342. }
  53343. &.critical{
  53344. .tenant--per--wrap{
  53345. .tenant--per--num{
  53346. span{
  53347. &:first-child{
  53348. color: #f00;
  53349. }
  53350. }
  53351. }
  53352. .tenant--per--bar{
  53353. .bg--bar{
  53354. .fill--bar{
  53355. background-color: #f00;
  53356. }
  53357. }
  53358. }
  53359. }
  53360. }
  53361. &.major{
  53362. .tenant--per--wrap{
  53363. .tenant--per--num{
  53364. span{
  53365. &:first-child{
  53366. color: #C96103;
  53367. }
  53368. }
  53369. }
  53370. .tenant--per--bar{
  53371. .bg--bar{
  53372. .fill--bar{
  53373. background-color: #C96103;
  53374. }
  53375. }
  53376. }
  53377. }
  53378. }
  53379. &.minor{
  53380. .tenant--per--wrap{
  53381. .tenant--per--num{
  53382. span{
  53383. &:first-child{
  53384. color: #DDA405;
  53385. }
  53386. }
  53387. }
  53388. .tenant--per--bar{
  53389. .bg--bar{
  53390. .fill--bar{
  53391. background-color: #DDA405;
  53392. }
  53393. }
  53394. }
  53395. }
  53396. }
  53397. &.normal{
  53398. .tenant--per--wrap{
  53399. .tenant--per--num{
  53400. span{
  53401. &:first-child{
  53402. color: #2D8CFA;
  53403. }
  53404. }
  53405. }
  53406. .tenant--per--bar{
  53407. .bg--bar{
  53408. .fill--bar{
  53409. background-color: #2D8CFA;
  53410. }
  53411. }
  53412. }
  53413. }
  53414. }
  53415. }
  53416. }
  53417. }
  53418. .swiper-pagination{
  53419. position: static;
  53420. width: auto;
  53421. margin-top: 0.75rem;
  53422. .swiper-pagination-bullet{
  53423. margin-left: 0;
  53424. margin-right: 0.63rem;
  53425. width: 0.75rem;
  53426. height: 0.75rem;
  53427. background-color: #E9E9E9;
  53428. opacity: 1;
  53429. &.swiper-pagination-bullet-active{
  53430. background-color: #6F8AA6;
  53431. }
  53432. &:last-child{
  53433. margin-right: 0;
  53434. }
  53435. }
  53436. }
  53437. }
  53438. &.swiper--view--2{
  53439. .swiper{
  53440. .swiper-wrapper{
  53441. .swiper-slide{
  53442. display: flex;
  53443. gap: 0.5rem;
  53444. .equip--card--wrap{
  53445. width: 50%;
  53446. .equip--card{
  53447. padding: 0.5rem 0.94rem;
  53448. align-items: flex-start;
  53449. justify-content: space-between;
  53450. .equip--name{
  53451. font-size: 0.7rem;
  53452. font-style: normal;
  53453. font-weight: 700;
  53454. width: 25%;
  53455. word-break: keep-all;
  53456. margin-right: 0.5rem;
  53457. }
  53458. .equip--st{
  53459. display: flex;
  53460. flex-direction: column;
  53461. row-gap: 0.5rem;
  53462. width: calc(75% - 0.5rem);
  53463. > li{
  53464. width: 100%;
  53465. display: flex;
  53466. align-items: center;
  53467. .circle{
  53468. width: 0.375rem;
  53469. height: 0.375rem;
  53470. }
  53471. > p{
  53472. font-size: 0.6rem;
  53473. }
  53474. span{
  53475. font-size: 0.6rem;
  53476. }
  53477. }
  53478. }
  53479. }
  53480. }
  53481. }
  53482. .tenant--card--wrap{
  53483. display: flex;
  53484. flex-direction: column;
  53485. gap: 0.62rem;
  53486. .tenant--card{
  53487. border-radius: 0.625rem;
  53488. border: 1px solid #EFEFEF;
  53489. background: #F8F8F8;
  53490. padding: 0.94rem 1.25rem;
  53491. .tenant--name{
  53492. display: flex;
  53493. justify-content: space-between;
  53494. margin-bottom: 0.62rem;
  53495. p{
  53496. color: #222;
  53497. font-size: 0.8125rem;
  53498. font-weight: 500;
  53499. letter-spacing: -0.00813rem;
  53500. }
  53501. .ico{
  53502. width: 0.875rem;
  53503. height: 0.875rem;
  53504. background-image: url(../img/ico_pin_off.svg);
  53505. background-repeat: no-repeat;
  53506. background-size: cover;
  53507. cursor: pointer;
  53508. &.active{
  53509. background-image: url(../img/ico_pin_on.svg);
  53510. }
  53511. }
  53512. }
  53513. .tenant--per--wrap{
  53514. display: flex;
  53515. gap: 0.94rem;
  53516. justify-content: space-between;
  53517. .tenant--per--num{
  53518. span{
  53519. &:nth-child(1){
  53520. color: #438DFF;
  53521. font-size: 1.125rem;
  53522. font-weight: 900;
  53523. letter-spacing: -0.01125rem;
  53524. margin-right: 0.2rem;
  53525. }
  53526. &:nth-child(2){
  53527. color: #8C8C8C;
  53528. font-size: 0.75rem;
  53529. font-weight: 500;
  53530. letter-spacing: -0.0075rem;
  53531. }
  53532. }
  53533. }
  53534. .tenant--per--bar{
  53535. width: 100%;
  53536. position: relative;
  53537. .bg--bar{
  53538. position: absolute;
  53539. bottom: 0;
  53540. width: 100%;
  53541. background-color: #EAEAEA;
  53542. border-radius: 6.25rem;
  53543. height: 0.75rem;
  53544. .fill--bar{
  53545. height: 0.75rem;
  53546. line-height: 0.75rem;
  53547. background: #438DFF;
  53548. border-radius: 6.25rem;
  53549. color: #FFF;
  53550. text-align: center;
  53551. font-size: 0.625rem;
  53552. font-weight: 700;
  53553. letter-spacing: -0.00625rem;
  53554. }
  53555. }
  53556. }
  53557. }
  53558. &.warning{
  53559. .tenant--per--wrap{
  53560. .tenant--per--num{
  53561. span{
  53562. &:first-child{
  53563. color: #E1473D;
  53564. }
  53565. }
  53566. }
  53567. .tenant--per--bar{
  53568. .bg--bar{
  53569. .fill--bar{
  53570. background-color: #e1473d;
  53571. }
  53572. }
  53573. }
  53574. }
  53575. }
  53576. }
  53577. }
  53578. }
  53579. .swiper-pagination{
  53580. position: static;
  53581. width: auto;
  53582. margin-top: 0.75rem;
  53583. .swiper-pagination-bullet{
  53584. margin-left: 0;
  53585. margin-right: 0.63rem;
  53586. width: 0.75rem;
  53587. height: 0.75rem;
  53588. background-color: #E9E9E9;
  53589. opacity: 1;
  53590. &.swiper-pagination-bullet-active{
  53591. background-color: #6F8AA6;
  53592. }
  53593. &:last-child{
  53594. margin-right: 0;
  53595. }
  53596. }
  53597. }
  53598. }
  53599. }
  53600. }
  53601. }
  53602. }
  53603. &.type2{
  53604. .core--component--wrap{
  53605. .inner--header--wrap{
  53606. &.mt--15rem{
  53607. margin-top: 1.56rem;
  53608. }
  53609. .inner--component--title{
  53610. &.none--after{
  53611. &::after{
  53612. display: none;
  53613. }
  53614. }
  53615. }
  53616. .pagenation--wrapper{
  53617. .search--box{
  53618. display: flex;
  53619. padding-left: 1.25rem;
  53620. position: relative;
  53621. gap: 0.63rem;
  53622. &::before{
  53623. content: '';
  53624. width: 0.0625rem;
  53625. height: 1.125rem;
  53626. position: absolute;
  53627. top: 50%;
  53628. transform: translateY(-50%);
  53629. left: 0;
  53630. background-color: #E0E0E0;
  53631. }
  53632. .custom-btn{
  53633. &.sort-btn{
  53634. width: 2.25rem;
  53635. height: 2.25rem;
  53636. min-width: 2.25rem;
  53637. border-radius: 0.3125rem;
  53638. border: 1px solid #D1D1D1;
  53639. background-color: #FFF;
  53640. padding: 0;
  53641. background-size: 0.875rem 0.875rem;
  53642. background-image: url(../img/ico_sort.svg);
  53643. background-repeat: no-repeat;
  53644. background-position: center;
  53645. }
  53646. }
  53647. .sort--atv{
  53648. position: absolute;
  53649. right: 0;
  53650. background-color: #fff;
  53651. border-radius: 0.5rem;
  53652. box-shadow: 0px 0px 6px 0px rgba(0, 0, 0, 0.15);
  53653. padding: 1.25rem 1.38rem;
  53654. z-index: 2;
  53655. top: 2.5rem;
  53656. ul{
  53657. display: flex;
  53658. flex-direction: column;
  53659. gap: 0.94rem;
  53660. li{
  53661. color: #000;
  53662. font-size: 0.8125rem;
  53663. font-style: normal;
  53664. font-weight: 400;
  53665. cursor: pointer;
  53666. &.atv{
  53667. font-weight: 700;
  53668. }
  53669. }
  53670. }
  53671. }
  53672. }
  53673. }
  53674. }
  53675. .inner--content{
  53676. padding-top: 1rem;
  53677. .ran--card{
  53678. display: flex;
  53679. gap: 0.94rem;
  53680. flex-wrap: wrap;
  53681. >li{
  53682. border-radius: 0.625rem;
  53683. border: 1px solid #EFEFEF;
  53684. background: #F8F8F8;
  53685. width: calc(100% / 9 - 0.84rem);
  53686. padding: 1rem;
  53687. height: 7rem;
  53688. &:hover{
  53689. border: 1px solid #b4d1ff;
  53690. }
  53691. .ran--title{
  53692. display: flex;
  53693. justify-content: space-between;
  53694. align-items: center;
  53695. margin-bottom: 0.5rem;
  53696. .ran--area{
  53697. color: #222;
  53698. font-size: 0.8rem;
  53699. font-weight: 700;
  53700. }
  53701. .more--btn{
  53702. width:0.875rem;
  53703. height:0.875rem;
  53704. min-width: 0.875rem;
  53705. padding: 0;
  53706. background: url(../img/ico_ran_arrow_gray.svg) no-repeat center;
  53707. background-size: cover;
  53708. }
  53709. }
  53710. .ran--stat{
  53711. display: flex;
  53712. flex-direction: column;
  53713. gap: 0.25rem;
  53714. p{
  53715. display: flex;
  53716. justify-content: space-between;
  53717. span{
  53718. color: #222;
  53719. font-size: 0.7rem;
  53720. font-weight: 500;
  53721. &:nth-child(2){
  53722. font-weight: 700;
  53723. color: #111111;
  53724. }
  53725. }
  53726. }
  53727. }
  53728. &.ran--blue{
  53729. border: 1px solid #1E76FF;
  53730. background: #438DFF;
  53731. .ran--title{
  53732. span{
  53733. color: #ffffff;
  53734. }
  53735. .more--btn{
  53736. background-image: url(../img/ico_ran_arrow_white.svg);
  53737. }
  53738. }
  53739. .ran--stat{
  53740. p{
  53741. span{
  53742. color: #ffffff;
  53743. &.color--yel{
  53744. color: #FAFF00;
  53745. }
  53746. }
  53747. }
  53748. }
  53749. }
  53750. &.ran--red{
  53751. border: 1px solid #BB251B;
  53752. background: #E1473D;
  53753. .ran--title{
  53754. span{
  53755. color: #ffffff;
  53756. }
  53757. .more--btn{
  53758. background-image: url(../img/ico_ran_arrow_white.svg);
  53759. }
  53760. }
  53761. .ran--stat{
  53762. p{
  53763. span{
  53764. color: #ffffff;
  53765. &.color--yel{
  53766. color: #FAFF00;
  53767. }
  53768. }
  53769. }
  53770. }
  53771. }
  53772. }
  53773. }
  53774. .core--card{
  53775. row-gap: 0.5rem;
  53776. > li{
  53777. .card--header{
  53778. h2{
  53779. font-size: 0.8rem;
  53780. }
  53781. }
  53782. }
  53783. }
  53784. }
  53785. &.small{
  53786. .inner--content{
  53787. .equip--card--wrap{
  53788. height: calc(100% - 1.6rem);
  53789. }
  53790. }
  53791. }
  53792. }
  53793. .user--list--wrap{
  53794. height: 100%;
  53795. .current--value{
  53796. right: -4rem;
  53797. width: auto;
  53798. }
  53799. }
  53800. .user--list--contents{
  53801. height: 100%;
  53802. .tbl-wrapper{
  53803. box-shadow: none;
  53804. .user--list--pin{
  53805. color: transparent;
  53806. background-image: url(../img/ico_pin_on.svg);
  53807. width: 1rem;
  53808. height: 1rem;
  53809. background-size: cover;
  53810. display: inline-block;
  53811. line-height: 1rem;
  53812. background-position: center;
  53813. }
  53814. .none--pin{
  53815. color: #444444;
  53816. font-size: 0.875rem;
  53817. font-weight: 400;
  53818. }
  53819. .user--list--ban{
  53820. color: rgba(34, 34, 34, 0.3);
  53821. &::after{
  53822. content: '';
  53823. width: 0.875rem;
  53824. height: 0.875rem;
  53825. background-image: url(../img/ico_ban.svg);
  53826. display: inline-block;
  53827. background-size: cover;
  53828. margin-left: 0.5rem;
  53829. }
  53830. }
  53831. .user--list--dis{
  53832. color: rgba(34, 34, 34, 0.3);
  53833. }
  53834. .user--list--critical{
  53835. &::before{
  53836. content: '';
  53837. display: inline-block;
  53838. margin-right: 0.62rem;
  53839. border-radius: 50%;
  53840. width: 0.75rem;
  53841. height: 0.75rem;
  53842. background-color: #f00;
  53843. }
  53844. }
  53845. .user--list--major{
  53846. &::before{
  53847. content: '';
  53848. display: inline-block;
  53849. margin-right: 0.62rem;
  53850. border-radius: 50%;
  53851. width: 0.75rem;
  53852. height: 0.75rem;
  53853. background-color: #C96103;
  53854. }
  53855. }
  53856. .user--list--minor{
  53857. &::before{
  53858. content: '';
  53859. display: inline-block;
  53860. margin-right: 0.62rem;
  53861. border-radius: 50%;
  53862. width: 0.75rem;
  53863. height: 0.75rem;
  53864. background-color: #DDA405;
  53865. }
  53866. }
  53867. .user--list--normal{
  53868. &::before{
  53869. content: '';
  53870. display: inline-block;
  53871. margin-right: 0.62rem;
  53872. border-radius: 50%;
  53873. width: 0.75rem;
  53874. height: 0.75rem;
  53875. background-color: #2D8CFA;
  53876. }
  53877. }
  53878. }
  53879. }
  53880. .user--list--bar--graph{
  53881. height: 100%;
  53882. padding:1.25rem;
  53883. .inner--header--wrap{
  53884. display: flex;
  53885. align-items: center;
  53886. justify-content: space-between;
  53887. .current--date{
  53888. color: #8E8E8E;
  53889. font-size: 0.8125rem;
  53890. font-weight: 400;
  53891. }
  53892. .pagenation--wrapper{
  53893. display: flex;
  53894. align-items: center;
  53895. gap:1.25rem;
  53896. .total--wrapper{
  53897. color: #222;
  53898. font-size: 0.8125rem;
  53899. font-weight: 400;
  53900. .total--count{
  53901. color: #438DFF;
  53902. font-size: 0.8125rem;
  53903. font-weight: 700;
  53904. }
  53905. }
  53906. .pager--btn--wrap{
  53907. display: flex;
  53908. align-items: center;
  53909. justify-content: center;
  53910. gap:0.94rem;
  53911. .page--numb{
  53912. height:1.625rem;
  53913. line-height: 1.625rem;;
  53914. display: flex;
  53915. align-items: center;
  53916. gap:0.1rem;
  53917. .current{
  53918. color: #333;
  53919. font-size: 0.8125rem;
  53920. font-weight: 700;
  53921. }
  53922. color: #666;
  53923. font-size: 0.8125rem;
  53924. font-weight: 400;
  53925. }
  53926. .page--btn{
  53927. border-radius: 0.5rem;
  53928. border: 1px solid #DDD!important;
  53929. background: #FFF;
  53930. width:1.625rem!important;
  53931. min-width:1.635rem!important;
  53932. height:1.625rem!important;
  53933. padding:0px!important;
  53934. &.prev--btn{
  53935. background:url(../img/ic_chv.svg) no-repeat center;
  53936. }
  53937. &.next--btn{
  53938. background:url(../img/ic_chv.svg) no-repeat center;
  53939. transform: rotate(180deg);
  53940. }
  53941. }
  53942. }
  53943. .search--box{
  53944. display: flex;
  53945. padding-left: 1.25rem;
  53946. position: relative;
  53947. gap: 0.63rem;
  53948. &::before{
  53949. content: '';
  53950. width: 0.0625rem;
  53951. height: 1.125rem;
  53952. position: absolute;
  53953. top: 50%;
  53954. transform: translateY(-50%);
  53955. left: 0;
  53956. background-color: #E0E0E0;
  53957. }
  53958. .custom-btn{
  53959. &.sort-btn{
  53960. width: 2.25rem;
  53961. height: 2.25rem;
  53962. min-width: 2.25rem;
  53963. border-radius: 0.3125rem;
  53964. border: 1px solid #D1D1D1;
  53965. background-color: #FFF;
  53966. padding: 0;
  53967. background-size: 0.875rem 0.875rem;
  53968. background-image: url(../img/ico_sort.svg);
  53969. background-repeat: no-repeat;
  53970. background-position: center;
  53971. }
  53972. }
  53973. }
  53974. }
  53975. }
  53976. .user--list--contents{
  53977. height:calc(100% - 1.25rem);
  53978. .data--list--content--modal{
  53979. width:100%;
  53980. display: flex;
  53981. align-items:flex-start;
  53982. justify-content: flex-start;
  53983. flex-wrap:wrap;
  53984. padding:0;
  53985. padding-bottom:1.25rem;
  53986. padding-top: 0.8rem;
  53987. gap:0.45rem;
  53988. > li{
  53989. border-radius: 0.625rem;
  53990. border: 1px solid #EFEFEF;
  53991. background: #F8F8F8;
  53992. width:calc( (100% - (0.94rem * 3)) / 4);
  53993. padding:0.52rem;
  53994. >h2{
  53995. display: flex;
  53996. align-items: center;
  53997. justify-content: space-between;
  53998. span{
  53999. color: #222;
  54000. font-size: 0.75rem;
  54001. font-weight: 500;
  54002. letter-spacing: -0.0075rem;
  54003. display: flex;
  54004. align-items: center;
  54005. justify-content: space-between;
  54006. gap:0.31rem;
  54007. .ico--disconnected{
  54008. display: inline-flex;
  54009. min-width: 0.875rem;
  54010. min-height:0.8975rem;
  54011. width: 0.875rem;
  54012. height: 0.875rem;
  54013. background:url(../img/ic_ds.svg) no-repeat center;
  54014. }
  54015. }
  54016. .icon--control{
  54017. .pin--lock{
  54018. width: 0.875rem;
  54019. min-width:0.875rem;
  54020. height: 0.875rem;
  54021. padding:0px;
  54022. background: url(../img/ic_tack_off.svg) no-repeat center;
  54023. &.on{
  54024. background: url(../img/ic_tack_on.svg) no-repeat center;
  54025. }
  54026. }
  54027. }
  54028. }
  54029. .data--column{
  54030. padding-top:.25rem;
  54031. display: flex;
  54032. align-items: center;
  54033. width:100%;
  54034. gap:1rem;
  54035. .data--bar--chart{
  54036. width:100%;
  54037. .data--bar--wrap{
  54038. width:100%;
  54039. height: 0.75rem;
  54040. border-radius: 6.25rem;
  54041. background: #EAEAEA;
  54042. .data--bar--current{
  54043. color: #FFF;
  54044. font-size: 0.625rem;
  54045. height:0.75rem;
  54046. line-height: 0.75rem;
  54047. font-weight: 700;
  54048. letter-spacing: -0.00625rem;
  54049. background:#55E074;
  54050. border-radius: 6.25rem;
  54051. padding:0rem 0.37rem;
  54052. }
  54053. }
  54054. }
  54055. .percent{
  54056. color: #43D263;
  54057. font-size: .9025rem;
  54058. font-weight: 900;
  54059. letter-spacing: -0.01125rem;
  54060. display: flex;
  54061. align-items: center;
  54062. gap:0.22rem;
  54063. .unit{
  54064. color: #8C8C8C;
  54065. font-size: 0.75rem;
  54066. font-weight: 500;
  54067. letter-spacing: -0.0075rem;
  54068. font-style: normal;
  54069. }
  54070. }
  54071. }
  54072. &.discon{
  54073. > h2{
  54074. > span{
  54075. color: rgba(34, 34, 34, 0.3);
  54076. &::after{
  54077. content: '';
  54078. width: 0.875rem;
  54079. height: 0.875rem;
  54080. background-image: url(../img/ico_ban.svg);
  54081. display: inline-block;
  54082. background-size: cover;
  54083. }
  54084. }
  54085. }
  54086. }
  54087. &.critical{
  54088. .data--column{
  54089. .percent{
  54090. color: #f00;
  54091. }
  54092. .data--bar--chart{
  54093. .data--bar--wrap{
  54094. .data--bar--current{
  54095. background: #f00;
  54096. }
  54097. }
  54098. }
  54099. }
  54100. }
  54101. &.major{
  54102. .data--column{
  54103. .percent{
  54104. color: #C96103;
  54105. }
  54106. .data--bar--chart{
  54107. .data--bar--wrap{
  54108. .data--bar--current{
  54109. background: #C96103;
  54110. }
  54111. }
  54112. }
  54113. }
  54114. }
  54115. &.minor{
  54116. .data--column{
  54117. .percent{
  54118. color: #DDA405;
  54119. }
  54120. .data--bar--chart{
  54121. .data--bar--wrap{
  54122. .data--bar--current{
  54123. background: #DDA405;
  54124. }
  54125. }
  54126. }
  54127. }
  54128. }
  54129. &.normal{
  54130. .data--column{
  54131. .percent{
  54132. color: #2D8CFA;
  54133. }
  54134. .data--bar--chart{
  54135. .data--bar--wrap{
  54136. .data--bar--current{
  54137. background: #2D8CFA;
  54138. }
  54139. }
  54140. }
  54141. }
  54142. }
  54143. }
  54144. }
  54145. }
  54146. &.small{
  54147. height:100%;
  54148. .data--list--content--modal{
  54149. height:100%;
  54150. > li{
  54151. width: calc((100% - (0.62rem * 3)) / 5);
  54152. height:calc( ( 100% - 2.5rem) / 4)!important;
  54153. }
  54154. }
  54155. }
  54156. }
  54157. .pagenation--wrapper{
  54158. display: flex;
  54159. align-items: center;
  54160. gap:1.25rem;
  54161. .btn--list--content{
  54162. position: relative;
  54163. display: flex;
  54164. align-items: center;
  54165. gap:0.62rem;
  54166. margin-left:0.625rem;
  54167. &:before{
  54168. content:'';
  54169. display: block;
  54170. width: 0.0625rem;
  54171. height: 1.125rem;
  54172. background: #E0E0E0;
  54173. position: absolute;
  54174. top:50%;
  54175. transform: translateY(-50%);
  54176. left:-0.94rem;
  54177. }
  54178. }
  54179. .shape--selector{
  54180. display: flex;
  54181. align-items: center;
  54182. gap:0.62rem;
  54183. position: relative;
  54184. margin-left:0.625rem;
  54185. &:before{
  54186. content:'';
  54187. display: block;
  54188. width: 0.0625rem;
  54189. height: 1.125rem;
  54190. background: #E0E0E0;
  54191. position: absolute;
  54192. top:50%;
  54193. transform: translateY(-50%);
  54194. left:-0.94rem;
  54195. }
  54196. .v-btn{
  54197. border-radius: 0.5rem;
  54198. border: 1px solid #DDD;
  54199. background: #FFF;
  54200. width: 1.625rem;
  54201. min-width:1.625rem!important;
  54202. height: 1.625rem;
  54203. padding:0px;
  54204. &.card--type--btn{
  54205. background:url(../img/ic_card_off.svg) no-repeat center;
  54206. &.on{
  54207. background:#6F8AA6 url(../img/ic_card_on.svg) no-repeat center;
  54208. }
  54209. }
  54210. &.list--type--btn{
  54211. background:url(../img/ic_list_off.svg) no-repeat center;
  54212. &.on{
  54213. background:#6F8AA6 url(../img/ic_list_on.svg) no-repeat center;
  54214. }
  54215. }
  54216. }
  54217. }
  54218. .all--view--btn{
  54219. display: flex;
  54220. height: 1.875rem;
  54221. padding: 0.625rem;
  54222. align-items: center;
  54223. padding:0px!important;
  54224. border-radius: 6.25rem;
  54225. background: #438DFF;
  54226. width:5.625rem;
  54227. *{
  54228. color: #FFF!important;
  54229. font-size: 0.8125rem;
  54230. font-weight: 500;
  54231. letter-spacing: -0.00813rem;
  54232. }
  54233. .icon{
  54234. width: 0.875rem;
  54235. height: 0.875rem;
  54236. background: url(../img/ic_allview.svg) no-repeat center;
  54237. margin-right:0.3125rem;
  54238. }
  54239. }
  54240. .issue--cont{
  54241. display: flex;
  54242. align-items: center;
  54243. justify-content: center;
  54244. color: #444;
  54245. font-size: 0.8125rem;
  54246. font-weight: 500;
  54247. letter-spacing: -0.00813rem;
  54248. border-radius: 6.25rem;
  54249. border: 1px solid #EAB2AE;
  54250. background: #FFF;
  54251. height: 1.875rem;
  54252. padding: 0.625rem;
  54253. gap: 0.3125rem;
  54254. .icon{
  54255. width:0.875rem;
  54256. height:0.875rem;
  54257. background: url(../img/ic_issue_flag.svg) no-repeat center;
  54258. }
  54259. .current--value{
  54260. color: #E1473D;
  54261. font-size: 0.8125rem;
  54262. font-weight: 700;
  54263. letter-spacing: -0.00813rem;
  54264. }
  54265. }
  54266. .total--wrapper{
  54267. color: #222;
  54268. font-size: 0.8125rem;
  54269. font-weight: 400;
  54270. .total--count{
  54271. color: #438DFF;
  54272. font-size: 0.8125rem;
  54273. font-weight: 700;
  54274. }
  54275. }
  54276. .pager--btn--wrap{
  54277. display: flex;
  54278. align-items: center;
  54279. justify-content: center;
  54280. gap:0.94rem;
  54281. .page--numb{
  54282. height:1.625rem;
  54283. line-height: 1.625rem;;
  54284. display: flex;
  54285. align-items: center;
  54286. gap:0.1rem;
  54287. .current{
  54288. color: #333;
  54289. font-size: 0.8125rem;
  54290. font-weight: 700;
  54291. }
  54292. color: #666;
  54293. font-size: 0.8125rem;
  54294. font-weight: 400;
  54295. }
  54296. .page--btn{
  54297. border-radius: 0.5rem;
  54298. border: 1px solid #DDD!important;
  54299. background: #FFF;
  54300. width:1.625rem!important;
  54301. min-width:1.635rem!important;
  54302. height:1.625rem!important;
  54303. padding:0px!important;
  54304. &.prev--btn{
  54305. background:url(../img/ic_chv.svg) no-repeat center;
  54306. }
  54307. &.next--btn{
  54308. background:url(../img/ic_chv.svg) no-repeat center;
  54309. transform: rotate(180deg);
  54310. }
  54311. }
  54312. }
  54313. }
  54314. }
  54315. &.type1{
  54316. .core--component--wrap{
  54317. .inner--header--wrap{
  54318. .pagenation--wrapper{
  54319. .search--box{
  54320. display: flex;
  54321. padding-left: 1.25rem;
  54322. position: relative;
  54323. gap: 0.63rem;
  54324. &::before{
  54325. content: '';
  54326. width: 0.0625rem;
  54327. height: 1.125rem;
  54328. position: absolute;
  54329. top: 50%;
  54330. transform: translateY(-50%);
  54331. left: 0;
  54332. background-color: #E0E0E0;
  54333. }
  54334. .custom-btn{
  54335. &.sort-btn{
  54336. width: 2.25rem;
  54337. height: 2.25rem;
  54338. min-width: 2.25rem;
  54339. border-radius: 0.3125rem;
  54340. border: 1px solid #D1D1D1;
  54341. background-color: #ffffff;
  54342. padding: 0;
  54343. background-size: 0.875rem 0.875rem;
  54344. background-image: url(../img/ico_sort.svg);
  54345. background-repeat: no-repeat;
  54346. background-position: center;
  54347. }
  54348. }
  54349. .sort--atv{
  54350. position: absolute;
  54351. right: 0;
  54352. background-color: #fff;
  54353. border-radius: 0.5rem;
  54354. box-shadow: 0px 0px 6px 0px rgba(0, 0, 0, 0.15);
  54355. padding: 1.25rem 1.38rem;
  54356. z-index: 2;
  54357. top: 2.5rem;
  54358. ul{
  54359. display: flex;
  54360. flex-direction: column;
  54361. gap: 0.94rem;
  54362. li{
  54363. color: #000;
  54364. font-size: 0.8125rem;
  54365. font-style: normal;
  54366. font-weight: 400;
  54367. cursor: pointer;
  54368. &.atv{
  54369. font-weight: 700;
  54370. }
  54371. }
  54372. }
  54373. }
  54374. }
  54375. }
  54376. }
  54377. .inner--content{
  54378. padding-top: 0.8rem;
  54379. height: 100%;
  54380. .core--card{
  54381. > li{}
  54382. }
  54383. }
  54384. &.small{
  54385. .inner--content{
  54386. .equip--card--wrap{
  54387. .equip--card{
  54388. &.critical{
  54389. border: 1px solid #F4A19C;
  54390. background-color: #FFF4F3
  54391. }
  54392. &.major{
  54393. border: 1px solid #FFD3AC;
  54394. background-color: #FFF6EE;
  54395. }
  54396. &.minor{
  54397. border: 1px solid #FFE6A5;
  54398. background-color: #FFF7E2;
  54399. }
  54400. &.normal{
  54401. border: 1px solid #E3E3E3;
  54402. background-color: #ffffff;
  54403. }
  54404. // &:hover{
  54405. // &::after{
  54406. // background-color: rgba(67, 141, 255, 0.20)!important;
  54407. // content: '';
  54408. // width: 100%;
  54409. // height: 100%;
  54410. // border-radius: 0.625rem;
  54411. // position: absolute;
  54412. // top: 0;
  54413. // left: 0;
  54414. // }
  54415. // }
  54416. &.discon{
  54417. &::after{
  54418. content:'';
  54419. width: 100%;
  54420. height: 100%;
  54421. background-color: rgba(255, 0, 0, 0.50);
  54422. border-radius: 0.625rem;
  54423. position: absolute;
  54424. top: 0;
  54425. left: 0;
  54426. background-image: url(../img/ico_wifi.svg);
  54427. background-size: 2.5rem 2.5rem;
  54428. background-position: center;
  54429. }
  54430. }
  54431. .equip--st{
  54432. .circle{
  54433. &.critical{
  54434. background-color: #FF0000;
  54435. }
  54436. &.major{
  54437. background-color: #C96103;
  54438. }
  54439. &.minor{
  54440. background-color: #DDA405;
  54441. }
  54442. &.warning{
  54443. background-color: #D1B568;
  54444. }
  54445. &.normal{
  54446. background-color: #2D8CFA;
  54447. }
  54448. }
  54449. }
  54450. }
  54451. }
  54452. }
  54453. }
  54454. }
  54455. .user--list--wrap{
  54456. height: 100%;
  54457. .current--value{
  54458. right: -4rem;
  54459. width: auto;
  54460. }
  54461. }
  54462. .user--list--bar--graph{
  54463. height: 100%;
  54464. }
  54465. .user--list--contents{
  54466. height: 100%;
  54467. .tbl-wrapper{
  54468. box-shadow: none;
  54469. .user--list--pin{
  54470. color: transparent;
  54471. background-image: url(../img/ico_pin_on.svg);
  54472. width: 1rem;
  54473. height: 1rem;
  54474. background-size: cover;
  54475. display: inline-block;
  54476. line-height: 1rem;
  54477. background-position: center;
  54478. }
  54479. .none--pin{
  54480. color: #444444;
  54481. font-size: 0.875rem;
  54482. font-weight: 400;
  54483. }
  54484. .user--list--ban{
  54485. color: rgba(34, 34, 34, 0.3);
  54486. &::after{
  54487. content: '';
  54488. width: 0.875rem;
  54489. height: 0.875rem;
  54490. background-image: url(../img/ico_ban.svg);
  54491. display: inline-block;
  54492. background-size: cover;
  54493. margin-left: 0.5rem;
  54494. }
  54495. }
  54496. .user--list--dis{
  54497. color: rgba(34, 34, 34, 0.3);
  54498. }
  54499. .user--list--critical{
  54500. &::before{
  54501. content: '';
  54502. display: inline-block;
  54503. margin-right: 0.62rem;
  54504. border-radius: 50%;
  54505. width: 0.75rem;
  54506. height: 0.75rem;
  54507. background-color: #f00;
  54508. }
  54509. }
  54510. .user--list--major{
  54511. &::before{
  54512. content: '';
  54513. display: inline-block;
  54514. margin-right: 0.62rem;
  54515. border-radius: 50%;
  54516. width: 0.75rem;
  54517. height: 0.75rem;
  54518. background-color: #C96103;
  54519. }
  54520. }
  54521. .user--list--minor{
  54522. &::before{
  54523. content: '';
  54524. display: inline-block;
  54525. margin-right: 0.62rem;
  54526. border-radius: 50%;
  54527. width: 0.75rem;
  54528. height: 0.75rem;
  54529. background-color: #DDA405;
  54530. }
  54531. }
  54532. .user--list--normal{
  54533. &::before{
  54534. content: '';
  54535. display: inline-block;
  54536. margin-right: 0.62rem;
  54537. border-radius: 50%;
  54538. width: 0.75rem;
  54539. height: 0.75rem;
  54540. background-color: #2D8CFA;
  54541. }
  54542. }
  54543. }
  54544. }
  54545. .map--contents--wrap{
  54546. .header--wrapper{
  54547. .control--wrap{
  54548. .custom-btn{
  54549. background-color: #d4d4d4;
  54550. &.on{
  54551. background-color: #438DFF;
  54552. }
  54553. }
  54554. }
  54555. }
  54556. .inner--content--wrapper{
  54557. .map--sub--info{
  54558. .status--row{
  54559. > ul{
  54560. > li{
  54561. .icon{
  54562. background-size: cover;
  54563. }
  54564. }
  54565. }
  54566. }
  54567. .status--list{
  54568. width: 15.625rem;
  54569. .drp--header{
  54570. &.active{
  54571. background-color: #6f8aa6;
  54572. > div{
  54573. color: #ffffff;
  54574. span{
  54575. color: #ffffff;
  54576. }
  54577. .drop--btn{
  54578. background-image: url(../img/ic_drop_down_on.svg);
  54579. }
  54580. }
  54581. .drp--titles{
  54582. &::before{
  54583. background-image: url(../img/ic_tenant_small_white.svg);
  54584. }
  54585. }
  54586. }
  54587. .drp--titles{
  54588. &::before{
  54589. background-size: cover;
  54590. }
  54591. }
  54592. .drp--current--data{
  54593. .drop--btn{
  54594. background-size: cover;
  54595. }
  54596. }
  54597. }
  54598. .drp--content{
  54599. border-top: none;
  54600. &.active{
  54601. height: auto;
  54602. }
  54603. ul{
  54604. padding: 0 1.25rem 1.25rem;
  54605. max-height: 20vh;
  54606. background-color: #F7F7F7;
  54607. overflow-y: auto;
  54608. li{
  54609. padding: 0.88rem 0;
  54610. border-bottom: 1px solid #E4E4E4;
  54611. &:last-child{
  54612. border-bottom: none;
  54613. }
  54614. }
  54615. }
  54616. &.type1{
  54617. li{
  54618. color: #333;
  54619. font-size: 0.8125rem;
  54620. font-weight: 400;
  54621. span{
  54622. color: #111;
  54623. font-weight: 500;
  54624. margin-left: 0.1rem;
  54625. }
  54626. }
  54627. }
  54628. &.type2{
  54629. li{
  54630. display: flex;
  54631. justify-content: space-between;
  54632. align-items: center;
  54633. .li--l{
  54634. color: #333;
  54635. font-size: 0.8125rem;
  54636. width: 65%;
  54637. white-space: nowrap;
  54638. overflow: hidden;
  54639. text-overflow: ellipsis;
  54640. font-weight: 500;
  54641. }
  54642. .li--r{
  54643. display: flex;
  54644. align-items: center;
  54645. gap: 0.94rem;
  54646. span{
  54647. color: #333;
  54648. font-size: 0.8125rem;
  54649. font-weight: 400;
  54650. }
  54651. .alarm{
  54652. width: 0.875rem;
  54653. height: 0.875rem;
  54654. background-size: cover;
  54655. display: inline-block;
  54656. background-image: url(../img/ico_alarm_gray.svg);
  54657. &.red{
  54658. background-image: url(../img/ico_alarm_red.svg);
  54659. }
  54660. &.green{
  54661. background-image: url(../img/ico_alarm_green.svg);
  54662. }
  54663. &.blue{
  54664. background-image: url(../img/ico_alarm_blue.svg);
  54665. }
  54666. }
  54667. }
  54668. }
  54669. }
  54670. &.type3{
  54671. li{
  54672. display: flex;
  54673. justify-content: space-between;
  54674. align-items: center;
  54675. .li--l{
  54676. color: #333;
  54677. font-size: 0.8125rem;
  54678. font-weight: 500;
  54679. width: 65%;
  54680. white-space: nowrap;
  54681. overflow: hidden;
  54682. text-overflow: ellipsis;
  54683. }
  54684. .li--r{
  54685. color: #666;
  54686. font-size: 0.8125rem;
  54687. font-weight: 400;
  54688. }
  54689. }
  54690. }
  54691. }
  54692. }
  54693. }
  54694. }
  54695. .inner--content{
  54696. padding-top: 1.25rem;
  54697. .ran--card{
  54698. display: flex;
  54699. gap: 0.94rem;
  54700. flex-wrap: wrap;
  54701. >li{
  54702. display: flex;
  54703. flex-direction: column;
  54704. border-radius: 0.625rem;
  54705. border: 1px solid #EFEFEF;
  54706. background: #F8F8F8;
  54707. width: calc((100% - 2.82rem) / 4);
  54708. padding: 1.25rem;
  54709. height: calc((100vh - 23.3rem) / 5);
  54710. &:hover{
  54711. border: 1px solid #b4d1ff;
  54712. }
  54713. .ran--title{
  54714. display: flex;
  54715. justify-content: space-between;
  54716. align-items: center;
  54717. margin-bottom: 1rem;
  54718. .ran--area{
  54719. color: #222;
  54720. font-size: 0.8125rem;
  54721. font-weight: 700;
  54722. }
  54723. .more--btn{
  54724. width:0.875rem;
  54725. height:0.875rem;
  54726. min-width: 0.875rem;
  54727. padding: 0;
  54728. background: url(../img/ico_ran_arrow_gray.svg) no-repeat center;
  54729. background-size: cover;
  54730. }
  54731. }
  54732. .ran--stat{
  54733. display: flex;
  54734. flex-direction: column;
  54735. gap: 0.6rem;
  54736. p{
  54737. display: flex;
  54738. justify-content: space-between;
  54739. span{
  54740. color: #222;
  54741. font-size: 0.75rem;
  54742. font-weight: 500;
  54743. &:nth-child(2){
  54744. font-weight: 700;
  54745. color: #111111;
  54746. }
  54747. }
  54748. }
  54749. }
  54750. &.ran--blue{
  54751. border: 1px solid #1E76FF;
  54752. background: #438DFF;
  54753. .ran--title{
  54754. span{
  54755. color: #ffffff;
  54756. }
  54757. .more--btn{
  54758. background-image: url(../img/ico_ran_arrow_white.svg);
  54759. }
  54760. }
  54761. .ran--stat{
  54762. p{
  54763. span{
  54764. color: #ffffff;
  54765. &.color--yel{
  54766. color: #FAFF00;
  54767. }
  54768. }
  54769. }
  54770. }
  54771. }
  54772. &.ran--red{
  54773. border: 1px solid #BB251B;
  54774. background: #E1473D;
  54775. .ran--title{
  54776. span{
  54777. color: #ffffff;
  54778. }
  54779. .more--btn{
  54780. background-image: url(../img/ico_ran_arrow_white.svg);
  54781. }
  54782. }
  54783. .ran--stat{
  54784. p{
  54785. span{
  54786. color: #ffffff;
  54787. &.color--yel{
  54788. color: #FAFF00;
  54789. }
  54790. }
  54791. }
  54792. }
  54793. }
  54794. &.ran--all{
  54795. border: 1px solid #1E76FF;
  54796. background: #3f5984;
  54797. .ran--title{
  54798. span{
  54799. color: #ffffff;
  54800. }
  54801. .more--btn{
  54802. background-image: url(../img/ico_ran_arrow_white.svg);
  54803. }
  54804. }
  54805. .ran--stat{
  54806. p{
  54807. span{
  54808. color: #ffffff;
  54809. &.color--yel{
  54810. color: #FAFF00;
  54811. }
  54812. }
  54813. }
  54814. }
  54815. }
  54816. }
  54817. }
  54818. }
  54819. }
  54820. }
  54821. }
  54822. }
  54823. }
  54824. .menu-flex-wrap {
  54825. gap: 1.88rem;
  54826. .system-menu {
  54827. width: 21.25rem;
  54828. padding: 1.25rem;
  54829. height: calc(100vh - 15rem);
  54830. border-radius: 0.5rem;
  54831. border: none;
  54832. box-shadow: 0px 0px 6px 0px rgba(0, 0, 0, 0.15);
  54833. background: #fff;
  54834. .system-menu-tit {
  54835. color: #111111;
  54836. font-size: 0.9375rem;
  54837. font-weight: 700;
  54838. line-height: 100%;
  54839. /* 0.9375rem */
  54840. letter-spacing: -0.01875rem;
  54841. background: #fff;
  54842. border-bottom: 1px solid #0B318B;
  54843. height: 2.8125rem;
  54844. padding: 0 1.12rem;
  54845. .ico {
  54846. margin-right: 0.62rem;
  54847. width: 0.875rem;
  54848. height: 0.875rem;
  54849. background-size: cover;
  54850. background-position: center;
  54851. background-repeat: no-repeat;
  54852. background-image: url(../img/ico_cate.svg);
  54853. }
  54854. }
  54855. .system-menu-in {
  54856. margin-top: 0;
  54857. padding: 0;
  54858. gap: 0;
  54859. .system-box {
  54860. .system-box-tit {
  54861. padding: 1.12rem;
  54862. font-size: 0.9375rem;
  54863. font-weight: 600 !important;
  54864. gap: 0.66rem;
  54865. border-bottom: 1px solid #EBEBEB;
  54866. color: #333333;
  54867. position: relative;
  54868. >button {
  54869. &:first-child {
  54870. background-image: none;
  54871. width: 0.4375rem;
  54872. height: 0.4375rem;
  54873. background-color: #9c9c9c;
  54874. border-radius: 50%;
  54875. }
  54876. &:nth-child(2) {
  54877. background-image: url(../img/ico_plus.svg);
  54878. width: 0.875rem;
  54879. height: 0.875rem;
  54880. position: absolute;
  54881. right: 1.12rem;
  54882. }
  54883. }
  54884. }
  54885. &.on {
  54886. .system-box-tit {
  54887. font-weight: 700 !important;
  54888. color: #0b318b;
  54889. >button {
  54890. &:first-child {
  54891. background-color: #0B318B;
  54892. }
  54893. &:nth-child(2) {
  54894. background-image: url(../img/ico_minus.svg);
  54895. }
  54896. }
  54897. }
  54898. }
  54899. .system-box-sub {
  54900. padding: 1.25rem 1.69rem;
  54901. background: #F8FAFF;
  54902. ul {
  54903. gap: 1.5625rem;
  54904. li {
  54905. gap: 0;
  54906. color: #000000;
  54907. font-size: 0.8125rem;
  54908. font-weight: 400;
  54909. letter-spacing: -0.01625rem;
  54910. line-height: 100%;
  54911. &::before {
  54912. display: none;
  54913. }
  54914. }
  54915. }
  54916. }
  54917. }
  54918. }
  54919. }
  54920. .menu-info {
  54921. height: calc(100vh - 15rem);
  54922. border: none;
  54923. border-radius: 0.5rem;
  54924. background-color: #fff;
  54925. box-shadow: 0px 0px 6px 0px rgba(0, 0, 0, 0.15);
  54926. .info-tit {
  54927. height: 4.6875rem;
  54928. background-color: #fff;
  54929. padding: 0 1.88rem;
  54930. letter-spacing: -0.01875rem;
  54931. font-size: 0.9375rem;
  54932. color: #111111;
  54933. border-radius: 0.5rem 0.5rem 0 0;
  54934. border-bottom: 1px solid #e9e9e9;
  54935. }
  54936. .menu-info-view {
  54937. padding: 1.25rem;
  54938. margin-top: 0;
  54939. height: calc(100vh - 19.6875rem);
  54940. .info-tbl {
  54941. .form-style2 {
  54942. &.shadow--type {
  54943. padding: 1.25rem 1.25rem 0.94rem 1.25rem;
  54944. box-shadow: 0px 0px 6px 0px rgba(0, 0, 0, 0.15);
  54945. border-radius: 0.5rem;
  54946. table {
  54947. tr {
  54948. th {
  54949. background-color: #fff;
  54950. padding: 1.13rem 0.62rem 1.13rem 0.62rem;
  54951. color: #444;
  54952. font-weight: 700;
  54953. font-size: 0.875rem;
  54954. border-right: none;
  54955. }
  54956. td {
  54957. color: #444444;
  54958. font-size: 0.875rem;
  54959. font-weight: 400;
  54960. line-height: 100%;
  54961. .input-wrap {
  54962. flex-direction: column;
  54963. gap: 1.25rem;
  54964. .custom-check {
  54965. &.v-input {
  54966. &.type2 {
  54967. .v-input__control {
  54968. .v-selection-control {
  54969. .v-label {
  54970. padding-left: 0.37rem;
  54971. color: #444444;
  54972. font-size: 0.875rem;
  54973. font-weight: 600;
  54974. }
  54975. .v-selection-control__wrapper {
  54976. .v-selection-control__input {
  54977. .v-icon {
  54978. background-size: cover;
  54979. }
  54980. }
  54981. }
  54982. }
  54983. }
  54984. }
  54985. }
  54986. }
  54987. }
  54988. }
  54989. &:last-child {
  54990. th {
  54991. border-bottom: none;
  54992. }
  54993. td {
  54994. border-bottom: none;
  54995. }
  54996. }
  54997. }
  54998. }
  54999. }
  55000. }
  55001. }
  55002. .no-data {
  55003. flex-direction: row;
  55004. gap: 0.63rem;
  55005. .ico {
  55006. background-image: url(../img/ico_no_data2.svg);
  55007. width: 1.25rem;
  55008. height: 1.25rem;
  55009. }
  55010. >p {
  55011. margin-top: 0;
  55012. color: #444444;
  55013. font-size: 0.875rem;
  55014. font-weight: 700;
  55015. }
  55016. }
  55017. }
  55018. }
  55019. }
  55020. }
  55021. .tbl-wrap {
  55022. .ag-theme-quartz {
  55023. &.ag--line--type {
  55024. .ag-root-wrapper {
  55025. .ag-header-group-cell {
  55026. .ag-header-cell-comp-wrapper {
  55027. justify-content: center;
  55028. font-size: 0.875rem;
  55029. color: #444444;
  55030. font-weight: 700;
  55031. }
  55032. }
  55033. .ag-header-row {
  55034. .ag-header-cell {
  55035. &:first-child {}
  55036. &:nth-child(2) {}
  55037. .ag-header-cell-resize {}
  55038. }
  55039. }
  55040. .lock-pinned {
  55041. background: #F2F7FF;
  55042. font-size: 0.875rem;
  55043. color: #444444;
  55044. font-weight: 700;
  55045. line-height: 2.55rem;
  55046. padding: 0 1.25rem;
  55047. }
  55048. }
  55049. }
  55050. .ag-root-wrapper {
  55051. .ag-root {
  55052. .ag-sticky-bottom {
  55053. width: 0 !important;
  55054. }
  55055. }
  55056. }
  55057. }
  55058. }
  55059. .custom-input{
  55060. &.v-text-field{
  55061. &.v-input--error{
  55062. .v-input__details{
  55063. padding-inline: 0;
  55064. padding-top: 0.63rem;
  55065. .v-messages{
  55066. .v-messages__message{
  55067. line-height: 100%;
  55068. color: #e50a0a;
  55069. font-size: 0.8125rem;
  55070. }
  55071. }
  55072. }
  55073. }
  55074. .v-input__control{
  55075. .v-field--error{
  55076. .v-field__field{
  55077. .v-field__input{
  55078. border: 1px solid #FF8C8C!important;
  55079. position: relative;
  55080. background-image: url(../img/ico_error.svg);
  55081. background-repeat: no-repeat;
  55082. background-size: 0.875rem 0.875rem;
  55083. background-position: right 0.75rem center;
  55084. }
  55085. }
  55086. }
  55087. }
  55088. }
  55089. }
  55090. // 로그인
  55091. .login-wrap{
  55092. .login--header{
  55093. position: fixed;
  55094. top: 0;
  55095. left: 0;
  55096. display: flex;
  55097. justify-content: space-between;
  55098. align-items: center;
  55099. padding: 1.25rem 1.88rem;
  55100. width: 100%;
  55101. background-color: #0B318B;
  55102. height: 4.75rem;
  55103. z-index: 100;
  55104. .login--header--l{
  55105. display: flex;
  55106. gap: 0.9375rem;
  55107. align-items: center;
  55108. .logo{
  55109. height: 2rem;
  55110. color:#fff;
  55111. }
  55112. p{
  55113. color: #ffffff;
  55114. font-size: 1.125rem;
  55115. font-weight: 700;
  55116. line-height: 100%;
  55117. }
  55118. }
  55119. .login--header--r{
  55120. .custom-select{
  55121. &.v-input{
  55122. .v-input__control{
  55123. .v-field {
  55124. border-radius: 0.375rem;
  55125. .v-field__field{
  55126. padding-left: 0.75rem;
  55127. }
  55128. }
  55129. }
  55130. }
  55131. }
  55132. &.dp--flex{
  55133. display: flex;
  55134. align-items: center;
  55135. .user-info {
  55136. display: flex;
  55137. position: relative;
  55138. .ico {
  55139. width: 1.625rem;
  55140. height: 1.625rem;
  55141. background: #fff;
  55142. border-radius: 100%;
  55143. color: #438DFF;
  55144. display: flex;
  55145. align-items: center;
  55146. justify-content: center;
  55147. font-weight: 700;
  55148. font-size: 1rem;
  55149. cursor: pointer;
  55150. }
  55151. .info-detail {
  55152. position: absolute;
  55153. top: 2.7rem;
  55154. left: 50%;
  55155. width: 11.88rem;
  55156. // height: 12.25rem;
  55157. padding: 1.25rem;
  55158. // background: url("../img/bg_tooltip4.svg") no-repeat center / 100%;
  55159. transform: translateX(-50%);
  55160. background: #FFF;
  55161. border:1px solid #ddd;
  55162. box-shadow:0px 4px 4px rgba(0, 0, 0, 0.20);
  55163. border-radius: 0.625rem;
  55164. &:after{
  55165. content: '';
  55166. display: block;
  55167. width: 0;
  55168. height: 0;
  55169. border-left: 0.40625rem solid transparent;
  55170. border-right: 0.40625rem solid transparent;
  55171. border-bottom: 0.6875rem solid #fff;
  55172. position: absolute;
  55173. top:-0.5875rem;
  55174. left:50%;
  55175. transform: translateX(-50%);
  55176. }
  55177. &:before{
  55178. content: '';
  55179. display: block;
  55180. width: 0;
  55181. height: 0;
  55182. border-left: 0.40625rem solid transparent;
  55183. border-right: 0.40625rem solid transparent;
  55184. border-bottom: 0.6875rem solid #ddd;
  55185. position: absolute;
  55186. top:-0.6875rem;
  55187. left:50%;
  55188. transform: translateX(-50%);
  55189. }
  55190. .custom--btn--wrap{
  55191. display: flex;
  55192. flex-direction: column;
  55193. gap:0.5rem;
  55194. }
  55195. p {
  55196. color: #111;
  55197. font-size: 0.94rem;
  55198. font-weight: 700;
  55199. margin-bottom: 0.94rem;
  55200. span {
  55201. font-weight: 600;
  55202. }
  55203. }
  55204. ul {
  55205. padding-bottom: 1.25rem;
  55206. margin-bottom: 0.94rem;
  55207. border-bottom: 0.06rem solid #e1e1e1;
  55208. display: flex;
  55209. flex-direction: column;
  55210. gap: 0.25rem;
  55211. li {
  55212. color: #444444;
  55213. font-size: 0.81rem;
  55214. font-weight: 400;
  55215. }
  55216. &.nw--btn--text--type{
  55217. gap:0.6rem;
  55218. border-bottom:0px;
  55219. }
  55220. }
  55221. .custom-btn.v-btn.v-btn--density-default {
  55222. border: 0.06rem solid #D0DDEA;
  55223. border-radius: 0.31rem;
  55224. width: 100%;
  55225. height: 2.5rem;
  55226. min-height: 2.5rem;
  55227. .v-btn__content {
  55228. color:#798592;
  55229. font-size: 0.75rem;
  55230. font-weight: 600;
  55231. letter-spacing: -0.01rem;
  55232. }
  55233. &:hover{
  55234. .v-btn__content {
  55235. color: #064F9E!important;
  55236. }
  55237. border: 0.06rem solid rgba(6, 79, 158, 0.5);
  55238. }
  55239. }
  55240. }
  55241. }
  55242. .user-name {
  55243. color: #fff;
  55244. font-size: 0.81rem;
  55245. padding: 0 0.815rem;
  55246. font-weight: 700;
  55247. cursor: pointer;
  55248. }
  55249. .btn-logout {
  55250. width: 2rem;
  55251. height: 2rem;
  55252. background: url("../img/ico_logout.svg") no-repeat center / 100%;
  55253. }
  55254. }
  55255. }
  55256. }
  55257. .login-box{
  55258. .login-l{
  55259. .login-l-center{
  55260. text-align: center;
  55261. .logo{
  55262. background: none;
  55263. font-size: 1.5625rem;
  55264. color: #0b318b;
  55265. font-weight: 700;
  55266. letter-spacing: -0.04688rem;
  55267. pointer-events: none;
  55268. line-height: 100%;
  55269. height: auto;
  55270. }
  55271. p{
  55272. color: #333;
  55273. text-align: center;
  55274. font-size: 0.875rem;
  55275. font-weight: 400;
  55276. line-height: 100%; /* 0.875rem */
  55277. letter-spacing: -0.00875rem;
  55278. pointer-events: none;
  55279. }
  55280. }
  55281. }
  55282. .login-r{
  55283. .login-input-wrap{
  55284. .txt-field-box{
  55285. &:first-of-type{
  55286. margin-bottom: 0.87rem;
  55287. }
  55288. .v-input{
  55289. &.custom-input{
  55290. &.v-text-field{
  55291. min-height: 2.25rem;
  55292. .v-input__control{
  55293. height: 2.25rem;
  55294. .v-field__field{
  55295. .v-field__input{
  55296. min-height: 2.25rem;
  55297. height: 2.25rem;
  55298. padding: 0 0.75rem;
  55299. }
  55300. }
  55301. }
  55302. }
  55303. }
  55304. }
  55305. &.error{
  55306. .v-input{
  55307. &.custom-input{
  55308. &.v-text-field{
  55309. .v-input__control{
  55310. .v-field--appended{
  55311. .v-field__append-inner{
  55312. right: 2.6rem;
  55313. }
  55314. }
  55315. }
  55316. }
  55317. }
  55318. }
  55319. .ico-eye{
  55320. right: 2.5rem;
  55321. }
  55322. }
  55323. .ico-eye{
  55324. position: absolute;
  55325. background-size: cover;
  55326. background-image: url(../img/ico_eye.svg);
  55327. width: 1.125rem;
  55328. height: 1.125rem;
  55329. right: 0.75rem;
  55330. top: 50%;
  55331. transform: translateY(-50%);
  55332. &.eye-off{
  55333. background-image: url(../img/ico_eye2.svg);
  55334. }
  55335. }
  55336. }
  55337. }
  55338. .login-radio{
  55339. margin-top: 1.87rem;
  55340. .custom-radio{
  55341. &.v-input{
  55342. .v-input__control{
  55343. .v-selection-control-group{
  55344. .v-radio{
  55345. margin-right: 1.56rem;
  55346. .v-label{
  55347. margin-left: 0.38rem;
  55348. font-weight: 500;
  55349. color: #444444;
  55350. font-size: 0.875rem;
  55351. }
  55352. .v-selection-control__wrapper{
  55353. .v-selection-control__input{
  55354. .v-icon{
  55355. border: 1px solid #c0c0c0;
  55356. width: 1rem;
  55357. height: 1rem;
  55358. &.mdi-radiobox-marked{
  55359. background-color: #438dff;
  55360. }
  55361. }
  55362. }
  55363. }
  55364. }
  55365. }
  55366. }
  55367. }
  55368. }
  55369. }
  55370. .login-otp{
  55371. margin-top: 1.87rem;
  55372. gap: 0.5rem;
  55373. .custom-input{
  55374. &.v-text-field{
  55375. min-height: 2.25rem;
  55376. .v-input__control{
  55377. height: 2.25rem;
  55378. .v-field__field{
  55379. .v-field__input{
  55380. min-height: 2.25rem;
  55381. height: 2.25rem;
  55382. padding: 0 0.75rem;
  55383. }
  55384. }
  55385. }
  55386. }
  55387. }
  55388. .btn-gray{
  55389. width: 6.875rem;
  55390. height: 2.25rem;
  55391. }
  55392. }
  55393. .login-chk{
  55394. margin: 1.88rem 0 0;
  55395. .custom-check{
  55396. &.v-input{
  55397. .v-input__control{
  55398. .v-selection-control{
  55399. .v-selection-control__wrapper{
  55400. .v-selection-control__input{
  55401. .v-icon{
  55402. background-size: cover;
  55403. }
  55404. }
  55405. }
  55406. .v-label{
  55407. padding-left: 0.38rem;
  55408. color: #444444;
  55409. font-size: 0.875rem;
  55410. font-weight: 500;
  55411. }
  55412. }
  55413. }
  55414. }
  55415. }
  55416. }
  55417. .login-find{
  55418. margin-top: 1.88rem;
  55419. padding-top: 1.88rem;
  55420. }
  55421. .login-btn-wrap {
  55422. .custom-btn {
  55423. &.v-btn {
  55424. &.v-btn--density-default {
  55425. &.btn-blue {
  55426. background-color: #0B318B;
  55427. border-radius: 0.5rem;
  55428. &:hover {
  55429. background-color: #4875DE !important;
  55430. box-shadow: 1px 1px 10px 0px rgba(0, 0, 0, 0.20);
  55431. }
  55432. .v-btn__content {
  55433. font-size: 0.9375rem !important;
  55434. font-weight: 700 !important;
  55435. letter-spacing: -0.02813rem !important;
  55436. }
  55437. &.v-btn--disabled {
  55438. background-color: #e0e0e0 !important;
  55439. .v-btn__content {
  55440. color: #8e8e8e !important;
  55441. }
  55442. }
  55443. }
  55444. }
  55445. }
  55446. }
  55447. }
  55448. .login-find{
  55449. > button{
  55450. &.color--blue{
  55451. color: #0b318b;
  55452. }
  55453. &.ml--auto{
  55454. &::after{
  55455. content: '';
  55456. width: 0.0625rem;
  55457. height: 0.875rem;
  55458. background-color: #e3e3e3;
  55459. margin-left: 0.94rem;
  55460. margin-right: 0.94rem;
  55461. }
  55462. }
  55463. }
  55464. }
  55465. }
  55466. }
  55467. .system--box{
  55468. display: flex;
  55469. align-items: center;
  55470. flex-direction: column;
  55471. .system--img{
  55472. width: 7.5rem;
  55473. height: 7.5rem;
  55474. background-image: url(../img/img_system.svg);
  55475. background-size: cover;
  55476. margin-bottom: 2.19rem;
  55477. }
  55478. > h2{
  55479. color: #111;
  55480. text-align: center;
  55481. font-size: 1.75rem;
  55482. font-weight: 500;
  55483. margin-bottom: 1.56rem;
  55484. }
  55485. > p{
  55486. text-align: center;
  55487. color: #333;
  55488. text-align: center;
  55489. font-size: 1rem;
  55490. font-weight: 400;
  55491. line-height: 1.7;
  55492. margin-bottom: 1.87rem;
  55493. }
  55494. > span{
  55495. color: #444;
  55496. text-align: center;
  55497. font-size: 0.9375rem;
  55498. font-weight: 400;
  55499. }
  55500. }
  55501. .login-footer{
  55502. height: 5.5rem;
  55503. display: flex;
  55504. justify-content: space-between;
  55505. padding: 1.56rem 1.88rem;
  55506. .login--footer--l{
  55507. display: flex;
  55508. color: rgba(51, 51, 51, 0.8);
  55509. flex-direction: column;
  55510. gap: 0.6rem;
  55511. p{
  55512. }
  55513. }
  55514. .login--footer--r{
  55515. display: flex;
  55516. gap: 3.75rem;
  55517. align-items: center;
  55518. .txt--btn{
  55519. > button{
  55520. color: #222;
  55521. font-size: 0.875rem;
  55522. font-weight: 400;
  55523. line-height: 100%; /* 0.875rem */
  55524. margin-left: 0.9rem;
  55525. &:first-child{
  55526. margin-left: 0;
  55527. &::after{
  55528. content: '';
  55529. width: 0.0625rem;
  55530. height: 0.875rem;
  55531. margin-left: 0.9rem;
  55532. vertical-align: -0.1rem;
  55533. background-color: #c5c5c5;
  55534. display: inline-block;
  55535. }
  55536. }
  55537. }
  55538. }
  55539. .logo--footer{
  55540. display: flex;
  55541. gap: 1.25rem;
  55542. align-items: center;
  55543. span{
  55544. font-size: 0;
  55545. display: inline-block;
  55546. background-repeat: no-repeat;
  55547. background-position: center;
  55548. background-size: contain;
  55549. &:first-child{
  55550. width: 8.125rem;
  55551. height: 0.9375rem;
  55552. background-image: url(../img/logo_sams_sds.svg);
  55553. }
  55554. &:nth-child(2){
  55555. width: 6.0625rem;
  55556. height: 2rem;
  55557. background-image: url(../img/logo_sams.svg);
  55558. }
  55559. }
  55560. }
  55561. }
  55562. }
  55563. }
  55564. // 로그인 팝업
  55565. .v-common-dialog-wrapper{
  55566. .v-common-dialog-content{
  55567. .find-pwd {
  55568. border-radius: 0.5rem;
  55569. background: #FFF;
  55570. box-shadow: 0px 0px 6px 0px rgba(0, 0, 0, 0.15);
  55571. padding: 1.25rem;
  55572. p{
  55573. &.error-txt{
  55574. margin: 0 0 0.63rem 9.875rem!important;
  55575. }
  55576. }
  55577. .txt-field-box{
  55578. border-top: 1px solid #e0e0e0;
  55579. display: flex;
  55580. margin-bottom: 0;
  55581. &.error{
  55582. .ico{
  55583. right: 1rem;
  55584. }
  55585. }
  55586. > p{
  55587. width: 9.375rem;
  55588. padding: 1.13rem 0.62rem;
  55589. color: #444444;
  55590. font-size: 0.875rem;
  55591. font-weight: 700;
  55592. line-height: 1.4;
  55593. margin-bottom: 0;
  55594. .cir {
  55595. width: 0.3125rem;
  55596. height: 0.3125rem;
  55597. display: inline-block;
  55598. background-color: #ff4f60;
  55599. border-radius: 50%;
  55600. margin-left: 0.37rem;
  55601. vertical-align: 0.2rem;
  55602. }
  55603. }
  55604. > div{
  55605. width: 35.625rem;
  55606. padding: 0.625rem 0.5rem;
  55607. .custom-btn {
  55608. &.v-btn {
  55609. &.v-btn--density-default {
  55610. &.btn-password {
  55611. background: #6f8aa6;
  55612. height: 2.25rem;
  55613. width: 6.875rem;
  55614. }
  55615. &.btn-black {
  55616. background: #6f8aa6;
  55617. font-weight: 600 !important;
  55618. &.v-btn--disabled {
  55619. background-color: #e0e0e0 !important;
  55620. .v-btn__content {
  55621. color: #8e8e8e !important;
  55622. }
  55623. }
  55624. }
  55625. }
  55626. }
  55627. }
  55628. .custom-input{
  55629. &.v-text-field{
  55630. min-height: 2.25rem;
  55631. .v-input__control{
  55632. height: 2.25rem;
  55633. .v-field__field{
  55634. .v-field__input{
  55635. padding: 0 0.75rem;
  55636. min-height: 2.25rem;
  55637. height: 2.25rem;
  55638. &::placeholder {
  55639. color: #8e8e8e;
  55640. font-weight: 400;
  55641. }
  55642. }
  55643. }
  55644. }
  55645. }
  55646. &.v-text-field {
  55647. &.mini2 {
  55648. min-height: 2.25rem;
  55649. .v-input__control {
  55650. height: 2.25rem;
  55651. .v-field__field {
  55652. .v-field__input {
  55653. padding: 0 0.75rem;
  55654. color: #000000;
  55655. height: 2.25rem;
  55656. font-size: 0.875rem;
  55657. font-weight: 400;
  55658. min-height: 2.25rem;
  55659. &::placeholder {
  55660. color: #8e8e8e;
  55661. font-size: 0.875rem;
  55662. font-weight: 400;
  55663. }
  55664. }
  55665. }
  55666. }
  55667. }
  55668. }
  55669. }
  55670. }
  55671. }
  55672. .otp-box{
  55673. gap:0;
  55674. .txt-field-box{
  55675. width: 100%;
  55676. &.error{
  55677. .ico{
  55678. right: 8.5rem;
  55679. }
  55680. }
  55681. > div{
  55682. display: flex;
  55683. gap: 0.63rem;
  55684. }
  55685. }
  55686. }
  55687. }
  55688. }
  55689. }
  55690. .tab-style{
  55691. .tab-style-h{
  55692. button{
  55693. &::after{
  55694. background-size: cover!important;
  55695. }
  55696. .ico{
  55697. background-size: 0.75rem 0.75rem;
  55698. }
  55699. }
  55700. }
  55701. }
  55702. /**********************************************
  55703. | 2024-12-31 김민정 :
  55704. **********************************************/
  55705. .media--editor{
  55706. .caution{
  55707. color: #F00;
  55708. font-size: 16px;
  55709. display: inline-block;
  55710. margin-bottom: 10px;
  55711. }
  55712. .ql-snow{
  55713. .ql-editor{
  55714. p{
  55715. img{
  55716. max-width: 400px;
  55717. max-height: 400px;
  55718. }
  55719. }
  55720. }
  55721. }
  55722. }
  55723. // 재무관리 테이블
  55724. .table--wrap{
  55725. .bul{
  55726. color: #f00;
  55727. }
  55728. .table--t{
  55729. display: flex;
  55730. justify-content: space-between;
  55731. align-items: flex-end;
  55732. margin-bottom: 30px;
  55733. >span{
  55734. font-size: 18px;
  55735. }
  55736. }
  55737. table{
  55738. width: 100%;
  55739. border-top: 1px solid #3F3F3F;
  55740. .custom-input{
  55741. &.left{
  55742. *{
  55743. text-align: left;
  55744. }
  55745. }
  55746. }
  55747. th{
  55748. &.bg{
  55749. background-color: #f8f8f8;
  55750. }
  55751. &.le{
  55752. text-align: left;
  55753. padding: 30px;
  55754. }
  55755. vertical-align: middle;
  55756. height: 50px;
  55757. padding: 10px 30px;
  55758. color: #000000;
  55759. font-size: 18px;
  55760. font-weight: 700;
  55761. border-bottom: 1px solid #e2e2e2;
  55762. border-right: 1px solid #E2E2E2;
  55763. &.type2{
  55764. border-right: 1px solid #3F3F3F;
  55765. border-bottom: 1px solid #3f3f3f;
  55766. &.fz--16{
  55767. font-size: 16px;
  55768. }
  55769. }
  55770. &:last-child{
  55771. border-right: none;
  55772. }
  55773. }
  55774. td{
  55775. height: 50px;
  55776. padding: 10px 30px;
  55777. text-align: left;
  55778. color: #000000;
  55779. vertical-align: middle;
  55780. border-bottom: 1px solid #e2e2e2;
  55781. border-right: 1px solid #E2E2E2;
  55782. white-space: pre-line;
  55783. font-size: 18px;
  55784. font-weight: 400;
  55785. .dp--tp-wrap{
  55786. display: none;
  55787. }
  55788. .input--wrap{
  55789. display: flex;
  55790. align-items: center;
  55791. gap: 10px;
  55792. .text {
  55793. font-size: 0.75rem;
  55794. color: #444;
  55795. font-weight: 400;
  55796. }
  55797. .down--file{
  55798. color: #444;
  55799. cursor: pointer;
  55800. }
  55801. }
  55802. &.bg{
  55803. background-color: #f8f8f8;
  55804. }
  55805. &:last-child{
  55806. border-right: none;
  55807. }
  55808. &.le{
  55809. text-align: left;
  55810. padding: 30px;
  55811. }
  55812. }
  55813. }
  55814. font-size: 24px;
  55815. }
  55816. // .ag-theme-alpine {
  55817. // --ag-font-family: 'Arial', sans-serif; /* 또는 원하는 글꼴 */
  55818. // }
  55819. // .ag-icon {
  55820. // font-family: 'Font Awesome 5 Free', sans-serif !important;
  55821. // }
  55822. .dp__input{
  55823. &::placeholder{
  55824. color: #b6b6b6!important;
  55825. }
  55826. }
  55827. .dp__disabled{
  55828. background-color: #f0f0f0!important;
  55829. &.dp__input{
  55830. color: #aaaaaa!important;
  55831. }
  55832. }
  55833. .btn--wrap{
  55834. &.evt--btn{
  55835. display: flex;
  55836. .custom-btn{
  55837. &.v-btn{
  55838. &.v-btn--density-default{
  55839. width: fit-content;
  55840. &.btn-sky{
  55841. background-color: #42A5F5;
  55842. height: 2.25rem;
  55843. min-height: 2.25rem;
  55844. .v-btn__content{
  55845. color: #ffffff;
  55846. }
  55847. }
  55848. &.btn-red{
  55849. background-color: #DC143C;
  55850. height: 2.25rem;
  55851. min-height: 2.25rem;
  55852. .v-btn__content{
  55853. color: #ffffff;
  55854. }
  55855. }
  55856. }
  55857. }
  55858. }
  55859. }
  55860. }
  55861. .ms--pop{
  55862. display: flex;
  55863. gap: 30px;
  55864. .ms--input--wrap{
  55865. width: 60%;
  55866. }
  55867. .ms--desc--wrap{
  55868. width: 40%;
  55869. p{
  55870. font-size: 1rem;
  55871. font-weight: 200;
  55872. line-height: 1.4;
  55873. strong{
  55874. font-size: 1.2rem;
  55875. font-weight: 600;
  55876. margin-bottom: 20px;
  55877. display: inline-block;
  55878. }
  55879. }
  55880. }
  55881. }
  55882. .tbl-wrapper{
  55883. .tbl-wrap .ag-checkbox-input-wrapper{
  55884. width: 20px;
  55885. height: 20px;
  55886. background-color: #ffffff;
  55887. border: 1px solid #b0b0b0;
  55888. &.ag-checked{
  55889. &::after{
  55890. display: block;
  55891. width: 20px;
  55892. height: 20px;
  55893. background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'%3E%3Cpath d='M10 3L4.5 8.5L2 6' stroke='%230094FF' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  55894. background-position: center;
  55895. }
  55896. }
  55897. }
  55898. .tbl-wrap .ag-checkbox-input-wrapper:before,
  55899. .tbl-wrap .ag-checkbox-input-wrapper:after{
  55900. display: none;
  55901. }
  55902. }
  55903. .sun-editor{
  55904. width: 100%;
  55905. text-align: left;
  55906. }
  55907. </file>
  55908. <file path="backend/app/Config/Routes.php">
  55909. <?php
  55910. use CodeIgniter\Router\RouteCollection;
  55911. /**
  55912. * @var RouteCollection $routes
  55913. */
  55914. $routes->get('auth/googleLogin', 'Auth::googleLogin');
  55915. $routes->get('auth/callback', 'Auth::callback');
  55916. $routes->post('auth/joinmember', 'Auth::join');
  55917. $routes->post('auth/joinvendor', 'Auth::joinVendor');
  55918. $routes->post('auth/withdrawal', 'Auth::withdrawal'); //구글 회원탈퇴 , 일반회원 탈퇴
  55919. $routes->post('auth/kakaowithdrawal', 'Auth::kakaoWithdrawal'); //카카오 회웥탈퇴
  55920. $routes->get('auth/kakaoLogin', 'Auth::kakaoLogin');
  55921. $routes->get('auth/kakao', 'Auth::kakao');
  55922. $routes->get('auth/naverLogin', 'Auth::naverLogin');
  55923. $routes->get('auth/naver', 'Auth::naver');
  55924. $routes->get('auth/naverWithdrawal', 'Auth::naverWithdrawal');
  55925. $routes->post('auth/checkId', 'Auth::checkId'); // 사용 중 체크 아이디
  55926. $routes->get('/', 'Home::index'); //홈화면 리다이렉트용
  55927. $routes->post('roulette/login', 'Roulette::login'); //로그인 페이지 토큰 상관없이 호출가능
  55928. $routes->post('roulette/refreshToken', 'Roulette::refreshToken'); //엑세스 토큰이 있어야만 발급 가능
  55929. $routes->get('alimtalk/send', 'Alimtalk::send');
  55930. $routes->post('alimtalk/send', 'Alimtalk::send'); // POST 요청인 경우
  55931. $routes->post('winner/reg', 'Winner::winnerReg');
  55932. $routes->post('winner/itemcount', 'Winner::itemCount');
  55933. $routes->post('winner/winnerchk', 'Winner::winnerChk');
  55934. // 관리자 라우트
  55935. $routes->post('mng/list', 'Mng::mnglist');
  55936. $routes->post('mng/search', 'Mng::mngSearch');
  55937. $routes->post('mng/reg', 'Mng::mngRegister');
  55938. $routes->post('mng/chk', 'Mng::mngIDChk');
  55939. $routes->post('mng/update', 'Mng::mngUpdate');
  55940. $routes->get('mng/detail/(:segment)', 'Mng::mngDetail/$1');
  55941. $routes->post('mng/stupdate/(:segment)', 'Mng::mngStatusUpdate/$1');
  55942. $routes->post('mng/delete/(:segment)', 'Mng::mngDelete/$1');
  55943. // 아이템 라우트
  55944. $routes->post('item/list', 'Item::itemlist');
  55945. $routes->post('item/reg', 'Item::itemRegister');
  55946. $routes->get('item/detail/(:num)', 'Item::itemDetail/$1');
  55947. $routes->post('item/update/(:num)', 'Item::itemUpdate/$1');
  55948. $routes->post('item/delete/(:num)', 'Item::itemDelete/$1');
  55949. $routes->post('item/search', 'Item::itemSearch');
  55950. // 파일 다운로드
  55951. $routes->get('item/download/(:segment)', 'Item::file/$1');
  55952. // 제품 주문 라우트
  55953. $routes->post('deli/itemlist', 'Deli::itemlist');
  55954. $routes->post('deli/list', 'Deli::delilist');
  55955. $routes->post('deli/reg', 'Deli::deliRegister');
  55956. // 당첨자 라우트
  55957. $routes->post('winner/list', 'Winner::winnerlist');
  55958. $routes->get('winner/detail/(:num)', 'Winner::winnerDetail/$1');
  55959. $routes->post('winner/partclist', 'Winner::getParticipationByItem');
  55960. $routes->post('winner/matcheduser', 'Winner::matchedUser');
  55961. $routes->group('', ['filter' => 'auth'], function ($routes) {
  55962. });
  55963. // API 라우트 그룹
  55964. $routes->group('api', ['namespace' => 'App\Controllers'], function($routes) {
  55965. // 벤더사 관련 API
  55966. $routes->group('vendor', function($routes) {
  55967. $routes->post('search', 'InfluencerController::searchVendors'); // 기존 VendorInfluencerController → InfluencerController
  55968. $routes->post('list', 'VendorController::getList');
  55969. $routes->post('detail', 'VendorController::getDetail');
  55970. $routes->post('create', 'VendorController::create');
  55971. $routes->post('update', 'VendorController::update');
  55972. $routes->post('delete', 'VendorController::delete');
  55973. });
  55974. // 벤더사-인플루언서 매핑 관련 API는 Routes2.php에서 관리
  55975. // (기존 파트너십 라우팅은 별도 파일로 분리됨)
  55976. // 인증 관련 API
  55977. $routes->group('auth', function($routes) {
  55978. $routes->post('login', 'AuthController::login');
  55979. $routes->post('logout', 'AuthController::logout');
  55980. $routes->post('register', 'AuthController::register');
  55981. $routes->post('refresh', 'AuthController::refreshToken');
  55982. $routes->post('verify', 'AuthController::verifyToken');
  55983. });
  55984. // 사용자 관련 API
  55985. $routes->group('user', function($routes) {
  55986. $routes->post('profile', 'UserController::getProfile');
  55987. $routes->post('update-profile', 'UserController::updateProfile');
  55988. $routes->post('change-password', 'UserController::changePassword');
  55989. $routes->post('upload-avatar', 'UserController::uploadAvatar');
  55990. });
  55991. // 인플루언서 관련 API (새로 추가)
  55992. $routes->group('influencer', function($routes) {
  55993. $routes->post('search-vendors', 'InfluencerController::searchVendors');
  55994. $routes->post('create-request', 'InfluencerController::createApprovalRequest');
  55995. $routes->post('reapply-request', 'InfluencerController::createReapplyRequest');
  55996. $routes->post('my-partnerships', 'InfluencerController::getMyPartnerships');
  55997. $routes->post('terminate', 'InfluencerController::terminatePartnership');
  55998. $routes->post('profile', 'InfluencerController::getProfile');
  55999. });
  56000. // 제품 관련 API
  56001. $routes->group('item', function($routes) {
  56002. $routes->post('list', 'ItemController::getList');
  56003. $routes->post('detail', 'ItemController::getDetail');
  56004. $routes->post('create', 'ItemController::create');
  56005. $routes->post('update', 'ItemController::update');
  56006. $routes->post('delete', 'ItemController::delete');
  56007. $routes->post('search', 'ItemController::search');
  56008. });
  56009. // 파일 업로드 관련 API
  56010. $routes->group('upload', function($routes) {
  56011. $routes->post('image', 'UploadController::uploadImage');
  56012. $routes->post('file', 'UploadController::uploadFile');
  56013. $routes->post('multiple', 'UploadController::uploadMultiple');
  56014. });
  56015. // 알림 관련 API
  56016. $routes->group('notification', function($routes) {
  56017. $routes->post('list', 'NotificationController::getList');
  56018. $routes->post('mark-read', 'NotificationController::markAsRead');
  56019. $routes->post('mark-all-read', 'NotificationController::markAllAsRead');
  56020. $routes->post('delete', 'NotificationController::delete');
  56021. });
  56022. // 대시보드 관련 API
  56023. $routes->group('dashboard', function($routes) {
  56024. $routes->post('stats', 'DashboardController::getStats');
  56025. $routes->post('recent-activities', 'DashboardController::getRecentActivities');
  56026. $routes->post('chart-data', 'DashboardController::getChartData');
  56027. });
  56028. });
  56029. // 인증이 필요한 API 라우트 (필터 적용)
  56030. $routes->group('api', ['namespace' => 'App\Controllers', 'filter' => 'auth'], function($routes) {
  56031. // 보호된 벤더사-인플루언서 API (VendorInfluencerController → 새 컨트롤러들로 교체)
  56032. $routes->group('vendor-influencer/protected', function($routes) {
  56033. $routes->post('my-requests', 'InfluencerController::getMyRequests');
  56034. $routes->post('my-partnerships', 'InfluencerController::getMyPartnerships');
  56035. $routes->post('pending-approvals', 'VendorController::getPendingApprovals');
  56036. });
  56037. // 관리자 전용 API
  56038. $routes->group('admin', ['filter' => 'admin'], function($routes) {
  56039. $routes->post('vendor-influencer/all', 'AdminController::getAllMappings');
  56040. $routes->post('vendor-influencer/expired', 'AdminController::getExpiredRequests');
  56041. $routes->post('vendor-influencer/process-expired', 'AdminController::processExpiredRequests');
  56042. $routes->post('system/stats', 'AdminController::getSystemStats');
  56043. });
  56044. });
  56045. // 웹훅 및 외부 API
  56046. $routes->group('webhook', ['namespace' => 'App\Controllers'], function($routes) {
  56047. $routes->post('payment/success', 'WebhookController::paymentSuccess');
  56048. $routes->post('payment/failure', 'WebhookController::paymentFailure');
  56049. $routes->post('notification/send', 'WebhookController::sendNotification');
  56050. });
  56051. // 크론잡 및 스케줄러 API
  56052. $routes->group('cron', ['namespace' => 'App\Controllers', 'filter' => 'cron'], function($routes) {
  56053. $routes->get('process-expired-requests', 'CronController::processExpiredRequests');
  56054. $routes->get('send-reminder-notifications', 'CronController::sendReminderNotifications');
  56055. $routes->get('cleanup-old-data', 'CronController::cleanupOldData');
  56056. });
  56057. // 개발 및 테스트용 라우트 (개발 환경에서만 사용)
  56058. if (ENVIRONMENT === 'development') {
  56059. $routes->group('dev', ['namespace' => 'App\Controllers'], function($routes) {
  56060. $routes->get('test-db', 'DevController::testDatabase');
  56061. $routes->get('seed-data', 'DevController::seedTestData');
  56062. $routes->get('clear-cache', 'DevController::clearCache');
  56063. $routes->post('test-api', 'DevController::testApi');
  56064. });
  56065. }
  56066. // 디버깅용 라우트 (임시)
  56067. $routes->group('debug', ['namespace' => 'App\\Controllers'], function($routes) {
  56068. $routes->get('foreign-key', 'DebugController::debugForeignKey');
  56069. $routes->get('simple-update', 'DebugController::testSimpleUpdate');
  56070. });
  56071. // =============================================================================
  56072. // 추가 라우팅 파일 로드
  56073. // =============================================================================
  56074. // Routes2.php 파일 로드 (파트너십 관련 라우팅)
  56075. if (file_exists(APPPATH . 'Config/Routes2.php')) {
  56076. require_once APPPATH . 'Config/Routes2.php';
  56077. }
  56078. // 인플루언서 요청 라우트 (기존 구조와 호환성)
  56079. $routes->group('influencer-request', function($routes) {
  56080. $routes->post('create', 'InfluencerController::createApprovalRequest');
  56081. $routes->post('vendor-approval', 'VendorController::processInfluencerRequest'); // 벤더사의 인플루언서 승인/거절
  56082. $routes->post('search-vendors', 'InfluencerController::searchVendors'); // 인플루언서의 벤더사 검색
  56083. $routes->post('get-list', 'InfluencerController::getMyPartnerships'); // 인플루언서의 파트너십 목록
  56084. $routes->post('get-vendor-list', 'VendorController::getInfluencerRequests'); // 벤더사의 요청 목록
  56085. $routes->post('terminate', 'InfluencerController::terminatePartnership'); // 인플루언서의 파트너십 해지
  56086. $routes->post('vendor-terminate', 'VendorController::terminatePartnership'); // 벤더사의 파트너십 해지
  56087. $routes->post('status-stats', 'VendorController::getStatusStats'); // 벤더사 요청 통계
  56088. $routes->post('reapply-request', 'InfluencerController::createReapplyRequest'); // 인플루언서 재승인 요청
  56089. });
  56090. $routes->post('api/influencer/profile', 'InfluencerController::getProfile');
  56091. // 디버깅 라우트 (개발용)
  56092. $routes->get('debug/mapping/(:num)', 'VendorController::debugMappingStatus/$1');
  56093. $routes->get('debug/mapping', 'VendorController::debugMappingStatus');
  56094. $routes->get('debug/sync-mapping', 'VendorController::syncMappingStatus');
  56095. $routes->post('debug/history-insert', 'VendorController::debugHistoryInsert');
  56096. </file>
  56097. <file path="stores/auth.js">
  56098. export const useAuthStore = defineStore('authStore', () => {
  56099. const auth = ref({
  56100. seq: '', // 시퀀스
  56101. id: '', // 아이디
  56102. name: '', // 이름
  56103. email: '', // 이메일
  56104. companyName: '', // 회사명
  56105. phone: '', // 전화번호
  56106. memberType: '', // 사용자 타입 (VENDOR, INFLUENCER)
  56107. accessToken: '', // 토큰
  56108. refreshToken: '', // 갱신토큰
  56109. snsTempData : '', // sns 임시데이터
  56110. })
  56111. // 전체 조회
  56112. const getSeq = computed(() => auth.value.seq) // 시퀀스 조회
  56113. const getUserId = computed(() => auth.value.id) // 아이디 조회
  56114. const getUserName = computed(() => auth.value.name) // 이름 조회
  56115. const getUserEmail = computed(() => auth.value.email) // 이메일 조회
  56116. const getCompanyName = computed(() => auth.value.companyName) // 회사명 조회
  56117. const getUserPhone = computed(() => auth.value.phone) // 관리자 핸드폰 조회
  56118. const getAccessToken = computed(() => auth.value.accessToken) // 토큰 조회
  56119. const getRefreshToken = computed(() => auth.value.refreshToken) // 리프레시토큰 조회
  56120. const getSnsTempData = computed(() => auth.value.snsTempData) // sns 임시데이터 조회
  56121. function setAuth(payload){
  56122. auth.value.seq = payload.user.SEQ
  56123. auth.value.id = payload.user.ID
  56124. auth.value.name = payload.user.NAME
  56125. auth.value.email = payload.user.EMAIL
  56126. auth.value.companyName = payload.user.companyName || payload.user.COMPANY_NAME || ''
  56127. auth.value.phone = payload.user.PHONE
  56128. // 사용자 타입 설정 (COMPANY_NUMBER가 있으면 벤더사, 없으면 인플루언서)
  56129. auth.value.memberType = (payload.user.COMPANY_NUMBER) ? 'VENDOR' : 'INFLUENCER'
  56130. auth.value.accessToken = payload.accessToken
  56131. auth.value.refreshToken = payload.refreshToken
  56132. }
  56133. function setTempData(payload){
  56134. auth.value.snsTempData = payload
  56135. }
  56136. function setAccessToken(token){
  56137. auth.value.accessToken = token
  56138. }
  56139. function setRefreshToken(token){
  56140. auth.value.refreshToken = token
  56141. }
  56142. // logout
  56143. function setLogout(){
  56144. // 모든 필드 초기화
  56145. auth.value = {
  56146. seq: '',
  56147. id: '',
  56148. name: '',
  56149. email: '',
  56150. companyName: '',
  56151. phone: '',
  56152. memberType: '',
  56153. accessToken: '',
  56154. refreshToken: '',
  56155. snsTempData: ''
  56156. }
  56157. }
  56158. return {
  56159. auth,
  56160. getSnsTempData,
  56161. getAccessToken,
  56162. getRefreshToken,
  56163. setAuth,
  56164. setTempData,
  56165. setAccessToken,
  56166. setRefreshToken,
  56167. setLogout,
  56168. getSeq,
  56169. getUserSeq: getSeq, // getUserSeq 별칭 추가
  56170. getUserId,
  56171. getUserName,
  56172. getUserEmail,
  56173. getCompanyName,
  56174. getUserPhone
  56175. }
  56176. }, {persist: { storage: persistedState.localStorage}})
  56177. </file>
  56178. <file path=".env.development">
  56179. #import.meta.env로 호출 가능
  56180. VITE_APP_BASE_URL="/"
  56181. VITE_APP_API_URL="https://shopdeli.mycafe24.com"
  56182. VITE_APP_API_PORT=8080
  56183. VITE_APP_API_DOMAIN="http://localhost:3000"
  56184. VITE_APP_DEBUG_LEVEL=trace
  56185. VITE_APP_MODE=development
  56186. VITE_APP_KAKAO_APP_KEY=""
  56187. VITE_APP_DEV_TOPKEN="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6ImludGVyc2NvcGVyb3VsZXR0ZSJ9.eyJpYXQiOjE3NDg0MDcyNzYsImV4cCI6OS4wZSs1NSwic3ViIjoiYWRtaW4iLCJuYW1lIjoiXHVhY2UwXHVjNTkxXHVjNzc0In0.gbceCSjAUaYOmuOvnMhgLTYJZOiD8WYpUs-S2kaY3ng"
  56188. # Claude API 설정
  56189. ANTHROPIC_API_KEY="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"
  56190. </file>
  56191. <file path="assets/scss/default.scss">
  56192. @charset "UTF-8";
  56193. .max--w320{
  56194. max-width:320px;
  56195. }
  56196. .container{
  56197. height:100%;
  56198. .content{
  56199. height:100%;
  56200. display: flex;
  56201. aside{
  56202. width:250px;
  56203. border-right:1px solid #ccc;
  56204. .aside--main--title{
  56205. padding:20px;
  56206. background: #33559B;
  56207. color:#fff;
  56208. font-size:20px;
  56209. }
  56210. .aside--list{
  56211. display: flex;
  56212. flex-direction: column;
  56213. .v-btn{
  56214. padding:15px 10px;
  56215. font-size:16px;
  56216. cursor: pointer;
  56217. justify-content: flex-start;
  56218. padding-left:20px;
  56219. &.actv{
  56220. background:#e4e4e4;
  56221. }
  56222. }
  56223. }
  56224. }
  56225. .main{
  56226. padding:1.625rem;
  56227. width:calc(100%);
  56228. .data--list--wrap{
  56229. width:100%;
  56230. padding-top:40px;
  56231. .btn--actions--wrap{
  56232. display: flex;
  56233. align-items: center;
  56234. justify-content: space-between;
  56235. padding-bottom:25px;
  56236. }
  56237. .left--sections{
  56238. display: flex;
  56239. gap: 1rem;
  56240. }
  56241. .right--sections{
  56242. display: flex;
  56243. gap: 1rem;
  56244. .caption--wrap{
  56245. display: flex;
  56246. align-items: center;
  56247. position: relative;
  56248. .ico{
  56249. font-size: 1rem;
  56250. width: 2rem;
  56251. height: 2rem;
  56252. text-align: center;
  56253. cursor: pointer;
  56254. line-height: 2rem;
  56255. border-radius: 50%;
  56256. background-color: #F74F78;
  56257. color: #fff;
  56258. display: inline-block;
  56259. position: relative;
  56260. font-style: normal;
  56261. }
  56262. .caption--box{
  56263. position: absolute;
  56264. font-size: 0.875rem;
  56265. bottom: 100%;
  56266. border: 2px solid #DFE7EF;
  56267. background-color: #fff;
  56268. border-radius: 10px;
  56269. right:0;
  56270. line-height: 1.4;
  56271. padding: 15px 20px;
  56272. white-space: nowrap;
  56273. color: #9DA9B6;
  56274. z-index: 10;
  56275. display: none;
  56276. }
  56277. &:hover{
  56278. .caption--box{
  56279. display: block;
  56280. }
  56281. }
  56282. }
  56283. }
  56284. .item--section{
  56285. border: 1px solid #ccc;
  56286. padding: 2rem;
  56287. display: flex;
  56288. gap: 1rem;
  56289. border-radius: 1rem;
  56290. margin-bottom: 25px;
  56291. .item--thumb{
  56292. background-color: #d9d9d9;
  56293. justify-content: center;
  56294. align-items: center;
  56295. width: 20%;
  56296. height: auto;
  56297. overflow: hidden;
  56298. display: flex;
  56299. &.min--240{
  56300. min-height: 240px;
  56301. }
  56302. img{
  56303. width: 100%;
  56304. height: 100%;
  56305. object-fit: cover;
  56306. }
  56307. }
  56308. .item--info{
  56309. display: flex;
  56310. flex-direction: column;
  56311. h2{
  56312. font-size: 1.5rem;
  56313. margin-bottom: 1rem;
  56314. }
  56315. p{
  56316. font-size: 1rem;
  56317. line-height: 1.4;
  56318. }
  56319. }
  56320. }
  56321. }
  56322. .search--modules{
  56323. width:100%;
  56324. display: flex;
  56325. align-items: center;
  56326. justify-content: center;
  56327. gap:10px;
  56328. border: 1px solid #eee;
  56329. border-radius: 15px;
  56330. padding:20px;
  56331. margin-top:25px;
  56332. background: #f8f8f8;
  56333. &.type2{
  56334. flex-direction: column;
  56335. align-items: flex-start;
  56336. position: relative;
  56337. .search--inner{
  56338. width: calc(100% - 120px);
  56339. gap: 10px;
  56340. display: flex;
  56341. }
  56342. .sch--btn{
  56343. position: absolute;
  56344. right: 20px;
  56345. top: 20px;
  56346. height: calc(100% - 40px);
  56347. }
  56348. }
  56349. .month--selector{
  56350. display: flex;
  56351. align-items: center;
  56352. overflow: hidden;
  56353. border-radius: 10px;
  56354. margin-left: 10px;
  56355. background: #fff;
  56356. border:1px solid #E2E2E2;
  56357. .v-btn{
  56358. color: #666;
  56359. font-size: 0.8rem;
  56360. height: 2.25rem;
  56361. font-style: normal;
  56362. font-weight: 500;
  56363. line-height: 100%; /* 12px */
  56364. letter-spacing: -0.48px;
  56365. padding:0 1.2rem;
  56366. border-radius: 0px;
  56367. position: relative;
  56368. &.actv{
  56369. color:#fff;
  56370. background-color:#007aff;
  56371. &:after{
  56372. display: none;
  56373. }
  56374. }
  56375. }
  56376. }
  56377. .form--cont--filter{
  56378. width:100%;
  56379. max-width:10.5rem;
  56380. }
  56381. .form--cont--text{
  56382. width:100%;
  56383. max-width:calc(100% - 10.5rem);
  56384. }
  56385. .sch--btn{
  56386. // height:36px;
  56387. height: 2.25rem;
  56388. max-width:80px;
  56389. }
  56390. }
  56391. .inner--headers{
  56392. display: flex;
  56393. align-items: center;
  56394. justify-content: space-between;
  56395. > h2{
  56396. font-size:1.625rem;
  56397. }
  56398. .bread--crumbs--wrap{
  56399. display: flex;
  56400. align-items: center;
  56401. gap:5px;
  56402. span{
  56403. font-size:.9rem;
  56404. font-weight: 500;
  56405. display: flex;
  56406. align-items: center;
  56407. gap:5px;
  56408. &:before{
  56409. content:"";
  56410. display: inline-flex;
  56411. width:15px;
  56412. height:15px;
  56413. background: url(../img/ic_arrow_right_chv.svg) no-repeat center;
  56414. }
  56415. &:nth-of-type(1){
  56416. &:before{
  56417. display: none;
  56418. }
  56419. }
  56420. &:last-child{
  56421. font-weight: bold;
  56422. }
  56423. }
  56424. }
  56425. }
  56426. .item--list--wrap{
  56427. .no--data{
  56428. padding-top: 80px;
  56429. text-align: center;
  56430. }
  56431. .item--list{
  56432. display: flex;
  56433. gap: 20px;
  56434. .item{
  56435. position: relative;
  56436. cursor: pointer;
  56437. width: calc((100% - 80px) / 5);
  56438. border-radius: 20px;
  56439. border: 1px solid #cccccc;
  56440. padding: 1rem 1rem 2rem 1rem;
  56441. .item--img {
  56442. width: 100%;
  56443. height: 10rem;
  56444. background-color: #eee;
  56445. border-radius: 20px;
  56446. margin-bottom: 1.2rem;
  56447. overflow: hidden;
  56448. position: relative;
  56449. img {
  56450. width: 100%;
  56451. height: 100%;
  56452. object-fit: cover;
  56453. object-position: center;
  56454. position: absolute;
  56455. top: 0;
  56456. left: 0;
  56457. }
  56458. }
  56459. >h3{
  56460. color: #444444;
  56461. font-size: 1rem;
  56462. overflow: hidden;
  56463. line-height: 1.2;
  56464. text-overflow: ellipsis;
  56465. display: -webkit-box;
  56466. -webkit-line-clamp: 2;
  56467. -webkit-box-orient: vertical;
  56468. margin-bottom: 1rem;
  56469. }
  56470. >p{
  56471. color: #888;
  56472. line-height: 1.2;
  56473. font-size: 0.8rem;
  56474. margin-bottom: 0.8rem;
  56475. }
  56476. >span{
  56477. color: #999;
  56478. line-height: 1.2;
  56479. display: block;
  56480. font-size: 0.8rem;
  56481. }
  56482. .sold--out{
  56483. position: absolute;
  56484. top: 0;
  56485. left: 0;
  56486. width: 100%;
  56487. height: 100%;
  56488. background-color: rgba(0,0,0,0.2);
  56489. border-radius: inherit;
  56490. display: flex;
  56491. align-items: center;
  56492. justify-content: center;
  56493. &.blue--type{
  56494. >span{
  56495. background-color: #007aff;
  56496. }
  56497. }
  56498. >span{
  56499. color: #ffffff;
  56500. text-align: center;
  56501. font-size: 1.2rem;
  56502. font-weight: 500;
  56503. display: inline-block;
  56504. padding: 0.8rem 3rem;
  56505. background-color: red;
  56506. border-radius: 50px;
  56507. }
  56508. }
  56509. }
  56510. }
  56511. .item--pagination{
  56512. display: flex;
  56513. justify-content: center;
  56514. margin-top: 80px;
  56515. gap: 30px;
  56516. .v-pagination{
  56517. width: 50%;
  56518. max-width: 800px;
  56519. }
  56520. .v-btn{
  56521. padding: 0;
  56522. width: 50px;
  56523. height: 50px;
  56524. border-radius: 100px;
  56525. min-width: 50px;
  56526. border: 1px solid #DDD;
  56527. background: #FFF;
  56528. &.v-btn--disabled{
  56529. opacity: 0.5;
  56530. }
  56531. .v-btn__content{
  56532. color: #909090;
  56533. font-size: 16px;
  56534. font-weight: 400;
  56535. line-height: 1;
  56536. }
  56537. &.prev--btn{
  56538. background-image: url(/assets/img/ico_paging_prev.svg);
  56539. background-repeat: no-repeat;
  56540. background-position: center;
  56541. }
  56542. &.next--btn{
  56543. background-image: url(/assets/img/ico_paging_next.svg);
  56544. background-repeat: no-repeat;
  56545. background-position: center;
  56546. }
  56547. }
  56548. }
  56549. }
  56550. }
  56551. }
  56552. }
  56553. /**********************************************
  56554. | ag-grid
  56555. **********************************************/
  56556. .tbl-wrap {
  56557. .ag-paging-panel {
  56558. padding: 1.25rem 0px;
  56559. }
  56560. .ag-header-cell-resize {
  56561. &:after {
  56562. width: 1px;
  56563. height: 1.25rem;
  56564. top: calc(50% - (1.25rem)*0.5);
  56565. }
  56566. }
  56567. .ag-checkbox-input-wrapper {
  56568. &:after {
  56569. content: '';
  56570. width: 1rem;
  56571. height: 1rem;
  56572. background: url(../img/ico_chk_off.svg);
  56573. background-repeat: no-repeat;
  56574. }
  56575. &.ag-checked {
  56576. &:after {
  56577. content: '';
  56578. background: url(../img/ico_chk_on.svg);
  56579. background-repeat: no-repeat;
  56580. }
  56581. }
  56582. &.ag-indeterminate {
  56583. &:after {
  56584. content: '';
  56585. background: url(../img/ico_check_indeterminate.svg);
  56586. background-repeat: no-repeat;
  56587. }
  56588. }
  56589. }
  56590. .ag-root-wrapper {
  56591. .ag-header-cell {
  56592. padding: 0rem 1.25rem;
  56593. }
  56594. .ag-header-cell-text {
  56595. text-align: left;
  56596. }
  56597. .ag-root-wrapper-body {
  56598. &.ag-layout-normal {
  56599. height: 100%;
  56600. }
  56601. }
  56602. .ag-cell-label-container {
  56603. height: 3.125rem;
  56604. }
  56605. .ag-header-cell-text {
  56606. color: #444;
  56607. font-size: 0.875rem;
  56608. font-style: normal;
  56609. font-weight: 700;
  56610. }
  56611. .ag-header {
  56612. border-top: 0px;
  56613. .ag-header-container {
  56614. background: #F2F7FF;
  56615. }
  56616. &.ag-header-allow-overflow {
  56617. .ag-header-row {
  56618. background: #F2F7FF;
  56619. }
  56620. }
  56621. }
  56622. .ag-center-cols-container {
  56623. .ag-row {
  56624. &.disabled{
  56625. opacity: .5;
  56626. pointer-events: none;
  56627. }
  56628. .ag-cell {
  56629. color: #444;
  56630. font-size: 0.875rem;
  56631. font-style: normal;
  56632. font-weight: 400;
  56633. text-align: left;
  56634. justify-content: flex-start;
  56635. padding: 0px 1.25rem;
  56636. }
  56637. }
  56638. }
  56639. }
  56640. .ag-overlay-no-rows-center {
  56641. display: flex;
  56642. align-items: center;
  56643. justify-content: center;
  56644. gap: 0.62rem;
  56645. color: #444;
  56646. text-align: center;
  56647. font-size: 0.875rem;
  56648. font-weight: 700;
  56649. &:before {
  56650. content: '';
  56651. display: inline-flex;
  56652. width: 1.25rem;
  56653. height: 1.25rem;
  56654. background: url(../img/ico_no_data_nw.svg);
  56655. background-size: contain;
  56656. }
  56657. }
  56658. }
  56659. .check--box--group{
  56660. display: flex;
  56661. }
  56662. .form--group--inner{
  56663. display: flex;
  56664. align-items: center;
  56665. gap:10px;
  56666. .visible{
  56667. display: none;
  56668. }
  56669. }
  56670. .status--box{
  56671. display: flex;
  56672. align-items: center;
  56673. justify-content: center;
  56674. padding:5px 25px;
  56675. border-radius: 35px;
  56676. background: #e4e4e4;
  56677. &.actv{
  56678. background: #33559B;
  56679. color:#fff;
  56680. }
  56681. }
  56682. .img--content{
  56683. display: flex;
  56684. align-items: center;
  56685. }
  56686. .equip--image--wrap{
  56687. display: flex;
  56688. align-items: center;
  56689. .equip--image{
  56690. width:90px;
  56691. height: 90px;
  56692. margin-right: 25px;
  56693. #preview_image{
  56694. width: 90px;
  56695. height: 90px;
  56696. position: relative;
  56697. border: 1px solid rgba(0, 0, 0, 0.2);
  56698. overflow: hidden;
  56699. img{
  56700. width: 100%;
  56701. position: absolute;
  56702. top: 50%;
  56703. object-fit: contain;
  56704. left: 50%;
  56705. transform: translate(-50%, -50%);
  56706. }
  56707. }
  56708. .images-wrapper{
  56709. width: 100%;
  56710. height: 90px;
  56711. .image{
  56712. background-size: cover;
  56713. width: 100%;
  56714. height: 90px;
  56715. background-repeat: none;
  56716. cursor: pointer;
  56717. }
  56718. }
  56719. .cool-lightbox {
  56720. .cool-lightbox-toolbar{
  56721. top: 30px;
  56722. right: 30px;
  56723. .cool-lightbox-toolbar__btn{
  56724. border-radius: 50%;
  56725. width: 56px;
  56726. height: 56px;
  56727. display: inline-block;
  56728. background-image: url(../img/ic_close.svg);
  56729. background-position: center;
  56730. background-repeat: no-repeat;
  56731. svg{
  56732. display: none;
  56733. }
  56734. }
  56735. }
  56736. }
  56737. }
  56738. .equip--image--select{
  56739. display:flex;
  56740. flex-direction: column;
  56741. .form--group{
  56742. margin-bottom: 25px;
  56743. margin-top: 10px;
  56744. display: flex;
  56745. .file--btn{
  56746. width: 75px;
  56747. height:33px;
  56748. display: inline-flex;
  56749. align-items: center;
  56750. justify-content: center;
  56751. border-radius: 0px!important;
  56752. background: #6C7281!important;
  56753. cursor: pointer;
  56754. }
  56755. }
  56756. .equip--image--desc{
  56757. color: #0131AD;
  56758. font-size: 12px;
  56759. font-style: normal;
  56760. font-weight: 500;
  56761. letter-spacing: -0.36px;
  56762. }
  56763. }
  56764. }
  56765. .form--group--inner{
  56766. display: flex;
  56767. align-items: center;
  56768. justify-content: flex-start;
  56769. gap:10px;
  56770. margin-bottom:10px;
  56771. .text--box{
  56772. height:36px;
  56773. border-radius: 0px;
  56774. border:1px solid #b5b5b5;
  56775. white-space: nowrap;
  56776. display: flex;
  56777. align-items: center;
  56778. width:324px;
  56779. justify-content: flex-start;
  56780. padding:0 20px;
  56781. text-overflow: ellipsis;
  56782. }
  56783. }
  56784. .v-file-input{
  56785. &.custom-input {
  56786. .v-input__control {
  56787. .v-field{
  56788. border-radius: 0px;
  56789. }
  56790. .v-field__field {
  56791. input{
  56792. &:placeholder {
  56793. font-size: 0.75rem!important;
  56794. font-weight: 400;
  56795. color: #8e8e8e!important;
  56796. }
  56797. }
  56798. .v-field__input {
  56799. padding:0px;
  56800. min-height:36px;
  56801. padding-left: 0.75rem;
  56802. font-size: 0.75rem !important;
  56803. font-weight: 400 !important;
  56804. &::placeholder {
  56805. font-size: 0.75rem!important;
  56806. font-weight: 400;
  56807. color: #8e8e8e!important;
  56808. }
  56809. }
  56810. }
  56811. }
  56812. }
  56813. margin-top: 0px;
  56814. padding-top: 0px;
  56815. .v-input__control{
  56816. .v-input__slot{
  56817. padding: 0 15px;
  56818. &::before{
  56819. display: none;
  56820. }
  56821. &::after{
  56822. display: none;
  56823. }
  56824. .v-file-input__text,
  56825. .v-file-input__text--placeholder,
  56826. input::placeholder{
  56827. color: #444!important;
  56828. font-size: 12px!important;
  56829. font-style: normal!important;
  56830. font-weight: 300!important;
  56831. letter-spacing: -0.36px!important;
  56832. }
  56833. .v-input__append-inner{
  56834. .v-input__icon--clear{
  56835. opacity: 1;
  56836. .mdi-close::before{
  56837. content: '';
  56838. background-image: url(../static/ic_clear.svg);
  56839. display: inline-block;
  56840. width: 16px;
  56841. height: 16px;
  56842. background-position: center;
  56843. }
  56844. }
  56845. }
  56846. }
  56847. }
  56848. }
  56849. .flex--type{
  56850. display: flex;
  56851. align-items: center;
  56852. gap:12px;
  56853. }
  56854. .file--btn{
  56855. border-radius: 0px!important;
  56856. background: #4B5161!important;
  56857. color: #FFF!important;
  56858. font-size: 12px!important;
  56859. font-weight: 500!important;
  56860. }
  56861. .radio--group{
  56862. .v-selection-control-group{
  56863. gap:10px;
  56864. }
  56865. }
  56866. .mdi-radiobox-marked::before{
  56867. content:''!important;
  56868. width:15px;
  56869. height:15px;
  56870. display: inline-flex;
  56871. background: url(../img/ic_radio_on.svg) no-repeat center;
  56872. }
  56873. .mdi-radiobox-blank::before{
  56874. content:''!important;
  56875. width:15px;
  56876. height:15px;
  56877. display: inline-flex;
  56878. background: url(../img/ic_radio_off.svg) no-repeat center;
  56879. }
  56880. </file>
  56881. <file path="assets/scss/style.scss">
  56882. .container {
  56883. height: 100%;
  56884. width: 100%;
  56885. display: flex;
  56886. .header {
  56887. background: #064F9E;
  56888. height: calc(1vh * (90 / 10.8));
  56889. min-height: 90px;
  56890. display: flex;
  56891. align-items: center;
  56892. flex-shrink: 0;
  56893. position: relative;
  56894. padding: 0 1.88rem;
  56895. z-index: 100;
  56896. .logo {
  56897. color: #FFFFFF;
  56898. font-size: 1.13rem;
  56899. font-weight: 700;
  56900. line-height: 1.50rem;
  56901. flex-shrink: 0;
  56902. margin-right: auto;
  56903. }
  56904. .gnb {
  56905. z-index: 10;
  56906. &:hover {
  56907. .gnb-bg {
  56908. height: 22.38rem;
  56909. }
  56910. .depth1 {
  56911. >li {
  56912. .depth2 {
  56913. height: 22.38rem;
  56914. }
  56915. }
  56916. }
  56917. }
  56918. .depth1 {
  56919. display: flex;
  56920. >li {
  56921. position: relative;
  56922. &.active {
  56923. >button {
  56924. background: #83A7CF;
  56925. font-weight: 700;
  56926. }
  56927. }
  56928. >button {
  56929. width: calc(1vw * (180 / 19.2));
  56930. height: calc(1vh * (90 / 10.8));
  56931. min-height: 90px;
  56932. color: #fff;
  56933. font-size: 1rem;
  56934. font-weight: 400;
  56935. }
  56936. .depth2 {
  56937. position: absolute;
  56938. overflow: hidden;
  56939. height: 0;
  56940. z-index: 10;
  56941. width: 100%;
  56942. transition: 0.5s 0s;
  56943. ul {
  56944. padding-top: 1.88rem;
  56945. li {
  56946. color: #333;
  56947. font-size: 0.88rem;
  56948. font-weight: 400;
  56949. display: block;
  56950. margin-bottom: 1.88rem;
  56951. cursor: pointer;
  56952. text-align: center;
  56953. &.active {
  56954. color: #064F9E;
  56955. font-weight: 700;
  56956. }
  56957. }
  56958. }
  56959. }
  56960. }
  56961. }
  56962. .gnb-bg {
  56963. position: fixed;
  56964. top: calc(1vh * (90 / 10.8));
  56965. left: 0;
  56966. right: 0;
  56967. width: 100vw;
  56968. background: #fff;
  56969. z-index: 8;
  56970. height: 0;
  56971. transition: 0.5s 0s;
  56972. box-shadow: 0 0.25rem 0.63rem 0 rgba(0, 0, 0, 0.25);
  56973. }
  56974. }
  56975. .util {
  56976. display: flex;
  56977. align-items: center;
  56978. gap: 1.56rem;
  56979. margin-left: auto;
  56980. flex-shrink: 0;
  56981. .ico {
  56982. font-size: 0;
  56983. }
  56984. .btn-alarm {
  56985. width: 2rem;
  56986. height: 2rem;
  56987. position: relative;
  56988. &.type1 {
  56989. .ico {
  56990. background-image: url("../img/ico_alarm1.svg");
  56991. }
  56992. }
  56993. &.type2 {
  56994. .ico {
  56995. background-image: url("../img/ico_alarm2.svg");
  56996. }
  56997. }
  56998. .ico {
  56999. position: relative;
  57000. width: 2rem;
  57001. height: 2rem;
  57002. background: no-repeat center / 100%;
  57003. .dot {
  57004. position: absolute;
  57005. background: #E42325;
  57006. width: 0.44rem;
  57007. height: 0.44rem;
  57008. border-radius: 100%;
  57009. right: 0;
  57010. top: 0;
  57011. }
  57012. }
  57013. .alarm-detail {
  57014. position: absolute;
  57015. width: 8.75rem;
  57016. height: 4.44rem;
  57017. top: 3.00rem;
  57018. left: 50%;
  57019. display: flex;
  57020. align-items: center;
  57021. justify-content: space-between;
  57022. transform: translateX(-50%);
  57023. padding: 1.31rem 1.25rem 1rem 1.25rem;
  57024. background: url("../img/bg_tooltip.svg") no-repeat center / 100%;
  57025. strong {
  57026. color: #222222;
  57027. font-size: 0.81rem;
  57028. font-weight: 600;
  57029. }
  57030. .v-switch {
  57031. width: 2.25rem;
  57032. flex: 0 0 auto;
  57033. .v-switch__track {
  57034. background: #ECECEC;
  57035. height: 0.75rem;
  57036. width: 2.25rem;
  57037. opacity: 1;
  57038. }
  57039. .v-switch__thumb {
  57040. box-shadow: none;
  57041. background: #92989E;
  57042. width: 1.13rem;
  57043. height: 1.13rem;
  57044. }
  57045. .v-selection-control {
  57046. &.v-selection-control--dirty {
  57047. .v-switch__track {
  57048. background: #D7E4F1;
  57049. }
  57050. .v-switch__thumb {
  57051. background: #064f9e;
  57052. }
  57053. }
  57054. }
  57055. .v-selection-control__input {
  57056. &::before {
  57057. display: none;
  57058. }
  57059. }
  57060. .v-ripple__container {
  57061. display: none;
  57062. }
  57063. }
  57064. }
  57065. }
  57066. .btn-mode {
  57067. position: relative;
  57068. &.type1 {
  57069. .ico {
  57070. background-image: url("../img/ico_mode_white.svg");
  57071. }
  57072. }
  57073. &.type2 {
  57074. .ico {
  57075. background-image: url("../img/ico_mode_dark.svg");
  57076. }
  57077. }
  57078. .ico {
  57079. width: 2rem;
  57080. height: 2rem;
  57081. background: no-repeat center / 100%;
  57082. }
  57083. .mode-detail {
  57084. position: absolute;
  57085. top: 3rem;
  57086. left: 50%;
  57087. transform: translateX(-50%);
  57088. width: 12.63rem;
  57089. height: 9.75rem;
  57090. padding: 2.06rem 1.25rem 1.25rem 1.56rem;
  57091. background: url("../img/bg_tooltip2.svg") no-repeat center / 100%;
  57092. .custom-radio {
  57093. .v-input__control {
  57094. .v-selection-control-group {
  57095. gap: 0.94rem;
  57096. .v-radio {
  57097. position: relative;
  57098. height: 2.50rem;
  57099. margin: 0;
  57100. padding-left: 5.63rem;
  57101. flex: auto;
  57102. .v-selection-control__wrapper {
  57103. .v-selection-control__input {
  57104. width: 1.06rem;
  57105. height: 1.06rem;
  57106. .v-icon {
  57107. border-color: #c0c0c0;
  57108. &.mdi-radiobox-marked {
  57109. border-color: #007AFF;
  57110. background-color: #007AFF;
  57111. box-shadow: inset 0 0 0 0.13rem #fff
  57112. }
  57113. }
  57114. }
  57115. }
  57116. .v-label {
  57117. margin-left: 0.75rem;
  57118. .img {
  57119. position: absolute;
  57120. left: 0;
  57121. top: 0;
  57122. width: 4.38rem;
  57123. height: 2.5rem;
  57124. background: no-repeat center / 100%;
  57125. &.img1 {
  57126. background-image: url("../img/img_mode_white.svg");
  57127. }
  57128. &.img2 {
  57129. background-image: url("../img/img_mode_dark.svg");
  57130. }
  57131. }
  57132. strong {
  57133. color: #333333;
  57134. font-size: 0.75rem;
  57135. font-weight: 400;
  57136. }
  57137. }
  57138. }
  57139. }
  57140. }
  57141. }
  57142. }
  57143. }
  57144. .btn-lang {
  57145. position: relative;
  57146. .ico {
  57147. width: 2rem;
  57148. height: 2rem;
  57149. border: 0.06rem solid #fff;
  57150. background-color: #064F9E;
  57151. border-radius: 100%;
  57152. color: #fff;
  57153. display: flex;
  57154. align-items: center;
  57155. justify-content: center;
  57156. font-weight: 700;
  57157. font-size: 0.81rem;
  57158. }
  57159. .lang-detail {
  57160. position: absolute;
  57161. top: 3rem;
  57162. left: 50%;
  57163. width: 9.75rem;
  57164. height: 7.31rem;
  57165. transform: translateX(-50%);
  57166. background: url("../img/bg_tooltip3.svg") no-repeat center / 100%;
  57167. padding: 1.63rem 1.25rem 1.25rem 1.56rem;
  57168. .custom-radio {
  57169. .v-input__control {
  57170. .v-selection-control-group {
  57171. gap: 0.94rem;
  57172. .v-radio {
  57173. height: 1.63rem;
  57174. margin: 0;
  57175. .v-selection-control__wrapper {
  57176. .v-selection-control__input {
  57177. width: 1.06rem;
  57178. height: 1.06rem;
  57179. .v-icon {
  57180. border-color: #c0c0c0;
  57181. &.mdi-radiobox-marked {
  57182. border-color: #007AFF;
  57183. background-color: #007AFF;
  57184. box-shadow: inset 0 0 0 0.13rem #fff
  57185. }
  57186. }
  57187. }
  57188. }
  57189. .v-label {
  57190. margin-left: 0.75rem;
  57191. .img {
  57192. width: 1.63rem;
  57193. height: 1.63rem;
  57194. display: inline-block;
  57195. background: no-repeat center / 100%;
  57196. &.img1 {
  57197. background-image: url("../img/ico_lang_korea.svg");
  57198. }
  57199. &.img2 {
  57200. background-image: url("../img/ico_lang_english.svg");
  57201. }
  57202. }
  57203. strong {
  57204. color: #333333;
  57205. font-size: 0.75rem;
  57206. font-weight: 400;
  57207. margin-left: 0.63rem;
  57208. }
  57209. }
  57210. }
  57211. }
  57212. }
  57213. }
  57214. }
  57215. }
  57216. .divider {
  57217. width: 0.06rem;
  57218. height: 1.88rem;
  57219. margin: 0 0.63rem;
  57220. background: rgba(255, 255, 255, 0.5);
  57221. }
  57222. .user-info {
  57223. display: flex;
  57224. position: relative;
  57225. .ico {
  57226. width: 2rem;
  57227. height: 2rem;
  57228. background: #fff;
  57229. border-radius: 100%;
  57230. color: #064F9E;
  57231. display: flex;
  57232. align-items: center;
  57233. justify-content: center;
  57234. font-weight: 700;
  57235. font-size: 0.81rem;
  57236. cursor: pointer;
  57237. }
  57238. .info-detail {
  57239. position: absolute;
  57240. top: 3rem;
  57241. left: 50%;
  57242. width: 11.88rem;
  57243. height: 12.25rem;
  57244. padding: 2rem 1.56rem 1.25rem 1.56rem;
  57245. background: url("../img/bg_tooltip4.svg") no-repeat center / 100%;
  57246. transform: translateX(-50%);
  57247. p {
  57248. color: #111;
  57249. font-size: 0.94rem;
  57250. font-weight: 700;
  57251. margin-bottom: 0.94rem;
  57252. span {
  57253. font-weight: 600;
  57254. }
  57255. }
  57256. ul {
  57257. padding-bottom: 1.25rem;
  57258. margin-bottom: 0.94rem;
  57259. border-bottom: 0.06rem solid #e1e1e1;
  57260. display: flex;
  57261. flex-direction: column;
  57262. gap: 0.25rem;
  57263. li {
  57264. color: #444444;
  57265. font-size: 0.81rem;
  57266. font-weight: 400;
  57267. }
  57268. }
  57269. .custom-btn.v-btn.v-btn--density-default {
  57270. border: 0.06rem solid rgba(6, 79, 158, 0.5);
  57271. border-radius: 0.31rem;
  57272. width: 100%;
  57273. height: 2.5rem;
  57274. min-height: 2.5rem;
  57275. .v-btn__content {
  57276. color: #064F9E;
  57277. font-size: 0.75rem;
  57278. font-weight: 600;
  57279. letter-spacing: -0.01rem;
  57280. }
  57281. }
  57282. }
  57283. }
  57284. .user-name {
  57285. color: #fff;
  57286. font-size: 0.81rem;
  57287. font-weight: 700;
  57288. cursor: pointer;
  57289. display: flex;
  57290. align-items: center;
  57291. }
  57292. .btn-logout {
  57293. width: 2rem;
  57294. background: url("../img/ico_logout.svg") no-repeat center / 100%;
  57295. }
  57296. .btn-profile{
  57297. min-width:2rem;
  57298. min-height:2rem;
  57299. display: inline-flex;
  57300. align-items: center;
  57301. width: 2rem;
  57302. height: 2rem;
  57303. color:#fff;
  57304. }
  57305. }
  57306. }
  57307. .content {
  57308. position: relative;
  57309. overflow-y: auto;
  57310. background: #fff;
  57311. width: calc(100% - 340px);
  57312. }
  57313. .footer {
  57314. height: calc(1vh * (58 / 10.8));
  57315. min-height: 58px;
  57316. flex-shrink: 0;
  57317. background: #EBEBEB;
  57318. display: flex;
  57319. align-items: center;
  57320. padding: 0 1.88rem;
  57321. gap: 1.25rem;
  57322. .foot-connection {
  57323. display: flex;
  57324. align-items: center;
  57325. strong {
  57326. color: #111111;
  57327. font-size: 0.69rem;
  57328. font-weight: 600;
  57329. margin-right: 0.63rem;
  57330. }
  57331. span {
  57332. background: #064F9E;
  57333. border-radius: 6.25rem;
  57334. min-width: 2.25rem;
  57335. height: 1.56rem;
  57336. padding: 0 0.63rem;
  57337. display: flex;
  57338. align-items: center;
  57339. justify-content: center;
  57340. color: #fff;
  57341. font-size: 0.69rem;
  57342. font-weight: 600;
  57343. }
  57344. }
  57345. .foot-numbering {
  57346. display: flex;
  57347. gap: 0.63rem;
  57348. padding: 0 1.25rem;
  57349. position: relative;
  57350. &:before,
  57351. &:after {
  57352. position: absolute;
  57353. content: "";
  57354. width: 0.06rem;
  57355. height: 1.25rem;
  57356. background: #c8c8c8;
  57357. top: 50%;
  57358. margin-top: -0.63rem;
  57359. }
  57360. &:before {
  57361. left: 0;
  57362. }
  57363. &:after {
  57364. right: 0;
  57365. }
  57366. span {
  57367. height: 1.56rem;
  57368. min-width: 3.13rem;
  57369. display: flex;
  57370. align-items: center;
  57371. justify-content: center;
  57372. color: #fff;
  57373. font-size: 0.63rem;
  57374. font-weight: 600;
  57375. &.num1 {
  57376. background: #FF2426;
  57377. }
  57378. &.num2 {
  57379. background: #FF7236;
  57380. }
  57381. &.num3 {
  57382. background: #FFB800;
  57383. }
  57384. }
  57385. }
  57386. .foot-state {
  57387. color: #ff2426;
  57388. font-size: 0.63rem;
  57389. font-weight: 600;
  57390. border: 0.06rem solid rgba(255, 36, 38, 0.5);
  57391. display: flex;
  57392. align-items: center;
  57393. justify-content: center;
  57394. min-width: 4.13rem;
  57395. height: 1.56rem;
  57396. }
  57397. .foot-txt {
  57398. padding-left: 0.63rem;
  57399. color: #333;
  57400. opacity: 0.8;
  57401. font-size: 0.69rem;
  57402. font-weight: 400;
  57403. }
  57404. .foot-btn-wrap {
  57405. margin-left: auto;
  57406. display: flex;
  57407. gap: 0.63rem;
  57408. align-items: center;
  57409. button {
  57410. background: #111111;
  57411. min-width: 6.81rem;
  57412. padding: 0 0.94rem;
  57413. height: 1.56rem;
  57414. display: flex;
  57415. align-items: center;
  57416. justify-content: center;
  57417. color: #fff;
  57418. font-size: 0.69rem;
  57419. font-weight: 600;
  57420. .ico {
  57421. width: 0.81rem;
  57422. height: 0.81rem;
  57423. margin-right: 0.5rem;
  57424. background: no-repeat center / 100%;
  57425. &.ico1 {
  57426. background-image: url("../img/ico_event_view.svg");
  57427. }
  57428. &.ico2 {
  57429. background-image: url("../img/ico_event_pop.svg");
  57430. }
  57431. }
  57432. }
  57433. }
  57434. .foot-logo {
  57435. width: 11.69rem;
  57436. height: 1.44rem;
  57437. margin-left: 0.31rem;
  57438. font-size: 0;
  57439. background: url("../img/logo_foot2.svg") no-repeat center / 100%;
  57440. }
  57441. }
  57442. }
  57443. @media (max-height: 1079px) {
  57444. .container {
  57445. .header {
  57446. .gnb {
  57447. .gnb-bg {
  57448. top: 90px;
  57449. }
  57450. }
  57451. }
  57452. .content {
  57453. height: calc(100vh - 148px);
  57454. }
  57455. }
  57456. }
  57457. .v-application__wrap {
  57458. min-width: 1920px;
  57459. }
  57460. /* --- common type --- */
  57461. .txt-field-box {
  57462. position: relative;
  57463. width: 100%;
  57464. &.email{
  57465. display: flex;
  57466. align-items: center;
  57467. justify-content: center;
  57468. gap:10px;
  57469. > div{
  57470. width:calc( (100% - 30px) / 2);
  57471. }
  57472. }
  57473. &.phone{
  57474. display: flex;
  57475. align-items: center;
  57476. justify-content: space-between;
  57477. gap:10px;
  57478. > div{
  57479. width:calc( (100% - 60px) / 3);
  57480. }
  57481. }
  57482. &.error {
  57483. .custom-input.v-text-field {
  57484. .v-input__control {
  57485. .v-field__field {
  57486. .v-field__input {
  57487. padding-right: 2.56rem !important;
  57488. border-color: #FF8C8C !important;
  57489. }
  57490. }
  57491. }
  57492. }
  57493. .ico {
  57494. display: block;
  57495. background: url("../img/ico_error.svg") no-repeat center / 100%;
  57496. }
  57497. }
  57498. .ico {
  57499. display: none;
  57500. position: absolute;
  57501. width: 1.13rem;
  57502. height: 1.13rem;
  57503. right: 0.94rem;
  57504. top: 50%;
  57505. margin-top: -0.565rem;
  57506. }
  57507. }
  57508. .custom-input.v-text-field {
  57509. flex: 0 0 auto;
  57510. width: 100%;
  57511. min-height: 3.63rem;
  57512. padding: 0;
  57513. margin: 0;
  57514. flex-direction: column;
  57515. &.v-input--readonly {
  57516. .v-input__control {
  57517. .v-field__field {
  57518. .v-field__input {
  57519. background: #F0F0F0;
  57520. color: #747474!important;
  57521. cursor: not-allowed;
  57522. }
  57523. }
  57524. }
  57525. }
  57526. &.success-input {
  57527. flex-direction: column;
  57528. .v-input__append-outer {
  57529. width: 100%;
  57530. margin: 0;
  57531. .input-success {
  57532. padding: 0 1rem;
  57533. margin: 0.25rem 0 0;
  57534. letter-spacing: -0.02rem;
  57535. line-height: 1rem;
  57536. white-space: nowrap;
  57537. font-size: 0.75rem;
  57538. font-weight: 600;
  57539. }
  57540. }
  57541. }
  57542. &.v-input--disabled,
  57543. &.v-input--is-disabled {
  57544. input{
  57545. background: #f6f6f6 !important;
  57546. }
  57547. .v-input__prepend-outer {
  57548. .v-input__icon {
  57549. opacity: 0.5;
  57550. }
  57551. }
  57552. .v-input__control {
  57553. .v-input__slot {
  57554. .v-text-field__slot {
  57555. input {
  57556. color: #999;
  57557. }
  57558. }
  57559. }
  57560. }
  57561. }
  57562. &.v-input--is-focused {
  57563. .v-input__control {
  57564. .v-input__slot {
  57565. border-color: #584DE4 !important;
  57566. }
  57567. }
  57568. }
  57569. &.v-input--error {
  57570. .v-input__details {
  57571. display: block;
  57572. width: 100%;
  57573. .v-messages {
  57574. color: #FF4C6D;
  57575. text-align: left;
  57576. }
  57577. }
  57578. }
  57579. &.mini {
  57580. min-height: 2.25rem;
  57581. .v-input__control {
  57582. height: 2.25rem;
  57583. .v-field__field {
  57584. .v-field__input {
  57585. padding: 0 0.94rem;
  57586. height: 2.25rem;
  57587. min-height: 2.25rem;
  57588. font-size: 0.75rem;
  57589. color: #444;
  57590. border: 0.06rem solid #e0e0e0;
  57591. }
  57592. }
  57593. }
  57594. }
  57595. &.mini2 {
  57596. min-height: 2.5rem;
  57597. .v-input__control {
  57598. height: 2.5rem;
  57599. .v-field__field {
  57600. .v-field__input {
  57601. padding: 0 0.94rem;
  57602. height: 2.5rem;
  57603. min-height: 2.5rem;
  57604. font-size: 0.81rem;
  57605. color: #444;
  57606. border: 0.06rem solid #e0e0e0;
  57607. }
  57608. }
  57609. }
  57610. }
  57611. &.cursor {
  57612. cursor: pointer;
  57613. .v-input__control {
  57614. .v-field__field {
  57615. .v-field__input:read-only {
  57616. cursor: pointer;
  57617. }
  57618. }
  57619. }
  57620. }
  57621. .v-input__prepend-outer {
  57622. margin: 0 0 0 0.75rem;
  57623. .v-icon {
  57624. display: inline-block;
  57625. width: 1.25rem;
  57626. height: 1.25rem;
  57627. font-size: 0;
  57628. background: url("../assets/img/ico_calendar.svg") no-repeat center;
  57629. &:before {
  57630. display: none;
  57631. content: "";
  57632. }
  57633. }
  57634. }
  57635. .v-input__control {
  57636. width: 100%;
  57637. height: 3.63rem;
  57638. .v-field__overlay {
  57639. display: none;
  57640. }
  57641. .v-field__loader {
  57642. display: none;
  57643. }
  57644. .v-field {
  57645. opacity: 1;
  57646. }
  57647. .v-field__field {
  57648. .v-field__input {
  57649. height: 3.63rem;
  57650. min-height: 3.63rem;
  57651. padding: 0 1.25rem;
  57652. border: 0.06rem solid #e0e0e0;
  57653. background: #fff;
  57654. border-radius: 0;
  57655. color: #000;
  57656. font-size: 0.88rem;
  57657. font-weight: 400;
  57658. letter-spacing: -0.02rem;
  57659. &::placeholder {
  57660. color: #AAAAAA;
  57661. opacity: 1;
  57662. }
  57663. }
  57664. }
  57665. .v-field__outline {
  57666. &:before,
  57667. &:after {
  57668. display: none;
  57669. }
  57670. }
  57671. .v-input__slot {
  57672. height: 2.50rem;
  57673. margin: 0;
  57674. border: 0.06 solid #E9E9E9;
  57675. border-radius: 0;
  57676. &:before,
  57677. &:after {
  57678. display: none;
  57679. }
  57680. .v-text-field__slot {
  57681. height: 3.63rem;
  57682. input {
  57683. display: block;
  57684. max-height: 3.63rem;
  57685. padding: 0 0.75rem;
  57686. letter-spacing: -0.02rem;
  57687. color: #000;
  57688. font-weight: 600;
  57689. font-size: 0.88rem;
  57690. &::placeholder {
  57691. font-weight: 400;
  57692. color: #999990;
  57693. }
  57694. }
  57695. }
  57696. }
  57697. .v-text-field__details {
  57698. overflow: inherit !important;
  57699. display: none;
  57700. transition: none !important;
  57701. .v-messages__message {
  57702. padding: 0 0.81rem;
  57703. margin-top: 0.25rem;
  57704. letter-spacing: -0.02rem;
  57705. line-height: 1rem;
  57706. white-space: nowrap;
  57707. font-size: 0.75rem;
  57708. font-weight: 600;
  57709. color: #E50A0A;
  57710. transition: none !important;
  57711. overflow: visible!important;
  57712. }
  57713. }
  57714. }
  57715. .v-input__details {
  57716. display: none;
  57717. }
  57718. }
  57719. p.error-txt {
  57720. color: #E50A0A !important;
  57721. font-size: 0.88rem !important;
  57722. line-height: 0.88rem !important;
  57723. font-weight: 400 !important;
  57724. margin: 0.75rem 0 0;
  57725. text-align: left !important;
  57726. }
  57727. p.success-txt {
  57728. color: #007AFF !important;
  57729. font-size: 0.88rem !important;
  57730. line-height: 0.88rem !important;
  57731. font-weight: 400 !important;
  57732. margin: 0.75rem 0 0;
  57733. text-align: left !important;
  57734. }
  57735. .input-field-box:has(.v-field--focused) .ico-cancel {
  57736. display: block;
  57737. }
  57738. .custom-check.v-input {
  57739. padding: 0;
  57740. margin: 0;
  57741. cursor: pointer;
  57742. &.v-input--is-disabled {
  57743. opacity: 0.5;
  57744. }
  57745. &.type2 {
  57746. .v-input__control {
  57747. .v-selection-control {
  57748. .v-selection-control__wrapper {
  57749. width: 1rem;
  57750. height: 1rem;
  57751. .v-selection-control__input {
  57752. width: 1rem;
  57753. height: 1rem;
  57754. .v-icon {
  57755. min-width: 1rem;
  57756. width: 1rem;
  57757. height: 1rem;
  57758. //border-radius: 0;
  57759. border: 0;
  57760. background: url("../img/ico_chk_off.svg") no-repeat center;
  57761. &.mdi-checkbox-marked {
  57762. background-image: url("../img/ico_chk_on.svg");
  57763. }
  57764. }
  57765. }
  57766. }
  57767. .v-label {
  57768. height: auto;
  57769. padding-left: 0.94rem;
  57770. margin: 0;
  57771. font-size: 0.81rem;
  57772. font-weight: 400;
  57773. color: #333;
  57774. opacity: 1;
  57775. span {
  57776. padding-left: 0.19rem;
  57777. font-weight: 700;
  57778. color: #007AFF;
  57779. }
  57780. }
  57781. }
  57782. }
  57783. }
  57784. .v-input__control {
  57785. .v-selection-control {
  57786. min-height: auto;
  57787. .v-selection-control__wrapper {
  57788. width: 1rem;
  57789. height: 1rem;
  57790. .v-selection-control__input {
  57791. width: 1rem;
  57792. height: 1rem;
  57793. &:before {
  57794. display: none;
  57795. }
  57796. .v-icon {
  57797. min-width: 1rem;
  57798. width: 1rem;
  57799. height: 1rem;
  57800. //border-radius: 0.25rem;
  57801. //border: 0.06rem solid #9B9B9B;
  57802. &:before {
  57803. display: none;
  57804. }
  57805. &.mdi-checkbox-marked {
  57806. background: url("../img/ico_chk.svg") no-repeat center / 100%;
  57807. }
  57808. }
  57809. .v-ripple__container {
  57810. display: none !important;
  57811. background: transparent !important;
  57812. }
  57813. }
  57814. }
  57815. .v-label {
  57816. height: auto;
  57817. margin-left: 0.63rem;
  57818. font-size: 0.81rem;
  57819. font-weight: 400;
  57820. color: #000;
  57821. opacity: 1;
  57822. }
  57823. }
  57824. }
  57825. }
  57826. .custom-radio.v-input {
  57827. padding: 0;
  57828. margin: 0;
  57829. &.v-input--radio-group--column {
  57830. .v-input--radio-group__input {
  57831. .v-radio {
  57832. margin-bottom: 0;
  57833. }
  57834. }
  57835. }
  57836. &.picker-terms {
  57837. height: 2.25rem;
  57838. .v-input__control {
  57839. .v-selection-control-group {
  57840. gap: calc(1vw * (5 / 19.2));
  57841. flex-wrap: nowrap;
  57842. .v-radio {
  57843. position: relative;
  57844. margin: 0;
  57845. &.radio_n {
  57846. .v-label {
  57847. width: calc(1vw * (87 / 19.2));
  57848. }
  57849. }
  57850. &.radio_h {
  57851. .v-label {
  57852. width: calc(1vw * (70 / 19.2));
  57853. }
  57854. }
  57855. &.radio_d {
  57856. .v-label {
  57857. width: calc(1vw * (69 / 19.2));
  57858. }
  57859. }
  57860. &.radio_w {
  57861. .v-label {
  57862. width: calc(1vw * (72 / 19.2));
  57863. }
  57864. }
  57865. .v-selection-control__wrapper {
  57866. display: none;
  57867. }
  57868. .v-label {
  57869. justify-content: center;
  57870. padding: 0;
  57871. height: 2.25rem;
  57872. margin: 0;
  57873. border: 0.06rem solid #BACBDE;
  57874. font-size: 0.75rem;
  57875. font-weight: 400;
  57876. color: #56779B;
  57877. background: #fff;
  57878. }
  57879. &.v-selection-control--dirty {
  57880. .v-label {
  57881. color: #007AFF;
  57882. font-weight: 700;
  57883. border-color: #007AFF;
  57884. }
  57885. }
  57886. }
  57887. }
  57888. }
  57889. }
  57890. &.type2 {
  57891. .v-input__control {
  57892. .v-selection-control-group {
  57893. .v-radio {
  57894. margin-right: 1.88rem;
  57895. &:last-of-type {
  57896. margin-right: 0;
  57897. }
  57898. .v-selection-control__wrapper {
  57899. width: 1.06rem;
  57900. height: 1.06rem;
  57901. min-width: 1.06rem;
  57902. .v-selection-control__input {
  57903. width: 1.06rem;
  57904. height: 1.06rem;
  57905. .v-icon {
  57906. width: 1.06rem;
  57907. height: 1.06rem;
  57908. min-width: 1.06rem;
  57909. border-color: #C0C0C0;
  57910. &.mdi-radiobox-marked {
  57911. border-color: #007AFF;
  57912. box-shadow: inset 0 0 0 0.13rem #fff;
  57913. background: #007AFF;
  57914. }
  57915. }
  57916. }
  57917. }
  57918. .v-label {
  57919. padding-left: 0.75rem;
  57920. margin: 0;
  57921. color: #333;
  57922. font-size: 0.75rem;
  57923. }
  57924. }
  57925. }
  57926. }
  57927. }
  57928. .v-input__control {
  57929. .v-selection-control-group {
  57930. .v-radio {
  57931. margin-right: 1.25rem;
  57932. &:last-of-type {
  57933. margin-right: 0;
  57934. }
  57935. .v-selection-control__wrapper {
  57936. min-width: 0.94rem;
  57937. width: 0.94rem;
  57938. height: 0.94rem;
  57939. opacity: 1;
  57940. .v-selection-control__input {
  57941. width: 0.94rem;
  57942. height: 0.94rem;
  57943. border-radius: 0;
  57944. opacity: 1;
  57945. &:before {
  57946. display: none;
  57947. }
  57948. .v-icon {
  57949. min-width: 0.94rem;
  57950. width: 0.94rem;
  57951. height: 0.94rem;
  57952. border-radius: 100%;
  57953. border: 0.06rem solid #9B9B9B;
  57954. opacity: 1;
  57955. position: relative;
  57956. background: #fff;
  57957. &:before {
  57958. display: none;
  57959. }
  57960. &.mdi-radiobox-marked {
  57961. border-color: #064F9E;
  57962. box-shadow: inset 0 0 0 0.13rem #fff;
  57963. background: #064f9e;
  57964. }
  57965. }
  57966. .v-ripple__container {
  57967. display: none !important;
  57968. background: transparent !important;
  57969. }
  57970. }
  57971. }
  57972. .v-label {
  57973. margin-left: 0.63rem;
  57974. color: #000;
  57975. font-size: 0.81rem;
  57976. font-weight: 400;
  57977. opacity: 1;
  57978. }
  57979. }
  57980. }
  57981. }
  57982. .v-input__details {
  57983. display: none;
  57984. }
  57985. }
  57986. .custom-btn.v-btn.v-btn--density-default {
  57987. width: 100%;
  57988. height: 3.63rem;
  57989. border-radius: 0;
  57990. box-shadow: none;
  57991. padding: 0 0.63rem;
  57992. &:hover {
  57993. box-shadow: 1px 1px 4px 0px rgba(0, 0, 0, 0.15);
  57994. }
  57995. &.btn-blue {
  57996. background: #064F9E;
  57997. .v-btn__content {
  57998. color: #fff;
  57999. }
  58000. }
  58001. &.btn-blue2 {
  58002. background: #007AFF;
  58003. &.v-btn--disabled {
  58004. background: #C5CDD4 !important;
  58005. }
  58006. .v-btn__content {
  58007. color: #fff;
  58008. }
  58009. }
  58010. &.btn-blue-bor {
  58011. background: transparent;
  58012. border: 0.06rem solid rgba(3, 78, 162, 0.5);
  58013. .v-btn__content {
  58014. color: #034EA2;
  58015. font-size: 0.81rem;
  58016. font-weight: 400;
  58017. }
  58018. }
  58019. &.btn-pink{
  58020. background-color: #F74F78;
  58021. &.bdrs--10{
  58022. border-radius: 10px;
  58023. }
  58024. .v-btn__content{
  58025. color: #fff;
  58026. }
  58027. }
  58028. &.btn-white {
  58029. border: 0.06rem solid #DFE7EF;
  58030. background: #fff;
  58031. &.bdrs--10{
  58032. border-radius: 10px;
  58033. }
  58034. .v-btn__content {
  58035. color: #9DA9B6;
  58036. font-weight: 400;
  58037. }
  58038. }
  58039. &.btn-reg {
  58040. background: #007AFF;
  58041. .v-btn__content {
  58042. color: #fff;
  58043. font-weight: 400;
  58044. .ico {
  58045. width: 18px;
  58046. height: 18px;
  58047. margin-right: 0.37rem;
  58048. background-image: url("../img/ico_reg.svg");
  58049. }
  58050. }
  58051. }
  58052. &.btn-gray {
  58053. border: 0.06rem solid #DFE4EA;
  58054. background: #F4F6F9;
  58055. &.v-btn--disabled {
  58056. background: #fff !important;
  58057. border-color: #BDC5CE !important;
  58058. .v-btn__content {
  58059. color: #6E7E8F !important;
  58060. }
  58061. }
  58062. .v-btn__content {
  58063. color: #9DAAB8;
  58064. font-size: 0.75rem;
  58065. font-weight: 600;
  58066. }
  58067. }
  58068. &.btn-black {
  58069. background: #5A6571;
  58070. .v-btn__content {
  58071. color: #fff;
  58072. }
  58073. }
  58074. &.btn-gray-bor {
  58075. border: 0.06rem solid #BDC5CE;
  58076. background: #fff;
  58077. .v-btn__content {
  58078. color: #6E7E8F;
  58079. font-weight: 600;
  58080. }
  58081. }
  58082. &.btn-gray-bor2 {
  58083. border: 0.06rem solid #BDC5CE;
  58084. background: #fff;
  58085. &.v-btn--disabled {
  58086. background: #F4F6F9 !important;
  58087. border-color: #DFE4EA !important;
  58088. .v-btn__content {
  58089. color: #9DAAB8 !important;
  58090. }
  58091. }
  58092. .v-btn__content {
  58093. color: #5A6571;
  58094. }
  58095. }
  58096. &.btn-gray-bor3 {
  58097. border: 0.06rem solid #8F8F8F;
  58098. background: #fff;
  58099. .v-btn__content {
  58100. color: #333333;
  58101. }
  58102. }
  58103. &.v-btn--disabled {
  58104. background: #B3BFCD !important;
  58105. .v-btn__content {
  58106. color: #fff !important;
  58107. }
  58108. }
  58109. &.btn-excel {
  58110. width: 8.25rem;
  58111. border: 0.06rem solid #98CC9B;
  58112. height: 2.25rem;
  58113. &.v-btn--disabled {
  58114. background-color: #F4F6F9 !important;
  58115. border-color: #DFE4EA !important;
  58116. .ico {
  58117. background-image: url("../img/ico_excel_d.svg") !important;
  58118. }
  58119. .v-btn__content {
  58120. color: #9DAAB8 !important;
  58121. }
  58122. }
  58123. &.up {
  58124. border-color: #93C7FF;
  58125. width: 7.50rem;
  58126. .ico {
  58127. background-image: url("../img/ico_excel2.svg") !important;
  58128. }
  58129. .v-btn__content {
  58130. color: #007AFF !important;
  58131. }
  58132. }
  58133. .ico {
  58134. width: 1.13rem;
  58135. height: 1.13rem;
  58136. margin-right: 0.63rem;
  58137. background: url("../img/ico_excel.svg") no-repeat center / 100%;
  58138. }
  58139. .v-btn__content {
  58140. color: #19791E;
  58141. font-size: 0.81rem;
  58142. font-weight: 400;
  58143. }
  58144. }
  58145. &.btn-password {
  58146. background: #034EA2;
  58147. height: 1.81rem;
  58148. width: 6.88rem;
  58149. .v-btn__content {
  58150. color: #FFFFFF;
  58151. font-size: 0.75rem;
  58152. font-weight: 600;
  58153. }
  58154. }
  58155. &.mini {
  58156. width: 84px;
  58157. // height: 36px;
  58158. height: 2.25rem;
  58159. padding: 0 2.31rem;
  58160. .v-btn__content {
  58161. font-size: 0.75rem;
  58162. }
  58163. }
  58164. &.mini2 {
  58165. height: 2.5rem;
  58166. .v-btn__content {
  58167. font-size: 0.75rem;
  58168. font-weight: 600;
  58169. }
  58170. }
  58171. &.mid {
  58172. height: 2.25rem;
  58173. .v-btn__content {
  58174. font-size: 0.75rem;
  58175. }
  58176. }
  58177. .v-btn__overlay {
  58178. display: none;
  58179. }
  58180. .v-btn__underlay {
  58181. display: none;
  58182. }
  58183. .v-btn__content {
  58184. font-size: 0.94rem;
  58185. font-weight: 700;
  58186. letter-spacing: -0.02rem;
  58187. text-transform: none;
  58188. }
  58189. }
  58190. .custom-dialog {
  58191. background: #fff;
  58192. &.alert {
  58193. .v-common-dialog-content {
  58194. padding: 2.50rem 1.56rem 2.19rem 1.56rem;
  58195. .alert-txt {
  58196. text-align: left;
  58197. color: #222222;
  58198. font-size: 0.88rem;
  58199. font-weight: 400;
  58200. line-height: 1.63rem;
  58201. }
  58202. }
  58203. .btn-wrap {
  58204. padding-top: 0;
  58205. }
  58206. }
  58207. &.certify {
  58208. .modal-tit {
  58209. position: relative;
  58210. padding: 0;
  58211. height: auto;
  58212. border: 0;
  58213. .btn-close {
  58214. position: absolute;
  58215. right: 0.94rem;
  58216. top: 0.94rem;
  58217. }
  58218. }
  58219. .v-common-dialog-content {
  58220. padding-top: 2.81rem;
  58221. overflow: hidden;
  58222. }
  58223. .btn-wrap {
  58224. padding-bottom: 2.81rem;
  58225. .custom-btn {
  58226. height: 2.63rem;
  58227. }
  58228. }
  58229. }
  58230. .modal-tit {
  58231. display: flex;
  58232. align-items: center;
  58233. height: 3.63rem;
  58234. border-bottom: 0.06rem solid #EEEEEE;
  58235. padding: 0 1.25rem 0 1.56rem;
  58236. strong {
  58237. color: #034EA2;
  58238. font-size: 0.81rem;
  58239. font-weight: 600;
  58240. display: block;
  58241. }
  58242. .btn-close {
  58243. width: 1.50rem;
  58244. height: 1.50rem;
  58245. margin-left: auto;
  58246. background: url("../img/ico_pop_close.svg") no-repeat center / 100%;
  58247. }
  58248. }
  58249. .v-common-dialog-content {
  58250. padding: 1.56rem 1.56rem 0 1.56rem;
  58251. max-height: calc(100vh - 18.33rem);
  58252. overflow-y: auto;
  58253. &:has(.dialog-tree) {
  58254. overflow-y: hidden;
  58255. }
  58256. .find-pwd {
  58257. p {
  58258. color: #222;
  58259. display: block;
  58260. font-weight: 400;
  58261. font-size: 0.88rem;
  58262. margin-bottom: 1.88rem;
  58263. }
  58264. .txt-field-box {
  58265. margin-bottom: 0.94rem;
  58266. }
  58267. .otp-box {
  58268. display: flex;
  58269. gap: 0.94rem;
  58270. .txt-field-box {
  58271. width: calc(100% - 6.82rem);
  58272. margin: 0;
  58273. }
  58274. .btn-blue-bor {
  58275. width: 5.88rem;
  58276. }
  58277. }
  58278. .txt-list {
  58279. padding-bottom: 1.25rem;
  58280. margin-top: 2.19rem;
  58281. }
  58282. }
  58283. .otp-reg {
  58284. background: url("../img/bg_otp_reg.png") no-repeat right top / 16.69rem auto;
  58285. margin-top: -1.56rem;
  58286. padding-top: 1.56rem;
  58287. &.bg-not {
  58288. background: none;
  58289. }
  58290. .otp-box {
  58291. margin-top: 1.88rem;
  58292. &:first-of-type {
  58293. margin-top: 0;
  58294. }
  58295. .otp-box-tit {
  58296. display: block;
  58297. color: #000;
  58298. font-size: 0.94rem;
  58299. font-weight: 700;
  58300. letter-spacing: -0.02rem;
  58301. margin-bottom: 1.13rem;
  58302. }
  58303. .txt-list {
  58304. padding-bottom: 0.63rem;
  58305. }
  58306. .otp-reg-step {
  58307. margin-bottom: 1.56rem;
  58308. ul {
  58309. display: flex;
  58310. justify-content: space-between;
  58311. li {
  58312. width: 4.69rem;
  58313. display: flex;
  58314. flex-direction: column;
  58315. align-items: center;
  58316. position: relative;
  58317. &:after {
  58318. content: "";
  58319. width: 1.25rem;
  58320. height: 1.25rem;
  58321. right: -2.25rem;
  58322. top: 1.56rem;
  58323. position: absolute;
  58324. background: url("../img/ico_step_arr.svg") no-repeat center / 100%;
  58325. }
  58326. &:last-of-type {
  58327. &:after {
  58328. display: none;
  58329. }
  58330. }
  58331. .ico {
  58332. background: #F7F7F7 no-repeat center / 1.25rem;
  58333. height: 4.69rem;
  58334. width: 4.69rem;
  58335. border-radius: 100%;
  58336. &.ico1 {
  58337. background-image: url("../img/ico_otp_step1.svg");
  58338. }
  58339. &.ico2 {
  58340. background-image: url("../img/ico_otp_step2.svg");
  58341. }
  58342. &.ico3 {
  58343. background-image: url("../img/ico_otp_step3.svg");
  58344. }
  58345. &.ico4 {
  58346. background-image: url("../img/ico_otp_step4.svg");
  58347. }
  58348. &.ico5 {
  58349. background-image: url("../img/ico_otp_step5.svg");
  58350. }
  58351. }
  58352. .numbering {
  58353. background: #034EA2;
  58354. border-radius: 100%;
  58355. height: 1.25rem;
  58356. width: 2.31rem;
  58357. display: flex;
  58358. align-items: center;
  58359. justify-content: center;
  58360. margin-top: -0.63rem;
  58361. color: #fff;
  58362. font-size: 0.63rem;
  58363. font-weight: 700;
  58364. }
  58365. p {
  58366. text-align: center;
  58367. color: #333;
  58368. font-size: 0.81rem;
  58369. letter-spacing: -0.02rem;
  58370. margin-top: 0.63rem;
  58371. line-height: 1rem;
  58372. font-weight: 400;
  58373. }
  58374. }
  58375. }
  58376. }
  58377. .otp-certify {
  58378. background: #F8F8F8;
  58379. border: 0.06rem solid #EBEBEB;
  58380. padding: 1.88rem 0;
  58381. display: flex;
  58382. flex-direction: column;
  58383. align-items: center;
  58384. .certify-logo {
  58385. margin-bottom: 1.50rem;
  58386. span {
  58387. display: block;
  58388. height: 0.81rem;
  58389. width: 100%;
  58390. font-size: 0;
  58391. background: url("../img/logo_login.svg") no-repeat center / auto 0.81rem;
  58392. }
  58393. p {
  58394. margin-top: 0.38rem;
  58395. font-weight: 400;
  58396. text-align: center;
  58397. color: #333;
  58398. font-size: 0.88rem;
  58399. letter-spacing: -0.02rem;
  58400. }
  58401. }
  58402. .txt-field-box {
  58403. width: 18.75rem;
  58404. margin-bottom: 0.5rem;
  58405. }
  58406. .error-txt {
  58407. margin-top: 0.25rem;
  58408. width: 18.75rem;
  58409. }
  58410. .custom-input.v-text-field {
  58411. &.mini {
  58412. min-height: 2.5rem;
  58413. .v-input__control {
  58414. height: 2.5rem;
  58415. .v-field__field {
  58416. .v-field__input {
  58417. height: 2.5rem;
  58418. min-height: 2.5rem;
  58419. font-size: 0.81rem;
  58420. border: 0.06rem solid #E4E4E4;
  58421. }
  58422. }
  58423. }
  58424. }
  58425. }
  58426. .custom-btn {
  58427. width: 18.75rem;
  58428. margin-top: 0.94rem;
  58429. .v-btn__content {
  58430. font-weight: 700;
  58431. font-size: 0.81rem;
  58432. }
  58433. }
  58434. }
  58435. .otp-chk {
  58436. margin-top: 1.63rem;
  58437. padding-bottom: 1.56rem;
  58438. }
  58439. }
  58440. .otp-txt {
  58441. line-height: 0.94rem;
  58442. color: #000;
  58443. font-size: 0.94rem;
  58444. font-weight: 600;
  58445. letter-spacing: -0.02rem;
  58446. &.type2 {
  58447. font-weight: 400;
  58448. }
  58449. }
  58450. .otp-set-step {
  58451. margin-top: 1.88rem;
  58452. .otp-set-box {
  58453. margin-bottom: 2.50rem;
  58454. &:last-of-type {
  58455. margin-bottom: 0;
  58456. padding-bottom: 1.56rem;
  58457. }
  58458. .tit {
  58459. display: flex;
  58460. align-items: center;
  58461. margin-bottom: 1.06rem;
  58462. .num {
  58463. width: 3.75rem;
  58464. height: 1.69rem;
  58465. border-radius: 6.25rem;
  58466. display: flex;
  58467. align-items: center;
  58468. justify-content: center;
  58469. color: #fff;
  58470. font-weight: 600;
  58471. font-size: 0.69rem;
  58472. margin-right: 0.81rem;
  58473. background: #0078FF;
  58474. }
  58475. strong {
  58476. color: #000;
  58477. font-size: 0.81rem;
  58478. font-weight: 700;
  58479. letter-spacing: -0.02rem;
  58480. }
  58481. }
  58482. .set-in {
  58483. .app-download {
  58484. display: flex;
  58485. background: #F8F8F8;
  58486. border: 0.06rem solid #EBEBEB;
  58487. padding: 1.25rem 0;
  58488. margin-bottom: 1.56rem;
  58489. .store {
  58490. display: flex;
  58491. align-items: center;
  58492. justify-content: center;
  58493. width: 100%;
  58494. gap: 1.56rem;
  58495. button {
  58496. width: 8.81rem;
  58497. height: 2.50rem;
  58498. font-size: 0;
  58499. background: no-repeat center / 100%;
  58500. &.btn-google {
  58501. background-image: url("../img/btn_goolge_play.svg");
  58502. }
  58503. &.btn-app {
  58504. background-image: url("../img/btn_app_store.svg");
  58505. }
  58506. }
  58507. }
  58508. .qr {
  58509. padding: 0 2.38rem;
  58510. display: flex;
  58511. flex-shrink: 0;
  58512. height: 4.38rem;
  58513. align-items: center;
  58514. border-left: 0.06rem solid #DCDCDC;
  58515. .img {
  58516. width: 3.75rem;
  58517. height: 3.75rem;
  58518. img {
  58519. width: 100%;
  58520. height: 100%;
  58521. }
  58522. }
  58523. }
  58524. }
  58525. .key-box {
  58526. padding: 1.25rem 2.50rem;
  58527. display: flex;
  58528. margin-bottom: 1.56rem;
  58529. align-items: center;
  58530. background: #F8F8F8;
  58531. border: 0.06rem solid #EBEBEB;
  58532. .qr {
  58533. width: 3.75rem;
  58534. height: 3.75rem;
  58535. flex-shrink: 0;
  58536. img {
  58537. width: 100%;
  58538. height: 100%;
  58539. }
  58540. }
  58541. p {
  58542. margin-left: 3.44rem;
  58543. color: #000;
  58544. font-size: 0.88rem;
  58545. font-weight: 400;
  58546. span {
  58547. font-weight: 700;
  58548. }
  58549. }
  58550. }
  58551. .txt-field-box {
  58552. margin-top: 1.56rem;
  58553. }
  58554. }
  58555. }
  58556. }
  58557. }
  58558. .certify-y {
  58559. .ico {
  58560. display: block;
  58561. margin: 0 auto;
  58562. width: 4.38rem;
  58563. height: 4.38rem;
  58564. background: #E9EBEE url("../img/ico_certify_y.svg") no-repeat center / 2.25rem;
  58565. border-radius: 100%;
  58566. }
  58567. .certify-txt {
  58568. text-align: center;
  58569. font-weight: 400;
  58570. font-size: 1rem;
  58571. margin-top: 1.25rem;
  58572. color: #222222;
  58573. span {
  58574. font-weight: 700;
  58575. color: #034EA2;
  58576. }
  58577. }
  58578. }
  58579. .info-mod {
  58580. padding-bottom: 1.25rem;
  58581. .mod-txt {
  58582. color: #222;
  58583. font-size: 0.88rem;
  58584. font-weight: 400;
  58585. margin-bottom: 1.88rem;
  58586. }
  58587. }
  58588. .excel-step {
  58589. display: flex;
  58590. gap: 3.38rem;
  58591. flex-direction: column;
  58592. padding-bottom: 0.94rem;
  58593. .excel-step-box {
  58594. position: relative;
  58595. &:before {
  58596. position: absolute;
  58597. width: 1.5rem;
  58598. height: 1.5rem;
  58599. bottom: -2.44rem;
  58600. left: 50%;
  58601. transform: translateX(-50%);
  58602. background: url("../img/ico_step_arr2.svg") no-repeat center / 100%;
  58603. content: "";
  58604. }
  58605. &:last-of-type {
  58606. &:before {
  58607. display: none;
  58608. }
  58609. }
  58610. .excel-step-top {
  58611. display: flex;
  58612. align-items: center;
  58613. margin-bottom: 1.06rem;
  58614. .step {
  58615. display: flex;
  58616. align-items: center;
  58617. justify-content: center;
  58618. width: 3.75rem;
  58619. height: 1.69rem;
  58620. border-radius: 6.25rem;
  58621. color: #fff;
  58622. margin-right: 0.81rem;
  58623. font-size: 0.69rem;
  58624. font-weight: 600;
  58625. background: #0078FF;
  58626. }
  58627. strong {
  58628. color: #000;
  58629. font-weight: 700;
  58630. font-size: 0.88rem;
  58631. letter-spacing: -0.02rem;
  58632. }
  58633. }
  58634. .excel-step-btm {
  58635. .step-bg-box {
  58636. background: #F8F8F8;
  58637. border: 0.06rem solid #ebebeb;
  58638. display: flex;
  58639. padding: 1.25rem 0;
  58640. &.type2 {
  58641. flex-direction: column;
  58642. padding: 1.81rem 2.44rem 1.5rem 2.44rem;
  58643. p {
  58644. text-align: center;
  58645. color: #444444;
  58646. font-size: 0.81rem;
  58647. letter-spacing: -0.02rem;
  58648. font-weight: 400;
  58649. &.txt2 {
  58650. margin-top: 0.56rem;
  58651. }
  58652. span {
  58653. display: inline-flex;
  58654. align-items: center;
  58655. justify-content: center;
  58656. width: 3.75rem;
  58657. height: 1.69rem;
  58658. border-radius: 6.25rem;
  58659. color: #fff;
  58660. margin: 0 0.5rem;
  58661. font-size: 0.69rem;
  58662. font-weight: 600;
  58663. background: #0078FF;
  58664. }
  58665. }
  58666. }
  58667. .download-txt {
  58668. display: flex;
  58669. align-items: center;
  58670. justify-content: center;
  58671. width: 100%;
  58672. p {
  58673. display: inline-block;
  58674. text-align: left;
  58675. color: #444444;
  58676. font-size: 0.81rem;
  58677. font-weight: 400;
  58678. letter-spacing: -0.02rem;
  58679. line-height: 1.63rem;
  58680. }
  58681. }
  58682. .download-area {
  58683. padding: 0.88rem 1.81rem;
  58684. margin-left: auto;
  58685. flex-shrink: 0;
  58686. border-left: 0.06rem solid #DCDCDC;
  58687. .custom-btn.btn-download {
  58688. width: 8.75rem;
  58689. height: 2.5rem;
  58690. min-height: 2.5rem;
  58691. .ico {
  58692. width: 1rem;
  58693. height: 1rem;
  58694. background: url("../img/ico_download.svg") no-repeat center / 100%;
  58695. margin-left: 0.94rem;
  58696. }
  58697. .v-btn__content {
  58698. font-size: 0.81rem;
  58699. font-weight: 700;
  58700. letter-spacing: -0.02rem;
  58701. }
  58702. }
  58703. }
  58704. .add-file {
  58705. margin-top: 1.56rem;
  58706. position: relative;
  58707. .v-file-input {
  58708. position: relative;
  58709. //padding-right:6.88rem;
  58710. .v-input__prepend {
  58711. grid-area: none;
  58712. margin: 0;
  58713. .v-icon {
  58714. display: none;
  58715. }
  58716. }
  58717. .v-input__control {
  58718. //height:2.25rem;
  58719. //border:0.06rem solid #E0E0E0;
  58720. background: transparent;
  58721. .v-field {
  58722. height: 2.25rem;
  58723. padding: 0;
  58724. }
  58725. .v-field__overlay {
  58726. background: transparent;
  58727. ;
  58728. opacity: 1;
  58729. }
  58730. .v-field__field {
  58731. height: 2.25rem;
  58732. padding-right: 6.88rem;
  58733. position: relative;
  58734. cursor: pointer;
  58735. .v-label {
  58736. width: 100%;
  58737. height: 100%;
  58738. width: 6.25rem;
  58739. overflow: visible !important;
  58740. margin: 0 !important;
  58741. position: absolute;
  58742. right: 0;
  58743. top: 0;
  58744. display: none;
  58745. transform: none;
  58746. contain: none;
  58747. cursor: pointer;
  58748. transition: none;
  58749. &.v-field-label--floating {
  58750. display: block !important;
  58751. visibility: visible !important;
  58752. opacity: 1 !important;
  58753. }
  58754. }
  58755. .v-field__input {
  58756. height: 2.25rem;
  58757. min-height: 2.25rem;
  58758. padding: 0 0.94rem;
  58759. color: #444444;
  58760. font-size: 0.75rem;
  58761. font-weight: 400;
  58762. border: 0.06rem solid #E0E0E0;
  58763. background: #fff;
  58764. }
  58765. input {
  58766. cursor: pointer;
  58767. }
  58768. }
  58769. .v-field__clearable {
  58770. position: absolute;
  58771. right: 7.31rem;
  58772. top: 50%;
  58773. transform: translateY(-50%);
  58774. z-index: 5;
  58775. }
  58776. .v-field__outline {
  58777. display: none;
  58778. }
  58779. }
  58780. }
  58781. .btn-file {
  58782. width: 100px;
  58783. height: 2.25rem;
  58784. display: flex;
  58785. align-items: center;
  58786. justify-content: center;
  58787. background: #f8f8f8;
  58788. border: 0.06rem solid rgba(3, 78, 162, 0.3);
  58789. color: #034EA2;
  58790. font-weight: 700;
  58791. font-size: 0.81rem;
  58792. letter-spacing: -0.02rem;
  58793. cursor: pointer;
  58794. }
  58795. }
  58796. }
  58797. .tbl-wrap {
  58798. .custom-table.v-table {
  58799. .v-table__wrapper {
  58800. max-height: calc(1vh * (196 / 10.8));
  58801. min-height: auto;
  58802. height: auto;
  58803. }
  58804. }
  58805. }
  58806. }
  58807. }
  58808. }
  58809. .backup-name-dns {
  58810. display: flex;
  58811. align-items: flex-start;
  58812. justify-content: flex-start;
  58813. flex-direction: column;
  58814. margin-bottom: 1.25rem;
  58815. gap: 0.875rem;
  58816. strong {
  58817. color: #222222;
  58818. font-weight: 700;
  58819. font-size: 0.88rem;
  58820. flex-shrink: 0;
  58821. }
  58822. p {
  58823. color: #222222;
  58824. font-weight: 700;
  58825. font-size: 0.88rem;
  58826. flex-shrink: 0;
  58827. }
  58828. }
  58829. .notice-img {
  58830. border: 0.06rem solid #D0E7FF;
  58831. display: flex;
  58832. align-items: center;
  58833. padding: 1.19rem 1.88rem;
  58834. margin-bottom: 2.19rem;
  58835. background: #E4F1FF url("../img/bg_popup.svg") no-repeat center top / 100% auto;
  58836. .ico {
  58837. width: 5.13rem;
  58838. height: 5.13rem;
  58839. background: url("../img/img_popup.svg") no-repeat center / 100%;
  58840. }
  58841. .notice-info {
  58842. padding-left: 1.88rem;
  58843. strong {
  58844. color: #111;
  58845. font-size: 1.13rem;
  58846. font-weight: 700;
  58847. line-height: 1.13rem;
  58848. display: block;
  58849. text-align: left;
  58850. letter-spacing: -0.01rem;
  58851. margin-bottom: 1.38rem;
  58852. }
  58853. p {
  58854. color: #555555;
  58855. font-size: 0.88rem;
  58856. font-weight: 400;
  58857. text-align: left;
  58858. letter-spacing: -0.01rem;
  58859. }
  58860. }
  58861. }
  58862. .notice-txt {
  58863. padding-bottom: 1.25rem;
  58864. word-break: break-all;
  58865. color: #333;
  58866. font-size: 0.88rem;
  58867. letter-spacing: -0.02rem;
  58868. line-height: 1.25rem;
  58869. }
  58870. .map-area {
  58871. height: 25rem;
  58872. border: 0.06rem solid #F7F8F9;
  58873. background: #FAFAFA;
  58874. }
  58875. .map-address {
  58876. display: flex;
  58877. align-items: center;
  58878. padding: 0.63rem;
  58879. background: #FAFAFA;
  58880. border: 0.06rem solid #F7F8F9;
  58881. margin: 0.63rem 0 0;
  58882. strong {
  58883. color: #111;
  58884. font-weight: 700;
  58885. flex-shrink: 0;
  58886. font-size: 0.88rem;
  58887. }
  58888. p {
  58889. color: #333;
  58890. font-size: 0.88rem;
  58891. font-weight: 600;
  58892. width: 100%;
  58893. padding-left: 0.5rem;
  58894. }
  58895. }
  58896. .dialog-tree {
  58897. padding: 0.94rem 0.31rem 0.94rem 0.94rem;
  58898. border: 0.06rem solid #F7F8F9;
  58899. .tree-area {
  58900. max-height: calc(100vh - 25rem);
  58901. }
  58902. }
  58903. }
  58904. .btn-wrap {
  58905. display: flex;
  58906. padding: 2.19rem 0 3.44rem;
  58907. justify-content: center;
  58908. gap: 0.69rem;
  58909. }
  58910. }
  58911. .custom-table.v-table {
  58912. position: relative;
  58913. &.backup-table {
  58914. .v-table__wrapper {
  58915. min-height: 196px;
  58916. height: calc(1vh * (196 / 10.8));
  58917. }
  58918. }
  58919. .v-table__wrapper {
  58920. border-top: 0.06rem solid #CCCCCC;
  58921. height: calc(1vh * (539 / 10.8));
  58922. min-height: 539px;
  58923. table {
  58924. table-layout: fixed;
  58925. thead {
  58926. tr {
  58927. th {
  58928. height: 47px;
  58929. padding: calc(1vh * (15 / 10.8)) 10px calc(1vh * (14 / 10.8));
  58930. background: #FAFAFA !important;
  58931. color: #222222;
  58932. font-size: 0.75rem;
  58933. font-weight: 600;
  58934. box-shadow: none;
  58935. box-shadow: inset 0 -0.06rem 0 #EBEBEB !important;
  58936. vertical-align: middle;
  58937. .v-data-table-header__content {
  58938. justify-content: center;
  58939. text-align: center;
  58940. span {
  58941. margin-left: 1.13rem;
  58942. }
  58943. }
  58944. }
  58945. }
  58946. }
  58947. tbody {
  58948. tr {
  58949. &.cursor {
  58950. td {
  58951. cursor: pointer;
  58952. }
  58953. }
  58954. &:hover {
  58955. td {
  58956. background: rgba(89, 146, 255, 0.12);
  58957. }
  58958. }
  58959. td {
  58960. min-height: 49px;
  58961. height: calc(1vh * (49 / 10.8));
  58962. padding: 0.63rem 0.63rem 0.56rem 0.63rem;
  58963. color: #222222;
  58964. text-align: center;
  58965. font-size: 0.75rem;
  58966. font-weight: 400;
  58967. vertical-align: middle;
  58968. border-bottom: 0.06rem solid #EBEBEB !important;
  58969. .ellipsis {
  58970. display: block;
  58971. width: 100%;
  58972. overflow: hidden;
  58973. white-space: nowrap;
  58974. text-overflow: ellipsis;
  58975. word-break: break-all;
  58976. }
  58977. .cusror {
  58978. cursor: pointer;
  58979. }
  58980. .btn-session-end {
  58981. display: flex;
  58982. margin: 0 auto;
  58983. align-items: center;
  58984. justify-content: center;
  58985. width: 6.44rem;
  58986. height: 1.81rem;
  58987. border-radius: 6.25rem;
  58988. background: #2C3744;
  58989. padding: 0;
  58990. box-shadow: none;
  58991. .v-btn__content {
  58992. color: #fff;
  58993. font-size: 0.75rem;
  58994. font-weight: 600;
  58995. letter-spacing: 0;
  58996. .ico {
  58997. width: 1.13rem;
  58998. height: 1.13rem;
  58999. background: url("../img/ico_end.svg");
  59000. margin-right: 0.59rem;
  59001. }
  59002. }
  59003. }
  59004. .result-color {
  59005. display: flex;
  59006. width: 3.31rem;
  59007. height: 1.81rem;
  59008. margin: 0 auto;
  59009. border-radius: 6.25rem;
  59010. align-items: center;
  59011. justify-content: center;
  59012. color: #fff;
  59013. font-size: 0.75rem;
  59014. font-weight: 600;
  59015. &.type-blue {
  59016. background: #064F9E;
  59017. }
  59018. &.type-red {
  59019. background: #FF2426;
  59020. }
  59021. }
  59022. .btn-state {
  59023. padding: 0 0.75rem;
  59024. display: inline-flex;
  59025. align-items: center;
  59026. font-size: 0.75rem;
  59027. height: 1.81rem;
  59028. border-radius: 6.25rem;
  59029. font-weight: 600;
  59030. border: 0.06rem solid;
  59031. background: #fff;
  59032. &.state1 {
  59033. border-color: rgba(0, 122, 255, 0.5);
  59034. color: #007AFF;
  59035. .ico {
  59036. background-image: url("../img/ico_state1.svg");
  59037. }
  59038. }
  59039. &.state2 {
  59040. border-color: rgba(255, 36, 38, 0.5);
  59041. color: #FF2426;
  59042. .ico {
  59043. background-image: url("../img/ico_state2.svg");
  59044. }
  59045. }
  59046. &.state3 {
  59047. border-color: rgba(255, 131, 0, 0.5);
  59048. color: #FF8300;
  59049. .ico {
  59050. background-image: url("../img/ico_state3.svg");
  59051. }
  59052. }
  59053. .ico {
  59054. width: 0.88rem;
  59055. height: 0.88rem;
  59056. background: no-repeat center / 100%;
  59057. margin-right: 0.31rem;
  59058. }
  59059. }
  59060. .btn-backup {
  59061. border: 0.06rem solid rgba(70, 118, 173, 0.4);
  59062. border-radius: 6.25rem;
  59063. height: 1.81rem;
  59064. display: inline-flex;
  59065. margin: 0 auto;
  59066. align-items: center;
  59067. padding: 0 0.75rem;
  59068. letter-spacing: 0;
  59069. box-shadow: none;
  59070. .v-btn__content {
  59071. color: #487EBD;
  59072. font-size: 0.75rem;
  59073. font-weight: 600;
  59074. letter-spacing: 0;
  59075. .ico {
  59076. width: 0.88rem;
  59077. height: 0.88rem;
  59078. background: no-repeat center / 100%;
  59079. margin-right: 0.31rem;
  59080. &.ico1 {
  59081. background-image: url("../img/ico_backup1.svg");
  59082. }
  59083. &.ico2 {
  59084. background-image: url("../img/ico_backup2.svg");
  59085. }
  59086. &.ico3 {
  59087. background-image: url("../img/ico_backup3.svg");
  59088. }
  59089. &.ico4 {
  59090. background-image: url("../img/ico_backup4.svg");
  59091. }
  59092. }
  59093. }
  59094. }
  59095. .input-wrap.slt-btn {
  59096. width: 100%;
  59097. justify-content: center;
  59098. .custom-select {
  59099. width: 8.63rem;
  59100. flex: none;
  59101. height: 1.81rem;
  59102. .v-input__control {
  59103. .v-field {
  59104. height: 1.81rem;
  59105. .v-field__field {
  59106. height: 1.81rem;
  59107. .v-field__input {
  59108. height: 1.81rem;
  59109. min-height: 1.81rem;
  59110. .v-btn__content {
  59111. color: #6E7E8F;
  59112. }
  59113. }
  59114. }
  59115. }
  59116. }
  59117. }
  59118. .custom-btn {
  59119. padding: 0;
  59120. min-width: 2.94rem;
  59121. width: 2.94rem;
  59122. height: 1.81rem;
  59123. min-height: 1.81rem;
  59124. }
  59125. }
  59126. }
  59127. }
  59128. }
  59129. .chk-first {
  59130. .v-selection-control__input::before {
  59131. display: none;
  59132. }
  59133. .v-icon {
  59134. opacity: 1;
  59135. width: 1.06rem;
  59136. min-width: 1.06rem;
  59137. height: 1.06rem;
  59138. background: no-repeat center / 100%;
  59139. &::before {
  59140. display: none;
  59141. }
  59142. &.mdi-checkbox-blank-outline {
  59143. background-image: url("../img/ico_chk_off.svg");
  59144. }
  59145. &.mdi-checkbox-marked {
  59146. background-image: url("../img/ico_chk_on.svg");
  59147. }
  59148. &.mdi-minus-box {
  59149. background: #007AFF;
  59150. position: relative;
  59151. overflow: hidden;
  59152. width: 1.06rem;
  59153. height: 1.06rem;
  59154. min-width: 1.06rem;
  59155. border-radius: 0.31rem;
  59156. &:before {
  59157. display: block;
  59158. color: #007AFF;
  59159. width: 1.06rem;
  59160. height: 1.06rem;
  59161. font-size: 1.44rem;
  59162. position: absolute;
  59163. top: -0.19rem;
  59164. left: -0.19rem;
  59165. border: 0;
  59166. background: #fff;
  59167. }
  59168. }
  59169. }
  59170. .v-ripple__container {
  59171. display: none;
  59172. }
  59173. }
  59174. }
  59175. }
  59176. .v-data-table-footer,
  59177. .v-divider {
  59178. display: none;
  59179. }
  59180. .tbl-no-data {
  59181. min-height: 5rem;
  59182. padding: 0.63rem 0;
  59183. display: flex;
  59184. align-items: center;
  59185. justify-content: center;
  59186. flex-direction: column;
  59187. .ico-excel {
  59188. width: 2.5rem;
  59189. height: 2.5rem;
  59190. display: inline-block;
  59191. background: url("../img/ico_not_excel.svg") no-repeat center / 100%;
  59192. margin-bottom: 0.63rem;
  59193. }
  59194. p {
  59195. text-align: center;
  59196. color: #333333;
  59197. font-size: 0.81rem;
  59198. font-weight: 400;
  59199. }
  59200. }
  59201. }
  59202. .connect-state {
  59203. display: flex;
  59204. margin: 0 auto;
  59205. align-items: center;
  59206. width: 8.38rem;
  59207. height: 1.81rem;
  59208. border-radius: 6.25rem;
  59209. padding: 0 0.88rem;
  59210. font-weight: 600;
  59211. font-size: 0.75rem;
  59212. color: #2D8CFA;
  59213. border: 0.06rem solid #2D8CFA;
  59214. background: #fff;
  59215. &.state-red {
  59216. border-color: #FFBABB;
  59217. color: #FF2426;
  59218. .cir {
  59219. background: #FF2426;
  59220. }
  59221. }
  59222. .cir {
  59223. width: 0.69rem;
  59224. height: 0.69rem;
  59225. border-radius: 100%;
  59226. margin-right: auto;
  59227. background: #2D8CFA;
  59228. }
  59229. }
  59230. .severity-type {
  59231. width: 4.56rem;
  59232. display: inline-flex;
  59233. align-items: center;
  59234. justify-content: center;
  59235. height: 1.81rem;
  59236. color: #fff;
  59237. font-size: 0.63rem;
  59238. font-weight: 600;
  59239. &.type-critical {
  59240. background: #FF2426;
  59241. }
  59242. &.type-major {
  59243. background: #FF7236;
  59244. }
  59245. &.type-minor {
  59246. background: #FFB800;
  59247. }
  59248. &.type-warning {
  59249. background: #C10002;
  59250. }
  59251. &.type-normal {
  59252. background: #064F9E;
  59253. }
  59254. &.type-not {
  59255. color: #222222;
  59256. font-weight: 400;
  59257. }
  59258. }
  59259. .custom-select.v-input {
  59260. &.not-detail {
  59261. .v-input__details {
  59262. display: none;
  59263. }
  59264. }
  59265. &.v-select--selected {
  59266. .v-input__control {
  59267. .v-field {
  59268. .v-field__field {
  59269. .v-label {
  59270. display: none;
  59271. }
  59272. }
  59273. }
  59274. }
  59275. }
  59276. &.v-input--error {
  59277. .v-input__control {
  59278. .v-field {
  59279. .v-field__outline {
  59280. border-color: #FF4C6D!important;
  59281. }
  59282. }
  59283. }
  59284. .v-input__details {
  59285. display: block;
  59286. width: 100%;
  59287. padding: 0.38rem 0.63rem 0 0.63rem;
  59288. .v-messages {
  59289. color: #FF4C6D;
  59290. text-align: left;
  59291. }
  59292. }
  59293. }
  59294. .v-input__control {
  59295. .v-field {
  59296. height: 2.25rem;
  59297. padding-right: 0;
  59298. background: #fff;
  59299. &.v-field--active {
  59300. .v-label {
  59301. visibility: visible;
  59302. }
  59303. }
  59304. .v-field__overlay {
  59305. display: none;
  59306. }
  59307. .v-field__field {
  59308. height: 2.25rem;
  59309. padding-left: 0.94rem;
  59310. overflow: hidden;
  59311. .v-label {
  59312. display: flex;
  59313. align-items: center;
  59314. position: static !important;
  59315. top: 0 !important;
  59316. height: 2.25rem;
  59317. font-size: 0.75rem;
  59318. color: #444444;
  59319. font-weight: 400;
  59320. margin: 0;
  59321. width: 100%;
  59322. opacity: 1;
  59323. min-width: 100%;
  59324. letter-spacing: 0;
  59325. transition: none !important;
  59326. transform: none !important;
  59327. }
  59328. .v-field__input {
  59329. padding: 0;
  59330. height: 2.25rem;
  59331. min-height: 2.25rem;
  59332. opacity: 1;
  59333. .v-select__selection {
  59334. font-size: 0.75rem;
  59335. color: #444;
  59336. font-weight: 400;
  59337. }
  59338. }
  59339. }
  59340. .v-field__append-inner {
  59341. .v-icon {
  59342. width: 0.75rem;
  59343. height: 0.75rem;
  59344. margin-right: 0.88rem;
  59345. min-width: 0.75rem;
  59346. background: url("/assets/img/ico_slt.svg") no-repeat center / 100%;
  59347. opacity: 1;
  59348. &:before {
  59349. display: none;
  59350. }
  59351. }
  59352. }
  59353. .v-field__outline {
  59354. border-radius: 0;
  59355. border: 0.06rem solid #E0E0E0;
  59356. >div {
  59357. display: none;
  59358. }
  59359. }
  59360. }
  59361. }
  59362. .v-input__details {
  59363. display: none;
  59364. }
  59365. }
  59366. .custom-textarea.v-textarea {
  59367. .v-input__control {
  59368. border: 0.06rem solid #E0E0E0;
  59369. border-radius: 0;
  59370. .v-field {
  59371. .v-field__overlay {
  59372. background: transparent;
  59373. opacity: 1;
  59374. }
  59375. .v-field__field {
  59376. .v-field__input {
  59377. font-size: 0.75rem;
  59378. font-weight: 400;
  59379. color: #444;
  59380. letter-spacing: 0;
  59381. padding: 0.94rem;
  59382. &::placeholder {
  59383. color: #AAAAAA;
  59384. opacity: 1;
  59385. }
  59386. }
  59387. }
  59388. .v-field__outline {
  59389. display: none;
  59390. }
  59391. }
  59392. }
  59393. .v-input__details {
  59394. display: none;
  59395. }
  59396. }
  59397. .v-menu {
  59398. border-radius: 0 !important;
  59399. box-shadow: none;
  59400. >.v-overlay__content {
  59401. border-radius: 0 !important;
  59402. box-shadow: none;
  59403. background: transparent;
  59404. }
  59405. .v-list {
  59406. border: 0.06rem solid #E0E0E0;
  59407. padding: 0;
  59408. margin-top: 0.06rem;
  59409. box-shadow: none;
  59410. overflow: hidden;
  59411. background: #fff;
  59412. .v-list-item {
  59413. background: none;
  59414. ;
  59415. min-height: 2.25rem;
  59416. padding: 0.38rem;
  59417. border-radius: 0;
  59418. .v-list-item-title {
  59419. font-size: 0.75rem;
  59420. color: #444;
  59421. font-weight: 400;
  59422. }
  59423. }
  59424. }
  59425. }
  59426. .calendar-wrap {
  59427. display: flex;
  59428. align-items: center;
  59429. margin-left: calc(1vw * (21 / 19.2));
  59430. .text {
  59431. padding: 0 calc(1vw * (10 / 19.2));
  59432. font-size: 0.75rem;
  59433. color: #444;
  59434. font-weight: 400;
  59435. }
  59436. }
  59437. .calendar {
  59438. .dp__input_wrap {
  59439. position: relative;
  59440. &:before {
  59441. content: "";
  59442. position: absolute;
  59443. right: 0.94rem;
  59444. top: 0.63rem;
  59445. width: 1rem;
  59446. height: 1rem;
  59447. background: url("/assets/img/ico_calendar.svg") no-repeat center / 100%;
  59448. }
  59449. .dp__input {
  59450. width: 10.5rem;
  59451. padding: 0 2.56rem 0 0.94rem;
  59452. height: 2.25rem;
  59453. border: 0.06rem solid #E0E0E0 !important;
  59454. color: #444;
  59455. font-weight: 400;
  59456. font-size: 0.75rem;
  59457. border-radius: 0;
  59458. &:hover {
  59459. border-color: #E0E0E0;
  59460. }
  59461. &::placeholder {
  59462. color: #444;
  59463. font-weight: 400;
  59464. opacity: 1;
  59465. }
  59466. }
  59467. .dp__icon {
  59468. display: none;
  59469. }
  59470. }
  59471. .dp--menu-wrapper {
  59472. width: 16.44rem;
  59473. .dp__menu_inner {
  59474. padding: 0.38rem 0.50rem;
  59475. .dp--year-select,
  59476. .dp__month_year_select {
  59477. height: 2.19rem;
  59478. font-size: 1rem;
  59479. }
  59480. .dp__calendar_header_item {
  59481. height: 2.19rem;
  59482. width: 2.19rem;
  59483. padding: 0.31rem;
  59484. font-size: 1rem;
  59485. }
  59486. .dp__calendar_header_separator {
  59487. height: 0.06rem;
  59488. }
  59489. .dp__calendar_row {
  59490. margin: 0.31rem 0;
  59491. .dp__cell_inner {
  59492. height: 2.19rem;
  59493. width: 2.19rem;
  59494. padding: 0.31rem;
  59495. border-width: 0.06rem;
  59496. font-size: 1rem;
  59497. }
  59498. }
  59499. }
  59500. .dp__action_row {
  59501. .dp__selection_preview {
  59502. display: none;
  59503. }
  59504. }
  59505. .dp__action_buttons {
  59506. gap: 0.5rem;
  59507. }
  59508. .dp__action_button {
  59509. border-width: 0.06rem;
  59510. padding: 0.38rem;
  59511. margin: 0;
  59512. height: 1.38rem;
  59513. font-size: 0.81rem;
  59514. }
  59515. .dp__time_col_sec {
  59516. padding: 0 0.63rem;
  59517. }
  59518. .dp__time_col_block {
  59519. font-size: 2rem;
  59520. }
  59521. .dp__inc_dec_button {
  59522. padding: 0.31rem;
  59523. height: 2rem;
  59524. width: 2rem;
  59525. }
  59526. .dp__time_display_block {
  59527. padding: 0 0.19rem;
  59528. }
  59529. .dp__button {
  59530. padding: 0.63em;
  59531. }
  59532. .dp__overlay_cell_pad {
  59533. padding: 0.63em 0;
  59534. }
  59535. .dp__overlay_col {
  59536. padding: 0.19rem;
  59537. }
  59538. .dp__overlay_container {
  59539. height: 18.00rem;
  59540. }
  59541. }
  59542. }
  59543. .pagination-wrapper {
  59544. margin-top: 1.88rem;
  59545. display: flex;
  59546. align-items: center;
  59547. justify-content: center;
  59548. .pagination-btn {
  59549. min-width: 1.75rem;
  59550. height: 1.75rem !important;
  59551. background-repeat: no-repeat !important;
  59552. background-color: transparent !important;
  59553. background-position: center !important;
  59554. background-size: 100%;
  59555. padding: 0;
  59556. box-shadow: none !important;
  59557. flex-shrink: 0;
  59558. &.prev1 {
  59559. margin: 0 0.63rem 0 0.31rem;
  59560. background-image: url("/assets/img/ico_paging_prev1.svg");
  59561. }
  59562. &.prev2 {
  59563. background-image: url("/assets/img/ico_paging_prev2.svg");
  59564. }
  59565. &.next1 {
  59566. margin: 0 0.31rem 0 0.63rem;
  59567. background-image: url("/assets/img/ico_paging_next1.svg");
  59568. }
  59569. &.next2 {
  59570. background-image: url("/assets/img/ico_paging_next2.svg");
  59571. }
  59572. &.number {
  59573. background-color: #fff;
  59574. border-radius: 100%;
  59575. }
  59576. &.more {
  59577. background-image: url("../img/ico_paging_more.svg");
  59578. }
  59579. &.on {
  59580. background: #007AFF !important;
  59581. .v-btn__content {
  59582. color: #fff;
  59583. font-weight: 700;
  59584. }
  59585. }
  59586. &.v-btn--disabled {
  59587. opacity: 0.4;
  59588. }
  59589. .v-btn__overlay,
  59590. .v-btn__underlay,
  59591. .v-ripple__container {
  59592. display: none !important;
  59593. }
  59594. .v-btn__content {
  59595. color: #5A5A5A;
  59596. font-size: 0.75rem;
  59597. line-height: 0.75rem;
  59598. font-weight: 400;
  59599. }
  59600. }
  59601. .page-go {
  59602. display: flex;
  59603. align-items: center;
  59604. overflow: hidden;
  59605. height: 2rem;
  59606. margin-left: 0.94rem;
  59607. .custom-input.v-text-field.mini {
  59608. height: 2rem;
  59609. min-height: 2rem;
  59610. .v-input__control {
  59611. height: 2rem;
  59612. .v-field__field {
  59613. .v-field__input {
  59614. height: 2rem;
  59615. min-height: 2rem;
  59616. border-right: 0;
  59617. border-radius: 0.63rem 0 0 0.63rem;
  59618. padding: 0 0.56rem;
  59619. color: #5a5a5a;
  59620. font-size: 0.75rem;
  59621. font-weight: 400;
  59622. }
  59623. }
  59624. }
  59625. }
  59626. button {
  59627. height: 2rem;
  59628. width: 2.81rem;
  59629. border-radius: 0 0.63rem 0.63rem 0;
  59630. border: 0.06rem solid #e8e8e8;
  59631. background: #f8f8f8;
  59632. display: flex;
  59633. align-items: center;
  59634. justify-content: center;
  59635. color: #007AFF;
  59636. font-size: 0.75rem;
  59637. font-weight: 600;
  59638. }
  59639. }
  59640. }
  59641. .txt-list {
  59642. li {
  59643. margin-bottom: 0.63rem;
  59644. position: relative;
  59645. padding-left: 1.06rem;
  59646. line-height: 1.13rem;
  59647. color: #444444;
  59648. font-size: 0.81rem;
  59649. font-weight: 400;
  59650. letter-spacing: -0.02rem;
  59651. &:last-of-type {
  59652. margin-bottom: 0;
  59653. }
  59654. &:before {
  59655. position: absolute;
  59656. width: 0.31rem;
  59657. height: 0.31rem;
  59658. left: 0;
  59659. top: 0.38rem;
  59660. background: #C0C0C0;
  59661. border-radius: 100%;
  59662. content: "";
  59663. }
  59664. p {
  59665. margin-top: 0.31rem;
  59666. }
  59667. }
  59668. }
  59669. .input-wrap {
  59670. display: flex;
  59671. gap: 0.63rem;
  59672. width: 100%;
  59673. .custom-input {
  59674. flex: inherit;
  59675. }
  59676. .custom-btn.v-btn.v-btn--density-default {
  59677. height: 2.25rem;
  59678. .v-btn__content {
  59679. font-size: 0.75rem;
  59680. font-weight: 600;
  59681. }
  59682. }
  59683. .txt {
  59684. flex-shrink: 0;
  59685. font-size: 0.75rem;
  59686. font-weight: 400;
  59687. margin-right: 0.38rem;
  59688. height: 2.25rem;
  59689. line-height: 2.25rem;
  59690. &.long {
  59691. margin-left: 0.63rem;
  59692. }
  59693. }
  59694. }
  59695. .chk-wrap {
  59696. display: flex;
  59697. gap: 1.88rem;
  59698. .custom-check {
  59699. flex: none;
  59700. }
  59701. }
  59702. .tbl-wrap {
  59703. .ag-root-wrapper {
  59704. border: 0;
  59705. .ag-header {
  59706. // min-height: 47px;
  59707. // height: 47px;
  59708. border-bottom-color: #EBEBEB;
  59709. border-top: 0.06rem solid #CCCCCC;
  59710. }
  59711. .ag-header-cell-text {
  59712. color: #222222;
  59713. font-size: 0.75rem;
  59714. font-weight: 600;
  59715. display: block;
  59716. width: 100%;
  59717. text-align: center;
  59718. }
  59719. .ag-center-cols-container {
  59720. .ag-row {
  59721. border-bottom: 0.06rem solid #EBEBEB;
  59722. //min-height: 49px;
  59723. .ag-cell {
  59724. color: #222222;
  59725. font-size: 0.75rem;
  59726. font-weight: 400;
  59727. display: block;
  59728. text-align: center;
  59729. border: 0;
  59730. padding-top: 0.63rem;
  59731. padding-bottom: 0.63rem;
  59732. line-height: normal;
  59733. display: flex;
  59734. justify-content: center;
  59735. align-items: center;
  59736. }
  59737. }
  59738. }
  59739. //border-bottom:1px solid #EBEBEB;
  59740. }
  59741. .ag-paging-panel {
  59742. border-top: 0;
  59743. height: auto;
  59744. padding-top: 1.88rem;
  59745. justify-content: center;
  59746. .ag-paging-page-size {
  59747. margin: 0;
  59748. .ag-picker-field {
  59749. .ag-label {
  59750. display: none;
  59751. }
  59752. .ag-picker-field-wrapper {
  59753. border-radius: 0;
  59754. border: 1px solid #E0E0E0;
  59755. height: 36px;
  59756. padding: 0 0 0 0.94rem;
  59757. outline: 0;
  59758. cursor: pointer;
  59759. .ag-picker-field-display {
  59760. color: #444;
  59761. font-size: 0.75rem;
  59762. font-weight: 400;
  59763. }
  59764. .ag-picker-field-icon {
  59765. .ag-icon {
  59766. width: 0.75rem;
  59767. height: 0.75rem;
  59768. margin-right: 0.88rem;
  59769. min-width: 0.75rem;
  59770. background: url("/assets/img/ico_slt.svg") no-repeat center / 100%;
  59771. &:before,
  59772. &:after {
  59773. display: none;
  59774. }
  59775. }
  59776. }
  59777. }
  59778. }
  59779. }
  59780. .ag-paging-row-summary-panel {
  59781. display: none;
  59782. }
  59783. .ag-paging-page-summary-panel {
  59784. margin-right: 0;
  59785. .ag-paging-button {
  59786. margin: 0;
  59787. border: 0;
  59788. outline: 0;
  59789. &.ag-disabled {
  59790. opacity: 0.4;
  59791. }
  59792. .ag-icon {
  59793. width: 40px;
  59794. height: 40px;
  59795. background: no-repeat center / 100%;
  59796. &:before,
  59797. &:after {
  59798. display: none;
  59799. }
  59800. &.ag-icon-first {
  59801. background-image: url("/assets/img/ico_paging_prev2.svg");
  59802. }
  59803. &.ag-icon-previous {
  59804. margin: 0 0.63rem 0 0.31rem;
  59805. background-image: url("/assets/img/ico_paging_prev1.svg");
  59806. }
  59807. &.ag-icon-next {
  59808. margin: 0 0.31rem 0 0.63rem;
  59809. background-image: url("/assets/img/ico_paging_next1.svg");
  59810. }
  59811. &.ag-icon-last {
  59812. background-image: url("/assets/img/ico_paging_next2.svg");
  59813. }
  59814. }
  59815. }
  59816. .ag-paging-description {
  59817. margin: 0;
  59818. font-size: 0.75rem;
  59819. color: #444;
  59820. font-weight: 400;
  59821. }
  59822. }
  59823. }
  59824. }
  59825. /* --- login --- */
  59826. .login-wrap {
  59827. flex-direction: column;
  59828. position: relative;
  59829. display: flex;
  59830. align-items: center;
  59831. justify-content: center;
  59832. width: 100%;
  59833. height: 100%;
  59834. padding: 3.63rem 0;
  59835. background: #F2F6FF;
  59836. &.type--join{
  59837. overflow-y: auto;
  59838. .login-box {
  59839. height: auto;
  59840. padding:45px 0px!important;
  59841. background: #fff;
  59842. }
  59843. }
  59844. .login-box {
  59845. display: flex;
  59846. height: 43.63rem;
  59847. .login-l {
  59848. flex-shrink: 0;
  59849. width: 39.94rem;
  59850. background: #064F9E url("../img/bg_login.svg") no-repeat center / 100%;
  59851. display: flex;
  59852. align-items: center;
  59853. flex-direction: column;
  59854. justify-content: center;
  59855. .login-l-center {
  59856. width: 15.63rem;
  59857. height: 13.13rem;
  59858. background: #fff;
  59859. display: flex;
  59860. align-items: center;
  59861. flex-direction: column;
  59862. justify-content: center;
  59863. .logo {
  59864. font-size: 0;
  59865. display: block;
  59866. height: 1.25rem;
  59867. width: 100%;
  59868. background: url("../img/logo_login.svg") no-repeat center / auto 100%;
  59869. }
  59870. p {
  59871. margin: 0.75rem 0 0;
  59872. text-align: center;
  59873. color: #333;
  59874. letter-spacing: -0.02rem;
  59875. font-size: 1.19rem;
  59876. line-height: 1.19rem;
  59877. }
  59878. }
  59879. }
  59880. .login-r {
  59881. width: 36.25rem;
  59882. background: #fff;
  59883. padding: 0 6.25rem;
  59884. display: flex;
  59885. flex-direction: column;
  59886. justify-content: center;
  59887. .mk--title{
  59888. font-size:35px;
  59889. font-weight: 900;
  59890. margin-bottom:45px;
  59891. }
  59892. .tit-login {
  59893. display: flex;
  59894. justify-content: space-between;
  59895. align-items: center;
  59896. margin-bottom: 1.88rem;
  59897. > span{
  59898. font-size: 14px;
  59899. font-weight: bold;
  59900. i{
  59901. color:red;
  59902. font-style: normal;
  59903. margin-right: 3px;
  59904. position: relative;
  59905. top:2px;
  59906. }
  59907. }
  59908. strong {
  59909. color: #333;
  59910. font-size: 1.38rem;
  59911. font-weight: 700;
  59912. line-height: 1.38rem;
  59913. display: block;
  59914. }
  59915. .lang-set {
  59916. width: 6.00rem;
  59917. .custom-select {
  59918. width: 6.00rem;
  59919. }
  59920. }
  59921. }
  59922. .login-input-wrap {
  59923. width: 100%;
  59924. .txt-field-box {
  59925. margin-bottom: 0.63rem;
  59926. &:first-of-type {
  59927. margin-bottom: 0.63rem;
  59928. }
  59929. }
  59930. }
  59931. .login-radio {
  59932. margin-top: 1.25rem;
  59933. }
  59934. .login-otp {
  59935. display: flex;
  59936. gap: 0.63rem;
  59937. margin-top: 1.25rem;
  59938. .txt-field-box {
  59939. width: 100%;
  59940. }
  59941. .btn-blue-bor {
  59942. width: 8.31rem;
  59943. height: 3.63rem;
  59944. flex-shrink: 0;
  59945. }
  59946. }
  59947. .login-btn-wrap {
  59948. margin-top: 1.88rem;
  59949. }
  59950. .login-chk {
  59951. margin: 1.25rem 0 0;
  59952. }
  59953. .login-find {
  59954. display: flex;
  59955. align-items: center;
  59956. margin-top: 2.19rem;
  59957. padding-top: 2.19rem;
  59958. border-top: 0.06rem solid #EEEEEE;
  59959. justify-content: center;
  59960. button {
  59961. display: flex;
  59962. align-items: center;
  59963. font-size: 0.88rem;
  59964. font-weight: 400;
  59965. color: #333;
  59966. &.blue-color {
  59967. &:after {
  59968. display: inline-block;
  59969. background: #E3E3E3;
  59970. width: 0.06rem;
  59971. height: 1rem;
  59972. content: "";
  59973. margin: 0 1rem;
  59974. }
  59975. }
  59976. &.blue-color {
  59977. color: #034EA2;
  59978. }
  59979. }
  59980. }
  59981. }
  59982. }
  59983. .login-footer {
  59984. position: fixed;
  59985. bottom: 0;
  59986. left: 0;
  59987. right: 0;
  59988. width: 100%;
  59989. background: #fff;
  59990. display: flex;
  59991. justify-content: flex-end;
  59992. align-items: center;
  59993. height: 3.63rem;
  59994. padding: 0 1.88rem;
  59995. p {
  59996. color: #333333;
  59997. opacity: 0.8;
  59998. font-size: 0.69rem;
  59999. font-weight: 400;
  60000. }
  60001. .logo {
  60002. margin-left: 4.38rem;
  60003. width: 8.19rem;
  60004. height: 1.44rem;
  60005. background: url("../img/logo_foot.svg") no-repeat center / 100%;
  60006. font-size: 0;
  60007. }
  60008. }
  60009. }
  60010. /* --- content --- */
  60011. .content-tit {
  60012. display: flex;
  60013. align-items: center;
  60014. margin-bottom: 1.25rem;
  60015. h2 {
  60016. color: #333333;
  60017. font-weight: 700;
  60018. font-size: 1.13rem;
  60019. letter-spacing: -0.01rem;
  60020. }
  60021. >span {
  60022. color: #666666;
  60023. font-size: 0.88rem;
  60024. font-weight: 400;
  60025. letter-spacing: -0.01rem;
  60026. display: flex;
  60027. align-items: center;
  60028. &:before {
  60029. content: "";
  60030. margin: 0 0.94rem;
  60031. background: #ddd;
  60032. width: 0.06rem;
  60033. height: 1rem;
  60034. }
  60035. }
  60036. .location {
  60037. margin-left: auto;
  60038. display: flex;
  60039. gap: 0.31rem;
  60040. align-items: center;
  60041. span {
  60042. display: flex;
  60043. align-items: center;
  60044. color: #333;
  60045. font-size: 0.94rem;
  60046. font-weight: 400;
  60047. letter-spacing: -0.01rem;
  60048. line-height: 0.88rem;
  60049. }
  60050. .home {
  60051. &:before {
  60052. content: "";
  60053. margin-right: 0.63rem;
  60054. width: 0.88rem;
  60055. height: 0.88rem;
  60056. background: url("../img/ico_location_home.svg") no-repeat center / 100%;
  60057. }
  60058. }
  60059. .arr {
  60060. width: 0.88rem;
  60061. height: 0.88rem;
  60062. background: url("../img/ico_location_arr.svg") no-repeat center / 100%;
  60063. }
  60064. .now {
  60065. font-weight: 700;
  60066. }
  60067. }
  60068. }
  60069. .search-wrap {
  60070. background: #FAFAFA;
  60071. padding: 20px calc(1vw * (30 / 19.2)) 22px calc(1vw * (30 / 19.2));
  60072. display: flex;
  60073. margin-bottom: 1.56rem;
  60074. .search-line-wrap {
  60075. display: flex;
  60076. gap: 1.06rem;
  60077. flex-direction: column;
  60078. .search-line {
  60079. gap: calc(1vw * (50 / 19.2));
  60080. display: flex;
  60081. .search-box {
  60082. display: flex;
  60083. strong {
  60084. min-height: 2.25rem;
  60085. flex-shrink: 0;
  60086. display: flex;
  60087. color: #333;
  60088. font-size: 0.75rem;
  60089. font-weight: 400;
  60090. align-items: center;
  60091. }
  60092. .search-box-in {
  60093. display: flex;
  60094. .custom-radio {
  60095. height: 1.13rem;
  60096. align-self: center;
  60097. &.picker-terms {
  60098. height: 2.25rem;
  60099. }
  60100. }
  60101. }
  60102. }
  60103. }
  60104. }
  60105. .search-btn {
  60106. flex-shrink: 0;
  60107. width: calc(1vw * (100 / 19.2));
  60108. display: flex;
  60109. margin-left: auto;
  60110. flex-direction: column;
  60111. gap: 1.06rem;
  60112. &.row {
  60113. flex-direction: row;
  60114. width: auto;
  60115. gap: calc(1vw * (10 / 19.2));
  60116. .custom-btn.v-btn.v-btn--density-default {
  60117. width: calc(1vw * (100 / 19.2));
  60118. }
  60119. }
  60120. .custom-btn.v-btn.v-btn--density-default {
  60121. width: 100%;
  60122. }
  60123. }
  60124. }
  60125. .tbl-list-top {
  60126. display: flex;
  60127. align-items: flex-end;
  60128. justify-content: space-between;
  60129. margin-bottom: .8rem;
  60130. .total {
  60131. display: flex;
  60132. flex-direction: column;
  60133. .total-num {
  60134. display: flex;
  60135. align-items: center;
  60136. strong {
  60137. color: #333333;
  60138. font-size: 0.81rem;
  60139. font-weight: 400;
  60140. span {
  60141. color: #007AFF;
  60142. font-weight: 700;
  60143. }
  60144. }
  60145. .total-slt {
  60146. display: flex;
  60147. align-items: center;
  60148. &:before {
  60149. content: "";
  60150. background: #C1C1C1;
  60151. width: 0.06rem;
  60152. height: 0.75rem;
  60153. margin: 0 0.94rem;
  60154. display: inline-block;
  60155. }
  60156. .custom-select.v-input {
  60157. .v-input__control {
  60158. .v-field {
  60159. height: 0.81rem;
  60160. background: transparent;
  60161. .v-field__field {
  60162. height: 0.81rem;
  60163. overflow: visible;
  60164. padding: 0;
  60165. .v-label {
  60166. height: 0.81rem;
  60167. font-size: 0.81rem;
  60168. color: #333;
  60169. font-weight: 400;
  60170. }
  60171. .v-field__input {
  60172. height: 0.81rem;
  60173. min-height: 0.81rem;
  60174. .v-select__selection {
  60175. font-size: 0.81rem;
  60176. color: #333;
  60177. line-height: 0.81rem;
  60178. }
  60179. }
  60180. }
  60181. .v-field__append-inner {
  60182. .v-icon {
  60183. margin-right: 0;
  60184. min-width: 0.75rem;
  60185. background-image: url("../img/ico_slt2.svg")
  60186. }
  60187. }
  60188. .v-field__outline {
  60189. border: 0;
  60190. }
  60191. }
  60192. }
  60193. }
  60194. }
  60195. }
  60196. .total-btn {
  60197. display: flex;
  60198. gap: 0.63rem;
  60199. margin-top: 1.25rem;
  60200. align-items: center;
  60201. .custom-btn.v-btn.v-btn--density-default {
  60202. width: 5.13rem;
  60203. height: 2.25rem;
  60204. &.v-btn--disabled {
  60205. background: #C5CDD4 !important;
  60206. }
  60207. &.btn-reg {
  60208. background: #007AFF;
  60209. .v-btn__content {
  60210. .ico {
  60211. background-image: url("../img/ico_reg.svg");
  60212. }
  60213. }
  60214. }
  60215. &.btn-del {
  60216. background: #8F9FAF;
  60217. .v-btn__content {
  60218. .ico {
  60219. background-image: url("../img/ico_del.svg");
  60220. }
  60221. }
  60222. }
  60223. &.btn-all-end {
  60224. width: 8.38rem;
  60225. background: #2C3744;
  60226. .v-btn__content {
  60227. .ico {
  60228. background-image: url("../img/ico_end.svg");
  60229. }
  60230. }
  60231. }
  60232. &.btn-all-end-red {
  60233. width: 8.75rem;
  60234. border: 1px solid #F49A9A;
  60235. .v-btn__content {
  60236. color: #EC4242;
  60237. font-size: 14px;
  60238. font-weight: 500;
  60239. letter-spacing: -0.28px;
  60240. max-width: 9.75rem !important;
  60241. width: 9.75rem !important;
  60242. ;
  60243. .ico {
  60244. background-image: url(../img/ic_end_red.svg);
  60245. }
  60246. }
  60247. }
  60248. &.btn-excel {
  60249. width: 8.25rem;
  60250. &.v-btn--disabled {
  60251. background-color: #F4F6F9 !important;
  60252. border-color: #DFE4EA !important;
  60253. .ico {
  60254. background-image: url("../img/ico_excel_d.svg") !important;
  60255. }
  60256. .v-btn__content {
  60257. color: #9DAAB8 !important;
  60258. }
  60259. }
  60260. }
  60261. .v-btn__content {
  60262. color: #fff;
  60263. font-size: 0.81rem;
  60264. font-weight: 400;
  60265. letter-spacing: -0.01rem;
  60266. .ico {
  60267. width: 1.13rem;
  60268. height: 1.13rem;
  60269. margin-right: 0.63rem;
  60270. background: no-repeat center / 100%;
  60271. }
  60272. }
  60273. }
  60274. .custom-check.v-input {
  60275. margin-left: 0.94rem;
  60276. }
  60277. }
  60278. }
  60279. .excel-search {
  60280. display: flex;
  60281. gap: 0.63rem;
  60282. .tbl-search {
  60283. position: relative;
  60284. .custom-input.v-text-field {
  60285. .v-input__control {
  60286. .v-field__field {
  60287. .v-field__input {
  60288. padding-right: 2.50rem;
  60289. }
  60290. }
  60291. }
  60292. }
  60293. .ico {
  60294. width: 2.56rem;
  60295. height: 2.25rem;
  60296. top: 0;
  60297. right: 0;
  60298. z-index: 1;
  60299. position: absolute;
  60300. background: url("../img/ico_search.svg") no-repeat 0.63rem center / 1rem;
  60301. }
  60302. }
  60303. }
  60304. }
  60305. .page-list-item {
  60306. color: #222;
  60307. font-size: 0.81rem;
  60308. font-weight: 700;
  60309. .page {
  60310. color: #333;
  60311. font-weight: 400;
  60312. }
  60313. }
  60314. .form-style1 {
  60315. //border-top:0.06rem solid #ccc;
  60316. &.col4 {
  60317. margin-top: -0.63rem;
  60318. table {
  60319. th {
  60320. font-weight: 400;
  60321. &:nth-of-type(even) {
  60322. padding-left: 1.56rem;
  60323. }
  60324. }
  60325. td {
  60326. &:nth-of-type(odd) {
  60327. padding-right: 1.56rem;
  60328. }
  60329. }
  60330. }
  60331. }
  60332. &.row {
  60333. table {
  60334. th {
  60335. height: 3.06rem;
  60336. padding: 0.94rem;
  60337. background: #FAFAFA;
  60338. color: #222222;
  60339. font-size: 0.75rem;
  60340. font-weight: 600;
  60341. border-top: 0.06rem solid #ccc;
  60342. border-bottom: 0.06rem solid #EBEBEB;
  60343. text-align: center;
  60344. vertical-align: middle;
  60345. line-height: normal;
  60346. }
  60347. td {
  60348. padding: 0.63rem;
  60349. text-align: center;
  60350. color: #222222;
  60351. font-size: 0.75rem;
  60352. font-weight: 400;
  60353. border-bottom: 0.06rem solid #EBEBEB;
  60354. .custom-radio {
  60355. display: inline-flex;
  60356. }
  60357. .input-wrap.slt-btn {
  60358. width: 100%;
  60359. justify-content: center;
  60360. .custom-input {
  60361. width: 14.88rem;
  60362. flex: none;
  60363. height: 1.81rem;
  60364. min-height: 1.81rem;
  60365. .v-input__control {
  60366. min-height: 1.81rem;
  60367. height: 1.81rem;
  60368. .v-field {
  60369. height: 1.81rem;
  60370. .v-field__field {
  60371. height: 1.81rem;
  60372. .v-field__input {
  60373. height: 1.81rem;
  60374. min-height: 1.81rem;
  60375. .v-btn__content {
  60376. color: #6E7E8F;
  60377. }
  60378. }
  60379. }
  60380. }
  60381. }
  60382. }
  60383. .custom-btn {
  60384. padding: 0;
  60385. min-width: 2.94rem;
  60386. width: 2.94rem;
  60387. height: 1.81rem;
  60388. min-height: 1.81rem;
  60389. }
  60390. }
  60391. }
  60392. }
  60393. }
  60394. table {
  60395. width: 100%;
  60396. table-layout: fixed;
  60397. th {
  60398. padding: 0.63rem 0;
  60399. text-align: left;
  60400. font-size: 0.75rem;
  60401. color: #222222;
  60402. font-weight: 700;
  60403. vertical-align: middle;
  60404. line-height: 2.25rem;
  60405. .bul {
  60406. color: #007AFF;
  60407. font-weight: 700;
  60408. padding-left: 0.19rem;
  60409. }
  60410. }
  60411. td {
  60412. text-align: left;
  60413. color: #222222;
  60414. font-weight: 400;
  60415. font-size: 0.75rem;
  60416. vertical-align: middle;
  60417. padding: 0.63rem 0;
  60418. }
  60419. }
  60420. }
  60421. .form-style2 {
  60422. table {
  60423. width: 100%;
  60424. border-top: 0.06rem solid #E0E0E0;
  60425. tr {
  60426. th {
  60427. border-bottom: 0.06rem solid #E0E0E0;
  60428. border-right: 0.06rem solid #E0E0E0;
  60429. background: #F4F4F4;
  60430. padding: 0.63rem 0 0.63rem 1.88rem;
  60431. text-align: left;
  60432. color: #222222;
  60433. font-size: 0.75rem;
  60434. font-weight: 600;
  60435. vertical-align: middle;
  60436. .bullet {
  60437. color: #007AFF;
  60438. font-weight: 700;
  60439. }
  60440. }
  60441. td {
  60442. padding: 0.63rem 1.13rem;
  60443. border-bottom: 0.06rem solid #E0E0E0;
  60444. color: #444;
  60445. font-size: 0.75rem;
  60446. font-weight: 400;
  60447. }
  60448. }
  60449. }
  60450. }
  60451. .view-box {
  60452. margin-top: 1.88rem;
  60453. &:first-of-type {
  60454. margin-top: 0;
  60455. }
  60456. .view-box-top {
  60457. background: #F0F6FD;
  60458. border: 0.06rem solid #DBE7F4;
  60459. min-height: 3.19rem;
  60460. padding: 0 1.56rem;
  60461. display: flex;
  60462. align-items: center;
  60463. h3 {
  60464. color: #333333;
  60465. font-size: 0.88rem;
  60466. font-weight: 600;
  60467. letter-spacing: -0.01rem;
  60468. .bul {
  60469. color: #007AFF;
  60470. }
  60471. .txt1 {
  60472. padding-left: 1.25rem;
  60473. font-size: 0.81rem;
  60474. font-weight: 400;
  60475. }
  60476. }
  60477. .connect-state {
  60478. margin: 0 auto 0 1.56rem;
  60479. }
  60480. .custom-btn.v-btn.v-btn--density-default {
  60481. min-height: 1.81rem;
  60482. height: 1.81rem;
  60483. margin-left: 1.25rem;
  60484. }
  60485. }
  60486. .view-box-btm {
  60487. border: 0.06rem solid #EBEBEB;
  60488. border-top: 0;
  60489. background: #fff;
  60490. padding: 0.56rem 1.56rem;
  60491. .form-style1 {
  60492. padding: 0;
  60493. table {
  60494. th {
  60495. font-weight: 400;
  60496. &:nth-of-type(even) {
  60497. padding-left: 2.5rem;
  60498. }
  60499. }
  60500. td {
  60501. &:nth-of-type(odd) {
  60502. padding-right: 2.5rem;
  60503. }
  60504. .custom-radio {
  60505. padding: 0.56rem 0;
  60506. }
  60507. }
  60508. }
  60509. }
  60510. .no-data {
  60511. height: 9.38rem;
  60512. width: 100%;
  60513. display: flex;
  60514. align-items: center;
  60515. justify-content: center;
  60516. flex-direction: column;
  60517. .ico {
  60518. width: 2.25rem;
  60519. height: 2.25rem;
  60520. background: url("../img/ico_no_data.svg") no-repeat center / 100%;
  60521. margin-bottom: 1.25rem;
  60522. }
  60523. p {
  60524. text-align: center;
  60525. color: #444;
  60526. font-size: 0.88rem;
  60527. letter-spacing: -0.01rem;
  60528. font-weight: 400;
  60529. width: 100%;
  60530. &.txt1 {
  60531. margin-bottom: 2.19rem;
  60532. }
  60533. span {
  60534. color: #000;
  60535. display: block;
  60536. }
  60537. }
  60538. }
  60539. }
  60540. }
  60541. .view-btm-btn {
  60542. display: flex;
  60543. justify-content: space-between;
  60544. margin-top: 1.13rem;
  60545. padding-bottom: 1.19rem;
  60546. >div {
  60547. display: flex;
  60548. gap: 0.94rem;
  60549. }
  60550. .custom-btn.v-btn.v-btn--density-default {
  60551. height: 3.13rem;
  60552. width: 8.13rem;
  60553. &.btn-list {
  60554. background: #fff;
  60555. border: 0.06rem solid #C2C2C2;
  60556. .v-btn__content {
  60557. color: #48525C;
  60558. .ico {
  60559. background-image: url("../img/ico_view_list.svg");
  60560. }
  60561. }
  60562. }
  60563. &.btn-del {
  60564. background: #fff;
  60565. border: 0.06rem solid #FFBCBC;
  60566. .v-btn__content {
  60567. color: #EA5555;
  60568. .ico {
  60569. background-image: url("../img/ico_view_del.svg");
  60570. }
  60571. }
  60572. }
  60573. .v-btn__content {
  60574. font-size: 0.81rem;
  60575. font-weight: 600;
  60576. .ico {
  60577. width: 0.88rem;
  60578. height: 0.88rem;
  60579. margin-right: 2.5rem;
  60580. background: no-repeat center / 100%;
  60581. }
  60582. }
  60583. }
  60584. }
  60585. .list-flex {
  60586. display: flex;
  60587. gap: calc(1vw * (40 / 19.2));
  60588. .list-flex-l {
  60589. max-width: calc(1vw * (350 / 19.2));
  60590. width: calc(1vw * (350 / 19.2));
  60591. height: calc(1vh * (823 / 10.8));
  60592. min-height: 45.6rem;
  60593. border: 0.31rem solid #F7F8F9;
  60594. display: flex;
  60595. flex-direction: column;
  60596. .topology-top {
  60597. background: #F7F8F9;
  60598. min-height: 3.44rem;
  60599. display: flex;
  60600. align-items: center;
  60601. padding: 0.63rem 1.25rem 0.94rem 1.25rem;
  60602. flex-shrink: 0;
  60603. strong {
  60604. color: #333333;
  60605. font-size: 0.81rem;
  60606. font-weight: 700;
  60607. }
  60608. .btn-ne-del {
  60609. font-size: 0;
  60610. margin-left: auto;
  60611. display: flex;
  60612. align-items: center;
  60613. justify-content: center;
  60614. border: 0.05rem solid #FFBEBF;
  60615. width: 1.88rem;
  60616. height: 1.88rem;
  60617. border-radius: 0.5rem;
  60618. &:disabled {
  60619. border-color: #4C576B;
  60620. cursor: default;
  60621. pointer-events: none;
  60622. &:before {
  60623. background-image: url("../img/ico_ne_del_d.svg");
  60624. }
  60625. }
  60626. &:before {
  60627. content: "";
  60628. width: 0.75rem;
  60629. height: 0.75rem;
  60630. background: url("../img/ico_ne_del.svg") no-repeat center / 100%;
  60631. display: inline-block;
  60632. }
  60633. }
  60634. }
  60635. .topology-btm {
  60636. height: 100%;
  60637. max-height: calc(100% - 3.44rem);
  60638. padding: 1.56rem 0.63rem 1.56rem 1.25rem;
  60639. .no-data {
  60640. height: 100%;
  60641. width: 100%;
  60642. display: flex;
  60643. align-items: center;
  60644. justify-content: center;
  60645. flex-direction: column;
  60646. .ico {
  60647. width: 2.25rem;
  60648. height: 2.25rem;
  60649. background: url("../img/ico_no_data.svg") no-repeat center / 100%;
  60650. margin-bottom: 1.25rem;
  60651. }
  60652. p {
  60653. text-align: center;
  60654. color: #444;
  60655. font-size: 0.88rem;
  60656. letter-spacing: -0.01rem;
  60657. font-weight: 400;
  60658. width: 100%;
  60659. &.txt1 {
  60660. margin-bottom: 2.19rem;
  60661. }
  60662. span {
  60663. color: #000;
  60664. display: block;
  60665. }
  60666. }
  60667. }
  60668. }
  60669. }
  60670. .list-flex-r {
  60671. width: 100%;
  60672. max-width: calc(100% - (1vw * (350 / 19.2)));
  60673. }
  60674. }
  60675. .tree-area {
  60676. height: 100%;
  60677. overflow-y: scroll;
  60678. padding-right: 0.44rem;
  60679. .depth-item-tit {
  60680. display: flex;
  60681. align-items: center;
  60682. gap: 0.63rem;
  60683. &.down {
  60684. .arr {
  60685. transform: rotate(180deg);
  60686. }
  60687. }
  60688. .custom-input.v-text-field.mini {
  60689. flex: none;
  60690. min-height: 1.88rem;
  60691. width: calc(100% - 4.63rem);
  60692. .v-input__control {
  60693. height: 1.88rem;
  60694. .v-field__field {
  60695. .v-field__input {
  60696. min-height: 1.88rem;
  60697. height: 1.88rem;
  60698. padding: 0 0.56rem;
  60699. }
  60700. }
  60701. }
  60702. }
  60703. .arr {
  60704. display: flex;
  60705. align-items: center;
  60706. justify-content: center;
  60707. width: 0.75rem;
  60708. height: 0.75rem;
  60709. flex-shrink: 0;
  60710. background: url("../img/ico_tree_arr.svg") no-repeat center / 100%;
  60711. &.nor {
  60712. background: none;
  60713. &:before {
  60714. content: "-";
  60715. display: block;
  60716. font-weight: 600;
  60717. color: #222;
  60718. font-size: 0.75rem;
  60719. }
  60720. }
  60721. }
  60722. .ico {
  60723. width: 1rem;
  60724. height: 1rem;
  60725. flex-shrink: 0;
  60726. background: no-repeat center / 100%;
  60727. }
  60728. .custom-check.v-input {
  60729. .v-input__control {
  60730. display: block;
  60731. .v-selection-control {
  60732. .v-label {
  60733. font-size: 0.75rem;
  60734. margin-left: 0.63rem;
  60735. line-height: 1.06rem;
  60736. white-space: nowrap;
  60737. text-overflow: ellipsis;
  60738. overflow: hidden;
  60739. display: block;
  60740. }
  60741. }
  60742. }
  60743. }
  60744. .btn-tree {
  60745. width: 1rem;
  60746. height: 1rem;
  60747. flex-shrink: 0;
  60748. background: no-repeat center / 100%;
  60749. &.btn-save {
  60750. background-image: url("../img/ico_tree_save.svg");
  60751. }
  60752. }
  60753. }
  60754. .tree-depth1 {
  60755. margin-bottom: 1.25rem;
  60756. &:last-of-type {
  60757. margin-bottom: 0;
  60758. }
  60759. ul {
  60760. display: flex;
  60761. flex-direction: column;
  60762. gap: 0.63rem;
  60763. }
  60764. .depth1-item {
  60765. .depth1-item-tit {
  60766. .ico {
  60767. background-image: url("../img/ico_tree1.svg");
  60768. }
  60769. strong {
  60770. color: #222;
  60771. line-height: 1rem;
  60772. font-weight: 600;
  60773. font-size: 0.75rem;
  60774. text-align: left;
  60775. width: 100%;
  60776. white-space: nowrap;
  60777. text-overflow: ellipsis;
  60778. overflow: hidden;
  60779. }
  60780. .btn-add {
  60781. margin-left: auto;
  60782. font-size: 0;
  60783. background-image: url("../img/ico_tree_add.svg");
  60784. }
  60785. }
  60786. }
  60787. }
  60788. .tree-depth2 {
  60789. padding: 1.25rem 0 0 0.94rem;
  60790. ul {
  60791. display: flex;
  60792. flex-direction: column;
  60793. gap: 0.94rem;
  60794. }
  60795. .depth2-item {
  60796. .depth2-item-tit {
  60797. .ico {
  60798. background-image: url("../img/ico_tree2.svg");
  60799. }
  60800. .btn-ne-add {
  60801. width: 2.19rem;
  60802. height: 1rem;
  60803. display: flex;
  60804. flex-shrink: 0;
  60805. margin-left: auto;
  60806. border-radius: 0.19rem;
  60807. background: #00c2ff;
  60808. color: #fff;
  60809. align-items: center;
  60810. justify-content: center;
  60811. font-size: 0.56rem;
  60812. font-weight: 700;
  60813. line-height: 0.63rem;
  60814. .plus {
  60815. width: 0.56rem;
  60816. height: 0.56rem;
  60817. margin-right: 0.19rem;
  60818. background: url("../img/ico_ne_add.svg") no-repeat center / 100%;
  60819. }
  60820. }
  60821. .btn-pos {
  60822. background-image: url("../img/ico_pos.svg");
  60823. }
  60824. }
  60825. }
  60826. }
  60827. .tree-depth3 {
  60828. padding: 1.25rem 0 0.63rem 22px;
  60829. &:has(ul:empty) {
  60830. padding: 0;
  60831. }
  60832. .depth3-item {
  60833. .depth3-item-tit {
  60834. .ico {
  60835. background-image: url("../img/ico_tree3.svg");
  60836. &.core {
  60837. background-image: url("../img/ico_tree3_core.svg");
  60838. }
  60839. &.ran {
  60840. background-image: url("../img/ico_tree3_ran.svg");
  60841. }
  60842. }
  60843. .btn-mod {
  60844. background-image: url("../img/ico_mod.svg");
  60845. }
  60846. }
  60847. }
  60848. }
  60849. }
  60850. .tbl-col-wrap {
  60851. display: flex;
  60852. margin-bottom: 4rem;
  60853. .tbl-col-fix {
  60854. width: calc(1vw * (340 / 19.2));
  60855. table {
  60856. th {
  60857. border-right: 0.06rem solid #EBEBEB;
  60858. height: 6.12rem;
  60859. }
  60860. td {
  60861. height: 3.06rem;
  60862. background: #FAFAFA;
  60863. color: #222222;
  60864. font-size: 0.75rem;
  60865. font-weight: 600;
  60866. vertical-align: middle;
  60867. text-align: center;
  60868. border-bottom: 0.06rem solid #EBEBEB;
  60869. border-right: 0.06rem solid #EBEBEB;
  60870. }
  60871. }
  60872. }
  60873. .tbl-col-scrl {
  60874. width: calc(100% - (1vw * (340 / 19.2)));
  60875. overflow-x: auto;
  60876. padding-bottom: 0.44rem;
  60877. &::-webkit-scrollbar {
  60878. height: 0.5rem;
  60879. border-radius: 0.5rem;
  60880. }
  60881. &::-webkit-scrollbar-track {
  60882. background: #F8F8F8;
  60883. border-radius: 0.5rem;
  60884. }
  60885. &::-webkit-scrollbar-thumb {
  60886. border-radius: 0.5rem;
  60887. background: #D9D9D9;
  60888. }
  60889. .scrl-in {
  60890. white-space: nowrap;
  60891. .tbl-box {
  60892. display: inline-block;
  60893. vertical-align: top;
  60894. border-right: 0.06rem solid #EBEBEB;
  60895. &:last-of-type {
  60896. border-right: 0;
  60897. }
  60898. }
  60899. }
  60900. }
  60901. table {
  60902. width: 100%;
  60903. border-top: 0.06rem solid #CCCCCC;
  60904. th {
  60905. height: 3.06rem;
  60906. color: #222222;
  60907. font-size: 0.75rem;
  60908. font-weight: 600;
  60909. vertical-align: middle;
  60910. background: #FAFAFA;
  60911. box-shadow: none;
  60912. box-shadow: inset 0 -0.06rem 0 #EBEBEB;
  60913. padding: calc(1vh * (15 / 10.8)) 10px calc(1vh * (14 / 10.8));
  60914. }
  60915. td {
  60916. padding: 0.63rem 0.63rem 0.56rem 0.63rem;
  60917. color: #222222;
  60918. text-align: center;
  60919. font-size: 0.75rem;
  60920. font-weight: 400;
  60921. vertical-align: middle;
  60922. text-align: center;
  60923. height: 3.06rem;
  60924. width: calc(1vw * (138 / 19.2));
  60925. border-bottom: 0.06rem solid #EBEBEB !important;
  60926. }
  60927. }
  60928. }
  60929. .menu-flex-wrap {
  60930. display: flex;
  60931. gap: calc(1vw * (40 / 19.2));
  60932. .system-menu {
  60933. width: calc(1vw * (350 / 19.2));
  60934. border: 0.31rem solid #F7F8F9;
  60935. flex-shrink: 0;
  60936. .system-menu-tit {
  60937. padding: 0 1.56rem;
  60938. background: #F7F8F9;
  60939. color: #333;
  60940. font-weight: 700;
  60941. font-size: 0.81rem;
  60942. height: 3.44rem;
  60943. display: flex;
  60944. align-items: center;
  60945. }
  60946. .system-menu-in {
  60947. overflow-y: scroll;
  60948. height: calc(1vh * (768 / 10.8));
  60949. display: flex;
  60950. margin-top: -0.31rem;
  60951. flex-direction: column;
  60952. padding: 1.88rem 1.56rem;
  60953. gap: 1.25rem;
  60954. .system-box {
  60955. &.on {
  60956. .system-box-sub {
  60957. display: block;
  60958. }
  60959. }
  60960. .system-box-tit {
  60961. display: flex;
  60962. align-items: center;
  60963. gap: 0.94rem;
  60964. font-weight: 600;
  60965. cursor: pointer;
  60966. color: #000;
  60967. font-size: 0.81rem;
  60968. button {
  60969. width: 1.13rem;
  60970. height: 1.13rem;
  60971. background: url("../img/ico_menu_plus.svg") no-repeat center / 100%;
  60972. cursor: pointer;
  60973. &.open {
  60974. background-image: url("../img/ico_menu_minus.svg");
  60975. }
  60976. }
  60977. }
  60978. .system-box-sub {
  60979. padding: 1.25rem 0 1.25rem 1.25rem;
  60980. display: none;
  60981. ul {
  60982. display: flex;
  60983. flex-direction: column;
  60984. gap: 0.94rem;
  60985. li {
  60986. gap: 0.63rem;
  60987. display: flex;
  60988. align-items: center;
  60989. cursor: pointer;
  60990. font-size: 0.75rem;
  60991. font-weight: 400;
  60992. color: #333;
  60993. &.active {
  60994. color: #007AFF;
  60995. }
  60996. &:before {
  60997. width: 0.75rem;
  60998. height: 0.75rem;
  60999. background: url("../img/ico_menu_arr.svg") no-repeat center / 100%;
  61000. content: "";
  61001. }
  61002. }
  61003. }
  61004. }
  61005. }
  61006. }
  61007. }
  61008. .menu-info {
  61009. border: 0.31rem solid #F7F8F9;
  61010. width: 100%;
  61011. .info-tit {
  61012. padding: 0 1.56rem;
  61013. background: #F7F8F9;
  61014. color: #333;
  61015. font-weight: 700;
  61016. font-size: 0.81rem;
  61017. height: 3.44rem;
  61018. display: flex;
  61019. align-items: center;
  61020. }
  61021. .menu-info-view {
  61022. height: calc(1vh * (768 / 10.8));
  61023. padding: 1.88rem 1.56rem 1.56rem 1.56rem;
  61024. margin-top: -0.31rem;
  61025. .info-tbl-tit {
  61026. display: flex;
  61027. align-items: center;
  61028. margin-bottom: 1.56rem;
  61029. .ico {
  61030. width: 1.25rem;
  61031. height: 1.25rem;
  61032. background: url("../img/ico_menu.svg") no-repeat center / 100%;
  61033. margin-right: 0.63rem;
  61034. }
  61035. .menu {
  61036. color: #333;
  61037. font-size: 1rem;
  61038. font-weight: 400;
  61039. letter-spacing: -0.01rem;
  61040. }
  61041. .arr {
  61042. margin: 0 0.31rem;
  61043. width: 0.94rem;
  61044. height: 0.94rem;
  61045. background: url("../img/ico_menu_arr2.svg") no-repeat center / 100%;
  61046. }
  61047. .now {
  61048. color: #111111;
  61049. font-size: 1rem;
  61050. font-weight: 700;
  61051. letter-spacing: -0.01rem;
  61052. }
  61053. }
  61054. .form-style2 {
  61055. table {
  61056. tr {
  61057. th {
  61058. padding: 1.25rem 0 1.25rem 1.88rem;
  61059. }
  61060. td {
  61061. padding: 1.25rem 1.38rem;
  61062. }
  61063. }
  61064. }
  61065. }
  61066. .input-wrap {
  61067. gap: 1.88rem;
  61068. .custom-check {
  61069. flex: none;
  61070. }
  61071. }
  61072. .no-data {
  61073. display: flex;
  61074. align-items: center;
  61075. justify-content: center;
  61076. flex-direction: column;
  61077. height: 100%;
  61078. .ico {
  61079. width: 2.25rem;
  61080. height: 2.25rem;
  61081. background: url("../img/ico_menu_nodata.svg") no-repeat center / 100%;
  61082. }
  61083. p {
  61084. text-align: center;
  61085. margin-top: 1.56rem;
  61086. color: #444;
  61087. font-size: 0.94rem;
  61088. letter-spacing: -0.01rem;
  61089. font-weight: 400;
  61090. }
  61091. }
  61092. }
  61093. .menu-info-r {
  61094. display: flex;
  61095. justify-content: flex-end;
  61096. gap: 0.94rem;
  61097. margin-top: 3.13rem;
  61098. .custom-btn.v-btn.v-btn--density-default {
  61099. height: 3.13rem;
  61100. width: 8.13rem;
  61101. &.btn-list {
  61102. background: #F8F8F8;
  61103. border: 0.06rem solid #E9E9E9;
  61104. .v-btn__content {
  61105. color: #6E7E8F;
  61106. .ico {
  61107. background-image: url("../img/ico_view_list.svg");
  61108. }
  61109. }
  61110. }
  61111. &.btn-del {
  61112. background: #FFF4F4;
  61113. border: 0.06rem solid #FFE2E2;
  61114. .v-btn__content {
  61115. color: #EA5555;
  61116. .ico {
  61117. background-image: url("../img/ico_view_del.svg");
  61118. }
  61119. }
  61120. }
  61121. .v-btn__content {
  61122. font-size: 0.81rem;
  61123. font-weight: 600;
  61124. .ico {
  61125. width: 0.88rem;
  61126. height: 0.88rem;
  61127. margin-right: 2.5rem;
  61128. background: no-repeat center / 100%;
  61129. }
  61130. }
  61131. }
  61132. }
  61133. }
  61134. }
  61135. .perfor-tab {
  61136. width: 7.81rem;
  61137. margin-right: 2.5rem;
  61138. .v-radio-group {
  61139. .v-input__control {
  61140. .v-selection-control-group {
  61141. gap: 1.06rem;
  61142. }
  61143. .v-radio {
  61144. &.v-selection-control--dirty {
  61145. .v-label {
  61146. background: #007AFF;
  61147. }
  61148. }
  61149. .v-selection-control__wrapper {
  61150. display: none;
  61151. }
  61152. .v-label {
  61153. width: 100%;
  61154. height: 2.25rem;
  61155. background: #C5CDD4;
  61156. justify-content: center;
  61157. align-items: center;
  61158. opacity: 1;
  61159. font-size: 0.75rem;
  61160. font-weight: 600;
  61161. color: #fff;
  61162. .ico {
  61163. width: 1.13rem;
  61164. height: 1.13rem;
  61165. margin-right: 0.75rem;
  61166. background: no-repeat center / 100%;
  61167. &.ico1 {
  61168. background-image: url("../img/ico_performance1.svg");
  61169. }
  61170. &.ico2 {
  61171. background-image: url("../img/ico_performance2.svg");
  61172. }
  61173. }
  61174. }
  61175. }
  61176. }
  61177. }
  61178. }
  61179. .chart-total {
  61180. text-align: left;
  61181. margin: 2.5rem 0 1.69rem;
  61182. display: flex;
  61183. p {
  61184. color: #333;
  61185. font-size: 0.88rem;
  61186. font-weight: 600;
  61187. flex-shrink: 0;
  61188. span {
  61189. color: #111;
  61190. font-weight: 700;
  61191. }
  61192. }
  61193. .legend-area {
  61194. display: flex;
  61195. justify-content: flex-end;
  61196. width: 100%;
  61197. gap: 1.88rem;
  61198. margin-left: auto;
  61199. .legend-box {
  61200. display: flex;
  61201. align-items: center;
  61202. gap: 0.75rem;
  61203. font-size: 0.81rem;
  61204. font-weight: 400;
  61205. color: #333;
  61206. .cir {
  61207. width: 0.75rem;
  61208. border-radius: 100%;
  61209. height: 0.75rem;
  61210. &.cir1 {
  61211. background: #007AFF;
  61212. }
  61213. &.cir2 {
  61214. background: #7897B8;
  61215. }
  61216. &.cir3 {
  61217. background: #FF9900;
  61218. }
  61219. }
  61220. }
  61221. }
  61222. }
  61223. .chart-wrap {
  61224. position: relative;
  61225. display: flex;
  61226. overflow: hidden;
  61227. height: 33.13rem;
  61228. border: 0.06rem solid #EBEBEB;
  61229. padding: 1.88rem;
  61230. &:after {
  61231. width: 1.88rem;
  61232. background: #fff;
  61233. top: 0;
  61234. right: 0;
  61235. bottom: 0;
  61236. content: "";
  61237. position: absolute;
  61238. }
  61239. .chart-wrap-fix {
  61240. position: absolute;
  61241. flex-shrink: 0;
  61242. left: 1.88rem;
  61243. top: 1.88rem;
  61244. background: #fff;
  61245. z-index: 0;
  61246. height: 29.38rem;
  61247. canvas {
  61248. height: 100%;
  61249. }
  61250. }
  61251. .scrl-chart {
  61252. overflow-x: scroll;
  61253. padding-bottom: 1.25rem;
  61254. overflow-y: hidden;
  61255. z-index: 1;
  61256. max-width: calc(100vw - 3.75rem);
  61257. margin-left: 1.25rem;
  61258. position: relative;
  61259. height: 29.38rem;
  61260. &::-webkit-scrollbar {
  61261. height: 0.5rem;
  61262. border-radius: 0.5rem;
  61263. }
  61264. &::-webkit-scrollbar-track {
  61265. background: #F8F8F8;
  61266. border-radius: 0.5rem;
  61267. }
  61268. &::-webkit-scrollbar-thumb {
  61269. border-radius: 0.5rem;
  61270. background: #D9D9D9;
  61271. }
  61272. .scrl-in {
  61273. height: 29.38rem;
  61274. }
  61275. canvas {
  61276. height: 100%;
  61277. }
  61278. }
  61279. }
  61280. .help-flex {
  61281. display: flex;
  61282. gap: 30px;
  61283. .help-list {
  61284. width: 300px;
  61285. ul {
  61286. display: flex;
  61287. flex-direction: column;
  61288. gap: 8px;
  61289. li {
  61290. border: 1px solid #ccc;
  61291. padding: 10px;
  61292. font-size: 14px;
  61293. font-weight: 400;
  61294. cursor: pointer;
  61295. &.active {
  61296. background: #ccc;
  61297. color: #fff;
  61298. font-weight: 700;
  61299. }
  61300. }
  61301. }
  61302. }
  61303. .help-cont {
  61304. width: calc(100% - 330px);
  61305. border: 1px solid #ccc;
  61306. .help-cont-tit {
  61307. display: block;
  61308. color: #000;
  61309. font-size: 16px;
  61310. font-weight: 700;
  61311. padding: 15px 24px;
  61312. border-bottom: 1px solid #ccc;
  61313. }
  61314. .help-acco {
  61315. .help-panel {
  61316. border-bottom: 1px solid #ccc;
  61317. &:after {
  61318. display: none;
  61319. }
  61320. &.v-expansion-panel--active {
  61321. .v-expansion-panel-title {
  61322. background: #f4f4f4;
  61323. }
  61324. }
  61325. .v-expansion-panel__shadow {
  61326. display: none;
  61327. }
  61328. .v-expansion-panel-title {
  61329. font-weight: 700;
  61330. color: #000;
  61331. .v-expansion-panel-title__overlay {
  61332. display: none;
  61333. }
  61334. }
  61335. .v-expansion-panel-text {
  61336. border-top: 1px solid #ccc;
  61337. .v-expansion-panel-text__wrapper {
  61338. overflow-y: auto;
  61339. padding: 16px 24px;
  61340. background: #fcfcfc;
  61341. .panel-cont {
  61342. padding: 10px 0;
  61343. height: 100%;
  61344. min-height: 250px;
  61345. max-height: 250px;
  61346. strong {
  61347. display: block;
  61348. text-align: left;
  61349. margin-bottom: 10px;
  61350. font-weight: 600;
  61351. font-size: 16px;
  61352. }
  61353. p {
  61354. text-align: left;
  61355. font-weight: 400;
  61356. font-size: 14px;
  61357. }
  61358. }
  61359. }
  61360. }
  61361. }
  61362. }
  61363. }
  61364. }
  61365. .menu-chk {
  61366. display: flex;
  61367. flex-direction: column;
  61368. gap: 10px;
  61369. }
  61370. .dashboard {
  61371. display: flex;
  61372. .dashboard-l {
  61373. width: 50%;
  61374. border-right: 1px solid rgba(224, 224, 224, 0.5);
  61375. .dashboard-core {
  61376. padding: 24px;
  61377. .core-box-wrap {
  61378. display: flex;
  61379. gap: 3px;
  61380. height: 380px;
  61381. .core-box {
  61382. width: 100%;
  61383. height: 380px;
  61384. background: rgba(51, 51, 51, 0.04);
  61385. display: flex;
  61386. flex-direction: column;
  61387. align-items: center;
  61388. justify-content: center;
  61389. .name {
  61390. display: block;
  61391. text-align: center;
  61392. color: #333333;
  61393. font-size: 40px;
  61394. font-weight: 700;
  61395. line-height: 24px;
  61396. margin-bottom: 15px;
  61397. }
  61398. .state {
  61399. text-align: center;
  61400. display: block;
  61401. font-size: 12px;
  61402. line-height: 24px;
  61403. color: #333;
  61404. font-weight: 400;
  61405. margin-bottom: 19px;
  61406. }
  61407. button {
  61408. width: 100px;
  61409. height: 30px;
  61410. display: flex;
  61411. align-items: center;
  61412. justify-content: center;
  61413. background: rgba(51, 51, 51, 0.35);
  61414. color: #fff;
  61415. font-size: 14px;
  61416. font-weight: 700;
  61417. margin-bottom: 33px;
  61418. }
  61419. .core-percent {
  61420. display: inline-block;
  61421. ul {
  61422. display: flex;
  61423. flex-direction: column;
  61424. gap: 7px;
  61425. li {
  61426. display: flex;
  61427. align-items: center;
  61428. gap: 3px;
  61429. strong {
  61430. width: 60px;
  61431. line-height: 24px;
  61432. color: #333;
  61433. font-size: 14px;
  61434. font-weight: 400;
  61435. text-align: left;
  61436. flex-shrink: 0;
  61437. }
  61438. p {
  61439. flex-shrink: 0;
  61440. width: 60px;
  61441. line-height: 24px;
  61442. color: #333;
  61443. font-size: 14px;
  61444. font-weight: 400;
  61445. text-align: left;
  61446. }
  61447. .cir {
  61448. width: 18px;
  61449. height: 18px;
  61450. border-radius: 100%;
  61451. &.blue {
  61452. background: #1EAEFF;
  61453. }
  61454. &.yellow {
  61455. background: #FFD643;
  61456. }
  61457. &.red {
  61458. background: #FF2426;
  61459. }
  61460. }
  61461. }
  61462. }
  61463. }
  61464. }
  61465. }
  61466. }
  61467. .dashboard-join {
  61468. padding: 24px;
  61469. border-top: 1px solid rgba(224, 224, 224, 0.5);
  61470. }
  61471. }
  61472. .dashboard-r {
  61473. width: 50%;
  61474. }
  61475. .dashboard-tit {
  61476. display: flex;
  61477. align-items: center;
  61478. margin-bottom: 14px;
  61479. strong {
  61480. color: #333;
  61481. font-weight: 700;
  61482. font-size: 18px;
  61483. }
  61484. .issue {
  61485. width: 100px;
  61486. height: 32px;
  61487. background: rgba(51, 51, 51, 0.35);
  61488. color: #fff;
  61489. font-size: 14px;
  61490. font-weight: 700;
  61491. display: flex;
  61492. align-items: center;
  61493. justify-content: center;
  61494. }
  61495. .core-tab {
  61496. margin-left: auto;
  61497. display: flex;
  61498. gap: 4px;
  61499. button {
  61500. width: 100px;
  61501. height: 32px;
  61502. display: flex;
  61503. color: #fff;
  61504. font-size: 14px;
  61505. font-weight: 700;
  61506. align-items: center;
  61507. justify-content: center;
  61508. background: rgba(51, 51, 51, 0.15);
  61509. cursor: pointer;
  61510. &.active {
  61511. background: rgba(51, 51, 51, 0.35);
  61512. }
  61513. }
  61514. }
  61515. .join-type {
  61516. margin-left: auto;
  61517. display: flex;
  61518. gap: 12px;
  61519. align-items: center;
  61520. width: 20px;
  61521. height: 20px;
  61522. background: no-repeat center / 100%;
  61523. button {
  61524. &.type1 {
  61525. background-image: url("");
  61526. &.active {
  61527. background-image: url("");
  61528. }
  61529. }
  61530. &.type2 {
  61531. background-image: url("");
  61532. &.active {
  61533. background-image: url("");
  61534. }
  61535. }
  61536. }
  61537. }
  61538. }
  61539. //.dashboard-r {}
  61540. }
  61541. .tab-style {
  61542. margin-top: 2.81rem;
  61543. .tab-style-h {
  61544. border-bottom: 1px solid #064F9E;
  61545. display: flex;
  61546. button {
  61547. position: relative;
  61548. width: 11.88rem;
  61549. height: 3.69rem;
  61550. border: 0.06rem solid #E1E1E1;
  61551. border-bottom: 0;
  61552. background: #fff;
  61553. display: flex;
  61554. align-items: center;
  61555. justify-content: center;
  61556. color: #888888;
  61557. font-size: 0.81rem;
  61558. font-weight: 400;
  61559. margin-right: -0.06rem;
  61560. &.active {
  61561. border-color: #064F9E;
  61562. margin: 0 0 -0.09rem 0;
  61563. color: #064F9E;
  61564. font-weight: 700;
  61565. height: 3.75rem;
  61566. z-index: 2;
  61567. }
  61568. }
  61569. }
  61570. .tab-style-c {
  61571. padding-top: 1.88rem;
  61572. }
  61573. }
  61574. .pop-radio {
  61575. margin-bottom: 1.56rem;
  61576. }
  61577. .mode-radio {
  61578. padding: 0.94rem 0.75rem;
  61579. .v-selection-control-group {
  61580. align-items: flex-start;
  61581. gap: 5rem;
  61582. .v-radio {
  61583. align-items: flex-start;
  61584. .v-selection-control__wrapper {
  61585. margin-top: 0.63rem;
  61586. }
  61587. .v-label {
  61588. flex-direction: column;
  61589. align-items: flex-start;
  61590. overflow: visible;
  61591. .radio-tit {
  61592. display: flex;
  61593. strong {
  61594. font-weight: 400;
  61595. font-size: 0.75rem;
  61596. display: block;
  61597. line-height: 2.25rem;
  61598. }
  61599. .term {
  61600. display: flex;
  61601. .term-tit {
  61602. color: #333333;
  61603. font-size: 0.75rem;
  61604. font-weight: 400;
  61605. display: flex;
  61606. margin-right: 1.25rem;
  61607. align-items: center;
  61608. &:before {
  61609. width: 0.06rem;
  61610. height: 0.88rem;
  61611. background: #C6C6C6;
  61612. content: "";
  61613. margin: 0 0.94rem;
  61614. }
  61615. }
  61616. }
  61617. }
  61618. .mode-img {
  61619. margin: 1.56rem 0 0 -1.81rem;
  61620. width: 23.25rem;
  61621. height: 13.13rem;
  61622. background: #F4F4F4;
  61623. img {
  61624. width: 100%;
  61625. height: 100%;
  61626. }
  61627. }
  61628. }
  61629. }
  61630. }
  61631. }
  61632. .editor {
  61633. height: 300px;
  61634. .ql-container {
  61635. height: calc(100% - 42px)
  61636. }
  61637. }
  61638. /* --- darkmode ---*/
  61639. body:has(.darkmode) {
  61640. background: #101011;
  61641. }
  61642. .darkmode {
  61643. .custom-btn.v-btn.v-btn--density-default {
  61644. &.btn-white {
  61645. border-color: #272B30;
  61646. background-color: #1B1E20;
  61647. .v-btn__content {
  61648. color: #606770;
  61649. }
  61650. }
  61651. &.btn-gray {
  61652. background: #272B30;
  61653. border-color: #272B30;
  61654. .v-btn__content {
  61655. color: #fff;
  61656. }
  61657. }
  61658. }
  61659. .custom-select.v-input {
  61660. .v-input__control {
  61661. .v-field {
  61662. .v-field__outline {
  61663. border-color: #272B30;
  61664. }
  61665. .v-field__field {
  61666. .v-field__input {
  61667. .v-select__selection {
  61668. color: #fff;
  61669. }
  61670. }
  61671. .v-label {
  61672. color: #fff;
  61673. }
  61674. }
  61675. }
  61676. }
  61677. }
  61678. .custom-input.v-text-field {
  61679. .v-input__control {
  61680. .v-field__field {
  61681. .v-field__input {
  61682. border-color: #272B30;
  61683. background: #1B1E20;
  61684. color: #fff;
  61685. }
  61686. }
  61687. .v-field__append-inner {
  61688. .v-icon {
  61689. &:before {
  61690. color: #fff;
  61691. }
  61692. }
  61693. }
  61694. }
  61695. }
  61696. .custom-table.v-table {
  61697. background: #1A1D1F;
  61698. &:before {
  61699. background: #2C2F31;
  61700. }
  61701. &:after {
  61702. background: #2C2F31;
  61703. }
  61704. .v-table__wrapper {
  61705. table {
  61706. thead {
  61707. tr {
  61708. th {
  61709. background: #272B30 !important;
  61710. border-color: #272B30;
  61711. .th-item {
  61712. .ico-sort-area {
  61713. .v-icon {
  61714. background-color: #272B30;
  61715. }
  61716. }
  61717. }
  61718. }
  61719. }
  61720. }
  61721. tbody {
  61722. tr {
  61723. td {
  61724. color: #fff;
  61725. border-color: #2C2F31 !important;
  61726. }
  61727. }
  61728. }
  61729. }
  61730. }
  61731. }
  61732. .custom-radio.v-input {
  61733. &.picker-terms {
  61734. .v-input__control {
  61735. .v-selection-control-group {
  61736. .v-radio {
  61737. &.v-selection-control--dirty {
  61738. .v-label {
  61739. color: #fff;
  61740. border-color: #272B30;
  61741. background: #272B30;
  61742. }
  61743. }
  61744. .v-label {
  61745. border-color: #272B30;
  61746. background: #1B1E20;
  61747. color: #9F9FA0;
  61748. }
  61749. }
  61750. }
  61751. }
  61752. }
  61753. }
  61754. .calendar-wrap {
  61755. .text {
  61756. color: #fff;
  61757. }
  61758. }
  61759. .calendar {
  61760. .dp__overlay {
  61761. background: #272B30;
  61762. }
  61763. .dp__overlay_container {
  61764. background: #272B30;
  61765. &::-webkit-scrollbar-track {
  61766. background-color: #272B30;
  61767. }
  61768. &::-webkit-scrollbar-thumb {
  61769. background-color: #91949B;
  61770. }
  61771. .dp__overlay_row {
  61772. .dp__overlay_col {
  61773. .dp__overlay_cell {
  61774. color: #fff;
  61775. &:hover {
  61776. background: rgba(16, 16, 17, 0.2);
  61777. }
  61778. }
  61779. }
  61780. }
  61781. }
  61782. .dp__input_wrap {
  61783. .dp__input {
  61784. border-color: #42484F;
  61785. background-color: #272B30;
  61786. color: #fff;
  61787. background-image: url("/assets/img/ico_calendar_w.png");
  61788. }
  61789. }
  61790. .dp__outer_menu_wrap {
  61791. .dp__menu {
  61792. border: 2px solid #42484F;
  61793. background-color: #272B30;
  61794. .dp__arrow_top {
  61795. border-color: #42484F;
  61796. border-width: 2px;
  61797. background-color: #272B30;
  61798. }
  61799. .dp__month_year_row {
  61800. .dp__btn {
  61801. &:hover {
  61802. span {
  61803. background: rgba(16, 16, 17, 0.2);
  61804. }
  61805. }
  61806. }
  61807. .dp__month_year_wrap {
  61808. .dp__btn {
  61809. color: #fff;
  61810. &:hover {
  61811. background: rgba(16, 16, 17, 0.2);
  61812. }
  61813. }
  61814. }
  61815. }
  61816. .dp__calendar {
  61817. .dp__calendar_header {
  61818. .dp__calendar_header_item {
  61819. color: #fff;
  61820. }
  61821. }
  61822. .dp__calendar_row {
  61823. .dp__calendar_item {
  61824. .dp__cell_inner {
  61825. color: #fff;
  61826. &.dp__cell_offset {
  61827. color: #606770;
  61828. }
  61829. &:hover {
  61830. background: rgba(16, 16, 17, 0.2);
  61831. }
  61832. }
  61833. }
  61834. }
  61835. }
  61836. .dp__action_row {
  61837. .dp__action_buttons {
  61838. .dp__action_button {
  61839. &.dp__action_cancel {
  61840. border-color: #606770;
  61841. color: #606770;
  61842. }
  61843. &.dp__action_select {
  61844. background: #42484F;
  61845. color: #fff;
  61846. }
  61847. }
  61848. }
  61849. }
  61850. }
  61851. }
  61852. }
  61853. }
  61854. .list--dell--btn{
  61855. background:#d50000!important;
  61856. color: #fff!important;
  61857. font-size: 13px;
  61858. font-style: normal;
  61859. font-weight: 500;
  61860. line-height: 100%; /* 13px */
  61861. border-radius: 0px!important;
  61862. &.small{
  61863. min-width:30px!important;
  61864. width:30px!important;
  61865. height:30px!important;
  61866. }
  61867. &.mid{
  61868. min-width:40px!important;
  61869. width:40px!important;
  61870. height:36px!important;
  61871. }
  61872. &.type--2{
  61873. font-size:12px!important;
  61874. }
  61875. }
  61876. .v-messages__message {
  61877. padding: 0 0.81rem;
  61878. margin-top: 0.25rem;
  61879. letter-spacing: -0.02rem;
  61880. line-height: 1rem;
  61881. white-space: nowrap;
  61882. font-size: 0.75rem;
  61883. font-weight: 600;
  61884. color: #E50A0A!important;
  61885. transition: none !important;
  61886. }
  61887. .v-input__details{
  61888. padding-left:0px!important;
  61889. }
  61890. .v-field--error:not(.v-field--disabled) .v-field__outline{
  61891. color:#FF8C8C!important;
  61892. border-color:#FF8C8C!important;
  61893. }
  61894. .v-input__details{
  61895. overflow: visible;
  61896. }
  61897. .log--btn{
  61898. cursor: pointer;
  61899. position: absolute;
  61900. right:10px;
  61901. z-index: 9;
  61902. }
  61903. .se-dialog-footer{
  61904. > div{
  61905. display: none!important;
  61906. }
  61907. }
  61908. .se-dialog-tabs{
  61909. display: none!important;
  61910. }
  61911. //** 룰렛 시작
  61912. .container{
  61913. .content{
  61914. .main{
  61915. .inner--headers{
  61916. > h2{
  61917. font-size: 1.5rem;
  61918. font-weight: 700;
  61919. color: #333;
  61920. display: inline-flex;
  61921. gap:10px;
  61922. .event--status{
  61923. font-size:16px;
  61924. font-weight: 700;
  61925. color: #fff;
  61926. background: #007AFF;
  61927. border-radius: 50px;
  61928. padding: 5px 20px;
  61929. line-height: 100%;
  61930. display: inline-flex;
  61931. align-items: center;
  61932. justify-content: center;
  61933. }
  61934. }
  61935. }
  61936. }
  61937. }
  61938. }
  61939. .winner--rank--wrapper{
  61940. border-top:1px solid #000;
  61941. display: flex;
  61942. width:100%;
  61943. flex-wrap:wrap;
  61944. dl{
  61945. display: flex;
  61946. align-items: center;
  61947. width: calc(100% / 4);
  61948. flex-wrap: wrap;
  61949. &:last-child{
  61950. dd{
  61951. border-right: 0;
  61952. }
  61953. }
  61954. dt{
  61955. background-color: #f8f8f8;
  61956. display: flex;
  61957. align-items: center;
  61958. height:50px;
  61959. padding:0 20px;
  61960. border-bottom: 1px solid #e2e2e2;
  61961. border-right: 1px solid #E2E2E2;
  61962. width:40%;
  61963. font-size:16px;
  61964. .rank, .name {
  61965. display: block;
  61966. overflow: hidden;
  61967. white-space: nowrap;
  61968. text-overflow: ellipsis;
  61969. min-width: 0;
  61970. max-width:120px;
  61971. font-size:16px;
  61972. }
  61973. i{
  61974. font-style: normal;
  61975. }
  61976. }
  61977. dd{
  61978. display: flex;
  61979. align-items: center;
  61980. height:50px;
  61981. padding:0 20px;
  61982. border-bottom: 1px solid #e2e2e2;
  61983. border-right: 1px solid #E2E2E2;
  61984. width:60%;
  61985. i{
  61986. font-style: normal;
  61987. }
  61988. }
  61989. }
  61990. }
  61991. .kakao--sms--button{
  61992. display: flex;
  61993. align-items: center;
  61994. justify-content: center;
  61995. padding:5px 10px;
  61996. border-radius: 50px;
  61997. background-color: #000;
  61998. color: #fff!important;
  61999. font-size: 0.75rem;
  62000. font-weight: 600;
  62001. line-height: 1.06rem;
  62002. }
  62003. .gap--10{
  62004. gap: 10px;
  62005. }
  62006. .caution--text{
  62007. font-size:16px;
  62008. color:red;
  62009. font-weight: 700;
  62010. }
  62011. .short--login--wrap{
  62012. border-top: 1px solid #ddd;
  62013. margin-top:55px;
  62014. padding-top:35px;
  62015. position: relative;
  62016. display: flex;
  62017. align-items: center;
  62018. justify-content: center;
  62019. gap:20px;
  62020. &:after{
  62021. content:'간편 로그인';
  62022. display: inline-block;
  62023. padding:5px 10px;
  62024. background: #fff;
  62025. position: absolute;
  62026. top: -13px;
  62027. left: 50%;
  62028. transform: translateX(-50%);
  62029. font-size: 15px;
  62030. font-weight: 700;
  62031. color: #333;
  62032. z-index: 1;
  62033. }
  62034. .v-btn{
  62035. display: flex;
  62036. align-items: center;
  62037. justify-content: center;
  62038. border-radius: 100px;
  62039. padding:0px!important;
  62040. min-width: 70px;
  62041. width:70px;
  62042. height:70px!important;
  62043. box-shadow: none;
  62044. background-size: contain!important;
  62045. &.btn--google{
  62046. background: url(../img/ic_google.svg) no-repeat center;
  62047. }
  62048. &.btn--kakao{
  62049. background: url(../img/ic_kakao.svg) no-repeat center;
  62050. }
  62051. &.btn--naver{
  62052. background: url(../img/ic_naver.svg) no-repeat center;
  62053. }
  62054. }
  62055. }
  62056. .join--btn--wrap{
  62057. margin-top:10px;
  62058. display: flex;
  62059. align-items: center;
  62060. justify-content: center;
  62061. gap:20px;
  62062. .v-btn{
  62063. position: relative;
  62064. &:before{
  62065. content: '';
  62066. display: block;
  62067. width:1px!important;
  62068. height:10px!important;
  62069. border:0px;
  62070. background: #ccc!important;
  62071. position: absolute;
  62072. top: 50%;
  62073. left:calc(100% + 9px);
  62074. transform: translateY(-50%);
  62075. opacity: 1;
  62076. }
  62077. &:last-child{
  62078. &:before{
  62079. display: none;
  62080. }
  62081. }
  62082. &.text--btn{
  62083. border-radius: 0px!important;
  62084. padding:0px!important;
  62085. font-weight: bold;
  62086. width: auto!important;
  62087. box-shadow: none!important;
  62088. *{
  62089. color:#222!important;
  62090. }
  62091. &:hover{
  62092. opacity: .6;
  62093. }
  62094. }
  62095. }
  62096. }
  62097. .join--type{
  62098. padding:20px 0px;
  62099. .v-label{
  62100. font-size:16px!important;
  62101. font-weight: 700;
  62102. color: #333;
  62103. }
  62104. }
  62105. </file>
  62106. <file path="middleware/auth.global.js">
  62107. import { useAuthStore } from '@/stores/auth'
  62108. export default defineNuxtRouteMiddleware(async (to, from) => {
  62109. const { $log } = useNuxtApp()
  62110. // 로그인 없이 접근 가능한 페이지 배열에 '/roulette' 추가
  62111. const tokenPassPages = [
  62112. '/',
  62113. '/roulette',
  62114. '/auth',
  62115. '/vendor'
  62116. ]
  62117. //let accountValue = useAuthStore().getAccountRole.charAt(0).toUpperCase()
  62118. // 1. 로그인 없이 접근 가능한 페이지 예외 허용 (이미 로그인 상태면 메인으로 이동)
  62119. if (tokenPassPages.includes(to.path)) {
  62120. $log.debug('로그인/비로그인 허용 페이지 이동 | ' + to.path)
  62121. const accessToken = useAuthStore().getAccessToken
  62122. if (accessToken && accessToken !== '' && typeof accessToken === 'string' && to.path === '/') {
  62123. return navigateTo('/view/common/item') // 원하는 메인 페이지로
  62124. }
  62125. return
  62126. }
  62127. // 2. 토큰 체크 (모든 페이지)
  62128. if (!tokenPassPages.includes(to.path) && !tokenPassPages.some(path => path !== '/' && to.path.startsWith(path + '/'))) {
  62129. const accessToken = useAuthStore().getAccessToken
  62130. if (!accessToken || accessToken === '' || typeof accessToken !== 'string') {
  62131. $log.error('[ 페이지 접근 불가] 인증되지 않은 사용자입니다.')
  62132. return navigateTo('/')
  62133. }
  62134. }
  62135. // 3. 서비스 모드 체크
  62136. // if (useAuthStore().getServiceMode === 'INACTIVE') {
  62137. // if (accountValue === 'S') {
  62138. // $log.debug('페이지 이동 | ' + to.path)
  62139. // } else {
  62140. // return navigateTo('/')
  62141. // }
  62142. // }else {
  62143. // $log.debug('페이지 이동 | ' + to.path)
  62144. // }
  62145. })
  62146. </file>
  62147. <file path="pages/view/vendor/dashboard/influencer-requests.vue">
  62148. <template>
  62149. <div>
  62150. <div class="inner--headers">
  62151. <h2>{{ pageId }}</h2>
  62152. <div class="bread--crumbs--wrap">
  62153. <span>홈</span>
  62154. <span>벤더 대시보드</span>
  62155. <span>{{ pageId }}</span>
  62156. </div>
  62157. </div>
  62158. <!-- 통계 카드 -->
  62159. <div class="stats--cards--wrap">
  62160. <div class="stats--card">
  62161. <div class="stats--icon pending">
  62162. <v-icon>mdi-clock-outline</v-icon>
  62163. </div>
  62164. <div class="stats--content">
  62165. <h3>{{ stats.pending || 0 }}</h3>
  62166. <p>대기 중인 승인요청</p>
  62167. </div>
  62168. </div>
  62169. <div class="stats--card">
  62170. <div class="stats--icon approved">
  62171. <v-icon>mdi-check-circle</v-icon>
  62172. </div>
  62173. <div class="stats--content">
  62174. <h3>{{ stats.approved || 0 }}</h3>
  62175. <p>승인 완료</p>
  62176. </div>
  62177. </div>
  62178. <div class="stats--card">
  62179. <div class="stats--icon rejected">
  62180. <v-icon>mdi-close-circle</v-icon>
  62181. </div>
  62182. <div class="stats--content">
  62183. <h3>{{ stats.rejected || 0 }}</h3>
  62184. <p>거부</p>
  62185. </div>
  62186. </div>
  62187. <div class="stats--card">
  62188. <div class="stats--icon total">
  62189. <v-icon>mdi-account-group</v-icon>
  62190. </div>
  62191. <div class="stats--content">
  62192. <h3>{{ stats.total || 0 }}</h3>
  62193. <p>총 요청 수</p>
  62194. </div>
  62195. </div>
  62196. </div>
  62197. <!-- 필터 및 검색 -->
  62198. <div class="search--modules type2">
  62199. <div class="search--inner">
  62200. <div class="form--cont--filter">
  62201. <v-select
  62202. v-model="searchFilter.status"
  62203. :items="statusOptions"
  62204. variant="outlined"
  62205. class="custom-select"
  62206. label="상태"
  62207. clearable
  62208. >
  62209. </v-select>
  62210. </div>
  62211. <div class="form--cont--filter">
  62212. <v-select
  62213. v-model="searchFilter.category"
  62214. :items="categoryOptions"
  62215. variant="outlined"
  62216. class="custom-select"
  62217. label="인플루언서 카테고리"
  62218. clearable
  62219. >
  62220. </v-select>
  62221. </div>
  62222. <div class="form--cont--text">
  62223. <v-text-field
  62224. v-model="searchFilter.keyword"
  62225. class="custom-input mini"
  62226. style="width: 100%"
  62227. placeholder="인플루언서명을 입력하세요"
  62228. @keyup.enter="handleSearch"
  62229. ></v-text-field>
  62230. </div>
  62231. </div>
  62232. <v-btn
  62233. class="custom-btn btn-blue mini sch--btn"
  62234. @click="handleSearch"
  62235. :loading="loading"
  62236. >
  62237. 검색
  62238. </v-btn>
  62239. </div>
  62240. <!-- 인플루언서 승인 요청 목록 -->
  62241. <div class="data--list--wrap">
  62242. <div class="btn--actions--wrap">
  62243. <div class="left--sections">
  62244. <span class="result-count">
  62245. 총 {{ pagination.totalCount || 0 }}개의 승인요청
  62246. </span>
  62247. </div>
  62248. <div class="right--sections">
  62249. <v-select
  62250. v-model="sortOption"
  62251. :items="sortOptions"
  62252. variant="outlined"
  62253. class="custom-select mini"
  62254. @update:model-value="handleSort"
  62255. >
  62256. </v-select>
  62257. </div>
  62258. </div>
  62259. <!-- 로딩 상태 -->
  62260. <div v-if="loading" class="loading-wrap">
  62261. <v-progress-circular indeterminate color="primary"></v-progress-circular>
  62262. <p>승인요청을 불러오고 있습니다...</p>
  62263. </div>
  62264. <!-- 에러 상태 -->
  62265. <div v-else-if="error" class="error-wrap">
  62266. <v-alert type="error" dismissible @click:close="error = null">
  62267. {{ error }}
  62268. </v-alert>
  62269. </div>
  62270. <!-- 승인요청 리스트 -->
  62271. <div v-else-if="requests && requests.length > 0" class="requests--list--wrap">
  62272. <div class="requests--grid">
  62273. <div
  62274. v-for="request in requests"
  62275. :key="request.SEQ"
  62276. class="request--card"
  62277. :class="getRequestStatusClass(request.CURRENT_STATUS)"
  62278. >
  62279. <!-- 카드 헤더 -->
  62280. <div class="request--card--header">
  62281. <div class="influencer--info">
  62282. <div class="influencer--avatar">
  62283. <v-img
  62284. v-if="request.influencerAvatar"
  62285. :src="request.influencerAvatar"
  62286. :alt="request.influencerNickname + ' 프로필'"
  62287. width="50"
  62288. height="50"
  62289. ></v-img>
  62290. <div v-else class="no-avatar">
  62291. {{ request.influencerNickname?.charAt(0) || "U" }}
  62292. </div>
  62293. </div>
  62294. <div class="influencer--details">
  62295. <div class="influencer--header">
  62296. <h4>{{ request.influencerNickname || request.influencerName }}</h4>
  62297. <p class="influencer--category">
  62298. {{ getCategoryText(request.influencerCategory) }}
  62299. </p>
  62300. </div>
  62301. <div class="influencer--contact">
  62302. <p v-if="request.influencerEmail" class="contact--item">
  62303. <v-icon size="small">mdi-email</v-icon>
  62304. {{ request.influencerEmail }}
  62305. </p>
  62306. <p v-if="request.influencerPhone" class="contact--item">
  62307. <v-icon size="small">mdi-phone</v-icon>
  62308. {{ request.influencerPhone }}
  62309. </p>
  62310. <p v-if="request.influencerRegion" class="contact--item">
  62311. <v-icon size="small">mdi-map-marker</v-icon>
  62312. {{ request.influencerRegion }}
  62313. </p>
  62314. </div>
  62315. <div class="influencer--meta">
  62316. <span v-if="request.followerCount" class="meta--item">
  62317. <v-icon size="small">mdi-account-group</v-icon>
  62318. {{ formatNumber(request.followerCount) }} 팔로워
  62319. </span>
  62320. <span v-if="request.avgViews" class="meta--item">
  62321. <v-icon size="small">mdi-eye</v-icon>
  62322. 평균 {{ formatNumber(request.avgViews) }} 조회
  62323. </span>
  62324. <span v-if="request.engagementRate" class="meta--item">
  62325. <v-icon size="small">mdi-chart-line</v-icon>
  62326. 참여율 {{ request.engagementRate }}%
  62327. </span>
  62328. </div>
  62329. <div
  62330. v-if="request.influencerDescription"
  62331. class="influencer--description"
  62332. >
  62333. <p>{{ request.influencerDescription }}</p>
  62334. </div>
  62335. <div v-if="request.influencerSnsChannels" class="influencer--sns">
  62336. <div
  62337. v-for="(channel, index) in parseSnsChannels(
  62338. request.influencerSnsChannels
  62339. )"
  62340. :key="index"
  62341. class="sns--item"
  62342. >
  62343. <v-icon size="small">{{ getSnsIcon(channel.platform) }}</v-icon>
  62344. {{ channel.handle }}
  62345. </div>
  62346. </div>
  62347. </div>
  62348. </div>
  62349. <div class="request--status">
  62350. <div class="status--badges">
  62351. <v-chip :color="getStatusColor(request.CURRENT_STATUS)" size="small">
  62352. {{ getStatusText(request.CURRENT_STATUS) }}
  62353. </v-chip>
  62354. <v-chip
  62355. v-if="request.ADD_INFO1 === 'REAPPLY'"
  62356. color="orange"
  62357. size="small"
  62358. class="ml-2"
  62359. >
  62360. 재승인요청
  62361. </v-chip>
  62362. </div>
  62363. <p class="request--date">{{ formatDate(request.REQUEST_DATE) }}</p>
  62364. </div>
  62365. </div>
  62366. <!-- 카드 바디 -->
  62367. <div class="request--card--body">
  62368. <!-- 재승인 요청 안내 -->
  62369. <div v-if="request.ADD_INFO1 === 'REAPPLY'" class="reapply--notice">
  62370. <v-alert
  62371. type="info"
  62372. variant="tonal"
  62373. density="compact"
  62374. class="mb-4"
  62375. >
  62376. <v-icon size="16">mdi-refresh</v-icon>
  62377. <span class="ml-2">
  62378. 이전에 파트너십을 맺었던 인플루언서의 재승인 요청입니다.
  62379. <br>이전 파트너십 종료일: {{ formatDate(request.ADD_INFO3) }}
  62380. </span>
  62381. </v-alert>
  62382. </div>
  62383. <div v-if="request.REQUEST_MESSAGE" class="request--message">
  62384. <h5>{{ request.ADD_INFO1 === 'REAPPLY' ? '재승인 요청 메시지' : '요청 메시지' }}</h5>
  62385. <p>"{{ request.REQUEST_MESSAGE }}"</p>
  62386. </div>
  62387. <div class="request--commission">
  62388. <h5>수수료 조건</h5>
  62389. <p>{{ request.COMMISSION_RATE || 0 }}%</p>
  62390. </div>
  62391. <div v-if="request.SPECIAL_CONDITIONS" class="request--conditions">
  62392. <h5>특별 조건</h5>
  62393. <p>"{{ request.SPECIAL_CONDITIONS }}"</p>
  62394. </div>
  62395. </div>
  62396. <div class="request--card--footer">
  62397. <div class="card--actions">
  62398. <v-btn
  62399. class="custom-btn mini btn-outline"
  62400. @click="viewInfluencerDetail(request.INFLUENCER_SEQ)"
  62401. >
  62402. 프로필 보기
  62403. </v-btn>
  62404. <div v-if="request.CURRENT_STATUS === 'PENDING'" class="approval--actions">
  62405. <v-btn
  62406. class="custom-btn mini btn-red"
  62407. @click="handleReject(request)"
  62408. :loading="processing"
  62409. >
  62410. 거부
  62411. </v-btn>
  62412. <v-btn
  62413. class="custom-btn mini btn-blue"
  62414. @click="handleApprove(request)"
  62415. :loading="processing"
  62416. >
  62417. {{ request.ADD_INFO1 === 'REAPPLY' ? '재승인' : '승인' }}
  62418. </v-btn>
  62419. </div>
  62420. <div v-else-if="request.CURRENT_STATUS === 'APPROVED'" class="approved--actions">
  62421. <v-btn
  62422. class="custom-btn mini btn-outline"
  62423. @click="viewRequestHistory(request.SEQ)"
  62424. >
  62425. 이력보기
  62426. </v-btn>
  62427. <v-btn
  62428. class="custom-btn mini btn-terminate"
  62429. @click="handleTerminate(request)"
  62430. :loading="processing"
  62431. >
  62432. <v-icon left size="small">mdi-link-off</v-icon>
  62433. 해지
  62434. </v-btn>
  62435. </div>
  62436. <div
  62437. v-else-if="request.CURRENT_STATUS === 'TERMINATED'"
  62438. class="terminated--actions"
  62439. >
  62440. <v-btn
  62441. class="custom-btn mini btn-outline"
  62442. @click="viewRequestHistory(request.SEQ)"
  62443. >
  62444. 이력보기
  62445. </v-btn>
  62446. </div>
  62447. <v-btn
  62448. v-else
  62449. class="custom-btn mini btn-outline"
  62450. @click="viewRequestHistory(request.SEQ)"
  62451. >
  62452. 이력보기
  62453. </v-btn>
  62454. </div>
  62455. </div>
  62456. </div>
  62457. </div>
  62458. <!-- 페이지네이션 -->
  62459. <div class="pagination-wrap" v-if="pagination.totalPages > 1">
  62460. <v-pagination
  62461. v-model="currentPage"
  62462. :length="pagination.totalPages"
  62463. :total-visible="7"
  62464. @update:model-value="handlePageChange"
  62465. ></v-pagination>
  62466. </div>
  62467. </div>
  62468. <!-- 검색 결과 없음 -->
  62469. <div v-else class="no-data-wrap">
  62470. <div class="no-data">
  62471. <v-icon size="64" color="grey-lighten-1">mdi-account-search</v-icon>
  62472. <h3>승인요청이 없습니다</h3>
  62473. <p>아직 인플루언서로부터 승인요청이 없습니다</p>
  62474. </div>
  62475. </div>
  62476. </div>
  62477. <!-- 승인 확인 모달 -->
  62478. <v-dialog v-model="approveModal.show" max-width="500px">
  62479. <v-card>
  62480. <v-card-title class="text-h5 text-success">
  62481. <v-icon left>mdi-check-circle</v-icon>
  62482. 승인 확인
  62483. </v-card-title>
  62484. <v-card-text>
  62485. <div class="approve--content">
  62486. <div class="influencer--summary">
  62487. <div class="influencer--avatar--small">
  62488. <v-img
  62489. v-if="approveModal.request?.influencerAvatar"
  62490. :src="approveModal.request.influencerAvatar"
  62491. width="40"
  62492. height="40"
  62493. ></v-img>
  62494. <div v-else class="no-avatar--small">
  62495. {{ approveModal.request?.influencerNickname?.charAt(0) || "U" }}
  62496. </div>
  62497. </div>
  62498. <div>
  62499. <h4>{{ approveModal.request?.influencerNickname }}</h4>
  62500. <p>{{ getCategoryText(approveModal.request?.influencerCategory) }}</p>
  62501. </div>
  62502. </div>
  62503. <p>이 인플루언서의 승인요청을 승인하시겠습니까?</p>
  62504. <v-textarea
  62505. v-model="approveModal.approveMessage"
  62506. label="승인 메시지 (선택사항)"
  62507. placeholder="인플루언서에게 전달할 메시지를 입력해주세요..."
  62508. rows="3"
  62509. counter="300"
  62510. maxlength="300"
  62511. class="mt-4"
  62512. ></v-textarea>
  62513. </div>
  62514. </v-card-text>
  62515. <v-card-actions>
  62516. <v-spacer></v-spacer>
  62517. <v-btn color="grey" variant="text" @click="closeApproveModal">취소</v-btn>
  62518. <v-btn color="success" @click="confirmApprove" :loading="processing">
  62519. 승인하기
  62520. </v-btn>
  62521. </v-card-actions>
  62522. </v-card>
  62523. </v-dialog>
  62524. <!-- 거부 확인 모달 -->
  62525. <v-dialog v-model="rejectModal.show" max-width="500px">
  62526. <v-card>
  62527. <v-card-title class="text-h5 text-error">
  62528. <v-icon left>mdi-close-circle</v-icon>
  62529. 거부 확인
  62530. </v-card-title>
  62531. <v-card-text>
  62532. <div class="reject--content">
  62533. <div class="influencer--summary">
  62534. <div class="influencer--avatar--small">
  62535. <v-img
  62536. v-if="rejectModal.request?.influencerAvatar"
  62537. :src="rejectModal.request.influencerAvatar"
  62538. width="40"
  62539. height="40"
  62540. ></v-img>
  62541. <div v-else class="no-avatar--small">
  62542. {{ rejectModal.request?.influencerNickname?.charAt(0) || "U" }}
  62543. </div>
  62544. </div>
  62545. <div>
  62546. <h4>{{ rejectModal.request?.influencerNickname }}</h4>
  62547. <p>{{ getCategoryText(rejectModal.request?.influencerCategory) }}</p>
  62548. </div>
  62549. </div>
  62550. <p>이 인플루언서의 승인요청을 거부하시겠습니까?</p>
  62551. <v-textarea
  62552. v-model="rejectModal.rejectReason"
  62553. label="거부 사유"
  62554. placeholder="거부 사유를 입력해주세요..."
  62555. rows="4"
  62556. counter="500"
  62557. maxlength="500"
  62558. class="mt-4"
  62559. required
  62560. ></v-textarea>
  62561. </div>
  62562. </v-card-text>
  62563. <v-card-actions>
  62564. <v-spacer></v-spacer>
  62565. <v-btn color="grey" variant="text" @click="closeRejectModal">취소</v-btn>
  62566. <v-btn color="error" @click="confirmReject" :loading="processing">
  62567. 거부하기
  62568. </v-btn>
  62569. </v-card-actions>
  62570. </v-card>
  62571. </v-dialog>
  62572. <!-- 해지 확인 모달 -->
  62573. <v-dialog v-model="terminateModal.show" max-width="500px">
  62574. <v-card>
  62575. <v-card-title class="text-h5 text-warning">
  62576. <v-icon left>mdi-link-off</v-icon>
  62577. 파트너십 해지 확인
  62578. </v-card-title>
  62579. <v-card-text>
  62580. <div class="terminate--content">
  62581. <div class="influencer--summary">
  62582. <div class="influencer--avatar--small">
  62583. <v-img
  62584. v-if="terminateModal.request?.influencerAvatar"
  62585. :src="terminateModal.request.influencerAvatar"
  62586. width="40"
  62587. height="40"
  62588. ></v-img>
  62589. <div v-else class="no-avatar--small">
  62590. {{ terminateModal.request?.influencerNickname?.charAt(0) || "U" }}
  62591. </div>
  62592. </div>
  62593. <div>
  62594. <h4>{{ terminateModal.request?.influencerNickname }}</h4>
  62595. <p>{{ getCategoryText(terminateModal.request?.influencerCategory) }}</p>
  62596. </div>
  62597. </div>
  62598. <v-alert type="warning" class="mb-4">
  62599. <strong>주의:</strong> 파트너십을 해지하면 협업 관계가 종료되며, 이 작업은
  62600. 되돌릴 수 없습니다.
  62601. </v-alert>
  62602. <p>이 인플루언서와의 파트너십을 해지하시겠습니까?</p>
  62603. <v-textarea
  62604. v-model="terminateModal.terminateReason"
  62605. label="해지 사유"
  62606. placeholder="해지 사유를 입력해주세요..."
  62607. rows="4"
  62608. counter="500"
  62609. maxlength="500"
  62610. class="mt-4"
  62611. required
  62612. ></v-textarea>
  62613. </div>
  62614. </v-card-text>
  62615. <v-card-actions>
  62616. <v-spacer></v-spacer>
  62617. <v-btn color="grey" variant="text" @click="closeTerminateModal">취소</v-btn>
  62618. <v-btn
  62619. class="btn-terminate-confirm"
  62620. @click="confirmTerminate"
  62621. :loading="processing"
  62622. >
  62623. <v-icon left>mdi-link-off</v-icon>
  62624. 해지하기
  62625. </v-btn>
  62626. </v-card-actions>
  62627. </v-card>
  62628. </v-dialog>
  62629. </div>
  62630. </template>
  62631. <script setup>
  62632. import { ref, onMounted, computed } from "vue";
  62633. import { useRouter } from "vue-router";
  62634. /************************************************************************
  62635. | 레이아웃
  62636. ************************************************************************/
  62637. definePageMeta({
  62638. layout: "default",
  62639. });
  62640. /************************************************************************
  62641. | 스토어 & 라우터
  62642. ************************************************************************/
  62643. const router = useRouter();
  62644. const { $toast } = useNuxtApp();
  62645. /************************************************************************
  62646. | 반응형 데이터
  62647. ************************************************************************/
  62648. const pageId = ref("인플루언서 승인요청 관리");
  62649. const loading = ref(false);
  62650. const processing = ref(false);
  62651. const error = ref(null);
  62652. const currentPage = ref(1);
  62653. // 검색 필터
  62654. const searchFilter = ref({
  62655. keyword: "",
  62656. status: "",
  62657. category: "",
  62658. });
  62659. // 정렬 옵션
  62660. const sortOption = ref("latest");
  62661. const sortOptions = ref([
  62662. { title: "최신순", value: "latest" },
  62663. { title: "오래된순", value: "oldest" },
  62664. { title: "마감임박순", value: "expiring" },
  62665. ]);
  62666. // 상태 옵션
  62667. const statusOptions = ref([
  62668. { title: "전체", value: "" },
  62669. { title: "대기중", value: "PENDING" },
  62670. { title: "승인완료", value: "APPROVED" },
  62671. { title: "거부됨", value: "REJECTED" },
  62672. { title: "해지됨", value: "TERMINATED" },
  62673. ]);
  62674. // 카테고리 옵션
  62675. const categoryOptions = ref([
  62676. { title: "전체", value: "" },
  62677. { title: "패션·뷰티", value: "FASHION_BEAUTY" },
  62678. { title: "식품·건강", value: "FOOD_HEALTH" },
  62679. { title: "라이프스타일", value: "LIFESTYLE" },
  62680. { title: "테크·가전", value: "TECH_ELECTRONICS" },
  62681. { title: "스포츠·레저", value: "SPORTS_LEISURE" },
  62682. { title: "문화·엔터테인먼트", value: "CULTURE_ENTERTAINMENT" },
  62683. ]);
  62684. // 데이터
  62685. const requests = ref([]);
  62686. const stats = ref({
  62687. pending: 0,
  62688. approved: 0,
  62689. rejected: 0,
  62690. total: 0,
  62691. });
  62692. const pagination = ref({
  62693. currentPage: 1,
  62694. totalPages: 1,
  62695. totalCount: 0,
  62696. pageSize: 12,
  62697. });
  62698. // 승인 모달
  62699. const approveModal = ref({
  62700. show: false,
  62701. request: null,
  62702. approveMessage: "",
  62703. });
  62704. // 거부 모달
  62705. const rejectModal = ref({
  62706. show: false,
  62707. request: null,
  62708. rejectReason: "",
  62709. });
  62710. // 해지 모달
  62711. const terminateModal = ref({
  62712. show: false,
  62713. request: null,
  62714. terminateReason: "",
  62715. });
  62716. /************************************************************************
  62717. | computed
  62718. ************************************************************************/
  62719. const currentUser = computed(() => {
  62720. try {
  62721. const authStore = localStorage.getItem("authStore");
  62722. if (!authStore) {
  62723. console.warn("⚠️ authStore가 localStorage에 없습니다");
  62724. return {};
  62725. }
  62726. const parsedStore = JSON.parse(authStore);
  62727. const authData = parsedStore?.auth || {};
  62728. console.log("🔍 localStorage authStore:", parsedStore);
  62729. console.log("🔍 currentUser (벤더 대시보드):", authData);
  62730. // seq 필드가 없으면 다른 가능한 필드들 시도
  62731. if (!authData.seq) {
  62732. authData.seq = authData.SEQ || authData.id || authData.user_seq || authData.userSeq;
  62733. console.log("🔧 seq 필드 보정:", authData.seq);
  62734. }
  62735. return authData;
  62736. } catch (error) {
  62737. console.error("❌ authStore 파싱 오류:", error);
  62738. return {};
  62739. }
  62740. });
  62741. /************************************************************************
  62742. | 메서드
  62743. ************************************************************************/
  62744. const handleSearch = async () => {
  62745. currentPage.value = 1;
  62746. await loadRequests();
  62747. };
  62748. const handlePageChange = async (page) => {
  62749. currentPage.value = page;
  62750. await loadRequests();
  62751. };
  62752. const handleSort = async () => {
  62753. currentPage.value = 1;
  62754. await loadRequests();
  62755. };
  62756. const loadRequests = async () => {
  62757. try {
  62758. loading.value = true;
  62759. error.value = null;
  62760. const params = {
  62761. vendorSeq: currentUser.value.seq,
  62762. keyword: searchFilter.value.keyword,
  62763. status: searchFilter.value.status,
  62764. category: searchFilter.value.category,
  62765. sortBy: sortOption.value,
  62766. page: currentPage.value,
  62767. size: pagination.value.pageSize,
  62768. };
  62769. console.log("🔍 loadRequests 호출됨:", params);
  62770. useAxios()
  62771. .post("/api/vendor-influencer/requests", params)
  62772. .then((res) => {
  62773. console.log("📥 API 응답:", res.data);
  62774. if (res.data.success) {
  62775. const items = res.data.data.items || []; // 빈 배열로 기본값 설정
  62776. console.log("📋 받아온 요청 목록:", items.length, items);
  62777. // SEQ 중복 확인
  62778. if (items.length > 0) {
  62779. const seqs = items.map((item) => item.SEQ);
  62780. const uniqueSeqs = [...new Set(seqs)];
  62781. if (seqs.length !== uniqueSeqs.length) {
  62782. console.warn("⚠️ 중복된 SEQ 발견:", seqs);
  62783. }
  62784. }
  62785. requests.value = items;
  62786. pagination.value = {
  62787. totalCount: res.data.data.total || 0,
  62788. currentPage: res.data.data.page || 1,
  62789. totalPages: res.data.data.totalPages || 1,
  62790. pageSize: res.data.data.size || 20
  62791. };
  62792. stats.value = res.data.data.stats || {
  62793. pending: 0,
  62794. approved: 0,
  62795. rejected: 0,
  62796. total: 0
  62797. };
  62798. } else {
  62799. error.value =
  62800. res.data.message || "승인요청 목록을 불러오는 중 오류가 발생했습니다.";
  62801. }
  62802. })
  62803. .catch((err) => {
  62804. error.value = err.message || "승인요청 목록을 불러오는 중 오류가 발생했습니다.";
  62805. })
  62806. .finally(() => {
  62807. loading.value = false;
  62808. });
  62809. } catch (err) {
  62810. error.value = err.message || "승인요청 목록을 불러오는 중 오류가 발생했습니다.";
  62811. loading.value = false;
  62812. }
  62813. };
  62814. const handleApprove = (request) => {
  62815. approveModal.value = {
  62816. show: true,
  62817. request: request,
  62818. approveMessage: "",
  62819. };
  62820. };
  62821. const closeApproveModal = () => {
  62822. approveModal.value = {
  62823. show: false,
  62824. request: null,
  62825. approveMessage: "",
  62826. };
  62827. };
  62828. const confirmApprove = async () => {
  62829. try {
  62830. processing.value = true;
  62831. const params = {
  62832. mappingSeq: approveModal.value.request.SEQ,
  62833. action: "APPROVE",
  62834. processedBy: currentUser.value.seq,
  62835. responseMessage: approveModal.value.approveMessage,
  62836. };
  62837. console.log("🔍 현재 사용자 정보:", currentUser.value);
  62838. console.log("🔍 processedBy 값:", currentUser.value.seq);
  62839. console.log("✅ 승인 처리 시작:", params);
  62840. useAxios()
  62841. .post("/api/vendor-influencer/approve", params)
  62842. .then((res) => {
  62843. console.log("📥 승인 처리 응답:", res.data);
  62844. if (res.data.success) {
  62845. $toast.success("승인요청이 승인되었습니다.");
  62846. closeApproveModal();
  62847. console.log("🔄 승인 후 목록 새로고침");
  62848. loadRequests();
  62849. } else {
  62850. console.error("❌ 승인 처리 실패:", res.data);
  62851. $toast.error(res.data.message || "승인 처리 중 오류가 발생했습니다.");
  62852. }
  62853. })
  62854. .catch((err) => {
  62855. $toast.error(err.message || "승인 처리 중 오류가 발생했습니다.");
  62856. })
  62857. .finally(() => {
  62858. processing.value = false;
  62859. });
  62860. } catch (err) {
  62861. $toast.error(err.message || "승인 처리 중 오류가 발생했습니다.");
  62862. processing.value = false;
  62863. }
  62864. };
  62865. const handleReject = (request) => {
  62866. rejectModal.value = {
  62867. show: true,
  62868. request: request,
  62869. rejectReason: "",
  62870. };
  62871. };
  62872. const closeRejectModal = () => {
  62873. rejectModal.value = {
  62874. show: false,
  62875. request: null,
  62876. rejectReason: "",
  62877. };
  62878. };
  62879. const confirmReject = async () => {
  62880. if (!rejectModal.value.rejectReason.trim()) {
  62881. $toast.error("거부 사유를 입력해주세요.");
  62882. return;
  62883. }
  62884. try {
  62885. processing.value = true;
  62886. const params = {
  62887. mappingSeq: rejectModal.value.request.SEQ,
  62888. action: "REJECT",
  62889. processedBy: currentUser.value.seq,
  62890. responseMessage: rejectModal.value.rejectReason,
  62891. };
  62892. useAxios()
  62893. .post("/api/vendor-influencer/approve", params)
  62894. .then((res) => {
  62895. if (res.data.success) {
  62896. $toast.success("승인요청이 거부되었습니다.");
  62897. closeRejectModal();
  62898. loadRequests();
  62899. } else {
  62900. $toast.error(res.data.message || "거부 처리 중 오류가 발생했습니다.");
  62901. }
  62902. })
  62903. .catch((err) => {
  62904. $toast.error(err.message || "거부 처리 중 오류가 발생했습니다.");
  62905. })
  62906. .finally(() => {
  62907. processing.value = false;
  62908. });
  62909. } catch (err) {
  62910. $toast.error(err.message || "거부 처리 중 오류가 발생했습니다.");
  62911. processing.value = false;
  62912. }
  62913. };
  62914. const viewInfluencerDetail = (influencerSeq) => {
  62915. router.push(`/view/influencer/${influencerSeq}`);
  62916. };
  62917. const viewRequestHistory = (requestSeq) => {
  62918. router.push(`/view/vendor/request-history/${requestSeq}`);
  62919. };
  62920. /**
  62921. * 파트너십 해지
  62922. */
  62923. const handleTerminate = (request) => {
  62924. terminateModal.value = {
  62925. show: true,
  62926. request: request,
  62927. terminateReason: "",
  62928. };
  62929. };
  62930. const closeTerminateModal = () => {
  62931. terminateModal.value = {
  62932. show: false,
  62933. request: null,
  62934. terminateReason: "",
  62935. };
  62936. };
  62937. const confirmTerminate = async () => {
  62938. if (!terminateModal.value.terminateReason.trim()) {
  62939. $toast.error("해지 사유를 입력해주세요.");
  62940. return;
  62941. }
  62942. try {
  62943. processing.value = true;
  62944. const params = {
  62945. mappingSeq: terminateModal.value.request.SEQ,
  62946. terminateReason: terminateModal.value.terminateReason,
  62947. terminatedBy: currentUser.value.seq,
  62948. };
  62949. console.log("🔗 파트너십 해지 처리 시작:", params);
  62950. useAxios()
  62951. .post("/api/vendor-influencer/terminate", params)
  62952. .then((res) => {
  62953. console.log("📥 해지 처리 응답:", res.data);
  62954. if (res.data.success) {
  62955. $toast.success("파트너십이 해지되었습니다.");
  62956. closeTerminateModal();
  62957. console.log("🔄 해지 후 목록 새로고침");
  62958. loadRequests();
  62959. } else {
  62960. console.error("❌ 해지 처리 실패:", res.data);
  62961. $toast.error(res.data.message || "해지 처리 중 오류가 발생했습니다.");
  62962. }
  62963. })
  62964. .catch((err) => {
  62965. $toast.error(err.message || "해지 처리 중 오류가 발생했습니다.");
  62966. })
  62967. .finally(() => {
  62968. processing.value = false;
  62969. });
  62970. } catch (err) {
  62971. $toast.error(err.message || "해지 처리 중 오류가 발생했습니다.");
  62972. processing.value = false;
  62973. }
  62974. };
  62975. // 유틸리티 함수들
  62976. const getCategoryText = (category) => {
  62977. const categoryMap = {
  62978. FASHION_BEAUTY: "패션·뷰티",
  62979. FOOD_HEALTH: "식품·건강",
  62980. LIFESTYLE: "라이프스타일",
  62981. TECH_ELECTRONICS: "테크·가전",
  62982. SPORTS_LEISURE: "스포츠·레저",
  62983. CULTURE_ENTERTAINMENT: "문화·엔터테인먼트",
  62984. };
  62985. return categoryMap[category] || category || "기타";
  62986. };
  62987. const getStatusText = (status) => {
  62988. const statusMap = {
  62989. PENDING: "대기중",
  62990. APPROVED: "승인완료",
  62991. REJECTED: "거절됨",
  62992. TERMINATED: "해지됨",
  62993. EXPIRED: "만료됨",
  62994. };
  62995. return statusMap[status] || status || "알 수 없음";
  62996. };
  62997. const getStatusColor = (status) => {
  62998. const colorMap = {
  62999. PENDING: "orange",
  63000. APPROVED: "success",
  63001. REJECTED: "error",
  63002. TERMINATED: "warning",
  63003. EXPIRED: "grey",
  63004. };
  63005. return colorMap[status] || "grey";
  63006. };
  63007. const getRequestStatusClass = (status) => {
  63008. return `request-status-${status?.toLowerCase() || "unknown"}`;
  63009. };
  63010. const formatDate = (dateString) => {
  63011. return new Date(dateString).toLocaleDateString("ko-KR");
  63012. };
  63013. const formatNumber = (num) => {
  63014. if (!num) return "0";
  63015. if (num >= 1000000) return (num / 1000000).toFixed(1) + "M";
  63016. if (num >= 1000) return (num / 1000).toFixed(1) + "K";
  63017. return num.toString();
  63018. };
  63019. const parseSnsChannels = (snsChannels) => {
  63020. try {
  63021. return JSON.parse(snsChannels);
  63022. } catch (e) {
  63023. return [];
  63024. }
  63025. };
  63026. const getSnsIcon = (platform) => {
  63027. const iconMap = {
  63028. instagram: "mdi-instagram",
  63029. youtube: "mdi-youtube",
  63030. tiktok: "mdi-music-note",
  63031. blog: "mdi-post",
  63032. facebook: "mdi-facebook",
  63033. twitter: "mdi-twitter",
  63034. };
  63035. return iconMap[platform.toLowerCase()] || "mdi-link";
  63036. };
  63037. /************************************************************************
  63038. | 라이프사이클
  63039. ************************************************************************/
  63040. onMounted(async () => {
  63041. console.log("🚀 influencer-requests 컴포넌트 마운트됨");
  63042. await loadRequests();
  63043. });
  63044. </script>
  63045. <style scoped>
  63046. .stats--cards--wrap {
  63047. display: grid;
  63048. grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  63049. gap: 20px;
  63050. margin-bottom: 30px;
  63051. }
  63052. .stats--card {
  63053. background: white;
  63054. border-radius: 12px;
  63055. padding: 20px;
  63056. display: flex;
  63057. align-items: center;
  63058. gap: 16px;
  63059. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  63060. }
  63061. .stats--icon {
  63062. width: 50px;
  63063. height: 50px;
  63064. border-radius: 10px;
  63065. display: flex;
  63066. align-items: center;
  63067. justify-content: center;
  63068. color: white;
  63069. }
  63070. .stats--icon.pending {
  63071. background: #ff9800;
  63072. }
  63073. .stats--icon.approved {
  63074. background: #4caf50;
  63075. }
  63076. .stats--icon.rejected {
  63077. background: #f44336;
  63078. }
  63079. .stats--icon.total {
  63080. background: #2196f3;
  63081. }
  63082. .stats--content h3 {
  63083. margin: 0;
  63084. font-size: 24px;
  63085. font-weight: 700;
  63086. color: #333;
  63087. }
  63088. .stats--content p {
  63089. margin: 0;
  63090. font-size: 14px;
  63091. color: #666;
  63092. }
  63093. .requests--list--wrap {
  63094. margin-top: 20px;
  63095. }
  63096. .requests--grid {
  63097. display: grid;
  63098. grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
  63099. gap: 20px;
  63100. margin-bottom: 20px;
  63101. }
  63102. .request--card {
  63103. background: white;
  63104. border-radius: 12px;
  63105. padding: 20px;
  63106. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  63107. transition: transform 0.2s, box-shadow 0.2s;
  63108. border-left: 4px solid #e0e0e0;
  63109. }
  63110. .request--card:hover {
  63111. transform: translateY(-2px);
  63112. box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
  63113. }
  63114. .request--card.request-status-pending {
  63115. border-left-color: #ff9800;
  63116. }
  63117. .request--card.request-status-approved {
  63118. border-left-color: #4caf50;
  63119. }
  63120. .request--card.request-status-rejected {
  63121. border-left-color: #f44336;
  63122. }
  63123. .request--card.request-status-terminated {
  63124. border-left-color: #ff9800;
  63125. }
  63126. .request--card--header {
  63127. display: flex;
  63128. justify-content: space-between;
  63129. align-items: flex-start;
  63130. margin-bottom: 16px;
  63131. }
  63132. .influencer--info {
  63133. display: flex;
  63134. gap: 12px;
  63135. flex: 1;
  63136. }
  63137. .influencer--avatar {
  63138. width: 50px;
  63139. height: 50px;
  63140. border-radius: 50%;
  63141. overflow: hidden;
  63142. flex-shrink: 0;
  63143. display: flex;
  63144. align-items: center;
  63145. justify-content: center;
  63146. background: #f5f5f5;
  63147. }
  63148. .no-avatar {
  63149. font-size: 20px;
  63150. font-weight: bold;
  63151. color: #666;
  63152. }
  63153. .influencer--details h4 {
  63154. margin: 0 0 4px 0;
  63155. font-size: 16px;
  63156. font-weight: 600;
  63157. }
  63158. .influencer--category {
  63159. color: #666;
  63160. font-size: 14px;
  63161. margin: 0 0 8px 0;
  63162. }
  63163. .influencer--meta {
  63164. display: flex;
  63165. flex-direction: column;
  63166. gap: 2px;
  63167. }
  63168. .influencer--meta span {
  63169. font-size: 12px;
  63170. color: #888;
  63171. }
  63172. .request--status {
  63173. text-align: right;
  63174. flex-shrink: 0;
  63175. }
  63176. .request--date {
  63177. margin: 8px 0 0;
  63178. font-size: 12px;
  63179. color: #999;
  63180. }
  63181. .request--card--body {
  63182. margin-bottom: 16px;
  63183. }
  63184. .request--message,
  63185. .request--conditions {
  63186. margin-bottom: 12px;
  63187. }
  63188. .request--message h5,
  63189. .request--conditions h5 {
  63190. margin: 0 0 8px 0;
  63191. font-size: 14px;
  63192. font-weight: 600;
  63193. color: #333;
  63194. }
  63195. .request--message p {
  63196. margin: 0;
  63197. font-size: 14px;
  63198. color: #666;
  63199. font-style: italic;
  63200. }
  63201. .condition--item {
  63202. display: flex;
  63203. gap: 8px;
  63204. margin-bottom: 4px;
  63205. }
  63206. .condition--label {
  63207. font-size: 13px;
  63208. color: #666;
  63209. min-width: 80px;
  63210. }
  63211. .condition--value {
  63212. font-size: 13px;
  63213. color: #333;
  63214. font-weight: 500;
  63215. }
  63216. .expire--info {
  63217. display: flex;
  63218. align-items: center;
  63219. gap: 6px;
  63220. font-size: 12px;
  63221. color: #ff9800;
  63222. background: #fff8e1;
  63223. padding: 6px 10px;
  63224. border-radius: 6px;
  63225. }
  63226. .request--card--footer {
  63227. border-top: 1px solid #f0f0f0;
  63228. padding-top: 16px;
  63229. }
  63230. .card--actions {
  63231. display: flex;
  63232. justify-content: space-between;
  63233. align-items: center;
  63234. }
  63235. .approval--actions,
  63236. .approved--actions,
  63237. .terminated--actions {
  63238. display: flex;
  63239. gap: 8px;
  63240. }
  63241. .loading-wrap,
  63242. .error-wrap,
  63243. .no-data-wrap {
  63244. display: flex;
  63245. flex-direction: column;
  63246. align-items: center;
  63247. justify-content: center;
  63248. padding: 60px 20px;
  63249. }
  63250. .no-data {
  63251. text-align: center;
  63252. }
  63253. .no-data h3 {
  63254. margin: 16px 0 8px;
  63255. color: #666;
  63256. }
  63257. .no-data p {
  63258. color: #999;
  63259. }
  63260. .pagination-wrap {
  63261. display: flex;
  63262. justify-content: center;
  63263. margin-top: 20px;
  63264. }
  63265. .approve--content,
  63266. .reject--content,
  63267. .terminate--content {
  63268. padding: 8px 0;
  63269. }
  63270. .influencer--summary {
  63271. display: flex;
  63272. align-items: center;
  63273. gap: 12px;
  63274. padding: 12px;
  63275. background: #f8f9fa;
  63276. border-radius: 8px;
  63277. margin-bottom: 16px;
  63278. }
  63279. .influencer--avatar--small {
  63280. width: 40px;
  63281. height: 40px;
  63282. border-radius: 50%;
  63283. overflow: hidden;
  63284. flex-shrink: 0;
  63285. display: flex;
  63286. align-items: center;
  63287. justify-content: center;
  63288. background: #f5f5f5;
  63289. }
  63290. .no-avatar--small {
  63291. font-size: 16px;
  63292. font-weight: bold;
  63293. color: #666;
  63294. }
  63295. .result-count {
  63296. font-size: 14px;
  63297. color: #666;
  63298. font-weight: 500;
  63299. }
  63300. .influencer--contact {
  63301. margin: 4px 0;
  63302. }
  63303. .contact--item {
  63304. display: flex;
  63305. align-items: center;
  63306. gap: 6px;
  63307. font-size: 13px;
  63308. color: #666;
  63309. margin: 2px 0;
  63310. }
  63311. .contact--item .v-icon {
  63312. color: #999;
  63313. }
  63314. .influencer--header {
  63315. margin-bottom: 8px;
  63316. }
  63317. .influencer--contact {
  63318. margin: 8px 0;
  63319. padding: 8px;
  63320. background: #f8f9fa;
  63321. border-radius: 6px;
  63322. }
  63323. .contact--item {
  63324. display: flex;
  63325. align-items: center;
  63326. gap: 6px;
  63327. font-size: 13px;
  63328. color: #666;
  63329. margin: 4px 0;
  63330. }
  63331. .influencer--meta {
  63332. display: flex;
  63333. flex-wrap: wrap;
  63334. gap: 12px;
  63335. margin: 8px 0;
  63336. }
  63337. .meta--item {
  63338. display: flex;
  63339. align-items: center;
  63340. gap: 4px;
  63341. font-size: 13px;
  63342. color: #555;
  63343. background: #f0f0f0;
  63344. padding: 4px 8px;
  63345. border-radius: 4px;
  63346. }
  63347. .influencer--description {
  63348. margin: 8px 0;
  63349. font-size: 13px;
  63350. color: #666;
  63351. line-height: 1.4;
  63352. }
  63353. .influencer--sns {
  63354. display: flex;
  63355. flex-wrap: wrap;
  63356. gap: 8px;
  63357. margin-top: 8px;
  63358. }
  63359. .sns--item {
  63360. display: flex;
  63361. align-items: center;
  63362. gap: 4px;
  63363. font-size: 12px;
  63364. color: #555;
  63365. background: #eef2ff;
  63366. padding: 4px 8px;
  63367. border-radius: 4px;
  63368. }
  63369. /* 해지 버튼 전용 스타일 */
  63370. .btn-terminate {
  63371. background: linear-gradient(135deg, #e53e3e 0%, #c53030 100%);
  63372. color: white;
  63373. border: none;
  63374. font-weight: 700;
  63375. min-width: 100px;
  63376. padding: 8px 16px;
  63377. box-shadow: 0 4px 12px rgba(229, 62, 62, 0.3);
  63378. transition: all 0.3s ease;
  63379. }
  63380. .btn-terminate:hover {
  63381. transform: translateY(-2px);
  63382. box-shadow: 0 6px 20px rgba(229, 62, 62, 0.4);
  63383. background: linear-gradient(135deg, #c53030 0%, #9b2c2c 100%);
  63384. }
  63385. .btn-terminate:active {
  63386. transform: translateY(0);
  63387. }
  63388. .btn-terminate:disabled {
  63389. background: #e2e8f0;
  63390. color: #a0aec0;
  63391. box-shadow: none;
  63392. transform: none !important;
  63393. }
  63394. .btn-green {
  63395. background: linear-gradient(135deg, #38a169 0%, #2f855a 100%);
  63396. color: white;
  63397. border: none;
  63398. font-weight: 600;
  63399. min-width: 140px;
  63400. padding: 8px 16px;
  63401. box-shadow: 0 4px 12px rgba(56, 161, 105, 0.3);
  63402. transition: all 0.3s ease;
  63403. }
  63404. .btn-green:hover {
  63405. transform: translateY(-2px);
  63406. box-shadow: 0 6px 20px rgba(56, 161, 105, 0.4);
  63407. background: linear-gradient(135deg, #2f855a 0%, #276749 100%);
  63408. }
  63409. .btn-green:active {
  63410. transform: translateY(0);
  63411. }
  63412. .btn-green:disabled {
  63413. background: #e6fffa;
  63414. color: #38a169;
  63415. border: 1px solid #38a169;
  63416. box-shadow: none;
  63417. transform: none !important;
  63418. opacity: 0.7;
  63419. }
  63420. /* 해지 확인 모달 버튼 스타일 */
  63421. .btn-terminate-confirm {
  63422. background: linear-gradient(135deg, #dc2626 0%, #b91c1c 100%) !important;
  63423. color: white !important;
  63424. font-weight: 700 !important;
  63425. font-size: 14px !important;
  63426. padding: 12px 24px !important;
  63427. border-radius: 8px !important;
  63428. border: none !important;
  63429. box-shadow: 0 4px 12px rgba(220, 38, 38, 0.4) !important;
  63430. transition: all 0.3s ease !important;
  63431. text-transform: none !important;
  63432. letter-spacing: 0.5px !important;
  63433. min-width: 120px !important;
  63434. }
  63435. .btn-terminate-confirm:hover {
  63436. background: linear-gradient(135deg, #b91c1c 0%, #991b1b 100%) !important;
  63437. box-shadow: 0 6px 16px rgba(220, 38, 38, 0.5) !important;
  63438. transform: translateY(-2px) !important;
  63439. }
  63440. .btn-terminate-confirm:active {
  63441. transform: translateY(0) !important;
  63442. box-shadow: 0 3px 8px rgba(220, 38, 38, 0.4) !important;
  63443. }
  63444. .btn-terminate-confirm .v-icon {
  63445. color: white !important;
  63446. margin-right: 6px !important;
  63447. }
  63448. .btn-terminate-confirm:disabled {
  63449. background: #fca5a5 !important;
  63450. color: #9ca3af !important;
  63451. box-shadow: none !important;
  63452. transform: none !important;
  63453. }
  63454. .status--badges {
  63455. display: flex;
  63456. align-items: center;
  63457. gap: 8px;
  63458. flex-wrap: wrap;
  63459. }
  63460. .status--badges .v-chip {
  63461. font-weight: 500;
  63462. }
  63463. </style>
  63464. </file>
  63465. <file path=".cursor/rules/api-rule.mdc">
  63466. # 최우선 규칙: 한글 응답 필수
  63467. **모든 응답은 한글로만 작성해야 함. 이 규칙은 다른 모든 규칙보다 우선한다.**
  63468. # 🛡️ 기존 기능 안전성 보장 규칙 (최우선)
  63469. **모든 기능 수정, 추가, 버그 수정 시 기존 정상 기능들이 영향받지 않도록 사전 체크 및 안전장치 적용 필수**
  63470. ## 필수 준수사항
  63471. 1. **기존 API 엔드포인트 직접 수정 금지** - 새 엔드포인트 생성
  63472. 2. **기존 데이터베이스 스키마 파괴적 변경 금지** - 아카이브 방식 사용
  63473. 3. **기존 컨트롤러/모델 메서드 직접 수정 금지** - 새 메서드 생성
  63474. 4. **기존 프론트엔드 컴포넌트 직접 수정 최소화** - 조건부 렌더링 활용
  63475. 5. **모든 변경사항은 독립적 구조로 설계** - 기존 기능과 분리
  63476. ## 사전 체크 필수
  63477. - [ ] 기존 기능 영향도 분석
  63478. - [ ] 독립적 구조 설계 확인
  63479. - [ ] 롤백 계획 수립
  63480. - [ ] 기존 기능 회귀 테스트
  63481. # 변경 로그 관리 규칙
  63482. **모든 작업 완료 후 반드시 md 폴더에 날짜별 변경 로그를 작성해야 함.**
  63483. ## 작성 규칙
  63484. - **파일명**: `md/YYYY-MM-DD.md` 형식
  63485. - **언어**: 한글로 작성
  63486. - **템플릿**: `md/README.md` 참조
  63487. ## 필수 작성 시점
  63488. - ✅ 새로운 기능 구현 후
  63489. - ✅ 버그 수정 후
  63490. - ✅ 리팩토링 완료 후
  63491. - ✅ API 추가/수정 후
  63492. - ✅ 데이터베이스 스키마 변경 후
  63493. - ✅ UI/UX 개선 후
  63494. ## 작성 내용
  63495. - 🎯 주요 변경사항 요약
  63496. - 📝 변경된 파일 목록과 상세 내용
  63497. - 🧪 테스트 확인 결과
  63498. - 📌 다음 작업 예정사항
  63499. # companyId 사용 금지 규칙
  63500. **companyId는 사용하지 않는 값이므로 모든 코드에서 제거해야 함. 프론트엔드, 백엔드 모두 해당.**
  63501. - 대신 COMPANY_NUMBER를 직접 사용
  63502. - companyId 관련 변수, 필드, 파라미터 모두 제거
  63503. - API 요청/응답에서 companyId 사용 금지
  63504. # 벤더-인플루언서 처리자 SEQ 인증 규칙
  63505. **백엔드에서 processedBy, approvedBy, terminatedBy 등 처리자 SEQ를 받을 때는 반드시 다음 로직을 적용해야 함:**
  63506. ## 처리자 SEQ 변환 표준 로직
  63507. ```php
  63508. // 처리자 확인 (벤더사 SEQ인지 사용자 SEQ인지 확인)
  63509. $processingUser = null;
  63510. // 1. 먼저 USER_LIST에서 확인 (인플루언서)
  63511. $processingUser = $this->userModel
  63512. ->where('SEQ', $processedBy)
  63513. ->where('IS_ACT', 'Y')
  63514. ->first();
  63515. if ($processingUser) {
  63516. // 사용자 SEQ인 경우 (인플루언서) - 바로 사용
  63517. $approvedByUserSeq = $processedBy;
  63518. } else {
  63519. // 2. VENDOR_LIST에서 확인 (벤더사)
  63520. $vendorInfo = $this->vendorModel
  63521. ->where('SEQ', $processedBy)
  63522. ->where('IS_ACT', 'Y')
  63523. ->first();
  63524. if ($vendorInfo) {
  63525. // 벤더사 SEQ인 경우 - 벤더사가 직접 처리하는 것으로 간주
  63526. $approvedByUserSeq = $processedBy;
  63527. // 응답용 정보 설정 (필요시)
  63528. $processingUser = [
  63529. 'SEQ' => $vendorInfo['SEQ'],
  63530. 'NICK_NAME' => $vendorInfo['COMPANY_NAME'] . ' (벤더사)',
  63531. 'NAME' => $vendorInfo['COMPANY_NAME']
  63532. ];
  63533. } else {
  63534. return $this->response->setStatusCode(400)->setJSON([
  63535. 'success' => false,
  63536. 'message' => "처리자 SEQ {$processedBy}는 USER_LIST나 VENDOR_LIST에서 찾을 수 없습니다."
  63537. ]);
  63538. }
  63539. }
  63540. // 최종적으로 $approvedByUserSeq를 데이터베이스에 저장
  63541. ```
  63542. ## 규칙 적용 필수 상황
  63543. - **승인/거부 처리**: approveRequest() 함수
  63544. - **해지 처리**: terminate() 함수
  63545. - **취소 처리**: cancelRequest() 함수
  63546. - **기타 모든 사용자 인증이 필요한 벤더-인플루언서 관련 API**
  63547. ## 이유
  63548. - **인플루언서**: USER_LIST 테이블에서 개인 계정으로 관리
  63549. - **벤더사**: VENDOR_LIST 테이블에서 회사 계정으로 관리
  63550. - 두 시스템을 구분하여 처리하되, 데이터베이스 저장 시에는 해당 SEQ를 그대로 사용
  63551. - USER_LIST에는 COMPANY_NUMBER 컬럼이 불필요함 (인플루언서는 개인이므로)
  63552. # API & Store Rules
  63553. ## Pinia Store Rules
  63554. ### 1. Setup Syntax Store Reset 구현
  63555. - Setup 문법(`defineStore(() => {...})`)으로 작성된 store는 자동 `$reset()`이 제공되지 않음
  63556. - 반드시 수동으로 `reset()` 함수를 구현해야 함
  63557. ```typescript
  63558. // Good
  63559. export const useMyStore = defineStore('myStore', () => {
  63560. const data = ref([])
  63561. const loading = ref(false)
  63562. // 수동으로 reset 함수 구현
  63563. function reset() {
  63564. data.value = []
  63565. loading.value = false
  63566. }
  63567. return {
  63568. data,
  63569. loading,
  63570. reset // reset 함수 반환 필수
  63571. }
  63572. })
  63573. // Bad - reset 함수 없음
  63574. export const useMyStore = defineStore('myStore', () => {
  63575. const data = ref([])
  63576. return { data }
  63577. })
  63578. ```
  63579. ### 2. Reset 함수 구현 가이드
  63580. - 모든 state를 초기값으로 되돌리는 로직 포함
  63581. - 중첩된 객체의 경우 깊은 복사 고려
  63582. - persist 옵션이 있는 경우 저장소 데이터도 정리
  63583. ```typescript
  63584. function reset() {
  63585. // 단순 값 초기화
  63586. simpleValue.value = null
  63587. // 객체 초기화
  63588. objectValue.value = {
  63589. prop1: '',
  63590. prop2: 0
  63591. }
  63592. // 배열 초기화
  63593. arrayValue.value = []
  63594. // 중첩 객체 초기화
  63595. complexValue.value = JSON.parse(JSON.stringify(DEFAULT_STATE))
  63596. }
  63597. ```
  63598. ### 3. Store 초기화 호출 방식
  63599. - Setup 문법 store: `store.reset()`
  63600. - Options 문법 store: `store.$reset()`
  63601. ```typescript
  63602. // Setup store
  63603. const setupStore = useSetupStore()
  63604. setupStore.reset() // O
  63605. setupStore.$reset() // X - 에러 발생
  63606. // Options store
  63607. const optionsStore = useOptionsStore()
  63608. optionsStore.$reset() // O
  63609. ```
  63610. ### 4. Store 초기화 시점
  63611. - 로그아웃
  63612. - 사용자 전환
  63613. - 주요 상태 변경
  63614. - 에러 복구
  63615. ```typescript
  63616. async function logout() {
  63617. // 모든 store 초기화
  63618. authStore.setLogout()
  63619. setupStore.reset() // Setup syntax
  63620. optionsStore.$reset() // Options syntax
  63621. // 로컬 스토리지 정리
  63622. localStorage.clear()
  63623. }
  63624. ```
  63625. ## API Rules
  63626. - api 서버는 코드이그나이터4 베이스의 벡엔드 기술로 구현되어있으며
  63627. 기존 문서에사용되는 양식을 지키며 구현
  63628. - 프론트에서 api신규 생성시 백엔드 코드이그나4 기반의 기술로 구현하는 예제를 함께 제공
  63629. - 항상 페이지 구성이 완료되고 나면 제작에 필요한 쿼리를 DDL형태로 구성해서 ddl폴더에 만들어줘
  63630. - api구성후 백엔드 예제를 backend-examples에 코드이그나이터4 형태로 구성해줘
  63631. - MD파일을 생성해서 백엔드 구성과 DB생성을 하는 과정을 순서대로 작성해줘
  63632. - 프론트화면 및 UI / API 구성시에는 항상 composition api 형태로 작성 css는 항상 scss형태로 분리해서 구성
  63633. ## 프론트엔드 API 호출 규칙
  63634. - **Nuxt.js server/api 사용 금지**: 프론트엔드에서 직접 백엔드 API 호출
  63635. - **useAxios() 패턴 강제**: 기존 코드베이스와 일관성 유지
  63636. - 반드시 다음 형태로 구성:
  63637. ```javascript
  63638. const loadData = async () => {
  63639. try {
  63640. const params = {
  63641. // 파라미터들...
  63642. }
  63643. useAxios()
  63644. .post('/api/endpoint', params)
  63645. .then((res) => {
  63646. if (res.data.success) {
  63647. // 성공 처리
  63648. data.value = res.data.data
  63649. } else {
  63650. // 실패 처리
  63651. error.value = res.data.message
  63652. }
  63653. })
  63654. .catch((err) => {
  63655. // 에러 처리
  63656. error.value = err.message
  63657. })
  63658. .finally(() => {
  63659. // 완료 처리
  63660. loading.value = false
  63661. })
  63662. } catch (err) {
  63663. error.value = err.message
  63664. }
  63665. }
  63666. ```
  63667. ## API 구조 금지사항
  63668. - **server/api 디렉토리 생성 금지**: Nuxt.js 서버 API 사용하지 않음
  63669. - **mysql2, 데이터베이스 라이브러리 사용 금지**: 프론트엔드에서 직접 DB 연결 금지
  63670. - **$fetch 사용 금지**: useAxios() 패턴만 사용
  63671. - **async/await 패턴 지양**: .then().catch().finally() 체인 사용
  63672. ## 백엔드 연동 방식
  63673. - 프론트엔드 → CodeIgniter4 백엔드 직접 호출
  63674. - useAxios()를 통한 HTTP 통신만 사용
  63675. - 응답 형태: `res.data.success`, `res.data.data`, `res.data.message`
  63676. - 백엔드는 직접 만들거야 다만 너가 backend-examples 폴더에 프론트와 수신할수는있는 형태의 api예제를 만들어
  63677. - useAxios()를 통한 HTTP 통신만 사용
  63678. - 응답 형태: `res.data.success`, `res.data.data`, `res.data.message`
  63679. - 백엔드는 직접 만들거야 다만 너가 backend-examples 폴더에 프론트와 수신할수는있는 형태의 api예제를 만들어
  63680. - useAxios()를 통한 HTTP 통신만 사용
  63681. - 응답 형태: `res.data.success`, `res.data.data`, `res.data.message`
  63682. - 백엔드는 직접 만들거야 다만 너가 backend-examples 폴더에 프론트와 수신할수는있는 형태의 api예제를 만들어
  63683. - useAxios()를 통한 HTTP 통신만 사용
  63684. - 응답 형태: `res.data.success`, `res.data.data`, `res.data.message`
  63685. - 백엔드는 직접 만들거야 다만 너가 backend-examples 폴더에 프론트와 수신할수는있는 형태의 api예제를 만들어
  63686. </file>
  63687. <file path="components/common/header.vue">
  63688. <template>
  63689. <header class="new--header">
  63690. <div class="pro--wrap">
  63691. <div class="pro--img"></div>
  63692. <div class="pro--id" @click="proOn ? (proOn = false) : (proOn = true)">
  63693. {{ useStoreAuth.getSnsTempData?.user?.NICK_NAME || "사용자" }}
  63694. <i class="ico" :class="[proOn ? 'on' : '']">></i>
  63695. <div class="id--box" v-show="proOn">
  63696. <button type="button" class="btn-profile" @click="myPage(userId)">
  63697. 마이페이지
  63698. </button>
  63699. <!--
  63700. <button type="button" class="btn-profile" @click="withdrawal">회원탈퇴</button>
  63701. -->
  63702. <button type="button" class="btn-logout" @click="fnLoguOut">로그아웃</button>
  63703. </div>
  63704. </div>
  63705. <div class="pro--info inf">{{ memberTypeText }}</div>
  63706. </div>
  63707. <nav class="gnb">
  63708. <ul class="depth1">
  63709. <li v-for="(menu, index) in arrMenuInfo" :key="index">
  63710. <button
  63711. @click="menuAction(menu.menuId, menu.menuName, menu.linkType)"
  63712. :class="{ actv: menu.linkType === $route.path }"
  63713. >
  63714. {{ menu.menuName }}
  63715. </button>
  63716. </li>
  63717. </ul>
  63718. </nav>
  63719. </header>
  63720. </template>
  63721. <script setup>
  63722. /************************************************************************
  63723. | 전역
  63724. ************************************************************************/
  63725. const { $log } = useNuxtApp();
  63726. const proOn = ref(false);
  63727. const pageId = "header";
  63728. const arrMenuInfo = ref([]); // 메뉴정보
  63729. const useStore = useDetailStore();
  63730. const useStoreAuth = useAuthStore();
  63731. const userName = ref("");
  63732. const userCompanyName = ref("");
  63733. const userId = ref("");
  63734. const memberTypeText = ref("사용자");
  63735. const route = useRoute();
  63736. const router = useRouter();
  63737. /************************************************************************
  63738. | 함수 : 세팅
  63739. ************************************************************************/
  63740. const fnSetMenu = () => {
  63741. let info = [];
  63742. arrMenuInfo.value = [];
  63743. // 사용자 타입 확인 (memberType으로 구분)
  63744. const snsUser = useStoreAuth.getSnsTempData?.user;
  63745. const authUser = JSON.parse(localStorage.getItem("authStore"))?.auth;
  63746. const currentUser = snsUser || authUser;
  63747. let memberType = currentUser?.memberType || currentUser?.MEMBER_TYPE;
  63748. // memberType이 없으면 URL로 판단
  63749. if (!memberType) {
  63750. const currentPath = route.path;
  63751. const companyNumber = currentUser?.COMPANY_NUMBER;
  63752. // 벤더 대시보드 경로이거나 COMPANY_NUMBER가 있으면 벤더사로 판단
  63753. if (currentPath.includes("/vendor/dashboard") || companyNumber) {
  63754. memberType = "VENDOR";
  63755. } else {
  63756. memberType = "INFLUENCER";
  63757. }
  63758. }
  63759. console.log("=== 헤더 메뉴 디버깅 ===");
  63760. console.log("SNS 사용자:", snsUser);
  63761. console.log("Auth 사용자:", authUser);
  63762. console.log("현재 사용자:", currentUser);
  63763. console.log("원본 memberType:", currentUser?.memberType);
  63764. console.log("원본 MEMBER_TYPE:", currentUser?.MEMBER_TYPE);
  63765. console.log("최종 memberType:", memberType);
  63766. console.log("현재 경로:", route.path);
  63767. console.log("COMPANY_NUMBER:", currentUser?.COMPANY_NUMBER);
  63768. if (memberType === "VENDOR") {
  63769. // 벤더사 메뉴
  63770. memberTypeText.value = "벤더사";
  63771. info.push(
  63772. {
  63773. menuId: "menu00",
  63774. parentMenuId: "menu00",
  63775. menuName: "주문 관리",
  63776. linkType: "/view/vendor/dashboard",
  63777. },
  63778. {
  63779. menuId: "menu01",
  63780. parentMenuId: "menu01",
  63781. menuName: "제품 관리",
  63782. linkType: "/view/common/item",
  63783. },
  63784. {
  63785. menuId: "menu02",
  63786. parentMenuId: "menu02",
  63787. menuName: "배송 관리",
  63788. linkType: "/view/common/deli",
  63789. },
  63790. {
  63791. menuId: "menu03",
  63792. parentMenuId: "menu03",
  63793. menuName: "인플루언서 관리",
  63794. linkType: "/view/vendor/dashboard/influencer-requests",
  63795. },
  63796. {
  63797. menuId: "menu04",
  63798. parentMenuId: "menu04",
  63799. menuName: "정산 관리",
  63800. linkType: "/view/common/settle",
  63801. },
  63802. {
  63803. menuId: "menu05",
  63804. parentMenuId: "menu05",
  63805. menuName: "고객센터",
  63806. linkType: "/view/common/cs",
  63807. }
  63808. );
  63809. } else {
  63810. // 인플루언서 메뉴
  63811. memberTypeText.value = "인플루언서";
  63812. info.push(
  63813. {
  63814. menuId: "menu00",
  63815. parentMenuId: "menu00",
  63816. menuName: "주문 관리",
  63817. linkType: "/view/vendor/dashboard",
  63818. },
  63819. {
  63820. menuId: "menu01",
  63821. parentMenuId: "menu01",
  63822. menuName: "제품 관리",
  63823. linkType: "/view/common/item",
  63824. },
  63825. {
  63826. menuId: "menu02",
  63827. parentMenuId: "menu02",
  63828. menuName: "배송 관리",
  63829. linkType: "/view/common/deli",
  63830. },
  63831. {
  63832. menuId: "menu03",
  63833. parentMenuId: "menu03",
  63834. menuName: "벤더 관리",
  63835. linkType: "/view/influencer/search",
  63836. },
  63837. {
  63838. menuId: "menu04",
  63839. parentMenuId: "menu04",
  63840. menuName: "정산 관리",
  63841. linkType: "/view/common/settle",
  63842. },
  63843. {
  63844. menuId: "menu05",
  63845. parentMenuId: "menu05",
  63846. menuName: "고객센터",
  63847. linkType: "/view/common/cs",
  63848. }
  63849. );
  63850. }
  63851. arrMenuInfo.value = info;
  63852. $log.debug("[header][fnSetMenu][success] - MEMBER_TYPE:", memberType);
  63853. };
  63854. const menuAction = (__MENUID, _MENUROOTNAME, __URL) => {
  63855. useStore.menuInfo.menuIndex = "0";
  63856. useStore.menuInfo.menuId = __MENUID;
  63857. useStore.menuInfo.pageRtName = _MENUROOTNAME;
  63858. useStore.menuInfo.pageStatus = null;
  63859. useUtil.setPageMove(__URL);
  63860. };
  63861. const fnLoguOut = () => {
  63862. const { logout } = useLogout();
  63863. logout();
  63864. };
  63865. const myPage = (userId) => {
  63866. router.push({
  63867. path: "/view/mng/mngAdd",
  63868. });
  63869. useDtStore.adminInfo.adminId = userId;
  63870. useDtStore.adminInfo.pageType = "U";
  63871. };
  63872. const withdrawal = () => {
  63873. let _req = {
  63874. SEQ: useStoreAuth.getSnsTempData.user.SEQ,
  63875. GOOGLE_REFRESH_TOKEN: useStoreAuth.getSnsTempData.user.GOOGLE_REFRESH_TOKEN,
  63876. KAKAO_REFRESH_TOKEN: useStoreAuth.getSnsTempData.user.KAKAO_REFRESH_TOKEN,
  63877. NAVER_REFRESH_TOKEN: useStoreAuth.getSnsTempData.user.NAVER_REFRESH_TOKEN,
  63878. };
  63879. let _uri = useStoreAuth.getSnsTempData.user.GOOGLE_REFRESH_TOKEN
  63880. ? "/auth/withdrawal"
  63881. : useStoreAuth.getSnsTempData.user.KAKAO_REFRESH_TOKEN
  63882. ? "/auth/kakaowithdrawal"
  63883. : useStoreAuth.getSnsTempData.user.NAVER_REFRESH_TOKEN
  63884. ? "/auth/naverwithdrawal"
  63885. : "/auth/withdrawal";
  63886. useAxios()
  63887. .post(_uri, _req)
  63888. .then((res) => {
  63889. localStorage.removeItem("tempAccess");
  63890. useStore.getSnsTempData = "";
  63891. useAuthStore().setLogout();
  63892. router.push({
  63893. path: "/",
  63894. });
  63895. })
  63896. .catch((error) => {
  63897. if (error.response) {
  63898. console.log("status:", error.response.status, "data:", error.response.data);
  63899. // 안전하게 errCode, message 접근
  63900. const errData = error.response.data || {};
  63901. const errCode = errData.errCode || errData.errorCode || errData.code || "";
  63902. const errMsg = errData.message || "알 수 없는 오류가 발생했습니다.";
  63903. console.log("errCode:", errCode, "message:", errMsg);
  63904. } else {
  63905. console.log("error:", error.message, error.code);
  63906. }
  63907. if (error.response?.status) {
  63908. fnLoginSet(error.response.data.messages.message);
  63909. }
  63910. $log.debug("[withdrawal][fnIdPwCheck][error]");
  63911. })
  63912. .finally(() => {
  63913. $log.debug("[withdrawal][fnIdPwCheck][finished]");
  63914. });
  63915. };
  63916. /************************************************************************
  63917. | 라이프사이클 : onMounted
  63918. ************************************************************************/
  63919. onMounted(() => {
  63920. console.log(useStoreAuth.getSnsTempData.user);
  63921. userId.value = localStorage.getItem("tempAccess");
  63922. userName.value = JSON.parse(localStorage.getItem("authStore"))?.auth.name;
  63923. userCompanyName.value = JSON.parse(
  63924. localStorage.getItem("authStore")
  63925. )?.auth.companyName;
  63926. fnSetMenu();
  63927. });
  63928. </script>
  63929. </file>
  63930. <file path="pages/index.vue">
  63931. <template>
  63932. <div class="login-wrap">
  63933. <div class="login--gate" v-show="loginVisible == 'Y'">
  63934. <div
  63935. class="inf--gate"
  63936. :class="gate1 ? 'actv' : ''"
  63937. @mousemove.stop="handleInfluenceMove"
  63938. >
  63939. <div class="btn--contents">
  63940. <h2>influence</h2>
  63941. <v-btn class="loc--btn" @click.stop="location('influence')"
  63942. >Discover more ></v-btn
  63943. >
  63944. </div>
  63945. </div>
  63946. <div
  63947. class="ven--gate"
  63948. :class="gate2 ? 'actv' : ''"
  63949. @mousemove.stop="handleVendorMove"
  63950. >
  63951. <div class="btn--contents">
  63952. <h2>vendor</h2>
  63953. <v-btn class="loc--btn" @click.stop="location('vendor')">Discover more ></v-btn>
  63954. </div>
  63955. </div>
  63956. </div>
  63957. <div class="login--cock" v-show="loginVisible == 'N'">
  63958. <!-- header -->
  63959. <div class="login--header">
  63960. <div class="login--header--l">
  63961. <div class="logo">
  63962. <!-- prettier-ignore -->
  63963. SHOPDELI
  63964. </div>
  63965. </div>
  63966. <div class="login--header--r"></div>
  63967. </div>
  63968. <!-- login -->
  63969. <div class="login-box">
  63970. <div class="login-l">
  63971. <div class="login-l-center">
  63972. <span class="logo">
  63973. <!-- prettier-ignore -->
  63974. SHOPDELI
  63975. </span>
  63976. <!-- <p>We Make Scalable Mobility Life</p> -->
  63977. </div>
  63978. </div>
  63979. <div class="login-r">
  63980. <div class="tit-login">
  63981. <strong>로그인</strong>
  63982. </div>
  63983. <div class="login-input-wrap">
  63984. <div
  63985. class="txt-field-box"
  63986. :class="!loginForm.validCheck.input.userId ? 'error' : ''"
  63987. >
  63988. <v-text-field
  63989. v-model="loginForm.userId"
  63990. placeholder="아이디를 입력해주세요"
  63991. class="custom-input"
  63992. @keyup.enter="
  63993. loginAction(loginForm.userId, loginForm.passwd, loginForm.loginType)
  63994. "
  63995. @input="setInputField('main_userId')"
  63996. ></v-text-field>
  63997. <i class="ico"></i>
  63998. </div>
  63999. <div
  64000. class="txt-field-box"
  64001. :class="!loginForm.validCheck.input.passwd ? 'error' : ''"
  64002. >
  64003. <v-text-field
  64004. v-model="loginForm.passwd"
  64005. :type="visible ? 'text' : 'password'"
  64006. placeholder="비밀번호를 입력해주세요"
  64007. class="custom-input"
  64008. id="password"
  64009. @keyup.enter="
  64010. loginAction(loginForm.userId, loginForm.passwd, loginForm.loginType)
  64011. "
  64012. @input="setInputField('main_passwd')"
  64013. ></v-text-field>
  64014. <i
  64015. class="ico-eye"
  64016. @click.stop="toggleVisibility"
  64017. :class="visible ? 'eye-on' : 'eye-off'"
  64018. ></i>
  64019. <i class="ico"></i>
  64020. </div>
  64021. <!-- <p class="error-txt" v-if="!loginForm.validCheck.inputErrorCheck">
  64022. {{ loginForm.validCheck.passwd }}
  64023. </p> -->
  64024. </div>
  64025. <div class="login-btn-wrap">
  64026. <v-btn
  64027. v-if="loginForm.loginType == 'influence'"
  64028. class="custom-btn btn-blue"
  64029. @keyup.enter="loginAction(loginForm.userId, loginForm.passwd, 'influence')"
  64030. @click="loginAction(loginForm.userId, loginForm.passwd, 'influence')"
  64031. >로그인</v-btn
  64032. >
  64033. <v-btn
  64034. v-else-if="loginForm.loginType == 'vendor'"
  64035. class="custom-btn btn-blue"
  64036. @keyup.enter="loginAction(loginForm.userId, loginForm.passwd, 'vendor')"
  64037. @click="loginAction(loginForm.userId, loginForm.passwd, 'vendor')"
  64038. >로그인</v-btn
  64039. >
  64040. </div>
  64041. <div class="join--btn--wrap">
  64042. <v-btn class="custom-btn text--btn">아이디 찾기</v-btn>
  64043. <v-btn class="custom-btn text--btn">비밀번호 찾기</v-btn>
  64044. <v-btn class="custom-btn text--btn" @click="location('join')">회원가입</v-btn>
  64045. </div>
  64046. <div class="short--login--wrap" v-if="loginForm.loginType == 'influence'">
  64047. <v-btn class="btn--google" @click.stop="onGoogleLogin"></v-btn>
  64048. <v-btn class="btn--kakao" @click.stop="onKakaoLogin"></v-btn>
  64049. <v-btn class="btn--naver" @click.stop="onNaverLogin"></v-btn>
  64050. </div>
  64051. </div>
  64052. </div>
  64053. <!-- footer -->
  64054. <div class="login-footer">
  64055. <div class="login--footer--l">
  64056. <p>COPYRIGHT@2025 SHOPDELI INC. ALL RIGHTS RESERVED.</p>
  64057. <p>마포구 합정동</p>
  64058. </div>
  64059. </div>
  64060. </div>
  64061. </div>
  64062. </template>
  64063. <script setup>
  64064. /************************
  64065. * import
  64066. ************************/
  64067. //import PrivacyPop from "@/components/login/privacyPop.vue";
  64068. //import AgrNPop from "@/components/terms/agreeNListPop.vue";
  64069. import { useI18n } from "vue-i18n";
  64070. /************************
  64071. * layout setting
  64072. ************************/
  64073. definePageMeta({
  64074. layout: "loginlayout",
  64075. });
  64076. /************************
  64077. * plugins inject
  64078. ************************/
  64079. const { $dayjs, $log, $eventBus, $toast, $userAgent } = useNuxtApp();
  64080. const useStore = useDetailStore();
  64081. const route = useRoute();
  64082. /************************
  64083. * data & created
  64084. ************************/
  64085. // 현재 입력 중인 필드를 설정하는 함수
  64086. const setInputField = (name) => {
  64087. fnValidCheck(name);
  64088. };
  64089. const pageId = "login";
  64090. const gate1 = ref(false);
  64091. const gate2 = ref(false);
  64092. const loginVisible = ref("N");
  64093. const i18n = useI18n();
  64094. // 다국어
  64095. let listObj = ref({
  64096. langTypeList: {},
  64097. });
  64098. // 로그인 정보
  64099. const loginForm = ref({
  64100. userId: "",
  64101. passwd: "",
  64102. otpNum: "",
  64103. username: "",
  64104. authType: "GOOGLE",
  64105. userAgent: "",
  64106. loginType: "",
  64107. validCheck: {
  64108. input: {
  64109. userId: true,
  64110. passwd: true,
  64111. },
  64112. otp: {
  64113. otpNum: true,
  64114. },
  64115. inputErrorCheck: true,
  64116. inputValidTxt: "",
  64117. otpValidTxt: "",
  64118. loginValidCheck: false,
  64119. btnTxt: "",
  64120. btnTxtType: "",
  64121. },
  64122. });
  64123. // 구글 OTP 1차 팝업
  64124. const authPop1 = ref({
  64125. popYn: false,
  64126. certifyYN: false,
  64127. userId: "",
  64128. passwd: "",
  64129. otpNum: "",
  64130. validOtpKey: true,
  64131. validOtpTxt: "",
  64132. btnTxt: "",
  64133. btnTxtType: "",
  64134. applyBtn: false,
  64135. succOtpYn: false,
  64136. businessName: "",
  64137. agreeChk1: false,
  64138. agreeChk2: false,
  64139. validCheck: {
  64140. userId: true,
  64141. passwd: true,
  64142. },
  64143. validTxt: "",
  64144. errorCheck: false,
  64145. });
  64146. // 구글 OTP 2차 팝업
  64147. const authPop2 = ref({
  64148. popYn: false,
  64149. otpNum: "",
  64150. validOtpKey: true,
  64151. validOtpTxt: "",
  64152. errorCheck: false,
  64153. });
  64154. // 아이디 찾기
  64155. const findId = ref({
  64156. popYn: false,
  64157. //tenantName: '',
  64158. email: "",
  64159. otpNum: "",
  64160. validCheck: {
  64161. input: {
  64162. //tenantName: true,
  64163. email: true,
  64164. },
  64165. otp: {
  64166. otpNum: true,
  64167. },
  64168. inputErrorCheck: true,
  64169. inputValidTxt: "",
  64170. otpValidTxt: "",
  64171. findIdValidCheck: false,
  64172. },
  64173. btnTxt: "",
  64174. });
  64175. // 비밀번호 초기화
  64176. const resetPw = ref({
  64177. popYn: false,
  64178. userId: "",
  64179. email: "",
  64180. otpNum: "",
  64181. validCheck: {
  64182. input: {
  64183. userId: true,
  64184. email: true,
  64185. },
  64186. otp: {
  64187. otpNum: true,
  64188. },
  64189. inputErrorCheck: true,
  64190. inputValidTxt: "",
  64191. otpValidTxt: "",
  64192. resetPwValidCheck: false,
  64193. },
  64194. btnTxt: "",
  64195. });
  64196. // 초기 패스워드 변경
  64197. const initPw = ref({
  64198. popYn: false,
  64199. passwd: "",
  64200. passwd2: "",
  64201. validCheck: {
  64202. passwd: true,
  64203. passwd2: true,
  64204. },
  64205. passwdCheck: false,
  64206. errorTxt: "",
  64207. });
  64208. const selectPlaceholder = ref("");
  64209. const initAuthPop1 = ref({});
  64210. const initAuthPop2 = ref({});
  64211. const initFindId = ref({});
  64212. const initResetPw = ref({});
  64213. const initInitPw = ref({});
  64214. const googleOtpQrCode = ref("");
  64215. const googleOtpSecretKey = ref("");
  64216. const loginInfo = ref({});
  64217. const checkbox = ref(false);
  64218. const langType = ref("");
  64219. const toggleVisibility = () => {
  64220. visible.value = !visible.value;
  64221. };
  64222. const visible = ref(false);
  64223. const isAgrNPop = ref(false);
  64224. const isShowAgrNPop = ref(false);
  64225. let saveId = localStorage.getItem("saveId");
  64226. if (saveId) {
  64227. checkbox.value = true;
  64228. loginForm.value.userId = saveId;
  64229. }
  64230. const handleInfluenceMove = (event) => {
  64231. const el = event.currentTarget;
  64232. const rect = el.getBoundingClientRect();
  64233. const mouseX = event.clientX;
  64234. // 요소 너비의 15%를 좌우 여백으로 계산 (중앙 70% 영역)
  64235. const margin = rect.width * 0.15;
  64236. const leftBound = rect.left + margin;
  64237. const rightBound = rect.right - margin;
  64238. if (mouseX >= leftBound && mouseX <= rightBound) {
  64239. gate1.value = true;
  64240. gate2.value = false;
  64241. } else {
  64242. gate1.value = false;
  64243. }
  64244. };
  64245. const handleVendorMove = (event) => {
  64246. const el = event.currentTarget;
  64247. const rect = el.getBoundingClientRect();
  64248. const mouseX = event.clientX;
  64249. // 요소 너비의 15%를 좌우 여백으로 계산 (중앙 70% 영역)
  64250. const margin = rect.width * 0.15;
  64251. const leftBound = rect.left + margin;
  64252. const rightBound = rect.right - margin;
  64253. if (mouseX >= leftBound && mouseX <= rightBound) {
  64254. gate2.value = true;
  64255. gate1.value = false;
  64256. } else {
  64257. gate2.value = false;
  64258. }
  64259. };
  64260. // 개인정보처리방침 이용약관 팝업
  64261. //const privacyPop = ref(false);
  64262. const privacyDetail = ref({
  64263. kr: {
  64264. title: "",
  64265. contents: "",
  64266. },
  64267. en: {
  64268. title: "",
  64269. contents: "",
  64270. },
  64271. });
  64272. const systemInfo = ref({
  64273. mode: "",
  64274. });
  64275. const loginAction = (__ID, __PASS, __TYPE) => {
  64276. let _req = {
  64277. id: __ID,
  64278. password: __PASS,
  64279. logintype: __TYPE,
  64280. };
  64281. useAxios()
  64282. .post("/roulette/login", _req)
  64283. .then((res) => {
  64284. if (res.data) {
  64285. // console.log(res.data);
  64286. useAuthStore().setAuth(res.data);
  64287. useAuthStore().setAccessToken(res.data.accessToken);
  64288. useAuthStore().setRefreshToken(res.data.refreshToken);
  64289. localStorage.setItem("tempAccess", __ID);
  64290. useUtil.setPageMove("/view/common/item");
  64291. useStore.menuInfo.menuIndex = "0";
  64292. useStore.menuInfo.menuId = "menu01";
  64293. useStore.menuInfo.pageRtName = "제품 관리";
  64294. useStore.menuInfo.pageStatus = null;
  64295. }
  64296. })
  64297. .catch((error) => {
  64298. if (error.response) {
  64299. console.log("status:", error.response.status, "data:", error.response.data);
  64300. // 안전하게 errCode, message 접근
  64301. const errData = error.response.data || {};
  64302. const errCode = errData.errCode || errData.errorCode || errData.code || "";
  64303. const errMsg = errData.message || "알 수 없는 오류가 발생했습니다.";
  64304. console.log("errCode:", errCode, "message:", errMsg);
  64305. } else {
  64306. console.log("error:", error.message, error.code);
  64307. }
  64308. if (error.response?.status) {
  64309. fnLoginSet(error.response.data.messages.message);
  64310. }
  64311. $log.debug("[login][fnIdPwCheck][error]");
  64312. })
  64313. .finally(() => {
  64314. $log.debug("[login][fnIdPwCheck][finished]");
  64315. });
  64316. };
  64317. const location = (__id) => {
  64318. switch (__id) {
  64319. case "join":
  64320. useUtil.setPageMove("/auth/join?type=" + loginForm.value.loginType);
  64321. break;
  64322. case "findId":
  64323. findId.value.popYn = true;
  64324. break;
  64325. case "resetPw":
  64326. resetPw.value.popYn = true;
  64327. break;
  64328. case "influence":
  64329. useUtil.setPageMove("/?type=influence");
  64330. loginVisible.value = "Y";
  64331. break;
  64332. case "vendor":
  64333. useUtil.setPageMove("/?type=vendor");
  64334. loginVisible.value = "N";
  64335. break;
  64336. default:
  64337. break;
  64338. }
  64339. };
  64340. // onMounted
  64341. onMounted(() => {
  64342. //로그인페이지 접근시 파라미터 체크하여 인플루언서, 밴더 구분
  64343. const typeParam = route.query.type;
  64344. if (typeParam == "influence") {
  64345. loginForm.value.loginType = "influence";
  64346. } else if (typeParam == "vendor") {
  64347. loginForm.value.loginType = "vendor";
  64348. } else {
  64349. loginVisible.value = "Y";
  64350. }
  64351. //구글 인증 프로세스
  64352. function handleMessage(event) {
  64353. const appBaseUrl = import.meta.env.VITE_APP_API_URL;
  64354. // 개발환경이면 아래처럼 확인
  64355. const allowedOrigins = [
  64356. "http://0.0.0.0:3000",
  64357. "http://localhost:3000",
  64358. appBaseUrl,
  64359. ].filter(Boolean);
  64360. if (allowedOrigins.includes(event.origin)) {
  64361. const { accessToken, refreshToken, user } = event.data;
  64362. if (user?.JOIN === "1") {
  64363. useAuthStore().setTempData(user);
  64364. useUtil.setPageMove("/auth/join?type=" + loginForm.value.loginType);
  64365. } else {
  64366. // SNS 로그인 성공 시 인증 정보 제대로 설정
  64367. const authData = {
  64368. refreshToken: refreshToken,
  64369. user: user,
  64370. };
  64371. // setAuth를 호출하여 auth 스토어에 사용자 정보 저장
  64372. useAuthStore().setAuth(authData);
  64373. useAuthStore().setTempData(authData);
  64374. useAuthStore().setAccessToken(accessToken);
  64375. useAuthStore().setRefreshToken(refreshToken);
  64376. localStorage.setItem("tempAccess", user.ID || user.id || user.SEQ);
  64377. useUtil.setPageMove("/view/common/item");
  64378. useStore.menuInfo.menuIndex = "0";
  64379. useStore.menuInfo.menuId = "menu02";
  64380. useStore.menuInfo.pageRtName = "이벤트 관리";
  64381. useStore.menuInfo.pageStatus = null;
  64382. }
  64383. }
  64384. }
  64385. window.addEventListener("message", handleMessage);
  64386. onBeforeUnmount(() => window.removeEventListener("message", handleMessage));
  64387. });
  64388. watch(
  64389. () => route.query.type,
  64390. (newType) => {
  64391. if (newType === "influence" || newType === "vendor") {
  64392. loginForm.value.loginType = newType;
  64393. loginVisible.value = "N"; // 로그인 폼 보이기
  64394. } else {
  64395. loginVisible.value = "Y"; // 게이트 페이지 보이기
  64396. }
  64397. },
  64398. {
  64399. immediate: true, // 컴포넌트가 마운트될 때 즉시 실행
  64400. }
  64401. );
  64402. watchEffect(() => {
  64403. // 감시하고자 하는 데이터를 해당 블럭내에서 사용하면 호출된다.
  64404. // getLang.value를 감시하는 상태
  64405. //QfnGetEnumCode(useLangStore().getLang);
  64406. });
  64407. // $eventBus.off("SET_SUCCESS_POPUP");
  64408. // $eventBus.on("SET_SUCCESS_POPUP", () => {
  64409. // // 안내 팝업 확인 클릭 팝업 초기화처리
  64410. // fnOtpPopClose("findId");
  64411. // fnOtpPopClose("resetPw");
  64412. // });
  64413. // $eventBus.off("PASSWD_CHANGE");
  64414. // $eventBus.on("PASSWD_CHANGE", () => {
  64415. // fnPasswdChange();
  64416. // });
  64417. // $eventBus.off("INIT_PASSWORD");
  64418. // $eventBus.on("INIT_PASSWORD", () => {
  64419. // initPw.value.popYn = true;
  64420. // });
  64421. // $eventBus.off("SET_LOGIN");
  64422. // $eventBus.on("SET_LOGIN", () => {
  64423. // fnLogin();
  64424. // });
  64425. /************************
  64426. * Methods
  64427. ************************/
  64428. const fnLoginSet = (__MSG) => {
  64429. let param = {
  64430. id: pageId,
  64431. title: "로그인",
  64432. content: __MSG,
  64433. yes: {
  64434. text: "확인",
  64435. isProc: true,
  64436. event: "FN_LOGIN",
  64437. param: "",
  64438. },
  64439. no: {
  64440. text: "취소",
  64441. isProc: false,
  64442. },
  64443. };
  64444. $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
  64445. };
  64446. // 구글 로그인 인증 시퀀스
  64447. function onGoogleLogin() {
  64448. const appBaseUrl = import.meta.env.VITE_APP_API_URL;
  64449. const clientId =
  64450. "373780605211-diojebh7mug45urv9rnqdil6n0b1ogge.apps.googleusercontent.com"; // 실제 클라이언트 ID로 교체
  64451. //const redirectUri = "https://shopdeli.mycafe24.com/auth/callback"; // 실제 리디렉션 URI로 교체
  64452. const redirectUri = `${appBaseUrl}/auth/callback`;
  64453. const scope = "openid email profile";
  64454. const responseType = "code"; // 또는 'code' (백엔드 연동 시)
  64455. const state = Math.random().toString(36).substring(2);
  64456. const googleAuthUrl = `https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&client_id=${clientId}&redirect_uri=${encodeURIComponent(
  64457. redirectUri
  64458. )}&response_type=${responseType}&scope=${encodeURIComponent(scope)}&state=${state}`;
  64459. const width = 500;
  64460. const height = 600;
  64461. const dualScreenLeft =
  64462. window.screenLeft !== undefined ? window.screenLeft : window.screenX;
  64463. const dualScreenTop =
  64464. window.screenTop !== undefined ? window.screenTop : window.screenY;
  64465. const currentWidth = window.innerWidth
  64466. ? window.innerWidth
  64467. : document.documentElement.clientWidth
  64468. ? document.documentElement.clientWidth
  64469. : screen.width;
  64470. const currentHeight = window.innerHeight
  64471. ? window.innerHeight
  64472. : document.documentElement.clientHeight
  64473. ? document.documentElement.clientHeight
  64474. : screen.height;
  64475. const left = dualScreenLeft + (currentWidth - width) / 2;
  64476. const top = dualScreenTop + (currentHeight - height) / 2;
  64477. window.open(
  64478. googleAuthUrl,
  64479. "googleLogin",
  64480. `width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes`
  64481. );
  64482. }
  64483. //카카오 인증 시퀀스
  64484. function onKakaoLogin() {
  64485. const appBaseUrl = import.meta.env.VITE_APP_API_URL;
  64486. const kakaoAuthUrl = `${appBaseUrl}/auth/kakaoLogin`; // 실제 리디렉션 URI로 교체
  64487. const width = 500;
  64488. const height = 600;
  64489. const dualScreenLeft =
  64490. window.screenLeft !== undefined ? window.screenLeft : window.screenX;
  64491. const dualScreenTop =
  64492. window.screenTop !== undefined ? window.screenTop : window.screenY;
  64493. const currentWidth = window.innerWidth
  64494. ? window.innerWidth
  64495. : document.documentElement.clientWidth
  64496. ? document.documentElement.clientWidth
  64497. : screen.width;
  64498. const currentHeight = window.innerHeight
  64499. ? window.innerHeight
  64500. : document.documentElement.clientHeight
  64501. ? document.documentElement.clientHeight
  64502. : screen.height;
  64503. const left = dualScreenLeft + (currentWidth - width) / 2;
  64504. const top = dualScreenTop + (currentHeight - height) / 2;
  64505. window.open(
  64506. kakaoAuthUrl,
  64507. "kakaoLogin",
  64508. `width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes`
  64509. );
  64510. }
  64511. //네이버 인증 시퀀스
  64512. function onNaverLogin() {
  64513. const appBaseUrl = import.meta.env.VITE_APP_API_URL;
  64514. const naverAuthUrl = `${appBaseUrl}/auth/naverLogin`; // 실제 리디렉션 URI로 교체
  64515. const width = 500;
  64516. const height = 600;
  64517. const dualScreenLeft =
  64518. window.screenLeft !== undefined ? window.screenLeft : window.screenX;
  64519. const dualScreenTop =
  64520. window.screenTop !== undefined ? window.screenTop : window.screenY;
  64521. const currentWidth = window.innerWidth
  64522. ? window.innerWidth
  64523. : document.documentElement.clientWidth
  64524. ? document.documentElement.clientWidth
  64525. : screen.width;
  64526. const currentHeight = window.innerHeight
  64527. ? window.innerHeight
  64528. : document.documentElement.clientHeight
  64529. ? document.documentElement.clientHeight
  64530. : screen.height;
  64531. const left = dualScreenLeft + (currentWidth - width) / 2;
  64532. const top = dualScreenTop + (currentHeight - height) / 2;
  64533. window.open(
  64534. naverAuthUrl,
  64535. "naverLogin",
  64536. `width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes`
  64537. );
  64538. }
  64539. /**
  64540. * @API
  64541. * 최종 로그인 버튼 클릭 시 API
  64542. */
  64543. function fnLogin(__USERID, __USERPASS) {
  64544. // 파라미터 전달 값 [아이디, 비밀번호, otpNum, 브라우저정보]
  64545. //userId: loginForm.value.userId,
  64546. // let _req = {
  64547. // username: loginForm.value.userId,
  64548. // password: btoa(loginForm.value.passwd),
  64549. // };
  64550. localStorage.setItem("tempAccess", __USERID);
  64551. if (__USERID == "admin" && __USERPASS == "1234") {
  64552. useUtil.setPageMove("/view/media/newsList");
  64553. } else {
  64554. fnLoginSet("비밀번호가 맞지 않습니다. 확인해주세요.");
  64555. }
  64556. // useAxios()
  64557. // .post(apiUrl.otpCheck, _req)
  64558. // .then((res) => {
  64559. // loginInfo.value = res.data.data;
  64560. // useAuthStore().setAccessToken(loginInfo.value.accessToken);
  64561. // useAuthStore().setRefreshToken(loginInfo.value.refreshToken);
  64562. // // OTP key체크 성공 후 개인정보에 대한 API를 호출 한다.
  64563. // fnServiceModeCheck();
  64564. // $log.debug("[login][fnLogin][success]");
  64565. // })
  64566. // .catch((error) => {
  64567. // $log.debug("[login][fnLogin][error]");
  64568. // let errorData = error.response.data;
  64569. // errorData.type = "fnLogin";
  64570. // fnLoginFail(errorData);
  64571. // })
  64572. // .finally(() => {
  64573. // $log.debug("[login][fnLogin][finished]");
  64574. // });
  64575. }
  64576. /**
  64577. * @SCRIPT
  64578. * 비밀번호확인 validation
  64579. */
  64580. function fnValidCheck(type) {
  64581. // 아이디 체크
  64582. if (type === "id") {
  64583. const id = loginForm.value.userId;
  64584. // 1. 기본 유효성 검사
  64585. if (!id) {
  64586. $toast.error("아이디를 입력해주세요.");
  64587. return false;
  64588. }
  64589. // 2. 아이디 형식 검사 (영문, 숫자 조합 6~20자)
  64590. const idRegex = /^[a-zA-Z0-9]{6,20}$/;
  64591. if (!idRegex.test(id)) {
  64592. $toast.error("아이디는 영문, 숫자 조합 6~20자로 입력해주세요.");
  64593. return false;
  64594. }
  64595. }
  64596. // 다른 유효성 검사가 필요한 경우 여기에 추가
  64597. return true;
  64598. }
  64599. </script>
  64600. </file>
  64601. </files>