{"version":3,"sources":["assets/loading-data.gif","assets/error-icon.png","assets/save-icon.png","assets/cancel-icon.png","assets/edit-icon.png","assets/delete-icon.png","assets/plane-arrow.png","assets/arrows-icon.png","assets/airline-icon.png","assets/close-icon.png","assets/login-icon.png","assets/info-icon.png","assets/person-icon.png","assets/signup-icon.png","assets/folder-icon.png","assets/menu-icon.png","assets/customer-icon.png","assets/logo.png","assets/plane.png","assets/clouds.png","assets/loading-plane.gif","assets/about.jpg","assets/register.jpg","assets/show-pass.png","assets/hide-pass.png","assets/sky-desktop.jpg","services/ErrorService.js","Constants.js","services/AuthService.js","UserContext.js","services/ViewService.js","components/Button.js","components/UserActions.js","components/Navbar.js","components/Home.js","services/CountriesService.js","components/Flights/CountrySelect.js","components/Flights/TripSelect.js","components/Flights/DateSelect.js","services/DateTimeService.js","components/Flights/SearchResults.js","components/Flights.js","components/About.js","components/Login.js","components/Register.js","components/CustomerRegister.js","components/AirlineRegister.js","components/HiddenField.js","components/Admin/PendingAirline.js","components/Admin/AdminInbox.js","components/Admin/CustomerContainer.js","components/Admin/ManageCustomers.js","components/Admin/AirlineContainer.js","components/Admin/ManageAirlines.js","components/Admin.js","components/Customer/TicketContainer.js","components/Customer/ManageTickets.js","components/PasswordChange.js","components/Customer/CustomerDetails.js","components/Customer.js","components/Airline/FlightContainer.js","components/Airline/ManageFlights.js","components/Airline/AirlineDetails.js","components/Airline/CreateFlight.js","components/Airline.js","components/UserPage.js","components/PurchaseTicket.js","components/FlightsBoard.js","components/DealsPage.js","App.js","index.js"],"names":["module","exports","logErrorToConsole","error","errorObject","message","data","console","log","host","getFlightByIdURL","updateCustomerURL","updateAirlineURL","purchaseTicketURL","deleteTicketURL","login","credentials","axios","post","then","res","status","localStorage","setItem","catch","response","ErrorService","getUserInfo","userToken","getItem","anonymousUser","role","name","user","JwtDecode","userInfo","JSON","parse","LoginToken","getUserName","checkToken","exp","removeItem","User","userRole","FirstName","Name","getAuthHeader","headers","Authorization","expireTimestamp","Date","logout","handleUserChange","UserContext","React","createContext","UserContextProvider","state","setUserInfo","setState","AuthService","updateUserInfo","a","this","Provider","value","handleLogin","props","children","Component","isMobileView","window","innerWidth","innerHeight","Button","handleClick","e","onClick","className","id","text","src","icon","alt","UserActions","loggedOff","btnClicked","loginMenuOpened","userMenuOpened","context","setBtnClickState","btnState","setTimeout","toggleLoginMenu","navMenuOpen","toggleUserMenu","userContext","ViewService","signUpIcon","loginIcon","personIcon","closeIcon","success","show","title","onConfirm","to","href","userIcon","contextType","Navbar","mobileMenuOpened","homePageClicked","goToHomePage","toggleMenu","navActiveStyle","textShadow","logo","activeStyle","exact","menuIcon","Home","plane","clouds","getCountries","countries","getCountriesFromAPI","get","CountrySelect","handleChange","onChange","htmlFor","labelText","required","map","country","key","display","TripSelect","type","checked","DateSelect","getTimeString","date","hours","getHours","minutes","getMinutes","getFlightDuration","departureDate","landingDate","ftHoursFloat","ftHours","Math","floor","ftMinutes","getFormattedDateTimeString","year","getFullYear","month","getMonth","day","getDate","hour","SearchResults","results","getFlightData","flight","departureTime","DateTimeService","landingTime","flightDuration","submitState","loadingPlane","errorIcon","flights","length","roundtrip","hasOwnProperty","flightsPair","f1","f2","ticketPrice","parseInt","flightId","buyTicket","airlineName","originCountry","planeArrow","destinationCountry","f","Flights","origin","destination","departure","return","errorState","formError","buyTicketState","selectedFlights","CancelToken","source","CountriesService","countriesOptions","Id","concat","validationCheck","thisDate","setHours","handleUrlQueries","insertQueryParamsToForm","getFlights","queriesValues","history","location","search","split","block","getRequestURL","requestType","queryParams","url","target","handleSubmit","preventDefault","departureFlightId","returnFlightId","flightType","getSelectedFlightsParams","params","cancel","loadingData","onSubmit","disabled","path","render","showCancel","showConfirm","allowEscape","onCancel","About","aboutImg","Login","username","password","loginState","loginStatus","ud","Register","registerImage","CustomerRegister","AirlineRegister","HiddenField","fieldVisable","toggleShowField","label","style","hideIcon","showIcon","PendingAirline","airline","moreDetails","showPassword","actionState","alertMessage","toggleMoreDetails","toggleShowPassword","handleRemoveAirline","removeFunc","handleOperationError","handleAproveAirline","aproveFunc","showAproveAlert","showRemoveAlert","getCountryName","find","pictureStyle","filter","colorKey","loadingIcon","airlineIcon","Email","arrowsIcon","aproveIcon","removeIcon","UserName","Password","CountryCode","AdminInbox","dataState","airlines","aproveMessage","getAirlines","cancelToken","token","isCancel","aproveAirline","handleError","method","removeAirlineFromList","removeAirline","newAirlinesList","forEach","push","initializeData","airlinesList","CustomerContainer","customer","newCustomer","editCustomer","updateState","validationMessage","deleteState","showEditCustomer","customerClone","Object","assign","cancelEdit","updateCustomer","validateCustomerDetails","LastName","Address","PhoneNo","handleDeleteBtn","handleDeleteCustomer","deleteFunc","deleteErrorHandle","customerFullName","customerIcon","defaultValue","cancelIcon","saveIcon","editIcon","deleteIcon","ManageCustomers","customersState","customers","getCustomers","deleteCustomer","removeCustomerFromList","customerId","newCustomersList","isFilteredOut","toUpperCase","includes","displayedCustomers","AirlineContainer","newAirline","editMode","airlineClone","updateAirline","validateAirlineDetails","handleDeleteAirline","ManageAirlines","deleteAirline","airlineId","displayedAirlines","Admin","mobileNavSelect","fontWeight","backgroundColor","component","TicketContainer","showDeleteAlert","TicketId","departureDateTime","DepartureTime","landingDateTime","LandingTime","flightTime","AirlineCompany","OriginCountry","DestinationCountry","ManageTickets","flightsState","ticketDeleted","getCustomerFlights","deleteTicket","ticketId","removeTicketFromList","newTicketsList","tickets","instructions","infoIcon","PasswordChange","changeBtnClicked","currentPassword","newPassword","changeState","changePassword","requestURL","validateFields","userType","handlePasswordChange","closePopUp","warning","CustomerDetails","validationAlert","setEditMode","cancelEditMode","updateCustomerDetails","renewUserToken","newCustUsername","newCustPassword","CreditCardNo","class","Customer","savedTicketState","savedTicketParams","checkForSavedTicket","getTicketParams","ticket","ticketType","departureFlight","returnFlight","FlightContainer","newFlight","editState","countriesState","errorMessage","handleDeleteFlight","handleDeleteError","getFlightStatus","depDate","landDate","flightClone","updateFlight","validateFlightDetails","OriginCountryCode","DestinationCountryCode","RemainingTickets","TicketPrice","flightStatus","ManageFlights","batchesToDisplay","isFiltering","getAirlineFlights","deleteFlight","cancelFlightURL","removeFlightFromList","newFlightsList","mapFlights","handleScroll","scrollHeight","clientHeight","scrollTop","totalFlights","displayedFlights","index","onScroll","AirlineDetails","updateAirlineDetails","newAirUsername","newAirPassword","setCountryName","CreateFlight","createState","resetFlightState","AirlineCompanyId","createFlight","unshift","Airline","UserPage","pathname","PurchaseTicket","purchaseState","getFlightIdsFromUrl","queryValues","isRegisteredCustomer","ExceptionType","saveTicketForLater","stringify","retFlight","depFlightHeading","roundtripTicketPrice","flightReference","doubleTicketMessage","depFlight","FlightsBoard","DealsPage","App","bgImage","ReactDOM","StrictMode","document","getElementById"],"mappings":"6FAAAA,EAAOC,QAAU,IAA0B,0C,oBCA3CD,EAAOC,QAAU,IAA0B,wC,iBCA3CD,EAAOC,QAAU,IAA0B,uC,gBCA3CD,EAAOC,QAAU,IAA0B,yC,oBCA3CD,EAAOC,QAAU,IAA0B,uC,kBCA3CD,EAAOC,QAAU,IAA0B,yC,gBCA3CD,EAAOC,QAAU,IAA0B,yC,mBCA3CD,EAAOC,QAAU,IAA0B,yC,gBCA3CD,EAAOC,QAAU,IAA0B,0C,gBCA3CD,EAAOC,QAAU,IAA0B,wC,cCA3CD,EAAOC,QAAU,0hR,mCCAjBD,EAAOC,QAAU,IAA0B,uC,cCA3CD,EAAOC,QAAU,8/O,mCCAjBD,EAAOC,QAAU,IAA0B,yC,cCA3CD,EAAOC,QAAU,0zT,kBCAjBD,EAAOC,QAAU,IAA0B,uC,gBCA3CD,EAAOC,QAAU,IAA0B,2C,8BCA3CD,EAAOC,QAAU,IAA0B,kC,gBCA3CD,EAAOC,QAAU,IAA0B,mC,gBCA3CD,EAAOC,QAAU,IAA0B,oC,gBCA3CD,EAAOC,QAAU,IAA0B,2C,gBCA3CD,EAAOC,QAAU,IAA0B,mC,gBCA3CD,EAAOC,QAAU,IAA0B,sC,gBCA3CD,EAAOC,QAAU,IAA0B,uC,gBCA3CD,EAAOC,QAAU,IAA0B,uC,gBCA3CD,EAAOC,QAAU,IAA0B,yC,oeCc5B,M,sCAVXC,kBAAoB,SAACC,GACjB,IAAIC,EAAc,CACdC,QAAS,sDACTC,KAAMH,GAEVI,QAAQC,IAAIJ,KCFPK,EAAO,uBAOPC,EAAmBD,EAAO,4BAU1BE,EAAoBF,EAAO,oCAI3BG,EAAmBH,EAAO,mCAU1BI,EAAoBJ,EAAO,+BAC3BK,EAAkBL,EAAO,6BCmEvB,M,iDAhGXM,MAAQ,SAACC,GACL,OAAOC,IAAMC,KDEUT,mDCFYO,GAAaG,MAAK,SAAAC,GAEjD,GAAkB,KAAdA,EAAIC,OAGJ,OADAC,aAAaC,QAAQ,YAAaH,EAAId,MAC/B,aAEZkB,OAAM,SAAArB,GAGL,OAAsB,MAAlBA,EAAMsB,UAEuB,KAAzBtB,EAAMsB,SAASJ,OAER,WAKfK,EAAaxB,kBAAkBC,GACxB,a,KAKfwB,YAAc,WACV,IAAIC,EAAYN,aAAaO,QAAQ,aACjCC,EAAgB,CAAEC,KAAM,YAAaC,KAAM,SAG/C,GAAiB,MAAbJ,EAEA,OAAOE,EAKP,IAAIG,EAAOC,IAAUN,GACjBO,EAAWC,KAAKC,MAAMJ,EAAKK,YAC3BN,EAAO,EAAKO,YAAYN,EAAKF,KAAMI,GAGvC,OAAiC,GAA7B,EAAKK,WAAWP,EAAKQ,MAErBnB,aAAaoB,WAAW,aACjBZ,GAIA,CAACC,KAAME,EAAKF,KACXC,KAAMA,EACNC,KAAME,EAASQ,O,KAMnCJ,YAAc,SAACK,EAAUT,GACrB,OAAQS,GACJ,IAAK,gBACL,MAAO,QAEP,IAAK,WACL,OAAOT,EAASQ,KAAKE,UAErB,IAAK,iBACL,OAAOV,EAASQ,KAAKG,KAErB,QACA,MAAO,Y,KAKfC,cAAgB,WACZ,MAAO,CACHC,QAAS,CACLC,cAAe,UAAY3B,aAAaO,QAAQ,gB,KAM5DW,WAAa,SAACU,GAEV,OADiB,IAAIC,KAAuB,IAAlBD,GACN,IAAIC,M,KAI5BC,OAAS,SAACC,GACN/B,aAAaoB,WAAW,aACxBW,MCnGKC,EAAcC,IAAMC,gBAsDlBC,E,4MAjDXC,MAAQ,CACJ3B,KAAM,GACNC,KAAM,I,EAIV2B,YAAc,WACZ,EAAKC,SAASC,EAAYlC,c,EAK5BmC,e,uCAAiB,WAAO9C,GAAP,SAAA+C,EAAA,sEACIF,EAAY9C,MAAMC,GADtB,UAED,WAFC,8BAIb,EAAK2C,cAJQ,mBAKN,GALM,iCASN,GATM,2C,wHAcfK,KAAKL,gB,+BAIL,MAAuB,IAAnBK,KAAKN,MAAM3B,KAEN,KAKH,kBAACuB,EAAYW,SAAb,CAAsBC,MAAO,CAC3B/B,SAAU6B,KAAKN,MACfS,YAAaH,KAAKL,YAClBG,eAAgBE,KAAKF,iBAElBE,KAAKI,MAAMC,c,GA5CMC,aCEnB,M,sCALXC,aAAe,WACX,OAAQC,OAAOC,WAAaD,OAAOE,YAAe,MCgB3CC,E,4MAdXC,YAAc,SAACC,GACX,EAAKT,MAAMU,QAAQD,I,uDAInB,OACI,yBAAKE,UAAU,YAAYC,GAAIhB,KAAKI,MAAMY,GAAIF,QAASd,KAAKY,aACxD,2BAAOI,GAAIhB,KAAKI,MAAMY,GAAG,QAASD,UAAU,kBAAkBf,KAAKI,MAAMa,KAAzE,YACA,yBAAKC,IAAKlB,KAAKI,MAAMe,KAAMH,GAAIhB,KAAKI,MAAMY,GAAG,QAASI,IAAI,GAAGL,UAAU,wB,GAVlET,a,sGCYfe,E,4MAEF3B,MAAQ,CACJ4B,WAAW,EACXC,WAAY,OACZC,iBAAiB,EACjBC,gBAAgB,G,EAIpBrC,OAAS,WACL,IAAIC,EAAmB,EAAKqC,QAAQvB,YACpCN,EAAYT,OAAOC,GACnB,EAAKO,SAAS,CACV0B,WAAW,EACXE,iBAAiB,K,EAKzBG,iBAAmB,SAACC,GACA,WAAZA,GAEA,EAAKhC,SAAS,CAAC2B,WAAY,YAEf,SAAZK,GAEA,EAAKhC,SAAS,CAAC2B,WAAY,UAEf,aAAZK,GAEA,EAAKhC,SAAS,CAAC2B,WAAY,cAG/BM,YAAW,kBACP,EAAKjC,SAAS,CACV2B,WAAY,OACZC,iBAAiB,EACjBC,gBAAgB,MAExB,M,EAKJK,gBAAkB,WACd,EAAKlC,SAAS,CACV4B,iBAAkB,EAAK9B,MAAM8B,kBAC/B,WACM,EAAKpB,MAAM2B,aAAe,EAAKrC,MAAM8B,iBAErC,EAAKpB,MAAMqB,qB,EAOvBO,eAAiB,WACb,EAAKpC,SAAS,CACV6B,gBAAiB,EAAK/B,MAAM+B,iBAC9B,WACM,EAAKrB,MAAM2B,aAAe,EAAKrC,MAAM+B,gBAErC,EAAKrB,MAAMqB,qB,0EAOM,IAAD,OACxBI,YAAW,WACH,EAAKzB,MAAM2B,aAEX,EAAKnC,SAAS,CACV4B,iBAAiB,EACjBC,gBAAgB,MAG1B,K,+BAGI,IAAD,OACDQ,EAAcjC,KAAK0B,QACvB,MAAiC,aAA7BO,EAAY9D,SAASJ,KAGjB,yBAAKgD,UAAU,iBAETmB,EAAY3B,gBACV,yBAAKS,GAAG,qBACJ,kBAAC,EAAD,CAAQA,GAAG,cAAcF,QAAS,kBAAI,EAAKa,iBAAiB,YAAYV,KAAK,UAAUE,KAAMgB,MAC7F,kBAAC,EAAD,CAAQnB,GAAG,iBAAiBF,QAAS,kBAAI,EAAKa,iBAAiB,UAAUV,KAAK,QAAQE,KAAMiB,OAInGF,EAAY3B,gBACT,yBAAKS,GAAG,oBACJ,kBAAC,EAAD,CAAQA,GAAG,wBAAwBF,QAASd,KAAK8B,gBAAiBb,KAAK,QAAQE,KAAMkB,MACpFrC,KAAKN,MAAM8B,iBACR,yBAAKR,GAAG,oBAAoBD,UAAU,eAClC,kBAAC,EAAD,CAAQC,GAAG,qBAAqBF,QAAS,kBAAI,EAAKa,iBAAiB,YAAYV,KAAK,UAAUE,KAAMgB,MACpG,kBAAC,EAAD,CAAQnB,GAAG,wBAAwBF,QAAS,kBAAI,EAAKa,iBAAiB,UAAUV,KAAK,QAAQE,KAAMiB,MACnG,kBAAC,EAAD,CAAQpB,GAAG,iBAAiBF,QAASd,KAAK8B,gBAAiBb,KAAK,QAAQE,KAAMmB,QAM9F,kBAAC,IAAD,CACIC,SAAO,EACPC,KAA8B,GAAxBxC,KAAKN,MAAM4B,UACjBmB,MAAK,WACLxB,KAAK,0BACLyB,UAAW,kBAAM,EAAK9C,SAAS,CAAE0B,WAAW,OAGtB,SAAzBtB,KAAKN,MAAM6B,YACR,kBAAC,IAAD,CAAUoB,GAAG,WAES,WAAzB3C,KAAKN,MAAM6B,YACR,kBAAC,IAAD,CAAUoB,GAAG,cAEQ,GAAxB3C,KAAKN,MAAM4B,WACR,kBAAC,IAAD,CAAUqB,GAAG,OAQpBT,EAAY3B,eA6BT,yBAAKQ,UAAU,iCACP,yBAAKA,UAAU,qBAAqBD,QAASd,KAAKgC,gBAC9C,2BAAOjB,UAAU,cAAckB,EAAY9D,SAASH,MACpD,yBAAKkD,IAAKmB,IAAYjB,IAAI,GAAGwB,KAAK,IAAI7B,UAAU,iBAEnDf,KAAKN,MAAM+B,gBACR,yBAAKT,GAAG,mBAAmBD,UAAU,eAEjC,kBAAC,EAAD,CAAQC,GAAG,uBAAuBF,QAAS,kBAAI,EAAKa,iBAAiB,cAAcV,KAAK,UAAUE,KAAM0B,MAExG,kBAAC,EAAD,CAAQ7B,GAAG,oBAAoBF,QAASd,KAAKZ,OAAQ6B,KAAK,SAASE,KAAMiB,MAEzE,kBAAC,EAAD,CAAQpB,GAAG,iBAAiBF,QAASd,KAAKgC,eAAgBf,KAAK,QAAQE,KAAMmB,OAI3D,aAAzBtC,KAAKN,MAAM6B,YACR,kBAAC,IAAD,CAAUoB,GAAG,gBA3CzB,yBAAK5B,UAAU,gCACX,yBAAKA,UAAU,iBACX,yBAAKA,UAAU,sBACX,2BAAOA,UAAU,cAAjB,UAAsCkB,EAAY9D,SAASH,KAA3D,KACA,yBAAKkD,IAAKmB,IAAYjB,IAAI,GAAGwB,KAAK,IAAI7B,UAAU,iBAEpD,yBAAKA,UAAU,oBAEX,kBAAC,IAAD,CAAMA,UAAU,gBAAgB4B,GAAG,cAAnC,UAEI,yBAAK5B,UAAU,YAAYK,IAAI,GAAGF,IAAK2B,OAG3C,4BAAQ9B,UAAU,iBAAiBD,QAASd,KAAKZ,QAAjD,SAEI,yBAAK2B,UAAU,cAAcK,IAAI,GAAGF,IAAKkB,c,GAvJnD9B,aA6L1Be,EAAYyB,YAAcxD,EAEX+B,Q,kCCzHA0B,E,4MA1EXrD,MAAQ,CACJsD,kBAAkB,EAClBC,iBAAiB,G,EAGrBC,aAAe,WACX,EAAKtD,SAAS,CAACqD,iBAAiB,IAChCpB,YAAW,kBAAK,EAAKjC,SAAS,CAACqD,iBAAiB,MAAS,M,EAG7DE,WAAa,WACT,EAAKvD,SAAS,CACVoD,kBAAmB,EAAKtD,MAAMsD,oB,EAKtCvB,eAAiB,WACT,EAAK/B,MAAMsD,kBAEX,EAAKpD,SAAS,CAACoD,kBAAkB,K,uDAI/B,IAAD,OACCI,EAAiB,CACnBC,WAAW,mBAGf,OACI,6BACI,yBAAKtC,UAAU,cAETf,KAAKN,MAAMuD,iBACb,kBAAC,IAAD,CAAUN,GAAG,MAGb,yBAAKzB,IAAKoC,IAAMlC,IAAI,GAAGwB,KAAK,IAAI7B,UAAU,YAAYD,QAASd,KAAKkD,gBAClEhB,EAAY3B,gBACV,yBAAKQ,UAAU,eACX,kBAAC,IAAD,CAASA,UAAU,aAAawC,YAAaH,EAAgBI,OAAK,EAACb,GAAG,KAAtE,QACA,kBAAC,IAAD,CAAS5B,UAAU,aAAawC,YAAaH,EAAgBT,GAAG,YAAhE,WACA,kBAAC,IAAD,CAAS5B,UAAU,aAAawC,YAAaH,EAAgBT,GAAG,UAAhE,SACA,kBAAC,IAAD,CAAS5B,UAAU,aAAawC,YAAaH,EAAgBT,GAAG,kBAAhE,iBACA,kBAAC,IAAD,CAAS5B,UAAU,aAAawC,YAAaH,EAAgBT,GAAG,UAAhE,UAGNT,EAAY3B,iBAAmBP,KAAKN,MAAMsD,kBACxC,kBAAC,EAAD,CAAQhC,GAAG,sBAAsBF,QAASd,KAAKmD,WAAYlC,KAAK,OAAOE,KAAMsC,MAI/EvB,EAAY3B,gBAAkBP,KAAKN,MAAMsD,kBAEvC,6BACI,kBAAC,EAAD,CAAQhC,GAAG,sBAAsBF,QAAS,kBAAI,EAAKlB,SAAS,CAACoD,kBAAmB,EAAKtD,MAAMsD,oBAAoB/B,KAAK,OAAOE,KAAMsC,MACjI,yBAAKzC,GAAG,kBAAkBD,UAAU,eAChC,kBAAC,IAAD,CAASD,QAASd,KAAKmD,WAAYpC,UAAU,oBAAoBwC,YAAaH,EAAgBI,OAAK,EAACb,GAAG,KAAvG,QACA,kBAAC,IAAD,CAAS7B,QAASd,KAAKmD,WAAYpC,UAAU,oBAAoBwC,YAAaH,EAAgBT,GAAG,YAAjG,WACA,kBAAC,IAAD,CAAS7B,QAASd,KAAKmD,WAAYpC,UAAU,oBAAoBwC,YAAaH,EAAgBT,GAAG,UAAjG,SACA,kBAAC,IAAD,CAAS7B,QAASd,KAAKmD,WAAYpC,UAAU,oBAAoBwC,YAAaH,EAAgBT,GAAG,kBAAjG,iBACA,kBAAC,IAAD,CAAS7B,QAASd,KAAKmD,WAAYpC,UAAU,oBAAoBwC,YAAaH,EAAgBT,GAAG,UAAjG,SACA,kBAAC,EAAD,CAAQ3B,GAAG,iBAAiBF,QAASd,KAAKmD,WAAYlC,KAAK,QAAQE,KAAMmB,QAKrF,kBAAC,EAAD,CAAaP,YAAa/B,KAAKN,MAAMsD,iBAAkBvB,eAAgBzB,KAAKyB,uB,GArE3EnB,a,mCCsCNoD,I,MAzCF,SAAStD,GAClB,OACI,6BACI,yBAAKY,GAAG,kBAEJ,yBAAKA,GAAG,mBACJ,yBAAKA,GAAG,QAAQI,IAAI,GAAGF,IAAKyC,MAC5B,yBAAK3C,GAAG,SAASI,IAAI,GAAGF,IAAK0C,QAGjC,yBAAK5C,GAAG,mBACJ,yBAAKA,GAAG,kBACJ,wBAAIA,GAAG,cAAP,cACA,wBAAIA,GAAG,kBAAP,oBAEJ,yBAAKA,GAAG,kBACJ,uBAAGA,GAAG,oBAAN,uGAKR,yBAAKA,GAAG,mBACJ,yBAAKA,GAAG,oBACJ,kBAAC,IAAD,CAAS2B,GAAG,YACR,yBAAK5B,UAAU,iBAAiBC,GAAG,eAC/B,kDAGR,kBAAC,IAAD,CAAS2B,GAAG,UACR,yBAAK5B,UAAU,iBAAiBC,GAAG,SAC/B,oD,4BCTjB,O,iDAlBX6C,a,sBAAe,sBAAA9D,EAAA,yDACW,MAAlB,EAAK+D,UADE,gCAGD,EAAKC,sBAHJ,gCAKJ,EAAKD,WALD,2C,KAQfC,oB,sBAAsB,sBAAAhE,EAAA,sEACZ9C,IAAM+G,IRTWvH,mDQUtBU,MAAK,SAACM,GACH,EAAKqG,UAAYrG,EAASnB,QAC3BkB,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,MALjB,4CCGX8H,G,4MAhBXC,aAAe,SAACrD,GACZ,EAAKT,MAAM+D,SAAStD,I,uDAIpB,OACI,yBAAKE,UAAU,4BACX,2BAAOqD,QAASpE,KAAKI,MAAMY,IAAKhB,KAAKI,MAAMiE,WAC3C,4BAAQrD,GAAIhB,KAAKI,MAAMY,GAAID,UAAU,eAAeoD,SAAUnE,KAAKkE,aAAchE,MAAOF,KAAKI,MAAMF,MAAOoE,UAAQ,GAC7GtE,KAAKI,MAAM0D,UAAUS,KAAI,SAAAC,GAAO,OAAI,4BAAQC,IAAKD,EAAQtE,MAAOA,MAAOsE,EAAQtE,OAAQsE,EAAQE,kB,GAXxFpE,aC0BbqE,G,4MAvBXT,aAAe,SAACrD,GACZ,EAAKT,MAAM+D,SAAStD,I,uDAKpB,OACI,yBAAKG,GAAG,yBACJ,yBAAKD,UAAU,qDACX,2BAAO6D,KAAK,QAAQ7D,UAAU,uBAAuBC,GAAG,YAAYhD,KAAK,YAAY6G,QAAS7E,KAAKI,MAAMF,MACrGiE,SAAUnE,KAAKkE,eACnB,2BAAOnD,UAAU,uBAAuBqD,QAAQ,aAAhD,cAEJ,yBAAKrD,UAAU,qDACX,2BAAO6D,KAAK,QAAQ7D,UAAU,uBAAuBC,GAAG,SAAShD,KAAK,YAAY6G,SAAU7E,KAAKI,MAAMF,MACnGiE,SAAUnE,KAAKkE,eACnB,2BAAOnD,UAAU,uBAAuBqD,QAAQ,UAAhD,iB,GAlBK9D,aCyBVwE,G,4MAtBXZ,aAAe,SAACrD,GACZ,EAAKT,MAAM+D,SAAStD,I,uDAIpB,OAAIb,KAAKI,MAAMoC,KAGP,yBAAKzB,UAAU,yBACX,2BAAOqD,QAASpE,KAAKI,MAAMY,IAAKhB,KAAKI,MAAMiE,WAC3C,2BAAOO,KAAK,OAAO5D,GAAIhB,KAAKI,MAAMY,GAAIhD,KAAMgC,KAAKI,MAAMY,GAAID,UAAU,eAAeb,MAAOF,KAAKI,MAAMF,MAClGiE,SAAUnE,KAAKkE,aAAcI,UAAQ,KAM1C,S,GArBMhE,aCoCV,O,sCAlCXyE,cAAgB,SAACC,GACb,IAAIC,EAAQD,EAAKE,WACbC,EAAUH,EAAKI,aAInB,OAHID,EAAU,KACVA,EAAU,IAAMA,GACZ,UAAMF,EAAN,YAAeE,I,KAK3BE,kBAAoB,SAACC,EAAeC,GAChC,IACIC,GADa,IAAIrG,KAAKoG,GAAe,IAAIpG,KAAKmG,IACpB,KAAK,IAC/BG,EAAUC,KAAKC,MAAMH,GACrBI,EAAqC,IAAxBJ,EAAeC,GAGhC,OAFIG,EAAY,KACZA,EAAY,IAAMA,GAChB,GAAN,OAAUH,EAAV,YAAqBG,I,KAIzBC,2BAA6B,SAACb,GAE1B,IAAIc,GADJd,EAAO,IAAI7F,KAAK6F,IACAe,cACZC,EAAShB,EAAKiB,WAAa,EAAK,GAAK,KAAOjB,EAAKiB,WAAa,GAAMjB,EAAKiB,WAAa,EACtFC,EAAMlB,EAAKmB,UAAY,GAAK,IAAMnB,EAAKmB,UAAYnB,EAAKmB,UACxDC,EAAOpB,EAAKE,WACZC,EAAUH,EAAKI,aAAe,GAAK,IAAMJ,EAAKI,aAAeJ,EAAKI,aAEtE,MAAM,GAAN,OAAUc,EAAV,YAAiBF,EAAjB,YAA0BF,EAA1B,YAAkCM,EAAlC,YAA0CjB,K,4DCgInCkB,G,4MAzJX3G,MAAQ,CACJ4G,QAAS,I,EAIbC,cAAgB,SAACC,GAMb,MAAO,CACHC,cALgBC,GAAgB3B,cAAc,IAAI5F,KAAKqH,EAAOlB,gBAM9DqB,YALcD,GAAgB3B,cAAc,IAAI5F,KAAKqH,EAAOjB,cAM5DqB,eALaF,GAAgBrB,kBAAkBmB,EAAOlB,cAAekB,EAAOjB,e,uDAS1E,IAAD,OAEL,MAA8B,gBAA1BvF,KAAKI,MAAMyG,YAEJ,KAGmB,WAA1B7G,KAAKI,MAAMyG,YAGP,yBAAK3F,IAAK4F,KAAc1F,IAAI,aAAaJ,GAAG,4BAItB,SAA1BhB,KAAKI,MAAMyG,YAGP,yBAAK9F,UAAU,kBAAkBC,GAAG,yBAChC,yBAAKE,IAAK6F,KAAW3F,IAAI,QAAQL,UAAU,eAC3C,wBAAIA,UAAU,iBAAd,iDAKkB,aAA1Bf,KAAKI,MAAMyG,aAA2D,GAA7B7G,KAAKI,MAAM4G,QAAQC,OAErD,uBAAGjG,GAAG,sBAAN,qCAGPhB,KAAKI,MAAM8G,YAGNlH,KAAKI,MAAM4G,QAAQ,GAAGG,eAAe,cAEtCnH,KAAKN,MAAM4G,QAAUtG,KAAKI,MAAM4G,QAAQzC,KAAI,SAAA6C,GAExC,IAAMC,EAAK,EAAKd,cAAca,EAAY,IACpCE,EAAK,EAAKf,cAAca,EAAY,IACpCG,EAAcC,SAASJ,EAAY,GAAGG,aAAeC,SAASJ,EAAY,GAAGG,aAAe,EAElG,OACI,yBAAKxG,UAAU,eAAe0D,IAAK2C,EAAY,GAAGK,SAC9C3G,QAAS,kBAAI,EAAKV,MAAMsH,UAAUN,EAAY,GAAGK,SAAUL,EAAY,GAAGK,YAE1E,yBAAK1G,UAAU,qBACX,yBAAKA,UAAU,yBACX,2BAAOA,UAAU,gBAAgBqG,EAAY,GAAGO,aAEhD,yBAAK5G,UAAU,gBACX,2BAAOA,UAAU,kBAAkBqG,EAAY,GAAGQ,eAClD,2BAAO7G,UAAU,kBAAkBsG,EAAGZ,gBAE1C,yBAAK1F,UAAU,eACX,yBAAKG,IAAK2G,KAAYzG,IAAI,UAAOL,UAAU,gBAC3C,2BAAOA,UAAU,eAAesG,EAAGT,eAAnC,MAEJ,yBAAK7F,UAAU,cACX,2BAAOA,UAAU,uBAAuBqG,EAAY,GAAGU,oBACvD,2BAAO/G,UAAU,gBAAgBsG,EAAGV,eAI5C,yBAAK5F,UAAU,sBACX,2BAAOA,UAAU,gBAAgBqG,EAAY,GAAGO,aAEhD,yBAAK5G,UAAU,gBACX,2BAAOA,UAAU,kBAAkBqG,EAAY,GAAGQ,eAClD,2BAAO7G,UAAU,kBAAkBuG,EAAGb,gBAE1C,yBAAK1F,UAAU,eACX,yBAAKG,IAAK2G,KAAYzG,IAAI,UAAOL,UAAU,gBAC3C,2BAAOA,UAAU,eAAeuG,EAAGV,eAAnC,MAEJ,yBAAK7F,UAAU,cACX,2BAAOA,UAAU,uBAAuBqG,EAAY,GAAGU,oBACvD,2BAAO/G,UAAU,gBAAgBuG,EAAGX,gBAIhD,yBAAK5F,UAAU,cACP,2BAAOA,UAAU,gBAAgBwG,EAAjC,KACA,2BAAOxG,UAAU,YAAjB,oBAQA,GAAxBf,KAAKI,MAAM8G,WAGPlH,KAAKI,MAAM4G,QAAQ,GAAGG,eAAe,cAErCnH,KAAKN,MAAM4G,QAAUtG,KAAKI,MAAM4G,QAAQzC,KAAI,SAAAiC,GAExC,IAAMuB,EAAI,EAAKxB,cAAcC,GAE7B,OACI,yBAAKzF,UAAU,SAAS0D,IAAK+B,EAAOiB,SAAU3G,QAAS,kBAAI,EAAKV,MAAMsH,UAAUlB,EAAOiB,YAEnF,2BAAO1G,UAAU,gBAAgByF,EAAOmB,aAExC,yBAAK5G,UAAU,gBACX,2BAAOA,UAAU,kBAAkByF,EAAOoB,eAC1C,2BAAO7G,UAAU,kBAAkBgH,EAAEtB,gBAEzC,yBAAK1F,UAAU,eACX,yBAAKG,IAAK2G,KAAYzG,IAAI,UAAOL,UAAU,gBAC3C,2BAAOA,UAAU,eAAegH,EAAEnB,eAAlC,MAEJ,yBAAK7F,UAAU,cACX,2BAAOA,UAAU,uBAAuByF,EAAOsB,oBAC/C,2BAAO/G,UAAU,gBAAgBgH,EAAEpB,cAEvC,yBAAK5F,UAAU,SACX,2BAAOA,UAAU,gBAAgByF,EAAOe,YAAxC,KACA,2BAAOxG,UAAU,YAAjB,mBAUpB,yBAAKC,GAAG,mBACJ,wCACChB,KAAKN,MAAM4G,c,GArJAhG,a,mBCqXb0H,I,mNA1WXtI,MAAQ,CACJwH,WAAW,EACXe,OAAQ,GACRC,YAAa,GACbC,UAAW,GACXC,OAAQ,GACRtE,UAAW,GACXkD,QAAS,GACTqB,YAAY,EACZC,UAAW,GACXzB,YAAa,eACb0B,eAAgB,OAChBC,gBAAiB,I,EAGrBC,YAAcxL,IAAMwL,Y,EACpBC,OAAS,EAAKD,YAAYC,S,EAG1B7E,a,sBAAe,8BAAA9D,EAAA,sEAEW4I,GAAiB9E,eAF5B,OAGM,OADbC,EAFO,SAKH8E,EAAmB9E,EAAUS,KAAI,SAAAC,GACjC,MAAO,CAAEtE,MAAOsE,EAAQqE,GAAInE,QAASF,EAAQ1F,SAEjD8J,EAAmB,CAAC,CAAC1I,MAAO,GAAIwE,QAAS,eAAeoE,OAAOF,GAE/D,EAAKhJ,SAAS,CACVkE,UAAW8E,KAKf,EAAKhJ,SAAS,CAAEyI,YAAY,IAhBrB,2C,EAqBfU,gBAAkB,WAEd,GAAyB,IAArB,EAAKrJ,MAAMuI,QAA0C,IAA1B,EAAKvI,MAAMwI,aAElC,EAAKxI,MAAMuI,QAAU,EAAKvI,MAAMwI,YAKhC,OAHA,EAAKtI,SAAU,CACX0I,UAAW,0DAER,EAIf,IAAIU,GAAW,IAAI7J,MAAO8J,SAAS,EAAE,EAAE,GAEvC,MAA4B,IAAxB,EAAKvJ,MAAMyI,WAEP,IAAIhJ,KAAK,EAAKO,MAAMyI,WAAaa,GAShB,IAArB,EAAKtJ,MAAM0I,QAAgB,EAAK1I,MAAMwH,WAElC,IAAI/H,KAAK,EAAKO,MAAM0I,QAAUY,GAT9B,EAAKpJ,SAAU,CACX0I,UAAW,yCAER,GAea,IAAxB,EAAK5I,MAAMyI,WAAwC,IAArB,EAAKzI,MAAM0I,QAAiB,EAAK1I,MAAMwH,WAEjE,IAAI/H,KAAK,EAAKO,MAAM0I,QAAU,IAAIjJ,KAAK,EAAKO,MAAMyI,YAElD,EAAKvI,SAAU,CACX0I,UAAW,kDAER,IAIf,EAAK1I,SAAU,CACX0I,UAAW,MAER,I,EAIXY,iBAAmB,WAEf,EAAKC,0BAGL,EAAKvJ,SAAS,IAAG,WACb,EAAKmJ,qBAITlH,YAAW,WACsB,GAAzB,EAAKnC,MAAM2I,YAEX,EAAKe,eAEX,K,EAIND,wBAA0B,WACtB,IAEIE,EAFgB,EAAKjJ,MAAMkJ,QAAQC,SAASC,OACdC,MAAM,KACNlF,KAAI,SAACmF,GACnC,OAAOA,EAAMD,MAAM,KAAK,MAEA,GAAxBJ,EAAcpC,OAEd,EAAKrH,SAAS,CACVsH,WAAW,EACXiB,UAAWkB,EAAc,GACzBjB,OAAQiB,EAAc,GACtBpB,OAAQoB,EAAc,GACtBnB,YAAamB,EAAc,KAGF,GAAxBA,EAAcpC,QAEnB,EAAKrH,SAAS,CACVsH,WAAW,EACXiB,UAAWkB,EAAc,GACzBpB,OAAQoB,EAAc,GACtBnB,YAAamB,EAAc,M,EAMvCM,cAAgB,SAACC,GAEb,IAAIC,EACAC,EAiBJ,OAfI,EAAKpK,MAAMwH,WAEX2C,EAAc,+BAAwB,EAAKnK,MAAMyI,WAAnC,sBACe,EAAKzI,MAAM0I,QAD1B,2BAEoB,EAAK1I,MAAMuI,QAF/B,gCAGyB,EAAKvI,MAAMwI,aAClD4B,Ed/J0BrN,wDcmK1BoN,EAAc,+BAAwB,EAAKnK,MAAMyI,WAAnC,2BACoB,EAAKzI,MAAMuI,QAD/B,gCAEyB,EAAKvI,MAAMwI,aAClD4B,EdvKuBrN,oDcyKR,cAAfmN,EAEOC,EAEa,WAAfD,EAEEE,EAAMD,OAFZ,G,EAOTT,WAAa,WAET,EAAKxJ,SAAS,CACViH,YAAa,YAEjB5J,IAAM+G,IAAI,EAAK2F,cAAc,YAC5BxM,MAAK,SAACM,GACH,EAAKmC,SAAS,CACVoH,QAASvJ,EAASnB,KAClBuK,YAAa,iBAElBrJ,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACViH,YAAa,c,EAMzB3C,aAAe,SAACrD,GACS,SAAjBA,EAAEkJ,OAAOnF,KAET,EAAKhF,SAAU,CACXsH,UAA2B,aAAfrG,EAAEkJ,OAAO/I,KAKzB,EAAKpB,SAAL,gBACKiB,EAAEkJ,OAAO/I,GAAKH,EAAEkJ,OAAO7J,QAIhC,EAAKN,SAAS,IAAG,WACb,EAAKmJ,sB,EAKbiB,aAAe,SAACnJ,GACZA,EAAEoJ,iBACF,EAAKb,c,EAIT1B,UAAY,SAACwC,EAAmBC,GAE5B,IAAI3B,EAIAA,EAFkB,MAAlB2B,EAEkB,CACdC,WAAY,UACZF,kBAAmBA,GAKL,CACdE,WAAY,YACZF,kBAAmBA,EACnBC,eAAgBA,GAIxB,EAAKvK,SAAS,CACV2I,eAAgB,WAChBC,gBAAiBA,K,EAKzB6B,yBAA2B,WAEvB,IAAIC,EAAS,2BACP9B,EAAkB,EAAK9I,MAAM8I,gBAQnC,OAPA8B,GAAU,eAAiB9B,EAAgB4B,WAC3CE,GAAU,wBAA0B9B,EAAgB0B,kBAElB,aAA9B1B,EAAgB4B,aAEhBE,GAAU,qBAAuB9B,EAAgB2B,gBAE9CG,G,kEAKPtK,KAAK6D,eACqC,IAAtC7D,KAAKI,MAAMkJ,QAAQC,SAASC,QAC5BxJ,KAAKkJ,qB,6CAITlJ,KAAK0I,OAAO6B,W,+BAGN,IAAD,OAGL,OAA6B,GAAzBvK,KAAKN,MAAM2I,WAGP,yBAAKrH,GAAG,yBAAyBD,UAAU,0BACvC,yBAAKA,UAAU,kBAAkBC,GAAG,sBAChC,yBAAKE,IAAK6F,KAAW3F,IAAI,QAAQL,UAAU,eAC3C,wBAAIA,UAAU,iBAAd,kDAMmB,GAA/Bf,KAAKN,MAAMoE,UAAUmD,OAGjB,yBAAK/F,IAAKsJ,KAAapJ,IAAI,aAAaJ,GAAG,yBAM3C,yBAAKA,GAAG,yBAAyBD,UAAU,0BACvC,wBAAIC,GAAG,yBAAP,+BAEA,0BAAMA,GAAG,sBAAsByJ,SAAUzK,KAAKgK,cAE1C,kBAAC,GAAD,CAAY7F,SAAUnE,KAAKkE,aAAchE,MAAOF,KAAKN,MAAMwH,YAE3D,yBAAKnG,UAAU,cAEX,kBAAC,GAAD,CAAeC,GAAG,SAAS8C,UAAW9D,KAAKN,MAAMoE,UAAWK,SAAUnE,KAAKkE,aACvEhE,MAAOF,KAAKN,MAAMuI,OAAQ5D,UAAU,eAExC,kBAAC,GAAD,CAAerD,GAAG,cAAc8C,UAAW9D,KAAKN,MAAMoE,UAAWK,SAAUnE,KAAKkE,aAC5EhE,MAAOF,KAAKN,MAAMwI,YAAa7D,UAAU,aAE7C,kBAAC,GAAD,CAAYrD,GAAG,YAAYmD,SAAUnE,KAAKkE,aAAchE,MAAOF,KAAKN,MAAMyI,UAAW9D,UAAU,kBAAoB7B,MAAM,IAEzH,kBAAC,GAAD,CAAYxB,GAAG,SAASmD,SAAUnE,KAAKkE,aAAchE,MAAOF,KAAKN,MAAM0I,OAAQ/D,UAAU,eAAiB7B,KAAMxC,KAAKN,MAAMwH,YAE3H,4BAAQlG,GAAG,aAAa4D,KAAK,SAAS7D,UAAU,kBAAkB2J,SAAkC,IAAxB1K,KAAKN,MAAM4I,WAAvF,WAGqB,IAAxBtI,KAAKN,MAAM4I,WACR,uBAAGtH,GAAG,+BAA+BhB,KAAKN,MAAM4I,YAMxD,kBAAC,IAAD,CACIqC,KAAK,iBACLC,OAAQ,SAACxK,GAAD,OAAW,kBAAC,GAAD,iBAAmBA,EAAnB,CACf4G,QAAS,EAAKtH,MAAMsH,QACpBE,UAAW,EAAKxH,MAAMwH,UACtBL,YAAa,EAAKnH,MAAMmH,YACxBa,UAAW,EAAKA,gBAKG,gBAA1B1H,KAAKN,MAAMmH,aACR,kBAAC,IAAD,CAAUlE,GAAI,WAAa3C,KAAK2J,cAAc,gBAIlD,kBAAC,KAAD,CACInH,KAAmC,YAA7BxC,KAAKN,MAAM6I,eACjBsC,YAAU,EACVC,aAAW,EACXC,aAAW,EACXtI,MAAM,wCACNC,UAAW,kBAAI,EAAK9C,SAAS,CAAC2I,eAAgB,kBAC9CyC,SAAU,kBAAI,EAAKpL,SAAS,CAAC2I,eAAgB,YAKnB,gBAA7BvI,KAAKN,MAAM6I,gBACR,kBAAC,IAAD,CAAU5F,GAAI3C,KAAKqK,kC,GAnWrB/J,c,oBCyBP2K,I,OAnCD,SAAS7K,GAEnB,OACI,6BACI,yBAAKY,GAAG,kBAAkBD,UAAU,0BAEhC,yBAAKG,IAAKgK,KAAU9J,IAAI,GAAGJ,GAAG,gBAE9B,yBAAKA,GAAG,gBACJ,2BAAOA,GAAG,gBAAV,kBACA,uBAAGA,GAAG,cAAN,uKAOJ,yBAAKA,GAAG,iBACJ,2FACiE,6BADjE,6DAIA,8PAMJ,2BAAOA,GAAG,qBAAV,mCAA8D,uBAAG4B,KfmB9C,6CenB2C,qBAA9D,qBACA,2BAAO5B,GAAG,iBAAV,mDAA0E,uBAAG4B,KfmBjE,2BenB8D,oBAA1E,SC1BVuI,I,mNAEFzL,MAAQ,CACJ0L,SAAU,GACVC,SAAU,GACVC,WAAY,OACZjP,QAAS,I,EAIbU,M,uCAAQ,WAAO8D,GAAP,iBAAAd,EAAA,6DACJc,EAAEoJ,iBACIjN,EAAc,CAAC,EAAK0C,MAAM0L,SAAU,EAAK1L,MAAM2L,UACrD,EAAKzL,SAAS,CAAC0L,WAAW,YAHtB,SAIoBzL,EAAY9C,MAAMC,GAJtC,OAKe,YADfuO,EAJA,SAOA1J,YAAW,WAAK,EAAKjC,SAAS,CAAC0L,WAAW,cAAa,KACvD,EAAK5J,QAAQvB,eAEO,WAAfoL,EAEL,EAAK3L,SAAS,CACV0L,WAAW,UACXjP,QAAS,yCAGO,SAAfkP,GAEL,EAAK3L,SAAS,CACV0L,WAAW,QACXjP,QAAS,sDArBb,2C,wDA2BR6H,aAAe,SAACrD,GACZ,EAAKjB,SAAL,gBACKiB,EAAEkJ,OAAO/L,KAAO6C,EAAEkJ,OAAO7J,S,uDAIxB,IAAD,OAEL,OACI,yBAAKc,GAAG,kBAAkBD,UAAU,0BAChC,qCACA,yBAAKC,GAAG,cACJ,0BAAMyJ,SAAUzK,KAAKjD,OACjB,2BAAOiE,GAAG,kBAAV,aACA,2BAAO4D,KAAK,OAAO5G,KAAK,WAAWgD,GAAG,WAAWD,UAAU,eAAeoD,SAAUnE,KAAKkE,aAAcI,UAAQ,IAC/G,2BAAOkH,GAAG,kBAAV,aACA,2BAAO5G,KAAK,WAAW5G,KAAK,WAAWgD,GAAG,WAAWD,UAAU,eAAeoD,SAAUnE,KAAKkE,aAAcI,UAAQ,IACnH,4BAAQM,KAAK,SAAS7D,UAAU,kBAAkBC,GAAG,aAArD,UAE0B,WAAzBhB,KAAKN,MAAM4L,YACR,yBAAKpK,IAAKsJ,KAAapJ,IAAI,aAAaJ,GAAG,kBAE/C,2BAAOA,GAAG,iBAAiBhB,KAAKN,MAAMrD,WAG9C,yBAAK2E,GAAG,qBACJ,2BAAOA,GAAG,YAAV,kCACA,kBAAC,IAAD,CAAS2B,GAAG,aAAZ,WACA,qCAGsB,iBAAzB3C,KAAKN,MAAM4L,YACR,kBAAC,IAAD,CAAU3I,GAAG,eAEjB,kBAAC,IAAD,CACIJ,SAAO,EACPC,KAA+B,WAAzBxC,KAAKN,MAAM4L,WACjB7I,MAAK,uBAAkBzC,KAAK0B,QAAQvD,SAASH,KAAxC,KACLiD,KAAK,sCACLyB,UAAW,kBAAM,EAAK9C,SAAS,CAAE0L,WAAY,0B,GA5E7ChL,cAoFpB6K,GAAMrI,YAAcxD,EAEL6L,U,oBCjEAM,I,8KArBP,OACI,yBAAKzK,GAAG,qBAAqBD,UAAU,0BAEnC,sDACA,8DAEA,yBAAKG,IAAKwK,KAAetK,IAAI,GAAGJ,GAAG,mBAEnC,yBAAKA,GAAG,kBACJ,4CAAiB,kBAAC,IAAD,CAAS2B,GAAG,sBAAZ,YAAjB,KACA,6CAAkB,kBAAC,IAAD,CAASA,GAAG,qBAAZ,mBAAlB,MAGJ,wBAAI3B,GAAG,eAAP,qBAAuC,kBAAC,IAAD,CAAS2B,GAAG,UAAZ,UACvC,wBAAI3B,GAAG,iBAAP,kBAAsC,kBAAC,IAAD,CAAS2B,GAAG,UAAZ,oB,GAhB/BrC,cCORqL,GATU,SAASvL,GAE9B,OACI,yBAAKY,GAAG,8BAA8BD,UAAU,0BAC5C,4BAAQC,GAAG,0BAA0BE,IlBNd,0CkBMwCH,UAAU,cAAc0B,MAAM,wBCK1FmJ,GATS,SAASxL,GAE7B,OACI,yBAAKY,GAAG,6BAA6BD,UAAU,0BAC3C,4BAAQC,GAAG,0BAA0BE,InBLf,6CmBKwCH,UAAU,cAAc0B,MAAM,uB,wCC4BzFoJ,G,4MA7BXnM,MAAQ,CACJoM,cAAc,G,EAGlBC,gBAAkB,WACd,EAAKnM,SAAS,CAACkM,cAAe,EAAKpM,MAAMoM,gB,uDAIzC,OACI,yBAAK/K,UAAU,eAAeC,GAAIhB,KAAKI,MAAMY,IACzC,2BAAOD,UAAU,qBAAqBC,GAAIhB,KAAKI,MAAMY,GAAG,UAAWhB,KAAKI,MAAM4L,MAA9E,QACChM,KAAKN,MAAMoM,cACR,yBAAKG,MAAO,CAACvH,QAAS,iBAClB,2BAAO3D,UAAU,oBAAoBC,GAAIhB,KAAKI,MAAMY,GAAG,SAAUhB,KAAKI,MAAMF,MAA5E,QACA,yBAAKgB,IAAKgL,KAAU9K,IAAI,GAAGL,UAAU,oBAAoBD,QAASd,KAAK+L,oBAG7E/L,KAAKN,MAAMoM,cACT,yBAAKG,MAAO,CAACvH,QAAS,iBAClB,2BAAO3D,UAAU,qBAAjB,YACA,yBAAKG,IAAKiL,KAAU/K,IAAI,GAAGL,UAAU,oBAAoBD,QAASd,KAAK+L,wB,GAvBrEzL,a,gFCsOX8L,G,4MA3NX1M,MAAQ,CACJ2M,QAAS,EAAKjM,MAAMiM,QACpBvI,UAAW,GACXwI,aAAa,EACbC,cAAc,EACdC,YAAa,OACbC,aAAc,GACdpE,YAAY,G,EAIhBxE,a,sBAAe,4BAAA9D,EAAA,sEAEW4I,GAAiB9E,eAF5B,OAGM,OADbC,EAFO,QAKP,EAAKlE,SAAS,CACVkE,UAAWA,IAKf,EAAKlE,SAAS,CAAEyI,YAAY,IAXrB,2C,EAiBfqE,kBAAoB,WAChB,EAAK9M,SAAS,CAAC0M,aAAc,EAAK5M,MAAM4M,e,EAI5CK,mBAAqB,WACjB,EAAK/M,SAAS,CAAC2M,cAAe,EAAK7M,MAAM6M,gB,EAK7CK,oBAAsB,WAClB,EAAKhN,SAAS,CACV4M,YAAa,aAEjB,EAAKpM,MAAMyM,WAAW,EAAKnN,MAAM2M,QAAS,EAAKS,uB,EAKnDC,oBAAsB,WAClB,EAAKnN,SAAS,CACV4M,YAAa,aAEjB,EAAKpM,MAAM4M,WAAW,EAAKtN,MAAM2M,QAAS,EAAKS,uB,EAInDG,gBAAkB,WACd,EAAKrN,SAAS,CACV4M,YAAa,cACbC,aAAa,WAAD,OAAa,EAAK/M,MAAM2M,QAAQvN,KAAhC,yC,EAKpBoO,gBAAkB,WACd,EAAKtN,SAAS,CACV4M,YAAa,cACbC,aAAa,WAAD,OAAa,EAAK/M,MAAM2M,QAAQvN,KAAhC,qC,EAKpBgO,qBAAuB,WACnB,EAAKlN,SAAS,CAAC4M,YAAa,W,EAGhCW,eAAiB,SAACnM,GAId,OAHc,EAAKtB,MAAMoE,UAAUsJ,MAAK,SAAA5I,GACpC,OAAOA,EAAQqE,IAAM7H,KAEVlC,M,kEAIfkB,KAAK6D,iB,+BAGC,IAAD,OAGCwJ,EAAe,CAAEC,OAAO,cAAD,OAAoC,GAApBtN,KAAKI,MAAMmN,SAA3B,SAEvBlB,EAAUrM,KAAKN,MAAM2M,QAE3B,OAAmC,GAA/BrM,KAAKN,MAAMoE,UAAUmD,OAGjB,yBAAK/F,IAAKsM,KAAapM,IAAI,GAAGL,UAAU,sBAInB,GAAzBf,KAAKN,MAAM2I,WAGP,yBAAKtH,UAAU,gBACX,2BAAOA,UAAU,iBAAjB,4DAKkB,YAA1Bf,KAAKN,MAAM8M,YAGP,yBAAKzL,UAAU,gBACX,yBAAKG,IAAKsM,KAAapM,IAAI,GAAGL,UAAU,4BAMhD,yBAAKA,UAAU,iBAETmB,EAAY3B,gBACV,6BAGI,yBAAKQ,UAAU,qBACX,yBAAKG,IAAKuM,KAAarM,IAAI,GAAGL,UAAU,eAAekL,MAAOoB,IAC9D,2BAAOtM,UAAU,gBAAgBsL,EAAQvN,MACzC,2BAAOiC,UAAU,iBAAiBsL,EAAQqB,OAE1C,kBAAC,EAAD,CAAQ1M,GAAG,eAAeF,QAASd,KAAK0M,kBAAmBzL,KAAK,eAAeE,KAAMwM,OAErF,kBAAC,EAAD,CAAQ3M,GAAG,SAASF,QAASd,KAAKiN,gBAAiBhM,KAAK,SAASE,KAAMyM,OAEvE,kBAAC,EAAD,CAAQ5M,GAAG,iBAAiBF,QAASd,KAAKkN,gBAAiBjM,KAAK,SAASE,KAAM0M,QAEnD,YAA1B7N,KAAKN,MAAM8M,aAAuD,YAA1BxM,KAAKN,MAAM8M,cACjD,yBAAKtL,IAAKsM,KAAapM,IAAI,GAAGL,UAAU,yBAK9Cf,KAAKN,MAAM4M,aAET,yBAAKvL,UAAU,sBACX,yBAAKA,UAAU,yBACX,2BAAOA,UAAU,0BAAjB,iBACA,2BAAOA,UAAU,oBAAoBsL,EAAQyB,WAGjD,kBAAC,GAAD,CAAa9M,GAAG,mBAAmBgL,MAAM,YAAY9L,MAAOmM,EAAQ0B,WAEpE,yBAAKhN,UAAU,wBACX,2BAAOA,UAAU,yBAAjB,gBACA,2BAAOA,UAAU,mBAAmBf,KAAKmN,eAAenN,KAAKN,MAAM2M,QAAQ2B,iBAO9F9L,EAAY3B,gBACT,6BACI,yBAAKW,IAAKuM,KAAarM,IAAI,GAAGL,UAAU,eAAekL,MAAOoB,IAC9D,2BAAOtM,UAAU,gBAAgBsL,EAAQvN,MACzC,2BAAOiC,UAAU,iBAAiBsL,EAAQqB,OAE1C,yBAAK3M,UAAU,yBACX,2BAAOA,UAAU,0BAAjB,iBACA,2BAAOA,UAAU,oBAAoBsL,EAAQyB,WAGjD,kBAAC,GAAD,CAAa9M,GAAG,mBAAmBgL,MAAM,YAAY9L,MAAOmM,EAAQ0B,WAEpE,yBAAKhN,UAAU,wBACX,2BAAOA,UAAU,yBAAjB,gBACA,2BAAOA,UAAU,mBAAmBf,KAAKmN,eAAenN,KAAKN,MAAM2M,QAAQ2B,gBAGnD,YAA1BhO,KAAKN,MAAM8M,aAAuD,YAA1BxM,KAAKN,MAAM8M,cACjD,yBAAKtL,IAAKsM,KAAapM,IAAI,GAAGL,UAAU,wBAE5C,yBAAKC,GAAG,wBACJ,kBAAC,EAAD,CAAQA,GAAG,SAASF,QAASd,KAAKiN,gBAAiBhM,KAAK,SAASE,KAAMyM,OACvE,kBAAC,EAAD,CAAQ5M,GAAG,iBAAiBF,QAASd,KAAKkN,gBAAiBjM,KAAK,SAASE,KAAM0M,SAQ3F,kBAAC,KAAD,CACIrL,KAAgC,eAA1BxC,KAAKN,MAAM8M,aAA0D,eAA1BxM,KAAKN,MAAM8M,YAC5D3B,YAAU,EACVC,aAAW,EACXC,aAAW,EACXtI,MAAM,oBACNC,UAAW,WACuB,eAA1B,EAAKhD,MAAM8M,YACX,EAAKI,sBAEL,EAAKG,uBAEb/B,SAAU,WAAK,EAAKpL,SAAS,CAAC4M,YAAa,WAE1CxM,KAAKN,MAAM+M,cAGW,SAA1BzM,KAAKN,MAAM8M,aACR,2BAAOzL,UAAU,wBAAjB,yD,GArNST,aCwJd2N,G,4MAxJXvO,MAAQ,CACJwO,UAAW,UACXC,SAAU,GACVC,cAAe,I,EAGnB3F,YAAcxL,IAAMwL,Y,EACpBC,OAAS,EAAKD,YAAYC,S,EAG1B2F,YAAc,WAEVpR,IAAM,CACF6M,ItBT2BrN,qEsBU3BuC,QAASa,EAAYd,gBAAgBC,QACrCsP,YAAa,EAAK5F,OAAO6F,QAC1BpR,MAAK,SAACM,GACL,EAAKmC,SAAS,CACVuO,SAAU1Q,EAASnB,KACnB4R,UAAW,cAEhB1Q,OAAM,SAACrB,GACFc,IAAMuR,SAASrS,GAEfI,QAAQC,IAAI,mCAIZkB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACVsO,UAAW,e,EAO3BO,cAAgB,SAACpC,EAASqC,GACtBzR,IAAM,CACF0R,OAAQ,OACR7E,ItBnC2BrN,mDsBoC3BuC,QAASa,EAAYd,gBAAgBC,QACrC1C,KAAM+P,EACNiC,YAAa,EAAK5F,OAAO6F,QAC1BpR,MAAK,WACJ,EAAKyR,sBAAsBvC,EAAQvN,MACnC,EAAKc,SAAS,CACVwO,cAAc,IAAD,OAAM/B,EAAQvN,KAAd,sBAElBtB,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/BuS,Q,EAIRG,cAAgB,SAACxC,EAASqC,GACtBzR,IAAM,CACF0R,OAAQ,SACR7E,ItBpD2BrN,iEsBqD3BuC,QAASa,EAAYd,gBAAgBC,QACrC1C,KAAM+P,EACNiC,YAAa,EAAK5F,OAAO6F,QAC1BpR,MAAK,WACJ,EAAKyR,sBAAsBvC,EAAQvN,SACpCtB,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/BuS,Q,EAKRE,sBAAwB,SAACjH,GACrB,IAAImH,EAAkB,GACtB,EAAKpP,MAAMyO,SAASY,SAAQ,SAAA1C,GACpBA,EAAQvN,MAAQ6I,GAChBmH,EAAgBE,KAAK3C,MAE7B,EAAKzM,SAAS,CAACuO,SAAUW,K,EAG7BG,e,sBAAiB,sBAAAlP,EAAA,sDACb,EAAKsO,cADQ,2C,kEAKbrO,KAAKiP,mB,6CAILjP,KAAK0I,OAAO6B,W,+BAGN,IAAD,OAEL,GAA4B,WAAxBvK,KAAKN,MAAMwO,UAEX,OACI,yBAAKhN,IAAKsJ,KAAapJ,IAAI,GAAGL,UAAU,sBAGhD,GAA4B,SAAxBf,KAAKN,MAAMwO,UAEX,OACI,yBAAKnN,UAAU,mBACX,yBAAKG,IAAK6F,KAAW3F,IAAI,QAAQL,UAAU,eAC3C,wBAAIA,UAAU,iBAAd,iDAIZ,GAAkC,GAA9Bf,KAAKN,MAAMyO,SAASlH,OAEpB,OACI,uDAIR,IAAIsG,GAAY,EAGZ2B,EAAelP,KAAKN,MAAMyO,SAAS5J,KAAI,SAAA8H,GAIvC,OAFAkB,IAGI,kBAAC,GAAD,CAAgBlB,QAASA,EAAS5H,IAAK4H,EAAQvN,KAAMyO,SAAUA,EAC3DP,WAAY,EAAKyB,cAAe5B,WAAY,EAAKgC,mBAI7D,OACI,yBAAK7N,GAAG,mBACJ,uBAAGD,UAAU,gBAAb,8FACgC,GAA9Bf,KAAKN,MAAMyO,SAASlH,QAClB,2BAAOjG,GAAG,0BAAV,YAA6ChB,KAAKN,MAAMyO,SAASlH,OAAjE,sBAEJ,yBAAKjG,GAAG,wBAAwBD,UAAU,aACrCmO,GAEL,kBAAC,KAAD,CACI3M,SAAO,EACPC,KAAkC,IAA5BxC,KAAKN,MAAM0O,cACjBtD,aAAW,EACXC,aAAW,EACXtI,MAAOzC,KAAKN,MAAM0O,cAClB1L,UAAW,WAAK,EAAK9C,SAAS,CAACwO,cAAe,a,GAlJzC9N,a,4DCwPV6O,G,4MAhPXzP,MAAQ,CACJ0P,SAAU,EAAKhP,MAAMgP,SACrBC,YAAa,EAAKjP,MAAMgP,SACxB9C,aAAa,EACbgD,cAAc,EACdC,YAAa,OACbC,kBAAmB,GACnBC,YAAa,Q,EAKjB/C,kBAAoB,WAChB,EAAK9M,SAAS,CAAC0M,aAAc,EAAK5M,MAAM4M,e,EAI5CoD,iBAAmB,WACf,EAAK9P,SAAS,CAAC0P,cAAc,K,EAMjCpL,aAAe,SAACrD,GACZ,IAAI8O,EAAgBC,OAAOC,OAAO,GAAI,EAAKnQ,MAAM2P,aACjDM,EAAc9O,EAAEkJ,OAAO/I,IAAMH,EAAEkJ,OAAO7J,MACtC,EAAKN,SAAS,CACVyP,YAAaM,IAGjB,EAAK/P,SAAS,CACV4P,kBAAmB,M,EAK3BM,WAAa,WACT,EAAKlQ,SAAS,CACV0P,cAAc,EACdD,YAAa,EAAK3P,MAAM0P,Y,EAKhCW,eAAiB,WAER,EAAKC,wBAAwB,EAAKtQ,MAAM2P,cAQ7C,EAAKzP,SAAS,CACV2P,YAAa,YAEjBtS,IAAM,CACF0R,OAAQ,MACR7E,IAAKnN,EACLqC,QAASa,EAAYd,gBAAgBC,QACrC1C,KAAM,EAAKoD,MAAM2P,cAClBlS,MAAK,WACJ,EAAKyC,SAAS,CACVwP,SAAU,EAAK1P,MAAM2P,YACrBE,YAAa,UACbD,cAAc,EACdhD,aAAa,OAElB9O,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACV2P,YAAa,cAxBjB,EAAK3P,SAAS,CACV4P,kBAAmB,gC,EA6B/BQ,wBAA0B,SAACZ,GACvB,MAA0B,IAAtBA,EAASvQ,WACY,IAArBuQ,EAASa,UACS,IAAlBb,EAAS1B,OACY,IAArB0B,EAAStB,UACW,IAApBsB,EAASc,SACW,IAApBd,EAASe,S,EASjBC,gBAAkB,WACd,EAAKxQ,SAAS,CAAC6P,YAAa,iB,EAKhCY,qBAAuB,WACnB,EAAKzQ,SAAS,CACV6P,YAAa,aAEjB,EAAKrP,MAAMkQ,WAAW,EAAK5Q,MAAM0P,SAAU,EAAKmB,oB,EAIpDA,kBAAoB,WAChB,EAAK3Q,SAAS,CAAC6P,YAAa,W,uDAGtB,IAAD,OAGCpC,EAAe,CAAEC,OAAO,cAAD,OAAoC,GAApBtN,KAAKI,MAAMmN,SAA3B,SAEvB6B,EAAWpP,KAAKN,MAAM0P,SAExBoB,EAAgB,UAAMpB,EAASvQ,UAAf,YAA4BuQ,EAASa,UAEzD,MAA8B,YAA1BjQ,KAAKN,MAAM+P,YAGP,yBAAK1O,UAAU,iBACX,yBAAKG,IAAKsM,KAAapM,IAAI,GAAGL,UAAU,4BAK1Cf,KAAKN,MAAM4P,aA6Db,yBAAKvO,UAAU,iBACX,yBAAKA,UAAU,sBAEX,yBAAKG,IAAKuP,KAAcrP,IAAI,GAAGL,UAAU,gBAAgBkL,MAAOoB,IAChE,2BAAOtM,UAAU,eAAeqO,EAASvG,IACzC,2BAAOjE,KAAK,OAAO7D,UAAU,gBAAgBC,GAAG,YAAYmD,SAAUnE,KAAKkE,aAAcwM,aAActB,EAASvQ,YAChH,2BAAO+F,KAAK,OAAO7D,UAAU,gBAAgBC,GAAG,WAAWmD,SAAUnE,KAAKkE,aAAcwM,aAActB,EAASa,WAC/G,2BAAOrL,KAAK,OAAO7D,UAAU,iBAAiBC,GAAG,QAAQmD,SAAUnE,KAAKkE,aAAcwM,aAActB,EAAS1B,SAIjH,yBAAK3M,UAAU,uBACX,yBAAKA,UAAU,0BACX,2BAAOA,UAAU,2BAAjB,iBACA,2BAAO6D,KAAK,OAAO7D,UAAU,oBAAoBC,GAAG,WAAWmD,SAAUnE,KAAKkE,aAAcwM,aAActB,EAAStB,YAGvH,yBAAK/M,UAAU,yBACX,2BAAOA,UAAU,0BAAjB,gBACA,2BAAO6D,KAAK,OAAO7D,UAAU,mBAAmBC,GAAG,UAAUmD,SAAUnE,KAAKkE,aAAcwM,aAActB,EAASc,WAGrH,yBAAKnP,UAAU,uBACX,2BAAOA,UAAU,wBAAjB,qBACA,2BAAO6D,KAAK,OAAO7D,UAAU,iBAAiBC,GAAG,UAAUmD,SAAUnE,KAAKkE,aAAcwM,aAActB,EAASe,YAIvH,yBAAKpP,UAAU,sBAEX,kBAAC,EAAD,CAAQC,GAAG,mBAAmBF,QAASd,KAAK8P,WAAY7O,KAAK,SAASE,KAAMwP,OAE5E,kBAAC,EAAD,CAAQ3P,GAAG,YAAYF,QAASd,KAAK+P,eAAgB9O,KAAK,OAAOE,KAAMyP,OAEvE,2BAAO7P,UAAU,sBAAsBf,KAAKN,MAAM8P,mBAEvB,WAA1BxP,KAAKN,MAAM6P,aACR,yBAAKrO,IAAKsM,KAAapM,IAAI,GAAGL,UAAU,wBAEjB,SAA1Bf,KAAKN,MAAM6P,aACR,2BAAOvO,GAAG,yBAAV,gDAlGZ,yBAAKD,UAAU,iBAGX,yBAAKA,UAAU,sBACX,yBAAKG,IAAKuP,KAAcrP,IAAI,GAAGL,UAAU,gBAAgBkL,MAAOoB,IAChE,2BAAOtM,UAAU,eAAeqO,EAASvG,IACzC,2BAAO9H,UAAU,iBAAiByP,GAClC,2BAAOzP,UAAU,kBAAkBqO,EAAS1B,OAE5C,kBAAC,EAAD,CAAQ1M,GAAG,eAAeF,QAASd,KAAK0M,kBAAmBzL,KAAK,eAAeE,KAAMwM,OAErF,kBAAC,EAAD,CAAQ3M,GAAG,OAAOF,QAASd,KAAK0P,iBAAkBzO,KAAK,OAAOE,KAAM0P,OAEpE,kBAAC,EAAD,CAAQ7P,GAAG,SAASF,QAASd,KAAKoQ,gBAAiBnP,KAAK,SAASE,KAAM2P,QAGzE9Q,KAAKN,MAAM4M,aAET,yBAAKvL,UAAU,uBACX,yBAAKA,UAAU,0BACX,2BAAOA,UAAU,2BAAjB,iBACA,2BAAOA,UAAU,qBAAqBqO,EAAStB,WAGnD,kBAAC,GAAD,CAAa9M,GAAG,oBAAoBgL,MAAM,YAAY9L,MAAOkP,EAASrB,WAEtE,yBAAKhN,UAAU,yBACX,2BAAOA,UAAU,0BAAjB,gBACA,2BAAOA,UAAU,oBAAoBqO,EAASc,UAElD,yBAAKnP,UAAU,uBACX,2BAAOA,UAAU,wBAAjB,qBACA,2BAAOA,UAAU,kBAAkBqO,EAASe,WAKxD,kBAAC,KAAD,CACI3N,KAAgC,eAA1BxC,KAAKN,MAAM+P,YACjB5E,YAAU,EACVC,aAAW,EACXC,aAAW,EACXtI,MAAM,oBACNC,UAAW1C,KAAKqQ,qBAChBrF,SAAU,WAAK,EAAKpL,SAAS,CAAC6P,YAAa,WAP/C,mDASiDzP,KAAKN,MAAM0P,SAASvG,GATrE,MAY2B,SAA1B7I,KAAKN,MAAM+P,aACR,2BAAOzO,GAAG,yBAAV,uD,GAzLQV,aCqKjByQ,G,4MA3KXrR,MAAQ,CACJsR,eAAgB,UAChBC,UAAW,GACX,cAAe,GACf,YAAa,I,EAGjBxI,YAAcxL,IAAMwL,Y,EACpBC,OAAS,EAAKD,YAAYC,S,EAE1BwI,aAAe,WACXjU,IAAM,CACF6M,IxBFsBrN,kDwBGtBuC,QAASa,EAAYd,gBAAgBC,QACrCsP,YAAa,EAAK5F,OAAO6F,QAC1BpR,MACC,SAAAM,GACI,OAAOA,EAASnB,QAEtBa,MAAK,SAACb,GACJ,EAAKsD,SAAS,CACVoR,eAAgB,SAChBC,UAAW3U,OAEhBkB,OAAM,SAACrB,GACFc,IAAMuR,SAASrS,GAEfI,QAAQC,IAAI,mCAIZkB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACVoR,eAAgB,e,EAQhCG,eAAiB,SAAC/B,EAAUV,GACxBzR,IAAM,CACF0R,OAAQ,SACR7E,IxBhCqBrN,gDwBiCrBuC,QAASa,EAAYd,gBAAgBC,QACrC1C,KAAM8S,IACPjS,MAAK,WACJ,EAAKiU,uBAAuBhC,EAASvG,OACtCrL,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/BuS,Q,EAKR0C,uBAAyB,SAACC,GACtB,IAAIC,EAAmB,GACvB,EAAK5R,MAAMuR,UAAUlC,SAAQ,SAAAK,GACrBA,EAASvG,IAAMwI,GACfC,EAAiBtC,KAAKI,MAE9B,EAAKxP,SAAS,CAACqR,UAAWK,K,EAG9BpN,aAAe,SAACrD,GACZ,EAAKjB,SAAL,gBACKiB,EAAEkJ,OAAO/I,GAAKH,EAAEkJ,OAAO7J,S,EAKhCqR,cAAgB,SAACF,EAAYb,GACzB,GAAiC,IAA7B,EAAK9Q,MAAM,gBAAmD,IAA3B,EAAKA,MAAM,aAE9C,OAAO,EAEN,GAAiC,IAA7B,EAAKA,MAAM,gBAEhB,IAAK8Q,EAAiBgB,cAAcC,SAAS,EAAK/R,MAAM,eAAe8R,eAEnE,OAAO,MAGV,IAA+B,IAA3B,EAAK9R,MAAM,aAShB,OAAO,EAPP,GAAI2R,GAAc,EAAK3R,MAAM,aAEzB,OAAO,I,kEAUfM,KAAKkR,iB,6CAILlR,KAAK0I,OAAO6B,W,+BAGN,IAAD,OAEL,GAAiC,WAA7BvK,KAAKN,MAAMsR,eAEX,OACI,yBAAK9P,IAAKsJ,KAAapJ,IAAI,GAAGL,UAAU,sBAGhD,GAAiC,SAA7Bf,KAAKN,MAAMsR,eAEX,OACI,yBAAKjQ,UAAU,mBACX,yBAAKG,IAAK6F,KAAW3F,IAAI,QAAQL,UAAU,eAC3C,wBAAIA,UAAU,iBAAd,gDAKZ,IAAIwM,GAAY,EAEVmE,EAAqB1R,KAAKN,MAAMuR,UAAU1M,KAAI,SAAA6K,GAEhD,IAAIoB,EAAgB,UAAMpB,EAASvQ,UAAf,YAA4BuQ,EAASa,UAEzD,OAAI,EAAKsB,cAAcnC,EAASvG,GAAI2H,GAEzB,MAGXjD,IAGI,kBAAC,GAAD,CAAmB6B,SAAUA,EAAU3K,IAAK2K,EAASvG,GAAI0E,SAAUA,EAAU+C,WAAY,EAAKa,qBAItG,OACI,yBAAKnQ,GAAG,uBACJ,uBAAGA,GAAG,+BAA+BD,UAAU,gBAA/C,yDACA,yBAAKC,GAAG,yBAEJ,yBAAKD,UAAU,qBACX,2BAAOC,GAAG,oBAAoBoD,QAAQ,eAAtC,oBACA,2BAAOQ,KAAK,OAAO5D,GAAG,cAAcmD,SAAUnE,KAAKkE,gBAGvD,yBAAKnD,UAAU,qBACX,2BAAOC,GAAG,kBAAkBoD,QAAQ,aAApC,kBACA,2BAAOQ,KAAK,OAAO5D,GAAG,YAAYmD,SAAUnE,KAAKkE,gBAGnDwN,EAAmBzK,QAAUjH,KAAKN,MAAMuR,UAAUhK,QAChD,2BAAOjG,GAAG,mBAAV,cAAwChB,KAAKN,MAAMuR,UAAUhK,OAA7D,gBAGR,yBAAKjG,GAAG,iBAAiBD,UAAU,aAC9B2Q,GAE2B,GAA/B1R,KAAKN,MAAMuR,UAAUhK,QAClB,6D,GAtKU3G,aCgRfqR,G,4MArQXjS,MAAQ,CACJ2M,QAAS,EAAKjM,MAAMiM,QACpBuF,WAAY,EAAKxR,MAAMiM,QACvBvI,UAAW,GACXwI,aAAa,EACbuF,UAAU,EACVtC,YAAa,OACbC,kBAAmB,GACnBC,YAAa,OACbpH,YAAY,G,EAIhBxE,a,sBAAe,4BAAA9D,EAAA,sEAEW4I,GAAiB9E,eAF5B,OAGM,OADbC,EAFO,QAKP,EAAKlE,SAAS,CACVkE,UAAWA,IAKf,EAAKlE,SAAS,CAAEyI,YAAY,IAXrB,2C,EAiBfqE,kBAAoB,WAChB,EAAK9M,SAAS,CAAC0M,aAAc,EAAK5M,MAAM4M,e,EAM5CpI,aAAe,SAACrD,GACZ,IAAIiR,EAAelC,OAAOC,OAAO,GAAI,EAAKnQ,MAAMkS,YAChDE,EAAajR,EAAEkJ,OAAO/I,IAAMH,EAAEkJ,OAAO7J,MACrC,EAAKN,SAAS,CACVgS,WAAYE,IAIhB,EAAKlS,SAAS,CACV4P,kBAAmB,M,EAK3BM,WAAa,WACT,EAAKlQ,SAAS,CACViS,UAAU,EACVD,WAAY,EAAKlS,MAAM2M,W,EAK/B0F,cAAgB,WAEP,EAAKC,uBAAuB,EAAKtS,MAAMkS,aAQ5C,EAAKhS,SAAS,CACV2P,YAAa,YAEjBtS,IAAM,CACF0R,OAAQ,MACR7E,IAAKlN,EACLoC,QAASa,EAAYd,gBAAgBC,QACrC1C,KAAM,EAAKoD,MAAMkS,aAClBzU,MAAK,WACJ,EAAKyC,SAAS,CACVyM,QAAS,EAAK3M,MAAMkS,WACpBrC,YAAa,UACbsC,UAAU,EACVvF,aAAa,OAElB9O,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACV2P,YAAa,cAxBjB,EAAK3P,SAAS,CACV4P,kBAAmB,gC,EA6B/BwC,uBAAyB,SAAC3F,GACtB,MAAoB,IAAhBA,EAAQvN,MACS,IAAjBuN,EAAQqB,OACY,IAApBrB,EAAQyB,U,EAShBsC,gBAAkB,WACd,EAAKxQ,SAAS,CAAC6P,YAAa,iB,EAKhCwC,oBAAsB,WAClB,EAAKrS,SAAS,CACV6P,YAAa,aAEjB,EAAKrP,MAAMkQ,WAAW,EAAK5Q,MAAM2M,QAAS,EAAKkE,oB,EAInDA,kBAAoB,WAChB,EAAK3Q,SAAS,CAAC6P,YAAa,W,EAIhCtC,eAAiB,SAACnM,GAId,OAHc,EAAKtB,MAAMoE,UAAUsJ,MAAK,SAAA5I,GACpC,OAAOA,EAAQqE,IAAM7H,KAEVlC,M,kEAIfkB,KAAK6D,iB,+BAGC,IAAD,OAGCwJ,EAAe,CAAEC,OAAO,cAAD,OAAoC,GAApBtN,KAAKI,MAAMmN,SAA3B,SAEvBlB,EAAUrM,KAAKN,MAAM2M,QAE3B,MAA8B,YAA1BrM,KAAKN,MAAM+P,YAGP,yBAAK1O,UAAU,gBACX,yBAAKG,IAAKsM,KAAapM,IAAI,GAAGL,UAAU,4BAI1Cf,KAAKN,MAAMmS,SAwDY,GAAzB7R,KAAKN,MAAM2I,WAGP,yBAAKtH,UAAU,gBACX,2BAAOA,UAAU,iBAAjB,iDAMR,yBAAKA,UAAU,gBACX,yBAAKA,UAAU,qBAEX,yBAAKG,IAAKuM,KAAarM,IAAI,GAAGL,UAAU,eAAekL,MAAOoB,IAC9D,2BAAOtM,UAAU,cAAcsL,EAAQxD,IACvC,2BAAOjE,KAAK,OAAO7D,UAAU,eAAeC,GAAG,OAAOmD,SAAUnE,KAAKkE,aAAcwM,aAAcrE,EAAQvN,OACzG,2BAAO8F,KAAK,OAAO7D,UAAU,gBAAgBC,GAAG,QAAQmD,SAAUnE,KAAKkE,aAAcwM,aAAcrE,EAAQqB,SAI/G,yBAAK3M,UAAU,sBACX,yBAAKA,UAAU,yBACX,2BAAOA,UAAU,0BAAjB,iBACA,2BAAO6D,KAAK,OAAO7D,UAAU,mBAAmBC,GAAG,WAAWmD,SAAUnE,KAAKkE,aAAcwM,aAAcrE,EAAQyB,YAGrH,yBAAK/M,UAAU,wBACX,2BAAOA,UAAU,yBAAjB,gBACA,4BAAQC,GAAG,cAAcD,UAAU,iBAAiBoD,SAAUnE,KAAKkE,aAAcwM,aAAc1Q,KAAKN,MAAM2M,QAAQ2B,aAC7GhO,KAAKN,MAAMoE,UAAUS,KAAI,SAAAC,GAAO,OAAI,4BAAQC,IAAKD,EAAQqE,GAAI3I,MAAOsE,EAAQqE,IAAKrE,EAAQ1F,YAKtG,yBAAKiC,UAAU,qBAEX,kBAAC,EAAD,CAAQC,GAAG,SAASF,QAASd,KAAK8P,WAAY7O,KAAK,SAASE,KAAMwP,OAElE,kBAAC,EAAD,CAAQ3P,GAAG,OAAOF,QAASd,KAAK+R,cAAe9Q,KAAK,OAAOE,KAAMyP,OAEjE,2BAAO7P,UAAU,sBAAsBf,KAAKN,MAAM8P,mBAEvB,WAA1BxP,KAAKN,MAAM6P,aACR,yBAAKrO,IAAKsM,KAAapM,IAAI,GAAGL,UAAU,wBAEjB,SAA1Bf,KAAKN,MAAM6P,aACR,2BAAOvO,GAAG,wBAAV,gDAnGZ,yBAAKD,UAAU,gBAGX,yBAAKA,UAAU,qBACX,yBAAKG,IAAKuM,KAAarM,IAAI,GAAGL,UAAU,eAAekL,MAAOoB,IAC9D,2BAAOtM,UAAU,cAAcsL,EAAQxD,IACvC,2BAAO9H,UAAU,gBAAgBsL,EAAQvN,MACzC,2BAAOiC,UAAU,iBAAiBsL,EAAQqB,OAE1C,kBAAC,EAAD,CAAQ1M,GAAG,eAAeF,QAASd,KAAK0M,kBAAmBzL,KAAK,eAAeE,KAAMwM,OAErF,kBAAC,EAAD,CAAQ3M,GAAG,OAAOF,QAAS,kBAAI,EAAKlB,SAAS,CAACiS,UAAU,KAAQ5Q,KAAK,OAAOE,KAAM0P,OAElF,kBAAC,EAAD,CAAQ7P,GAAG,SAASF,QAASd,KAAKoQ,gBAAiBnP,KAAK,SAASE,KAAM2P,QAGzE9Q,KAAKN,MAAM4M,aAET,yBAAKvL,UAAU,sBACX,yBAAKA,UAAU,yBACX,2BAAOA,UAAU,0BAAjB,iBACA,2BAAOA,UAAU,oBAAoBsL,EAAQyB,WAGjD,kBAAC,GAAD,CAAa9M,GAAG,mBAAmBgL,MAAM,YAAY9L,MAAOmM,EAAQ0B,WAEpE,yBAAKhN,UAAU,wBACX,2BAAOA,UAAU,yBAAjB,gBACA,2BAAOA,UAAU,mBAAmBf,KAAKmN,eAAenN,KAAKN,MAAM2M,QAAQ2B,gBAKvF,kBAAC,KAAD,CACIxL,KAAgC,eAA1BxC,KAAKN,MAAM+P,YACjB5E,YAAU,EACVC,aAAW,EACXC,aAAW,EACXtI,MAAM,oBACNC,UAAW1C,KAAKiS,oBAChBjH,SAAU,WAAK,EAAKpL,SAAS,CAAC6P,YAAa,WAP/C,2CASyCzP,KAAKN,MAAM2M,QAAQvN,KAT5D,OAY2B,SAA1BkB,KAAKN,MAAM+P,aACR,2BAAO1O,UAAU,wBAAjB,sD,GAzMOT,aCoKhB4R,G,4MA1KXxS,MAAQ,CACJwO,UAAW,UACXC,SAAU,GACV,cAAe,GACf,YAAa,I,EAGjB1F,YAAcxL,IAAMwL,Y,EACpBC,OAAS,EAAKD,YAAYC,S,EAG1B2F,YAAc,WACVpR,IAAM,CACF6M,I1BAqBrN,iD0BCrB6R,YAAa,EAAK5F,OAAO6F,QAC1BpR,MAAK,SAACM,GACL,EAAKmC,SAAS,CACVsO,UAAW,SACXC,SAAU1Q,EAASnB,UAExBkB,OAAM,SAACrB,GACFc,IAAMuR,SAASrS,GAEfI,QAAQC,IAAI,mCAIZkB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACVsO,UAAW,e,EAO3BiE,cAAgB,SAAC9F,EAASqC,GACtBzR,IAAM,CACF0R,OAAQ,SACR7E,I1BxBoBrN,+C0ByBpBuC,QAASa,EAAYd,gBAAgBC,QACrC1C,KAAM+P,IACPlP,MAAK,WACJ,EAAKyR,sBAAsBvC,EAAQxD,OACpCrL,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/BuS,Q,EAKRE,sBAAwB,SAACwD,GACrB,IAAItD,EAAkB,GACtB,EAAKpP,MAAMyO,SAASY,SAAQ,SAAA1C,GACpBA,EAAQxD,IAAMuJ,GACdtD,EAAgBE,KAAK3C,MAE7B,EAAKzM,SAAS,CAACuO,SAAUW,K,EAI7B5K,aAAe,SAACrD,GACZ,EAAKjB,SAAL,gBACKiB,EAAEkJ,OAAO/I,GAAKH,EAAEkJ,OAAO7J,S,EAKhCqR,cAAgB,SAAClF,GACb,GAAiC,IAA7B,EAAK3M,MAAM,gBAAmD,IAA3B,EAAKA,MAAM,aAE9C,OAAO,EAEN,GAAiC,IAA7B,EAAKA,MAAM,gBAEhB,IAAK2M,EAAQvN,KAAK0S,cAAcC,SAAS,EAAK/R,MAAM,eAAe8R,eAE/D,OAAO,MAGV,IAA+B,IAA3B,EAAK9R,MAAM,aAShB,OAAO,EAPP,GAAI2M,EAAQxD,IAAM,EAAKnJ,MAAM,aAEzB,OAAO,I,EASnBuP,e,sBAAiB,sBAAAlP,EAAA,sDACb,EAAKsO,cADQ,2C,kEAKbrO,KAAKiP,mB,6CAILjP,KAAK0I,OAAO6B,W,+BAGN,IAAD,OAEL,GAA4B,WAAxBvK,KAAKN,MAAMwO,UAEX,OACI,yBAAKhN,IAAKsJ,KAAapJ,IAAI,GAAGL,UAAU,sBAGhD,GAA4B,SAAxBf,KAAKN,MAAMwO,UAEX,OACI,yBAAKnN,UAAU,mBACX,yBAAKG,IAAK6F,KAAW3F,IAAI,GAAGL,UAAU,eACtC,wBAAIA,UAAU,iBAAd,iDAKZ,IAAIwM,GAAY,EAGV8E,EAAoBrS,KAAKN,MAAMyO,SAAS5J,KAAI,SAAA8H,GAE9C,OAAI,EAAKkF,cAAclF,GAEZ,MAGXkB,IAGI,kBAAC,GAAD,CAAkBlB,QAASA,EAAS5H,IAAK4H,EAAQxD,GAAI0E,SAAUA,EAAU+C,WAAY,EAAK6B,oBAIlG,OACI,yBAAKnR,GAAG,sBACJ,uBAAGA,GAAG,+BAA+BD,UAAU,gBAA/C,yDACA,yBAAKC,GAAG,wBAEJ,yBAAKD,UAAU,qBACX,2BAAOC,GAAG,oBAAoBoD,QAAQ,eAAtC,oBACA,2BAAOQ,KAAK,OAAO5D,GAAG,cAAcmD,SAAUnE,KAAKkE,gBAGvD,yBAAKnD,UAAU,qBACX,2BAAOC,GAAG,kBAAkBoD,QAAQ,aAApC,kBACA,2BAAOQ,KAAK,OAAO5D,GAAG,YAAYmD,SAAUnE,KAAKkE,gBAGnDmO,EAAkBpL,QAAUjH,KAAKN,MAAMyO,SAASlH,QAC9C,2BAAOjG,GAAG,kBAAV,cAAuChB,KAAKN,MAAMyO,SAASlH,OAA3D,eAGR,yBAAKjG,GAAG,gBAAgBD,UAAU,aAC7BsR,GAE0B,GAA9BrS,KAAKN,MAAMyO,SAASlH,QACjB,4D,GArKS3G,aCmFdgS,I,mNAnFX5S,MAAQ,CACJ6S,gBAAiB,S,EAGrBrO,aAAe,SAACrD,GACZ,EAAKjB,SAAS,CACV2S,gBAAiB1R,EAAEkJ,OAAO7J,S,uDAK9B,IAAMkD,EAAiB,CACnBoP,WAAY,IACZC,gBAAiB,2BAErB,OACI,yBAAK1R,UAAU,kBACX,yBAAKA,UAAU,gBAAf,uBAEEmB,EAAY3B,gBACV,6BAEI,yBAAKQ,UAAU,aACX,kBAAC,IAAD,CAASA,UAAU,mBAAmBwC,YAAaH,EAAgBT,GAAG,oBAAtE,SACA,kBAAC,IAAD,CAAS5B,UAAU,mBAAmBwC,YAAaH,EAAgBT,GAAG,gCAAtE,qBACA,kBAAC,IAAD,CAAS5B,UAAU,mBAAmBwC,YAAaH,EAAgBT,GAAG,+BAAtE,qBAGJ,yBAAK5B,UAAU,aACX,kBAAC,IAAD,KACI,kBAAC,IAAD,CAAO4J,KAAK,mBAAmB+H,UAAWzE,KAC1C,kBAAC,IAAD,CAAOtD,KAAK,+BAA+B+H,UAAW3B,KACtD,kBAAC,IAAD,CAAOpG,KAAK,8BAA8B+H,UAAWR,MAGpC,cAAnBlS,KAAKI,MAAMuK,MACT,kBAAC,IAAD,CAAUhI,GAAG,uBAM5BT,EAAY3B,gBACT,6BAEI,4BAAQS,GAAG,mBAAmBD,UAAU,0BAA0BoD,SAAUnE,KAAKkE,aAAchE,MAAOF,KAAKN,MAAM6S,iBAC7G,4BAAQ9N,IAAI,IAAIvE,MAAM,SAAtB,SACA,4BAAQuE,IAAI,IAAIvE,MAAM,qBAAtB,qBACA,4BAAQuE,IAAI,IAAIvE,MAAM,oBAAtB,qBAG2B,SAA9BF,KAAKN,MAAM6S,iBACR,kBAAC,IAAD,CAAU5P,GAAG,qBAGc,qBAA9B3C,KAAKN,MAAM6S,iBACR,kBAAC,IAAD,CAAU5P,GAAG,iCAGc,oBAA9B3C,KAAKN,MAAM6S,iBACR,kBAAC,IAAD,CAAU5P,GAAG,gCAGjB,yBAAK5B,UAAU,oBACX,kBAAC,IAAD,KACI,kBAAC,IAAD,CAAO4J,KAAK,mBAAmB+H,UAAWzE,KAC1C,kBAAC,IAAD,CAAOtD,KAAK,+BAA+B+H,UAAW3B,KACtD,kBAAC,IAAD,CAAOpG,KAAK,8BAA8B+H,UAAWR,MAGpC,cAAnBlS,KAAKI,MAAMuK,MACT,kBAAC,IAAD,CAAUhI,GAAG,4B,GAzEzBrC,cCmGLqS,G,4MAjGXjT,MAAQ,CACJ8G,OAAQ,EAAKpG,MAAMoG,OACnBiJ,YAAa,Q,EAIjBmD,gBAAkB,WACd,EAAKhT,SAAS,CAAC6P,YAAa,iB,EAKhCwC,oBAAsB,WAClB,EAAKrS,SAAS,CACV6P,YAAa,aAEjB,EAAKrP,MAAMkQ,WAAW,EAAK5Q,MAAM8G,OAAOqM,SAAU,EAAKtC,oB,EAI3DA,kBAAoB,WAChB,EAAK3Q,SAAS,CAAC6P,YAAa,W,uDAGtB,IAAD,OAECjJ,EAASxG,KAAKN,MAAM8G,OAE1B,GAA8B,YAA1BxG,KAAKN,MAAM+P,YAEX,OACI,yBAAK1O,UAAU,eACX,yBAAKG,IAAKsM,KAAapM,IAAI,GAAGL,UAAU,4BAKpD,IAAM+R,EAAoB,IAAI3T,KAAKqH,EAAOuM,eACpCC,EAAkB,IAAI7T,KAAKqH,EAAOyM,aAElCxM,EAAgBC,GAAgB3B,cAAc+N,GAC9CnM,EAAcD,GAAgB3B,cAAc,IAAI5F,KAAKqH,EAAOyM,cAC5D3N,EAAgBwN,EAAkB3M,UAAY,KAAO2M,EAAkB7M,WAAa,GAAK,IAAM6M,EAAkB/M,cAEjHmN,EAAaxM,GAAgBrB,kBAAkByN,EAAmBE,GAExE,OAEI,yBAAKjS,UAAU,cAAcC,GAAG,sBAE5B,yBAAKD,UAAU,oBACX,2BAAOA,UAAU,0BAAjB,kBACA,2BAAOA,UAAU,yBAAyBuE,IAG9C,2BAAOvE,UAAU,kBAAkByF,EAAO2M,gBAE1C,yBAAKpS,UAAU,gBACX,2BAAOA,UAAU,kBAAkByF,EAAO4M,eAC1C,2BAAOrS,UAAU,kBAAkB0F,IAGvC,yBAAK1F,UAAU,eACX,yBAAKG,IAAK2G,KAAYzG,IAAI,UAAOL,UAAU,gBAC3C,2BAAOA,UAAU,eAAemS,EAAhC,MAGJ,yBAAKnS,UAAU,cACX,2BAAOA,UAAU,uBAAuByF,EAAO6M,oBAC/C,2BAAOtS,UAAU,gBAAgB4F,IAGrC,kBAAC,EAAD,CAAQ3F,GAAG,gBAAgBF,QAASd,KAAK4S,gBAAiB3R,KAAK,gBAAgBE,KAAMwP,OAGrF,kBAAC,KAAD,CACInO,KAAgC,eAA1BxC,KAAKN,MAAM+P,YACjB5E,YAAU,EACVC,aAAW,EACXC,aAAW,EACXtI,MAAM,oBACNC,UAAW1C,KAAKiS,oBAChBjH,SAAU,WAAK,EAAKpL,SAAS,CAAC6P,YAAa,WAP/C,gDAY2B,SAA1BzP,KAAKN,MAAM+P,aACR,2BAAOzO,GAAG,uBAAV,qD,GA1FUV,a,oBCKxBgT,I,kNAOF5T,MAAQ,CACJsH,QAAS,GACTuM,aAAc,GACdC,eAAe,G,EAGnB/K,YAAcxL,IAAMwL,Y,EACpBC,OAAS,EAAKD,YAAYC,S,EAG1B+K,mBAAqB,WAEjB,EAAK7T,SAAS,CACV2T,aAAc,YAGlBtW,IAAM,CACF6M,I7BFyBrN,sD6BGzBuC,QAASa,EAAYd,gBAAgBC,UACtC7B,MAAK,SAACM,GACL,EAAKmC,SAAS,CACVoH,QAASvJ,EAASnB,KAClBiX,aAAc,cAEnB/V,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACV2T,aAAc,c,EAO1BG,aAAe,SAACC,EAAUjF,GACtBzR,IAAM,CACF0R,OAAQ,SACR7E,IAAKhN,EAAkB,IAAM6W,EAC7B3U,QAASa,EAAYd,gBAAgBC,UACtC7B,MAAK,WACJ,EAAKyW,qBAAqBD,GAC1B,EAAK/T,SAAS,CAAC4T,eAAe,OAC/BhW,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/BuS,Q,EAKRkF,qBAAuB,SAACD,GACpB,IAAIE,EAAiB,GACrB,EAAKnU,MAAMsH,QAAQ+H,SAAQ,SAAAvI,GACnBA,EAAOqM,UAAYc,GACnBE,EAAe7E,KAAKxI,MAE5B,EAAK5G,SAAS,CAACoH,QAAS6M,K,kEAIxB7T,KAAKyT,uB,6CAILzT,KAAK0I,OAAO6B,W,+BAGN,IAAD,OACL,GAA+B,WAA3BvK,KAAKN,MAAM6T,aAEX,OACI,yBAAKvS,GAAG,4BACJ,yBAAKE,IAAKsJ,KAAapJ,IAAI,GAAGL,UAAU,uBAIpD,GAA+B,SAA3Bf,KAAKN,MAAM6T,aAEX,OACI,yBAAKxS,UAAU,mBACX,yBAAKG,IAAK6F,KAAW3F,IAAI,QAAQL,UAAU,eAC3C,wBAAIA,UAAU,iBAAd,gDAKZ,IAAM+S,EAAU9T,KAAKN,MAAMsH,QAAQzC,KAAI,SAAAiC,GAEnC,OACI,kBAAC,GAAD,CAAiBA,OAAQA,EAAQ/B,IAAK+B,EAAOqC,GAAIyH,WAAY,EAAKoD,kBAItEK,EAAe,uDASnB,OALsB,GAAlBD,EAAQ7M,SAER8M,EAAe,uBAIf,yBAAK/S,GAAG,4BAEJ,uBAAGD,UAAU,gBACRgT,EADL,OAEI,yBAAK7S,IAAK8S,KAAUvR,MAZnB,0DAYgCrB,IAAI,GAAGL,UAAU,eAGtD,yBAAKA,UAAU,gBACV+S,GAGD,kBAAC,KAAD,CACAvR,SAAO,EACPC,KAAMxC,KAAKN,MAAM8T,cACjB1I,aAAW,EACXC,aAAW,EACXtI,MAAM,0BACNC,UAAW,WAAK,EAAK9C,SAAS,CAAC4T,eAAe,MAN9C,+D,GAxHQlT,cAuI5BgT,GAAcxQ,YAAcxD,EAEbgU,UCCAW,I,mNAzIXvU,MAAQ,CACJwU,kBAAkB,EAClBC,gBAAiB,GACjBC,YAAa,GACbC,YAAa,Q,EAIjBnQ,aAAe,SAACrD,GACZ,EAAKjB,SAAL,gBAAgBiB,EAAEkJ,OAAO/I,GAAKH,EAAEkJ,OAAO7J,S,EAI3CoU,eAAiB,WAUb,IAAIC,EARC,EAAKC,kBAMV,EAAK5U,SAAS,CAACyU,YAAa,YAGD,YAAvB,EAAKjU,MAAMqU,SACXF,E9BN6B9X,sD8BOD,WAAvB,EAAK2D,MAAMqU,WAChBF,E9BE4B9X,sD8BAhCQ,IAAM,CACF0R,OAAQ,MACR7E,IAAKyK,EACLvV,QAASa,EAAYd,gBAAgBC,QACrC1C,KAAM,CAAC,EAAKoD,MAAMyU,gBAAiB,EAAKzU,MAAM0U,eAC/CjX,MAAK,WACJ,EAAKyC,SAAS,CAACyU,YAAa,YAC5B,EAAKjU,MAAMsU,qBAAqB,EAAKhV,MAAM0U,gBAC5C5W,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACVyU,YAAa,cAvBjB,EAAKzU,SAAS,CAACyU,YAAa,oB,EA6BpCG,eAAiB,WACb,MAAkC,IAA9B,EAAK9U,MAAMyU,iBACe,IAA1B,EAAKzU,MAAM0U,a,EAWnBO,WAAa,WACT,EAAK/U,SAAS,CACVyU,YAAa,OACbH,kBAAkB,K,uDAIhB,IAAD,OACL,OACI,yBAAKnT,UAAU,mBAEX,2BAAOA,UAAU,yBAAjB,iBACA,yBAAKkL,MAAO,CAACvH,QAAS,iBAClB,2BAAO3D,UAAU,0BAAjB,YACA,yBAAKG,IAAK2P,KAAUzP,IAAI,GAAGL,UAAU,uBAAuBD,QAAS,kBAAI,EAAKlB,SAAS,CAACsU,kBAAkB,QAG7GlU,KAAKN,MAAMwU,kBACR,yBAAKnT,UAAU,mBACX,yBAAKA,UAAU,yBAEX,yBAAKA,UAAU,yBACX,2BAAOA,UAAU,0BAAjB,yBACA,2BAAO6D,KAAK,WAAW5D,GAAG,kBAAkBD,UAAU,2BAA2BoD,SAAUnE,KAAKkE,gBAGpG,yBAAKnD,UAAU,qBACX,2BAAOA,UAAU,sBAAjB,qBACA,2BAAO6D,KAAK,WAAW5D,GAAG,cAAcD,UAAU,uBAAuBoD,SAAUnE,KAAKkE,gBAG5F,yBAAKnD,UAAU,2BACX,kBAAC,EAAD,CAAQC,GAAG,yBAAyBC,KAAK,SAASE,KAAMwP,KAAY7P,QAAS,kBAAI,EAAKlB,SAAS,CAACsU,kBAAkB,OAClH,kBAAC,EAAD,CAAQlT,GAAG,0BAA0BC,KAAK,OAAOE,KAAMyP,KAAU9P,QAASd,KAAKsU,iBACpD,WAA1BtU,KAAKN,MAAM2U,aACR,yBAAKnT,IAAKsM,KAAapM,IAAI,aAAaL,UAAU,+BAQtE,kBAAC,KAAD,CACIwB,SAAO,EACPC,KAAgC,WAA1BxC,KAAKN,MAAM2U,YACjBvJ,aAAW,EACXC,aAAW,EACXtI,MAAM,+BACNC,UAAW1C,KAAK2U,aAIpB,kBAAC,KAAD,CACIC,SAAO,EACPpS,KAAgC,kBAA1BxC,KAAKN,MAAM2U,YACjBvJ,aAAW,EACXC,aAAW,EACXtI,MAAM,4BACNC,UAAW,kBAAM,EAAK9C,SAAS,CAACyU,YAAa,YAIjD,kBAAC,KAAD,CACIlY,OAAK,EACLqG,KAAgC,SAA1BxC,KAAKN,MAAM2U,YACjBvJ,aAAW,EACXC,aAAW,EACXtI,MAAM,gDACNC,UAAW,kBAAM,EAAK9C,SAAS,CAACyU,YAAa,iB,GAlIpC/T,cCIvBuU,G,4MAEFnV,MAAQ,CACJ0P,SAAU,EAAK1N,QAAQvD,SAASF,KAChCoR,YAAa,EAAK3N,QAAQvD,SAASF,KACnC4T,UAAU,EACViD,iBAAiB,EACjBvF,YAAa,Q,EAIjBwF,YAAc,WACV,EAAKnV,SAAS,CAACiS,UAAU,K,EAI7BmD,eAAiB,WACb,EAAKpV,SAAS,CACViS,UAAU,EACVxC,YAAa,EAAK3P,MAAM0P,Y,EAKhClL,aAAe,SAACrD,GACZ,IAAI8O,EAAgBC,OAAOC,OAAO,GAAI,EAAKnQ,MAAM2P,aACjDM,EAAc9O,EAAEkJ,OAAO/I,IAAMH,EAAEkJ,OAAO7J,MACtC,EAAKN,SAAS,CACVyP,YAAaM,K,EAKrBK,wBAA0B,SAACZ,GACvB,MAA0B,IAAtBA,EAASvQ,WACY,IAArBuQ,EAASa,UACS,IAAlBb,EAAS1B,OACY,IAArB0B,EAAStB,UACY,IAArBsB,EAASrB,UACW,IAApBqB,EAASc,SACW,IAApBd,EAASe,S,EASjB8E,sBAAwB,WACf,EAAKjF,wBAAwB,EAAKtQ,MAAM2P,cAQ7C,EAAKzP,SAAS,CACV2P,YAAa,YAGjBtS,IAAM,CACF0R,OAAQ,MACR7E,I/BhD4BrN,2D+BiD5BuC,QAASa,EAAYd,gBAAgBC,QACrC1C,KAAM,EAAKoD,MAAM2P,cAClBlS,MAAK,WACJ,EAAK+X,oBACN1X,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACV2P,YAAa,cApBjB,EAAK3P,SAAS,CACVkV,iBAAiB,K,EAyB7BI,eAAiB,WACb,IAAIC,EAAkB,EAAKzV,MAAM2P,YAAYvB,SACzCsH,EAAkB,EAAK1V,MAAM2P,YAAYtB,SACzC,EAAKrM,QAAQ5B,eAAe,CAACqV,EAAiBC,IAE9C,EAAKxV,SAAS,CACVwP,SAAU,EAAK1P,MAAM2P,YACrBE,YAAa,UACbsC,UAAU,IAKd,EAAKjS,SAAS,CACVwP,SAAU,EAAK1P,MAAM2P,YACrBE,YAAa,mBACbsC,UAAU,K,EAMtB6C,qBAAuB,SAACN,GACpB,IAAIzE,EAAgBC,OAAOC,OAAO,GAAI,EAAKnQ,MAAM2P,aACjDM,EAAc5B,SAAWqG,EACzB,EAAKxU,SAAS,CACVyP,YAAaM,IAEjB,EAAKuF,kB,uDAGC,IAAD,OAGC7F,EAAcrP,KAAKN,MAAM2P,YAE/B,OACI,yBAAKrO,GAAG,8BACJ,yBAAKA,GAAG,oBAKJ,yBAAKA,GAAG,2BAA2BD,UAAU,kBAEzC,yBAAKC,GAAG,kBAAkBD,UAAU,cAChC,2BAAOC,GAAG,kBAAkBD,UAAU,SAAtC,qBACEf,KAAKN,MAAMmS,UACT,2BAAO7Q,GAAG,kBAAkBD,UAAU,QAAQsO,EAAYxQ,WAE7DmB,KAAKN,MAAMmS,UACR,2BAAOjN,KAAK,OAAO5D,GAAG,YAAYD,UAAU,kBAAkB2P,aAAcrB,EAAYxQ,UAAWsF,SAAUnE,KAAKkE,gBAG1H,yBAAKlD,GAAG,iBAAiBD,UAAU,cAC/B,2BAAOC,GAAG,iBAAiBD,UAAU,SAArC,mBACEf,KAAKN,MAAMmS,UACT,2BAAO7Q,GAAG,iBAAiBD,UAAU,QAAQsO,EAAYvB,UAE5D9N,KAAKN,MAAMmS,UACR,2BAAOjN,KAAK,OAAO5D,GAAG,WAAWD,UAAU,iBAAiB2P,aAAcrB,EAAYvB,SAAU3J,SAAUnE,KAAKkE,gBAGvH,yBAAKlD,GAAG,eAAeD,UAAU,cAC7B,2BAAOC,GAAG,eAAeD,UAAU,SAAnC,kBACEf,KAAKN,MAAMmS,UACT,2BAAO7Q,GAAG,eAAeD,UAAU,QAAQsO,EAAYa,SAE1DlQ,KAAKN,MAAMmS,UACR,2BAAOjN,KAAK,OAAO5D,GAAG,UAAUD,UAAU,eAAe2P,aAAcrB,EAAYa,QAAS/L,SAAUnE,KAAKkE,gBAGnH,yBAAKlD,GAAG,gBAAgBD,UAAU,cAC9B,kBAAC,GAAD,CAAgB0T,SAAS,WAAWC,qBAAsB1U,KAAK0U,yBAMvE,yBAAK1T,GAAG,4BAA4BD,UAAU,kBAE1C,yBAAKC,GAAG,iBAAiBD,UAAU,cAC/B,2BAAOC,GAAG,iBAAiBD,UAAU,SAArC,oBACEf,KAAKN,MAAMmS,UACT,2BAAO7Q,GAAG,iBAAiBD,UAAU,QAAQsO,EAAYY,UAE5DjQ,KAAKN,MAAMmS,UACR,2BAAOjN,KAAK,OAAO5D,GAAG,WAAWD,UAAU,iBAAiB2P,aAAcrB,EAAYY,SAAU9L,SAAUnE,KAAKkE,gBAGvH,yBAAKlD,GAAG,aAAaD,UAAU,cAC3B,2BAAOC,GAAG,aAAaD,UAAU,SAAjC,gBACEf,KAAKN,MAAMmS,UACT,2BAAO7Q,GAAG,aAAaD,UAAU,QAAQsO,EAAY3B,OAExD1N,KAAKN,MAAMmS,UACR,2BAAOjN,KAAK,OAAO5D,GAAG,QAAQD,UAAU,aAAa2P,aAAcrB,EAAY3B,MAAOvJ,SAAUnE,KAAKkE,gBAG7G,yBAAKlD,GAAG,aAAaD,UAAU,cAC3B,2BAAOC,GAAG,aAAaD,UAAU,SAAjC,uBACEf,KAAKN,MAAMmS,UACT,2BAAO7Q,GAAG,aAAaD,UAAU,QAAQsO,EAAYc,SAExDnQ,KAAKN,MAAMmS,UACR,2BAAOjN,KAAK,OAAO5D,GAAG,UAAUD,UAAU,aAAa2P,aAAcrB,EAAYc,QAAShM,SAAUnE,KAAKkE,gBAGjH,yBAAKlD,GAAG,mBAAmBD,UAAU,eAE/Bf,KAAKN,MAAMmS,UACT,kBAAC,GAAD,CAAa7Q,GAAG,mBAAmBgL,MAAM,sBAAsB9L,MAAOmP,EAAYgG,eAErFrV,KAAKN,MAAMmS,UACR,yBAAK5F,MAAO,CAACvH,QAAS,iBAClB,2BAAO1D,GAAG,mBAAmBD,UAAU,SAAvC,4BACA,2BAAO6D,KAAK,OAAO5D,GAAG,eAAeD,UAAU,mBAAmB2P,aAAcrB,EAAYgG,aAAclR,SAAUnE,KAAKkE,mBAS7I,kBAAC,KAAD,CACI/H,OAAK,EACLqG,KAAMxC,KAAKN,MAAMoV,gBACjBhK,aAAW,EACXC,aAAW,EACXtI,MAAM,6BACNC,UAAW,kBAAM,EAAK9C,SAAS,CAACkV,iBAAiB,OAIrD,kBAAC,KAAD,CACI3Y,OAAK,EACLqG,KAAgC,SAA1BxC,KAAKN,MAAM6P,YACjBzE,aAAW,EACXC,aAAW,EACXtI,MAAM,6CACNC,UAAW,kBAAM,EAAK9C,SAAS,CAAC2P,YAAa,YAIjD,kBAAC,KAAD,CACIpT,OAAK,EACLqG,KAAgC,oBAA1BxC,KAAKN,MAAM6P,YACjBzE,aAAW,EACXC,aAAW,EACXtI,MAAM,oDACNC,UAAW,kBAAM,EAAK9C,SAAS,CAAC2P,YAAa,WANjD,uDAWEvP,KAAKN,MAAMmS,UACL,kBAAC,EAAD,CAAQ7Q,GAAG,oBAAoBC,KAAK,OAAOE,KAAM0P,KAAU/P,QAASd,KAAK+U,cAEhF/U,KAAKN,MAAMmS,UACR,yBAAK9Q,UAAU,qBACX,kBAAC,EAAD,CAAQC,GAAG,sBAAsBC,KAAK,SAASE,KAAMwP,KAAY7P,QAASd,KAAKgV,iBAC/E,kBAAC,EAAD,CAAQhU,GAAG,oBAAoBC,KAAK,OAAOE,KAAMyP,KAAU9P,QAASd,KAAKiV,wBAC9C,WAA1BjV,KAAKN,MAAM6P,aACR,yBAAKrO,IAAKsM,KAAapM,IAAI,GAAGkU,MAAM,8B,GAlPlChV,aA4P9BuU,GAAgB/R,YAAcxD,EAEfuV,UCrQTU,G,4MAEF7V,MAAQ,CACJ8V,iBAAkB,OAClBC,kBAAmB,GACnBlD,gBAAiB,kB,EAKrBmD,oBAAsB,WACdpY,aAAa6J,eAAe,YAE5B,EAAKvH,SAAS,CACV6V,kBAAmB,EAAKE,kBACxBH,iBAAkB,UAEtBlY,aAAaoB,WAAW,Y,EAKhCiX,gBAAkB,WACd,IAAIC,EAASxX,KAAKC,MAAMf,aAAaO,QAAQ,WACzCyM,EAAS,2BAOb,OANAA,GAAU,eAAiBsL,EAAOC,WAClCvL,GAAU,wBAA0BsL,EAAOE,gBAClB,aAArBF,EAAOC,aAEPvL,GAAU,qBAAuBsL,EAAOG,cAErCzL,G,EAGXpG,aAAe,SAACrD,GACZ,EAAKjB,SAAS,CACV2S,gBAAiB1R,EAAEkJ,OAAO7J,S,kEAK9BF,KAAK0V,wB,+BAGC,IAAD,OACCtS,EAAiB,CACnBoP,WAAY,IACZC,gBAAiB,2BAErB,OACI,yBAAK1R,UAAU,kBACX,yBAAKA,UAAU,gBAAf,uBAEMmB,EAAY3B,gBACV,6BAEI,yBAAKQ,UAAU,aACX,kBAAC,IAAD,CAASA,UAAU,mBAAmBwC,YAAaH,EAAgBT,GAAG,6BAAtE,cACA,kBAAC,IAAD,CAAS5B,UAAU,mBAAmBwC,YAAaH,EAAgBT,GAAG,+BAAtE,qBAGJ,yBAAK5B,UAAU,aACP,kBAAC,IAAD,KACI,kBAAC,IAAD,CAAO4J,KAAK,4BAA4B+H,UAAWY,KACnD,kBAAC,IAAD,CAAO3I,KAAK,8BAA8B+H,UAAWmC,MAGxC,cAAnB7U,KAAKI,MAAMuK,MACT,kBAAC,IAAD,CAAUhI,GAAG,gCAM5BT,EAAY3B,gBACb,6BAEI,4BAAQS,GAAG,sBAAsBD,UAAU,0BAA0BoD,SAAUnE,KAAKkE,aAAchE,MAAOF,KAAKN,MAAM6S,iBAChH,4BAAQ9N,IAAI,IAAIvE,MAAM,kBAAtB,cACA,4BAAQuE,IAAI,IAAIvE,MAAM,oBAAtB,qBAG2B,kBAA9BF,KAAKN,MAAM6S,iBACR,kBAAC,IAAD,CAAU5P,GAAG,8BAGc,oBAA9B3C,KAAKN,MAAM6S,iBACR,kBAAC,IAAD,CAAU5P,GAAG,gCAIjB,yBAAK5B,UAAU,oBACP,kBAAC,IAAD,KACI,kBAAC,IAAD,CAAO4J,KAAK,4BAA4B+H,UAAWY,KACnD,kBAAC,IAAD,CAAO3I,KAAK,8BAA8B+H,UAAWmC,MAGxC,cAAnB7U,KAAKI,MAAMuK,MACT,kBAAC,IAAD,CAAUhI,GAAG,gCAQzB,kBAAC,KAAD,CACIH,KAAqC,SAA/BxC,KAAKN,MAAM8V,iBACjB3K,YAAU,EACVC,aAAW,EACXC,aAAW,EACXtI,MAAM,yBACNC,UAAW,kBAAI,EAAK9C,SAAS,CAAC4V,iBAAkB,eAChDxK,SAAU,kBAAI,EAAKpL,SAAS,CAAC4V,iBAAkB,WAPnD,8DAWgC,aAA/BxV,KAAKN,MAAM8V,kBACR,kBAAC,IAAD,CAAU7S,GAAI3C,KAAKN,MAAM+V,yB,GAtH1BnV,aA6HvBiV,GAASzS,YAAcxD,EAERiW,UCuOAS,G,4MA3VXtW,MAAQ,CACJ8G,OAAQ,EAAKpG,MAAMoG,OACnByP,UAAW,EAAK7V,MAAMoG,OACtBiJ,YAAa,OACboC,UAAU,EACVqE,UAAW,OACXpS,UAAW,GACXqS,eAAgB,UAChBC,aAAc,I,EAIlBC,mBAAqB,WACjB,EAAKzW,SAAS,CAAE6P,YAAa,aAC7B,EAAKrP,MAAMkQ,WAAW,EAAK5Q,MAAM8G,OAAOqC,GAAI,EAAKyN,oB,EAGrDA,kBAAoB,WAChB,EAAK1W,SAAS,CAAC6P,YAAa,W,EAIhC5L,a,sBAAe,4BAAA9D,EAAA,sEAEW4I,GAAiB9E,eAF5B,OAGM,OADbC,EAFO,QAKP,EAAKlE,SAAS,CACVkE,UAAWA,EACXqS,eAAgB,WAKpB,EAAKvW,SAAS,CAAEuW,eAAgB,UAZzB,2C,EAiBfhJ,eAAiB,SAACnM,GAKd,OAJc,EAAKtB,MAAMoE,UAAUsJ,MAAK,SAAA5I,GACpC,OAAOA,EAAQqE,IAAM7H,KAGVlC,M,EAInByX,gBAAkB,SAACC,EAASC,GACxB,OAAID,EAAU,IAAIrX,KAEP,YAEPqX,GAAW,IAAIrX,MAAUsX,EAAW,IAAItX,KAEjC,aAEPsX,GAAY,IAAItX,KAET,cAFX,G,EAOJ+E,aAAe,SAACrD,GACZ,IAAI6V,EAAc9G,OAAOC,OAAO,GAAI,EAAKnQ,MAAMuW,WAC/CS,EAAY7V,EAAEkJ,OAAO/L,MAAQ6C,EAAEkJ,OAAO7J,MACtC,EAAKN,SAAS,CACVqW,UAAWS,K,EAKnBC,aAAe,WACN,EAAKC,sBAAsB,EAAKlX,MAAMuW,aAI3C,EAAKrW,SAAS,CACVsW,UAAW,aAEfjZ,IAAM,CACF0R,OAAQ,MACR7E,IjCxDmBrN,gDiCyDnBuC,QAASa,EAAYd,gBAAgBC,QACrC1C,KAAM,EAAKoD,MAAMuW,YAClB9Y,MAAK,WAEJ,EAAKyC,SAAS,CACVsW,UAAW,OACXrE,UAAU,EACVrL,OAAQ,EAAK9G,MAAMuW,eAExBzY,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACVsW,UAAW,e,EAMvBU,sBAAwB,SAACpQ,GAErB,GAAIA,EAAOqQ,mBAAqBrQ,EAAOsQ,uBAGnC,OADA,EAAKlX,SAAS,CAAEwW,aAAc,+DACvB,EAGX,IAAM3P,EAAgB,IAAItH,KAAKqH,EAAOuM,eAEtC,GADoB,IAAI5T,KAAKqH,EAAOyM,aAClBxM,EAGd,OADA,EAAK7G,SAAS,CAAEwW,aAAc,gDACvB,EAGX,GAA+B,IAA3B5P,EAAOuQ,iBAGP,OADA,EAAKnX,SAAS,CAAEwW,aAAc,gCACvB,EAGX,IAAMtC,EAAUtM,SAAShB,EAAOuQ,kBAChC,GAAIjD,EAAU,GAAKA,EAAU,IAGzB,OADA,EAAKlU,SAAS,CAAEwW,aAAc,gDACvB,EAGX,GAA0B,IAAtB5P,EAAOwQ,YAGP,OADA,EAAKpX,SAAS,CAAEwW,aAAc,gCACvB,EAGX,IAAM7O,EAAcC,SAAShB,EAAOwQ,aACpC,QAAIzP,EAAc,GAAKA,EAAc,OAEjC,EAAK3H,SAAS,CAAEwW,aAAc,gDACvB,I,EAOftG,WAAa,WACT,EAAKlQ,SAAS,CAAEiS,UAAU,K,kEAI1B7R,KAAK6D,iB,+BAGC,IAAD,OAEC2C,EAASxG,KAAKN,MAAM8G,OAE1B,GAA8B,YAA1BxG,KAAKN,MAAM+P,YAEX,OACI,yBAAK1O,UAAU,eACX,yBAAKG,IAAKsM,KAAapM,IAAI,GAAGL,UAAU,4BAKpD,IAAM+R,EAAoB,IAAI3T,KAAKqH,EAAOuM,eACpCC,EAAkB,IAAI7T,KAAKqH,EAAOyM,aAEpCgE,EAAejX,KAAKuW,gBAAgBzD,EAAmBE,GAErDvM,EAAgBC,GAAgB3B,cAAc+N,GAC9CnM,EAAcD,GAAgB3B,cAAc,IAAI5F,KAAKqH,EAAOyM,cAC5D3N,EAAgBwN,EAAkB3M,UAAY,KAAO2M,EAAkB7M,WAAa,GAAK,IAAM6M,EAAkB/M,cAEjHmN,EAAaxM,GAAgBrB,kBAAkByN,EAAmBE,GAExE,GAAiC,WAA7BhT,KAAKN,MAAMyW,eAEX,OAAO,KAGX,GAAiC,SAA7BnW,KAAKN,MAAMyW,eAEX,OACI,yBAAKpV,UAAU,eACX,2BAAOC,GAAG,gBAAV,2DAKZ,IAAM4H,EAAmB5I,KAAKN,MAAMoE,UAAUS,KAAI,SAAAC,GAC9C,OACI,4BAAQC,IAAKD,EAAQqE,GAAI3I,MAAOsE,EAAQqE,IAAKrE,EAAQ1F,SAI7D,OAEI,yBAAKiC,UAAU,cAAcC,GAAG,sBAEJ,GAAvBhB,KAAKN,MAAMmS,UACR,6BACI,yBAAK9Q,UAAU,oBACX,2BAAOA,UAAU,0BAAjB,kBACA,2BAAOA,UAAU,yBAAyBuE,IAG9C,yBAAKvE,UAAU,gBACX,2BAAOA,UAAU,kBAAkBf,KAAKmN,eAAe3G,EAAOqQ,oBAC9D,2BAAO9V,UAAU,kBAAkB0F,IAGvC,yBAAK1F,UAAU,eACX,yBAAKG,IAAK2G,KAAYzG,IAAI,UAAOL,UAAU,gBAC3C,2BAAOA,UAAU,eAAemS,EAAhC,MAGJ,yBAAKnS,UAAU,cACX,2BAAOA,UAAU,uBAAuBf,KAAKmN,eAAe3G,EAAOsQ,yBACnE,2BAAO/V,UAAU,gBAAgB4F,IAGrC,yBAAK5F,UAAU,wBACX,yBAAKA,UAAU,eACX,2BAAOA,UAAU,2BAAjB,0BACA,2BAAOA,UAAU,qBAAqByF,EAAOuQ,mBAEjD,yBAAKhW,UAAU,cACX,2BAAOA,UAAU,eAAjB,qBACA,2BAAOA,UAAU,SAASyF,EAAOwQ,YAAjC,OAIS,aAAhBC,GACG,yBAAKlW,UAAU,kBACX,kBAAC,EAAD,CAAQC,GAAG,cAAcF,QAAS,kBAAI,EAAKlB,SAAS,CAACiS,UAAU,KAAQ5Q,KAAK,OAAOE,KAAM0P,OACzF,kBAAC,EAAD,CAAQ7P,GAAG,gBAAgBF,QAAS,kBAAI,EAAKlB,SAAS,CAAC6P,YAAa,WAAWxO,KAAK,gBAAgBE,KAAM2P,QAGjG,cAAhBmG,GACG,2BAAOlW,UAAU,iBAAjB,cAEa,UAAhBkW,GACG,2BAAOlW,UAAU,iBAAjB,WAMY,GAAvBf,KAAKN,MAAMmS,UACR,6BACI,yBAAK9Q,UAAU,yBACX,2BAAOA,UAAU,0BAAjB,kBACA,2BAAO6D,KAAK,iBAAiB5D,GAAG,yBAAyBhD,KAAK,gBAAgB+C,UAAU,eACpFb,MAAOF,KAAKN,MAAMuW,UAAUlD,cAAe5O,SAAUnE,KAAKkE,gBAGlE,yBAAKnD,UAAU,yBACX,2BAAOA,UAAU,+BAAjB,kBACA,4BAAQC,GAAG,8BAA8BD,UAAU,eAAeoD,SAAUnE,KAAKkE,aACjFhE,MAAOF,KAAKN,MAAMuW,UAAUY,kBAAmB7Y,KAAK,qBAC/C4K,IAIT,yBAAK7H,UAAU,kBACX,2BAAOA,UAAU,wBAAjB,gBACA,2BAAO6D,KAAK,iBAAiB5D,GAAG,uBAAuBhD,KAAK,cAAc+C,UAAU,eAChFb,MAAOF,KAAKN,MAAMuW,UAAUhD,YAAa9O,SAAUnE,KAAKkE,gBAGhE,yBAAKnD,UAAU,8BACX,2BAAOA,UAAU,oCAAjB,uBACA,4BAAQC,GAAG,mCAAmCD,UAAU,eAAeoD,SAAUnE,KAAKkE,aACtFhE,MAAOF,KAAKN,MAAMuW,UAAUa,uBAAwB9Y,KAAK,0BACpD4K,IAIT,yBAAK7H,UAAU,4BACX,2BAAOA,UAAU,kCAAjB,sBACA,2BAAO6D,KAAK,OAAO5D,GAAG,iCAAiChD,KAAK,cAAc+C,UAAU,eAChFb,MAAOF,KAAKN,MAAMuW,UAAUe,YAAa7S,SAAUnE,KAAKkE,gBAGhE,yBAAKnD,UAAU,iCACX,2BAAOA,UAAU,kCAAjB,2BACA,2BAAO6D,KAAK,OAAO5D,GAAG,iCAAiChD,KAAK,mBAAmB+C,UAAU,eACrFb,MAAOF,KAAKN,MAAMuW,UAAUc,iBAAkB5S,SAAUnE,KAAKkE,gBAGrE,kBAAC,EAAD,CAAQlD,GAAG,SAASF,QAAUd,KAAK8P,WAAa7O,KAAK,SAASE,KAAMwP,OACpE,kBAAC,EAAD,CAAQ3P,GAAG,OAAOF,QAASd,KAAK2W,aAAc1V,KAAK,OAAOE,KAAMyP,OAEvC,YAAxB5Q,KAAKN,MAAMwW,WACR,yBAAKhV,IAAKsM,KAAapM,IAAI,GAAGL,UAAU,yBAMpD,kBAAC,KAAD,CACIyB,KAAgC,SAA1BxC,KAAKN,MAAM+P,YACjB5E,YAAU,EACVC,aAAW,EACXC,aAAW,EACXtI,MAAM,oBACNC,UAAW1C,KAAKqW,mBAChBrL,SAAU,WAAK,EAAKpL,SAAS,CAAC6P,YAAa,WAP/C,gDAaA,kBAAC,KAAD,CACItT,OAAK,EACLqG,KAAiC,IAA3BxC,KAAKN,MAAM0W,aACjBtL,aAAW,EACXC,aAAW,EACXtI,MAAOzC,KAAKN,MAAM0W,aAClB1T,UAAW,kBAAI,EAAK9C,SAAS,CAACwW,aAAc,QAKhD,kBAAC,KAAD,CACIja,OAAK,EACLqG,KAA8B,SAAxBxC,KAAKN,MAAMwW,UACjBpL,aAAW,EACXC,aAAW,EACXtI,MAAM,+CACNC,UAAW,kBAAI,EAAK9C,SAAS,CAACsW,UAAW,YAIlB,SAA1BlW,KAAKN,MAAM+P,aACR,2BAAOzO,GAAG,uBAAV,sD,GAxVUV,aCJxB4W,I,kNAEFxX,MAAQ,CACJsH,QAAS,GACTuM,aAAc,UACd4D,iBAAkB,EAClBC,aAAa,EACb,wBAAyB,GACzB,sBAAuB,I,EAG3B3O,YAAcxL,IAAMwL,Y,EACpBC,OAAS,EAAKD,YAAYC,S,EAI1B2O,kB,sBAAoB,sBAAAtX,EAAA,sEAEV9C,IAAM,CACR6M,IlCcwBrN,kDkCbxBuC,QAASa,EAAYd,gBAAgBC,QACrCsP,YAAa,EAAK5F,OAAO6F,QAC1BpR,MAAK,SAACM,GACL,EAAKmC,SAAS,CACVoH,QAASvJ,EAASnB,KAClBiX,aAAc,cAEnB/V,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACV2T,aAAc,aAdN,2C,EAoBpB+D,aAAe,SAAC7P,EAAUiH,GACtBzR,IAAM,CACF0R,OAAQ,SACR7E,IAAKyN,iDAAwB9P,EAC7BzI,QAASa,EAAYd,gBAAgBC,UACtC7B,MAAK,WACJ,EAAKqa,qBAAqB/P,MAC3BjK,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/BuS,Q,EAKR8I,qBAAuB,SAAC/P,GACpB,IAAIgQ,EAAiB,GACrB,EAAK/X,MAAMsH,QAAQ+H,SAAQ,SAAAvI,GACnBA,EAAOqC,IAAMpB,GACbgQ,EAAezI,KAAKxI,MAE5B,EAAK5G,SAAS,CAACoH,QAASyQ,GACpB,EAAKC,a,EAIbxT,aAAe,SAACrD,GACZ,EAAKjB,SAAL,gBACKiB,EAAEkJ,OAAO/I,GAAKH,EAAEkJ,OAAO7J,OACzB,EAAKwX,a,EAIZC,aAAe,SAAC9W,GACUA,EAAEkJ,OAAO6N,aAAe/W,EAAEkJ,OAAO8N,cAAgBhX,EAAEkJ,OAAO+N,WAG5E,EAAKlY,SAAS,CAACuX,iBAAkB,EAAKzX,MAAMyX,iBAAmB,K,kEAKnEnX,KAAKqX,sB,6CAILrX,KAAK0I,OAAO6B,W,+BAGN,IAAD,OACL,GAA+B,WAA3BvK,KAAKN,MAAM6T,aAEX,OACI,yBAAKrS,IAAKsJ,KAAapJ,IAAI,GAAGL,UAAU,sBAGhD,GAA+B,SAA3Bf,KAAKN,MAAM6T,aAEX,OACI,yBAAKxS,UAAU,mBACX,yBAAKG,IAAK6F,KAAW3F,IAAI,QAAQL,UAAU,eAC3C,wBAAIA,UAAU,iBAAd,gDAKZ,IAQIgX,EANEC,EAAmBhY,KAAKN,MAAMsH,QAAQsG,QAAO,SAAC9G,EAAQyR,GACxD,OAAQA,EAAoC,GAA5B,EAAKvY,MAAMyX,oBAC5B5S,KAAI,SAAAiC,GACH,OAAO,kBAAC,GAAD,CAAiBA,OAAQA,EAAQ/B,IAAK+B,EAAOqC,GAAIyH,WAAY,EAAKgH,kBAe7E,OAVIU,EAAiB/Q,QAAUjH,KAAKN,MAAMsH,QAAQC,SAE9C8Q,EAAY,qBAAiB/X,KAAKN,MAAMsH,QAAQC,OAApC,cAGZ+Q,EAAiB/Q,OAASjH,KAAKN,MAAMsH,QAAQC,SAE7C8Q,EAAY,qBAAiBC,EAAiB/Q,OAAlC,mBAAmDjH,KAAKN,MAAMsH,QAAQC,OAAtE,cAIZ,yBAAKjG,GAAG,4BAEJ,uBAAGD,UAAU,eAAeC,GAAG,+BAA/B,oDAEI,yBAAKE,IAAK8S,KAAUvR,MAzBnB,+DAyBgCrB,IAAI,GAAGL,UAAU,eAGxB,UAA3Bf,KAAKN,MAAM6T,cAAyD,GAA7BvT,KAAKN,MAAMsH,QAAQC,QACzD,2BAAOjG,GAAG,iBAAiB+W,GAGD,GAA7B/X,KAAKN,MAAMsH,QAAQC,QAChB,2BAAOjG,GAAG,sBAAV,uBAGJ,yBAAKA,GAAG,uBAAuBD,UAAU,YAAYmX,SAAUlY,KAAK2X,cAC/DK,EACAA,EAAiB/Q,QAAUjH,KAAKN,MAAMsH,QAAQC,QAC3C,yBAAK/F,IAAKsJ,KAAapJ,IAAI,GAAGJ,GAAG,yB,GA5I7BV,cAqJ5B4W,GAAcpU,YAAcxD,EAEb4X,UCjJTiB,G,4MAEFzY,MAAQ,CACJ2M,QAAS,EAAK3K,QAAQvD,SAASF,KAC/B2T,WAAY,EAAKlQ,QAAQvD,SAASF,KAClC6F,UAAW,UACX+N,UAAU,EACViD,iBAAiB,EACjBvF,YAAa,Q,EAGjB9G,YAAcxL,IAAMwL,Y,EACpBC,OAAS,EAAKD,YAAYC,S,EAG1B7E,a,sBAAe,4BAAA9D,EAAA,sEAEW4I,GAAiB9E,eAF5B,OAGM,OADbC,EAFO,QAKP,EAAKlE,SAAS,CACVkE,UAAWA,IAKf,EAAKlE,SAAS,CAAEkE,UAAW,UAXpB,2C,EAgBfkR,eAAiB,WACb,EAAKpV,SAAS,CACViS,UAAU,EACVxC,YAAa,EAAK3P,MAAM2M,W,EAKhCnI,aAAe,SAACrD,GACZ,IAAIiR,EAAelC,OAAOC,OAAO,GAAI,EAAKnQ,MAAMkS,YAChDE,EAAajR,EAAEkJ,OAAO/I,IAAMH,EAAEkJ,OAAO7J,MACrC,EAAKN,SAAS,CACVgS,WAAYE,K,EAKpBE,uBAAyB,SAAC3F,GACtB,MAAoB,IAAhBA,EAAQvN,MACS,IAAjBuN,EAAQqB,OACY,IAApBrB,EAAQyB,U,EAShBsK,qBAAuB,WACd,EAAKpG,uBAAuB,EAAKtS,MAAMkS,aAQ5C,EAAKhS,SAAS,CACV2P,YAAa,YAGjBtS,IAAM,CACF0R,OAAQ,MACR7E,InCnD2BrN,yDmCoD3BuC,QAASa,EAAYd,gBAAgBC,QACrC1C,KAAM,EAAKoD,MAAMkS,aAClBzU,MAAK,WACJ,EAAK+X,oBACN1X,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACV2P,YAAa,cApBjB,EAAK3P,SAAS,CACVkV,iBAAiB,K,EAyB7BI,eAAiB,WACb,IAAImD,EAAiB,EAAK3Y,MAAMkS,WAAW9D,SACvCwK,EAAiB,EAAK5Y,MAAMkS,WAAW7D,SACvC,EAAKrM,QAAQ5B,eAAe,CAACuY,EAAgBC,IAE7C,EAAK1Y,SAAS,CACVyM,QAAS,EAAK3M,MAAMkS,WACpBrC,YAAa,UACbsC,UAAU,GACX,EAAK0G,gBAIR,EAAK3Y,SAAS,CACVyM,QAAS,EAAK3M,MAAMkS,WACpBrC,YAAa,mBACbsC,UAAU,K,EAMtB6C,qBAAuB,SAACN,GACpB,IAAItC,EAAelC,OAAOC,OAAO,GAAI,EAAKnQ,MAAMkS,YAChDE,EAAa/D,SAAWqG,EACxB,EAAKxU,SAAS,CACVgS,WAAYE,IAEhB,EAAKoD,kB,EAIT/H,eAAiB,SAACnM,GAId,OAHc,EAAKtB,MAAMoE,UAAUsJ,MAAK,SAAA5I,GACpC,OAAOA,EAAQqE,IAAM7H,KAEVlC,M,kEAIfkB,KAAK6D,iB,6CAIL7D,KAAK0I,OAAO6B,W,+BAGN,IAAD,OAEC8B,EAAUrM,KAAKN,MAAM2M,QAC3B,MAA4B,WAAxBrM,KAAKN,MAAMoE,UAGP,yBAAK5C,IAAKsJ,KAAapJ,IAAI,aAAaL,UAAU,sBAI9B,SAAxBf,KAAKN,MAAMoE,UAGP,yBAAK/C,UAAU,mBACX,yBAAKG,IAAK6F,KAAW3F,IAAI,QAAQL,UAAU,eAC3C,wBAAIA,UAAU,iBAAd,iDAKR,yBAAKC,GAAG,6BACJ,wBAAIA,GAAG,2BAAP,mBACA,yBAAKA,GAAG,mBAKJ,yBAAKA,GAAG,0BAA0BD,UAAU,kBAExC,yBAAKC,GAAG,WAAWD,UAAU,cACzB,2BAAOC,GAAG,WAAWD,UAAU,SAA/B,eACEf,KAAKN,MAAMmS,UACT,2BAAO7Q,GAAG,WAAWD,UAAU,QAAQsL,EAAQvN,MAElDkB,KAAKN,MAAMmS,UACR,2BAAOjN,KAAK,OAAO5D,GAAG,OAAOD,UAAU,WAAW2P,aAAcrE,EAAQvN,KAAMqF,SAAUnE,KAAKkE,gBAIrG,yBAAKlD,GAAG,YAAYD,UAAU,cAC1B,2BAAOC,GAAG,YAAYD,UAAU,SAAhC,gBACEf,KAAKN,MAAMmS,UACT,2BAAO7Q,GAAG,YAAYD,UAAU,QAAQsL,EAAQqB,OAEnD1N,KAAKN,MAAMmS,UACR,2BAAOjN,KAAK,OAAO5D,GAAG,QAAQD,UAAU,YAAY2P,aAAcrE,EAAQqB,MAAOvJ,SAAUnE,KAAKkE,gBAIxG,yBAAKlD,GAAG,cAAcD,UAAU,cAC5B,2BAAOC,GAAG,cAAcD,UAAU,SAAlC,kBACEf,KAAKN,MAAMmS,UACT,2BAAO7Q,GAAG,cAAcD,UAAU,QAAQf,KAAKmN,eAAenN,KAAKN,MAAM2M,QAAQ2B,cAEpFhO,KAAKN,MAAMmS,UACR,4BAAQ7Q,GAAG,cAAcD,UAAU,iBAAiBoD,SAAUnE,KAAKkE,aAAchE,MAAOmM,EAAQ2B,aAC3FhO,KAAKN,MAAMoE,UAAUS,KAAI,SAAAC,GAAO,OAAI,4BAAQC,IAAKD,EAAQqE,GAAI3I,MAAOsE,EAAQqE,IAAKrE,EAAQ1F,YAQ1G,yBAAKkC,GAAG,2BAA2BD,UAAU,kBAEzC,yBAAKC,GAAG,gBAAgBD,UAAU,cAC9B,2BAAOC,GAAG,gBAAgBD,UAAU,SAApC,oBACEf,KAAKN,MAAMmS,UACT,2BAAO7Q,GAAG,gBAAgBD,UAAU,QAAQsL,EAAQyB,UAEvD9N,KAAKN,MAAMmS,UACR,2BAAOjN,KAAK,OAAO5D,GAAG,WAAWD,UAAU,gBAAgB2P,aAAcrE,EAAQyB,SAAU3J,SAAUnE,KAAKkE,gBAIlH,yBAAKlD,GAAG,eAAeD,UAAU,cAC7B,kBAAC,GAAD,CAAgB0T,SAAS,UAAUC,qBAAsB1U,KAAK0U,2BAOxE1U,KAAKN,MAAMmS,UACT,kBAAC,EAAD,CAAQ7Q,GAAG,mBAAmBC,KAAK,OAAOE,KAAM0P,KAAU/P,QAAS,kBAAI,EAAKlB,SAAS,CAACiS,UAAU,OAEnG7R,KAAKN,MAAMmS,UACR,yBAAK9Q,UAAU,oBACX,kBAAC,EAAD,CAAQC,GAAG,qBAAqBC,KAAK,SAASE,KAAMwP,KAAY7P,QAASd,KAAKgV,iBAC9E,kBAAC,EAAD,CAAQhU,GAAG,mBAAmBC,KAAK,OAAOE,KAAMyP,KAAU9P,QAASd,KAAKoY,uBAC7C,WAA1BpY,KAAKN,MAAM6P,aACR,yBAAKrO,IAAKsM,KAAapM,IAAI,GAAGL,UAAU,yBAKpD,kBAAC,KAAD,CACI6T,SAAO,EACPpS,KAAMxC,KAAKN,MAAMoV,gBACjBhK,aAAW,EACXC,aAAW,EACXtI,MAAM,6BACNC,UAAW,kBAAM,EAAK9C,SAAS,CAACkV,iBAAiB,OAIrD,kBAAC,KAAD,CACI3Y,OAAK,EACLqG,KAAgC,SAA1BxC,KAAKN,MAAM6P,YACjBzE,aAAW,EACXC,aAAW,EACXtI,MAAM,6CACNC,UAAW,kBAAM,EAAK9C,SAAS,CAAC2P,YAAa,YAIjD,kBAAC,KAAD,CACIpT,OAAK,EACLqG,KAAgC,oBAA1BxC,KAAKN,MAAM6P,YACjBzE,aAAW,EACXC,aAAW,EACXtI,MAAM,oDACNC,UAAW,kBAAM,EAAK9C,SAAS,CAAC2P,YAAa,WANjD,2D,GA7PajP,aA6Q7B6X,GAAerV,YAAcxD,EAEd6Y,UClRTK,G,4MAEF9Y,MAAQ,CACJ8G,OAAQ,GACR1C,UAAW,UACX2U,YAAa,OACbrC,aAAc,I,EAIlBsC,iBAAmB,WACf,IAAMlS,EAAS,CACXqC,GAAI,EACJ8P,iBAAkB,EAAKjX,QAAQvD,SAASF,KAAK4K,GAC7CgO,kBAAmB,GACnBC,uBAAwB,GACxB/D,cAAe,GACfE,YAAa,GACb8D,iBAAkB,GAClBC,YAAa,IAEjB,EAAKpX,SAAS,CAAC4G,OAAQA,K,EAI3B3C,a,sBAAe,4BAAA9D,EAAA,sEAEW4I,GAAiB9E,eAF5B,OAGM,OADbC,EAFO,QAKP,EAAKlE,SAAS,CACVkE,UAAWA,IAKf,EAAKlE,SAAS,CAAEkE,UAAW,UAXpB,2C,EAgBfI,aAAe,SAACrD,GACZ,IAAI6V,EAAc9G,OAAOC,OAAO,GAAI,EAAKnQ,MAAM8G,QAC/CkQ,EAAY7V,EAAEkJ,OAAO/L,MAAQ6C,EAAEkJ,OAAO7J,MACtC,EAAKN,SAAS,CACV4G,OAAQkQ,K,EAKhBkC,aAAe,WACN,EAAKhC,0BAKV,EAAKhX,SAAS,CACV6Y,YAAa,YAGjBxb,IAAM,CACF0R,OAAQ,OACR7E,IpC/BmBrN,gDoCgCnBuC,QAASa,EAAYd,gBAAgBC,QACrC1C,KAAM,EAAKoD,MAAM8G,SAClBrJ,MAAK,WACJ,EAAKyC,SAAS,CAAC6Y,YAAa,YAC5B,EAAKC,sBACNlb,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACV6Y,YAAa,e,EAMzB7B,sBAAwB,WAEpB,IAAMpQ,EAAS,EAAK9G,MAAM8G,OAE1B,GAAIA,EAAOqQ,mBAAqBrQ,EAAOsQ,uBAGnC,OADA,EAAKlX,SAAS,CAAEwW,aAAc,+DACvB,EAGX,GAAgC,IAA5B5P,EAAOqQ,mBAA4D,IAAjCrQ,EAAOsQ,wBACd,IAA3BtQ,EAAOuQ,kBAAgD,IAAtBvQ,EAAOwQ,aAChB,IAAxBxQ,EAAOuM,eAA6C,IAAtBvM,EAAOyM,YAGrC,OADA,EAAKrT,SAAS,CAAEwW,aAAc,+BACvB,EAGX,IAAM3P,EAAgB,IAAItH,KAAKqH,EAAOuM,eAEtC,GAAItM,EAAgB,IAAItH,KAGpB,OADA,EAAKS,SAAS,CAAEwW,aAAc,2CACvB,EAGX,IAAMzP,EAAc,IAAIxH,KAAKqH,EAAOyM,aAEpC,GAAItM,EAAc,IAAIxH,KAGlB,OADA,EAAKS,SAAS,CAAEwW,aAAc,yCACvB,EAGX,GAAIzP,EAAcF,EAGd,OADA,EAAK7G,SAAS,CAAEwW,aAAc,gDACvB,EAGX,IAAMtC,EAAUtM,SAAShB,EAAOuQ,kBAChC,GAAIjD,EAAU,GAAKA,EAAU,IAGzB,OADA,EAAKlU,SAAS,CAAEwW,aAAc,gDACvB,EAGX,IAAM7O,EAAcC,SAAShB,EAAOwQ,aACpC,QAAIzP,EAAc,GAAKA,EAAc,OAEjC,EAAK3H,SAAS,CAAEwW,aAAc,gDACvB,I,kEAOXpW,KAAK6D,eACL7D,KAAK0Y,qB,+BAGC,IAAD,OAEL,GAA4B,WAAxB1Y,KAAKN,MAAMoE,UAEX,OACI,yBAAK5C,IAAKsM,KAAapM,IAAI,aAAaL,UAAU,sBAI1D,GAA4B,SAAxBf,KAAKN,MAAMoE,UAEX,OACI,yBAAK/C,UAAU,mBACX,yBAAKG,IAAK6F,KAAW3F,IAAI,QAAQL,UAAU,eAC3C,wBAAIA,UAAU,iBAAd,iDAKZ,IAAI6H,EAAmB5I,KAAKN,MAAMoE,UAAUS,KAAI,SAAAC,GAC5C,OACI,4BAAQC,IAAKD,EAAQqE,GAAI3I,MAAOsE,EAAQqE,IAAKrE,EAAQ1F,SAK7D,OAFA8J,EAAiBiQ,QAAQ,4BAAQpU,IAAK,EAAGvE,MAAM,IAAI,eAG/C,yBAAKc,GAAG,2BACJ,wBAAIA,GAAG,yBAAP,uBACA,yBAAKA,GAAG,iBAGJ,yBAAKA,GAAG,6BAA6BD,UAAU,kBAE3C,yBAAKC,GAAG,uBAAuBD,UAAU,cACrC,2BAAOC,GAAG,8BAAV,wBACA,4BAAQA,GAAG,6BAA6BD,UAAU,eAAeoD,SAAUnE,KAAKkE,aAChFhE,MAAOF,KAAKN,MAAM8G,OAAOqQ,kBAAmB7Y,KAAK,qBAC5C4K,IAIT,yBAAK5H,GAAG,0BAA0BD,UAAU,cACxC,2BAAOC,GAAG,iCAAV,wBACA,2BAAO4D,KAAK,iBAAiB5D,GAAG,gCAAgChD,KAAK,gBAAgB+C,UAAU,eAC3Fb,MAAOF,KAAKN,MAAM8G,OAAOuM,cAAe5O,SAAUnE,KAAKkE,gBAG/D,yBAAKlD,GAAG,+BAA+BD,UAAU,cAC7C,2BAAOC,GAAG,sCAAV,2BACA,2BAAO4D,KAAK,OAAO5D,GAAG,qCAAqChD,KAAK,mBAAmB+C,UAAU,eACzFb,MAAOF,KAAKN,MAAM8G,OAAOuQ,iBAAkB5S,SAAUnE,KAAKkE,iBAMtE,yBAAKlD,GAAG,2BAA2BD,UAAU,kBAEzC,yBAAKC,GAAG,4BAA4BD,UAAU,cAC1C,2BAAOC,GAAG,mCAAV,6BACA,4BAAQA,GAAG,kCAAkCD,UAAU,eAAeoD,SAAUnE,KAAKkE,aACrFhE,MAAOF,KAAKN,MAAM8G,OAAOsQ,uBAAwB9Y,KAAK,0BACjD4K,IAIT,yBAAK5H,GAAG,wBAAwBD,UAAU,cACtC,2BAAOC,GAAG,+BAAV,sBACA,2BAAO4D,KAAK,iBAAiB5D,GAAG,8BAA8BhD,KAAK,cAAc+C,UAAU,eACvFb,MAAOF,KAAKN,MAAM8G,OAAOyM,YAAa9O,SAAUnE,KAAKkE,gBAG7D,yBAAKlD,GAAG,6BAA6BD,UAAU,cAC3C,2BAAOC,GAAG,oCAAV,sBACA,2BAAO4D,KAAK,OAAO5D,GAAG,mCAAmChD,KAAK,cAAc+C,UAAU,eAClFb,MAAOF,KAAKN,MAAM8G,OAAOwQ,YAAa7S,SAAUnE,KAAKkE,kBAOrE,yBAAKnD,UAAU,yBACX,kBAAC,EAAD,CAAQC,GAAG,eAAeC,KAAK,eAAeE,KAAMwP,KAAY7P,QAASd,KAAK0Y,mBAC9E,kBAAC,EAAD,CAAQ1X,GAAG,oBAAoBC,KAAK,OAAOE,KAAMyP,KAAU9P,QAASd,KAAK4Y,eAC9C,WAA1B5Y,KAAKN,MAAM+Y,aACR,yBAAKzX,GAAG,yBAEe,WAA1BhB,KAAKN,MAAM+Y,aACR,yBAAKvX,IAAKsM,KAAapM,IAAI,GAAGkU,MAAM,yBAK5C,kBAAC,KAAD,CACIV,SAAO,EACPpS,KAAiC,IAA3BxC,KAAKN,MAAM0W,aACjBtL,aAAW,EACXC,aAAW,EACXtI,MAAOzC,KAAKN,MAAM0W,aAClB1T,UAAW,kBAAI,EAAK9C,SAAS,CAACwW,aAAc,QAIhD,kBAAC,KAAD,CACI7T,SAAO,EACPC,KAAgC,WAA1BxC,KAAKN,MAAM+Y,YACjB3N,aAAW,EACXC,aAAW,EACXtI,MAAM,kDACNC,UAAW,kBAAM,EAAK9C,SAAS,CAAC6Y,YAAa,YAIjD,kBAAC,KAAD,CACItc,OAAK,EACLqG,KAAgC,SAA1BxC,KAAKN,MAAM+Y,YACjB3N,aAAW,EACXC,aAAW,EACXtI,MAAM,4CACNC,UAAW,kBAAM,EAAK9C,SAAS,CAAC6Y,YAAa,iB,GApQtCnY,aA6Q3BkY,GAAa1V,YAAcxD,EAEZkZ,UCrRTM,G,4MAEFpZ,MAAQ,CACJ6S,gBAAiB,kB,EAGrBrO,aAAe,SAACrD,GACZ,EAAKjB,SAAS,CACV2S,gBAAiB1R,EAAEkJ,OAAO7J,S,uDAK9B,IAAMkD,EAAiB,CACnBoP,WAAY,IACZC,gBAAiB,2BAErB,OACI,yBAAK1R,UAAU,kBACX,yBAAKA,UAAU,gBAAf,uBAEMmB,EAAY3B,gBACV,6BAEI,yBAAKQ,UAAU,aACX,kBAAC,IAAD,CAASA,UAAU,mBAAmBwC,YAAaH,EAAgBT,GAAG,6BAAtE,cACA,kBAAC,IAAD,CAAS5B,UAAU,mBAAmBwC,YAAaH,EAAgBT,GAAG,4BAAtE,gBACA,kBAAC,IAAD,CAAS5B,UAAU,mBAAmBwC,YAAaH,EAAgBT,GAAG,8BAAtE,oBAGJ,yBAAK5B,UAAU,aACP,kBAAC,IAAD,KACI,kBAAC,IAAD,CAAO4J,KAAK,4BAA4B+H,UAAWwE,KACnD,kBAAC,IAAD,CAAOvM,KAAK,2BAA2B+H,UAAW8F,KAClD,kBAAC,IAAD,CAAO7N,KAAK,6BAA6B+H,UAAWyF,MAGvC,cAAnBnY,KAAKI,MAAMuK,MACT,kBAAC,IAAD,CAAUhI,GAAG,gCAM5BT,EAAY3B,gBACT,6BAEI,4BAAQS,GAAG,qBAAqBD,UAAU,0BAA0BoD,SAAUnE,KAAKkE,aAAchE,MAAOF,KAAKN,MAAM6S,iBAC/G,4BAAQ9N,IAAI,IAAIvE,MAAM,kBAAtB,cACA,4BAAQuE,IAAI,IAAIvE,MAAM,iBAAtB,gBACA,4BAAQuE,IAAI,IAAIvE,MAAM,mBAAtB,oBAG2B,kBAA9BF,KAAKN,MAAM6S,iBACR,kBAAC,IAAD,CAAU5P,GAAG,8BAGc,iBAA9B3C,KAAKN,MAAM6S,iBACR,kBAAC,IAAD,CAAU5P,GAAG,6BAGc,mBAA9B3C,KAAKN,MAAM6S,iBACR,kBAAC,IAAD,CAAU5P,GAAG,+BAIjB,yBAAK5B,UAAU,oBACP,kBAAC,IAAD,KACI,kBAAC,IAAD,CAAO4J,KAAK,4BAA4B+H,UAAWwE,KACnD,kBAAC,IAAD,CAAOvM,KAAK,2BAA2B+H,UAAW8F,KAClD,kBAAC,IAAD,CAAO7N,KAAK,6BAA6B+H,UAAWyF,MAGvC,cAAnBnY,KAAKI,MAAMuK,MACT,kBAAC,IAAD,CAAUhI,GAAG,qC,GA1E3BrC,aAqFtBwY,GAAQhW,YAAcxD,EAEPwZ,UCxFTC,I,8KAGE,IAAM9a,EAAO+B,KAAK0B,QAClB,MAA0B,YAAtBzD,EAAKE,SAASJ,KAGV,kBAAC,GAAD,CAAU4M,KAAM3K,KAAKI,MAAMkJ,QAAQC,SAASyP,WAGrB,kBAAtB/a,EAAKE,SAASJ,KAGf,kBAAC,GAAD,CAAS4M,KAAM3K,KAAKI,MAAMkJ,QAAQC,SAASyP,WAGpB,iBAAtB/a,EAAKE,SAASJ,KAGf,kBAAC,GAAD,CAAO4M,KAAM3K,KAAKI,MAAMkJ,QAAQC,SAASyP,WAQzC,kBAAC,IAAD,CAAUrW,GAAG,U,GA3BNrC,cAiCvByY,GAASjW,YAAcxD,EAERyZ,UC/BTE,I,mNAKFvZ,MAAQ,CACJmW,WAAY,GACZC,gBAAiB,GACjBC,aAAc,GACdxC,aAAc,UACd2F,cAAe,Q,EAKnBC,oBAAsB,WAClB,IAEIC,EAFc,EAAKhZ,MAAMkJ,QAAQC,SAASC,OAChBC,MAAM,KACNlF,KAAI,SAACmF,GAC/B,OAAOA,EAAMD,MAAM,KAAK,MAG5B,EAAK7J,SAAS,CAAEiW,WAAYuD,EAAY,KAElB,WAAlBA,EAAY,GAEZ,EAAKhQ,WAAWgQ,EAAY,IAI5B,EAAKhQ,WAAWgQ,EAAY,GAAIA,EAAY,K,EAKpDhQ,W,uCAAa,WAAOc,EAAmBC,GAA1B,SAAApK,EAAA,sEAEH9C,IAAM+G,IAAItH,EAAmB,IAAMwN,GACvC/M,MAAK,SAACM,GACJ,EAAKmC,SAAS,CACVkW,gBAAiBrY,EAASnB,UAE/BkB,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACV2T,aAAc,aAVb,UAea,MAAlBpJ,EAfK,gCAiBClN,IAAM+G,IAAItH,EAAmB,IAAMyN,GACvChN,MAAK,SAACM,GACJ,EAAKmC,SAAS,CACVmW,aAActY,EAASnB,UAE5BkB,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/B,EAAKyD,SAAS,CACV2T,aAAc,aAzBjB,OA8BT,EAAK3T,SAAS,CACV2T,aAAc,WA/BT,2C,0DAoCb7L,U,sBAAY,sBAAA3H,EAAA,yDAEH,EAAKsZ,uBAFF,wDAKR,EAAKzZ,SAAS,CAACsZ,cAAe,YALtB,SAOFjc,IAAM,CACR0R,OAAQ,OACR7E,IAAKjN,EAAoB,IAAM,EAAK6C,MAAMoW,gBAAgBjN,GAC1D7J,QAASa,EAAYd,gBAAgBC,UACtC7B,MAAK,eACLK,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/B,IAG6C,kDAArCA,EAAMsB,SAASnB,KAAKgd,cACpB,EAAK1Z,SAAS,CAACsZ,cAAe,sBAE9B,EAAKtZ,SAAS,CAACsZ,cAAe,UAEtC,SAEI,EAAKtZ,SAAS,CAACsZ,cAAe,cAxB9B,UA6BuB,IAA3B,EAAKxZ,MAAMqW,aA7BP,gCA+BE9Y,IAAM,CACR0R,OAAQ,OACR7E,IAAKjN,EAAoB,IAAM,EAAK6C,MAAMqW,aAAalN,GACvD7J,QAASa,EAAYd,gBAAgBC,UACtC7B,MAAK,eACLK,OAAM,SAACrB,GACNuB,EAAaxB,kBAAkBC,GAC/B,IAE6C,kDAArCA,EAAMsB,SAASnB,KAAKgd,cACpB,EAAK1Z,SAAS,CAACsZ,cAAe,sBAE9B,EAAKtZ,SAAS,CAACsZ,cAAe,UAEtC,SAEI,EAAKtZ,SAAS,CAACsZ,cAAe,cA/ClC,OAoDRrX,YAAW,WACyB,WAA5B,EAAKnC,MAAMwZ,eACX,EAAKtZ,SAAS,CAACsZ,cAAe,WACpC,KAvDM,2C,EA2DZG,qBAAuB,WAEnB,MAAkC,YAA9B,EAAK3X,QAAQvD,SAASJ,OAMtB,EAAK6B,SAAS,CAACsZ,cAAe,mBACvB,I,EAOfK,mBAAqB,WAEjB,IAAI3D,EAAS,CACTC,WAAY,EAAKnW,MAAMmW,WACvBC,gBAAiB,EAAKpW,MAAMoW,gBAAgBjN,GAC5CkN,aAAc,EAAKrW,MAAMqW,aAAalN,IAG1CvL,aAAaC,QAAQ,SAAUa,KAAKob,UAAU5D,IAE9C,EAAKhW,SAAS,CAACsZ,cAAe,yB,kEAI9BlZ,KAAKmZ,wB,+BAGC,IAAD,OAEL,GAA+B,WAA3BnZ,KAAKN,MAAM6T,cAAyD,WAA5BvT,KAAKN,MAAMwZ,cAEnD,OACI,yBAAKhY,IAAKsJ,KAAapJ,IAAI,GAAGJ,GAAG,wBAIzC,GAA+B,SAA3BhB,KAAKN,MAAM6T,aAEX,OACI,yBAAKxS,UAAU,0BACX,yBAAKA,UAAU,mBACX,yBAAKG,IAAK6F,KAAW3F,IAAI,QAAQL,UAAU,eAC3C,wBAAIA,UAAU,iBAAd,kDAOhB,IACI0Y,EAGAC,EACAC,EACAC,EACAC,EAPAC,EAAY9Z,KAAKN,MAAMoW,gBAwB3B,MAf6B,WAAzB9V,KAAKN,MAAMmW,YAEX6D,EAAmB,kBACnBE,EAAkB,SAClBC,EAAsB,uDAItBH,EAAmB,oBACnBD,EAAYzZ,KAAKN,MAAMqW,aACvB4D,EAAuBnS,SAASsS,EAAU9C,aAAexP,SAASiS,EAAUzC,aAC5E4C,EAAkB,UAClBC,EAAsB,uEAItB,yBAAK7Y,GAAG,4BAA4BD,UAAU,0BAE1C,wBAAIC,GAAG,oBAAP,mBAGA,yBAAKD,UAAU,iBAAiBC,GAAG,uBAE/B,wBAAID,UAAU,kBAAkB2Y,GAEhC,yBAAK1Y,GAAG,6BAA6BD,UAAU,qBAC3C,2BAAOC,GAAG,wBAAwBD,UAAU,SAA5C,yBACA,2BAAOC,GAAG,wBAAwBD,UAAU,QAAQ+Y,EAAU3G,iBAElE,yBAAKnS,GAAG,4BAA4BD,UAAU,qBAC1C,2BAAOC,GAAG,uBAAuBD,UAAU,SAA3C,cACA,2BAAOC,GAAG,uBAAuBD,UAAU,QAAQ+Y,EAAU1G,gBAEjE,yBAAKpS,GAAG,iCAAiCD,UAAU,qBAC/C,2BAAOC,GAAG,4BAA4BD,UAAU,SAAhD,YACA,2BAAOC,GAAG,4BAA4BD,UAAU,QAAQ+Y,EAAUzG,qBAEtE,yBAAKrS,GAAG,+BAA+BD,UAAU,qBAC7C,2BAAOC,GAAG,0BAA0BD,UAAU,SAA9C,mBACA,2BAAOC,GAAG,0BAA0BD,UAAU,QAAQ2F,GAAgBb,2BAA2BiU,EAAU/G,iBAE/G,yBAAK/R,GAAG,6BAA6BD,UAAU,qBAC3C,2BAAOC,GAAG,wBAAwBD,UAAU,SAA5C,iBACA,2BAAOC,GAAG,wBAAwBD,UAAU,QAAQ2F,GAAgBb,2BAA2BiU,EAAU7G,eAEnF,aAAzBjT,KAAKN,MAAMmW,YACR,yBAAK7U,GAAG,2BAA2BD,UAAU,qBACzC,2BAAOC,GAAG,sBAAsBD,UAAU,SAA1C,sBACA,2BAAOC,GAAG,sBAAsBD,UAAU,QAAQ+Y,EAAU9C,YAA5D,OAOc,aAAzBhX,KAAKN,MAAMmW,YACR,yBAAK5J,MAAO,CAACvH,QAAS,iBAElB,yBAAK3D,UAAU,mBAEf,yBAAKA,UAAU,iBAAiBC,GAAG,sBAE/B,wBAAID,UAAU,kBAAd,kBAEA,yBAAKC,GAAG,6BAA6BD,UAAU,qBAC3C,2BAAOC,GAAG,wBAAwBD,UAAU,SAA5C,yBACA,2BAAOC,GAAG,wBAAwBD,UAAU,QAAQ0Y,EAAUtG,iBAElE,yBAAKnS,GAAG,4BAA4BD,UAAU,qBAC1C,2BAAOC,GAAG,uBAAuBD,UAAU,SAA3C,cACA,2BAAOC,GAAG,uBAAuBD,UAAU,QAAQ0Y,EAAUrG,gBAEjE,yBAAKpS,GAAG,iCAAiCD,UAAU,qBAC/C,2BAAOC,GAAG,4BAA4BD,UAAU,SAAhD,YACA,2BAAOC,GAAG,4BAA4BD,UAAU,QAAQ0Y,EAAUpG,qBAEtE,yBAAKrS,GAAG,+BAA+BD,UAAU,qBAC7C,2BAAOC,GAAG,0BAA0BD,UAAU,SAA9C,mBACA,2BAAOC,GAAG,0BAA0BD,UAAU,QAAQ2F,GAAgBb,2BAA2B4T,EAAU1G,iBAE/G,yBAAK/R,GAAG,6BAA6BD,UAAU,qBAC3C,2BAAOC,GAAG,wBAAwBD,UAAU,SAA5C,iBACA,2BAAOC,GAAG,wBAAwBD,UAAU,QAAQ2F,GAAgBb,2BAA2B4T,EAAUxG,eAG7G,yBAAKjS,GAAG,2BAA2BD,UAAU,qBACzC,2BAAOC,GAAG,sBAAsBD,UAAU,SAA1C,sBACA,2BAAOC,GAAG,sBAAsBD,UAAU,QAAQ0Y,EAAUzC,YAA5D,QAMU,WAAzBhX,KAAKN,MAAMmW,YACR,yBAAK7U,GAAG,iBAAiBF,QAASd,KAAK0H,WAAvC,qCAAqFoS,EAAU9C,YAA/F,KAEsB,aAAzBhX,KAAKN,MAAMmW,YACR,yBAAK7U,GAAG,iBAAiBF,QAASd,KAAK0H,WAAvC,+CAA+FiS,EAA/F,KAGyB,SAA5B3Z,KAAKN,MAAMwZ,eACR,2BAAOlY,GAAG,kBAAV,oDAIJ,kBAAC,KAAD,CACIuB,SAAO,EACPC,KAAkC,QAA5BxC,KAAKN,MAAMwZ,cACjBpO,aAAW,EACXC,aAAW,EACXtI,MAAM,qBACNC,UAAW,kBAAM,EAAK9C,SAAS,CAACsZ,cAAe,yBANnD,8BAQgCU,EARhC,aAY6B,sBAA5B5Z,KAAKN,MAAMwZ,eACR,kBAAC,IAAD,CAAUvW,GAAG,eAIjB,kBAAC,KAAD,CACIiS,SAAO,EACPpS,KAAkC,qBAA5BxC,KAAKN,MAAMwZ,cACjBpO,aAAW,EACXC,aAAW,EACXtI,MAAM,oBACNC,UAAW,kBAAM,EAAK9C,SAAS,CAACsZ,cAAe,WAE9CW,EARL,uFAaA,kBAAC,KAAD,CACIrX,KAAkC,iBAA5BxC,KAAKN,MAAMwZ,cACjBpO,aAAW,EACXC,aAAW,EACXtI,MAAM,eACNC,UAAW,kBAAM,EAAK6W,uBAL1B,oGAW6B,uBAA5BvZ,KAAKN,MAAMwZ,eACR,kBAAC,IAAD,CAAUvW,GAAG,gB,GArVJrC,cA6V7B2Y,GAAenW,YAAcxD,EAEd2Z,UC/VAc,GATM,SAAS3Z,GAE1B,OACI,yBAAKY,GAAG,0BAA0BD,UAAU,0BACxC,4BAAQC,GAAG,cAAcE,IxCRN,qCwCQ4BH,UAAU,cAAc0B,MAAM,oBCK1EuX,GATG,SAAS5Z,GAEvB,OACI,yBAAKY,GAAG,uBAAuBD,UAAU,0BACzC,4BAAQC,GAAG,cAAcE,IzCPL,+ByCOwBH,UAAU,cAAc0B,MAAM,iB,oBC0CnEwX,I,4LA5BX,OACE,kBAAC,EAAD,KACE,kBAAC,IAAD,KACE,yBAAKlZ,UAAU,OACb,yBAAKA,UAAU,WAAWK,IAAI,GAAGF,IAAKgZ,OACtC,4BAAQnZ,UAAU,OAChB,kBAAC,EAAD,MACA,kBAAC,IAAD,KACE,kBAAC,IAAD,CAAOyC,OAAK,EAACmH,KAAK,IAAI+H,UAAWhP,KADnC,IAEE,kBAAC,IAAD,CAAOiH,KAAK,WAAW+H,UAAW1K,KAFpC,IAGE,kBAAC,IAAD,CAAOxE,OAAK,EAACmH,KAAK,SAAS+H,UAAWsH,KAHxC,IAIE,kBAAC,IAAD,CAAOxW,OAAK,EAACmH,KAAK,iBAAiB+H,UAAWqH,KAJhD,IAKE,kBAAC,IAAD,CAAOvW,OAAK,EAACmH,KAAK,SAAS+H,UAAWzH,KALxC,IAME,kBAAC,IAAD,CAAOzH,OAAK,EAACmH,KAAK,SAAS+H,UAAWvH,KANxC,IAOE,kBAAC,IAAD,CAAO3H,OAAK,EAACmH,KAAK,YAAY+H,UAAWjH,KAP3C,IAQE,kBAAC,IAAD,CAAOjI,OAAK,EAACmH,KAAK,qBAAqB+H,UAAW/G,KARpD,IASE,kBAAC,IAAD,CAAOnI,OAAK,EAACmH,KAAK,oBAAoB+H,UAAW9G,KATnD,IAUE,kBAAC,IAAD,CAAOjB,KAAK,aAAa+H,UAAWqG,KAVtC,IAWE,kBAAC,IAAD,CAAOpO,KAAK,mBAAmB+H,UAAWuG,KAX5C,a,GAVI3Y,c,cCdlB6Z,IAASvP,OACP,kBAAC,IAAMwP,WAAP,KACE,kBAAC,GAAD,OAEFC,SAASC,eAAe,W","file":"static/js/main.649d79e5.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/loading-data.eafb5db3.gif\";","module.exports = __webpack_public_path__ + \"static/media/error-icon.acc83f31.png\";","module.exports = __webpack_public_path__ + \"static/media/save-icon.50243901.png\";","module.exports = __webpack_public_path__ + \"static/media/cancel-icon.c1b1e10c.png\";","module.exports = __webpack_public_path__ + \"static/media/edit-icon.20a8bac5.png\";","module.exports = __webpack_public_path__ + \"static/media/delete-icon.74f1e239.png\";","module.exports = __webpack_public_path__ + \"static/media/plane-arrow.8e27a657.png\";","module.exports = __webpack_public_path__ + \"static/media/arrows-icon.8650cc3c.png\";","module.exports = __webpack_public_path__ + \"static/media/airline-icon.a8e4fcc4.png\";","module.exports = __webpack_public_path__ + \"static/media/close-icon.d94306fc.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/info-icon.e1ea26cc.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/signup-icon.880eebf4.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/menu-icon.ba2b8cff.png\";","module.exports = __webpack_public_path__ + \"static/media/customer-icon.cd486cb6.png\";","module.exports = __webpack_public_path__ + \"static/media/logo.898c387c.png\";","module.exports = __webpack_public_path__ + \"static/media/plane.d91988a2.png\";","module.exports = __webpack_public_path__ + \"static/media/clouds.c2d97c26.png\";","module.exports = __webpack_public_path__ + \"static/media/loading-plane.6151421c.gif\";","module.exports = __webpack_public_path__ + \"static/media/about.150f35e9.jpg\";","module.exports = __webpack_public_path__ + \"static/media/register.19af3440.jpg\";","module.exports = __webpack_public_path__ + \"static/media/show-pass.335b760c.png\";","module.exports = __webpack_public_path__ + \"static/media/hide-pass.77a705bd.png\";","module.exports = __webpack_public_path__ + \"static/media/sky-desktop.c728dd30.jpg\";","\r\n// This service handles the console logging of errors in the application.\r\nclass ErrorService {\r\n\r\n logErrorToConsole = (error) => {\r\n let errorObject = { \r\n message: \"An error occurred while processing the AJAX request\",\r\n data: error\r\n };\r\n console.log(errorObject);\r\n }\r\n\r\n}\r\n\r\nexport default new ErrorService();","// External project pages\r\nexport const flightsBoardURL = './Flights Board/flights-board.html';\r\nexport const DealsPageURL = './Deals Page/deals-page.html';\r\nexport const CustomerRegisterURL = './Register Page/user-register-form.html';\r\nexport const AirlineRegisterURL = './Register Page/airline-register-form.html';\r\n\r\n// Host\r\nexport const host = 'http://www.ybem.net/'; // For local hosting: http://localhost/\r\n\r\n// Everyone\r\nexport const getCountriesURL = host + 'api/guest/get-all-countries';\r\nexport const getOneWayFlightsURL = host + 'api/guest/get-oneway-flights';\r\nexport const getRoundtripFlightsURL = host + 'api/guest/get-roundtrip-flights';\r\nexport const getAuthTokenURL = host + 'api/authentication/get-token';\r\nexport const getFlightByIdURL = host + 'api/guest/get-flight-json';\r\n\r\n\r\n// *** Administrator ***\r\n// Inbox\r\nexport const getAirlinesFromQueueURL = host + 'api/admin/get-all-airlines-from-register-queue';\r\nexport const createAirlineAccountURL = host + 'api/admin/create-new-airline';\r\nexport const rejectAirlineInQueueURL = host + 'api/admin/reject-airline-in-register-queue';\r\n// Customers\r\nexport const getAllCustomersURL = host + 'api/admin/get-all-customers';\r\nexport const updateCustomerURL = host + 'api/admin/update-customer-details';\r\nexport const deleteCustomerURL = host + 'api/admin/remove-customer';\r\n// Airlines\r\nexport const getAllAirlinesURL = host + 'api/guest/get-all-airlines';\r\nexport const updateAirlineURL = host + 'api/admin/update-airline-details';\r\nexport const deleteAirlineURL = host + 'api/admin/remove-airline';\r\n\r\n\r\n// *** Customer ***\r\n// Personal Details\r\nexport const modifyCustomerDetailsURL = host + 'api/customer/modify-customer-details';\r\nexport const changeCustomerPasswordURL = host + 'api/customer/change-my-password';\r\n// Tickets\r\nexport const getCustomerFlightsURL = host + 'api/customer/get-all-my-flights';\r\nexport const purchaseTicketURL = host + 'api/customer/purchase-ticket';\r\nexport const deleteTicketURL = host + 'api/customer/cancel-ticket';\r\n\r\n\r\n// *** Airline Company ***\r\n// Personal Details\r\nexport const modifyAirlineDetailsURL = host + 'api/airline/modify-airline-details';\r\nexport const changeAirlinePasswordURL = host + 'api/airline/change-my-password';\r\n// Flights\r\nexport const getAirlineFlightsURL = host + 'api/airline/get-all-flights';\r\nexport const createFlightURL = host + 'api/airline/create-flight';\r\nexport const updateFlightURL = host + 'api/airline/update-flight';\r\nexport const cancelFlightURL = host + 'api/airline/cancel-flight';\r\n\r\n// About Page\r\nexport const gitHubRepositoryURL = \"https://github.com/Yuval911/FlightsCenter\";\r\nexport const contactEmail = \"mailto:ybem01@gmail.com\";","import axios from 'axios';\r\nimport JwtDecode from 'jwt-decode';\r\nimport ErrorService from './ErrorService';\r\nimport { getAuthTokenURL } from '../Constants';\r\n\r\n// This service handles the login, logout and the JWT login token.\r\nclass AuthService {\r\n\r\n // Sends the login credentials to the API to make the login trial\r\n // if succeeds, It saves the login token in the browser.\r\n login = (credentials) => {\r\n return axios.post(getAuthTokenURL, credentials).then(res => {\r\n // Login success\r\n if (res.status == 200)\r\n {\r\n localStorage.setItem(\"userToken\", res.data);\r\n return \"success\";\r\n }\r\n }).catch(error => {\r\n \r\n // Login denied (wrong credentials)\r\n if (error.response != null)\r\n {\r\n if (error.response.status == 401)\r\n {\r\n return \"failure\";\r\n }\r\n }\r\n \r\n // Any other error from the server\r\n ErrorService.logErrorToConsole(error);\r\n return \"error\";\r\n })\r\n }\r\n\r\n // Gets the information of the user from the JWT login token.\r\n getUserInfo = () => {\r\n let userToken = localStorage.getItem(\"userToken\");\r\n let anonymousUser = { role: 'Anonymous', name: 'Guest' }\r\n\r\n // Anonymous user\r\n if (userToken == null)\r\n {\r\n return anonymousUser;\r\n }\r\n // Registered user\r\n else\r\n {\r\n let user = JwtDecode(userToken);\r\n let userInfo = JSON.parse(user.LoginToken);\r\n let name = this.getUserName(user.role, userInfo);\r\n \r\n // If the token is expired it will be removed from the browser.\r\n if (this.checkToken(user.exp) == false)\r\n {\r\n localStorage.removeItem(\"userToken\");\r\n return anonymousUser;\r\n }\r\n else\r\n {\r\n return {role: user.role, \r\n name: name, \r\n user: userInfo.User};\r\n }\r\n }\r\n }\r\n\r\n // Detemines what 'display name' to use for each user type.\r\n getUserName = (userRole, userInfo) => {\r\n switch (userRole) {\r\n case 'Administrator':\r\n return 'Admin';\r\n \r\n case 'Customer':\r\n return userInfo.User.FirstName;\r\n\r\n case 'AirlineCompany':\r\n return userInfo.User.Name;\r\n\r\n default:\r\n return 'Unknown';\r\n }\r\n }\r\n\r\n // Returns the authorization header for the AJAX calls.\r\n getAuthHeader = () => {\r\n return {\r\n headers: {\r\n Authorization: 'Bearer ' + localStorage.getItem(\"userToken\"),\r\n }\r\n };\r\n }\r\n\r\n // Checks if the token is not expired.\r\n checkToken = (expireTimestamp) => {\r\n let expireDate = new Date(expireTimestamp * 1000);\r\n return expireDate > new Date();\r\n }\r\n\r\n // Handles the logout opertaion.\r\n logout = (handleUserChange) => {\r\n localStorage.removeItem(\"userToken\");\r\n handleUserChange();\r\n }\r\n}\r\n\r\nexport default new AuthService();","import React, { Component } from \"react\";\r\nimport AuthService from './services/AuthService';\r\n\r\nexport const UserContext = React.createContext();\r\n\r\n// This context provider holds and sets the information about the user.\r\nclass UserContextProvider extends Component {\r\n \r\n state = {\r\n role: '',\r\n name: ''\r\n }\r\n\r\n // Sets the user's info from the login token that stored in the browser.\r\n setUserInfo = () => {\r\n this.setState(AuthService.getUserInfo)\r\n }\r\n \r\n // Gets a new login token from the server with the updated user info\r\n // and sets it to the context's state.\r\n updateUserInfo = async (credentials) => {\r\n let answer = await AuthService.login(credentials);\r\n if (answer == 'success')\r\n {\r\n this.setUserInfo();\r\n return true;\r\n }\r\n else\r\n {\r\n return false;\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.setUserInfo();\r\n }\r\n\r\n render() {\r\n if (this.state.role == '')\r\n {\r\n return null;\r\n }\r\n else\r\n {\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n }\r\n}\r\n\r\nexport default UserContextProvider;\r\n","// This service helps detect when the website should display in \"mobile mode\".\r\nclass ViewService {\r\n\r\n isMobileView = () => {\r\n return (window.innerWidth / window.innerHeight) < 0.95\r\n }\r\n}\r\n\r\nexport default new ViewService();","import React, {Component} from 'react';\r\n\r\n// This is a simple button that being used in many places in the application.\r\n// It gets all its data from the props.\r\nclass Button extends Component {\r\n\r\n handleClick = (e) => {\r\n this.props.onClick(e);\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n \"\"\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default Button;","import React, {Component} from 'react';\r\nimport {Link, NavLink, Redirect} from 'react-router-dom';\r\nimport SweetAlert from 'sweetalert2-react';\r\nimport {UserContext} from '../UserContext';\r\nimport AuthService from '../services/AuthService';\r\nimport ViewService from '../services/ViewService';\r\nimport Button from './Button';\r\nimport signUpIcon from '../assets/signup-icon.png';\r\nimport loginIcon from '../assets/login-icon.png';\r\nimport personIcon from '../assets/person-icon.png';\r\nimport userIcon from '../assets/folder-icon.png';\r\nimport closeIcon from '../assets/close-icon.png';\r\n\r\n// This component is located at the right side to the top bar, and handles actions regarding to users.\r\n// When it detects an anonymous user it will render a sign-up and login button.\r\n// When it detects a registered user (or the admin) it will render a greeting message and a dropdown menu.\r\nclass UserActions extends Component {\r\n\r\n state = {\r\n loggedOff: false,\r\n btnClicked: 'none',\r\n loginMenuOpened: false,\r\n userMenuOpened: false\r\n }\r\n\r\n // Handles the logout from the system.\r\n logout = () => {\r\n let handleUserChange = this.context.handleLogin;\r\n AuthService.logout(handleUserChange);\r\n this.setState({\r\n loggedOff: true,\r\n loginMenuOpened: false\r\n })\r\n }\r\n\r\n // Handles the login / sign-up buttons click.\r\n setBtnClickState = (btnState) => {\r\n if (btnState == \"sign-up\")\r\n {\r\n this.setState({btnClicked: 'sign-up'}) \r\n }\r\n if (btnState == \"login\")\r\n {\r\n this.setState({btnClicked: 'login'}) \r\n }\r\n if (btnState == \"user-page\")\r\n {\r\n this.setState({btnClicked: 'user-page'}) \r\n }\r\n\r\n setTimeout(()=>\r\n this.setState({\r\n btnClicked: 'none',\r\n loginMenuOpened: false,\r\n userMenuOpened: false\r\n }),\r\n 100);\r\n }\r\n \r\n // Handles the opening and closing of the login dropdown menu.\r\n // When it opens and it detects that the navigation menu is open too, it will close it.\r\n toggleLoginMenu = () => {\r\n this.setState({\r\n loginMenuOpened: !this.state.loginMenuOpened\r\n },()=> {\r\n if (this.props.navMenuOpen && this.state.loginMenuOpened)\r\n {\r\n this.props.userMenuOpened();\r\n }\r\n })\r\n }\r\n\r\n // Handles the opening and closing of the user dropdown menu.\r\n // When it opens and it detects that the navigation menu is open too, it will close it.\r\n toggleUserMenu = () => {\r\n this.setState({\r\n userMenuOpened: !this.state.userMenuOpened\r\n },()=> {\r\n if (this.props.navMenuOpen && this.state.userMenuOpened)\r\n {\r\n this.props.userMenuOpened();\r\n }\r\n })\r\n }\r\n\r\n // Listens to the Navbar component state: when the navigation dropdown menu is opened,\r\n // it closes the login menu.\r\n componentWillReceiveProps() {\r\n setTimeout(()=>{\r\n if (this.props.navMenuOpen)\r\n {\r\n this.setState({\r\n loginMenuOpened: false,\r\n userMenuOpened: false\r\n })\r\n }\r\n },5)\r\n }\r\n\r\n render() {\r\n let userContext = this.context;\r\n if (userContext.userInfo.role == \"Anonymous\")\r\n {\r\n return (\r\n
\r\n\r\n {!ViewService.isMobileView() && // Desktop view\r\n
\r\n
\r\n }\r\n\r\n {ViewService.isMobileView() && // Mobile view\r\n
\r\n
\r\n }\r\n
\r\n }\r\n\r\n this.setState({ loggedOff: false })}\r\n />\r\n\r\n {this.state.btnClicked == 'login' &&\r\n \r\n }\r\n {this.state.btnClicked == 'sign-up' &&\r\n \r\n }\r\n {this.state.loggedOff == true &&\r\n \r\n }\r\n\r\n \r\n )\r\n }\r\n else\r\n {\r\n if (!ViewService.isMobileView()) // Desktop view\r\n {\r\n return (\r\n
\r\n
\r\n
\r\n \r\n \"\"\r\n
\r\n
\r\n\r\n \r\n My Area\r\n \"\"\r\n \r\n\r\n \r\n\r\n
\r\n
\r\n
\r\n )\r\n }\r\n else // Mobile view\r\n {\r\n return (\r\n
\r\n
\r\n \r\n \"\"\r\n
\r\n {this.state.userMenuOpened &&\r\n
\r\n\r\n
\r\n }\r\n {this.state.btnClicked == 'user-page' &&\r\n \r\n } \r\n
\r\n )\r\n }\r\n\r\n }\r\n }\r\n}\r\n\r\nUserActions.contextType = UserContext;\r\n\r\nexport default UserActions;","import React, {Component} from 'react';\r\nimport {NavLink, Redirect} from 'react-router-dom';\r\nimport ViewService from '../services/ViewService';\r\nimport Button from './Button';\r\nimport UserActions from './UserActions';\r\nimport logo from '../assets/logo.png';\r\nimport menuIcon from '../assets/menu-icon.png';\r\nimport closeIcon from '../assets/close-icon.png';\r\n\r\n// This is the top bar, containing the website's logo, the navigation links and the UserAction component.\r\nclass Navbar extends Component {\r\n\r\n state = {\r\n mobileMenuOpened: false,\r\n homePageClicked: false\r\n }\r\n\r\n goToHomePage = () => {\r\n this.setState({homePageClicked: true})\r\n setTimeout(()=> this.setState({homePageClicked: false}), 100)\r\n }\r\n\r\n toggleMenu = () => {\r\n this.setState({\r\n mobileMenuOpened: !this.state.mobileMenuOpened\r\n })\r\n }\r\n\r\n // When the login menu opens, it closes the navigation menu.\r\n userMenuOpened = () => {\r\n if (this.state.mobileMenuOpened)\r\n {\r\n this.setState({mobileMenuOpened: false});\r\n }\r\n }\r\n\r\n render() {\r\n const navActiveStyle = {\r\n textShadow:'0.5px 0.5px 2px'\r\n }\r\n \r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default Navbar;","import React from 'react';\r\nimport {NavLink} from 'react-router-dom';\r\nimport plane from '../assets/plane.png'\r\nimport clouds from '../assets/clouds.png'\r\nimport '../styles/Home.css';\r\n\r\n// This is the home page of the site.\r\nconst Home = function(props) {\r\n return (\r\n
\r\n
\r\n\r\n
\r\n \"\"\r\n \"\"\r\n
\r\n\r\n
\r\n
\r\n

Welcome to

\r\n

Flights Center!

\r\n
\r\n
\r\n

This is the ultimate place to explore and find flight tickets \r\n to the best locations in the world!

\r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default Home;\r\n\r\n","import axios from 'axios';\r\nimport ErrorService from './ErrorService';\r\nimport { getCountriesURL } from '../Constants';\r\n\r\n// This service gets the countries from the server, stores it and provides it to any component\r\n// that requests it.\r\nclass CountriesService {\r\n\r\n countries;\r\n\r\n getCountries = async () => {\r\n if (this.countries == null)\r\n {\r\n await this.getCountriesFromAPI();\r\n }\r\n return this.countries;\r\n }\r\n\r\n getCountriesFromAPI = async () => {\r\n await axios.get(getCountriesURL)\r\n .then((response) => {\r\n this.countries = response.data;\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n })\r\n }\r\n}\r\n\r\nexport default new CountriesService();","import React, {Component} from 'react';\r\n\r\n// This component renders the countries select field for the flights search form.\r\nclass CountrySelect extends Component {\r\n\r\n handleChange = (e) => {\r\n this.props.onChange(e);\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n \r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default CountrySelect;","import React, {Component} from 'react';\r\n\r\n// This component renders the radio buttons for the flights search form.\r\n// These buttons switch between one way flights search and roundtrip flights search.\r\nclass TripSelect extends Component {\r\n\r\n handleChange = (e) => {\r\n this.props.onChange(e);\r\n }\r\n\r\n render() {\r\n \r\n return (\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default TripSelect;","import React, {Component} from 'react';\r\n\r\n// This component renders the date select field for the flights search form.\r\nclass DateSelect extends Component {\r\n\r\n // Props: id, onChange\r\n\r\n handleChange = (e) => {\r\n this.props.onChange(e);\r\n }\r\n\r\n render() {\r\n if (this.props.show)\r\n {\r\n return (\r\n
\r\n \r\n \r\n
\r\n )\r\n }\r\n else\r\n {\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nexport default DateSelect;","\r\n// This service provides function that helps display date and time information in the UI.\r\nclass DateTimeService {\r\n\r\n // Extracts the hour an minutes from a given date and returns it in the format of hh:mm.\r\n getTimeString = (date) => {\r\n let hours = date.getHours();\r\n let minutes = date.getMinutes();\r\n if (minutes < 10)\r\n minutes = \"0\" + minutes;\r\n let time = `${hours}:${minutes}`;\r\n return time;\r\n }\r\n\r\n // Calculates and returns the duration of a flight, using the departure and landing time.\r\n getFlightDuration = (departureDate, landingDate) => {\r\n let flightTime = new Date(landingDate) - new Date(departureDate);\r\n let ftHoursFloat = flightTime/3600/1000;\r\n let ftHours = Math.floor(ftHoursFloat);\r\n let ftMinutes = (ftHoursFloat - ftHours)*60;\r\n if (ftMinutes < 10)\r\n ftMinutes = \"0\" + ftMinutes;\r\n return `${ftHours}:${ftMinutes}`;\r\n }\r\n\r\n // Builds a string of the date and time in a format of 'dd/MM/yyyy hh:mm'.\r\n getFormattedDateTimeString = (date) => {\r\n date = new Date(date);\r\n let year = date.getFullYear();\r\n let month = (date.getMonth() + 1) < 10 ? '0' + (date.getMonth() + 1) : (date.getMonth() + 1);\r\n let day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();\r\n let hour = date.getHours();\r\n let minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();\r\n\r\n return `${day}/${month}/${year} ${hour}:${minutes}`;\r\n }\r\n\r\n}\r\n\r\nexport default new DateTimeService();","import React, {Component} from 'react';\r\nimport DateTimeService from '../../services/DateTimeService';\r\nimport loadingPlane from '../../assets/loading-plane.gif';\r\nimport errorIcon from '../../assets/error-icon.png';\r\nimport planeArrow from '../../assets/plane-arrow.png';\r\n\r\n// This component holds and renders the results of the flights search.\r\nclass SearchResults extends Component {\r\n\r\n state = {\r\n results: []\r\n }\r\n\r\n // Parses the time data of a given flight.\r\n getFlightData = (flight) => {\r\n\r\n let departureTime = DateTimeService.getTimeString(new Date(flight.departureDate));\r\n let landingTime = DateTimeService.getTimeString(new Date(flight.landingDate));\r\n let flightTime = DateTimeService.getFlightDuration(flight.departureDate, flight.landingDate);\r\n\r\n return {\r\n departureTime: departureTime,\r\n landingTime: landingTime,\r\n flightDuration: flightTime\r\n }\r\n }\r\n\r\n render() {\r\n\r\n if (this.props.submitState == \"notSubmitted\")\r\n {\r\n return null;\r\n }\r\n\r\n if (this.props.submitState == \"loading\")\r\n {\r\n return (\r\n \"loading...\"\r\n )\r\n }\r\n\r\n if (this.props.submitState == \"error\")\r\n {\r\n return (\r\n
\r\n \"error\"\r\n

An error occurred while receiving the data.

\r\n
\r\n )\r\n }\r\n\r\n if (this.props.submitState == \"submitted\" && this.props.flights.length == 0)\r\n {\r\n return

Sorry. No flights to were found.

\r\n }\r\n\r\n if (this.props.roundtrip)\r\n {\r\n // Checking if the flights array is in the right form (pairs of flights).\r\n if (!this.props.flights[0].hasOwnProperty('flightId'))\r\n {\r\n this.state.results = this.props.flights.map(flightsPair => {\r\n\r\n const f1 = this.getFlightData(flightsPair[0]);\r\n const f2 = this.getFlightData(flightsPair[1]);\r\n const ticketPrice = parseInt(flightsPair[0].ticketPrice) + parseInt(flightsPair[1].ticketPrice) + 1;\r\n \r\n return (\r\n
this.props.buyTicket(flightsPair[0].flightId, flightsPair[1].flightId)}>\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \"---\" className=\"plane-arrow\"/>\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \"---\" className=\"plane-arrow\"/>\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n )\r\n })\r\n }\r\n } \r\n \r\n if (this.props.roundtrip == false)\r\n {\r\n // Checking if the flights array is in the right form (single flights).\r\n if (this.props.flights[0].hasOwnProperty('flightId'))\r\n {\r\n this.state.results = this.props.flights.map(flight => {\r\n\r\n const f = this.getFlightData(flight);\r\n \r\n return (\r\n
this.props.buyTicket(flight.flightId)}>\r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \"---\" className=\"plane-arrow\"/>\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n )\r\n })\r\n }\r\n }\r\n\r\n return (\r\n
\r\n
Results:
\r\n {this.state.results}\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default SearchResults;","import React, {Component} from 'react';\r\nimport {Route, Redirect} from 'react-router-dom';\r\nimport axios from 'axios';\r\nimport SweetAlert from 'react-bootstrap-sweetalert';\r\nimport ErrorService from '../services/ErrorService';\r\nimport CountriesService from '../services/CountriesService';\r\nimport CountrySelect from './Flights/CountrySelect';\r\nimport TripSelect from './Flights/TripSelect';\r\nimport DateSelect from './Flights/DateSelect';\r\nimport SearchResults from './Flights/SearchResults';\r\nimport { getOneWayFlightsURL, getRoundtripFlightsURL} from '../Constants';\r\nimport errorIcon from '../assets/error-icon.png';\r\nimport loadingData from '../assets/loading-data.gif';\r\nimport '../styles/Flights.css';\r\n\r\n// This is the flights search page.\r\nclass Flights extends Component {\r\n \r\n state = {\r\n roundtrip: true,\r\n origin: \"\",\r\n destination: \"\",\r\n departure: \"\",\r\n return: \"\",\r\n countries: [],\r\n flights: [],\r\n errorState: false,\r\n formError: '',\r\n submitState: \"notSubmitted\",\r\n buyTicketState: 'none',\r\n selectedFlights: '',\r\n }\r\n \r\n CancelToken = axios.CancelToken;\r\n source = this.CancelToken.source();\r\n\r\n // Gets all the countries from the server, so they can be used in the dropdowns.\r\n getCountries = async () => {\r\n\r\n let countries = await CountriesService.getCountries();\r\n if (countries != null)\r\n {\r\n let countriesOptions = countries.map(country => {\r\n return { value: country.Id, display: country.Name }\r\n })\r\n countriesOptions = [{value: '', display: '- Select -'}].concat(countriesOptions)\r\n\r\n this.setState({\r\n countries: countriesOptions,\r\n });\r\n }\r\n else\r\n {\r\n this.setState({ errorState: true})\r\n }\r\n }\r\n\r\n // Checks if all the fields are valid and crossponds to the rules.\r\n validationCheck = () => {\r\n\r\n if (this.state.origin != \"\" && this.state.destination != \"\")\r\n {\r\n if (this.state.origin == this.state.destination)\r\n {\r\n this.setState( {\r\n formError: \"Origin and destination countries cannot be the same.\" \r\n })\r\n return false;\r\n }\r\n }\r\n\r\n let thisDate = new Date().setHours(0,0,0);\r\n\r\n if (this.state.departure != \"\")\r\n {\r\n if (new Date(this.state.departure) < thisDate)\r\n {\r\n this.setState( {\r\n formError: \"Cannot select a date from the past.\" \r\n })\r\n return false;\r\n }\r\n }\r\n\r\n if (this.state.return != \"\" && this.state.roundtrip)\r\n {\r\n if (new Date(this.state.return) < thisDate)\r\n {\r\n this.setState( {\r\n formError: \"Cannot select a date from the past.\" \r\n })\r\n return false;\r\n }\r\n }\r\n\r\n if (this.state.departure != \"\" && this.state.return != \"\" && this.state.roundtrip)\r\n {\r\n if (new Date(this.state.return) < new Date(this.state.departure))\r\n {\r\n this.setState( {\r\n formError: \"Return date cannot be before departure date.\" \r\n })\r\n return false;\r\n }\r\n }\r\n\r\n this.setState( {\r\n formError: '' \r\n })\r\n return true;\r\n }\r\n\r\n // This function is called when the app detects query parameters in the URL.\r\n handleUrlQueries = () => {\r\n\r\n this.insertQueryParamsToForm();\r\n\r\n // Sets the validation function to be called after the component updates.\r\n this.setState({},() => {\r\n this.validationCheck();\r\n });\r\n \r\n // Sets the get-flights function to be called after the component updates.\r\n setTimeout(() => {\r\n if (this.state.errorState == false)\r\n {\r\n this.getFlights();\r\n }\r\n },50);\r\n }\r\n\r\n // Inserts all the query parameters from the URL to the state.\r\n insertQueryParamsToForm = () => {\r\n let queriesString = this.props.history.location.search;\r\n let queriesBlocks = queriesString.split('&');\r\n let queriesValues = queriesBlocks.map((block) => {\r\n return block.split('=')[1];\r\n });\r\n if (queriesValues.length == 4)\r\n {\r\n this.setState({ \r\n roundtrip: true,\r\n departure: queriesValues[0],\r\n return: queriesValues[1],\r\n origin: queriesValues[2],\r\n destination: queriesValues[3]\r\n }) \r\n }\r\n else if (queriesValues.length == 3)\r\n {\r\n this.setState({ \r\n roundtrip: false,\r\n departure: queriesValues[0],\r\n origin: queriesValues[1],\r\n destination: queriesValues[2]\r\n }) \r\n }\r\n }\r\n\r\n // Returns the full URL of the API flights request, OR only the query parameters.\r\n getRequestURL = (requestType) => {\r\n\r\n let queryParams;\r\n let url;\r\n\r\n if (this.state.roundtrip)\r\n {\r\n queryParams = `/query?departureDate=${this.state.departure}` +\r\n `&returnDate=${this.state.return}` +\r\n `&originCountryId=${this.state.origin}` +\r\n `&destinationCountryId=${this.state.destination}`;\r\n url = getRoundtripFlightsURL;\r\n }\r\n else\r\n {\r\n queryParams = `/query?departureDate=${this.state.departure}` +\r\n `&originCountryId=${this.state.origin}` +\r\n `&destinationCountryId=${this.state.destination}`;\r\n url = getOneWayFlightsURL\r\n }\r\n if (requestType == \"paramsOnly\")\r\n {\r\n return queryParams;\r\n }\r\n else if (requestType == \"fullURL\")\r\n {\r\n return url + queryParams;\r\n }\r\n }\r\n\r\n // Gets the flights from the server.\r\n getFlights = () => {\r\n\r\n this.setState({ \r\n submitState: 'loading'\r\n }) \r\n axios.get(this.getRequestURL(\"fullURL\"))\r\n .then((response) => {\r\n this.setState({ \r\n flights: response.data, \r\n submitState: 'submitted'\r\n })\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({ \r\n submitState: 'error'\r\n })\r\n })\r\n }\r\n\r\n // This function is called when a field in the form has been changed.\r\n handleChange = (e) => {\r\n if (e.target.type == 'radio')\r\n {\r\n this.setState( {\r\n roundtrip: (e.target.id == 'roundtrip'),\r\n })\r\n }\r\n else\r\n {\r\n this.setState( {\r\n [e.target.id]: e.target.value \r\n })\r\n }\r\n // Sets the validation check function to be called after the component updates.\r\n this.setState({},() => {\r\n this.validationCheck();\r\n });\r\n }\r\n\r\n // Handles the submit of the search form.\r\n handleSubmit = (e) => {\r\n e.preventDefault();\r\n this.getFlights();\r\n }\r\n\r\n // Handles the purchasing of the ticket when the user clicks a flight.\r\n buyTicket = (departureFlightId, returnFlightId) => {\r\n\r\n let selectedFlights;\r\n\r\n if (returnFlightId == null)\r\n {\r\n selectedFlights = {\r\n flightType: 'one-way',\r\n departureFlightId: departureFlightId\r\n }\r\n }\r\n else\r\n {\r\n selectedFlights = {\r\n flightType: 'roundtrip',\r\n departureFlightId: departureFlightId,\r\n returnFlightId: returnFlightId\r\n }\r\n }\r\n\r\n this.setState({\r\n buyTicketState: 'buyAlert',\r\n selectedFlights: selectedFlights\r\n })\r\n }\r\n\r\n // Builds query the parameters of the selected flights.\r\n getSelectedFlightsParams = () => {\r\n\r\n let params = '/purchase-ticket/params?';\r\n const selectedFlights = this.state.selectedFlights;\r\n params += 'flight-type=' + selectedFlights.flightType;\r\n params += '&departure-flight-id=' + selectedFlights.departureFlightId;\r\n\r\n if (selectedFlights.flightType == 'roundtrip')\r\n {\r\n params += '&return-flight-id=' + selectedFlights.returnFlightId;\r\n }\r\n return params;\r\n }\r\n\r\n // When the page is loaded it will check if it has query params at the URL.\r\n componentDidMount() {\r\n this.getCountries();\r\n if (this.props.history.location.search != '')\r\n this.handleUrlQueries();\r\n };\r\n\r\n componentWillUnmount() {\r\n this.source.cancel();\r\n }\r\n\r\n render() {\r\n\r\n // In case of an error.\r\n if (this.state.errorState == true)\r\n {\r\n return( \r\n
\r\n
\r\n \"error\"\r\n

An error occurred while receiving the data.

\r\n
\r\n
\r\n )\r\n }\r\n // Untill all the countries are loaded to the component, it will present loading image.\r\n if (this.state.countries.length == 0)\r\n {\r\n return( \r\n \"loading...\"\r\n )\r\n }\r\n else\r\n {\r\n return (\r\n
\r\n

Where would you like to go?

\r\n\r\n
\r\n\r\n \r\n\r\n
\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n
\r\n\r\n {this.state.formError != '' &&\r\n

{this.state.formError}

\r\n }\r\n \r\n\r\n \r\n {/* When query params where detected at the URL, it will show the SearchResults component. */}\r\n }\r\n />\r\n\r\n {/* When the user submits, a redirect element will alter the URL. */}\r\n {this.state.submitState != 'notSubmitted' &&\r\n \r\n }\r\n\r\n {/* An alert before buying a ticket: */}\r\n this.setState({buyTicketState: 'buyConfirmed'})}\r\n onCancel={()=>this.setState({buyTicketState: 'none'})}\r\n >\r\n \r\n {/* When the user confirms to buy the ticket, this will redirect him to the purchase page. */}\r\n \r\n {this.state.buyTicketState == 'buyConfirmed' &&\r\n \r\n }\r\n \r\n
\r\n )\r\n }\r\n }\r\n}\r\n\r\nexport default Flights;","import React from 'react';\r\nimport { gitHubRepositoryURL, contactEmail } from '../Constants';\r\nimport aboutImg from '../assets/about.jpg';\r\nimport '../styles/About.css';\r\n\r\n// This is the about page.\r\nconst About = function(props) {\r\n\r\n return (\r\n
\r\n
\r\n\r\n \"\"\r\n\r\n
\r\n \r\n

\r\n This is a demo website.\r\n All the information, flights, deals, airline companies and customers here are fake and created \r\n for the website to be tested and presented.\r\n

\r\n
\r\n \r\n
\r\n

\r\n My name is Yuval Barak and I am the creator of this website.
\r\n It was built for me to study and practice web developing.\r\n

\r\n

\r\n In this website you can sign up as a customer or as an airline company, buy tickets for the flights you choose, \r\n explore the current deals and look at the flights board that displays all the departuring and landing flights.\r\n

\r\n
\r\n\r\n \r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default About;","import React, {Component} from 'react';\r\nimport {Redirect, NavLink} from 'react-router-dom';\r\nimport SweetAlert from 'sweetalert2-react';\r\nimport AuthService from '../services/AuthService';\r\nimport loadingData from '../assets/loading-data.gif';\r\nimport {UserContext} from '../UserContext';\r\nimport '../styles/Login.css';\r\n\r\n// This is the login page.\r\nclass Login extends Component {\r\n\r\n state = {\r\n username: '',\r\n password: '',\r\n loginState: 'none',\r\n message: ''\r\n }\r\n\r\n // Handles the login procedure.\r\n login = async (e) => {\r\n e.preventDefault();\r\n const credentials = [this.state.username, this.state.password];\r\n this.setState({loginState:'loading'});\r\n let loginStatus = await AuthService.login(credentials);\r\n if (loginStatus == \"success\")\r\n {\r\n setTimeout(()=>{this.setState({loginState:'success'})},200);\r\n this.context.handleLogin();\r\n }\r\n else if (loginStatus == \"failure\")\r\n {\r\n this.setState({\r\n loginState:'failure',\r\n message: 'Wrong username or password inserted.'\r\n });\r\n }\r\n else if (loginStatus == \"error\")\r\n {\r\n this.setState({\r\n loginState:'error',\r\n message: 'An error occurred while connecting to the server.'\r\n });\r\n }\r\n }\r\n\r\n // Handles the changes of the credentials fields.\r\n handleChange = (e) => {\r\n this.setState({ \r\n [e.target.name]: e.target.value \r\n });\r\n }\r\n\r\n render() {\r\n\r\n return (\r\n
\r\n

Login

\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n\r\n {this.state.loginState == 'loading' &&\r\n \"loading...\"\r\n }\r\n \r\n
\r\n
\r\n
\r\n \r\n Sign Up\r\n \r\n
\r\n {/* When the user logs in successfully, a redirect element will send him to the user page. */}\r\n {this.state.loginState == 'userConfirmed' &&\r\n \r\n }\r\n this.setState({ loginState: 'userConfirmed' })}\r\n />\r\n
\r\n\r\n );\r\n }\r\n}\r\n\r\nLogin.contextType = UserContext;\r\n\r\nexport default Login;","import React, { Component } from 'react';\r\nimport { NavLink } from 'react-router-dom';\r\nimport registerImage from '../assets/register.jpg';\r\nimport '../styles/Register.css';\r\n\r\n// This is a simple referal page for new users.\r\n// It refers to the customer and airline company registration pages.\r\nclass Register extends Component {\r\n render() {\r\n return (\r\n
\r\n\r\n

New to Flights Center?

\r\n

We always welcome new members.

\r\n\r\n \"\"\r\n\r\n
\r\n
Sign up as a Customer.
\r\n
Sign up as an Airline Company.
\r\n
\r\n\r\n
Already a member? Login
\r\n
Any questions? Contact Us
\r\n\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default Register;","import React from 'react';\r\nimport { CustomerRegisterURL } from '../Constants';\r\n\r\n// This component contains the customer register page.\r\n// NOTICE: The customer register page is an external page. It is being presented here inside an iframe element.\r\nconst CustomerRegister = function(props) {\r\n\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nexport default CustomerRegister;","import React from 'react';\r\nimport { AirlineRegisterURL } from '../Constants';\r\n\r\n// This component contains the airline company register page.\r\n// NOTICE: The airline company register page is an external page. It is being presented here inside an iframe element.\r\nconst AirlineRegister = function(props) {\r\n\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nexport default AirlineRegister;","import React, {Component} from 'react';\r\nimport showIcon from '../assets/show-pass.png';\r\nimport hideIcon from '../assets/hide-pass.png';\r\n\r\n// This is a field that can hide values with sensitive information (like passwords).\r\n// The value of the field will be showed only when the user clicks a dedicated button.\r\nclass HiddenField extends Component {\r\n\r\n state = {\r\n fieldVisable: false\r\n }\r\n\r\n toggleShowField = () => {\r\n this.setState({fieldVisable: !this.state.fieldVisable})\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n {this.state.fieldVisable && \r\n
\r\n \r\n \"\"\r\n
\r\n }\r\n {!this.state.fieldVisable && \r\n
\r\n \r\n \"\"\r\n
\r\n }\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default HiddenField;","import React, {Component} from 'react';\r\nimport SweetAlert from 'react-bootstrap-sweetalert';\r\nimport CountriesService from '../../services/CountriesService';\r\nimport ViewService from '../../services/ViewService';\r\nimport Button from '../../components/Button';\r\nimport HiddenField from '../HiddenField';\r\nimport airlineIcon from '../../assets/airline-icon.png';\r\nimport arrowsIcon from '../../assets/arrows-icon.png';\r\nimport removeIcon from '../../assets/delete-icon.png';\r\nimport aproveIcon from '../../assets/save-icon.png';\r\nimport loadingIcon from '../../assets/loading-data.gif';\r\n\r\n// This is a child component of the AdminInbox component.\r\n// It presents all the information about the airline company and allows the user to\r\n// aprove its registration or remove it.\r\nclass PendingAirline extends Component {\r\n\r\n state = {\r\n airline: this.props.airline,\r\n countries: [],\r\n moreDetails: false,\r\n showPassword: false,\r\n actionState: 'none',\r\n alertMessage: '',\r\n errorState: false\r\n }\r\n\r\n // Gets all the countries from the server.\r\n getCountries = async () => {\r\n\r\n let countries = await CountriesService.getCountries();\r\n if (countries != null)\r\n {\r\n this.setState({\r\n countries: countries,\r\n });\r\n }\r\n else\r\n {\r\n this.setState({ errorState: true})\r\n }\r\n }\r\n\r\n // When the moreDetails state is true, the component will show more information of the airline: \r\n // username, password and origin country.\r\n toggleMoreDetails = () => {\r\n this.setState({moreDetails: !this.state.moreDetails});\r\n }\r\n\r\n // When the showPassword state is true, the component reveals the airline's password.\r\n toggleShowPassword = () => {\r\n this.setState({showPassword: !this.state.showPassword});\r\n }\r\n\r\n // When the user confirms to remove, this funcion will invoke the removal function that\r\n // was recieved from the parent component, and then the parent will delete the airline.\r\n handleRemoveAirline = () => {\r\n this.setState({ \r\n actionState: 'deleting' \r\n });\r\n this.props.removeFunc(this.state.airline, this.handleOperationError);\r\n }\r\n\r\n // When the user confirms to aprove, this funcion will invoke the aproval function that\r\n // was recieved from the parent component, and then the parent will remove the airline from the list.\r\n handleAproveAirline = () => {\r\n this.setState({ \r\n actionState: 'aproving' \r\n });\r\n this.props.aproveFunc(this.state.airline, this.handleOperationError);\r\n }\r\n\r\n // Shows an alert for the user to confirm the aprove operation.\r\n showAproveAlert = () => {\r\n this.setState({\r\n actionState: 'aproveAlert',\r\n alertMessage: `Aprove '${this.state.airline.Name}' and create a new account for it?`\r\n })\r\n }\r\n\r\n // Shows an alert for the user to confirm the remove operation.\r\n showRemoveAlert = () => {\r\n this.setState({\r\n actionState: 'deleteAlert',\r\n alertMessage: `Reject '${this.state.airline.Name}' and remove it from the list?`\r\n })\r\n }\r\n\r\n // When an error occurrs while deleting or aproving the airline.\r\n handleOperationError = () => {\r\n this.setState({actionState: 'error'})\r\n }\r\n\r\n getCountryName = (id) => {\r\n let country = this.state.countries.find(country => {\r\n return country.Id == id;\r\n })\r\n return country.Name;\r\n }\r\n\r\n componentDidMount() {\r\n this.getCountries();\r\n }\r\n\r\n render() {\r\n\r\n // Every airline's icon has a different color by using this style.\r\n const pictureStyle = { filter: `hue-rotate(${this.props.colorKey*50}deg)` }\r\n\r\n const airline = this.state.airline;\r\n\r\n if (this.state.countries.length == 0)\r\n {\r\n return (\r\n \"\"\r\n )\r\n }\r\n\r\n if (this.state.errorState == true)\r\n {\r\n return (\r\n
\r\n \r\n
\r\n )\r\n }\r\n\r\n if (this.state.actionState == 'deleting')\r\n {\r\n return (\r\n
\r\n \"\"\r\n
\r\n )\r\n }\r\n\r\n return (\r\n
\r\n\r\n {!ViewService.isMobileView() && // Desktop view\r\n
\r\n {/* These details will render when the component mounts on the first time.\r\n The basic airline details and the action buttons */}\r\n
\r\n \"\"\r\n \r\n \r\n \r\n
\r\n {/* When the user clicks \"More Details\" this will apear: */}\r\n { this.state.moreDetails &&\r\n\r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n }\r\n
\r\n }\r\n\r\n {ViewService.isMobileView() && // Mobile view\r\n
\r\n \"\"\r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n\r\n \r\n\r\n
\r\n \r\n \r\n
\r\n\r\n {(this.state.actionState == 'deleting' || this.state.actionState == 'aproving') &&\r\n \"\"\r\n }\r\n
\r\n
\r\n\r\n
\r\n }\r\n\r\n\r\n {/* An alert before performing an action: */}\r\n {\r\n if (this.state.actionState == 'deleteAlert')\r\n this.handleRemoveAirline();\r\n else\r\n this.handleAproveAirline();\r\n }}\r\n onCancel={()=>{this.setState({actionState: 'none'})}}\r\n >\r\n {this.state.alertMessage}\r\n \r\n\r\n {this.state.actionState == 'error' &&\r\n \r\n }\r\n \r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default PendingAirline;","import React, {Component} from 'react';\r\nimport axios from 'axios';\r\nimport SweetAlert from 'react-bootstrap-sweetalert';\r\nimport AuthService from '../../services/AuthService';\r\nimport ErrorService from '../../services/ErrorService';\r\nimport CountriesService from '../../services/CountriesService';\r\nimport PendingAirline from './PendingAirline';\r\nimport { getAirlinesFromQueueURL, createAirlineAccountURL, rejectAirlineInQueueURL, } from '../../Constants';\r\nimport loadingData from '../../assets/loading-data.gif';\r\nimport errorIcon from '../../assets/error-icon.png';\r\n\r\n// This component is a part of the admin area.\r\n// It displays all the admin's incoming messages - which are new airline companies that are waiting for aproval.\r\nclass AdminInbox extends Component {\r\n\r\n state = {\r\n dataState: 'loading',\r\n airlines: [],\r\n aproveMessage: ''\r\n }\r\n\r\n CancelToken = axios.CancelToken;\r\n source = this.CancelToken.source();\r\n\r\n // Gets all airline from the register queue.\r\n getAirlines = () => {\r\n \r\n axios({\r\n url: getAirlinesFromQueueURL, \r\n headers: AuthService.getAuthHeader().headers, \r\n cancelToken: this.source.token \r\n }).then((response) => {\r\n this.setState({ \r\n airlines: response.data,\r\n dataState: 'loaded'\r\n })\r\n }).catch((error) => {\r\n if (axios.isCancel(error))\r\n {\r\n console.log('the AJAX request was canceled.');\r\n }\r\n else\r\n {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({ \r\n dataState: 'error'\r\n })\r\n }\r\n })\r\n }\r\n\r\n // Handles the airline aproval operation.\r\n aproveAirline = (airline, handleError) => {\r\n axios({\r\n method: 'POST',\r\n url: createAirlineAccountURL,\r\n headers: AuthService.getAuthHeader().headers,\r\n data: airline,\r\n cancelToken: this.source.token\r\n }).then(() => {\r\n this.removeAirlineFromList(airline.Name);\r\n this.setState({ \r\n aproveMessage: `'${airline.Name}' was aproved`\r\n })\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n handleError();\r\n })\r\n }\r\n // Handles the airline removal (reject) operation.\r\n removeAirline = (airline, handleError) => {\r\n axios({\r\n method: 'DELETE',\r\n url: rejectAirlineInQueueURL,\r\n headers: AuthService.getAuthHeader().headers,\r\n data: airline,\r\n cancelToken: this.source.token\r\n }).then(() => {\r\n this.removeAirlineFromList(airline.Name);\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n handleError();\r\n })\r\n }\r\n\r\n // Removes the airline from the list (after aproval or rejection).\r\n removeAirlineFromList = (airlineName) => {\r\n let newAirlinesList = [];\r\n this.state.airlines.forEach(airline => {\r\n if (airline.Name != airlineName)\r\n newAirlinesList.push(airline);\r\n });\r\n this.setState({airlines: newAirlinesList})\r\n }\r\n\r\n initializeData = async () => {\r\n this.getAirlines();\r\n }\r\n\r\n componentDidMount() {\r\n this.initializeData();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.source.cancel();\r\n }\r\n\r\n render() {\r\n\r\n if (this.state.dataState == 'loading')\r\n {\r\n return (\r\n \"\"\r\n )\r\n }\r\n if (this.state.dataState == 'error')\r\n {\r\n return (\r\n
\r\n \"error\"\r\n

An error occurred while receiving the data.

\r\n
\r\n )\r\n }\r\n if (this.state.airlines.length == 0)\r\n {\r\n return (\r\n \r\n )\r\n }\r\n\r\n let colorKey = -1; // This key is being used to give different color to each airline icon.\r\n\r\n // Mapping all airlines to PendingAirline components.\r\n let airlinesList = this.state.airlines.map(airline => {\r\n\r\n colorKey++;\r\n\r\n return (\r\n \r\n )\r\n })\r\n\r\n return (\r\n
\r\n

These new airline companies have completed the registration and waiting for your aprroval.

\r\n { this.state.airlines.length != 0 && \r\n \r\n }\r\n
\r\n {airlinesList}\r\n
\r\n {this.setState({aproveMessage: ''})}}\r\n >\r\n \r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default AdminInbox;","import React, {Component} from 'react';\r\nimport axios from 'axios';\r\nimport SweetAlert from 'react-bootstrap-sweetalert';\r\nimport AuthService from '../../services/AuthService';\r\nimport ErrorService from '../../services/ErrorService';\r\nimport Button from '../../components/Button';\r\nimport HiddenField from '../HiddenField';\r\nimport { updateCustomerURL } from '../../Constants';\r\nimport customerIcon from '../../assets/customer-icon.png';\r\nimport arrowsIcon from '../../assets/arrows-icon.png';\r\nimport editIcon from '../../assets/edit-icon.png';\r\nimport deleteIcon from '../../assets/delete-icon.png';\r\nimport saveIcon from '../../assets/save-icon.png';\r\nimport cancelIcon from '../../assets/cancel-icon.png';\r\nimport loadingIcon from '../../assets/loading-data.gif';\r\n\r\n// This is a child component of the ManageCustomers component.\r\n// It displays all the information about the customer and allows the user to update it or\r\n// delete the customer.\r\nclass CustomerContainer extends Component {\r\n\r\n state = {\r\n customer: this.props.customer,\r\n newCustomer: this.props.customer,\r\n moreDetails: false,\r\n editCustomer: false,\r\n updateState: 'none',\r\n validationMessage: '',\r\n deleteState: 'none'\r\n }\r\n\r\n // The moreDetails state changes when the user click the \"more details\" button. \r\n // When true, the component will present more information of the customer - username, password, address etc...\r\n toggleMoreDetails = () => {\r\n this.setState({moreDetails: !this.state.moreDetails});\r\n }\r\n\r\n // This state sets the component to edit mode.\r\n showEditCustomer = () => {\r\n this.setState({editCustomer: true});\r\n }\r\n\r\n // When the user types any changes to the fields in edit mode, it will handle it.\r\n // All the changes will be reflected on the 'newCustomer' state, while the regular 'customer' state\r\n // Will stay the same.\r\n handleChange = (e) => {\r\n let customerClone = Object.assign({}, this.state.newCustomer);\r\n customerClone[e.target.id] = e.target.value;\r\n this.setState({\r\n newCustomer: customerClone\r\n })\r\n // Removes the validation error message, if there is one.\r\n this.setState({ \r\n validationMessage: '',\r\n })\r\n }\r\n\r\n // This aborts the editing mode.\r\n cancelEdit = () => {\r\n this.setState({\r\n editCustomer: false,\r\n newCustomer: this.state.customer\r\n });\r\n }\r\n\r\n // Updates the customer with the new information when the user clicks the 'save' button.\r\n updateCustomer = () => {\r\n\r\n if (!this.validateCustomerDetails(this.state.newCustomer))\r\n {\r\n this.setState({ \r\n validationMessage: 'All fields must be filled.',\r\n })\r\n return;\r\n }\r\n\r\n this.setState({ \r\n updateState: 'loading',\r\n })\r\n axios({\r\n method: 'PUT',\r\n url: updateCustomerURL, \r\n headers: AuthService.getAuthHeader().headers,\r\n data: this.state.newCustomer\r\n }).then(() => {\r\n this.setState({ \r\n customer: this.state.newCustomer,\r\n updateState: 'updated',\r\n editCustomer: false,\r\n moreDetails: true\r\n })\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({ \r\n updateState: 'error',\r\n })\r\n })\r\n }\r\n\r\n // Validates that none of the customer's fields are empty before updating.\r\n validateCustomerDetails = (customer) => {\r\n if (customer.FirstName == '' ||\r\n customer.LastName == '' ||\r\n customer.Email == '' ||\r\n customer.UserName == '' ||\r\n customer.Address == '' ||\r\n customer.PhoneNo == '' )\r\n {\r\n return false;\r\n }\r\n else\r\n return true;\r\n }\r\n\r\n // Present an alert for the user to confirm the delete operation.\r\n handleDeleteBtn = () => {\r\n this.setState({deleteState: 'deleteAlert'})\r\n }\r\n\r\n // When the user confirms to delete, this funcion will invoke the deletion function that\r\n // was recieved from the parent component, and then the parent will delete the customer.\r\n handleDeleteCustomer = () => {\r\n this.setState({ \r\n deleteState: 'deleting' \r\n });\r\n this.props.deleteFunc(this.state.customer, this.deleteErrorHandle);\r\n }\r\n\r\n // When an error occurrs while deleting the customer.\r\n deleteErrorHandle = () => {\r\n this.setState({deleteState: 'error'})\r\n }\r\n\r\n render() {\r\n\r\n // Every customer's icon has a different color by using this style.\r\n const pictureStyle = { filter: `hue-rotate(${this.props.colorKey*50}deg)` }\r\n\r\n const customer = this.state.customer;\r\n\r\n let customerFullName = `${customer.FirstName} ${customer.LastName}`\r\n\r\n if (this.state.deleteState == 'deleting')\r\n {\r\n return (\r\n
\r\n \"\"\r\n
\r\n )\r\n }\r\n \r\n else if (!this.state.editCustomer)\r\n {\r\n return (\r\n
\r\n {/* This will render when the component mounts on the first time.\r\n The basic customer details and the action buttons */}\r\n
\r\n \"\"\r\n \r\n \r\n \r\n\r\n
\r\n {/* When the user clicks \"More Details\" this will apear: */}\r\n { this.state.moreDetails &&\r\n\r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n \r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n }\r\n {/* An alert before removing the customer: */}\r\n {this.setState({deleteState: 'none'})}}\r\n >\r\n {`Are you sure you want to delete customer ${this.state.customer.Id}?`}\r\n \r\n \r\n {this.state.deleteState == 'error' &&\r\n \r\n }\r\n
\r\n )\r\n }\r\n else // Edit mode:\r\n {\r\n return (\r\n
\r\n
\r\n\r\n \"\"\r\n \r\n \r\n \r\n \r\n\r\n
\r\n\r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n
\r\n )\r\n }\r\n }\r\n}\r\n\r\nexport default CustomerContainer;","import React, {Component} from 'react';\r\nimport axios from 'axios';\r\nimport AuthService from '../../services/AuthService';\r\nimport ErrorService from '../../services/ErrorService';\r\nimport CustomerContainer from './CustomerContainer';\r\nimport { getAllCustomersURL, deleteCustomerURL } from '../../Constants';\r\nimport loadingData from '../../assets/loading-data.gif';\r\nimport errorIcon from '../../assets/error-icon.png';\r\n\r\n// This component is a part of the admin area.\r\n// It displays all the registered customers in the database and allows to update or delete them.\r\nclass ManageCustomers extends Component {\r\n\r\n state = {\r\n customersState: 'loading',\r\n customers: [],\r\n 'name-filter': '',\r\n 'id-filter': ''\r\n }\r\n\r\n CancelToken = axios.CancelToken;\r\n source = this.CancelToken.source();\r\n\r\n getCustomers = () => {\r\n axios({\r\n url: getAllCustomersURL, \r\n headers: AuthService.getAuthHeader().headers, \r\n cancelToken: this.source.token\r\n }).then( \r\n response => {\r\n return response.data;\r\n }\r\n ).then((data) => {\r\n this.setState({ \r\n customersState: 'loaded',\r\n customers: data\r\n })\r\n }).catch((error) => {\r\n if (axios.isCancel(error))\r\n {\r\n console.log('The AJAX request was canceled.');\r\n }\r\n else\r\n {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({ \r\n customersState: 'error'\r\n })\r\n }\r\n })\r\n }\r\n\r\n // Sends a request to delete the customer from the server.\r\n // This function is called by the child component \"CustomerContainer\"\r\n deleteCustomer = (customer, handleError) => {\r\n axios({\r\n method: 'DELETE',\r\n url: deleteCustomerURL, \r\n headers: AuthService.getAuthHeader().headers,\r\n data: customer\r\n }).then(() => {\r\n this.removeCustomerFromList(customer.Id);\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n handleError();\r\n })\r\n }\r\n\r\n // Removes the customer from the view.\r\n removeCustomerFromList = (customerId) => {\r\n let newCustomersList = [];\r\n this.state.customers.forEach(customer => {\r\n if (customer.Id != customerId)\r\n newCustomersList.push(customer);\r\n });\r\n this.setState({customers: newCustomersList})\r\n }\r\n\r\n handleChange = (e) => {\r\n this.setState({\r\n [e.target.id]: e.target.value\r\n })\r\n }\r\n\r\n // Checks if a given customer is filtered out by its Id or name.\r\n isFilteredOut = (customerId, customerFullName) => {\r\n if (this.state[\"name-filter\"] == '' && this.state[\"id-filter\"] == '')\r\n {\r\n return false;\r\n }\r\n else if (this.state[\"name-filter\"] != '')\r\n {\r\n if (!customerFullName.toUpperCase().includes(this.state['name-filter'].toUpperCase()))\r\n {\r\n return true;\r\n }\r\n }\r\n else if (this.state[\"id-filter\"] != '')\r\n {\r\n if (customerId != this.state['id-filter'])\r\n {\r\n return true;\r\n }\r\n }\r\n else\r\n {\r\n return false;\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.getCustomers();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.source.cancel();\r\n }\r\n\r\n render() { \r\n\r\n if (this.state.customersState == 'loading')\r\n {\r\n return (\r\n \"\"\r\n )\r\n }\r\n if (this.state.customersState == 'error')\r\n {\r\n return (\r\n
\r\n \"error\"\r\n

An error occurred while receiving the data.

\r\n
\r\n )\r\n }\r\n\r\n let colorKey = -1; // This is being used to give different color to each customer icon.\r\n\r\n const displayedCustomers = this.state.customers.map(customer => {\r\n\r\n let customerFullName = `${customer.FirstName} ${customer.LastName}`\r\n\r\n if (this.isFilteredOut(customer.Id, customerFullName))\r\n {\r\n return null;\r\n }\r\n\r\n colorKey++;\r\n\r\n return (\r\n \r\n )\r\n })\r\n\r\n return (\r\n
\r\n

Here you can manage all registered customer accounts.

\r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n { displayedCustomers.length == this.state.customers.length && \r\n \r\n }\r\n
\r\n
\r\n {displayedCustomers}\r\n
\r\n {this.state.customers.length == 0 &&\r\n \r\n }\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default ManageCustomers;","import React, {Component} from 'react';\r\nimport axios from 'axios';\r\nimport SweetAlert from 'react-bootstrap-sweetalert';\r\nimport AuthService from '../../services/AuthService';\r\nimport ErrorService from '../../services/ErrorService';\r\nimport CountriesService from '../../services/CountriesService';\r\nimport Button from '../../components/Button';\r\nimport HiddenField from '../HiddenField';\r\nimport { updateAirlineURL } from '../../Constants';\r\nimport airlineIcon from '../../assets/airline-icon.png';\r\nimport arrowsIcon from '../../assets/arrows-icon.png';\r\nimport editIcon from '../../assets/edit-icon.png';\r\nimport deleteIcon from '../../assets/delete-icon.png';\r\nimport saveIcon from '../../assets/save-icon.png';\r\nimport cancelIcon from '../../assets/cancel-icon.png';\r\nimport loadingIcon from '../../assets/loading-data.gif';\r\n\r\n// This is a child component of the ManageAirlines component.\r\n// It presents all the information about the airline company and allows the user to\r\n// update it or delete the airline.\r\nclass AirlineContainer extends Component {\r\n\r\n state = {\r\n airline: this.props.airline,\r\n newAirline: this.props.airline,\r\n countries: [],\r\n moreDetails: false,\r\n editMode: false,\r\n updateState: 'none',\r\n validationMessage: '',\r\n deleteState: 'none',\r\n errorState: false\r\n }\r\n\r\n // Gets all the countries from the server, so they can be used in the dropdowns.\r\n getCountries = async () => {\r\n\r\n let countries = await CountriesService.getCountries();\r\n if (countries != null)\r\n {\r\n this.setState({\r\n countries: countries,\r\n });\r\n }\r\n else\r\n {\r\n this.setState({ errorState: true})\r\n }\r\n }\r\n\r\n // When the moreDetails state is true, the component will present more information of the airline:\r\n // username, password, and origin country.\r\n toggleMoreDetails = () => {\r\n this.setState({moreDetails: !this.state.moreDetails});\r\n }\r\n\r\n // When the user types any changes to the fields in edit mode, it will handle it.\r\n // All the changes will be reflected on the 'newAirline' state, while the regular 'airline' state\r\n // Will stay the same.\r\n handleChange = (e) => {\r\n let airlineClone = Object.assign({}, this.state.newAirline);\r\n airlineClone[e.target.id] = e.target.value;\r\n this.setState({\r\n newAirline: airlineClone\r\n })\r\n\r\n // Removes the validation error message, if there is one.\r\n this.setState({ \r\n validationMessage: '',\r\n })\r\n }\r\n\r\n // This aborts the editing mode.\r\n cancelEdit = () => {\r\n this.setState({\r\n editMode: false,\r\n newAirline: this.state.airline\r\n });\r\n }\r\n\r\n // Updates the airline with the new information when the user clicks the 'save' button.\r\n updateAirline = () => {\r\n\r\n if (!this.validateAirlineDetails(this.state.newAirline))\r\n {\r\n this.setState({ \r\n validationMessage: 'All fields must be filled.',\r\n })\r\n return;\r\n }\r\n\r\n this.setState({ \r\n updateState: 'loading',\r\n })\r\n axios({\r\n method: 'PUT',\r\n url: updateAirlineURL, \r\n headers: AuthService.getAuthHeader().headers,\r\n data: this.state.newAirline\r\n }).then(() => {\r\n this.setState({\r\n airline: this.state.newAirline,\r\n updateState: 'updated',\r\n editMode: false,\r\n moreDetails: true\r\n });\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({ \r\n updateState: 'error',\r\n })\r\n })\r\n }\r\n\r\n // Validates that none of the customer's fields are empty before updating.\r\n validateAirlineDetails = (airline) => {\r\n if (airline.Name == '' ||\r\n airline.Email == '' ||\r\n airline.UserName == '' )\r\n {\r\n return false;\r\n }\r\n else\r\n return true;\r\n }\r\n\r\n // Present an alert for the user to confirm the delete operation.\r\n handleDeleteBtn = () => {\r\n this.setState({deleteState: 'deleteAlert'})\r\n }\r\n\r\n // When the user confirms to delete, this funcion will invoke the deletion function that\r\n // was recieved from the parent component, and then the parent will delete the airline.\r\n handleDeleteAirline = () => {\r\n this.setState({ \r\n deleteState: 'deleting' \r\n });\r\n this.props.deleteFunc(this.state.airline, this.deleteErrorHandle);\r\n }\r\n\r\n // When an error occurrs while deleting the airline.\r\n deleteErrorHandle = () => {\r\n this.setState({deleteState: 'error'})\r\n }\r\n\r\n // Gets the name of the country by its Id.\r\n getCountryName = (id) => {\r\n let country = this.state.countries.find(country => {\r\n return country.Id == id;\r\n })\r\n return country.Name;\r\n }\r\n\r\n componentDidMount() {\r\n this.getCountries();\r\n }\r\n\r\n render() {\r\n\r\n // Every airline's icon has a different color by using this style.\r\n const pictureStyle = { filter: `hue-rotate(${this.props.colorKey*50}deg)` }\r\n\r\n const airline = this.state.airline;\r\n\r\n if (this.state.deleteState == 'deleting')\r\n {\r\n return (\r\n
\r\n \"\"\r\n
\r\n )\r\n }\r\n else if (!this.state.editMode)\r\n {\r\n return (\r\n
\r\n {/* This will render when the component mounts on the first time.\r\n The basic airline details and the action buttons */}\r\n
\r\n \"\"\r\n \r\n \r\n \r\n\r\n
\r\n {/* When the user clicks \"More Details\" this will apear: */}\r\n { this.state.moreDetails &&\r\n\r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n \r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n }\r\n {/* An alert before removing the airline: */}\r\n {this.setState({deleteState: 'none'})}}\r\n >\r\n {`Are you sure you want to delete '${this.state.airline.Name}'?`}\r\n \r\n\r\n {this.state.deleteState == 'error' &&\r\n \r\n }\r\n
\r\n )\r\n }\r\n else // Edit mode:\r\n {\r\n if (this.state.errorState == true)\r\n {\r\n return (\r\n
\r\n \r\n
\r\n )\r\n }\r\n\r\n return (\r\n
\r\n
\r\n\r\n \"\"\r\n \r\n \r\n \r\n\r\n
\r\n\r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n
\r\n )\r\n }\r\n }\r\n}\r\n\r\nexport default AirlineContainer;","import React, {Component} from 'react';\r\nimport axios from 'axios';\r\nimport AuthService from '../../services/AuthService';\r\nimport ErrorService from '../../services/ErrorService';\r\nimport AirlineContainer from './AirlineContainer';\r\nimport { getAllAirlinesURL, deleteAirlineURL } from '../../Constants';\r\nimport loadingData from '../../assets/loading-data.gif';\r\nimport errorIcon from '../../assets/error-icon.png';\r\n\r\n// This component is a part of the admin area.\r\n// It displays all the registered airline companies in the database, and allows the user to\r\n// update or remove them.\r\nclass ManageAirlines extends Component {\r\n\r\n state = {\r\n dataState: 'loading',\r\n airlines: [],\r\n 'name-filter': '',\r\n 'id-filter': '',\r\n }\r\n\r\n CancelToken = axios.CancelToken;\r\n source = this.CancelToken.source();\r\n\r\n // Getting all airline companies from the server.\r\n getAirlines = () => {\r\n axios({\r\n url: getAllAirlinesURL, \r\n cancelToken: this.source.token\r\n }).then((response) => {\r\n this.setState({ \r\n dataState: 'loaded',\r\n airlines: response.data\r\n })\r\n }).catch((error) => {\r\n if (axios.isCancel(error))\r\n {\r\n console.log('The AJAX request was canceled.');\r\n }\r\n else\r\n {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({ \r\n dataState: 'error'\r\n })\r\n }\r\n })\r\n }\r\n\r\n // Deletes the airline from the server.\r\n deleteAirline = (airline, handleError) => {\r\n axios({\r\n method: 'DELETE',\r\n url: deleteAirlineURL, \r\n headers: AuthService.getAuthHeader().headers,\r\n data: airline\r\n }).then(() => {\r\n this.removeAirlineFromList(airline.Id);\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n handleError();\r\n })\r\n }\r\n\r\n // Removes the airline from the list (after it was deleted).\r\n removeAirlineFromList = (airlineId) => {\r\n let newAirlinesList = [];\r\n this.state.airlines.forEach(airline => {\r\n if (airline.Id != airlineId)\r\n newAirlinesList.push(airline);\r\n });\r\n this.setState({airlines: newAirlinesList})\r\n }\r\n\r\n // Handles the changes in the filter fields.\r\n handleChange = (e) => {\r\n this.setState({\r\n [e.target.id]: e.target.value\r\n })\r\n }\r\n\r\n // Checks if a given airline is filtered out by its Id or name.\r\n isFilteredOut = (airline) => {\r\n if (this.state[\"name-filter\"] == '' && this.state[\"id-filter\"] == '')\r\n {\r\n return false;\r\n }\r\n else if (this.state[\"name-filter\"] != '')\r\n {\r\n if (!airline.Name.toUpperCase().includes(this.state['name-filter'].toUpperCase()))\r\n {\r\n return true;\r\n }\r\n }\r\n else if (this.state[\"id-filter\"] != '')\r\n {\r\n if (airline.Id != this.state['id-filter'])\r\n {\r\n return true;\r\n }\r\n }\r\n else\r\n {\r\n return false;\r\n }\r\n }\r\n\r\n initializeData = async () => {\r\n this.getAirlines();\r\n }\r\n\r\n componentDidMount() {\r\n this.initializeData();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.source.cancel();\r\n }\r\n\r\n render() { \r\n\r\n if (this.state.dataState == 'loading')\r\n {\r\n return (\r\n \"\"\r\n )\r\n }\r\n if (this.state.dataState == 'error')\r\n {\r\n return (\r\n
\r\n \"\"\r\n

An error occurred while receiving the data.

\r\n
\r\n )\r\n }\r\n\r\n let colorKey = -1; // This is being used to give different color to each airline's icon.\r\n\r\n // Mapping the airlines to AirlineContainer components.\r\n const displayedAirlines = this.state.airlines.map(airline => {\r\n\r\n if (this.isFilteredOut(airline))\r\n {\r\n return null;\r\n }\r\n\r\n colorKey++;\r\n\r\n return (\r\n \r\n )\r\n })\r\n\r\n return (\r\n
\r\n

Here you can manage all registered airlines accounts.

\r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n { displayedAirlines.length == this.state.airlines.length && \r\n \r\n }\r\n
\r\n
\r\n {displayedAirlines}\r\n
\r\n {this.state.airlines.length == 0 &&\r\n \r\n }\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default ManageAirlines;","import React, {Component} from 'react';\r\nimport {Switch, Route, NavLink, Redirect} from 'react-router-dom';\r\nimport ViewService from '../services/ViewService';\r\nimport AdminInbox from './Admin/AdminInbox';\r\nimport ManageCustomers from './Admin/ManageCustomers';\r\nimport ManageAirlines from './Admin/ManageAirlines';\r\nimport '../styles/Admin.css';\r\n\r\n// This is the admin area page.\r\n// It contains the inbox, the manage-customers and the manage-airlines components.\r\nclass Admin extends Component {\r\n\r\n state = {\r\n mobileNavSelect: 'inbox'\r\n }\r\n\r\n handleChange = (e) => {\r\n this.setState({\r\n mobileNavSelect: e.target.value\r\n })\r\n }\r\n\r\n render() {\r\n const navActiveStyle = {\r\n fontWeight: 500,\r\n backgroundColor: 'rgb(255, 255, 255, 0.4)'\r\n }\r\n return (\r\n
\r\n
Administrator Area
\r\n\r\n {!ViewService.isMobileView() && // Desktop view\r\n
\r\n {/* A side navigation bar: */}\r\n
\r\n Inbox\r\n Customer Accounts\r\n Airline Accounts\r\n
\r\n {/* The child components will be rendered here: */}\r\n
\r\n \r\n \r\n \r\n \r\n \r\n {/* Default page: */}\r\n { this.props.path == '/user-page' && \r\n \r\n }\r\n
\r\n
\r\n }\r\n\r\n {ViewService.isMobileView() && // Mobile view\r\n
\r\n {/* A side navigation bar: */}\r\n \r\n\r\n {this.state.mobileNavSelect == 'inbox' &&\r\n \r\n }\r\n\r\n {this.state.mobileNavSelect == 'customer-accounts' &&\r\n \r\n }\r\n\r\n {this.state.mobileNavSelect == 'airline-accounts' &&\r\n \r\n }\r\n\r\n
\r\n \r\n \r\n \r\n \r\n \r\n {/* Default page: */}\r\n { this.props.path == '/user-page' && \r\n \r\n }\r\n
\r\n
\r\n }\r\n\r\n\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default Admin;","import React, {Component} from 'react';\r\nimport SweetAlert from 'react-bootstrap-sweetalert';\r\nimport DateTimeService from '../../services/DateTimeService';\r\nimport Button from '../../components/Button';\r\nimport cancelIcon from '../../assets/cancel-icon.png';\r\nimport loadingIcon from '../../assets/loading-data.gif';\r\nimport planeArrow from '../../assets/plane-arrow.png';\r\n\r\n// This component contains all the information about the flight ticket.\r\n// It also allows the user to remove (cancel) it.\r\nclass TicketContainer extends Component {\r\n\r\n state = {\r\n flight: this.props.flight,\r\n deleteState: 'none'\r\n }\r\n\r\n // Present an alert for the user to confirm the delete operation.\r\n showDeleteAlert = () => {\r\n this.setState({deleteState: 'deleteAlert'})\r\n }\r\n\r\n // When the user confirms to delete, this funcion will invoke the deletion function that\r\n // was recieved from the parent component, and then the parent will delete the ticket.\r\n handleDeleteAirline = () => {\r\n this.setState({ \r\n deleteState: 'deleting' \r\n });\r\n this.props.deleteFunc(this.state.flight.TicketId, this.deleteErrorHandle);\r\n }\r\n\r\n // When an error occurrs while deleting the airline.\r\n deleteErrorHandle = () => {\r\n this.setState({deleteState: 'error'})\r\n }\r\n\r\n render() {\r\n\r\n const flight = this.state.flight;\r\n\r\n if (this.state.deleteState == 'deleting')\r\n {\r\n return (\r\n
\r\n \"\"\r\n
\r\n )\r\n }\r\n \r\n const departureDateTime = new Date(flight.DepartureTime);\r\n const landingDateTime = new Date(flight.LandingTime)\r\n\r\n const departureTime = DateTimeService.getTimeString(departureDateTime);\r\n const landingTime = DateTimeService.getTimeString(new Date(flight.LandingTime));\r\n const departureDate = departureDateTime.getDate() + '/' + (departureDateTime.getMonth() + 1) + '/' + departureDateTime.getFullYear();\r\n\r\n const flightTime = DateTimeService.getFlightDuration(departureDateTime, landingDateTime);\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n \r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \"---\" className=\"plane-arrow\"/>\r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n )\r\n \r\n }\r\n \r\n}\r\n\r\nexport default TicketContainer;","import React, {Component} from 'react';\r\nimport axios from 'axios';\r\nimport SweetAlert from 'react-bootstrap-sweetalert';\r\nimport AuthService from '../../services/AuthService';\r\nimport ErrorService from '../../services/ErrorService';\r\nimport {UserContext} from '../../UserContext';\r\nimport TicketContainer from './TicketContainer';\r\nimport { getCustomerFlightsURL, deleteTicketURL } from '../../Constants';\r\nimport loadingData from '../../assets/loading-data.gif';\r\nimport errorIcon from '../../assets/error-icon.png';\r\nimport infoIcon from '../../assets/info-icon.png';\r\nimport '../../styles/Customer.css';\r\n\r\n// This component is a part of the customer area.\r\n// It displays all the customer's flight tickets and allows him to cancel them.\r\nclass ManageTickets extends Component {\r\n\r\n // In order to display the information about the tickets, the component gets\r\n // the whole flights from the server.\r\n\r\n // When a customer chooses to cancel a ticket, it will be deleted.\r\n\r\n state = {\r\n flights: [],\r\n flightsState: '',\r\n ticketDeleted: false\r\n }\r\n\r\n CancelToken = axios.CancelToken;\r\n source = this.CancelToken.source();\r\n\r\n // Gets all the flights which this customer owns a ticket to.\r\n getCustomerFlights = () => {\r\n \r\n this.setState({ \r\n flightsState: 'loading'\r\n }) \r\n\r\n axios({\r\n url: getCustomerFlightsURL, \r\n headers: AuthService.getAuthHeader().headers,\r\n }).then((response) => { \r\n this.setState({ \r\n flights: response.data,\r\n flightsState: 'loaded'\r\n })\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({ \r\n flightsState: 'error'\r\n })\r\n })\r\n \r\n }\r\n\r\n // Deletes the selected ticket.\r\n deleteTicket = (ticketId, handleError) => {\r\n axios({\r\n method: 'DELETE',\r\n url: deleteTicketURL + '/' + ticketId, \r\n headers: AuthService.getAuthHeader().headers,\r\n }).then(() => {\r\n this.removeTicketFromList(ticketId);\r\n this.setState({ticketDeleted: true});\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n handleError();\r\n })\r\n }\r\n\r\n // Removes the deleted ticket from the view.\r\n removeTicketFromList = (ticketId) => {\r\n let newTicketsList = [];\r\n this.state.flights.forEach(flight => {\r\n if (flight.TicketId != ticketId)\r\n newTicketsList.push(flight);\r\n });\r\n this.setState({flights: newTicketsList})\r\n }\r\n\r\n componentDidMount() {\r\n this.getCustomerFlights();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.source.cancel();\r\n }\r\n\r\n render() {\r\n if (this.state.flightsState == 'loading')\r\n {\r\n return (\r\n
\r\n \"\"\r\n
\r\n )\r\n }\r\n if (this.state.flightsState == 'error')\r\n {\r\n return (\r\n
\r\n \"error\"\r\n

An error occurred while receiving the data.

\r\n
\r\n )\r\n }\r\n // Mapping the flights to ticket container components.\r\n const tickets = this.state.flights.map(flight => {\r\n\r\n return (\r\n \r\n )\r\n });\r\n\r\n let instructions = 'Here you can see and manage all your flight tickets.'\r\n\r\n const info = 'Only tickets for future flights will be displayed here.'\r\n\r\n if (tickets.length == 0)\r\n {\r\n instructions = \"No tickets to show.\"\r\n }\r\n\r\n return (\r\n
\r\n\r\n

\r\n {instructions} \r\n \"\"\r\n

\r\n \r\n
\r\n {tickets}\r\n
\r\n {/* A notice that the ticket was deleted: */}\r\n {this.setState({ticketDeleted: false})}}\r\n >\r\n {`You will get a refund to your credit card in 24 hours.`}\r\n \r\n
\r\n )\r\n }\r\n}\r\n\r\nManageTickets.contextType = UserContext;\r\n\r\nexport default ManageTickets;","import React, {Component} from 'react';\r\nimport axios from 'axios';\r\nimport SweetAlert from 'react-bootstrap-sweetalert';\r\nimport AuthService from '../services/AuthService';\r\nimport ErrorService from '../services/ErrorService';\r\nimport Button from './Button';\r\nimport { changeCustomerPasswordURL, changeAirlinePasswordURL } from '../Constants';\r\nimport editIcon from '../assets/edit-icon.png';\r\nimport saveIcon from '../assets/save-icon.png';\r\nimport cancelIcon from '../assets/cancel-icon.png';\r\nimport loadingIcon from '../assets/loading-data.gif';\r\nimport '../styles/PasswordChange.css';\r\n\r\n// This handles the rendering and changing of passwords for the users.\r\nclass PasswordChange extends Component {\r\n\r\n state = {\r\n changeBtnClicked: false,\r\n currentPassword: '',\r\n newPassword: '',\r\n changeState: 'none'\r\n }\r\n\r\n // Handles the change of the passwords fields.\r\n handleChange = (e) => {\r\n this.setState({[e.target.id]: e.target.value});\r\n }\r\n\r\n // Calls the API to change the password of the user.\r\n changePassword = () => {\r\n\r\n if (!this.validateFields())\r\n {\r\n this.setState({changeState: 'fieldsNotValid'});\r\n return;\r\n }\r\n\r\n this.setState({changeState: 'loading'});\r\n\r\n let requestURL;\r\n if (this.props.userType == 'customer')\r\n requestURL = changeCustomerPasswordURL;\r\n else if (this.props.userType == 'airline')\r\n requestURL = changeAirlinePasswordURL;\r\n\r\n axios({\r\n method: 'PUT',\r\n url: requestURL, \r\n headers: AuthService.getAuthHeader().headers,\r\n data: [this.state.currentPassword, this.state.newPassword]\r\n }).then(() => { \r\n this.setState({changeState: 'success'});\r\n this.props.handlePasswordChange(this.state.newPassword);\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({ \r\n changeState: 'error',\r\n })\r\n })\r\n }\r\n\r\n // Checks if one of the fields are empty.\r\n validateFields = () => {\r\n if (this.state.currentPassword != '' && \r\n this.state.newPassword != '')\r\n {\r\n return true;\r\n }\r\n else\r\n {\r\n return false;\r\n }\r\n }\r\n\r\n // Hides the 'pop-up' form of the password changing.\r\n closePopUp = () => {\r\n this.setState({\r\n changeState: 'none',\r\n changeBtnClicked: false\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n {/* The password field with the starlets */}\r\n \r\n
\r\n \r\n \"\"this.setState({changeBtnClicked: true})}/>\r\n
\r\n {/* The 'pop-up' form where the users fills the old and new password */}\r\n {this.state.changeBtnClicked && \r\n
\r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n\r\n
\r\n
\r\n }\r\n\r\n \r\n \r\n\r\n this.setState({changeState: 'none'})}\r\n >\r\n \r\n\r\n this.setState({changeState: 'none'})}\r\n >\r\n \r\n\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default PasswordChange;","import React, {Component} from 'react';\r\nimport axios from 'axios';\r\nimport SweetAlert from 'react-bootstrap-sweetalert';\r\nimport AuthService from '../../services/AuthService';\r\nimport ErrorService from '../../services/ErrorService';\r\nimport {UserContext} from '../../UserContext';\r\nimport Button from '../Button';\r\nimport HiddenField from '../HiddenField';\r\nimport PasswordChange from '../PasswordChange';\r\nimport { modifyCustomerDetailsURL } from '../../Constants';\r\nimport editIcon from '../../assets/edit-icon.png';\r\nimport saveIcon from '../../assets/save-icon.png';\r\nimport cancelIcon from '../../assets/cancel-icon.png';\r\nimport loadingIcon from '../../assets/loading-data.gif';\r\nimport '../../styles/Customer.css';\r\n\r\n// This component is a part of the customer area.\r\n// It displays all the customer's details and allows him to change them.\r\nclass CustomerDetails extends Component {\r\n \r\n state = {\r\n customer: this.context.userInfo.user,\r\n newCustomer: this.context.userInfo.user,\r\n editMode: false,\r\n validationAlert: false,\r\n updateState: 'none'\r\n }\r\n\r\n // When the user clicks the 'Edit' button:\r\n setEditMode = () => {\r\n this.setState({editMode: true})\r\n }\r\n\r\n // When the user clicks the 'Cancel' button:\r\n cancelEditMode = () => {\r\n this.setState({\r\n editMode: false,\r\n newCustomer: this.state.customer\r\n })\r\n }\r\n\r\n // Handles the changes in the form details form.\r\n handleChange = (e) => {\r\n let customerClone = Object.assign({}, this.state.newCustomer);\r\n customerClone[e.target.id] = e.target.value;\r\n this.setState({\r\n newCustomer: customerClone\r\n })\r\n }\r\n\r\n // Validates that none of the customer's fields are empty before updating.\r\n validateCustomerDetails = (customer) => {\r\n if (customer.FirstName == '' ||\r\n customer.LastName == '' ||\r\n customer.Email == '' ||\r\n customer.UserName == '' ||\r\n customer.Password == '' ||\r\n customer.Address == '' ||\r\n customer.PhoneNo == '' )\r\n {\r\n return false;\r\n }\r\n else\r\n return true;\r\n }\r\n\r\n // Updating the customer with the new details.\r\n updateCustomerDetails = () => {\r\n if (!this.validateCustomerDetails(this.state.newCustomer))\r\n {\r\n this.setState({ \r\n validationAlert: true,\r\n })\r\n return;\r\n }\r\n\r\n this.setState({ \r\n updateState: 'loading'\r\n })\r\n\r\n axios({\r\n method: 'PUT',\r\n url: modifyCustomerDetailsURL, \r\n headers: AuthService.getAuthHeader().headers,\r\n data: this.state.newCustomer\r\n }).then(() => {\r\n this.renewUserToken();\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({ \r\n updateState: 'error',\r\n })\r\n })\r\n }\r\n\r\n // Renewing the token with the updated details.\r\n renewUserToken = () => {\r\n let newCustUsername = this.state.newCustomer.UserName;\r\n let newCustPassword = this.state.newCustomer.Password;\r\n if (this.context.updateUserInfo([newCustUsername, newCustPassword]))\r\n {\r\n this.setState({ \r\n customer: this.state.newCustomer,\r\n updateState: 'updated',\r\n editMode: false\r\n })\r\n }\r\n else\r\n {\r\n this.setState({ \r\n customer: this.state.newCustomer,\r\n updateState: 'tokenUpdateError',\r\n editMode: false\r\n })\r\n }\r\n }\r\n\r\n // When the customer changes its password using the PasswordChange component, it handles everything:\r\n handlePasswordChange = (newPassword) => {\r\n let customerClone = Object.assign({}, this.state.newCustomer);\r\n customerClone.Password = newPassword;\r\n this.setState({\r\n newCustomer: customerClone\r\n })\r\n this.renewUserToken();\r\n }\r\n\r\n render() {\r\n\r\n // A shorthand\r\n const newCustomer = this.state.newCustomer;\r\n\r\n return (\r\n
\r\n
\r\n\r\n {/* When in edit mode, the details text blocks will be replaced with editable fields */}\r\n\r\n {/* Left Column */}\r\n
\r\n\r\n
\r\n \r\n {!this.state.editMode &&\r\n \r\n }\r\n {this.state.editMode &&\r\n \r\n }\r\n
\r\n
\r\n \r\n {!this.state.editMode &&\r\n \r\n }\r\n {this.state.editMode &&\r\n \r\n }\r\n
\r\n
\r\n \r\n {!this.state.editMode &&\r\n \r\n }\r\n {this.state.editMode &&\r\n \r\n }\r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n \r\n {/* Right Column */}\r\n
\r\n\r\n
\r\n \r\n {!this.state.editMode &&\r\n \r\n }\r\n {this.state.editMode &&\r\n \r\n }\r\n
\r\n
\r\n \r\n {!this.state.editMode &&\r\n \r\n }\r\n {this.state.editMode &&\r\n \r\n }\r\n
\r\n
\r\n \r\n {!this.state.editMode &&\r\n \r\n }\r\n {this.state.editMode &&\r\n \r\n }\r\n
\r\n
\r\n \r\n {!this.state.editMode &&\r\n \r\n }\r\n {this.state.editMode &&\r\n
\r\n \r\n \r\n
\r\n }\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n this.setState({validationAlert: false})}\r\n >\r\n \r\n\r\n this.setState({updateState: 'none'})}\r\n >\r\n \r\n\r\n this.setState({updateState: 'none'})}\r\n >\r\n We recommended you to logout and then login again.\r\n \r\n\r\n {!this.state.editMode &&\r\n
\r\n }\r\n\r\n \r\n )\r\n }\r\n}\r\n\r\nCustomerDetails.contextType = UserContext;\r\n\r\nexport default CustomerDetails;","import React, {Component} from 'react';\r\nimport {Switch, Route, NavLink, Redirect} from 'react-router-dom';\r\nimport SweetAlert from 'react-bootstrap-sweetalert';\r\nimport {UserContext} from '../UserContext';\r\nimport ViewService from '../services/ViewService';\r\nimport ManageTickets from './Customer/ManageTickets';\r\nimport CustomerDetails from './Customer/CustomerDetails';\r\nimport '../styles/Customer.css';\r\n\r\n// This is the customer area page.\r\n// It contains the manage-tickets and the customer-details components.\r\nclass Customer extends Component {\r\n\r\n state = {\r\n savedTicketState: 'none',\r\n savedTicketParams: '',\r\n mobileNavSelect: 'manage-tickets'\r\n }\r\n\r\n // Checks if the browser holds a saved ticket.\r\n // If a ticket was found, it shows an alert.\r\n checkForSavedTicket = () => {\r\n if (localStorage.hasOwnProperty('ticket'))\r\n {\r\n this.setState({\r\n savedTicketParams: this.getTicketParams(),\r\n savedTicketState: 'alert'\r\n })\r\n localStorage.removeItem('ticket')\r\n }\r\n }\r\n\r\n // If a saved ticket was found, it gets its information and builds query parameters string\r\n getTicketParams = () => {\r\n let ticket = JSON.parse(localStorage.getItem('ticket'));\r\n let params = '/purchase-ticket/params?';\r\n params += 'flight-type=' + ticket.ticketType;\r\n params += '&departure-flight-id=' + ticket.departureFlight;\r\n if (ticket.ticketType == 'roundtrip')\r\n {\r\n params += '&return-flight-id=' + ticket.returnFlight;\r\n }\r\n return params;\r\n }\r\n\r\n handleChange = (e) => {\r\n this.setState({\r\n mobileNavSelect: e.target.value\r\n })\r\n }\r\n\r\n componentDidMount() {\r\n this.checkForSavedTicket();\r\n }\r\n\r\n render() {\r\n const navActiveStyle = {\r\n fontWeight: 500,\r\n backgroundColor: 'rgb(255, 255, 255, 0.4)'\r\n }\r\n return (\r\n
\r\n
Your Personal Area
\r\n\r\n {!ViewService.isMobileView() && // Dekstop view\r\n
\r\n {/* A side navigation bar: */}\r\n
\r\n My Tickets\r\n Personal Details\r\n
\r\n {/* The child components will be rendered here: */}\r\n
\r\n \r\n \r\n \r\n \r\n {/* Default page: */}\r\n { this.props.path == '/user-page' && \r\n \r\n }\r\n
\r\n
\r\n }\r\n\r\n {ViewService.isMobileView() && // Mobile view\r\n
\r\n {/* A side navigation bar: */}\r\n \r\n\r\n {this.state.mobileNavSelect == 'manage-tickets' &&\r\n \r\n }\r\n\r\n {this.state.mobileNavSelect == 'customer-details' &&\r\n \r\n }\r\n\r\n {/* The child components will be rendered here: */}\r\n
\r\n \r\n \r\n \r\n \r\n {/* Default page: */}\r\n { this.props.path == '/user-page' && \r\n \r\n }\r\n
\r\n
\r\n }\r\n\r\n\r\n {/* An alert when a saved ticket was found: */}\r\n this.setState({savedTicketState: 'confirmed'})}\r\n onCancel={()=>this.setState({savedTicketState: 'none'})}\r\n >\r\n Would you like to continue to buy the ticket you selected?\r\n \r\n {this.state.savedTicketState == 'confirmed' &&\r\n \r\n }\r\n
\r\n )\r\n }\r\n}\r\n\r\nCustomer.contextType = UserContext;\r\n\r\nexport default Customer;","import React, {Component} from 'react';\r\nimport axios from 'axios';\r\nimport SweetAlert from 'react-bootstrap-sweetalert';\r\nimport AuthService from '../../services/AuthService';\r\nimport ErrorService from '../../services/ErrorService';\r\nimport CountriesService from '../../services/CountriesService';\r\nimport DateTimeService from '../../services/DateTimeService';\r\nimport Button from '../../components/Button';\r\nimport { updateFlightURL } from '../../Constants';\r\nimport editIcon from '../../assets/edit-icon.png';\r\nimport cancelIcon from '../../assets/cancel-icon.png';\r\nimport saveIcon from '../../assets/save-icon.png';\r\nimport deleteIcon from '../../assets/delete-icon.png';\r\nimport planeArrow from '../../assets/plane-arrow.png';\r\nimport loadingIcon from '../../assets/loading-data.gif';\r\n\r\n// This is a child component of the manage-flights component.\r\n// It renders all the information about the fligh and allows the user to update or cancel it.\r\nclass FlightContainer extends Component {\r\n\r\n // Only scheduled flights (that didn't departure yet) can be updated or deleted.\r\n\r\n state = {\r\n flight: this.props.flight, \r\n newFlight: this.props.flight,\r\n deleteState: 'none',\r\n editMode: false,\r\n editState: 'none',\r\n countries: [],\r\n countriesState: 'loading',\r\n errorMessage: ''\r\n }\r\n \r\n // When the user confirms to the delete the flight.\r\n handleDeleteFlight = () => {\r\n this.setState({ deleteState: 'deleting' });\r\n this.props.deleteFunc(this.state.flight.Id, this.handleDeleteError);\r\n }\r\n\r\n handleDeleteError = () => {\r\n this.setState({deleteState: 'error'});\r\n }\r\n\r\n // Gets the countries from the service, so it could be used in the dropdowns.\r\n getCountries = async () => {\r\n \r\n let countries = await CountriesService.getCountries();\r\n if (countries != null)\r\n {\r\n this.setState({\r\n countries: countries,\r\n countriesState: 'loaded'\r\n });\r\n }\r\n else\r\n {\r\n this.setState({ countriesState: 'error'})\r\n }\r\n }\r\n\r\n // Gets the country's name by its Id.\r\n getCountryName = (id) => {\r\n let country = this.state.countries.find(country => {\r\n return country.Id == id;\r\n })\r\n\r\n return country.Name;\r\n }\r\n\r\n // Gets the flight's status.\r\n getFlightStatus = (depDate, landDate) => {\r\n if (depDate > new Date())\r\n {\r\n return 'scheduled';\r\n }\r\n if (depDate <= new Date() && landDate > new Date())\r\n {\r\n return 'departured';\r\n }\r\n if (landDate <= new Date())\r\n {\r\n return 'landed';\r\n }\r\n }\r\n\r\n // Handles the changes of the fields in the update form.\r\n handleChange = (e) => {\r\n let flightClone = Object.assign({}, this.state.newFlight);\r\n flightClone[e.target.name] = e.target.value;\r\n this.setState({\r\n newFlight: flightClone\r\n })\r\n }\r\n\r\n // Updates the flight's information in the server.\r\n updateFlight = () => {\r\n if (!this.validateFlightDetails(this.state.newFlight))\r\n {\r\n return;\r\n } \r\n this.setState({ \r\n editState: 'updating',\r\n })\r\n axios({\r\n method: 'PUT',\r\n url: updateFlightURL, \r\n headers: AuthService.getAuthHeader().headers,\r\n data: this.state.newFlight\r\n }).then(() => {\r\n \r\n this.setState({ \r\n editState: 'none',\r\n editMode: false,\r\n flight: this.state.newFlight\r\n })\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({ \r\n editState: 'error',\r\n })\r\n })\r\n }\r\n\r\n // Checks that all the fields of the flight details are valid.\r\n validateFlightDetails = (flight) => {\r\n\r\n if (flight.OriginCountryCode == flight.DestinationCountryCode)\r\n {\r\n this.setState({ errorMessage: 'Origin country and destination country cannot be the same'})\r\n return false;\r\n }\r\n\r\n const departureTime = new Date(flight.DepartureTime);\r\n const landingTime = new Date(flight.LandingTime);\r\n if (landingTime < departureTime)\r\n {\r\n this.setState({ errorMessage: 'Landing time must be after departure time.'})\r\n return false;\r\n }\r\n \r\n if (flight.RemainingTickets == '')\r\n {\r\n this.setState({ errorMessage: 'All fields must be filled.'})\r\n return false;\r\n }\r\n\r\n const tickets = parseInt(flight.RemainingTickets);\r\n if (tickets < 0 || tickets > 1000)\r\n {\r\n this.setState({ errorMessage: 'Tickets number must be between 0 and 1000.'})\r\n return false;\r\n }\r\n\r\n if (flight.TicketPrice == '')\r\n {\r\n this.setState({ errorMessage: 'All fields must be filled.'})\r\n return false;\r\n }\r\n\r\n const ticketPrice = parseInt(flight.TicketPrice);\r\n if (ticketPrice < 0 || ticketPrice > 50000)\r\n {\r\n this.setState({ errorMessage: 'Ticket price must be between 0 and 50,000.'})\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // Toggles off the edit mode.\r\n cancelEdit = () => {\r\n this.setState({ editMode: false });\r\n }\r\n\r\n componentDidMount() {\r\n this.getCountries();\r\n }\r\n\r\n render() {\r\n\r\n const flight = this.state.flight;\r\n\r\n if (this.state.deleteState == 'deleting')\r\n {\r\n return (\r\n
\r\n \"\"\r\n
\r\n )\r\n }\r\n \r\n const departureDateTime = new Date(flight.DepartureTime);\r\n const landingDateTime = new Date(flight.LandingTime);\r\n\r\n let flightStatus = this.getFlightStatus(departureDateTime, landingDateTime)\r\n\r\n const departureTime = DateTimeService.getTimeString(departureDateTime);\r\n const landingTime = DateTimeService.getTimeString(new Date(flight.LandingTime));\r\n const departureDate = departureDateTime.getDate() + '/' + (departureDateTime.getMonth() + 1) + '/' + departureDateTime.getFullYear();\r\n\r\n const flightTime = DateTimeService.getFlightDuration(departureDateTime, landingDateTime);\r\n\r\n if (this.state.countriesState == 'loading')\r\n {\r\n return null;\r\n }\r\n\r\n if (this.state.countriesState == 'error')\r\n {\r\n return (\r\n
\r\n \r\n
\r\n )\r\n }\r\n\r\n const countriesOptions = this.state.countries.map(country => {\r\n return (\r\n \r\n )\r\n });\r\n\r\n return (\r\n \r\n
\r\n {/* Display mode */}\r\n {this.state.editMode == false &&\r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \"---\" className=\"plane-arrow\"/>\r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n {flightStatus == 'scheduled' && \r\n
\r\n
\r\n }\r\n {flightStatus == 'departured' &&\r\n \r\n }\r\n {flightStatus == 'landed' &&\r\n \r\n }\r\n\r\n
\r\n }\r\n {/* Edit mode */}\r\n {this.state.editMode == true &&\r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n }\r\n\r\n {/* An alert before removing the flight: */}\r\n {this.setState({deleteState: 'none'})}}\r\n >\r\n {`Are you sure you want to cacnel this flight?`}\r\n \r\n\r\n {/* Validation error message: */}\r\n this.setState({errorMessage: ''})}\r\n >\r\n \r\n\r\n {/* Update error message: */}\r\n this.setState({editState: 'none'})}\r\n >\r\n \r\n\r\n {this.state.deleteState == 'error' &&\r\n \r\n }\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default FlightContainer;","import React, {Component} from 'react';\r\nimport axios from 'axios';\r\nimport AuthService from '../../services/AuthService';\r\nimport ErrorService from '../../services/ErrorService';\r\nimport {UserContext} from '../../UserContext';\r\nimport FlightContainer from './FlightContainer';\r\nimport { getAirlineFlightsURL, cancelFlightURL } from '../../Constants';\r\nimport loadingData from '../../assets/loading-data.gif';\r\nimport errorIcon from '../../assets/error-icon.png'\r\nimport infoIcon from '../../assets/info-icon.png';\r\nimport '../../styles/Airline.css';\r\n\r\n// This component is a part of the airline company area.\r\n// It displays all the airline's flights and allows it to update or cancel them.\r\nclass ManageFlights extends Component {\r\n\r\n state = {\r\n flights: [],\r\n flightsState: 'lodaing',\r\n batchesToDisplay: 1,\r\n isFiltering: false,\r\n 'origin-country-filter': '',\r\n 'dest-country-filter': '',\r\n }\r\n\r\n CancelToken = axios.CancelToken;\r\n source = this.CancelToken.source();\r\n\r\n\r\n // Gets all the flights of the airline from the server.\r\n getAirlineFlights = async () => {\r\n\r\n await axios({\r\n url: getAirlineFlightsURL, \r\n headers: AuthService.getAuthHeader().headers,\r\n cancelToken: this.source.token\r\n }).then((response) => {\r\n this.setState({ \r\n flights: response.data,\r\n flightsState: 'loaded'\r\n })\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({ \r\n flightsState: 'error'\r\n })\r\n })\r\n }\r\n\r\n // Deletes a flight from the server.\r\n deleteFlight = (flightId, handleError) => {\r\n axios({\r\n method: 'DELETE',\r\n url: cancelFlightURL + '/' + flightId, \r\n headers: AuthService.getAuthHeader().headers,\r\n }).then(() => {\r\n this.removeFlightFromList(flightId);\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n handleError();\r\n })\r\n }\r\n\r\n // Removes the flight from the view.\r\n removeFlightFromList = (flightId) => {\r\n let newFlightsList = [];\r\n this.state.flights.forEach(flight => {\r\n if (flight.Id != flightId)\r\n newFlightsList.push(flight);\r\n });\r\n this.setState({flights: newFlightsList}, \r\n this.mapFlights)\r\n }\r\n\r\n // Handle the changes of the fields in the update form.\r\n handleChange = (e) => {\r\n this.setState({\r\n [e.target.id]: e.target.value\r\n }, this.mapFlights)\r\n }\r\n\r\n // When the user scrolls down to the bottom - it adds more flights to the list.\r\n handleScroll = (e) => {\r\n const bottomReached = e.target.scrollHeight - e.target.clientHeight == e.target.scrollTop\r\n if (bottomReached)\r\n {\r\n this.setState({batchesToDisplay: this.state.batchesToDisplay + 1})\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.getAirlineFlights();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.source.cancel();\r\n }\r\n\r\n render() {\r\n if (this.state.flightsState == 'loading')\r\n {\r\n return (\r\n \"\"\r\n )\r\n }\r\n if (this.state.flightsState == 'error')\r\n {\r\n return (\r\n
\r\n \"error\"\r\n

An error occurred while receiving the data.

\r\n
\r\n )\r\n }\r\n\r\n const info = 'Flights that landed 3 days ago or more won\\'t be showed here.'\r\n\r\n const displayedFlights = this.state.flights.filter((flight, index)=>{\r\n return (index < this.state.batchesToDisplay*50)\r\n }).map(flight => {\r\n return \r\n })\r\n\r\n let totalFlights;\r\n\r\n if (displayedFlights.length == this.state.flights.length)\r\n {\r\n totalFlights = `Displaying ${this.state.flights.length} flights:`;\r\n }\r\n\r\n if (displayedFlights.length < this.state.flights.length)\r\n {\r\n totalFlights = `Displaying ${displayedFlights.length} out of ${this.state.flights.length} flights:`;\r\n }\r\n\r\n return (\r\n
\r\n\r\n

\r\n Here you can see and manage all your flights. \r\n \"\"\r\n

\r\n\r\n { (this.state.flightsState == \"loaded\" && this.state.flights.length != 0) && \r\n \r\n }\r\n\r\n {this.state.flights.length == 0 &&\r\n \r\n }\r\n \r\n
\r\n {displayedFlights}\r\n {displayedFlights.length != this.state.flights.length &&\r\n \"\"\r\n }\r\n
\r\n\r\n
\r\n )\r\n }\r\n}\r\n\r\nManageFlights.contextType = UserContext;\r\n\r\nexport default ManageFlights;","import React, {Component} from 'react';\r\nimport axios from 'axios';\r\nimport SweetAlert from 'react-bootstrap-sweetalert';\r\nimport AuthService from '../../services/AuthService';\r\nimport ErrorService from '../../services/ErrorService';\r\nimport CountriesService from '../../services/CountriesService';\r\nimport {UserContext} from '../../UserContext';\r\nimport Button from '../Button';\r\nimport PasswordChange from '../PasswordChange';\r\nimport { modifyAirlineDetailsURL } from '../../Constants';\r\nimport loadingData from '../../assets/loading-data.gif';\r\nimport editIcon from '../../assets/edit-icon.png';\r\nimport saveIcon from '../../assets/save-icon.png';\r\nimport cancelIcon from '../../assets/cancel-icon.png';\r\nimport loadingIcon from '../../assets/loading-data.gif';\r\nimport errorIcon from '../../assets/error-icon.png'\r\nimport '../../styles/Airline.css';\r\n\r\n// This component is a part of the airline company area.\r\n// It displays all the airline's details and allows it to change them.\r\nclass AirlineDetails extends Component {\r\n \r\n state = {\r\n airline: this.context.userInfo.user,\r\n newAirline: this.context.userInfo.user,\r\n countries: 'loading',\r\n editMode: false,\r\n validationAlert: false,\r\n updateState: 'none'\r\n }\r\n\r\n CancelToken = axios.CancelToken;\r\n source = this.CancelToken.source();\r\n\r\n // Gets all the countries from the dedicated service.\r\n getCountries = async () => {\r\n \r\n let countries = await CountriesService.getCountries();\r\n if (countries != null)\r\n {\r\n this.setState({\r\n countries: countries,\r\n });\r\n }\r\n else\r\n {\r\n this.setState({ countries: 'error'})\r\n }\r\n }\r\n\r\n // When the user clicks the 'Cancel' button:\r\n cancelEditMode = () => {\r\n this.setState({\r\n editMode: false,\r\n newCustomer: this.state.airline\r\n })\r\n }\r\n\r\n // When a field in the form is changed, this updates the state.\r\n handleChange = (e) => {\r\n let airlineClone = Object.assign({}, this.state.newAirline);\r\n airlineClone[e.target.id] = e.target.value;\r\n this.setState({\r\n newAirline: airlineClone\r\n })\r\n }\r\n\r\n // Validates that none of the airline's fields are empty before updating.\r\n validateAirlineDetails = (airline) => {\r\n if (airline.Name == '' ||\r\n airline.Email == '' ||\r\n airline.UserName == '' )\r\n {\r\n return false;\r\n }\r\n else\r\n return true;\r\n }\r\n\r\n // Updating the airline with the new details.\r\n updateAirlineDetails = () => {\r\n if (!this.validateAirlineDetails(this.state.newAirline))\r\n {\r\n this.setState({ \r\n validationAlert: true,\r\n })\r\n return;\r\n }\r\n\r\n this.setState({ \r\n updateState: 'loading'\r\n })\r\n\r\n axios({\r\n method: 'PUT',\r\n url: modifyAirlineDetailsURL, \r\n headers: AuthService.getAuthHeader().headers,\r\n data: this.state.newAirline\r\n }).then(() => { \r\n this.renewUserToken();\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({ \r\n updateState: 'error',\r\n })\r\n })\r\n }\r\n\r\n // Renewing the user token with the updated details.\r\n renewUserToken = () => {\r\n let newAirUsername = this.state.newAirline.UserName;\r\n let newAirPassword = this.state.newAirline.Password;\r\n if (this.context.updateUserInfo([newAirUsername, newAirPassword]))\r\n {\r\n this.setState({ \r\n airline: this.state.newAirline,\r\n updateState: 'updated',\r\n editMode: false\r\n }, this.setCountryName)\r\n }\r\n else\r\n {\r\n this.setState({ \r\n airline: this.state.newAirline,\r\n updateState: 'tokenUpdateError',\r\n editMode: false\r\n })\r\n }\r\n }\r\n\r\n // When the airline changes its password using the PasswordChange component, it handles everything:\r\n handlePasswordChange = (newPassword) => {\r\n let airlineClone = Object.assign({}, this.state.newAirline);\r\n airlineClone.Password = newPassword;\r\n this.setState({\r\n newAirline: airlineClone\r\n })\r\n this.renewUserToken();\r\n }\r\n\r\n // Gets the country name using the given Id.\r\n getCountryName = (id) => {\r\n let country = this.state.countries.find(country => {\r\n return country.Id == id;\r\n })\r\n return country.Name;\r\n }\r\n\r\n componentDidMount() {\r\n this.getCountries();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.source.cancel();\r\n }\r\n\r\n render() {\r\n\r\n const airline = this.state.airline;\r\n if (this.state.countries == 'loading')\r\n {\r\n return (\r\n \"loading...\"\r\n )\r\n }\r\n\r\n if (this.state.countries == 'error')\r\n {\r\n return (\r\n
\r\n \"error\"\r\n

An error occurred while receiving the data.

\r\n
\r\n )\r\n }\r\n return (\r\n
\r\n

Company Details

\r\n
\r\n\r\n {/* When in edit mode, the details text blocks will be replaced with changable fields */}\r\n\r\n {/* Left Column */}\r\n
\r\n\r\n
\r\n \r\n {!this.state.editMode &&\r\n \r\n }\r\n {this.state.editMode &&\r\n \r\n }\r\n
\r\n\r\n
\r\n \r\n {!this.state.editMode &&\r\n \r\n }\r\n {this.state.editMode &&\r\n \r\n }\r\n
\r\n\r\n
\r\n \r\n {!this.state.editMode &&\r\n \r\n }\r\n {this.state.editMode &&\r\n \r\n }\r\n
\r\n\r\n
\r\n \r\n {/* Right Column */}\r\n
\r\n\r\n
\r\n \r\n {!this.state.editMode &&\r\n \r\n }\r\n {this.state.editMode &&\r\n \r\n }\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n {!this.state.editMode &&\r\n
\r\n }\r\n\r\n this.setState({validationAlert: false})}\r\n >\r\n \r\n\r\n this.setState({updateState: 'none'})}\r\n >\r\n \r\n\r\n this.setState({updateState: 'none'})}\r\n >\r\n We recommended you to logout and then login again.\r\n \r\n\r\n \r\n )\r\n }\r\n}\r\n\r\nAirlineDetails.contextType = UserContext;\r\n\r\nexport default AirlineDetails;","import React, {Component} from 'react';\r\nimport axios from 'axios';\r\nimport SweetAlert from 'react-bootstrap-sweetalert';\r\nimport AuthService from '../../services/AuthService';\r\nimport ErrorService from '../../services/ErrorService';\r\nimport CountriesService from '../../services/CountriesService';\r\nimport {UserContext} from '../../UserContext';\r\nimport Button from '../Button';\r\nimport { createFlightURL } from '../../Constants';\r\nimport saveIcon from '../../assets/save-icon.png';\r\nimport cancelIcon from '../../assets/cancel-icon.png';\r\nimport loadingIcon from '../../assets/loading-data.gif';\r\nimport errorIcon from '../../assets/error-icon.png'\r\nimport '../../styles/Airline.css';\r\n\r\n// This component is a part of the airline company area.\r\n// It allows the airline to create a new flight and add it to the database.\r\nclass CreateFlight extends Component {\r\n \r\n state = {\r\n flight: '',\r\n countries: 'loading',\r\n createState: 'none',\r\n errorMessage: ''\r\n }\r\n\r\n // Resets all the the properties (and the fields that's binded) of the flight state.\r\n resetFlightState = () => {\r\n const flight = {\r\n Id: 0,\r\n AirlineCompanyId: this.context.userInfo.user.Id,\r\n OriginCountryCode: '',\r\n DestinationCountryCode: '',\r\n DepartureTime: '',\r\n LandingTime: '',\r\n RemainingTickets: '',\r\n TicketPrice: ''\r\n }\r\n this.setState({flight: flight});\r\n }\r\n\r\n // Gets all the countries from the service, so they can be used in the dropdown.\r\n getCountries = async () => {\r\n \r\n let countries = await CountriesService.getCountries();\r\n if (countries != null)\r\n {\r\n this.setState({\r\n countries: countries,\r\n });\r\n }\r\n else\r\n {\r\n this.setState({ countries: 'error'})\r\n }\r\n }\r\n\r\n // When a field in the form is changed, this updates the state.\r\n handleChange = (e) => {\r\n let flightClone = Object.assign({}, this.state.flight);\r\n flightClone[e.target.name] = e.target.value;\r\n this.setState({\r\n flight: flightClone\r\n })\r\n }\r\n\r\n // Creating the flight with the given details.\r\n createFlight = () => {\r\n if (!this.validateFlightDetails())\r\n {\r\n return;\r\n }\r\n\r\n this.setState({ \r\n createState: 'loading'\r\n })\r\n \r\n axios({\r\n method: 'POST',\r\n url: createFlightURL, \r\n headers: AuthService.getAuthHeader().headers,\r\n data: this.state.flight\r\n }).then(() => { \r\n this.setState({createState: 'created'});\r\n this.resetFlightState();\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({ \r\n createState: 'error',\r\n })\r\n })\r\n }\r\n\r\n // Validates that all the flight's data is filled and valid.\r\n validateFlightDetails = () => {\r\n \r\n const flight = this.state.flight;\r\n \r\n if (flight.OriginCountryCode == flight.DestinationCountryCode)\r\n {\r\n this.setState({ errorMessage: 'Origin country and destination country cannot be the same'})\r\n return false;\r\n }\r\n\r\n if (flight.OriginCountryCode == '' || flight.DestinationCountryCode == '' || \r\n flight.RemainingTickets == '' || flight.TicketPrice == '' ||\r\n flight.DepartureTime == '' || flight.LandingTime == '')\r\n {\r\n this.setState({ errorMessage: 'All fields must be filled'})\r\n return false;\r\n }\r\n\r\n const departureTime = new Date(flight.DepartureTime);\r\n \r\n if (departureTime < new Date())\r\n {\r\n this.setState({ errorMessage: 'Departure time cannot be in the past.'})\r\n return false;\r\n }\r\n\r\n const landingTime = new Date(flight.LandingTime);\r\n\r\n if (landingTime < new Date())\r\n {\r\n this.setState({ errorMessage: 'Landing time cannot be in the past.'})\r\n return false;\r\n }\r\n\r\n if (landingTime < departureTime)\r\n {\r\n this.setState({ errorMessage: 'Landing time must be after departure time.'})\r\n return false;\r\n }\r\n\r\n const tickets = parseInt(flight.RemainingTickets);\r\n if (tickets < 0 || tickets > 1000)\r\n {\r\n this.setState({ errorMessage: 'Tickets number must be between 0 and 1000.'})\r\n return false;\r\n }\r\n\r\n const ticketPrice = parseInt(flight.TicketPrice);\r\n if (ticketPrice < 0 || ticketPrice > 50000)\r\n {\r\n this.setState({ errorMessage: 'Ticket price must be between 0 and 50,000.'})\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n componentDidMount() {\r\n this.getCountries();\r\n this.resetFlightState();\r\n }\r\n\r\n render() {\r\n\r\n if (this.state.countries == 'loading')\r\n {\r\n return (\r\n \"loading...\"\r\n )\r\n }\r\n\r\n if (this.state.countries == 'error')\r\n {\r\n return (\r\n
\r\n \"error\"\r\n

An error occurred while receiving the data.

\r\n
\r\n )\r\n }\r\n\r\n let countriesOptions = this.state.countries.map(country => {\r\n return (\r\n \r\n )\r\n });\r\n countriesOptions.unshift();\r\n\r\n return (\r\n
\r\n

Create a New Flight

\r\n
\r\n\r\n {/* Left Column */}\r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n {/* Right Column */}\r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\nCreateFlight.contextType = UserContext;\r\n\r\nexport default CreateFlight;","import React, {Component} from 'react';\r\nimport {Switch, Route, NavLink, Redirect} from 'react-router-dom';\r\nimport {UserContext} from '../UserContext';\r\nimport ViewService from '../services/ViewService';\r\nimport ManageFlights from './Airline/ManageFlights';\r\nimport AirlineDetails from './Airline/AirlineDetails';\r\nimport CreateFlight from './Airline/CreateFlight';\r\nimport '../styles/Airline.css';\r\n\r\n// This is the airline company area page.\r\n// It contains the manage-flights, the create-flight and the airline-details components.\r\nclass Airline extends Component {\r\n\r\n state = {\r\n mobileNavSelect: 'manage-flights'\r\n }\r\n\r\n handleChange = (e) => {\r\n this.setState({\r\n mobileNavSelect: e.target.value\r\n })\r\n }\r\n\r\n render() {\r\n const navActiveStyle = {\r\n fontWeight: 500,\r\n backgroundColor: 'rgb(255, 255, 255, 0.4)'\r\n }\r\n return (\r\n
\r\n
Your Personal Area
\r\n\r\n {!ViewService.isMobileView() && // Dekstop view\r\n
\r\n {/* A side navigation bar: */}\r\n
\r\n My Flights\r\n Add a Flight\r\n Company Details\r\n
\r\n {/* The child components will be rendered here: */}\r\n
\r\n \r\n \r\n \r\n \r\n \r\n {/* Default page: */}\r\n { this.props.path == '/user-page' && \r\n \r\n }\r\n
\r\n
\r\n }\r\n\r\n {ViewService.isMobileView() && // Mobile view\r\n
\r\n {/* A side navigation bar: */}\r\n \r\n\r\n {this.state.mobileNavSelect == 'manage-flights' &&\r\n \r\n }\r\n\r\n {this.state.mobileNavSelect == 'create-flight' &&\r\n \r\n }\r\n\r\n {this.state.mobileNavSelect == 'airline-details' &&\r\n \r\n }\r\n\r\n {/* The child components will be rendered here: */}\r\n
\r\n \r\n \r\n \r\n \r\n \r\n {/* Default page: */}\r\n { this.props.path == '/user-page' && \r\n \r\n }\r\n
\r\n
\r\n }\r\n\r\n
\r\n )\r\n }\r\n}\r\n\r\nAirline.contextType = UserContext;\r\n\r\nexport default Airline;","import React, {Component} from 'react';\r\nimport {Redirect} from 'react-router-dom';\r\nimport {UserContext} from '../UserContext';\r\nimport Admin from './Admin';\r\nimport Customer from './Customer';\r\nimport Airline from './Airline';\r\nimport '../styles/UserPage.css'\r\n\r\n// This component serves as a HOC for the different user pages.\r\n// It detects the user type and renders the fitting component.\r\nclass UserPage extends Component {\r\n\r\n render() {\r\n const user = this.context;\r\n if (user.userInfo.role == \"Customer\")\r\n {\r\n return (\r\n \r\n );\r\n }\r\n else if (user.userInfo.role == \"AirlineCompany\")\r\n {\r\n return (\r\n \r\n )\r\n }\r\n else if (user.userInfo.role == \"Administrator\")\r\n {\r\n return (\r\n \r\n )\r\n }\r\n else\r\n { \r\n // In case the current user is anonymous and not registered,\r\n // He will be redirected to the home page.\r\n return (\r\n \r\n )\r\n }\r\n }\r\n}\r\n\r\nUserPage.contextType = UserContext;\r\n\r\nexport default UserPage;","import React, { Component } from 'react';\r\nimport { Redirect } from 'react-router-dom';\r\nimport axios from 'axios';\r\nimport SweetAlert from 'react-bootstrap-sweetalert';\r\nimport AuthService from '../services/AuthService';\r\nimport ErrorService from '../services/ErrorService';\r\nimport DateTimeService from '../services/DateTimeService';\r\nimport { UserContext } from '../UserContext';\r\nimport { getFlightByIdURL, purchaseTicketURL } from '../Constants';\r\nimport loadingData from '../assets/loading-data.gif';\r\nimport errorIcon from '../assets/error-icon.png';\r\nimport '../styles/PurchaseTicket.css';\r\n\r\n// This is the flight ticket(s) purchase.\r\nclass PurchaseTicket extends Component {\r\n\r\n // A user can buy a ticket for a single flight (one ticket, one way) or\r\n // buy two tickets at once (back and forth).\r\n\r\n state = {\r\n ticketType: '',\r\n departureFlight: '',\r\n returnFlight: '',\r\n flightsState: 'loading',\r\n purchaseState: 'none'\r\n }\r\n\r\n // This component gets the ticket information from the URL query.\r\n // That method handles it and updates the state.\r\n getFlightIdsFromUrl = () => {\r\n let queryString = this.props.history.location.search;\r\n let queryBlocks = queryString.split('&');\r\n let queryValues = queryBlocks.map((block) => {\r\n return block.split('=')[1];\r\n });\r\n\r\n this.setState({ ticketType: queryValues[0] });\r\n\r\n if (queryValues[0] == 'one-way') \r\n {\r\n this.getFlights(queryValues[1]);\r\n }\r\n else \r\n {\r\n this.getFlights(queryValues[1], queryValues[2]);\r\n }\r\n }\r\n\r\n // Gets the flight(s) information to display it on the page.\r\n getFlights = async (departureFlightId, returnFlightId) => {\r\n\r\n await axios.get(getFlightByIdURL + '/' + departureFlightId\r\n ).then((response) => {\r\n this.setState({\r\n departureFlight: response.data\r\n })\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({\r\n flightsState: 'error'\r\n })\r\n })\r\n\r\n // If its a roundtrip ticket (two flights) it will get the second one also.\r\n if (returnFlightId != null) \r\n {\r\n await axios.get(getFlightByIdURL + '/' + returnFlightId\r\n ).then((response) => {\r\n this.setState({\r\n returnFlight: response.data\r\n })\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n this.setState({\r\n flightsState: 'error'\r\n })\r\n })\r\n }\r\n\r\n this.setState({\r\n flightsState: 'loaded'\r\n })\r\n }\r\n\r\n // Handles the procedure of buying a ticket.\r\n buyTicket = async () => {\r\n\r\n if (!this.isRegisteredCustomer())\r\n return;\r\n\r\n this.setState({purchaseState: 'loading'})\r\n\r\n await axios({\r\n method: 'POST',\r\n url: purchaseTicketURL + '/' + this.state.departureFlight.Id, \r\n headers: AuthService.getAuthHeader().headers,\r\n }).then(() => {\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n try\r\n {\r\n // Handling double ticket exception.\r\n if (error.response.data.ExceptionType == 'FlightCenter.OneTicketForCustomerOnlyException')\r\n this.setState({purchaseState: 'doubleTicketError'});\r\n else\r\n this.setState({purchaseState: 'error'});\r\n }\r\n catch\r\n {\r\n this.setState({purchaseState: 'error'});\r\n }\r\n })\r\n\r\n // If its a roundtrip ticket (two flights) it will purchase the second one also.\r\n if (this.state.returnFlight != '')\r\n {\r\n await axios({\r\n method: 'POST',\r\n url: purchaseTicketURL + '/' + this.state.returnFlight.Id, \r\n headers: AuthService.getAuthHeader().headers,\r\n }).then(() => {\r\n }).catch((error) => {\r\n ErrorService.logErrorToConsole(error);\r\n try\r\n {\r\n if (error.response.data.ExceptionType == 'FlightCenter.OneTicketForCustomerOnlyException')\r\n this.setState({purchaseState: 'doubleTicketError'});\r\n else\r\n this.setState({purchaseState: 'error'});\r\n }\r\n catch\r\n {\r\n this.setState({purchaseState: 'error'});\r\n }\r\n })\r\n }\r\n\r\n setTimeout(() => {\r\n if (this.state.purchaseState == 'loading')\r\n this.setState({purchaseState: 'done'})\r\n },100) \r\n }\r\n\r\n // Checks if the current user is a registered customer.\r\n isRegisteredCustomer = () => {\r\n\r\n if (this.context.userInfo.role == \"Customer\")\r\n {\r\n return true;\r\n }\r\n else\r\n {\r\n this.setState({purchaseState: 'notRegistered'});\r\n return false;\r\n }\r\n }\r\n\r\n // This function is triggered when an anonymous user is detected.\r\n // It saves the ticket details in the browser, so the user will\r\n // be able to continue this purchase after the login or registration.\r\n saveTicketForLater = () => {\r\n\r\n let ticket = {\r\n ticketType: this.state.ticketType,\r\n departureFlight: this.state.departureFlight.Id,\r\n returnFlight: this.state.returnFlight.Id\r\n }\r\n\r\n localStorage.setItem(\"ticket\", JSON.stringify(ticket));\r\n\r\n this.setState({purchaseState: 'redirectToLoginPage'});\r\n }\r\n \r\n componentDidMount() {\r\n this.getFlightIdsFromUrl();\r\n };\r\n\r\n render() {\r\n\r\n if (this.state.flightsState == 'loading' || this.state.purchaseState == 'loading') \r\n {\r\n return (\r\n \"\"\r\n )\r\n }\r\n\r\n if (this.state.flightsState == 'error') \r\n {\r\n return (\r\n
\r\n
\r\n \"error\"\r\n

An error occurred while receiving the data.

\r\n
\r\n
\r\n )\r\n }\r\n\r\n // Shorthands:\r\n let depFlight = this.state.departureFlight;\r\n let retFlight;\r\n\r\n // UI Elements that depends on the type of the ticket:\r\n let depFlightHeading;\r\n let roundtripTicketPrice;\r\n let flightReference;\r\n let doubleTicketMessage;\r\n\r\n if (this.state.ticketType == 'one-way') \r\n {\r\n depFlightHeading = 'Flight Details:';\r\n flightReference = 'flight';\r\n doubleTicketMessage = 'You have already bought a ticket for this flight. '\r\n }\r\n else \r\n {\r\n depFlightHeading = 'Deparutre Flight:';\r\n retFlight = this.state.returnFlight;\r\n roundtripTicketPrice = parseInt(depFlight.TicketPrice) + parseInt(retFlight.TicketPrice);\r\n flightReference = 'flights';\r\n doubleTicketMessage = 'You have already bought a ticket for one or both of these flights. '\r\n }\r\n\r\n return (\r\n
\r\n\r\n

Purchase Ticket

\r\n\r\n {/* The departure ticket details */}\r\n
\r\n\r\n

{depFlightHeading}

\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n {this.state.ticketType == 'roundtrip' &&\r\n
\r\n \r\n \r\n
\r\n }\r\n\r\n
\r\n\r\n {/* The return ticket details (if exists)*/}\r\n {this.state.ticketType == 'roundtrip' &&\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n

Return Flight:

\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n }\r\n {/* Purchase buttons */}\r\n {this.state.ticketType == 'one-way' &&\r\n
Click here to buy this ticket for {depFlight.TicketPrice}$
\r\n }\r\n {this.state.ticketType == 'roundtrip' &&\r\n
Click here to buy this roundtrip ticket for {roundtripTicketPrice}$
\r\n }\r\n {/* Error message */}\r\n {this.state.purchaseState == 'error' &&\r\n \r\n } \r\n\r\n {/* When the purchase is completed, this alert will be shown */}\r\n this.setState({purchaseState: 'redirectToUserPage'})}\r\n >\r\n Thank you for booking your {flightReference} with us!\r\n \r\n\r\n {/* The user will be rediricted to the user page after the purchase ends */}\r\n {this.state.purchaseState == 'redirectToUserPage' &&\r\n \r\n } \r\n\r\n {/* An alert to inform the customer he cannot buy two tickets for the same flight */}\r\n this.setState({purchaseState: 'none'})}\r\n >\r\n {doubleTicketMessage}\r\n You cannot buy two tickets for the same flight. We are sorry for the inconvenience.\r\n \r\n\r\n {/* An alert for an unregistered user */}\r\n this.saveTicketForLater()}\r\n >\r\n Please login or register in order to buy a ticket. You will now be redirected to the login page.\r\n \r\n\r\n {/* After the alert above, the user will be redirected to the login page */}\r\n {this.state.purchaseState == 'redirectToLoginPage' &&\r\n \r\n } \r\n\r\n
\r\n )\r\n }\r\n}\r\n\r\nPurchaseTicket.contextType = UserContext;\r\n\r\nexport default PurchaseTicket;","import React from 'react';\r\nimport { flightsBoardURL } from '../Constants';\r\n\r\n// This component contains the flights board page.\r\n// NOTICE: The flights board is an external page. It is being presented here inside an iframe element.\r\nconst FlightsBoard = function(props) {\r\n\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nexport default FlightsBoard;","import React from 'react';\r\nimport { DealsPageURL } from '../Constants';\r\n\r\n// This component contains the deals page.\r\n// NOTICE: The deals page is an external page. It is being presented here inside an iframe element.\r\nconst DealsPage = function(props) {\r\n\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nexport default DealsPage;","import React, {Component} from 'react';\nimport {BrowserRouter, Route, Switch, Redirect} from 'react-router-dom';\nimport UserContextProvider from './UserContext';\nimport Navbar from './components/Navbar';\nimport Home from './components/Home';\nimport Flights from './components/Flights';\nimport About from './components/About';\nimport Login from './components/Login';\nimport Register from './components/Register';\nimport CustomerRegister from './components/CustomerRegister';\nimport AirlineRegister from './components/AirlineRegister';\nimport UserPage from './components/UserPage';\nimport PurchaseTicket from './components/PurchaseTicket';\nimport FlightsBoard from './components/FlightsBoard';\nimport DealsPage from './components/DealsPage';\nimport bgImage from './assets/sky-desktop.jpg'\nimport './styles/App.css';\nimport './styles/Navbar.css';\nimport './styles/GeneralStyles.css';\n\nclass App extends Component {\n\n render() {\n return (\n \n \n
\n \"\"\n
\n \n \n {/* The home page */}\n {/* The flights search page */}\n {/* The deals page */}\n {/* The flights board page */}\n {/* The about page */}\n {/* The login page */}\n {/* This page refers the user to the customer/airline registration pages */}\n {/* The customer registration page */}\n {/* The airline registration page */}\n {/* The registered user page */}\n {/* The ticket purchase page */}\n \n
\n
\n
\n
\n );\n }\n}\n\nexport default App;","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport './styles/index.css';\nimport 'bootstrap/dist/css/bootstrap.css';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n"],"sourceRoot":""}