{"version":3,"sources":["webpack://JsStoreWorker/webpack/bootstrap","webpack://JsStoreWorker/./src/common/utils/promise_resolve.ts","webpack://JsStoreWorker/./src/common/enums.ts","webpack://JsStoreWorker/./src/common/utils/promise.ts","webpack://JsStoreWorker/./src/worker/model/table_meta.ts","webpack://JsStoreWorker/./src/worker/meta_helper.ts","webpack://JsStoreWorker/./src/worker/model/db_meta.ts","webpack://JsStoreWorker/./src/common/utils/for_obj.ts","webpack://JsStoreWorker/./src/worker/utils/log_helper.ts","webpack://JsStoreWorker/./src/worker/idbutil/index.ts","webpack://JsStoreWorker/./src/common/utils/promise_all.ts","webpack://JsStoreWorker/./src/worker/utils/promise_reject.ts","webpack://JsStoreWorker/./src/worker/utils/get_error.ts","webpack://JsStoreWorker/./src/worker/executors/base.ts","webpack://JsStoreWorker/./src/worker/utils/get_error_from_exception.ts","webpack://JsStoreWorker/./src/worker/utils/get_data_type.ts","webpack://JsStoreWorker/./src/worker/utils/is_null.ts","webpack://JsStoreWorker/./src/worker/executors/insert/values_checker.ts","webpack://JsStoreWorker/./src/worker/executors/update/schema_checker.ts","webpack://JsStoreWorker/./src/worker/executors/query_helper.ts","webpack://JsStoreWorker/./src/worker/executors/insert/index.ts","webpack://JsStoreWorker/./src/worker/constants/index.ts","webpack://JsStoreWorker/./src/worker/utils/set_cross_browser_idb.ts","webpack://JsStoreWorker/./src/worker/utils/get_keys.ts","webpack://JsStoreWorker/./src/worker/utils/is_array.ts","webpack://JsStoreWorker/./src/worker/utils/get_length.ts","webpack://JsStoreWorker/./src/worker/utils/get_object_first_key.ts","webpack://JsStoreWorker/./src/worker/executors/select/then_evaluator.ts","webpack://JsStoreWorker/./src/worker/executors/select/not_where.ts","webpack://JsStoreWorker/./src/worker/utils/remove_space.ts","webpack://JsStoreWorker/./src/worker/executors/select/order_by.ts","webpack://JsStoreWorker/./src/worker/executors/select/where.ts","webpack://JsStoreWorker/./src/worker/utils/get_regex_from_like.ts","webpack://JsStoreWorker/./src/worker/utils/clone.ts","webpack://JsStoreWorker/./src/worker/utils/compare.ts","webpack://JsStoreWorker/./src/worker/executors/where_checker.ts","webpack://JsStoreWorker/./src/worker/executors/base_fetch.ts","webpack://JsStoreWorker/./src/worker/executors/select/in.ts","webpack://JsStoreWorker/./src/worker/executors/select/regex.ts","webpack://JsStoreWorker/./src/worker/executors/select/join.ts","webpack://JsStoreWorker/./src/worker/executors/select/index.ts","webpack://JsStoreWorker/./src/worker/utils/is_object.ts","webpack://JsStoreWorker/./src/worker/executors/select/base_select.ts","webpack://JsStoreWorker/./src/worker/executors/select/group_by.ts","webpack://JsStoreWorker/./src/worker/executors/count/not_where.ts","webpack://JsStoreWorker/./src/worker/executors/count/index.ts","webpack://JsStoreWorker/./src/worker/executors/count/where.ts","webpack://JsStoreWorker/./src/worker/executors/count/regex.ts","webpack://JsStoreWorker/./src/worker/executors/count/in.ts","webpack://JsStoreWorker/./src/worker/utils/resolve.ts","webpack://JsStoreWorker/./src/worker/executors/update/update_value.ts","webpack://JsStoreWorker/./src/worker/executors/update/index.ts","webpack://JsStoreWorker/./src/worker/executors/update/not_where.ts","webpack://JsStoreWorker/./src/worker/executors/update/where.ts","webpack://JsStoreWorker/./src/worker/executors/update/regex.ts","webpack://JsStoreWorker/./src/worker/executors/update/in.ts","webpack://JsStoreWorker/./src/worker/intersect/index.ts","webpack://JsStoreWorker/./src/worker/executors/drop_db.ts","webpack://JsStoreWorker/./src/worker/union/index.ts","webpack://JsStoreWorker/./src/worker/executors/remove/index.ts","webpack://JsStoreWorker/./src/worker/executors/remove/in.ts","webpack://JsStoreWorker/./src/worker/executors/remove/not_where.ts","webpack://JsStoreWorker/./src/worker/executors/remove/where.ts","webpack://JsStoreWorker/./src/worker/executors/remove/regex.ts","webpack://JsStoreWorker/./src/worker/executors/clear/index.ts","webpack://JsStoreWorker/./src/worker/executors/transaction/index.ts","webpack://JsStoreWorker/./src/worker/utils/db_schema.ts","webpack://JsStoreWorker/./src/worker/query_manager.ts","webpack://JsStoreWorker/./src/worker/index.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","ERROR_TYPE","WORKER_STATUS","DATA_TYPE","API","EVENT","QUERY_OPTION","IDB_MODE","OCCURENCE","CONNECTION_STATUS","promiseResolve","Promise","resolve","promise","cb","table","columns","autoIncColumnValue","this","setColumn","alter","tableColumns","columnName","column","autoIncrement","primaryKey","enableSearch","existingColumnIndex","indexOf","q","push","existingColumn","assign","autoIncrementKey","tableName","set","util","tx","createTransaction","MetaHelper","store","objectStore","res","rej","req","put","onsuccess","onerror","keyRange","result","remove","delete","dbSchema","db","version","tables","map","TableMeta","forObj","obj","type","info","info_","message","getMsg_","log","msg","status","console","throw","logError","error","errMsg","NotArray","UndefinedColumn","UndefinedValue","UndefinedColumnName","UndefinedDbName","UndefinedColumnValue","NoValueSupplied","InvalidOp","ColumnNotExist","EnableSearchOff","NullValue","WrongDataType","TableNotExist","DbNotExist","NotObject","DbBlocked","NullValueInWhere","MethodNotExist","IndexedDbNotSupported","InvalidJoinQuery","InvalidGroupQuery","InvalidOrderQuery","ImportScriptsFailed","InvalidMiddleware","Unknown","logger","emptyTx","oncomplete","onabort","createTransactionIfNotExist","ReadWrite","con","transaction","op","Between","IDBKeyRange","bound","low","high","GreaterThan","lowerBound","GreaterThanEqualTo","LessThan","upperBound","LessThanEqualTo","only","abortTransaction","abort","close","setTimeout","initDb","oldVersion","isDbCreated","dbVersion","dbOpenRequest","indexedDB","open","onversionchange","e","target","isCreated","newVersion","onupgradeneeded","upgradeConnection","storeNames","objectStoreNames","addColumn","indexNames","contains","options","unique","multiEntry","keyPath","createIndex","deleteColumn","index","findIndex","splice","deleteIndex","forEach","option","createObjectStore","alterQuery","add","drop","modify","shouldDelete","targetColumn","find","newColumn","storeName","item","qry","deleteObjectStore","length","promiseAll","promises","all","promiseReject","reject","getError","rowAffected","isTxQuery","results","getColumnInfo","onException","ex","InvalidQuery","getErrorFromException","getDataType","Null","Array","isArray","Date","DateTime","isNull","isNaN","autoIncValues","autoIncrementValue","checkAndModifyValues","query","err","values","ignoreIndexes","every","checkAndModifyValue","ignore","checkAndModifyColumnValue_","checkNotNullAndDataType_","notNull","ColumnName","dataType","columnValue","Number","undefined","default","validation","details","check","setValue","tblName","checkByColumn_","checkFurther","allowedOp","prop","validate","api","Select","Remove","Count","checkSelect","Insert","checkInsertQuery","Update","checkUpdate","getTable_","isInsertQryValid","into","in","where","checkForNullInWhere_","addGreatAndLessToNotOp_","from","whereQuery","containsNot","keys","NotEqualTo","addToSingleQry","Or","queryKeys","qryKeys","validResult","skipDataCheck","valuesAffected_","execute","beforeInsert","then","_","insertData_","return","catch","onInsertData","addMethod","idbMethod","upsert","addResult","IS_WORKER","self","alert","ServiceWorkerGlobalScope","IS_IDB_SUPPORTED","mozIndexedDB","webkitIndexedDB","msIndexedDB","IDBTransaction","webkitIDBTransaction","msIDBTransaction","webkitIDBKeyRange","msIDBKeyRange","setCrossBrowserIndexedDb","getKeys","getLength","getObjectFirstKey","setCaseAndValue","caseQuery","caseQuery_","setCaseAndColumn","columnName_","caseColumnQuery_","length_","evaluate","checkCase_","lastThen","cond","queryOption","Equal","executeSkipAndLimit","onFinished","cursor","recordSkipped","limitRecord","pushResult","continue","advance","skipRecord","executeSkip","executeSimple","executeLimit","removeSpace","replace","getOrderColumnInfo","orderColumn","join","splittedByDot","split","valueFromFirstColumn","isOrder","compareStringInDesc_","a","b","localeCompare","compareStringinAsc_","compareDefaultInDesc_","String","compareDefaultinAsc_","compareNumberInDesc_","compareNumberinAsc_","compareDateInDesc_","getTime","compareDateInAsc_","getValInDesc_","value1","value2","thenEvaluator","column1","column2","getValInAsc_","getValueComparer_","order","orderBy_","getOrderType_","by","sort","columnInfo","case","toLowerCase","executeSkipAndLimitForWhere_","onFinish","shouldAddValue","executeSkipForWhere_","executeLimitForWhere_","executeSimpleForWhere_","getRegexFromLikeExpression","likeExpression","filterValue","occurence","filterValues","Any","Last","First","RegExp","clone","copy","compare","compareValue","symbol","type1","checkFlag","props","last","pop","reduce","prev","curr","rowValue","whereColumnValue","In","checkIn","Like","checkLike_","Regex","checkRegex","checkComparisionOp_","test","shouldEvaluateLimitAtEnd","shouldEvaluateSkipAtEnd","goToWhereLogic","firstColumn","whereCheckerInstance","executeWhereLogic","regexVal","executeRegexLogic","executeInLogic","Aggregate","executeSkipAndLimitForIn_","skipOrPush","executeSkipForIn_","executeSimpleForIn_","executeSkipAndLimitForRegex_","executeSkipForRegex_","executeLimitForRegex_","executeSimpleForRegex_","select","joinQueryStack_","currentQueryStackIndex_","tablesFetched","getTable","executeSelect","tablesToFetch","jointblInfo","getJoinTableInfo_","on","with","table1","table2","checkJoinQuery_","joinTableInfo","flatten","startExecutingJoinLogic_","onJoinQueryFinished_","as","data","setLimitAndSkipEvaluationAtEnd_","processOrderBy","processGroupDistinctAggr","joinQuery","jointables","joinType","secondtableData","valueMatchedFromSecondTable","callBack","columnDefaultValue","table1Index","table2Index","col","valueFromFirstTable","valueFromSecondTable","performInnerJoin","joinOn","splittedjoinOn","splittedjoinOnbydotFirst","splittedjoinOnbydotSecond","tableSchemaOf1stTable","tableSchemaOf2ndTable","columnFound","sorted","isSubQuery","returnResult_","concat","skip","slice","limit","setPushResult","isArrayQry","idbSorting","groupBy","beforeExecute","initTransaction_","processWhereArrayQry","processWhere_","executeWhereUndefinedLogic","executeJoinQuery","operation","pKey","isFirstWhere","output","onSuccess","And","andResults","keyValue","removeDuplicates","processFirstQry","shift","ReadOnly","or","processOrLogic_","onWhereEvaluated","isOr","orQuerySuccess_","orQueryFinish_","orInfo","orQuery","val","columnStore","cursorRequest","openCursor","orderType","dir","exp","datas","lookupObject","len","distinct","aggregate","executeAggregateGroupBy","processGroupBy","processAggregateQry","orderQueryType","prevOrderQueryBy","currentOrderQuery","currentorderQueryBy","orderColumnDetail","columnToAggregate","datasLength","getCount","getMax","getMin","Infinity","getSum","getAvg","aggregateColumn","aggregateValType","aggregateCalculator","grpQry","objKey","lookUpObj","aggregateQry","calculateAggregate","sumOfColumn","Max","Min","Sum","Avg","avg","sumForAvg","countForAvg","count","sum","isCountTypeString","isSumTypeString","avgColumn","groupByColumn","resultCount","queryHelper","getDataFromSelect","selectInstance","countRequest","variableFromPath","path","updateValue","storedValue","mapSet","columnSetValue","method","initTransaction","executeComplexLogic_","selectObject","ignoreCase","inQuery","whereQry","cursorUpdateRequest","update","cursorOpenRequest","intersectQry","getHashKey","hashMap","hashMapTemp","isQueryForSameTable","queries","queryLength","columnValKey","fetchData","selectResult","resultPusher","dbName","dropDbRequest","deleteDatabase","onblocked","pResult","keyList","pkey","Where","processOrLogic","_orInfo","OrQuery","columnIndex","clearRequest","clear","currentTable","reqQueue","isQueryExecuting","isTxStarted_","startExecution_","onError","notExistingTable","notExistingTable_","methodName","txLogic","insert","pushReq_","setResult","getResult","abortTx_","start","startTx_","tableNames","processExecutionOfQry_","onReqFinished_","finisehdRequest","executeRequest_","request","requestObj","onReqFinished","promiseObj","invalidTable","userDbSchema","database","tableAsObj","fn","middlewares","onQryFinished","postMessage","executeMiddleware_","lastIndex","middlewareContext","callNextMiddleware","promiseResult","executeQuery","queryResult","OpenDb","openDb","InitDb","CloseDb","closeDb","Intersect","DropDb","dropDb","Terminate","terminate","Union","Clear","Transaction","Get","Set","ImportScripts","importScripts_","ChangeLogStatus","Middleware","callResultMiddleware","modifiedResult","callBeforeMiddleware","run","onResultCallback","beforeExecuteCallback","onResult","importScripts","dataBase","dbMeta","dbInfo","targetTable","onmessage"],"mappings":";;;;;8BACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QA0Df,OArDAF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,sFClF9C,ICAKC,EAiCAC,EAMAC,EAUAC,EAsBAC,EAQAC,EA0BAC,EAKAC,EAMAC,EDpHCC,EAAiB,SAACxB,GAC3B,OAAOyB,QAAQC,QAAQ1B,IEDd2B,EAAU,SAAIC,GACvB,OAAO,IAAIH,QAAWG,KDD1B,SAAYb,GACR,8CACA,qCACA,mCACA,8CACA,4CACA,gDACA,uBACA,sCACA,oCACA,sCACA,+BACA,yBACA,kCACA,kCACA,4BACA,yCACA,uCACA,yBACA,iCACA,yBACA,kDACA,yCACA,wCACA,0CACA,+BACA,0CACA,8CACA,oCACA,oBACA,yCA9BJ,CAAYA,MAAU,KAiCtB,SAAYC,GACR,yBACA,kBACA,2BAHJ,CAAYA,MAAa,KAMzB,SAAYC,GACR,kBACA,kBACA,gBACA,kBACA,oBACA,cACA,uBAPJ,CAAYA,MAAS,KAUrB,SAAYC,GACR,mBACA,YACA,YACA,kBACA,kBACA,kBACA,kBACA,mBACA,gBACA,mBACA,gBACA,sCACA,wBACA,4BACA,qBACA,gBACA,wBACA,iCACA,0BAnBJ,CAAYA,MAAG,KAsBf,SAAYC,GACR,wCACA,0CACA,oBACA,kBACA,cALJ,CAAYA,MAAK,KAQjB,SAAYC,GACR,gBACA,cACA,gBACA,UACA,YACA,cACA,kBACA,eACA,0BACA,uBACA,kBACA,wBACA,YACA,YACA,YACA,gBACA,YACA,UACA,cACA,gBACA,YACA,0BACA,cAvBJ,CAAYA,MAAY,KA0BxB,SAAYC,GACR,sBACA,wBAFJ,CAAYA,MAAQ,KAKpB,SAAYC,GACR,YACA,WACA,UAHJ,CAAYA,MAAS,KAMrB,SAAYC,GACR,wBACA,kBACA,2BACA,kCACA,sCALJ,CAAYA,MAAiB,KElH7B,I,EAAA,aAOI,WAAYM,GALZ,KAAAC,QAAqB,GAErB,KAAAC,mBAAqB,GAIjBC,KAAKF,QAAUE,KAAKC,UAAUJ,EAAMC,SACpCE,KAAK1C,KAAOuC,EAAMvC,KAClB0C,KAAKE,MAAQL,EAAMK,OAAS,GA4BpC,OAzBI,YAAAD,UAAA,SAAUE,GACN,IAAML,EAAU,G,WACLM,GACP,IAAMC,EAAkBF,EAAaC,GACrCC,EAAO/C,KAAO8C,EACVC,EAAOC,gBACP,EAAKP,mBAAmBK,GAAc,GAEtCC,EAAOE,aACP,EAAKA,WAAaH,GAEtBC,EAAOG,aAAsC,MAAvBH,EAAOG,cAA8BH,EAAOG,aAClE,IAAMC,EAAsB,EAAKX,QAAQY,SAAQ,SAAAC,GAAK,OAAAA,EAAErD,OAAS8C,KACjE,GAAIK,EAAsB,EACtBX,EAAQc,KAAKP,OAEZ,CACD,IAAMQ,EAAiB,EAAKf,QAAQW,GACpChD,OAAOqD,OAAOD,EAAgBR,K,OAhBtC,IAAK,IAAMD,KAAcD,E,EAAdC,GAmBX,OAAON,GAIf,EAtCA,GCCA,2BAwDA,OAtDW,EAAAiB,iBAAP,SAAwBC,EAAmBZ,GACvC,MAAO,WAAWY,EAAS,IAAIZ,EAAU,UAItC,EAAAa,IAAP,SAAW3C,EAAKN,EAAOkD,GACdA,EAAKC,IACND,EAAKE,kBAAkB,CAACC,EAAWL,YAEvC,IAAMM,EAAQJ,EAAKK,YAAYF,EAAWL,WAE1C,OAAOrB,GAAQ,SAAC6B,EAAKC,GACjB,IAAMC,EAAMJ,EAAMK,IAAI,CAClBrD,IAAG,EAAEN,MAAK,IAEd0D,EAAIE,UAAY,WACZJ,KAEJE,EAAIG,QAAUJ,MAIf,EAAA7D,IAAP,SAAWU,EAAK4C,GACPA,EAAKC,IACND,EAAKE,kBAAkB,CAACC,EAAWL,YAEvC,IAAMM,EAAQJ,EAAKK,YAAYF,EAAWL,WAE1C,OAAOrB,GAAQ,SAAC6B,EAAKC,GACjB,IAAMC,EAAMJ,EAAM1D,IACdsD,EAAKY,SAASxD,IAElBoD,EAAIE,UAAY,WACZ,IAAMG,EAASL,EAAIK,OACnBP,EAAIO,GAAUA,EAAO/D,QAEzB0D,EAAIG,QAAUJ,MAIf,EAAAO,OAAP,SAAc1D,EAAK4C,GACVA,EAAKC,IACND,EAAKE,kBAAkB,CAACC,EAAWL,YAEvC,IAAMM,EAAQJ,EAAKK,YAAYF,EAAWL,WAE1C,OAAOrB,GAAQ,SAAC6B,EAAKC,GACjB,IAAMC,EAAMJ,EAAMW,OACdf,EAAKY,SAASxD,IAElBoD,EAAIE,UAAYJ,EAChBE,EAAIG,QAAUJ,MApDf,EAAAT,UAAY,eAIZ,EAAAkB,SAAW,mBAmDtB,EAxDA,GCCA,EAKI,SAAYC,GACRnC,KAAK1C,KAAO6E,EAAG7E,KACf0C,KAAKoC,QAAUD,EAAGC,SAAW,EAC7BD,EAAGE,OAAOzB,KAAK,CACXtD,KAAM,EAAW0D,UACjBlB,QAAS,CACLxB,IAAK,CACDiC,YAAY,GAEhBvC,MAAO,CACHwC,cAAc,MAI1BR,KAAKqC,OAASF,EAAGE,OAAOC,KAAI,SAAAzC,GACxB,OAAO,IAAI0C,EAAU1C,OCxBpB2C,EAAS,SAACC,EAAa7C,GAChC,IAAK,IAAMtB,KAAOmE,EACd7C,EAAGtB,EAAKmE,EAAInE,KCApB,aAaI,WAAYoE,EAAkBC,GAC1B3C,KAAK0C,KAAOA,EACZ1C,KAAK4C,MAAQD,EACb3C,KAAK6C,QAAU7C,KAAK8C,UAyG5B,OAlHI,YAAAC,IAAA,SAAIC,GACIhD,KAAKiD,QACLC,QAAQH,IAAIC,IAUpB,YAAAG,MAAA,WACI,MAAMnD,KAAKpC,OAIf,YAAAwF,SAAA,WACIF,QAAQG,MAAMrD,KAAKpC,QAKvB,YAAAA,IAAA,WACI,MAAO,CACHiF,QAAS7C,KAAK6C,QACdH,KAAM1C,KAAK0C,OAIX,YAAAI,QAAR,WACI,IAAIQ,EACJ,OAAQtD,KAAK0C,MACT,KAAK3D,EAAWwE,SACZD,EAAS,iCACT,MACJ,KAAKvE,EAAWyE,gBACZF,EAAS,+BACT,MACJ,KAAKvE,EAAW0E,eACZH,EAAS,8BACT,MACJ,KAAKvE,EAAW2E,oBACZJ,EAAS,6BAA+BtD,KAAK4C,MAAiB,UAAI,IAClE,MACJ,KAAK7D,EAAW4E,gBACZL,EAAS,gCACT,MACJ,KAAKvE,EAAW6E,qBACZN,EAAS,4BACT,MACJ,KAAKvE,EAAW8E,gBACZP,EAAS,uBACT,MACJ,KAAKvE,EAAW+E,UACZR,EAAS,qBAAuBtD,KAAK4C,MAAU,GAAI,IACnD,MACJ,KAAK7D,EAAWgF,eACZT,EAAStD,KAAK4C,MAAe,QACzB,WAAW5C,KAAK4C,MAAc,OAAC,kCAC/B,WAAW5C,KAAK4C,MAAc,OAAC,mBACnC,MACJ,KAAK7D,EAAWiF,gBACZV,EAAS,wCAA0CtD,KAAK4C,MAAc,OAAI,IAC1E,MACJ,KAAK7D,EAAWkF,UACZX,EAAS,yCAA2CtD,KAAK4C,MAAkB,WAAI,IAC/E,MACJ,KAAK7D,EAAWmF,cACZZ,EAAS,8BAAgCtD,KAAK4C,MAAc,OACxD,yBACJ,MACJ,KAAK7D,EAAWoF,cACZb,EAAS,UAAYtD,KAAK4C,MAAiB,UAAI,mBAC/C,MACJ,KAAK7D,EAAWqF,WACZd,EAAS,sBAAsBtD,KAAK4C,MAAc,OAAC,kBACnD,MACJ,KAAK7D,EAAWsF,UACZf,EAAS,+BACT,MACJ,KAAKvE,EAAW+E,UACZR,EAAS,mBAAqBtD,KAAK4C,MAAc,OAAI,KACrD,MACJ,KAAK7D,EAAWuF,UACZhB,EAAS,iDACT,MACJ,KAAKvE,EAAWwF,iBACZjB,EAAS,mDAAmDtD,KAAK4C,MAAc,OAAC,aAChF,MACJ,KAAK7D,EAAWyF,eACZlB,EAAS,WAAWtD,KAAK4C,MAAK,oBAC9B,MACJ,KAAK7D,EAAW0F,sBACZnB,EAAS,qCACT,MACJ,KAAKvE,EAAW2F,iBAChB,KAAK3F,EAAW4F,kBAChB,KAAK5F,EAAW6F,kBAChB,KAAK7F,EAAW8F,oBACZvB,EAAStD,KAAK4C,MACd,MACJ,KAAK7D,EAAW+F,kBACZxB,EAAS,eAAetD,KAAK4C,MAAK,aAClC,MACJ,QACS5C,KAAK0C,OACN1C,KAAK0C,KAAO3D,EAAWgG,SAE3BzB,EAAStD,KAAK6C,QAGtB,OAAOS,GAEf,EAzHA,GCIA,0BAOI,KAAA0B,OAAS,IAAI,EAAU,MA4K3B,OA1KI,YAAAC,QAAA,WACSjF,KAAKmB,KACVnB,KAAKmB,GAAG+D,WAAa,KACrBlF,KAAKmB,GAAGgE,QAAU,KAClBnF,KAAKmB,GAAGU,QAAU,KAClB7B,KAAKmB,GAAK,OAGd,YAAAiE,4BAAA,SAA4B/C,EAAkBnE,GACrC8B,KAAKmB,IACNnB,KAAKoB,kBAAkBiB,EAAQnE,IAIvC,YAAAkD,kBAAA,SAAkBiB,EAAkBnE,GAApC,WAEI,YAFgC,IAAAA,MAAOmB,EAASgG,WAChDrF,KAAKmB,GAAKnB,KAAKsF,IAAIC,YAAYlD,EAAQnE,GAChCyB,GAAQ,SAAC6B,EAAKC,GACjB,EAAKN,GAAG+D,WAAa1D,EACrB,EAAKL,GAAGgE,QAAU3D,EAClB,EAAKL,GAAGU,QAAUJ,MAI1B,YAAAK,SAAA,SAAS9D,EAAOwH,GACZ,IAAI1D,EACJ,OAAQ0D,GACJ,KAAKpG,EAAaqG,QAAS3D,EAAW4D,YAAYC,MAAM3H,EAAM4H,IAAK5H,EAAM6H,MAAM,GAAO,GAAQ,MAC9F,KAAKzG,EAAa0G,YAAahE,EAAW4D,YAAYK,WAAW/H,GAAO,GAAO,MAC/E,KAAKoB,EAAa4G,mBAAoBlE,EAAW4D,YAAYK,WAAW/H,GAAQ,MAChF,KAAKoB,EAAa6G,SAAUnE,EAAW4D,YAAYQ,WAAWlI,GAAO,GAAO,MAC5E,KAAKoB,EAAa+G,gBAAiBrE,EAAW4D,YAAYQ,WAAWlI,GAAQ,MAC7E,QAAS8D,EAAW4D,YAAYU,KAAKpI,GAEzC,OAAO8D,GAGX,YAAAP,YAAA,SAAYjE,GACR,OAAO0C,KAAKmB,GAAGI,YAAYjE,IAG/B,YAAA+I,iBAAA,WACQrG,KAAKmB,IACLnB,KAAKmB,GAAGmF,SAIhB,YAAAC,MAAA,sBAKI,OAJIvG,KAAKsF,KACLtF,KAAKsF,IAAIiB,QAGN5G,GAAQ,SAAA6B,GACX,EAAK8D,IAAM,KACXkB,WAAWhF,EAAK,SAIxB,YAAAiF,OAAA,SAAOtE,GAAP,IAGQuE,EAHR,OACQC,GAAc,EACZC,EAAYzE,EAAGC,QA6GrB,OAAOzC,GA3GW,SAAC6B,EAAKC,GACpB,IAAMoF,EAAgBC,UAAUC,KAAK5E,EAAG7E,KAAMsJ,GAC9CC,EAAcjF,UAAY,WACtB,EAAK0D,IAAMuB,EAAc9E,OACzB,EAAKuD,IAAI0B,gBAAkB,SAACC,GAExBA,EAAEC,OAAOX,SAIb/E,EAAI,CACA2F,UAAWR,EACXD,WAAYA,EACZU,WAAYR,KAIpBC,EAAchF,QAAU,SAACoF,GACrB/D,QAAQG,MAAM,QAAS4D,GACvBxF,EAAIwF,IAGRJ,EAAcQ,gBAAkB,SAACJ,GAC7BP,EAAaO,EAAEP,WACf,IAAMQ,EAGDD,EAAUC,OACTI,EAAoBJ,EAAOnF,OACjC4E,GAAc,EACd,IAAMpB,EAAc2B,EAAO3B,YACrBgC,EAAaD,EAAkBE,iBAa/BC,EAAY,SAACnG,EAAuBjB,GACtC,IAAMD,EAAaC,EAAO/C,KAC1B,GAAI+C,EAAOG,eAAiBc,EAAMoG,WAAWC,SAASvH,GAAa,CAC/D,IAAMwH,EAAUvH,EAAOE,WAAa,CAAEsH,QAAQ,GAAS,CAAEA,OAAQxH,EAAOwH,QACxED,EAAoB,WAAIvH,EAAOyH,WAC/B,IAAMC,EAA4B,MAAlB1H,EAAO0H,QAAkB3H,EAAaC,EAAO0H,QAC7DzG,EAAM0G,YAAY5H,EAAY2H,EAASH,KAGzCK,EAAe,SAAC3G,EAAuBzB,EAAkBO,GAC3D,IAAM8H,EAAQrI,EAAMC,QAAQqI,WAAU,SAAAxH,GAAK,OAAAA,EAAErD,OAAS8C,KAClD8H,GAAS,IACTrI,EAAMC,QAAQsI,OAAOF,EAAO,GAC5B5G,EAAM+G,YAAYjI,KAG1B+B,EAAGE,OAAOiG,SAAQ,SAAAzI,GACd,IAAK0H,EAAWI,SAAS9H,EAAMvC,MAC3B,OA9BkB,SAACuC,GACvB,IAAM0I,EAAmC1I,EAAMU,WAAa,CACxDwH,QAASlI,EAAMU,YACf,CACID,eAAe,GAGjBgB,EAAQgG,EAAkBkB,kBAAkB3I,EAAMvC,KAAMiL,GAC9D1I,EAAMC,QAAQwI,SAAQ,SAAAjI,GAClBoH,EAAUnG,EAAOjB,MAqBVmI,CAAkB3I,GAG7B,IADA,IAAMyB,EAAQiE,EAAYhE,YAAY1B,EAAMvC,MACnCP,EAAI2J,EAAa,EAAG3J,GAAK6J,EAAW7J,IAAK,CAC9C,IAAM0L,EAAa5I,EAAMK,MAAMnD,GAC/B,GAAI0L,EAAY,CACZ,GAAIA,EAAWC,IACQ7I,EAAMI,UAAUwI,EAAWC,KACnCJ,SAAQ,SAAAjI,GACfoH,EAAUnG,EAAOjB,GACjBR,EAAMC,QAAQc,KAAKP,MAG3BmC,EACIiG,EAAWE,MAAQ,IAAI,SAAEvI,GACrB6H,EAAa3G,EAAOzB,EAAOO,MAGnCoC,EACIiG,EAAWG,QAAU,IAAI,SAAExI,EAAYC,GACnC,IAAMwI,EAAexI,EAAOyH,YAAczH,EAAO0H,SAAW1H,EAAOwH,OAC/DiB,EAAejJ,EAAMC,QAAQiJ,MAAK,SAAApI,GAAK,OAAAA,EAAErD,OAAS8C,KAChD4I,EAAYvL,OAAOqD,OAAOgI,EAAczI,GAC9C2I,EAAU1L,KAAO8C,EACbyI,IACAZ,EAAa3G,EAAOzB,EAAOO,GAC3BqH,EAAUnG,EAAO0H,GACjBnJ,EAAMC,QAAQc,KAAKoI,YAQ3C,I,eAASjM,EAAO,GACZ,IAAMkM,EAAY1B,EAAW2B,KAAKnM,GACfoF,EAAGE,OAAO8F,WAAU,SAAAgB,GAAO,OAAAA,EAAI7L,OAAS2L,KAC1C,GACb3B,EAAkB8B,kBAAkBH,IAJnClM,EAAI,EAAG,EAASwK,EAAW8B,OAAQtM,EAAI,EAAQA,I,EAA/CA,QAYzB,EAnLA,GCNauM,EAAa,SAAIC,GAC1B,OAAO9J,QAAQ+J,IAAOD,ICDbE,EAAgB,SAACzL,GAC1B,OAAOyB,QAAQiK,OAAO1L,ICCb2L,EAAW,SAAC1C,GAErB,GADoBA,aAAa,EAG7B,OADAA,EAAE7D,WACM6D,EAAgBrJ,MAGxB,IAAIyF,OAAK,EAYT,OAXI4D,EAAE3J,MACF+F,EAAQ,IAAI,EAAU4D,EAAE3J,OAClBuF,QAAUoE,EAAEpE,SAGlBQ,EAAQ,IAAI,EAAW4D,EAAUC,OAAO7D,MAAM/F,OACxCuF,QAAWoE,EAAUC,OAAO7D,MAAMR,QAKrCQ,EAAMzF,OChBrB,0BAUI,KAAAgM,YAAc,EACd,KAAAC,WAAY,EAIF,KAAAC,QAAiB,GA4B/B,OAxCI,sBAAI,iBAAE,C,IAAN,WACI,OAAO9J,KAAKkB,KAAKiB,I,gCAgBrB,YAAAtC,MAAA,SAAMvC,GACF,IAAM0D,EAAY1D,GAAQ0C,KAAKgB,UAC/B,OAAOhB,KAAKmC,GAAGE,OAAO0G,MAAK,SAAApI,GAAK,OAAAA,EAAErD,OAAS0D,MAG/C,YAAAT,WAAA,SAAWS,GACP,OAAOhB,KAAKH,MAAMmB,GAAWT,YAIvB,YAAAwJ,cAAV,SAAwB3J,EAAoBY,GACxC,OAAOhB,KAAKH,MAAMmB,GAAWlB,QAAQiJ,MAAK,SAAA1I,GAAU,OAAAA,EAAO/C,OAAS8C,MAKxE,YAAA4J,YAAA,SAAYC,EAAkBvH,GAG1B,OAFAQ,QAAQG,MAAM4G,GACdjK,KAAKkB,KAAKmF,mBACHoD,ECzCsB,SAACQ,EAAIvH,GAEtC,YAFsC,IAAAA,MAAO3D,EAAWmL,cACxDD,EAAG3M,KAAOoF,EACHiH,EAASM,GDwCRE,CAAsBF,EAAIvH,KAGtC,EA3CA,GEHa0H,EAAc,SAACpM,GACxB,GAAa,MAATA,EACA,OAAOiB,EAAUoL,KAErB,IAAM3H,SAAc1E,EACpB,OAAQ0E,GACJ,IAAK,SACD,GAAI4H,MAAMC,QAAQvM,GACd,OAAOiB,EAAUqL,MAErB,GAAItM,aAAiBwM,KACjB,OAAOvL,EAAUwL,SAG7B,OAAO/H,GChBEgI,EAAS,SAAC1M,GACnB,GAAa,MAATA,EACA,OAAO,EAEP,cAAeA,GACX,IAAK,SAAU,OAAwB,IAAjBA,EAAMqL,OAC5B,IAAK,SAAU,OAAOsB,MAAM3M,GAGpC,OAAO,GCJX,aAKI,WAAY6B,EAAkB+K,GAC1B5K,KAAKH,MAAQA,EACbG,KAAK6K,mBAAqBD,EA0ElC,OAvEI,YAAAE,qBAAA,SAAqBC,GAArB,IACQC,EADR,OAEIhL,KAAK+K,MAAQA,EACb,IAAME,EAASF,EAAME,OACfC,EAAgB,GAYtB,OAXAD,EAAOE,OAAM,SAACjC,EAAMhB,GAMhB,OALA8C,EAAM,EAAKI,oBAAoBlC,GAC3B6B,EAAMM,QAAUL,IAChBE,EAActK,KAAKsH,GACnB8C,EAAM,OAEHA,KAEXE,EAAc5C,SAAQ,SAAAJ,GAClB+C,EAAO7C,OAAOF,EAAO,MAElB,CAAE8C,IAAG,EAAEC,OAAM,IAGhB,YAAAG,oBAAR,SAA4BpN,GAA5B,IACQqF,EADR,OAMI,OAJArD,KAAKH,MAAMC,QAAQqL,OAAM,SAAA9K,GAErB,QADAgD,EAAQ,EAAKiI,2BAA2BjL,EAAQrC,OAG7CqF,GAGH,YAAAkI,yBAAR,SAAiClL,EAAiBrC,GAE9C,OAAIqC,EAAOmL,SAAWd,EAAO1M,EAAMqC,EAAO/C,OAC/B0C,KAAK2J,SAAS5K,EAAWkF,UAAW,CAAEwH,WAAYpL,EAAO/C,OAG3D+C,EAAOqL,WAAahB,EAAO1M,EAAMqC,EAAO/C,QAC7C8M,EAAYpM,EAAMqC,EAAO/C,SAAW+C,EAAOqL,SACpC1L,KAAK2J,SAAS5K,EAAWmF,cAAe,CAAE7D,OAAQA,EAAO/C,YAF/D,GAMD,YAAAgO,2BAAR,SAAmCjL,EAAiBrC,GAChD,IAAM2N,EAAc3N,EAAMqC,EAAO/C,MAsBjC,GApBI+C,EAAOC,cAEHoK,EAAOiB,GACP3N,EAAMqC,EAAO/C,QAAU0C,KAAK6K,mBAAmBxK,EAAO/C,MAGlD8M,EAAYuB,KAAiB1M,EAAU2M,QAGnCD,EAAc3L,KAAK6K,mBAAmBxK,EAAO/C,QAC7C0C,KAAK6K,mBAAmBxK,EAAO/C,MAAQqO,QAM3BE,IAAnBxL,EAAOyL,SAAyBpB,EAAOiB,KAC5C3N,EAAMqC,EAAO/C,MAAQ+C,EAAOyL,SAElB9L,KAAK+K,MACTgB,WACN,OAAO/L,KAAKuL,yBAAyBlL,EAAQrC,IAI7C,YAAA2L,SAAR,SAAiBtG,EAAmB2I,GAChC,OAAO,IAAI,EAAU3I,EAAO2I,IAEpC,EAjFA,GCDA,aAEI,WAAYnM,GACRG,KAAKH,MAAQA,EAoDrB,OAjDI,YAAAoM,MAAA,SAAMC,EAAkBC,GAAxB,IACQpJ,EADR,OAmBI,cAjBWmJ,IAAajN,EAAUxB,OAC1BuC,KAAKH,MAELG,KAAKH,MAAMC,QAAQqL,OAAM,SAAC9K,GAItB,OAHIA,EAAO/C,QAAQ4O,IACfnJ,EAAM,EAAKqJ,eAAe/L,EAAQ6L,EAAS7L,EAAO/C,SAE/CyF,KAIXA,EAAM,IAAI,EAAUhE,EAAWoF,cAAe,CAAEnD,UAAWmL,IAI/DpJ,EAAM,IAAI,EAAUhE,EAAWsF,WAE5BtB,GAKH,YAAAqJ,eAAR,SAAuB/L,EAAiBrC,GAEpC,IAAuB,IAAnBqC,EAAOmL,SAAoBd,EAAO1M,GAClC,OAAO,IAAI,EAAUe,EAAWkF,UAAW,CAAEwH,WAAYpL,EAAO/C,OAIpE,IAAMoF,EAAO0H,EAAYpM,GACnBqO,EAAwB,MAATrO,EACrB,GAAIqC,EAAOqL,UAAYW,GACf3J,IAASrC,EAAOqL,UAAqB,WAAThJ,EAC5B,OAAO,IAAI,EAAU3D,EAAWmF,cAAe,CAAE7D,OAAQA,EAAO/C,OAKxE,GAAI+O,GAAyB,WAAT3J,EAAmB,CACnC,IAAM4J,EAAY,CAAC,IAAK,IAAK,IAAK,IAAK,UACvC,IAAK,IAAMC,KAAQvO,EACf,GAAIsO,EAAU5L,QAAQ6L,GAAQ,GAAKlM,EAAOqL,UAAYhJ,IAASrC,EAAOqL,SAClE,OAAO,IAAI,EAAU3M,EAAWmF,cAAe,CAAE7D,OAAQA,EAAO/C,SAKpF,EAvDA,GCEA,aAGI,WAAY4E,GACRlC,KAAKmC,GAAKD,EA4IlB,OAzII,YAAAsK,SAAA,SAASC,EAAU1B,GACf,OAAQ0B,GACJ,KAAKvN,EAAIwN,OACT,KAAKxN,EAAIyN,OACT,KAAKzN,EAAI0N,MACL,OAAO5M,KAAK6M,YAAY9B,GAC5B,KAAK7L,EAAI4N,OACL,OAAO9M,KAAK+M,iBAAiBhC,GACjC,KAAK7L,EAAI8N,OACL,OAAOhN,KAAKiN,YAAYlC,KAI5B,YAAAmC,UAAR,SAAkBlM,GACd,OAAOhB,KAAKmC,GAAGE,OAAO0G,MAAK,SAAApI,GAAK,OAAAA,EAAErD,OAAS0D,MAG/C,YAAAmM,iBAAA,SAAiBpC,GACb,IACIhI,EADElD,EAAQG,KAAKkN,UAAUnC,EAAMqC,MAEnC,GAAIvN,EACA,OAAQuK,EAAYW,EAAME,SACtB,KAAKhM,EAAUqL,MACX,MACJ,KAAKrL,EAAUoL,KACXtH,EAAM,IAAI,EAAUhE,EAAW8E,iBAC/B,MACJ,QACId,EAAM,IAAI,EAAUhE,EAAWwE,eAIvCR,EAAM,IAAI,EAAUhE,EAAWoF,cAAe,CAAEnD,UAAW+J,EAAMqC,OAErE,MAAO,CACHvN,MAAK,EAAEkD,IAAG,IAIV,YAAAkK,YAAR,SAAoBlC,GAChB,IAAIC,EAAM,IAAI,EAAchL,KAAKkN,UAAUnC,EAAMsC,KAC7CpB,MAAMlB,EAAM9J,IAAK8J,EAAMsC,IAC3B,GAAIrC,EAAK,OAAOA,EAChB,GAAmB,MAAfD,EAAMuC,MAAe,CAErB,GADAtC,EAAMhL,KAAKuN,qBAAqBxC,GACvB,OAAOC,EAChBhL,KAAKwN,wBAAwBzC,KAI7B,YAAA8B,YAAR,SAAoB9B,GAEhB,IADc/K,KAAKkN,UAAUnC,EAAM0C,MAE/B,OAAO,IAAI,EAAU1O,EAAWoF,cAC5B,CAAEnD,UAAW+J,EAAM0C,OAI3B,GAAI1C,EAAMuC,MAAO,CACb,IAAMtC,EAAMhL,KAAKuN,qBAAqBxC,GACtC,GAAIC,EAAK,OAAOA,EAChBhL,KAAKwN,wBAAwBzC,KAI7B,YAAAwC,qBAAR,SAA6BxC,GACzB,IAAK,IAAM3K,KAAc2K,EAAMuC,MAC3B,GAA+B,MAA3BvC,EAAMuC,MAAMlN,GACZ,OAAO,IAAI,EAAUrB,EAAWwF,iBAAkB,CAAElE,OAAQD,KAKhE,YAAAoN,wBAAR,SAAgCzC,GAC5B,IAAM2C,EAAa3C,EAAMuC,MACnBK,EAAc,SAACxE,EAAayE,GAC9B,OAAOA,EAAKzF,WAAU,SAAA7J,GAAO,OAAqC,MAArC6K,EAAI7K,GAAKc,EAAayO,gBAAwB,GAEzEC,EAAiB,SAAC3E,EAAKyE,GACzB,IAAI5P,EAgBJ,OAfA4P,EAAKtF,SAAQ,SAACiE,GAE4B,OADtCvO,EAAQmL,EAAIoD,IACFnN,EAAayO,cACnB1E,EAAIoD,GAAMnN,EAAa0G,aAAe9H,EAAMoB,EAAayO,iBAC5BhC,IAAzB1C,EAAI/J,EAAa2O,KACjB5E,EAAI/J,EAAa2O,IAAM,GACvB5E,EAAI/J,EAAa2O,IAAIxB,GAAQ,SAEOV,IAA/B1C,EAAI/J,EAAa2O,IAAIxB,KAC1BpD,EAAI/J,EAAa2O,IAAIxB,GAAQ,IAEjCpD,EAAI/J,EAAa2O,IAAIxB,GAAMnN,EAAa6G,UAAYjI,EAAMoB,EAAayO,mBAChE1E,EAAIoD,GAAMnN,EAAayO,gBAG/B1E,GAEX,OAAQiB,EAAYsD,IAChB,KAAKzO,EAAUxB,OACX,IAAMuQ,EAAYvQ,OAAOmQ,KAAKF,GAC9B,GAAIC,EAAYD,EAAYM,GACxB,GAAyB,IAArBA,EAAU3E,OACV0B,EAAMuC,MAAQQ,EAAeJ,EAAYM,OAExC,CACD,IAAM,EAAc,GACpBA,EAAU1F,SAAQ,SAACiE,G,MACf,EAAY3L,KAAKkN,IAAc,MAAIvB,GAAOmB,EAAWnB,GAAK,GAAI,CAACA,QAEnExB,EAAMuC,MAAQ,EAGtB,MACJ,QACI,IAAM,EAAW,GAChBI,EAAwBpF,SAAQ,SAAAa,GAC7B,IAAM8E,EAAUxQ,OAAOmQ,KAAKzE,GACxBwE,EAAYxE,EAAK8E,KACjB9E,EAAM2E,EAAe3E,EAAK8E,IAE9B,EAASrN,KAAKuI,MAElB4B,EAAMuC,MAAQ,IAIlB,YAAAP,iBAAR,SAAyBhC,GACrB,IAAMmD,EAAclO,KAAKmN,iBAAiBpC,GACtClL,EAAQqO,EAAYrO,MAClBwD,EAAQ6K,EAAYnL,IAC1B,GAAIM,EAAO,OAAOA,EAClB,IAAI0H,EAAMoD,cAAV,CACA,IACM,EADuB,IAAI,EAActO,EAAOA,EAAME,oBACf+K,qBAAqBC,GAA1DE,EAAM,SAAED,EAAG,MAEnB,OADAD,EAAME,OAASA,EACRD,IAEf,EAhJA,G,kcCGA,cAMI,WAAYD,EAAqB7J,GAAjC,MACI,cAAO,K,OAHH,EAAAkN,gBAAkB,GAIE,MAApBrD,EAAMgB,aACNhB,EAAMgB,YAAa,GAEvB,EAAKhB,MAAQA,EACb,EAAK7J,KAAOA,EACZ,EAAKF,UAAY+J,EAAMqC,K,EA4E/B,OAzF4B,OAgBxB,YAAAiB,QAAA,SAAQC,GAAR,WACUnM,EAAKnC,KAAKmC,GACV6I,EAAM,IAAI,EAAY7I,GAAIqK,SAAStN,EAAI4N,OAAQ9M,KAAK+K,OAC1D,OAAIC,EAAYvB,EAAcuB,GAEvBsD,IAAeC,MAAK,SAAAC,GACvB,OAAO,EAAKC,YAAYtM,GAAIoM,MAAK,SAAAC,GAC7B,OAAO,EAAKzD,MAAM2D,OAAS,EAAKN,gBAAkB,EAAKxE,kBAE5D+E,OAAM,SAAA3D,GAEL,OADA,EAAK9J,KAAKmF,mBACHoD,EAAcuB,OAIrB,YAAAyD,YAAR,SAAoBtM,GAApB,IAEQyM,EACAC,EAeMC,EAlBd,OAKU/D,EAAQ/K,KAAK+K,MAgCnB,OA9BI6D,EADA7D,EAAM2D,OACS,SAAC1Q,GACZ,EAAKoQ,gBAAgBxN,KAAK5C,IAKf,SAACA,KACV,EAAK4L,aAILkF,EAAY/D,EAAMgE,OAAS,MAAQ,MAD7CF,EAEQ9D,EAAMM,SAAW,EAAKxB,UACf,SAAC7L,GAGJ,OAFW,EAAKkD,KAAKoE,IAAIC,YAAYwF,EAAMqC,KAAM/N,EAASgG,WACnC9D,YAAYwJ,EAAMqC,MACtB0B,GAAW9Q,KAGjC,EAAK6L,WACN,EAAK3I,KAAKE,kBACN,CAAC2J,EAAMqC,KAAM,EAAWpM,YAGhC,EAAKO,YAAc,EAAKL,KAAKK,YAAY,EAAKP,WACvC,SAAChD,GACJ,OAAO,EAAKuD,YAAYuN,GAAW9Q,KAIpCsL,EACHyB,EAAME,OAAO3I,KAAI,SAACtE,GACd,OAAO2B,GAAQ,SAAC6B,EAAKC,GACjB,IAAMuN,EAAYH,EAAU7Q,GAC5BgR,EAAUnN,QAAU,SAACmJ,GACbD,EAAMM,OACN7J,IAEAC,EAAIuJ,IAGZgE,EAAUpN,UAAY,WAClBgN,EAAa5Q,GACbwD,YAId+M,MAAK,WACH,EAAWtN,IAAI,EAAWiB,SAAUC,EAAI,EAAKjB,UAGzD,EAzFA,CAA4B,GCPf+N,OAA2C,IAAvBC,KAAaC,OAA6D,oBAA7BC,yBACjEC,ECH2B,WACpC,IAKI,GAJKvI,YACDA,UAAaoI,KAAaI,cACrBJ,KAAaK,iBAAoBL,KAAaM,cAEnD1I,UAOA,OAAO,EANP2I,eAAiBA,gBACZP,KAAaQ,sBAAyBR,KAAaS,iBACvDT,KAAaxJ,YAAewJ,KAAaxJ,aACrCwJ,KAAaU,mBAAsBV,KAAaW,cAK3D,MAAO5F,GACL,OAAO,EAEX,OAAO,EDfqB6F,GEHnBC,EAAU,SAAC/R,GACpB,OAAOP,OAAOmQ,KAAK5P,ICDVuM,EAAU,SAACvM,GACpB,OAAOsM,MAAMC,QAAQvM,ICCZgS,EAAY,SAAChS,GACtB,OAAO+R,EAAQ/R,GAAOqL,QCHb4G,EAAoB,SAACjS,GAC9B,IAAK,IAAMM,KAAON,EACd,OAAOM,GCAf,2BA4EA,OArEI,YAAA4R,gBAAA,SAAgBC,EAAgBnS,GAC5BgC,KAAKoQ,WAAaD,EAClBnQ,KAAKkM,SAASlO,IAGlB,YAAAqS,iBAAA,SAAiBF,EAAoD/P,GAGjE,OAFAJ,KAAKoQ,WAAaD,EAClBnQ,KAAKC,UAAUG,GACRJ,MAGX,YAAAC,UAAA,SAAUG,GAIN,OAHAJ,KAAKsQ,YAAclQ,EACnBJ,KAAKuQ,iBAAmBvQ,KAAKoQ,WAAWpQ,KAAKsQ,aAC7CtQ,KAAKwQ,QAAUxQ,KAAKuQ,iBAAiBlH,OAC9BrJ,MAGX,YAAAkM,SAAA,SAASlO,GAEL,OADAgC,KAAKhC,MAAQA,EACNgC,MAGX,YAAAyQ,SAAA,WACI,IAAK,IAAI1T,EAAI,EAAGA,EAAIiD,KAAKwQ,QAASzT,IAC9B,IAAkD,IAA9CiD,KAAK0Q,WAAW1Q,KAAKuQ,iBAAiBxT,IACtC,OAAOiD,KAAKuQ,iBAAiBxT,GAAGwR,KAGxC,IAAMoC,EAAW3Q,KAAKuQ,iBAAiBvQ,KAAKwQ,QAAU,GAAGjC,KACzD,OAAmB,MAAZoC,EAAmB3Q,KAAKhC,MAAMgC,KAAKsQ,aAAeK,GAGrD,YAAAD,WAAR,SAAmBE,GACf,IAAIC,EACJ,IAAKA,KAAeD,EAAM,CACtB,OAAQC,GACJ,KAAKzR,EAAa0G,YACd,GAAI9F,KAAKhC,MAAMgC,KAAKsQ,aAAeM,EAAKC,GACpC,OAAO,EACT,MACN,KAAKzR,EAAa0R,MACd,GAAI9Q,KAAKhC,MAAMgC,KAAKsQ,eAAiBM,EAAKC,GACtC,OAAO,EACT,MACN,KAAKzR,EAAa6G,SACd,GAAIjG,KAAKhC,MAAMgC,KAAKsQ,aAAeM,EAAKC,GACpC,OAAO,EACT,MACN,KAAKzR,EAAa4G,mBACd,GAAIhG,KAAKhC,MAAMgC,KAAKsQ,cAAgBM,EAAKC,GACrC,OAAO,EACT,MACN,KAAKzR,EAAa+G,gBACd,GAAInG,KAAKhC,MAAMgC,KAAKsQ,cAAgBM,EAAKC,GACrC,OAAO,EACT,MACN,KAAKzR,EAAayO,WACd,GAAI7N,KAAKhC,MAAMgC,KAAKsQ,eAAiBM,EAAKC,GACtC,OAAO,EACT,MACN,KAAKzR,EAAaqG,QACd,GAAIzF,KAAKhC,MAAMgC,KAAKsQ,aAAeM,EAAKC,GAAajL,KAAO5F,KAAKhC,MAAMgC,KAAKsQ,aAAeM,EAAKC,GAAahL,KACzG,OAAO,EAGnB,OAAO,IAGnB,EA5EA,GC4CMkL,EAAsB,SAAwBC,GAAxB,IAEpBC,EAFoB,OACpBC,GAAgB,EAEpB,OAAO,SAACjK,IACJgK,EAAUhK,EAAUC,OAAOnF,QAEnBmP,GAAiB,EAAKpH,QAAQT,SAAW,EAAK8H,aAC9C,EAAKC,WAAWH,EAAOjT,OACvBiT,EAAOI,aAGPH,GAAgB,EAChBD,EAAOK,QAAQ,EAAKC,aAGxBP,MAKNQ,EAAc,SAAwBR,GAAxB,IAEZC,EAFY,OACZC,GAAgB,EAEpB,OAAO,SAACjK,IACJgK,EAAShK,EAAEC,OAAOnF,QAEVmP,GACA,EAAKE,WAAWH,EAAOjT,OACvBiT,EAAOI,aAGPH,GAAgB,EAChBD,EAAOK,QAAQ,EAAKC,aAGxBP,MAKNS,EAAgB,SAAwBT,GAAxB,IACdC,EADc,OAElB,OAAO,SAAChK,IACJgK,EAAShK,EAAEC,OAAOnF,SAEd,EAAKqP,WAAWH,EAAOjT,OACtBiT,EAAeI,YAGhBL,MAKNU,EAAe,SAAwBV,GAAxB,IACbC,EADa,OAEjB,OAAO,SAAChK,IACJgK,EAAShK,EAAEC,OAAOnF,SACJ,EAAK+H,QAAQT,SAAW,EAAK8H,aACvC,EAAKC,WAAWH,EAAOjT,OACvBiT,EAAOI,YAEPL,MC5GCW,EAAc,SAAC3T,GACxB,OAAOA,EAAM4T,QAAQ,MAAO,KC4B1BC,EAAqB,SAAwBC,GAC/C,IAAIzR,EACJ,GAAuB,MAAnBL,KAAK+K,MAAMgH,KACX1R,EAASL,KAAK+J,cAAc+H,OAE3B,CACD,IAAME,EAAgBL,EAAYG,GAAaG,MAAM,KACrDH,EAAcE,EAAc,GAC5B3R,EAASL,KAAK+J,cAAc+H,EAAaE,EAAc,IAE3D,GAAc,MAAV3R,EAAgB,CAChB,IAAM6R,EAAuBlS,KAAK8J,QAAQ,GAAGgI,GAC7C,GAAII,EACA,MAAO,CACHxG,SAAUtB,EAAY8H,GACtB5U,KAAMwU,GAGd,MAAM,IAAI,EAAU/S,EAAWgF,eAC3B,CAAE1D,OAAQyR,EAAaK,SAAS,IAIxC,OAAO9R,GAGL+R,EAAuB,SAACC,EAAWC,GACrC,OAAOA,EAAEC,cAAcF,IAGrBG,EAAsB,SAACH,EAAWC,GACpC,OAAOD,EAAEE,cAAcD,IAGrBG,EAAwB,SAACJ,EAAWC,GACtC,OAAO,IAAII,OAAOJ,GAAGC,cAAcF,IAGjCM,EAAuB,SAACN,EAAGC,GAC7B,OAAO,IAAII,OAAOL,GAAGE,cAAcD,IAGjCM,EAAuB,SAACP,EAAWC,GACrC,OAAOA,EAAID,GAGTQ,EAAsB,SAACR,EAAWC,GACpC,OAAOD,EAAIC,GAGTQ,EAAqB,SAACT,EAASC,GACjC,OAAOA,EAAES,UAAYV,EAAEU,WAGrBC,EAAoB,SAACX,EAASC,GAChC,OAAOD,EAAEU,UAAYT,EAAES,WAGrBE,EAAgB,SAAwBC,EAAQC,EAAQhD,GAC1D,IAAK,IAAM/P,KAAc+P,EAAW,CAChCnQ,KAAKoT,cAAclD,gBAAgBC,EAAW+C,GAC9C,IAAMG,EAAUrT,KAAKoT,cAAcnT,UAAUG,GAAYqQ,WACzDzQ,KAAKoT,cAAclD,gBAAgBC,EAAWgD,GAC9C,IAAMG,EAAUtT,KAAKoT,cAAcnT,UAAUG,GAAYqQ,WACzD,cAAeyC,EAAOG,IAClB,KAAKpU,EAAUyT,OACX,OAAON,EAAqBc,EAAOG,GAAUF,EAAOG,IACxD,QACI,OAAOV,EAAqBM,EAAOG,GAAUF,EAAOG,OAK9DC,GAAe,SAAwBL,EAAQC,EAAQhD,GACzD,IAAK,IAAM/P,KAAc+P,EAAW,CAChCnQ,KAAKoT,cAAclD,gBAAgBC,EAAW+C,GAC9C,IAAMG,EAAUrT,KAAKoT,cAAcnT,UAAUG,GAAYqQ,WACzDzQ,KAAKoT,cAAclD,gBAAgBC,EAAWgD,GAC9C,IAAMG,EAAUtT,KAAKoT,cAAcnT,UAAUG,GAAYqQ,WACzD,cAAeyC,EAAOG,IAClB,KAAKpU,EAAUyT,OACX,OAAOF,EAAoBU,EAAOG,GAAUF,EAAOG,IACvD,QACI,OAAOT,EAAoBK,EAAOG,GAAUF,EAAOG,OAK7DE,GAAoB,SAACnT,EAAiBoT,GACxC,OAAQpT,EAAOqL,UACX,KAAKzM,EAAUyT,OACX,MAAsB,QAAfe,EAAM/Q,KAAiB8P,EAAsBJ,EACxD,KAAKnT,EAAU2M,OACX,MAAsB,QAAf6H,EAAM/Q,KAAiBmQ,EAAsBD,EACxD,KAAK3T,EAAUwL,SACX,MAAsB,QAAfgJ,EAAM/Q,KAAiBsQ,EAAoBF,EACtD,QACI,MAAsB,QAAfW,EAAM/Q,KAAiBiQ,EAAuBF,IAK3DiB,GAAW,SAAwBD,G,MAAxB,OACbA,EAAM/Q,KAAOiR,GAAcF,EAAM/Q,MACjC,IAAIoP,EAAc2B,EAAMG,GACxB,GAAmB,MAAf9B,UAA8BA,IAAgB7S,EAAUxB,OACrC,QAAfgW,EAAM/Q,KACN1C,KAAK8J,QAAQ+J,MAAK,SAACxB,EAAGC,GAClB,OAAOiB,GAAarW,KAAK,EAAMmV,EAAGC,EAAGR,MAIzC9R,KAAK8J,QAAQ+J,MAAK,SAACxB,EAAGC,GAClB,OAAOW,EAAc/V,KAAK,EAAMmV,EAAGC,EAAGR,UAI7C,CACD,IAAMgC,EAAajC,EAAmB3U,KAAK8C,KAAM8R,GACjD,GAAkB,MAAdgC,EAAoB,CACpB,IAAM,EAAcN,GAAkBM,EAAYL,GAClD3B,EAAcgC,EAAWxW,KACP,MAAdmW,EAAMM,KACN/T,KAAK8J,QAAQ+J,MAAK,SAACxB,EAAGC,GAClB,OAAO,EAAYD,EAAEP,GAAwBQ,EAAER,QAInD9R,KAAKoT,cAAc/C,mBAAgB,MAAIyB,GAAwB2B,EAAMM,KAAI,GAAIjC,GAC7E9R,KAAK8J,QAAQ+J,MAAK,SAACxB,EAAGC,GAClB,OAAO,EACH,EAAKc,cAAclH,SAASmG,GAAG5B,WAC/B,EAAK2C,cAAclH,SAASoG,GAAG7B,mBASjDkD,GAAgB,SAACjR,GACnB,OAAe,MAARA,EAAe,MAAQA,EAAKsR,eCxIjCC,GAA+B,SAAwBC,GAAxB,WAC7BhD,GAAgB,EACpB,OAAO,SAACjK,GACJ,IAAMgK,EAA6BhK,EAAEC,OAAOnF,OAC5C,GAAIkP,EACA,GAAIC,GAAiB,EAAKpH,QAAQT,SAAW,EAAK8H,YAAa,CAC3D,IAAMnT,EAAQiT,EAAOjT,MACjB,EAAKmW,eAAenW,IACpB,EAAKoT,WAAWpT,GAEpBiT,EAAOI,gBAGPH,GAAgB,EAChBD,EAAOK,QAAQ,EAAKC,iBAIxB2C,MAKNE,GAAuB,SAAwBF,GAAxB,WACrBhD,GAAgB,EACpB,OAAO,SAACjK,GACJ,IAAMgK,EAAShK,EAAEC,OAAOnF,OACxB,GAAIkP,EACA,GAAIC,EAAe,CACf,IAAMlT,EAAQiT,EAAOjT,MACjB,EAAKmW,eAAenW,IACpB,EAAKoT,WAAWpT,GAEpBiT,EAAOI,gBAGPH,GAAgB,EAChBD,EAAOK,QAAQ,EAAKC,iBAIxB2C,MAKNG,GAAwB,SAAwBH,GAAxB,WAC1B,OAAO,SAACjN,GACJ,IAAMgK,EAAShK,EAAEC,OAAOnF,OACxB,GAAIkP,GAAU,EAAKnH,QAAQT,SAAW,EAAK8H,YAAa,CACpD,IAAMnT,EAAQiT,EAAOjT,MACjB,EAAKmW,eAAenW,IACpB,EAAKoT,WAAWpT,GAEpBiT,EAAOI,gBAGP6C,MAMNI,GAAyB,SAAwBJ,GAAxB,WAC3B,OAAO,SAACjN,GACJ,IAAMgK,EAA6BhK,EAAEC,OAAOnF,OAC5C,GAAIkP,EAAQ,CACR,IAAMjT,EAAQiT,EAAOjT,MACjB,EAAKmW,eAAenW,IACpB,EAAKoT,WAAWpT,GAEpBiT,EAAOI,gBAGP6C,MC3GCK,GAA6B,SAACC,GACvC,IACIC,EACAC,EAFEC,EAAeH,EAAevC,MAAM,KAW1C,OARI0C,EAAa,IACbF,EAAcE,EAAa,GAC3BD,EAAYC,EAAatL,OAAS,EAAI/J,EAAUsV,IAAMtV,EAAUuV,OAGhEJ,EAAcE,EAAa,GAC3BD,EAAYpV,EAAUwV,OAElBJ,GACJ,KAAKpV,EAAUwV,MACX,OAAO,IAAIC,OAAO,IAAIN,EAAe,KACzC,KAAKnV,EAAUuV,KACX,OAAO,IAAIE,OAAUN,EAAW,IAAK,KACzC,QACI,OAAO,IAAIM,OAAO,GAAGN,EAAe,OClB1C,GAAW,SAACzW,GACd,MAA8B,WAAvBoM,EAAYpM,MAAyBA,aAAiB+W,SAGpDC,GAAQ,SAACvS,GAClB,GAAI,GAASA,GAAM,CACf,IAAMwS,EAAO,GACb,IAAK,IAAMlY,KAAK0F,EACZwS,EAAKlY,GAAe,MAAV0F,EAAI1F,IAAc,GAAS0F,EAAI1F,IAAMiY,GAAMvS,EAAI1F,IAAM0F,EAAI1F,GAEvE,OAAOkY,EAEX,OAAOxS,GCXEyS,GAAU,SAAClX,EAAOmX,EAAcC,GACzC,IAAMC,EAAQjL,EAAYpM,GAG1B,GAAIqX,IAFUjL,EAAY+K,GAEL,OAAO,EAK5B,OAJIE,IAAUpW,EAAUwL,WACpBzM,EAAQA,EAAM+U,UACdoC,EAAeA,EAAapC,WAExBqC,GAEJ,KAAKhW,EAAa0G,YACd,OAAO9H,EAAQmX,EAEnB,KAAK/V,EAAa6G,SACd,OAAOjI,EAAQmX,EAEnB,KAAK/V,EAAa+G,gBACd,OAAOnI,GAASmX,EAEpB,KAAK/V,EAAa4G,mBACd,OAAOhI,GAASmX,EAEpB,KAAK/V,EAAayO,WACd,OAAO7P,IAAUmX,EACrB,QACI,OAAOnX,IAAUmX,ICpB7B,cAIE,WAAY7H,EAAegI,GACzBtV,KAAKsN,MAAQ0H,GAAM1H,GACnBtN,KAAKsV,UAAYA,EAyErB,OAtEE,YAAAtT,OAAA,SAAOuT,GACL,IAAMC,EAAOD,EAAME,aACLF,EAAMG,QAAO,SAACC,EAAMC,GAAS,OAAAD,GAAQA,EAAKC,KAAO5V,KAAKsN,OACvDkI,IAGf,YAAAvJ,MAAA,SAAM4J,GACJ,IAAI5S,GAAS,EACb,IAAKjD,KAAKsV,UAAW,OAAOrS,EAC5B,IAAK,IAAI7C,KAAcJ,KAAKsN,MAAO,CACjC,IAAKrK,EACH,OAAOA,EAET,IAAM6S,EAAmB9V,KAAKsN,MAAMlN,GAC9BuL,EAAckK,EAASzV,GAC7B,GAAsC,WAAlCgK,EAAY0L,GACd,IAAK,IAAMxX,KAAOwX,EAAkB,CAClC,IAAK7S,EACH,OAAOA,EAET,OAAQ3E,GACN,KAAKc,EAAa2W,GAChB9S,EAASjD,KAAKgW,QAAQ5V,EAAYuL,GAClC,MACF,KAAKvM,EAAa6W,KAChBhT,EAASjD,KAAKkW,WAAW9V,EAAYuL,GACrC,MACF,KAAKvM,EAAa+W,MAChBlT,EAASjD,KAAKoW,WAAWhW,EAAYuL,GACrC,MACF,KAAKvM,EAAaqG,QAClB,KAAKrG,EAAa0G,YAClB,KAAK1G,EAAa6G,SAClB,KAAK7G,EAAa4G,mBAClB,KAAK5G,EAAa+G,gBAClB,KAAK/G,EAAayO,WAChB5K,EAASjD,KAAKqW,oBAAoBjW,EAAYuL,EAAarN,GAC3D,MACF,QACE2E,GAAS,QAKfA,EAASiS,GAAQY,EAAkBnK,GAGvC,OAAO1I,GAGD,YAAA+S,QAAR,SAAgB3V,EAAQrC,GACtB,OAAsF,MAA9EgC,KAAKsN,MAAMjN,GAAQjB,EAAa2W,IAAchN,MAAK,SAAApI,GAAK,OAAAuU,GAAQvU,EAAG3C,OAGrE,YAAAkY,WAAR,SAAmB7V,EAAQrC,GACzB,OAAOuW,GAA2BvU,KAAKsN,MAAMjN,GAAQjB,EAAa6W,OAAOK,KAAKtY,IAGxE,YAAAoY,WAAR,SAAmB/V,EAAQrC,GACzB,OAAOgC,KAAKsN,MAAMjN,GAAQjB,EAAa+W,OAAOG,KAAKtY,IAG7C,YAAAqY,oBAAR,SAA4BhW,EAAQrC,EAAOoX,GACzC,IAAMD,EAAenV,KAAKsN,MAAMjN,GAAQ+U,GACxC,OAAIA,GAAUhW,EAAaqG,QAClByP,GAAQlX,EAAOmX,EAAcC,GAE/BF,GAAQlX,EAAOmX,EAAavP,IAAK,OACtCsP,GAAQlX,EAAOmX,EAAatP,KAAM,OAExC,EA/EA,G,0dCAA,0E,OAMI,EAAA0Q,0BAA2B,EAC3B,EAAAC,yBAA0B,E,EA2D9B,OAlE+B,QAcjB,YAAAC,eAAV,WACI,IAAM1L,EAAQ/K,KAAK+K,MACb2L,EAAczG,EAAkBlF,EAAMuC,OAC5C,IAAItN,KAAKuB,YAAYmG,WAAWC,SAAS+O,GAsCpC,CACD,IAAMrW,EAASL,KAAK+J,cAAc2M,GAC5BrT,EACF,IAAI,EADgB,MAAVhD,EACItB,EAAWgF,eACXhF,EAAWiF,gBADgB,CAAE3D,OAAQqW,IAEvD,OAAOjN,EACHpG,GA3CJ,IAAMrF,EAAQ+M,EAAMuC,MAAMoJ,GAC1B,GAA2B,WAAvBtM,EAAYpM,GA6BX,CACKsX,EAAYtF,EAAUjF,EAAMuC,OAAS,EAG3C,OAFAtN,KAAK2W,qBAAuB,IAAI,GAAa5L,EAAMuC,MAAOgI,GAC1DtV,KAAK2W,qBAAqB3U,OAAO,CAAC0U,IAC3B1W,KAAK4W,kBAAkBF,EAAa1Y,EAAO,KAAM,QAhCxD,IAAMsX,EAAYtF,EAAUhS,GAAS,GACjCgS,EAAUjF,EAAMuC,OAAS,EAE7BtN,KAAK2W,qBAAuB,IAAI,GAAa5L,EAAMuC,MAAOgI,GAC1D,IAAMhX,EAAM2R,EAAkBjS,GAE9B,OADAgC,KAAK2W,qBAAqB3U,OAAO,CAAC0U,EAAapY,IACvCA,GACJ,KAAKc,EAAa6W,KACd,IAAMY,EAAWtC,GAA2BvW,EAAMoB,EAAa6W,OAC/D,OAAOjW,KAAK8W,kBAAkBJ,EAAaG,GAE/C,KAAKzX,EAAa+W,MACd,OAAOnW,KAAK8W,kBAAkBJ,EAAa1Y,EAAMoB,EAAa+W,QAClE,KAAK/W,EAAa2W,GACd,OAAO/V,KAAK+W,eACRL,EAAa1Y,EAAMoB,EAAa2W,KAExC,KAAK3W,EAAaqG,QAClB,KAAKrG,EAAa0G,YAClB,KAAK1G,EAAa6G,SAClB,KAAK7G,EAAa4G,mBAClB,KAAK5G,EAAa+G,gBACd,OAAOnG,KAAK4W,kBAAkBF,EAAa1Y,EAAOM,EAAK,QAC3D,KAAKc,EAAa4X,UAAW,MAC7B,QACI,OAAOhX,KAAK4W,kBAAkBF,EAAa1Y,EAAO,KAAM,UAqBhF,EAlEA,CAA+B,GCqCzBiZ,GAA4B,SAAwB/C,EAAUgD,GAAlC,WAC9B,OAAO,SAACjQ,GACJ,IAAMgK,EAA6BhK,EAAEC,OAAOnF,OAC5C,GAAI,EAAK+H,QAAQT,SAAW,EAAK8H,aAAeF,EAAQ,CACpD,IAAMjT,EAAQiT,EAAOjT,MACjB,EAAKmW,eAAenW,IACpBkZ,EAAWlZ,GAEfiT,EAAOI,gBAGP6C,MAKNiD,GAAoB,SAAwBjD,EAAUgD,GAAlC,WAEtB,OAAO,SAACjQ,GACJ,IAAMgK,EAA6BhK,EAAEC,OAAOnF,OAC5C,GAAIkP,EAAQ,CACR,IAAMjT,EAAQiT,EAAOjT,MACjB,EAAKmW,eAAenW,IACpBkZ,EAAWlZ,GAEfiT,EAAOI,gBAGP6C,MAsBNkD,GAAsB,SAAwBlD,GAAxB,WACxB,OAAO,SAACjN,GACJ,IAAMgK,EAA6BhK,EAAEC,OAAOnF,OAC5C,GAAIkP,EAAQ,CACR,IAAMjT,EAAQiT,EAAOjT,MACjB,EAAKmW,eAAenW,IACpB,EAAKoT,WAAWpT,GAEpBiT,EAAOI,gBAGP6C,MC9DNmD,GAA+B,SAAwBnD,EAAUgD,GAAlC,WACjC,OAAO,SAACjQ,GACJ,IAAMgK,EAAShK,EAAEC,OAAOnF,OACpB,EAAK+H,QAAQT,SAAW,EAAK8H,aAAeF,GACxC,EAAKkD,eAAelD,IACpBiG,EAAWjG,EAAOjT,OAEtBiT,EAAOI,YAEP6C,MAKNoD,GAAuB,SAAwBpD,EAAUgD,GAAlC,WACzB,OAAO,SAACjQ,GACJ,IAAMgK,EAAShK,EAAEC,OAAOnF,OACpBkP,GACI,EAAKkD,eAAelD,IACpBiG,EAAYjG,EAAY,OAE5BA,EAAOI,YAEP6C,MAKNqD,GAAwB,SAAwBrD,GAAxB,WAC1B,OAAO,SAACjN,GACJ,IAAMgK,EAAShK,EAAEC,OAAOnF,OACpB,EAAK+H,QAAQT,SAAW,EAAK8H,aAAeF,GACxC,EAAKkD,eAAelD,IACpB,EAAKG,WAAWH,EAAOjT,OAE3BiT,EAAOI,YAEP6C,MAKNsD,GAAyB,SAAwBtD,GAAxB,WAC3B,OAAO,SAACjN,GACJ,IAAMgK,EAAShK,EAAEC,OAAOnF,OACpBkP,GACI,EAAKkD,eAAelD,IACpB,EAAKG,WAAWH,EAAOjT,OAE3BiT,EAAOI,YAEP6C,M,iNCnFZ,cAQI,WAAYuD,GANJ,KAAAC,gBAAuC,GACvC,KAAAC,wBAA0B,EAClC,KAAAC,cAAgB,GAChB,KAAA9N,QAAU,GAIN9J,KAAKyX,OAASA,EAyRtB,OAtRI,sBAAI,oBAAK,C,IAAT,WACI,OAAOzX,KAAKyX,OAAO1M,O,gCAGvB,YAAA8M,SAAA,SAASva,GACL,OAAO0C,KAAKyX,OAAO5X,MAAMvC,IAGrB,YAAAwa,cAAR,SAAsB/M,GAElB,OAAO,IAAI,GAAOA,EAAO/K,KAAKyX,OAAOvW,MACjCmN,WAGR,YAAAA,QAAA,sBACUtD,EAAQ/K,KAAK+K,MACnB/K,KAAK0X,gBAAkBtN,EAAYW,EAAMgH,QAAU9S,EAAUxB,OACzD,CAACsN,EAAMgH,MAA6BhH,EAAMgH,KAI9C,IAFA,IAAM/Q,EAAY+J,EAAM0C,KAClBsK,EAAgB,CAAC/W,GACdjE,EAAI,EAAG,EAASiD,KAAK0X,gBAAgBrO,OAAQtM,EAAI,EAAQA,IAAK,CACnE,IAAMmM,EAAOlJ,KAAK0X,gBAAgB3a,GAC9Bib,EAAchY,KAAKiY,kBAAkB/O,EAAKgP,IAE1ChP,EAAKiP,OAASH,EAAYI,OAAOvY,QACjCmY,EAAc,CACVI,OAAQJ,EAAYK,OACpBA,OAAQL,EAAYI,SAI5B,IAAMpN,EAAMhL,KAAKsY,gBAAgBN,EAAa9O,GAC9C,GAAI8B,EACA,OAAOvB,EAAcuB,GAEzBhL,KAAK0X,gBAAgB3a,GAAGwb,cAAgBP,EACxCD,EAAcnX,KAAKsI,EAAKiP,MAO5B,OAJKnY,KAAKyX,OAAO5N,WACb7J,KAAKyX,OAAOvW,KAAKE,kBAAkB2W,GAGhC/X,KAAK8X,cAAc,CACtBrK,KAAMzM,EACNsM,MAAOvC,EAAMuC,MACbyG,KAAMhJ,EAAMgJ,KACZyE,QAASzN,EAAMyN,UAChBjK,MAAK,SAAAzE,GAOJ,OANA,EAAKA,QAAUA,EAAQxH,KAAI,SAAC4G,G,MACxB,OAAO,EAAP,IACK,EAAKyO,yBAA0BzO,E,KAGxC,EAAK0O,cAAchX,KAAKI,GACjB,EAAKyX,+BAIZ,YAAAC,qBAAR,sBAEI,GAAI1Y,KAAK8J,QAAQT,OAAS,EAEtB,IACI,IAAI,EAAU,GAER,EADS5L,OAAOmQ,KAAK5N,KAAK8J,QAAQ,IACZT,OACtB,EAAe,SAAC0B,EAAmB/M,GACrC,GAAgB,MAAZ+M,EAAM4N,GACN,IAAK,IAAMra,KAAOyM,EAAM4N,QACkB9M,IAAlC7N,EAAO+M,EAAM4N,GAAWra,MACxBN,EAAO+M,EAAM4N,GAAWra,IAAQN,EAAMM,UAC/BN,EAAMM,IAIzB,OAAON,GAEXgC,KAAK8J,QAAQxB,SAAQ,SAACvG,GAElB,IADA,IAAI6W,EAAO7W,EAAO,GACThF,EAAI,EAAGA,EAAI,EAAcA,IAAK,CACnC,IAAMgO,EAAQ,EAAK2M,gBAAgB3a,EAAI,GACvC6b,EAAO,GAAH,MAAQA,GAAS,EAAa7N,EAAOhJ,EAAOhF,KAEpD,EAAQ6D,KAAKgY,MAEjB5Y,KAAKyX,OAAgB,QAAI,EACzBzX,KAAKyX,OAAOoB,kCACZ7Y,KAAKyX,OAAO1M,MAAMyN,QAAU,KAYxBxY,KAAKyX,OAAOqB,iBAcZ9Y,KAAKyX,OAAOsB,2BAGpB,MAAO9O,GACH,OAAOR,EACH,IAAI,EAAU1K,EAAW2F,iBAAkBuF,EAAGpH,YAOtD,YAAA4V,yBAAR,sBACUO,EAAYhZ,KAAK0X,gBAAgB1X,KAAK2X,yBAC5C,IAAIqB,EAsBA,OAAOhZ,KAAK0Y,uBArBZ,IACI,IAAI,EAAcM,EAAUT,cAC5B,OAAOvY,KAAK8X,cAAc,CACtBrK,KAAMuL,EAAUb,KAChB7K,MAAO0L,EAAU1L,MACjByG,KAAMiF,EAAUjF,KAChByE,QAASQ,EAAUR,UACpBjK,MAAK,SAAAzE,GAIJ,OAHA,EAAKmP,WAAWD,EAAUtW,KAAM,EAAaoH,GAC7C,EAAK8N,cAAchX,KAAK,EAAYyX,OAAOxY,SACzC,EAAK8X,wBACA,EAAKc,8BAGpB,MAAOxO,GACH,OAAOR,EACH,IAAI,EAAU1K,EAAW2F,iBAAkBuF,EAAGpH,YAStD,YAAAoW,WAAR,SAAmBC,EAAkBlB,EAA4BmB,GAAjE,IAoBYC,EACAC,EAFAnR,EAGEoR,EAtBd,OAEUxP,EAAU,GACVuJ,EAAU2E,EAAYI,OAAO/X,OAC7BiT,EAAU0E,EAAYK,OAAOhY,OAC7BkZ,EAAcvZ,KAAK4X,cAAclX,QAAQsX,EAAYI,OAAOvY,OAC5D2Z,EAAcxZ,KAAK2X,wBAA0B,EA+CnD,OAAQuB,GACJ,IAAK,OAnCDhR,EAAQ,EAGNoR,EAAqB,GAC3B,EAAKzB,SAASG,EAAYK,OAAOxY,OAAOC,QAAQwI,SAAQ,SAAAmR,GACpDH,EAAmBG,EAAInc,MAAQ,QAEnC,EAAKwM,QAAQxB,SAAQ,SAACoR,GAClBN,EAA8B,GAE1BC,EADgB,IAAhBG,EACW,SAAUG,GACbD,EAAoBH,GAAalG,KAAasG,EAAqBrG,IACnE8F,EAA4BxY,KAAK+Y,IAK9B,SAAUA,GACjB,IAAM3b,EAAQ0b,EAAoBH,GACrB,MAATvb,GAAiBA,EAAMqV,KAAasG,EAAqBrG,IACzD8F,EAA4BxY,KAAK+Y,IAI7CR,EAAgB7Q,QAAQ+Q,GACmB,IAAvCD,EAA4B/P,SAC5B+P,EAA8B,CAACE,IAEnCF,EAA4B9Q,SAAQ,SAAUtK,GAC1C8L,EAAQ5B,GAAS,GAAH,GAAQwR,GACtB5P,EAAQ5B,KAASsR,GAAexb,QAMjB,MACvB,SAjDqB,WACrB,IAAIkK,EAAQ,EACZ,EAAK4B,QAAQxB,SAAQ,SAAAoR,GACjBP,EAAgB7Q,SAAQ,SAACqR,GACjBD,EAAoBH,GAAalG,KAAasG,EAAqBrG,KACnExJ,EAAQ5B,GAAS,GAAH,GAAQwR,GACtB5P,EAAQ5B,KAASsR,GAAeG,SA4CxCC,GAER5Z,KAAK8J,QAAUA,GAGX,YAAAmO,kBAAR,SAA0B4B,GAEtB,IAAMC,GADND,EAASlI,EAAYkI,IACS5H,MAAM,KAC9B8H,EAA2BD,EAAe,GAAG7H,MAAM,KACnD+H,EAA4BF,EAAe,GAAG7H,MAAM,KAW1D,MAVa,CACTmG,OAAQ,CACJvY,MAAOka,EAAyB,GAChC1Z,OAAQ0Z,EAAyB,IAErC1B,OAAQ,CACJxY,MAAOma,EAA0B,GACjC3Z,OAAQ2Z,EAA0B,MAMtC,YAAA1B,gBAAR,SAAwBN,EAA4B7O,GAChD,IAII6B,EAJEoN,EAASJ,EAAYI,OACrBC,EAASL,EAAYK,OACrB4B,EAAwBja,KAAK6X,SAASO,EAAOvY,OAC7Cqa,EAAwBla,KAAK6X,SAASQ,EAAOxY,OAqCnD,OAjCIsJ,EAAIgP,OAASE,EAAOxY,QACpBmL,EAAM,IAAI,EAAUjM,EAAW2F,iBAC3B,2CAMiE,MAArEuV,EAAsBna,QAAQiJ,MAAK,SAAApI,GAAK,OAAAA,EAAErD,OAAS8a,EAAO/X,UAC1D2K,EAAM,IAAI,EAAUjM,EAAW2F,iBAC3B,UAAU0T,EAAO/X,OAAM,4BAA4B+X,EAAOvY,OAGY,MAArEqa,EAAsBpa,QAAQiJ,MAAK,SAAApI,GAAK,OAAAA,EAAErD,OAAS+a,EAAOhY,YAC/D2K,EAAM,IAAI,EAAUjM,EAAW2F,iBAC3B,UAAU2T,EAAOhY,OAAM,4BAA4BgY,EAAOxY,QAKpD,MAAVsJ,EAAIwP,KACJxP,EAAIwP,GAAK,IAEbsB,EAAsBna,QAAQqL,OAAM,SAAU9K,GAC1C,IAAM8Z,EAAcD,EAAsBpa,QAAQiJ,MAAK,SAAApI,GAAK,OAAAA,EAAErD,OAAS+C,EAAO/C,MAAQqD,EAAErD,OAAS8a,EAAO/X,UACxG,OAAmB,MAAf8Z,GAAmD,MAA5BhR,EAAIwP,GAAGwB,EAAY7c,QAC1C0N,EAAM,IAAI,EAAUjM,EAAW2F,iBAC3B,UAAUrE,EAAO/C,KAAI,wBAAwB8a,EAAOvY,MAAK,MAAMwY,EAAOxY,QAEnE,MAIRmL,GAEf,EAlSA,G,8vBCGA,eA6BI,WAAYD,EAAqB7J,GAAjC,MACI,cAAO,K,OA7BX,EAAAkZ,QAAS,EAST,EAAAC,YAAa,EAIH,EAAAjH,cAAgB,IAAI,EA0KtB,EAAAkH,cAAgB,WACpB,GAAI,EAAKxQ,QAAQT,OAAS,EAAG,CAGzB,GAAI,EAAK0B,MAAMyN,QAAS,CACpB,IAAM,EAAe,GACf,EAAgB,GACtB,EAAKzN,MAAMyN,QAAQlQ,SAAQ,SAAAjI,GACvB,EAAKyJ,QAAQxB,SAAQ,SAACsQ,EAAM7b,GACxB6b,EAAKvY,GAAQiI,SAAQ,SAAAY,G,MACjB,EAAatI,KAAK,SACTgY,KAAI,MAAQvY,GAAS6I,EAAI,QAGtC,EAAcnM,IAAK,QAG3B,IAAI,EAAe,EACnBgT,EAAQ,GAAezH,SAAQ,SAAAhK,GAC3B,EAAKwL,QAAQ1B,OAAOwD,OAAOtN,GAAO,EAAc,KAC9C,KAEN,EAAKwL,QAAU,EAAKA,QAAQyQ,OAAO,GAEvC,EAAKxB,2BACL,EAAKD,iBACD,EAAKtC,yBACL,EAAK1M,QAAQ1B,OAAO,EAAG,EAAK2C,MAAMyP,MAElC,EAAKjE,2BACL,EAAKzM,QAAU,EAAKA,QAAQ2Q,MAAM,EAAG,EAAK1P,MAAM2P,QAGxD,OAAO,EAAK5Q,SA1LZ,EAAKiB,MAAQA,EACb,EAAK7J,KAAOA,EACZ,EAAKF,UAAY+J,EAAM0C,KACvB,EAAKkN,gBACDpQ,EAAQ,EAAKQ,MAAMuC,QACnB,EAAKsN,YAAa,EAClB,EAAK/B,oCAGL,EAAKtH,WAAaxG,EAAMyP,KACxB,EAAKrJ,YAAcpG,EAAM2P,OAEzB3P,EAAM0I,QACFlJ,EAAQQ,EAAM0I,QAAU1I,EAAM0I,MAAMM,MC3DxB,iBD2DyChJ,EAAM0I,MAAMG,MACjE,EAAK7I,MAAM0I,MAAMoH,YAAa,GAElC,EAAKhC,mCAEA9N,EAAM+P,SACX,EAAKjC,kC,EA6MjB,OA/P4B,QAsDxB,YAAAxK,QAAA,SAAQ0M,GAAR,WAESA,IACDA,EAAgB,WAAM,OAAAvb,EAAe,QAEzC,IACI,IAAMwL,EAAM,IAAI,EAAYhL,KAAKmC,IAAIqK,SAAStN,EAAIwN,OAAQ1M,KAAK+K,OAC/D,OAAIC,EAAYvB,EAAcuB,GACvB+P,IAAgBxM,MAAK,SAAAC,GAkBxB,OAjBA,EAAKwM,oBACkB,MAAnB,EAAKjQ,MAAMgH,KACa,MAApB,EAAKhH,MAAMuC,MACP/C,EAAQ,EAAKQ,MAAMuC,OACT,EAAK2N,uBAGL,EAAKC,gBAIT,EAAKC,6BAIT,EAAKC,oBAEJ7M,KACX,EAAK+L,cAAc/b,KAAK,OAKpC,MAAO0L,GACH,OAAOjK,KAAKgK,YAAYC,KAIxB,YAAAgR,qBAAR,sBACIjb,KAAK4a,YAAa,EAClB,IAEsCS,EAFhC3N,EAAa1N,KAAK+K,MAAMuC,MACxBgO,EAAOtb,KAAKO,aACdgb,GAAe,EAAMC,EAAS,GAK5BC,EAAY,WACd,GAAIJ,IAAcjc,EAAasc,IAAK,EAYX,IAAjBH,EACAC,EAAS,EAAK1R,QAET0R,EAAOnS,OAAS,IAbjBsS,EAAa,GACjB,EAAK7R,QAAQxB,SAAQ,SAACY,GAPd,IAAC0S,IAQW1S,EAAKoS,GAP1BE,EAAOrT,WAAU,SAAAe,GAAQ,OAAAA,EAAKoS,KAAUM,MAAa,GAQ5CD,EAAW/a,KAAKsI,MAGxBsS,EAASG,EACTA,EAAa,WAWbH,EAAOnS,OAAS,GAChB,EAAKS,QAAU,GAAH,MAAO0R,GAAW,EAAK1R,SACnC,EAAK+R,mBACLL,EAAS,EAAK1R,SAGd0R,EAAS,EAAK1R,QAzBJ,IACN6R,EA4BZ,GADAJ,GAAe,EACX7N,EAAWrE,OAAS,EAEpB,OADA,EAAKS,QAAU,GACRgS,IAGP,EAAKhS,QAAU0R,GAIjBM,EAAkB,WAcpB,OAbA,EAAK/Q,MAAMuC,MAAQI,EAAWqO,QAC1B,EAAKhR,MAAMuC,MAAMlO,EAAa2O,KACM,IAAhCiC,EAAU,EAAKjF,MAAMuC,QACrB+N,EAAYjc,EAAa2O,GACzB,EAAKhD,MAAMuC,MAAQ,EAAKvC,MAAMuC,MAAMlO,EAAa2O,KAOrDsN,EAAYjc,EAAasc,IAEtB,EAAKR,gBAAgB3M,KAAKkN,IAErC,OAAOK,KAGH,YAAAd,iBAAR,WACShb,KAAK6J,WACN7J,KAAKkB,KAAKkE,4BAA4B,CAACpF,KAAKgB,WAAY3B,EAAS2c,UAErEhc,KAAKuB,YAAcvB,KAAKkB,KAAKK,YAAYvB,KAAKgB,YAG1C,YAAAka,cAAR,sBAOI,OANAlb,KAAKmU,eAAiB,SAACnW,GACnB,OAAO,EAAK2Y,qBAAqB1K,MAAMjO,IAEtCgC,KAAK+K,MAAMuC,MAAsB2O,IAClCjc,KAAKkc,kBAEFlc,KAAKyW,iBAAiBlI,MAAK,WAC9B,OAAO,EAAK4N,uBAIZ,YAAAA,iBAAR,WACI,GAAInc,KAAKoc,KACL,OAAOpc,KAAKqc,mBAwCZ,YAAAC,eAAR,WACItc,KAAKoc,MAAO,EACZpc,KAAK8J,QAAU9J,KAAKuc,OAAOzS,QAE3B9J,KAAKuc,OAAS,KACdvc,KAAK6b,oBAID,YAAAQ,gBAAR,WAEI,GADArc,KAAKuc,OAAOzS,QAAU,GAAH,MAAQ9J,KAAKuc,OAAOzS,SAAY9J,KAAK8J,UACnD9J,KAAK+K,MAAM2P,OAAU1a,KAAK+K,MAAM2P,MAAQ1a,KAAKuc,OAAOzS,QAAQT,OAAS,CACtErJ,KAAK8J,QAAU,GACf,IAAMxL,EAAM2R,EAAkBjQ,KAAKuc,OAAOC,SAC1C,GAAW,MAAPle,EAAa,CACb,IAAMgP,EAAQ,GAId,OAHAA,EAAMhP,GAAO0B,KAAKuc,OAAOC,QAAQle,UAC1B0B,KAAKuc,OAAOC,QAAQle,GAC3B0B,KAAK+K,MAAMuC,MAAQA,EACZtN,KAAKyW,iBAAiBlI,KAAKvO,KAAKmc,iBAAiB5d,KAAKyB,QAGrE,OAAOA,KAAKsc,kBAGR,YAAAJ,gBAAR,WACIlc,KAAKoc,MAAO,EACZ,IAAM9O,EAAQtN,KAAK+K,MAAMuC,MACzBtN,KAAKuc,OAAS,CACVC,QAASlP,EAAM2O,GACfnS,QAAS,WAGNwD,EAAM2O,IAErB,EA/PA,CAA4B,IAiQ5B,GAAOtd,UAAUoY,eH7Qa,SAA2B1W,EAAQ4K,GAAnC,WACtBuP,EAAOxa,KAAKuR,WACV2F,EAAa,SAACuF,GACH,IAATjC,EACC,EAAgBpJ,WAAWqL,KAG1BjC,GAGJiB,EAAY,WACd,IAAsC,IAAlC,EAAKlF,2BAAuE,IAAjC,EAAKC,wBAAmC,CACnF,GAAI,EAAKjF,YAAc,EAAKJ,YACxB,OAAO8F,GAEN,GAAI,EAAK1F,WACV,OAAO4F,GAEF,EAAKhG,YAIlB,OAAOiG,GAZO,GAeZsF,EAAc1c,KAAKuB,YAAY2G,MAAM7H,GAS3C,OAAOiJ,EACH2B,EAAO3I,KAAI,SAAUma,GACjB,OAVoCze,EAUlBye,EATf9c,GAAQ,SAAC6B,EAAKC,GACjB,IAAMkb,EAAgBD,EAAYE,WAAW,EAAK1b,KAAKY,SAAS9D,IAChE2e,EAAc/a,UAAY6Z,EAAUve,KAAK,EAAMsE,EAAK0V,GACpDyF,EAAc9a,QAAUJ,KAJW,IAACzD,OGoPhD,GAAOW,UAAUwc,2BZ9QyB,eAClCwB,EADkC,OAEtC,GAAI3c,KAAK+K,MAAM0I,QAAyC,IAAhCzT,KAAK+K,MAAM0I,MAAMoH,YAAwB7a,KAAK+K,MAAM0I,MAAMG,GAAI,CAClF,IAAI5T,KAAKuB,YAAYmG,WAAWC,SAAS3H,KAAK+K,MAAM0I,MAAMG,IAQtD,OAAOnK,EACH,IAAI,EACA1K,EAAWgF,eACX,CAAE1D,OAAQL,KAAK+K,MAAM0I,MAAMG,GAAIzB,SAAS,KAVhD,IAAM0K,EAAgC7c,KAAK+K,MAAM0I,MAAM/Q,MACX,SAAxC1C,KAAK+K,MAAM0I,MAAM/Q,KAAKsR,cAA2B,OAAS,OAC9DhU,KAAKoa,QAAS,EACduC,EAAgB3c,KAAKuB,YAAY2G,MAAMlI,KAAK+K,MAAM0I,MAAMG,IACpDgJ,WAAW,KAAMC,QAYzBF,EAAgB3c,KAAKuB,YAAYqb,aAErC,IAAMnB,EAAY,WACd,IAAsC,IAAlC,EAAKlF,2BAAuE,IAAjC,EAAKC,wBAAmC,CACnF,GAAI,EAAKjF,YAAc,EAAKJ,YACxB,OAAOJ,EAEN,GAAI,EAAKQ,WACV,OAAOC,EAEN,GAAI,EAAKL,YACV,OAAOO,EAGf,OAAOD,EAZO,GAclB,OAAO9R,GAAc,SAAC6B,EAAKC,GACvBkb,EAAc9a,QAAUJ,EACxBkb,EAAc/a,UAAY6Z,EAAUve,KAAK,EAAMsE,OYyOvD,GAAO7C,UAAUiY,kBT/QgB,SAA2BvW,EAAQrC,EAAOwH,EAAIsX,GAA9C,WAE7B9e,EAAQwH,EAAKxH,EAAMwH,GAAMxH,EACzB,IAAM2e,EAAgB3c,KAAKuB,YAAY2G,MAAM7H,GAAQuc,WACjD5c,KAAKkB,KAAKY,SAAS9D,EAAOwH,GAC1BsX,GAGErB,EAAY,WACd,IAAsC,IAAlC,EAAKlF,2BAAuE,IAAjC,EAAKC,wBAAmC,CACnF,GAAI,EAAKjF,YAAc,EAAKJ,YACxB,OAAO8C,GAEN,GAAI,EAAK1C,WACV,OAAO6C,GAEN,GAAI,EAAKjD,YACV,OAAOkD,GAIf,OAAOC,GAbO,GAgBlB,OAAO3U,GAAa,SAAC6B,EAAKC,GACtBkb,EAAc9a,QAAUJ,EACxBkb,EAAc/a,UAAY6Z,EAAUve,KAAK,EAAMsE,OSsPvD,GAAO7C,UAAUmY,kBF/QgB,SAA2BzW,EAAQ0c,GAAnC,WAEzBvC,EAAOxa,KAAKuR,WACV2F,EAAa,SAACuF,GACH,IAATjC,EACC,EAAgBpJ,WAAWqL,KAG1BjC,GAGVxa,KAAKmU,eAAiB,SAAClD,GACnB,OAAO8L,EAAIzG,KAAKrF,EAAO3S,MACnB,EAAKqY,qBAAqB1K,MAAMgF,EAAOjT,QAG/C,IAAM2e,EAAgB3c,KAAKuB,YAAY2G,MAAM7H,GAAQuc,aAE/CnB,EAAY,WACd,IAAsC,IAAlC,EAAKlF,2BAAuE,IAAjC,EAAKC,wBAAmC,CACnF,GAAI,EAAKjF,YAAc,EAAKJ,YACxB,OAAOkG,GAEN,GAAI,EAAK9F,WACV,OAAO+F,GAEN,GAAI,EAAKnG,YACV,OAAOoG,GAGf,OAAOC,GAZO,GAelB,OAAO7X,GAAa,SAAC6B,EAAKC,GACtBkb,EAAc9a,QAAUJ,EACxBkb,EAAc/a,UAAY6Z,EAAUve,KAAK,EAAMsE,EAAK0V,OE8O5D,GAAOvY,UAAUka,gCElQ6B,WACtC7Y,KAAK+K,MAAM2P,QACX1a,KAAKuW,0BAA2B,GAEhCvW,KAAK+K,MAAMyP,OACXxa,KAAKwW,yBAA0B,IF8PvC,GAAO7X,UAAUgc,cErRY,sBACrB3a,KAAK+K,MAAMgJ,KACX/T,KAAKoR,WAAa,SAACpT,GACf,IAAIoC,EAEJ,IAAKA,KADL,EAAKgT,cAAclD,gBAAgB,EAAKnF,MAAMgJ,KAAM/V,GACjC,EAAK+M,MAAMgJ,KAC1B/V,EAAMoC,GAAc,EAAKgT,cAAcnT,UAAUG,GAAYqQ,WAEjE,EAAK3G,QAAQlJ,KAAK5C,IAItBgC,KAAKoR,WAAa,SAACpT,GACf,EAAK8L,QAAQlJ,KAAK5C,KFyQ9B,GAAOW,UAAUkd,iBE3Pe,WAC5B,IAAImB,EAAQhd,KAAK8J,QAEjB9J,KAAK8J,QAAU,KAGf,IAFA,IAAMxL,EAAM0B,KAAKO,aACX0c,EAAe,GACZlgB,EAAI,EAAGmgB,EAAMF,EAAM3T,OAAQtM,EAAImgB,EAAKngB,IACzCkgB,EAAaD,EAAMjgB,GAAGuB,IAAQ0e,EAAMjgB,GAGxC,IAAK,IAAMA,KADXigB,EAAQ,GACQC,EACZD,EAAMpc,KAAKqc,EAAalgB,IAE5BiD,KAAK8J,QAAUkT,GF+OnB,GAAOre,UAAUyc,iBDpRe,WAC5B,OAAO,IAAI,GAAKpb,MAAMqO,WCoR1B,GAAO1P,UAAUoa,yBVtRuB,WACpC,GAAI/Y,KAAK+K,MAAMoS,SAAU,CACrB,IAAMrC,EAAU,GACV/Y,EAAS/B,KAAK8J,QAAQ,GAC5B,IAAK,IAAMxL,KAAOyD,EACd+Y,EAAQla,KAAKtC,GAEjB,IAAMiC,EAAaP,KAAKO,aACpB2H,EAAQ4S,EAAQpa,QAAQH,GAC5Bua,EAAQ1S,OAAOF,EAAO,GACtBlI,KAAK+K,MAAM+P,QAAUA,EAAQzR,OAAS,EAAIyR,EAAU,KAEpD9a,KAAK+K,MAAM+P,QACP9a,KAAK+K,MAAMqS,UACXpd,KAAKqd,0BAGLrd,KAAKsd,iBAGJtd,KAAK+K,MAAMqS,WAChBpd,KAAKud,uBUkQb,GAAO5e,UAAUma,eV7Ga,WAC1B,IAAMrF,EAAQzT,KAAK+K,MAAM0I,MACzB,GAAIA,GAASzT,KAAK8J,QAAQT,OAAS,IAAMrJ,KAAKoa,OAAQ,CAClD,IAAMoD,EAAiBpT,EAAYqJ,GACnC,GAAI+J,IAAmBve,EAAUxB,OAC7BiW,GAASxW,KAAK8C,KAAMyT,QAEnB,GAAI+J,IAAmBve,EAAUqL,MAAO,CACzCoJ,GAASxW,KAAK8C,KAAMyT,EAAM,IAC1B,I,eAAS1W,EAAO,GAEZ,IAAM0gB,EAAmBhK,EAAM1W,EAAI,GAAG6W,GAChC8J,EAAiCjK,EAAM1W,GACzC4gB,EAAsBD,EAAkB9J,GACtCgK,EAAoB/L,EAAmB3U,KAAK,EAAMygB,GACxD,GAAyB,MAArBC,EAA2B,CAC3BD,EAAsBC,EAAkBtgB,KACxCogB,EAAkBhb,KAAOiR,GAAc+J,EAAkBhb,MACzD,IAAM,EAAc8Q,GAAkBoK,EAAmBF,GACzD,EAAK5T,QAAQ+J,MAAK,SAACxB,EAAGC,GAClB,OAAID,EAAEoL,KAAsBnL,EAAEmL,GACnB,EACHpL,EAAEsL,GACFrL,EAAEqL,IAEH,O,OAhBV5gB,EAAI,EAAG,EAAU0W,EAAcpK,OAAQtM,EAAI,EAAQA,I,EAAnDA,MUqGrB,GAAO4B,UAAU4e,oBV5EkB,WAC/B,IAGIM,EAHEb,EAAQhd,KAAK8J,QACbgU,EAAcd,EAAM3T,OACpBS,EAAU,GAGhB9J,KAAK8J,aAAU+B,EACf,IAAMkS,EAAW,WACb,IAAIhc,EAAS,EACb,IAAK,IAAMhF,KAAKigB,EACZjb,GAAUib,EAAMjgB,GAAG8gB,GAAqB,EAAI,EAEhD,OAAO9b,GAELic,EAAS,WACX,IAAIjc,EAAS,EACb,IAAK,IAAMhF,KAAKigB,EACZjb,EAASA,EAASib,EAAMjgB,GAAG8gB,GACvB9b,EAASib,EAAMjgB,GAAG8gB,GAE1B,OAAO9b,GAELkc,EAAS,WACX,IAAIlc,EAASmc,IAAUlgB,EAAQkgB,IAC/B,IAAK,IAAMnhB,KAAKigB,EAGZjb,EAASA,GAFT/D,EAAQgf,EAAMjgB,GAAG8gB,GACbb,EAAMjgB,GAAG8gB,GAAqBK,KACRnc,EAAS/D,EAEvC,OAAO+D,GAELoc,EAAS,WACX,IAAIpc,EAAS,EACb,IAAK,IAAMhF,KAAKigB,EACZjb,GAAUib,EAAMjgB,GAAG8gB,GAEvB,OAAO9b,GAELqc,EAAS,WACX,IAAIrc,EAAS,EACb,IAAK,IAAMhF,KAAKigB,EACZjb,GAAUib,EAAMjgB,GAAG8gB,GAEvB,OAAO9b,EAAS+b,GAEpB,IAAK,IAAMvR,KAAQvM,KAAK+K,MAAMqS,UAAW,CACrC,IAAMiB,EAAkBre,KAAK+K,MAAMqS,UAAU7Q,GACvC+R,EAAmBlU,EAAYiU,GACjCE,OAAmB,EACvB,OAAQhS,GACJ,IAAK,QACDgS,EAAsBR,EAAU,MACpC,IAAK,MACDQ,EAAsBP,EAAQ,MAClC,IAAK,MACDO,EAAsBN,EAAQ,MAClC,IAAK,MACDM,EAAsBJ,EAAQ,MAClC,IAAK,MACDI,EAAsBH,EAE9B,OAAQE,GACJ,KAAKrf,EAAUyT,OAEX5I,EAAWyC,EAAI,KADfsR,EAAoBQ,GACgB,KAAOE,IAC3C,MACJ,KAAKtf,EAAUqL,MACX,IAAK,IAAMhM,KAAO+f,EAEdvU,EAAWyC,EAAI,KADfsR,EAAoBQ,EAAgB/f,IACA,KAAOigB,KAM3D,IAAK,IAAMhS,KAAQzC,EACfkT,EAAM,GAAGzQ,GAAQzC,EAAQyC,GAE7BvM,KAAK8J,QAAU,CAACkT,EAAM,KUD1B,GAAOre,UAAU0e,wBGrOsB,WACnC,IAAMmB,EAASxe,KAAK+K,MAAM+P,QACtBkC,EAAQhd,KAAK8J,QAEjB9J,KAAK8J,aAAU+B,EACf,IAII3D,EACAuW,EACAzgB,EACA6f,EAPEa,EAAY,GAEZC,EAAe3e,KAAK+K,MAAMqS,UAM1BwB,EAAqB,WACvB,IAAMb,EAAW,WAMb,OAHA/f,GAFAA,EAAQ0gB,EAAUD,IAEFzgB,EAAM,SAAW6f,EAAoB,KAAO,EAE5D7f,GAASgf,EAAM9U,GAAO2V,GAAqB,EAAI,GAG7CG,EAAS,WAOX,OAJAhgB,GAFAA,EAAQ0gB,EAAUD,IAEFzgB,EAAM,OAAS6f,EAAoB,KAAO,EAC1Db,EAAM9U,GAAO2V,GAAqBb,EAAM9U,GAAO2V,GAC3Cb,EAAM9U,GAAO2V,GAAqB,EAE/B7f,EAAQgf,EAAM9U,GAAO2V,GAAqB7f,EAAQgf,EAAM9U,GAAO2V,IAEpEI,EAAS,WAOX,OAJAjgB,GAFAA,EAAQ0gB,EAAUD,IAEFzgB,EAAM,OAAS6f,EAAoB,KAAOK,IAC1DlB,EAAM9U,GAAO2V,GAAqBb,EAAM9U,GAAO2V,GAC3Cb,EAAM9U,GAAO2V,GAAqBK,IAE/BlgB,EAAQgf,EAAM9U,GAAO2V,GAAqB7f,EAAQgf,EAAM9U,GAAO2V,IAEpEM,EAAS,WAMX,OAHAngB,GAFAA,EAAQ0gB,EAAUD,IAEFzgB,EAAM,OAAS6f,EAAoB,KAAO,EAE1D7f,GAASgf,EAAM9U,GAAO2V,GAAqBb,EAAM9U,GAAO2V,GAAqB,GAG3EO,EAAS,WAGX,IAAIS,GAFJ7gB,EAAQ0gB,EAAUD,IAEQzgB,EAAM,OAAS6f,EAAoB,KAAO,EAEpEgB,GAAe7B,EAAM9U,GAAO2V,GAAqBb,EAAM9U,GAAO2V,GAAqB,EACnFb,EAAM9U,GAAO,OAAS2V,EAAoB,KAAOgB,EAEjD7gB,EAAQA,EAAQA,EAAM,SAAW6f,EAAoB,KAAO,EAE5D7f,GAASgf,EAAM9U,GAAO2V,GAAqB,EAAI,EAC/Cb,EAAM9U,GAAO,SAAW2V,EAAoB,KAAO7f,GAEvD,IAAK,IAAMuO,KAAQoS,EAAc,CAC7B,IAAMN,EAAkBM,EAAapS,GAC/B+R,EAAmBlU,EAAYiU,GACjCE,OAAmB,EACvB,OAAQhS,GACJ,KAAKnN,EAAawN,MACd2R,EAAsBR,EACtB,MACJ,KAAK3e,EAAa0f,IACdP,EAAsBP,EACtB,MACJ,KAAK5e,EAAa2f,IACdR,EAAsBN,EACtB,MACJ,KAAK7e,EAAa4f,IACdT,EAAsBJ,EACtB,MACJ,KAAK/e,EAAa6f,IACdV,EAAsBH,EAG9B,OAAQE,GACJ,KAAKrf,EAAUyT,OACXmL,EAAoBQ,EACpBrB,EAAM9U,GAAUqE,EAAI,IAAIsR,EAAiB,KAAOU,IAChD,MACJ,KAAKtf,EAAUqL,MACX,IAAK,IAAMpB,KAAQmV,EACfR,EAAoBQ,EAAgBnV,GACpC8T,EAAM9U,GAAUqE,EAAI,IAAIsR,EAAiB,KAAOU,OAMpE,GAAInU,EAAYoU,KAAYvf,EAAUyT,OAClC,IAAKxK,KAAS8U,EACVyB,EAASzB,EAAM9U,GAAOsW,GACtBI,IACAF,EAAUD,GAAUzB,EAAM9U,QAI9B,IAAKA,KAAS8U,EAAO,CAEjB,IAAK,IAAM3c,KADXoe,EAAS,GACYD,EACjBC,GAAUzB,EAAM9U,GAAOsW,EAAOne,IAElCue,IACAF,EAAUD,GAAUzB,EAAM9U,GAMlC,IAAK,IAAMnL,KADXigB,EAAQ,GACQ0B,EACZ1B,EAAMpc,KAAK8d,EAAU3hB,IAGzB,GAAI4hB,EAAaO,IACb,GAAI9U,EAAYuU,EAAaO,OAASjgB,EAAUyT,OAC5C,IAAKxK,KAAS8U,EAAO,CACjB,IAAMmC,EAAYnC,EAAM9U,GAAO,OAASyW,EAAaO,IAAM,KACvDE,EAAcpC,EAAM9U,GAAO,SAAWyW,EAAaO,IAAM,KAC7DlC,EAAM9U,GAAO,OAASyW,EAAaO,IAAM,KAAOC,EAAYC,EACxDT,EAAaU,QAAUV,EAAaO,YAC7BlC,EAAM9U,GAAO,SAAWyW,EAAaO,IAAM,KAElDP,EAAaW,MAAQX,EAAaO,YAC3BlC,EAAM9U,GAAO,OAASyW,EAAaO,IAAM,SAIvD,CACD,IAAMK,EAAoBnV,EAAYuU,EAAaU,SAAWpgB,EAAUyT,OAClE8M,EAAkBpV,EAAYuU,EAAaW,OAASrgB,EAAUyT,OACpE,IAAKxK,KAAS8U,EACV,IAAK,IAAM3c,KAAUse,EAAaO,IAAY,CAC1C,IAAMO,EAAYd,EAAaO,IAAI7e,GAC/Bif,EAAMtC,EAAM9U,GAAO,OAASuX,EAAY,KACxCJ,EAAQrC,EAAM9U,GAAO,SAAWuX,EAAY,KAChDzC,EAAM9U,GAAO,OAASuX,EAAY,KAAOH,EAAMD,EAE3CE,IACIZ,EAAaU,QAAUI,IAGyB,IAA3Cd,EAAaU,MAAM3e,QAAQ+e,YAFzBzC,EAAM9U,GAAO,SAAWuX,EAAY,KAO/CD,IACIb,EAAaW,MAAQG,IAGyB,IAAzCd,EAAaW,IAAI5e,QAAQ+e,YAFvBzC,EAAM9U,GAAO,OAASuX,EAAY,MAUjEzf,KAAK8J,QAAUkT,GHiEnB,GAAOre,UAAU2e,eG1Ra,WAC1B,IAAMxC,EAAU9a,KAAK+K,MAAM+P,QACvBkC,EAAQhd,KAAK8J,QACX4U,EAAY,GAGlB,GADA1e,KAAK8J,QAAU9J,KAAK+K,MAAM+P,QAAU,KAChC1Q,EAAY0Q,KAAa7b,EAAUxB,OACnC,GAAI2M,EAAY0Q,KAAa7b,EAAUyT,OACnC,IAAK,IAAM3V,KAAKigB,EACZ0B,EAAU1B,EAAMjgB,GAAG+d,IAAsBkC,EAAMjgB,OAGlD,CACD,IAAI0hB,OAAM,EACV,IAAK,IAAM1hB,KAAKigB,EAAO,CAEnB,IAAK,IAAM3c,KADXoe,EAAS,GACY3D,EACjB2D,GAAUzB,EAAMjgB,GAAG+d,EAAQza,IAE/Bqe,EAAUD,GAAUzB,EAAMjgB,SAMlC,GAAwB,IADAU,OAAOmQ,KAAKkN,GAASzR,OAClB,CACvB,IAAMqW,EAAgBzP,EAAkB6K,GAExC,IAAK,IAAM/d,KADXiD,KAAKoT,cAAc/C,iBAAiByK,EAAS4E,GAC7B1C,EACZ0B,EAAU1e,KAAKoT,cAAclH,SAAS8Q,EAAMjgB,IAAI0T,YAAcuM,EAAMjgB,OAGvE,CACG0hB,OAAM,EACV,IAAK,IAAM1hB,KAAKigB,EAAO,CAGnB,IAAK,IAAM3c,KAFXoe,EAAS,GACTze,KAAKoT,cAAclD,gBAAgB4K,EAASkC,EAAMjgB,IAC7B+d,EACjB2D,GAAUze,KAAKoT,cAAcnT,UAAUI,GAAQoQ,WAEnDiO,EAAUD,GAAUzB,EAAMjgB,IAMtC,IAAK,IAAMA,KADXigB,EAAQ,GACQ0B,EACZ1B,EAAMpc,KAAK8d,EAAU3hB,IAEzBiD,KAAK8J,QAAUkT,GCjDZ,I,0dCQP,eAMI,WAAYjS,EAAoB7J,GAAhC,MACI,cAAO,K,OAJX,EAAAye,YAAsB,EAKlB,EAAK5U,MAAQA,EACb,EAAK7J,KAAOA,EACZ,EAAKF,UAAY+J,EAAM0C,K,EAuD/B,OAjE2B,QAavB,YAAAY,QAAA,SAAQ0M,GAAR,WACU6E,EAAc,IAAI,EAAY5f,KAAKmC,IACnC4I,EAAQ/K,KAAK+K,MACbC,EAAM4U,EAAYpT,SAAStN,EAAI0N,MAAO7B,GAC5C,OAAIC,EACOvB,EACHuB,GAGD+P,IAAgBxM,MAAK,SAAAC,GACxB,IAAIzM,EACJ,IACI,IAAM8d,EAAoB,WACtB,IAAMC,EAAiB,IAAI,GAAO,EAAK/U,MAAuB,EAAK7J,MAEnE,OADA4e,EAAejW,UAAY,EAAKA,UACzBiW,EAAezR,UAAUE,MAAK,SAAAzE,GACjC,EAAK6V,YAAc7V,EAAQT,WAGnC,EAAK2R,mBAIOjZ,EAHM,MAAdgJ,EAAMgH,KACa,MAAfhH,EAAMuC,MACDvC,EAAMuC,MAAsB2O,IAAM1R,EAAQ,EAAKQ,MAAMuC,OAC7CuS,IAGA,EAAKpJ,iBAIT,EAAK0E,6BAIT0E,IAGjB,MAAO5V,GACH,EAAKD,YAAYC,GAErB,OAAOlI,EAAOwM,MAAK,SAAAC,GACf,OAAO,EAAKmR,mBAKhB,YAAA3E,iBAAR,WACShb,KAAK6J,WACN7J,KAAKkB,KAAKE,kBAAkB,CAACpB,KAAK+K,MAAM0C,MAAOpO,EAAS2c,UAE5Dhc,KAAKuB,YAAcvB,KAAKkB,KAAKK,YAAYvB,KAAK+K,MAAM0C,OAE5D,EAjEA,CAA2B,IAmE3B,GAAM9O,UAAUwc,2BD3E0B,eAClC4E,EAYQ,EAb0B,OAEhCtE,EACE,EAAKla,YAAY8d,OACjBU,EAAe,EAAKxe,YAAY8d,QACzB,SAACnL,GACJ,OAAO,WACF,EAAeyL,YAAcI,EAAahe,OAC3CmS,QAMR6L,EAAe,EAAKxe,YAAYqb,aACzB,SAAC1I,GACJ,OAAO,SAACjN,IACJ,EAASA,EAAEC,OAAOnF,WAEX,EAAe4d,YAClB,EAAOtO,YAGP6C,OAMpB,OAAOvU,GAAQ,SAAC6B,EAAKC,GACjBse,EAAale,QAAUJ,EACvBse,EAAane,UAAY6Z,EAAUja,OC6C3C,GAAM7C,UAAUiY,kBC3EiB,SAA2BvW,EAAQrC,EAAOwH,GAA1C,IAEzBmX,EACA1L,EAHyB,OAM7B,OALAjT,EAAQwH,EAAKxH,EAAMwH,GAAMxH,EAKlB2B,GAAQ,SAAC6B,EAAKC,GACmB,IAAhCuO,EAAU,EAAKjF,MAAMuC,QAAgB,EAAK/L,YAAY8d,OACtD1C,EAAgB,EAAKpb,YAAY2G,MAAM7H,GAAQgf,MAAM,EAAKne,KAAKY,SAAS9D,EAAOwH,KACjE5D,UAAY,WACrB,EAAe+d,YAAchD,EAAc5a,OAC5CP,MAIJmb,EAAgB,EAAKpb,YAAY2G,MAAM7H,GAAQuc,WAAW,EAAK1b,KAAKY,SAAS9D,EAAOwH,KACtE5D,UAAY,SAACqF,IACvBgK,EAAShK,EAAEC,OAAOnF,SAEV,EAAK4U,qBAAqB1K,MAAMgF,EAAOjT,UACpC,EAAe2hB,YAEtB1O,EAAOI,YAGP7P,KAIZmb,EAAc9a,QAAUJ,MD+ChC,GAAM9C,UAAUmY,kBE7EiB,SAA2BzW,EAAgB0c,GAA3C,IACzB9L,EADyB,OAEvB0L,EAAgB3c,KAAKuB,YAAY2G,MAAM7H,GAAQuc,aAKrD,OAJA5c,KAAKmU,eAAiB,SAAClD,GACnB,OAAO8L,EAAIzG,KAAKrF,EAAO3S,MACnB,EAAKqY,qBAAqB1K,MAAMgF,EAAOjT,QAExC2B,GAAQ,SAAC6B,EAAKC,GACjBkb,EAAc9a,QAAUJ,EACxBkb,EAAc/a,UAAY,SAACqF,IACvBgK,EAAShK,EAAEC,OAAOnF,SAEV,EAAKoS,eAAelD,MACjB,EAAe0O,YAEtB1O,EAAOI,YAGP7P,SF4DhB,GAAM7C,UAAUoY,eG9Ec,SAA2B1W,EAAQ4K,GAAnC,IACtBgG,EADsB,OAEpByL,EAAc1c,KAAKuB,YAAY2G,MAAM7H,GA+B3C,OAAOiJ,EACH2B,EAAO3I,KAAI,SAAUma,GACjB,OAhCoCze,EAgClBye,EA/BhB3a,EAAW,EAAKZ,KAAKY,SAAS9D,GAChC,EAAKuD,YAAY8d,MACV1f,GAAQ,SAAC6B,EAAKC,GACjB,IAAMkb,EAAgBD,EAAY2C,MAAMvd,GACxC6a,EAAc/a,UAAY,SAACqF,GACvB,EAAK0Y,aAAe1Y,EAAEC,OAAOnF,OAC7BP,KAEJmb,EAAc9a,QAAUJ,KAGzB9B,GAAc,SAAC6B,EAAKC,GACvB,IAAMkb,EAAgBD,EAAYE,WAAW9a,GAC7C6a,EAAc/a,UAAY,SAACqF,IACvBgK,EAAShK,EAAEC,OAAOnF,SAEV,EAAK4U,qBAAqB1K,MAAMgF,EAAOjT,UACrC,EAAK2hB,YAEX1O,EAAOI,YAGP7P,KAGRmb,EAAc9a,QAAUJ,KA1BW,IAACzD,EAClC8D,OCNP,IAAMke,GAAmB,SAACC,GAE7B,OAD6B1V,EAAQ0V,GAAQA,EAAcA,EAAKhO,MAAM,MACpDyD,QAAO,SAACC,EAAMC,GAAS,OAAAD,GAAQA,EAAKC,KAAO1G,OCDpDgR,GAAc,SAACnV,EAAqBoV,GAC7C,IAAIjU,EAAWnB,EAAM9J,IACfmf,EAASrV,EAAMqV,OACrB,GAAIA,EAAQ,CACR,IAAMre,EAAUqe,EAAoBlU,EAAUiU,GAChC,MAAVpe,IACAmK,EAAWnK,GAGnB,IAAK,IAAMzD,KAAO4N,EAAU,CACxB,IAAMmU,EAAiBnU,EAAS5N,GAChC,GAAI8L,EAAYiW,KAAoBphB,EAAUxB,OAC1C0iB,EAAY7hB,GAAO+hB,OAGnB,IAAK,IAAM7a,KAAM6a,EAAgB,CAC7B,IAAIriB,EAAQqiB,EAAe7a,GAC3B,OAAQA,GACJ,IAAK,IAAK2a,EAAY7hB,IAAQN,EAAO,MACrC,IAAK,IAAKmiB,EAAY7hB,IAAQN,EAAO,MACrC,IAAK,IAAKmiB,EAAY7hB,IAAQN,EAAO,MACrC,IAAK,IAAKmiB,EAAY7hB,IAAQN,EAAO,MACrC,IAAK,SAAUmiB,EAAY7hB,GAAKsC,KAAK5C,GAAQ,MAC7C,QAASmiB,EAAY7hB,GAAO+hB,EAEhC,OAIZ,OAAOF,G,0dCpBX,eAGI,WAAYpV,EAAqB7J,GAAjC,MACI,cAAO,KACP,EAAK6J,MAAQA,EACb,EAAK7J,KAAOA,EACZ,EAAKF,UAAY+J,EAAMsC,GACvB,IAAM+S,EAASrV,EAAMqV,OACrB,GAAIA,EAAQ,CACR,IAAME,EAASlW,EAAYgW,KAAYnhB,EAAUyT,OAC7CsN,GAAiBI,GAAoBA,EACzC,IAAKE,EACD,MAAM,IAAI,EAAUvhB,EAAWyF,eAAgB4b,GAEnDrV,EAAMqV,OAASE,E,SAgE3B,OA/E4B,QAoBxB,YAAAjS,QAAA,SAAQ0M,GAAR,WACUhQ,EAAsB/K,KAAK+K,MACjC,IACI,IACMC,EADc,IAAI,EAAYhL,KAAKmC,IACjBqK,SAAStN,EAAI8N,OAAQjC,GAC7C,OAAIC,EAAYvB,EAAcuB,GACvB+P,IAAgBxM,MAAK,SAAAC,GAcxB,OAbA,EAAK+R,mBAEc,MAAfxV,EAAMuC,MACDvC,EAAMuC,MAAsB2O,IAAM1R,EAAQQ,EAAMuC,OACvC,EAAKkT,uBAGL,EAAK/J,iBAIT,EAAK0E,8BAEJ5M,MAAK,WAChB,OAAO,EAAK3E,kBAIxB,MAAOK,GACH,OAAOjK,KAAKgK,YAAYC,KAIxB,YAAAuW,qBAAR,sBACUzV,EAAsB/K,KAAK+K,MAC3B0V,EAAe,IAAI,GAAO,CAC5BhT,KAAM1C,EAAMsC,GACZC,MAAOvC,EAAMuC,MACboT,WAAY3V,EAAM2V,YACH1gB,KAAKkB,MAExB,OADAuf,EAAa5W,UAAY7J,KAAK6J,UACvB4W,EAAapS,UAAUE,MAAK,SAACzE,G,QAC1BxL,EAAM,EAAKiC,WAAWwK,EAAMsC,IAC5BsT,EAAU,GAChB7W,EAAQxB,SAAQ,SAACtK,GACb2iB,EAAQ/f,KAAK5C,EAAMM,OAEvBwL,EAAU,KACV,IAAM8W,IAAQ,MAAMtiB,KAAG,MAAMc,EAAa2W,IAAK4K,EAAO,GAAE,GAGxD,OAFA,EAAK5V,MAAMuC,MAAQsT,EACnB,EAAKL,kBACE,EAAK9J,qBAIZ,YAAA8J,gBAAR,WACI,IAAMvf,EAAahB,KAAK+K,MAAcsC,GACjCrN,KAAK6J,WACN7J,KAAKkB,KAAKE,kBAAkB,CAACJ,IAEjChB,KAAKuB,YAAcvB,KAAKkB,KAAKK,YAAYP,IAEjD,EA/EA,CAA4B,IAiF5B,GAAOrC,UAAUwc,2BCxFyB,sBAChCwB,EAAgD3c,KAAKuB,YAAYqb,aACvE,OAAOjd,GAAc,SAAC6B,EAAKC,GACvBkb,EAAc/a,UAAY,SAACqF,GACvB,IAAMgK,EAA8BhK,EAAUC,OAAOnF,OACrD,GAAIkP,EACA,IACI,IAAM4P,EAAsB5P,EAAO6P,OAAOZ,GAAY,EAAKnV,MAAckG,EAAOjT,QAChF6iB,EAAoBjf,UAAY,aAC1B,EAAKgI,YACPqH,EAAOI,YAEXwP,EAAoBhf,QAAUJ,EAChC,MAAOwI,GACLxI,EACIwI,QAKRzI,KAGRmb,EAAc9a,QAAUJ,MDkEhC,GAAO9C,UAAUiY,kBE1FgB,SAAwBvW,EAAQrC,EAAOwH,GAAvC,WACvBuF,EAAsB/K,KAAK+K,MACjC/M,EAAQwH,EAAKxH,EAAMwH,GAAMxH,EACzB,IAAM2e,EAAgB3c,KAAKuB,YAAY2G,MAAM7H,GAAQuc,WAAW5c,KAAKkB,KAAKY,SAAS9D,EAAOwH,IAC1F,OAAO7F,GAAc,SAAC6B,EAAKC,GACvBkb,EAAc/a,UAAY,SAACqF,GACvB,IAAMgK,EAA6BhK,EAAEC,OAAOnF,OAC5C,GAAIkP,EACA,GAAI,EAAK0F,qBAAqB1K,MAAMgF,EAAOjT,OACvC,IACI,IAAM6iB,EAAsB5P,EAAO6P,OAAOZ,GAAYnV,EAAOkG,EAAOjT,QACpE6iB,EAAoBjf,UAAY,aAC1B,EAAKgI,YACPqH,EAAOI,YAEXwP,EAAoBhf,QAAUJ,EAChC,MAAOwI,GACLxI,EACIwI,QAKRgH,EAAOI,gBAIX7P,KAGRmb,EAAc9a,QAAUJ,MF6DhC,GAAO9C,UAAUmY,kBG3FgB,SAAwBzW,EAAgB0c,GAAxC,IACzB9L,EADyB,OAEvB8P,EAAoB/gB,KAAKuB,YAAY2G,MAAM7H,GAAQuc,aAKzD,OAJA5c,KAAKmU,eAAiB,SAAClD,GACnB,OAAO8L,EAAIzG,KAAKrF,EAAO3S,MACnB,EAAKqY,qBAAqB1K,MAAMgF,EAAOjT,QAExC2B,GAAc,SAAC6B,EAAKC,GAEvBsf,EAAkBnf,UAAY,SAACqF,GAE3B,GADAgK,EAAShK,EAAEC,OAAOnF,OAEd,GAAI,EAAKoS,eAAelD,GACpB,IACI,IAAM4P,EAAsB5P,EAAO6P,OAAOZ,GAAY,EAAKnV,MAAckG,EAAOjT,QAChF6iB,EAAoBjf,UAAY,aAC1B,EAAKgI,YACPqH,EAAOI,YAEXwP,EAAoBhf,QAAUJ,EAChC,MAAOwI,GACLxI,EACIwI,QAKRgH,EAAOI,gBAKX7P,KAGRuf,EAAkBlf,QAAUJ,MHyDpC,GAAO9C,UAAUoY,eI3Fa,SAAwB1W,EAAQ4K,GAAhC,WACpByR,EAAc1c,KAAKuB,YAAY2G,MAAM7H,GACrC0K,EAAsB/K,KAAK+K,MAoCjC,OAAOzB,EACH2B,EAAO3I,KAAI,SAAUma,GACjB,OArCoCze,EAqClBye,EApCf9c,GAAQ,SAAC6B,EAAKC,GACjB,IAAMkb,EAAgBD,EAAYE,WAAW,EAAK1b,KAAKY,SAAS9D,IAChE2e,EAAc/a,UAAY,SAACqF,GACvB,IAAMgK,EAA6BhK,EAAEC,OAAOnF,OAC5C,GAAIkP,EAAQ,CACR,IAAM,EAAQA,EAAOjT,MACrB,GAAI,EAAK2Y,qBAAqB1K,MAAM,GAChC,IACI,IAAM4U,EAAsB5P,EAAO6P,OAAOZ,GAAYnV,EAAO,IAC7D8V,EAAoBjf,UAAY,aAC1B,EAAKgI,YACPqH,EAAOI,YAEXwP,EAAoBhf,QAAUJ,EAElC,MAAOwI,GACHxI,EACIwI,QAMRgH,EAAOI,gBAIX7P,KAGRmb,EAAc9a,QAAUJ,KA/BW,IAACzD,O,+qBCJhD,eAEI,WAAYgjB,EAA+B9f,GAA3C,MACI,cAAO,K,OACP,EAAK6J,MAAQiW,EACb,EAAK9f,KAAOA,E,EAsIpB,OA3I+B,QAQ3B,YAAAmN,QAAA,eAeQ4S,EAiBAxJ,EAhCR,OACUuJ,EAAgChhB,KAAK+K,MACvC7C,EAAQ,EACRgZ,EAAU,GACVC,EAAc,GACdC,GAAsB,EACpBC,EAAUL,EAAaK,QACvBC,EAAcD,EAAQhY,OAS5B,GARAgY,EAAQlW,OAAM,SAAChC,EAAKpM,GAChB,QAAIA,EAAI,EAAIukB,GAAenY,EAAIsE,OAAS4T,EAAQtkB,EAAI,GAAG0Q,QACnD2T,GAAsB,GACf,MAKXA,EAAqB,CACrB,IAAM,EAAOphB,KAAKO,WAAW8gB,EAAQ,GAAG5T,MACxCwT,EAAa,SAACxE,GACV,OAAOA,EAAI,SAIfwE,EAAa,SAACxE,GACV,IAAI8E,EAAe,GACnB,IAAK,IAAMjjB,KAAOme,EACd8E,GAAgB9E,EAAIne,GAExB,OAAOijB,GAKf,IAAMC,EAAY,WACd,GAAItZ,EAAQoZ,EAER,OADA7J,EAAS,IAAI,GAAO4J,EAAQnZ,GAAQ,EAAKhH,OAC3BmN,UAAUE,MAAK,SAACkT,GAe1B,OAdAP,EAAU,GACVO,EAAanZ,SAAQ,SAAAmU,GACjB,IAAM8E,EAAeN,EAAWxE,GAClB,IAAVvU,EACAiZ,EAAYI,GAAgB9E,EACQ,MAA7B0E,EAAYI,KACnBL,EAAQK,GAAgB9E,MAG5BvU,EAAQ,IACRiZ,EAAc,MAAKD,MAGrBhZ,EACKsZ,OAIX,IAeI,EAfE,EAAU,GACZE,OAAY,EACZ,EAAOV,EAAaxG,KAClB,EAAQwG,EAAatG,MAWvB,GAAiB,EAEf,EAAa,WACf,EAAQ9Z,KAAKsgB,EAAQ,KAEnB,EAAoB,WAClB,EAAQ7X,OAAS,EACjB,IAGA,GAAiB,GAGnB,EAAc,SAACgQ,GACJ,IAAT,EACAA,MAGE,GA0BV,GAtBIqI,EADAV,EAAaxG,MAAQwG,EAAatG,MACnB,WACX,GAAY,WACR,QAKHsG,EAAatG,MACH,EAEVsG,EAAaxG,KACH,WACX,GAAY,WACR,QAKO,WACX,KAGJ,GACA,IAAK,KAAO0G,EAER,GADAQ,EAAa,GACT,EACA,WAKR,IAAK,KAAOR,EACRQ,EAAa,GAGrB,OAlEIjK,EAAgB,QAAI,EACpBha,OAAOqD,OAAO2W,EAAO1M,MAAO,CACxB0I,MAAOuN,EAAavN,MACpB1B,KAAM,KAEV0F,EAAOqB,iBACPrB,EAAOsB,2BACCtB,EAAiB,SA8DrC,OAAO+J,KAEf,EA3IA,CAA+B,GCD/B,4BAqBA,OAnBI,YAAAnT,QAAA,SAAQsT,GACJ,OAAOhiB,GAAQ,SAAC6B,EAAKC,GACjB,IAAMmgB,EAAgB9a,UAAU+a,eAAeF,GAC/CC,EAAcE,UAAY,WACtB,IAAM9W,EAAM,IAAI,EAAUjM,EAAWuF,WACrC,OAAO7C,EACHkI,EAASqB,KAGjB4W,EAAc/f,QAAU,SAACoF,GACrB,OAAOxF,EACHkI,EAAS1C,KAGjB2a,EAAchgB,UAAY,WACtBJ,SAIhB,EArBA,G,0dCEA,eAEI,WAAYuJ,EAAuB7J,GAAnC,MACI,cAAO,K,OACP,EAAK6J,MAAQA,EACb,EAAK7J,KAAOA,E,EAuDpB,OA5D2B,QAQvB,YAAAmN,QAAA,eAaQ4S,EAbR,OACUlW,EAAwB/K,KAAK+K,MAC/B7C,EAAQ,EACNgZ,EAAU,GACZE,GAAsB,EACpBE,EAAcvW,EAAM1B,OAS1B,GARA0B,EAAMI,OAAM,SAAChC,EAAKpM,GACd,QAAIA,EAAI,EAAIukB,GAAenY,EAAIsE,OAAS1C,EAAMhO,EAAI,GAAG0Q,QACjD2T,GAAsB,GACf,MAKXA,EAAqB,CACrB,IAAM,EAAOphB,KAAKO,WAAWwK,EAAM,GAAG0C,MACtCwT,EAAa,SAACxE,GACV,OAAOA,EAAI,SAIfwE,EAAa,SAACxE,GACV,IAAI8E,EAAe,GACnB,IAAK,IAAMjjB,KAAOme,EACd8E,GAAgB9E,EAAIne,GAExB,OAAOijB,GAIf,IAAMC,EAAY,WACd,GAAItZ,EAAQ6C,EAAM1B,OAEd,OADS,IAAI,GAAO0B,EAAM7C,KAAU,EAAKhH,MAC3BmN,UAAUE,MAAK,SAACkT,GAI1B,OAHAA,EAAanZ,SAAQ,SAAAmU,GACjByE,EAAQD,EAAWxE,IAAQA,KAExB+E,OAIX,IAAM1X,EAAU,GAChB,IAAK,IAAMxL,KAAO4iB,EACdpX,EAAQlJ,KAAKsgB,EAAQ5iB,IAEzB,OAAOwL,GAGf,OAAO0X,KAIf,EA5DA,CAA2B,G,0dCO3B,eAII,WACIzW,EAAqB7J,GADzB,MAGI,cAAO,K,OACP,EAAK6J,MAAQA,EACb,EAAK7J,KAAOA,EACZ,EAAKF,UAAY+J,EAAM0C,K,EAoG/B,OA9G4B,QAaxB,YAAAY,QAAA,SAAQ0M,GAAR,IAOQgH,EAPR,OACUnC,EAAc,IAAI,EAAY5f,KAAKmC,IACnC4I,EAAQ/K,KAAK+K,MACbC,EAAM4U,EAAYpT,SAAStN,EAAIyN,OAAQ5B,GAC7C,OAAIC,EAAYvB,EACZuB,GAGG+P,IAAgBxM,MAAK,SAAAC,GACxB,IACI,EAAKwM,mBAGG+G,EAFW,MAAfhX,EAAMuC,MACF/C,EAAQQ,EAAMuC,OACJ,EAAK2N,uBAGL,EAAKC,gBAIT,EAAKC,6BAIvB,MAAOlR,GACH,OAAO,EAAKD,YAAYC,GAE5B,OAAO8X,EAAQxT,MAAK,WAChB,OAAO,EAAK3E,mBAKhB,YAAAqR,qBAAR,sBACUwF,EAAe,IAAI,GAAOzgB,KAAK+K,MAAO/K,KAAKkB,MAEjD,OADAuf,EAAa5W,UAAY7J,KAAK6J,UACvB4W,EAAapS,UAAUE,MAAK,SAACzE,G,QAC1BkY,EAAU,GACVC,EAAO,EAAK1hB,WAAW,EAAKwK,MAAM0C,MACxC3D,EAAQxB,SAAQ,SAACY,GACb8Y,EAAQphB,KAAKsI,EAAK+Y,OAEtBnY,EAAU,KACV,IAAM8W,IAAQ,MAAMqB,KAAI,MAAM7iB,EAAa2W,IAAKiM,EAAO,GAAE,GAEzD,OADA,EAAKjX,MAAM3L,EAAa8iB,OAAStB,EAC1B,EAAK1F,oBAIZ,YAAAA,cAAR,sBAII,OAHKlb,KAAK+K,MAAMuC,MAAsB2O,IAClCjc,KAAKmiB,iBAEFniB,KAAKyW,iBAAiBlI,MAAK,WAC9B,OAAO,EAAK4N,uBAIZ,YAAAnB,iBAAR,WACShb,KAAK6J,WACN7J,KAAKkB,KAAKE,kBAAkB,CAACpB,KAAK+K,MAAM0C,OAE5CzN,KAAKuB,YAAcvB,KAAKkB,KAAKK,YAAYvB,KAAK+K,MAAM0C,OAGhD,YAAA0O,iBAAR,WACI,GAAInc,KAAKoc,KACL,OAAOpc,KAAKqc,mBAIZ,YAAAA,gBAAR,sBACU/d,EAAM2R,EAAmBjQ,KAAaoiB,QAAQC,SACpD,GAAW,MAAP/jB,EAAa,CACb,IAAMgP,EAAQ,GAId,OAHAA,EAAMhP,GAAQ0B,KAAaoiB,QAAQC,QAAQ/jB,UACnC0B,KAAaoiB,QAAQC,QAAQ/jB,GACrC0B,KAAK+K,MAAMuC,MAAQA,EACZtN,KAAKyW,iBAAiBlI,MAAK,WAC9B,OAAO,EAAK4N,sBAIhBnc,KAAKoc,MAAO,GAIZ,YAAA+F,eAAR,WACIniB,KAAKoc,MAAO,EACZ,IAAM9O,EAAQtN,KAAK+K,MAAMuC,MACxBtN,KAAaoiB,QAAU,CACpBC,QAAS/U,EAAM2O,WAIZ3O,EAAM2O,IAErB,EA9GA,CAA4B,IAgH5B,GAAOtd,UAAUoY,eCzHa,SAAwB1W,EAAQ4K,GAAhC,WACpBqX,EAActiB,KAAKuB,YAAY2G,MAAM7H,GAqB3C,OAAOiJ,EACH2B,EAAO3I,KAAI,SAAUma,GACjB,OAtBoCze,EAsBlBye,EArBf9c,GAAQ,SAAC6B,EAAKC,GACjB,IAAMkb,EAAgB2F,EAAY1F,WAAW,EAAK1b,KAAKY,SAAS9D,IAChE2e,EAAc/a,UAAY,SAACqF,GACvB,IAAMgK,EAA6BhK,EAAEC,OAAOnF,OACxCkP,GACI,EAAK0F,qBAAqB1K,MAAMgF,EAAOjT,SACvCiT,EAAOhP,WACL,EAAK2H,aAEXqH,EAAOI,YAGP7P,KAGRmb,EAAc9a,QAAUJ,KAhBW,IAACzD,ODwHhD,GAAOW,UAAUwc,2BE1HyB,eAClClK,EADkC,OAEhC0L,EAAgB3c,KAAKuB,YAAYqb,aACvC,OAAOjd,GAAc,SAAC6B,EAAKC,GACvBkb,EAAc/a,UAAY,SAACqF,IACvBgK,EAAShK,EAAEC,OAAOnF,SAEdkP,EAAOhP,WACL,EAAK2H,YACNqH,EAAeI,YAGhB7P,KAGRmb,EAAc9a,QAAUJ,MF4GhC,GAAO9C,UAAUiY,kBG3HgB,SAAwBvW,EAAQrC,EAAOwH,GAAvC,IACzByL,EACA0L,EAFyB,OAK7B,OAFA3e,EAAQwH,EAAKxH,EAAMwH,GAAMxH,EACzB2e,EAAgB3c,KAAKuB,YAAY2G,MAAM7H,GAAQuc,WAAW5c,KAAKkB,KAAKY,SAAS9D,EAAOwH,IAC7E7F,GAAc,SAAC6B,EAAKC,GACvBkb,EAAc/a,UAAY,SAACqF,IACvBgK,EAAShK,EAAEC,OAAOnF,SAEV,EAAK4U,qBAAqB1K,MAAMgF,EAAOjT,SACvCiT,EAAOhP,WACL,EAAK2H,aAEXqH,EAAOI,YAGP7P,KAIRmb,EAAc9a,QAAUJ,MHwGhC,GAAO9C,UAAUmY,kBI5HgB,SAAwBzW,EAAgB0c,GAAxC,IACzB9L,EADyB,OAEvB0L,EAAgB3c,KAAKuB,YAAY2G,MAAM7H,GAAQuc,aAKrD,OAJA5c,KAAKmU,eAAiB,SAAClD,GACnB,OAAO8L,EAAIzG,KAAKrF,EAAO3S,MACnB,EAAKqY,qBAAqB1K,MAAMgF,EAAOjT,QAExC2B,GAAc,SAAC6B,EAAKC,GACvBkb,EAAc/a,UAAY,SAACqF,IACvBgK,EAAShK,EAAEC,OAAOnF,SAEV,EAAKoS,eAAelD,KACpBA,EAAOhP,WACL,EAAK2H,aAEXqH,EAAOI,YAGP7P,KAGRmb,EAAc9a,QAAUJ,M,8dClBhC,eACI,WAAYT,EAAmBE,GAA/B,MACI,cAAO,K,OACP,EAAK6J,MAAQ/J,EACb,EAAKE,KAAOA,EACZ,EAAKF,UAAYA,E,EA8BzB,OAnC2B,QAQvB,YAAAqN,QAAA,SAAQ0M,GAAR,WACU/Z,EAAoBhB,KAAK+K,MAI/B,OAHK/K,KAAK6J,WACN7J,KAAKkB,KAAKE,kBAAkB,CAACJ,EAAW,EAAWA,YAEhD+Z,IAAgBxM,MAAK,SAAAC,GACxB,IAAM+T,EAA2B,EAAKrhB,KAAKK,YAAYP,GAAWwhB,QAClE,IACI,OAAO7iB,GAAc,SAAC6B,EAAKC,GACvB8gB,EAAa3gB,UAAY,SAACqF,GACtB,IAAMwb,EAAe,EAAK5iB,MAAMmB,GAChC,IAAK,IAAMZ,KAAcqiB,EAAa1iB,mBAClC0iB,EAAa1iB,mBAAmBK,GAAc,EAElD,EAAWa,IAAI,EAAWiB,SAAU,EAAKhB,KAAKiB,GAAI,EAAKjB,MAAMqN,MAAK,WAC9D/M,OACDmN,MAAMlN,IAGb8gB,EAAa1gB,QAAUJ,KAG/B,MAAOwI,GACH,OAAO,EAAKD,YAAYC,QAIxC,EAnCA,CAA2B,G,0dCO3B,eAYI,WAAYd,EAAwBjI,GAApC,MACI,cAAO,K,OAZX,EAAA4I,QAAU,GACV,EAAA4Y,SAA+B,GAC/B,EAAAC,kBAAmB,EAEnB,EAAAC,cAAe,EASX,EAAK7X,MAAQ5B,EACb,EAAKjI,KAAOA,E,EA2OpB,OA1PiC,QAkB7B,YAAAmN,QAAA,SAAQzO,GAAR,WACII,KAAK+a,cAAgBnb,EACrB,IAAMoL,EAAMhL,KAAKwM,WACjB,OAAIxB,EAAYvB,EACZuB,IAEJhL,KAAK6iB,kBAEEljB,GAAc,SAAC6B,EAAKC,GACvB,EAAKga,UAAYja,EACjB,EAAKshB,QAAUrhB,KAChB8M,MAAK,SAAAxM,GAGJ,OAFA,EAAKgZ,cAAgB,KACrB,EAAKhY,IAAI,wBACFhB,OAIf,YAAAyK,SAAA,WACI,IAAMzB,EAA2B/K,KAAK+K,MAChCgY,EAAmB/iB,KAAKgjB,kBAAkBjY,EAAM1I,QACtD,GAAI0gB,EACA,OAAO,IAAI,EAAUhkB,EAAWoF,cAAe,CAAEnD,UAAW+hB,IAEhE,IAAME,EAAalY,EAAMuV,OAEzB,OADcN,GAAiBiD,QAC/B,EACW,IAAI,EAAUlkB,EAAWyF,eAAgBye,IAIhD,YAAAJ,gBAAR,sBACU9X,EAA2B/K,KAAK+K,MA4ChCkY,EAAalY,EAAMuV,OACrB4C,EAAUlD,GAAiBiD,GAI/B,OAFAjjB,KAAK+C,IAAI,6BAEFmgB,EAAQhmB,KACX8C,KACA,CACI4Y,KAAM7N,EAAM6N,KACZuK,OA9CO,SAACha,GACZ,OAAO,EAAKia,SAAS,CACjB9lB,KAAM4B,EAAI4N,OACV/B,MAAO5B,KA2CSsO,OApDT,SAACtO,GACZ,OAAO,EAAKia,SAAS,CACjB9lB,KAAM4B,EAAIwN,OACV3B,MAAO5B,KAkDP2X,OAzCO,SAAC3X,GACZ,OAAO,EAAKia,SAAS,CACjB9lB,KAAM4B,EAAI8N,OACVjC,MAAO5B,KAsCSnH,OAnCT,SAACmH,GACZ,OAAO,EAAKia,SAAS,CACjB9lB,KAAM4B,EAAIyN,OACV5B,MAAO5B,KAiCPkW,MA9BM,SAAClW,GACX,OAAO,EAAKia,SAAS,CACjB9lB,KAAM4B,EAAI0N,MACV7B,MAAO5B,KA2BOka,UAxBJ,SAAC/kB,EAAaN,GAC5B,EAAK8L,QAAQxL,GAAON,GAwBhBslB,UAtBU,SAAChlB,GACf,OAAO,EAAKwL,QAAQxL,IAqBMgI,MAnBhB,SAACtD,GACX,EAAKugB,SAASvgB,IAmBVwgB,MAhBM,WACV,EAAKC,eAoBb,YAAA1gB,IAAA,SAAIF,GACA7C,KAAKkB,KAAK8D,OAAOjC,IAAIF,IAGjB,YAAA4gB,SAAR,sBACI,IACIzjB,KAAK4iB,cAAe,EACpB,IAAIc,EAAc1jB,KAAK+K,MAAc1I,OAOrC,OANAqhB,EAAaA,EAAWnJ,OAAO,EAAWvZ,WAC1ChB,KAAKkB,KAAKE,kBAAkBsiB,GAAYnV,MAAK,SAAAC,GACzC,EAAKiN,UAAU,EAAK3R,YACrB6E,OAAM,SAAA3D,GACL,EAAK8X,QAAQ9X,MAEVhL,KAAK2jB,yBAEhB,MAAO1Z,GACHjK,KAAK8iB,QAAQ9iB,KAAKgK,YAAYC,MAQ9B,YAAA2Z,eAAR,SAAuB7hB,GACnB,IAAM8hB,EAAkB7jB,KAAK0iB,SAAS3G,QAEtC/b,KAAK+C,IAAI,sBAAsB8gB,EAAgBvmB,KAAI,KAE/CumB,IACI9hB,EAAOsB,OACPrD,KAAKujB,SAAS,uDACdvjB,KAAK+C,IAAI,4CACT/C,KAAK8iB,QAAQ/gB,EAAOsB,SAGpBrD,KAAK2iB,kBAAmB,EACpBkB,EAAgBpI,WAChBoI,EAAgBpI,UAAU1Z,GAE9B/B,KAAK2jB,4BAKT,YAAAJ,SAAR,SAAiBvgB,GACbhD,KAAK0iB,SAAW,GAChB1iB,KAAKkB,KAAKmF,mBACVrG,KAAK+C,IAAI,8BAA8BC,IAInC,YAAA8gB,gBAAR,SAAwBC,GAEpB,IAAIC,EADJhkB,KAAK2iB,kBAAmB,EAExB3iB,KAAK+C,IAAI,uBAAuBghB,EAAQzmB,KAAI,KAC5C,IAAM2mB,EAAgBjkB,KAAK4jB,eAAerlB,KAAKyB,MACzC+K,EAAQgZ,EAAQhZ,MACtB,OAAQgZ,EAAQzmB,MACZ,KAAK4B,EAAIwN,OACLsX,EAAa,IAAI,GACbjZ,EAAO/K,KAAKkB,MAEhB,MACJ,KAAKhC,EAAI4N,OACLkX,EAAa,IAAI,EACbjZ,EAAO/K,KAAKkB,MAEhB,MACJ,KAAKhC,EAAI8N,OACLgX,EAAa,IAAI,GACbjZ,EAAO/K,KAAKkB,MAEhB,MACJ,KAAKhC,EAAIyN,OACLqX,EAAa,IAAI,GACbjZ,EAAO/K,KAAKkB,MAEhB,MACJ,KAAKhC,EAAI0N,MACLoX,EAAa,IAAI,GACbjZ,EAAO/K,KAAKkB,MAIxB8iB,EAAWna,WAAY,EACvBma,EAAW3V,QAAQrO,KAAK+a,eAAexM,KAAK0V,GAAetV,OAAM,SAAA3D,GAI7DiZ,EAHe,CACX5gB,MAAO2H,QAMX,YAAAoY,SAAR,SAAiBW,GAAjB,WACUnjB,EAAO,WACT,EAAK8hB,SAAS9hB,KAAKmjB,IAEjBG,EAAavkB,GAAQ,SAACD,EAASgK,GACjCqa,EAAQtI,UAAY,SAAC1Z,GACjBrC,EAAQqC,IAEZgiB,EAAQjB,QAAU,SAACzf,GACfqG,EAAOrG,OAWf,OAR0B,IAAtBrD,KAAK4iB,cACLhiB,IACAZ,KAAK2jB,0BAGL/iB,IAEJZ,KAAK+C,IAAI,oBAAoBghB,EAAQzmB,MAC9B4mB,GAGH,YAAAP,uBAAR,YACkC,IAA1B3jB,KAAK2iB,kBACD3iB,KAAK0iB,SAASrZ,OAAS,GACvBrJ,KAAK8jB,gBAAgB9jB,KAAK0iB,SAAS,KAKvC,YAAAM,kBAAR,SAA0B3gB,GAA1B,WACQ8hB,EAAuB,KAS3B,OARA9hB,EAAO8I,OAAM,SAAAnK,GAET,OAAa,MADC,EAAKnB,MAAMmB,KAErBmjB,EAAenjB,GACR,MAIRmjB,GAEf,EA1PA,CAAiC,GCVpBC,GAAe,SAACjiB,GACzB,IAAMkiB,EAAW,CACb/mB,KAAM6E,EAAG7E,KACT8E,QAASD,EAAGC,QACZC,OAAQ,IAYZ,OAVAF,EAAGE,OAAOiG,SAAQ,SAAAzI,GACd,IAAMykB,EAAa,CACfhnB,KAAMuC,EAAMvC,KACZwC,QAAS,IAEbD,EAAMC,QAAQwI,SAAQ,SAAAjI,GAClBikB,EAAWxkB,QAAQO,EAAO/C,MAAQ+C,KAEtCgkB,EAAShiB,OAAOzB,KAAK0jB,MAElBD,GCFX,cAeI,WAAYE,GARZ,KAAAC,YAAwB,GASpBxkB,KAAKkB,KAAO,IAAI,EAChBlB,KAAKykB,cAAgBxV,EAAY,SAAClN,GAC9BmN,KAAKwV,YAAY3iB,IACjBwiB,EA2TZ,OA3UI,sBAAI,iBAAE,C,IAAN,WACI,OAAOvkB,KAAKkB,KAAKiB,I,gCAOrB,sBAAc,qBAAM,C,IAApB,WACI,OAAOnC,KAAKkB,KAAK8D,Q,gCAUb,YAAA2f,mBAAR,SAA2BZ,GAA3B,WACUa,EAAa5U,EAAUhQ,KAAKwkB,aAAuB,EACzD,GAAII,EAAY,EACZ,OAAOplB,IAEX,IAAMqlB,EAAoB,GACpB1iB,EAAKnC,KAAKmC,GAMhB,OALA1E,OAAOC,eAAemnB,EAAmB,WAAY,CACjDjnB,IAAG,WACC,OAAOwmB,GAAajiB,MAGrBxC,GAAc,SAAC6B,GAClB,IAAI0G,EAAQ,EACN4c,EAAqB,WACvB,GAAI5c,GAAS0c,EAAW,CACpB,IAAIG,EAAgB/E,GAAiB,EAAKwE,YAAYtc,KAAlC8X,CAA4C+D,EAASc,GACpEE,GAAkBA,EAAcxW,OACjCwW,EAAgBtlB,QAAQC,QAAQqlB,IAEpCA,EAAcxW,MAAK,SAAAC,GACfsW,YAIJtjB,KAGRsjB,QAIR,YAAAE,aAAA,SAAajB,EAA2BnkB,GACpC,IAAIqlB,EACEla,EAAQgZ,EAAQhZ,MACtB,OAAQgZ,EAAQzmB,MACZ,KAAK4B,EAAIgmB,OACLtlB,IACAqlB,EAAcjlB,KAAKmlB,OAAOpa,GAC1B,MACJ,KAAK7L,EAAIkmB,OACLxlB,IACAqlB,EAAcjlB,KAAKyG,OAAOsE,GAC1B,MACJ,KAAK7L,EAAImmB,QACLzlB,IACAqlB,EAAcjlB,KAAKslB,UACnB,MACJ,KAAKpmB,EAAI4N,OACLmY,EAAc,IAAI,EAAOla,EAAO/K,KAAKkB,MACjCmN,QAAQzO,GACZ,MACJ,KAAKV,EAAIwN,OACLuY,EAAc,IAAI,GAAOla,EAAO/K,KAAKkB,MACjCmN,QAAQzO,GACZ,MACJ,KAAKV,EAAI0N,MACLqY,EAAc,IAAI,GAAMla,EAAO/K,KAAKkB,MAChCmN,QAAQzO,GACZ,MACJ,KAAKV,EAAI8N,OACLiY,EAAc,IAAI,GAAOla,EAAO/K,KAAKkB,MACjCmN,QAAQzO,GACZ,MACJ,KAAKV,EAAIqmB,UACL3lB,IACAqlB,EAAc,IAAI,GAAUla,EAAO/K,KAAKkB,MACpCmN,UACJ,MACJ,KAAKnP,EAAIsmB,OACL5lB,IACAqlB,EAAcjlB,KAAKylB,SACnB,MACJ,KAAKvmB,EAAIwmB,UACL9lB,IACAqlB,EAAcjlB,KAAK2lB,YACnB,MACJ,KAAKzmB,EAAI0mB,MACLhmB,IACAqlB,EAAc,IAAI,GAAMla,EAAO/K,KAAKkB,MAChCmN,UACJ,MACJ,KAAKnP,EAAIyN,OACLsY,EAAc,IAAI,GAAOla,EAAO/K,KAAKkB,MACjCmN,QAAQzO,GACZ,MACJ,KAAKV,EAAI2mB,MACLZ,EAAc,IAAI,GAAMla,EAAO/K,KAAKkB,MAChCmN,QAAQzO,GACZ,MACJ,KAAKV,EAAI4mB,YACLb,EAAc,IAAI,GAAYla,EAAO/K,KAAKkB,MACtCmN,QAAQzO,GACZ,MACJ,KAAKV,EAAI6mB,IACLnmB,IACAqlB,EAAc,EAAWrnB,IAAImN,EAAiB/K,KAAKkB,MACnD,MACJ,KAAKhC,EAAI8mB,IACLpmB,IACAqlB,EAAc,EAAWhkB,IAAI8J,EAAMzM,IAAKyM,EAAM/M,MAAOgC,KAAKkB,MAC1D,MACJ,KAAKhC,EAAI+mB,cACLrmB,IACAqlB,EAAcjlB,KAAKkmB,eAAenC,GAClC,MACJ,KAAK7kB,EAAIinB,gBACLvmB,IACAI,KAAKgF,OAAO/B,OAAS8H,EACrBka,EAAcxlB,QAAQC,UACtB,MACJ,KAAKR,EAAIknB,WAGL,OAFAxmB,IACcogB,GAAiBjV,IAM/B/K,KAAKwkB,YAAY5jB,KAAKmK,GACfvL,KALIiK,EACH,IAAI,EAAU1K,EAAW+F,kBAAmBiG,IAKxD,QACQ,EAGJka,EAAczlB,IAGtB,OADAQ,KAAKgF,OAAOjC,IAAI,mBAAmBghB,EAAQzmB,KAAI,kBACxC2nB,GAGH,YAAAoB,qBAAR,SAA6B7B,EAAoBziB,GAC7C,OAAOpC,GAAa,SAAC6B,GACjB,IAAI0G,EAAQ,EACN0c,EAAa5U,EAAUwU,GAAuB,EAC9CM,EAAqB,WACvB,GAAI5c,GAAS0c,EAAW,CACpB,IAAIG,EAAgBP,EAAYtc,KAASnG,GACnCgjB,aAAyBtlB,UAC3BslB,EAAgBvlB,EAAeulB,IAEnCA,EAAcxW,MAAK,SAAA+X,GACfvkB,EAASukB,EACTxB,YAIJtjB,EAAIO,IAGZ+iB,QAGA,YAAAyB,qBAAR,SAA6B/B,GACzB,OAAO7kB,GAAa,SAAC6B,GACjB,IAAI0G,EAAQ,EACN0c,EAAa5U,EAAUwU,GAAuB,EAC9CM,EAAqB,WACvB,GAAI5c,GAAS0c,EAAW,CACpB,IAAIG,EAAgBP,EAAYtc,OAC1B6c,aAAyBtlB,UAC3BslB,EAAgBvlB,EAAeulB,IAEnCA,EAAcxW,KAAKuW,QAGnBtjB,KAGRsjB,QAIR,YAAA0B,IAAA,SAAIzC,GAAJ,WACQ0C,EAAmB,GACjBC,EAAwB,GAC9B3C,EAAQ4C,SAAW,SAAC/mB,GAChB6mB,EAAiB7lB,MAAK,SAACmB,GACnB,OAAOnC,EAAGmC,OAGlBgiB,EAAQhJ,cAAgB,SAACnb,GACrB8mB,EAAsB9lB,MAAK,SAACmB,GACxB,OAAOnC,EAAGmC,OAGlB/B,KAAK2kB,mBAAmBZ,GAASxV,MAAK,SAAAC,GAClC,OAAO,EAAKwW,aAAajB,GAAS,WAC9B,OAAO,EAAKwC,qBAAqBG,MAClCnY,MAAK,SAACxM,GACL,OAAO,EAAKskB,qBAAqBI,EAAkB1kB,GAAQwM,MAAK,SAAA+X,GAC5D,EAAKhM,cAAc,CACfvY,OAAQukB,aAIrB3X,OAAM,SAAA1E,GACLwc,EAAmB,GACnB,IACM1kB,EAAS,CACXsB,MAFQsG,EAASM,IAIrB,EAAKqQ,cAAcvY,OAInB,YAAAmkB,eAAR,SAAuBnC,GACnB,OAAOpkB,GAAc,SAAC6B,EAAKC,GACvB,IACImlB,cAAa,aAAI7C,EAAQhZ,OACzBvJ,IACF,MAAOyF,GAELxF,EADY,IAAI,EAAU1C,EAAW8F,oBAAqBoC,EAAEpE,eAMhE,YAAAyX,cAAR,SAAsBvY,GAClB/B,KAAKgF,OAAOjC,IAAI,oCACZ/C,KAAKkB,MACLlB,KAAKkB,KAAK+D,UAEdjF,KAAKykB,cAAc1iB,IAGf,YAAA0jB,OAAR,WACI,IAAM9D,EAAS3hB,KAAKmC,GAAG7E,KACvB,OAAO0C,KAAK2lB,YAAYpX,MAAK,WACzB,OAAO,IAAI,IAASF,QAAQsT,OAIpC,YAAA2D,QAAA,WACI,OAAOtlB,KAAKkB,KAAKqF,SAGrB,YAAAof,UAAA,sBACI,OAAO3lB,KAAKslB,UAAU/W,MAAK,WACvB,EAAKrN,KAAKiB,GAAK,SAIvB,YAAAgjB,OAAA,SAAOpa,GAAP,WACI,OAAO/K,KAAKslB,UAAU/W,MAAK,SAAAC,GAavB,OAXI,EAAKrM,IAAM4I,EAAMzN,OAAS,EAAK6E,GAAG7E,KACxB,EAAKmJ,SAGL,EAAKA,OAAO,CAClBnJ,KAAMyN,EAAMzN,KACZ+E,OAAQ,GAERD,QAAS2I,EAAM3I,WAGRmM,MAAK,WAChB,OAAO,EAAKpM,UAKxB,YAAAsE,OAAA,SAAOogB,GAAP,WACI,IAAKxX,EACD,OAAO5F,EACH,IAAI,EAAU1K,EAAW0F,wBAIjC,IAAMqiB,EAASD,EAAW,IAAI,EAAOA,GAAY7mB,KAAKmC,GAGtD,OAFAnC,KAAKkB,KAAO,IAAI,EAETvB,GAAiB,SAAC6B,EAAKC,GAC1B,EAAKP,KAAKuF,OAAOqgB,GAAQvY,MAAK,SAACwY,GACvBA,EAAO5f,UACP,EAAWvJ,IACP,EAAWsE,SACX,EAAKhB,MACPqN,MAAK,SAACvQ,GACAA,GACAA,EAAMqE,OAAOiG,SAAQ,SAACzI,EAAOqI,GACzB,IAAM8e,EAAcF,EAAOzkB,OAAO6F,GAC9B8e,IACAA,EAAYjnB,mBACRF,EAAME,uBAItB,EAAKmB,KAAKiB,GAAK2kB,EACfC,EAAO1C,SAAWD,GAAa,EAAKjiB,IACpC,EAAWlB,IACP,EAAWiB,SAAU4kB,EACrB,EAAK5lB,MACPqN,MAAK,WACH/M,EAAIulB,SAKZ,EAAWnpB,IACP,EAAWsE,SACX,EAAKhB,MACPqN,MAAK,SAACvQ,GACJ,EAAKkD,KAAKiB,GAAKnE,EACf+oB,EAAO1C,SAAWD,GAAa,EAAKjiB,IACpCX,EAAIulB,SAGbpY,MAAMlN,OAGrB,EA9UA,GCbA,GAAIwN,EAAW,CACX,IAAM,GAAU,IAAI,GACnBC,KAAa+X,UAAY,SAAUhgB,GAChC,GAAQuf,IAAIvf,EAAE2R","file":"jsstore.worker.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n","export const promiseResolve = (value?) => {\n return Promise.resolve(value);\n}","export enum ERROR_TYPE {\n InvalidUpdateColumn = \"invalid_update_column\",\n UndefinedColumn = \"undefined_column\",\n UndefinedValue = \"undefined_value\",\n UndefinedColumnName = \"undefined_column_name\",\n UndefinedDbName = \"undefined_database_name\",\n UndefinedColumnValue = \"undefined_column_value\",\n NotArray = \"not_array\",\n NoValueSupplied = \"no_value_supplied\",\n ColumnNotExist = \"column_not_exist\",\n EnableSearchOff = \"enable_search_off\",\n InvalidOp = \"invalid_operator\",\n NullValue = \"null_value\",\n WrongDataType = \"wrong_data_type\",\n TableNotExist = \"table_not_exist\",\n DbNotExist = \"db_not_exist\",\n ConnectionAborted = \"connection_aborted\",\n ConnectionClosed = \"connection_closed\",\n NotObject = \"not_object\",\n InvalidConfig = \"invalid_config\",\n DbBlocked = \"Db_blocked\",\n IndexedDbNotSupported = \"indexeddb_not_supported\",\n NullValueInWhere = \"null_value_in_where\",\n InvalidJoinQuery = 'invalid_join_query',\n InvalidOrderQuery = 'invalid_order_query',\n InvalidQuery = 'invalid_query',\n InvalidGroupQuery = 'invalid_group_query',\n ImportScriptsFailed = 'import_scripts_failed',\n MethodNotExist = 'method_not_exist',\n Unknown = \"unknown\",\n InvalidMiddleware = \"invalid_middleware\"\n}\n\nexport enum WORKER_STATUS {\n Registered = \"registerd\",\n Failed = \"failed\",\n NotStarted = \"not_started\"\n}\n\nexport enum DATA_TYPE {\n String = \"string\",\n Object = \"object\",\n Array = \"array\",\n Number = \"number\",\n Boolean = \"boolean\",\n Null = \"null\",\n DateTime = \"date_time\"\n}\n\nexport enum API {\n InitDb = \"init_db\",\n Get = \"get\",\n Set = \"set\",\n Select = \"select\",\n Insert = \"insert\",\n Update = \"update\",\n Remove = \"remove\",\n OpenDb = \"open_db\",\n Clear = \"clear\",\n DropDb = \"drop_db\",\n Count = \"count\",\n ChangeLogStatus = \"change_log_status\",\n Terminate = \"terminate\",\n Transaction = \"transaction\",\n CloseDb = \"close_db\",\n Union = \"union\",\n Intersect = \"intersect\",\n ImportScripts = \"import_scripts\",\n Middleware = \"middleware\"\n}\n\nexport enum EVENT {\n RequestQueueEmpty = \"requestQueueEmpty\",\n RequestQueueFilled = \"requestQueueFilled\",\n Upgrade = \"upgrade\",\n Create = \"create\",\n Open = \"open\"\n}\n\nexport enum QUERY_OPTION {\n Where = \"where\",\n Like = 'like',\n Regex = 'regex',\n In = 'in',\n Equal = \"=\",\n Between = '-',\n GreaterThan = '>',\n LessThan = '<',\n GreaterThanEqualTo = \">=\",\n LessThanEqualTo = \"<=\",\n NotEqualTo = \"!=\",\n Aggregate = \"aggregate\",\n Max = \"max\",\n Min = \"min\",\n Avg = \"avg\",\n Count = \"count\",\n Sum = \"sum\",\n Or = \"or\",\n Skip = \"skip\",\n Limit = \"limit\",\n And = \"and\",\n IgnoreCase = \"ignoreCase\",\n Then = \"then\"\n}\n\nexport enum IDB_MODE {\n ReadOnly = \"readonly\",\n ReadWrite = \"readwrite\"\n}\n\nexport enum OCCURENCE {\n First = 'f',\n Last = 'l',\n Any = 'a'\n}\n\nexport enum CONNECTION_STATUS {\n Connected = \"connected\",\n Closed = \"closed\",\n NotStarted = \"not_started\",\n UnableToStart = \"unable_to_start\",\n ClosedByJsStore = \"closed_by_jsstore\"\n}","export const promise = (cb: (res, rej?) => any) => {\n return new Promise(cb);\n}","import { ITable, IAlterQuery, IColumn, TColumns } from \"@/common\";\n\nexport class TableMeta {\n name: string;\n columns: IColumn[] = [];\n primaryKey: string;\n autoIncColumnValue = {};\n alter?: IAlterQuery;\n\n constructor(table: ITable) {\n this.columns = this.setColumn(table.columns);\n this.name = table.name;\n this.alter = table.alter || {};\n }\n\n setColumn(tableColumns: TColumns) {\n const columns = [];\n for (const columnName in tableColumns) {\n const column: IColumn = tableColumns[columnName] as any;\n column.name = columnName;\n if (column.autoIncrement) {\n this.autoIncColumnValue[columnName] = 0;\n }\n if (column.primaryKey) {\n this.primaryKey = columnName;\n }\n column.enableSearch = column.enableSearch == null ? true : column.enableSearch;\n const existingColumnIndex = this.columns.indexOf(q => q.name === columnName);\n if (existingColumnIndex < 0) {\n columns.push(column);\n }\n else {\n const existingColumn = this.columns[existingColumnIndex];\n Object.assign(existingColumn, column);\n }\n }\n return columns;\n }\n\n\n}","import { IDBUtil } from \"@/worker/idbutil\";\nimport { promise } from \"@/common\";\n\nexport class MetaHelper {\n static tableName = \"JsStore_Meta\";\n static autoIncrementKey(tableName: string, columnName: string) {\n return `JsStore_${tableName}_${columnName}_Value`;\n }\n static dbSchema = `JsStore_DbSchema`;\n\n static set(key, value, util: IDBUtil) {\n if (!util.tx) {\n util.createTransaction([MetaHelper.tableName]);\n }\n const store = util.objectStore(MetaHelper.tableName);\n\n return promise((res, rej) => {\n const req = store.put({\n key, value\n });\n req.onsuccess = () => {\n res();\n };\n req.onerror = rej;\n });\n }\n\n static get(key, util: IDBUtil) {\n if (!util.tx) {\n util.createTransaction([MetaHelper.tableName]);\n }\n const store = util.objectStore(MetaHelper.tableName);\n\n return promise((res, rej) => {\n const req = store.get(\n util.keyRange(key)\n );\n req.onsuccess = () => {\n const result = req.result;\n res(result && result.value);\n };\n req.onerror = rej;\n });\n }\n\n static remove(key, util: IDBUtil) {\n if (!util.tx) {\n util.createTransaction([MetaHelper.tableName]);\n }\n const store = util.objectStore(MetaHelper.tableName);\n\n return promise((res, rej) => {\n const req = store.delete(\n util.keyRange(key)\n );\n req.onsuccess = res;\n req.onerror = rej;\n });\n }\n}","import { IDataBase } from \"@/common\";\nimport { TableMeta } from \"./table_meta\";\nimport { MetaHelper } from \"@worker/meta_helper\";\n\nexport class DbMeta {\n name: string;\n version: number;\n tables: TableMeta[];\n\n constructor(db: IDataBase) {\n this.name = db.name;\n this.version = db.version || 1;\n db.tables.push({\n name: MetaHelper.tableName,\n columns: {\n key: {\n primaryKey: true\n },\n value: {\n enableSearch: false\n }\n },\n })\n this.tables = db.tables.map(table => {\n return new TableMeta(table);\n });\n }\n}","export const forObj = (obj: object, cb: (key, value) => void) => {\n for (const key in obj) {\n cb(key, obj[key]);\n }\n}","import { ERROR_TYPE, IError } from \"@/common\";\n\nexport class LogHelper implements IError {\n type: ERROR_TYPE;\n message: string;\n private info_: any;\n\n status: boolean;\n\n log(msg) {\n if (this.status) {\n console.log(msg);\n }\n }\n\n constructor(type: ERROR_TYPE, info?) {\n this.type = type;\n this.info_ = info;\n this.message = this.getMsg_();\n }\n\n throw() {\n throw this.get();\n }\n\n\n logError() {\n console.error(this.get());\n }\n\n\n\n get() {\n return {\n message: this.message,\n type: this.type\n } as IError;\n }\n\n private getMsg_() {\n let errMsg: string;\n switch (this.type) {\n case ERROR_TYPE.NotArray:\n errMsg = \"Supplied value is not an array\";\n break;\n case ERROR_TYPE.UndefinedColumn:\n errMsg = \"Column is undefined in Where\";\n break;\n case ERROR_TYPE.UndefinedValue:\n errMsg = \"Value is undefined in Where\";\n break;\n case ERROR_TYPE.UndefinedColumnName:\n errMsg = \"Column name is undefined '\" + this.info_['TableName'] + \"'\";\n break;\n case ERROR_TYPE.UndefinedDbName:\n errMsg = \"Database name is not supplied\";\n break;\n case ERROR_TYPE.UndefinedColumnValue:\n errMsg = \"Column value is undefined\";\n break;\n case ERROR_TYPE.NoValueSupplied:\n errMsg = \"No value is supplied\";\n break;\n case ERROR_TYPE.InvalidOp:\n errMsg = \"Invalid Op Value '\" + this.info_['Op'] + \"'\";\n break;\n case ERROR_TYPE.ColumnNotExist:\n errMsg = this.info_['isOrder'] ?\n `Column '${this.info_['column']}' in order query does not exist` :\n `Column '${this.info_['column']}' does not exist`;\n break;\n case ERROR_TYPE.EnableSearchOff:\n errMsg = \"Search is turned off for the Column '\" + this.info_['column'] + \"'\";\n break;\n case ERROR_TYPE.NullValue:\n errMsg = \"Null value is not allowed for column '\" + this.info_['ColumnName'] + \"'\";\n break;\n case ERROR_TYPE.WrongDataType:\n errMsg = \"Supplied value for column '\" + this.info_['column'] +\n \"' have wrong data type\";\n break;\n case ERROR_TYPE.TableNotExist:\n errMsg = \"Table '\" + this.info_['tableName'] + \"' does not exist\";\n break;\n case ERROR_TYPE.DbNotExist:\n errMsg = `Database with name ${this.info_['dbName']} does not exist`;\n break;\n case ERROR_TYPE.NotObject:\n errMsg = \"supplied value is not object\";\n break;\n case ERROR_TYPE.InvalidOp:\n errMsg = \"Invalid Config '\" + this.info_['Config'] + \" '\";\n break;\n case ERROR_TYPE.DbBlocked:\n errMsg = `database is blocked, cant be deleted right now`;\n break;\n case ERROR_TYPE.NullValueInWhere:\n errMsg = `Null/undefined is not allowed in where. Column '${this.info_['column']}' has null`;\n break;\n case ERROR_TYPE.MethodNotExist:\n errMsg = `method '${this.info_}' does not exist.`;\n break;\n case ERROR_TYPE.IndexedDbNotSupported:\n errMsg = \"Browser does not support indexeddb\";\n break;\n case ERROR_TYPE.InvalidJoinQuery:\n case ERROR_TYPE.InvalidGroupQuery:\n case ERROR_TYPE.InvalidOrderQuery:\n case ERROR_TYPE.ImportScriptsFailed:\n errMsg = this.info_;\n break;\n case ERROR_TYPE.InvalidMiddleware:\n errMsg = `No function ${this.info_} is found.`;\n break;\n default:\n if (!this.type) {\n this.type = ERROR_TYPE.Unknown\n }\n errMsg = this.message;\n break;\n }\n return errMsg;\n }\n}","import { DbMeta, TableMeta } from \"@worker/model\";\nimport { IDB_MODE, QUERY_OPTION, promise, forObj, IColumn, IDataBase, InitDbResult } from \"@/common\";\nimport { LogHelper, userDbSchema } from \"@worker/utils\";\nimport { MetaHelper } from \"../meta_helper\";\n\n\nexport class IDBUtil {\n\n db: DbMeta;\n\n con: IDBDatabase;\n tx: IDBTransaction;\n\n logger = new LogHelper(null);\n\n emptyTx() {\n if (!this.tx) return;\n this.tx.oncomplete = null;\n this.tx.onabort = null;\n this.tx.onerror = null;\n this.tx = null;\n }\n\n createTransactionIfNotExist(tables: string[], mode?: IDB_MODE) {\n if (!this.tx) {\n this.createTransaction(tables, mode);\n }\n }\n\n createTransaction(tables: string[], mode = IDB_MODE.ReadWrite) {\n this.tx = this.con.transaction(tables, mode);\n return promise((res, rej) => {\n this.tx.oncomplete = res;\n this.tx.onabort = res;\n this.tx.onerror = rej;\n });\n }\n\n keyRange(value, op?) {\n let keyRange: IDBKeyRange;\n switch (op) {\n case QUERY_OPTION.Between: keyRange = IDBKeyRange.bound(value.low, value.high, false, false); break;\n case QUERY_OPTION.GreaterThan: keyRange = IDBKeyRange.lowerBound(value, true); break;\n case QUERY_OPTION.GreaterThanEqualTo: keyRange = IDBKeyRange.lowerBound(value); break;\n case QUERY_OPTION.LessThan: keyRange = IDBKeyRange.upperBound(value, true); break;\n case QUERY_OPTION.LessThanEqualTo: keyRange = IDBKeyRange.upperBound(value); break;\n default: keyRange = IDBKeyRange.only(value); break;\n }\n return keyRange;\n }\n\n objectStore(name: string) {\n return this.tx.objectStore(name);\n }\n\n abortTransaction() {\n if (this.tx) {\n this.tx.abort();\n }\n }\n\n close() {\n if (this.con) {\n this.con.close();\n }\n // wait for 100 ms before success\n return promise(res => {\n this.con = null;\n setTimeout(res, 100);\n });\n }\n\n initDb(db: DbMeta) {\n let isDbCreated = false;\n const dbVersion = db.version;\n let oldVersion;\n const initLogic = (res, rej) => {\n const dbOpenRequest = indexedDB.open(db.name, dbVersion);\n dbOpenRequest.onsuccess = () => {\n this.con = dbOpenRequest.result;\n this.con.onversionchange = (e: any) => {\n // if (e.newVersion === null) { // An attempt is made to delete the db\n e.target.close(); // Manually close our connection to the db\n // }\n }\n\n res({\n isCreated: isDbCreated,\n oldVersion: oldVersion,\n newVersion: dbVersion\n } as InitDbResult);\n }\n\n dbOpenRequest.onerror = (e) => {\n console.error(\"error\", e);\n rej(e);\n };\n\n dbOpenRequest.onupgradeneeded = (e: IDBVersionChangeEvent) => {\n oldVersion = e.oldVersion;\n const target: {\n result: IDBDatabase,\n transaction: IDBTransaction\n } = (e as any).target\n const upgradeConnection = target.result;\n isDbCreated = true;\n const transaction = target.transaction;\n const storeNames = upgradeConnection.objectStoreNames;\n const createObjectStore = (table: TableMeta) => {\n const option: IDBObjectStoreParameters = table.primaryKey ? {\n keyPath: table.primaryKey\n } : {\n autoIncrement: true\n }\n\n const store = upgradeConnection.createObjectStore(table.name, option);\n table.columns.forEach(column => {\n addColumn(store, column)\n });\n }\n const addColumn = (store: IDBObjectStore, column: IColumn) => {\n const columnName = column.name;\n if (column.enableSearch && !store.indexNames.contains(columnName)) {\n const options = column.primaryKey ? { unique: true } : { unique: column.unique };\n options['multiEntry'] = column.multiEntry;\n const keyPath = column.keyPath == null ? columnName : column.keyPath;\n store.createIndex(columnName, keyPath, options);\n }\n }\n const deleteColumn = (store: IDBObjectStore, table: TableMeta, columnName: string) => {\n const index = table.columns.findIndex(q => q.name === columnName);\n if (index >= 0) {\n table.columns.splice(index, 1);\n store.deleteIndex(columnName);\n }\n }\n db.tables.forEach(table => {\n if (!storeNames.contains(table.name)) {\n return createObjectStore(table);\n }\n const store = transaction.objectStore(table.name);\n for (let i = oldVersion + 1; i <= dbVersion; i++) {\n const alterQuery = table.alter[i];\n if (alterQuery) {\n if (alterQuery.add) {\n const newColumns = table.setColumn(alterQuery.add);\n newColumns.forEach(column => {\n addColumn(store, column);\n table.columns.push(column);\n })\n }\n forObj(\n alterQuery.drop || {}, ((columnName) => {\n deleteColumn(store, table, columnName);\n })\n )\n forObj(\n alterQuery.modify || {}, ((columnName, column: IColumn) => {\n const shouldDelete = column.multiEntry || column.keyPath || column.unique;\n let targetColumn = table.columns.find(q => q.name === columnName);\n const newColumn = Object.assign(targetColumn, column);\n newColumn.name = columnName;\n if (shouldDelete) {\n deleteColumn(store, table, columnName);\n addColumn(store, newColumn);\n table.columns.push(newColumn);\n }\n })\n )\n }\n }\n });\n\n for (let i = 0, length = storeNames.length; i < length; i++) {\n const storeName = storeNames.item(i);\n const tableIndex = db.tables.findIndex(qry => qry.name === storeName);\n if (tableIndex < 0) {\n upgradeConnection.deleteObjectStore(storeName);\n }\n }\n\n }\n }\n return promise(initLogic)\n }\n}","export const promiseAll = (promises: any) => {\n return Promise.all(promises);\n};","export const promiseReject = (value) => {\n return Promise.reject(value);\n}","import { LogHelper } from \"./log_helper\";\n\nexport const getError = (e) => {\n const customError = e instanceof LogHelper;\n if (customError) {\n e.logError();\n return (e as LogHelper).get();\n }\n else {\n let error;\n if (e.name) {\n error = new LogHelper(e.name);\n error.message = e.message;\n }\n else {\n error = new LogHelper((e as any).target.error.name);\n error.message = (e as any).target.error.message;\n }\n if (process.env.NODE_ENV === 'dev') {\n error.logError();\n }\n return error.get();\n }\n}","import { IDBUtil } from \"@worker/idbutil\";\nimport { IInsertQuery, ISelectQuery, ERROR_TYPE, IUpdateQuery } from \"@/common\";\nimport { LogHelper, getError, promiseReject, getErrorFromException } from \"@worker/utils\";\nimport { DbMeta } from \"@worker/model\";\n\nexport class Base {\n // db: DbMeta;\n\n get db() {\n return this.util.db;\n }\n\n util: IDBUtil;\n query: IInsertQuery | ISelectQuery | IUpdateQuery;\n\n rowAffected = 0;\n isTxQuery = false;\n objectStore: IDBObjectStore;\n tableName: string;\n\n protected results: any[] = [];\n // get tableName() {\n // return (this.query as SelectQuery).from || (this.query as InsertQuery).into\n // }\n\n table(name?: string) {\n const tableName = name || this.tableName;\n return this.db.tables.find(q => q.name === tableName)\n }\n\n primaryKey(tableName?: string) {\n return this.table(tableName).primaryKey;\n }\n\n\n protected getColumnInfo(columnName: string, tableName?: string) {\n return this.table(tableName).columns.find(column => column.name === columnName);\n }\n\n\n\n onException(ex: DOMException, type?) {\n console.error(ex);\n this.util.abortTransaction();\n return promiseReject(\n getErrorFromException(ex, type)\n );\n }\n}","import { ERROR_TYPE } from \"@/common\"\nimport { getError } from \"./get_error\";\n\nexport const getErrorFromException = (ex, type = ERROR_TYPE.InvalidQuery) => {\n ex.name = type;\n return getError(ex);\n}","import { DATA_TYPE } from \"@/common\";\n\nexport const getDataType = (value) => {\n if (value == null) {\n return DATA_TYPE.Null;\n }\n const type = typeof value;\n switch (type) {\n case 'object':\n if (Array.isArray(value)) {\n return DATA_TYPE.Array;\n }\n if (value instanceof Date) {\n return DATA_TYPE.DateTime;\n }\n }\n return type;\n}","export const isNull = (value) => {\n if (value == null) {\n return true;\n } else {\n switch (typeof value) {\n case 'string': return value.length === 0;\n case 'number': return isNaN(value);\n }\n }\n return false;\n};","import { TableMeta } from \"@/worker/model/table_meta\";\nimport { IColumn, TStringAny, ERROR_TYPE, DATA_TYPE, IInsertQuery } from \"@/common\";\nimport { getDataType, LogHelper, isNull } from \"@/worker/utils\";\n\n\nexport class ValuesChecker {\n table: TableMeta;\n autoIncrementValue;\n query: IInsertQuery;\n\n constructor(table: TableMeta, autoIncValues) {\n this.table = table;\n this.autoIncrementValue = autoIncValues;\n }\n\n checkAndModifyValues(query: IInsertQuery) {\n let err: LogHelper;\n this.query = query;\n const values = query.values;\n const ignoreIndexes = [];\n values.every((item, index) => {\n err = this.checkAndModifyValue(item);\n if (query.ignore && err) {\n ignoreIndexes.push(index);\n err = null;\n }\n return err ? false : true;\n });\n ignoreIndexes.forEach(index => {\n values.splice(index, 1);\n });\n return { err, values };\n }\n\n private checkAndModifyValue(value) {\n let error: LogHelper;\n this.table.columns.every(column => {\n error = this.checkAndModifyColumnValue_(column, value);\n return error ? false : true;\n })\n return error;\n }\n\n private checkNotNullAndDataType_(column: IColumn, value: TStringAny) {\n // check not null schema\n if (column.notNull && isNull(value[column.name])) {\n return this.getError(ERROR_TYPE.NullValue, { ColumnName: column.name });\n }\n // check datatype\n else if (column.dataType && !isNull(value[column.name]) &&\n getDataType(value[column.name]) !== column.dataType) {\n return this.getError(ERROR_TYPE.WrongDataType, { column: column.name });\n }\n }\n\n private checkAndModifyColumnValue_(column: IColumn, value: TStringAny) {\n const columnValue = value[column.name];\n // check auto increment scheme\n if (column.autoIncrement) {\n // if value is null, then create the autoincrement value\n if (isNull(columnValue)) {\n value[column.name] = ++this.autoIncrementValue[column.name];\n }\n else {\n if (getDataType(columnValue) === DATA_TYPE.Number) {\n // if column value is greater than autoincrement value saved, then make the\n // column value as autoIncrement value\n if (columnValue > this.autoIncrementValue[column.name]) {\n this.autoIncrementValue[column.name] = columnValue;\n }\n }\n }\n }\n // check Default Schema\n else if (column.default !== undefined && isNull(columnValue)) {\n value[column.name] = column.default;\n }\n const query = this.query;\n if (query.validation) {\n return this.checkNotNullAndDataType_(column, value);\n }\n }\n\n private getError(error: ERROR_TYPE, details: object) {\n return new LogHelper(error, details);\n }\n}","import { IColumn, DATA_TYPE, ERROR_TYPE } from \"@/common\";\nimport { LogHelper, isNull, getDataType } from \"@worker/utils\";\nimport { TableMeta } from \"@worker/model\";\n\nexport class SchemaChecker {\n table: TableMeta;\n constructor(table: TableMeta) {\n this.table = table;\n }\n\n check(setValue: object, tblName: string) {\n let log: LogHelper;\n if (typeof setValue === DATA_TYPE.Object) {\n if (this.table) {\n // loop through table column and find data is valid\n this.table.columns.every((column) => {\n if (column.name in setValue) {\n log = this.checkByColumn_(column, setValue[column.name]);\n }\n return log ? false : true;\n });\n }\n else {\n log = new LogHelper(ERROR_TYPE.TableNotExist, { tableName: tblName });\n }\n }\n else {\n log = new LogHelper(ERROR_TYPE.NotObject);\n }\n return log;\n }\n\n\n\n private checkByColumn_(column: IColumn, value) {\n // check not null schema\n if (column.notNull === true && isNull(value)) {\n return new LogHelper(ERROR_TYPE.NullValue, { ColumnName: column.name });\n }\n\n // check datatype\n const type = getDataType(value);\n const checkFurther = value != null;\n if (column.dataType && checkFurther) {\n if (type !== column.dataType && type !== 'object') {\n return new LogHelper(ERROR_TYPE.WrongDataType, { column: column.name });\n }\n }\n\n // check allowed operators\n if (checkFurther && type === 'object') {\n const allowedOp = ['+', '-', '*', '/', '{push}'];\n for (const prop in value) {\n if (allowedOp.indexOf(prop) < 0 && column.dataType && type !== column.dataType) {\n return new LogHelper(ERROR_TYPE.WrongDataType, { column: column.name });\n }\n }\n }\n }\n}","import { IInsertQuery, DATA_TYPE, ERROR_TYPE, ISelectQuery, QUERY_OPTION, IUpdateQuery, API } from \"@/common\";\nimport { LogHelper, getDataType } from \"@/worker/utils\";\nimport { DbMeta } from \"../model\";\nimport { ValuesChecker } from \"@worker/executors/insert\";\nimport { SchemaChecker } from \"./update/schema_checker\";\n\nexport class QueryHelper {\n db: DbMeta;\n\n constructor(dbSchema: DbMeta) {\n this.db = dbSchema;\n }\n\n validate(api: API, query: IInsertQuery | ISelectQuery | IUpdateQuery) {\n switch (api) {\n case API.Select:\n case API.Remove:\n case API.Count:\n return this.checkSelect(query as ISelectQuery);\n case API.Insert:\n return this.checkInsertQuery(query as IInsertQuery);\n case API.Update:\n return this.checkUpdate(query as IUpdateQuery);\n }\n }\n\n private getTable_(tableName: string) {\n return this.db.tables.find(q => q.name === tableName);\n }\n\n isInsertQryValid(query: IInsertQuery) {\n const table = this.getTable_(query.into);\n let log: LogHelper;\n if (table) {\n switch (getDataType(query.values)) {\n case DATA_TYPE.Array:\n break;\n case DATA_TYPE.Null:\n log = new LogHelper(ERROR_TYPE.NoValueSupplied);\n break;\n default:\n log = new LogHelper(ERROR_TYPE.NotArray);\n }\n }\n else {\n log = new LogHelper(ERROR_TYPE.TableNotExist, { tableName: query.into });\n }\n return {\n table, log\n };\n }\n\n private checkUpdate(query: IUpdateQuery) {\n let err = new SchemaChecker(this.getTable_(query.in)).\n check(query.set, query.in);\n if (err) return err;\n if (query.where != null) {\n err = this.checkForNullInWhere_(query);\n if (err) return err;\n this.addGreatAndLessToNotOp_(query as any);\n }\n }\n\n private checkSelect(query: ISelectQuery) {\n const table = this.getTable_(query.from);\n if (!table) {\n return new LogHelper(ERROR_TYPE.TableNotExist,\n { tableName: query.from }\n );\n }\n\n if (query.where) {\n const err = this.checkForNullInWhere_(query);\n if (err) return err;\n this.addGreatAndLessToNotOp_(query);\n }\n }\n\n private checkForNullInWhere_(query): LogHelper {\n for (const columnName in query.where) {\n if (query.where[columnName] == null) {\n return new LogHelper(ERROR_TYPE.NullValueInWhere, { column: columnName });\n }\n }\n }\n\n private addGreatAndLessToNotOp_(query: ISelectQuery) {\n const whereQuery = query.where;\n const containsNot = (qry: object, keys: string[]) => {\n return keys.findIndex(key => qry[key][QUERY_OPTION.NotEqualTo] != null) >= 0;\n };\n const addToSingleQry = (qry, keys: string[]) => {\n let value;\n keys.forEach((prop) => {\n value = qry[prop];\n if (value[QUERY_OPTION.NotEqualTo] != null) {\n qry[prop][QUERY_OPTION.GreaterThan] = value[QUERY_OPTION.NotEqualTo];\n if (qry[QUERY_OPTION.Or] === undefined) {\n qry[QUERY_OPTION.Or] = {};\n qry[QUERY_OPTION.Or][prop] = {};\n }\n else if (qry[QUERY_OPTION.Or][prop] === undefined) {\n qry[QUERY_OPTION.Or][prop] = {};\n }\n qry[QUERY_OPTION.Or][prop][QUERY_OPTION.LessThan] = value[QUERY_OPTION.NotEqualTo];\n delete qry[prop][QUERY_OPTION.NotEqualTo];\n }\n });\n return qry;\n };\n switch (getDataType(whereQuery)) {\n case DATA_TYPE.Object:\n const queryKeys = Object.keys(whereQuery);\n if (containsNot(whereQuery, queryKeys)) {\n if (queryKeys.length === 1) {\n query.where = addToSingleQry(whereQuery, queryKeys);\n }\n else {\n const whereTmpQry = [];\n queryKeys.forEach((prop) => {\n whereTmpQry.push(addToSingleQry({ [prop]: whereQuery[prop] }, [prop]));\n });\n query.where = whereTmpQry;\n }\n }\n break;\n default:\n const whereTmp = [];\n (whereQuery as object[]).forEach(qry => {\n const qryKeys = Object.keys(qry);\n if (containsNot(qry, qryKeys)) {\n qry = addToSingleQry(qry, qryKeys);\n }\n whereTmp.push(qry);\n });\n query.where = whereTmp;\n }\n }\n\n private checkInsertQuery(query: IInsertQuery) {\n const validResult = this.isInsertQryValid(query);\n let table = validResult.table;\n const error = validResult.log;\n if (error) return error;\n if (query.skipDataCheck) return;\n const valueCheckerInstance = new ValuesChecker(table, table.autoIncColumnValue);\n const { values, err } = valueCheckerInstance.checkAndModifyValues(query);\n query.values = values;\n return err;\n }\n}","export * from \"./values_checker\";\nimport { IInsertQuery, promise, promiseAll, TStringAny, API, IDB_MODE } from \"@/common\";\nimport { Base } from \"@worker/executors/base\";\nimport { IDBUtil } from \"@/worker/idbutil\";\nimport { QueryHelper } from \"@worker/executors/query_helper\";\nimport { DbMeta } from \"@/worker/model\";\nimport { getError, promiseReject } from \"@/worker/utils\";\nimport { MetaHelper } from \"@/worker/meta_helper\";\n\nexport class Insert extends Base {\n\n query: IInsertQuery;\n\n private valuesAffected_ = [];\n\n constructor(query: IInsertQuery, util: IDBUtil) {\n super();\n if (query.validation == null) {\n query.validation = true;\n }\n this.query = query;\n this.util = util;\n this.tableName = query.into;\n }\n\n execute(beforeInsert: () => Promise) {\n const db = this.db;\n const err = new QueryHelper(db).validate(API.Insert, this.query);\n if (err) return promiseReject(err);\n\n return beforeInsert().then(_ => {\n return this.insertData_(db).then(_ => {\n return this.query.return ? this.valuesAffected_ : this.rowAffected\n })\n }).catch(err => {\n this.util.abortTransaction();\n return promiseReject(err);\n })\n }\n\n private insertData_(db: DbMeta) {\n\n let onInsertData;\n let addMethod;\n\n const query = this.query;\n if (query.return) {\n onInsertData = (value) => {\n this.valuesAffected_.push(value);\n };\n\n }\n else {\n onInsertData = (value) => {\n ++this.rowAffected;\n };\n }\n addMethod = (() => {\n const idbMethod = query.upsert ? \"put\" : \"add\";\n if (query.ignore && !this.isTxQuery) {\n return (value) => {\n const tx = this.util.con.transaction(query.into, IDB_MODE.ReadWrite);\n const objectStore = tx.objectStore(query.into);\n return objectStore[idbMethod](value);\n };\n }\n if (!this.isTxQuery) {\n this.util.createTransaction(\n [query.into, MetaHelper.tableName],\n )\n }\n this.objectStore = this.util.objectStore(this.tableName);\n return (value) => {\n return this.objectStore[idbMethod](value);\n };\n })();\n\n return promiseAll(\n query.values.map((value) => {\n return promise((res, rej) => {\n const addResult = addMethod(value);\n addResult.onerror = (err) => {\n if (query.ignore) {\n res();\n } else {\n rej(err);\n }\n }\n addResult.onsuccess = function () {\n onInsertData(value);\n res();\n };\n });\n })\n ).then(() => {\n MetaHelper.set(MetaHelper.dbSchema, db, this.util);\n });\n }\n}","import { setCrossBrowserIndexedDb } from \"@worker/utils\";\n\nexport const IS_WORKER = typeof (self as any).alert === 'undefined' && typeof ServiceWorkerGlobalScope === 'undefined';\nexport const IS_IDB_SUPPORTED = setCrossBrowserIndexedDb();","export const setCrossBrowserIndexedDb = () => {\n try {\n if (!indexedDB) {\n indexedDB = (self as any).mozIndexedDB ||\n (self as any).webkitIndexedDB || (self as any).msIndexedDB;\n }\n if (indexedDB) {\n IDBTransaction = IDBTransaction ||\n (self as any).webkitIDBTransaction || (self as any).msIDBTransaction;\n (self as any).IDBKeyRange = (self as any).IDBKeyRange ||\n (self as any).webkitIDBKeyRange || (self as any).msIDBKeyRange;\n }\n else {\n return false;\n }\n } catch (ex) {\n return false;\n }\n return true;\n};","export const getKeys = (value) => {\n return Object.keys(value);\n};","export const isArray = (value) => {\n return Array.isArray(value);\n};","import { getKeys } from \"./get_keys\"\n\nexport const getLength = (value): Number => {\n return getKeys(value).length;\n}","export const getObjectFirstKey = (value) => {\n for (const key in value) {\n return key;\n }\n};","import { ICaseOption, QUERY_OPTION } from \"@/common\";\n\nexport class ThenEvaluator {\n private columnName_: string;\n private value;\n private caseQuery_: { [columnName: string]: [ICaseOption] };\n private caseColumnQuery_: ICaseOption[];\n private length_: number;\n\n setCaseAndValue(caseQuery: any, value) {\n this.caseQuery_ = caseQuery;\n this.setValue(value);\n }\n\n setCaseAndColumn(caseQuery: { [columnName: string]: [ICaseOption] }, columnName: string) {\n this.caseQuery_ = caseQuery;\n this.setColumn(columnName);\n return this;\n }\n\n setColumn(columnName: string) {\n this.columnName_ = columnName;\n this.caseColumnQuery_ = this.caseQuery_[this.columnName_];\n this.length_ = this.caseColumnQuery_.length;\n return this;\n }\n\n setValue(value) {\n this.value = value;\n return this;\n }\n\n evaluate() {\n for (let i = 0; i < this.length_; i++) {\n if (this.checkCase_(this.caseColumnQuery_[i]) === true) {\n return this.caseColumnQuery_[i].then;\n }\n }\n const lastThen = this.caseColumnQuery_[this.length_ - 1].then;\n return lastThen == null ? this.value[this.columnName_] : lastThen;\n }\n\n private checkCase_(cond: ICaseOption) {\n let queryOption;\n for (queryOption in cond) {\n switch (queryOption) {\n case QUERY_OPTION.GreaterThan:\n if (this.value[this.columnName_] > cond[queryOption]) {\n return true;\n } break;\n case QUERY_OPTION.Equal:\n if (this.value[this.columnName_] === cond[queryOption]) {\n return true;\n } break;\n case QUERY_OPTION.LessThan:\n if (this.value[this.columnName_] < cond[queryOption]) {\n return true;\n } break;\n case QUERY_OPTION.GreaterThanEqualTo:\n if (this.value[this.columnName_] >= cond[queryOption]) {\n return true;\n } break;\n case QUERY_OPTION.LessThanEqualTo:\n if (this.value[this.columnName_] <= cond[queryOption]) {\n return true;\n } break;\n case QUERY_OPTION.NotEqualTo:\n if (this.value[this.columnName_] !== cond[queryOption]) {\n return true;\n } break;\n case QUERY_OPTION.Between:\n if (this.value[this.columnName_] > cond[queryOption].low && this.value[this.columnName_] < cond[queryOption].high) {\n return true;\n } break;\n }\n return false;\n }\n }\n}","import { Select } from \"./index\";\nimport { LogHelper, promiseReject, getError } from \"@/worker/utils\";\nimport { ERROR_TYPE, promise } from \"@/common\";\n\nexport const executeWhereUndefinedLogic = function (this: Select) {\n let cursorRequest: IDBRequest;\n if (this.query.order && this.query.order.idbSorting !== false && this.query.order.by) {\n if (this.objectStore.indexNames.contains(this.query.order.by as string)) {\n const orderType: IDBCursorDirection = this.query.order.type &&\n this.query.order.type.toLowerCase() === 'desc' ? 'prev' : 'next';\n this.sorted = true;\n cursorRequest = this.objectStore.index(this.query.order.by as string).\n openCursor(null, orderType);\n }\n else {\n return promiseReject(\n new LogHelper(\n ERROR_TYPE.ColumnNotExist,\n { column: this.query.order.by, isOrder: true }\n )\n );\n }\n }\n else {\n cursorRequest = this.objectStore.openCursor();\n }\n const onSuccess = (() => {\n if (this.shouldEvaluateLimitAtEnd === false && this.shouldEvaluateSkipAtEnd === false) {\n if (this.skipRecord && this.limitRecord) {\n return executeSkipAndLimit;\n }\n else if (this.skipRecord) {\n return executeSkip;\n }\n else if (this.limitRecord) {\n return executeLimit;\n }\n }\n return executeSimple;\n })();\n return promise((res, rej) => {\n cursorRequest.onerror = rej;\n cursorRequest.onsuccess = onSuccess.call(this, res);\n });\n}\n\nconst executeSkipAndLimit = function (this: Select, onFinished) {\n let recordSkipped = false,\n cursor: IDBCursorWithValue;\n return (e) => {\n cursor = (e as any).target.result;\n if (cursor) {\n if (recordSkipped && this.results.length !== this.limitRecord) {\n this.pushResult(cursor.value);\n cursor.continue();\n }\n else {\n recordSkipped = true;\n cursor.advance(this.skipRecord);\n }\n } else {\n onFinished();\n }\n };\n}\n\nconst executeSkip = function (this: Select, onFinished) {\n let recordSkipped = false,\n cursor;\n return (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n if (recordSkipped) {\n this.pushResult(cursor.value);\n cursor.continue();\n }\n else {\n recordSkipped = true;\n cursor.advance(this.skipRecord);\n }\n } else {\n onFinished();\n }\n };\n}\n\nconst executeSimple = function (this: Select, onFinished) {\n let cursor;\n return (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n this.pushResult(cursor.value);\n (cursor as any).continue();\n }\n else {\n onFinished();\n }\n };\n}\n\nconst executeLimit = function (this: Select, onFinished) {\n let cursor;\n return (e: any) => {\n cursor = e.target.result;\n if (cursor && this.results.length !== this.limitRecord) {\n this.pushResult(cursor.value);\n cursor.continue();\n } else {\n onFinished();\n }\n };\n}\n","export const removeSpace = (value: string) => {\n return value.replace(/\\s/g, '');\n};","import { Select } from \"./\";\nimport { removeSpace, getDataType, getError, LogHelper } from \"@/worker/utils\";\nimport { ERROR_TYPE, DATA_TYPE, ICaseOption, IColumn, IOrderQuery } from \"@/common\";\n\nexport const processGroupDistinctAggr = function (this: Select) {\n if (this.query.distinct) {\n const groupBy = [];\n const result = this.results[0];\n for (const key in result) {\n groupBy.push(key);\n }\n const primaryKey = this.primaryKey(),\n index = groupBy.indexOf(primaryKey);\n groupBy.splice(index, 1);\n this.query.groupBy = groupBy.length > 0 ? groupBy : null;\n }\n if (this.query.groupBy) {\n if (this.query.aggregate) {\n this.executeAggregateGroupBy();\n }\n else {\n this.processGroupBy();\n }\n }\n else if (this.query.aggregate) {\n this.processAggregateQry();\n }\n};\n\nconst getOrderColumnInfo = function (this: Select, orderColumn: string) {\n let column: IColumn;\n if (this.query.join == null) {\n column = this.getColumnInfo(orderColumn);\n }\n else {\n const splittedByDot = removeSpace(orderColumn).split(\".\");\n orderColumn = splittedByDot[1];\n column = this.getColumnInfo(orderColumn, splittedByDot[0]);\n }\n if (column == null) {\n const valueFromFirstColumn = this.results[0][orderColumn];\n if (valueFromFirstColumn) {\n return {\n dataType: getDataType(valueFromFirstColumn),\n name: orderColumn\n } as IColumn;\n }\n throw new LogHelper(ERROR_TYPE.ColumnNotExist,\n { column: orderColumn, isOrder: true }\n )\n\n }\n return column;\n}\n\nconst compareStringInDesc_ = (a: string, b: string) => {\n return b.localeCompare(a);\n}\n\nconst compareStringinAsc_ = (a: string, b: string) => {\n return a.localeCompare(b);\n}\n\nconst compareDefaultInDesc_ = (a: string, b) => {\n return new String(b).localeCompare(a);\n}\n\nconst compareDefaultinAsc_ = (a, b: string) => {\n return new String(a).localeCompare(b);\n}\n\nconst compareNumberInDesc_ = (a: number, b: number) => {\n return b - a;\n}\n\nconst compareNumberinAsc_ = (a: number, b: number) => {\n return a - b;\n}\n\nconst compareDateInDesc_ = (a: Date, b: Date) => {\n return b.getTime() - a.getTime();\n}\n\nconst compareDateInAsc_ = (a: Date, b: Date) => {\n return a.getTime() - b.getTime();\n}\n\nconst getValInDesc_ = function (this: Select, value1, value2, caseQuery: { [columnName: string]: [ICaseOption] }) {\n for (const columnName in caseQuery) {\n this.thenEvaluator.setCaseAndValue(caseQuery, value1);\n const column1 = this.thenEvaluator.setColumn(columnName).evaluate();\n this.thenEvaluator.setCaseAndValue(caseQuery, value2);\n const column2 = this.thenEvaluator.setColumn(columnName).evaluate();\n switch (typeof value1[column1]) {\n case DATA_TYPE.String:\n return compareStringInDesc_(value1[column1], value2[column2]);\n default:\n return compareNumberInDesc_(value1[column1], value2[column2]);\n }\n }\n}\n\nconst getValInAsc_ = function (this: Select, value1, value2, caseQuery: { [columnName: string]: [ICaseOption] }) {\n for (const columnName in caseQuery) {\n this.thenEvaluator.setCaseAndValue(caseQuery, value1);\n const column1 = this.thenEvaluator.setColumn(columnName).evaluate();\n this.thenEvaluator.setCaseAndValue(caseQuery, value2);\n const column2 = this.thenEvaluator.setColumn(columnName).evaluate();\n switch (typeof value1[column1]) {\n case DATA_TYPE.String:\n return compareStringinAsc_(value1[column1], value2[column2]);\n default:\n return compareNumberinAsc_(value1[column1], value2[column2]);\n }\n }\n}\n\nconst getValueComparer_ = (column: IColumn, order: IOrderQuery): (a, b) => number => {\n switch (column.dataType) {\n case DATA_TYPE.String:\n return order.type === 'asc' ? compareStringinAsc_ : compareStringInDesc_;\n case DATA_TYPE.Number:\n return order.type === 'asc' ? compareNumberinAsc_ : compareNumberInDesc_;\n case DATA_TYPE.DateTime:\n return order.type === 'asc' ? compareDateInAsc_ : compareDateInDesc_;\n default:\n return order.type === 'asc' ? compareDefaultinAsc_ : compareDefaultInDesc_;\n }\n\n}\n\nconst orderBy_ = function (this: Select, order: IOrderQuery) {\n order.type = getOrderType_(order.type);\n let orderColumn = order.by;\n if (orderColumn != null && typeof orderColumn === DATA_TYPE.Object) {\n if (order.type === \"asc\") {\n this.results.sort((a, b) => {\n return getValInAsc_.call(this, a, b, orderColumn as any);\n });\n }\n else {\n this.results.sort((a, b) => {\n return getValInDesc_.call(this, a, b, orderColumn as any);\n });\n }\n }\n else {\n const columnInfo = getOrderColumnInfo.call(this, orderColumn as string);\n if (columnInfo != null) {\n const orderMethod = getValueComparer_(columnInfo, order);\n orderColumn = columnInfo.name;\n if (order.case == null) {\n this.results.sort((a, b) => {\n return orderMethod(a[orderColumn as string], b[orderColumn as string]);\n });\n }\n else {\n this.thenEvaluator.setCaseAndColumn({ [orderColumn as string]: order.case }, orderColumn as string);\n this.results.sort((a, b) => {\n return orderMethod(\n this.thenEvaluator.setValue(a).evaluate(),\n this.thenEvaluator.setValue(b).evaluate()\n );\n });\n }\n }\n }\n\n}\n\nconst getOrderType_ = (type: string) => {\n return type == null ? 'asc' : type.toLowerCase();\n}\n\nexport const processOrderBy = function (this: Select) {\n const order = this.query.order;\n if (order && this.results.length > 0 && !this.sorted) {\n const orderQueryType = getDataType(order);\n if (orderQueryType === DATA_TYPE.Object) {\n orderBy_.call(this, order);\n }\n else if (orderQueryType === DATA_TYPE.Array) {\n orderBy_.call(this, order[0]);\n for (let i = 1, length = (order as any).length; i < length; i++) {\n // if (this.error == null) {\n const prevOrderQueryBy = order[i - 1].by;\n const currentOrderQuery: IOrderQuery = order[i];\n let currentorderQueryBy = currentOrderQuery.by;\n const orderColumnDetail = getOrderColumnInfo.call(this, currentorderQueryBy as string);\n if (orderColumnDetail != null) {\n currentorderQueryBy = orderColumnDetail.name;\n currentOrderQuery.type = getOrderType_(currentOrderQuery.type);\n const orderMethod = getValueComparer_(orderColumnDetail, currentOrderQuery);\n this.results.sort((a, b) => {\n if (a[prevOrderQueryBy] === b[prevOrderQueryBy]) {\n return orderMethod(\n a[currentorderQueryBy as string],\n b[currentorderQueryBy as string]);\n }\n return 0;\n });\n }\n // }\n }\n }\n }\n}\n\nexport const processAggregateQry = function (this: Select) {\n const datas = this.results;\n const datasLength = datas.length;\n const results = {};\n let columnToAggregate;\n // free results memory\n this.results = undefined;\n const getCount = () => {\n let result = 0;\n for (const i in datas) {\n result += datas[i][columnToAggregate] ? 1 : 0;\n }\n return result;\n };\n const getMax = () => {\n let result = 0;\n for (const i in datas) {\n result = result > datas[i][columnToAggregate] ?\n result : datas[i][columnToAggregate];\n }\n return result;\n };\n const getMin = () => {\n let result = Infinity, value = Infinity;\n for (const i in datas) {\n value = datas[i][columnToAggregate] ?\n datas[i][columnToAggregate] : Infinity;\n result = result < value ? result : value;\n }\n return result;\n };\n const getSum = () => {\n let result = 0;\n for (const i in datas) {\n result += datas[i][columnToAggregate];\n }\n return result;\n };\n const getAvg = () => {\n let result = 0;\n for (const i in datas) {\n result += datas[i][columnToAggregate];\n }\n return result / datasLength;\n };\n for (const prop in this.query.aggregate) {\n const aggregateColumn = this.query.aggregate[prop];\n const aggregateValType = getDataType(aggregateColumn);\n let aggregateCalculator;\n switch (prop) {\n case 'count':\n aggregateCalculator = getCount; break;\n case 'max':\n aggregateCalculator = getMax; break;\n case 'min':\n aggregateCalculator = getMin; break;\n case 'sum':\n aggregateCalculator = getSum; break;\n case 'avg':\n aggregateCalculator = getAvg; break;\n }\n switch (aggregateValType) {\n case DATA_TYPE.String:\n columnToAggregate = aggregateColumn;\n results[`${prop}(${columnToAggregate})`] = aggregateCalculator();\n break;\n case DATA_TYPE.Array:\n for (const key in aggregateColumn) {\n columnToAggregate = aggregateColumn[key];\n results[`${prop}(${columnToAggregate})`] = aggregateCalculator();\n }\n }\n }\n\n // add results to the first index of result\n for (const prop in results) {\n datas[0][prop] = results[prop];\n }\n this.results = [datas[0]];\n}","import { Select } from \"./\";\nimport { promise } from \"@/common\";\nimport { BaseFetch } from \"../base_fetch\";\n\nexport const executeWhereLogic = function (this: BaseFetch, column, value, op, dir) {\n\n value = op ? value[op] : value;\n const cursorRequest = this.objectStore.index(column).openCursor(\n this.util.keyRange(value, op),\n dir\n );\n\n const onSuccess = (() => {\n if (this.shouldEvaluateLimitAtEnd === false && this.shouldEvaluateSkipAtEnd === false) {\n if (this.skipRecord && this.limitRecord) {\n return executeSkipAndLimitForWhere_;\n }\n else if (this.skipRecord) {\n return executeSkipForWhere_;\n }\n else if (this.limitRecord) {\n return executeLimitForWhere_;\n }\n\n }\n return executeSimpleForWhere_;\n })();\n\n return promise((res, rej) => {\n cursorRequest.onerror = rej;\n cursorRequest.onsuccess = onSuccess.call(this, res);\n })\n\n}\n\nconst executeSkipAndLimitForWhere_ = function (this: Select, onFinish) {\n let recordSkipped = false;\n return (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor) {\n if (recordSkipped && this.results.length !== this.limitRecord) {\n const value = cursor.value;\n if (this.shouldAddValue(value)) {\n this.pushResult(value);\n }\n cursor.continue();\n }\n else {\n recordSkipped = true;\n cursor.advance(this.skipRecord);\n }\n }\n else {\n onFinish();\n }\n };\n}\n\nconst executeSkipForWhere_ = function (this: Select, onFinish) {\n let recordSkipped = false;\n return (e: any) => {\n const cursor = e.target.result;\n if (cursor) {\n if (recordSkipped) {\n const value = cursor.value;\n if (this.shouldAddValue(value)) {\n this.pushResult(value);\n }\n cursor.continue();\n }\n else {\n recordSkipped = true;\n cursor.advance(this.skipRecord);\n }\n }\n else {\n onFinish();\n }\n };\n}\n\nconst executeLimitForWhere_ = function (this: Select, onFinish) {\n return (e: any) => {\n const cursor = e.target.result;\n if (cursor && this.results.length !== this.limitRecord) {\n const value = cursor.value;\n if (this.shouldAddValue(value)) {\n this.pushResult(value);\n }\n cursor.continue();\n }\n else {\n onFinish();\n }\n };\n\n}\n\nconst executeSimpleForWhere_ = function (this: Select, onFinish) {\n return (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor) {\n const value = cursor.value;\n if (this.shouldAddValue(value)) {\n this.pushResult(value);\n }\n cursor.continue();\n }\n else {\n onFinish();\n }\n };\n}","import { OCCURENCE } from \"@/common\";\n\nexport const getRegexFromLikeExpression = (likeExpression: string) => {\n const filterValues = likeExpression.split('%');\n let filterValue: string;\n let occurence: OCCURENCE;\n if (filterValues[1]) {\n filterValue = filterValues[1];\n occurence = filterValues.length > 2 ? OCCURENCE.Any : OCCURENCE.Last;\n }\n else {\n filterValue = filterValues[0];\n occurence = OCCURENCE.First;\n }\n switch (occurence) {\n case OCCURENCE.First:\n return new RegExp(`^${filterValue}`, 'i');\n case OCCURENCE.Last:\n return new RegExp(`${filterValue}$`, 'i');\n default:\n return new RegExp(`${filterValue}`, 'i');\n }\n}","import { getDataType } from \"./get_data_type\";\n\nconst isObject = (value) => {\n return getDataType(value) === 'object' && !(value instanceof RegExp);\n};\n\nexport const clone = (obj) => {\n if (isObject(obj)) {\n const copy = {};\n for (const i in obj) {\n copy[i] = obj[i] != null && isObject(obj[i]) ? clone(obj[i]) : obj[i];\n }\n return copy;\n }\n return obj;\n};","import { getDataType } from \"./get_data_type\"\nimport { QUERY_OPTION, DATA_TYPE } from \"@/common\";\n\nexport const compare = (value, compareValue, symbol?) => {\n const type1 = getDataType(value);\n const type2 = getDataType(compareValue);\n\n if (type1 !== type2) return false;\n if (type1 === DATA_TYPE.DateTime) {\n value = value.getTime();\n compareValue = compareValue.getTime();\n }\n switch (symbol) {\n // greater than\n case QUERY_OPTION.GreaterThan:\n return value > compareValue;\n // less than\n case QUERY_OPTION.LessThan:\n return value < compareValue;\n // less than equal\n case QUERY_OPTION.LessThanEqualTo:\n return value <= compareValue;\n // greather than equal\n case QUERY_OPTION.GreaterThanEqualTo:\n return value >= compareValue;\n // Not equal to\n case QUERY_OPTION.NotEqualTo:\n return value !== compareValue;\n default:\n return value === compareValue;\n }\n}","import { QUERY_OPTION } from \"@/common\";\nimport { getDataType, clone, compare, getRegexFromLikeExpression } from \"@worker/utils\";\n\n/**\n * For matching the different column value existance for where option\n * \n * @export\n * @class WhereChecker\n */\nexport class WhereChecker {\n where: object;\n checkFlag: boolean;\n\n constructor(where: object, checkFlag: boolean) {\n this.where = clone(where);\n this.checkFlag = checkFlag;\n }\n\n remove(props: string[]) {\n const last = props.pop();\n const value = props.reduce((prev, curr) => prev && prev[curr], this.where);\n delete value[last];\n }\n\n check(rowValue) {\n let status = true;\n if (!this.checkFlag) return status;\n for (let columnName in this.where) {\n if (!status) {\n return status;\n }\n const whereColumnValue = this.where[columnName];\n const columnValue = rowValue[columnName];\n if (getDataType(whereColumnValue) === \"object\") {\n for (const key in whereColumnValue) {\n if (!status) {\n return status;\n }\n switch (key) {\n case QUERY_OPTION.In:\n status = this.checkIn(columnName, columnValue);\n break;\n case QUERY_OPTION.Like:\n status = this.checkLike_(columnName, columnValue);\n break;\n case QUERY_OPTION.Regex:\n status = this.checkRegex(columnName, columnValue);\n break;\n case QUERY_OPTION.Between:\n case QUERY_OPTION.GreaterThan:\n case QUERY_OPTION.LessThan:\n case QUERY_OPTION.GreaterThanEqualTo:\n case QUERY_OPTION.LessThanEqualTo:\n case QUERY_OPTION.NotEqualTo:\n status = this.checkComparisionOp_(columnName, columnValue, key);\n break;\n default:\n status = false;\n }\n }\n }\n else {\n status = compare(whereColumnValue, columnValue);\n }\n }\n return status;\n }\n\n private checkIn(column, value) {\n return (this.where[column][QUERY_OPTION.In] as any[]).find(q => compare(q, value)) != null;\n }\n\n private checkLike_(column, value) {\n return getRegexFromLikeExpression(this.where[column][QUERY_OPTION.Like]).test(value);\n }\n\n private checkRegex(column, value) {\n return this.where[column][QUERY_OPTION.Regex].test(value);\n }\n\n private checkComparisionOp_(column, value, symbol) {\n const compareValue = this.where[column][symbol];\n if (symbol != QUERY_OPTION.Between) {\n return compare(value, compareValue, symbol);\n }\n return compare(value, compareValue.low, '>=') &&\n compare(value, compareValue.high, '<=');\n }\n}","import { Base } from \"./base\";\nimport { ISelectQuery, QUERY_OPTION, ERROR_TYPE } from \"@/common\";\nimport { getRegexFromLikeExpression, promiseReject } from \"@worker/utils\";\nimport { LogHelper, getObjectFirstKey, getDataType, getLength, getError } from \"@worker/utils\";\nimport { WhereChecker } from \"./where_checker\";\nimport { executeWhereLogic } from \"./select/where\";\nimport { executeInLogic } from \"./select/in\";\nimport { executeRegexLogic } from \"./select/regex\";\n\nexport class BaseFetch extends Base {\n query: ISelectQuery;\n whereCheckerInstance: WhereChecker;\n executeWhereLogic: typeof executeWhereLogic;\n skipRecord;\n limitRecord;\n shouldEvaluateLimitAtEnd = false;\n shouldEvaluateSkipAtEnd = false;\n executeInLogic: typeof executeInLogic;\n executeRegexLogic: typeof executeRegexLogic;\n\n resultCount: number;\n\n protected shouldAddValue: (value) => boolean;\n protected goToWhereLogic() {\n const query = this.query as ISelectQuery;\n const firstColumn = getObjectFirstKey(query.where);\n if (this.objectStore.indexNames.contains(firstColumn)) {\n const value = query.where[firstColumn];\n if (getDataType(value) === 'object') {\n const checkFlag = getLength(value) > 1 ||\n getLength(query.where) > 1\n\n this.whereCheckerInstance = new WhereChecker(query.where, checkFlag);\n const key = getObjectFirstKey(value);\n this.whereCheckerInstance.remove([firstColumn, key]);\n switch (key) {\n case QUERY_OPTION.Like: {\n const regexVal = getRegexFromLikeExpression(value[QUERY_OPTION.Like]);\n return this.executeRegexLogic(firstColumn, regexVal);\n }\n case QUERY_OPTION.Regex:\n return this.executeRegexLogic(firstColumn, value[QUERY_OPTION.Regex]);\n case QUERY_OPTION.In:\n return this.executeInLogic(\n firstColumn, value[QUERY_OPTION.In]\n );\n case QUERY_OPTION.Between:\n case QUERY_OPTION.GreaterThan:\n case QUERY_OPTION.LessThan:\n case QUERY_OPTION.GreaterThanEqualTo:\n case QUERY_OPTION.LessThanEqualTo:\n return this.executeWhereLogic(firstColumn, value, key, \"next\");\n case QUERY_OPTION.Aggregate: break;\n default:\n return this.executeWhereLogic(firstColumn, value, null, \"next\");\n }\n }\n else {\n const checkFlag = getLength(query.where) > 1;\n this.whereCheckerInstance = new WhereChecker(query.where, checkFlag);\n this.whereCheckerInstance.remove([firstColumn]);\n return this.executeWhereLogic(firstColumn, value, null, \"next\");\n }\n }\n else {\n const column = this.getColumnInfo(firstColumn);\n const error = column == null ?\n new LogHelper(ERROR_TYPE.ColumnNotExist, { column: firstColumn }) :\n new LogHelper(ERROR_TYPE.EnableSearchOff, { column: firstColumn });\n return promiseReject(\n error\n );\n }\n }\n\n}","import { Select } from \"./\";\nimport { promise, promiseAll } from \"@/common\";\nimport { BaseFetch } from \"../base_fetch\";\n\nexport const executeInLogic = function (this: BaseFetch, column, values) {\n let skip = this.skipRecord;\n const skipOrPush = (val) => {\n if (skip === 0) {\n (this as Select).pushResult(val);\n }\n else {\n --skip;\n }\n };\n const onSuccess = (() => {\n if (this.shouldEvaluateLimitAtEnd === false && this.shouldEvaluateSkipAtEnd === false) {\n if (this.skipRecord && this.limitRecord) {\n return executeSkipAndLimitForIn_;\n }\n else if (this.skipRecord) {\n return executeSkipForIn_;\n }\n else if (this.limitRecord) {\n executeLimitForIn_;\n }\n }\n return executeSimpleForIn_;\n })();\n\n const columnStore = this.objectStore.index(column);\n const runInLogic: (val) => Promise = (value) => {\n return promise((res, rej) => {\n const cursorRequest = columnStore.openCursor(this.util.keyRange(value));\n cursorRequest.onsuccess = onSuccess.call(this, res, skipOrPush);\n cursorRequest.onerror = rej;\n });\n };\n\n return promiseAll(\n values.map(function (val) {\n return runInLogic(val);\n })\n );\n\n};\n\nconst executeSkipAndLimitForIn_ = function (this: Select, onFinish, skipOrPush) {\n return (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (this.results.length !== this.limitRecord && cursor) {\n const value = cursor.value;\n if (this.shouldAddValue(value)) {\n skipOrPush(value);\n }\n cursor.continue();\n }\n else {\n onFinish();\n }\n };\n}\n\nconst executeSkipForIn_ = function (this: Select, onFinish, skipOrPush) {\n\n return (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor) {\n const value = cursor.value\n if (this.shouldAddValue(value)) {\n skipOrPush(value);\n }\n cursor.continue();\n }\n else {\n onFinish();\n }\n };\n}\n\nconst executeLimitForIn_ = function (this: Select, onFinish) {\n return (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor && this.results.length !== this.limitRecord) {\n const value = cursor.value;\n if (this.shouldAddValue(value)) {\n this.pushResult(cursor.value);\n }\n cursor.continue();\n }\n else {\n onFinish();\n }\n };\n\n}\n\nconst executeSimpleForIn_ = function (this: Select, onFinish) {\n return (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor) {\n const value = cursor.value\n if (this.shouldAddValue(value)) {\n this.pushResult(value);\n }\n cursor.continue();\n }\n else {\n onFinish();\n }\n };\n}","import { BaseFetch } from \"../base_fetch\";\nimport { Select } from \".\";\nimport { promise } from \"@/common\";\n\n\nexport const executeRegexLogic = function (this: BaseFetch, column, exp: RegExp) {\n\n let skip = this.skipRecord;\n const skipOrPush = (val) => {\n if (skip === 0) {\n (this as Select).pushResult(val);\n }\n else {\n --skip;\n }\n };\n this.shouldAddValue = (cursor) => {\n return exp.test(cursor.key) &&\n this.whereCheckerInstance.check(cursor.value);\n };\n\n const cursorRequest = this.objectStore.index(column).openCursor();\n\n const onSuccess = (() => {\n if (this.shouldEvaluateLimitAtEnd === false && this.shouldEvaluateSkipAtEnd === false) {\n if (this.skipRecord && this.limitRecord) {\n return executeSkipAndLimitForRegex_;\n }\n else if (this.skipRecord) {\n return executeSkipForRegex_;\n }\n else if (this.limitRecord) {\n return executeLimitForRegex_;\n }\n }\n return executeSimpleForRegex_;\n })();\n\n return promise((res, rej) => {\n cursorRequest.onerror = rej;\n cursorRequest.onsuccess = onSuccess.call(this, res, skipOrPush);\n })\n\n}\n\nconst executeSkipAndLimitForRegex_ = function (this: Select, onFinish, skipOrPush) {\n return (e: any) => {\n const cursor = e.target.result;\n if (this.results.length !== this.limitRecord && cursor) {\n if (this.shouldAddValue(cursor)) {\n skipOrPush(cursor.value);\n }\n cursor.continue();\n } else {\n onFinish();\n }\n };\n}\n\nconst executeSkipForRegex_ = function (this: Select, onFinish, skipOrPush) {\n return (e: any) => {\n const cursor = e.target.result;\n if (cursor) {\n if (this.shouldAddValue(cursor)) {\n skipOrPush((cursor.value));\n }\n cursor.continue();\n } else {\n onFinish();\n }\n };\n}\n\nconst executeLimitForRegex_ = function (this: Select, onFinish) {\n return (e: any) => {\n const cursor = e.target.result;\n if (this.results.length !== this.limitRecord && cursor) {\n if (this.shouldAddValue(cursor)) {\n this.pushResult(cursor.value);\n }\n cursor.continue();\n } else {\n onFinish();\n }\n };\n}\n\nconst executeSimpleForRegex_ = function (this: Select, onFinish) {\n return (e: any) => {\n const cursor = e.target.result;\n if (cursor) {\n if (this.shouldAddValue(cursor)) {\n this.pushResult(cursor.value);\n }\n cursor.continue();\n } else {\n onFinish();\n }\n };\n}\n","import { Select } from \"./\";\nimport { IJoinQuery, DATA_TYPE, ERROR_TYPE, ISelectQuery } from \"@/common\";\nimport { getDataType, LogHelper, removeSpace, promiseReject } from \"@/worker/utils\";\n\n\nexport const executeJoinQuery = function (this: Select) {\n return new Join(this).execute();\n}\n\ninterface JoinQueryWithInfo extends IJoinQuery {\n joinTableInfo: JoinTableInfo\n}\n\nexport class Join {\n\n private joinQueryStack_: JoinQueryWithInfo[] = [];\n private currentQueryStackIndex_ = 0;\n tablesFetched = [];\n results = [];\n\n select: Select;\n constructor(select: Select) {\n this.select = select;\n }\n\n get query() {\n return this.select.query;\n }\n\n getTable(name: string) {\n return this.select.table(name);\n }\n\n private executeSelect(query: ISelectQuery) {\n // this.select.util.emptyTx();\n return new Select(query, this.select.util).\n execute();\n }\n\n execute() {\n const query = this.query;\n this.joinQueryStack_ = getDataType(query.join) === DATA_TYPE.Object ?\n [query.join as JoinQueryWithInfo] : query.join as JoinQueryWithInfo[];\n // get the data for first table\n const tableName = query.from;\n const tablesToFetch = [tableName];\n for (let i = 0, length = this.joinQueryStack_.length; i < length; i++) {\n const item = this.joinQueryStack_[i];\n let jointblInfo = this.getJoinTableInfo_(item.on);\n // table 1 is fetched & table2 needs to be fetched for join\n if (item.with === jointblInfo.table1.table) {\n jointblInfo = {\n table1: jointblInfo.table2,\n table2: jointblInfo.table1\n };\n }\n\n const err = this.checkJoinQuery_(jointblInfo, item);\n if (err) {\n return promiseReject(err);\n }\n this.joinQueryStack_[i].joinTableInfo = jointblInfo;\n tablesToFetch.push(item.with)\n }\n\n if (!this.select.isTxQuery) {\n this.select.util.createTransaction(tablesToFetch);\n }\n\n return this.executeSelect({\n from: tableName,\n where: query.where,\n case: query.case,\n flatten: query.flatten\n }).then(results => {\n this.results = results.map((item) => {\n return {\n [this.currentQueryStackIndex_]: item\n };\n });\n this.tablesFetched.push(tableName);\n return this.startExecutingJoinLogic_();\n });\n }\n\n private onJoinQueryFinished_() {\n // const query = this.query;\n if (this.results.length > 0) {\n\n try {\n let results = [];\n const tables = Object.keys(this.results[0]);\n const tablesLength = tables.length;\n const mapWithAlias = (query: IJoinQuery, value: object) => {\n if (query.as != null) {\n for (const key in query.as) {\n if (value[(query.as as any)[key]] === undefined) {\n value[(query.as as any)[key]] = value[key];\n delete value[key];\n }\n }\n }\n return value;\n };\n this.results.forEach((result) => {\n let data = result[\"0\"]; // first table data\n for (let i = 1; i < tablesLength; i++) {\n const query = this.joinQueryStack_[i - 1];\n data = { ...data, ...mapWithAlias(query, result[i]) };\n }\n results.push(data);\n });\n this.select['results'] = results;\n this.select.setLimitAndSkipEvaluationAtEnd_();\n this.select.query.flatten = null;\n if (process.env.NODE_ENV === 'dev') {\n try {\n this.select.processOrderBy();\n }\n catch (ex) {\n return promiseReject(\n new LogHelper(ERROR_TYPE.InvalidOrderQuery, ex.message)\n );\n }\n }\n else {\n this.select.processOrderBy();\n }\n\n if (process.env.NODE_ENV === 'dev') {\n try {\n this.select.processGroupDistinctAggr();\n }\n catch (ex) {\n return promiseReject(\n new LogHelper(ERROR_TYPE.InvalidGroupQuery, ex.message)\n );\n }\n }\n else {\n this.select.processGroupDistinctAggr();\n }\n }\n catch (ex) {\n return promiseReject(\n new LogHelper(ERROR_TYPE.InvalidJoinQuery, ex.message)\n );\n }\n }\n return;\n }\n\n private startExecutingJoinLogic_() {\n const joinQuery = this.joinQueryStack_[this.currentQueryStackIndex_];\n if (joinQuery) {\n try {\n let jointblInfo = joinQuery.joinTableInfo;\n return this.executeSelect({\n from: joinQuery.with,\n where: joinQuery.where,\n case: joinQuery.case,\n flatten: joinQuery.flatten\n }).then(results => {\n this.jointables(joinQuery.type, jointblInfo, results);\n this.tablesFetched.push(jointblInfo.table2.table);\n ++this.currentQueryStackIndex_;\n return this.startExecutingJoinLogic_();\n });\n }\n catch (ex) {\n return promiseReject(\n new LogHelper(ERROR_TYPE.InvalidJoinQuery, ex.message)\n );\n }\n }\n else {\n return this.onJoinQueryFinished_();\n }\n }\n\n private jointables(joinType: string, jointblInfo: JoinTableInfo, secondtableData: any[]) {\n\n const results = [];\n const column1 = jointblInfo.table1.column;\n const column2 = jointblInfo.table2.column;\n const table1Index = this.tablesFetched.indexOf(jointblInfo.table1.table);\n const table2Index = this.currentQueryStackIndex_ + 1;\n const performInnerJoin = () => {\n let index = 0;\n this.results.forEach(valueFromFirstTable => {\n secondtableData.forEach((valueFromSecondTable) => {\n if (valueFromFirstTable[table1Index][column1] === valueFromSecondTable[column2]) {\n results[index] = { ...valueFromFirstTable };\n results[index++][table2Index] = valueFromSecondTable;\n }\n });\n });\n };\n const performleftJoin = () => {\n let index = 0;\n let valueMatchedFromSecondTable: any[];\n let callBack;\n const columnDefaultValue = {};\n this.getTable(jointblInfo.table2.table).columns.forEach(col => {\n columnDefaultValue[col.name] = null;\n });\n this.results.forEach((valueFromFirstTable) => {\n valueMatchedFromSecondTable = [];\n if (table2Index === 1) {\n callBack = function (valueFromSecondTable) {\n if (valueFromFirstTable[table1Index][column1] === valueFromSecondTable[column2]) {\n valueMatchedFromSecondTable.push(valueFromSecondTable);\n }\n };\n }\n else {\n callBack = function (valueFromSecondTable) {\n const value = valueFromFirstTable[table1Index];\n if (value != null && value[column1] === valueFromSecondTable[column2]) {\n valueMatchedFromSecondTable.push(valueFromSecondTable);\n }\n };\n }\n secondtableData.forEach(callBack);\n if (valueMatchedFromSecondTable.length === 0) {\n valueMatchedFromSecondTable = [columnDefaultValue];\n }\n valueMatchedFromSecondTable.forEach(function (value) {\n results[index] = { ...valueFromFirstTable };\n results[index++][table2Index] = value;\n });\n });\n };\n switch (joinType) {\n case \"left\":\n performleftJoin(); break;\n default:\n performInnerJoin();\n }\n this.results = results;\n }\n\n private getJoinTableInfo_(joinOn: string) {\n joinOn = removeSpace(joinOn);\n const splittedjoinOn = joinOn.split(\"=\");\n const splittedjoinOnbydotFirst = splittedjoinOn[0].split(\".\");\n const splittedjoinOnbydotSecond = splittedjoinOn[1].split(\".\");\n const info = {\n table1: {\n table: splittedjoinOnbydotFirst[0],\n column: splittedjoinOnbydotFirst[1]\n },\n table2: {\n table: splittedjoinOnbydotSecond[0],\n column: splittedjoinOnbydotSecond[1]\n }\n } as JoinTableInfo;\n return info;\n }\n\n private checkJoinQuery_(jointblInfo: JoinTableInfo, qry: IJoinQuery) {\n const table1 = jointblInfo.table1;\n const table2 = jointblInfo.table2;\n const tableSchemaOf1stTable = this.getTable(table1.table);\n const tableSchemaOf2ndTable = this.getTable(table2.table);\n let err: LogHelper;\n\n // check on info & with info \n if (qry.with !== table2.table) {\n err = new LogHelper(ERROR_TYPE.InvalidJoinQuery,\n `on value should contains value of with`\n );\n }\n\n // check for column existance\n\n if (tableSchemaOf1stTable.columns.find(q => q.name === table1.column) == null) {\n err = new LogHelper(ERROR_TYPE.InvalidJoinQuery,\n `column ${table1.column} does not exist in table ${table1.table}`\n );\n }\n else if (tableSchemaOf2ndTable.columns.find(q => q.name === table2.column) == null) {\n err = new LogHelper(ERROR_TYPE.InvalidJoinQuery,\n `column ${table2.column} does not exist in table ${table2.table}`\n );\n }\n\n // check for column match in both table\n if (qry.as == null) {\n qry.as = {};\n }\n tableSchemaOf1stTable.columns.every(function (column) {\n const columnFound = tableSchemaOf2ndTable.columns.find(q => q.name === column.name && q.name !== table1.column);\n if (columnFound != null && qry.as[columnFound.name] == null) {\n err = new LogHelper(ERROR_TYPE.InvalidJoinQuery,\n `column ${column.name} exist in both table ${table1.table} & ${table2.table}`\n );\n return false;\n }\n return true;\n });\n return err;\n }\n}\n\ntype JoinTableInfo = {\n table1: { table: string, column: string }\n table2: { table: string, column: string }\n};","import { ISelectQuery, QUERY_OPTION, IDB_MODE, API, IWhereQuery, promiseResolve } from \"@/common\";\nimport { IDBUtil } from \"@/worker/idbutil\";\nimport { QueryHelper } from \"@worker/executors/query_helper\";\nimport { DbMeta } from \"@/worker/model\";\nimport { isArray, isObject, getKeys, getObjectFirstKey, promiseReject, getLength } from \"@/worker/utils\";\nimport { setPushResult, setLimitAndSkipEvaluationAtEnd, removeDuplicates } from \"./base_select\";\nimport { ThenEvaluator } from \"./then_evaluator\";\nimport { executeWhereUndefinedLogic } from \"./not_where\"\nimport { processAggregateQry, processGroupDistinctAggr, processOrderBy } from \"./order_by\";\nimport { executeAggregateGroupBy, processGroupBy } from \"./group_by\";\nimport { executeWhereLogic } from \"./where\";\nimport { BaseFetch } from \"@executors/base_fetch\";\nimport { executeInLogic } from \"./in\";\nimport { executeRegexLogic } from \"./regex\";\nimport { executeJoinQuery } from \"./join\";\n\nexport class Select extends BaseFetch {\n sorted = false;\n isOr: boolean;\n isArrayQry: boolean;\n query: ISelectQuery;\n orInfo: {\n results?: any[];\n orQuery: object\n };\n\n isSubQuery = false;\n\n protected pushResult: (value) => void;\n\n protected thenEvaluator = new ThenEvaluator();\n\n executeWhereUndefinedLogic: typeof executeWhereUndefinedLogic;\n\n setLimitAndSkipEvaluationAtEnd_: typeof setLimitAndSkipEvaluationAtEnd\n setPushResult: typeof setPushResult;\n removeDuplicates: typeof removeDuplicates;\n executeJoinQuery: typeof executeJoinQuery\n processGroupDistinctAggr: typeof processGroupDistinctAggr;\n processOrderBy: typeof processOrderBy;\n processAggregateQry: typeof processAggregateQry;\n executeAggregateGroupBy: typeof executeAggregateGroupBy;\n processGroupBy: typeof processGroupBy;\n\n\n constructor(query: ISelectQuery, util: IDBUtil) {\n super();\n this.query = query;\n this.util = util;\n this.tableName = query.from;\n this.setPushResult();\n if (isArray(this.query.where)) {\n this.isArrayQry = true;\n this.setLimitAndSkipEvaluationAtEnd_();\n }\n else {\n this.skipRecord = query.skip;\n this.limitRecord = query.limit;\n }\n if (query.order) {\n if (isArray(query.order) || query.order.case || isObject(query.order.by)) {\n this.query.order.idbSorting = false;\n }\n this.setLimitAndSkipEvaluationAtEnd_();\n }\n else if (query.groupBy) {\n this.setLimitAndSkipEvaluationAtEnd_();\n }\n }\n\n execute(beforeExecute?: () => Promise): Promise {\n let pResult: Promise;\n if (!beforeExecute) {\n beforeExecute = () => promiseResolve(null);\n }\n try {\n const err = new QueryHelper(this.db).validate(API.Select, this.query);\n if (err) return promiseReject(err);\n return beforeExecute().then(_ => {\n this.initTransaction_();\n if (this.query.join == null) {\n if (this.query.where != null) {\n if (isArray(this.query.where)) {\n pResult = this.processWhereArrayQry();\n }\n else {\n pResult = this.processWhere_();\n }\n }\n else {\n pResult = this.executeWhereUndefinedLogic();\n }\n }\n else {\n pResult = this.executeJoinQuery();\n }\n return pResult.then(\n this.returnResult_.bind(this)\n )\n })\n\n }\n catch (ex) {\n return this.onException(ex);\n }\n }\n\n private processWhereArrayQry() {\n this.isArrayQry = true;\n const whereQuery = this.query.where as IWhereQuery[];\n const pKey = this.primaryKey();\n let isFirstWhere = true, output = [], operation;\n\n const isItemExist = (keyValue) => {\n return output.findIndex(item => item[pKey] === keyValue) >= 0;\n };\n const onSuccess = () => {\n if (operation === QUERY_OPTION.And) {\n const doAnd = () => {\n let andResults = [];\n this.results.forEach((item) => {\n if (isItemExist(item[pKey])) {\n andResults.push(item);\n }\n });\n output = andResults;\n andResults = null;\n };\n\n if (isFirstWhere === true) {\n output = this.results;\n }\n else if (output.length > 0) {\n doAnd();\n }\n }\n else {\n if (output.length > 0) {\n this.results = [...output, ...this.results];\n this.removeDuplicates();\n output = this.results;\n }\n else {\n output = this.results;\n }\n }\n isFirstWhere = false;\n if (whereQuery.length > 0) {\n this.results = [];\n return processFirstQry();\n }\n else {\n this.results = output;\n }\n\n };\n const processFirstQry = () => {\n this.query.where = whereQuery.shift();\n if (this.query.where[QUERY_OPTION.Or]) {\n if (getLength(this.query.where) === 1) {\n operation = QUERY_OPTION.Or;\n this.query.where = this.query.where[QUERY_OPTION.Or] as any;\n }\n else {\n operation = QUERY_OPTION.And;\n }\n }\n else {\n operation = QUERY_OPTION.And;\n }\n return this.processWhere_().then(onSuccess);\n };\n return processFirstQry();\n }\n\n private initTransaction_() {\n if (!this.isTxQuery) {\n this.util.createTransactionIfNotExist([this.tableName], IDB_MODE.ReadOnly);\n }\n this.objectStore = this.util.objectStore(this.tableName);\n }\n\n private processWhere_() {\n this.shouldAddValue = (value) => {\n return this.whereCheckerInstance.check(value);\n };\n if ((this.query.where as IWhereQuery).or) {\n this.processOrLogic_();\n }\n return this.goToWhereLogic().then(() => {\n return this.onWhereEvaluated();\n })\n }\n\n private onWhereEvaluated() {\n if (this.isOr) {\n return this.orQuerySuccess_();\n }\n }\n\n private returnResult_ = () => {\n if (this.results.length > 0) {\n\n\n if (this.query.flatten) {\n const flattendData = [];\n const indexToDelete = {};\n this.query.flatten.forEach(column => {\n this.results.forEach((data, i) => {\n data[column].forEach(item => {\n flattendData.push(\n { ...data, ...{ [column]: item } }\n );\n });\n indexToDelete[i] = true;\n });\n });\n let itemsDeleted = 0;\n getKeys(indexToDelete).forEach(key => {\n this.results.splice(Number(key) - itemsDeleted, 1);\n ++itemsDeleted;\n });\n this.results = this.results.concat(flattendData);\n }\n this.processGroupDistinctAggr();\n this.processOrderBy();\n if (this.shouldEvaluateSkipAtEnd) {\n this.results.splice(0, this.query.skip);\n }\n if (this.shouldEvaluateLimitAtEnd) {\n this.results = this.results.slice(0, this.query.limit);\n }\n }\n return this.results;\n }\n\n private orQueryFinish_() {\n this.isOr = false;\n this.results = this.orInfo.results;\n // free or info memory\n this.orInfo = null;\n this.removeDuplicates();\n // this.onQueryFinished();\n }\n\n private orQuerySuccess_() {\n this.orInfo.results = [... this.orInfo.results, ...this.results];\n if (!this.query.limit || (this.query.limit > this.orInfo.results.length)) {\n this.results = [];\n const key = getObjectFirstKey(this.orInfo.orQuery);\n if (key != null) {\n const where = {};\n where[key] = this.orInfo.orQuery[key];\n delete this.orInfo.orQuery[key];\n this.query.where = where;\n return this.goToWhereLogic().then(this.onWhereEvaluated.bind(this))\n }\n }\n return this.orQueryFinish_();\n }\n\n private processOrLogic_() {\n this.isOr = true;\n const where = this.query.where as IWhereQuery;\n this.orInfo = {\n orQuery: where.or as any,\n results: []\n };\n // free or memory\n delete where.or;\n }\n}\n\nSelect.prototype.executeInLogic = executeInLogic;\nSelect.prototype.executeWhereUndefinedLogic = executeWhereUndefinedLogic;\nSelect.prototype.executeWhereLogic = executeWhereLogic;\nSelect.prototype.executeRegexLogic = executeRegexLogic;\n\nSelect.prototype.setLimitAndSkipEvaluationAtEnd_ = setLimitAndSkipEvaluationAtEnd\nSelect.prototype.setPushResult = setPushResult;\nSelect.prototype.removeDuplicates = removeDuplicates;\nSelect.prototype.executeJoinQuery = executeJoinQuery\nSelect.prototype.processGroupDistinctAggr = processGroupDistinctAggr;\nSelect.prototype.processOrderBy = processOrderBy;\nSelect.prototype.processAggregateQry = processAggregateQry;\nSelect.prototype.executeAggregateGroupBy = executeAggregateGroupBy;\nSelect.prototype.processGroupBy = processGroupBy;\n","export const isObject = (value) => {\n return typeof value === 'object';\n};","import { Select } from \"./index\";\n\nexport const setPushResult = function (this: Select) {\n if (this.query.case) {\n this.pushResult = (value) => {\n let columnName: string;\n this.thenEvaluator.setCaseAndValue(this.query.case, value);\n for (columnName in this.query.case) {\n value[columnName] = this.thenEvaluator.setColumn(columnName).evaluate();\n }\n this.results.push(value);\n };\n }\n else {\n this.pushResult = (value) => {\n this.results.push(value);\n };\n }\n}\n\nexport const setLimitAndSkipEvaluationAtEnd = function (this: Select) {\n if (this.query.limit) {\n this.shouldEvaluateLimitAtEnd = true;\n }\n if (this.query.skip) {\n this.shouldEvaluateSkipAtEnd = true;\n }\n}\n\nexport const removeDuplicates = function (this: Select) {\n let datas = this.results;\n // free results memory\n this.results = null;\n const key = this.primaryKey();\n const lookupObject = {};\n for (let i = 0, len = datas.length; i < len; i++) {\n lookupObject[datas[i][key]] = datas[i];\n }\n datas = [];\n for (const i in lookupObject) {\n datas.push(lookupObject[i]);\n }\n this.results = datas;\n}","import { Select } from \".\";\nimport { getDataType, getObjectFirstKey } from \"@/worker/utils\";\nimport { QUERY_OPTION, DATA_TYPE } from \"@/common\";\n\nexport const processGroupBy = function (this: Select) {\n const groupBy = this.query.groupBy as any;\n let datas = this.results;\n const lookUpObj = {};\n // free results memory\n this.results = this.query.groupBy = null;\n if (getDataType(groupBy) !== DATA_TYPE.Object) {\n if (getDataType(groupBy) === DATA_TYPE.String) {\n for (const i in datas) {\n lookUpObj[datas[i][groupBy as string]] = datas[i];\n }\n }\n else {\n let objKey;\n for (const i in datas) {\n objKey = \"\";\n for (const column in groupBy) {\n objKey += datas[i][groupBy[column]];\n }\n lookUpObj[objKey] = datas[i];\n }\n }\n }\n else {\n const caseQueryLength = Object.keys(groupBy).length;\n if (caseQueryLength === 1) {\n const groupByColumn = getObjectFirstKey(groupBy);\n this.thenEvaluator.setCaseAndColumn(groupBy, groupByColumn);\n for (const i in datas) {\n lookUpObj[this.thenEvaluator.setValue(datas[i]).evaluate()] = datas[i];\n }\n }\n else {\n let objKey;\n for (const i in datas) {\n objKey = \"\";\n this.thenEvaluator.setCaseAndValue(groupBy, datas[i]);\n for (const column in groupBy) {\n objKey += this.thenEvaluator.setColumn(column).evaluate();\n }\n lookUpObj[objKey] = datas[i];\n }\n }\n }\n // free datas memory\n datas = [];\n for (const i in lookUpObj) {\n datas.push(lookUpObj[i]);\n }\n this.results = datas;\n}\n\nexport const executeAggregateGroupBy = function (this: Select) {\n const grpQry = this.query.groupBy as any;\n let datas = this.results;\n // free results memory\n this.results = undefined;\n const lookUpObj = {};\n // assign aggregate\n const aggregateQry = this.query.aggregate;\n\n let index;\n let objKey;\n let value;\n let columnToAggregate;\n const calculateAggregate = () => {\n const getCount = () => {\n value = lookUpObj[objKey];\n // get old value\n value = value ? value[\"count(\" + columnToAggregate + \")\"] : 0;\n // add with old value if data exist\n value += datas[index][columnToAggregate] ? 1 : 0;\n return value;\n };\n const getMax = () => {\n value = lookUpObj[objKey];\n // get old value\n value = value ? value[\"max(\" + columnToAggregate + \")\"] : 0;\n datas[index][columnToAggregate] = datas[index][columnToAggregate] ?\n datas[index][columnToAggregate] : 0;\n // compare between old value and new value\n return value > datas[index][columnToAggregate] ? value : datas[index][columnToAggregate];\n };\n const getMin = () => {\n value = lookUpObj[objKey];\n // get old value\n value = value ? value[\"min(\" + columnToAggregate + \")\"] : Infinity;\n datas[index][columnToAggregate] = datas[index][columnToAggregate] ?\n datas[index][columnToAggregate] : Infinity;\n // compare between old value and new value\n return value < datas[index][columnToAggregate] ? value : datas[index][columnToAggregate];\n };\n const getSum = () => {\n value = lookUpObj[objKey];\n // get old value\n value = value ? value[\"sum(\" + columnToAggregate + \")\"] : 0;\n // add with old value if data exist\n value += datas[index][columnToAggregate] ? datas[index][columnToAggregate] : 0;\n return value;\n };\n const getAvg = () => {\n value = lookUpObj[objKey];\n // get old sum value\n let sumOfColumn = value ? value[\"sum(\" + columnToAggregate + \")\"] : 0;\n // add with old value if data exist\n sumOfColumn += datas[index][columnToAggregate] ? datas[index][columnToAggregate] : 0;\n datas[index][\"sum(\" + columnToAggregate + \")\"] = sumOfColumn;\n // get old count value\n value = value ? value[\"count(\" + columnToAggregate + \")\"] : 0;\n // add with old value if data exist\n value += datas[index][columnToAggregate] ? 1 : 0;\n datas[index][\"count(\" + columnToAggregate + \")\"] = value;\n };\n for (const prop in aggregateQry) {\n const aggregateColumn = aggregateQry[prop];\n const aggregateValType = getDataType(aggregateColumn);\n let aggregateCalculator;\n switch (prop) {\n case QUERY_OPTION.Count:\n aggregateCalculator = getCount;\n break;\n case QUERY_OPTION.Max:\n aggregateCalculator = getMax;\n break;\n case QUERY_OPTION.Min:\n aggregateCalculator = getMin;\n break;\n case QUERY_OPTION.Sum:\n aggregateCalculator = getSum;\n break;\n case QUERY_OPTION.Avg:\n aggregateCalculator = getAvg;\n break;\n }\n switch (aggregateValType) {\n case DATA_TYPE.String:\n columnToAggregate = aggregateColumn;\n datas[index][`${prop}(${columnToAggregate})`] = aggregateCalculator();\n break;\n case DATA_TYPE.Array:\n for (const item in aggregateColumn) {\n columnToAggregate = aggregateColumn[item];\n datas[index][`${prop}(${columnToAggregate})`] = aggregateCalculator();\n }\n }\n }\n };\n\n if (getDataType(grpQry) === DATA_TYPE.String) {\n for (index in datas) {\n objKey = datas[index][grpQry];\n calculateAggregate();\n lookUpObj[objKey] = datas[index];\n }\n }\n else {\n for (index in datas) {\n objKey = \"\";\n for (const column in grpQry) {\n objKey += datas[index][grpQry[column]];\n }\n calculateAggregate();\n lookUpObj[objKey] = datas[index];\n }\n\n }\n // free datas memory\n datas = [];\n for (const i in lookUpObj) {\n datas.push(lookUpObj[i]);\n }\n // Checking for avg and if exist then fill the datas;\n if (aggregateQry.avg) {\n if (getDataType(aggregateQry.avg) === DATA_TYPE.String) {\n for (index in datas) {\n const sumForAvg = datas[index][\"sum(\" + aggregateQry.avg + \")\"],\n countForAvg = datas[index][\"count(\" + aggregateQry.avg + \")\"];\n datas[index][\"avg(\" + aggregateQry.avg + \")\"] = sumForAvg / countForAvg;\n if (aggregateQry.count !== aggregateQry.avg) {\n delete datas[index][\"count(\" + aggregateQry.avg + \")\"];\n }\n if (aggregateQry.sum !== aggregateQry.avg) {\n delete datas[index][\"sum(\" + aggregateQry.avg + \")\"];\n }\n }\n }\n else {\n const isCountTypeString = getDataType(aggregateQry.count) === DATA_TYPE.String;\n const isSumTypeString = getDataType(aggregateQry.sum) === DATA_TYPE.String;\n for (index in datas) {\n for (const column in aggregateQry.avg as any) {\n const avgColumn = aggregateQry.avg[column],\n sum = datas[index][\"sum(\" + avgColumn + \")\"],\n count = datas[index][\"count(\" + avgColumn + \")\"];\n datas[index][\"avg(\" + avgColumn + \")\"] = sum / count;\n\n if (isCountTypeString) {\n if (aggregateQry.count !== avgColumn) {\n delete datas[index][\"count(\" + avgColumn + \")\"];\n }\n else if (aggregateQry.count.indexOf(avgColumn) === -1) {\n delete datas[index][\"count(\" + avgColumn + \")\"];\n }\n }\n\n if (isSumTypeString) {\n if (aggregateQry.sum !== avgColumn) {\n delete datas[index][\"sum(\" + avgColumn + \")\"];\n }\n else if (aggregateQry.sum.indexOf(avgColumn) === -1) {\n delete datas[index][\"sum(\" + avgColumn + \")\"];\n }\n }\n }\n }\n }\n }\n this.results = datas;\n}\n","import { promise } from \"@/common\";\nimport { BaseFetch } from \"../base_fetch\";\nimport { Count } from \".\";\n\nexport const executeWhereUndefinedLogic = function (this: BaseFetch) {\n let countRequest;\n const onSuccess = (() => {\n if (this.objectStore.count) {\n countRequest = this.objectStore.count();\n return (onFinish) => {\n return () => {\n (this as Count).resultCount = countRequest.result;\n onFinish();\n }\n }\n }\n else {\n let cursor;\n countRequest = this.objectStore.openCursor();\n return (onFinish) => {\n return (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n ++(this as Count).resultCount;\n cursor.continue();\n }\n else {\n onFinish();\n }\n };\n };\n }\n })();\n return promise((res, rej) => {\n countRequest.onerror = rej;\n countRequest.onsuccess = onSuccess(res);\n });\n}\n","import { BaseFetch } from \"@executors/base_fetch\";\nimport { Select } from \"@executors/select\";\nimport { ICountQuery, ISelectQuery, IDB_MODE, API, IWhereQuery } from \"@/common\";\nimport { IDBUtil } from \"@/worker/idbutil\";\nimport { DbMeta } from \"@worker/model\";\nimport { QueryHelper } from \"@executors/query_helper\";\nimport { promiseReject, isArray, getError } from \"@worker/utils\";\nimport { executeWhereUndefinedLogic } from \"@executors/count/not_where\";\nimport { executeWhereLogic } from \"./where\";\nimport { executeRegexLogic } from \"./regex\";\nimport { executeInLogic } from \"./in\";\n\nexport class Count extends BaseFetch {\n\n query: ICountQuery;\n resultCount: number = 0;\n executeWhereUndefinedLogic: typeof executeWhereUndefinedLogic;\n\n constructor(query: ICountQuery, util: IDBUtil) {\n super();\n this.query = query;\n this.util = util;\n this.tableName = query.from;\n }\n\n execute(beforeExecute: () => Promise) {\n const queryHelper = new QueryHelper(this.db);\n const query = this.query;\n const err = queryHelper.validate(API.Count, query);\n if (err) {\n return promiseReject(\n err\n );\n }\n return beforeExecute().then(_ => {\n let result: Promise;\n try {\n const getDataFromSelect = () => {\n const selectInstance = new Select(this.query as ISelectQuery, this.util);\n selectInstance.isTxQuery = this.isTxQuery;\n return selectInstance.execute().then(results => {\n this.resultCount = results.length;\n });\n };\n this.initTransaction_();\n if (query.join == null) {\n if (query.where != null) {\n if ((query.where as IWhereQuery).or || isArray(this.query.where)) {\n result = getDataFromSelect();\n }\n else {\n result = this.goToWhereLogic();\n }\n }\n else {\n result = this.executeWhereUndefinedLogic() as any;\n }\n }\n else {\n result = getDataFromSelect();\n }\n }\n catch (ex) {\n this.onException(ex);\n }\n return result.then(_ => {\n return this.resultCount;\n })\n });\n }\n\n private initTransaction_() {\n if (!this.isTxQuery) {\n this.util.createTransaction([this.query.from], IDB_MODE.ReadOnly);\n }\n this.objectStore = this.util.objectStore(this.query.from);\n }\n}\n\nCount.prototype.executeWhereUndefinedLogic = executeWhereUndefinedLogic;\nCount.prototype.executeWhereLogic = executeWhereLogic\nCount.prototype.executeRegexLogic = executeRegexLogic\nCount.prototype.executeInLogic = executeInLogic","import { BaseFetch } from \"../base_fetch\";\nimport { getLength } from \"@/worker/utils\";\nimport { Count } from \".\";\nimport { promise } from \"@/common\";\n\nexport const executeWhereLogic = function (this: BaseFetch, column, value, op) {\n value = op ? value[op] : value;\n let cursorRequest;\n let cursor: IDBCursorWithValue;\n\n\n return promise((res, rej) => {\n if (getLength(this.query.where) === 1 && this.objectStore.count) {\n cursorRequest = this.objectStore.index(column).count(this.util.keyRange(value, op));\n cursorRequest.onsuccess = () => {\n (this as Count).resultCount = cursorRequest.result;\n res();\n }\n }\n else {\n cursorRequest = this.objectStore.index(column).openCursor(this.util.keyRange(value, op));\n cursorRequest.onsuccess = (e) => {\n cursor = e.target.result;\n if (cursor) {\n if (this.whereCheckerInstance.check(cursor.value)) {\n ++(this as Count).resultCount;\n }\n cursor.continue();\n }\n else {\n res();\n }\n }\n }\n cursorRequest.onerror = rej;\n });\n}","import { BaseFetch } from \"../base_fetch\";\nimport { promise } from \"@/common\";\nimport { Count } from \".\";\n\nexport const executeRegexLogic = function (this: BaseFetch, column: string, exp: RegExp) {\n let cursor: IDBCursorWithValue;\n const cursorRequest = this.objectStore.index(column).openCursor();\n this.shouldAddValue = (cursor) => {\n return exp.test(cursor.key) &&\n this.whereCheckerInstance.check(cursor.value);\n };\n return promise((res, rej) => {\n cursorRequest.onerror = rej;\n cursorRequest.onsuccess = (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n if (this.shouldAddValue(cursor)) {\n ++(this as Count).resultCount;\n }\n cursor.continue();\n }\n else {\n res();\n }\n };\n })\n}","import { promise, promiseAll } from \"@/common\";\nimport { BaseFetch } from \"../base_fetch\";\n\n\nexport const executeInLogic = function (this: BaseFetch, column, values) {\n let cursor: IDBCursorWithValue;\n const columnStore = this.objectStore.index(column);\n const runInLogic: (val) => Promise = (value) => {\n const keyRange = this.util.keyRange(value);\n if (this.objectStore.count) {\n return promise((res, rej) => {\n const cursorRequest = columnStore.count(keyRange);\n cursorRequest.onsuccess = (e: any) => {\n this.resultCount += e.target.result;\n res();\n };\n cursorRequest.onerror = rej;\n });\n }\n return promise((res, rej) => {\n const cursorRequest = columnStore.openCursor(keyRange);\n cursorRequest.onsuccess = (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n if (this.whereCheckerInstance.check(cursor.value)) {\n ++this.resultCount;\n }\n cursor.continue();\n }\n else {\n res();\n }\n };\n cursorRequest.onerror = rej;\n });\n };\n\n return promiseAll(\n values.map(function (val) {\n return runInLogic(val);\n })\n );\n}\n","import { isArray } from \"./is_array\";\n\nexport const variableFromPath = (path: string) => {\n const properties: string[] = isArray(path) ? path as any : path.split(\".\");\n return properties.reduce((prev, curr) => prev && prev[curr], self);\n}","import { getDataType, variableFromPath, promiseReject, LogHelper } from \"@worker/utils\";\nimport { DATA_TYPE, ERROR_TYPE, IUpdateQuery } from \"@/common\";\n\nexport const updateValue = (query: IUpdateQuery, storedValue) => {\n let setValue = query.set;\n const mapSet = query.mapSet;\n if (mapSet) {\n const result = (mapSet as Function)(setValue, storedValue);\n if (result != null) {\n setValue = result;\n }\n }\n for (const key in setValue) {\n const columnSetValue = setValue[key];\n if (getDataType(columnSetValue) !== DATA_TYPE.Object) {\n storedValue[key] = columnSetValue;\n }\n else {\n for (const op in columnSetValue) {\n let value = columnSetValue[op];\n switch (op as any) {\n case '+': storedValue[key] += value; break;\n case '-': storedValue[key] -= value; break;\n case '*': storedValue[key] *= value; break;\n case '/': storedValue[key] /= value; break;\n case '{push}': storedValue[key].push(value); break;\n default: storedValue[key] = columnSetValue;\n }\n break;\n }\n }\n }\n return storedValue;\n};","import { IUpdateQuery, ISelectQuery, QUERY_OPTION, API, IWhereQuery, DATA_TYPE, ERROR_TYPE } from \"@/common\";\nimport { IDBUtil } from \"@/worker/idbutil\";\nimport { DbMeta } from \"@worker/model\";\nimport { QueryHelper } from \"../query_helper\";\nimport { promiseReject, isArray, getDataType, variableFromPath, LogHelper } from \"@worker/utils\";\nimport { BaseFetch } from \"@executors/base_fetch\";\nimport { Select } from \"@executors/select\";\nimport { executeWhereUndefinedLogic } from \"./not_where\";\nimport { executeInLogic } from \"./in\";\nimport { executeRegexLogic } from \"./regex\";\nimport { executeWhereLogic } from \"./where\";\n\nexport class Update extends BaseFetch {\n executeWhereUndefinedLogic: typeof executeWhereUndefinedLogic\n\n constructor(query: IUpdateQuery, util: IDBUtil) {\n super();\n this.query = query as any;\n this.util = util;\n this.tableName = query.in;\n const mapSet = query.mapSet;\n if (mapSet) {\n const method = getDataType(mapSet) === DATA_TYPE.String ?\n variableFromPath(mapSet as string) : mapSet;\n if (!method) {\n throw new LogHelper(ERROR_TYPE.MethodNotExist, mapSet);\n }\n query.mapSet = method;\n }\n\n }\n\n execute(beforeExecute: () => Promise) {\n const query: IUpdateQuery = this.query as any;\n try {\n const queryHelper = new QueryHelper(this.db);\n const err = queryHelper.validate(API.Update, query);\n if (err) return promiseReject(err);\n return beforeExecute().then(_ => {\n this.initTransaction();\n let pResult: Promise;\n if (query.where != null) {\n if ((query.where as IWhereQuery).or || isArray(query.where)) {\n pResult = this.executeComplexLogic_();\n }\n else {\n pResult = this.goToWhereLogic();\n }\n }\n else {\n pResult = this.executeWhereUndefinedLogic();\n }\n return pResult.then(() => {\n return this.rowAffected;\n })\n })\n }\n catch (ex) {\n return this.onException(ex);\n }\n }\n\n private executeComplexLogic_() {\n const query: IUpdateQuery = this.query as any;\n const selectObject = new Select({\n from: query.in,\n where: query.where,\n ignoreCase: query.ignoreCase\n } as ISelectQuery, this.util);\n selectObject.isTxQuery = this.isTxQuery;\n return selectObject.execute().then((results: any[]) => {\n const key = this.primaryKey(query.in);\n const inQuery = [];\n results.forEach((value) => {\n inQuery.push(value[key]);\n });\n results = null;\n const whereQry = { [key]: { [QUERY_OPTION.In]: inQuery } };\n this.query.where = whereQry;\n this.initTransaction();\n return this.goToWhereLogic();\n });\n }\n\n private initTransaction() {\n const tableName = (this.query as any).in;\n if (!this.isTxQuery) {\n this.util.createTransaction([tableName]);\n }\n this.objectStore = this.util.objectStore(tableName);\n }\n}\n\nUpdate.prototype.executeWhereUndefinedLogic = executeWhereUndefinedLogic;\nUpdate.prototype.executeWhereLogic = executeWhereLogic\nUpdate.prototype.executeRegexLogic = executeRegexLogic\nUpdate.prototype.executeInLogic = executeInLogic","import { Update } from \"./\";\nimport { promise } from \"@/common\";\nimport { updateValue } from \"./update_value\";\n\n\nexport const executeWhereUndefinedLogic = function (this: Update) {\n const cursorRequest: IDBRequest = this.objectStore.openCursor();\n return promise((res, rej) => {\n cursorRequest.onsuccess = (e: any) => {\n const cursor: IDBCursorWithValue = (e as any).target.result;\n if (cursor) {\n try {\n const cursorUpdateRequest = cursor.update(updateValue(this.query as any, cursor.value));\n cursorUpdateRequest.onsuccess = () => {\n ++this.rowAffected;\n cursor.continue();\n };\n cursorUpdateRequest.onerror = rej;\n } catch (ex) {\n rej(\n ex\n );\n }\n }\n else {\n res();\n }\n };\n cursorRequest.onerror = rej;\n })\n\n}\n","import { promise, IUpdateQuery } from \"@/common\";\nimport { updateValue } from \"./update_value\";\nimport { Update } from \"./\";\n\nexport const executeWhereLogic = function (this: Update, column, value, op) {\n const query: IUpdateQuery = this.query as any;\n value = op ? value[op] : value;\n const cursorRequest = this.objectStore.index(column).openCursor(this.util.keyRange(value, op));\n return promise((res, rej) => {\n cursorRequest.onsuccess = (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor) {\n if (this.whereCheckerInstance.check(cursor.value)) {\n try {\n const cursorUpdateRequest = cursor.update(updateValue(query, cursor.value));\n cursorUpdateRequest.onsuccess = () => {\n ++this.rowAffected;\n cursor.continue();\n };\n cursorUpdateRequest.onerror = rej;\n } catch (ex) {\n rej(\n ex\n );\n }\n }\n else {\n cursor.continue();\n }\n }\n else {\n res();\n }\n };\n cursorRequest.onerror = rej\n })\n}","import { Update } from \"./\";\nimport { updateValue } from \"./update_value\";\nimport { promise } from \"@/common\";\n\nexport const executeRegexLogic = function (this: Update, column: string, exp: RegExp) {\n let cursor: IDBCursorWithValue;\n const cursorOpenRequest = this.objectStore.index(column).openCursor();\n this.shouldAddValue = (cursor) => {\n return exp.test(cursor.key) &&\n this.whereCheckerInstance.check(cursor.value);\n };\n return promise((res, rej) => {\n\n cursorOpenRequest.onsuccess = (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n if (this.shouldAddValue(cursor)) {\n try {\n const cursorUpdateRequest = cursor.update(updateValue(this.query as any, cursor.value));\n cursorUpdateRequest.onsuccess = () => {\n ++this.rowAffected;\n cursor.continue();\n };\n cursorUpdateRequest.onerror = rej;\n } catch (ex) {\n rej(\n ex\n );\n }\n }\n else {\n cursor.continue();\n }\n\n }\n else {\n res();\n }\n };\n cursorOpenRequest.onerror = rej;\n })\n\n}\n","import { Update } from \"./\";\nimport { promiseAll, promise, IUpdateQuery } from \"@/common\";\nimport { updateValue } from \"./update_value\";\n\n\nexport const executeInLogic = function (this: Update, column, values: any[]) {\n const columnStore = this.objectStore.index(column);\n const query: IUpdateQuery = this.query as any;\n const runInLogic: (val) => Promise = (value) => {\n return promise((res, rej) => {\n const cursorRequest = columnStore.openCursor(this.util.keyRange(value));\n cursorRequest.onsuccess = (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor) {\n const value = cursor.value;\n if (this.whereCheckerInstance.check(value)) {\n try {\n const cursorUpdateRequest = cursor.update(updateValue(query, value));\n cursorUpdateRequest.onsuccess = () => {\n ++this.rowAffected;\n cursor.continue();\n };\n cursorUpdateRequest.onerror = rej;\n }\n catch (ex) {\n rej(\n ex\n );\n }\n\n }\n else {\n cursor.continue();\n }\n }\n else {\n res();\n }\n };\n cursorRequest.onerror = rej;\n });\n };\n\n return promiseAll(\n values.map(function (val) {\n return runInLogic(val);\n })\n );\n}\n","import { IIntersectQuery, ISelectQuery } from \"@/common\";\nimport { Base } from \"@executors/base\";\nimport { Select } from \"@executors/select\";\n\nexport class Intersect extends Base {\n\n constructor(intersectQry: IIntersectQuery, util) {\n super();\n this.query = intersectQry as any;\n this.util = util;\n }\n\n execute() {\n const intersectQry: IIntersectQuery = this.query as any;\n let index = 0;\n let hashMap = {};\n let hashMapTemp = {};\n let isQueryForSameTable = true;\n const queries = intersectQry.queries;\n const queryLength = queries.length;\n queries.every((qry, i) => {\n if (i + 1 < queryLength && qry.from !== queries[i + 1].from) {\n isQueryForSameTable = false;\n return false;\n }\n return true;\n });\n let getHashKey;\n if (isQueryForSameTable) {\n const pKey = this.primaryKey(queries[0].from);\n getHashKey = (val) => {\n return val[pKey];\n };\n }\n else {\n getHashKey = (val) => {\n let columnValKey = \"\";\n for (const key in val) {\n columnValKey += val[key];\n }\n return columnValKey;\n };\n }\n\n let select: Select;\n const fetchData = () => {\n if (index < queryLength) {\n select = new Select(queries[index], this.util);\n return select.execute().then((selectResult) => {\n hashMap = {};\n selectResult.forEach(val => {\n const columnValKey = getHashKey(val);\n if (index === 0) {\n hashMapTemp[columnValKey] = val;\n } else if (hashMapTemp[columnValKey] != null) {\n hashMap[columnValKey] = val;\n }\n });\n if (index > 0) {\n hashMapTemp = { ...hashMap };\n }\n\n ++index;\n return fetchData();\n })\n }\n else {\n const results = [];\n let resultPusher: (key: string) => void;\n let skip = intersectQry.skip;\n const limit = intersectQry.limit;\n const onFinished = () => {\n select['results'] = results;\n Object.assign(select.query, {\n order: intersectQry.order,\n join: {} as any\n } as ISelectQuery);\n select.processOrderBy();\n select.processGroupDistinctAggr();\n return (select['results']);\n };\n let shouldStopLoop = false;\n let key: string;\n const pushResult = () => {\n results.push(hashMap[key]);\n };\n const checkLimitAndPush = () => {\n if (results.length < limit) {\n pushResult();\n }\n else {\n shouldStopLoop = true;\n }\n };\n const skipChecker = (callBack: () => void) => {\n if (skip === 0) {\n callBack();\n }\n else {\n --skip;\n }\n };\n if (intersectQry.skip && intersectQry.limit) {\n resultPusher = () => {\n skipChecker(() => {\n checkLimitAndPush();\n });\n };\n\n }\n else if (intersectQry.limit) {\n resultPusher = checkLimitAndPush;\n }\n else if (intersectQry.skip) {\n resultPusher = () => {\n skipChecker(() => {\n pushResult();\n });\n };\n }\n else {\n resultPusher = () => {\n pushResult();\n };\n }\n if (limit) {\n for (key in hashMap) {\n resultPusher(key);\n if (shouldStopLoop) {\n break;\n }\n }\n }\n else {\n for (key in hashMap) {\n resultPusher(key);\n }\n }\n return onFinished();\n }\n };\n return fetchData();\n }\n}","import { LogHelper, getError } from \"@worker/utils\";\nimport { ERROR_TYPE, promise } from \"@/common\";\n\nexport class DropDb {\n\n execute(dbName: string) {\n return promise((res, rej) => {\n const dropDbRequest = indexedDB.deleteDatabase(dbName);\n dropDbRequest.onblocked = () => {\n const err = new LogHelper(ERROR_TYPE.DbBlocked);\n return rej(\n getError(err)\n );\n };\n dropDbRequest.onerror = (e) => {\n return rej(\n getError(e)\n )\n };\n dropDbRequest.onsuccess = () => {\n res();\n };\n })\n }\n}\n","import { Base } from \"@executors/base\";\nimport { ISelectQuery } from \"@/common\";\nimport { Select } from \"@executors/select\";\nimport { IDBUtil } from \"@/worker/idbutil\";\n\nexport class Union extends Base {\n\n constructor(query: ISelectQuery[], util: IDBUtil) {\n super();\n this.query = query as any;\n this.util = util;\n }\n\n execute() {\n const query: ISelectQuery[] = this.query as any;\n let index = 0;\n const hashMap = {};\n let isQueryForSameTable = true;\n const queryLength = query.length;\n query.every((qry, i) => {\n if (i + 1 < queryLength && qry.from !== query[i + 1].from) {\n isQueryForSameTable = false;\n return false;\n }\n return true;\n });\n let getHashKey;\n if (isQueryForSameTable) {\n const pKey = this.primaryKey(query[0].from);\n getHashKey = (val) => {\n return val[pKey];\n };\n }\n else {\n getHashKey = (val) => {\n let columnValKey = \"\";\n for (const key in val) {\n columnValKey += val[key];\n }\n return columnValKey;\n };\n }\n let select: Select;\n const fetchData = () => {\n if (index < query.length) {\n select = new Select(query[index++], this.util);\n return select.execute().then((selectResult) => {\n selectResult.forEach(val => {\n hashMap[getHashKey(val)] = val;\n });\n return fetchData();\n })\n }\n else {\n const results = [];\n for (const key in hashMap) {\n results.push(hashMap[key]);\n }\n return results;\n }\n };\n return fetchData();\n }\n\n\n}","import { BaseFetch } from \"../base_fetch\";\nimport { IRemoveQuery, QUERY_OPTION, API, IWhereQuery } from \"@/common\";\nimport { IDBUtil } from \"@/worker/idbutil\";\nimport { QueryHelper } from \"@executors/query_helper\";\nimport { DbMeta } from \"@/worker/model\";\nimport { promiseReject, isArray, getObjectFirstKey, getError } from \"@/worker/utils\";\nimport { Select } from \"@executors/select\";\nimport { executeWhereUndefinedLogic } from \"./not_where\";\nimport { executeInLogic } from \"./in\";\nimport { executeWhereLogic } from \"./where\";\nimport { executeRegexLogic } from \"./regex\";\n\nexport class Remove extends BaseFetch {\n isOr;\n executeWhereUndefinedLogic;\n\n constructor(\n query: IRemoveQuery, util: IDBUtil\n ) {\n super();\n this.query = query;\n this.util = util;\n this.tableName = query.from;\n }\n\n execute(beforeExecute: () => Promise) {\n const queryHelper = new QueryHelper(this.db);\n const query = this.query;\n const err = queryHelper.validate(API.Remove, query);\n if (err) return promiseReject(\n err\n );\n let pResult: Promise;\n return beforeExecute().then(_ => {\n try {\n this.initTransaction_();\n if (query.where != null) {\n if (isArray(query.where)) {\n pResult = this.processWhereArrayQry();\n }\n else {\n pResult = this.processWhere_();\n }\n }\n else {\n pResult = this.executeWhereUndefinedLogic();\n }\n\n }\n catch (ex) {\n return this.onException(ex);\n }\n return pResult.then(() => {\n return this.rowAffected;\n })\n })\n }\n\n private processWhereArrayQry() {\n const selectObject = new Select(this.query, this.util);\n selectObject.isTxQuery = this.isTxQuery;\n return selectObject.execute().then((results) => {\n const keyList = [];\n const pkey = this.primaryKey(this.query.from);\n results.forEach((item) => {\n keyList.push(item[pkey]);\n });\n results = null;\n const whereQry = { [pkey]: { [QUERY_OPTION.In]: keyList } };\n this.query[QUERY_OPTION.Where] = whereQry;\n return this.processWhere_();\n })\n }\n\n private processWhere_() {\n if ((this.query.where as IWhereQuery).or) {\n this.processOrLogic();\n }\n return this.goToWhereLogic().then(() => {\n return this.onWhereEvaluated();\n });\n }\n\n private initTransaction_() {\n if (!this.isTxQuery) {\n this.util.createTransaction([this.query.from]);\n }\n this.objectStore = this.util.objectStore(this.query.from);\n }\n\n private onWhereEvaluated() {\n if (this.isOr) {\n return this.orQuerySuccess_();\n }\n }\n\n private orQuerySuccess_() {\n const key = getObjectFirstKey((this as any)._orInfo.OrQuery);\n if (key != null) {\n const where = {};\n where[key] = (this as any)._orInfo.OrQuery[key];\n delete (this as any)._orInfo.OrQuery[key];\n this.query.where = where;\n return this.goToWhereLogic().then(() => {\n return this.onWhereEvaluated();\n })\n }\n else {\n this.isOr = true;\n }\n }\n\n private processOrLogic() {\n this.isOr = true;\n const where = this.query.where as IWhereQuery;\n (this as any)._orInfo = {\n OrQuery: where.or\n };\n\n // free or memory\n delete where.or;\n }\n}\n\nRemove.prototype.executeInLogic = executeInLogic;\nRemove.prototype.executeWhereUndefinedLogic = executeWhereUndefinedLogic;\nRemove.prototype.executeWhereLogic = executeWhereLogic;\nRemove.prototype.executeRegexLogic = executeRegexLogic;","import { Remove } from \".\";\nimport { promise, promiseAll } from \"@/common\";\n\nexport const executeInLogic = function (this: Remove, column, values) {\n const columnIndex = this.objectStore.index(column)\n const runInLogic: (val) => Promise = (value) => {\n return promise((res, rej) => {\n const cursorRequest = columnIndex.openCursor(this.util.keyRange(value));\n cursorRequest.onsuccess = (e: any) => {\n const cursor: IDBCursorWithValue = e.target.result;\n if (cursor) {\n if (this.whereCheckerInstance.check(cursor.value)) {\n cursor.delete();\n ++this.rowAffected;\n }\n cursor.continue();\n }\n else {\n res();\n }\n };\n cursorRequest.onerror = rej;\n });\n };\n\n return promiseAll(\n values.map(function (val) {\n return runInLogic(val);\n })\n );\n}\n","import { Remove } from \".\";\nimport { promise } from \"@/common\";\n\nexport const executeWhereUndefinedLogic = function (this: Remove) {\n let cursor;\n const cursorRequest = this.objectStore.openCursor();\n return promise((res, rej) => {\n cursorRequest.onsuccess = (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n cursor.delete();\n ++this.rowAffected;\n (cursor as any).continue();\n }\n else {\n res();\n }\n };\n cursorRequest.onerror = rej;\n })\n\n}\n","import { Remove } from \".\";\nimport { promise } from \"@/common\";\n\nexport const executeWhereLogic = function (this: Remove, column, value, op) {\n let cursor: IDBCursorWithValue,\n cursorRequest;\n value = op ? value[op] : value;\n cursorRequest = this.objectStore.index(column).openCursor(this.util.keyRange(value, op));\n return promise((res, rej) => {\n cursorRequest.onsuccess = (e) => {\n cursor = e.target.result;\n if (cursor) {\n if (this.whereCheckerInstance.check(cursor.value)) {\n cursor.delete();\n ++this.rowAffected;\n }\n cursor.continue();\n }\n else {\n res();\n }\n };\n\n cursorRequest.onerror = rej\n })\n\n}\n\n","import { Remove } from \"./\";\nimport { promise } from \"@/common\";\n\nexport const executeRegexLogic = function (this: Remove, column: string, exp: RegExp) {\n let cursor: IDBCursorWithValue;\n const cursorRequest = this.objectStore.index(column).openCursor();\n this.shouldAddValue = (cursor) => {\n return exp.test(cursor.key) &&\n this.whereCheckerInstance.check(cursor.value);\n };\n return promise((res, rej) => {\n cursorRequest.onsuccess = (e: any) => {\n cursor = e.target.result;\n if (cursor) {\n if (this.shouldAddValue(cursor)) {\n cursor.delete();\n ++this.rowAffected;\n }\n cursor.continue();\n }\n else {\n res();\n }\n };\n cursorRequest.onerror = rej;\n })\n\n}","import { Base } from \"@executors/base\";\nimport { IDBUtil } from \"@/worker/idbutil\";\nimport { DbMeta } from \"@/worker/model\";\nimport { MetaHelper } from \"@/worker/meta_helper\";\nimport { promise } from \"@/common\";\n\nexport class Clear extends Base {\n constructor(tableName: string, util: IDBUtil) {\n super();\n this.query = tableName as any;\n this.util = util;\n this.tableName = tableName;\n }\n\n execute(beforeExecute: () => Promise) {\n const tableName: string = this.query as any;\n if (!this.isTxQuery) {\n this.util.createTransaction([tableName, MetaHelper.tableName]);\n }\n return beforeExecute().then(_ => {\n const clearRequest: IDBRequest = this.util.objectStore(tableName).clear();\n try {\n return promise((res, rej) => {\n clearRequest.onsuccess = (e) => {\n const currentTable = this.table(tableName);\n for (const columnName in currentTable.autoIncColumnValue) {\n currentTable.autoIncColumnValue[columnName] = 0;\n }\n MetaHelper.set(MetaHelper.dbSchema, this.util.db, this.util).then(() => {\n res();\n }).catch(rej);\n };\n\n clearRequest.onerror = rej;\n })\n }\n catch (ex) {\n return this.onException(ex);\n }\n })\n }\n}","import { Base } from \"@executors/base\";\nimport { ITranscationQuery, WebWorkerRequest, ERROR_TYPE, ISelectQuery, API, IInsertQuery, IUpdateQuery, IRemoveQuery, ICountQuery, WebWorkerResult, promise } from \"@/common\";\nimport { IDBUtil } from \"@worker/idbutil\";\nimport { promiseReject, LogHelper, variableFromPath } from \"@worker/utils\";\nimport { Insert } from \"@executors/insert\";\nimport { Select } from \"@executors/select\";\nimport { Count } from \"@executors/count\";\nimport { Update } from \"@executors/update\";\nimport { Remove } from \"@executors/remove\";\nimport { DbMeta } from \"@worker/model\";\nimport { IQueryExecutor } from \"@/worker/interfaces\";\nimport { MetaHelper } from \"@/worker/meta_helper\";\n\nexport class Transaction extends Base {\n results = {} as any;\n reqQueue: WebWorkerRequest[] = [];\n isQueryExecuting = false;\n\n isTxStarted_ = false;\n\n onSuccess: (result: any) => void;\n onError: (err: LogHelper) => void;\n\n beforeExecute: () => Promise;\n\n constructor(qry: ITranscationQuery, util: IDBUtil) {\n super();\n this.query = qry as any;\n this.util = util;\n }\n\n execute(cb: () => Promise) {\n this.beforeExecute = cb;\n const err = this.validate();\n if (err) return promiseReject(\n err\n );\n this.startExecution_()\n\n return promise((res, rej) => {\n this.onSuccess = res;\n this.onError = rej;\n }).then(result => {\n this.beforeExecute = null;\n this.log(`transaction finished`);\n return result;\n })\n }\n\n validate() {\n const query: ITranscationQuery = this.query as any;\n const notExistingTable = this.notExistingTable_(query.tables);\n if (notExistingTable) {\n return new LogHelper(ERROR_TYPE.TableNotExist, { tableName: notExistingTable });\n }\n const methodName = query.method;\n let txLogic = variableFromPath(methodName);\n if (!txLogic) {\n return new LogHelper(ERROR_TYPE.MethodNotExist, methodName);\n }\n }\n\n private startExecution_() {\n const query: ITranscationQuery = this.query as any;\n const select = (qry: ISelectQuery) => {\n return this.pushReq_({\n name: API.Select,\n query: qry\n } as WebWorkerRequest);\n };\n const insert = (qry: IInsertQuery) => {\n return this.pushReq_({\n name: API.Insert,\n query: qry\n } as WebWorkerRequest);\n };\n const update = (qry: IUpdateQuery) => {\n return this.pushReq_({\n name: API.Update,\n query: qry\n } as WebWorkerRequest);\n };\n const remove = (qry: IRemoveQuery) => {\n return this.pushReq_({\n name: API.Remove,\n query: qry\n } as WebWorkerRequest);\n };\n const count = (qry: ICountQuery) => {\n return this.pushReq_({\n name: API.Count,\n query: qry\n } as WebWorkerRequest);\n };\n const setResult = (key: string, value) => {\n this.results[key] = value;\n };\n const getResult = (key: string) => {\n return this.results[key];\n };\n const abort = (msg: string) => {\n this.abortTx_(msg);\n };\n\n const start = () => {\n this.startTx_();\n };\n const methodName = query.method\n let txLogic = variableFromPath(methodName);\n\n this.log(`transaction query started`);\n\n return txLogic.call(\n this,\n {\n data: query.data,\n insert: insert, select: select,\n update: update, remove: remove,\n count: count, setResult: setResult,\n getResult: getResult, abort: abort,\n start: start\n }\n );\n }\n\n log(message) {\n this.util.logger.log(message);\n }\n\n private startTx_() {\n try {\n this.isTxStarted_ = true;\n let tableNames = (this.query as any).tables as string[];\n tableNames = tableNames.concat(MetaHelper.tableName)\n this.util.createTransaction(tableNames).then(_ => {\n this.onSuccess(this.results);\n }).catch(err => {\n this.onError(err);\n })\n return this.processExecutionOfQry_();\n }\n catch (ex) {\n this.onError(this.onException(ex) as any);\n }\n }\n\n\n\n\n\n private onReqFinished_(result) {\n const finisehdRequest = this.reqQueue.shift();\n\n this.log(`finished request : ${finisehdRequest.name} `);\n\n if (finisehdRequest) {\n if (result.error) {\n this.abortTx_(\"automatic abort of transaction due to error occured\");\n this.log(`transaction aborted due to error occured`);\n this.onError(result.error);\n }\n else {\n this.isQueryExecuting = false;\n if (finisehdRequest.onSuccess) {\n finisehdRequest.onSuccess(result);\n }\n this.processExecutionOfQry_();\n }\n }\n }\n\n private abortTx_(msg: string) {\n this.reqQueue = [];\n this.util.abortTransaction();\n this.log(`transaction aborted. Msg : ${msg}`);\n\n }\n\n private executeRequest_(request: WebWorkerRequest) {\n this.isQueryExecuting = true;\n let requestObj: IQueryExecutor;\n this.log(`executing request : ${request.name} `);\n const onReqFinished = this.onReqFinished_.bind(this);\n const query = request.query\n switch (request.name) {\n case API.Select:\n requestObj = new Select(\n query, this.util\n );\n break;\n case API.Insert:\n requestObj = new Insert(\n query, this.util\n );\n break;\n case API.Update:\n requestObj = new Update(\n query, this.util\n );\n break;\n case API.Remove:\n requestObj = new Remove(\n query, this.util\n );\n break;\n case API.Count:\n requestObj = new Count(\n query, this.util\n );\n break;\n }\n requestObj.isTxQuery = true;\n requestObj.execute(this.beforeExecute).then(onReqFinished).catch(err => {\n const result = {\n error: err\n } as WebWorkerResult;\n onReqFinished(result);\n })\n }\n\n private pushReq_(request: WebWorkerRequest) {\n const push = () => {\n this.reqQueue.push(request);\n };\n const promiseObj = promise((resolve, reject) => {\n request.onSuccess = (result) => {\n resolve(result);\n };\n request.onError = (error) => {\n reject(error);\n };\n });\n if (this.isTxStarted_ === true) {\n push();\n this.processExecutionOfQry_();\n }\n else {\n push();\n }\n this.log(`request pushed : ${request.name}`);\n return promiseObj;\n }\n\n private processExecutionOfQry_() {\n if (this.isQueryExecuting === false) {\n if (this.reqQueue.length > 0) {\n this.executeRequest_(this.reqQueue[0]);\n }\n }\n }\n\n private notExistingTable_(tables: string[]) {\n let invalidTable: string = null;\n tables.every(tableName => {\n const table = this.table(tableName);\n if (table == null) {\n invalidTable = tableName;\n return false;\n }\n return true;\n });\n return invalidTable;\n }\n}","import { DbMeta } from \"@worker/model\";\nimport { IDataBase, ITable } from \"@/common\";\n\nexport const userDbSchema = (db: DbMeta) => {\n const database = {\n name: db.name,\n version: db.version,\n tables: []\n } as IDataBase;\n db.tables.forEach(table => {\n const tableAsObj = {\n name: table.name,\n columns: {}\n } as ITable;\n table.columns.forEach(column => {\n tableAsObj.columns[column.name] = column;\n });\n database.tables.push(tableAsObj);\n })\n return database;\n}","import { WebWorkerRequest, promiseResolve, API, IDataBase, WebWorkerResult, promise, ERROR_TYPE, IDbInfo } from \"@/common\";\nimport { DbMeta } from \"./model\";\nimport { IDBUtil } from \"./idbutil\";\nimport { Insert } from \"@executors/insert\";\nimport { IS_WORKER, IS_IDB_SUPPORTED } from \"./constants\";\nimport { MetaHelper } from \"./meta_helper\";\nimport { Select } from \"@executors/select\";\nimport { Count } from \"@executors/count\";\nimport { Update } from \"@executors/update\";\nimport { Intersect } from \"./intersect\";\nimport { DropDb } from \"@executors/drop_db\";\nimport { Union } from \"./union\";\nimport { Remove } from \"@executors/remove\";\nimport { Clear } from \"@executors/clear\";\nimport { Transaction } from \"@executors/transaction\";\nimport { LogHelper, getError, promiseReject, variableFromPath, userDbSchema, getLength } from \"@worker/utils\";\n\nexport class QueryManager {\n util: IDBUtil;\n\n get db() {\n return this.util.db;\n }\n\n middlewares: string[] = [];\n\n private onQryFinished;\n\n protected get logger() {\n return this.util.logger;\n }\n\n constructor(fn?: (result: any) => void) {\n this.util = new IDBUtil();\n this.onQryFinished = IS_WORKER ? (result) => {\n self.postMessage(result);\n } : fn;\n }\n\n private executeMiddleware_(request: WebWorkerRequest) {\n const lastIndex = (getLength(this.middlewares) as any) - 1;\n if (lastIndex < 0) {\n return promiseResolve();\n }\n const middlewareContext = {};\n const db = this.db;\n Object.defineProperty(middlewareContext, 'database', {\n get() {\n return userDbSchema(db);\n }\n });\n return promise((res) => {\n let index = 0;\n const callNextMiddleware = () => {\n if (index <= lastIndex) {\n let promiseResult = variableFromPath(this.middlewares[index++])(request, middlewareContext);\n if (!promiseResult || !promiseResult.then) {\n promiseResult = Promise.resolve(promiseResult);\n }\n promiseResult.then(_ => {\n callNextMiddleware();\n });\n }\n else {\n res();\n }\n };\n callNextMiddleware();\n });\n }\n\n executeQuery(request: WebWorkerRequest, cb: () => Promise) {\n let queryResult: Promise;\n const query = request.query;\n switch (request.name) {\n case API.OpenDb:\n cb();\n queryResult = this.openDb(query);\n break;\n case API.InitDb:\n cb();\n queryResult = this.initDb(query);\n break;\n case API.CloseDb:\n cb();\n queryResult = this.closeDb();\n break;\n case API.Insert:\n queryResult = new Insert(query, this.util).\n execute(cb);\n break;\n case API.Select:\n queryResult = new Select(query, this.util).\n execute(cb);\n break;\n case API.Count:\n queryResult = new Count(query, this.util).\n execute(cb);\n break;\n case API.Update:\n queryResult = new Update(query, this.util).\n execute(cb);\n break;\n case API.Intersect:\n cb();\n queryResult = new Intersect(query, this.util).\n execute();\n break;\n case API.DropDb:\n cb();\n queryResult = this.dropDb();\n break;\n case API.Terminate:\n cb();\n queryResult = this.terminate();\n break;\n case API.Union:\n cb();\n queryResult = new Union(query, this.util).\n execute();\n break;\n case API.Remove:\n queryResult = new Remove(query, this.util).\n execute(cb);\n break;\n case API.Clear:\n queryResult = new Clear(query, this.util).\n execute(cb);\n break;\n case API.Transaction:\n queryResult = new Transaction(query, this.util).\n execute(cb);\n break;\n case API.Get:\n cb();\n queryResult = MetaHelper.get(query as string, this.util);\n break;\n case API.Set:\n cb();\n queryResult = MetaHelper.set(query.key, query.value, this.util);\n break;\n case API.ImportScripts:\n cb();\n queryResult = this.importScripts_(request);\n break;\n case API.ChangeLogStatus:\n cb();\n this.logger.status = query;\n queryResult = Promise.resolve();\n break;\n case API.Middleware:\n cb();\n const value = variableFromPath(query);\n if (!value) {\n return promiseReject(\n new LogHelper(ERROR_TYPE.InvalidMiddleware, query)\n );\n }\n this.middlewares.push(query);\n return promiseResolve();\n default:\n if (process.env.NODE_ENV === 'dev') {\n console.error('The Api:-' + request.name + ' does not support.');\n }\n queryResult = promiseResolve();\n }\n this.logger.log(`Executing query ${request.name} in web worker`);\n return queryResult;\n }\n\n private callResultMiddleware(middlewares: any[], result) {\n return promise((res) => {\n let index = 0;\n const lastIndex = (getLength(middlewares) as any) - 1;\n const callNextMiddleware = () => {\n if (index <= lastIndex) {\n let promiseResult = middlewares[index++](result);\n if (!(promiseResult instanceof Promise)) {\n promiseResult = promiseResolve(promiseResult);\n }\n promiseResult.then(modifiedResult => {\n result = modifiedResult;\n callNextMiddleware();\n });\n }\n else {\n res(result);\n }\n };\n callNextMiddleware();\n });\n }\n private callBeforeMiddleware(middlewares: any[]) {\n return promise((res) => {\n let index = 0;\n const lastIndex = (getLength(middlewares) as any) - 1;\n const callNextMiddleware = () => {\n if (index <= lastIndex) {\n let promiseResult = middlewares[index++]();\n if (!(promiseResult instanceof Promise)) {\n promiseResult = promiseResolve(promiseResult);\n }\n promiseResult.then(callNextMiddleware);\n }\n else {\n res();\n }\n };\n callNextMiddleware();\n });\n }\n\n run(request: WebWorkerRequest) {\n let onResultCallback = [];\n const beforeExecuteCallback = [];\n request.onResult = (cb) => {\n onResultCallback.push((result) => {\n return cb(result);\n });\n };\n request.beforeExecute = (cb) => {\n beforeExecuteCallback.push((result) => {\n return cb(result);\n });\n };\n this.executeMiddleware_(request).then(_ => {\n return this.executeQuery(request, () => {\n return this.callBeforeMiddleware(beforeExecuteCallback);\n }).then((result) => {\n return this.callResultMiddleware(onResultCallback, result).then(modifiedResult => {\n this.returnResult_({\n result: modifiedResult\n });\n });\n });\n }).catch(ex => {\n onResultCallback = [];\n const err = getError(ex);\n const result = {\n error: err\n } as WebWorkerResult;\n this.returnResult_(result);\n });\n }\n\n private importScripts_(request: WebWorkerRequest) {\n return promise((res, rej) => {\n try {\n importScripts(...request.query);\n res();\n } catch (e) {\n const err = new LogHelper(ERROR_TYPE.ImportScriptsFailed, e.message);\n rej(err);\n }\n });\n }\n\n private returnResult_(result: WebWorkerResult) {\n this.logger.log(`Query finished inside web worker`);\n if (this.util) {\n this.util.emptyTx();\n }\n this.onQryFinished(result);\n }\n\n private dropDb() {\n const dbName = this.db.name;\n return this.terminate().then(() => {\n return new DropDb().execute(dbName);\n });\n }\n\n closeDb() {\n return this.util.close();\n }\n\n terminate() {\n return this.closeDb().then(() => {\n this.util.db = null;\n });\n }\n\n openDb(query: IDbInfo) {\n return this.closeDb().then(_ => {\n let pResult: Promise;\n if (this.db && query.name === this.db.name) {\n pResult = this.initDb();\n }\n else {\n pResult = this.initDb({\n name: query.name,\n tables: [\n ],\n version: query.version\n });\n }\n return pResult.then(() => {\n return this.db;\n });\n });\n }\n\n initDb(dataBase?: IDataBase) {\n if (!IS_IDB_SUPPORTED) {\n return promiseReject(\n new LogHelper(ERROR_TYPE.IndexedDbNotSupported)\n );\n }\n\n const dbMeta = dataBase ? new DbMeta(dataBase) : this.db;\n this.util = new IDBUtil();\n\n return promise((res, rej) => {\n this.util.initDb(dbMeta).then((dbInfo) => {\n if (dbInfo.isCreated) {\n MetaHelper.get(\n MetaHelper.dbSchema,\n this.util\n ).then((value: DbMeta) => {\n if (value) {\n value.tables.forEach((table, index) => {\n const targetTable = dbMeta.tables[index];\n if (targetTable) {\n targetTable.autoIncColumnValue =\n table.autoIncColumnValue;\n }\n });\n }\n this.util.db = dbMeta;\n dbInfo.database = userDbSchema(this.db);\n MetaHelper.set(\n MetaHelper.dbSchema, dbMeta,\n this.util\n ).then(() => {\n res(dbInfo);\n });\n });\n }\n else {\n MetaHelper.get(\n MetaHelper.dbSchema,\n this.util\n ).then((value: any) => {\n this.util.db = value;\n dbInfo.database = userDbSchema(this.db);\n res(dbInfo);\n });\n }\n }).catch(rej);\n });\n }\n}\n","import { QueryManager } from \"@/worker/query_manager\";\nimport { IS_WORKER } from \"./constants\";\nexport * from \"./query_manager\";\n\nif (IS_WORKER) {\n const manager = new QueryManager();\n (self as any).onmessage = function (e) {\n manager.run(e.data);\n };\n}\n\n"],"sourceRoot":""}