{"version":3,"sources":["assets/1.png","assets/topImage.jpg","assets/2.png","assets/5.png","assets/6.png","assets/7.png","assets/8.png","assets/9.png","assets/10.png","assets/11.png","assets/12.png","assets/13.png","assets/14.png","assets/15.png","assets/16.png","assets/17.png","assets/18.png","assets/19.png","assets/completeImage.png","config.js","Components/Title.js","Screens/NotFound.js","Functions.js","Services/AuthService.js","PrivateRoute.js","Components/SubmitButton.js","Components/StyledComponents.js","Screens/Customer/Top.js","Screens/Customer/Phone.js","Services/SmsService.js","Screens/Customer/PINcode.js","Components/InputProgressBar.js","Screens/Customer/Input.js","Forms/index.js","Components/GridView.js","Screens/Customer/Photos.js","Services/EmailService.js","Screens/Customer/Confirm.js","Screens/Customer/Submit.js","Components/AdminComponents.js","Components/Button.js","Screens/Store/LogIn.js","Screens/Store/LogOut.js","Components/SearchBar.js","Components/CarList.js","Components/FileImport.js","Services/ImageService.js","Screens/Store/Admin.js","Screens/Store/EditCarInformation.js","Screens/Store/Modal/EmailModal.js","Screens/Store/Modal/DeleteModal.js","Screens/Store/CarDetail.js","Screens/Store/StoreInfo.js","Screens/Store/EditStoreInfo.js","Screens/Store/EditAccount.js","Screens/Store/Account.js","Screens/Store/CarRegistration.js","App.js","serviceWorker.js","index.js","assets/default.png"],"names":["module","exports","API_URL","AUTH_URL","EMAIL_URL","INSERT_URL","UPDATE_URL","UPLOAD_URL","FETCH_URL","USER_INFO_INSERT_URL","FETCH_STORE_URL","DATA_LIST_URL","IMG_DESC_URL","SIGNED_URL","CAR_INFO_UPDATE_URL","STORE_INFO_UPDATE_URL","CAR_INFO_UID_UPDATE_URL","STORE_UID_UPDATE_URL","STORE_PASSWORD_UPDATE_URL","CAR_INFO_DELTE_URL","detailDataLabel","car_type","maker","mileage","age","status","name","address","mail","phone","registerForm","mileages","statuses","errorMessages","Colors","TextSize","large","medium","small","StatusColor","exampleCSVdata","氏名","電話","メール","住所","メーカー","車種","年式","走行距離","titleStyle","fontSize","fontWeight","textAlign","color","Title","props","titleText","style","container","position","top","left","right","zIndex","height","overflow","NotFound","getAgeOptions","startDate","Date","endDate","ageOptions","i","getFullYear","value","label","push","getMileageOptions","mileageOptions","forEach","item","getMakerOptions","a","axios","get","then","response","data","result","makerOptions","catch","error","console","log","getCarTypeOptions","carTypeOptions","carType","phoneNumberNoneProblem","val","parsedPhoneNumber","parsePhoneNumber","isValid","formatTel","AsYouType","input","cryptHash","str","crypto","createHash","update","digest","Now","moment","format","isLoggedIn","getCurrentUser","JSON","parse","set","key","sessionStorage","setItem","getSessionStorage","ret","getItem","login","accountName","password","json","account_name","post","stringify","logout","PrivateRoute","state","loading","isAuthenticated","computedMatch","this","AuthService","store_info","params","setState","Component","component","rest","className","render","to","pathname","from","location","width","maxWidth","padding","border","margin","SubmitButton","buttonText","onClick","isEnabled","containerStyle","backgroundColor","alignItems","disabled","Container","styled","div","HeaderStyle","nav","HeaderTitle","HeaderIcons","TitleContainer","li","MasterContainer","MasterItem","Body","BodyElement","FooterStyle","FooterColumn","FooterItems","SearchContainerStyle","SearchBoxStyle","SearchInput","DropZone","isDragAccept","isDragReject","isDragActive","getColor","DropDownStyle","DropDownItemStyle","CustomerContainer","LoginStyle","ItemDisplayStyle","ImageDisplayStyle","InfoDisplayStyle","InfoButtonDisplayStyle","CardListStyle","ListItemInfoStyle","ListImageStyle","img","ListItemButtonStyle","TableStyle","TableTitle","EditTableContentInput","imageContainer","marginLeft","marginRight","Top","history","useHistory","useParams","marginTop","src","require","inputContainer","Phone","useState","setPhone","setError","checkForm","useCallback","formatedPhoneNumber","RegExp","test","phoneNumber","generalInfo","isUpdate","carId","id","getGeneralInfo","whiteSpace","Alert","variant","type","onBlur","e","target","placeholder","marginBottom","sendPINcode","PINcode","to_number","replace","underlineText","textDecoration","rand","Math","floor","random","slice","setPINcode","useLocation","useEffect","SmsService","fields","inputStyle","onChange","length","checkPIN","href","preventDefault","barStyle","display","flexDirection","justifyContent","alignSelf","progressContainer","progressStyle","InputProgressBar","currentIndex","map","index","text","getProgress","selectionContainerStyle","subSelectionContainerStyle","labelStyle","paddingLeft","CustomerInput","Input","setMaker","setCarType","setAge","setMileage","setName","setAddress","setMail","setIsUpdate","setCarId","checked","setChecked","setMakerOptions","setCarTypeOptions","setAgeOptions","setMileageOptions","carImageData","setCarImageData","carImages","miliageOptions","getMakers","getCarTypes","onChecked","warekiOptions","setFullYear","koyomi","getWarekiOptions","ajv","Ajv","allErrors","errorMessagesMap","Map","errorMessage","undefined","validate","compile","required","properties","errors","keyword","missingProperty","isClearable","isSearchable","options","defaultValue","readOnly","carFormList","profileFormList","partName","image","description","imageFile","defaultCarImage","requiredImageIndex","Grid","swapImage","setSelectedIndex","changeText","allowEditing","isRequired","includes","gridContainer","toString","accept","hidden","htmlFor","objectFit","borderWidth","DescriptionTextArea","descriotionField","gridsContainer","flexWrap","listStyle","textarea","GridView","carImageDataAndDescription","setCarImageDataAndDescription","selectedIndex","files","imageURL","URL","createObjectURL","enterdText","ind","wrapper","Photos","sendingInfo","setSendingInfo","setFiles","checkPhotos","filledForm","imageFiles","err","imageValidation","Object","keys","missingRequiredImageIndex","SendTextCustomer","contactNumber","subject","bodyText","SendTextStore","SendHtml","link","bodyHtml","listContainer","labelContainer","filledFormContainer","borderBottom","Confirm","isLoading","setIsLoading","isSending","setIsSending","showingImageData","setShowingImageData","uploadedImages","readyDispayImage","carImage","Promise","resolve","car","handleUploadImage","uploadImage","find","v","fieldname","FormData","append","headers","onSubmit","resultUserInfo","car_id","date","user_id","insertId","update_date","register_date","create_date","resultCarInfo","images","EmailService","filledFormList","formList","Submit","Header","user","DropDown","isOpened","setIsOpened","cursor","items","DropDownMenue","DropDownItem","leftIcon","children","rightIcon","Footer","minWidth","smallLabelStyle","minimum","Meta","Helmet","content","ButtonStyle","button","Button","isCancel","buttonStyle","btnClicked","getButtonStyle","LogIn","setAccountName","setPassword","loginHandler","maximum","LogOut","getWindowDimensions","window","innerWidth","innerHeight","useWindowDimensions","windowDimensions","setWindowDimensions","handleResize","addEventListener","removeEventListener","SearchBar","setSearchingData","carData","searchInput","setSerchInput","checkedValues","setCheckedValues","statusOptions","setStatusOptions","anchorEl","setAnchorEl","createStatusOptions","filteredData","queryData","FormControlLabel","control","Checkbox","onCheck","filter","size","searchQuery","toLowerCase","filteredCars","cars","sort","b","splice","findIndex","handleMenuOpen","currentTarget","Popover","open","Boolean","onClose","anchorOrigin","vertical","horizontal","transformOrigin","FormLabel","FormGroup","StatusInfo","statusmap","statusColor","time","split","join","borderRadius","Row","TableColumn","ColumnInfoStyle","ColumnDetailStyle","CarList","listData","dataLabel","updateCarData","statusAndUserInfoLabel","overflowY","img_name","rel","alt","FileImport","isButton","checkError","onDrop","acceptedFiles","file","reader","FileReader","onabort","onerror","onload","importCount","importData","buf","encoding","Encoding","detect","csvStr","convert","csv","noheader","output","fromString","csvRow","alert","reload","readAsBinaryString","useDropzone","maxFiles","getRootProps","getInputProps","getImageURL","snapShot","requests","fetch","img_url","row","all","DownLoadCSV","minHeight","separator","filename","Admin","searchedData","setSearchedData","setCarData","ImageService","getResult","carList","updateIndex","EditCarInformation","changeEditState","isEditing","setStatus","getStatusOptions","saveButtonPressed","updatingdData","isPhoneEntered","paddingTop","cntentStyle","ButtonContainer","Modal","setAppElement","modalStyle","overlay","EmailModal","emailModalState","sendEmail","setEmailModalState","isOpen","DeleteModal","deleteModalState","deleteCarResistration","setDeleteModalState","ImageAndDescription","imageDesc","descriptions","des","aspectRatio","paddingBottom","desc","CarInformation","deleteCarData","LabelInfoStyle","overflowX","getDate","CarDetail","showingData","setShowingData","setImageDesc","dataExists","setDataExits","setIsEditing","imgs","defaultImgDesc","handleUpdate","updatingData","updateData","updatingShowingData","copiedData","bodyStyle","StoreInfo","storeData","setStoreData","logoURL","setLogoURL","storeLogo","url","editStore","EditStoreInfo","uploadingLogoFile","setUploadingLogoFile","setPhoneNumber","setEmail","cancelEditing","goBack","updateStoreInfo","logo_img","errorMsg","店舗名","電話番号","メールアドレス","dataPath","widht","EditTableRow","title","setText","textType","borderTop","isFirstRow","EditAccountName","setIsModalOpen","accountInfo","pass","saveBtnPressed","updateAccountName","before_account_name","after_account_name","info","indexOf","minLength","headerTextStyle","EditPassword","currentPassword","setCurrentPassword","newPassword","setNewPassword","confirmedNewPassword","setConfirmedNewPassword","updatePassword","AccountSetting","setModalState","TableRow","contentStyle","maxHeight","Account","setAccountInfo","isModalOpen","isPassword","setIsPassword","getStoreInfo","justifySelf","CarInfoContainer","CarRegistration","setData","isRegistering","setIsregistering","finishRegistering","handleRegistering","enteredData","registerCarInfo","App","exact","path","hostname","match","ReactDOM","document","getElementById","navigator","serviceWorker","ready","registration","unregister","message"],"mappings":"yFAAAA,EAAOC,QAAU,IAA0B,+B,gUCA3CD,EAAOC,QAAU,IAA0B,sC,oBCA3CD,EAAOC,QAAU,IAA0B,+B,oBCA3CD,EAAOC,QAAU,IAA0B,+B,oBCA3CD,EAAOC,QAAU,IAA0B,+B,oBCA3CD,EAAOC,QAAU,IAA0B,+B,oBCA3CD,EAAOC,QAAU,IAA0B,+B,oBCA3CD,EAAOC,QAAU,IAA0B,+B,oBCA3CD,EAAOC,QAAU,IAA0B,gC,oBCA3CD,EAAOC,QAAU,IAA0B,gC,oBCA3CD,EAAOC,QAAU,IAA0B,gC,oBCA3CD,EAAOC,QAAU,IAA0B,gC,oBCA3CD,EAAOC,QAAU,IAA0B,gC,oBCA3CD,EAAOC,QAAU,IAA0B,gC,oBCA3CD,EAAOC,QAAU,IAA0B,gC,oBCA3CD,EAAOC,QAAU,IAA0B,gC,oBCA3CD,EAAOC,QAAU,IAA0B,gC,oBCA3CD,EAAOC,QAAU,IAA0B,gC,oBCA3CD,EAAOC,QAAU,IAA0B,2C,8LCQ9BC,EAFN,kBALoB,aAKpB,SASMC,EAAWD,EAAU,QACrBE,EAAYF,EAAU,SACtBG,EAAaH,EAAU,UACvBI,EAAaJ,EAAU,UACvBK,EAAaL,EAAU,UACvBM,EAAYN,EAAU,SACtBO,EAAuBP,EAAU,oBACjCQ,EAAkBR,EAAU,oBAC5BS,EAAgBT,EAAU,mBAC1BU,EAAeV,EAAU,sBACzBW,EAAaX,EAAU,wBAEvBY,EAAsBZ,EAAU,mBAChCa,EAAwBb,EAAU,qBAClCc,EAA0Bd,EAAU,gCACpCe,EAAuBf,EAAU,kCACjCgB,EAA4BhB,EAAU,8BACtCiB,EAAqBjB,EAAU,mBAE/BkB,EAAkB,CAAEC,SAAU,eAAMC,MAAO,2BAAQC,QAAS,2BAAQC,IAAK,eAAMC,OAAQ,iCAASC,KAAM,eAAMC,QAAS,eAAMC,KAAM,6CAAWC,MAAO,4BACnJC,EAAe,CAAER,MAAO,KAAMD,SAAU,KAAMG,IAAK,KAAMD,QAAS,KAAME,OAAQ,EAAGC,KAAM,KAAMG,MAAO,KAAMD,KAAM,MAElHG,EAAW,CACpB,aACA,kBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,oBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,gBAGSC,EAAW,CACpB,CAAC,EAAG,4BACJ,CAAC,EAAG,8CACJ,CAAC,EAAG,wCACJ,CAAC,EAAG,sBACJ,CAAC,EAAG,gBACJ,CAAC,EAAG,mCAGKC,EAAgB,CACzB,CAAC,QAAS,wFACV,CAAC,UAAW,8FACZ,CAAC,MAAO,4EACR,CAAC,UAAW,wFACZ,CAAC,OAAQ,4EACT,CAAC,QAAS,wFACV,CAAC,UAAW,4EACZ,CAAC,OAAQ,2GAGAC,EACG,UADHA,EAEY,UAFZA,EAGD,UAHCA,EAID,UAJCA,EAKM,UALNA,EAMO,UANPA,EAOC,UAPDA,EAQF,MAREA,EASG,OATHA,EAUW,UAVXA,EAWY,OAXZA,EAYgB,QAZhBA,EAakB,UAGlBC,EAAW,CACpBC,MAAO,8BACPC,OAAQ,8BACRC,MAAO,+BAGEC,GAAc,CACvB,CAAC,EAAG,WACJ,CAAC,EAAG,WACJ,CAAC,EAAG,WACJ,CAAC,EAAG,WACJ,CAAC,EAAG,WACJ,CAAC,EAAG,YAGKC,GAAiB,CAC1B,CACIC,eAAI,2BACJC,eAAI,gBACJC,qBAAK,qBACLC,eAAI,mDACJC,2BAAM,qBACNC,eAAI,2BACJC,eAAI,KACJC,2BAAM,SAEV,CACIP,eAAI,2BACJC,eAAI,gBACJC,qBAAK,qBACLC,eAAI,mDACJC,2BAAM,qBACNC,eAAI,2BACJC,eAAI,KACJC,2BAAM,UCpIRC,GAAa,CAAEC,SAAUf,EAASG,MAAOa,WAAY,MAAOC,UAAW,SAAUC,MAAO,SAE/EC,GAXD,SAACC,GAAW,IAChBC,EAAcD,EAAdC,UACR,OACE,yBAAKC,MAAOR,IACTO,ICKDE,GAAY,CACdC,SAAU,QACVC,IAAK,EACLC,KAAM,EACNC,MAAO,EACPC,OAAQ,EACRC,OAAQ,QACRC,SAAU,UAGCC,GAlBE,WACb,OACI,yBAAKT,MAAOC,IACR,kBAAC,GAAD,CAAOF,UAAU,qB,uGCAtB,SAASW,KAKZ,IAJA,IAAMC,EAAY,IAAIC,KAChBC,EAAU,IAAID,KAAK,KAAM,EAAG,GAE5BE,EAAa,GACVC,EAAIJ,EAAUK,cAAeD,GAAKF,EAAQG,cAAeD,IAAK,CACnE,IAAIhD,EAAM,CACNkD,MAAOF,EACPG,MAAOH,GAEXD,EAAWK,KAAKpD,GAGpB,OAAO+C,EAoBJ,SAASM,KACZ,IAAMC,EAAiB,GASvB,OARA/C,EAASgD,SAAQ,SAAAC,GACb,IAAIzD,EAAU,CACVmD,MAAOM,EACPL,MAAOK,GAEXF,EAAeF,KAAKrD,MAGjBuD,EAGJ,SAAeG,KAAtB,gC,8CAAO,sBAAAC,EAAA,sEACUC,KAAMC,IAAI5E,EAAY,UAC9B6E,MAAK,SAACC,GACH,GAAwB,MAApBA,EAAS7D,OACT,OAAO6D,EAASC,QAGvBF,MAAK,SAACG,GACH,IAAMC,EAAe,GASrB,OARAD,EAAOT,SAAQ,SAAAC,GACX,IAAI1D,EAAQ,CACRoD,MAAOM,EAAK1D,MACZqD,MAAOK,EAAK1D,OAEhBmE,EAAab,KAAKtD,MAGfmE,KAEVC,OAAM,SAACC,GACJC,QAAQC,IAAI,QAASF,MApB1B,oF,sBAwBA,SAAeG,GAAtB,mC,8CAAO,WAAiCxE,GAAjC,SAAA4D,EAAA,sEACUC,KAAMC,IAAI5E,EAAS,0BAAsBc,IACjD+D,MAAK,SAACC,GACH,GAAwB,MAApBA,EAAS7D,OACT,OAAO6D,EAASC,QAGvBF,MAAK,SAACG,GACH,IAAMO,EAAiB,GASvB,OARAP,EAAOT,SAAQ,SAAAC,GACX,IAAIgB,EAAU,CACVtB,MAAOM,EAAK3D,SACZsD,MAAOK,EAAK3D,UAEhB0E,EAAenB,KAAKoB,MAGjBD,KAEVL,OAAM,SAACC,GACJC,QAAQC,IAAI,QAASF,MApB1B,oF,sBAsCA,SAASM,GAAuBC,GACnC,GAAIA,EAAK,CACL,IAAMC,EAAoBC,aAAiB,MAAQF,EAAK,MACxD,QAAOC,GAAoBA,EAAkBE,UAE7C,OAAO,EAKR,SAASC,GAAUJ,GACtB,OAAO,IAAIK,KAAU,MAAMC,MAAMN,GAG9B,SAASO,GAAUC,GACtB,OAAOC,KAAOC,WAAW,UAAUC,OAAOH,EAAK,QAAQI,OAAO,OAG3D,SAASC,KACZ,OAAOC,OAASC,OAAO,uB,ICrFZ,O,iDA3CbC,WAAa,iBAAiC,SAA3B,EAAK9B,IAAI,e,KAC5B+B,eAAiB,kBAAMC,KAAKC,MAAM,EAAKjC,IAAI,U,KAE3CkC,IAAM,SAACC,EAAK7C,GAAN,OAAgB8C,eAAeC,QAAQF,EAAK7C,I,KAClDU,IAAM,SAAAmC,GAAG,OAAI,EAAKG,kBAAkBH,I,KAEpCG,kBAAoB,SAAAH,GAClB,IAAMI,EAAMH,eAAeI,QAAQL,GACnC,OAAII,GAGG,M,KAITE,M,uCAAQ,WAAOC,EAAaC,GAApB,eAAA7C,EAAA,6DACA8C,EAAO,CACXC,aAAcH,EACdC,SAAUtB,GAAUsB,IAHhB,SAMO5C,KAAM+C,KAAK/H,EAAW,UAAW6H,GAC3C3C,MAAK,SAAAG,GACJ,GAAsB,MAAlBA,EAAO/D,QACL+D,EAAOD,KAAK,GAId,OAHA,EAAK+B,IAAI,cAAc,GACvB,EAAKA,IAAI,OAAQF,KAAKe,UAAU3C,EAAOD,KAAK,KAErCC,EAAOD,KAAK,GAAG0C,gBAbxB,mF,6DAoBRG,OAAS,WACH,EAAKlB,eACP,EAAKI,IAAI,cAAc,GACvB,EAAKA,IAAI,OAAQ,SCYRe,G,kDAlDb,WAAY9E,GAAQ,IAAD,8BACjB,cAAMA,IACD+E,MAAQ,CACXC,SAAS,EACTrB,YAAY,EACZsB,iBAAiB,GALF,E,sLAUTC,EAAkBC,KAAKnF,MAAvBkF,cACFvB,EAAayB,GAAYzB,aACzB0B,EAAaD,GAAYxB,iBAC3BqB,GAAkB,EAElBtB,GAAcuB,GACZG,EAAWX,eAAiBQ,EAAcI,OAAOZ,eACnDO,GAAkB,GAItBE,KAAKI,SAAS,CACZP,SAAS,EACTrB,WAAYA,EACZsB,gBAAiBA,I,qIAIX,IAAD,SACmCE,KAAKnF,MAA5BwF,EADZ,EACCC,UAAyBC,EAD1B,+BAE0CP,KAAKJ,MAA9CC,EAFD,EAECA,QAASrB,EAFV,EAEUA,WAAYsB,EAFtB,EAEsBA,gBAE7B,OAAID,EACK,yBAAKW,UAAU,WAAf,cAIP,kBAAC,IAAD,iBAAWD,EAAX,CAAiBE,OAAQ,WACvB,OAAKjC,EAEOsB,EAGL,kBAACO,EAAc,EAAKxF,OAFlB,kBAAC,GAAD,MAFA,kBAAC,IAAD,CAAU6F,GAAI,CAAEC,SAAU,eAAgBf,MAAO,CAAEgB,KAAM,EAAK/F,MAAMgG,qB,GAxC1DR,a,SCSrBrF,GAAY,CAChB8F,MAAO,MACPC,SAAU,IACVzF,OAAQ,GACR0F,QAAS,EACTxG,SAAU,GACVyG,OAAQ,OACRC,OAAQ,OACRvG,MAAO,SAGMwG,GAtBM,SAACtG,GAAW,IACvBuG,EAAmCvG,EAAnCuG,WAAYC,EAAuBxG,EAAvBwG,QAASC,EAAczG,EAAdyG,UACvBC,EAAiBD,EAAS,6BAAQtG,IAAR,IAAmBwG,gBAAiBhI,IAApC,6BAAuEwB,IAAvE,IAAkFwG,gBAAiBhI,IAEnI,OACE,yBAAKuB,MAAO,CAAEL,UAAW,SAAU+G,WAAY,WAC7C,4BAAQJ,QAASA,EAAStG,MAAOwG,EAAgBG,UAAWJ,GAAYF,K,ohUCNvE,IAAMO,GAAYC,KAAOC,IAAV,KAIFrI,GAOPsI,GAAcF,KAAOG,IAAV,MA4BXC,IAZaJ,KAAOC,IAAV,MAYID,KAAOC,IAAV,KAITpI,EAASE,SAGXsI,GAAcL,KAAOC,IAAV,MAkDXK,IAvCiBN,KAAOC,IAAV,MAeSD,KAAOC,IAAV,MAOND,KAAOO,GAAV,MAOGP,KAAOC,IAAV,MAUMD,KAAOC,IAAV,KAMZpI,EAASC,QAMX0I,GAAkBR,KAAOC,IAAV,MAYfQ,GAAaT,KAAOC,IAAV,MAWVS,GAAOV,KAAOC,IAAV,MAgBJU,GAAcX,KAAOC,IAAV,MA2BXW,IAbWZ,KAAOC,IAAV,MAaMD,KAAOC,IAAV,OAkBXY,GAAeb,KAAOC,IAAV,MAaZa,GAAcd,KAAOC,IAAV,MAYXc,GAAuBf,KAAOC,IAAV,MAepBe,GAAiBhB,KAAOC,IAAV,MAgBdgB,GAAcjB,KAAO9D,MAAV,KAUTrE,EAASG,OAgBXkJ,GAAWlB,KAAOC,IAAV,MAQH,SAAAhH,GAAK,OArBN,SAACA,GAChB,OAAIA,EAAMkI,aACD,UAELlI,EAAMmI,aACD,UAELnI,EAAMoI,aACD,UAEF,UAWkBC,CAASrI,MAQvBsI,GAAgBvB,KAAOC,IAAV,MAcbuB,GAAoBxB,KAAOC,IAAV,MAWjBwB,GAAoBzB,KAAOC,IAAV,MAOjByB,GAAa1B,KAAOC,IAAV,MASV0B,GAAmB3B,KAAOC,IAAV,MAYhB2B,GAAoB5B,KAAOC,IAAV,MAYjB4B,GAAmB7B,KAAOC,IAAV,MAUhB6B,GAAyB9B,KAAOC,IAAV,MAYtB8B,GAAgB/B,KAAOC,IAAV,MAcb+B,GAAoBhC,KAAOC,IAAV,MAcjBgC,GAAiBjC,KAAOkC,IAAV,MAUdC,GAAsBnC,KAAOC,IAAV,MAUnBmC,GAAapC,KAAOC,IAAV,MAaVoC,GAAarC,KAAOC,IAAV,MASVqC,GAAwBtC,KAAO9D,MAAV,MCtZ5BqG,GAAiB,CACrBrD,MAAO,MACPC,SAAU,IACVqD,WAAY,OACZC,YAAa,QAaAC,GArDH,WACV,IAAMC,EAAUC,cACRjF,EAAiBkF,cAAjBlF,aAQR,OACE,kBAAC8D,GAAD,KACE,yBAAKtI,MAAO,CAAEL,UAAW,SAAUwG,OAAQ,gBACzC,yBAAKnG,MAAO,CAAEP,SAAUf,EAASG,QAAjC,wCAGA,yBAAKmB,MAAO,CAAEP,SAAUf,EAASC,MAAOe,WAAY,MAAOiK,WAAY,IAAvE,6BAIF,yBAAK3J,MAAOoJ,IACV,yBAAKQ,IAAKC,EAAQ,KAA8B7J,MAAO,CAAE+F,MAAO,OAAQxF,OAAQ,UAElF,yBAAKP,MAAO,CAAEL,UAAW,SAAUsG,QAAS,eAC1C,yBAAKjG,MAAO,CAAEP,SAAUf,EAASG,MAAOa,WAAY,QAApD,wFAGA,yBAAKM,MAAO,CAAEP,SAAUf,EAASG,MAAOa,WAAY,QAApD,6EAIF,kBAAC,GAAD,CAAc2G,WAAW,yDAAYC,QAAS,WA1BhDkD,EAAQrI,KAAK,CACXyE,SAAS,SAAD,OAAWpB,EAAX,aAyBuD+B,WAAW,M,kBC4D1EuD,GAAiB,CAAErK,SAAU,GAAIuG,SAAU,IAAKD,MAAO,MAAOpG,UAAW,UAEhEoK,GAzFD,WACV,IAAMP,EAAUC,cADA,EAEUO,mBAAS,IAFnB,oBAET5L,EAFS,KAEF6L,EAFE,OAGUD,mBAAS,IAHnB,oBAGT9H,EAHS,KAGFgI,EAHE,KAIR1F,EAAiBkF,cAAjBlF,aAEF2F,EAAYC,uBAAY,WAC1B,IAAK5H,GAAuBpE,GAExB,OADA8L,EAAS,qGACF,EAGX,IAAMG,EAAsBxH,GAAUzE,GAGtC,IAFiBkM,OAAO,KAEVC,KAAKF,GAEf,OADAH,EAAS,qGACF,GAGS,uCAAG,WAAOM,GAAP,SAAA/I,EAAA,sEACNC,KAAMC,IAAI5E,EAAS,6BAAyByN,EAAzB,yBAAqDhG,IAChF5C,MAAK,SAACC,GACH,GAAwB,MAApBA,EAAS7D,OACT,OAAO6D,EAASC,KAAK,MAG5BF,MAAK,SAACG,GACH,GAAIA,EAAQ,CACR,IAAM0I,EAAc,CAChB5M,MAAOkE,EAAOlE,MACd0E,QAASR,EAAOnE,SAChBG,IAAKgE,EAAOhE,IACZD,QAASiE,EAAOjE,QAChBG,KAAM8D,EAAO9D,KACbG,MAAO2D,EAAO3D,MACdF,QAAS6D,EAAO7D,QAChBC,KAAM4D,EAAO5D,KACbuM,UAAU,EACVC,MAAO5I,EAAO6I,IAGlBpB,EAAQrI,KAAK,CACTyE,SAAS,SAAD,OAAWpB,EAAX,UACRK,MAAO,CAAE4F,YAAaA,UAG1BjB,EAAQrI,KAAK,CACTyE,SAAS,SAAD,OAAWpB,EAAX,YACRK,MAAO,CAAEzG,MAAOiM,QAI3BpI,OAAM,SAACC,GACJC,QAAQC,IAAI,QAASF,MAlCV,mFAAH,sDAsCpB2I,CAAeR,KAChB,CAACb,EAASpL,EAAOoG,IAEpB,OACI,kBAAC8D,GAAD,KACI,yBAAKtI,MAAO,CAAE2J,UAAW,SACxBzH,GACG,yBAAKlC,MAAO,CAAE8K,WAAY,aACtB,kBAACC,GAAA,EAAD,CAAOC,QAAQ,UAAU9I,IAGjC,kBAAC,GAAD,CAAOnC,UAAU,yFACjB,yBAAKC,MAAO,CAAEL,UAAW,SAAUsG,QAAS,iBACxC,2BAAOgF,KAAK,MAAMhN,KAAK,QAAQiN,OAAQ,SAACC,GAAD,OAAOlB,EAASkB,EAAEC,OAAOnK,QAAQjB,MAAO8J,GAAgBuB,YAAa,kBAEhH,yBAAKrL,MAAO,CAAEP,SAAUf,EAASG,MAAOa,WAAY,MAAOC,UAAW,SAAU2L,aAAc,QAC1F,yGAGA,4HAIJ,kBAAC,GAAD,CAAcjF,WAAW,qBAAMC,QAAS6D,EAAW5D,WAAW,M,qBC9E3D,O,sCAXbgF,Y,uCAAc,WAAOC,EAASC,GAAhB,eAAAhK,EAAA,6DACN8C,EAAO,CACX,QAAU,gEAAV,OAAyBiH,EAAzB,uBACA,UAAa,MAAQC,EAAUC,QAAQ,IAAK,IAC5C,OAAU,WAJA,SAOChK,KAAM+C,KAAKhI,EAAU,gBAAiB8H,GAPvC,mF,yDCgGVoH,GAAgB,CAAE/L,MAAO,QAASH,SAAUf,EAASG,MAAO+M,eAAgB,aACnEJ,GAxFC,WACd,IAAMhC,EAAUC,cACVoC,GAAQ,UAAYC,KAAKC,MAAsB,IAAhBD,KAAKE,WAAsBC,OAAO,GAFnD,EAGUjC,mBAAS6B,GAHnB,oBAGbL,EAHa,KAGJU,EAHI,OAIMlC,mBAAS,IAJf,oBAIb5L,EAJa,KAIN6L,EAJM,OAKMD,mBAAS,IALf,oBAKb9H,EALa,KAKNgI,EALM,KAMZrF,EAAUsH,cAAVtH,MACAL,EAAiBkF,cAAjBlF,aACRrC,QAAQC,IAAIoJ,GAEZY,qBAAU,WAER,GADAjK,QAAQC,IAAIoJ,GACR3G,EAAO,CAAC,IACFzG,EAAUyG,EAAVzG,MACR6L,EAAS7L,QAEToL,EAAQrI,KAAK,CACXyE,SAAS,SAAD,OAAWpB,OAGtB,CAACK,IAEJuH,qBAAU,WACRjK,QAAQC,IAAIoJ,GACRpN,GAGAiO,GAAWd,YAAYC,EAASpN,KAGnC,CAACoN,EAASpN,IA8Bb,OACE,kBAACkK,GAAD,KACE,yBAAKtI,MAAO,CAAE2J,UAAW,SACxBzH,GACC,yBAAKlC,MAAO,CAAE8K,WAAY,aACxB,kBAACC,GAAA,EAAD,CAAOC,QAAQ,UAAU9I,IAG7B,kBAAC,GAAD,CAAOnC,UAAU,+FACjB,yBAAKC,MAAO,CAAEL,UAAW,SAAUwG,OAAQ,gBACzC,kBAAC,KAAD,CAAgB8E,KAAK,MAAMqB,OAAQ,EAAGC,WAAY,CAAExG,MAAO,OAAQxF,OAAQ,OAAQd,SAAU,OAAQ0G,OAAQ,MAAOxG,UAAW,UAAY6M,SAAU,SAACrB,GAAD,OAtC1I,SAACA,GAEhB,GADAhJ,QAAQC,IAAI+I,GACK,IAAbA,EAAEsB,OACJ,GAAItB,IAAMK,EAAS,CACjB,IAAMf,EAAc,CAClBrM,MAAOA,EACPsM,UAAU,GAGZlB,EAAQrI,KAAK,CACXyE,SAAS,SAAD,OAAWpB,EAAX,UACRK,MAAO,CAAE4F,YAAaA,UAGxBP,EAAS,uFAGXA,EAAS,IAqBqJwC,CAASvB,OAEvK,yBAAKnL,MAAO,CAAE2J,UAAW,QAInB,KAEN,yBAAK3J,MAAO,CAAEL,UAAW,WACvB,uBAAGgN,KAAK,IAAIrG,QA1BF,SAAC6E,GACfA,EAAEyB,iBACF,IAAMf,GAAQ,UAAYC,KAAKC,MAAsB,IAAhBD,KAAKE,WAAsBC,OAAO,GACvEC,EAAWL,GACX3B,EAAS,KAsByB3D,WAAW,EAAMvG,MAAO2L,IAAtD,+E,6BCpCFkB,GAAW,CACftM,OAAQ,GACRwF,MAAO,MACPC,SAAU,IACV8G,QAAS,OACTC,cAAe,MACf5G,OAAQ,oBACR1G,SAAU,GACVG,MAAO,QACPoN,eAAgB,SAChBC,UAAW,UAEPC,GAAoB,CACxB3M,OAAQ,OACRwF,MAAO,MACP+G,QAAS,OACTC,cAAe,SACfzD,YAAa,GAGT6D,GAAgB,CACpB5M,OAAQ,GACRwF,MAAO,OACP+G,QAAS,OACTpG,WAAY,SACZsG,eAAgB,UAOHI,GApFU,SAACtN,GAAW,IAE3BuN,EAAiBvN,EAAjBuN,aAsCR,OACE,yBAAKrN,MAAO6M,IAtCG,CAAC,uCAAU,2BAAQ,gBAwCrBS,KAAI,SAAC/L,EAAMgM,GAClB,OAvCY,SAACC,EAAMD,GACzB,IAAIvN,EAAK,gBAAQmN,IACjB,OAAII,GAASF,GACXrN,EAAK,6BAAQA,GAAR,IAAeyG,gBAAiBhI,IAEnC,yBAAKuB,MAAOkN,IACV,yBAAKlN,MAAOA,GACTwN,GAGDD,IAAUF,EACR,yBAAKrN,MAAO,CAAEO,OAAQ,EAAGwF,MAAO,OAAQU,gBAAiB,UAAWkD,UAAW,KAE/E,QAKR3J,EAAK,6BAAQA,GAAR,IAAeyG,gBAAiBhI,IAEnC,yBAAKuB,MAAOkN,IACV,yBAAKlN,MAAOA,GACTwN,GAGDD,IAAUF,EACR,yBAAKrN,MAAO,CAAEO,OAAQ,EAAGwF,MAAO,OAAQU,gBAAiB,aAEzD,OAWGgH,CAAYlM,EAAMgM,Q,uSCjCnC,IAuQMG,GAA0B,CAAE3H,MAAO,OAAQ+G,QAAS,OAAQC,cAAe,SAAUC,eAAgB,SAAU1B,aAAc,GAC7HqC,GAA6B,CAAE5H,MAAO,MAAO+G,QAAS,OAAQC,cAAe,MAAOrG,WAAY,UAChGkH,GAAa,CAAEnO,SAAUf,EAASG,MAAOkH,MAAO,OAAQ8H,YAAa,EAAGvC,cAAe,GACvFwC,GAAgBjH,KAAO9D,MAAV,KAOAtE,GAOJsP,GAxRD,WACZ,IAAMvE,EAAUC,cACR5E,EAAUsH,cAAVtH,MAFU,EAGQmF,mBAAS,IAHjB,oBAGXnM,EAHW,KAGJmQ,EAHI,OAIYhE,mBAAS,IAJrB,oBAIXzH,EAJW,KAIF0L,EAJE,OAKIjE,mBAAS,IALb,oBAKXjM,EALW,KAKNmQ,EALM,OAMYlE,mBAAS,IANrB,oBAMXlM,EANW,KAMFqQ,EANE,OAOMnE,mBAAS,IAPf,oBAOX/L,EAPW,KAOLmQ,EAPK,OAQQpE,mBAAS,IARjB,oBAQX5L,EARW,KAQJ6L,EARI,OASYD,mBAAS,IATrB,oBASX9L,EATW,KASFmQ,EATE,OAUMrE,mBAAS,IAVf,oBAUX7L,EAVW,KAULmQ,EAVK,OAWctE,oBAAS,GAXvB,oBAWXU,EAXW,KAWD6D,EAXC,OAYQvE,qBAZR,oBAYXW,EAZW,KAYJ6D,EAZI,OAaYxE,mBAAS,gBAbrB,oBAaXyE,EAbW,KAaFC,EAbE,OAcsB1E,mBAAS,IAd/B,oBAcXhI,GAdW,KAcG2M,GAdH,QAe0B3E,mBAAS,IAfnC,sBAeX1H,GAfW,MAeKsM,GAfL,SAgBkB5E,mBAAS,IAhB3B,sBAgBXlJ,GAhBW,MAgBC+N,GAhBD,SAiB0B7E,mBAAS,IAjBnC,sBAiBX3I,GAjBW,MAiBKyN,GAjBL,SAkBsB9E,mBAAS,IAlB/B,sBAkBX+E,GAlBW,MAkBGC,GAlBH,SAmBQhF,mBAAS,IAnBjB,sBAmBX9H,GAnBW,MAmBJgI,GAnBI,MAoBV1F,GAAiBkF,cAAjBlF,aAGR4H,qBAAU,WACR,GAAIvH,EAAO,CAAC,IACF4F,EAA2B5F,EAA3B4F,YAAawE,EAAcpK,EAAdoK,UACrBjB,EAASvD,EAAY5M,OACrBoQ,EAAWxD,EAAYlI,SACvB2L,EAAOzD,EAAY1M,KACnBoQ,EAAW1D,EAAY3M,SACvBsQ,EAAQ3D,EAAYxM,MACpBgM,EAASQ,EAAYrM,OACrBiQ,EAAW5D,EAAYvM,SACvBoQ,EAAQ7D,EAAYtM,MACpBoQ,EAAY9D,EAAYC,UACxB8D,EAAS/D,EAAYE,OAErBqE,GAAgBC,QAEhBzF,EAAQrI,KAAK,CACXyE,SAAS,SAAD,OAAWpB,QAGtB,CAACK,IAGJuH,qBAAU,WACR,IAAMtL,EAAaJ,KACnBmO,GAAc/N,GAEd,IAAMoO,EAAiB9N,KACvB0N,GAAkBI,GAEH,uCAAG,4BAAAzN,EAAA,sEACWD,KADX,OACVQ,EADU,OAEhB2M,GAAgB3M,GAFA,2CAAH,oDAKfmN,KACC,IAEH/C,qBAAU,YACS,uCAAG,4BAAA3K,EAAA,6DAClBmN,GAAkB,IADA,SAEWvM,GAAkBxE,GAF7B,OAEZyE,EAFY,OAGlBsM,GAAkBtM,GAHA,2CAAH,qDAMjB8M,KACC,CAACvR,IAEJ,IAkCMwR,GAAY,SAAClE,GAEjB,GAAU,iBAANA,EAAY,CACd,IAAMrK,EAAaJ,KACnBmO,GAAc/N,OACT,CACL,IAAMwO,EVvGL,WAKH,IAJA,IAAM3O,EAAY,IAAIC,KAChBC,EAAU,IAAID,KAAK,KAAM,EAAG,GAE5BE,EAAa,GACVC,EAAIJ,EAAWI,GAAKF,EAASE,EAAEwO,YAAYxO,EAAEC,cAAgB,GAAI,CAEtE,IAAIjD,EAAM,CACNkD,MAAOuO,KAAOhM,OAAOzC,EAAG,aACxBG,MAAOsO,KAAOhM,OAAOzC,EAAG,cAE5BD,EAAWK,KAAKpD,GAGpB,OAAO+C,EUyFiB2O,GACtBZ,GAAcS,GAGhBZ,EAAWvD,IAGPhB,GAAYC,uBAAY,WAC5B,IAAMsF,EAAMC,KAAI,CAAEC,WAAW,IACvBC,EAAmB,IAAIC,IAAItR,GAC3BuR,EAAe,GAEfjO,EAAO,CACXjE,MAAOA,QAAgBmS,EACvBzN,QAASA,QAAoByN,EAC7BjS,IAAKA,QAAYiS,EACjBlS,QAASA,QAAoBkS,EAC7B/R,KAAMA,QAAc+R,EACpB5R,MAAOA,QAAgB4R,EACvB9R,QAASA,QAAoB8R,EAC7B7R,KAAMA,GAcF8R,EAAWP,EAAIQ,QAXN,CACbC,SAAU,CAAC,QAAS,UAAW,MAAO,UAAW,OAAQ,QAAS,UAAW,QAC7ElF,KAAM,SACNmF,WAAY,CACVjS,KAAM,CACJ8M,KAAM,SACNzH,OAAQ,YAQd,IAFcyM,EAASnO,GAarB,OAVAK,QAAQC,IAAI6N,EAASI,QACrBJ,EAASI,OAAO/O,SAAQ,SAAAY,GACA,aAAlBA,EAAMoO,QACRP,EAAa5O,KAAK0O,EAAiBlO,IAAIO,EAAMkD,OAAOmL,iBAAmB,MAC5C,WAAlBrO,EAAMoO,SACfP,EAAa5O,KAAb,8JAIJ+I,GAAS6F,GAGXvG,EAAQkC,QAAQ,CACd9F,SAAU4D,EAAQ1D,SAASF,SAC3Bf,MAAO,CACL4F,YAAa,CACX5M,MAAOA,EACP0E,QAASA,EACTxE,IAAKA,EACLD,QAASA,EACTG,KAAMA,EACNG,MAAOA,EACPF,QAASA,EACTC,KAAMA,EACNuM,SAAUA,EACVC,MAAOA,GAETsE,UAAWF,MAIfvF,EAAQrI,KAAK,CACXyE,SAAS,SAAD,OAAWpB,GAAX,WACRK,MAAO,CACL4F,YAAa,CACX5M,MAAOA,EACP0E,QAASA,EACTxE,IAAKA,EACLD,QAASA,EACTG,KAAMA,EACNG,MAAOA,EACPF,QAASA,EACTC,KAAMA,EACNuM,SAAUA,EACVC,MAAOA,GAETsE,UAAWF,QAGd,CAACvF,EAAS3L,EAAO0E,EAASxE,EAAKD,EAASG,EAAMG,EAAOF,EAASC,EAAMuM,EAAUC,IAEjF,OACE,kBAACrC,GAAD,KACGpG,IACC,yBAAKlC,MAAO,CAAE8K,WAAY,aACxB,kBAACC,GAAA,EAAD,CAAOC,QAAQ,UAAU9I,KAG7B,kBAAC,GAAD,CAAkBmL,aAAc,IAChC,yBAAKrN,MAAO,CAAE2J,UAAW,QACzB,kBAAC,GAAD,CAAO5J,UAAU,+FACjB,yBAAKC,MAAO,CAAE2J,UAAW,QACzB,yBAAK3J,MAAO,CAAE+F,MAAO,MAAOC,SAAU,IAAKqD,WAAY,OAAQC,YAAa,SAC1E,yBAAKtJ,MAAO0N,IACV,2BAAO1N,MAAO4N,IAAd,4BACA,kBAAC,KAAD,CAAiB3M,MAAOpD,EAAQ,CAAC,CAAEqD,MAAOrD,EAAOoD,MAAOpD,IAAW,KAAM2S,aAAa,EAAMC,cAAc,EAAMC,QAAS1O,GACvHwK,SAAU,SAACvL,GAAD,OA5IhB+M,GAJmB7C,EAgJsBlK,GA5IhCkK,EAAElK,MAFF,SAKXgN,EAAW,IAPS,IAAC9C,GAgJ8B1F,UAAW,mBAE1D,yBAAKzF,MAAO0N,IACV,2BAAO1N,MAAO4N,IAAd,gBACA,kBAAC,KAAD,CAAiB3M,MAAOsB,EAAU,CAAC,CAAErB,MAAOqB,EAAStB,MAAOsB,IAAa,KAAMiO,aAAa,EAAMC,cAAc,EAAMC,QAASpO,GAC7HkK,SAAU,SAACvL,GA3IG,IAACkK,EAIrB8C,GAJqB9C,EA2IsBlK,GAvIhCkK,EAAElK,MAFF,KAyIwCwE,UAAW,mBAE5D,yBAAKzF,MAAO0N,IACV,yBAAK1N,MAAO2N,IACV,2BAAO3N,MAAO4N,IAAd,gBACA,2BAAO5N,MAAO4N,IAAd,gBACA,2BAAO3C,KAAK,QAAQhN,KAAK,QAAQgD,MAAO,eAAMwN,QAAqB,iBAAZA,EAAkBjC,SAAU,SAACrB,GAAD,OAAOkE,GAAUlE,EAAEC,OAAOnK,UAC7G,2BAAOjB,MAAO4N,IAAd,gBACA,2BAAO3C,KAAK,QAAQhN,KAAK,QAAQgD,MAAO,eAAMwN,QAAqB,iBAAZA,EAAkBjC,SAAU,SAACrB,GAAD,OAAOkE,GAAUlE,EAAEC,OAAOnK,WAE/G,kBAAC,KAAD,CAAiBA,MAAOlD,EAAM,CAAC,CAAEmD,MAAOnD,EAAKkD,MAAOlD,IAAS,KAAMyS,aAAa,EAAMC,cAAc,EAAMC,QAAS5P,GACjH0L,SAAU,SAACvL,GA9ID,IAACkK,EAIjB+C,GAJiB/C,EA8IsBlK,GA1IhCkK,EAAElK,MAFF,KA4IwCwE,UAAW,mBAExD,yBAAKzF,MAAO0N,IACV,2BAAO1N,MAAO4N,IAAd,4BACA,kBAAC,KAAD,CAAiB3M,MAAOnD,EAAU,CAAC,CAAEoD,MAAOpD,EAASmD,MAAOnD,IAAa,KAAM0S,aAAa,EAAMC,cAAc,EAAMC,QAASrP,GAC7HmL,SAAU,SAACvL,GA3IG,IAACkK,EAIrBgD,GAJqBhD,EA2IsBlK,GAvIhCkK,EAAElK,MAFF,KAyIwCwE,UAAW,mBAE5D,yBAAKzF,MAAO,CAAE2J,UAAW,SACzB,6BACE,2BAAO3J,MAAO4N,IAAd,gBACA,kBAACE,GAAD,CAAezC,YAAa,iCAASsF,aAAc1S,EAAMgN,KAAK,OAAOhN,KAAK,OAAOiN,OAAQ,SAACC,GAAD,OAAOiD,EAAQjD,EAAEC,OAAOnK,WAEnH,6BACE,2BAAOjB,MAAO4N,IAAd,4BACA,kBAACE,GAAD,CAAezC,YAAa,2BAAQsF,aAAcvS,EAAO6M,KAAK,MAAMhN,KAAK,QAAQiN,OAAQ,SAACC,GAAD,OAAOlB,EAASkB,EAAEC,OAAOnK,QAAQ2P,UAAU,KAEtI,6BACE,2BAAO5Q,MAAO4N,IAAd,gBACA,kBAACE,GAAD,CAAezC,YAAa,uCAAUsF,aAAczS,EAAS+M,KAAK,OAAOhN,KAAK,UAAUiN,OAAQ,SAACC,GAAD,OAAOkD,EAAWlD,EAAEC,OAAOnK,WAE7H,6BACE,2BAAOjB,MAAO4N,IAAd,8CACA,kBAACE,GAAD,CAAezC,YAAa,mBAAoBsF,aAAcxS,EAAM8M,KAAK,OAAOhN,KAAK,OAAOiN,OAAQ,SAACC,GAAD,OAAOmD,EAAQnD,EAAEC,OAAOnK,YAGhI,yBAAKjB,MAAO,CAAE2J,UAAW,SACzB,kBAAC,GAAD,CAActD,WAAW,qBAAMC,QAAS,kBAAM6D,MAAa5D,WAAW,IACtE,yBAAKvG,MAAO,CAAE2J,UAAW,W,UCjRlBkH,GAAc,CACzBhT,MAAO,2BACP0E,QAAS,eACTxE,IAAK,eACLD,QAAS,4BAGEgT,GAAkB,CAC7B7S,KAAM,qBACNG,MAAO,2BACPF,QAAS,eACTC,KAAM,8CAGK4Q,GAAe,CAC1B,CAAEgC,SAAU,uCAAUC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC/D,CAAEH,SAAU,uCAAUC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC/D,CAAEH,SAAU,2BAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,qBAAOC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC5D,CAAEH,SAAU,gBAAOC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC5D,CAAEH,SAAU,gBAAOC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC5D,CAAEH,SAAU,gBAAOC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC5D,CAAEH,SAAU,gBAAOC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC5D,CAAEH,SAAU,gBAAOC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC5D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,MAC7D,CAAEH,SAAU,iBAAQC,MAAO,KAAMC,YAAa,GAAIC,UAAW,OAGlDC,GAAkB,CAC7BtH,EAAQ,KACRA,EAAQ,KACRA,EAAQ,IACRA,EAAQ,IACRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,IACRA,EAAQ,IACRA,EAAQ,IACRA,EAAQ,IACRA,EAAQ,IACRA,EAAQ,KAIGuH,GAAqB,CAAC,EAAG,EAAG,EAAG,G,4RCjE5C,IAgEMC,GAAO,SAAC,GAA4E,IAA1EC,EAAyE,EAAzEA,UAAW/P,EAA8D,EAA9DA,KAAMgM,EAAwD,EAAxDA,MAAOgE,EAAiD,EAAjDA,iBAAkBC,EAA+B,EAA/BA,WAAYC,EAAmB,EAAnBA,aAG9DC,EAAaN,GAAmBO,SAASpE,GAE/C,OACE,wBAAIvN,MAAO4R,GAAe9N,IAAKyJ,EAAMsE,YACnC,yBAAK7R,MAAO,CAAEO,OAAQ,KAAMuM,QAAS,OAAQC,cAAe,MAAOrG,WAAY,SAAUsG,eAAgB,WACvG,yBAAKhN,MAAO,CAAEP,SAAU,GAAIG,MAAO,YAChC2B,EAAKwP,UAGNW,EACE,yBAAK1R,MAAO,CAAEP,SAAU,GAAIG,MAAOnB,EAAiB0H,OAAQ,gBAA5D,UAIA,MAIJsL,EACE,2BACEK,OAAO,UACPlH,GAAG,wBACHK,KAAK,OACL8G,QAAQ,EACRvF,SAAU,SAACrB,GAAD,OAAOmG,EAAUnG,MAG7B,KAEJ,2BAAO6G,QAAQ,wBAAwBhS,MAAOoJ,GAAgB9C,QAAS,kBAAMiL,EAAiBhE,KAC5E,OAAfhM,EAAKyP,MACJ,yBAAKpH,IAAKrI,EAAKyP,MAAOhR,MAAO,CAAEO,OAAQ,OAAQwF,MAAO,OAAQkM,UAAW,aAEzE,6BACE,yBAAKrI,IAAKuH,GAAgB5D,GAAQvN,MAAO,CAAEO,OAAQ,MAAOwF,MAAO,MAAOkM,UAAW,QAASC,YAAa,YAK7GT,EACE,kBAACU,GAAD,CACElH,KAAK,OACLI,YAAa,eACbpK,MAAOM,EAAK0P,YACZzE,SAAUjL,EAAK0P,YAAYxE,OA7CnB,IA6CwCtK,QAAQC,IAAI,iBAAmBoP,EAC/ElL,QAAS,kBAAMiL,EAAiBhE,MAGlC,uBAAGvN,MAAOoS,IAAmB7Q,EAAK0P,eAMtCoB,GAAiB,CACrB7R,SAAU,SACVsM,QAAS,OACTC,cAAe,MACfC,eAAgB,SAChBsF,SAAU,OACVrM,QAAS,GAGL2L,GAAgB,CACpB7L,MAAO,IACPxF,OAAQ,IACRkG,gBAAiB,QACjB8L,UAAW,OACXpM,OAAQ,QACRjG,SAAU,WACV4M,QAAS,OACTC,cAAe,UAIX3D,GAAiB,CACrBrD,MAAO,OACPxF,OAAQ,MACRZ,UAAW,SACXuG,OAAQ,uBAGJiM,GAAsBtL,KAAO2L,SAAV,MAcnBJ,GAAmB,CACvBnM,QAAS,EACT1F,OAAQ,MACRwF,MAAO,OACP+G,QAAS,OACT3G,OAAQ,SACR1G,SAAU,GACVyG,OAAQ,uBAGKuM,GA7KE,SAAA3S,GAAS,IAGhB4S,EAA4E5S,EAA5E4S,2BAA4BC,EAAgD7S,EAAhD6S,8BAA+BlB,EAAiB3R,EAAjB2R,aAH3C,EAIkBzH,mBAAS,GAJ3B,oBAIjB4I,EAJiB,KAIFrB,EAJE,KAMlBD,EAAYlH,uBAAY,SAACrB,GAC7B,GAAgC,IAA5BA,EAAIqC,OAAOyH,MAAMpG,OAAc,CACjC,IAAMyE,EAAYnI,EAAIqC,OAAOyH,MAAM,GAC7BC,EAAWC,IAAIC,gBAAgBjK,EAAIqC,OAAOyH,MAAM,IAClD9D,EAAe2D,EACnB3D,EAAa6D,GAAb,MAAuCE,EACvC/D,EAAa6D,GAAb,UAA2C1B,EAC3CyB,EAA8B,aAAI5D,OAEnC,CAAC6D,IAEEpB,EAAapH,uBAAY,SAACoD,GAC9B,IAAMyF,EAAazF,EAAKpC,OAAOnK,MAC3B8N,EAAe2D,EACnB3D,EAAa6D,GAAb,YAA6CK,EAC7CN,EAA8B,aAAI5D,OAGpC,OACE,6BACE,wBAAI/O,MAAOqS,IAEPK,GAA8BA,EAA2BzG,MAAM,EAAG,GAAGqB,KAAI,SAAC/L,EAAM2R,GAAP,OACvE,kBAAC,GAAD,CAAM5B,UAAWA,EAAW/P,KAAMA,EAAMgM,MAAO2F,EAAK3B,iBAAkBA,EAAkBC,WAAYA,EAAYC,aAAcA,QAMlIA,EACE,yBAAKzR,MAAO,CACVE,SAAU,WAAYP,UAAW,SAAUwG,OAAQ,cAAe1G,SAAUf,EAASG,MAAOa,WAAY,SAExG,qHAGA,0JAKF,KAEJ,wBAAIM,MAAOqS,IAEPK,GAA8BA,EAA2BzG,MAAM,EAAGyG,EAA2BjG,QAAQa,KAAI,SAAC/L,EAAM2R,GAC9G,IAAM3F,EAAQ2F,EAAM,EACpB,OACE,kBAAC,GAAD,CAAM5B,UAAWA,EAAW/P,KAAMA,EAAMgM,MAAOA,EAAOgE,iBAAkBA,EAAkBC,WAAYA,EAAYC,aAAcA,UCsCjI0B,GAAU,CACrBpN,MAAO,OACPxF,OAAQ,OACRC,SAAU,SACViG,gBAAiB,WAGJ2M,GA7FA,SAAAtT,GACb,IAAM0J,EAAUC,cACR5E,EAAUsH,cAAVtH,MACA4F,EAA2B5F,EAA3B4F,YAAawE,EAAcpK,EAAdoK,UAHC,EAI8CjF,mBAAS+E,IAJvD,oBAIf2D,EAJe,KAIaC,EAJb,OAKgB3I,mBAAS,IALzB,oBAKfqJ,EALe,KAKFC,EALE,OAMItJ,mBAAS,IANb,oBAMf6I,EANe,KAMRU,EANQ,OAOIvJ,mBAAS,IAPb,oBAOf9H,EAPe,KAORgI,EAPQ,KAQd1F,EAAiBkF,cAAjBlF,aAER4H,qBAAU,WACJ6C,GACF0D,EAA8B1D,KAE/B,CAACpK,IAEJ,IAAM2O,EAAcpJ,uBAAY,WAC9B,IAAMqJ,EAAa,CAAEhJ,YAAaA,EAAawE,UAAWyD,GACpDgB,EAAahB,EAA2BpF,KAAI,SAAC/L,GAAD,OAAUA,EAAK2P,aAC3DyC,EAAMC,EAAgBF,GACxBC,EACFzJ,EAASyJ,IAETzJ,EAAS,IACTqJ,EAASG,GACTJ,EAAeG,MAEhB,CAAChJ,EAAaiI,IAEjBtG,qBAAU,WAEJyH,OAAOC,KAAKT,GAAa5G,SAC3BjD,EAAQkC,QAAQ,CACd9F,SAAU4D,EAAQ1D,SAASF,SAC3Bf,MAAO,CAAE4F,YAAa4I,EAAY5I,YAAawE,UAAWoE,EAAYpE,aAGxEzF,EAAQrI,KAAK,CACXyE,SAAS,SAAD,OAAWpB,EAAX,YACRK,MAAO,CAAE4F,YAAa4I,EAAY5I,YAAawE,UAAWoE,EAAYpE,gBAGzE,CAACoE,EAAaR,IAEjB,IAOMe,EAAkB,SAACF,GACvB,IAAMK,EAA4B,GAGlC,OAFA3C,GAAmB9D,KAAI,SAACC,GAAD,OAAYmG,EAAWnG,IAAUwG,EAA0B5S,KAAKoM,MAEnFwG,EAA0BtH,OAAS,EAC9B,mGAEF,MAGT,OACE,yBAAKhH,UAAW0N,IACd,kBAAC,GAAD,CAAkB9F,aAAc,IAChC,yBAAKrN,MAAO,CAAE2J,UAAW,SACzB,kBAAC,GAAD,CAAO5J,UAAW,+FAClB,kBAAC,GAAD,CAAOA,UAAW,4DAClB,yBAAKC,MAAO,CAAE2J,UAAW,QACzB,kBAAC,GAAD,CACE+I,2BAA4BA,EAC5BC,8BAA+BA,EAC/BlB,cAAc,IAEhB,yBAAKzR,MAAO,CAAE2J,UAAW,QACxBzH,GACC,yBAAKlC,MAAO,CAAE8K,WAAY,aACxB,kBAACC,GAAA,EAAD,CAAOC,QAAQ,UAAU9I,GACzB,yBAAKlC,MAAO,CAAE2J,UAAW,SAG7B,kBAAC,GAAD,CAActD,WAAW,qBAAMC,QAAS,kBAAMkN,KAAejN,WAAW,IACxE,yBAAKvG,MAAO,CAAEsL,aAAc,WC2fnB,O,sCAplBb0I,iB,uCAAmB,WAAOrO,EAAI1H,EAAMgW,GAAjB,mBAAAxS,EAAA,4DjBSS,kBiBPpByS,EAFW,gBjBQO,qEiBRP,kFAGbC,EAHa,UAGClW,EAHD,cAIjBkW,GAAsB,OACtBA,GAAmB,gBjBGK,qEiBHL,8JACnBA,GAAmB,yFAAoBF,EAApB,2BACnBE,GAAsB,6JACtBA,GAAsB,OACtBA,GAAsB,kCACtBA,GAAsB,OACtBA,GAAsB,6GAGhB5P,EAAO,CACX,KjBNwB,kBiBOxB,GAAMoB,EACN,QAAWuO,EACX,SANFC,GAAsB,8MAZL,UAqBJzS,KAAM+C,KAAK9H,EAAY,YAAa4H,GArBhC,qF,+DAwBnB6P,c,uCAAgB,WAAOzO,GAAP,mBAAAlE,EAAA,4DjBfY,kBiBiBpByS,EAFQ,gBjBhBU,qEiBgBV,sEAGVC,EAAW,GACfA,GAAmB,gBjBpBK,qEiBoBL,sFACnBA,GAAsB,qLACtBA,GAAsB,OACtBA,GAAmB,kBjBlCI,aiBkCJ,oBACnBA,GAAsB,OACtBA,GAAsB,kCACtBA,GAAsB,OAGhB5P,EAAO,CACX,KjB7BwB,kBiB8BxB,GAAMoB,EACN,QAAWuO,EACX,SANFC,GAAsB,8GAXR,UAoBDzS,KAAM+C,KAAK9H,EAAY,YAAa4H,GApBnC,qF,2DAuBhB8P,S,uCAAW,WAAO1O,EAAI1H,EAAMuG,GAAjB,qBAAA/C,EAAA,4DjBtCiB,kBiBwCpByS,EAFG,gBjBvCe,qEiBuCf,0DjBvCe,qEiB2CV,eACD,gCACD,4BACNI,EAPG,kBjBlDc,aiBkDd,iBAOmC9P,GAC3B,GACX+P,EATG,40KjBvCe,qEiBuCf,slEA4LgDtW,EA5LhD,q/EA2M0GqW,EA3M1G,mohBAqZ0GA,EArZ1G,yoQAKI,gCALJ,+UAMG,4BANH,iTAIK,eAJL,qiDAyhBH/P,EAAO,CACX,KjBhkBwB,kBiBikBxB,GAAMoB,EACN,QAAWuO,EACX,SAAYK,EACZ,SAthBe,IARR,UAiiBI7S,KAAM+C,KAAK9H,EAAY,YAAa4H,GAjiBxC,qF,2DCuKPiQ,GAAgB,CACpBzO,MAAO,OACPwM,UAAW,OACXtM,QAAS,EACToD,WAAY,OAERoL,GAAiB,CAAEhV,SAAU,GAAIsG,MAAO,QACxC2O,GAAsB,CAAEjV,SAAU,GAAIsG,MAAO,OAAQ4O,aAAc,oBAAqB1O,QAAS,GAExF2O,GAhNC,SAAA9U,GACd,IAAM0J,EAAUC,cACR5E,EAAUsH,cAAVtH,MACA4F,EAA2B5F,EAA3B4F,YAAawE,EAAcpK,EAAdoK,UAHE,EAIWjF,oBAAS,GAJpB,oBAIhB6K,EAJgB,KAILC,EAJK,OAKW9K,oBAAS,GALpB,oBAKhB+K,EALgB,KAKLC,EALK,OAMyBhL,mBAAS,IANlC,oBAMhBiL,EANgB,KAMEC,EANF,KAOf1Q,EAAiBkF,cAAjBlF,aACF2Q,EAAiB,GAEvB/I,qBAAU,WACJyH,OAAOC,KAAKrJ,GAAagC,QAC3B2I,IACGxT,MAAK,SAACyT,GACLH,EAAoBG,GACpBP,GAAa,QAGlB,CAACrK,IAGJ,IAAM2K,EAAmB,WACvB,OAAO,IAAIE,SAAQ,SAACC,GAClB,IAAMxG,EAAe,GACrBE,GAAa4E,OAAOC,KAAK7E,GAAW3B,KAAI,SAAC/L,GACvC,IAAMiU,EAAMvG,EAAU1N,GACtB,GAAIiU,EAAIxE,MAAO,CACb,IAAMqE,EAAW,CAAEtE,SAAUyE,EAAIzE,SAAUC,MAAOwE,EAAIxE,MAAOC,YAAauE,EAAIvE,YAAaC,UAAWsE,EAAItE,WAC1GnC,EAAa5N,KAAKkU,OAGtBE,EAAQxG,OAIN0G,EAAiB,uCAAG,gCAAAhU,EAAA,sEACHiU,EAAYzG,GADT,OAExB,IADMlN,EADkB,kBAEfhB,GACP,IAAMsU,EAAWpG,EAAU0G,MAAK,SAAAC,GAAC,OAAIA,EAAE7E,WAAahP,EAAOhB,GAAG8U,aAC1DR,GACFF,EAAehU,KAAK,CAAE2C,IAAK/B,EAAOhB,GAAG+C,IAAKmN,YAAaoE,EAASpE,eAH3DlQ,EAAI,EAAGA,EAAIgB,EAAO0K,OAAQ1L,IAAM,EAAhCA,GAFe,2CAAH,qDAUjB2U,EAAW,uCAAG,WAAOzG,GAAP,iBAAAxN,EAAA,sDAElB,IADM2D,EAAS,IAAI0Q,SACV/U,EAAI,EAAGA,EAAIkO,EAAUxC,OAAQ1L,IAChCkO,EAAUlO,GAAGmQ,WACf9L,EAAO2Q,OAAO9G,EAAUlO,GAAGgQ,SAAU9B,EAAUlO,GAAGmQ,WAJpC,gBAQJxP,KAAM+C,KAAK3H,EAAYsI,EACnC,CACE4Q,QAAS,CACP,eAAgB,yBAXJ,uCAaZlU,MAbY,2CAAH,sDAgBXmU,EAAQ,uCAAG,WAAO9K,GAAP,qBAAA1J,EAAA,6DAEfuT,GAAa,GAFE,kBAKPS,IALO,uBAOgB/T,KAAM+C,KAAK7H,EAAa,aACnD,CACEqB,KAAMwM,EAAYxM,KAClBG,MAAOqM,EAAYrM,MACnBF,QAASuM,EAAYvM,QACrBC,KAAMsM,EAAYtM,OAZT,UAOP+X,EAPO,OAeTC,EAAS,EACPC,EAAO9S,MACTmH,EAAYC,SAjBH,kCAmBiBhJ,KAAM+C,KAAK5H,EAAa,YAClD,CACEgB,MAAO4M,EAAY5M,MACnBD,SAAU6M,EAAYlI,QACtBxE,IAAK0M,EAAY1M,IACjBD,QAAS2M,EAAY3M,QACrBuY,QAASH,EAAepU,KAAKwU,SAC7BtY,OAAQ,EACRwG,aAAcA,EACd+R,YAAaH,EACbI,cAAeJ,EACfxL,GAAIH,EAAYE,QA9BT,eAiCXwL,EAAS1L,EAAYE,MAjCV,yCAoCiBjJ,KAAM+C,KAAK7H,EAAa,YAClD,CACEiB,MAAO4M,EAAY5M,MACnBD,SAAU6M,EAAYlI,QACtBxE,IAAK0M,EAAY1M,IACjBD,QAAS2M,EAAY3M,QACrBuY,QAASH,EAAepU,KAAKwU,SAC7BtY,OAAQ,EACRwG,aAAcA,EACdiS,YAAaL,EACbG,YAAaH,EACbI,cAAeJ,IA/CR,QAoCLM,EApCK,OAkDXP,EAASO,EAAc5U,KAAKwU,SAlDjB,yBAqDP5U,KAAM+C,KAAK7H,EAAa,WAC5B,CACE+Z,OAAQxB,EACRgB,OAAQA,IAxDC,yBA2DPS,GAAa5C,iBAAiB,CAACvJ,EAAYtM,MAAOsM,EAAYxM,KAAMkY,GA3D7D,yBA4DPzU,KAAMC,IAAI5E,EAAS,mCAA+ByH,IACrD5C,MAAK,SAACC,GACL,GAAwB,MAApBA,EAAS7D,OACX,OAAO6D,EAASC,KAAK,MAGxBF,MAAK,SAACG,GACL6U,GAAaxC,cAAc,CAACrS,EAAO5D,UAEpC8D,OAAM,SAACC,GACNC,QAAQC,IAAI,QAASF,MAtEZ,QAyEb8S,GAAa,GACbxL,EAAQrI,KAAK,CACXyE,SAAS,SAAD,OAAWpB,EAAX,WACRK,MAAO,CACLoP,cAAekC,KA7EN,kDAkFbhU,QAAQC,IAAR,MAlFa,0DAAH,sDA0FRyU,EAAiB,SAACC,GACtB,OAAOjD,OAAOC,KAAKgD,GAAUxJ,KAAI,SAACpM,EAAO4C,GAAR,OAC/B,wBAAIA,IAAKA,EAAI+N,WAAY7R,MAAO,CAAEiG,QAAS,EAAGF,MAAO,MAAO+G,QAAS,OAAQC,cAAe,SAAU1D,WAAY,QAChH,yBAAKrJ,MAAOyU,IACTqC,EAAS5V,IAEZ,yBAAKlB,MAAO0U,IACTjK,EAAYvJ,SAMrB,OAAI2T,EAEA,6BACE,yBAAK7U,MAAO,CAAE2J,UAAW,SACzB,kBAAC,GAAD,CAAO5J,UAAU,+CACjB,yBAAKC,MAAO,CAAE2J,UAAW,SACzB,yBAAK3J,MAAO,CAAEL,UAAW,WAAzB,kBAOF,yBAAK8F,UAAW0N,IACd,kBAAC,GAAD,CAAkB9F,aAAc,IAChC,yBAAKrN,MAAO,CAAE2J,UAAW,SACzB,kBAAC,GAAD,CAAO5J,UAAU,iHACjB,yBAAKC,MAAO,CAAE2J,UAAW,QACzB,wBAAI3J,MAAOwU,IAAX,IAA4BqC,EAAehG,KAC3C,yBAAK7Q,MAAO,CAAE2J,UAAW,QACzB,wBAAI3J,MAAOwU,IAAX,IAA4BqC,EAAe/F,KAC3C,yBAAK9Q,MAAO,CAAE2J,UAAW,QACzB,kBAAC,GAAD,CACE+I,2BAA4BuC,EAC5BtC,8BAA+B,aAC/BlB,cAAc,IAEhB,yBAAKzR,MAAO,CAAE2J,UAAW,QACzB,kBAAC,GAAD,CAActD,WAAW,eAAKC,QAAS,kBAAM2P,KAAY1P,WAAYwO,IACrE,yBAAK/U,MAAO,CAAE2J,UAAW,UC/J3BP,GAAiB,CACrBrD,MAAO,MACPC,SAAU,IACVqD,WAAY,OACZC,YAAa,QAGAyN,GArDA,SAACjX,GACd,IAAM0J,EAAUC,cAGRjF,GAFU2H,cAAVtH,MACAoP,cACiBvK,cAAjBlF,cAEQ4F,uBAAY,WAC1BZ,EAAQrI,KAAK,CACXyE,SAAS,SAAD,OAAWpB,OAEpB,IAEH,OACE,6BACE,kBAAC,GAAD,CAAkB6I,aAAc,IAChC,yBAAKrN,MAAO,CAAE2J,UAAW,SACzB,kBAAC,GAAD,CAAO5J,UAAU,iEACjB,kBAAC,GAAD,CAAOA,UAAU,6HACjB,yBAAKC,MAAO,CAAE2J,UAAW,SACzB,yBAAK3J,MAAOoJ,IACV,yBAAKQ,IAAKC,EAAQ,KAAmC7J,MAAO,CAAE+F,MAAO,OAAQxF,OAAQ,Y,oBCnBhFyW,GAAS,WACpB,IAAMC,EAAO/R,GAAYxB,iBACnBc,EAAeyS,EAAOA,EAAKzS,aAAe,KAChD,GAAKA,EAQE,CAEL,IAAMkM,EAAU,CACd,CACElD,KAAM,2BACN5H,SAAS,UAAD,OAAYpB,EAAZ,gBAEV,CACEgJ,KAAM,6CACN5H,SAAS,UAAD,OAAYpB,EAAZ,kBAEV,CACEgJ,KAAM,iCACN5H,SAAU,kBAId,OACE,kBAACmB,GAAD,KACE,kBAAC,GAAD,MACA,yBAAK/G,MAAO,CAAEO,OAAQ,GAAIwF,MAAO,OAAQsD,WAAY,GAAIyD,QAAS,OAAQC,cAAe,SAAUC,eAAgB,WACjH,yBAAKhN,MAAO,CAAEP,SAAUf,EAASG,QAAjC,wCAGA,yBAAKmB,MAAO,CAAEP,SAAUf,EAASE,OAAQc,WAAY,WAArD,6BAIF,yBAAKM,MAAO,CAAE+F,MAAO,OAAQxF,OAAQ,GAAIkG,gBAAiB,UAAWqG,QAAS,OAAQC,cAAe,MAAOrG,WAAY,WACtH,kBAAC,IAAD,CACEf,GAAI,CACFC,SAAS,UAAD,OAAYpB,IAEtBxE,MAAO,CAAEJ,MAAO,OAAQmG,MAAO,OAAQxF,OAAQ,SAE/C,kBAAC0G,GAAD,eACMgQ,EAAKhZ,KADX,aAKF,kBAACiJ,GAAD,KACE,kBAAC,GAAD,CAAUwJ,QAASA,OAhD3B,OACE,kBAAC3J,GAAD,KACE,kBAAC,GAAD,MACA,kBAACE,GAAD,QAqDFiQ,GAAW,SAACpX,GAAW,IAAD,EACMkK,oBAAS,GADf,oBACnBmN,EADmB,KACTC,EADS,KAG1B,OACE,wBAAIpX,MAAO,CAAEuS,UAAW,OAAQ3S,MAAO,UACrC,yBAAKI,MAAO,CAAEqX,OAAQ,UAAW3Q,WAAY,UAAYJ,QAAS,kBAAM8Q,GAAaD,KACnF,kBAAC,KAAD,CAAcnX,MAAO,CAAE+F,MAAOrH,EAASC,MAAO4B,OAAQ7B,EAASC,OAASiB,MAAM,WAE/EuX,GAAY,kBAAC,GAAD,CAAeG,MAAOxX,EAAM4Q,YAKzC6G,GAAgB,SAACzX,GAErB,IAAM0X,EAAe,SAAC1X,GACpB,OACE,kBAAC,IAAD,CACE6F,GAAI,CACFC,SAAU9F,EAAM8F,UAElB5F,MAAO,CAAEJ,MAAO,OAAQmG,MAAO,OAAQxF,OAAQ,OAAQoJ,UAAW,KAElE,kBAACtB,GAAD,CAAmBrI,MAAO,CAAEqX,OAAQ,YAClC,8BACGvX,EAAM2X,UAET,yBAAKzX,MAAO,CAAEJ,MAAO,UAClBE,EAAM4X,UAET,8BACG5X,EAAM6X,cAOjB,OACE,kBAACvP,GAAD,KAEItI,EAAMwX,OAASxX,EAAMwX,MAAMhK,KAAI,SAAC/L,GAC9B,OACE,kBAACiW,EAAD,CACEC,SAAUlW,EAAKkW,UAAYlW,EAAKkW,SAChCE,UAAWpW,EAAKoW,WAAapW,EAAKoW,UAClC/R,SAAUrE,EAAKqE,SACf9B,IAAKvC,EAAKiM,MAETjM,EAAKiM,WAiBPoK,GAAS,WACpB,IAAMX,EAAO/R,GAAYxB,iBAEzB,OADqBuT,EAAOA,EAAKzS,aAAe,MAY5C,kBAACiD,GAAD,KACE,kBAACC,GAAD,KACE,kBAACC,GAAD,KACE,yBAAK3H,MAAO,CAAEO,OAAQ,IAAKwF,MAAO,MAAO8R,SAAU,IAAKpR,gBAAiB,YAAa9G,UAAW,WAAjG,QAGA,yBAAKK,MAAO,CAAEO,OAAQ,OAAQwF,MAAO,IAAK+G,QAAS,OAAQC,cAAe,SAAU1D,WAAY,KAC9F,yBAAKrJ,MAAO,CAAE8M,QAAS,OAAQC,cAAe,WAC5C,2BAAO/M,MAAO4N,IAAd,mBAGA,2BAAO5N,MAAO4N,IAAd,iEAIF,yBAAK5N,MAAO,CAAE8M,QAAS,OAAQC,cAAe,WAC5C,2BAAO/M,MAAK,6BAAO8X,IAAP,IAAwBxM,cAAe,KAAnD,yFAGA,2BAAOtL,MAAO8X,IAAd,oDAGA,2BAAO9X,MAAO8X,IAAd,iFAGA,2BAAO9X,MAAO8X,IAAd,2FAMN,yBAAK9X,MAAO,CACVO,OAAQ,IAAKsX,SAAU,IAAK/K,QAAS,OAAQC,cAAe,SAAUC,eAAgB,iBAEtF,yBAAKhN,MAAO,CAAEO,OAAQ,OAAQwF,MAAO,MAAO8R,SAAU,IAAK/K,QAAS,OAAQC,cAAe,WAOzF,uBAAG/M,MAAO,CAAEP,SAAU,GAAIC,WAAY,SAAUiK,UAAW,SAA3D,yBpB5La,aoB4Lb,8BAlDR,kBAAClC,GAAD,CAAazH,MAAO,CAAE0G,WAAY,SAAUoG,QAAS,OAAQC,cAAe,MAAOC,eAAgB,WACjG,yBAAKhN,MAAO,CAAEP,SAAUf,EAASqZ,UAAjC,yBpB3ImB,aoB2InB,4BA4DFnK,GAAa,CAAEnO,SAAU,GAAIC,WAAY,UACzCoY,GAAkB,CAAErY,SAAU,GAAIC,WAAY,UAYvCsY,GAAO,WAClB,OACE,kBAACC,GAAA,EAAD,KACE,0BAAMha,KAAK,SAASia,QAAQ,c,8cCnNlC,IAuCaC,GAActR,KAAOuR,OAAV,KAKF3Z,EAYEA,GAKT4Z,GA7DA,SAACvY,GAE6BA,EAAnCwY,SAFiB,IAEPhS,EAAyBxG,EAAzBwG,QAASiS,EAAgBzY,EAAhByY,YAErBC,EAAapO,uBAAY,WACzB9D,GACFA,MAED,CAACA,IAsBJ,OACE,kBAAC6R,GAAD,CAAanY,MArBQ,WACrB,OAAQuY,GACN,IAAK,SACH,MAAO,CACL9R,gBAAiBhI,EACjBmB,MAAO,QACPsG,OAAQ,MACRC,OAAQ,YACR1G,SAAU,IAEd,IAAK,SACH,MAAO,CACLgH,gBAAiB,QACjB7G,MAAOnB,GAEX,QACE,MAAO,IAKSga,GAAkBnS,QAAS,kBAAMkS,MAArD,OAEI1Y,QAFJ,IAEIA,OAFJ,EAEIA,EAAO4X,WC+BFzX,GAAY,CACvB8F,MAAO,QACPxF,OAAQ,QACRuM,QAAS,OACTC,cAAe,SACftG,gBAAiBhI,GAGbqL,GAAiB,CACrBrK,SAAU,GACVwG,QAAS,GACTF,MAAO,IACPxF,OAAQ,GACRkG,gBAAiBhI,EACjByH,OAAQ,qBAcKwS,GArFD,WACZ,IAAMlP,EAAUC,cADE,EAEoBO,mBAAS,IAF7B,oBAEX3F,EAFW,KAEEsU,EAFF,OAGc3O,mBAAS,IAHvB,oBAGX1F,EAHW,KAGDsU,EAHC,OAIQ5O,mBAAS,IAJjB,oBAIX9H,EAJW,KAIJgI,EAJI,KAMZ2O,EAAY,uCAAG,sBAAApX,EAAA,sEACbyD,GAAYd,MAAMC,EAAaC,GAClC1C,MAAK,SAAAG,GACAA,EACFyH,EAAQrI,KAAR,iBAAuBY,IAEvBmI,EAAS,6GAGZjI,OAAM,SAAA0R,GACLxR,QAAQC,IAAIuR,GACZzJ,EAAS,+EAXM,2CAAH,qDAelB,OAEE,yBAAKlK,MAAOC,IACV,kBAAC,GAAD,MACA,kBAACsI,GAAD,KACE,yBAAKvI,MAAO,CAAEP,SAAUf,EAASqZ,QAAS9R,QAAS,MAAO0D,UAAW,KACnE,qEAGA,yBAAK3J,MAAO,CAAEP,SAAUf,EAASoa,QAASpZ,WAAY,WAAtD,4BAGA,yBAAKM,MAAO,CAAEP,SAAUf,EAASqZ,QAASpO,UAAW,KAArD,kBAIDzH,GACC,kBAAC6I,GAAA,EAAD,CAAOC,QAAQ,UAAU9I,GAE3B,6BACE,2BAAO+I,KAAK,cAAchN,KAAK,cAAcoN,YAAY,uCAASH,OAAQ,SAACC,GAAD,OAAOwN,EAAexN,EAAEC,OAAOnK,QAAQjB,MAAK,6BAAO8J,IAAP,IAAuBwB,aAAc,QAE7J,6BACE,2BAAOL,KAAK,WAAWhN,KAAK,WAAWoN,YAAY,iCAAQH,OAAQ,SAACC,GAAD,OAAOyN,EAAYzN,EAAEC,OAAOnK,QAAQjB,MAAO8J,MAEhH,yBAAK9J,MAAO,CAAEL,UAAW,SAAU+G,WAAY,SAAUP,OAAQ,MAAO2G,QAAS,OAAQE,eAAgB,WACvG,kBAAC,GAAD,CAAQ1G,QAAS,kBAAMuS,MAAvB,8BAKJ,kBAAC,GAAD,QCvBSE,GA9BA,WAGb,OAFA7T,GAAYP,SAGV,yBAAK3E,MAAOC,IACV,kBAAC,GAAD,MACA,kBAACsI,GAAD,KACE,yBAAKvI,MAAO,CAAEP,SAAUf,EAASC,MAAOe,WAAY,SAAUuG,QAAS,QAAvE,iBAGA,6BACE,sFACA,yBAAKjG,MAAO,CAAEO,OAAQ,MACtB,yBAAKkF,UAAU,eACb,kBAAC,IAAD,CAAME,GAAG,gBAAT,mD,8IC4GNqT,GAAsB,WAAO,IAAD,EACmBC,OACnD,MAAO,CACLlT,MAH8B,EACxBmT,WAGN3Y,OAJ8B,EACL4Y,cAOvBC,GAAsB,WAAO,IAAD,EACgBpP,mBAASgP,MADzB,oBACzBK,EADyB,KACPC,EADO,KAYhC,OATAlN,qBAAU,WACR,SAASmN,IACPD,EAAoBN,MAItB,OADAC,OAAOO,iBAAiB,SAAUD,GAC3B,kBAAMN,OAAOQ,oBAAoB,SAAUF,MACjD,IAEIF,GAGMK,GApJG,SAAC5Z,GAAW,IACpB6Z,EAA8B7Z,EAA9B6Z,iBAAkBC,EAAY9Z,EAAZ8Z,QADC,EAEU5P,mBAAS,IAFnB,oBAEpB6P,EAFoB,KAEPC,EAFO,OAGe9P,mBAAS,IAHxB,oBAGpB+P,EAHoB,KAGLC,EAHK,OAIehQ,mBAAS,IAJxB,oBAIpBiQ,EAJoB,KAILC,EAJK,OAKKlQ,mBAAS,MALd,oBAKpBmQ,EALoB,KAKVC,EALU,OAMDhB,KAAVrT,GANW,EAMnBxF,OANmB,EAMXwF,OAGhBqG,qBAAU,WACR7N,EAAS+C,SAAQ,SAACC,GAChBwY,EAAc5Y,KAAKI,EAAK,OAE1B8Y,MACC,IAGHjO,qBAAU,WACR,IAAMkO,EAAeC,EAAUV,EAAaD,GAC5CD,EAAiBW,KAChB,CAACV,EAASC,IAEb,IAAMQ,EAAsB,WAC1B,IAAMJ,EAAgB1b,EAAS+O,KAC7B,SAAC/L,GAAD,OACE,kBAACiZ,GAAA,EAAD,CAAkB1W,IAAKvC,EAAK,GAC1BkZ,QAAS,kBAAEC,GAAA,EAAF,CAAWlO,SAAU,WAAQmO,EAAQpZ,EAAK,KAAQkN,QAASsL,EAAca,QAAO,SAAAhF,GAAC,OAAIA,IAAMrU,EAAK,MAAIkL,OAAS,EAAGxL,MAAOM,EAAK,GAAIsZ,KAAK,QAAQjb,MAAM,YAC5JsB,MAAO,0BAAMuE,UAAW,iBAAkBlE,EAAK,SAKrD2Y,EAAiBD,IAGbM,EAAY,SAAC/M,EAAMoM,GACvB,IAAMkB,EAActN,EAAKuN,cACnBT,EAAe,GACfU,EAAe,GAcrB,OAXAjB,EAAczY,SAAQ,SAAAC,GAAI,OAAIyZ,EAAa7Z,KAAKyY,EAAQgB,QAAO,SAAAhF,GAAC,OAAIA,EAAE5X,SAAWuD,SACjFyZ,EAAa1Z,SAAQ,SAAA2Z,GAAI,OAAIA,EAAK3N,KAAI,SAAAkI,GAAG,OAAI8E,EAAanZ,KAAKqU,SAG3C8E,EAAaM,QAAO,SAAA3Z,GAAK,OAC1CA,EAAMpD,MAAMkd,cAAcpJ,SAASmJ,IAClC7Z,EAAMpD,MAAMkd,cAAcpJ,SAASmJ,IACnC7Z,EAAMrD,SAASmd,cAAcpJ,SAASmJ,IACtC7Z,EAAMhD,KAAK8c,cAAcpJ,SAASmJ,IAClC7Z,EAAM/C,QAAQ6c,cAAcpJ,SAASmJ,MAAeI,MAAK,SAACzZ,EAAG0Z,GAAJ,OAAWA,EAAEvQ,GAAKnJ,EAAEmJ,OAK7E+P,EAAUvQ,uBAAY,SAAC7I,GAC3B,IAAMkN,EAAUsL,EAEhBtL,EAAQmM,QAAO,SAAAhF,GAAC,OAAIA,IAAMrU,KAAMkL,OAAS,EACrCgC,EAAQ2M,OAAO3M,EAAQ4M,WAAU,SAAAzF,GAAC,OAAIA,IAAMrU,KAAO,GACnDkN,EAAQtN,KAAKI,GAEjByY,EAAiBvL,GACjB4L,IAEA,IAAMC,EAAeC,EAAUV,EAAaD,GAC5CD,EAAiBW,KAChB,CAACV,EAASC,EAAaE,IAEpBuB,EAAiB,SAACnQ,GACtBiP,EAAYjP,EAAEoQ,gBAOhB,OACE,kBAAC3T,GAAD,KACE,kBAACC,GAAD,KACE,kBAAC,KAAD,MACA,kBAACC,GAAD,CAAauD,YAAa,2EAAgBmB,SAAU,SAACrB,GAAD,OAAO2O,EAAc3O,EAAEC,OAAOnK,WAIlF8E,GAAS,IACP,kBAACoS,GAAD,CAAa7R,QAASgV,GACpB,kBAAC,KAAD,CAAUtb,MAAO,CAAEP,SAAU,GAAI6J,YAAa,GAAK7D,UAAU,cAD/D,0DAKA,kBAAC,KAAD,CAAUhG,SAAS,UAAUgG,UAAU,YAAYa,QAASgV,IAGhE,kBAACE,GAAA,EAAD,CACEC,KAAMC,QAAQvB,GACdA,SAAUA,EACVwB,QAxBkB,WACtBvB,EAAY,OAwBRwB,aAAc,CACZC,SAAU,SACVC,WAAY,UAEdC,gBAAiB,CACfF,SAAU,MACVC,WAAY,WAIZ/V,GAAS,IACP,KAEA,kBAACiW,GAAA,EAAD,+DAKJ,kBAACC,GAAA,EAAD,KACGhC,M,6fClHX,IAuEMiC,GAAa,SAAApc,GACjB,IAAMqc,EAAY,IAAIrM,IAAIvR,GACpB6d,EAAc,IAAItM,IAAIhR,IAGpBgD,EAAsBhC,EAAtBgC,KAAMZ,EAAgBpB,EAAhBoB,MAAOK,EAASzB,EAATyB,KACjBN,EAAQa,EACZ,GAAa,gBAATP,EAAwB,CAC1B,IAAM8a,EAAOpb,EAAMqb,MAAM,KAGzBrb,EAFaob,EAAK,GAEH,IADFA,EAAK,GAAGC,MAAM,IAAK,GAAGC,KAAK,KAI1C,OACE,yBAAKvc,MAAO,CAAE8M,QAAS,OAAQxB,aAAc,EAAGyB,cAAe,MAAOC,eAAgB,aAActG,WAAY,WAC9G,yBAAK1G,MAAO,CAAE+F,MAAO,MAAOtG,SAAUf,EAASG,MAAOe,MAAO,SAAWsB,GAE7D,WAATK,EACE,yBAAKvB,MAAO,CAAE+F,MAAO,MAAOtG,SAAUf,EAASG,MAAOe,MAAO,QAASqG,QAAS,EAAGQ,gBAAgB,GAAD,OAAK2V,EAAYza,IAAIV,IAAUtB,UAAW,SAAU6c,aAAc,IAChKL,EAAUxa,IAAIV,IAGjB,yBAAKjB,MAAO,CAAE+F,MAAO,MAAOtG,SAAUf,EAASG,QAAUoC,KAM7Dwb,GAAM,SAAA3c,GAAU,IACZoB,EAA6BpB,EAA7BoB,MAAOY,EAAsBhC,EAAtBgC,KAAMP,EAAgBzB,EAAhByB,KAAMgM,EAAUzN,EAAVyN,MAC3B,OACE,yBAAKzJ,IAAKyJ,EAAMsE,WAAY7R,MAAO,CAAE8M,QAAS,OAAQxB,aAAc,EAAGyB,cAAe,MAAOC,eAAgB,eAC3G,yBAAKhN,MAAO,CAAE+F,MAAO,MAAOtG,SAAUf,EAASG,MAAOe,MAAO,SAAWsB,GACxE,yBAAKlB,MAAO,CAAE+F,MAAO,MAAOtG,SAAUf,EAASG,QAAmB,YAAT0C,EAAqBO,EAAKP,GAAQ,MAAQO,EAAKP,MAKxGmb,GAAc,WAClB,OACE,yBAAK1c,MAAO,CAAEO,OAAQ,GAAIuM,QAAS,OAAQC,cAAe,MAAOC,eAAgB,aAAcvN,SAAUf,EAASG,MAAOa,WAAY,QACnI,kBAACid,GAAD,KACE,yBAAK3c,MAAO,CAAE+F,MAAO,IAAKU,gBAAiB,UAAW6C,YAAa,EAAGuE,YAAa,GAAIf,QAAS,OAAQpG,WAAY,WAApH,gBACA,yBAAK1G,MAAO,CAAE+F,MAAO,qBAAsBU,gBAAiB,UAAW6C,YAAa,EAAGuE,YAAa,GAAIf,QAAS,OAAQpG,WAAY,WAArI,6BAEF,kBAACkW,GAAD,qDAIAD,GAAkB9V,KAAOC,IAAV,MAQf8V,GAAoB/V,KAAOC,IAAV,MAYR+V,GA7IC,SAAC/c,GAAW,IAElBgd,EAAuChd,EAAvCgd,SAAUC,EAA6Bjd,EAA7Bid,UACVvY,GADuC1E,EAAlBkd,cACJtT,cAAjBlF,cACFyY,EAAwC,2BAAxCA,EAAsD,2BAAtDA,EAAsE,iCAa5E,OACE,yBAAKjd,MAAO,CAAEkd,UAAW,OAAQ5c,OAAQ,KACvC,kBAAC,GAAD,MAEEwc,EAASxP,KAAI,SAACxL,EAAMyL,GAClB,OACE,kBAAC3E,GAAD,KACE,kBAACC,GAAD,KACE,yBAAK7I,MAAO,CAAEO,OAAQ,OAAQwF,MAAO,IAAKkH,UAAW,SAAUhH,QAAS,KAEpEnE,EAAKqb,SACH,uBAAGxQ,KAAM7K,EAAKqb,SAAU/R,OAAO,SAASgS,IAAI,YAC1C,kBAACtU,GAAD,CAAgBc,IAAK9H,EAAKqb,SAAUE,IAAK,mBAG3C,yBAAKzT,IAAKC,EAAQ,KAAoBwT,IAAK,gBAAiBrd,MAAO,CAAEO,OAAQ,OAAQwF,MAAO,OAAQkM,UAAW,YAGrH,yBAAKjS,MAAO,CAAE+F,MAAO,MAAOsD,WAAY,GAAI4D,UAAW,WACrD,yBAAKjN,MAAO,CAAEsL,aAAc,KAC1B,kBAAC,GAAD,CAAY/J,KAAM,cAAeO,KAAMA,EAAK2U,YAAavV,MAAO+b,IAChE,kBAAC,GAAD,CAAY1b,KAAM,OAAQO,KAAMA,EAAK7D,KAAMiD,MAAO+b,KAEpD,kBAAC,GAAD,CAAY1b,KAAM,SAAUO,KAAMA,EAAK9D,OAAQkD,MAAO+b,KAExD,yBAAKjd,MAAO,CAAE+F,MAAO,MAAOsD,WAAY,GAAIC,YAAa,OAAQ2D,UAAW,WAExE4G,OAAOC,KAAKhS,GAAMwL,KAAI,SAAC/L,EAAM2R,GAAP,OACpB6J,EAAUxb,IAAS,kBAAC,GAAD,CAAKL,MAAO6b,EAAUxb,GAAOO,KAAMA,EAAMP,KAAMA,EAAMgM,MAAO2F,SAKvF,kBAAClK,GAAD,KACE,kBAAC,IAAD,CACErD,GAAI,CACFC,SAAS,UAAD,OAAYpB,EAAZ,YAA4B1C,EAAK8I,IACzC/F,MAAO,CAAE/C,KAAMA,IAEjB9B,MAAO,CAAE4L,eAAgB,OAAQhM,MAAO,YAExC,kBAAC,GAAD,mC,kFCuGH0d,GA9JI,SAACxd,GAAW,IACrByd,EAAazd,EAAbyd,SACA/Y,EAAiBkF,cAAjBlF,aAEFgZ,EAAa,SAACjc,GAClB,IAAMmO,EAAMC,KAAI,CAAEC,WAAW,IAEvB9N,EAAO,CACXjE,MAAO0D,EAAK1D,MAAQ0D,EAAK1D,WAAQmS,EACjCzN,QAAShB,EAAKgB,QAAUhB,EAAKgB,aAAUyN,EACvCjS,IAAKwD,EAAKxD,IAAMwD,EAAKxD,SAAMiS,EAC3BlS,QAASyD,EAAKzD,QAAUyD,EAAKzD,aAAUkS,EACvC/R,KAAMsD,EAAKtD,KAAOsD,EAAKtD,UAAO+R,EAC9B5R,MAAOmD,EAAKnD,MAAQmD,EAAKnD,WAAQ4R,EACjC9R,QAASqD,EAAKrD,QAAUqD,EAAKrD,aAAU8R,EACvC7R,KAAMoD,EAAKpD,MAgBb,IAFiBuR,EAAIQ,QAXN,CACbC,SAAU,CAAC,QAAS,UAAW,MAAO,UAAW,OAAQ,QAAS,UAAW,QAC7ElF,KAAM,SACNmF,WAAY,CACVjS,KAAM,CACJ8M,KAAM,SACNzH,OAAQ,WAMAyM,CAASnO,GAErB,OAAO,EAGT,IAAKU,GAAuBjB,EAAKnD,OAC/B,OAAO,EAGT,IAAMiM,EAAsBxH,GAAUtB,EAAKnD,OAG3C,QAFiBkM,OAAO,KAEVC,KAAKF,IAOfoT,EAASrT,sBAAW,uCAAC,WAAOsT,GAAP,SAAAjc,EAAA,sDACzBic,EAAcpc,SAAQ,SAAAqc,GACpB,IAAMC,EAAS,IAAIC,WAEnBD,EAAOE,QAAU,kBAAM3b,QAAQC,IAAI,6BACnCwb,EAAOG,QAAU,kBAAM5b,QAAQC,IAAI,4BACnCwb,EAAOI,OAAP,sBAAgB,0CAAAvc,EAAA,6DACVwc,EAAc,EACZC,EAAa,GACbC,EAAMP,EAAO7b,OACbqc,EAAWC,KAASC,OAAOH,GAC3BI,EAASF,KAASG,QAAQL,EAAK,CACnCxY,GAAI,UACJE,KAAMuY,EACNnT,KAAM,WARM,SAURwT,KAAI,CAAEC,UAAU,EAAOC,OAAQ,QAASC,WAAWL,GACtD3c,MAAK,SAACid,GACL,OAAOA,KAERjd,MAAK,SAACG,GACLA,EAAOT,SAAQ,SAAAC,GAAI,OACjB2c,EAAW/c,KAAK,CACdlD,KAAMsD,EAAK,GAAMnD,MAAOmD,EAAK,GAAMpD,KAAMoD,EAAK,GAAMrD,QAASqD,EAAK,GAAM1D,MAAO0D,EAAK,GAAMgB,QAAShB,EAAK,GAAMxD,IAAKwD,EAAK,GAAMzD,QAASyD,EAAK,WAIjJU,OAAM,SAACC,GACNC,QAAQC,IAAIF,MAtBF,WAAAT,EAAA,kCAAAA,EAAA,yDAyBHF,EAzBG,KA0BPic,EAAWjc,GA1BJ,4EA4BNG,KAAM+C,KAAK7H,EAAa,aAC5B,CACEqB,KAAMsD,EAAKtD,KACXG,MAAOyE,GAAUtB,EAAKnD,OACtBF,QAASqD,EAAKrD,QACdC,KAAMoD,EAAKpD,OAEZyD,MAAK,SAAAG,GACJI,QAAQC,IAAIL,GACZ,IAAMqU,EAAO9S,KACb,OAAO5B,KAAM+C,KAAK7H,EAAa,YAC7B,CACEiB,MAAO0D,EAAK1D,MACZD,SAAU2D,EAAKgB,QACfxE,IAAKwD,EAAKxD,IACVD,QAASyD,EAAKzD,QACduY,QAAStU,EAAOD,KAAKwU,SACrB9R,aAAcA,EACdxG,OAAQ,EACRyY,YAAaL,EACbG,YAAaH,EACbI,cAAe,UAGpB5U,MAAK,SAAAG,GACJI,QAAQC,IAAIL,GACZkc,OAEDhc,OAAM,SAAAC,GACLC,QAAQC,IAAI,QAASF,MAzDb,gDAyBKgc,EAzBL,6LA6DdY,MAAM,GAAD,OAAIb,EAAJ,mFAEDA,EAAc,GAChBhF,OAAOnT,SAASiZ,SAhEJ,4CAmEhBnB,EAAOoB,mBAAmBrB,MAzEH,2CAAD,sDA2EvB,IA5HyB,EAoIxBsB,aAAY,CAAEnN,OAAQ,WAAY2L,SAAQyB,SAAU,IALtDC,EA/H0B,EA+H1BA,aACAC,EAhI0B,EAgI1BA,cACAlX,EAjI0B,EAiI1BA,aACAF,EAlI0B,EAkI1BA,aACAC,EAnI0B,EAmI1BA,aAGF,OAAIsV,EAEA,6BACE,0BAAW6B,KACX,kBAACjH,GAAgBgH,IACf,kBAAC,KAAD,CAAYnf,MAAO,CAAEP,SAAU,GAAI6J,YAAa,KADlD,oBAQF,kBAACvB,GAAaoX,EAAa,CAAEjX,eAAcF,eAAcC,iBACvD,0BAAWmX,KAET,yBAAKpf,MAAO,CAAEP,SAAU,GAAIE,UAAW,WACrC,+OCtIG,O,iDAzBb0f,Y,uCAAc,WAAOC,GAAP,eAAA7d,EAAA,6DACN8d,EAAWD,EAAShS,KAAI,SAAC/L,GAC7B,GAAIA,EAAK4b,SACP,OAAO,EAAKqC,MAAMje,EAAK4b,UACpBvb,MAAK,SAAC6d,GACL,IAAIC,EAAMne,EAEV,OADAme,EAAG,SAAeD,EACXC,KAGX,IAAIA,EAAMne,EAEV,OADAme,EAAG,SAAe,KACXA,KAZC,kBAeLpK,QAAQqK,IAAIJ,IAfP,2C,2DAkBdC,M,uCAAQ,WAAOtO,GAAP,iBAAAzP,EAAA,6DACAsR,EAAM3V,EAAU,UAAM8T,GADtB,SAEiBxP,KAAMC,IAAIoR,GAF3B,cAEAlR,EAFA,yBAGCA,EAASC,MAHV,2C,uDCyFJ8d,GAAc,WAAO,IAAD,EAElB5f,GAAK,GACT6X,SAAU,GACVgI,UAAW,GACX5Z,QAAS,QACTxG,SAAU,GACVyG,OAAQ,OACRO,gBAAiB,QACjBqG,QAAS,OACTC,cAAe,MACfrG,WAAY,SACZ9G,MAAO,SAVE,0BAWC,IAXD,6BAYI,IAZJ,GAeX,OACE,kBAAC,WAAD,CACEkC,KAAM/C,GACN+gB,UAAW,IACXC,SAAU,oDACV3U,OAAO,SACPpL,MAAOA,GAEP,kBAAC,KAAD,CAAYA,MAAO,CAAEP,SAAU,GAAI6J,YAAa,GAAK1J,MAAM,UAP7D,0BAaWogB,GA7HD,WAAO,IAAD,EACsBhW,mBAAS,IAD/B,oBACXiW,EADW,KACGC,EADH,OAEYlW,mBAAS,IAFrB,oBAEX4P,EAFW,KAEFuG,EAFE,OAGQnW,mBAAS,IAHjB,oBAGJE,GAHI,aAIgBF,oBAAS,GAJzB,oBAIX6K,EAJW,KAIAC,EAJA,KAKVtQ,EAAiBkF,cAAjBlF,aAIR4H,qBAAU,YACO,uCAAG,sBAAA3K,EAAA,sEACVC,KAAMC,IAAIzE,EAAa,wBAAoBsH,IAC9C5C,MAAK,SAACC,GACL,GAAwB,MAApBA,EAAS7D,OACX,OAAO6D,EAASC,QAGnBF,MAAK,SAACG,GACL,IAAMud,EAAWvd,EACjBqe,GAAaf,YAAYC,GACtB1d,MAAK,SAACqZ,GACL9Y,QAAQC,IAAI6Y,GACZkF,EAAWlF,GACXiF,EAAgBjF,GAChBnG,GAAa,SAGlB7S,OAAM,SAACC,GACNC,QAAQC,IAAI,QAASF,GACrBgI,EAAShI,MAnBG,2CAAH,qDAsBfme,KACC,IAEH,IAAM1G,EAAmBvP,uBAAY,SAACkW,GACpCJ,EAAgBI,KACf,IAGGtD,EAAgB5S,uBAAY,SAAC+L,EAAQnY,GACzC,IAAK6W,EAAW,CACd,IAAM0L,EAAc3G,EAAQyB,WAAU,SAAC7F,GAAU,OAAOA,EAAI5K,KAAOuL,KAC/DrU,EAAO8X,EACX9X,EAAKye,GAAL,OAA8BviB,EAC9BmiB,EAAW,aAAIre,OAEhB,CAAC+S,IAEJ,OAAIA,EAEA,kBAACjO,GAAD,KACE,kBAAC,GAAD,MACA,kBAAC,GAAD,uBAOF,kBAACA,GAAD,KACE,kBAAC,GAAD,MACA,kBAAC,GAAD,KACE,kBAACO,GAAD,KACE,sEAIF,kBAACE,GAAD,KACE,kBAAC,GAAD,CAAWsS,iBAAkB,SAAC2G,GAAD,OAAa3G,EAAiB2G,IAAU1G,QAASA,IAC9E,kBAACtS,GAAD,KACE,kBAAC,GAAD,MACA,kBAAC,GAAD,CAAYiW,UAAU,IACtB,kBAAC,IAAD,CACE5X,GAAI,CACFC,SAAS,UAAD,OAAYpB,EAAZ,kBAEVxE,MAAO,CAAE4L,eAAgB,OAAQhM,MAAO,YAExC,kBAAC,GAAD,KACE,kBAAC,KAAD,CAASI,MAAO,CAAEP,SAAU,GAAI6J,YAAa,KAD/C,+BAON,kBAAC,GAAD,CAASwT,SAAUmD,EAAclD,UA/EvB,CAAEnf,SAAU,eAAMC,MAAO,2BAAQC,QAAS,2BAAQC,IAAK,gBA+EVif,cAAe,SAAC7G,EAAQnY,GAAT,OAAoBgf,EAAc7G,EAAQnY,OAElH,kBAAC,GAAD,Q,iRC7FD,IAAMwiB,GAAqB,SAAA1gB,GAAU,IAClCgC,EAAgEhC,EAAhEgC,KAAM2e,EAA0D3gB,EAA1D2gB,gBAAiBjU,EAAyC1M,EAAzC0M,SAAUtC,EAA+BpK,EAA/BoK,SAAUhI,EAAqBpC,EAArBoC,MAAOwe,EAAc5gB,EAAd4gB,UACpDvK,EAASrU,EAAK8I,GAFqB,EAGfZ,mBAAS,IAHM,oBAGlCnM,EAHkC,KAG3BmQ,EAH2B,OAIXhE,mBAAS,IAJE,oBAIlCzH,EAJkC,KAIzB0L,EAJyB,OAKnBjE,qBALmB,oBAKlCjM,EALkC,KAK7BmQ,EAL6B,OAMXlE,mBAAS,IANE,oBAMlClM,EANkC,KAMzBqQ,EANyB,OAObnE,qBAPa,oBAOlChM,EAPkC,KAO1B2iB,EAP0B,OAQjB3W,mBAAS,IARQ,oBAQlC/L,EARkC,KAQ5BmQ,EAR4B,OASfpE,mBAAS,IATM,oBASlC5L,EATkC,KAS3B6L,EAT2B,OAUXD,mBAAS,IAVE,oBAUlC9L,EAVkC,KAUzBmQ,EAVyB,OAWjBrE,mBAAS,IAXQ,oBAWlC7L,EAXkC,KAW5BmQ,EAX4B,OAYDtE,mBAAS,IAZR,oBAYlChI,EAZkC,KAYpB2M,EAZoB,QAaG3E,mBAAS,IAbZ,sBAalC1H,GAbkC,MAalBsM,GAbkB,SAcL5E,mBAAS,IAdJ,sBAclClJ,GAdkC,MActB+N,GAdsB,SAeG7E,mBAAS,IAfZ,sBAelC3I,GAfkC,MAelByN,GAfkB,SAgBC9E,mBAAS,IAhBV,sBAgBlCiQ,GAhBkC,MAgBnBC,GAhBmB,SAiBPlQ,oBAAS,GAjBF,sBAiBlC6K,GAjBkC,MAiBvBC,GAjBuB,MAmBzC1I,qBAAU,WACR,IAAMtL,EAAaJ,KACnBmO,GAAc/N,GAEd,IAAMoO,EAAiB9N,KACvB0N,GAAkBI,GAElB,IAAM+K,E1B8DH,WACH,IAAMA,EAAgB,GAStB,OARA1b,EAAS+C,SAAQ,SAAAC,GACb,IAAIvD,EAAS,CACTiD,MAAOM,EAAK,GACZL,MAAOK,EAAK,IAEhB0Y,EAAc9Y,KAAKnD,MAGhBic,E0BxEe2G,GACtB1G,GAAiBD,GAEF,uCAAG,4BAAAxY,EAAA,sEACWD,KADX,OACVQ,EADU,OAEhB2M,EAAgB3M,GAFA,2CAAH,oDAKfmN,GACAnB,EAASlM,EAAKjE,OACdoQ,EAAWnM,EAAKlE,UAChBsQ,EAAOpM,EAAK/D,KACZoQ,EAAWrM,EAAKhE,SAChB6iB,EAAU7e,EAAK9D,QACfoQ,EAAQtM,EAAK7D,MACbgM,EAASnI,EAAK1D,OACdiQ,EAAWvM,EAAK5D,SAChBoQ,EAAQxM,EAAK3D,MACb2W,IAAa,KACZ,IAEH1I,qBAAU,YACS,uCAAG,4BAAA3K,EAAA,6DAClBmN,GAAkB,IADA,SAEWvM,GAAkBxE,GAF7B,OAEZyE,EAFY,OAGlBsM,GAAkBtM,GAHA,2CAAH,qDAMjB8M,KACC,CAACvR,IAGJ,IA8CMgjB,GAAoBzW,uBAAY,WACpC,IAAMuJ,EAAM6J,KACZ,GAAI7J,EAAIlH,OACNtK,QAAQC,IAAIuR,GACZzJ,EAASyJ,EAAI,QACR,CACLzJ,EAAS,IACT,IAAM4W,EAAgB,CACpB/iB,IAAKA,EACLF,MAAOA,EACP0E,QAASA,EACTzE,QAASA,EACTE,OAAQA,EACRwY,cAAe1U,EAAK0U,cACpBvY,KAAMA,EACNG,MAAOyE,GAAUzE,GACjBF,QAASA,EACTC,KAAMA,EACNgY,OAAQA,GAEV3J,EAASsU,MAEV,CAAC/iB,EAAKF,EAAO0E,EAASzE,EAASE,EAAQC,EAAMG,EAAOF,EAASC,EAAMgY,IAEhEqH,GAAa,WACjB,IAAM9N,EAAMC,KAAI,CAAEC,WAAW,IACvBC,EAAmB,IAAIC,IAAItR,GAC3BuR,EAAe,GACjBgR,GAAiB,EACjB1W,EAAsB,GAGpBvI,EAAO,CACXjE,MAAOA,QAAgBmS,EACvBzN,QAASA,QAAoByN,EAC7BjS,IAAKA,QAAYiS,EACjBlS,QAASA,QAAoBkS,EAC7B/R,KAAMA,QAAc+R,EACpB5R,MAAOA,QAAgB4R,EACvB9R,QAASA,QAAoB8R,EAC7B7R,KAAMA,GAcF8R,EAAWP,EAAIQ,QAXN,CACbC,SAAU,CAAC,QAAS,UAAW,MAAO,UAAW,OAAQ,QAAS,UAAW,QAC7ElF,KAAM,SACNmF,WAAY,CACVjS,KAAM,CACJ8M,KAAM,SACNzH,OAAQ,aAMAyM,EAASnO,KAGrBK,QAAQC,IAAI6N,EAASI,QACrBJ,EAASI,OAAO/O,SAAQ,SAAAY,GACA,aAAlBA,EAAMoO,SAC6B,UAAjCpO,EAAMkD,OAAOmL,kBACfwQ,GAAiB,GAEnBhR,EAAa5O,KAAK0O,EAAiBlO,IAAIO,EAAMkD,OAAOmL,iBAAmB,OAC5C,WAAlBrO,EAAMoO,SACfP,EAAa5O,KAAK,0JAKpB4f,KACGve,GAAuBpE,IAC1B2R,EAAa5O,KAAK,4GAGpBkJ,EAAsBxH,GAAUzE,GACfkM,OAAO,KAEVC,KAAKF,IACjB0F,EAAa5O,KAAK,6GAItB,OAAO4O,GAGT,OAAI8E,GAEA,8BAIA,6BACE,yBAAK7U,MAAO,CAAE+F,MAAO,OAAQxF,OAAQ,MAAO2c,UAAW,OAAQ8D,WAAY,KAEvEN,EACE,yBAAK1gB,MAAOihB,IACV,2BAAOjhB,MAAO4N,IAAd,kCACA,kBAAC,KAAD,CAAQ3M,MAAOgZ,GAAcjc,GAC3BwO,SAAU,SAACvL,GAhHJ,IAACkK,EAIpBwV,GAJoBxV,EAgH4BlK,GA5GtCkK,EAAElK,MAFF,OA8G8CyP,QAASuJ,GAAexU,UAAU,yBAIlF,8BAEJ,yBAAKzF,MAAO,CAAEO,OAAQ,MAEtB,yBAAKP,MAAOihB,IACV,2BAAOjhB,MAAO4N,IAAd,4BACA,kBAAC,KAAD,CAAiB3M,MAAOpD,EAAQ,CAAC,CAAEqD,MAAOrD,EAAOoD,MAAOpD,IAAW,KAAM2S,aAAa,EAAMC,cAAc,EAAMC,QAAS1O,EACvHwK,SAAU,SAACvL,GAAD,OAzJlB+M,GAJmB7C,EA6JwBlK,GAzJlCkK,EAAElK,MAFF,WAKXgN,EAAW,MAPS,IAAC9C,GA6JgC1F,UAAW,yBAE1D,yBAAKzF,MAAOihB,IACV,2BAAOjhB,MAAO4N,IAAd,gBACA,kBAAC,KAAD,CAAiB3M,MAAOsB,EAAU,CAAC,CAAErB,MAAOqB,EAAStB,MAAOsB,IAAa,KAAMiO,aAAa,EAAMC,cAAc,EAAMC,QAASpO,GAC7HkK,SAAU,SAACvL,GAxJC,IAACkK,EAIrB8C,GAJqB9C,EAwJwBlK,GApJlCkK,EAAElK,MAFF,OAsJ0CwE,UAAW,yBAE5D,yBAAKzF,MAAOihB,IACV,2BAAOjhB,MAAO4N,IAAd,gBACA,kBAAC,KAAD,CAAiB3M,MAAOlD,EAAM,CAAC,CAAEmD,MAAOnD,EAAKkD,MAAOlD,IAAS,KAAMyS,aAAa,EAAMC,cAAc,EAAMC,QAAS5P,GACjH0L,SAAU,SAACvL,GArJH,IAACkK,EAIjB+C,GAJiB/C,EAqJwBlK,GAjJlCkK,EAAElK,MAFF,OAmJ0CwE,UAAW,yBAExD,yBAAKzF,MAAOihB,IACV,2BAAOjhB,MAAO4N,IAAd,4BACA,kBAAC,KAAD,CAAiB3M,MAAOnD,EAAU,CAAC,CAAEoD,MAAOpD,EAASmD,MAAOnD,IAAa,KAAM0S,aAAa,EAAMC,cAAc,EAAMC,QAASrP,GAC7HmL,SAAU,SAACvL,GAlJC,IAACkK,EAIrBgD,GAJqBhD,EAkJwBlK,GA9IlCkK,EAAElK,MAFF,OAgJ0CwE,UAAW,yBAE5D,yBAAKzF,MAAO,CAAEO,OAAQ,MAEtB,yBAAKP,MAAOihB,IACV,2BAAOjhB,MAAO4N,IAAd,gBACA,2BAAO+C,aAAc1S,EAAMgN,KAAK,OAAOhN,KAAK,OAAOiN,OAAQ,SAACC,GAAD,OAAOiD,EAAQjD,EAAEC,OAAOnK,QAAQjB,MAAO8J,MAEpG,yBAAK9J,MAAOihB,IACV,2BAAOjhB,MAAO4N,IAAd,4BACA,2BAAO+C,aAAcvS,EAAO6M,KAAK,MAAMhN,KAAK,QAAQiN,OAAQ,SAACC,GAAD,OAAOlB,EAASkB,EAAEC,OAAOnK,QAAQjB,MAAO8J,MAEtG,yBAAK9J,MAAOihB,IACV,2BAAOjhB,MAAO4N,IAAd,8CACA,2BAAO+C,aAAcxS,EAAM8M,KAAK,OAAOhN,KAAK,OAAOiN,OAAQ,SAACC,GAAD,OAAOmD,EAAQnD,EAAEC,OAAOnK,QAAQjB,MAAO8J,MAEpG,yBAAK9J,MAAOihB,IACV,2BAAOjhB,MAAO4N,IAAd,gBACA,2BAAO+C,aAAczS,EAAS+M,KAAK,OAAOhN,KAAK,UAAUiN,OAAQ,SAACC,GAAD,OAAOkD,EAAWlD,EAAEC,OAAOnK,QAAQjB,MAAO8J,OAGpG,KAAV5H,EACC,yBAAKlC,MAAO,CAAE+F,MAAO,OAAQxF,OAAQ,MAAOZ,UAAW,SAAUC,MAAO,MAAOH,SAAU,GAAIiH,WAAY,WACtGxE,GAGH,yBAAKlC,MAAO,CAAEO,OAAQ,MAExB,kBAAC2gB,GAAD,KACE,kBAAC,GAAD,CAAQ5a,QA/JM,WACpBma,KA8JsClI,YAAa,UAA7C,kCACA,kBAAC,GAAD,CAAQjS,QAASua,IAAjB,mBAOJK,GAAkBra,KAAOC,IAAV,MAWfma,GAAc,CAAEnU,QAAS,OAAQC,cAAe,MAAOhH,MAAO,MAAOiH,eAAgB,aAActG,WAAY,WAAY4E,aAAc,GACzIsC,GAAa,CAAEnO,SAAU,GAAIG,MAAO,UAAWmG,MAAO,IACtD+D,GAAiB,CAAErK,SAAU,GAAIsG,MAAO,IAAKxF,OAAQ,I,oBCjS3D4gB,KAAMC,cAAc,SAEpB,IAAMC,GAAa,CACjBC,QAAS,CACP7a,gBAAiB,oBACjBnG,OAAQ,KAEV4X,QAAS,CACPlS,SAAU,QACVzF,OAAQ,QACRJ,IAAK,MACLwJ,UAAW,SACXN,WAAY,OACZC,YAAa,OACb3J,UAAW,WAIF4hB,GAAa,SAACzhB,GAAW,IAC5B0hB,EAAmD1hB,EAAnD0hB,gBAAiBC,EAAkC3hB,EAAlC2hB,UAAWC,EAAuB5hB,EAAvB4hB,mBAEpC,OACE,kBAAC,KAAD,CAAOC,OAAQH,EAAiBxhB,MAAOqhB,IACrC,uIACA,yBAAK5b,UAAU,qCACb,yBAAKA,UAAU,UAAUzF,MAAO,CAAEghB,WAAY,GAAIlU,QAAS,OAAQC,cAAe,MAAOC,eAAgB,WACvG,kBAAC,GAAD,CAAQ1G,QAAS,kBAAMob,GAAmB,IAAQnJ,YAAa,UAA/D,kCAGA,kBAAC,GAAD,CAAQvY,MAAO,CAAEqJ,WAAY,IAAM/C,QAAS,kBAAMmb,MAAlD,oBC7BVN,KAAMC,cAAc,SAEpB,IAAMC,GAAa,CACjBC,QAAS,CACP7a,gBAAiB,oBACjBnG,OAAQ,KAEV4X,QAAS,CACPlS,SAAU,QACVzF,OAAQ,QACRJ,IAAK,MACLwJ,UAAW,SACXN,WAAY,OACZC,YAAa,OACb3J,UAAW,WAIFiiB,GAAc,SAAC9hB,GAAW,IAC7B+hB,EAAiE/hB,EAAjE+hB,iBAAkBC,EAA+ChiB,EAA/CgiB,sBAAuBC,EAAwBjiB,EAAxBiiB,oBAEjD,OACE,kBAAC,KAAD,CAAOJ,OAAQE,EAAkB7hB,MAAOqhB,IACtC,iIACA,yBAAK5b,UAAU,qCACb,yBAAKA,UAAU,UAAUzF,MAAO,CAAEghB,WAAY,GAAIlU,QAAS,OAAQC,cAAe,MAAOC,eAAgB,WACvG,kBAAC,GAAD,CAAQ1G,QAAS,kBAAMyb,GAAoB,IAAQxJ,YAAa,UAAhE,kCAGA,kBAAC,GAAD,CAAQA,YAAa,SAAUjS,QAAS,kBAAMwb,MAA9C,oB,6LCfV,IAoJME,GAAsB,SAAAliB,GAAU,IAAD,EACOkK,mBAAS,GADhB,oBAC5B4I,EAD4B,KACbrB,EADa,KAE3B0Q,EAAcniB,EAAdmiB,UACFC,EAAeD,EAAUrP,GAAeuP,IAAMF,EAAUrP,GAAeuP,IAAI7F,MAAM,OAAS,CAAC,IAEjG,OADAna,QAAQC,IAAI8f,GAEV,kBAACzZ,GAAD,KACE,yBAAKzI,MAAO,CAAEO,OAAQ,IAAKwF,MAAO,MAAOC,SAAU,IAAKoc,YAAa,MACnE,uBAAGzV,KAAMsV,EAAUrP,GAAeuK,SAAU/R,OAAO,SAASgS,IAAI,YAC9D,yBAAKxT,IAAKqY,EAAUrP,GAAeuK,SAAUE,IAAK,gBAAiBrd,MAAO,CAAEO,OAAQ,OAAQwF,MAAO,OAAQkM,UAAW,eAG1H,yBAAKjS,MAAO,CAAE+F,MAAO,MAAOsc,cAAe,GAAI1Y,UAAW,GAAImD,QAAS,OAAQC,cAAe,MAAOuF,SAAU,SAE3GuB,OAAOC,KAAKmO,GAAW3U,KAAI,SAAC/L,EAAMgM,GAChC,OACE,yBAAKvN,MAAO,CAAEsJ,YAAa,EAAGgC,aAAc,GAAKhF,QAAS,kBAAMiL,EAAiBhE,KAC/E,yBAAK3D,IAAKqY,EAAU1U,GAAO4P,SAAUE,IAAK,gBAAiBrd,MAAO4S,IAAkBrF,EAAQ,CAAEhN,OAAQ,GAAIyF,SAAU,IAAKD,MAAO,OAAQkM,UAAW,SAAY,CAAE1R,OAAQ,GAAIyF,SAAU,IAAKD,MAAO,OAAQkM,UAAW,WACrNW,IAAkBrF,GAAS,yBAAKvN,MAAO,CAAEO,OAAQ,EAAGkG,gBAAiB,UAAWkD,UAAW,EAAG5D,MAAO,eAMhH,yBAAK/F,MAAO,CAAE+F,MAAO,OAAQxF,OAAQ,MAAOsf,UAAW,IAAKpgB,SAAUf,EAASG,QAC5EqjB,EAAa5U,KAAI,SAACgV,GACjB,OACE,6BACGA,SASFC,GAAiB,SAAAziB,GAAU,IAC9BgC,EAA2ChC,EAA3CgC,KAAMnE,EAAqCmC,EAArCnC,gBAAiB8iB,EAAoB3gB,EAApB2gB,gBACzBjX,EAAUC,cAFqB,EAGSO,oBAAS,GAHlB,oBAG9BwX,EAH8B,KAGbE,EAHa,OAIW1X,oBAAS,GAJpB,oBAI9B6X,EAJ8B,KAIZE,EAJY,KAK7Bvd,EAAiBkF,cAAjBlF,aAEF2X,EAAY,IAAIrM,IAAIvR,GACpB6d,EAAc,IAAItM,IAAIhR,IAEtB0jB,EAAa,uCAAG,sBAAA/gB,EAAA,sEACdC,KAAM+C,KAAK/G,EAAoB,CAAEkN,GAAI9I,EAAK8I,KAC7ChJ,MAAK,SAACC,GACmB,MAApBA,EAAS7D,QACXmE,QAAQC,IAAI,2BAGfH,OAAM,SAACC,GACNC,QAAQC,IAAIF,MARI,2CAAH,qDAYb4f,EAAqB,uCAAG,sBAAArgB,EAAA,sEACtB+gB,IADsB,OAE5BT,GAAoB,GACpBvY,EAAQrI,KAAK,CAAEyE,SAAS,UAAD,OAAYpB,KAHP,2CAAH,qDAMrBid,EAAS,uCAAG,sBAAAhgB,EAAA,sEACVmV,GAAavC,SAAS,CAACvS,EAAK3D,MAAO2D,EAAK7D,KAAMuG,GACjD5C,MAAK,SAAAG,GACJ,GAAsB,MAAlBA,EAAO/D,OAAgB,CAEzB,OAAO0D,KAAM+C,KAAKpH,EAAqB,CAAEuN,GAAI9I,EAAK8I,GAAI/M,MAAOiE,EAAKjE,MAAOD,SAAUkE,EAAKlE,SAAUG,IAAK+D,EAAK/D,IAAKD,QAASgE,EAAKhE,QAASE,OADlH,QAIzB4D,MAAK,SAACC,GACmB,MAApBA,EAAS7D,QACXwL,EAAQrI,KAAK,CAAEyE,SAAS,UAAD,OAAYpB,QAGtCvC,OAAM,SAAA0R,GACLxR,QAAQC,IAAIuR,MAdA,2CAAH,qDAkCf,OACE,oCACE,kBAAC,GAAD,CAAY6N,gBAAiBA,EAAiBC,UAAWA,EAAWC,mBAAoBA,IACxF,kBAAC,GAAD,CAAaG,iBAAkBA,EAAkBC,sBAAuBA,EAAuBC,oBAAqBA,IACpH,kBAACpZ,GAAD,KACE,yBAAK3I,MAAO,CAAE8M,QAAS,OAAQC,cAAe,QAC5C,kBAAC,GAAD,CAAQzG,QAAS,kBAAMma,MAAvB,gBACA,yBAAKzgB,MAAO,CAAE+F,MAAO,KACrB,kBAAC,GAAD,CAAQwS,YAAa,SAAUjS,QAAS,kBAAMyb,GAAoB,KAAlE,iBAvBc,IAAhBjgB,EAAK9D,QAAgC,IAAhB8D,EAAK9D,OACrB,kBAAC,GAAD,CAAQsI,QAAS,kBAAMob,GAAmB,KAA1C,uCAEP,EAgBA,KAQA,yBAAK1hB,MAAO,CAAE+F,MAAO,OAAQxF,OAAQ,MAAO2c,UAAW,OAAQvT,UAAW,KACxE,kBAAC8Y,GAAD,KACE,yBAAKziB,MAAO,CAAEP,SAAUf,EAASG,MAAOkH,MAAO,IAAKnG,MAAOnB,IACxD,4BAEH,yBAAKuB,MAAO,CAAEP,SAAUf,EAASG,MAAO6jB,UAAW,SAzB3C,SAACzhB,GACf,IAAMob,EAAOpb,EAAMqb,MAAM,KAIzB,OAHaD,EAAK,GAEM,IADXA,EAAK,GAAGC,MAAM,IAAK,GAAGC,KAAK,KAuB/BoG,CAAQ7gB,EAAI,eAGjB,kBAAC2gB,GAAD,KACE,yBAAKziB,MAAO,CAAEP,SAAUf,EAASG,MAAOkH,MAAO,IAAKnG,MAAOnB,IACxD,kCAEH,yBAAKuB,MAAO,CAAEP,SAAUf,EAASG,MAAOgZ,SAAU,GAAIjY,MAAO,QAASqG,QAAS,oBAAqBQ,gBAAgB,GAAD,OAAK2V,EAAYza,IAAIG,EAAI,SAAenC,UAAW,SAAU6c,aAAc,IAC3LL,EAAUxa,IAAIG,EAAI,UAGvB,yBAAK9B,MAAO,CAAEO,OAAQ,MAEpBsT,OAAOC,KAAKhS,GAAMwL,KAAI,SAAC/L,EAAMgM,GAC3B,GAAI5P,EAAgB4D,GAAO,CACzB,IAAIL,EAAQY,EAAKP,GACjB,GAAa,WAATA,EACF,OACK,MAAa,SAATA,EAEP,kBAACkhB,GAAD,CAAgBziB,MAAO,CAAE2J,UAAW,KAClC,yBAAK3J,MAAO,CAAEP,SAAUf,EAASG,MAAOkH,MAAO,IAAKnG,MAAOnB,IACxDd,EAAgB4D,IAEnB,yBAAKvB,MAAO,CAAEP,SAAUf,EAASG,MAAO6jB,UAAW,SAChDxhB,IAMP,kBAACuhB,GAAD,KACE,yBAAKziB,MAAO,CAAEP,SAAUf,EAASG,MAAOkH,MAAO,IAAKnG,MAAOnB,IACxDd,EAAgB4D,IAEnB,yBAAKvB,MAAO,CAAEP,SAAUf,EAASG,MAAO6jB,UAAW,SAChDxhB,WAYfuhB,GAAiB5b,KAAOC,IAAV,MAUL8b,GAnUG,WAAO,IAAD,EACgB5Y,mBAAS,IADzB,oBACf6Y,EADe,KACFC,EADE,OAEY9Y,mBAAS,IAFrB,oBAEfiY,EAFe,KAEJc,EAFI,OAGY/Y,oBAAS,GAHrB,oBAGf6K,EAHe,KAGJC,EAHI,OAIa9K,oBAAS,GAJtB,oBAIfgZ,EAJe,KAIHC,EAJG,OAKYjZ,oBAAS,GALrB,oBAKf0W,EALe,KAKJwC,EALI,OAMIlZ,mBAAS,IANb,oBAMf9H,EANe,KAMRgI,EANQ,KAOdiM,EAAWzM,cAAXyM,OACAtR,EAAUsH,cAAVtH,MAERuH,qBAAU,WACR,IAAMiU,EAAS,uCAAG,4BAAA5e,EAAA,sEACGC,KAAM+C,KAAKtH,EAAc,CAAE,OAAUgZ,IADxC,OACVgN,EADU,OAEhB/C,GAAaf,YAAY8D,EAAKrhB,MAC3BF,MAAK,SAACqZ,GACL,GAAIA,EAAKxO,OACPsW,EAAa9H,GACbnG,GAAa,OACR,CACL,IAAMsO,EAAiB,CAAC,CACtBjN,OAAQA,EACRgH,SAAUtT,EAAQ,KAClBsY,IAAK,KAEPY,EAAaK,GACbtO,GAAa,OAdH,2CAAH,qDAmBf,GAAIjQ,EAAO,CAAC,IACF/C,EAAS+C,EAAT/C,KACRghB,EAAe,gBAAKhhB,IACpBue,IACA4C,GAAa,QAEbH,EAAe,IACfhO,GAAa,KAEd,CAACqB,IAEJ,IAAMkN,EAAejZ,uBAAY,SAACkZ,GAChC,IAAMC,EAAU,uCAAG,sBAAA9hB,EAAA,sDACjBC,KAAM+C,KAAKzH,EAAsB,CAAEiB,KAAMqlB,EAAarlB,KAAMG,MAAOklB,EAAallB,MAAOF,QAASolB,EAAaplB,QAASC,KAAMmlB,EAAanlB,OACtIyD,MAAK,SAACC,GACL,GAAwB,MAApBA,EAAS7D,OAAgB,CAC3B,IAAMoY,EAAO9S,KACb,OAAO5B,KAAM+C,KAAKpH,EAAqB,CACrCuN,GAAI0Y,EAAanN,OACjBtY,MAAOylB,EAAazlB,MACpBD,SAAU0lB,EAAa/gB,QACvBxE,IAAKulB,EAAavlB,IAClBD,QAASwlB,EAAaxlB,QACtBE,OAAQslB,EAAatlB,OACrBuY,YAAaH,EACbI,cAAe8M,EAAa9M,oBAIjC5U,MAAK,SAACC,GACmB,MAApBA,EAAS7D,SACXmE,QAAQC,IAAI,wBACZohB,QAGHvhB,OAAM,SAACC,GACNC,QAAQC,IAAIF,GACZgI,EAAS,6JAzBI,2CAAH,qDA6BVsZ,EAAsB,WAC1B,IAAIC,EAAaZ,EACjBY,EAAU,IAAUH,EAAavlB,IACjC0lB,EAAU,MAAYH,EAAazlB,MACnC4lB,EAAU,SAAeH,EAAa/gB,QACtCkhB,EAAU,QAAcH,EAAaxlB,QACrC2lB,EAAU,OAAaH,EAAatlB,OACpCylB,EAAU,KAAWH,EAAarlB,KAClCwlB,EAAU,MAAYH,EAAallB,MACnCqlB,EAAU,QAAcH,EAAaplB,QACrCulB,EAAU,KAAWH,EAAanlB,KAClC2kB,EAAe,gBAAKW,IACpBP,GAAa,SAAAxC,GAAS,OAAKA,MAG7B6C,MAEC,CAACV,IAEEpC,EAAkBrW,uBAAY,WAClC8Y,GAAa,SAAAxC,GAAS,OAAKA,OAC1B,IAEH,OAAI7L,EAEA,kBAACjO,GAAD,KACE,kBAAC,GAAD,MACA,kBAAC,GAAD,qBAKMoc,EAWR,kBAACpc,GAAD,KACE,kBAAC,GAAD,MACA,kBAAC,GAAD,KACE,kBAACO,GAAD,CAAgBnH,MAAO,CAAEgN,eAAgB,aAAc3D,WAAY,GAAI5J,SAAUf,EAASE,SAA1F,wCAGA,kBAAC4J,GAAD,CAAkBxI,MAAO,CAAEyG,gBAAiBhI,IAC1C,kBAAC,GAAD,CAAqBwjB,UAAWA,IAE9BvB,EACE,kBAAChY,GAAD,KACE,kBAAC,GAAD,CACE5G,KAAM+gB,EACNpC,gBAAiBA,EACjBqC,eAAgBA,EAChBtW,SAAU,SAAC8W,GAAD,OAAkBD,EAAaC,IACzCpZ,SAAUA,EACVhI,MAAOA,EACPwe,WAAW,KAIf,kBAAChY,GAAD,KACE,kBAAC,GAAD,CAAgB5G,KAAM+gB,EAAallB,gBAAiBA,EAAiB8iB,gBAAiBA,OAKhG,kBAAC,GAAD,OArCF,kBAAC7Z,GAAD,KACE,kBAAC,GAAD,MACA,kBAAC,GAAD,qGCPF8c,GAAY,CAChB3d,MAAO,OACPE,QAAS,OAGE2H,GAAa,CAAEnO,SAAUf,EAASG,MAAOkH,MAAO,IAAKnG,MAAOnB,GAE5DwiB,GAAc,CACzB1gB,OAAQ,OACRwF,MAAO,OACP+G,QAAS,OACTC,cAAe,MACfzB,aAAc,EACdrF,QAAS,EACT+G,eAAgB,aAChBtG,WAAY,YAGCid,GA7HG,WAAO,IAAD,EACY3Z,mBAAS,IADrB,oBACf4Z,EADe,KACJC,EADI,OAEQ7Z,mBAAS,IAFjB,oBAEf8Z,EAFe,KAENC,EAFM,OAGY/Z,oBAAS,GAHrB,oBAGf6K,EAHe,KAGJC,EAHI,KAIhBtL,EAAUC,cAEhB2C,qBAAU,WACR,IAAM6K,EAAO/R,GAAYxB,iBACnBsgB,EAAY/M,EAAI,SACtB,GAAkB,OAAd+M,EAAoB,CACtB,IAAMjb,EAAM,CAAC,CAAEoU,SAAU6G,IACzB5D,GAAaf,YAAYtW,GACtBnH,MAAK,SAACqiB,GACLF,EAAWE,EAAI,GAAG9G,aAEnBlb,OAAM,SAAC0R,GACNxR,QAAQC,IAAIuR,MAGlBkQ,EAAa,gBAAK5M,GAAQnC,GAAa,MACtC,IAEH,IAAMoP,EAAY9Z,uBAAY,gBACG4F,IAA3B4T,EAAUpf,aACZgF,EAAQrI,KAAK,CAAEyE,SAAS,UAAD,OAAYge,EAAUpf,aAAtB,sBAEvBgF,EAAQrI,KAAK,CAAEyE,SAAU,mBAE1B,CAACge,IAEJ,OAAI/O,EAEA,kBAACjO,GAAD,KACE,kBAAC,GAAD,MACA,kBAAC,GAAD,KACE,kBAACO,GAAD,CAAgBnH,MAAO,CAAEgN,eAAgB,aAAc3D,WAAY,KAAnE,4BAGA,kBAAC7B,GAAD,CAAaxH,MAAO,CAAEyG,gBAAiBhI,MAIzC,kBAAC,GAAD,OAKF,kBAACmI,GAAD,KACE,kBAAC,GAAD,MACA,kBAAC,GAAD,KACE,kBAACO,GAAD,CAAgBnH,MAAO,CAAEgN,eAAgB,aAAc3D,WAAY,KAAnE,4BAGA,kBAAC7B,GAAD,CAAaxH,MAAO,CAAEyG,gBAAiBhI,IACrC,yBAAKuB,MAAO0jB,IACV,yBAAK1jB,MAAO,CAAEmG,OAAQ,WACpB,kBAAC,GAAD,CAAQG,QAAS,kBAAM4d,MAAvB,kBAEF,yBAAKlkB,MAAOihB,IACV,yBAAKjhB,MAAO4N,IAAZ,sBAGA,yBAAK5N,MAAO,CAAEP,SAAUf,EAASG,MAAO6jB,UAAW,SAChDkB,EAAU3lB,OAGf,yBAAK+B,MAAOihB,IACV,yBAAKjhB,MAAO4N,IAAZ,4BAGA,yBAAK5N,MAAO,CAAEP,SAAUf,EAASG,MAAO6jB,UAAW,SAChDkB,EAAUxlB,QAGf,yBAAK4B,MAAOihB,IACV,yBAAKjhB,MAAO4N,IAAZ,gBAGA,yBAAK5N,MAAO,CAAEP,SAAUf,EAASG,MAAO6jB,UAAW,SAChDkB,EAAU1lB,UAGf,yBAAK8B,MAAOihB,IACV,yBAAKjhB,MAAO4N,IAAZ,8CAGA,yBAAK5N,MAAO,CAAEP,SAAUf,EAASG,MAAO6jB,UAAW,SAChDkB,EAAUzlB,OAGf,yBAAK6B,MAAOihB,IACV,yBAAKjhB,MAAO4N,IAAZ,4BAGA,yBAAK5N,MAAO,CAAE+F,MAAO,IAAKxF,OAAQ,IAAKkG,gBAAiB,OAAQwG,UAAW,SAAU3B,aAAc,KACjG,yBAAK1B,IAAKka,EAASzG,IAAK,OAAQrd,MAAO,CAAEO,OAAQ,OAAQwF,MAAO,OAAQkM,UAAW,gBAM7F,kBAAC,GAAD,QC2IFnI,GAAiB,CAAErK,SAAU,GAAIsG,MAAO,IAAKxF,OAAQ,IAE5C4jB,GA9OO,WAAO,IAAD,EACQna,mBAAS,IADjB,oBACnB4Z,EADmB,KACRC,EADQ,OAEI7Z,mBAAS,IAFb,oBAEnB8Z,EAFmB,KAEVC,EAFU,OAGwB/Z,mBAAS,MAHjC,oBAGnBoa,EAHmB,KAGAC,EAHA,OAIQra,oBAAS,GAJjB,oBAInB6K,EAJmB,KAIRC,EAJQ,OAKA9K,mBAAS,IALT,oBAKnB9H,EALmB,KAKZgI,EALY,KAMpBV,EAAUC,cAEhB2C,qBAAU,WACR,IAAM6K,EAAO/R,GAAYxB,iBACnBsgB,EAAY/M,EAAI,SACtB,GAAkB,OAAd+M,EAAoB,CACtB,IAAMjb,EAAM,CAAC,CAAEoU,SAAU6G,IACzB5D,GAAaf,YAAYtW,GACtBnH,MAAK,SAACqiB,GACLF,EAAWE,EAAI,GAAG9G,aAEnBlb,OAAM,SAAC0R,GACNxR,QAAQC,IAAIuR,MAGlBkQ,EAAa,gBAAK5M,GAAQnC,GAAa,MACtC,IAEH,IAAM1G,EAAUhE,uBAAY,SAACrH,GAC3B,GAAc,OAAVA,EAAgB,CAClB,IAAIjB,EAAI,gBAAQ8hB,GAChB9hB,EAAI,KAAWiB,EAAM9B,MACrB4iB,EAAa,gBAAK/hB,OAEnB,CAAC8hB,IAEEvV,EAAajE,uBAAY,SAACrH,GAC9B,GAAc,OAAVA,EAAgB,CAClB,IAAIjB,EAAI,gBAAQ8hB,GAChB9hB,EAAI,QAAciB,EAAM9B,MACxB4iB,EAAa,gBAAK/hB,OAEnB,CAAC8hB,IAEEU,EAAiBla,uBAAY,SAACrH,GAClC,GAAc,OAAVA,EAAgB,CAClB,IAAIjB,EAAI,gBAAQ8hB,GAChB9hB,EAAI,MAAYiB,EAAM9B,MACtB4iB,EAAa,gBAAK/hB,OAEnB,CAAC8hB,IAEEW,EAAWna,uBAAY,SAACrH,GAC5B,GAAc,OAAVA,EAAgB,CAClB,IAAIjB,EAAI,gBAAQ8hB,GAChB9hB,EAAI,KAAWiB,EAAM9B,MACrB4iB,EAAa,gBAAK/hB,OAEnB,CAAC8hB,IAEEY,EAAgBpa,uBAAY,WAChCZ,EAAQib,WACP,IAEG5D,EAAoBzW,uBAAY,WACpC,IAAMsa,EAAe,uCAAG,gCAAAjjB,EAAA,yDAClBK,EADkB,gBACN8hB,GACU,OAAtBQ,EAFkB,gCAGC1O,EAAY0O,GAHb,OAGdriB,EAHc,OAId4iB,EAAW5iB,EAAO,GAAG+B,IAC3BhC,EAAI,6BACCA,GADD,IAEF,GAAM8hB,EAAUhZ,GAChB,KAAQgZ,EAAU3lB,KAClB,QAAW2lB,EAAU1lB,QACrB,SAAYymB,EACZ,MAASf,EAAUxlB,MACnB,KAAQwlB,EAAUzlB,OAZA,uBAepB2D,EAAI,6BACCA,GADD,IAEF,GAAM8hB,EAAUhZ,GAChB,KAAQgZ,EAAU3lB,KAClB,QAAW2lB,EAAU1lB,QACrB,SAAY0lB,EAAUe,SACtB,MAASf,EAAUxlB,MACnB,KAAQwlB,EAAUzlB,OAtBA,mCA0BGuD,KAAM+C,KAAKnH,EAAuBwE,GA1BrC,QA2BI,MA3BJ,OA2BP9D,SACXkH,GAAYrB,IAAI,OAAQF,KAAKe,UAAU5C,IACvC0H,EAAQib,UA7BU,mDAgCpBtiB,QAAQC,IAAR,MACAoH,EAAQib,SAjCY,2DAAH,qDAqCf9Q,EAAMxJ,EAAUyZ,GACV,KAARjQ,EACFzJ,EAASyJ,GAET+Q,MAED,CAACd,EAAWQ,IAETja,EAAY,SAACyZ,GACjB,IAAMlU,EAAMC,KAAI,CAAEC,WAAW,IACzBgV,EAAW,GACT9iB,EAAO,CACX+iB,qBAAKjB,EAAU3lB,KACfkB,eAAIykB,EAAU1lB,QACd4mB,2BAAMlB,EAAUxlB,MAChB2mB,6CAASnB,EAAUzlB,MAaf8R,EAAWP,EAAIQ,QAXN,CACbC,SAAU,CAAC,qBAAO,eAAM,2BAAQ,8CAChClF,KAAM,SACNmF,WAAY,CACV2U,6CAAS,CACP9Z,KAAM,SACNzH,OAAQ,YAQd,OAFcyM,EAASnO,KAGrBK,QAAQC,IAAI6N,EAASI,QACrBJ,EAASI,OAAO/O,SAAQ,SAAAY,GACA,aAAlBA,EAAMoO,QACRsU,EAAQ,0FAAqB1iB,EAAMkD,OAAOmL,gBAAlC,OACmB,WAAlBrO,EAAMoO,UACfsU,EAAQ,qGAAsB1iB,EAAM8iB,SAAS/Y,MAAM,GAAI,GAA/C,WAKP2Y,GAGHlP,EAAW,uCAAG,WAAOiI,GAAP,eAAAlc,EAAA,6DACZ2D,EAAS,IAAI0Q,UACZC,OAAO,OAAQ4H,GAFJ,SAGJjc,KAAM+C,KAAK3H,EAAYsI,EACnC,CACE4Q,QAAS,CACP,eAAgB,yBANJ,uCAQZlU,MARY,2CAAH,sDAWXwP,EAAYlH,uBAAY,SAACrB,GAC7B,GAAgC,IAA5BA,EAAIqC,OAAOyH,MAAMpG,OAAc,CACjC,IAAMyE,EAAYnI,EAAIqC,OAAOyH,MAAM,GAC7BC,EAAWC,IAAIC,gBAAgBjK,EAAIqC,OAAOyH,MAAM,IACtDkR,EAAWjR,GACXuR,EAAqBnT,MAEtB,IAEH,OAAI2D,EAEA,kBAACjO,GAAD,KACE,kBAAC,GAAD,MACA,kBAAC,GAAD,KACE,kBAACO,GAAD,CAAgBnH,MAAO,CAAEgN,eAAgB,aAAc3D,WAAY,KAAnE,wCAGA,kBAAC7B,GAAD,CAAaxH,MAAO,CAAEyG,gBAAiBhI,MAIzC,kBAAC,GAAD,OAKF,kBAACmI,GAAD,KACE,kBAAC,GAAD,MACA,kBAAC,GAAD,KACE,kBAACO,GAAD,CAAgBnH,MAAO,CAAEgN,eAAgB,aAAc3D,WAAY,KAAnE,wCAGA,kBAAC7B,GAAD,CAAaxH,MAAO,CAAEyG,gBAAiBhI,IACrC,yBAAKuB,MAAO,CAAEilB,MAAO,OAAQhf,QAAS,QACpC,yBAAKjG,MAAOihB,IACV,2BAAOjhB,MAAO4N,IAAd,sBACA,2BAAOpB,SAAU,SAACrB,GAAD,OAAOiD,EAAQjD,EAAEC,SAASpL,MAAO8J,GAAgB7I,MAAO2iB,EAAU3lB,QAErF,yBAAK+B,MAAOihB,IACV,2BAAOjhB,MAAO4N,IAAd,gBACA,2BAAOpB,SAAU,SAACrB,GAAD,OAAOkD,EAAWlD,EAAEC,SAASpL,MAAO8J,GAAgB7I,MAAO2iB,EAAU1lB,WAExF,yBAAK8B,MAAOihB,IACV,2BAAOjhB,MAAO4N,IAAd,4BACA,2BAAOpB,SAAU,SAACrB,GAAD,OAAOmZ,EAAenZ,EAAEC,SAASpL,MAAO8J,GAAgB7I,MAAO2iB,EAAUxlB,MAAO6M,KAAK,SAExG,yBAAKjL,MAAOihB,IACV,2BAAOjhB,MAAO4N,IAAd,8CACA,2BAAOpB,SAAU,SAACrB,GAAD,OAAOoZ,EAASpZ,EAAEC,SAASpL,MAAO8J,GAAgB7I,MAAO2iB,EAAUzlB,QAGtF,yBAAK6B,MAAK,6BAAOihB,IAAP,IAAoBtX,UAAW,MACvC,yBAAK3J,MAAO4N,IAAZ,4BAGA,2BACEkE,OAAO,UACPlH,GAAG,wBACHK,KAAK,OACL8G,QAAQ,EACRvF,SAAU,SAACrB,GAAD,OAAOmG,EAAUnG,MAE7B,2BAAO6G,QAAQ,wBAAwBhS,MAAO,CAAE+F,MAAO,IAAKxF,OAAQ,IAAK0M,UAAW,SAAU5D,YAAa,GAAI5C,gBAAiB,SAC9H,yBAAKmD,IAAKka,EAASzG,IAAK,OAAQrd,MAAO,CAAEO,OAAQ,OAAQwF,MAAO,OAAQkM,UAAW,aAGvF,yBAAKjS,MAAO,CAAE+F,MAAO,OAAQxF,OAAQ,KAAMZ,UAAW,SAAUC,MAAOnB,EAAcgB,SAAU,GAAIiH,WAAY,WAC5GxE,GAASA,GAEZ,yBAAKlC,MAAO,CAAE+F,MAAO,OAAQxF,OAAQ,MAAOuM,QAAS,OAAQC,cAAe,QAC1E,kBAAC,GAAD,CAAQzG,QAAS,kBAAMke,KAAiBjM,YAAa,UAArD,kCACA,kBAAC,GAAD,CAAQjS,QAAS,kBAAMua,MAAvB,oBAKR,kBAAC,GAAD,QCzOFqE,GAAe,SAACplB,GAAW,IACvBqlB,EAAyCrlB,EAAzCqlB,MAAOC,EAAkCtlB,EAAlCslB,QAASC,EAAyBvlB,EAAzBulB,SAClBC,EAD2CxlB,EAAfylB,WACH,KAAO,+BAEtC,OACE,oCACE,kBAACtc,GAAD,CAAYjJ,MAAO,CAAEslB,UAAWA,IAC9B,kBAACpc,GAAD,CAAYlJ,MAAO,CAAEP,SAAUf,EAASG,QACrCsmB,GAEH,kBAAChc,GAAD,CAAuBnJ,MAAO,CAAEP,SAAUf,EAASG,OAAS2N,SAAU,SAACrB,GAAD,OAAOia,EAAQja,EAAEC,OAAOnK,QAAQgK,KAAMoa,OAOvGG,GAAkB,SAAC1lB,GAC9B,IAAM0J,EAAUC,cACRgc,EAAsC3lB,EAAtC2lB,eAAgBC,EAAsB5lB,EAAtB4lB,YAAaC,EAAS7lB,EAAT6lB,KAFG,EAGd3b,mBAAS,IAHK,oBAGjC9H,EAHiC,KAG1BgI,EAH0B,OAIFF,mBAAS,IAJP,oBAIjC3F,EAJiC,KAIpBsU,EAJoB,OAKR3O,mBAAS,IALD,oBAKjC1F,EALiC,KAKvBsU,EALuB,KAOlCgN,EAAiBxb,uBAAY,WAEjC,IAAMyb,EAAiB,uCAAG,sBAAApkB,EAAA,sEAClBC,KAAM+C,KAAKjH,EAAsB,CAAEoN,GAAI8a,EAAY9a,GAAIpG,aAAcH,IACxEzC,MAAK,SAACC,GACL,GAAwB,MAApBA,EAAS7D,OACX,OAAO0D,KAAM+C,KAAKlH,EAAyB,CAAEuoB,oBAAqBJ,EAAYlhB,aAAcuhB,mBAAoB1hB,OAGnHzC,MAAK,SAACC,GACL,GAAwB,MAApBA,EAAS7D,OAAgB,CAC3B,IAAIgoB,EAAON,EACXM,EAAI,aAAmB3hB,EACvBN,eAAeC,QAAQ,OAAQL,KAAKe,UAAUshB,IAC9CP,GAAe,GACfjc,EAAQrI,KAAK,CACXyE,SAAS,UAAD,OAAYvB,EAAZ,uBAIbpC,OAAM,SAACC,GACNC,QAAQC,IAAIF,GACRA,EAAML,SAASC,OACgC,IAAjDI,EAAML,SAASC,KAAKmkB,QAAQ,gBAC5B/b,EAAS,sHAETA,EAAS,6JAxBS,2CAAH,qDA6BjBhI,EAAQiI,IACVjI,EAAMuK,OACRvC,EAAShI,EAAM,KAEfgI,EAAS,IACT2b,OAED,CAACxhB,EAAaC,IAEX6F,EAAY,WAChB,IAAMuF,EAAMC,KAAI,CAAEC,WAAW,IACvBG,EAAe,GAEfjO,EAAO,CACX,uCAAUuC,EACV,iCAASrB,GAAUsB,IAkBf2L,EAAWP,EAAIQ,QAfN,CACbC,SAAU,CAAC,uCAAU,kCACrBlF,KAAM,SACNmF,WAAY,CACV,uCAAU,CACRnF,KAAM,SACNib,UAAW,GAEb,iCAAS,CACPjb,KAAM,SACNib,UAAW,MAMHjW,EAASnO,IAGrBmO,EAASI,OAAO/O,SAAQ,SAAAY,GACA,cAAlBA,EAAMoO,UACe,6CAAnBpO,EAAM8iB,SACRjV,EAAa5O,KAAb,8FAEA4O,EAAa5O,KAAb,4FAKJ6B,GAAUsB,KAAcqhB,GAC1B5V,EAAa5O,KAAK,oGAQpB,MALc,iBACJoJ,KAAKlG,IACb0L,EAAa5O,KAAK,oJAGb4O,GAGT,OACE,kBAACvI,GAAD,CAAaxH,MAAO,CAAE8M,QAAS,OAAQC,cAAe,SAAUrG,WAAY,SAAUsG,eAAgB,SAAUzM,OAAQ,MACtH,yBAAKP,MAAO,CAAE+F,MAAO,MAAO4D,UAAW,KACrC,yBAAK3J,MAAO,CAAEslB,UAAW,+BAAgC3Q,aAAc,iCACrE,2BAAO3U,MAAOmmB,IAAd,sDAKJ,yBAAKnmB,MAAO,CAAE+F,MAAO,MAAO4D,UAAW,GAAIzD,OAAQ,iCACjD,kBAAC,GAAD,CAAcif,MAAO,yDAAaI,YAAY,EAAMH,QAAS,SAACja,GAAD,OAAOwN,EAAexN,IAAIka,SAAU,aACjG,kBAAC,GAAD,CAAcF,MAAO,iCAASI,YAAY,EAAOH,QAAS,SAACja,GAAD,OAAOyN,EAAYzN,IAAIka,SAAU,cAE7F,2BAAOrlB,MAAO,CAAEP,SAAU,GAAIG,MAAO,MAAO+J,UAAW,KACpDzH,GAASA,GAEZ,yBAAKlC,MAAO,CAAE+F,MAAO,MAAO4D,UAAW,GAAImD,QAAS,OAAQC,cAAe,MAAOC,eAAgB,iBAChG,kBAAC,GAAD,CAAQ1G,QAAS,kBAAMmf,GAAe,IAAQlN,YAAa,UAA3D,kCAGA,kBAAC,GAAD,CAAQjS,QAAS,kBAAMsf,MAAvB,mBAQKQ,GAAe,SAACtmB,GAAW,IAC9B2lB,EAAoD3lB,EAApD2lB,eAAgBC,EAAoC5lB,EAApC4lB,YAAaC,EAAuB7lB,EAAvB6lB,KAAM7Q,EAAiBhV,EAAjBgV,aADN,EAEX9K,mBAAS,IAFE,oBAE9B9H,EAF8B,KAEvBgI,EAFuB,OAGSF,mBAAS,IAHlB,oBAG9Bqc,EAH8B,KAGbC,EAHa,OAICtc,mBAAS,IAJV,oBAI9Buc,EAJ8B,KAIjBC,EAJiB,OAKmBxc,mBAAS,IAL5B,oBAK9Byc,EAL8B,KAKRC,EALQ,KAO/Bd,EAAiBxb,uBAAY,WACjC,IAAMuc,EAAc,uCAAG,sBAAAllB,EAAA,sEACfC,KAAM+C,KAAKhH,EAA2B,CAAEmN,GAAI8a,EAAY9a,GAAItG,SAAUtB,GAAUujB,KACnF3kB,MAAK,SAACC,GACmB,MAApBA,EAAS7D,SACX8W,GAAa,GACb2Q,GAAe,OAGlBxjB,OAAM,SAACC,GACNC,QAAQC,IAAIF,GACZgI,EAAS,6JAVQ,2CAAH,qDAcdhI,EAAQiI,IACVjI,EAAMuK,OACRvC,EAAShI,EAAM,KAEfgI,EAAS,IACTyc,OAED,CAACN,EAAiBE,EAAaE,IAE5Btc,EAAY,WAChB,IAAMuF,EAAMC,KAAI,CAAEC,WAAW,IACvBG,EAAe,GAEfjO,EAAO,CACXukB,gBAAiBrjB,GAAUqjB,GAC3BE,YAAaA,EACbE,qBAAsBA,GAsBlBxW,EAAWP,EAAIQ,QAnBN,CACbC,SAAU,CAAC,kBAAmB,cAAe,wBAC7ClF,KAAM,SACNmF,WAAY,CACV,gBAAmB,CACjBnF,KAAM,SACNib,UAAW,GAEb,YAAe,CACbjb,KAAM,SACNib,UAAW,GAEb,qBAAwB,CACtBjb,KAAM,SACNib,UAAW,MA2BjB,OArBcjW,EAASnO,IAGrBmO,EAASI,OAAO/O,SAAQ,SAAAY,GACA,cAAlBA,EAAMoO,UACe,qBAAnBpO,EAAM8iB,SACRjV,EAAa5O,KAAK,gHACU,iBAAnBe,EAAM8iB,SACfjV,EAAa5O,KAAK,oJAElB4O,EAAa5O,KAAb,0HAKJolB,IAAgBE,GAClB1W,EAAa5O,KAAK,sHAEhB6B,GAAUqjB,KAAqBV,GACjC5V,EAAa5O,KAAK,sHAEb4O,GAIT,OACE,kBAACvI,GAAD,CAAaxH,MAAO,CAAE8M,QAAS,OAAQC,cAAe,SAAUrG,WAAY,SAAUsG,eAAgB,SAAUzM,OAAQ,MACtH,yBAAKP,MAAO,CAAE+F,MAAO,MAAO4D,UAAW,KACrC,yBAAK3J,MAAO,CAAEslB,UAAW,+BAAgC3Q,aAAc,iCACrE,2BAAO3U,MAAOmmB,IAAd,gDAKJ,yBAAKnmB,MAAO,CAAE+F,MAAO,MAAO4D,UAAW,GAAIzD,OAAQ,iCACjD,kBAAC,GAAD,CAAcif,MAAO,mDAAYjN,QAAS,uCAAUqN,YAAY,EAAMH,QAAS,SAACja,GAAD,OAAOmb,EAAmBnb,IAAIka,SAAU,aACvH,kBAAC,GAAD,CAAcF,MAAO,mDAAYjN,QAAS,uCAAUqN,YAAY,EAAOH,QAAS,SAACja,GAAD,OAAOqb,EAAerb,IAAIka,SAAU,aACpH,kBAAC,GAAD,CAAcF,MAAO,mDAAYjN,QAAS,uCAAUqN,YAAY,EAAOH,QAAS,SAACja,GAAD,OAAOub,EAAwBvb,IAAIka,SAAU,cAE/H,2BAAOrlB,MAAO,CAAEP,SAAU,GAAIG,MAAO,MAAO+J,UAAW,KACpDzH,GAASA,GAEZ,yBAAKlC,MAAO,CAAE+F,MAAO,MAAO4D,UAAW,GAAImD,QAAS,OAAQC,cAAe,MAAOC,eAAgB,iBAChG,kBAAC,GAAD,CAAQ1G,QAAS,kBAAMmf,GAAe,IAAQlN,YAAa,UAA3D,kCAGA,kBAAC,GAAD,CAAQjS,QAAS,kBAAMsf,MAAvB,mBAUFO,GAAkB,CAAE1mB,SAAU,GAAIC,WAAY,OAAQ2J,WAAY,GC1KlEud,GAAiB,SAAC9mB,GAAW,IAEzBgC,EAAwBhC,EAAxBgC,KAAM+kB,EAAkB/mB,EAAlB+mB,cAEd,OACE,kBAACrf,GAAD,CAAaxH,MAAO,CAAE8M,QAAS,OAAQC,cAAe,SAAUrG,WAAY,OAAQnG,OAAQ,IAAKkG,gBAAiB,UAAWR,QAAS,KACpI,yBAAKjG,MAAO,CAAE+F,MAAO,QACnB,6BACE,2BAAO/F,MAAOmmB,IAAd,0CAKJ,yBAAKnmB,MAAO,CAAE+F,MAAO,MAAO4D,UAAW,GAAIzD,OAAQ,iCACjD,kBAAC,GAAD,CAAUif,MAAO,uCAAUjN,QAASpW,EAAK0C,aAAc+gB,YAAY,EAAMjf,QAAS,kBAAMugB,GAAc,MACtG,kBAAC,GAAD,CAAU1B,MAAO,iCAASjN,QAAS,uCAAUqN,YAAY,EAAOjf,QAAS,kBAAMugB,GAAc,SAM/FC,GAAW,SAAChnB,GAAW,IACnBqlB,EAAwCrlB,EAAxCqlB,MAAOjN,EAAiCpY,EAAjCoY,QAAS5R,EAAwBxG,EAAxBwG,QAClBgf,EAD0CxlB,EAAfylB,WACF,KAAO,+BACtC,OACE,oCACE,kBAACtc,GAAD,CAAYjJ,MAAO,CAAEslB,UAAWA,IAC9B,kBAACpc,GAAD,CAAYlJ,MAAO,CAAEP,SAlHT,gCAmHT0lB,GAEH,yBAAKnlB,MAAO+mB,IACT7O,GAEH,6BACE,kBAAC,GAAD,CAAQ5R,QAAS,kBAAMA,MAAvB,oBASJ+a,GAAa,CACjBC,QAAS,CACP7a,gBAAiB,oBACjBnG,OAAQ,KAEV4X,QAAS,CACPlS,SAAU,QACVghB,UAAW,QACX7mB,IAAK,MACLwJ,UAAW,SACXN,WAAY,OACZC,YAAa,SAIX6c,GAAkB,CAAE1mB,SAAUf,EAASE,OAAQc,WAAY,QAC3DqnB,GAAe,CAAEhhB,MAAO,MAAOtG,SAlJjB,8BAkJwCwG,QAAS,GAEtDghB,GAlJC,WAAO,IAAD,EAEkBjd,mBAAS,IAF3B,oBAEb0b,EAFa,KAEAwB,EAFA,OAGYld,mBAAS,IAHrB,oBAGb1F,EAHa,KAGHsU,EAHG,OAIc5O,oBAAS,GAJvB,oBAIb6K,EAJa,KAIFC,EAJE,OAKkB9K,oBAAS,GAL3B,oBAKbmd,EALa,KAKA1B,EALA,OAMgBzb,oBAAS,GANzB,oBAMbod,EANa,KAMDC,EANC,KAOJ5d,cAEhB2C,qBAAU,WACR,GAAIyI,EAAW,CACb,IAAMoC,EAAO/R,GAAYxB,iBACnB4jB,EAAY,uCAAG,sBAAA7lB,EAAA,6DACnBU,QAAQC,IAAI6U,EAAKrM,IADE,SAEblJ,KAAM+C,KAAKxH,EAAiB,CAAE2N,GAAIqM,EAAKrM,KAC1ChJ,MAAK,SAACC,GACL,OAAOA,EAASC,QAEjBF,MAAK,SAACE,GACL,IAAM6jB,EAAO7jB,EAAK,GAAGwC,SACrBsU,EAAY+M,GACZuB,EAAejQ,GACfnC,GAAa,MAEd7S,OAAM,SAACC,GACNC,QAAQC,IAAIF,MAbG,2CAAH,qDAgBd+U,EAAKrM,KACP0c,IACAnlB,QAAQC,IAAI6U,OAGf,CAACpC,IAGJ,IAAMgS,EAAgBzc,uBAAY,SAACgd,GACjCC,EAAcD,GACd3B,GAAe,KACd,CAACA,IAGJ,OAAI5Q,EAEA,kBAACjO,GAAD,KACE,kBAAC,GAAD,MACA,kBAAC,GAAD,KACE,kBAACO,GAAD,CAAgBnH,MAAO,CAAEgN,eAAgB,aAAc3D,WAAY,KAAnE,8CAGA,kBAAC7B,GAAD,OAIF,kBAAC,GAAD,OAKF,kBAACZ,GAAD,KACE,kBAAC,GAAD,MACA,kBAAC,GAAD,KACE,kBAACO,GAAD,CAAgBnH,MAAO,CAAEgN,eAAgB,aAAc3D,WAAY,KAAnE,8CAGA,kBAAC,GAAD,CAAgBvH,KAAM4jB,EAAamB,cAAe,SAACO,GAAD,OAAgBP,EAAcO,MAChF,kBAAC,KAAD,CAAOzF,OAAQwF,EAAannB,MAAOqhB,IACjC,yBAAK5b,UAAU,qCACb,yBAAKA,UAAU,UAAUzF,MAAO,CAAEghB,WAAY,IAE1CoG,EACE,kBAAC,GAAD,CAAc3B,eAAgBA,EAAgBC,YAAaA,EAAaC,KAAMrhB,EAAUwQ,aAAcA,IAEtG,kBAAC,GAAD,CAAiB2Q,eAAgBA,EAAgBC,YAAaA,EAAaC,KAAMrhB,QAM7F,kBAAC,GAAD,Q,iZC/ER,IAmFMie,GAAiB,SAAAziB,GAAU,IACvBgC,EAA2BhC,EAA3BgC,KAAMnE,EAAqBmC,EAArBnC,gBACN6G,EAAiBkF,cAAjBlF,aACF2X,EAAY,IAAIrM,IAAIvR,GAE1B,OACE,oCACE,yBAAKyB,MAAO,CAAE+F,MAAO,MAAOxF,OAAQ,MAAO2c,UAAW,OAAQqK,YAAa,SAAUvG,WAAY,KAE7FnN,OAAOC,KAAKhS,GAAMwL,KAAI,SAAC/L,EAAMgM,GAC3B,GAAI5P,EAAgB4D,GAAO,CACzB,IAAIL,EAAQY,EAAKP,GAIjB,MAHa,WAATA,IACFL,EAAQib,EAAUxa,IAAIG,EAAKP,KAG3B,yBAAKvB,MAAO,CAAEO,OAAQ,OAAQwF,MAAO,OAAQuF,aAAc,EAAGrF,QAAS,EAAG6G,QAAS,OAAQC,cAAe,MAAOrG,WAAY,SAAUsG,eAAgB,iBACrJ,yBAAKhN,MAAO,CAAEP,SAAU,GAAIsG,MAAO,MAAOnG,MAAOnB,IAC9Cd,EAAgB4D,IAEnB,yBAAKvB,MAAO,CAAEP,SAAU,GAAIijB,UAAW,OAAQ3c,MAAO,QACnD7E,SAQf,yBAAKlB,MAAO,CAAEiN,UAAW,SAAUtD,UAAW,KAC5C,kBAAC,IAAD,CACEhE,GAAI,CACFC,SAAS,UAAD,OAAYpB,IAEtBxE,MAAO,CAAEJ,MAAO,OAAQmG,MAAO,OAAQxF,OAAQ,OAAQoJ,UAAW,KAElE,kBAAC,GAAD,yBAUJ6d,GAAmB3gB,KAAOC,IAAV,KAUArI,GAOPgpB,GAlJS,WACtB,IAAMje,EAAUC,cAEVjF,EADUkF,cACalF,aAHD,EAKJwF,mBAAS,gBAAK3L,IALV,oBAKrByD,EALqB,KAKf4lB,EALe,OAMF1d,mBAAS,IANP,oBAMrB9H,EANqB,KAMdgI,EANc,OAOcF,oBAAS,GAPvB,oBAOrB2d,EAPqB,KAONC,EAPM,KAUtBC,EAAoBzd,uBAAY,WACpCZ,EAAQrI,KAAK,CAAEyE,SAAS,UAAD,OAAYpB,OAClC,IAEGsjB,EAAoB1d,uBAAY,SAAC2d,IAChB,uCAAG,8BAAAtmB,EAAA,+EAESC,KAAM+C,KAAK7H,EAAa,aACnD,CACEqB,KAAM8pB,EAAY9pB,KAClBG,MAAO2pB,EAAY3pB,MACnBF,QAAS6pB,EAAY7pB,QACrBC,KAAM4pB,EAAY5pB,OAPF,cAEd+X,EAFc,OAUdE,EAAO9S,KAVO,SAWQ5B,KAAM+C,KAAK7H,EAAa,YAClD,CACEiB,MAAOkqB,EAAYlqB,MACnBD,SAAUmqB,EAAYxlB,QACtBxE,IAAKgqB,EAAYhqB,IACjBD,QAASiqB,EAAYjqB,QACrBuY,QAASH,EAAepU,KAAKwU,SAC7BtY,OAAQ,EACRwG,aAAcA,EACdiS,YAAaL,EACbG,YAAaH,EACbI,cAAe,OAtBC,cAwBpBkR,EAAQ,gBAAKK,IACbH,GAAiB,SAAAD,GAAa,OAAKA,KAzBf,kDA2BpBzd,EAAS,EAAD,IA3BY,0DAAH,qDA+BrB8d,KACC,IAGH,OACE,kBAACphB,GAAD,KACE,kBAAC,GAAD,MACA,kBAAC,GAAD,KACE,kBAACO,GAAD,KACE,oGAKAwgB,EACE,kBAACH,GAAD,KACE,kBAAC,GAAD,CACE1lB,KAAMA,EACNghB,eAAgB4E,EAChBjH,gBAAiBoH,EACjBrb,SAAU,SAACub,GAAD,OAAiBD,EAAkBC,IAC7C7d,SAAUA,EACVhI,MAAOA,EACPwe,WAAW,KAIf,kBAAC8G,GAAD,KACE,kBAAC,GAAD,CAAgB1lB,KAAMA,EAAMnE,gBAAiBA,MAIrD,kBAAC,GAAD,QCtEAsqB,G,uKAEF,OACE,yBAAKjoB,MAAOC,IACV,kBAAC,IAAD,KACE,kBAAC,IAAD,CAAOioB,OAAK,EAACC,KAAK,KAChB,kBAAC,IAAD,CAAUxiB,GAAG,sBAEf,kBAAC,IAAD,CAAOuiB,OAAK,EAACC,KAAK,sBAAsB5iB,UAAWgE,KACnD,kBAAC,IAAD,CAAO2e,OAAK,EAACC,KAAK,4BAA4B5iB,UAAWwE,KACzD,kBAAC,IAAD,CAAOme,OAAK,EAACC,KAAK,+BAA+B5iB,UAAWiG,KAC5D,kBAAC,IAAD,CAAO0c,OAAK,EAACC,KAAK,6BAA6B5iB,UAAWwI,KAC1D,kBAAC,IAAD,CAAOma,OAAK,EAACC,KAAK,6BAA6B5iB,UAAW6N,KAC1D,kBAAC,IAAD,CAAO8U,OAAK,EAACC,KAAK,8BAA8B5iB,UAAWqP,KAC3D,kBAAC,IAAD,CAAOsT,OAAK,EAACC,KAAK,8BAA8B5iB,UAAWwR,KAE3D,kBAAC,IAAD,CAAOmR,OAAK,EAACC,KAAK,eAAe5iB,UAAWmT,KAC5C,kBAAC,IAAD,CAAOwP,OAAK,EAACC,KAAK,gBAAgB5iB,UAAWwT,KAE7C,kBAAC,GAAD,CAAcmP,OAAK,EAACC,KAAK,uBAAuB5iB,UAAWya,KAC3D,kBAAC,GAAD,CAAckI,OAAK,EAACC,KAAK,kCAAkC5iB,UAAWoe,KACtE,kBAAC,GAAD,CAAcuE,OAAK,EAACC,KAAK,uCAAuC5iB,UAAW4e,KAC3E,kBAAC,GAAD,CAAc+D,OAAK,EAACC,KAAK,oCAAoC5iB,UAAW0hB,KACxE,kBAAC,GAAD,CAAciB,OAAK,EAACC,KAAK,oCAAoC5iB,UAAWkiB,KACxE,kBAAC,GAAD,CAAcS,OAAK,EAACC,KAAK,+BAA+B5iB,UAAWqd,KACnE,kBAAC,IAAD,CAAOrd,UAAW9E,W,GAzBV6E,aAgCZrF,GAAY,CAChBC,SAAU,QACVC,IAAK,EACLC,KAAM,EACNC,MAAO,EACPC,OAAQ,EACRC,OAAQ,OACRC,SAAU,UAGGynB,MCtDKvM,QACW,cAA7BzC,OAAOnT,SAASsiB,UAEe,UAA7BnP,OAAOnT,SAASsiB,UAEhBnP,OAAOnT,SAASsiB,SAASC,MACvB,2DCXNC,IAAS5iB,OACP,kBAAC,IAAD,KACE,kBAAC,GAAD,OAEF6iB,SAASC,eAAe,SDwHpB,kBAAmBC,WACrBA,UAAUC,cAAcC,MACrB/mB,MAAK,SAAAgnB,GACJA,EAAaC,gBAEd5mB,OAAM,SAAAC,GACLC,QAAQD,MAAMA,EAAM4mB,a,mBEzI5BvsB,EAAOC,QAAU,IAA0B,sC","file":"static/js/main.0966db5d.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/1.49bf79fe.png\";","module.exports = __webpack_public_path__ + \"static/media/topImage.3397b97b.jpg\";","module.exports = __webpack_public_path__ + \"static/media/2.06b6a65b.png\";","module.exports = __webpack_public_path__ + \"static/media/5.06906e67.png\";","module.exports = __webpack_public_path__ + \"static/media/6.b2b15bec.png\";","module.exports = __webpack_public_path__ + \"static/media/7.6782741b.png\";","module.exports = __webpack_public_path__ + \"static/media/8.85124e16.png\";","module.exports = __webpack_public_path__ + \"static/media/9.e8f65cd6.png\";","module.exports = __webpack_public_path__ + \"static/media/10.7e7a0810.png\";","module.exports = __webpack_public_path__ + \"static/media/11.c151014f.png\";","module.exports = __webpack_public_path__ + \"static/media/12.7ff69b87.png\";","module.exports = __webpack_public_path__ + \"static/media/13.6d55193d.png\";","module.exports = __webpack_public_path__ + \"static/media/14.ca867267.png\";","module.exports = __webpack_public_path__ + \"static/media/15.552807d2.png\";","module.exports = __webpack_public_path__ + \"static/media/16.7dfa1f30.png\";","module.exports = __webpack_public_path__ + \"static/media/17.c490f6ab.png\";","module.exports = __webpack_public_path__ + \"static/media/18.d4076502.png\";","module.exports = __webpack_public_path__ + \"static/media/19.4e89265a.png\";","module.exports = __webpack_public_path__ + \"static/media/completeImage.c5a44dcf.png\";","// ドメイン名\nexport const DOMAIN_NAME = 'satecon.jp';\n\n// API接続先\nlet URL = 'http://localhost:8081';\nif (process.env.NODE_ENV === 'production') {\n URL = `https://${DOMAIN_NAME}:8443`;\n}\nexport const API_URL = URL;\n// export const API_URL = 'http://localhost:8081';\n// export const API_URL = `https://${DOMAIN_NAME}:${PORT}`;\n\nexport const SERVICE_NAME = 'スマホで査定 サテコン';\nexport const SENDER_ADDRESS = 'info@satecon.jp';\n\nexport const AUTH_URL = API_URL + '/auth';\nexport const EMAIL_URL = API_URL + '/email';\nexport const INSERT_URL = API_URL + '/insert';\nexport const UPDATE_URL = API_URL + '/update';\nexport const UPLOAD_URL = API_URL + '/upload';\nexport const FETCH_URL = API_URL + '/fetch';\nexport const USER_INFO_INSERT_URL = API_URL + '/insert/user_info'; // ユーザー情報のインサート(電話番号が登録済みの場合はアップデート) method: POST, name, phone, address, mail\nexport const FETCH_STORE_URL = API_URL + '/fetch/store_info'; //アカウント設定(account_name, password)のアップデート method: POST, body id\nexport const DATA_LIST_URL = API_URL + '/fetch/data_list'; // 査定依頼車、ユーザー、その画像(一枚, ファイルフォーマット)フェッチしてくる method: GET\nexport const IMG_DESC_URL = API_URL + '/fetch/car_img_desc'; // 車の写真とその詳細文をフェッチしてくる。 詳細ページで使う。 method: POST, body: car_id\nexport const SIGNED_URL = API_URL + '/signedurl/?filename='; // 著名付きURLを取得してくる\nexport const STATUS_UPDATE_URL = API_URL + '/update/car_status'; // 査定依頼車のステータスアップデート method: POST, body\" id(car_id), status([number])\nexport const CAR_INFO_UPDATE_URL = API_URL + '/update/car_info'; // 査定依頼車の詳細アップデート method: POST, body id, maker, car_type, age, mileage, status\nexport const STORE_INFO_UPDATE_URL = API_URL + '/update/store_info'; // 店舗情報のアップデート method: POST, body id, name, address, phone, mail, logo_image\nexport const CAR_INFO_UID_UPDATE_URL = API_URL + '/update/car_info/account_name'; // 査定依頼車(account_name)のアップデート method: POST, body: before_account_name, after_account_name\nexport const STORE_UID_UPDATE_URL = API_URL + '/update/store_info/account_name'; // 店舗アカウント情報(account_name)のアップデート method: POST, body: account_name, id\nexport const STORE_PASSWORD_UPDATE_URL = API_URL + '/update/store_info/password'; // 店舗アカウント情報(password)のアップデート method: POST, body: password, id\nexport const CAR_INFO_DELTE_URL = API_URL + '/delete/car_info'; // 査定依頼者の消去 method: POST, body id;\n\nexport const detailDataLabel = { car_type: '車名', maker: 'メーカー', mileage: '走行距離', age: '年式', status: 'ステータス', name: '名前', address: '住所', mail: 'メールアドレス', phone: '電話番号' };\nexport const registerForm = { maker: null, car_type: null, age: null, mileage: null, status: 0, name: null, phone: null, mail: null };\n\nexport const mileages = [\n '〜5000',\n '5001〜10000',\n '10001〜15000',\n '15001〜20000',\n '20001〜25000',\n '25001〜30000',\n '30001〜35000',\n '35001〜40000',\n '40001〜45000',\n '45001〜50000',\n '50001〜55000',\n '55001〜60000',\n '60001〜65000',\n '65001〜70000',\n '70001〜75000',\n '75001〜80000',\n '80001〜85000',\n '85001〜90000',\n '90001〜95000',\n '95001〜100000',\n '100001〜105000',\n '100001〜105000',\n '100001〜105000',\n '100001〜105000',\n '100001〜110000',\n '110001〜115000',\n '115001〜120000',\n '120001〜125000',\n '125001〜130000',\n '130001〜135000',\n '135001〜140000',\n '140001〜145000',\n '145001〜150000',\n '150001〜',\n];\n\nexport const statuses = [\n [0, '新規登録'],\n [1, 'メール送信済み'],\n [2, '査定依頼有り'],\n [3, '査定中'],\n [4, '成約'],\n [5, 'キャンセル'],\n];\n\nexport const errorMessages = [\n ['maker', 'メーカーを選択してください。'],\n ['carType', '適切な車種を選択してください。'],\n ['age', '年式を選択してください。'],\n ['mileage', '走行距離を記入してください。'],\n ['name', '名前を記入してください。'],\n ['phone', '電話番号を記入してください。'],\n ['address', '住所を記入してください。'],\n ['mail', 'メールアドレスを記入してください。'],\n];\n\nexport const Colors = {\n background: '#FFFFFF',\n bodyBackgroundColor: '#FAFAFA',\n delete: '#CC6464',\n enable: '#000000',\n btnHoverColor: '#999999',\n cancelBtnColor: '#CCCCCC',\n required: '#FF5A5F',\n error: 'red',\n labelColor: 'gray',\n customerBtnEnabled: '#64B8CC',\n customerBtnDisabled: 'gray',\n customerInputProgressed: 'black',\n customerInputUnprogressed: '#D9D9D9'\n}\n\nexport const TextSize = {\n large: 'min(24px, max(20px, 1.5vw))',\n medium: 'min(20px, max(16px, 1.2vw))',\n small: 'min(14px, max(10px, 0.9vw))',\n}\n\nexport const StatusColor = [\n [0, '#6494CC'], //新規登録\n [1, '#CC6464'], //査定依頼有り\n [2, '#CCBC64'], //査定中\n [3, '#CCBC64'], //成約\n [4, '#C7C7C7'], //キャンセル\n [5, '#64B8CC'], //メール送信済み\n]\n\nexport const exampleCSVdata = [\n {\n 氏名: '山田太郎',\n 電話: '080-1010-2020',\n メール: 'example1@gmail.com',\n 住所: '栃木県那須塩原市',\n メーカー: 'トヨタ',\n 車種: 'カローラ',\n 年式: 2010,\n 走行距離: '10000',\n },\n {\n 氏名: '山田次郎',\n 電話: '080-2020-3030',\n メール: 'example2@gmail.com',\n 住所: '栃木県那須塩原市',\n メーカー: 'トヨタ',\n 車種: 'カローラ',\n 年式: 2012,\n 走行距離: '10000',\n }\n]","import React from 'react';\nimport { TextSize } from '../config';\n\nconst Title = (props) => {\n const { titleText } = props;\n return (\n
\n {titleText}\n
\n )\n};\n\nconst titleStyle = { fontSize: TextSize.small, fontWeight: '600', textAlign: 'center', color: 'black' }\n\nexport default Title;","import React from 'react';\n//components\nimport Title from '../Components/Title';\n\nconst NotFound = () => {\n return (\n
\n \n </div >\n );\n};\n\nconst container = {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n zIndex: 0,\n height: '100vh',\n overflow: 'scroll',\n};\n\nexport default NotFound;","import axios from 'axios';\nimport { FETCH_URL, mileages, statuses } from './config';\nimport parsePhoneNumber, { AsYouType } from 'libphonenumber-js';\nimport crypto from 'crypto';\nimport moment from 'moment';\nimport koyomi from 'koyomi';\n\nexport function getAgeOptions() {\n const startDate = new Date();\n const endDate = new Date(1960, 1, 1);\n\n const ageOptions = [];\n for (let i = startDate.getFullYear(); i >= endDate.getFullYear(); i--) {\n var age = {\n value: i,\n label: i\n }\n ageOptions.push(age);\n }\n\n return ageOptions;\n};\n\nexport function getWarekiOptions() {\n const startDate = new Date();\n const endDate = new Date(1960, 1, 1);\n\n const ageOptions = [];\n for (let i = startDate; i >= endDate; i.setFullYear(i.getFullYear() - 1)) {\n\n var age = {\n value: koyomi.format(i, 'GGN年'),\n label: koyomi.format(i, 'GGN年')\n }\n ageOptions.push(age);\n }\n\n return ageOptions;\n};\n\nexport function getMileageOptions() {\n const mileageOptions = [];\n mileages.forEach(item => {\n var mileage = {\n value: item,\n label: item\n }\n mileageOptions.push(mileage);\n });\n\n return mileageOptions;\n};\n\nexport async function getMakerOptions() {\n return await axios.get(FETCH_URL + '/maker')\n .then((response) => {\n if (response.status === 200) {\n return response.data;\n }\n })\n .then((result) => {\n const makerOptions = [];\n result.forEach(item => {\n var maker = {\n value: item.maker,\n label: item.maker\n }\n makerOptions.push(maker);\n });\n\n return makerOptions;\n })\n .catch((error) => {\n console.log('error', error);\n });\n};\n\nexport async function getCarTypeOptions(maker) {\n return await axios.get(FETCH_URL + `/car_type?maker=${maker}`)\n .then((response) => {\n if (response.status === 200) {\n return response.data;\n }\n })\n .then((result) => {\n const carTypeOptions = [];\n result.forEach(item => {\n var carType = {\n value: item.car_type,\n label: item.car_type\n }\n carTypeOptions.push(carType);\n });\n\n return carTypeOptions;\n })\n .catch((error) => {\n console.log('error', error);\n });\n};\n\nexport function getStatusOptions() {\n const statusOptions = [];\n statuses.forEach(item => {\n var status = {\n value: item[0],\n label: item[1]\n }\n statusOptions.push(status);\n });\n\n return statusOptions;\n};\n\n// 電話番号の有効性チェック関数\nexport function phoneNumberNoneProblem(val) {\n if (val) {\n const parsedPhoneNumber = parsePhoneNumber('+81' + val, 'JA');\n return parsedPhoneNumber ? parsedPhoneNumber.isValid() : false;\n } else {\n return false;\n }\n}\n\n// 電話番号を整形する関数\nexport function formatTel(val) {\n return new AsYouType('JP').input(val);\n}\n\nexport function cryptHash(str) {\n return crypto.createHash('sha256').update(str, 'utf8').digest('hex');\n}\n\nexport function Now() {\n return moment().format('YYYY-MM-DD HH:mm:ss');\n}","import axios from 'axios';\nimport { AUTH_URL } from \"../config.js\";\n//functions\nimport { cryptHash } from '../Functions';\n\nclass AuthService {\n isLoggedIn = () => this.get('isLoggedIn') === 'true';\n getCurrentUser = () => JSON.parse(this.get('user'));\n\n set = (key, value) => sessionStorage.setItem(key, value);\n get = key => this.getSessionStorage(key);\n\n getSessionStorage = key => {\n const ret = sessionStorage.getItem(key);\n if (ret) {\n return ret;\n }\n return null;\n };\n\n // ログイン処理\n login = async (accountName, password) => {\n const json = {\n account_name: accountName,\n password: cryptHash(password)\n };\n\n return await axios.post(AUTH_URL + '/signin', json)\n .then(result => {\n if (result.status === 200) {\n if (result.data[0]) {\n this.set('isLoggedIn', true);\n this.set('user', JSON.stringify(result.data[0]));\n\n return result.data[0].account_name;\n }\n }\n });\n };\n\n // ログアウト処理\n logout = () => {\n if (this.isLoggedIn()) {\n this.set('isLoggedIn', false);\n this.set('user', null);\n }\n };\n}\n\nexport default new AuthService();\n","import React, { Component } from 'react'\nimport { Route, Redirect } from 'react-router-dom'\nimport NotFound from './Screens/NotFound';\nimport AuthService from './Services/AuthService';\n\nclass PrivateRoute extends Component {\n constructor(props) {\n super(props)\n this.state = {\n loading: true,\n isLoggedIn: false,\n isAuthenticated: false\n };\n };\n\n async componentDidMount() {\n const { computedMatch } = this.props;\n const isLoggedIn = AuthService.isLoggedIn();\n const store_info = AuthService.getCurrentUser();\n let isAuthenticated = false;\n\n if (isLoggedIn && computedMatch) {\n if (store_info.account_name === computedMatch.params.account_name) {\n isAuthenticated = true;\n }\n }\n \n this.setState({\n loading: false,\n isLoggedIn: isLoggedIn,\n isAuthenticated: isAuthenticated\n });\n };\n\n render() {\n const { component: Component, ...rest } = this.props;\n const { loading, isLoggedIn, isAuthenticated } = this.state;\n\n if (loading) {\n return <div className=\"loading\">Loading...</div>\n }\n\n return (\n <Route {...rest} render={() => {\n if (!isLoggedIn) {\n return <Redirect to={{ pathname: '/admin/login', state: { from: this.props.location } }} />\n } else if (!isAuthenticated) {\n return <NotFound></NotFound>\n }\n return <Component {...this.props} />\n }}\n />\n )\n }\n}\n\nexport default PrivateRoute","import React from 'react';\nimport { Colors } from '../config';\n\nconst SubmitButton = (props) => {\n const { buttonText, onClick, isEnabled } = props;\n const containerStyle = isEnabled ? { ...container, backgroundColor: Colors.customerBtnEnabled } : { ...container, backgroundColor: Colors.customerBtnDisabled };\n\n return (\n <div style={{ textAlign: 'center', alignItems: 'center' }}>\n <button onClick={onClick} style={containerStyle} disabled={!isEnabled}>{buttonText}</button>\n </div>\n )\n};\n\nconst container = {\n width: '75%',\n maxWidth: 300,\n height: 30,\n padding: 3,\n fontSize: 12,\n border: 'none',\n margin: 'auto',\n color: 'white',\n}\n\nexport default SubmitButton;","import styled from 'styled-components';\nimport { TextSize, Colors } from \"../config\";\n\nexport const Container = styled.div`\nwidth: 100vw;\nmin-height: 100%;\nheight: auto;\nbackground-color: ${Colors.background};\ndisplay: flex;\nflex-direction: column;\nalign-items: center;\njustify-content: center;\n`\n\nexport const HeaderStyle = styled.nav`\n height: 120px;\n width: 100%;\n display: flex;\n flex-direction: column;\n font-size: 1rem;\n position: fixed;\n top: 0;\n z-index: 1;\n background-color: white;\n align-items: center;\n box-shadow: 1px 1px 5px #BFBFBF;\n @media screen and (max-width: 620px) {\n height: 60px;\n }\n`\nexport const HeaderLogo = styled.div`\n margin-left: 30px;\n width: 55px;\n height: 70%;\n background-color: #D2D5D7;\n text-align: center;\n @media screen and (max-width: 620px) {\n width: calc(60px * 0.7);\n margin-left: calc(10px + 1vw);\n }\n`\n\nexport const HeaderTitle = styled.div`\n margin-left: 20px;\n text-align: center;\n font-weight: 600; \n font-size: ${TextSize.medium};\n`\n\nexport const HeaderIcons = styled.div`\n position: fixed;\n right: 1.3em;\n display: flex;\n flex-direction: row;\n align-items: center;\n @media screen and (max-width: 620px) {\n right: 10px;\n }\n`\n\nexport const SideBarContent = styled.div`\n background-color: white;\n height: 100%;\n width: 15vw;\n font-size: calc(10px + 1vw);\n position: fixed;\n top: 0;\n z-index: 0;\n display: flex;\n margin-top: 82px;\n background-clip: padding-box;\n @media screen and (max-width: 620px) {\n display: none;\n }\n`\nexport const SideBarItemsContiner = styled.div`\n width: 100%;\n font-size: 15px;\n justify-content: center;\n padding: 0px 0px 6px 5px;\n`\n\nexport const SideBarItem = styled.li`\n height: 30px;\n list-style: none;\n padding: 8px 5px 8px 10px;\n z-index: 1;\n`\n\nexport const SideBarIcon = styled.div`\n display: none;\n @media screen and (max-width: 620px) {\n display: flex;\n position: absolute;\n top: 15px;\n left: 10px;\n }\n`\n\nexport const TitleContainer = styled.div`\n display: felx;\n flex-direction: column;\n with: 95%;\n margin-top: 25px;\n margin-bottom: 25px;\n font-size: ${TextSize.large};\n @media screen and (max-width: 620px) {\n margin-top: 5px;\n }\n`\n\nexport const MasterContainer = styled.div`\n width: 100%; \n display: flex;\n flex-direction: row;\n justify-content: space-between;\n margin-bottom: 10px;\n @media screen and (max-width: 620px) {\n flex-direction: column;\n justify-content: none;\n }\n`\n\nexport const MasterItem = styled.div`\n display: flex;\n flex-direction:row;\n @media screen and (max-width: 620px) {\n width: 80%;\n align-self: center;\n justify-content: space-around;\n margin-bottom: 10px;\n }\n`\n\nexport const Body = styled.div`\n width: 95%;\n max-width:1300px;\n margin-top: 120px;\n font-size: calc(10px + 1vw);\n justify-self: center;\n z-index: 0;\n margin: aout;\n @media screen and (max-width: 620px) {\n margin-top: 80px;\n width: 95%;\n padding-right: 0px;\n padding-left: 0px;\n }\n`\n\nexport const BodyElement = styled.div`\n width: 100%;\n height: 70vh;\n background-color: white;\n margin-top: 10px;\n display: flex;\n flex-direction: row;\n @media screen and (max-width: 800px) {\n height: 140vh;\n flex-direction: column;\n justify-content: center;\n }\n`\n\nexport const BodyItem = styled.div`\n height:100%;\n width:50%;\n padding: 30px;\n text-align: center;\n display: flex; \n flex-direction: column; \n @media screen and (max-width: 800px) {\n width: 100%;\n height: 50%;\n }\n`\n\nexport const FooterStyle = styled.div`\n background-color: white;\n height: 100%\n min-height: 132px;\n width: 100%;\n margin-top: 100px; \n display: flex;\n flex-direction: row;\n padding: 20px;\n // box-shadow: 1px -1px 5px #BFBFBF;\n border-top: solid 2px black;\n @media screen and (max-width: 620px) {\n height: auto;\n flex-direction: column;\n justify-content: center;\n }\n`\n\nexport const FooterColumn = styled.div`\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n @media screen and (max-width: 620px) {\n flex-direction: column;\n justify-content: space-around;\n align-items: center;\n margin-bottom: 20px;\n }\n`\nexport const FooterItems = styled.div`\n height: 100%;\n display: flex;\n flex-direction: row;\n @media screen and (max-width: 620px) {\n flex-direction: column;\n justify-content: space-around;\n align-items: center;\n margin-bottom: 20px;\n }\n`\n\nexport const SearchContainerStyle = styled.div`\n width: 60%;\n min-width: 300px;\n text-align: end;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n @media screen and (max-width: 620px) {\n width: 90%;\n align-self: center;\n justify-content: space-around;\n margin-bottom: 10px;\n }\n`\nexport const SearchBoxStyle = styled.div`\n background-color: white;\n height: 30px;\n width: 320px;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-around;\n margin-right: 10px;\n border: solid 2px black;\n @media screen and (max-width: 620px) {\n width: 90%;\n height: 25px;\n }\n`\n\nexport const SearchInput = styled.input`\n // width: 40%;\n width: 90%;\n max-width: 300px;\n height: 100%;\n padding-left: 10px;\n align-self: center;\n border-width:0px;\n border:0px;\n outline:0px;\n font-size: ${TextSize.small};\n`\n\nconst getColor = (props) => {\n if (props.isDragAccept) {\n return '#00e676';\n }\n if (props.isDragReject) {\n return '#ff1744';\n }\n if (props.isDragActive) {\n return '#2196f3';\n }\n return '#eeeeee';\n}\n\nexport const DropZone = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: px;\n border-width: 2px;\n border-radius: 2px;\n border-color: ${props => getColor(props)};\n border-style: dashed;\n background-color: #fafafa;\n color: #bdbdbd;\n outline: none;\n transition: border .24s ease-in-out;\n`;\n\nexport const DropDownStyle = styled.div`\n position: absolute;\n top: 40px;\n right: -100px;\n width: 200px;\n transform: translateX(-45%);\n background-color: white;\n align-items: center;\n box-shadow: 1px 1px 5px #BFBFBF;\n padding: 1rem;\n overflow: hidden;\n\n`\n\nexport const DropDownItemStyle = styled.div`\n height: 50px;\n display: flex;\n align-items: center;\n padding: 0.5rem;\n transition: background-color 300ms;\n &:hover {\n background-color: rgba(250,250,250,1);\n } \n`\n\nexport const CustomerContainer = styled.div`\n width: 100%;\n z-index: 0;\n overflow-y: scroll;\n background-color: white;\n`\n\nexport const LoginStyle = styled.div`\n width: 300px;\n height: 60%;\n background-color: white;\n margin: auto;\n text-align: center;\n justify-content: center;\n`\n\nexport const ItemDisplayStyle = styled.div`\n width: 100%;\n background-color: white;\n display: flex;\n flex-direction: row;\n padding: 10px;\n @media screen and (max-width: 620px) {\n flex-direction: column;\n padding-top: 10px;\n }\n`\n\nexport const ImageDisplayStyle = styled.div`\n width: 45%;\n height: 100%;\n padding:64px 0 0 24px;\n @media screen and (max-width: 620px) {\n padding-left: 0px;\n padding-top: 20px;\n width: 100%;\n margin: auto;\n }\n`\n\nexport const InfoDisplayStyle = styled.div`\n width: 55%;\n height: 100%;\n @media screen and (max-width: 620px) {\n width: 90%;\n margin: auto;\n text-align: center;\n }\n`\n\nexport const InfoButtonDisplayStyle = styled.div`\n height: 10%;\n text-align: end;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n padding: 24px 5px 5px 5px;\n @media screen and (max-width: 620px) {\n text-align: center;\n }\n`\n\nexport const CardListStyle = styled.div`\n width: 100%;\n height: 120px;\n background-color: white;\n display: flex;\n flex-direction: row;\n border-bottom: solid 1px lightgray;\n padding: 5px 0 5px 0;\n @media screen and (max-width: 620px) {\n flex-direction: column;\n height: auto;\n }\n`\n\nexport const ListItemInfoStyle = styled.div`\n display: flex;\n flex-direction: row;\n height: 100%;\n width: calc(100% - 120px);\n align-self: center;\n border-right: solid 1px lightgray;\n @media screen and (max-width: 620px) {\n width: 100%;\n margin-bottom: 10px;\n border-right: none;\n }\n`\n\nexport const ListImageStyle = styled.img`\n height: 100%;\n width: 100%;\n object-fit: cover;\n @media screen and (max-width: 620px) {\n height: 70%;\n object-fit: cover;\n }\n`\n\nexport const ListItemButtonStyle = styled.div`\n display: flex;\n width: 120px;\n justify-content: center;\n align-items: center;\n @media screen and (max-width: 620px) {\n width: 100%;\n }\n`\n\nexport const TableStyle = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-around;\n align-items: center;\n height: 45px;\n @media screen and (max-width: 620px) {\n flex-direction: column;\n height: auto;\n text-align: center;\n }\n`\n\nexport const TableTitle = styled.div`\n width: 30%;\n border-right: 1px solid rgba(0, 0, 0, 0.1);\n text-align: center;\n @media screen and (max-width: 620px) {\n width: 100%;\n margin-bottom: 5px;\n }\n`\nexport const EditTableContentInput = styled.input`\n width: 60%;\n @media screen and (max-width: 620px) {\n width: 95%;\n }\n`","import React from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\n//components\nimport SubmitButton from '../../Components/SubmitButton';\nimport { CustomerContainer } from '../../Components/StyledComponents';\n//config\nimport { TextSize, Colors } from '../../config';\n\nconst Top = () => {\n const history = useHistory();\n const { account_name } = useParams();\n\n const onClick = () => {\n history.push({\n pathname: `/user/${account_name}/phone`,\n });\n };\n\n return (\n <CustomerContainer>\n <div style={{ textAlign: 'center', margin: '20% 0 15% 0' }}>\n <div style={{ fontSize: TextSize.small }}>\n スマホで査定\n </div>\n <div style={{ fontSize: TextSize.large, fontWeight: '600', marginTop: -4 }}>\n サテコン\n </div>\n </div>\n <div style={imageContainer}>\n <img src={require('../../assets/topImage.jpg')} style={{ width: '100%', height: '100' }} />\n </div>\n <div style={{ textAlign: 'center', padding: '8% 0 15% 0' }}>\n <div style={{ fontSize: TextSize.small, fontWeight: '600' }}>\n お手持ちのスマートフォンから\n </div>\n <div style={{ fontSize: TextSize.small, fontWeight: '600' }}>\n あなたの愛車を簡単査定!\n </div>\n </div>\n <SubmitButton buttonText='さぁ、始めましょう' onClick={() => onClick()} isEnabled={true} />\n </CustomerContainer >\n );\n};\n\nconst imageContainer = {\n width: '75%',\n maxWidth: 350,\n marginLeft: 'auto',\n marginRight: 'auto'\n}\n\nconst container = {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n zIndex: 0,\n height: '100vh',\n overflow: 'scroll',\n};\n\nexport default Top;","import React, { useState, useCallback } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { Alert } from 'react-bootstrap';\nimport axios from 'axios';\nimport { FETCH_URL, TextSize } from '../../config';\n//components\nimport Title from '../../Components/Title';\nimport SubmitButton from '../../Components/SubmitButton';\nimport { CustomerContainer } from '../../Components/StyledComponents';\n//functions\nimport { phoneNumberNoneProblem, formatTel } from '../../Functions';\n\nconst Phone = () => {\n const history = useHistory();\n const [phone, setPhone] = useState('');\n const [error, setError] = useState('');\n const { account_name } = useParams();\n\n const checkForm = useCallback(() => {\n if (!phoneNumberNoneProblem(phone)) {\n setError('電話番号の形式が正しくありません');\n return true;\n }\n\n const formatedPhoneNumber = formatTel(phone);\n const isHaihun = RegExp('-');\n\n if (!isHaihun.test(formatedPhoneNumber)) {\n setError('電話番号の形式が正しくありません');\n return true;\n }\n\n const getGeneralInfo = async (phoneNumber) => {\n return await axios.get(FETCH_URL + `/generalinfo?phone=${phoneNumber}&account_name=${account_name}`)\n .then((response) => {\n if (response.status === 200) {\n return response.data[0];\n }\n })\n .then((result) => {\n if (result) {\n const generalInfo = {\n maker: result.maker,\n carType: result.car_type,\n age: result.age,\n mileage: result.mileage,\n name: result.name,\n phone: result.phone,\n address: result.address,\n mail: result.mail,\n isUpdate: true,\n carId: result.id\n };\n\n history.push({\n pathname: `/user/${account_name}/input`,\n state: { generalInfo: generalInfo }\n });\n } else {\n history.push({\n pathname: `/user/${account_name}/pincode`,\n state: { phone: formatedPhoneNumber }\n });\n }\n })\n .catch((error) => {\n console.log('error', error);\n });\n }\n\n getGeneralInfo(formatedPhoneNumber);\n }, [history, phone, account_name]);\n\n return (\n <CustomerContainer>\n <div style={{ marginTop: '20%' }} />\n {error && (\n <div style={{ whiteSpace: 'pre-line' }}>\n <Alert variant=\"danger\">{error}</Alert>\n </div>\n )}\n <Title titleText='電話番号を入力してください。' />\n <div style={{ textAlign: 'center', padding: '8% 0px 20% 0' }}>\n <input type=\"tel\" name=\"phone\" onBlur={(e) => setPhone(e.target.value)} style={inputContainer} placeholder={'03-1234-5678'} />\n </div >\n <div style={{ fontSize: TextSize.small, fontWeight: '600', textAlign: 'center', marginBottom: '20%' }}>\n <div>\n 送信後、確認コードを含む\n </div>\n <div>\n テキストメッセージが届きます。\n </div>\n </div>\n <SubmitButton buttonText='続ける' onClick={checkForm} isEnabled={true} />\n </CustomerContainer >\n );\n};\n\n\nconst inputContainer = { fontSize: 14, maxWidth: 300, width: '80%', textAlign: 'center' };\n\nexport default Phone;","import axios from 'axios';\nimport { API_URL } from \"../config.js\";\n\nclass SmsService {\n sendPINcode = async (PINcode, to_number) => {\n const json = {\n \"message\": `お客様の確認コードは ${PINcode} です。`,\n \"to_number\": '+81' + to_number.replace('-', ''),\n \"sender\": 'satecon',\n };\n\n return await axios.post(API_URL + '/notification', json);\n };\n}\n\nexport default new SmsService();","import React, { useEffect, useState } from 'react';\nimport { useHistory, useLocation, useParams } from 'react-router-dom';\nimport ReactCodeInput from 'react-code-input';\nimport { Alert } from 'react-bootstrap';\n//components\nimport Title from '../../Components/Title';\nimport SubTitle from '../../Components/SubTitle';\nimport { CustomerContainer } from '../../Components/StyledComponents'\n//service\nimport SmsService from \"../../Services/SmsService\";\n//config\nimport { TextSize } from '../../config';\n\nconst PINcode = () => {\n const history = useHistory();\n const rand = (\"0000000\" + Math.floor(Math.random() * 10000000)).slice(-6); // generate 6 digit conbined number\n const [PINcode, setPINcode] = useState(rand);\n const [phone, setPhone] = useState('');\n const [error, setError] = useState('');\n const { state } = useLocation();\n const { account_name } = useParams();\n console.log(PINcode);\n\n useEffect(() => {\n console.log(PINcode);\n if (state) {\n const { phone } = state;\n setPhone(phone);\n } else {\n history.push({\n pathname: `/user/${account_name}`,\n });\n }\n }, [state])\n\n useEffect(() => {\n console.log(PINcode);\n if (phone) {\n if (process.env.NODE_ENV === 'production') {\n // SMS通知\n SmsService.sendPINcode(PINcode, phone);\n }\n }\n }, [PINcode, phone]);\n\n const checkPIN = (e) => {\n console.log(e);\n if (e.length === 6) {\n if (e === PINcode) {\n const generalInfo = {\n phone: phone,\n isUpdate: false,\n };\n\n history.push({\n pathname: `/user/${account_name}/input`,\n state: { generalInfo: generalInfo }\n });\n } else {\n setError('確認コードが間違っています');\n }\n } else {\n setError('');\n }\n };\n\n const onClick = (e) => {\n e.preventDefault();\n const rand = (\"0000000\" + Math.floor(Math.random() * 10000000)).slice(-6); // generate 6 digit conbined number\n setPINcode(rand);\n setError('');\n };\n\n return (\n <CustomerContainer>\n <div style={{ marginTop: '20%' }} />\n {error && (\n <div style={{ whiteSpace: 'pre-line' }}>\n <Alert variant=\"danger\">{error}</Alert>\n </div>\n )}\n <Title titleText='確認コードを入力してください。' />\n <div style={{ textAlign: 'center', margin: '10% 0 10% 0' }}>\n <ReactCodeInput type='tel' fields={6} inputStyle={{ width: '38px', height: '40px', fontSize: '20px', margin: '3px', textAlign: 'center' }} onChange={(e) => checkPIN(e)} />\n </div>\n <div style={{ marginTop: '1%' }} />\n {\n process.env.NODE_ENV !== 'production'\n ? <SubTitle subTitleText={`※開発者用確認コード : ${PINcode}`} />\n : null\n }\n <div style={{ textAlign: 'center' }}>\n <a href=\"#\" onClick={onClick} isEnabled={true} style={underlineText}>\n コードが届いていない場合\n </a>\n </div>\n </CustomerContainer>\n );\n};\n\nconst underlineText = { color: 'black', fontSize: TextSize.small, textDecoration: 'underline' }\nexport default PINcode;","import React, { useCallback } from 'react';\nimport { Colors } from '../config';\n\n\nconst InputProgressBar = (props) => {\n\n const { currentIndex } = props;\n const textList = ['査定情報入力', '写真入力', '完了'];\n\n const getProgress = (text, index) => {\n let style = { ...progressStyle };\n if (index <= currentIndex) { // color upto current progress\n style = { ...style, backgroundColor: Colors.customerInputProgressed };\n return (\n <div style={progressContainer}>\n <div style={style}>\n {text}\n </div>\n {\n index === currentIndex ?\n <div style={{ height: 1, width: '100%', backgroundColor: '#4FB6D2', marginTop: 1 }} />\n :\n null\n }\n </div>\n )\n } else { // color gray for next progress\n style = { ...style, backgroundColor: Colors.customerInputUnprogressed };\n return (\n <div style={progressContainer}>\n <div style={style}>\n {text}\n </div>\n {\n index === currentIndex ?\n <div style={{ height: 1, width: '100%', backgroundColor: '#4FB6D2' }} />\n :\n null\n }\n </div>\n )\n }\n }\n\n return (\n <div style={barStyle}>\n {\n textList.map((item, index) => {\n return getProgress(item, index);\n })\n }\n </div>\n );\n};\n\n\nconst barStyle = {\n height: 30,\n width: '85%',\n maxWidth: 300,\n display: 'flex',\n flexDirection: 'row',\n margin: '10% auto 10% auto',\n fontSize: 10,\n color: 'white',\n justifyContent: 'center',\n alignSelf: 'center'\n}\nconst progressContainer = {\n height: '100%',\n width: '30%',\n display: 'flex',\n flexDirection: 'column',\n marginRight: 1\n}\n\nconst progressStyle = {\n height: 28,\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n}\n\nconst underLineStyle = {\n\n}\n\nexport default InputProgressBar","import React, { useCallback, useEffect, useState } from 'react';\nimport { useHistory, useLocation, useParams } from 'react-router-dom';\nimport { Alert } from 'react-bootstrap';\nimport CreatableSelect from 'react-select/creatable'\nimport Ajv from 'ajv';\nimport styled from 'styled-components';\nimport { errorMessages, Colors, TextSize } from '../../config';\n//components\nimport Title from '../../Components/Title';\nimport SubmitButton from '../../Components/SubmitButton';\nimport { CustomerContainer } from '../../Components/StyledComponents';\nimport InputProgressBar from '../../Components/InputProgressBar';\n//functions\nimport { getMakerOptions, getCarTypeOptions, getAgeOptions, getWarekiOptions, getMileageOptions } from '../../Functions';\n\nconst Input = () => {\n const history = useHistory();\n const { state } = useLocation();\n const [maker, setMaker] = useState('');\n const [carType, setCarType] = useState('');\n const [age, setAge] = useState('');\n const [mileage, setMileage] = useState('');\n const [name, setName] = useState('');\n const [phone, setPhone] = useState('');\n const [address, setAddress] = useState('');\n const [mail, setMail] = useState('');\n const [isUpdate, setIsUpdate] = useState(false);\n const [carId, setCarId] = useState();\n const [checked, setChecked] = useState('西暦');\n const [makerOptions, setMakerOptions] = useState([]);\n const [carTypeOptions, setCarTypeOptions] = useState([]);\n const [ageOptions, setAgeOptions] = useState([]);\n const [mileageOptions, setMileageOptions] = useState([]);\n const [carImageData, setCarImageData] = useState([]);\n const [error, setError] = useState('');\n const { account_name } = useParams();\n\n // if user went back to this page from next page\n useEffect(() => {\n if (state) {\n const { generalInfo, carImages } = state; // fetch previous input info\n setMaker(generalInfo.maker);\n setCarType(generalInfo.carType);\n setAge(generalInfo.age);\n setMileage(generalInfo.mileage);\n setName(generalInfo.name);\n setPhone(generalInfo.phone);\n setAddress(generalInfo.address);\n setMail(generalInfo.mail);\n setIsUpdate(generalInfo.isUpdate);\n setCarId(generalInfo.carId);\n //for photos\n setCarImageData(carImages);\n } else {\n history.push({\n pathname: `/user/${account_name}`,\n });\n }\n }, [state])\n\n\n useEffect(() => {\n const ageOptions = getAgeOptions();\n setAgeOptions(ageOptions);\n\n const miliageOptions = getMileageOptions();\n setMileageOptions(miliageOptions);\n\n const getMakers = async () => {\n const makerOptions = await getMakerOptions();\n setMakerOptions(makerOptions);\n }\n\n getMakers();\n }, []);\n\n useEffect(() => {\n const getCarTypes = async () => {\n setCarTypeOptions([]);\n const carTypeOptions = await getCarTypeOptions(maker);\n setCarTypeOptions(carTypeOptions);\n };\n\n getCarTypes();\n }, [maker]);\n\n const onChangeMaker = (e) => {\n if (!e) {\n setMaker('');\n } else {\n setMaker(e.value);\n }\n\n setCarType('');\n };\n\n const onChangeCarType = (e) => {\n if (!e) {\n setCarType('');\n } else {\n setCarType(e.value);\n }\n };\n\n const onChangeAge = (e) => {\n if (!e) {\n setAge('');\n } else {\n setAge(e.value);\n }\n };\n\n const onChangeMileage = (e) => {\n if (!e) {\n setMileage('');\n } else {\n setMileage(e.value);\n }\n };\n\n const onChecked = (e) => {\n\n if (e === '西暦') {\n const ageOptions = getAgeOptions();\n setAgeOptions(ageOptions);\n } else {\n const warekiOptions = getWarekiOptions();\n setAgeOptions(warekiOptions);\n }\n\n setChecked(e);\n };\n\n const checkForm = useCallback(() => {\n const ajv = Ajv({ allErrors: true });\n const errorMessagesMap = new Map(errorMessages);\n const errorMessage = [];\n\n const data = {\n maker: maker ? maker : undefined,\n carType: carType ? carType : undefined,\n age: age ? age : undefined,\n mileage: mileage ? mileage : undefined,\n name: name ? name : undefined,\n phone: phone ? phone : undefined,\n address: address ? address : undefined,\n mail: mail,\n }\n\n const schema = {\n required: ['maker', 'carType', 'age', 'mileage', 'name', 'phone', 'address', 'mail'],\n type: 'object',\n properties: {\n mail: {\n type: 'string',\n format: 'email',\n },\n },\n };\n\n const validate = ajv.compile(schema);\n const valid = validate(data);\n\n if (!valid) {\n console.log(validate.errors);\n validate.errors.forEach(error => {\n if (error.keyword === 'required') {\n errorMessage.push(errorMessagesMap.get(error.params.missingProperty) + '\\n');\n } else if (error.keyword === 'format') {\n errorMessage.push(`メールアドレスのフォーマットが正しくありません。\\n`)\n }\n })\n\n setError(errorMessage);\n return;\n }\n history.replace({\n pathname: history.location.pathname,\n state: {\n generalInfo: {\n maker: maker,\n carType: carType,\n age: age,\n mileage: mileage,\n name: name,\n phone: phone,\n address: address,\n mail: mail,\n isUpdate: isUpdate,\n carId: carId,\n },\n carImages: carImageData\n }\n });\n\n history.push({\n pathname: `/user/${account_name}/photos`,\n state: {\n generalInfo: {\n maker: maker,\n carType: carType,\n age: age,\n mileage: mileage,\n name: name,\n phone: phone,\n address: address,\n mail: mail,\n isUpdate: isUpdate,\n carId: carId,\n },\n carImages: carImageData,\n }\n });\n }, [history, maker, carType, age, mileage, name, phone, address, mail, isUpdate, carId]);\n\n return (\n <CustomerContainer>\n {error && (\n <div style={{ whiteSpace: 'pre-line' }}>\n <Alert variant=\"danger\">{error}</Alert>\n </div>\n )}\n <InputProgressBar currentIndex={0} />\n <div style={{ marginTop: '8%' }} />\n <Title titleText='査定の情報を入力してください。' />\n <div style={{ marginTop: '8%' }} />\n <div style={{ width: '80%', maxWidth: 300, marginLeft: 'auto', marginRight: 'auto' }}>\n <div style={selectionContainerStyle}>\n <label style={labelStyle}>メーカー</label>\n <CreatableSelect value={maker ? [{ label: maker, value: maker }] : null} isClearable={true} isSearchable={true} options={makerOptions}\n onChange={(value) => onChangeMaker(value)} className={'top-selection'} />\n </div>\n <div style={selectionContainerStyle}>\n <label style={labelStyle}>車種</label>\n <CreatableSelect value={carType ? [{ label: carType, value: carType }] : null} isClearable={true} isSearchable={true} options={carTypeOptions}\n onChange={(value) => onChangeCarType(value)} className={'top-selection'} />\n </div>\n <div style={selectionContainerStyle}>\n <div style={subSelectionContainerStyle}>\n <label style={labelStyle}>年式</label>\n <label style={labelStyle}>西暦</label>\n <input type=\"radio\" name=\"radio\" value={'西暦'} checked={checked === '西暦'} onChange={(e) => onChecked(e.target.value)} />\n <label style={labelStyle}>和暦</label>\n <input type=\"radio\" name=\"radio\" value={'和暦'} checked={checked === '和暦'} onChange={(e) => onChecked(e.target.value)} />\n </div>\n <CreatableSelect value={age ? [{ label: age, value: age }] : null} isClearable={true} isSearchable={true} options={ageOptions}\n onChange={(value) => onChangeAge(value)} className={'top-selection'} />\n </div>\n <div style={selectionContainerStyle}>\n <label style={labelStyle}>走行距離</label>\n <CreatableSelect value={mileage ? [{ label: mileage, value: mileage }] : null} isClearable={true} isSearchable={true} options={mileageOptions}\n onChange={(value) => onChangeMileage(value)} className={'top-selection'} />\n </div>\n <div style={{ marginTop: '14%' }} />\n <div>\n <label style={labelStyle}>氏名</label>\n <CustomerInput placeholder={'山田 太郎'} defaultValue={name} type=\"text\" name=\"name\" onBlur={(e) => setName(e.target.value)} />\n </div>\n <div>\n <label style={labelStyle}>電話番号</label>\n <CustomerInput placeholder={'電話番号'} defaultValue={phone} type=\"tel\" name=\"phone\" onBlur={(e) => setPhone(e.target.value)} readOnly={true} />\n </div>\n <div>\n <label style={labelStyle}>住所</label>\n <CustomerInput placeholder={'東京都江東区'} defaultValue={address} type=\"text\" name=\"address\" onBlur={(e) => setAddress(e.target.value)} />\n </div>\n <div>\n <label style={labelStyle}>メールアドレス</label>\n <CustomerInput placeholder={'mail@example.com'} defaultValue={mail} type=\"text\" name=\"mail\" onBlur={(e) => setMail(e.target.value)} />\n </div>\n </div>\n <div style={{ marginTop: '10%' }} />\n <SubmitButton buttonText='続ける' onClick={() => checkForm()} isEnabled={true} />\n <div style={{ marginTop: '20%' }} />\n </CustomerContainer >\n );\n};\n\nconst selectionContainerStyle = { width: '100%', display: 'flex', flexDirection: 'column', justifyContent: 'center', marginBottom: 8 };\nconst subSelectionContainerStyle = { width: '50%', display: 'flex', flexDirection: 'row', alignItems: 'center' };\nconst labelStyle = { fontSize: TextSize.small, width: '100%', paddingLeft: 4, marginBottom: -2 };\nconst CustomerInput = styled.input`\n font-size: 14px;\n width: 100%;\n height: 35px;\n max-width: 300px;\n border-radius: 3px;\n border: 1px solid lightgray;\n outline-color: ${Colors.enable};\n padding-left: 4px; \n ::placeholder {\n color: lightgray\n }\n`\n\nexport default Input;","export const carFormList = {\n maker: 'メーカー',\n carType: '車種',\n age: '年式',\n mileage: '走行距離',\n};\n\nexport const profileFormList = {\n name: 'お名前',\n phone: '電話番号',\n address: '住所',\n mail: 'メールアドレス'\n};\n\nexport const carImageData = [\n { partName: '斜め前方から', image: null, description: '', imageFile: null },\n { partName: '斜め後方から', image: null, description: '', imageFile: null },\n { partName: 'メーター', image: null, description: '', imageFile: null },\n { partName: '車検証', image: null, description: '', imageFile: null },\n { partName: '部位5', image: null, description: '', imageFile: null },\n { partName: '部位6', image: null, description: '', imageFile: null },\n { partName: '部位7', image: null, description: '', imageFile: null },\n { partName: '部位8', image: null, description: '', imageFile: null },\n { partName: '部位9', image: null, description: '', imageFile: null },\n { partName: '部位10', image: null, description: '', imageFile: null },\n { partName: '部位11', image: null, description: '', imageFile: null },\n { partName: '部位12', image: null, description: '', imageFile: null },\n { partName: '部位13', image: null, description: '', imageFile: null },\n { partName: '部位14', image: null, description: '', imageFile: null },\n { partName: '部位15', image: null, description: '', imageFile: null },\n { partName: '部位16', image: null, description: '', imageFile: null },\n { partName: '部位17', image: null, description: '', imageFile: null },\n { partName: '部位18', image: null, description: '', imageFile: null },\n { partName: '部位19', image: null, description: '', imageFile: null },\n { partName: '部位20', image: null, description: '', imageFile: null },\n { partName: '部位21', image: null, description: '', imageFile: null },\n { partName: '部位22', image: null, description: '', imageFile: null },\n { partName: '部位23', image: null, description: '', imageFile: null },\n { partName: '部位24', image: null, description: '', imageFile: null },\n { partName: '部位25', image: null, description: '', imageFile: null },\n]\n\nexport const defaultCarImage = [\n require('../assets/1.png'),\n require('../assets/2.png'),\n require('../assets/default.png'),\n require('../assets/default.png'),\n require('../assets/5.png'),\n require('../assets/6.png'),\n require('../assets/7.png'),\n require('../assets/8.png'),\n require('../assets/9.png'),\n require('../assets/10.png'),\n require('../assets/11.png'),\n require('../assets/12.png'),\n require('../assets/13.png'),\n require('../assets/14.png'),\n require('../assets/15.png'),\n require('../assets/16.png'),\n require('../assets/17.png'),\n require('../assets/18.png'),\n require('../assets/19.png'),\n require('../assets/default.png'),\n require('../assets/default.png'),\n require('../assets/default.png'),\n require('../assets/default.png'),\n require('../assets/default.png'),\n require('../assets/default.png'),\n]\n\n\nexport const requiredImageIndex = [0, 1, 2, 3];","import React, { useCallback, useState } from 'react';\nimport { defaultCarImage, requiredImageIndex } from '../Forms';\nimport { Colors, TextSize } from \"../config\";\nimport styled from 'styled-components';\n\n\nconst GridView = props => {\n //called from Photos\n\n const { carImageDataAndDescription, setCarImageDataAndDescription, allowEditing } = props;\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const swapImage = useCallback((img) => {\n if (img.target.files.length !== 0) {\n const imageFile = img.target.files[0]; // for sending to w3-wasabi\n const imageURL = URL.createObjectURL(img.target.files[0]); // for preview\n let carImageData = carImageDataAndDescription;\n carImageData[selectedIndex]['image'] = imageURL;\n carImageData[selectedIndex]['imageFile'] = imageFile;\n setCarImageDataAndDescription([...carImageData]);\n }\n }, [selectedIndex]);\n\n const changeText = useCallback((text) => {\n const enterdText = text.target.value;\n let carImageData = carImageDataAndDescription;\n carImageData[selectedIndex]['description'] = enterdText;\n setCarImageDataAndDescription([...carImageData]);\n });\n\n return (\n <div>\n <ul style={gridsContainer}>\n {\n carImageDataAndDescription && carImageDataAndDescription.slice(0, 4).map((item, ind) =>\n <Grid swapImage={swapImage} item={item} index={ind} setSelectedIndex={setSelectedIndex} changeText={changeText} allowEditing={allowEditing} />\n\n )\n }\n </ul>\n {\n allowEditing ?\n <div style={{\n position: 'relative', textAlign: 'center', margin: '10% 0 10% 0', fontSize: TextSize.small, fontWeight: 'bold'\n }}>\n <div>\n 他にも写真を送信いただけると\n </div>\n <div>\n より正確な査定金額を出すことができます!\n </div>\n </div>\n :\n null\n }\n <ul style={gridsContainer}>\n {\n carImageDataAndDescription && carImageDataAndDescription.slice(4, carImageDataAndDescription.length).map((item, ind) => {\n const index = ind + 4;\n return (\n <Grid swapImage={swapImage} item={item} index={index} setSelectedIndex={setSelectedIndex} changeText={changeText} allowEditing={allowEditing} />\n\n )\n })\n }\n </ul>\n </div>\n );\n};\n\nconst Grid = ({ swapImage, item, index, setSelectedIndex, changeText, allowEditing }) => {\n\n const textLimit = 100;\n const isRequired = requiredImageIndex.includes(index);\n\n return (\n <li style={gridContainer} key={index.toString()} >\n <div style={{ height: '7%', display: 'flex', flexDirection: 'row', alignItems: 'center', justifyContent: 'center', }}>\n <div style={{ fontSize: 12, color: '#D9D9D9' }}>\n {item.partName}\n </div>\n {\n isRequired ?\n <div style={{ fontSize: 16, color: Colors.required, margin: '0 0 4px 4px' }}>\n ※\n </div>\n :\n null\n }\n </div>\n {\n allowEditing ?\n <input\n accept=\"image/*\"\n id=\"contained-button-file\"\n type=\"file\"\n hidden={true}\n onChange={(e) => swapImage(e)}\n />\n :\n null\n }\n <label htmlFor=\"contained-button-file\" style={imageContainer} onClick={() => setSelectedIndex(index)}>\n {item.image !== null ?\n <img src={item.image} style={{ height: '100%', width: '100%', objectFit: 'contain' }} />\n :\n <div>\n <img src={defaultCarImage[index]} style={{ height: '97%', width: '97%', objectFit: 'cover', borderWidth: 'bold' }} />\n </div>\n }\n </label>\n {\n allowEditing ?\n <DescriptionTextArea\n type=\"text\"\n placeholder={'備考'}\n value={item.description}\n onChange={item.description.length > textLimit ? console.log(\"limit reached\") : changeText}\n onClick={() => setSelectedIndex(index)}\n />\n :\n <p style={descriotionField}>{item.description}</p>\n }\n </li >\n )\n};\n\nconst gridsContainer = {\n overflow: 'scroll',\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n flexWrap: 'wrap',\n padding: 6\n}\n\nconst gridContainer = {\n width: 135,\n height: 240,\n backgroundColor: 'white',\n listStyle: 'none',\n margin: '1.2vw',\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n\n};\n\nconst imageContainer = {\n width: '100%',\n height: '50%',\n textAlign: 'center',\n border: '1px solid lightgray',\n};\n\nconst DescriptionTextArea = styled.textarea`\n padding: 5px;\n height: 33%;\n width: 100%;\n display: flex;\n margin-left: auto;\n margin-right: auto;\n font-size: 12px;\n border: 1px solid lightgray;\n ::placeholder {\n color: lightgray\n }\n`;\n\nconst descriotionField = {\n padding: 5,\n height: '33%',\n width: '100%',\n display: 'flex',\n margin: '0 auto',\n fontSize: 12,\n border: '1px solid lightgray'\n}\n\nexport default GridView;\n\n","import React, { useEffect, useState, useCallback } from 'react';\nimport { useHistory, useLocation, useParams } from 'react-router-dom';\nimport { Alert } from 'react-bootstrap';\nimport Ajv from 'ajv';\n//components\nimport SubmitButton from '../../Components/SubmitButton';\nimport Title from '../../Components/Title';\nimport GridView from '../../Components/GridView';\nimport InputProgressBar from '../../Components/InputProgressBar';\n//forms\nimport { carImageData, requiredImageIndex } from '../../Forms';\n\nconst Photos = props => {\n const history = useHistory();\n const { state } = useLocation();\n const { generalInfo, carImages } = state;\n const [carImageDataAndDescription, setCarImageDataAndDescription] = useState(carImageData);\n const [sendingInfo, setSendingInfo] = useState({});\n const [files, setFiles] = useState([]);\n const [error, setError] = useState('');\n const { account_name } = useParams();\n\n useEffect(() => {\n if (carImages) {\n setCarImageDataAndDescription(carImages);\n }\n }, [state]);\n\n const checkPhotos = useCallback(() => {\n const filledForm = { generalInfo: generalInfo, carImages: carImageDataAndDescription };\n const imageFiles = carImageDataAndDescription.map((item) => item.imageFile);\n const err = imageValidation(imageFiles);\n if (err) {\n setError(err);\n } else {\n setError('');\n setFiles(imageFiles);\n setSendingInfo(filledForm);\n }\n }, [generalInfo, carImageDataAndDescription]);\n\n useEffect(() => {\n // navigate to confirm screen\n if (Object.keys(sendingInfo).length) {\n history.replace({\n pathname: history.location.pathname,\n state: { generalInfo: sendingInfo.generalInfo, carImages: sendingInfo.carImages }\n })\n\n history.push({\n pathname: `/user/${account_name}/confirm`,\n state: { generalInfo: sendingInfo.generalInfo, carImages: sendingInfo.carImages },\n });\n }\n }, [sendingInfo, files]);\n\n const backToTop = () => {\n history.push({\n pathname: `/user/${account_name}/input`,\n state: { generalInfo: generalInfo, carImages: carImageDataAndDescription },\n });\n };\n\n const imageValidation = (imageFiles) => {\n const missingRequiredImageIndex = [];\n requiredImageIndex.map((index) => !imageFiles[index] && missingRequiredImageIndex.push(index));\n\n if (missingRequiredImageIndex.length > 0) {\n return '必須の画像をセットしてください。'\n }\n return null;\n };\n\n return (\n <div className={wrapper}>\n <InputProgressBar currentIndex={1} />\n <div style={{ marginTop: '18%' }} />\n <Title titleText={'お車の写真を撮影してください。'} />\n <Title titleText={'必須項目は4点です!'} />\n <div style={{ marginTop: '3%' }} />\n <GridView\n carImageDataAndDescription={carImageDataAndDescription}\n setCarImageDataAndDescription={setCarImageDataAndDescription}\n allowEditing={true}\n />\n <div style={{ marginTop: '3%' }} />\n {error && (\n <div style={{ whiteSpace: 'pre-line' }}>\n <Alert variant=\"danger\">{error}</Alert>\n <div style={{ marginTop: '3%' }} />\n </div>\n )}\n <SubmitButton buttonText='続ける' onClick={() => checkPhotos()} isEnabled={true} />\n <div style={{ marginBottom: '10%' }} />\n </div>\n );\n};\n\nexport const wrapper = {\n width: '100%',\n height: '100%',\n overflow: 'scroll',\n backgroundColor: '#F9F9F9'\n};\n\nexport default Photos;","import axios from 'axios';\nimport { DOMAIN_NAME, SERVICE_NAME, SENDER_ADDRESS, EMAIL_URL } from \"../config.js\";\n\nclass EmailService {\n SendTextCustomer = async (to, name, contactNumber) => {\n const from = SENDER_ADDRESS;\n const subject = `【${SERVICE_NAME}】査定依頼を受け付けました`;\n let bodyText = `${name}様\\r\\n`;\n bodyText = bodyText + '\\r\\n';\n bodyText = bodyText + `【${SERVICE_NAME}】で査定をお申し込みいただきありがとうございます。\\r\\n`;\n bodyText = bodyText + `お客様のお問い合わせ番号は[${contactNumber}]です。\\r\\n`;\n bodyText = bodyText + '詳細につきましては弊社担当より直接ご連絡致します。\\r\\n';\n bodyText = bodyText + '\\r\\n';\n bodyText = bodyText + '---------------------------\\r\\n';\n bodyText = bodyText + '\\r\\n';\n bodyText = bodyText + '本メールは自動返信されております。\\r\\n';\n bodyText = bodyText + 'このアドレスにご返信いただいても、内容確認及びご返答ができません。\\r\\n';\n\n const json = {\n \"from\": from,\n \"to\": to,\n \"subject\": subject,\n \"bodyText\": bodyText\n }\n\n return await axios.post(EMAIL_URL + '/sendtext', json);\n };\n\n SendTextStore = async (to) => {\n const from = SENDER_ADDRESS;\n const subject = `【${SERVICE_NAME}】査定依頼がありました`;\n let bodyText = '';\n bodyText = bodyText + `【${SERVICE_NAME}】で査定依頼がありました。\\r\\n`;\n bodyText = bodyText + '詳細につきましては管理画面にログインして確認してください。\\r\\n';\n bodyText = bodyText + '\\r\\n';\n bodyText = bodyText + `https://${DOMAIN_NAME}/admin/login\\r\\n`;\n bodyText = bodyText + '\\r\\n';\n bodyText = bodyText + '---------------------------\\r\\n';\n bodyText = bodyText + '\\r\\n';\n bodyText = bodyText + '本メールは自動送信されております。\\r\\n';\n\n const json = {\n \"from\": from,\n \"to\": to,\n \"subject\": subject,\n \"bodyText\": bodyText\n }\n\n return await axios.post(EMAIL_URL + '/sendtext', json);\n };\n\n SendHtml = async (to, name, account_name) => {\n const from = SENDER_ADDRESS;\n const subject = `【${SERVICE_NAME}】簡単査定のご案内`;\n const serviceName = SERVICE_NAME;\n const phone = '0287-47-5544';\n const mail = 'w.yagisawa.complete@gmail.com';\n const url = 'https://g-complete.co.jp/';\n const link = `https://${DOMAIN_NAME}/user/${account_name}`;\n const bodyText = '';\n const bodyHtml = `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\"\n xmlns:v=\"urn:schemas-microsoft-com:vml\">\n\n<head>\n <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" />\n <meta content=\"width=device-width\" name=\"viewport\" />\n <meta content=\"IE=edge\" http-equiv=\"X-UA-Compatible\" />\n <title>\n \n \n\n\n\n \n \n \n \n \n \n
\n
\n
\n
\n
\n \n
\n
 
\"Your\n
 
\n
\n \n \n \n ${serviceName}

\n \n 簡単査定のご案内

\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n \n \n \n ${name}様

\n
\n
\n \n \n \n この度は、お車の査定に興味を持っていただき誠にありがとうございます。当社では、ただお客様に写真を撮っていただくだけで、会わなくてもお車の査定が出来る、そして契約までも出来てしまう、そんなシステムを取り入れております。「一括査定サイトに登録すると毎日しつこい電話が沢山かかってくる。」、「査定をお願いしたら2時間居座られた。」そんなストレス一切なしの超簡単でスマートな査定システムになります!!スマホさえあれば誰でもすぐに査定が可能です!!ぜひ使ってみてください!!\n

\n
\n
\n \n
\n \n \n \n \n \n
\n
\n
\n
\n
\n \n \n \n \n お手持ちのスマートフォンから

\n \n 簡単3STEPで査定ができます!

\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
 
\"Your\n
 
\n
\n \n \n \n STEP1

\n
\n
\n \n \n \n 本メールの査定するボタンをクリック!

\n
\n
\n
\n \n \n
\n
\n \n
\n
 
\"Your\n
 
\n
\n \n \n \n STEP2

\n
\n
\n \n \n \n 査定したいお車の情報、写真を撮影し送信!

\n \n \n \n \n \n
\n
\n \n
\n
 
\"Your\n
 
\n
\n \n \n \n STEP3

\n
\n
\n \n \n \n 後日、査定金額を

\n \n \n \n \n \n \n \n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
 
\"Your\n
 
\n
\n
\n
\n
\n
\n
\n \n \n \n \n 会社概要\n \n

\n
\n
\n \n \n \n ${mail}

\n \n ${url}

\n \n ${phone}

\n
\n
\n \n \n \n 配信停止はこちらから\n

\n \n \n \n \n \n \n \n
\n\n\n`;\n\n const json = {\n \"from\": from,\n \"to\": to,\n \"subject\": subject,\n \"bodyHtml\": bodyHtml,\n \"bodyText\": bodyText\n }\n\n return await axios.post(EMAIL_URL + '/sendhtml', json);\n };\n}\n\nexport default new EmailService();","import React, { useEffect, useState } from 'react';\nimport axios from 'axios';\nimport { useHistory, useLocation, useParams } from 'react-router-dom';\n//componetns\nimport Title from '../../Components/Title';\nimport GridView from '../../Components/GridView';\nimport SubmitButton from '../../Components/SubmitButton';\nimport { carFormList, profileFormList } from '../../Forms';\nimport { CustomerContainer } from '../../Components/StyledComponents';\nimport InputProgressBar from '../../Components/InputProgressBar';\n//api\nimport { INSERT_URL, UPDATE_URL, UPLOAD_URL, FETCH_URL } from \"../../config.js\";\n//services\nimport EmailService from '../../Services/EmailService';\n//functions\nimport { Now } from '../../Functions';\n//styles\nimport { wrapper } from './Photos';\n\nconst Confirm = props => {\n const history = useHistory();\n const { state } = useLocation();\n const { generalInfo, carImages } = state;\n const [isLoading, setIsLoading] = useState(true);\n const [isSending, setIsSending] = useState(false);\n const [showingImageData, setShowingImageData] = useState([]);\n const { account_name } = useParams();\n const uploadedImages = [];\n\n useEffect(() => {\n if (Object.keys(generalInfo).length) {\n readyDispayImage()\n .then((carImage) => {\n setShowingImageData(carImage);\n setIsLoading(false);\n });\n }\n }, [generalInfo]);\n\n\n const readyDispayImage = () => {\n return new Promise((resolve) => {\n const carImageData = [];\n carImages && Object.keys(carImages).map((item) => {\n const car = carImages[item];\n if (car.image) {\n const carImage = { partName: car.partName, image: car.image, description: car.description, imageFile: car.imageFile };\n carImageData.push(carImage);\n }\n });\n resolve(carImageData);\n });\n }\n\n const handleUploadImage = async () => {\n const result = await uploadImage(carImages);\n for (let i = 0; i < result.length; i++) {\n const carImage = carImages.find(v => v.partName === result[i].fieldname);\n if (carImage) {\n uploadedImages.push({ key: result[i].key, description: carImage.description });\n }\n }\n }\n\n const uploadImage = async (carImages) => {\n const params = new FormData();\n for (let i = 0; i < carImages.length; i++) {\n if (carImages[i].imageFile) {\n params.append(carImages[i].partName, carImages[i].imageFile);\n }\n }\n\n return (await axios.post(UPLOAD_URL, params,\n {\n headers: {\n 'content-type': 'multipart/form-data',\n },\n })).data;\n }\n\n const onSubmit = async (e) => {\n // e.preventDefault();\n setIsSending(true);\n\n try {\n await handleUploadImage();\n\n const resultUserInfo = await axios.post(INSERT_URL + \"/user_info\",\n {\n name: generalInfo.name,\n phone: generalInfo.phone,\n address: generalInfo.address,\n mail: generalInfo.mail\n });\n\n let car_id = 0;\n const date = Now();\n if (generalInfo.isUpdate) {\n // 更新の場合、UPDATE\n const resultCarInfo = await axios.post(UPDATE_URL + \"/car_info\",\n {\n maker: generalInfo.maker,\n car_type: generalInfo.carType,\n age: generalInfo.age,\n mileage: generalInfo.mileage,\n user_id: resultUserInfo.data.insertId,\n status: 2,\n account_name: account_name,\n update_date: date,\n register_date: date,\n id: generalInfo.carId,\n });\n\n car_id = generalInfo.carId;\n } else {\n // 新規の場合、INSERT\n const resultCarInfo = await axios.post(INSERT_URL + \"/car_info\",\n {\n maker: generalInfo.maker,\n car_type: generalInfo.carType,\n age: generalInfo.age,\n mileage: generalInfo.mileage,\n user_id: resultUserInfo.data.insertId,\n status: 2,\n account_name: account_name,\n create_date: date,\n update_date: date,\n register_date: date,\n });\n\n car_id = resultCarInfo.data.insertId;\n }\n\n await axios.post(INSERT_URL + \"/img_des\",\n {\n images: uploadedImages,\n car_id: car_id\n });\n\n await EmailService.SendTextCustomer([generalInfo.mail], generalInfo.name, car_id);\n await axios.get(FETCH_URL + `/store_mail?account_name=${account_name}`)\n .then((response) => {\n if (response.status === 200) {\n return response.data[0];\n }\n })\n .then((result) => {\n EmailService.SendTextStore([result.mail]);\n })\n .catch((error) => {\n console.log('error', error)\n });\n \n setIsSending(false);\n history.push({\n pathname: `/user/${account_name}/submit`,\n state: {\n contactNumber: car_id\n }\n });\n } catch (e) {\n // error handling\n console.log(e);\n }\n }\n\n const backToTop = () => {\n history.go(-1);\n };\n\n const filledFormList = (formList) => {\n return Object.keys(formList).map((label, key) =>\n
  • \n
    \n {formList[label]}\n
    \n
    \n {generalInfo[label]}\n
    \n
  • \n );\n }\n\n if (isLoading) {\n return (\n
    \n
    \n \n <div style={{ marginTop: '6vh' }} />\n <div style={{ textAlign: 'center' }}>\n Loading .....\n </div>\n </div>\n )\n } else {\n return (\n <div className={wrapper}>\n <InputProgressBar currentIndex={1} />\n <div style={{ marginTop: '18%' }} />\n <Title titleText='最後に入力した内容をご確認ください。' />\n <div style={{ marginTop: '8%' }} />\n <ul style={listContainer}> {filledFormList(carFormList)}</ul >\n <div style={{ marginTop: '8%' }} />\n <ul style={listContainer}> {filledFormList(profileFormList)}</ul >\n <div style={{ marginTop: '8%' }} />\n <GridView\n carImageDataAndDescription={showingImageData}\n setCarImageDataAndDescription={() => { }}\n allowEditing={false}\n />\n <div style={{ marginTop: '8%' }} />\n <SubmitButton buttonText='送信' onClick={() => onSubmit()} isEnabled={!isSending} />\n <div style={{ marginTop: '5%' }} />\n </div>\n );\n }\n};\n\nconst listContainer = {\n width: '94vw',\n listStyle: 'none',\n padding: 0,\n marginLeft: '3vw',\n};\nconst labelContainer = { fontSize: 10, width: '100%', };\nconst filledFormContainer = { fontSize: 14, width: '100%', borderBottom: '1px solid #EDEDED', padding: 2 };\n\nexport default Confirm;","import React, { useCallback } from 'react';\nimport { useHistory, useLocation, useParams } from 'react-router-dom';\nimport Title from '../../Components/Title';\n//components\nimport SubmitButton from '../../Components/SubmitButton';\nimport InputProgressBar from '../../Components/InputProgressBar';\n\nconst Submit = (props) => {\n const history = useHistory();\n const { state } = useLocation();\n const { contactNumber } = state;\n const { account_name } = useParams();\n\n const onClick = useCallback(() => {\n history.push({\n pathname: `/user/${account_name}`,\n });\n }, []);\n\n return (\n <div>\n <InputProgressBar currentIndex={2} />\n <div style={{ marginTop: '16%' }} />\n <Title titleText='入力お疲れ様でした!' />\n <Title titleText='担当者より査定結果をお知らせいたします。' />\n <div style={{ marginTop: '16%' }} />\n <div style={imageContainer}>\n <img src={require('../../assets/completeImage.png')} style={{ width: '100%', height: '100' }} />\n </div>\n </div>\n );\n};\n\nconst CompletionMessage = ({ contactNumber }) => {\n return (\n <div style={{ textAlign: 'center', fontSize: 13 }}>\n <div>\n 送信が完了しました。\n </div>\n <div>\n {`お問い合わせ番号は[${contactNumber}]です。`}\n </div>\n <div style={{ marginTop: '2vh' }} />\n <div>\n お客様には自動返信メールが送信されております。\n </div>\n <div>\n 詳細につきましては弊社担当より直接ご連絡致します。\n </div>\n </div>\n );\n};\n\nconst imageContainer = {\n width: '75%',\n maxWidth: 350,\n marginLeft: 'auto',\n marginRight: 'auto'\n}\n\nexport default Submit;","import React, { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { IoMdSettings } from 'react-icons/io';\nimport { HeaderStyle, HeaderTitle, HeaderIcons, SideBarContent, FooterStyle, FooterColumn, FooterItems, DropDownStyle, DropDownItemStyle } from './StyledComponents';\nimport AuthService from '../Services/AuthService';\nimport { DOMAIN_NAME, TextSize } from '../config';\nimport { Helmet } from 'react-helmet';\n\nexport const Header = () => {\n const user = AuthService.getCurrentUser();\n const account_name = user ? user.account_name : null;\n if (!account_name) {\n return (\n <HeaderStyle>\n <Meta />\n <HeaderTitle>\n </HeaderTitle>\n </HeaderStyle>\n )\n } else {\n\n const options = [\n {\n text: '店舗情報',\n pathname: `/admin/${account_name}/store_info`,\n },\n {\n text: 'アカウント設定',\n pathname: `/admin/${account_name}/edit_account`,\n },\n {\n text: 'ログアウト',\n pathname: '/admin/logout',\n },\n ];\n\n return (\n <HeaderStyle>\n <Meta />\n <div style={{ height: 80, width: '100%', marginLeft: 33, display: 'flex', flexDirection: 'column', justifyContent: 'center' }}>\n <div style={{ fontSize: TextSize.small }}>\n スマホで査定\n </div>\n <div style={{ fontSize: TextSize.medium, fontWeight: 'bolder' }}>\n サテコン\n </div>\n </div>\n <div style={{ width: '100%', height: 40, backgroundColor: '#E8E8E8', display: 'flex', flexDirection: 'row', alignItems: 'center' }}>\n <Link\n to={{\n pathname: `/admin/${account_name}`,\n }}\n style={{ color: 'gray', width: 'auto', height: 'auto' }}\n >\n <HeaderTitle>\n {`${user.name} 様`}\n </HeaderTitle>\n </Link>\n\n <HeaderIcons>\n <DropDown options={options} />\n </HeaderIcons>\n </div>\n </HeaderStyle>\n )\n }\n};\n\nconst DropDown = (props) => {\n const [isOpened, setIsOpened] = useState(false);\n\n return (\n <li style={{ listStyle: 'none', color: 'black' }}>\n <div style={{ cursor: 'pointer', alignItems: 'center' }} onClick={() => setIsOpened(!isOpened)}>\n <IoMdSettings style={{ width: TextSize.large, height: TextSize.large }} color='black' />\n </div>\n {isOpened && <DropDownMenue items={props.options} />}\n </li>\n )\n}\n\nconst DropDownMenue = (props) => {\n\n const DropDownItem = (props) => {\n return (\n <Link\n to={{\n pathname: props.pathname\n }}\n style={{ color: 'gray', width: 'auto', height: '100%', marginTop: 20 }}\n >\n <DropDownItemStyle style={{ cursor: 'pointer' }}>\n <span>\n {props.leftIcon}\n </span>\n <div style={{ color: 'black' }}>\n {props.children}\n </div>\n <span>\n {props.rightIcon}\n </span>\n </DropDownItemStyle>\n </Link>\n )\n }\n\n return (\n <DropDownStyle>\n {\n props.items && props.items.map((item) => {\n return (\n <DropDownItem\n leftIcon={item.leftIcon && item.leftIcon}\n rightIcon={item.rightIcon && item.rightIcon}\n pathname={item.pathname}\n key={item.text}\n >\n {item.text}\n </DropDownItem>\n )\n })\n }\n </DropDownStyle>\n )\n}\n\n\nexport const Body = () => {\n return (\n <div style={bodyStyle}>\n </div>\n )\n};\n\nexport const Footer = () => {\n const user = AuthService.getCurrentUser();\n const account_name = user ? user.account_name : null;\n if (!account_name) {\n return (\n <FooterStyle style={{ alignItems: 'center', display: 'flex', flexDirection: 'row', justifyContent: 'center' }}>\n <div style={{ fontSize: TextSize.minimum }}>\n {`Copyright © ${DOMAIN_NAME} All rights reserved.`}\n </div>\n </FooterStyle>\n )\n } else {\n\n return (\n <FooterStyle>\n <FooterColumn>\n <FooterItems >\n <div style={{ height: 180, width: '20%', minWidth: 200, backgroundColor: 'lightgray', textAlign: 'center' }}>\n LOGO\n </div>\n <div style={{ height: '100%', width: 200, display: 'flex', flexDirection: 'column', marginLeft: 20 }}>\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n <label style={labelStyle}>\n Garage Complete\n </label>\n <label style={labelStyle}>\n ガレージコンプリート\n </label>\n </div>\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n <label style={{ ...smallLabelStyle, marginBottom: -5 }} >\n 〒329-2745栃木県那須塩原市三区町651-9\n </label>\n <label style={smallLabelStyle} >\n TEL 0287-4705544 FAX 0287-47-5160\n </label>\n <label style={smallLabelStyle} >\n 営業時間平日9時0 0分〜19時0 0分\n </label>\n <label style={smallLabelStyle} >\n 定休日 土曜日・日曜日・祝日\n </label>\n </div>\n </div>\n </FooterItems>\n <div style={{\n height: 180, minWidth: 150, display: 'flex', flexDirection: 'column', justifyContent: 'space-around'\n }}>\n <div style={{ height: '100%', width: '30%', minWidth: 150, display: 'flex', flexDirection: 'column' }} >\n {/* <label style={smallLabelStyle}>\n プライバシーポリシー\n </label>\n <label style={smallLabelStyle}>\n 特定商取引に基づく表記\n </label> */}\n <p style={{ fontSize: 12, fontWeight: 'normal', marginTop: 'auto' }}>\n {`Copyright © ${DOMAIN_NAME} All rights reserved.`}\n </p>\n </div>\n </div>\n </FooterColumn>\n </FooterStyle >\n )\n }\n}\n\nconst labelStyle = { fontSize: 14, fontWeight: 'bolder' }\nconst smallLabelStyle = { fontSize: 12, fontWeight: 'normal' }\n\nconst bodyStyle = {\n position: 'absolute',\n right: 18,\n bottom: 18,\n width: 'calc(100vw - 18vw)',\n height: 'calc(100vh - 120px)',\n backgroundColor: 'gray',\n zIndex: 0,\n}\n\nexport const Meta = () => {\n return (\n <Helmet>\n <meta name=\"robots\" content=\"noindex\"></meta>\n </Helmet>\n )\n};","import React, { useCallback } from 'react';\nimport styled from 'styled-components';\nimport { Colors } from '../config';\n\n\nconst Button = (props) => {\n\n const { isCancel, onClick, buttonStyle } = props;\n\n const btnClicked = useCallback(() => {\n if (onClick) {\n onClick();\n }\n }, [onClick]);\n\n const getButtonStyle = () => {\n switch (buttonStyle) {\n case 'cancel':\n return {\n backgroundColor: Colors.cancelBtnColor,\n color: 'black',\n border: '0px',\n margin: '0 8px 0 0',\n fontSize: 10,\n }\n case 'delete':\n return {\n backgroundColor: 'white',\n color: Colors.delete\n }\n default:\n return {};\n }\n }\n\n return (\n <ButtonStyle style={getButtonStyle()} onClick={() => btnClicked()}>\n {\n props?.children\n }\n </ButtonStyle >\n );\n};\n\nexport const ButtonStyle = styled.button`\n min-width: 75px;\n height: 32px;\n padding: 0.3em;\n font-size: 11px;\n background-color: ${Colors.enable};\n border: 1px solid;\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 100ms;\n @media screen and (max-width: 620px) {\n width: 60px;\n margin-bottom: 10px;\n }\n &:hover {\n background-color: ${Colors.btnHoverColor};\n } \n`\n\n\nexport default Button","import React, { useState } from 'react';\nimport { Alert } from 'react-bootstrap';\nimport { useHistory } from 'react-router-dom';\n//components\nimport { Footer, Meta } from '../../Components/AdminComponents';\nimport { LoginStyle } from '../../Components/StyledComponents';\nimport Button from '../../Components/Button';\n//services\nimport AuthService from '../../Services/AuthService';\n//config\nimport { Colors, TextSize } from '../../config';\n\nconst LogIn = () => {\n const history = useHistory();\n const [accountName, setAccountName] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n\n const loginHandler = async () => {\n await AuthService.login(accountName, password)\n .then(result => {\n if (result) {\n history.push(`/admin/${result}`);\n } else {\n setError('アカウント名かパスワードが違います');\n }\n })\n .catch(err => {\n console.log(err);\n setError('ログインできませんでした')\n });\n }\n\n return (\n \n <div style={container}>\n <Meta />\n <LoginStyle>\n <div style={{ fontSize: TextSize.minimum, padding: '15%', marginTop: 30 }}>\n <div>\n スマホで査定\n </div>\n <div style={{ fontSize: TextSize.maximum, fontWeight: 'bolder' }}>\n サテコン\n </div>\n <div style={{ fontSize: TextSize.minimum, marginTop: 33 }}>\n Admin Console\n </div>\n </div>\n {error && (\n <Alert variant=\"danger\">{error}</Alert>\n )}\n <div>\n <input type=\"accountName\" name=\"accountName\" placeholder='アカウント名' onBlur={(e) => setAccountName(e.target.value)} style={{ ...inputContainer, marginBottom: 15 }} />\n </div>\n <div>\n <input type=\"password\" name=\"password\" placeholder='パスワード' onBlur={(e) => setPassword(e.target.value)} style={inputContainer} />\n </div>\n <div style={{ textAlign: 'center', alignItems: 'center', margin: '10%', display: 'flex', justifyContent: 'center' }}>\n <Button onClick={() => loginHandler()}>\n ログイン\n </Button>\n </div>\n </LoginStyle>\n <Footer />\n </div >\n )\n};\n\nexport const container = {\n width: '100vw',\n height: '100vh',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: Colors.background,\n};\n\nconst inputContainer = {\n fontSize: 14,\n padding: 10,\n width: 260,\n height: 30,\n backgroundColor: Colors.background,\n border: 'solid 1px #707070'\n};\n\nconst btnContainer = {\n width: 200,\n height: 40,\n padding: 3,\n fontSize: 14,\n backgroundColor: '#3EA5F7',\n border: '1px solid',\n margin: 'auto',\n color: 'white',\n};\n\nexport default LogIn;","import React from 'react';\nimport { Link } from 'react-router-dom';\n//components\nimport { Header } from '../../Components/AdminComponents';\nimport { LoginStyle } from '../../Components/StyledComponents';\n//services\nimport AuthService from '../../Services/AuthService';\n//config & styles\nimport { container } from './LogIn';\nimport { TextSize } from '../../config';\n\nconst LogOut = () => {\n AuthService.logout();\n\n return (\n <div style={container}>\n <Header />\n <LoginStyle>\n <div style={{ fontSize: TextSize.large, fontWeight: 'bolder', padding: '15%' }}>\n Admin Console\n </div>\n <div>\n <h3>ログアウトしました</h3>\n <div style={{ height: 20 }} />\n <div className=\"text-center\">\n <Link to=\"/admin/login\">ログイン画面へ</Link>\n </div>\n </div>\n </LoginStyle>\n </div>\n )\n};\n\nconst carListContainer = {\n width: '35vw',\n height: '60vh',\n backgroundColor: 'white',\n margin: 'auto',\n marginTop: '10vh',\n};\n\nexport default LogOut;","import React, { useCallback, useEffect, useState } from 'react';\nimport { FormLabel, FormGroup, FormControlLabel, Checkbox, Popover } from '@material-ui/core';\nimport MenuIcon from '@material-ui/icons/Menu';\nimport SearchIcon from '@material-ui/icons/Search';\nimport { statuses } from '../config';\nimport { SearchInput, SearchContainerStyle, SearchBoxStyle } from \"./StyledComponents\";\nimport { ButtonStyle } from './Button';\n\nconst SearchBar = (props) => {\n const { setSearchingData, carData } = props;\n const [searchInput, setSerchInput] = useState('');\n const [checkedValues, setCheckedValues] = useState([]);\n const [statusOptions, setStatusOptions] = useState([]);\n const [anchorEl, setAnchorEl] = useState(null);\n const { height, width } = useWindowDimensions();\n\n\n useEffect(() => {\n statuses.forEach((item) => {\n checkedValues.push(item[0]);\n })\n createStatusOptions();\n }, []);\n\n\n useEffect(() => {\n const filteredData = queryData(searchInput, carData);\n setSearchingData(filteredData);\n }, [carData, searchInput]);\n\n const createStatusOptions = () => {\n const statusOptions = statuses.map(\n (item) => (\n <FormControlLabel key={item[0]}\n control={< Checkbox onChange={() => { onCheck(item[0]); }} checked={checkedValues.filter(v => v === item[0]).length > 0} value={item[0]} size=\"small\" color=\"primary\" />}\n label={<span className={'menu-checkbox'}>{item[1]}</span>}\n />\n )\n );\n\n setStatusOptions(statusOptions);\n }\n\n const queryData = (text, carData) => {\n const searchQuery = text.toLowerCase();\n const filteredData = [];\n const filteredCars = [];\n\n // ステータスでフィルタ\n checkedValues.forEach(item => filteredCars.push(carData.filter(v => v.status === item)));\n filteredCars.forEach(cars => cars.map(car => filteredData.push(car)));\n\n // 検索ワードでフィルタ、降順でソート\n const filterItems = filteredData.filter(value =>\n (value.maker.toLowerCase().includes(searchQuery) ||\n value.maker.toLowerCase().includes(searchQuery) ||\n value.car_type.toLowerCase().includes(searchQuery) ||\n value.name.toLowerCase().includes(searchQuery) ||\n value.address.toLowerCase().includes(searchQuery))).sort((a, b) => (b.id - a.id));\n\n return filterItems;\n };\n\n const onCheck = useCallback((item) => {\n const checked = checkedValues;\n\n checked.filter(v => v === item).length > 0\n ? checked.splice(checked.findIndex(v => v === item), 1)\n : checked.push(item);\n\n setCheckedValues(checked);\n createStatusOptions();\n\n const filteredData = queryData(searchInput, carData);\n setSearchingData(filteredData);\n }, [carData, searchInput, checkedValues]);\n\n const handleMenuOpen = (e) => {\n setAnchorEl(e.currentTarget);\n }\n\n const handleMenuClose = () => {\n setAnchorEl(null);\n }\n\n return (\n <SearchContainerStyle>\n <SearchBoxStyle>\n <SearchIcon />\n <SearchInput placeholder={'メーカー、車名、名前など'} onChange={(e) => setSerchInput(e.target.value)} />\n </SearchBoxStyle>\n\n {\n width >= 620 ?\n <ButtonStyle onClick={handleMenuOpen}>\n <MenuIcon style={{ fontSize: 16, marginRight: 4 }} className=\"icon-menu\" />\n ステータス絞り込み\n </ButtonStyle>\n :\n <MenuIcon fontSize=\"default\" className=\"icon-menu\" onClick={handleMenuOpen} />\n }\n\n <Popover\n open={Boolean(anchorEl)}\n anchorEl={anchorEl}\n onClose={handleMenuClose}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'center',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'center',\n }}\n >\n {\n width >= 620 ?\n null\n :\n <FormLabel>\n ステータス絞り込み\n </FormLabel>\n }\n\n <FormGroup>\n {statusOptions}\n </FormGroup>\n </Popover>\n </SearchContainerStyle>\n )\n}\n\n\nconst getWindowDimensions = () => {\n const { innerWidth: width, innerHeight: height } = window;\n return {\n width,\n height\n };\n}\n\nconst useWindowDimensions = () => {\n const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions());\n\n useEffect(() => {\n function handleResize() {\n setWindowDimensions(getWindowDimensions());\n }\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return windowDimensions;\n}\n\nexport default SearchBar;","import React from 'react';\nimport { useParams } from 'react-router-dom';\nimport axios from 'axios';\nimport styled from 'styled-components';\nimport { STATUS_UPDATE_URL, statuses, TextSize, StatusColor } from \"../config\";\nimport { CardListStyle, ListItemInfoStyle, ListItemButtonStyle, ListImageStyle } from './StyledComponents';\nimport Button from './Button';\nimport { Link } from 'react-router-dom';\nimport Select from 'react-select';\nimport '../index.css';\n\nconst CarList = (props) => {\n\n const { listData, dataLabel, updateCarData } = props;\n const { account_name } = useParams();\n const statusAndUserInfoLabel = { create_date: '依頼日時', name: '依頼者名', status: 'ステータス' }\n // const handleChange = async (status, id) => {\n // await axios.post(STATUS_UPDATE_URL, { id: id, status: status })\n // .then((response) => {\n // if (response.status === 200) {\n // updateCarData(id, status);\n // }\n // })\n // .catch((error) => {\n // console.log(error);\n // })\n // }\n\n return (\n <div style={{ overflowY: 'auto', zIndex: 15 }}>\n <TableColumn />\n {\n listData.map((data, index) => {\n return (\n <CardListStyle>\n <ListItemInfoStyle>\n <div style={{ height: '100%', width: 130, alignSelf: 'center', padding: 10 }}>\n {\n data.img_name ?\n <a href={data.img_name} target='_blank' rel='noopener'>\n <ListImageStyle src={data.img_name} alt={'default image'} />\n </a>\n :\n <img src={require('../assets/1.png')} alt={'default image'} style={{ height: '100%', width: '100%', objectFit: 'cover' }} />\n }\n </div>\n <div style={{ width: '30%', marginLeft: 15, alignSelf: 'center' }}>\n <div style={{ marginBottom: 15 }}>\n <StatusInfo item={'create_date'} data={data.create_date} label={statusAndUserInfoLabel['create_date']} />\n <StatusInfo item={'name'} data={data.name} label={statusAndUserInfoLabel['name']} />\n </div>\n <StatusInfo item={'status'} data={data.status} label={statusAndUserInfoLabel['status']} />\n </div>\n <div style={{ width: '30%', marginLeft: 20, marginRight: 'auto', alignSelf: 'center' }}>\n {\n Object.keys(data).map((item, ind) =>\n dataLabel[item] && <Row label={dataLabel[item]} data={data} item={item} index={ind} />\n )\n }\n </div>\n </ListItemInfoStyle>\n <ListItemButtonStyle >\n <Link\n to={{\n pathname: `/admin/${account_name}/${data.id}`,\n state: { data: data },\n }}\n style={{ textDecoration: 'none', color: '#ffffff' }}\n >\n <Button>\n 詳細へ\n </Button>\n </Link>\n </ListItemButtonStyle>\n </CardListStyle>\n )\n })\n }\n </div >\n );\n};\n\nconst StatusInfo = props => {\n const statusmap = new Map(statuses);\n const statusColor = new Map(StatusColor);\n\n\n const { data, label, item } = props;\n let value = data;\n if (item === 'create_date') {\n const time = value.split('T');\n const date = time[0];\n const hour = time[1].split(':', 2).join(':');\n value = date + ' ' + hour;\n }\n\n return (\n <div style={{ display: 'flex', marginBottom: 5, flexDirection: 'row', justifyContent: 'flex-start', alignItems: 'center' }}>\n <div style={{ width: '40%', fontSize: TextSize.small, color: 'gray' }}>{label}</div>\n {\n item === 'status' ?\n <div style={{ width: '50%', fontSize: TextSize.small, color: 'white', padding: 3, backgroundColor: `${statusColor.get(value)}`, textAlign: 'center', borderRadius: 5 }}>\n {statusmap.get(value)}\n </div>\n :\n <div style={{ width: '60%', fontSize: TextSize.small }}>{value}</div>\n }\n </div>\n )\n}\n\nconst Row = props => {\n const { label, data, item, index } = props;\n return (\n <div key={index.toString()} style={{ display: 'flex', marginBottom: 5, flexDirection: 'row', justifyContent: 'flex-start' }}>\n <div style={{ width: '40%', fontSize: TextSize.small, color: 'gray' }}>{label}</div>\n <div style={{ width: '60%', fontSize: TextSize.small }}>{item === 'mileage' ? data[item] + ' km' : data[item]}</div>\n </div>\n )\n};\n\nconst TableColumn = () => {\n return (\n <div style={{ height: 30, display: 'flex', flexDirection: 'row', justifyContent: 'flex-start', fontSize: TextSize.small, fontWeight: '600' }}>\n <ColumnInfoStyle>\n <div style={{ width: 130, backgroundColor: '#B9B9B9', marginRight: 1, paddingLeft: 10, display: 'flex', alignItems: 'center' }}>写真</div>\n <div style={{ width: 'calc(100% - 120px)', backgroundColor: '#B9B9B9', marginRight: 1, paddingLeft: 10, display: 'flex', alignItems: 'center' }}>依頼情報</div>\n </ColumnInfoStyle>\n <ColumnDetailStyle>査定情報の詳細</ColumnDetailStyle>\n </div >\n )\n}\nconst ColumnInfoStyle = styled.div`\n width: calc(100% - 120px);\n display: flex;\n flex-direction: row;\n @media screen and (max-width: 620px) {\n width: 100%\n }\n`\nconst ColumnDetailStyle = styled.div`\n width: 120px;\n display: flex;\n flex-direction: row;\n background-color: #B9B9B9;\n margin-right: 1px;\n padding-left: 10px;\n align-items: center;\n @media screen and (max-width: 620px) {\n display: none;\n }\n`\nexport default CarList;\n","import React, { useCallback } from 'react';\nimport { useParams } from 'react-router-dom';\nimport axios from 'axios';\nimport { useDropzone } from 'react-dropzone';\nimport Encoding from 'encoding-japanese';\nimport iconv from 'iconv-lite';\nimport csv from 'csvtojson';\nimport Ajv from 'ajv';\nimport FolderIcon from '@material-ui/icons/Folder';\nimport { DropZone, } from './StyledComponents';\nimport { ButtonStyle } from './Button';\nimport { INSERT_URL } from '../config';\nimport { phoneNumberNoneProblem, formatTel, Now } from '../Functions';\n\nconst FileImport = (props) => {\n const { isButton } = props;\n const { account_name } = useParams();\n\n const checkError = (item) => {\n const ajv = Ajv({ allErrors: true });\n\n const data = {\n maker: item.maker ? item.maker : undefined,\n carType: item.carType ? item.carType : undefined,\n age: item.age ? item.age : undefined,\n mileage: item.mileage ? item.mileage : undefined,\n name: item.name ? item.name : undefined,\n phone: item.phone ? item.phone : undefined,\n address: item.address ? item.address : undefined,\n mail: item.mail,\n }\n\n const schema = {\n required: ['maker', 'carType', 'age', 'mileage', 'name', 'phone', 'address', 'mail'],\n type: 'object',\n properties: {\n mail: {\n type: 'string',\n format: 'email',\n },\n },\n };\n\n const validate = ajv.compile(schema);\n const valid = validate(data);\n if (!valid) {\n return false;\n }\n\n if (!phoneNumberNoneProblem(item.phone)) {\n return false;\n }\n\n const formatedPhoneNumber = formatTel(item.phone);\n const isHaihun = RegExp('-');\n\n if (!isHaihun.test(formatedPhoneNumber)) {\n return false;\n }\n\n return true;\n }\n\n const onDrop = useCallback(async (acceptedFiles) => {\n acceptedFiles.forEach(file => {\n const reader = new FileReader();\n\n reader.onabort = () => console.log('file reading was aborted');\n reader.onerror = () => console.log('file reading has failed');\n reader.onload = async () => {\n let importCount = 0;\n const importData = [];\n const buf = reader.result;\n const encoding = Encoding.detect(buf);\n const csvStr = Encoding.convert(buf, {\n to: 'unicode',\n from: encoding,\n type: 'string',\n })\n await csv({ noheader: false, output: \"csv\" }).fromString(csvStr)\n .then((csvRow) => {\n return csvRow;\n })\n .then((result) => {\n result.forEach(item =>\n importData.push({\n name: item['0'], phone: item['1'], mail: item['2'], address: item['3'], maker: item['4'], carType: item['5'], age: item['6'], mileage: item['7']\n })\n );\n })\n .catch((error) => {\n console.log(error);\n });\n\n for (const item of importData) {\n if (!checkError(item)) continue;\n\n await axios.post(INSERT_URL + \"/user_info\",\n {\n name: item.name,\n phone: formatTel(item.phone),\n address: item.address,\n mail: item.mail\n })\n .then(result => {\n console.log(result);\n const date = Now();\n return axios.post(INSERT_URL + \"/car_info\",\n {\n maker: item.maker,\n car_type: item.carType,\n age: item.age,\n mileage: item.mileage,\n user_id: result.data.insertId,\n account_name: account_name,\n status: 0,\n create_date: date,\n update_date: date,\n register_date: null\n });\n })\n .then(result => {\n console.log(result);\n importCount++;\n })\n .catch(error => {\n console.log('error', error);\n });\n }\n\n alert(`${importCount}件のデータを取り込みました`);\n\n if (importCount > 0)\n window.location.reload();\n };\n\n reader.readAsBinaryString(file);\n });\n }, []);\n\n const {\n getRootProps,\n getInputProps,\n isDragActive,\n isDragAccept,\n isDragReject,\n } = useDropzone({ accept: 'text/csv', onDrop, maxFiles: 1 });\n\n if (isButton) {\n return (\n <div>\n <input {...getInputProps()} />\n <ButtonStyle {...getRootProps()}>\n <FolderIcon style={{ fontSize: 16, marginRight: 4 }} />\n CSV登録\n </ButtonStyle>\n </div >\n )\n } else {\n return (\n <DropZone {...getRootProps({ isDragActive, isDragAccept, isDragReject })}>\n <input {...getInputProps()} />\n {\n <div style={{ fontSize: 16, textAlign: 'center' }}>\n <p>ここにファイルをドラッグ&ドロップ、または、クリックしてファイルを選択</p>\n </div>\n }\n </DropZone>\n );\n }\n}\n\nexport default FileImport;","import axios from 'axios';\nimport { SIGNED_URL } from \"../config.js\";\n\nclass ImageService {\n\n getImageURL = async (snapShot) => {\n const requests = snapShot.map((item) => {\n if (item.img_name) {\n return this.fetch(item.img_name)\n .then((img_url) => {\n let row = item;\n row['img_name'] = img_url;\n return row;\n })\n } else {\n let row = item;\n row['img_name'] = null;\n return row;\n }\n })\n return Promise.all(requests);\n }\n\n fetch = async (imageFile) => {\n const URL = SIGNED_URL + `${imageFile}`;\n const response = await axios.get(URL);\n return response.data;\n }\n}\n\nexport default new ImageService();\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { useParams, Link } from 'react-router-dom';\nimport axios from 'axios';\nimport { CSVLink } from \"react-csv\";\n//api\nimport { DATA_LIST_URL, exampleCSVdata, Colors } from '../../config';\n//components\nimport { FiDownload } from 'react-icons/fi';\nimport AddIcon from '@material-ui/icons/Add';\nimport { Header, Footer } from '../../Components/AdminComponents';\nimport SearchBar from '../../Components/SearchBar';\nimport { Container, Body, TitleContainer, MasterContainer, MasterItem, } from '../../Components/StyledComponents';\nimport Button from '../../Components/Button';\nimport CarList from '../../Components/CarList';\nimport FileImport from '../../Components/FileImport';\n//services\nimport ImageService from '../../Services/ImageService';\n\nconst Admin = () => {\n const [searchedData, setSearchedData] = useState([]);\n const [carData, setCarData] = useState([]);\n const [error, setError] = useState('');\n const [isLoading, setIsLoading] = useState(true);\n const { account_name } = useParams();\n\n const dataLabel = { car_type: '車名', maker: 'メーカー', mileage: '走行距離', age: '年式' };\n\n useEffect(() => {\n const getResult = async () => {\n await axios.get(DATA_LIST_URL + `?account_name=${account_name}`)\n .then((response) => {\n if (response.status === 200) {\n return response.data;\n }\n })\n .then((result) => {\n const snapShot = result;\n ImageService.getImageURL(snapShot)\n .then((cars) => {\n console.log(cars)\n setCarData(cars);\n setSearchedData(cars);\n setIsLoading(false);\n })\n })\n .catch((error) => {\n console.log('error', error)\n setError(error);\n });\n }\n getResult();\n }, []);\n\n const setSearchingData = useCallback((carList) => {\n setSearchedData(carList)\n }, []);\n\n\n const updateCarData = useCallback((car_id, status) => {\n if (!isLoading) {\n const updateIndex = carData.findIndex((car) => { return car.id === car_id });\n let data = carData;\n data[updateIndex]['status'] = status;\n setCarData([...data]);\n }\n }, [isLoading]);\n\n if (isLoading) {\n return (\n <Container>\n <Header />\n <Body>\n Loading .....\n </Body>\n </Container>\n );\n } else {\n return (\n <Container>\n <Header />\n <Body>\n <TitleContainer>\n <div>\n 査定依頼一覧\n </div>\n </TitleContainer>\n <MasterContainer>\n <SearchBar setSearchingData={(carList) => setSearchingData(carList)} carData={carData} />\n <MasterItem>\n <DownLoadCSV />\n <FileImport isButton={true} />\n <Link\n to={{\n pathname: `/admin/${account_name}/register_car`,\n }}\n style={{ textDecoration: 'none', color: '#ffffff' }}\n >\n <Button>\n <AddIcon style={{ fontSize: 14, marginRight: 4 }} />\n 新規登録\n </Button>\n </Link>\n </MasterItem>\n </MasterContainer>\n <CarList listData={searchedData} dataLabel={dataLabel} updateCarData={(car_id, status) => updateCarData(car_id, status)} />\n </Body>\n <Footer />\n </Container>\n );\n }\n};\n\nconst DownLoadCSV = () => {\n\n const style = {\n minWidth: 75,\n minHeight: 35,\n padding: '0.3em',\n fontSize: 10,\n border: 'none',\n backgroundColor: 'white',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n color: 'black',\n fontSize: 12,\n marginRight: 16,\n }\n\n return (\n <CSVLink\n data={exampleCSVdata}\n separator={\",\"}\n filename={\"登録用CSVファイル.csv\"}\n target=\"_blank\"\n style={style}\n >\n <FiDownload style={{ fontSize: 14, marginRight: 4 }} color='black' />\n 登録用CSV\n </CSVLink>\n )\n}\n\nexport default Admin;","import React, { useEffect, useState, useCallback } from 'react';\nimport CreatableSelect from 'react-select/creatable'\nimport Select from 'react-select';\n// import { Button, } from '../../Components/StyledComponents';\nimport Button from '../../Components/Button';\nimport Ajv from 'ajv';\nimport styled from 'styled-components';\n//api\nimport { errorMessages } from '../../config';\n//functions\nimport { getMakerOptions, getCarTypeOptions, getAgeOptions, getMileageOptions, getStatusOptions } from '../../Functions';\nimport { phoneNumberNoneProblem, formatTel } from '../../Functions';\n\nexport const EditCarInformation = props => {\n const { data, changeEditState, onChange, setError, error, isEditing } = props;\n const car_id = data.id;\n const [maker, setMaker] = useState('');\n const [carType, setCarType] = useState('');\n const [age, setAge] = useState();\n const [mileage, setMileage] = useState('');\n const [status, setStatus] = useState();\n const [name, setName] = useState('');\n const [phone, setPhone] = useState('');\n const [address, setAddress] = useState('');\n const [mail, setMail] = useState('');\n const [makerOptions, setMakerOptions] = useState([]);\n const [carTypeOptions, setCarTypeOptions] = useState([]);\n const [ageOptions, setAgeOptions] = useState([]);\n const [mileageOptions, setMileageOptions] = useState([]);\n const [statusOptions, setStatusOptions] = useState([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const ageOptions = getAgeOptions();\n setAgeOptions(ageOptions);\n\n const miliageOptions = getMileageOptions();\n setMileageOptions(miliageOptions);\n\n const statusOptions = getStatusOptions();\n setStatusOptions(statusOptions);\n\n const getMakers = async () => {\n const makerOptions = await getMakerOptions();\n setMakerOptions(makerOptions);\n }\n\n getMakers();\n setMaker(data.maker);\n setCarType(data.car_type);\n setAge(data.age);\n setMileage(data.mileage);\n setStatus(data.status);\n setName(data.name);\n setPhone(data.phone);\n setAddress(data.address);\n setMail(data.mail);\n setIsLoading(false);\n }, []);\n\n useEffect(() => {\n const getCarTypes = async () => {\n setCarTypeOptions([]);\n const carTypeOptions = await getCarTypeOptions(maker);\n setCarTypeOptions(carTypeOptions);\n };\n\n getCarTypes();\n }, [maker]);\n\n\n const onChangeMaker = (e) => {\n if (!e) {\n setMaker(null);\n } else {\n setMaker(e.value);\n }\n\n setCarType(null);\n };\n\n const onChangeCarType = (e) => {\n if (!e) {\n setCarType(null);\n } else {\n setCarType(e.value);\n }\n };\n\n const onChangeAge = (e) => {\n if (!e) {\n setAge(null);\n } else {\n setAge(e.value);\n }\n };\n\n const onChangeMileage = (e) => {\n if (!e) {\n setMileage(null);\n } else {\n setMileage(e.value);\n }\n };\n\n const onChangeStatus = (e) => {\n if (!e) {\n setStatus(null);\n } else {\n setStatus(e.value);\n }\n };\n\n const cancelEditing = () => {\n changeEditState();\n };\n\n const saveButtonPressed = useCallback(() => {\n const err = checkError();\n if (err.length) {\n console.log(err)\n setError(err[0]);\n } else {\n setError('');\n const updatingdData = {\n age: age,\n maker: maker,\n carType: carType,\n mileage: mileage,\n status: status,\n register_date: data.register_date,\n name: name,\n phone: formatTel(phone),\n address: address,\n mail: mail,\n car_id: car_id,\n };\n onChange(updatingdData)\n }\n }, [age, maker, carType, mileage, status, name, phone, address, mail, car_id]);\n\n const checkError = () => {\n const ajv = Ajv({ allErrors: true });\n const errorMessagesMap = new Map(errorMessages);\n const errorMessage = [];\n let isPhoneEntered = true;\n let formatedPhoneNumber = '';\n\n\n const data = {\n maker: maker ? maker : undefined,\n carType: carType ? carType : undefined,\n age: age ? age : undefined,\n mileage: mileage ? mileage : undefined,\n name: name ? name : undefined,\n phone: phone ? phone : undefined,\n address: address ? address : undefined,\n mail: mail,\n }\n\n const schema = {\n required: ['maker', 'carType', 'age', 'mileage', 'name', 'phone', 'address', 'mail'],\n type: 'object',\n properties: {\n mail: {\n type: 'string',\n format: 'email',\n },\n },\n };\n\n const validate = ajv.compile(schema);\n const valid = validate(data);\n\n if (!valid) {\n console.log(validate.errors);\n validate.errors.forEach(error => {\n if (error.keyword === 'required') {\n if (error.params.missingProperty === 'phone') {\n isPhoneEntered = false;\n }\n errorMessage.push(errorMessagesMap.get(error.params.missingProperty) + '\\n');\n } else if (error.keyword === 'format') {\n errorMessage.push('メールアドレスのフォーマットが正しくありません。\\n')\n }\n })\n }\n\n if (isPhoneEntered) {\n if (!phoneNumberNoneProblem(phone)) {\n errorMessage.push('電話番号の形式が正しくありません。\\n');\n }\n\n formatedPhoneNumber = formatTel(phone);\n const isHaihun = RegExp('-');\n\n if (!isHaihun.test(formatedPhoneNumber)) {\n errorMessage.push('電話番号の形式が正しくありません。\\n');\n }\n }\n\n return errorMessage;\n }\n\n if (isLoading) {\n return (\n <div />\n )\n } else {\n return (\n <div>\n <div style={{ width: '100%', height: '80%', overflowY: 'auto', paddingTop: 70 }}>\n {\n isEditing ?\n <div style={cntentStyle}>\n <label style={labelStyle}>ステータス</label>\n <Select value={statusOptions[status]}\n onChange={(value) => onChangeStatus(value)} options={statusOptions} className='edit-info-selection'\n />\n </div>\n :\n <div />\n }\n <div style={{ height: 28 }} />\n\n <div style={cntentStyle}>\n <label style={labelStyle}>メーカー</label>\n <CreatableSelect value={maker ? [{ label: maker, value: maker }] : null} isClearable={true} isSearchable={true} options={makerOptions}\n onChange={(value) => onChangeMaker(value)} className={'edit-info-selection'} />\n </div>\n <div style={cntentStyle}>\n <label style={labelStyle}>車種</label>\n <CreatableSelect value={carType ? [{ label: carType, value: carType }] : null} isClearable={true} isSearchable={true} options={carTypeOptions}\n onChange={(value) => onChangeCarType(value)} className={'edit-info-selection'} />\n </div>\n <div style={cntentStyle}>\n <label style={labelStyle}>年式</label>\n <CreatableSelect value={age ? [{ label: age, value: age }] : null} isClearable={true} isSearchable={true} options={ageOptions}\n onChange={(value) => onChangeAge(value)} className={'edit-info-selection'} />\n </div>\n <div style={cntentStyle}>\n <label style={labelStyle}>走行距離</label>\n <CreatableSelect value={mileage ? [{ label: mileage, value: mileage }] : null} isClearable={true} isSearchable={true} options={mileageOptions}\n onChange={(value) => onChangeMileage(value)} className={'edit-info-selection'} />\n </div>\n <div style={{ height: 28 }} />\n\n <div style={cntentStyle}>\n <label style={labelStyle}>氏名</label>\n <input defaultValue={name} type=\"text\" name=\"name\" onBlur={(e) => setName(e.target.value)} style={inputContainer} />\n </div>\n <div style={cntentStyle}>\n <label style={labelStyle}>電話番号</label>\n <input defaultValue={phone} type=\"tel\" name=\"phone\" onBlur={(e) => setPhone(e.target.value)} style={inputContainer} />\n </div>\n <div style={cntentStyle}>\n <label style={labelStyle}>メールアドレス</label>\n <input defaultValue={mail} type=\"text\" name=\"mail\" onBlur={(e) => setMail(e.target.value)} style={inputContainer} />\n </div>\n <div style={cntentStyle}>\n <label style={labelStyle}>住所</label>\n <input defaultValue={address} type=\"text\" name=\"address\" onBlur={(e) => setAddress(e.target.value)} style={inputContainer} />\n </div>\n </div>\n {error !== '' ?\n <div style={{ width: '100%', height: '10%', textAlign: 'center', color: 'red', fontSize: 12, alignItems: 'center' }}>\n {error}\n </div>\n :\n <div style={{ height: 30 }} />\n }\n <ButtonContainer>\n <Button onClick={cancelEditing} buttonStyle={'cancel'}>キャンセル</Button>\n <Button onClick={saveButtonPressed}>保存</Button>\n </ButtonContainer>\n </div>\n )\n }\n}\n\nconst ButtonContainer = styled.div`\n width: 100%;\n text-align: end;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n @media screen and (max-width: 620px) {\n justify-content: center;\n }\n\n`\nconst cntentStyle = { display: 'flex', flexDirection: 'row', width: '90%', justifyContent: 'flex-start', alignItems: 'baseline', marginBottom: 5 };\nconst labelStyle = { fontSize: 10, color: '#9A9A9A', width: 88, };\nconst inputContainer = { fontSize: 12, width: 180, height: 25 };","import React from 'react';\nimport Modal from 'react-modal';\nimport Button from '../../../Components/Button';\n\nModal.setAppElement(\"#root\");\n\nconst modalStyle = {\n overlay: {\n backgroundColor: 'rgba(0, 0, 0, .7)',\n zIndex: 1000,\n },\n content: {\n maxWidth: '500px',\n height: '150px',\n top: '50%',\n marginTop: '-100px',\n marginLeft: 'auto',\n marginRight: 'auto',\n textAlign: 'center'\n },\n};\n\nexport const EmailModal = (props) => {\n const { emailModalState, sendEmail, setEmailModalState } = props;\n\n return (\n <Modal isOpen={emailModalState} style={modalStyle}>\n <div>メールを送信してもよろしいですか?</div>\n <div className=\"field is-grouped is-grouped-right\">\n <div className=\"control\" style={{ paddingTop: 30, display: 'flex', flexDirection: 'row', justifyContent: 'center' }}>\n <Button onClick={() => setEmailModalState(false)} buttonStyle={'cancel'}>\n キャンセル\n </Button>\n <Button style={{ marginLeft: 10 }} onClick={() => sendEmail()} >\n 送信\n </Button>\n </div>\n </div>\n </Modal>\n )\n}","import React from 'react';\nimport Modal from 'react-modal';\nimport Button from '../../../Components/Button';\n\nModal.setAppElement(\"#root\");\n\nconst modalStyle = {\n overlay: {\n backgroundColor: 'rgba(0, 0, 0, .7)',\n zIndex: 1000,\n },\n content: {\n maxWidth: '500px',\n height: '150px',\n top: '50%',\n marginTop: '-100px',\n marginLeft: 'auto',\n marginRight: 'auto',\n textAlign: 'center'\n },\n};\n\nexport const DeleteModal = (props) => {\n const { deleteModalState, deleteCarResistration, setDeleteModalState } = props;\n\n return (\n <Modal isOpen={deleteModalState} style={modalStyle}>\n <div>本当に削除してもよろしいですか?</div>\n <div className=\"field is-grouped is-grouped-right\">\n <div className=\"control\" style={{ paddingTop: 30, display: 'flex', flexDirection: 'row', justifyContent: 'center' }}>\n <Button onClick={() => setDeleteModalState(false)} buttonStyle={'cancel'}>\n キャンセル\n </Button>\n <Button buttonStyle={'delete'} onClick={() => deleteCarResistration()}>\n 削除\n </Button>\n </div>\n </div>\n </Modal>\n )\n}","import React, { useEffect, useState, useCallback } from 'react';\nimport { useParams, useLocation, useHistory } from 'react-router-dom';\nimport { Header, Footer } from '../../Components/AdminComponents';\nimport { Body, TitleContainer, Container, ItemDisplayStyle, ImageDisplayStyle, InfoDisplayStyle, InfoButtonDisplayStyle } from '../../Components/StyledComponents';\nimport { EditCarInformation } from './EditCarInformation';\nimport { EmailModal } from './Modal/EmailModal';\nimport { DeleteModal } from './Modal/DeleteModal';\nimport axios from 'axios';\nimport styled from 'styled-components';\nimport Button from '../../Components/Button';\n//api\nimport { IMG_DESC_URL, USER_INFO_INSERT_URL, CAR_INFO_UPDATE_URL, CAR_INFO_DELTE_URL, statuses, StatusColor, detailDataLabel, Colors, TextSize } from '../../config';\n//services\nimport ImageService from '../../Services/ImageService';\nimport EmailService from '../../Services/EmailService';\n//functions\nimport { Now } from '../../Functions';\n\nconst CarDetail = () => {\n const [showingData, setShowingData] = useState({});\n const [imageDesc, setImageDesc] = useState([]);\n const [isLoading, setIsLoading] = useState(true);\n const [dataExists, setDataExits] = useState(false);\n const [isEditing, setIsEditing] = useState(false);\n const [error, setError] = useState('');\n const { car_id } = useParams();\n const { state } = useLocation();\n\n useEffect(() => {\n const getResult = async () => {\n const imgs = await axios.post(IMG_DESC_URL, { \"car_id\": car_id });\n ImageService.getImageURL(imgs.data)\n .then((cars) => {\n if (cars.length) {\n setImageDesc(cars);\n setIsLoading(false);\n } else {\n const defaultImgDesc = [{\n car_id: car_id,\n img_name: require('../../assets/1.png'),\n des: '',\n }];\n setImageDesc(defaultImgDesc);\n setIsLoading(false);\n }\n })\n }\n\n if (state) {\n const { data } = state;\n setShowingData({ ...data });\n getResult();\n setDataExits(true);\n } else {\n setShowingData({});\n setIsLoading(false);\n }\n }, [car_id]);\n\n const handleUpdate = useCallback((updatingData) => {\n const updateData = async () => {\n axios.post(USER_INFO_INSERT_URL, { name: updatingData.name, phone: updatingData.phone, address: updatingData.address, mail: updatingData.mail })\n .then((response) => {\n if (response.status === 200) {\n const date = Now();\n return axios.post(CAR_INFO_UPDATE_URL, {\n id: updatingData.car_id,\n maker: updatingData.maker,\n car_type: updatingData.carType,\n age: updatingData.age,\n mileage: updatingData.mileage,\n status: updatingData.status,\n update_date: date,\n register_date: updatingData.register_date,\n })\n }\n })\n .then((response) => {\n if (response.status === 200) {\n console.log('succeded in updating');\n updatingShowingData();\n }\n })\n .catch((error) => {\n console.log(error);\n setError('更新に失敗しました。時間を置いて再度お試しください');\n });\n }\n\n const updatingShowingData = () => {\n let copiedData = showingData;\n copiedData['age'] = updatingData.age;\n copiedData['maker'] = updatingData.maker;\n copiedData['car_type'] = updatingData.carType;\n copiedData['mileage'] = updatingData.mileage;\n copiedData['status'] = updatingData.status;\n copiedData['name'] = updatingData.name;\n copiedData['phone'] = updatingData.phone;\n copiedData['address'] = updatingData.address;\n copiedData['mail'] = updatingData.mail;\n setShowingData({ ...copiedData });\n setIsEditing(isEditing => !isEditing);\n };\n\n updateData();\n\n }, [showingData]);\n\n const changeEditState = useCallback(() => {\n setIsEditing(isEditing => !isEditing);\n }, []);\n\n if (isLoading) {\n return (\n <Container>\n <Header />\n <Body>\n Loading....\n </Body>\n </Container>\n );\n } else if (!dataExists) {\n return (\n <Container>\n <Header />\n <Body>\n 査定依頼車の情報がありません。\n </Body>\n </Container>\n );\n } else {\n return (\n <Container>\n <Header />\n <Body>\n <TitleContainer style={{ justifyContent: 'flex-start', marginLeft: 10, fontSize: TextSize.medium }}>\n 査定依頼詳細\n </TitleContainer>\n <ItemDisplayStyle style={{ backgroundColor: Colors.bodyBackgroundColor }}>\n <ImageAndDescription imageDesc={imageDesc} />\n {\n isEditing ?\n <InfoDisplayStyle>\n <EditCarInformation\n data={showingData}\n changeEditState={changeEditState}\n setShowingData={setShowingData}\n onChange={(updatingData) => handleUpdate(updatingData)}\n setError={setError}\n error={error}\n isEditing={true}\n />\n </InfoDisplayStyle>\n :\n <InfoDisplayStyle>\n <CarInformation data={showingData} detailDataLabel={detailDataLabel} changeEditState={changeEditState} />\n </InfoDisplayStyle>\n }\n </ItemDisplayStyle>\n </Body>\n <Footer />\n </Container >\n );\n }\n};\n\nconst ImageAndDescription = props => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const { imageDesc } = props;\n const descriptions = imageDesc[selectedIndex].des ? imageDesc[selectedIndex].des.split(/\\s/g) : [\"\"]\n console.log(descriptions)\n return (\n <ImageDisplayStyle>\n <div style={{ height: 293, width: '98%', maxWidth: 398, aspectRatio: 0.75 }}>\n <a href={imageDesc[selectedIndex].img_name} target='_blank' rel='noopener'>\n <img src={imageDesc[selectedIndex].img_name} alt={'default image'} style={{ height: '100%', width: '100%', objectFit: 'contain' }} />\n </a>\n </div>\n <div style={{ width: '95%', paddingBottom: 10, marginTop: 10, display: 'flex', flexDirection: 'row', flexWrap: 'wrap' }}>\n {\n Object.keys(imageDesc).map((item, index) => {\n return (\n <div style={{ marginRight: 5, marginBottom: 5 }} onClick={() => setSelectedIndex(index)}>\n <img src={imageDesc[index].img_name} alt={'default image'} style={selectedIndex === index ? { height: 91, maxWidth: 128, width: '100%', objectFit: 'cover' } : { height: 94, maxWidth: 128, width: '100%', objectFit: 'cover' }} />\n {selectedIndex === index && <div style={{ height: 2, backgroundColor: 'skyblue', marginTop: 1, width: '100%', }} />}\n </div>\n )\n })\n }\n </div>\n <div style={{ width: '100%', height: '20%', minHeight: 100, fontSize: TextSize.small }}>\n {descriptions.map((desc) => {\n return (\n <div>\n {desc}\n </div>\n )\n })}\n </div>\n </ImageDisplayStyle>\n )\n}\n\nexport const CarInformation = props => {\n const { data, detailDataLabel, changeEditState } = props;\n const history = useHistory();\n const [emailModalState, setEmailModalState] = useState(false);\n const [deleteModalState, setDeleteModalState] = useState(false);\n const { account_name } = useParams();\n\n const statusmap = new Map(statuses);\n const statusColor = new Map(StatusColor);\n\n const deleteCarData = async () => {\n await axios.post(CAR_INFO_DELTE_URL, { id: data.id })\n .then((response) => {\n if (response.status === 200) {\n console.log('succeded in deleting');\n }\n })\n .catch((error) => {\n console.log(error);\n });\n }\n\n const deleteCarResistration = async () => {\n await deleteCarData();\n setDeleteModalState(false);\n history.push({ pathname: `/admin/${account_name}` });\n };\n\n const sendEmail = async () => {\n await EmailService.SendHtml([data.mail], data.name, account_name)\n .then(result => {\n if (result.status === 200) {\n const updatedStatus = 1;\n return axios.post(CAR_INFO_UPDATE_URL, { id: data.id, maker: data.maker, car_type: data.car_type, age: data.age, mileage: data.mileage, status: updatedStatus })\n }\n })\n .then((response) => {\n if (response.status === 200) {\n history.push({ pathname: `/admin/${account_name}` });\n }\n })\n .catch(err => {\n console.log(err);\n });\n };\n\n const HTMLMailButton = () => {\n if (data.status === 0 || data.status === 1) {\n return <Button onClick={() => setEmailModalState(true)}>メール送信</Button>;\n } else {\n return;\n }\n }\n\n const getDate = (value) => {\n const time = value.split('T');\n const date = time[0];\n const hour = time[1].split(':', 2).join(':');\n const dateTime = date + ' ' + hour;\n return dateTime;\n }\n\n return (\n <>\n <EmailModal emailModalState={emailModalState} sendEmail={sendEmail} setEmailModalState={setEmailModalState} />\n <DeleteModal deleteModalState={deleteModalState} deleteCarResistration={deleteCarResistration} setDeleteModalState={setDeleteModalState} />\n <InfoButtonDisplayStyle>\n <div style={{ display: 'flex', flexDirection: 'row' }}>\n <Button onClick={() => changeEditState()}>編集</Button>\n <div style={{ width: 4 }} />\n <Button buttonStyle={'delete'} onClick={() => setDeleteModalState(true)}>削除</Button>\n </div>\n {HTMLMailButton()} {/* if status !== 1, then appears */}\n </InfoButtonDisplayStyle>\n <div style={{ width: '100%', height: '90%', overflowY: 'auto', marginTop: 15 }}>\n <LabelInfoStyle>\n <div style={{ fontSize: TextSize.small, width: 120, color: Colors.labelColor }}>\n {'依頼日時'}\n </div>\n <div style={{ fontSize: TextSize.small, overflowX: 'auto' }}>\n {getDate(data['create_date'])}\n </div>\n </LabelInfoStyle>\n <LabelInfoStyle>\n <div style={{ fontSize: TextSize.small, width: 120, color: Colors.labelColor }}>\n {'ステータス'}\n </div>\n <div style={{ fontSize: TextSize.small, minWidth: 84, color: 'white', padding: '3px 20px 3px 20px', backgroundColor: `${statusColor.get(data['status'])}`, textAlign: 'center', borderRadius: 5 }}>\n {statusmap.get(data['status'])}\n </div>\n </LabelInfoStyle>\n <div style={{ height: 20 }} />\n {\n Object.keys(data).map((item, index) => {\n if (detailDataLabel[item]) {\n let label = data[item];\n if (item === 'status') {\n return;\n } else if (item === 'name') {\n return (\n <LabelInfoStyle style={{ marginTop: 20 }}>\n <div style={{ fontSize: TextSize.small, width: 120, color: Colors.labelColor }}>\n {detailDataLabel[item]}\n </div>\n <div style={{ fontSize: TextSize.small, overflowX: 'auto' }}>\n {label}\n </div>\n </LabelInfoStyle>\n )\n }\n return (\n <LabelInfoStyle>\n <div style={{ fontSize: TextSize.small, width: 120, color: Colors.labelColor }}>\n {detailDataLabel[item]}\n </div>\n <div style={{ fontSize: TextSize.small, overflowX: 'auto' }}>\n {label}\n </div>\n </LabelInfoStyle>\n )\n }\n })\n }\n </div>\n </>\n )\n}\n\nconst LabelInfoStyle = styled.div`\n height: auto;\n width: 100%;\n margin-bottom: 3px;\n padding: 5px;\n display: flex;\n flex-direction: row;\n`\n\n\nexport default CarDetail;","import React, { useEffect, useState, useCallback } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { Header, Footer } from '../../Components/AdminComponents';\nimport { Body, TitleContainer, Container, BodyElement } from '../../Components/StyledComponents';\nimport Button from '../../Components/Button';\nimport { Colors, TextSize } from '../../config';\n//service\nimport ImageService from \"../../Services/ImageService\";\nimport AuthService from '../../Services/AuthService';\n\nconst StoreInfo = () => {\n const [storeData, setStoreData] = useState({});\n const [logoURL, setLogoURL] = useState('');\n const [isLoading, setIsLoading] = useState(true);\n const history = useHistory();\n\n useEffect(() => {\n const user = AuthService.getCurrentUser();\n const storeLogo = user['logo_img'];\n if (storeLogo !== null) {\n const img = [{ img_name: storeLogo }];\n ImageService.getImageURL(img)\n .then((url) => {\n setLogoURL(url[0].img_name);\n })\n .catch((err) => {\n console.log(err);\n })\n }\n setStoreData({ ...user }, setIsLoading(false));\n }, []);\n\n const editStore = useCallback(() => {\n if (storeData.account_name !== undefined) {\n history.push({ pathname: `/admin/${storeData.account_name}/store_info/edit` });\n } else {\n history.push({ pathname: '/admin/login' });\n }\n }, [storeData]);\n\n if (isLoading) {\n return (\n <Container>\n <Header />\n <Body>\n <TitleContainer style={{ justifyContent: 'flex-start', marginLeft: 10 }}>\n 店舗情報\n </TitleContainer>\n <BodyElement style={{ backgroundColor: Colors.bodyBackgroundColor }}>\n\n </BodyElement>\n </Body>\n <Footer />\n </Container>\n )\n } else {\n return (\n <Container>\n <Header />\n <Body>\n <TitleContainer style={{ justifyContent: 'flex-start', marginLeft: 10 }}>\n 店舗情報\n </TitleContainer>\n <BodyElement style={{ backgroundColor: Colors.bodyBackgroundColor }}>\n <div style={bodyStyle}>\n <div style={{ margin: '10px 0' }}>\n <Button onClick={() => editStore()}> 編集</Button>\n </div>\n <div style={cntentStyle}>\n <div style={labelStyle}>\n 店舗名\n </div>\n <div style={{ fontSize: TextSize.small, overflowX: 'auto' }}>\n {storeData.name}\n </div>\n </div>\n <div style={cntentStyle}>\n <div style={labelStyle}>\n 電話番号\n </div>\n <div style={{ fontSize: TextSize.small, overflowX: 'auto' }}>\n {storeData.phone}\n </div>\n </div>\n <div style={cntentStyle}>\n <div style={labelStyle}>\n 住所\n </div>\n <div style={{ fontSize: TextSize.small, overflowX: 'auto' }}>\n {storeData.address}\n </div>\n </div>\n <div style={cntentStyle}>\n <div style={labelStyle}>\n メールアドレス\n </div>\n <div style={{ fontSize: TextSize.small, overflowX: 'auto' }}>\n {storeData.mail}\n </div>\n </div>\n <div style={cntentStyle}>\n <div style={labelStyle}>\n 店舗ロゴ\n </div>\n <div style={{ width: 150, height: 150, backgroundColor: 'gray', alignSelf: 'center', marginBottom: 20 }} >\n <img src={logoURL} alt={'Logo'} style={{ height: '100%', width: '100%', objectFit: 'cover' }} />\n </div>\n </div>\n </div>\n </BodyElement>\n </Body>\n <Footer />\n </Container>\n )\n }\n};\n\nconst bodyStyle = {\n width: '100%',\n padding: '1em'\n}\n\nexport const labelStyle = { fontSize: TextSize.small, width: 120, color: Colors.labelColor };\n\nexport const cntentStyle = {\n height: 'auto',\n width: '100%',\n display: 'flex',\n flexDirection: 'row',\n marginBottom: 3,\n padding: 5,\n justifyContent: 'flex-start',\n alignItems: 'baseline',\n};\n\nexport default StoreInfo;","import React, { useEffect, useState, useCallback } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { Header, Footer } from '../../Components/AdminComponents';\nimport { Body, TitleContainer, BodyElement, BodyItem, Container } from '../../Components/StyledComponents';\nimport Button from '../../Components/Button';\nimport axios from 'axios';\nimport Ajv from 'ajv';\n//api\nimport { STORE_INFO_UPDATE_URL, UPLOAD_URL, Colors, TextSize } from '../../config';\n//service\nimport ImageService from \"../../Services/ImageService\";\nimport AuthService from '../../Services/AuthService';\n//styles\nimport { cntentStyle, labelStyle } from './StoreInfo';\n\nconst EditStoreInfo = () => {\n const [storeData, setStoreData] = useState({});\n const [logoURL, setLogoURL] = useState('');\n const [uploadingLogoFile, setUploadingLogoFile] = useState(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState('');\n const history = useHistory();\n\n useEffect(() => {\n const user = AuthService.getCurrentUser();\n const storeLogo = user['logo_img'];\n if (storeLogo !== null) {\n const img = [{ img_name: storeLogo }];\n ImageService.getImageURL(img)\n .then((url) => {\n setLogoURL(url[0].img_name);\n })\n .catch((err) => {\n console.log(err);\n })\n }\n setStoreData({ ...user }, setIsLoading(false));\n }, []);\n\n const setName = useCallback((input) => {\n if (input !== null) {\n let data = { ...storeData };\n data['name'] = input.value;\n setStoreData({ ...data });\n }\n }, [storeData]);\n\n const setAddress = useCallback((input) => {\n if (input !== null) {\n let data = { ...storeData };\n data['address'] = input.value;\n setStoreData({ ...data });\n }\n }, [storeData]);\n\n const setPhoneNumber = useCallback((input) => {\n if (input !== null) {\n let data = { ...storeData };\n data['phone'] = input.value;\n setStoreData({ ...data });\n }\n }, [storeData]);\n\n const setEmail = useCallback((input) => {\n if (input !== null) {\n let data = { ...storeData };\n data['mail'] = input.value;\n setStoreData({ ...data });\n }\n }, [storeData]);\n\n const cancelEditing = useCallback(() => {\n history.goBack();\n }, []);\n\n const saveButtonPressed = useCallback(() => {\n const updateStoreInfo = async () => {\n let data = { ...storeData }\n if (uploadingLogoFile !== null) {\n const result = await uploadImage(uploadingLogoFile);\n const logo_img = result[0].key;\n data = {\n ...data,\n 'id': storeData.id,\n 'name': storeData.name,\n 'address': storeData.address,\n 'logo_img': logo_img,\n 'phone': storeData.phone,\n 'mail': storeData.mail\n };\n } else {\n data = {\n ...data,\n 'id': storeData.id,\n 'name': storeData.name,\n 'address': storeData.address,\n 'logo_img': storeData.logo_img,\n 'phone': storeData.phone,\n 'mail': storeData.mail\n };\n }\n try {\n const response = await axios.post(STORE_INFO_UPDATE_URL, data);\n if (response.status === 200) {\n AuthService.set('user', JSON.stringify(data));\n history.goBack();\n }\n } catch (err) {\n console.log(err)\n history.goBack();\n }\n }\n\n const err = checkForm(storeData);\n if (err !== '') {\n setError(err);\n } else {\n updateStoreInfo();\n }\n }, [storeData, uploadingLogoFile]);\n\n const checkForm = (storeData) => {\n const ajv = Ajv({ allErrors: true });\n let errorMsg = '';\n const data = {\n 店舗名: storeData.name,\n 住所: storeData.address,\n 電話番号: storeData.phone,\n メールアドレス: storeData.mail,\n }\n const schema = {\n required: ['店舗名', '住所', '電話番号', 'メールアドレス'],\n type: 'object',\n properties: {\n メールアドレス: {\n type: 'string',\n format: 'email',\n },\n },\n };\n\n const validate = ajv.compile(schema);\n const valid = validate(data);\n\n if (!valid) {\n console.log(validate.errors);\n validate.errors.forEach(error => {\n if (error.keyword === 'required') {\n errorMsg = `必須項目を入力してください '${error.params.missingProperty}'\\n`\n } else if (error.keyword === 'format') {\n errorMsg = `フォーマットが正しくありません ${error.dataPath.slice(1, -1)}\\n`\n }\n })\n return errorMsg;\n }\n return errorMsg;\n }\n\n const uploadImage = async (file) => {\n const params = new FormData();\n params.append('file', file);\n return (await axios.post(UPLOAD_URL, params,\n {\n headers: {\n 'content-type': 'multipart/form-data',\n },\n })).data;\n }\n\n const swapImage = useCallback((img) => {\n if (img.target.files.length !== 0) {\n const imageFile = img.target.files[0]; // for sending to w3-wasabi\n const imageURL = URL.createObjectURL(img.target.files[0]); // for preview\n setLogoURL(imageURL);\n setUploadingLogoFile(imageFile);\n }\n }, []);\n\n if (isLoading) {\n return (\n <Container>\n <Header />\n <Body>\n <TitleContainer style={{ justifyContent: 'flex-start', marginLeft: 10 }}>\n 店舗情報編集\n </TitleContainer>\n <BodyElement style={{ backgroundColor: Colors.bodyBackgroundColor }}>\n\n </BodyElement>\n </Body>\n <Footer />\n </Container>\n )\n } else {\n return (\n <Container>\n <Header />\n <Body>\n <TitleContainer style={{ justifyContent: 'flex-start', marginLeft: 10 }}>\n 店舗情報編集\n </TitleContainer>\n <BodyElement style={{ backgroundColor: Colors.bodyBackgroundColor }}>\n <div style={{ widht: '100%', padding: '1em' }}>\n <div style={cntentStyle}>\n <label style={labelStyle}>店舗名</label>\n <input onChange={(e) => setName(e.target)} style={inputContainer} value={storeData.name} />\n </div>\n <div style={cntentStyle}>\n <label style={labelStyle}>住所</label>\n <input onChange={(e) => setAddress(e.target)} style={inputContainer} value={storeData.address} />\n </div>\n <div style={cntentStyle}>\n <label style={labelStyle}>電話番号</label>\n <input onChange={(e) => setPhoneNumber(e.target)} style={inputContainer} value={storeData.phone} type='tel' />\n </div>\n <div style={cntentStyle}>\n <label style={labelStyle}>メールアドレス</label>\n <input onChange={(e) => setEmail(e.target)} style={inputContainer} value={storeData.mail} />\n </div>\n\n <div style={{ ...cntentStyle, marginTop: 10 }}>\n <div style={labelStyle}>\n 店舗ロゴ\n </div>\n <input\n accept=\"image/*\"\n id=\"contained-button-file\"\n type=\"file\"\n hidden={true}\n onChange={(e) => swapImage(e)}\n />\n <label htmlFor=\"contained-button-file\" style={{ width: 150, height: 150, alignSelf: 'center', marginLeft: -10, backgroundColor: 'gray' }} >\n <img src={logoURL} alt={'Logo'} style={{ height: '100%', width: '100%', objectFit: 'cover' }} />\n </label>\n </div>\n <div style={{ width: '100%', height: '8%', textAlign: 'center', color: Colors.error, fontSize: 12, alignItems: 'center' }}>\n {error && error}\n </div>\n <div style={{ width: '100%', height: '10%', display: 'flex', flexDirection: 'row', }}>\n <Button onClick={() => cancelEditing()} buttonStyle={'cancel'}>キャンセル</Button>\n <Button onClick={() => saveButtonPressed()}>保存</Button>\n </div>\n </div>\n </BodyElement>\n </Body>\n <Footer />\n </Container>\n )\n }\n};\n\nconst inputContainer = { fontSize: 12, width: 300, height: 25 };\n\nexport default EditStoreInfo;","import React, { useEffect, useState, useCallback } from 'react';\nimport { useHistory } from 'react-router-dom'\nimport { BodyElement, TableStyle, TableTitle, EditTableContentInput } from '../../Components/StyledComponents';\nimport Button from '../../Components/Button';\nimport axios from 'axios';\nimport Ajv from 'ajv';\n//api\nimport { CAR_INFO_UID_UPDATE_URL, STORE_UID_UPDATE_URL, STORE_PASSWORD_UPDATE_URL, TextSize } from '../../config';\n\n//functions\nimport { cryptHash } from '../../Functions';\n\nconst EditTableRow = (props) => {\n const { title, setText, textType, isFirstRow } = props;\n const borderTop = isFirstRow ? null : '1px solid rgba(0, 0, 0, 0.1)';\n\n return (\n <>\n <TableStyle style={{ borderTop: borderTop }}>\n <TableTitle style={{ fontSize: TextSize.small }}>\n {title}\n </TableTitle>\n <EditTableContentInput style={{ fontSize: TextSize.small }} onChange={(e) => setText(e.target.value)} type={textType} />\n </TableStyle>\n </>\n )\n}\n\n\nexport const EditAccountName = (props) => {\n const history = useHistory();\n const { setIsModalOpen, accountInfo, pass } = props;\n const [error, setError] = useState('');\n const [accountName, setAccountName] = useState('');\n const [password, setPassword] = useState('');\n\n const saveBtnPressed = useCallback(() => {\n\n const updateAccountName = async () => {\n await axios.post(STORE_UID_UPDATE_URL, { id: accountInfo.id, account_name: accountName })\n .then((response) => {\n if (response.status === 200) {\n return axios.post(CAR_INFO_UID_UPDATE_URL, { before_account_name: accountInfo.account_name, after_account_name: accountName })\n }\n })\n .then((response) => {\n if (response.status === 200) {\n let info = accountInfo;\n info['account_name'] = accountName;\n sessionStorage.setItem('user', JSON.stringify(info))\n setIsModalOpen(false)\n history.push({\n pathname: `/admin/${accountName}/edit_account`,\n });\n }\n })\n .catch((error) => {\n console.log(error);\n if (error.response.data &&\n error.response.data.indexOf('ER_DUP_ENTRY') !== -1) {\n setError('このアカウント名は既に使用されています');\n } else {\n setError('更新に失敗しました。時間を置いて再度お試しください');\n }\n })\n }\n\n const error = checkForm();\n if (error.length) {\n setError(error[0]);\n } else {\n setError('');\n updateAccountName();\n }\n }, [accountName, password]);\n\n const checkForm = () => {\n const ajv = Ajv({ allErrors: true });\n const errorMessage = [];\n\n const data = {\n 'アカウント名': accountName,\n 'パスワード': cryptHash(password),\n }\n\n const schema = {\n required: ['アカウント名', 'パスワード'],\n type: 'object',\n properties: {\n 'アカウント名': {\n type: 'string',\n minLength: 1,\n },\n 'パスワード': {\n type: 'string',\n minLength: 1,\n },\n },\n };\n\n const validate = ajv.compile(schema);\n const valid = validate(data);\n\n if (!valid) {\n validate.errors.forEach(error => {\n if (error.keyword === 'minLength') {\n if (error.dataPath === \"['アカウント名']\") {\n errorMessage.push(`アカウント名を入力してください`);\n } else {\n errorMessage.push(`パスワードを入力してください`);\n }\n }\n })\n }\n if (cryptHash(password) !== pass) {\n errorMessage.push('パスワードが一致しませんでした。');\n }\n\n const regex = /[^A-Za-z0-9-_]/;\n if (regex.test(accountName)) {\n errorMessage.push(\"アカウント名に使用できない文字が含まれています。\");\n }\n\n return errorMessage;\n }\n\n return (\n <BodyElement style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: 210 }}>\n <div style={{ width: '80%', marginTop: 20 }}>\n <div style={{ borderTop: '1px solid rgba(0, 0, 0, 0.5)', borderBottom: '1px solid rgba(0, 0, 0, 0.5)' }}>\n <label style={headerTextStyle}>\n アカウント名変更\n </label>\n </div>\n </div>\n <div style={{ width: '80%', marginTop: 20, border: '1px solid rgba(0, 0, 0, 0.1)' }}>\n <EditTableRow title={'新しいアカウント名'} isFirstRow={true} setText={(e) => setAccountName(e)} textType={'username'} />\n <EditTableRow title={'パスワード'} isFirstRow={false} setText={(e) => setPassword(e)} textType={'password'} />\n </div>\n <label style={{ fontSize: 12, color: 'red', marginTop: 10 }}>\n {error && error}\n </label>\n <div style={{ width: '80%', marginTop: 30, display: 'flex', flexDirection: 'row', justifyContent: 'space-around' }}>\n <Button onClick={() => setIsModalOpen(false)} buttonStyle={'cancel'}>\n キャンセル\n </Button>\n <Button onClick={() => saveBtnPressed()}>\n 保存\n </Button>\n </div>\n </BodyElement>\n )\n}\n\nexport const EditPassword = (props) => {\n const { setIsModalOpen, accountInfo, pass, setIsLoading } = props;\n const [error, setError] = useState('');\n const [currentPassword, setCurrentPassword] = useState('');\n const [newPassword, setNewPassword] = useState('');\n const [confirmedNewPassword, setConfirmedNewPassword] = useState('');\n\n const saveBtnPressed = useCallback(() => {\n const updatePassword = async () => {\n await axios.post(STORE_PASSWORD_UPDATE_URL, { id: accountInfo.id, password: cryptHash(newPassword) })\n .then((response) => {\n if (response.status === 200) {\n setIsLoading(true);\n setIsModalOpen(false)\n }\n })\n .catch((error) => {\n console.log(error);\n setError('更新に失敗しました。時間を置いて再度お試しください');\n })\n }\n\n const error = checkForm();\n if (error.length) {\n setError(error[0]);\n } else {\n setError('');\n updatePassword();\n }\n }, [currentPassword, newPassword, confirmedNewPassword]);\n\n const checkForm = () => {\n const ajv = Ajv({ allErrors: true });\n const errorMessage = [];\n\n const data = {\n currentPassword: cryptHash(currentPassword),\n newPassword: newPassword,\n confirmedNewPassword: confirmedNewPassword,\n }\n\n const schema = {\n required: ['currentPassword', 'newPassword', 'confirmedNewPassword'],\n type: 'object',\n properties: {\n 'currentPassword': {\n type: 'string',\n minLength: 1,\n },\n 'newPassword': {\n type: 'string',\n minLength: 4,\n },\n 'confirmedNewPassword': {\n type: 'string',\n minLength: 4,\n },\n },\n };\n\n const validate = ajv.compile(schema);\n const valid = validate(data);\n\n if (!valid) {\n validate.errors.forEach(error => {\n if (error.keyword === 'minLength') {\n if (error.dataPath === \".currentPassword\") {\n errorMessage.push('現在のパスワードを入力してください。');\n } else if (error.dataPath === \".newPassword\") {\n errorMessage.push('5文字以上の新しいパスワードを入力してください。');\n } else {\n errorMessage.push(`確認用のパスワードを入力してください。`);\n }\n }\n })\n }\n if (newPassword !== confirmedNewPassword) {\n errorMessage.push('確認用パスワードが一致しませんでした。');\n }\n if (cryptHash(currentPassword) !== pass) {\n errorMessage.push('現在のパスワードが一致しませんでした。');\n }\n return errorMessage;\n }\n\n\n return (\n <BodyElement style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: 230 }}>\n <div style={{ width: '80%', marginTop: 20 }}>\n <div style={{ borderTop: '1px solid rgba(0, 0, 0, 0.5)', borderBottom: '1px solid rgba(0, 0, 0, 0.5)' }}>\n <label style={headerTextStyle}>\n パスワード変更\n </label>\n </div>\n </div>\n <div style={{ width: '80%', marginTop: 20, border: '1px solid rgba(0, 0, 0, 0.1)' }}>\n <EditTableRow title={'現在のパスワード'} content={'******'} isFirstRow={true} setText={(e) => setCurrentPassword(e)} textType={'password'} />\n <EditTableRow title={'新しいパスワード'} content={'******'} isFirstRow={false} setText={(e) => setNewPassword(e)} textType={'password'} />\n <EditTableRow title={'新しいパスワード'} content={'******'} isFirstRow={false} setText={(e) => setConfirmedNewPassword(e)} textType={'password'} />\n </div>\n <label style={{ fontSize: 12, color: 'red', marginTop: 10 }}>\n {error && error}\n </label>\n <div style={{ width: '80%', marginTop: 30, display: 'flex', flexDirection: 'row', justifyContent: 'space-around' }}>\n <Button onClick={() => setIsModalOpen(false)} buttonStyle={'cancel'}>\n キャンセル\n </Button>\n <Button onClick={() => saveBtnPressed()}>\n 保存\n </Button>\n </div>\n </BodyElement>\n )\n}\n\n\n\nconst headerTextStyle = { fontSize: 16, fontWeight: 'bold', marginLeft: 5 };","import React, { useEffect, useState, useCallback } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { Header, Footer } from '../../Components/AdminComponents';\nimport { Body, TitleContainer, BodyElement, Container, TableStyle, TableTitle } from '../../Components/StyledComponents';\nimport Button from '../../Components/Button';\nimport Modal from 'react-modal';\nimport axios from 'axios';\nimport Ajv from 'ajv';\nimport { EditAccountName, EditPassword } from './EditAccount';\n//service\nimport AuthService from '../../Services/AuthService';\n//api\nimport { FETCH_STORE_URL, TextSize, Colors } from '../../config';\n\nconst accountText = 'min(18px, max(14px, 1.1vw))';\n\nconst Account = () => {\n\n const [accountInfo, setAccountInfo] = useState({});\n const [password, setPassword] = useState('');\n const [isLoading, setIsLoading] = useState(true);\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [isPassword, setIsPassword] = useState(false);\n const history = useHistory();\n\n useEffect(() => {\n if (isLoading) {\n const user = AuthService.getCurrentUser();\n const getStoreInfo = async () => {\n console.log(user.id);\n await axios.post(FETCH_STORE_URL, { id: user.id })\n .then((response) => {\n return response.data;\n })\n .then((data) => {\n const pass = data[0].password;\n setPassword(pass);\n setAccountInfo(user);\n setIsLoading(false);\n })\n .catch((error) => {\n console.log(error);\n })\n }\n if (user.id) {\n getStoreInfo();\n console.log(user);\n }\n }\n }, [isLoading]);\n\n\n const setModalState = useCallback((isPassword) => {\n setIsPassword(isPassword);\n setIsModalOpen(true);\n }, [setIsModalOpen]);\n\n\n if (isLoading) {\n return (\n <Container>\n <Header />\n <Body>\n <TitleContainer style={{ justifyContent: 'flex-start', marginLeft: 10 }}>\n アカウント設定\n </TitleContainer>\n <BodyElement >\n\n </BodyElement>\n </Body>\n <Footer />\n </Container>\n )\n } else {\n return (\n <Container>\n <Header />\n <Body>\n <TitleContainer style={{ justifyContent: 'flex-start', marginLeft: 10 }}>\n アカウント設定\n </TitleContainer>\n <AccountSetting data={accountInfo} setModalState={(isPassword) => setModalState(isPassword)} />\n <Modal isOpen={isModalOpen} style={modalStyle}>\n <div className=\"field is-grouped is-grouped-right\">\n <div className=\"control\" style={{ paddingTop: 0 }}>\n {\n isPassword ?\n <EditPassword setIsModalOpen={setIsModalOpen} accountInfo={accountInfo} pass={password} setIsLoading={setIsLoading} />\n :\n <EditAccountName setIsModalOpen={setIsModalOpen} accountInfo={accountInfo} pass={password} />\n }\n </div>\n </div>\n </Modal>\n </Body>\n <Footer />\n </Container >\n )\n }\n};\n\nconst AccountSetting = (props) => {\n\n const { data, setModalState } = props;\n\n return (\n <BodyElement style={{ display: 'flex', flexDirection: 'column', alignItems: 'left', height: 210, backgroundColor: '#fAfAfA', padding: 20 }}>\n <div style={{ width: '70%' }}>\n <div>\n <label style={headerTextStyle}>\n ユーザー情報\n </label>\n </div>\n </div>\n <div style={{ width: '50%', marginTop: 20, border: '1px solid rgba(0, 0, 0, 0.1)' }}>\n <TableRow title={'アカウント名'} content={data.account_name} isFirstRow={true} onClick={() => setModalState(false)} />\n <TableRow title={'パスワード'} content={'******'} isFirstRow={false} onClick={() => setModalState(true)} />\n </div>\n </BodyElement>\n )\n}\n\nconst TableRow = (props) => {\n const { title, content, onClick, isFirstRow } = props;\n const borderTop = isFirstRow ? null : '1px solid rgba(0, 0, 0, 0.1)';\n return (\n <>\n <TableStyle style={{ borderTop: borderTop }}>\n <TableTitle style={{ fontSize: accountText }}>\n {title}\n </TableTitle>\n <div style={contentStyle}>\n {content}\n </div>\n <div >\n <Button onClick={() => onClick()}>\n 変更\n </Button>\n </div>\n </TableStyle>\n </>\n )\n}\n\nconst modalStyle = {\n overlay: {\n backgroundColor: 'rgba(0, 0, 0, .7)',\n zIndex: 1000,\n },\n content: {\n maxWidth: '600px',\n maxHeight: '300px',\n top: '50%',\n marginTop: '-200px',\n marginLeft: 'auto',\n marginRight: 'auto',\n },\n};\n\nconst headerTextStyle = { fontSize: TextSize.medium, fontWeight: 'bold' };\nconst contentStyle = { width: '50%', fontSize: accountText, padding: 5 };\n\nexport default Account;","import React, { useEffect, useState, useCallback } from 'react';\nimport { Link, useHistory, useParams } from 'react-router-dom';\nimport { Header, Footer } from '../../Components/AdminComponents';\nimport { Body, Container, TitleContainer } from '../../Components/StyledComponents';\nimport Button from '../../Components/Button';\nimport Modal from 'react-modal';\nimport axios from 'axios';\nimport Ajv from 'ajv';\nimport styled from 'styled-components';\nimport { EditCarInformation } from './EditCarInformation';\n//api\nimport { detailDataLabel, registerForm, statuses, INSERT_URL, Colors } from '../../config';\n//functions\nimport { Now } from '../../Functions';\n\n\nconst CarRegistration = () => {\n const history = useHistory();\n const account = useParams();\n const account_name = account.account_name;\n\n const [data, setData] = useState({ ...registerForm });\n const [error, setError] = useState('');\n const [isRegistering, setIsregistering] = useState(true);\n\n\n const finishRegistering = useCallback(() => {\n history.push({ pathname: `/admin/${account_name}` })\n }, []);\n\n const handleRegistering = useCallback((enteredData) => {\n const registerCarInfo = async () => {\n try {\n const resultUserInfo = await axios.post(INSERT_URL + \"/user_info\",\n {\n name: enteredData.name,\n phone: enteredData.phone,\n address: enteredData.address,\n mail: enteredData.mail\n });\n\n const date = Now();\n const resultCarInfo = await axios.post(INSERT_URL + \"/car_info\",\n {\n maker: enteredData.maker,\n car_type: enteredData.carType,\n age: enteredData.age,\n mileage: enteredData.mileage,\n user_id: resultUserInfo.data.insertId,\n status: 0,\n account_name: account_name,\n create_date: date,\n update_date: date,\n register_date: null,\n });\n setData({ ...enteredData })\n setIsregistering(isRegistering => !isRegistering)\n } catch (error) {\n setError(error)\n }\n }\n\n registerCarInfo();\n }, []);\n\n\n return (\n <Container >\n <Header />\n <Body>\n <TitleContainer>\n <div>\n 査定依頼車追加フォーム\n </div>\n </TitleContainer>\n {\n isRegistering ?\n <CarInfoContainer>\n <EditCarInformation\n data={data}\n setShowingData={setData}\n changeEditState={finishRegistering}\n onChange={(enteredData) => handleRegistering(enteredData)}\n setError={setError}\n error={error}\n isEditing={false}\n />\n </CarInfoContainer>\n :\n <CarInfoContainer>\n <CarInformation data={data} detailDataLabel={detailDataLabel} />\n </CarInfoContainer>\n }\n </Body>\n <Footer />\n </Container >\n )\n}\n\nconst CarInformation = props => {\n const { data, detailDataLabel, } = props;\n const { account_name } = useParams();\n const statusmap = new Map(statuses);\n\n return (\n <>\n <div style={{ width: '80%', height: '90%', overflowY: 'auto', justifySelf: 'center', paddingTop: 40 }}>\n {\n Object.keys(data).map((item, index) => {\n if (detailDataLabel[item]) {\n let label = data[item];\n if (item === 'status') {\n label = statusmap.get(data[item]);\n }\n return (\n <div style={{ height: 'auto', width: '100%', marginBottom: 3, padding: 5, display: 'flex', flexDirection: 'row', alignItems: 'center', justifyContent: 'space-around' }}>\n <div style={{ fontSize: 14, width: '30%', color: Colors.labelColor }}>\n {detailDataLabel[item]}\n </div>\n <div style={{ fontSize: 16, overflowX: 'auto', width: '50%' }}>\n {label}\n </div>\n </div>\n )\n }\n })\n }\n </div>\n <div style={{ alignSelf: 'center', marginTop: 30 }}>\n <Link\n to={{\n pathname: `/admin/${account_name}`,\n }}\n style={{ color: 'gray', width: 'auto', height: '100%', marginTop: 20 }}\n >\n <Button>\n 戻る\n </Button>\n </Link>\n </div>\n\n </>\n )\n}\n\nconst CarInfoContainer = styled.div`\n width: 60%;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding: 0 50px 50px 30px;\n margin-left: auto;\n margin-right: auto;\n margin-top: 10px;\n background-color: ${Colors.bodyBackgroundColor};\n @media screen and (max-width: 620px) {\n width: 90%;\n padding: 0px 10px 50px 10px;\n }\n`\n\nexport default CarRegistration;","import React, { Component } from 'react';\nimport { Route, Switch, Redirect } from 'react-router-dom';\nimport PrivateRoute from './PrivateRoute';\n//customer\nimport Top from './Screens/Customer/Top';\nimport Phone from './Screens/Customer/Phone';\nimport PINcode from './Screens/Customer/PINcode';\nimport Input from './Screens/Customer/Input';\nimport Photos from './Screens/Customer/Photos';\nimport Confirm from './Screens/Customer/Confirm';\nimport Submit from './Screens/Customer/Submit';\n//store\nimport LogIn from './Screens/Store/LogIn';\nimport LogOut from './Screens/Store/LogOut';\nimport Admin from './Screens/Store/Admin';\nimport CarDetail from './Screens/Store/CarDetail';\nimport StoreInfo from './Screens/Store/StoreInfo';\nimport EditStoreInfo from './Screens/Store/EditStoreInfo';\nimport Account from './Screens/Store/Account';\nimport CarRegistration from './Screens/Store/CarRegistration'\n\nimport NotFound from './Screens/NotFound';\n\n\nclass App extends Component {\n render() {\n return (\n <div style={container}>\n <Switch>\n <Route exact path='/' >\n <Redirect to=\"/user/g-complete\" />\n </Route>\n <Route exact path='/user/:account_name' component={Top} />\n <Route exact path='/user/:account_name/phone' component={Phone} />\n <Route exact path='/user/:account_name/pincode/' component={PINcode} />\n <Route exact path='/user/:account_name/input/' component={Input} />\n <Route exact path='/user/:account_name/photos' component={Photos} />\n <Route exact path='/user/:account_name/confirm' component={Confirm} />\n <Route exact path='/user/:account_name/submit/' component={Submit} />\n\n <Route exact path='/admin/login' component={LogIn} />\n <Route exact path='/admin/logout' component={LogOut} />\n\n <PrivateRoute exact path='/admin/:account_name' component={Admin} />\n <PrivateRoute exact path='/admin/:account_name/store_info' component={StoreInfo} />\n <PrivateRoute exact path='/admin/:account_name/store_info/edit' component={EditStoreInfo} />\n <PrivateRoute exact path='/admin/:account_name/edit_account' component={Account} />\n <PrivateRoute exact path='/admin/:account_name/register_car' component={CarRegistration} />\n <PrivateRoute exact path='/admin/:account_name/:car_id' component={CarDetail} />\n <Route component={NotFound} />\n </Switch>\n </div>\n );\n }\n}\n\nconst container = {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n zIndex: 0,\n height: '100%',\n overflow: 'scroll',\n}\n\nexport default App;","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport {BrowserRouter} from 'react-router-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(\n <BrowserRouter>\n <App />\n </BrowserRouter>\n, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: http://bit.ly/CRA-PWA\nserviceWorker.unregister();","module.exports = __webpack_public_path__ + \"static/media/default.8a8b9cda.png\";"],"sourceRoot":""}