{"version":3,"sources":["webpack://kigen//tmp/build_188f934a/app/javascript/channels|sync|/_channel\\.js$/","webpack://kigen//tmp/build_188f934a/app/javascript/controllers|sync|/_controller\\.js$/","webpack://kigen/./app/javascript/channels/index.js","webpack://kigen/./app/javascript/controllers/additional_info_list_controller.js","webpack://kigen/./app/javascript/controllers/allergens_list_controller.js","webpack://kigen/./app/javascript/controllers/avatar_edit_controller.js","webpack://kigen/./app/javascript/controllers/dishes_list_controller.js","webpack://kigen/./app/javascript/controllers/dropzone_controller.js","webpack://kigen/./app/javascript/controllers/file_edit_controller.js","webpack://kigen/./app/javascript/controllers/finder_field_controller.js","webpack://kigen/./app/javascript/controllers/frontend_days_controller.js","webpack://kigen/./app/javascript/controllers/frontend_language_controller.js","webpack://kigen/./app/javascript/controllers/frontends_list_controller.js","webpack://kigen/./app/javascript/controllers/hello_controller.js","webpack://kigen/./app/javascript/controllers/home_controller.js","webpack://kigen/./app/javascript/controllers/information_controller.js","webpack://kigen/./app/javascript/controllers/ingredients_list_controller.js","webpack://kigen/./app/javascript/controllers/internal_finder_controller.js","webpack://kigen/./app/javascript/controllers/menu_days_controller.js","webpack://kigen/./app/javascript/controllers/menus_list_controller.js","webpack://kigen/./app/javascript/controllers/modal_controller.js","webpack://kigen/./app/javascript/controllers/modal_gross_amount_controller.js","webpack://kigen/./app/javascript/controllers/password_field_controller.js","webpack://kigen/./app/javascript/controllers/subcategories_form_controller.js","webpack://kigen/./app/javascript/controllers/toggle_switch_controller.js","webpack://kigen/./app/javascript/helpers/index.js","webpack://kigen/./app/javascript/helpers/data-confirm-tailwind-modal.js","webpack://kigen/./app/javascript/controllers/index.js","webpack://kigen/./app/javascript/packs/application.js"],"names":["webpackEmptyContext","req","e","Error","code","keys","resolve","id","module","exports","map","webpackContext","webpackContextResolve","__webpack_require__","o","Object","channels","require","forEach","_additionalInfoContainerListElement","connect","this","document","getElementById","_getIngredientsController","controller","actionValue","classList","add","additionalInfoModeTarget","value","additionalInfoIngredientsListElementTarget","remove","changeMode","event","target","checked","ingredients","length","additionalInfoAlertTarget","hiddenAdditionalInfoAutoTarget","addAdditionalInfo","additional_info","div","createElement","setAttribute","html","image","replace","name","contain","innerHTML","appendChild","removeAdditionalInfo","cb","stop","setInterval","clearInterval","application","controllers","find","context","identifier","Controller","targets","_allergensContainerListElement","allergensModeTarget","allergensIngredientsListElementTarget","allergensAlertTarget","hiddenAllergensAutoTarget","addAllergen","allergen","removeAllergen","removeAvatar","avatarTarget","dropzoneMsgTarget","removeAvatarTarget","dishes","tableTarget","dishesNumberValue","alertTarget","_fillDishesList","querySelectorAll","addDish","dish_id","dataset","_checkRepeatedDish","push","url","name_en","innerText","_createRowForTable","removeDish","currentTarget","dishIndex","findIndex","dish","splice","tr","td1","td2","input","bodyTarget","dishesTableTows","row","i","j","values","action","String","dishesNumber","Number","previewNode","previewTemplate","querySelector","dropZone","Dropzone","element","headers","maxFiles","maxFilesize","maxFileSize","acceptedFiles","addRemoveLinks","Boolean","autoQueue","hideFileInput","bindEvents","dropzoneErrorTarget","style","display","inputTarget","disabled","on","file","intervalCleaner","file_preview_el","image_preview_el","search","parentNode","removeChild","getAcceptedFiles","removeFile","setTimeout","accepted","source","DirectUploadController","createDirectUploadController","start","removeElement","hiddenInput","dropzoneTarget","progress","preview","xhr","abort","err","getMetaValue","getAttribute","data","get","directUpload","DirectUpload","createDirectUpload","createHiddenInput","create","error","attributes","emitDropzoneError","signed_id","emitDropzoneSuccess","type","insertAfter","directUploadWillStoreFileWithXHR","bindProgressEvent","emitDropzoneUploading","upload","addEventListener","uploadRequestDidProgress","loaded","total","dropzoneProgressTarget","firstElementChild","width","status","emit","fileId","fileTarget","fileContainer","append","lastSearchValue","formTarget","submitTarget","update","click","updateWithEnter","console","log","day","dailies","getElementsByClassName","toShow","pickDay","toHide","setLang","lang","tmp","sessionStorage","getItem","setItem","title","block","frontends","container","sortable","Sortable","onEnd","end","bind","frontendsNumberValue","_fillFrontendsList","item","FormData","newIndex","Rails","addFrontend","frontend_id","_checkRepeatedFrontend","removeFrontend","frontendIndex","frontend","td3","frontendsTableTows","frontendsNumber","textContent","selectFunction","selected","newSelected","actualId","newId","actualPhone","substring","newPhone","query","window","location","section","URLSearchParams","contains","scrollTo","offsetTop","showInfo","actualInfo","newInfo","mobileinfo","previousIcons","information","icons","previousInfo","undefined","allergens","additional_informations","_allergensController","valuesNutritionalTarget","ingredientsNumberValue","_fillIngredientsList","addIngredient","ingredient_id","_checkRepeatedIngredient","unit","energy","proteins","carbohydrates","sugars","fats","saturated_fats","salt","cost","ref_unit","ref_amount","_processAllergens","_processAdditionalInfo","_updateNutritionalValues","removeIngredient","_removeAllergens","_removeAdditionalInfos","showIngredients","toggleAttribute","showNutritional","ingredient","mSec","Date","getTime","td4","td5","td6","input2","replaceAll","_createEventsForRow","msec_id","wasteInput","grossAmountInput","netAmountTd","costTd","parseFloat","_cost","ref_value","all","toNumber","_updateEstimatedCost","costTds","estimatedCostTarget","td","currentCost","carbo","energyTdTarget","proteinsTdTarget","carboTdTarget","sugarsTdTarget","fatsTdTarget","saturatedFatsTdTarget","saltTdTarget","allergens_string","JSON","parse","found","x","y","count","_getController","additional_info_string","toString","controller_name","ingredients_table_rows","lastIngredient","ingredientsNumber","urlValue","buttonTarget","Turbo","searchWithEnter","keyCode","preventDefault","stopPropagation","checkMyIngredients","checkboxes","checkbox","_changeCheckboxesState","hiddenDestroyInput","menus","menusNumberValue","_fillMenusList","addMenu","menu_id","_checkRepeatedMenu","removeMenu","menuIndex","menu","subtitle","menusTableTows","menusNumber","form","submit","content","detail","formSubmission","result","success","close","restoreForm","open","modalContent","modal","closest","reset","parent_id","grossAmountNoteHiddenInput","grossAmountUnitHiddenInput","grossAmountNoteInput","grossAmountUnitInput","createNoteButton","generateRandomPassword","password","randomString","passwordInputTarget","togglePassword","passwordEyeButtonTarget","subcategories_number","add_subcategory_button_container","new_subcategory_button","addSubcategory","idAttrNameES","nameAttrNameES","idAttrNameEN","nameAttrNameEN","idAttrNameDE","nameAttrNameDE","idAttrNameFR","nameAttrNameFR","li","div1","div2","div3","div4","div_picture","p","inputNameES","divNameES","inputNameEN","divNameEN","inputNameDE","divNameDE","inputNameFR","divNameFR","removeSubcategory","index","subcategoryToDeleteName","subcategoryToDeleteId","updateText","className","indexOf","textTarget","root","selector","findElement","head","el","referenceNode","insertBefore","nextSibling","chars","Math","floor","random","closeAndDestroyModal","modalObj","overlay","createModalElement","options","method","text","commit","cancel","commitClass","cancelClass","body","join","ele","href","createModal","Application","load","definitionsFromContext","ActiveStorage"],"mappings":"iFAAA,SAASA,EAAoBC,GAC5B,IAAIC,EAAI,IAAIC,MAAM,uBAAyBF,EAAM,KAEjD,MADAC,EAAEE,KAAO,mBACHF,EAEPF,EAAoBK,KAAO,WAAa,MAAO,IAC/CL,EAAoBM,QAAUN,EAC9BA,EAAoBO,GAAK,KACzBC,EAAOC,QAAUT,G,qBCRjB,IAAIU,EAAM,CACT,uCAAwC,KACxC,iCAAkC,KAClC,8BAA+B,KAC/B,8BAA+B,KAC/B,2BAA4B,KAC5B,4BAA6B,KAC7B,+BAAgC,KAChC,gCAAiC,KACjC,oCAAqC,KACrC,iCAAkC,KAClC,wBAAyB,KACzB,uBAAwB,IACxB,8BAA+B,KAC/B,mCAAoC,KACpC,kCAAmC,KACnC,4BAA6B,KAC7B,6BAA8B,KAC9B,wBAAyB,KACzB,qCAAsC,KACtC,iCAAkC,KAClC,qCAAsC,KACtC,gCAAiC,IACjC,iDAAkD,KAClD,2CAA4C,KAC5C,wCAAyC,KACzC,wCAAyC,KACzC,qCAAsC,KACtC,sCAAuC,KACvC,yCAA0C,KAC1C,0CAA2C,KAC3C,8CAA+C,KAC/C,2CAA4C,KAC5C,kCAAmC,KACnC,iCAAkC,IAClC,wCAAyC,KACzC,6CAA8C,KAC9C,4CAA6C,KAC7C,sCAAuC,KACvC,uCAAwC,KACxC,kCAAmC,KACnC,+CAAgD,KAChD,2CAA4C,KAC5C,+CAAgD,KAChD,0CAA2C,KAI5C,SAASC,EAAeV,GACvB,IAAIM,EAAKK,EAAsBX,GAC/B,OAAOY,EAAoBN,GAE5B,SAASK,EAAsBX,GAC9B,IAAIY,EAAoBC,EAAEJ,EAAKT,GAAM,CACpC,IAAIC,EAAI,IAAIC,MAAM,uBAAyBF,EAAM,KAEjD,MADAC,EAAEE,KAAO,mBACHF,EAEP,OAAOQ,EAAIT,GAEZU,EAAeN,KAAO,WACrB,OAAOU,OAAOV,KAAKK,IAEpBC,EAAeL,QAAUM,EACzBJ,EAAOC,QAAUE,EACjBA,EAAeJ,GAAK,M,qBC9DpB,IAAMS,EAAWC,QACjBD,EAASX,OAAOa,QAAQF,I,iPCctBG,oCAAsC,K,oHAEvCC,QAAA,WAAY,IAAD,OAGRC,KAAKF,oCAAsCG,SAASC,eAAe,oCAEnEF,KAAKG,2BAA0B,SAACC,GAEE,WAA3BA,EAAWC,YAGd,EAAKP,oCAAoCQ,UAAUC,IAAI,UAIV,SAAxC,EAAKC,yBAAyBC,OACjC,EAAKX,oCAAoCQ,UAAUC,IAAI,UACvD,EAAKG,2CAA2CJ,UAAUK,OAAO,YAGjE,EAAKb,oCAAoCQ,UAAUK,OAAO,UAC1D,EAAKD,2CAA2CJ,UAAUC,IAAI,e,EActEK,WAAA,SAAYC,GAAQ,IAAD,OACZA,EAAMC,OAAOC,SAGhBf,KAAKF,oCAAoCQ,UAAUC,IAAI,UACvDP,KAAKU,2CAA2CJ,UAAUK,OAAO,UAEjEX,KAAKG,2BAA0B,SAACC,GACzBA,EAAWY,YAAYC,OAAS,EACnC,EAAKC,0BAA0BZ,UAAUC,IAAI,UAG7C,EAAKW,0BAA0BZ,UAAUK,OAAO,UAElD,EAAKQ,+BAA+BV,OAAQ,OAM9CT,KAAKF,oCAAoCQ,UAAUK,OAAO,UAC1DX,KAAKU,2CAA2CJ,UAAUC,IAAI,UAC9DP,KAAKkB,0BAA0BZ,UAAUC,IAAI,UAE7CP,KAAKmB,+BAA+BV,OAAQ,I,EAKhDW,kBAAA,SAAmBC,GAEjB,IAAIC,EAAMrB,SAASsB,cAAc,OAEjCD,EAAIE,aAAa,QAAS,sMAC1BF,EAAIE,aAAa,KAAM,mBAAqBH,EAAgBnC,IAE5D,IA2CIuC,EA3CK,SAIJJ,EAAgBK,MACX,gFAGPC,QAAQ,YAAaN,EAAgBK,OAGjC,8iBAUK,6NAOVC,QAAQ,WAAYN,EAAgBO,OAIjCP,EAAgBQ,QACd,qDAEA,kDAEE,iDAQTP,EAAIQ,UAAYL,EAEhBzB,KAAKU,2CAA2CqB,YAAYT,GAG5DtB,KAAKkB,0BAA0BZ,UAAUC,IAAI,W,EAI/CyB,qBAAA,SAAsBX,GAAkB,IAAD,OACrCpB,SAASC,eAAe,mBAAqBmB,EAAgBnC,IAAIyB,SAEjEX,KAAKG,2BAA0B,SAACC,GACS,IAAlCA,EAAWY,YAAYC,QAC1B,EAAKC,0BAA0BZ,UAAUK,OAAO,c,EAWtDR,0BAAA,SAA2B8B,GAAK,IAAD,OAEzB7B,EAAa,KAEb8B,EAAOC,aAAY,WACrB,GAAK/B,EAEH,OADAgC,cAAcF,GACPD,EAAG7B,GAGVA,EAAa,EAAKiC,YAAYC,YAAYC,MAAK,SAAAnC,GAG7C,MAAoB,qBAFHA,EAAWoC,QAAQC,WAG3BrC,EAEA,UAGZ,M,WA1KsBsC,I,EAErBC,QAAU,CACd,qBACA,uCACA,2BACA,wB,iPCGFC,+BAAiC,K,oHAElC7C,QAAA,WAAY,IAAD,OAGRC,KAAK4C,+BAAiC3C,SAASC,eAAe,sBAE9DF,KAAKG,2BAA0B,SAACC,GAEE,WAA3BA,EAAWC,YAGd,EAAKuC,+BAA+BtC,UAAUC,IAAI,UAIV,SAAnC,EAAKsC,oBAAoBpC,OAC5B,EAAKmC,+BAA+BtC,UAAUC,IAAI,UAClD,EAAKuC,sCAAsCxC,UAAUK,OAAO,YAG5D,EAAKiC,+BAA+BtC,UAAUK,OAAO,UACrD,EAAKmC,sCAAsCxC,UAAUC,IAAI,e,EAcjEK,WAAA,SAAYC,GAAQ,IAAD,OACZA,EAAMC,OAAOC,SAGhBf,KAAK4C,+BAA+BtC,UAAUC,IAAI,UAClDP,KAAK8C,sCAAsCxC,UAAUK,OAAO,UAE5DX,KAAKG,2BAA0B,SAACC,GACzBA,EAAWY,YAAYC,OAAS,EACnC,EAAK8B,qBAAqBzC,UAAUC,IAAI,UAExC,EAAKwC,qBAAqBzC,UAAUK,OAAO,UAE7C,EAAKqC,0BAA0BvC,OAAQ,OAMzCT,KAAK4C,+BAA+BtC,UAAUK,OAAO,UACrDX,KAAK8C,sCAAsCxC,UAAUC,IAAI,UACzDP,KAAK+C,qBAAqBzC,UAAUC,IAAI,UAExCP,KAAKgD,0BAA0BvC,OAAQ,I,EAK3CwC,YAAA,SAAaC,GAEX,IAAI5B,EAAMrB,SAASsB,cAAc,OAEjCD,EAAIE,aAAa,QAAS,sMAC1BF,EAAIE,aAAa,KAAM,YAAc0B,EAAShE,IAE9C,IA2CIuC,EA3CK,SAIJyB,EAASxB,MACJ,gFAGPC,QAAQ,YAAauB,EAASxB,OAG1B,8iBAUK,6NAOVC,QAAQ,WAAYuB,EAAStB,OAI1BsB,EAASrB,QACP,qDAEA,kDAEE,iDAQTP,EAAIQ,UAAYL,EAEhBzB,KAAK8C,sCAAsCf,YAAYT,GAGvDtB,KAAK+C,qBAAqBzC,UAAUC,IAAI,W,EAI1C4C,eAAA,SAAgBD,GAAW,IAAD,OACxBjD,SAASC,eAAe,YAAcgD,EAAShE,IAAIyB,SAEnDX,KAAKG,2BAA0B,SAACC,GACS,IAAlCA,EAAWY,YAAYC,QAC1B,EAAK8B,qBAAqBzC,UAAUK,OAAO,c,EAWjDR,0BAAA,SAA2B8B,GAAK,IAAD,OAEzB7B,EAAa,KAEb8B,EAAOC,aAAY,WACrB,GAAK/B,EAEH,OADAgC,cAAcF,GACPD,EAAG7B,GAGVA,EAAa,EAAKiC,YAAYC,YAAYC,MAAK,SAAAnC,GAG7C,MAAoB,qBAFHA,EAAWoC,QAAQC,WAG3BrC,EAEA,UAGZ,M,WAzKsBsC,I,EAErBC,QAAU,CACd,gBACA,kCACA,sBACA,mB,6QCEH5C,QAAA,a,EAEAqD,aAAA,WACCpD,KAAKqD,aAAa1C,SAClBX,KAAKsD,kBAAkBhD,UAAUK,OAAO,cACxCX,KAAKuD,mBAAmB9C,OAAQ,G,WAbLiC,I,EAErBC,QAAU,CACf,SACA,cACA,iB,iPCVDa,OAAS,G,oHAaTzD,QAAA,WAE4B,WAArBC,KAAKK,YAIRL,KAAKyD,YAAYnD,UAAUC,IAAI,UAI1BP,KAAK0D,kBAAoB,GAC5B1D,KAAK2D,YAAYrD,UAAUC,IAAI,UAG/BP,KAAK4D,gBAAgB3D,SAAS4D,iBAAiB,wBAG/C7D,KAAKyD,YAAYnD,UAAUC,IAAI,W,EAarCuD,QAAA,SAASjD,GAEP,IAAIkD,EAAUlD,EAAMC,OAAOkD,QAAb,GAEThE,KAAKiE,mBAAmBF,KAE7B/D,KAAKwD,OAAOU,KAAK,CACfhF,GAAI6E,EACJrC,MAAOb,EAAMC,OAAOkD,QAAb,MACPG,IAAKtD,EAAMC,OAAOkD,QAAb,IACLI,QAASnE,SAASC,eAAe,QAAU6D,EAAU,YAAYM,YAGnErE,KAAKsE,mBAAmBtE,KAAKwD,OAAOxD,KAAKwD,OAAOvC,OAAS,IAEpDjB,KAAKwD,OAAOvC,OAAS,IACxBjB,KAAK2D,YAAYrD,UAAUC,IAAI,UAC/BP,KAAKyD,YAAYnD,UAAUK,OAAO,a,EAYtC4D,WAAA,SAAY1D,GAEV,IAAIkD,EAAUlD,EAAM2D,cAAcR,QAApB,GAGRS,EAAYzE,KAAKwD,OAAOkB,WAAU,SAAAC,GAAI,OAAIA,EAAKzF,KAAO6E,KAE5D/D,KAAKwD,OAAOoB,OAAOH,EAAW,GAG9BxE,SAASC,eAAe,WAAa6D,GAASpD,SAGlB,IAAvBX,KAAKwD,OAAOvC,SACfjB,KAAKyD,YAAYnD,UAAUC,IAAI,UAC/BP,KAAK2D,YAAYrD,UAAUK,OAAO,Y,EAWtC2D,mBAAA,SAAoBK,GAElB,IAAIE,EAAK5E,SAASsB,cAAc,MAC5BuD,EAAM7E,SAASsB,cAAc,MAC7BwD,EAAM9E,SAASsB,cAAc,MAE7ByD,EAAQ/E,SAASsB,cAAc,SAEnCsD,EAAGrD,aAAa,KAAM,WAAamD,EAAKzF,IAExC4F,EAAItD,aAAa,QAAS,+BAErBmD,EAAKjD,MACRoD,EAAIhD,UAAJ,uIAGoC6C,EAAKjD,MAHzC,UAGwDiD,EAAKP,QAH7D,qLAQqBO,EAAKR,IAR1B,yCAScQ,EAAKP,QATnB,gIAkBAU,EAAIhD,UAAJ,sxBAYqB6C,EAAKR,IAZ1B,yCAacQ,EAAKP,QAbnB,gIAsBFW,EAAIvD,aAAa,QAAS,+BAC1BuD,EAAIjD,UAAJ,sDAC+C6C,EAAKzF,GADpD,0aAQA8F,EAAMxD,aAAa,OAAQ,UAC3BwD,EAAMxD,aAAa,OAAQ,oBAC3BwD,EAAMxD,aAAa,QAASmD,EAAKzF,IACjC8F,EAAMxD,aAAa,KAAnB,iBAA0CmD,EAAKzF,IAE/C2F,EAAG9C,YAAYiD,GACfH,EAAG9C,YAAY+C,GACfD,EAAG9C,YAAYgD,GAEf/E,KAAKiF,WAAWlD,YAAY8C,I,EAW9BjB,gBAAA,SAAiBsB,GAAkB,IAAD,OAChCA,EAAgBrF,SAAQ,SAACsF,GACvB,IAAIpB,EAAUoB,EAAInB,QAAJ,GAEd,EAAKR,OAAOU,KAAK,CACfhF,GAAI6E,EACJrC,MAAOyD,EAAInB,QAAJ,MACPG,IAAKgB,EAAInB,QAAJ,IACLI,QAASe,EAAInB,QAAJ,a,EAafC,mBAAA,SAAoBF,GAClB,IAAK,IAAIqB,EAAI,EAAGC,EAAIrF,KAAKwD,OAAOvC,OAAQmE,EAAIC,EAAGD,GAAK,EAClD,GAAKpF,KAAKwD,OAAO4B,GAAGlG,KAAO6E,EACzB,OAAO,EAGX,OAAO,G,WAjNkBrB,I,EAIpBC,QAAU,CACf,QACA,QACA,Q,EAGK2C,OAAS,CACdC,OAAQC,OACRC,aAAcC,S,4cCKhBC,YAAc,K,0HAWd5F,QAAA,WAqOF,IAAwBK,EAAYwF,EA9NhC5F,KAAK2F,YAAc1F,SAAS4F,cAAc,oBAI1C7F,KAAK8F,UA0Ne1F,EA1NWJ,KA0NC4F,EA1NK5F,KAAK2F,YAAY7D,UA4NjD,IAAIiE,IAAJ,CAAa3F,EAAW4F,QAAS,CACtC7B,IAAK/D,EAAW+D,IAChB8B,QAAS7F,EAAW6F,QACpBC,SAAU9F,EAAW8F,SACrBC,YAAa/F,EAAWgG,YACxBC,cAAejG,EAAWiG,cAC1BC,eAAgBC,QAAQnG,EAAWkG,gBACnCE,WAAW,EACXZ,gBAAiBA,KAlOjB5F,KAAKyG,gBACLzG,KAAK0G,aACLX,kBAAwB,EAMxB/F,KAAK2G,oBAAoBC,MAAMC,QAAU,Q,EAI3CJ,cAAA,WACEzG,KAAK8G,YAAYC,UAAW,EAC5B/G,KAAK8G,YAAYF,MAAMC,QAAU,Q,EAGnCH,WAAA,WAAc,IAAD,OAEX1G,KAAK8F,SAASkB,GAAG,QAAQ,SAAAC,GAEvB,IAAIC,EAAkB/E,aAAY,WAEhC,IAAIgF,EAAkB,EAAKnB,QAAQnC,iBAAiB,iBAAiB,EAAKmC,QAAQnC,iBAAiB,iBAAiB5C,OAAS,GACzHmG,EAAmB,EAAKpB,QAAQnC,iBAAiB,kBAAkB,EAAKmC,QAAQnC,iBAAiB,kBAAkB5C,OAAS,GAE3HkG,GAAmBC,IACjB,EAAKf,cAAcgB,OAAO,UAAY,GACzCF,EAAgBG,WAAWC,YAAYJ,GACvCC,EAAiB9G,UAAUK,OAAO,YAGlCyG,EAAiBE,WAAWC,YAAYH,GACxCD,EAAgB7G,UAAUK,OAAO,WAGnCyB,cAAc8E,MAEf,KAOoB,MAAlB,EAAKhB,UAAoB,EAAKJ,SAAS0B,mBAAmBvG,OAAS,GACtE,EAAK6E,SAAS2B,WAAW,EAAK3B,SAAS0B,mBAAmB,IAmB5D,EAAKb,oBAAoBC,MAAMC,QAAU,UAG3C7G,KAAK8F,SAASkB,GAAG,aAAa,SAAAC,GAE5B,EAAK3D,kBAAkBsD,MAAMC,QAAU,OACvC,EAAKF,oBAAoBC,MAAMC,QAAU,OAEzCa,YAAW,WACTT,EAAKU,UAsIb,SAAsCC,EAAQX,GAC5C,OAAO,IAAIY,EAAuBD,EAAQX,GAvInBa,CAA6B,EAAMb,GAAMc,UACzD,QAGL/H,KAAK8F,SAASkB,GAAG,eAAe,SAAAC,GAC9BA,EAAK7G,aAAc4H,QAAcf,EAAK7G,WAAW6H,aAEjD,EAAKC,eAAetB,MAAMC,QAAU,QAGpC,EAAKvD,kBAAkBsD,MAAMC,QAAU,WAGzC7G,KAAK8F,SAASkB,GAAG,iBAAiB,SAAAmB,GAChCT,YAAW,WAET,IAAIU,EAAU,EAAKpC,QAAQnC,iBAAiB,eAEvCuE,EAAQnH,OAAS,GACpBmH,EAAQvI,SAAQ,SAACuI,GACfA,EAAQvE,iBAAiB,aAAahE,SAAQ,SAACsI,GAC7CA,EAASvB,MAAMC,QAAU,eAK9B,QAGL7G,KAAK8F,SAASkB,GAAG,YAAY,SAAAC,GAC3BA,EAAK7G,YAAc6G,EAAK7G,WAAWiI,IAAIC,WAGzCtI,KAAK8F,SAASkB,GAAG,SAAS,SAACC,EAAMsB,GAE/BtI,SAAS4F,cAAc,eAAelF,SAEtC,EAAKgG,oBAAoB7E,UAAYyG,EACrC,EAAK5B,oBAAoBC,MAAMC,QAAU,Y,sCAQ3C,MAAO,CAAE,gBAAgB2B,QAAa,iB,0BAItC,OAAOxI,KAAK8G,YAAY2B,aAAa,4B,+BAIrC,OAAOzI,KAAK0I,KAAKC,IAAI,aAAe,I,kCAIpC,OAAO3I,KAAK0I,KAAKC,IAAI,gBAAkB,M,oCAIvC,OAAO3I,KAAK0I,KAAKC,IAAI,mB,qCAIrB,OAAO3I,KAAK0I,KAAKC,IAAI,oBAAqB,O,8BAtKjBjG,M,EAIpBC,QAAU,CACf,QACA,WACA,cACA,gBACA,kBACA,oB,IAgKEkF,E,WACJ,WAAYD,EAAQX,GAClBjH,KAAK4I,aAkET,SAA4B3B,EAAM9C,EAAK/D,GACrC,OAAO,IAAIyI,eAAa5B,EAAM9C,EAAK/D,GAnEb0I,CAAmB7B,EAAMW,EAAOzD,IAAKnE,MACzDA,KAAK4H,OAASA,EACd5H,KAAKiH,KAAOA,E,2BAGdc,MAAA,WAAS,IAAD,OACN/H,KAAKiH,KAAK7G,WAAaJ,KACvBA,KAAKiI,YAAcjI,KAAK+I,oBACxB/I,KAAK4I,aAAaI,QAAO,SAACC,EAAOC,GAC3BD,IACFjB,QAAc,EAAKC,aACnB,EAAKkB,kBAAkBF,KAEvB,EAAKhB,YAAYxH,MAAQyI,EAAWE,UACpC,EAAKC,2B,EAKXN,kBAAA,WACE,IAAM/D,EAAQ/E,SAASsB,cAAc,SAIrC,OAHAyD,EAAMsE,KAAO,SACbtE,EAAMpD,KAAO5B,KAAK4H,OAAOd,YAAYlF,MACrC2H,QAAYvE,EAAOhF,KAAK4H,OAAOd,aACxB9B,G,EAGTwE,iCAAA,SAAiCnB,GAC/BrI,KAAKyJ,kBAAkBpB,GACvBrI,KAAK0J,yB,EAGPD,kBAAA,SAAkBpB,GAAM,IAAD,OACrBrI,KAAKqI,IAAMA,EACXrI,KAAKqI,IAAIsB,OAAOC,iBAAiB,YAAY,SAAA/I,GAAK,OAChD,EAAKgJ,yBAAyBhJ,O,EAIlCgJ,yBAAA,SAAyBhJ,GACvB,IAAMsH,EAAYtH,EAAMiJ,OAASjJ,EAAMkJ,MAAS,IAChD/J,KAAK4H,OAAOoC,uBAAuBC,kBAAkBrD,MAAMsD,MAAW/B,EAAtE,K,EAGFuB,sBAAA,WACE1J,KAAKiH,KAAKkD,OAASpE,cACnB/F,KAAK4H,OAAO9B,SAASsE,KAAK,aAAcpK,KAAKiH,O,EAG/CkC,kBAAA,SAAkBF,GAChBjJ,KAAKiH,KAAKkD,OAASpE,UACnB/F,KAAK4H,OAAO9B,SAASsE,KAAK,QAASpK,KAAKiH,KAAMgC,GAC9CjJ,KAAK4H,OAAO9B,SAASsE,KAAK,WAAYpK,KAAKiH,O,EAG7CoC,oBAAA,WACErJ,KAAKiH,KAAKkD,OAASpE,YACnB/F,KAAK4H,OAAO9B,SAASsE,KAAK,UAAWpK,KAAKiH,MAC1CjH,KAAK4H,OAAO9B,SAASsE,KAAK,WAAYpK,KAAKiH,O,mRC1O9ClH,QAAA,a,EAEA0H,WAAA,SAAY5G,GAET,IAAIwJ,EAASxJ,EAAM2D,cAAcR,QAApB,GAEfhE,KAAKsK,WAAW3J,SAEd,IAAI4J,EAAgBtK,SAASC,eAAe,mBAExC8E,EAAQ/E,SAASsB,cAAc,SAEnCyD,EAAMxD,aAAa,OAAQ,UAC3BwD,EAAMxD,aAAa,OAAQ,+BAA+BG,QAAQ,KAAM0I,IACxErF,EAAMxD,aAAa,SAAS,GAC5BwD,EAAMxD,aAAa,KAAM,8BAAgC6I,GAEzDE,EAAcC,OAAOxF,I,WArBItC,I,EAErBC,QAAU,CAAE,S,iPCMnB8H,gBAAkB,K,oHAGlB1K,QAAA,WAAY,IAAD,OAMVC,KAAK0K,WAAWd,iBAAiB,sBAAsB,WACtD,EAAKe,aAAa5D,UAAW,EAC7B,EAAK4D,aAAa7I,UAAlB,6bAaD9B,KAAK0K,WAAWd,iBAAiB,oBAAoB,WACpDlC,YAAW,WACV,EAAKiD,aAAa5D,UAAW,EAC7B,EAAK4D,aAAa7I,UAAY,WAC5B,S,EAWL8I,OAAA,SAAQ/J,GAAQ,IAAD,QACTb,KAAK8G,YAAYrG,MAAMQ,OAAS,GAAuC,IAAlCjB,KAAK8G,YAAYrG,MAAMQ,SAChEyG,YAAW,WACL,EAAK+C,kBAAoB,EAAK3D,YAAYrG,QAG9C,EAAKgK,gBAAkB,EAAK3D,YAAYrG,MACxC,EAAKkK,aAAaE,WAEjB,M,EAWLC,gBAAA,SAAiBjK,GAChBkK,QAAQC,IAAI,U,WArEetI,I,EAErBC,QAAU,CAChB,OACA,QACA,W,6QCTA5C,QAAA,WACE,IAAIkL,EAAMhL,SAASC,eAAe,OAC9BgL,EAAUjL,SAASkL,uBAAuB,SAC1CC,EAAS,EACRH,IACHG,EAASnL,SAASkL,uBAAuBF,EAAIxK,QAC/C,IAAK,IAAI2E,EAAI,EAAGA,EAAI8F,EAAQjK,OAAQmE,IAClC8F,EAAQ9F,GAAG9E,UAAUK,OAAO,UAE9B,IAAK,IAAIyE,EAAI,EAAGA,EAAIgG,EAAOnK,OAAQmE,IACjCgG,EAAOhG,GAAG9E,UAAUK,OAAO,W,EAI/B0K,QAAA,SAAQxK,GAIN,IAHA,IAAIyK,EAASrL,SAASkL,uBAAuB,eACzCD,EAAUjL,SAASkL,uBAAuB,SAC1CC,EAASnL,SAASkL,uBAAuBtK,EAAMC,OAAOL,OACjD2E,EAAI,EAAGA,EAAIkG,EAAOrK,OAAQmE,IACjCkG,EAAOlG,GAAG9E,UAAUC,IAAI,UAE1B,IAAK,IAAI6E,EAAI,EAAGA,EAAI8F,EAAQjK,OAAQmE,IAClC8F,EAAQ9F,GAAG9E,UAAUK,OAAO,UAE9B,IAAK,IAAIyE,EAAI,EAAGA,EAAIgG,EAAOnK,OAAQmE,IACjCgG,EAAOhG,GAAG9E,UAAUK,OAAO,W,WA3BJ+B,K,mSCG3B3C,QAAA,WACEC,KAAKuL,W,EAGPA,QAAA,SAAS1K,GACP,IAAI2K,EACAC,EAAMC,eAAeC,QAAQ,QAI/BH,EADG3K,EACIA,EAAMC,OAAOL,MAIdgL,GACGxL,SAASC,eAAe,YAAYO,MAM/CiL,eAAeE,QAAQ,OAAQJ,GAEjBvL,SAAS4D,iBAAiB,eACjChE,SAAQ,SAAAgM,GACbA,EAAMvL,UAAUC,IAAI,aAEtBN,SAASC,eAAe,IAAIsL,GAAMlL,UAAUK,OAAO,UAEtCV,SAAS4D,iBAAiB,eAChChE,SAAQ,SAAAiM,GACbA,EAAMxL,UAAUC,IAAI,SAAU,UAGhCN,SAASC,eAAe,YAAYO,MAAQ+K,EAC5CvL,SAASC,eAAesL,GAAMlL,UAAUK,OAAO,SAAU,Q,GArChC+B,O,4RCG3BqJ,UAAY,G,oHAaZhM,QAAA,WACE,IAAIiM,EAAY/L,SAASC,eAAe,YACxCF,KAAKiM,SAAWC,YAAgBF,EAAW,CACzCG,MAAOnM,KAAKoM,IAAIC,KAAKrM,QAEG,WAArBA,KAAKK,YAIRL,KAAKyD,YAAYnD,UAAUC,IAAI,UAK1BP,KAAKsM,qBAAuB,GAC/BtM,KAAK2D,YAAYrD,UAAUC,IAAI,UAG/BP,KAAKuM,mBAAmBtM,SAAS4D,iBAAiB,4BAGlD7D,KAAKyD,YAAYnD,UAAUC,IAAI,W,EAKrC6L,IAAA,SAAIvL,GACF,IACIsD,EAAG,kBADEtD,EAAM2L,KAAKxI,QAAQ9E,GACrB,QACHwJ,EAAO,IAAI+D,SACf/D,EAAK8B,OAAO,WAAY3J,EAAM6L,SAAW,GACzCC,SAAW,CACTxI,IAAKA,EACLmF,KAAM,QACNZ,KAAMA,K,EAYVkE,YAAA,SAAa/L,GAEX,IAAIgM,EAAchM,EAAMC,OAAOkD,QAAb,GAEbhE,KAAK8M,uBAAuBD,KAEjC7M,KAAK+L,UAAU7H,KAAK,CAClBhF,GAAI2N,EACJ1I,IAAKtD,EAAMC,OAAOkD,QAAb,IACLpC,KAAM3B,SAASC,eAAe,YAAc2M,EAAc,SAASxI,YAGrErE,KAAKsE,mBAAmBtE,KAAK+L,UAAU/L,KAAK+L,UAAU9K,OAAS,IAE1DjB,KAAK+L,UAAU9K,OAAS,IAC3BjB,KAAK2D,YAAYrD,UAAUC,IAAI,UAC/BP,KAAKyD,YAAYnD,UAAUK,OAAO,a,EAYtCoM,eAAA,SAAgBlM,GAEd,IAAIgM,EAAchM,EAAM2D,cAAcR,QAApB,GAGZgJ,EAAgBhN,KAAK+L,UAAUrH,WAAU,SAAAuI,GAAQ,OAAIA,EAAS/N,KAAO2N,KAE3E7M,KAAK+L,UAAUnH,OAAOoI,EAAe,GAGrC/M,SAASC,eAAe,eAAiB2M,GAAalM,SAGvB,IAA1BX,KAAK+L,UAAU9K,SAClBjB,KAAKyD,YAAYnD,UAAUC,IAAI,UAC/BP,KAAK2D,YAAYrD,UAAUK,OAAO,Y,EAWtC2D,mBAAA,SAAoB2I,GAElB,IAAIpI,EAAK5E,SAASsB,cAAc,MAC5BuD,EAAM7E,SAASsB,cAAc,MAC7BwD,EAAM9E,SAASsB,cAAc,MAC7B2L,EAAMjN,SAASsB,cAAc,MAE7ByD,EAAQ/E,SAASsB,cAAc,SAEnCsD,EAAGrD,aAAa,KAAM,eAAiByL,EAAS/N,IAEhD4F,EAAItD,aAAa,QAAS,aAC1BsD,EAAIhD,UAAJ,2XAOAiD,EAAIvD,aAAa,QAAS,+BAE1BuD,EAAIjD,UAAJ,8JAImBmL,EAAS9I,IAJ5B,qCAKY8I,EAASrL,KALrB,4FAYAsL,EAAI1L,aAAa,QAAS,gDAC1B0L,EAAIpL,UAAJ,sDAC+CmL,EAAS/N,GADxD,ibAQA8F,EAAMxD,aAAa,OAAQ,UAC3BwD,EAAMxD,aAAa,OAAQ,4BAC3BwD,EAAMxD,aAAa,QAASyL,EAAS/N,IACrC8F,EAAMxD,aAAa,KAAnB,yBAAkDyL,EAAS/N,IAE3D2F,EAAG9C,YAAYiD,GACfH,EAAG9C,YAAY+C,GACfD,EAAG9C,YAAYgD,GACfF,EAAG9C,YAAYmL,GAEflN,KAAKiF,WAAWlD,YAAY8C,I,EAW9B0H,mBAAA,SAAoBY,GAAqB,IAAD,OACtCA,EAAmBtN,SAAQ,SAACsF,GAC1B,IAAI0H,EAAc1H,EAAInB,QAAJ,GAElB,EAAK+H,UAAU7H,KAAK,CAClBhF,GAAI2N,EACJ1I,IAAKgB,EAAInB,QAAJ,IACLpC,KAAMuD,EAAInB,QAAJ,W,EAaZ8I,uBAAA,SAAwBD,GACtB,IAAK,IAAIzH,EAAI,EAAGC,EAAIrF,KAAK+L,UAAU9K,OAAQmE,EAAIC,EAAGD,GAAK,EACrD,GAAKpF,KAAK+L,UAAU3G,GAAGlG,KAAO2N,EAC5B,OAAO,EAGX,OAAO,G,GA5MkBnK,M,EAIpBC,QAAU,CACf,QACA,QACA,Q,EAGK2C,OAAS,CACdC,OAAQC,OACR4H,gBAAiB1H,S,qQCbnB3F,QAAA,WACEC,KAAKgG,QAAQqH,YAAc,gB,WAFF3K,K,4QCI3B3C,QAAA,a,EAIAuN,eAAA,SAAezM,GACb,IAAIhC,EAAIgC,EAAMC,OACVyM,EAAWtN,SAASkL,uBAAuB,mBAAmB,GAC9DqC,EAAcvN,SAASC,eAAerB,EAAEmF,QAAQ9E,IAChDuO,EAAWF,EAASrO,GACpBwO,EAAQF,EAAYtO,GACpByO,EAAc1N,SAASC,eAAe,QAAUuN,EAASG,UAAUH,EAASxM,OAAO,IACnF4M,EAAW5N,SAASC,eAAe,QAAUwN,EAAME,UAAUF,EAAMzM,OAAO,IAE9EsM,EAASjN,UAAUK,OAAO,kBAAmB,aAAc,cAC3D4M,EAASjN,UAAUC,IAAI,sBACvBiN,EAAYlN,UAAUK,OAAO,sBAC7B6M,EAAYlN,UAAUC,IAAI,mBACL,cAAlBiN,EAAYtO,IAAwC,cAAlBsO,EAAYtO,GAC/CsO,EAAYlN,UAAUC,IAAI,cAE1BiN,EAAYlN,UAAUC,IAAI,cAE5BoN,EAAYrN,UAAUC,IAAI,UAC1BsN,EAASvN,UAAUK,OAAO,W,WA3BD+B,I,EAEpBC,QAAU,CAAE,W,6QCAnB5C,QAAA,WAEE,IAAM+N,EAAQC,OAAOC,SAAS3G,OAE1B4G,EADc,IAAIC,gBAAgBJ,GACbnF,IAAI,WACzB3C,EAAU/F,SAASC,eAAe+N,GAElCjI,IAAYA,EAAQ1F,UAAU6N,SAAS,6BACvCnI,EAAU/F,SAASC,eAAe+N,EAAU,MAGlC,MAAXjI,IACCA,EAAQ6E,QACRkD,OAAOK,SAAS,EAAGnO,SAASC,eAAe,uBAAuBmO,WAC7DrI,EAAQ1F,UAAU6N,SAAS,yBAC5BJ,OAAOK,SAAS,EAAGpI,EAAQqI,a,EAMrCC,SAAA,SAASzN,GACP,IAAIhC,EAAIgC,EAAMC,OACVyM,EAAWtN,SAASkL,uBAAuB,wBAAwB,GACnEqC,EAAcvN,SAASC,eAAerB,EAAEK,IACxCuO,EAAWF,EAASvJ,QAAQ9E,GAC5BwO,EAAQF,EAAYtO,GACpBqP,EAAatO,SAASC,eAAe,eAAiBuN,EAASG,UAAUH,EAASxM,OAAO,IACzFuN,EAAUvO,SAASC,eAAe,eAAiBwN,EAAME,UAAUF,EAAMzM,OAAO,IAEpFsM,EAASjN,UAAUK,OAAO,wBAC1B4M,EAASjN,UAAUC,IAAI,2BACvBiN,EAAYlN,UAAUK,OAAO,2BAC7B6M,EAAYlN,UAAUC,IAAI,wBAC1BgO,EAAWjO,UAAUC,IAAI,UACzBiO,EAAQlO,UAAUK,OAAO,W,EAI3B8N,WAAA,SAAW5N,GACT,IAII6N,EAJA7P,EAAIgC,EAAMC,OACV6N,EAAc1O,SAASC,eAAerB,EAAEmF,QAAQ9E,IAChD0P,EAAQ3O,SAASkL,uBAAuBtM,EAAEmF,QAAQ9E,IAClD2P,EAAe5O,SAASkL,uBAAuB,+BAA+B,GAI/EtM,GAAKgQ,GACNA,EAAavO,UAAUK,OAAO,+BAC9BkO,EAAavO,UAAUC,IAAI,kCAC3BoO,EAAYrO,UAAUC,IAAI,gBACFuO,GAAhBD,GACRhQ,EAAEyB,UAAUK,OAAO,kCACnB9B,EAAEyB,UAAUC,IAAI,+BAChBoO,EAAYrO,UAAUK,OAAO,YAE7BkO,EAAavO,UAAUK,OAAO,+BAC9BkO,EAAavO,UAAUC,IAAI,kCAC3B1B,EAAEyB,UAAUK,OAAO,kCACnB9B,EAAEyB,UAAUC,IAAI,+BAChBoO,EAAYrO,UAAUK,OAAO,UAC7B+N,EAAgBzO,SAASkL,uBAAuB0D,EAAa7K,QAAQ9E,IACrEe,SAASC,eAAe2O,EAAa7K,QAAQ9E,IAAIoB,UAAUC,IAAI,WAIjE,IAAI,IAAI6E,EAAI,EAAGA,EAAEwJ,EAAM3N,OAAQmE,IACzBwJ,EAAMxJ,GAAG9E,UAAU6N,SAAS,UAC9BS,EAAMxJ,GAAG9E,UAAUK,OAAO,UAE1BiO,EAAMxJ,GAAG9E,UAAUC,IAAI,UAG3B,QAAmBuO,GAAhBD,GAA6BhQ,GAAKgQ,EACnC,IAAQzJ,EAAI,EAAGA,EAAEsJ,EAAczN,OAAQmE,IACjCsJ,EAActJ,GAAG9E,UAAU6N,SAAS,UACtCO,EAActJ,GAAG9E,UAAUK,OAAO,UAElC+N,EAActJ,GAAG9E,UAAUC,IAAI,W,WAhFZmC,K,mRCY3B1B,YAAc,G,EACd+N,UAAY,G,EACZC,wBAA0B,G,EAE1BC,qBAAuB,K,oHAwBvBlP,QAAA,WAE4B,WAArBC,KAAKK,aAIRL,KAAKyD,YAAYnD,UAAUC,IAAI,UAC/BP,KAAKkP,wBAAwB5O,UAAUC,IAAI,WAItCP,KAAKmP,uBAAyB,GACjCnP,KAAK2D,YAAYrD,UAAUC,IAAI,UAG/BP,KAAKoP,qBAAqBnP,SAAS4D,iBAAiB,+BAGpD7D,KAAKyD,YAAYnD,UAAUC,IAAI,UAC/BP,KAAKkP,wBAAwB5O,UAAUC,IAAI,Y,EAgBjD8O,cAAA,SAAexO,GAEb,IAAIyO,EAAgBzO,EAAMC,OAAOkD,QAAb,GAEfhE,KAAKuP,yBAAyBD,KAEnCtP,KAAKgB,YAAYkD,KAAK,CACpBhF,GAAIoQ,EACJlL,QAASnE,SAASC,eAAe,cAAgBoP,EAAgB,YAAYjL,UAC7EmL,KAAM3O,EAAMC,OAAOkD,QAAb,KACNyL,OAAQ5O,EAAMC,OAAOkD,QAAb,OACR0L,SAAU7O,EAAMC,OAAOkD,QAAb,SACV2L,cAAe9O,EAAMC,OAAOkD,QAAb,cACf4L,OAAQ/O,EAAMC,OAAOkD,QAAb,OACR6L,KAAMhP,EAAMC,OAAOkD,QAAb,KACN8L,eAAgBjP,EAAMC,OAAOkD,QAAb,cAChB+L,KAAMlP,EAAMC,OAAOkD,QAAb,KACNgM,KAAMnP,EAAMC,OAAOkD,QAAb,KACNiM,SAAUpP,EAAMC,OAAOkD,QAAb,QACVkM,WAAYrP,EAAMC,OAAOkD,QAAb,UACZG,IAAKtD,EAAMC,OAAOkD,QAAb,IACL+K,UAAW/O,KAAKmQ,kBAAkBtP,EAAMC,OAAOkD,QAAb,WAClCgL,wBAAyBhP,KAAKoQ,uBAAuBvP,EAAMC,OAAOkD,QAAb,kBAGvDhE,KAAKsE,mBAAmBtE,KAAKgB,YAAYhB,KAAKgB,YAAYC,OAAS,IAGnEjB,KAAKqQ,2BAEArQ,KAAKgB,YAAYC,OAAS,IAC7BjB,KAAK2D,YAAYrD,UAAUC,IAAI,UAC/BP,KAAKyD,YAAYnD,UAAUK,OAAO,UAClCX,KAAKkP,wBAAwB5O,UAAUK,OAAO,a,EAWlD2P,iBAAA,SAAkBzP,GAKhB,IAHA,IAAIyO,EAAgBzO,EAAM2D,cAAcR,QAApB,GAGXoB,EAAI,EAAGC,EAAIrF,KAAKgB,YAAYC,OAAQmE,EAAIC,EAAGD,GAAK,EACvD,GAAKpF,KAAKgB,YAAYoE,GAAGlG,KAAOoQ,EAAgB,CAG9C,GAA0B,SAArBtP,KAAKK,YAAyB,CACjC,IAAI2E,EAAQ/E,SAASsB,cAAc,SAEnCyD,EAAMxD,aAAa,OAAQ,UAC3BwD,EAAMxD,aAAa,KAAM,oDAAoDG,QAAQ,SAAU2N,IAC/FtK,EAAMxD,aAAa,OAAQ,uDAAuDG,QAAQ,SAAU2N,IACpGtK,EAAMxD,aAAa,SAAS,GAE5BxB,KAAKiF,WAAWlD,YAAYiD,GAG9B,IAAI+J,EAAY/O,KAAKgB,YAAYoE,GAAG2J,UAChCC,EAA0BhP,KAAKgB,YAAYoE,GAAG4J,wBAGlDhP,KAAKgB,YAAY4D,OAAOQ,EAAG,GAG3BpF,KAAKuQ,iBAAiBxB,GAGtB/O,KAAKwQ,uBAAuBxB,GAE5B,MAKJ/O,SAASC,eAAe,iBAAmBoP,GAAe3O,SAGzB,IAA5BX,KAAKgB,YAAYC,SACpBjB,KAAKyD,YAAYnD,UAAUC,IAAI,UAC/BP,KAAKkP,wBAAwB5O,UAAUC,IAAI,UAC3CP,KAAK2D,YAAYrD,UAAUK,OAAO,WAIpCX,KAAKqQ,4B,EAGRI,gBAAA,SAAiB5P,GACFZ,SAASC,eAAe,oBAC9BwQ,gBAAgB,Y,EAGzBC,gBAAA,SAAiB9P,GACFZ,SAASC,eAAe,oBAC9BwQ,gBAAgB,Y,EAWxBnB,yBAAA,SAA0BD,GACxB,IAAK,IAAIlK,EAAI,EAAGC,EAAIrF,KAAKgB,YAAYC,OAAQmE,EAAIC,EAAGD,GAAK,EACvD,GAAKpF,KAAKgB,YAAYoE,GAAGlG,KAAOoQ,EAC9B,OAAO,EAGX,OAAO,G,EAUThL,mBAAA,SAAoBsM,GAElB,IAAIC,GAAO,IAAIC,MAAOC,UAElBlM,EAAK5E,SAASsB,cAAc,MAC5BuD,EAAM7E,SAASsB,cAAc,MAC7BwD,EAAM9E,SAASsB,cAAc,MAC7B2L,EAAMjN,SAASsB,cAAc,MAC7ByP,EAAM/Q,SAASsB,cAAc,MAC7B0P,EAAMhR,SAASsB,cAAc,MAC7B2P,EAAMjR,SAASsB,cAAc,MAC7ByD,EAAQ/E,SAASsB,cAAc,SAC/B4P,EAASlR,SAASsB,cAAc,SAEpCsD,EAAGrD,aAAa,KAAM,iBAAmBoP,EAAW1R,IAEpD4F,EAAItD,aAAa,QAAS,+BAE1BuD,EAAIvD,aAAa,QAAS,+BAC1BuD,EAAIvD,aAAa,KAAM,gBAAkBqP,GAEzC3D,EAAI1L,aAAa,QAAS,+BAE1BwP,EAAIxP,aAAa,QAAS,6CAC1BwP,EAAIxP,aAAa,KAAM,cAAgBqP,GAEvCI,EAAIzP,aAAa,QAAS,6CAC1ByP,EAAIzP,aAAa,KAAM,QAAUqP,GAEjCK,EAAI1P,aAAa,QAAS,0CAE1BsD,EAAIhD,UAAJ,sDAEe8O,EAAWzM,IAF1B,iCAGQyM,EAAWxM,QAHnB,sCAQAW,EAAIjD,WAAY,s2BASF8O,EAAWpB,KATT,m6BA0Bd4B,WAAW,SAAUP,GAEvB3D,EAAIpL,UAAY,ibAOdsP,WAAW,SAAUP,GAEvBG,EAAIlP,UAAY,EAChBmP,EAAInP,UAAY,EAChBoP,EAAIpP,UAAJ,sDAC+C8O,EAAW1R,GAD1D,qbAQA8F,EAAMxD,aAAa,OAAQ,UAC3BwD,EAAMxD,aAAa,OAAQ,4DAA4DG,QAAQ,SAAUkP,IACzG7L,EAAMxD,aAAa,QAASoP,EAAW1R,IAEvCiS,EAAO3P,aAAa,OAAQ,UAC5B2P,EAAO3P,aAAa,OAAQ,mDAAmDG,QAAQ,SAAUkP,IACjGM,EAAO3P,aAAa,KAAM,gDAAgDG,QAAQ,SAAUkP,IAC5FM,EAAO3P,aAAa,QAAS,GAE7BqD,EAAG9C,YAAY+C,GACfD,EAAG9C,YAAYgD,GACfF,EAAG9C,YAAYmL,GACfrI,EAAG9C,YAAYiP,GACfnM,EAAG9C,YAAYkP,GACfpM,EAAG9C,YAAYmP,GAEfrM,EAAG9C,YAAYiD,GACfH,EAAG9C,YAAYoP,GAEfnR,KAAKiF,WAAWlD,YAAY8C,GAG5B7E,KAAKqR,oBAAoBR,EAAMD,EAAWZ,KAAMY,EAAWX,SAAUW,EAAWV,WAAYU,EAAWpB,O,EAWzG6B,oBAAA,SAAqBC,EAAStB,EAAMC,EAAUC,EAAYV,GAAO,IAAD,OAC1D+B,EAAatR,SAASC,eAAe,iDAAiDyB,QAAQ,SAAU2P,IACxGE,EAAmBvR,SAASC,eAAe,wDAAwDyB,QAAQ,SAAU2P,IACrHG,EAAcxR,SAASC,eAAe,cAAgBoR,GACtDI,EAASzR,SAASC,eAAe,QAAUoR,GAE/CE,EAAiB5H,iBAAiB,SAAS,SAAC/K,GAG1C4S,EAAYpN,UAAYsN,WAAWH,EAAiB/Q,OAAS,EAAK8Q,EAAW9Q,MAAM,MAA3D,IAAwE+O,EAGhG,IAAIoC,EAAQ,EAEZ,GAAK3B,GAAYC,EAAa,CAC5B,IACM2B,GADO7I,OAAO8I,IAAK,IACFtC,KAAKU,EAAYD,GAExC2B,EAAQD,WAAYH,EAAiB/Q,MAAQuP,EAAQ6B,EAAUE,SAASvC,SAGxEoC,EAAQD,WAAWH,EAAiB/Q,MAAQuP,GAG5B/P,SAASC,eAAgB,gDAAiDyB,QAAQ,SAAU2P,IAElG7Q,MAAQmR,EACpBF,EAAOrN,UAAYuN,EAAS,UAG5B,EAAKI,0BAGPT,EAAW3H,iBAAiB,SAAS,SAAC/K,GAEpC4S,EAAYpN,UAAYsN,WAAWH,EAAiB/Q,OAAS,EAAK8Q,EAAW9Q,MAAM,MAA3D,IAAwE+O,M,EAWpGwC,qBAAA,WAAyB,IAAD,OAClBC,EAAUhS,SAAS4D,iBAAiB,mBAExC7D,KAAKkS,oBAAoB7N,UAAY,EAErC4N,EAAQpS,SAAQ,SAACsS,GACf,IAAIC,EAAcT,WAAWQ,EAAG9N,UAAU1C,QAAQ,SAAK,KACvD,EAAKuQ,oBAAoB7N,UAAasN,WAAW,EAAKO,oBAAoB7N,UAAU1C,QAAQ,SAAK,KAAOyQ,EAAe,c,EAY3H/B,yBAAA,WAEE,IAAIZ,EAAS,EACTC,EAAW,EACX2C,EAAQ,EACRzC,EAAS,EACTC,EAAO,EACPC,EAAiB,EACjBC,EAAO,EAEX/P,KAAKgB,YAAYnB,SAAQ,SAAC+Q,GACxBnB,GAAUkC,WAAWf,EAAWnB,QAChCC,GAAYiC,WAAWf,EAAWlB,UAClC2C,GAASV,WAAWf,EAAWjB,eAC/BC,GAAU+B,WAAWf,EAAWhB,QAChCC,GAAQ8B,WAAWf,EAAWf,MAC9BC,GAAkB6B,WAAWf,EAAWd,gBACxCC,GAAQ4B,WAAWf,EAAWb,SAGhC/P,KAAKsS,eAAejO,UAAYoL,EAAS,QACzCzP,KAAKuS,iBAAiBlO,UAAYqL,EAAW,KAC7C1P,KAAKwS,cAAcnO,UAAYgO,EAAQ,KACvCrS,KAAKyS,eAAepO,UAAYuL,EAAS,KACzC5P,KAAK0S,aAAarO,UAAYwL,EAAO,KACrC7P,KAAK2S,sBAAsBtO,UAAYyL,EAAiB,KACxD9P,KAAK4S,aAAavO,UAAY0L,EAAO,M,EAUvCI,kBAAA,SAAmB0C,GAajB,IAboC,IAAD,OAE/B9D,EAAa+D,KAAKC,MAAMF,GAAkBxT,KAAI,SAAC6D,GACjD,OAAO4P,KAAKC,MAAM7P,MAQhB8P,GAAS,EAXsB,WAazBC,EAAOC,GACf,IAAM,IAAI9N,EAAI,EAAGC,EAAI,EAAK0J,UAAU9N,OAAQmE,EAAIC,EAAGD,GAAK,EACtD,GAAK,EAAK2J,UAAU3J,GAAGlG,KAAO6P,EAAUkE,GAAG/T,GAAK,CAC9C8T,EAAQ5N,EACR,OAIY,IAAX4N,GAIHjE,EAAUkE,GAAGE,MAAQ,EAErB,EAAKpE,UAAU7K,KAAK6K,EAAUkE,IAG9B,EAAKG,eAAe,kBAAkB,SAAChT,GACrCA,EAAW6C,YAAY8L,EAAUkE,SAOnC,EAAKlE,UAAUiE,GAAOG,OAAS,EAE/BH,GAAS,IA3BHC,EAAI,EAAGC,EAAInE,EAAU9N,OAAQgS,EAAIC,EAAGD,GAAK,EAAK,EAA9CA,GA+BV,OAAOlE,G,EAUTqB,uBAAA,SAAwBiD,GAatB,IAb+C,IAAD,OAE1CrE,EAA2B8D,KAAKC,MAAMM,GAAwBhU,KAAI,SAACgC,GACrE,OAAOyR,KAAKC,MAAM1R,MAQhB2R,GAAS,EAXiC,WAapCC,EAAOC,GACf,IAAM,IAAI9N,EAAI,EAAGC,EAAI,EAAK2J,wBAAwB/N,OAAQmE,EAAIC,EAAGD,GAAK,EACpE,GAAK,EAAK4J,wBAAwB5J,GAAGlG,KAAO8P,EAAwBiE,GAAG/T,GAAK,CAC1E8T,EAAQ5N,EACR,OAIY,IAAX4N,GAIHhE,EAAwBiE,GAAGE,MAAQ,EAEnC,EAAKnE,wBAAwB9K,KAAK8K,EAAwBiE,IAG1D,EAAKG,eAAe,wBAAwB,SAAChT,GAC3CA,EAAWgB,kBAAkB4N,EAAwBiE,SAOvD,EAAKjE,wBAAwBgE,GAAOG,OAAS,EAE7CH,GAAS,IA3BHC,EAAI,EAAGC,EAAIlE,EAAwB/N,OAAQgS,EAAIC,EAAGD,GAAK,EAAK,EAA5DA,GA+BV,OAAOjE,G,EAWTuB,iBAAA,SAAkBxB,GAAY,IAAD,OAG3BA,EAAUlP,SAAQ,SAACqD,GAGjB,IAH+B,IAAD,WAGpBkC,EAAOC,GACf,GAAK,EAAK0J,UAAU3J,GAAGlG,GAAGoU,aAAepQ,EAAShE,GAAGoU,WAoBnD,OAlBA,EAAKvE,UAAU3J,GAAG+N,OAAS,EAMM,IAA5B,EAAKpE,UAAU3J,GAAG+N,OAErB,EAAKC,eAAe,kBAAkB,SAAChT,GACrCA,EAAW+C,eAAeD,GAErB,EAAK6L,UAAU9N,OAAS,EAC3B,EAAK8N,UAAUnK,OAAOQ,EAAG,GAEzB,EAAK2J,UAAY,MAIvB,SArBM3J,EAAI,EAAGC,EAAI,EAAK0J,UAAU9N,OAAQmE,EAAIC,EAAGD,GAAK,EAAI,gBAAlDA,GAqBN,W,EAgBRoL,uBAAA,SAAwBxB,GAA0B,IAAD,OAG/CA,EAAwBnP,SAAQ,SAACwB,GAG/B,IAHoD,IAAD,WAGzC+D,EAAOC,GACf,GAAK,EAAK2J,wBAAwB5J,GAAGlG,GAAGoU,aAAejS,EAAgBnC,GAAGoU,WAoBxE,OAlBA,EAAKtE,wBAAwB5J,GAAG+N,OAAS,EAMM,IAA1C,EAAKnE,wBAAwB5J,GAAG+N,OAEnC,EAAKC,eAAe,wBAAwB,SAAChT,GAC3CA,EAAW4B,qBAAqBX,GAE3B,EAAK2N,wBAAwB/N,OAAS,EACzC,EAAK+N,wBAAwBpK,OAAOQ,EAAG,GAEvC,EAAK4J,wBAA0B,MAIrC,SArBM5J,EAAI,EAAGC,EAAI,EAAK2J,wBAAwB/N,OAAQmE,EAAIC,EAAGD,GAAK,EAAI,gBAAhEA,GAqBN,W,EAeRgO,eAAA,SAAgBG,EAAiBtR,GAAK,IAAD,OAE/B7B,EAAa,KAEb8B,EAAOC,aAAY,WACrB,GAAK/B,EAEH,OADAgC,cAAcF,GACPD,EAAG7B,GAGVA,EAAa,EAAKiC,YAAYC,YAAYC,MAAK,SAAAnC,GAG7C,OAFiBA,EAAWoC,QAAQC,aAEhB8Q,EACXnT,EAEA,UAGZ,M,EAWLgP,qBAAA,SAAsBoE,GAAyB,IAAD,OAC5CA,EAAuB3T,SAAQ,SAACsF,GAE9B,IAAImK,EAAgBnK,EAAInB,QAAJ,GAEpB,EAAKhD,YAAYkD,KAAK,CACpBhF,GAAIoQ,EACJlL,QAASnE,SAASC,eAAe,mBAAqBoP,EAAgB,YAAYjL,UAClFmL,KAAMrK,EAAInB,QAAJ,KACNyL,OAAQtK,EAAInB,QAAJ,OACR0L,SAAUvK,EAAInB,QAAJ,SACV2L,cAAexK,EAAInB,QAAJ,cACf4L,OAAQzK,EAAInB,QAAJ,OACR6L,KAAM1K,EAAInB,QAAJ,KACN8L,eAAgB3K,EAAInB,QAAJ,cAChB+L,KAAM5K,EAAInB,QAAJ,KACNgM,KAAM7K,EAAInB,QAAJ,KACNiM,SAAU9K,EAAInB,QAAJ,QACVkM,WAAY/K,EAAInB,QAAJ,UACZG,IAAKgB,EAAInB,QAAJ,IACL+K,UAAW,EAAKoB,kBAAkBhL,EAAInB,QAAJ,WAClCgL,wBAAyB,EAAKoB,uBAAuBjL,EAAInB,QAAJ,kBAGvD,IAAIyP,EAAiB,EAAKzS,YAAY,EAAKA,YAAYC,OAAS,GAEhE,EAAKoQ,oBAAoB/B,EAAemE,EAAezD,KAAMyD,EAAexD,SAAUwD,EAAevD,WAAYuD,EAAejE,SAGlIxP,KAAKqQ,2BACLrQ,KAAKgS,wB,GA3pBoBtP,M,EAQpBC,QAAU,CACf,QACA,QACA,OACA,oBACA,mBACA,WACA,aACA,UACA,WACA,SACA,kBACA,SACA,iB,EAGK2C,OAAS,CACdC,OAAQC,OACRkO,kBAAmBhO,S,yQCnBtB+E,gBAAkB,K,EACjBtG,IAAM,mE,oHAEPpE,QAAA,WAAY,IAAD,OAEVC,KAAKmE,IAAMnE,KAAKmE,IAAIxC,QAAQ,OAAQ3B,KAAK2T,UAMzC1T,SAAS2J,iBAAiB,sBAAsB,SAAC/I,GAChD,EAAK+S,aAAa7M,UAAW,EAC7B,EAAK6M,aAAa9R,UAAlB,6bAaD7B,SAAS2J,iBAAiB,eAAe,WACxClC,YAAW,WACV,EAAKkM,aAAa7M,UAAW,EAC7B,EAAK6M,aAAa9R,UAAY,WAC5B,S,EAYL8I,OAAA,SAAQ/J,GAAQ,IAAD,QACTb,KAAK8G,YAAYrG,MAAMQ,OAAS,GAAuC,IAAlCjB,KAAK8G,YAAYrG,MAAMQ,SAChEyG,YAAW,WACL,EAAK+C,kBAAoB,EAAK3D,YAAYrG,QAG9C,EAAKgK,gBAAkB,EAAK3D,YAAYrG,MAEnCoT,KAAY,EAAK1P,IAAIxC,QAAQ,QAAS,EAAKmF,YAAYrG,OAAQ,CAAE8E,OAAQ,eAE7E,M,EAIJ8B,OAAA,SAAQxG,GACNgT,KAAY7T,KAAKmE,IAAIxC,QAAQ,QAAS3B,KAAK8G,YAAYrG,OAAQ,CAAE8E,OAAQ,a,EAG3EuO,gBAAA,SAAiBjT,GACM,KAAlBA,EAAMkT,UACVlT,EAAMmT,iBACNnT,EAAMoT,kBACNjU,KAAKqH,W,EAMN6M,mBAAA,SAAoBrT,GACbA,EAAMC,OAAOC,QAChBf,KAAKmE,IAAMnE,KAAKmE,IAAM,uBAEtBnE,KAAKmE,IAAMnE,KAAKmE,IAAIxC,QAAQ,uBAAwB,IAEtD3B,KAAKqH,U,GAvFoB3E,M,EAErBC,QAAU,CAAE,QAAS,SAAU,S,EAE/B2C,OAAS,CACfnB,IAAKqB,S,iPCTL2O,WAAa,K,oHAEbpU,QAAA,WAAW,IAAD,OAERC,KAAKmU,WAAalU,SAAS4D,iBAAiB,2CAS5C7D,KAAKmU,WAAWtU,SAAQ,SAACuU,GACvBA,EAASxK,iBAAiB,SAAU,EAAKyK,uBAAuBhI,KAAK,Q,EAIzEgI,uBAAA,SAAwBxT,GAEtB,IAAIyT,EAAqBrU,SAASC,eAAeW,EAAMC,OAAO5B,GAAGyC,QAAQ,OAAQ,aAEjF,GAAKd,EAAMC,OAAOC,QACS,oCAApBF,EAAMC,OAAO5B,GAMhBc,KAAKmU,WAAWtU,SAAQ,SAACuU,GACF,oCAAhBA,EAASlV,GACZkV,EAASrN,UAAW,EAEpBqN,EAASrN,UAAW,KAUxB/G,KAAKmU,WAAWtU,SAAQ,SAACuU,GACF,oCAAhBA,EAASlV,IACZkV,EAASrT,SAAU,EACnBqT,EAASrN,UAAW,GAGpBqN,EAASrN,UAAW,KAKrBuN,IAAqBA,EAAmB7T,MAAQ,OAElD,CACH,GAAyB,oCAApBI,EAAMC,OAAO5B,GAMhBc,KAAKmU,WAAWtU,SAAQ,SAACuU,GACvBA,EAASrN,UAAW,UAWtB,IAAM,IAAI3B,EAAI,EAAGC,EAAIrF,KAAKmU,WAAWlT,OAAQmE,EAAIC,IAChB,oCAA1BrF,KAAKmU,WAAW/O,GAAGlG,KAA4Cc,KAAKmU,WAAW/O,GAAGrE,SADrCqE,GAAK,EAIhDA,IAAOpF,KAAKmU,WAAWlT,OAAS,IAEnChB,SAASC,eAAe,mCAAmC6G,UAAW,GAQzEuN,IAAqBA,EAAmB7T,MAAQ,K,WA3F9BiC,K,4RCI3B6R,MAAQ,G,oHAaRxU,QAAA,WACE,IAAIiM,EAAY/L,SAASC,eAAe,YACxCF,KAAKiM,SAAWC,YAAgBF,EAAW,CACzCG,MAAOnM,KAAKoM,IAAIC,KAAKrM,QAEG,WAArBA,KAAKK,YAIRL,KAAKyD,YAAYnD,UAAUC,IAAI,UAK1BP,KAAKwU,iBAAmB,GAC3BxU,KAAK2D,YAAYrD,UAAUC,IAAI,UAG/BP,KAAKyU,eAAexU,SAAS4D,iBAAiB,wBAG9C7D,KAAKyD,YAAYnD,UAAUC,IAAI,W,EAKrC6L,IAAA,SAAIvL,GACF,IACIsD,EAAG,cADEtD,EAAM2L,KAAKxI,QAAQ9E,GACrB,QACHwJ,EAAO,IAAI+D,SACf/D,EAAK8B,OAAO,WAAY3J,EAAM6L,SAAW,GACzCC,SAAW,CACTxI,IAAKA,EACLmF,KAAM,QACNZ,KAAMA,K,EAYVgM,QAAA,SAAS7T,GAEP,IAAI8T,EAAU9T,EAAMC,OAAOkD,QAAb,GAEThE,KAAK4U,mBAAmBD,KAE7B3U,KAAKuU,MAAMrQ,KAAK,CACdhF,GAAIyV,EACJxQ,IAAKtD,EAAMC,OAAOkD,QAAb,IACLpC,KAAM3B,SAASC,eAAe,QAAUyU,EAAU,SAAStQ,YAG7DrE,KAAKsE,mBAAmBtE,KAAKuU,MAAMvU,KAAKuU,MAAMtT,OAAS,IAElDjB,KAAKuU,MAAMtT,OAAS,IACvBjB,KAAK2D,YAAYrD,UAAUC,IAAI,UAC/BP,KAAKyD,YAAYnD,UAAUK,OAAO,a,EAYtCkU,WAAA,SAAYhU,GAEV,IAAI8T,EAAU9T,EAAM2D,cAAcR,QAApB,GAGR8Q,EAAY9U,KAAKuU,MAAM7P,WAAU,SAAAqQ,GAAI,OAAIA,EAAK7V,KAAOyV,KAE3D3U,KAAKuU,MAAM3P,OAAOkQ,EAAW,GAG7B7U,SAASC,eAAe,WAAayU,GAAShU,SAGnB,IAAtBX,KAAKuU,MAAMtT,SACdjB,KAAKyD,YAAYnD,UAAUC,IAAI,UAC/BP,KAAK2D,YAAYrD,UAAUK,OAAO,Y,EAWtC2D,mBAAA,SAAoByQ,GAElB,IAAIlQ,EAAK5E,SAASsB,cAAc,MAC5BuD,EAAM7E,SAASsB,cAAc,MAC7BwD,EAAM9E,SAASsB,cAAc,MAC7B2L,EAAMjN,SAASsB,cAAc,MAE7ByD,EAAQ/E,SAASsB,cAAc,SAEnCsD,EAAGrD,aAAa,KAAM,WAAauT,EAAK7V,IAExC4F,EAAItD,aAAa,QAAS,aAC1BsD,EAAIhD,UAAJ,2XAOAiD,EAAIvD,aAAa,QAAS,+BAE1B,IAAIqK,EAAQkJ,EAAKC,SAAUD,EAAKC,SAAWD,EAAKnT,KAChDmD,EAAIjD,UAAJ,8JAImBiT,EAAK5Q,IAJxB,qCAKY0H,EALZ,4EAYAqB,EAAI1L,aAAa,QAAS,gDAC1B0L,EAAIpL,UAAJ,sDAC+CiT,EAAK7V,GADpD,yaAQA8F,EAAMxD,aAAa,OAAQ,UAC3BwD,EAAMxD,aAAa,OAAQ,oBAC3BwD,EAAMxD,aAAa,QAASuT,EAAK7V,IACjC8F,EAAMxD,aAAa,KAAnB,iBAA0CuT,EAAK7V,IAE/C2F,EAAG9C,YAAYiD,GACfH,EAAG9C,YAAY+C,GACfD,EAAG9C,YAAYgD,GACfF,EAAG9C,YAAYmL,GAEflN,KAAKiF,WAAWlD,YAAY8C,I,EAW9B4P,eAAA,SAAgBQ,GAAiB,IAAD,OAC9BA,EAAepV,SAAQ,SAACsF,GACtB,IAAIwP,EAAUxP,EAAInB,QAAJ,GAEd,EAAKuQ,MAAMrQ,KAAK,CACdhF,GAAIyV,EACJxQ,IAAKgB,EAAInB,QAAJ,IACLpC,KAAMuD,EAAInB,QAAJ,W,EAaZ4Q,mBAAA,SAAoBD,GAClB,IAAK,IAAIvP,EAAI,EAAGC,EAAIrF,KAAKuU,MAAMtT,OAAQmE,EAAIC,EAAGD,GAAK,EACjD,GAAKpF,KAAKuU,MAAMnP,GAAGlG,KAAOyV,EACxB,OAAO,EAGX,OAAO,G,GA7MkBjS,M,EAIpBC,QAAU,CACf,QACA,QACA,Q,EAGK2C,OAAS,CACdC,OAAQC,OACR0P,YAAaxP,S,iPCJfyP,KAAO,K,EACPC,OAAS,K,oHAEVrV,QAAA,WAAY,IAAD,OAERC,KAAKqV,QAAUrV,KAAKgG,QAAQH,cAAc,kBAErC7F,KAAKqV,UAGRrV,KAAKmV,KAAOnV,KAAKqV,QAAQxP,cAAc,QAElC7F,KAAKmV,OACRnV,KAAKoV,OAASpV,KAAKgG,QAAQH,cAAc,0BAGxC7F,KAAKmV,MACRnV,KAAKmV,KAAKvL,iBAAiB,oBAAoB,SAAC/I,GACzCA,EAAMyU,OAAOC,eAAeC,OAAOC,UACtC,EAAKC,QACL,EAAKC,mB,EAObC,KAAA,SAAM/U,GAEJ,IAAIgV,EAAe5V,SAASC,eAAeW,EAAM2D,cAAcR,QAAQ8R,MAAQ,UAE/ED,EACGE,QAAQ,UACRzV,UACAK,OAAO,UAILE,EAAM2D,cAAcR,QAApB,SACH6R,EAAarU,aAAa,iBAAkBX,EAAM2D,cAAcR,QAApB,U,EAIhD0R,MAAA,WAAW1V,KAAKgG,QAAQ1F,UAAUC,IAAI,W,EAGtCoV,YAAA,WACE3V,KAAKmV,KAAKa,QAELhW,KAAKoV,SACRpV,KAAKoV,OAAOrO,UAAW,EACvB/G,KAAKoV,OAAO3U,MAAQ,W,WAxDGiC,I,EAErBC,QAAU,I,6QCEjB5C,QAAA,a,EAGC6V,KAAA,SAAM/U,GAEJ,IAAIgV,EAAe5V,SAASC,eAAeW,EAAM2D,cAAcR,QAAQ8R,MAAQ,UAE/ED,EACGE,QAAQ,UACRzV,UACAK,OAAO,UAIV,IAAIsV,EAAY,KAEXpV,EAAM2D,cAAcR,QAApB,UACHiS,EAAYpV,EAAM2D,cAAcR,QAApB,QAEK/D,SAASC,eAAe,8BAC1BsB,aAAa,iBAAkByU,GAE9CJ,EAAarU,aAAa,iBAAkByU,IAI9C,IAAIC,EAA6BjW,SAASC,eAAe,6DAA6DyB,QAAQ,SAAUsU,IACpIE,EAA6BlW,SAASC,eAAe,6DAA6DyB,QAAQ,SAAUsU,IAEpIG,EAAuBnW,SAASC,eAAe,qBAC/CmW,EAAuBpW,SAASC,eAAe,qBAEnDkW,EAAqB3V,MAAQyV,EAA2BzV,MACxD4V,EAAqB5V,MAAQ0V,EAA2B1V,O,EAI1DiV,MAAA,SAAO7U,GAEL,IAAIoV,EAAYpV,EAAM2D,cAAcR,QAApB,SAEZkS,EAA6BjW,SAASC,eAAe,6DAA6DyB,QAAQ,SAAUsU,IACpIE,EAA6BlW,SAASC,eAAe,6DAA6DyB,QAAQ,SAAUsU,IAEpIG,EAAuBnW,SAASC,eAAe,qBAC/CmW,EAAuBpW,SAASC,eAAe,qBAEnDgW,EAA2BzV,MAAQ2V,EAAqB3V,MACxD0V,EAA2B1V,MAAQ4V,EAAqB5V,MAWxD,IAAI6V,EAAmBrW,SAASC,eAAe,eAAiB+V,GAE3DG,EAAqB3V,OAAS4V,EAAqB5V,MACtD6V,EAAiBhW,UAAUC,IAAI,YAE/B+V,EAAiBhW,UAAUK,OAAO,YAOjBV,SAASC,eAAe,aAAe+V,GAE7CnU,UAAesU,EAAqB3V,MAAjD,IAA0D4V,EAAqB5V,MAI/E2V,EAAqB3V,WAAQqO,EAC7BuH,EAAqB5V,WAAQqO,EAE7B9O,KAAKgG,QACF+P,QAAQ,UACRzV,UACAC,IAAI,W,WAvFkBmC,I,EAErBC,QAAU,I,qSCFhB5C,QAAA,a,EAQAwW,uBAAA,WACE,IAAIC,GAAWC,QAAa,GAC5BzW,KAAK0W,oBAAoBjW,MAAQ+V,G,EAUnCG,eAAA,WACyC,SAAlC3W,KAAK0W,oBAAoBpN,MAC5BtJ,KAAK0W,oBAAoBpN,KAAO,WAChCtJ,KAAK4W,wBAAwB9U,UAA7B,keAMA9B,KAAK0W,oBAAoBpN,KAAO,OAChCtJ,KAAK4W,wBAAwB9U,UAA7B,yiB,GAlCuBY,M,EAEpBC,QAAU,CAAE,gBAAiB,sB,iPCMpCkU,qBAAuB,E,EACvBC,iCAAmC,K,EACnCC,uBAAyB,K,oHAE1BhX,QAAA,WAAY,IAAD,OACRC,KAAK8W,iCAAmC7W,SAAS4F,cAAc,qCAC/D7F,KAAK8W,iCAAiCxW,UAAUK,OAAO,WAAY,kBAAmB,QAEtFX,KAAK+W,uBAAyB9W,SAASC,eAAe,wBAEtDF,KAAK+W,uBAAuBnN,iBAAiB,SAAS,SAAC/I,GACrD,EAAKmW,qB,EAITA,eAAA,WAEEhX,KAAK8W,iCAAiCxW,UAAUC,IAAI,WAAY,kBAAmB,QAEnF,IAAIsQ,GAAO,IAAIC,MAAOC,UAElBkG,EAAe,8CAA8CtV,QAAQ,IAAKkP,GAC1EqG,EAAiB,iDAAiDvV,QAAQ,IAAKkP,GAE/EsG,EAAe,8CAA8CxV,QAAQ,IAAKkP,GAC1EuG,EAAiB,iDAAiDzV,QAAQ,IAAKkP,GAE/EwG,EAAe,8CAA8C1V,QAAQ,IAAKkP,GAC1EyG,EAAiB,iDAAiD3V,QAAQ,IAAKkP,GAE/E0G,EAAe,8CAA8C5V,QAAQ,IAAKkP,GAC1E2G,EAAiB,iDAAiD7V,QAAQ,IAAKkP,GAE/E4G,EAAKxX,SAASsB,cAAc,MAC5BmW,EAAOzX,SAASsB,cAAc,OAC9BoW,EAAO1X,SAASsB,cAAc,OAC9BqW,EAAO3X,SAASsB,cAAc,OAC9BsW,EAAO5X,SAASsB,cAAc,OAC9BuW,EAAc7X,SAASsB,cAAc,OAErCwW,EAAI9X,SAASsB,cAAc,KAE/BmW,EAAKlW,aAAa,QAAS,+BAC3BmW,EAAKnW,aAAa,QAAS,sCAC3BoW,EAAKpW,aAAa,QAAS,+BAE3BuW,EAAEvW,aAAa,QAAS,yBACxBuW,EAAEjW,UAAY,gBAAkB9B,KAAK6W,sBAAwB,GAE7Dc,EAAK5V,YAAYgW,GACjBF,EAAK/V,UAAL,2ZAOA6V,EAAK5V,YAAY8V,GACjBD,EAAK7V,YAAY4V,GAEjBG,EAAYtW,aAAa,QAAS,QAClCsW,EAAYhW,UAAY,q+CAgBtBsP,WAAW,kBAAmBP,GAEhC+G,EAAK7V,YAAY+V,GAGjB,IAAIE,EAAc/X,SAASsB,cAAc,SACrC0W,EAAYhY,SAASsB,cAAc,OAEvCyW,EAAYxW,aAAa,QAAS,4BAClCwW,EAAYxW,aAAa,OAAQ,QACjCwW,EAAYxW,aAAa,cAAe,MACxCwW,EAAYxW,aAAa,WAAY,IACrCwW,EAAYxW,aAAa,KAAMyV,GAC/Be,EAAYxW,aAAa,OAAQ0V,GAEjCe,EAAUzW,aAAa,QAAS,kCAChCyW,EAAUlW,YAAYiW,GACtBJ,EAAK7V,YAAYkW,GAGjB,IAAIC,EAAcjY,SAASsB,cAAc,SACrC4W,EAAYlY,SAASsB,cAAc,OAEvC2W,EAAY1W,aAAa,QAAS,4BAClC0W,EAAY1W,aAAa,OAAQ,QACjC0W,EAAY1W,aAAa,cAAe,MACxC0W,EAAY1W,aAAa,WAAY,IACrC0W,EAAY1W,aAAa,KAAM2V,GAC/Be,EAAY1W,aAAa,OAAQ4V,GAEjCe,EAAU3W,aAAa,QAAS,kCAChC2W,EAAUpW,YAAYmW,GACtBN,EAAK7V,YAAYoW,GAGjB,IAAIC,EAAcnY,SAASsB,cAAc,SACrC8W,EAAYpY,SAASsB,cAAc,OAEvC6W,EAAY5W,aAAa,QAAS,4BAClC4W,EAAY5W,aAAa,OAAQ,QACjC4W,EAAY5W,aAAa,cAAe,MACxC4W,EAAY5W,aAAa,WAAY,IACrC4W,EAAY5W,aAAa,KAAM6V,GAC/Be,EAAY5W,aAAa,OAAQ8V,GAEjCe,EAAU7W,aAAa,QAAS,kCAChC6W,EAAUtW,YAAYqW,GACtBR,EAAK7V,YAAYsW,GAEjB,IAAIC,EAAcrY,SAASsB,cAAc,SACrCgX,EAAYtY,SAASsB,cAAc,OAEvC+W,EAAY9W,aAAa,QAAS,4BAClC8W,EAAY9W,aAAa,OAAQ,QACjC8W,EAAY9W,aAAa,cAAe,MACxC8W,EAAY9W,aAAa,WAAY,IACrC8W,EAAY9W,aAAa,KAAM+V,GAC/Be,EAAY9W,aAAa,OAAQgW,GAEjCe,EAAU/W,aAAa,QAAS,kCAChC+W,EAAUxW,YAAYuW,GACtBV,EAAK7V,YAAYwW,GAEjBd,EAAG1V,YAAY6V,GAEf3X,SACGC,eAAe,sBACf6B,YAAY0V,I,EAIjBe,kBAAA,SAAmB3X,GAEjB,IAAI0E,EAAS1E,EAAMC,OAAOiV,QAAQ,MAAM/R,QAA3B,OACTyU,EAAQ5X,EAAMC,OAAOiV,QAAQ,MAAM/R,QAA3B,MAQZ,GANAnD,EAAMC,OAAOiV,QAAQ,MAAMpV,SAMX,SAAX4E,EAAoB,CAEvB,IAAImT,EAA0B,kDAAkD/W,QAAQ,IAAK8W,GACzFE,EAAwB,+CAA+ChX,QAAQ,IAAK8W,GAEpFzT,EAAQ/E,SAASsB,cAAc,SAEnCyD,EAAMxD,aAAa,OAAQ,UAC3BwD,EAAMxD,aAAa,OAAQkX,GAC3B1T,EAAMxD,aAAa,KAAMmX,GACzB3T,EAAMxD,aAAa,SAAS,GAE5BvB,SAASC,eAAe,mBAAmB6B,YAAYiD,K,WA/KhCtC,I,EAErBC,QAAU,I,4QCGjB5C,QAAA,a,EAIC6Y,WAAA,SAAY/X,GACLA,EAAMC,OAAO+X,UAAUC,QAAQ,YAAc,IAChD9Y,KAAK+Y,WAAWjX,UAAY,cAEzBjB,EAAMC,OAAO+X,UAAUC,QAAQ,YAAc,IAChD9Y,KAAK+Y,WAAWjX,UAAY,eAEzBjB,EAAMC,OAAO+X,UAAUC,QAAQ,YAAc,IAChD9Y,KAAK+Y,WAAWjX,UAAY,Y,WAhBLY,I,EAErBC,QAAU,CAAE,S,kCCRb,SAAS6F,EAAa5G,GAC3B,IAAMoE,EAMD,SAAqBgT,EAAMC,GACb,iBAARD,IACTC,EAAWD,EACXA,EAAO/Y,UAET,OAAO+Y,EAAKnT,cAAcoT,GAXVC,CAAYjZ,SAASkZ,KAAV,cAA8BvX,EAA9B,MAC3B,GAAIoE,EACF,OAAOA,EAAQyC,aAAa,WAsBzB,SAAST,EAAcoR,GACxBA,GAAMA,EAAG9R,YACX8R,EAAG9R,WAAWC,YAAY6R,GAIvB,SAAS7P,EAAY6P,EAAIC,GAC9B,OAAOA,EAAc/R,WAAWgS,aAAaF,EAAIC,EAAcE,aAY1D,SAAS9C,EAAcxV,GAE5B,GAAuB,kBAAXA,EAAZ,CAQA,IAHA,IAAIuU,EAAS,GACPgE,EAAQ,iEAELpU,EAAInE,EAAQmE,EAAI,IAAKA,EAC5BoQ,GAAUgE,EAAMC,KAAKC,MAAMD,KAAKE,SAAWH,EAAMvY,SAEnD,OAAOuU,EAVLzK,QAAQ9B,MAAM,6B,gNCrClB,WAEE,IA+DI2Q,EAAuB,SAACC,GAG1B,IAAIC,EAAUD,EAAShU,cAAc,YACrCiU,EAAQxZ,UAAUK,OAAO,WAAY,eAAgB,gBAAiB,cAAe,mBAAoB,eACzGmZ,EAAQxZ,UAAUC,IAAI,aAAc,UAAW,eAAgB,aAE/D,IAAIuV,EAAQ+D,EAAShU,cAAc,UACnCiQ,EAAMxV,UAAUK,OAAO,WAAY,eAAgB,gBAAiB,cAAe,oBACnFmV,EAAMxV,UAAUC,IAAI,aAAc,UAAW,eAAgB,aAE7DmH,YAAW,WACTmS,EAASlZ,WACR,MAWDoZ,EAAqB,SAACC,GAExB,IAAIlE,EAAQ7V,SAASsB,cAAc,OA+EnC,OA7EAuU,EAAMxV,UAAUC,IAAI,QAAS,OAAQ,UAAW,mBAChDuV,EAAMhU,UAAN,miGAiDAgU,EAAMjQ,cAAc,WAAWrE,aAAa,OAAQwY,EAAQ7V,KAC5D2R,EAAMjQ,cAAc,WAAWrE,aAAa,cAAewY,EAAQC,QAE9DD,EAAQnO,QACXiK,EAAMjQ,cAAc,gBAAgB/D,UAAYkY,EAAQnO,OAErDmO,EAAQE,OACXpE,EAAMjQ,cAAc,eAAe/D,UAAYkY,EAAQE,MAEpDF,EAAQG,SACXrE,EAAMjQ,cAAc,WAAW/D,UAAYkY,EAAQG,QAEhDH,EAAQI,SACXtE,EAAMjQ,cAAc,WAAW/D,UAAYkY,EAAQI,QAEhDJ,EAAQK,cACXvE,EAAMjQ,cAAc,WAAWvF,UAAUK,OAAO,cAChDmV,EAAMjQ,cAAc,WAAWvF,UAAUC,IAAIyZ,EAAQK,cAGlDL,EAAQM,cACXxE,EAAMjQ,cAAc,WAAWvF,UAAUK,OAAO,OAChDmV,EAAMjQ,cAAc,WAAWvF,UAAUC,IAAIyZ,EAAQM,cAGvDra,SAASsa,KAAKxY,YAAY+T,GAEnBA,GAIT,GAAKnJ,IAAQ,CAIXA,aAAe1M,SAFA,CAAC,kBAAmB,uBAAwB,oCAEzBua,KAAK,MAAO,WAAW,SAACxU,GAExD,IAAI6T,EAlKU,SAACY,GAEjB,IAAIzU,EAAUyU,EAAI3Z,OAEdkZ,EAAU,CACZnO,MAAO7F,EAAQhC,QAAR,MACPkW,KAAMlU,EAAQhC,QAAR,QACNmW,OAAQnU,EAAQhC,QAAR,OACRqW,YAAarU,EAAQhC,QAAR,YACboW,OAAQpU,EAAQhC,QAAR,OACRsW,YAAatU,EAAQhC,QAAR,YACbiW,OAAQjU,EAAQhC,QAAR,OACRG,IAAK6B,EAAQ0U,MAGX5E,EAAQiE,EAAmBC,GAoB/B,OAlBAlE,EACGjQ,cAAc,WACd+D,iBAAiB,SAAS,WACzBgQ,EAAqB9D,MAGzBA,EACGjQ,cAAc,WACd+D,iBAAiB,SAAS,WACzBgQ,EAAqB9D,MAGzBA,EACGjQ,cAAc,UACd+D,iBAAiB,SAAS,WACzBgQ,EAAqB9D,MAGlBA,EA+HU6E,CAAY3U,GAa3B,OAVA0B,YAAW,WACT,IAAIoS,EAAUD,EAAShU,cAAc,YACrCiU,EAAQxZ,UAAUK,OAAO,gBAAiB,YAAa,mBAAoB,oBAC3EmZ,EAAQxZ,UAAUC,IAAI,gBAAiB,cAAe,oBAEtD,IAAIuV,EAAQ+D,EAAShU,cAAc,UACnCiQ,EAAMxV,UAAUK,OAAO,gBAAiB,YAAa,mBAAoB,oBACzEmV,EAAMxV,UAAUC,IAAI,gBAAiB,cAAe,sBACnD,MAEI,MAjMb,G,wBCNM8B,EAAcuY,aACdpY,EAAU5C,QAChByC,EAAYwY,MAAKC,OAAuBtY,ICExCmK,YACAoO,W","file":"js/application-317433153deeb6acc3e5.js","sourcesContent":["function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nwebpackEmptyContext.id = 6463;\nmodule.exports = webpackEmptyContext;","var map = {\n\t\"./additional_info_list_controller.js\": 5302,\n\t\"./allergens_list_controller.js\": 8404,\n\t\"./avatar_edit_controller.js\": 9654,\n\t\"./dishes_list_controller.js\": 8613,\n\t\"./dropzone_controller.js\": 6712,\n\t\"./file_edit_controller.js\": 6676,\n\t\"./finder_field_controller.js\": 9074,\n\t\"./frontend_days_controller.js\": 6699,\n\t\"./frontend_language_controller.js\": 7658,\n\t\"./frontends_list_controller.js\": 7475,\n\t\"./hello_controller.js\": 6155,\n\t\"./home_controller.js\": 206,\n\t\"./information_controller.js\": 1888,\n\t\"./ingredients_list_controller.js\": 9856,\n\t\"./internal_finder_controller.js\": 9926,\n\t\"./menu_days_controller.js\": 7872,\n\t\"./menus_list_controller.js\": 7026,\n\t\"./modal_controller.js\": 7654,\n\t\"./modal_gross_amount_controller.js\": 4166,\n\t\"./password_field_controller.js\": 9267,\n\t\"./subcategories_form_controller.js\": 4492,\n\t\"./toggle_switch_controller.js\": 823,\n\t\"controllers/additional_info_list_controller.js\": 5302,\n\t\"controllers/allergens_list_controller.js\": 8404,\n\t\"controllers/avatar_edit_controller.js\": 9654,\n\t\"controllers/dishes_list_controller.js\": 8613,\n\t\"controllers/dropzone_controller.js\": 6712,\n\t\"controllers/file_edit_controller.js\": 6676,\n\t\"controllers/finder_field_controller.js\": 9074,\n\t\"controllers/frontend_days_controller.js\": 6699,\n\t\"controllers/frontend_language_controller.js\": 7658,\n\t\"controllers/frontends_list_controller.js\": 7475,\n\t\"controllers/hello_controller.js\": 6155,\n\t\"controllers/home_controller.js\": 206,\n\t\"controllers/information_controller.js\": 1888,\n\t\"controllers/ingredients_list_controller.js\": 9856,\n\t\"controllers/internal_finder_controller.js\": 9926,\n\t\"controllers/menu_days_controller.js\": 7872,\n\t\"controllers/menus_list_controller.js\": 7026,\n\t\"controllers/modal_controller.js\": 7654,\n\t\"controllers/modal_gross_amount_controller.js\": 4166,\n\t\"controllers/password_field_controller.js\": 9267,\n\t\"controllers/subcategories_form_controller.js\": 4492,\n\t\"controllers/toggle_switch_controller.js\": 823\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 7074;","// Load all the channels within this directory and all subdirectories.\n// Channel files must be named *_channel.js.\n\nconst channels = require.context('.', true, /_channel\\.js$/)\nchannels.keys().forEach(channels)\n","import { Controller } from 'stimulus';\n\n/*\n * Ingredients additional information managing controller\n *\n * Add, remove and list action.\n * \n */\n\nexport default class extends Controller {\n\n\tstatic targets = [\n 'additionalInfoMode',\n 'additionalInfoIngredientsListElement',\n 'hiddenAdditionalInfoAuto',\n 'additionalInfoAlert'\n ];\n\n _additionalInfoContainerListElement = null;\n\n\tconnect () {\n\n // Additional info list\n this._additionalInfoContainerListElement = document.getElementById('additional_informations_selector');\n\n this._getIngredientsController((controller) => {\n\n if ( controller.actionValue === 'create') {\n // We're creating a new dish\n // Automatically mode for additional info enabled by default\n this._additionalInfoContainerListElement.classList.add('hidden');\n }\n else {\n // We're editing a dish\n if ( this.additionalInfoModeTarget.value === 'true' ) {\n this._additionalInfoContainerListElement.classList.add('hidden');\n this.additionalInfoIngredientsListElementTarget.classList.remove('hidden');\n }\n else {\n this._additionalInfoContainerListElement.classList.remove('hidden');\n this.additionalInfoIngredientsListElementTarget.classList.add('hidden');\n }\n }\n\n });\n\t}\n\n /*\n * changeMode\n * Changes the way additional info are managed or listed.\n * Could be automatically or manually.\n *\n */\n\n changeMode (event) {\n if ( event.target.checked ) {\n // Automatically\n // Hiding the additional info list\n this._additionalInfoContainerListElement.classList.add('hidden');\n this.additionalInfoIngredientsListElementTarget.classList.remove('hidden');\n\n this._getIngredientsController((controller) => {\n if ( controller.ingredients.length > 0 ) {\n this.additionalInfoAlertTarget.classList.add('hidden');\n }\n else\n this.additionalInfoAlertTarget.classList.remove('hidden');\n\n this.hiddenAdditionalInfoAutoTarget.value = true;\n });\n }\n else {\n // Manually\n // Showing additional info default list and hiding additional info ingredients list\n this._additionalInfoContainerListElement.classList.remove('hidden');\n this.additionalInfoIngredientsListElementTarget.classList.add('hidden');\n this.additionalInfoAlertTarget.classList.add('hidden');\n\n this.hiddenAdditionalInfoAutoTarget.value = false;\n }\n }\n\n\n addAdditionalInfo (additional_info) {\n\n let div = document.createElement('div');\n\n div.setAttribute('class', 'relative rounded-lg border border-gray-300 bg-white px-6 py-3 shadow-sm flex flex-col items-center hover:border-blue-400 focus-within:ring-2 focus-within:ring-offset-2 focus-within:ring-blue-500');\n div.setAttribute('id', 'additional-info-' + additional_info.id);\n\n let html1 = `
`;\n\n let html2 = null;\n\n if ( additional_info.image ) { \n html2 = `\n \"\"\n `\n .replace('__image__', additional_info.image);;\n }\n else {\n html2 = `\n \n \n \n \n \n \n `;\n }\n\n let html3 = `\n
\n
\n

\n __name__\n

\n

\n `.replace('__name__', additional_info.name);\n\n let html4 = null;\n\n if ( additional_info.contain )\n html4 = `

May contain
`;\n else\n html4 = `
Contain
`;\n\n let html5 = `\n

\n
\n \n `;\n\n let html = html1 + html2 + html3 + html4 + html5;\n\n div.innerHTML = html;\n\n this.additionalInfoIngredientsListElementTarget.appendChild(div);\n\n // Hiding no additionalInfo alert\n this.additionalInfoAlertTarget.classList.add('hidden');\n }\n\n\n removeAdditionalInfo (additional_info) {\n document.getElementById('additional-info-' + additional_info.id).remove();\n\n this._getIngredientsController((controller) => {\n if ( controller.ingredients.length === 0 )\n this.additionalInfoAlertTarget.classList.remove('hidden');\n });\n }\n\n\n /*\n * _getIngredientsController\n * Connects and returns the ingredients controller\n * \n */\n\n _getIngredientsController (cb) {\n\n let controller = null;\n\n let stop = setInterval(() => {\n if ( controller ) {\n clearInterval(stop);\n return cb(controller);\n }\n else {\n controller = this.application.controllers.find(controller => {\n let identifier = controller.context.identifier;\n \n if ( identifier === 'ingredients-list')\n return controller;\n else\n return null;\n });\n }\n }, 200);\n }\n\n}","import { Controller } from 'stimulus';\n\n/*\n * Ingredients allergens managing controller\n *\n * Add, remove and list action.\n * \n */\n\nexport default class extends Controller {\n\n\tstatic targets = [\n 'allergensMode',\n 'allergensIngredientsListElement',\n 'hiddenAllergensAuto',\n 'allergensAlert'\n ];\n\n _allergensContainerListElement = null;\n\n\tconnect () {\n\n // Allergens list\n this._allergensContainerListElement = document.getElementById('allergens_selector');\n\n this._getIngredientsController((controller) => {\n\n if ( controller.actionValue === 'create') {\n // We're creating a new dish\n // Automatically mode for allergens enabled by default\n this._allergensContainerListElement.classList.add('hidden');\n }\n else {\n // We're editing a dish\n if ( this.allergensModeTarget.value === 'true' ) {\n this._allergensContainerListElement.classList.add('hidden');\n this.allergensIngredientsListElementTarget.classList.remove('hidden');\n }\n else {\n this._allergensContainerListElement.classList.remove('hidden');\n this.allergensIngredientsListElementTarget.classList.add('hidden');\n }\n }\n\n });\n\t}\n\n /*\n * changeMode\n * Changes the way allergens are managed or listed.\n * Could be automatically or manually.\n *\n */\n\n changeMode (event) {\n if ( event.target.checked ) {\n // Automatically\n // Hiding the allergens list\n this._allergensContainerListElement.classList.add('hidden');\n this.allergensIngredientsListElementTarget.classList.remove('hidden');\n\n this._getIngredientsController((controller) => {\n if ( controller.ingredients.length > 0 )\n this.allergensAlertTarget.classList.add('hidden');\n else\n this.allergensAlertTarget.classList.remove('hidden');\n\n this.hiddenAllergensAutoTarget.value = true;\n });\n }\n else {\n // Manually\n // Showing allergens default list and hiding allergens ingredients list\n this._allergensContainerListElement.classList.remove('hidden');\n this.allergensIngredientsListElementTarget.classList.add('hidden');\n this.allergensAlertTarget.classList.add('hidden');\n\n this.hiddenAllergensAutoTarget.value = false;\n }\n }\n\n\n addAllergen (allergen) {\n\n let div = document.createElement('div');\n\n div.setAttribute('class', 'relative rounded-lg border border-gray-300 bg-white px-6 py-3 shadow-sm flex flex-col items-center hover:border-blue-400 focus-within:ring-2 focus-within:ring-offset-2 focus-within:ring-blue-500');\n div.setAttribute('id', 'allergen-' + allergen.id);\n\n let html1 = `
`;\n\n let html2 = null;\n\n if ( allergen.image ) { \n html2 = `\n \"\"\n `\n .replace('__image__', allergen.image);;\n }\n else {\n html2 = `\n \n \n \n \n \n \n `;\n }\n\n let html3 = `\n
\n
\n

\n __name__\n

\n

\n `.replace('__name__', allergen.name);\n\n let html4 = null;\n\n if ( allergen.contain )\n html4 = `

May contain
`;\n else\n html4 = `
Contain
`;\n\n let html5 = `\n

\n
\n \n `;\n\n let html = html1 + html2 + html3 + html4 + html5;\n\n div.innerHTML = html;\n\n this.allergensIngredientsListElementTarget.appendChild(div);\n\n // Hiding no allergens alert\n this.allergensAlertTarget.classList.add('hidden');\n }\n\n\n removeAllergen (allergen) {\n document.getElementById('allergen-' + allergen.id).remove();\n\n this._getIngredientsController((controller) => {\n if ( controller.ingredients.length === 0 )\n this.allergensAlertTarget.classList.remove('hidden');\n });\n }\n\n\n /*\n * _getIngredientsController\n * Connects and returns the ingredients controller\n * \n */\n\n _getIngredientsController (cb) {\n\n let controller = null;\n\n let stop = setInterval(() => {\n if ( controller ) {\n clearInterval(stop);\n return cb(controller);\n }\n else {\n controller = this.application.controllers.find(controller => {\n let identifier = controller.context.identifier;\n \n if ( identifier === 'ingredients-list')\n return controller;\n else\n return null;\n });\n }\n }, 200);\n }\n\n}","import { Controller } from 'stimulus';\n\n/*\n * Avatar Edition controller\n * Let to create a dropzone zone to\n * upload and preview files.\n *\n */\n\nexport default class extends Controller {\n\n\tstatic targets = [\n\t \t'avatar',\n\t \t'dropzoneMsg',\n\t \t'removeAvatar'\n \t];\n\n\tconnect () {}\n\n\tremoveAvatar () {\n\t\tthis.avatarTarget.remove();\n\t\tthis.dropzoneMsgTarget.classList.remove('border-l-2');\n\t\tthis.removeAvatarTarget.value = true;\n\t}\n\n}","import { Controller } from \"stimulus\"\n\nexport default class extends Controller {\n\n dishes = [];\n\n static targets = [\n 'alert',\n 'table',\n 'body'\n ];\n\n static values = {\n action: String,\n dishesNumber: Number\n };\n\n connect() {\n\n if ( this.actionValue === 'create' ) {\n\n // We're creating a new menu\n // We hide the table until we add the first dish\n this.tableTarget.classList.add('hidden');\n }\n else {\n // We're editing a dish\n if ( this.dishesNumberValue > 0 ) {\n this.alertTarget.classList.add('hidden');\n\n // Creating dishes list at startup\n this._fillDishesList(document.querySelectorAll('tr[id*=\"tr-dish-\"]'));\n }\n else {\n this.tableTarget.classList.add('hidden');\n }\n }\n }\n\n\n /*\n * addDish\n * Adds a new dish to the list.\n * Creates a row in the table.\n * \n */\n\n addDish (event) {\n\n let dish_id = event.target.dataset['id'];\n\n if ( this._checkRepeatedDish(dish_id) ) return;\n\n this.dishes.push({\n id: dish_id,\n image: event.target.dataset['image'],\n url: event.target.dataset['url'],\n name_en: document.getElementById('dish-' + dish_id + '-name-en').innerText\n });\n\n this._createRowForTable(this.dishes[this.dishes.length - 1]);\n\n if ( this.dishes.length > 0 ) {\n this.alertTarget.classList.add('hidden');\n this.tableTarget.classList.remove('hidden');\n }\n\n }\n\n\n /*\n * removeDish\n * Removes an ingredient from the list\n * \n */\n\n removeDish (event) {\n\n let dish_id = event.currentTarget.dataset['id'];\n\n // Removing from dishes array\n const dishIndex = this.dishes.findIndex(dish => dish.id === dish_id);\n\n this.dishes.splice(dishIndex, 1);\n\n // Removing from table\n document.getElementById('tr-dish-' + dish_id).remove();\n\n // Hiding table and showing alert\n if ( this.dishes.length === 0 ) {\n this.tableTarget.classList.add('hidden');\n this.alertTarget.classList.remove('hidden');\n }\n }\n\n\n /*\n * _createRowForTable\n * Creates a new row in the table with the dish info\n * \n */\n\n _createRowForTable (dish) {\n\n let tr = document.createElement('tr');\n let td1 = document.createElement('td');\n let td2 = document.createElement('td');\n\n let input = document.createElement('input');\n \n tr.setAttribute('id', 'tr-dish-' + dish.id);\n \n td1.setAttribute('class', 'px-6 py-4 whitespace-nowrap');\n\n if ( dish.image ) {\n td1.innerHTML = `\n
\n
\n \"${dish.name_en}\"\n
\n
\n \n
\n
\n `;\n }\n else {\n td1.innerHTML = `\n
\n
\n \n \n \n \n \n
\n
\n \n
\n
\n `;\n }\n\n td2.setAttribute('class', 'px-6 py-4 whitespace-nowrap');\n td2.innerHTML = `\n \n `;\n\n input.setAttribute('type', 'hidden');\n input.setAttribute('name', 'menu[dish_ids][]');\n input.setAttribute('value', dish.id);\n input.setAttribute('id', `menu_dish_ids_${dish.id}`);\n\n tr.appendChild(input);\n tr.appendChild(td1);\n tr.appendChild(td2);\n\n this.bodyTarget.appendChild(tr);\n }\n\n\n /*\n * _fillDishesList\n * When editing a menu, we need to load the\n * dishes list in the beginning.\n *\n */\n\n _fillDishesList (dishesTableTows) {\n dishesTableTows.forEach((row) => {\n let dish_id = row.dataset['id'];\n\n this.dishes.push({\n id: dish_id,\n image: row.dataset['image'],\n url: row.dataset['url'],\n name_en: row.dataset['nameEn']\n });\n });\n }\n\n\n /*\n * _checkRepeatedDish\n * Returns if the given dish is already\n * stored in the dishes list\n * \n */\n\n _checkRepeatedDish (dish_id) {\n for (let i = 0, j = this.dishes.length; i < j; i += 1) {\n if ( this.dishes[i].id === dish_id )\n return true\n }\n\n return false;\n }\n}\n","import Dropzone from 'dropzone';\nimport { Controller } from 'stimulus';\nimport { DirectUpload } from '@rails/activestorage';\nimport {\n getMetaValue,\n findElement,\n removeElement,\n insertAfter\n} from 'helpers';\n\n/*\n * Dropzone controller\n * Let to create a dropzone zone to\n * upload and preview files.\n *\n */\n\nexport default class extends Controller {\n\n previewNode = null;\n\n static targets = [\n 'input',\n 'dropzone',\n 'dropzoneMsg',\n 'dropzoneError',\n 'dropzonePreview',\n 'dropzoneProgress'\n ];\n\n connect() {\n\n //\n // Getting the preview template and removing it from\n // DOM to hide it.\n //\n\n this.previewNode = document.querySelector('#previewTemplate');\n //let previewTemplate = previewNode.innerHTML;\n //this.previewNode.parentNode.removeChild(this.previewNode);\n\n this.dropZone = createDropZone(this, this.previewNode.innerHTML);\n\n this.hideFileInput();\n this.bindEvents();\n Dropzone.autoDiscover = false; // necessary quirk for Dropzone error in console\n\n //\n // Hiding error div\n //\n\n this.dropzoneErrorTarget.style.display = 'none';\n\n }\n\n hideFileInput() {\n this.inputTarget.disabled = true;\n this.inputTarget.style.display = 'none';\n }\n\n bindEvents() {\n\n this.dropZone.on('drop', file => {\n\n let intervalCleaner = setInterval(() => {\n\n let file_preview_el = this.element.querySelectorAll('.file_preview')[this.element.querySelectorAll('.file_preview').length - 1];\n let image_preview_el = this.element.querySelectorAll('.image_preview')[this.element.querySelectorAll('.image_preview').length - 1];\n\n if ( file_preview_el && image_preview_el ) {\n if ( this.acceptedFiles.search('image') > -1 ) {\n file_preview_el.parentNode.removeChild(file_preview_el);\n image_preview_el.classList.remove('hidden');\n }\n else {\n image_preview_el.parentNode.removeChild(image_preview_el);\n file_preview_el.classList.remove('hidden');\n }\n\n clearInterval(intervalCleaner);\n }\n }, 100);\n\n //\n // If maxFiles === 1 we replace the\n // already uploaded file if it exists.\n //\n\n if ( this.maxFiles === '1' && this.dropZone.getAcceptedFiles().length > 0 ) {\n this.dropZone.removeFile(this.dropZone.getAcceptedFiles()[0]);\n }\n\n //\n // We also check if there's an\n // avatar to edit. If so, we remove it.\n //\n\n /*\n let avatarToEdit = document.querySelector('.avatar-to-edit')\n\n if ( avatarToEdit ) avatarToEdit.remove();\n */\n\n //\n // Removing previous error messages\n //\n\n // $('.dz-error-custom').hide();\n this.dropzoneErrorTarget.style.display = 'none';\n });\n\n this.dropZone.on('addedfile', file => {\n \n this.dropzoneMsgTarget.style.display = 'none';\n this.dropzoneErrorTarget.style.display = 'none';\n\n setTimeout(() => {\n file.accepted && createDirectUploadController(this, file).start();\n }, 500);\n });\n\n this.dropZone.on('removedfile', file => {\n file.controller && removeElement(file.controller.hiddenInput);\n //$('.dropzone').show();\n this.dropzoneTarget.style.display = 'block';\n\n //$('.dropzone-msg').show();\n this.dropzoneMsgTarget.style.display = 'block';\n });\n\n this.dropZone.on('queuecomplete', progress => {\n setTimeout(() => {\n // $('#previews .progress').addClass('animated fadeOut');\n let preview = this.element.querySelectorAll('.dz-preview');\n \n if ( preview.length > 0 ) {\n preview.forEach((preview) => {\n preview.querySelectorAll('.progress').forEach((progress) => {\n progress.style.display = 'none';\n });\n });\n }\n\n }, 1000);\n });\n\n this.dropZone.on('canceled', file => {\n file.controller && file.controller.xhr.abort();\n });\n\n this.dropZone.on('error', (file, err) => {\n \n document.querySelector('.dz-preview').remove();\n\n this.dropzoneErrorTarget.innerHTML = err;\n this.dropzoneErrorTarget.style.display = 'block';\n //$('.dz-preview').remove();\n //$('.dz-error-custom').html(err);\n //$('.dz-error-custom').show();\n });\n }\n\n get headers() {\n return { 'X-CSRF-Token': getMetaValue('csrf-token') };\n }\n\n get url() {\n return this.inputTarget.getAttribute('data-direct-upload-url');\n }\n\n get maxFiles() {\n return this.data.get('maxFiles') || 1;\n }\n\n get maxFileSize() {\n return this.data.get('maxFileSize') || 256;\n }\n\n get acceptedFiles() {\n return this.data.get('acceptedFiles');\n }\n\n get addRemoveLinks() {\n return this.data.get('addRemoveLinks') || false;\n }\n}\n\nclass DirectUploadController {\n constructor(source, file) {\n this.directUpload = createDirectUpload(file, source.url, this);\n this.source = source;\n this.file = file;\n }\n\n start() {\n this.file.controller = this;\n this.hiddenInput = this.createHiddenInput();\n this.directUpload.create((error, attributes) => {\n if (error) {\n removeElement(this.hiddenInput);\n this.emitDropzoneError(error);\n } else {\n this.hiddenInput.value = attributes.signed_id;\n this.emitDropzoneSuccess();\n }\n });\n }\n\n createHiddenInput() {\n const input = document.createElement('input');\n input.type = 'hidden';\n input.name = this.source.inputTarget.name;\n insertAfter(input, this.source.inputTarget);\n return input;\n }\n\n directUploadWillStoreFileWithXHR(xhr) {\n this.bindProgressEvent(xhr);\n this.emitDropzoneUploading();\n }\n\n bindProgressEvent(xhr) {\n this.xhr = xhr;\n this.xhr.upload.addEventListener('progress', event =>\n this.uploadRequestDidProgress(event)\n );\n }\n\n uploadRequestDidProgress(event) {\n const progress = (event.loaded / event.total) * 100;\n this.source.dropzoneProgressTarget.firstElementChild.style.width = `${progress}%`;\n }\n\n emitDropzoneUploading() {\n this.file.status = Dropzone.UPLOADING;\n this.source.dropZone.emit('processing', this.file);\n }\n\n emitDropzoneError(error) {\n this.file.status = Dropzone.ERROR;\n this.source.dropZone.emit('error', this.file, error);\n this.source.dropZone.emit('complete', this.file);\n }\n\n emitDropzoneSuccess() {\n this.file.status = Dropzone.SUCCESS;\n this.source.dropZone.emit('success', this.file);\n this.source.dropZone.emit('complete', this.file);\n }\n}\n\nfunction createDirectUploadController(source, file) {\n return new DirectUploadController(source, file);\n}\n\nfunction createDirectUpload(file, url, controller) {\n return new DirectUpload(file, url, controller);\n}\n\nfunction createDropZone(controller, previewTemplate) {\n\n return new Dropzone(controller.element, {\n url: controller.url,\n headers: controller.headers,\n maxFiles: controller.maxFiles,\n maxFilesize: controller.maxFileSize,\n acceptedFiles: controller.acceptedFiles,\n addRemoveLinks: Boolean(controller.addRemoveLinks),\n autoQueue: false,\n previewTemplate: previewTemplate\n });\n}","import { Controller } from 'stimulus';\n\n/*\n * File Edition controller\n * Manages the files uploaded in\n * a dropzone space\n *\n */\n\nexport default class extends Controller {\n\n\tstatic targets = [ 'file' ];\n\n\tconnect () {}\n\n\tremoveFile (event) {\n\n let fileId = event.currentTarget.dataset['id'];\n\n\t\tthis.fileTarget.remove();\n\n let fileContainer = document.getElementById('files_container');\n\n let input = document.createElement('input');\n\n input.setAttribute('type', 'hidden');\n input.setAttribute('name', 'ingredient[remove_files][id]'.replace('id', fileId));\n input.setAttribute('value', true);\n input.setAttribute('id', 'ingredient_remove_files_id_' + fileId);\n\n fileContainer.append(input);\n\t}\n\n}","import { Controller } from 'stimulus';\n\n/*\n * Admin Finder Field controller\n * Let users to search entities in dashboard.\n *\n */\n\nexport default class extends Controller {\n\n\tstatic targets = [\n\t\t'form',\n\t\t'input',\n\t\t'submit'\n\t];\n\n\t// To avoid concanated searches \n\tlastSearchValue = null;\n\n\n\tconnect () {\n\n\t\t//\n\t\t// When Turbo request starts\n\t\t//\n\n\t\tthis.formTarget.addEventListener('turbo:submit-start', () => {\n\t\t\tthis.submitTarget.disabled = true;\n\t\t\tthis.submitTarget.innerHTML = `\n\t\t\t\t\n\t \n\t \n\t \n\t\t\t`;\n\t\t});\n\n\n\t\t//\n\t\t// When Turbo request finishes\n\t\t//\n\n\t\tthis.formTarget.addEventListener('turbo:submit-end', () => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.submitTarget.disabled = false;\n\t\t\t\tthis.submitTarget.innerHTML = 'Search';\n\t\t\t}, 500);\n\t\t});\n\t}\n\n\n\t/*\n\t * update\n\t * Send string to backend on user's typing\n\t *\n\t */\n\n\tupdate (event) {\n\t\tif ( this.inputTarget.value.length > 3 || this.inputTarget.value.length === 0 ) {\n\t\t\tsetTimeout(() => {\t\t\t\t\n\t\t\t\tif ( this.lastSearchValue === this.inputTarget.value )\n\t\t\t\t\treturn;\n\t\t\t\telse {\n\t\t\t\t\tthis.lastSearchValue = this.inputTarget.value;\n\t\t\t\t\tthis.submitTarget.click();\n\t\t\t\t}\n\t\t\t}, 700);\n\t\t}\n\t}\n\n\n\t/*\n\t * update\n\t * Send string to backend on user's typing\n\t *\n\t */\n\n\tupdateWithEnter (event) {\n\t\tconsole.log('ENTER');\n\t}\n\n}","import { Controller } from \"stimulus\"\n\nexport default class extends Controller {\n\n connect() {\n let day = document.getElementById('day');\n let dailies = document.getElementsByClassName('daily');\n let toShow = 0;\n if ( day )\n toShow = document.getElementsByClassName(day.value);\n for (let i = 0; i < dailies.length; i++) {\n dailies[i].classList.remove('hidden');\n };\n for (let i = 0; i < toShow.length; i++) {\n toShow[i].classList.remove('hidden');\n };\n }\n\n pickDay(event) {\n let toHide = document.getElementsByClassName('single-menu');\n let dailies = document.getElementsByClassName('daily');\n let toShow = document.getElementsByClassName(event.target.value);\n for (let i = 0; i < toHide.length; i++) {\n toHide[i].classList.add('hidden');\n };\n for (let i = 0; i < dailies.length; i++) {\n dailies[i].classList.remove('hidden');\n };\n for (let i = 0; i < toShow.length; i++) {\n toShow[i].classList.remove('hidden');\n };\n }\n\n}","import { Controller } from 'stimulus';\nimport { Turbo } from \"@hotwired/turbo-rails\";\n\nexport default class extends Controller {\n\n connect () {\n this.setLang();\n }\n\n setLang (event) {\n let lang;\n let tmp = sessionStorage.getItem('lang');\n\n // If this was triggered by selecting a language, set that language\n if ( event )\n lang = event.target.value;\n // Otherwise, if there is a language in sessionStorage, use that\n // Otherwise, use the default language\n else {\n if ( !tmp )\n lang = document.getElementById('language').value;\n else\n lang = tmp;\n }\n\n // Set the language in sessionStorage\n sessionStorage.setItem('lang', lang);\n\n let titles = document.querySelectorAll('.lang-title');\n titles.forEach(title => {\n title.classList.add('hidden', );\n });\n document.getElementById('t'+lang).classList.remove('hidden');\n\n let blocks = document.querySelectorAll('.lang-block');\n blocks.forEach(block => {\n block.classList.add('hidden', 'w-0');\n });\n\n document.getElementById('language').value = lang;\n document.getElementById(lang).classList.remove('hidden', 'w-0');\n }\n\n}","import { Controller } from \"stimulus\"\nimport Rails from '@rails/ujs'\nimport Sortable from \"sortablejs\"\n\nexport default class extends Controller {\n\n frontends = [];\n\n static targets = [\n 'alert',\n 'table',\n 'body'\n ];\n\n static values = {\n action: String,\n frontendsNumber: Number\n };\n\n connect() {\n let container = document.getElementById('sortable');\n this.sortable = Sortable.create(container, {\n onEnd: this.end.bind(this)\n });\n if ( this.actionValue === 'create' ) {\n\n // We're creating a new frontend\n // We hide the table until we add the first frontend\n this.tableTarget.classList.add('hidden');\n }\n else {\n \n // We're editing a frontend\n if ( this.frontendsNumberValue > 0 ) {\n this.alertTarget.classList.add('hidden');\n\n // Creating frontends list at startup\n this._fillFrontendsList(document.querySelectorAll('tr[id*=\"tr-frontend-\"]'));\n }\n else {\n this.tableTarget.classList.add('hidden');\n }\n }\n }\n\n end(event) {\n let id = event.item.dataset.id;\n let url = `/app/frontends/${id}/move`;\n let data = new FormData();\n data.append('position', event.newIndex + 1);\n Rails.ajax({\n url: url,\n type: 'PATCH',\n data: data\n })\n }\n\n\n /*\n * addFrontend\n * Adds a new frontend to the list.\n * Creates a row in the table.\n * \n */\n\n addFrontend (event) {\n\n let frontend_id = event.target.dataset['id'];\n\n if ( this._checkRepeatedFrontend(frontend_id) ) return;\n\n this.frontends.push({\n id: frontend_id,\n url: event.target.dataset['url'],\n name: document.getElementById('frontend-' + frontend_id + '-name').innerText\n });\n\n this._createRowForTable(this.frontends[this.frontends.length - 1]);\n\n if ( this.frontends.length > 0 ) {\n this.alertTarget.classList.add('hidden');\n this.tableTarget.classList.remove('hidden');\n }\n\n }\n\n\n /*\n * removeFrontend\n * Removes a frontend from the list\n * \n */\n\n removeFrontend (event) {\n\n let frontend_id = event.currentTarget.dataset['id'];\n\n // Removing from frontends array\n const frontendIndex = this.frontends.findIndex(frontend => frontend.id === frontend_id);\n\n this.frontends.splice(frontendIndex, 1);\n\n // Removing from table\n document.getElementById('tr-frontend-' + frontend_id).remove();\n\n // Hiding table and showing alert\n if ( this.frontends.length === 0 ) {\n this.tableTarget.classList.add('hidden');\n this.alertTarget.classList.remove('hidden');\n }\n }\n\n\n /*\n * _createRowForTable\n * Creates a new row in the table with the frontend info\n * \n */\n\n _createRowForTable (frontend) {\n\n let tr = document.createElement('tr');\n let td1 = document.createElement('td');\n let td2 = document.createElement('td');\n let td3 = document.createElement('td');\n\n let input = document.createElement('input');\n \n tr.setAttribute('id', 'tr-frontend-' + frontend.id);\n\n td1.setAttribute('class', 'px-6 py-4');\n td1.innerHTML = `\n
\n \n \n \n
`;\n \n td2.setAttribute('class', 'px-6 py-4 whitespace-nowrap');\n\n td2.innerHTML = `\n
\n
\n \n \n ${frontend.name} \n \n \n
\n
\n `;\n\n td3.setAttribute('class', 'px-6 py-4 whitespace-nowrap flex justify-end');\n td3.innerHTML = `\n \n `;\n\n input.setAttribute('type', 'hidden');\n input.setAttribute('name', 'frontend[frontend_ids][]');\n input.setAttribute('value', frontend.id);\n input.setAttribute('id', `frontend_frontend_ids_${frontend.id}`);\n\n tr.appendChild(input);\n tr.appendChild(td1);\n tr.appendChild(td2);\n tr.appendChild(td3);\n\n this.bodyTarget.appendChild(tr);\n }\n\n\n /*\n * _fillFrontendsList\n * When editing a frontend, we need to load the\n * frontends list in the beginning.\n *\n */\n\n _fillFrontendsList (frontendsTableTows) {\n frontendsTableTows.forEach((row) => {\n let frontend_id = row.dataset['id'];\n\n this.frontends.push({\n id: frontend_id,\n url: row.dataset['url'],\n name: row.dataset['name']\n });\n });\n }\n\n\n /*\n * _checkRepeatedFrontend\n * Returns if the given frontend is already\n * stored in the frontends list\n * \n */\n\n _checkRepeatedFrontend (frontend_id) {\n for (let i = 0, j = this.frontends.length; i < j; i += 1) {\n if ( this.frontends[i].id === frontend_id )\n return true\n }\n\n return false;\n }\n}\n","import { Controller } from \"stimulus\"\n\nexport default class extends Controller {\n connect() {\n this.element.textContent = \"Hello World!\"\n }\n}\n","import { Controller } from \"stimulus\"\n\nexport default class extends Controller {\n\n static targets = [ \"slider\" ]\n\n connect() {\n\n }\n\n selectFunction(event) {\n let e = event.target \n let selected = document.getElementsByClassName(\"mobile_selected\")[0]\n let newSelected = document.getElementById(e.dataset.id)\n let actualId = selected.id\n let newId = newSelected.id\n let actualPhone = document.getElementById(\"movil\" + actualId.substring(actualId.length-1))\n let newPhone = document.getElementById(\"movil\" + newId.substring(newId.length-1))\n\n selected.classList.remove('mobile_selected', 'border-l-2', 'border-r-2')\n selected.classList.add('mobile_no_selected')\n newSelected.classList.remove('mobile_no_selected')\n newSelected.classList.add('mobile_selected')\n if(newSelected.id == \"function-1\" || newSelected.id == \"function-3\" ){\n newSelected.classList.add('border-r-2')\n } else {\n newSelected.classList.add('border-l-2')\n }\n actualPhone.classList.add('hidden')\n newPhone.classList.remove('hidden')\n\n }\n\n}\n","import { Controller } from \"stimulus\"\n\nexport default class extends Controller {\n\n connect() {\n\n const query = window.location.search;\n const urlParams = new URLSearchParams(query)\n let section = (urlParams.get(\"section\"))\n let element = document.getElementById(section)\n \n if (element && !element.classList.contains(\"information_no_selected\")){\n element = document.getElementById(section + \"m\")\n }\n\n if(element != null) {\n element.click()\n window.scrollTo(0, document.getElementById(\"information_section\").offsetTop);\n if (!element.classList.contains(\"information_selected\")) {\n window.scrollTo(0, element.offsetTop);\n } \n }\n\n }\n\n showInfo(event) {\n let e = event.target \n let selected = document.getElementsByClassName(\"information_selected\")[0]\n let newSelected = document.getElementById(e.id)\n let actualId = selected.dataset.id\n let newId = newSelected.id\n let actualInfo = document.getElementById(\"information-\" + actualId.substring(actualId.length-1))\n let newInfo = document.getElementById(\"information-\" + newId.substring(newId.length-1))\n\n selected.classList.remove('information_selected')\n selected.classList.add('information_no_selected')\n newSelected.classList.remove('information_no_selected')\n newSelected.classList.add('information_selected')\n actualInfo.classList.add('hidden')\n newInfo.classList.remove('hidden')\n \n }\n\n mobileinfo(event){\n let e = event.target\n let information = document.getElementById(e.dataset.id)\n let icons = document.getElementsByClassName(e.dataset.id)\n let previousInfo = document.getElementsByClassName(\"information_mobile_selected\")[0]\n let previousIcons;\n\n //Change texts and information\n if(e == previousInfo){\n previousInfo.classList.remove(\"information_mobile_selected\")\n previousInfo.classList.add(\"information_mobile_no_selected\")\n information.classList.add(\"hidden\")\n } else if(previousInfo == undefined) {\n e.classList.remove(\"information_mobile_no_selected\")\n e.classList.add(\"information_mobile_selected\")\n information.classList.remove(\"hidden\")\n } else {\n previousInfo.classList.remove(\"information_mobile_selected\")\n previousInfo.classList.add(\"information_mobile_no_selected\")\n e.classList.remove(\"information_mobile_no_selected\")\n e.classList.add(\"information_mobile_selected\")\n information.classList.remove(\"hidden\")\n previousIcons = document.getElementsByClassName(previousInfo.dataset.id)\n document.getElementById(previousInfo.dataset.id).classList.add(\"hidden\")\n }\n\n //Change icon >\n for(var i = 0; i 0 ) {\n this.alertTarget.classList.add('hidden');\n\n // Creating ingredients list at startup\n this._fillIngredientsList(document.querySelectorAll('tr[id*=\"tr-ingredient-\"]'));\n }\n else {\n this.tableTarget.classList.add('hidden');\n this.valuesNutritionalTarget.classList.add('hidden');\n }\n }\n\n }\n\n\n /*\n * addIngredient\n * Adds a new ingredient to the list.\n * Creates a row in the table.\n * Creates events for gross amount and waste inputs.\n * Updates nutritional values.\n * \n */\n\n addIngredient (event) {\n\n let ingredient_id = event.target.dataset['id'];\n\n if ( this._checkRepeatedIngredient(ingredient_id) ) return;\n\n this.ingredients.push({\n id: ingredient_id,\n name_en: document.getElementById('ingredient-' + ingredient_id + '-name_en').innerText,\n unit: event.target.dataset['unit'],\n energy: event.target.dataset['energy'],\n proteins: event.target.dataset['proteins'],\n carbohydrates: event.target.dataset['carbohydrates'],\n sugars: event.target.dataset['sugars'],\n fats: event.target.dataset['fats'],\n saturated_fats: event.target.dataset['saturatedFats'],\n salt: event.target.dataset['salt'],\n cost: event.target.dataset['cost'],\n ref_unit: event.target.dataset['refUnit'],\n ref_amount: event.target.dataset['refAmount'],\n url: event.target.dataset['url'],\n allergens: this._processAllergens(event.target.dataset['allergens']),\n additional_informations: this._processAdditionalInfo(event.target.dataset['additionalInfo'])\n });\n\n this._createRowForTable(this.ingredients[this.ingredients.length - 1]);\n\n // Updating the nutritional values\n this._updateNutritionalValues();\n\n if ( this.ingredients.length > 0 ) {\n this.alertTarget.classList.add('hidden');\n this.tableTarget.classList.remove('hidden');\n this.valuesNutritionalTarget.classList.remove('hidden');\n }\n }\n\n\n /*\n * removeIngredient\n * Removes an ingredient from the list\n * \n */\n\n removeIngredient (event) {\n \n let ingredient_id = event.currentTarget.dataset['id'];\n\n // Deleting the item from ingredients array\n for (let i = 0, j = this.ingredients.length; i < j; i += 1) {\n if ( this.ingredients[i].id === ingredient_id ) {\n\n // In case of dish editing, we add a _destroy hidden field\n if ( this.actionValue === 'edit' ) {\n let input = document.createElement('input');\n\n input.setAttribute('type', 'hidden');\n input.setAttribute('id', 'dish_ingredients_lists_attributes_id_row__destroy'.replace('id_row', ingredient_id))\n input.setAttribute('name', 'dish[ingredients_lists_attributes][id_row][_destroy]'.replace('id_row', ingredient_id));\n input.setAttribute('value', true);\n\n this.bodyTarget.appendChild(input);\n }\n\n let allergens = this.ingredients[i].allergens;\n let additional_informations = this.ingredients[i].additional_informations;\n\n // Removing ingredient from list\n this.ingredients.splice(i, 1);\n \n // Updating allergens list\n this._removeAllergens(allergens);\n\n // Updating additional info list\n this._removeAdditionalInfos(additional_informations);\n\n break;\n }\n }\n\n // Deleting row in table\n document.getElementById('tr-ingredient-' + ingredient_id).remove();\n\n // Hiding table and showing alert\n if ( this.ingredients.length === 0 ) {\n this.tableTarget.classList.add('hidden');\n this.valuesNutritionalTarget.classList.add('hidden');\n this.alertTarget.classList.remove('hidden');\n }\n\n // Updating the nutritional values\n this._updateNutritionalValues();\n }\n\n\tshowIngredients (event) {\n let input = document.getElementById('show-ingredients');\n input.toggleAttribute('checked');\n }\n\n\tshowNutritional (event) {\n let input = document.getElementById('show-nutritional');\n input.toggleAttribute('checked');\n }\n\n\n /*\n * _checkRepeatedIngredient\n * Returns if the given ingredient is already\n * stored in the ingredients list\n * \n */\n\n _checkRepeatedIngredient (ingredient_id) {\n for (let i = 0, j = this.ingredients.length; i < j; i += 1) {\n if ( this.ingredients[i].id === ingredient_id )\n return true\n }\n\n return false;\n }\n\n\n /*\n * _createRowForTable\n * Creates a new row in the table with the ingredient info\n * \n */\n\n _createRowForTable (ingredient) {\n\n let mSec = new Date().getTime();\n\n let tr = document.createElement('tr');\n let td1 = document.createElement('td');\n let td2 = document.createElement('td');\n let td3 = document.createElement('td');\n let td4 = document.createElement('td');\n let td5 = document.createElement('td');\n let td6 = document.createElement('td');\n let input = document.createElement('input');\n let input2 = document.createElement('input');\n\n tr.setAttribute('id', 'tr-ingredient-' + ingredient.id);\n\n td1.setAttribute('class', 'px-6 py-4 whitespace-nowrap');\n \n td2.setAttribute('class', 'px-6 py-4 whitespace-nowrap');\n td2.setAttribute('id', 'gross_amount_' + mSec);\n\n td3.setAttribute('class', 'px-6 py-4 whitespace-nowrap');\n \n td4.setAttribute('class', 'px-6 py-4 whitespace-nowrap text-gray-500');\n td4.setAttribute('id', 'net_amount_' + mSec);\n\n td5.setAttribute('class', 'px-6 py-4 whitespace-nowrap text-gray-500');\n td5.setAttribute('id', 'cost_' + mSec);\n\n td6.setAttribute('class', 'px-6 py-4 whitespace-nowrap text-right');\n\n td1.innerHTML = `\n \n \n ${ingredient.name_en}\n \n \n `;\n\n td2.innerHTML = `\n
\n
\n
\n
\n \n \n \n \n ${ingredient.unit}\n \n
\n
\n Create note\n
\n
\n
\n
\n \n
\n
\n \n `.replaceAll('id_row', mSec);\n\n td3.innerHTML = `\n
\n \n \n %\n \n
\n `.replaceAll('id_row', mSec);\n\n td4.innerHTML = 0.0;\n td5.innerHTML = 0.0;\n td6.innerHTML = `\n \n `;\n\n input.setAttribute('type', 'hidden');\n input.setAttribute('name', 'dish[ingredients_lists_attributes][id_row][ingredient_id]'.replace('id_row', mSec));\n input.setAttribute('value', ingredient.id);\n\n input2.setAttribute('type', 'hidden');\n input2.setAttribute('name', 'dish[ingredients_lists_attributes][id_row][cost]'.replace('id_row', mSec));\n input2.setAttribute('id', 'dish_ingredients_lists_attributes_id_row_cost'.replace('id_row', mSec));\n input2.setAttribute('value', 0.0);\n\n tr.appendChild(td1);\n tr.appendChild(td2);\n tr.appendChild(td3);\n tr.appendChild(td4);\n tr.appendChild(td5);\n tr.appendChild(td6);\n\n tr.appendChild(input);\n tr.appendChild(input2);\n\n this.bodyTarget.appendChild(tr);\n\n // Creating events for updating automatically the net amount field\n this._createEventsForRow(mSec, ingredient.cost, ingredient.ref_unit, ingredient.ref_amount, ingredient.unit);\n }\n\n\n /*\n * _createEventsForRow\n * Creates events for the gross amount and waste inputs\n * in order to calculate automatically the net amount\n * \n */\n\n _createEventsForRow (msec_id, cost, ref_unit, ref_amount, unit) {\n let wasteInput = document.getElementById('dish_ingredients_lists_attributes_id_row_waste'.replace('id_row', msec_id))\n let grossAmountInput = document.getElementById('dish_ingredients_lists_attributes_id_row_gross_amount'.replace('id_row', msec_id))\n let netAmountTd = document.getElementById('net_amount_' + msec_id);\n let costTd = document.getElementById('cost_' + msec_id);\n\n grossAmountInput.addEventListener('input', (e) => {\n\n // Updating net amount column\n netAmountTd.innerText = parseFloat(grossAmountInput.value * (1 - (wasteInput.value/100))) + ` ${unit}`;\n\n // Units conversion\n let _cost = 0.0;\n\n if ( ref_unit && ref_amount ) {\n const math = create(all, {});\n const ref_value = math.unit(ref_amount, ref_unit);\n\n _cost = parseFloat((grossAmountInput.value * cost) / ref_value.toNumber(unit));\n }\n else\n _cost = parseFloat(grossAmountInput.value * cost);\n\n // Updating cost column\n let hiddenInput = document.getElementById(('dish_ingredients_lists_attributes_id_row_cost').replace('id_row', msec_id));\n \n hiddenInput.value = _cost;\n costTd.innerText = _cost + ' €';\n\n // Updating estimated cost\n this._updateEstimatedCost();\n });\n\n wasteInput.addEventListener('input', (e) => {\n // Updating net amount column\n netAmountTd.innerText = parseFloat(grossAmountInput.value * (1 - (wasteInput.value/100))) + ` ${unit}`;\n });\n }\n\n\n /*\n * _updateEstimatedCost\n * Sum all the ingredients cost columns and update estimated cost\n * \n */\n\n _updateEstimatedCost () {\n let costTds = document.querySelectorAll('td[id*=\"cost_\"]');\n\n this.estimatedCostTarget.innerText = 0.0;\n\n costTds.forEach((td) => {\n let currentCost = parseFloat(td.innerText.replace('€', ''));\n this.estimatedCostTarget.innerText = (parseFloat(this.estimatedCostTarget.innerText.replace('€', '')) + currentCost) + ' €';\n });\n }\n\n\n /*\n * _updateNutritionalValues\n * Updates the nutritional values in the table according\n * to all the ingredients added in the list\n * \n */\n\n _updateNutritionalValues () {\n\n let energy = 0.0;\n let proteins = 0.0;\n let carbo = 0.0;\n let sugars = 0.0;\n let fats = 0.0;\n let saturated_fats = 0.0;\n let salt = 0.0;\n\n this.ingredients.forEach((ingredient) => {\n energy += parseFloat(ingredient.energy);\n proteins += parseFloat(ingredient.proteins);\n carbo += parseFloat(ingredient.carbohydrates);\n sugars += parseFloat(ingredient.sugars);\n fats += parseFloat(ingredient.fats);\n saturated_fats += parseFloat(ingredient.saturated_fats);\n salt += parseFloat(ingredient.salt);\n });\n\n this.energyTdTarget.innerText = energy + ' kcal';\n this.proteinsTdTarget.innerText = proteins + ' g';\n this.carboTdTarget.innerText = carbo + ' g';\n this.sugarsTdTarget.innerText = sugars + ' g';\n this.fatsTdTarget.innerText = fats + ' g';\n this.saturatedFatsTdTarget.innerText = saturated_fats + ' g';\n this.saltTdTarget.innerText = salt + ' g';\n }\n\n\n /*\n * _processAllergens\n * Creates the allergens list without duplicated ones\n * \n */\n\n _processAllergens (allergens_string) {\n\n let allergens = JSON.parse(allergens_string).map((allergen) => {\n return JSON.parse(allergen);\n });\n\n // Updating general allergens list.\n // We avoid duplicated allergens.\n //\n // 'Found' value represents the this.allergens index\n // when an specific ingredient is found.\n let found = -1;\n\n for ( let x = 0, y = allergens.length; x < y; x += 1 ) {\n for ( let i = 0, j = this.allergens.length; i < j; i += 1) {\n if ( this.allergens[i].id === allergens[x].id ) {\n found = i;\n break;\n }\n }\n\n if ( found === -1 ) {\n\n // We use 'count' to count the number of ingredients\n // that belongs to this allergen.\n allergens[x].count = 1;\n\n this.allergens.push(allergens[x]);\n\n // Adding allergen to the allergens list as well\n this._getController('allergens-list', (controller) => {\n controller.addAllergen(allergens[x]);\n });\n }\n else {\n \n // Allergen already listed, we increase the\n // ingredients counter in the allergen.\n this.allergens[found].count += 1;\n\n found = -1;\n }\n }\n\n return allergens;\n }\n\n\n /*\n * _processAllergens\n * Creates the allergens list without duplicated ones\n * \n */\n\n _processAdditionalInfo (additional_info_string) {\n \n let additional_informations = JSON.parse(additional_info_string).map((additional_info) => {\n return JSON.parse(additional_info);\n });\n\n // Updating general additional infos list.\n // We avoid duplicated additional infos.\n //\n // 'Found' value represents the this.additional_infos index\n // when an specific ingredient is found.\n let found = -1;\n\n for ( let x = 0, y = additional_informations.length; x < y; x += 1 ) {\n for ( let i = 0, j = this.additional_informations.length; i < j; i += 1) {\n if ( this.additional_informations[i].id === additional_informations[x].id ) {\n found = i;\n break;\n }\n }\n\n if ( found === -1 ) {\n\n // We use 'count' to count the number of ingredients\n // that belongs to this allergen.\n additional_informations[x].count = 1;\n\n this.additional_informations.push(additional_informations[x]);\n\n // Adding additional info to the additional info list as well\n this._getController('additional-info-list', (controller) => {\n controller.addAdditionalInfo(additional_informations[x]);\n });\n }\n else {\n \n // Allergen already listed, we increase the\n // ingredients counter in the allergen.\n this.additional_informations[found].count += 1;\n\n found = -1;\n }\n }\n\n return additional_informations;\n }\n\n\n /*\n * _removeAllergens\n * After removing an ingredient, we gotta update\n * the allergens list.\n * \n */\n\n _removeAllergens (allergens) {\n\n // Looping in the ingredient allergens marked for removing\n allergens.forEach((allergen) => {\n \n // Removing the allergen from the list\n for ( let i = 0, j = this.allergens.length; i < j; i += 1 ) {\n if ( this.allergens[i].id.toString() === allergen.id.toString() ) {\n\n this.allergens[i].count -= 1;\n \n // If allergen count is 0, we remove the allergen\n // because there're not more ingredients with\n // this allergen.\n\n if ( this.allergens[i].count === 0 ) {\n // Removing the allergen from the screen\n this._getController('allergens-list', (controller) => {\n controller.removeAllergen(allergen);\n\n if ( this.allergens.length > 1 )\n this.allergens.splice(i, 1);\n else\n this.allergens = [];\n });\n }\n \n break;\n }\n }\n\n });\n\n }\n\n\n /*\n * _removeAdditionalInfos\n * After removing an ingredient, we gotta update\n * the additional infos list.\n * \n */\n\n _removeAdditionalInfos (additional_informations) {\n\n // Looping in the ingredient additional infos marked for removing\n additional_informations.forEach((additional_info) => {\n \n // Removing the allergen from the list\n for ( let i = 0, j = this.additional_informations.length; i < j; i += 1 ) {\n if ( this.additional_informations[i].id.toString() === additional_info.id.toString() ) {\n\n this.additional_informations[i].count -= 1;\n \n // If additional info count is 0, we remove the additional info\n // because there're not more ingredients with\n // this allergen.\n\n if ( this.additional_informations[i].count === 0 ) {\n // Removing the allergen from the screen\n this._getController('additional-info-list', (controller) => {\n controller.removeAdditionalInfo(additional_info);\n\n if ( this.additional_informations.length > 1 )\n this.additional_informations.splice(i, 1);\n else\n this.additional_informations = [];\n });\n }\n \n break;\n }\n }\n\n });\n\n }\n\n\n /*\n * _getController\n * Connects and returns the given controller\n * \n */\n\n _getController (controller_name, cb) {\n\n let controller = null;\n\n let stop = setInterval(() => {\n if ( controller ) {\n clearInterval(stop);\n return cb(controller);\n }\n else {\n controller = this.application.controllers.find(controller => {\n let identifier = controller.context.identifier;\n \n if ( identifier === controller_name)\n return controller;\n else\n return null;\n });\n }\n }, 200);\n }\n\n\n /*\n * _fillIngredientsList\n * When editing a dish, we need to load the\n * ingredients list in the beginning.\n *\n */\n\n _fillIngredientsList (ingredients_table_rows) {\n ingredients_table_rows.forEach((row) => {\n\n let ingredient_id = row.dataset['id'];\n\n this.ingredients.push({\n id: ingredient_id,\n name_en: document.getElementById('ingredient-list-' + ingredient_id + '-name_en').innerText,\n unit: row.dataset['unit'],\n energy: row.dataset['energy'],\n proteins: row.dataset['proteins'],\n carbohydrates: row.dataset['carbohydrates'],\n sugars: row.dataset['sugars'],\n fats: row.dataset['fats'],\n saturated_fats: row.dataset['saturatedFats'],\n salt: row.dataset['salt'],\n cost: row.dataset['cost'],\n ref_unit: row.dataset['refUnit'],\n ref_amount: row.dataset['refAmount'],\n url: row.dataset['url'],\n allergens: this._processAllergens(row.dataset['allergens']),\n additional_informations: this._processAdditionalInfo(row.dataset['additionalInfo'])\n });\n\n let lastIngredient = this.ingredients[this.ingredients.length - 1];\n\n this._createEventsForRow(ingredient_id, lastIngredient.cost, lastIngredient.ref_unit, lastIngredient.ref_amount, lastIngredient.unit);\n });\n\n this._updateNutritionalValues();\n this._updateEstimatedCost();\n }\n\n}\n","import { Controller } from 'stimulus';\nimport * as Turbo from \"@hotwired/turbo\"\n\n/*\n * AJAX finder for ingredients in dish creation\n *\n */\n\nexport default class extends Controller {\n\n\tstatic targets = [ 'input', 'button', 'check' ];\n\n\tstatic values = {\n\t\turl: String\n\t};\n\n\t// dishes/ingredients\n\n\t// To avoid concanated searches \n\tlastSearchValue = null;\n url = '/app/:uri?q[name_es_or_name_en_or_name_fr_or_name_de_cont]=query';\n\n\tconnect () {\n\n\t\tthis.url = this.url.replace(':uri', this.urlValue);\n\n\t\t//\n\t\t// When Turbo request starts\n\t\t//\n\n\t\tdocument.addEventListener('turbo:before-visit', (event) => {\n\t\t\tthis.buttonTarget.disabled = true;\n\t\t\tthis.buttonTarget.innerHTML = `\n\t\t\t\t\n\t \n\t \n\t \n\t\t\t`;\n\t\t});\n\n\n\t\t//\n\t\t// When Turbo request finishes\n\t\t//\n\n\t\tdocument.addEventListener('turbo:visit', () => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.buttonTarget.disabled = false;\n\t\t\t\tthis.buttonTarget.innerHTML = 'Search';\n\t\t\t}, 500);\n\t\t});\n\n\t}\n\n\n\t/*\n\t * update\n\t * Send string to backend on user's typing\n\t *\n\t */\n\n\tupdate (event) {\n\t\tif ( this.inputTarget.value.length > 3 || this.inputTarget.value.length === 0 ) {\n\t\t\tsetTimeout(() => {\t\t\t\t\n\t\t\t\tif ( this.lastSearchValue === this.inputTarget.value )\n\t\t\t\t\treturn;\n\t\t\t\telse {\n\t\t\t\t\tthis.lastSearchValue = this.inputTarget.value;\n\n Turbo.visit(this.url.replace('query', this.inputTarget.value), { action: 'replace' })\n\t\t\t\t}\n\t\t\t}, 700);\n\t\t}\n\t}\n\n search (event) {\n Turbo.visit(this.url.replace('query', this.inputTarget.value), { action: 'replace' });\n }\n\n searchWithEnter (event) {\n\t\tif ( event.keyCode === 13 ) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tthis.search();\n\t\t}\n }\n\n\t// Restrict the search to the users ingredients\n\t// Only used for dishes\n checkMyIngredients (event) {\n if ( event.target.checked )\n this.url = this.url + '&show=my-ingredients';\n else\n this.url = this.url.replace('&show=my-ingredients', '');\n\n this.search();\n }\n\n}","import { Controller } from \"stimulus\"\n\nexport default class extends Controller {\n\n checkboxes = null;\n \n connect() {\n\n this.checkboxes = document.querySelectorAll('input[id*=\"menu_menu_days_attributes_\"]');\n\n //\n // Every time the daily checkbox changes its state\n // we check the states of the rest of checkboxes.\n //\n // If daily checkbox is enabled, the rest is disabled.\n //\n\n this.checkboxes.forEach((checkbox) => {\n checkbox.addEventListener('change', this._changeCheckboxesState.bind(this));\n });\n }\n\n _changeCheckboxesState (event) {\n\n let hiddenDestroyInput = document.getElementById(event.target.id.replace(/day$/, '_destroy'));\n\n if ( event.target.checked ) {\n if ( event.target.id === 'menu_menu_days_attributes_0_day') {\n\n //\n // If we check 'daily', we disable the rest\n //\n\n this.checkboxes.forEach((checkbox) => {\n if ( checkbox.id !== 'menu_menu_days_attributes_0_day')\n checkbox.disabled = true;\n else\n checkbox.disabled = false;\n });\n }\n else {\n\n //\n // If we check a checkbox different from 'daily', we\n // disable 'daily'\n //\n\n this.checkboxes.forEach((checkbox) => {\n if ( checkbox.id === 'menu_menu_days_attributes_0_day') {\n checkbox.checked = false;\n checkbox.disabled = true;\n }\n else\n checkbox.disabled = false;\n });\n }\n\n // Changing _destroy field value\n if ( hiddenDestroyInput ) hiddenDestroyInput.value = 0;\n }\n else {\n if ( event.target.id === 'menu_menu_days_attributes_0_day' ) {\n\n //\n // if we uncheck 'daily', we enable the rest\n //\n\n this.checkboxes.forEach((checkbox) => {\n checkbox.disabled = false;\n });\n }\n else {\n\n //\n // If we uncheck a not 'daily' checkbox, we check if\n // there're more checkboxes enabled. If not, we enable\n // 'daily'.\n //\n\n for ( let i = 0, j = this.checkboxes.length; i < j; i += 1 ) {\n if ( this.checkboxes[i].id !== 'menu_menu_days_attributes_0_day' && this.checkboxes[i].checked )\n break;\n else {\n if ( i === (this.checkboxes.length - 1)) {\n // We reenable 'daily' as there're not more checkboxes enabled\n document.getElementById('menu_menu_days_attributes_0_day').disabled = false;\n }\n }\n\n }\n }\n\n // Changing _destroy field value\n if ( hiddenDestroyInput ) hiddenDestroyInput.value = 1;\n }\n }\n\n}\n","import { Controller } from \"stimulus\"\nimport Rails from '@rails/ujs'\nimport Sortable from \"sortablejs\"\n\nexport default class extends Controller {\n\n menus = [];\n\n static targets = [\n 'alert',\n 'table',\n 'body'\n ];\n\n static values = {\n action: String,\n menusNumber: Number\n };\n\n connect() {\n let container = document.getElementById('sortable');\n this.sortable = Sortable.create(container, {\n onEnd: this.end.bind(this)\n });\n if ( this.actionValue === 'create' ) {\n\n // We're creating a new menu\n // We hide the table until we add the first menu\n this.tableTarget.classList.add('hidden');\n }\n else {\n \n // We're editing a menu\n if ( this.menusNumberValue > 0 ) {\n this.alertTarget.classList.add('hidden');\n\n // Creating menus list at startup\n this._fillMenusList(document.querySelectorAll('tr[id*=\"tr-menu-\"]'));\n }\n else {\n this.tableTarget.classList.add('hidden');\n }\n }\n }\n\n end(event) {\n let id = event.item.dataset.id;\n let url = `/app/menus/${id}/move`;\n let data = new FormData();\n data.append('position', event.newIndex + 1);\n Rails.ajax({\n url: url,\n type: 'PATCH',\n data: data\n })\n }\n\n\n /*\n * addMenu\n * Adds a new menu to the list.\n * Creates a row in the table.\n * \n */\n\n addMenu (event) {\n\n let menu_id = event.target.dataset['id'];\n\n if ( this._checkRepeatedMenu(menu_id) ) return;\n\n this.menus.push({\n id: menu_id,\n url: event.target.dataset['url'],\n name: document.getElementById('menu-' + menu_id + '-name').innerText\n });\n\n this._createRowForTable(this.menus[this.menus.length - 1]);\n\n if ( this.menus.length > 0 ) {\n this.alertTarget.classList.add('hidden');\n this.tableTarget.classList.remove('hidden');\n }\n\n }\n\n\n /*\n * removeMenu\n * Removes an ingredient from the list\n * \n */\n\n removeMenu (event) {\n\n let menu_id = event.currentTarget.dataset['id'];\n\n // Removing from menus array\n const menuIndex = this.menus.findIndex(menu => menu.id === menu_id);\n\n this.menus.splice(menuIndex, 1);\n\n // Removing from table\n document.getElementById('tr-menu-' + menu_id).remove();\n\n // Hiding table and showing alert\n if ( this.menus.length === 0 ) {\n this.tableTarget.classList.add('hidden');\n this.alertTarget.classList.remove('hidden');\n }\n }\n\n\n /*\n * _createRowForTable\n * Creates a new row in the table with the menu info\n * \n */\n\n _createRowForTable (menu) {\n\n let tr = document.createElement('tr');\n let td1 = document.createElement('td');\n let td2 = document.createElement('td');\n let td3 = document.createElement('td');\n\n let input = document.createElement('input');\n \n tr.setAttribute('id', 'tr-menu-' + menu.id);\n\n td1.setAttribute('class', 'px-6 py-4');\n td1.innerHTML = `\n
\n \n \n \n
`;\n \n td2.setAttribute('class', 'px-6 py-4 whitespace-nowrap');\n\n let title = menu.subtitle? menu.subtitle : menu.name\n td2.innerHTML = `\n
\n
\n \n \n ${title}\n \n \n
\n
\n `;\n\n td3.setAttribute('class', 'px-6 py-4 whitespace-nowrap flex justify-end');\n td3.innerHTML = `\n \n `;\n\n input.setAttribute('type', 'hidden');\n input.setAttribute('name', 'menu[menu_ids][]');\n input.setAttribute('value', menu.id);\n input.setAttribute('id', `menu_menu_ids_${menu.id}`);\n\n tr.appendChild(input);\n tr.appendChild(td1);\n tr.appendChild(td2);\n tr.appendChild(td3);\n\n this.bodyTarget.appendChild(tr);\n }\n\n\n /*\n * _fillMenusList\n * When editing a menu, we need to load the\n * menus list in the beginning.\n *\n */\n\n _fillMenusList (menusTableTows) {\n menusTableTows.forEach((row) => {\n let menu_id = row.dataset['id'];\n\n this.menus.push({\n id: menu_id,\n url: row.dataset['url'],\n name: row.dataset['name']\n });\n });\n }\n\n\n /*\n * _checkRepeatedMenu\n * Returns if the given menu is already\n * stored in the menus list\n * \n */\n\n _checkRepeatedMenu (menu_id) {\n for (let i = 0, j = this.menus.length; i < j; i += 1) {\n if ( this.menus[i].id === menu_id )\n return true\n }\n\n return false;\n }\n}\n","import { Controller } from 'stimulus';\n\n/*\n * Modals state managing\n *\n */\n\nexport default class extends Controller {\n\n\tstatic targets = [];\n\n // For modals with form and submit\n form = null;\n submit = null;\n\n\tconnect () {\n\n this.content = this.element.querySelector('[id*=\"_modal\"]');\n \n if ( this.content ) {\n\n // Checking if there's a form\n this.form = this.content.querySelector('form');\n\n if ( this.form )\n this.submit = this.element.querySelector('input[type=\"submit\"]');\n }\n\n if ( this.form ) {\n this.form.addEventListener('turbo:submit-end', (event) => {\n if ( event.detail.formSubmission.result.success ) {\n this.close();\n this.restoreForm();\n }\n });\n }\n }\n\n // Open modal\n open (event) {\n\n let modalContent = document.getElementById(event.currentTarget.dataset.modal + '_modal');\n\n modalContent\n .closest('#modal')\n .classList\n .remove('hidden');\n\n // If there's a data-id attribute in click handler we pass the id\n // to the modal\n if ( event.currentTarget.dataset['modalId'] )\n modalContent.setAttribute('data-parent-id', event.currentTarget.dataset['modalId']);\n }\n\n // Close modal\n close () { this.element.classList.add('hidden'); }\n\n // Restore form after a successful response\n restoreForm () {\n this.form.reset();\n\n if ( this.submit ) {\n this.submit.disabled = false;\n this.submit.value = 'Create'\n }\n }\n}","import { Controller } from 'stimulus';\n\n/*\n * Modals state managing\n *\n */\n\nexport default class extends Controller {\n\n\tstatic targets = [];\n\n\tconnect () {}\n\n // Open modal\n open (event) {\n\n let modalContent = document.getElementById(event.currentTarget.dataset.modal + '_modal');\n\n modalContent\n .closest('#modal')\n .classList\n .remove('hidden');\n\n // If there's a data-id attribute in click handler we pass the id\n // to the modal\n let parent_id = null;\n\n if ( event.currentTarget.dataset['modalId'] ) {\n parent_id = event.currentTarget.dataset['modalId'];\n \n let saveButton = document.getElementById('grossAmountNotesSaveButton');\n saveButton.setAttribute('data-parent-id', parent_id);\n \n modalContent.setAttribute('data-parent-id', parent_id);\n }\n\n // Modifying inputs with the parent id\n let grossAmountNoteHiddenInput = document.getElementById('dish_ingredients_lists_attributes_id_row_gross_amount_note'.replace('id_row', parent_id));\n let grossAmountUnitHiddenInput = document.getElementById('dish_ingredients_lists_attributes_id_row_gross_amount_unit'.replace('id_row', parent_id));\n\n let grossAmountNoteInput = document.getElementById('gross_amount_note');\n let grossAmountUnitInput = document.getElementById('gross_amount_unit');\n \n grossAmountNoteInput.value = grossAmountNoteHiddenInput.value;\n grossAmountUnitInput.value = grossAmountUnitHiddenInput.value;\n }\n\n // Close modal\n close (event) {\n\n let parent_id = event.currentTarget.dataset['parentId'];\n\n let grossAmountNoteHiddenInput = document.getElementById('dish_ingredients_lists_attributes_id_row_gross_amount_note'.replace('id_row', parent_id));\n let grossAmountUnitHiddenInput = document.getElementById('dish_ingredients_lists_attributes_id_row_gross_amount_unit'.replace('id_row', parent_id));\n\n let grossAmountNoteInput = document.getElementById('gross_amount_note');\n let grossAmountUnitInput = document.getElementById('gross_amount_unit');\n\n grossAmountNoteHiddenInput.value = grossAmountNoteInput.value;\n grossAmountUnitHiddenInput.value = grossAmountUnitInput.value;\n\n\n //\n // Changing create note button color if there's\n // grossAmountNote or grossAmountUnit at least\n //\n // When there's note, button is blue\n // Otherwise, it's white.\n //\n\n let createNoteButton = document.getElementById('create_note_' + parent_id);\n\n if ( grossAmountNoteInput.value || grossAmountUnitInput.value )\n createNoteButton.classList.add('btn-info');\n else\n createNoteButton.classList.remove('btn-info');\n\n\n //\n // Updating text below inputs in table\n //\n\n let textNoteSpan = document.getElementById('text_note_' + parent_id);\n\n textNoteSpan.innerHTML = `${grossAmountNoteInput.value} ${grossAmountUnitInput.value}`\n\n\n // Reset values\n grossAmountNoteInput.value = undefined;\n grossAmountUnitInput.value = undefined;\n\n this.element\n .closest('#modal')\n .classList\n .add('hidden');\n }\n\n}","import { Controller } from 'stimulus'\nimport { randomString } from 'helpers'\n\nexport default class extends Controller {\n\n static targets = [ 'passwordInput', 'passwordEyeButton' ]\n\n connect() {}\n\n /*\n * generateRandomPassword\n * Generates a random password\n *\n */\n\n generateRandomPassword () {\n let password = randomString(8);\n this.passwordInputTarget.value = password;\n }\n\n\n /*\n * togglePassword\n * Show or hide the password inside the input\n *\n */\n\n togglePassword () {\n if ( this.passwordInputTarget.type === 'text' ) {\n this.passwordInputTarget.type = 'password';\n this.passwordEyeButtonTarget.innerHTML = `\n \n \n `;\n }\n else {\n this.passwordInputTarget.type = 'text';\n this.passwordEyeButtonTarget.innerHTML = `\n \n \n \n `;\n }\n }\n}\n","import { Controller } from 'stimulus';\n\n/*\n * Subcategories form managing\n *\n */\n\nexport default class extends Controller {\n\n\tstatic targets = [];\n\n subcategories_number = 0;\n add_subcategory_button_container = null;\n new_subcategory_button = null;\n\n\tconnect () {\n this.add_subcategory_button_container = document.querySelector('.add-subcategory-button-container');\n this.add_subcategory_button_container.classList.remove('border-t', 'border-gray-200', 'pt-4')\n\n this.new_subcategory_button = document.getElementById('newSubcategoryButton');\n\n this.new_subcategory_button.addEventListener('click', (event) => {\n this.addSubcategory();\n });\n }\n\n addSubcategory () {\n\n this.add_subcategory_button_container.classList.add('border-t', 'border-gray-200', 'pt-4');\n\n let mSec = new Date().getTime();\n\n let idAttrNameES = 'category_subcategories_attributes_0_name_es'.replace('0', mSec);\n let nameAttrNameES = 'category[subcategories_attributes][0][name_es]'.replace('0', mSec);\n\n let idAttrNameEN = 'category_subcategories_attributes_0_name_en'.replace('0', mSec);\n let nameAttrNameEN = 'category[subcategories_attributes][0][name_en]'.replace('0', mSec);\n\n let idAttrNameDE = 'category_subcategories_attributes_0_name_de'.replace('0', mSec);\n let nameAttrNameDE = 'category[subcategories_attributes][0][name_de]'.replace('0', mSec);\n\n let idAttrNameFR = 'category_subcategories_attributes_0_name_fr'.replace('0', mSec);\n let nameAttrNameFR = 'category[subcategories_attributes][0][name_fr]'.replace('0', mSec);\n\n let li = document.createElement('li');\n let div1 = document.createElement('div');\n let div2 = document.createElement('div');\n let div3 = document.createElement('div');\n let div4 = document.createElement('div');\n let div_picture = document.createElement('div');\n\n let p = document.createElement('p');\n\n div1.setAttribute('class', 'max-w-lg flex flex-col mb-8');\n div2.setAttribute('class', 'mb-2 flex flex-row justify-between');\n div3.setAttribute('class', 'max-w-lg flex flex-col mb-8');\n \n p.setAttribute('class', 'text-sm text-gray-400');\n p.innerHTML = 'Subcategory ' + (this.subcategories_number += 1);\n\n div2.appendChild(p);\n div4.innerHTML = `\n subcategories-form#removeSubcategory\">\n \n \n \n \n `;\n div2.appendChild(div4);\n div3.appendChild(div2);\n\n div_picture.setAttribute('class', 'flex');\n div_picture.innerHTML = `\n
\n \n
\n \n \n \n
\n Upload a file or drag and drop\n
\n
\n PDF, DOC up to 2MB\n
\n
\n
\n
\n `.replaceAll('__subcategory__', mSec);\n\n div3.appendChild(div_picture);\n\n\n let inputNameES = document.createElement('input');\n let divNameES = document.createElement('div');\n\n inputNameES.setAttribute('class', 'flex-1 form-control info');\n inputNameES.setAttribute('type', 'text');\n inputNameES.setAttribute('placeholder', 'ES');\n inputNameES.setAttribute('required', '');\n inputNameES.setAttribute('id', idAttrNameES);\n inputNameES.setAttribute('name', nameAttrNameES);\n\n divNameES.setAttribute('class', 'flex rounded-md shadow-sm mt-4');\n divNameES.appendChild(inputNameES);\n div3.appendChild(divNameES);\n\n\n let inputNameEN = document.createElement('input');\n let divNameEN = document.createElement('div');\n \n inputNameEN.setAttribute('class', 'flex-1 form-control info');\n inputNameEN.setAttribute('type', 'text');\n inputNameEN.setAttribute('placeholder', 'EN');\n inputNameEN.setAttribute('required', '');\n inputNameEN.setAttribute('id', idAttrNameEN);\n inputNameEN.setAttribute('name', nameAttrNameEN);\n\n divNameEN.setAttribute('class', 'flex rounded-md shadow-sm mt-4');\n divNameEN.appendChild(inputNameEN);\n div3.appendChild(divNameEN);\n\n\n let inputNameDE = document.createElement('input');\n let divNameDE = document.createElement('div');\n\n inputNameDE.setAttribute('class', 'flex-1 form-control info');\n inputNameDE.setAttribute('type', 'text');\n inputNameDE.setAttribute('placeholder', 'DE');\n inputNameDE.setAttribute('required', '');\n inputNameDE.setAttribute('id', idAttrNameDE);\n inputNameDE.setAttribute('name', nameAttrNameDE);\n\n divNameDE.setAttribute('class', 'flex rounded-md shadow-sm mt-4');\n divNameDE.appendChild(inputNameDE);\n div3.appendChild(divNameDE);\n\n let inputNameFR = document.createElement('input');\n let divNameFR = document.createElement('div');\n\n inputNameFR.setAttribute('class', 'flex-1 form-control info');\n inputNameFR.setAttribute('type', 'text');\n inputNameFR.setAttribute('placeholder', 'FR');\n inputNameFR.setAttribute('required', '');\n inputNameFR.setAttribute('id', idAttrNameFR);\n inputNameFR.setAttribute('name', nameAttrNameFR);\n\n divNameFR.setAttribute('class', 'flex rounded-md shadow-sm mt-4');\n divNameFR.appendChild(inputNameFR);\n div3.appendChild(divNameFR);\n\n li.appendChild(div3);\n\n document\n .getElementById('subcategories_list')\n .appendChild(li);\n }\n\n\n removeSubcategory (event) {\n \n let action = event.target.closest('li').dataset['action'];\n let index = event.target.closest('li').dataset['index'];\n\n event.target.closest('li').remove();\n\n // Used when trying to remove a subcategory when\n // editing a category. We need to insert an input\n // hidden tag with name \"_destroy\" and value \"true\"\n // to tell Rails to delete the given subcategory\n if ( action === 'edit' ) {\n\n let subcategoryToDeleteName = 'category[subcategories_attributes][0][_destroy]'.replace('0', index);\n let subcategoryToDeleteId = 'category_subcategories_attributes_0__destroy'.replace('0', index);\n\n let input = document.createElement('input');\n\n input.setAttribute('type', 'hidden');\n input.setAttribute('name', subcategoryToDeleteName);\n input.setAttribute('id', subcategoryToDeleteId);\n input.setAttribute('value', true);\n\n document.getElementById('edit_ingredient').appendChild(input);\n }\n }\n}","import { Controller } from 'stimulus';\n\n/*\n * Toggle switch controller\n * Manages 3 positions toggle switch logic\n *\n */\n\nexport default class extends Controller {\n\n\tstatic targets = [ 'text' ];\n\n\tconnect () {\n \n }\n\n updateText (event) {\n if ( event.target.className.indexOf('switch1') > -1 )\n this.textTarget.innerHTML = 'No contain';\n\n if ( event.target.className.indexOf('switch2') > -1 )\n this.textTarget.innerHTML = 'May contain';\n\n if ( event.target.className.indexOf('switch3') > -1 )\n this.textTarget.innerHTML = 'Contain';\n }\n\n}","// app/javascript/helpers/index.js\n\nexport function getMetaValue(name) {\n const element = findElement(document.head, `meta[name=\"${name}\"]`);\n if (element) {\n return element.getAttribute(\"content\");\n }\n}\n\nexport function findElement(root, selector) {\n if (typeof root == \"string\") {\n selector = root;\n root = document;\n }\n return root.querySelector(selector);\n}\n\nexport function toArray(value) {\n if (Array.isArray(value)) {\n return value;\n } else if (Array.from) {\n return Array.from(value);\n } else {\n return [].slice.call(value);\n }\n}\n\nexport function removeElement(el) {\n if (el && el.parentNode) {\n el.parentNode.removeChild(el);\n }\n}\n\nexport function insertAfter(el, referenceNode) {\n return referenceNode.parentNode.insertBefore(el, referenceNode.nextSibling);\n}\n\n\n/**\n * randomString\n * Generates a new random string according\n * to the length passed by param\n *\n * @param length {number} - Random string length\n */\n\nexport function randomString (length) {\n\n if ( typeof length !== 'number' ) {\n console.error('Length must be an integer');\n return;\n }\n\n let result = '';\n const chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\n for (let i = length; i > 0; --i)\n result += chars[Math.floor(Math.random() * chars.length)];\n\n return result;\n}","import Rails from \"@rails/ujs\"\n\n/*\n * Implements a user-facing modal confirmation when link has a\n * \"data-confirm\" attribute using Tailwind. MIT license.\n * \n * AlpineJS is used to manage animations and displaying the modal itself.\n *\n * - ruben@21ninjas.es Tue Mar 11 12:28:15 CEST 2021\n */\n\n\n(() => {\n\n let defaults = {\n title: 'Are you sure?',\n commit: 'Confirm',\n commitClass: 'btn-danger',\n cancel: 'Cancel',\n cancelClass: 'btn-default',\n focus: 'commit'\n };\n\n\n /*\n * createModal\n * Creates the modal\n *\n */\n\n let createModal = (ele) => {\n\n let element = ele.target;\n\n let options = {\n title: element.dataset['title'],\n text: element.dataset['confirm'],\n commit: element.dataset['commit'],\n commitClass: element.dataset['commitclass'],\n cancel: element.dataset['cancel'],\n cancelClass: element.dataset['cancelclass'],\n method: element.dataset['method'],\n url: element.href\n };\n\n let modal = createModalElement(options);\n\n modal\n .querySelector('.commit')\n .addEventListener('click', () => {\n closeAndDestroyModal(modal);\n });\n\n modal\n .querySelector('.cancel')\n .addEventListener('click', () => {\n closeAndDestroyModal(modal);\n });\n\n modal\n .querySelector('.close')\n .addEventListener('click', () => {\n closeAndDestroyModal(modal);\n });\n\n return modal;\n };\n\n\n /* \n * closeAndDestroyModal\n * Closes modal firstly in order AlpineJS\n * animations to perfom and destroys modal\n * element afterwards\n *\n */\n\n let closeAndDestroyModal = (modalObj) => {\n \n // Applying animations\n let overlay = modalObj.querySelector('.overlay');\n overlay.classList.remove('ease-out', 'duration-300', 'translate-y-0', 'opacity-100', 'sm:translate-x-0', 'opacity-100');\n overlay.classList.add('transition', 'ease-in', 'duration-100', 'opacity-0');\n\n let modal = modalObj.querySelector('.modal');\n modal.classList.remove('ease-out', 'duration-300', 'translate-y-0', 'opacity-100', 'sm:translate-x-0');\n modal.classList.add('transition', 'ease-in', 'duration-100', 'opacity-0');\n\n setTimeout(() => {\n modalObj.remove();\n }, 200);\n };\n\n\n /*\n * createModalElement\n * Creates the modal element and set it up\n * according to the default or user's preferences\n *\n */\n\n let createModalElement = (options) => {\n\n let modal = document.createElement('div');\n\n modal.classList.add('fixed', 'z-10', 'inset-0', 'overflow-y-auto'); \n modal.innerHTML = `\n
\n\n
\n
\n
\n\n \n\n
\n
\n \n
\n
\n
\n \n \n \n \n
\n
\n

\n Are you sure?\n

\n
\n

\n Are you sure you want to perform this action?\n

\n
\n
\n
\n
\n \n Confirm\n \n \n
\n
\n
\n `;\n\n modal.querySelector('.commit').setAttribute('href', options.url);\n modal.querySelector('.commit').setAttribute('data-method', options.method);\n\n if ( options.title )\n modal.querySelector('.modal-title').innerHTML = options.title;\n\n if ( options.text )\n modal.querySelector('.modal-text').innerHTML = options.text;\n\n if ( options.commit )\n modal.querySelector('.commit').innerHTML = options.commit;\n\n if ( options.cancel )\n modal.querySelector('.cancel').innerHTML = options.cancel;\n\n if ( options.commitClass ) {\n modal.querySelector('.commit').classList.remove('btn-danger');\n modal.querySelector('.commit').classList.add(options.commitClass);\n }\n\n if ( options.cancelClass ) {\n modal.querySelector('.cancel').classList.remove('btn');\n modal.querySelector('.cancel').classList.add(options.cancelClass);\n }\n\n document.body.appendChild(modal);\n\n return modal;\n };\n\n\n if ( Rails ) {\n\n let elements = ['a[data-confirm]', 'button[data-confirm]', 'input[type=submit][data-confirm]'];\n\n Rails.delegate(document, elements.join(', '), 'confirm', (element) => {\n\n let modalObj = createModal(element);\n\n // Applying animations\n setTimeout(() => {\n let overlay = modalObj.querySelector('.overlay');\n overlay.classList.remove('translate-y-2', 'opacity-0', 'sm:translate-y-0', 'sm:translate-x-2');\n overlay.classList.add('translate-y-0', 'opacity-100', 'sm:translate-x-0');\n \n let modal = modalObj.querySelector('.modal');\n modal.classList.remove('translate-y-2', 'opacity-0', 'sm:translate-y-0', 'sm:translate-x-2');\n modal.classList.add('translate-y-0', 'opacity-100', 'sm:translate-x-0');\n }, 100);\n\n return false;\n\n });\n\n }\n})();","// Load all the controllers within this directory and all subdirectories. \n// Controller files must be named *_controller.js.\n\nimport { Application } from \"stimulus\"\nimport { definitionsFromContext } from \"stimulus/webpack-helpers\"\n\nconst application = Application.start()\nconst context = require.context(\"controllers\", true, /_controller\\.js$/)\napplication.load(definitionsFromContext(context))","// This file is automatically compiled by Webpack, along with any other files\n// present in this directory. You're encouraged to place your actual application logic in\n// a relevant structure within app/javascript and only use these pack files to reference\n// that code so it'll be compiled.\n\nimport Rails from \"@rails/ujs\"\nimport \"@hotwired/turbo-rails\"\nimport * as ActiveStorage from \"@rails/activestorage\"\nimport \"channels\"\n\nRails.start()\nActiveStorage.start()\n\nimport \"../stylesheets/application.scss\"\nimport \"../stylesheets/nutrihostel.scss\"\nimport \"../stylesheets/dropzone.scss\"\nimport 'alpine-turbo-drive-adapter'\nimport \"alpinejs\"\nimport \"../helpers/data-confirm-tailwind-modal\";\n\nimport \"controllers\""],"sourceRoot":""}