UNPKG

tse-client

Version:

A client for fetching stock data from the Tehran Stock Exchange (TSETMC). Works in Browser, Node and as CLI.

1 lines 29 kB
!function(){const e=function(){return"undefined"!=typeof global&&this===global}(),t=function(){return"undefined"!=typeof window&&this===window}(),s=e?require("node-fetch"):t?window.fetch:void 0,n=e?require("decimal.js"):t?window.Decimal:void 0,r=e?require("jalaali-js"):t?window.jalaali:void 0;if(t){if(!n)throw new Error("Cannot find required dependency: Decimal");if(!localforage)throw new Error("Cannot find required dependency: localforage")}n.set({precision:40,rounding:n.ROUND_HALF_EVEN});const i=function(){let s;if(e){const{readFileSync:e,writeFileSync:t,existsSync:n,mkdirSync:r,statSync:i,readdirSync:a}=require("fs"),{join:o}=require("path"),{gzip:l,gunzip:c}=require("zlib");let p;const u=require("os").homedir(),m=o(u,"tse-cache"),d=o(u,".tse");if(n(d)){p=e(d,"utf8");try{i(p).isDirectory()}catch{p=m}}else p=m,n(p)||r(p,{recursive:!0}),t(d,p);const f=(s,r=!1)=>new Promise(((i,a)=>{const l=(s=s.replace("tse.","")).startsWith("prices.")?o(p,"prices"):p,u=o(l,`${s}.csv`+(r?".gz":""));if(!n(u))return t(u,""),void i("");const m=e(u,r?void 0:"utf8");i(r?c(m).toString():m)})),h=(e,s,n=!1)=>new Promise(((r,i)=>{e=e.replace("tse.","");let a=p;e.startsWith("prices.")&&(a=o(p,"prices"),e=e.replace("prices.",""));const c=o(a,`${e}.csv`+(n?".gz":""));t(c,n?l(s):s),r()})),g=async function(t=new Set,s=!1){const l=o(p,"intraday");n(l)||r(l);const c=a(l).filter((e=>i(o(l,e)).isDirectory()&&t.has(e)));let u;return u=s?c.map((t=>{const s=a(o(l,t)).map((s=>{const n=".gz"===s.slice(-3);return[n?s.slice(0,-3):s,e(o(l,t,s),n?null:"utf8")]}));return[t,Object.fromEntries(s)]})):c.map((e=>{const t=a(o(l,e)).map((e=>[".gz"===e.slice(-3)?e.slice(0,-3):e,!0]));return[e,Object.fromEntries(t)]})),Object.fromEntries(u)},y=async function(e,s){e=e.replace("tse.","");const i=o(p,"intraday"),a=o(i,e);n(a)||r(a),Object.keys(s).forEach((e=>{const n=s[e];t(o(a,e+("N/A"===n?"":".gz")),s[e])}))};s={getItem:s=>{const r=(s=s.replace("tse.","")).startsWith("prices.")?o(p,"prices"):p,i=o(r,`${s}.csv`);return n(i)||t(i,""),e(i,"utf8")},setItem:(e,s)=>{const n=(e=e.replace("tse.","")).startsWith("prices.")?o(p,"prices"):p;t(o(n,`${e}.csv`),s)},getItemAsync:f,setItemAsync:h,getItems:async function(t=new Set,s={}){const i=o(p,"prices");n(i)||r(i);for(const n of a(i)){const r=n.replace(".csv","");t.has(r)&&(s[r]=e(o(i,n),"utf8"))}},get CACHE_DIR(){return p},set CACHE_DIR(e){"string"==typeof e&&(n(e)||r(e,{recursive:!0}),i(e).isDirectory()&&(p=e,t(d,p)))},itd:{getItems:g,setItem:y}}}else if(t){const e=window.pako||void 0,t=localforage.createInstance({name:"tse.prices"}),n=async(s,n=!1)=>{let r=localforage;s.startsWith("tse.prices.")&&(s=s.replace("prices.",""),r=t);const i=await r.getItem(s);return i?e&&n?e.ungzip(i,{to:"string"}):i:""},r=async(s,n,r=!1)=>{let i=localforage;if(s.startsWith("tse.prices.")&&(s=s.replace("tse.prices.",""),i=t),!e)return void await i.setItem(s,n);const a=r?e.gzip(n):n;await i.setItem(s,a)},i=async function(e=new Set,s={}){await t.iterate(((t,n)=>{let r=n.replace("tse.","");e.has(r)&&(s[r]=t)}))},a=localforage.createInstance({name:"tse.intraday"}),o=async(t,s,n=!1)=>{if(!e)return void await a.setItem(t,s);const r=n?e.gzip(s):s;await a.setItem(t,r)};s={getItem:e=>localStorage.getItem(e)||"",setItem:(e,t)=>localStorage.setItem(e,t),getItemAsync:n,setItemAsync:r,getItems:i,itd:{getItems:async function(e=new Set,t=!1){const s={};return t?await a.iterate(((t,n)=>{e.has(n)&&(s[n]=t)})):await a.iterate(((t,n)=>{e.has(n)&&(s[n]=Object.keys(t).reduce(((e,t)=>(e[t]=!0,e)),{}))})),s},setItem:o}}}return s}();let a="http://service.tsetmc.com/tsev2/data/TseClient2.aspx";const o={Instrument(e){const t={t:"Instrument",a:""+e};return this.makeRequest(t)},InstrumentAndShare(e,t=0){const s={t:"InstrumentAndShare",a:""+e,a2:""+t};return this.makeRequest(s)},LastPossibleDeven(){return this.makeRequest({t:"LastPossibleDeven"})},ClosingPrices(e){const t={t:"ClosingPrices",a:""+e};return this.makeRequest(t)},makeRequest(e){const t=new URL(a);return t.search=new URLSearchParams(e).toString(),new Promise(((e,n)=>{s(t).then((async t=>{200===t.status?e(await t.text()):n(t.status+" "+t.statusText)})).catch((e=>n(e)))}))}};class l{constructor(e=""){const t=e.split(",");if(11!==t.length)throw new Error("Invalid ClosingPrice data!");this.InsCode=t[0],this.DEven=t[1],this.PClosing=t[2],this.PDrCotVal=t[3],this.ZTotTran=t[4],this.QTotTran5J=t[5],this.QTotCap=t[6],this.PriceMin=t[7],this.PriceMax=t[8],this.PriceYesterday=t[9],this.PriceFirst=t[10]}}const c=["date","dateshamsi","open","high","low","last","close","vol","count","value","yesterday","symbol","name","namelatin","companycode"],p=["تاریخ میلادی","تاریخ شمسی","اولین قیمت","بیشترین قیمت","کمترین قیمت","آخرین قیمت","قیمت پایانی","حجم معاملات","تعداد معاملات","ارزش معاملات","قیمت پایانی دیروز","نماد","نام","نام لاتین","کد شرکت"];class u{constructor(e=[]){const t=e.length;if(t>2||t<1)throw new Error("Invalid Column data!");this.name=c[e[0]],this.fname=p[e[0]],this.header=e[1]}}class m{constructor(e=""){const t=e.split(",");if(![18,19].includes(t.length))throw new Error("Invalid Instrument data!");this.InsCode=t[0],this.InstrumentID=t[1],this.LatinSymbol=t[2],this.LatinName=t[3],this.CompanyCode=t[4],this.Symbol=v(t[5]).trim(),this.Name=t[6],this.CIsin=t[7],this.DEven=t[8],this.Flow=t[9],this.LSoc30=t[10],this.CGdSVal=t[11],this.CGrValCot=t[12],this.YMarNSC=t[13],this.CComVal=t[14],this.CSecVal=t[15],this.CSoSecVal=t[16],this.YVal=t[17],t[18]&&(this.SymbolOriginal=v(t[18]).trim())}}class d{constructor(e=""){const t=e.split(",");if(11!==t.length)throw new Error("Invalid InstrumentITD data!");this.InsCode=t[0],this.LVal30=v(t[1]),this.LVal18AFC=v(t[2]),this.FlowTitle=v(t[3]),this.CGrValCotTitle=v(t[4]),this.Flow=t[5],this.CGrValCot=t[6],this.CIsin=t[7],this.InstrumentID=t[8],this.ZTitad=t[9],this.BaseVol=t[10]}}class f{constructor(e=""){const t=e.split(",");if(5!==t.length)throw new Error("Invalid Share data!");this.Idn=t[0],this.InsCode=t[1],this.DEven=t[2],this.NumberOfShareNew=parseInt(t[3]),this.NumberOfShareOld=parseInt(t[4])}}function h(e=!1,t=!1,s="InsCode",n=!1){let r=i.getItem("tse.instruments"+(n?".intraday":""));r=r?r.split("\n"):[];const a=t?[]:{},o=n?d:m;for(const n of r){const r=e?new o(n):n;if(t)a.push(r);else{a[e?r[s]:n.split(",",1)[0]]=r}}return a}function g(e=!1,t=!0){let s=i.getItem("tse.shares");s=s?s.split("\n"):[];const n=t?[]:{};for(const r of s){const s=e?new f(r):r;if(t)n.push(s);else{const t=e?s.InsCode:r.split(",",2)[1];n[t]||(n[t]=[]),n[t].push(s)}}return n}function y(e){return 1e4*e.getFullYear()+100*(e.getMonth()+1)+e.getDate()+""}function v(e){return e.replace(/\u200B/g,"").replace(/\s?\u200C\s?/g," ").replace(/\u200D/g,"").replace(/\uFEFF/g,"").replace(/ك/g,"ک").replace(/ي/g,"ی")}function I(e){return Number.isInteger(e)&&e>=0}let D=1,w=50,C=300,T=3,S=1e3;const E="merged",b={columns:[0,2,3,4,5,6,7,8,9],adjustPrices:0,getAdjustInfo:!1,getAdjustInfoOnly:!1,daysWithoutTrade:!1,startDate:"20010321",mergeSimilarSymbols:!0,cache:!0,csv:!1,csvHeaders:!0,csvDelimiter:",",onprogress:void 0,progressTotal:100,debugMergeSimilarSymbols:!1};let P={},A={};function j(e,t,s){const n=e;return"date"===n?s.DEven:"dateshamsi"===n?r&&function(e){const{jy:t,jm:s,jd:n}=r.toJalaali(+e.slice(0,4),+e.slice(4,6),+e.slice(6,8));return 1e4*t+100*s+n+""}(s.DEven):"open"===n?s.PriceFirst:"high"===n?s.PriceMax:"low"===n?s.PriceMin:"last"===n?s.PDrCotVal:"close"===n?s.PClosing:"vol"===n?s.QTotTran5J:"count"===n?s.ZTotTran:"value"===n?s.QTotCap:"yesterday"===n?s.PriceYesterday:"symbol"===n?t.Symbol:"name"===n?t.Name:"namelatin"===n?t.LatinName:"companycode"===n?t.CompanyCode:""}function _(e="",t){if(!e||"0"===e)return!0;const s=new Date,n=y(s),r=function(e,t){const s=+new Date(+e.slice(0,4),+e.slice(4,6)-1,+e.slice(6,8)),n=+new Date(+t.slice(0,4),+t.slice(4,6)-1,+t.slice(6,8)),r=Math.abs(n-s);return Math.ceil(r/864e5)}(t,e),i=[4,5].includes(s.getDay()),a=(o=t,new Date(+o.slice(0,4),+o.slice(4,6)-1,+o.slice(6,8))).getDay();var o;return r>=D&&(n!==t||s.getHours()>16)&&!(i&&3!==a&&r<=3)}async function R(){const e=+i.getItem("tse.lastInstrumentUpdate"),t=new Date,s=+y(t);if(e&&(s<=e||t.getHours()<=16))return;let n,r,a;if(e){r=g();const e=r.map((e=>+e.split(",",1)[0]));n=Math.max(...e)}else n=0;const l=await o.InstrumentAndShare(s,n).catch((e=>a=e));if(a)return{title:"Failed request: InstrumentAndShare",detail:a};let c=l.split("@")[1];a=0;let p=await o.Instrument(0).catch((e=>a=e));if(a)return{title:"Failed request: Instrument",detail:a};if(""!==p&&"*"!==p){let e=p.split(";").map((e=>e.split(","))),t=[...e.map((e=>((e=[...e])[5]=v(e[5]).trim(),e)))],s=[...new Set(t.map((e=>e[5])).filter(((e,t,s)=>s.indexOf(e)!==t)))].map((e=>t.filter((t=>t[5]===e)))),n=new Map(e.map(((e,t)=>[e[0],t])));for(let t of s){t.sort(((e,t)=>+t[8]-e[8])).forEach(((t,s)=>{let r=n.get(t[0]),i=e[r][5];if(s>0){let e="-ق"+(s+1);t.push(i),t[5]=i.trim()+e}else t[5]=i}))}s.flat().forEach((t=>{let s=n.get(t[0]);e[s]=t})),p=e,n=void 0,t=void 0,e=void 0,p=p.map((e=>e.join(","))).join("\n"),i.setItem("tse.instruments",p)}""!==c&&(c=r&&r.length?r.concat(c.split(";")).join("\n"):c.replace(/;/g,"\n"),i.setItem("tse.shares",c)),(""!==p&&"*"!==p||""!==c)&&i.setItem("tse.lastInstrumentUpdate",""+s)}const O=function(){let e,t,s,r,a,l,c,p,u,m=0,d=[],f=[],h=0,g=[],y=new Map,v=[];function I(){if(y.size>0||e)setTimeout(I,200);else{if(d.length===m||h>=T){const e=[...d],s=[...f];return d=[],f=[],void Promise.all(v).then((()=>{v=[],t({succs:e,fails:s,pn:r})}))}if(g.length){const t=new Set(g.flat().map((e=>e[0])));f=f.filter((e=>!t.has(e))),h++,e=setTimeout(b,S,g),g=[],setTimeout(I,S)}}}function D(e,t,a){const o=new Set(t.map((([e])=>e)));if("string"!=typeof e||!/^[\d.,;@-]+$/.test(e)&&""!==e)f.push(...o),g.push(t);else{const a=e.replace(/;/g,"\n").split("@").map(((e,s)=>[t[s][0],e]));for(const[e,t]of a)if(d.push(e),t){const s=A[e],n=s?s+"\n"+t:t;A[e]=n,P[e]=t.split("\n").slice(-1)[0].split(",",2)[1],v.push(p&&i.setItemAsync("tse.prices."+e,n))}else P[e]=u;if(f=f.filter((e=>!o.has(e))),s){const e=l.div(T+2).mul(h+1);s(r=+n(r).plus(l.sub(e)))}}y.delete(a)}function E(e=[],t){const i=e.map((e=>e.join(","))).join(";");o.ClosingPrices(i).then((s=>D(s,e,t))).catch((()=>D(void 0,e,t))),s&&s(r=+n(r).plus(c))}function b(t=[]){e&&(e=void 0);const s=t.map(((e,t)=>"a"+t));for(let e=0,n=0,r=t.length;e<r;e++,n+=C){const r=s[e],i=setTimeout(E,n,t[e],r);y.set(r,i)}}return function(i=[],o,v,D={}){var C,S;return p=o,u=v,({pf:s,pn:r,ptot:a}=D),m=i.length,l=a.div(Math.ceil(n(m).div(w))),c=l.div(T+2),d=[],f=[],h=0,g=[],y=new Map,e=void 0,b((S=w,(C=i).map(((e,t)=>t%S==0?C.slice(t,t+S):void 0)).filter((e=>e)))),I(),new Promise((e=>t=e))}}();async function N(e=[],t,{pf:s,pn:r,ptot:a}={}){P=i.getItem("tse.inscode_lastdeven");let l=new Set;if(P){const e=P.split("\n").map((e=>e.split(",")));P=Object.fromEntries(e),l=new Set(Object.keys(P))}else P={};let c={succs:[],fails:[],error:void 0,pn:r};const p=+n(r).plus(a),u=await async function(){let e,t;const s=i.getItem("tse.lastPossibleDevens");s&&([e,t]=s.split(","));const n=y(new Date);if(+n<=i.getItem("tse.lastLPDUpdate"))return[e,t];if(!s||_(n,e)||_(n,t)){let s;const r=await o.LastPossibleDeven().catch((e=>s=e));if(s)return{title:"Failed request: LastPossibleDeven",detail:s};if(!/^\d{8};\d{8}$/.test(r))return{title:"Invalid server response: LastPossibleDeven"};const a=r.split(";");i.setItem("tse.lastPossibleDevens",a.join(",")),i.setItem("tse.lastLPDUpdate",n),[e,t]=a}return[e,t]}();if(m=u,"[object Object]"===Object.prototype.toString.call(m))return c.error=u,s&&s(r=p),c;var m;const[d,f]=u,{startDate:h}=b,g=e.map((e=>{const{InsCode:t,YMarNSC:s}=e,n="NO"===s?0:1;if(!l.has(t))return[t,h,n];{const e=P[t];if(!e)return;if(_(e,"NO"!==s?f:d))return[t,e,n]}})).filter((e=>e));s&&s(r=+n(r).plus(a.mul(.01)));const v=new Set(e.map((e=>e.InsCode))),I=new Set(Object.keys(A));if(I.size&&![...v].find((e=>!I.has(e)))||await i.getItems(v,A),s&&s(r=+n(r).plus(a.mul(.01))),g.length){const e=await O(g,t,d,{pf:s,pn:r,ptot:a.sub(a.mul(.02))}),{succs:n,fails:o}=e;if(({pn:r}=e),n.length&&t){const e=Object.keys(P).map((e=>[e,P[e]].join(","))).join("\n");i.setItem("tse.inscode_lastdeven",e)}c={succs:n,fails:o}}return s&&r!==p&&s(r=p),c.pn=r,c}let U=(e="",t="",s="")=>`http://${e>0?"cdn"+e+".":e<0?"":"cdn."}tsetmc.com/Loader.aspx?ParTree=15131P&i=${t}&d=${s}`,L=100,Y=6e4,M=3,k=1e3,x=[-1,0];const F={startDate:"20010321",endDate:"",cache:!0,gzip:!0,reUpdateNoTrades:!1,updateOnly:!1,onprogress:void 0,progressTotal:100,chunkDelay:L,chunkMaxWait:Y,retryCount:M,retryDelay:k,servers:x};let z,q,V={};if(e){const{gzipSync:e,gunzipSync:t}=require("zlib");z=t=>e(t),q=e=>t(e).toString()}else if(t){const{gzip:e,ungzip:t}=window.pako||{};z=t=>e(t),q=e=>t(e,{to:"string"})}function H(e,t={}){for(let[s,n]of e)"[object Map]"===Map.prototype.toString.call(n)||Array.isArray(n)?t[s]=H(n,t[s]):t[s]=n;return t}function W(e,t){let s=t.split(e)[1].split("];",1)[0];return s="["+s.replace(/'/g,'"')+"]",JSON.parse(s)}async function Z(e="",t=[],s){V[e]||(V[e]={});let n=V[e];for(let[e,s]of t){if("N/A"===s){n[e]=s;continue}let t,r=W("var ClosingPriceData=[",s),i=W("var BestLimitData=[",s),a=W("var IntraTradeData=[",s),o=W("var ClientTypeData=[",s),l=W("var InstrumentStateData=[",s),c=W("var StaticTreshholdData=[",s),p=W("var InstSimpleData=[",s),u=W("var ShareHolderData=[",s);t=[12,2,3,4,6,7,8,9,10,11];let m=r.map((e=>t.map((t=>e[t])).join(","))).join("\n");t=[0,1,2,3,4,5,6,7];let d=i.map((e=>t.map((t=>e[t])).join(","))).join("\n");t=[1,0,2,3,4];let f=a.map((e=>{let[s,n,r]=e[1].split(":"),i=1e4*+s+100*+n+ +r+"";return e[1]=i,t.map((t=>e[t]))})).sort(((e,t)=>+e[0]-t[0])).map((e=>e.join(","))).join("\n");t=[4,0,12,16,8,6,2,14,18,10,5,1,13,17,9,7,3,15,19,11,20];let h,g,y=t.map((e=>o[e])).join(","),[I,D]=[l,c],w=I.length&&I[0].length?I[0][2]:"";D.length&&D[1].length&&(h=D[1][2],g=D[1][1]);let[C,T]=[4,9].map((e=>p[e])),S=[T,C,h,g,w].join(",");t=[2,3,4,0,5];let E=u.filter((e=>e[4])).map((e=>(e[4]={ArrowUp:"+",ArrowDown:"-"}[e[4]],e[5]=v(e[5]),t.map((t=>e[t])).join(",")))).join("\n"),b=[m,d,f,y,S];E&&b.push(E),n[e]=z(b.join("\n\n"))}let r=n,a=Object.keys(r).filter((e=>!0!==r[e])).reduce(((e,t)=>(e[t]=r[t],e)),{});if(s)return i.itd.setItem(e,a)}const $=function(){let e,r,a,o,l,c,p,u,m,d,f,g,y={},v=0,I=[],D=[],w=0,C=[],T=new Map,S=-1,E=[],b={},P={};function A(){if(T.size>0||S)setTimeout(A,200);else{if(I.length===v||w>=o){let s=[...I],n=[...D.map((e=>e.slice(1)))];I=[],D=[],t&&(y={});let r=h(!1,!1,void 0,!0);return r={...r,...P},r=Object.keys(r).map((e=>r[e])).join("\n"),i.setItem("tse.instruments.intraday",r),b={},P={},void Promise.all(E).then((()=>{E=[],e({succs:s,fails:n})}))}if(C.length){let e=C.map((e=>e.join("")));D=D.filter((t=>-1===e.indexOf(t.join("")))),w++,C.forEach((e=>{return e[0]=(t=e[0],t=c.indexOf(t)+1,c[t<c.length?t:0]);var t})),S=setTimeout(R,l,C,!0),C=[],setTimeout(A,l)}}}function j(e,s,r){if("string"==typeof e){let r=e;if("N/A"!==e){let t="var InstSimpleData"+e.split("var InstSimpleData")[1].split(";")[0]+";",s="var StaticTreshholdData"+e.split("var StaticTreshholdData")[1];r=t.replace(/\t/g,"\\t")+s}let i=s.slice(1);I.push(i);let[a,l]=i;if(l===b[a]&&"N/A"!==e){let e=JSON.parse(r.split("var InstSimpleData=")[1].split(";")[0].replace(/'/g,'"'));P[a]=[a,...e].join(",")}if(t){let e=y[a];if(e[l]=r,!Object.keys(e).find((t=>!e[t]))){let t=Object.keys(e).map((t=>[t,e[t]]));E.push(Z(a,t,p))}}else E.push(Z(a,[[l,r]],p));if(D=D.filter((e=>e.join()!==s.join())),u){let e=f.div(o+2).mul(w+1);u(m=+n(m).plus(f.sub(e)))}}else D.push(s),C.push(s);T.delete(r)}async function _(e=[],t){let r,i,[o,l,c]=e;"undefined"!=typeof AbortController&&(r=new AbortController,i=r.signal),s(U(o,l,c),i?{signal:i}:void 0).then((async s=>{let{status:n}=s;if(200===n){let n=await s.text();if(n.includes('Object moved to <a href="/GeneralError.aspx?aspxerrorpath=/Loader.aspx">here</a>'))j("N/A",e,t);else{let s=n.split("var StaticTreshholdData")[1];j(["ClosingPrice","IntraDayPrice","IntraTrade","ClientType","BestLimit"].some((e=>s.split(`var ${e}Data=[`)[1].split("];")[0]))?n:void 0,e,t)}}else j(void 0,e,t)})).catch((()=>j(void 0,e,t))),r&&setTimeout((()=>r.abort()),a),u&&u(m=+n(m).plus(g))}function R(e=[]){S&&(S=void 0);let t=e.map(((e,t)=>"a"+t));for(let s=0,n=0,i=e.length;s<i;s++,n+=r){let r=t[s],i=setTimeout(_,n,e[s],r);T.set(r,i)}}return async function(s,n,i){({chunkDelay:r,chunkMaxWait:a,retryCount:o,retryDelay:l,servers:c,shouldCache:p}=n),({pf:u,pn:m,ptot:d}=i),t&&(y=H(s.map((([e,t])=>[e,t.map((e=>[e,void 0]))]))));let h=[...s].reduce(((e,[t,s])=>[...e,...s?s.map((e=>[c[0],t,""+e])):[]]),[]);return v=h.length,f=d.div(v),g=f.div(o+2),I=[],D=[],w=0,C=[],T=new Map,S=void 0,E=[],b=H(s.map((([e,t])=>[e,""+t[t.length-1]]))),P={},R(h),A(),new Promise((t=>e=t))}}();const G={getPrices:async function(e=[],t={}){if(!e.length)return;const s={...b,...t},r={data:[],error:void 0};let{onprogress:i,progressTotal:a}=s;"function"!=typeof i&&(i=void 0),"number"!=typeof a&&(a=b.progressTotal);let o=0;a=n(a);const c=await R();if(i&&i(o=+n(o).plus(a.mul(.01))),c){const{title:e,detail:t}=c;return r.error={code:1,title:e,detail:t},i&&i(+a),r}const p=h(!0,void 0,"Symbol"),m=e.map((e=>p[e])),d=e.filter(((e,t)=>!m[t]));if(i&&i(o=+n(o).plus(a.mul(.01))),d.length)return r.error={code:2,title:"Incorrect Symbol",symbols:d},i&&i(+a),r;const{mergeSimilarSymbols:f}=s;let y=new Map,v=-1;if(f){const e=Object.keys(p).map((e=>p[e])),t=new Set(e.filter((e=>e.SymbolOriginal)).map((e=>e.SymbolOriginal))),s=new RegExp("-ق(\\d+)");y=new Map([...t].map((e=>[e,[]]))),e.forEach(((e,t)=>{const{SymbolOriginal:n,Symbol:r,InsCode:i}=e,a=n||r;y.has(a)&&y.get(a).push({sym:r,code:i,order:n?+r.match(s)[1]:1})})),[...y].forEach((([,e])=>e.sort(((e,t)=>e.order-t.order))));const n=new Set(m.map((e=>e.Symbol))),r=m.map((({Symbol:e})=>{if(!y.has(e))return;let t=y.get(e).slice(1).map((e=>e.sym));t=t.filter((e=>!n.has(e)));const s=t.map((e=>p[e]));return s})).flat().filter((e=>e));r.length&&(v=m.length,m.push(...r))}const I=await N(m,s.cache,{pf:i,pn:o,ptot:a.mul(.78)}),{succs:D,fails:w,error:C}=I;if(({pn:o}=I),C){const{title:e,detail:t}=C;return r.error={code:1,title:e,detail:t},i&&i(+a),r}if(w.length){const e=Object.fromEntries(m.map((e=>[e.InsCode,e.Symbol])));r.error={code:3,title:"Incomplete Price Update",fails:w.map((t=>e[t])),succs:D.map((t=>e[t]))};const t=new Set(w);m.forEach(((e,s,n)=>t.has(e.InsCode)?n[s]=void 0:0))}f&&v>-1&&m.splice(v);const T=s.columns.map((e=>{const t=Array.isArray(e)?e:[e],s=new u(t),n=s.header||s.name;return{...s,header:n}})),{adjustPrices:S,daysWithoutTrade:P,startDate:_,csv:O}=s,U=g(!0),L=n(a).mul(.2).div(m.length),Y={},{debugMergeSimilarSymbols:M}=s;if(f){let e=new Map;const t=Object.keys(new l(Array(11).join(","))),s=[];for(const[,n]of[...y]){for(let t of n){const{code:s}=t,n=A[s];if(!n){e.set(s,[]);continue}const r=n.split("\n").map((e=>new l(e)));e.set(s,r);const i=r.length;t.dayFirst=i&&+r[0].DEven,t.dayLast=i&&+r.slice(-1)[0].DEven}const r=[...n].reverse(),i=r.map((e=>e.code)),a=i[i.length-1],o={mergeItems:n};if(r.map((e=>[e.dayFirst,e.dayLast])).flat().some(((e,t,s)=>t>0&&e<s[t-1]))){const s=e=>e.reduce(((e,t)=>e+t)),n=(e,s)=>t.every((t=>e[t]===s[t])),r=i.map((t=>e.get(t))).flat(),l=new Map;l.set(r[0].DEven,r[0]);for(let e=1,t=r.length-1;e<t;e++){const[t,i]=[r[e-1],r[e]],{DEven:a}=i;let o=i,c=l.get(a);if(c){const e=[c,i].map((e=>[e,e.ZTotTran,Math.abs(e.InsCode-t.InsCode)])),[[n]]=e.sort(((e,t)=>e[2]-t[2])).sort(((e,t)=>t[1]-e[1])),r={...n},a=e.map((e=>+e[0].ZTotTran));r.ZTotTran=""+s(a),o=r}l.set(a,o);if(i.InsCode===t.InsCode&&i.PriceYesterday!==t.PClosing){const{DEven:e}=t;let r=t,a=l.get(e);if(a){if(n(a,t))continue;if(a.PClosing!==t.PClosing){const e=[a,t].map((e=>+e.ZTotTran)),n={...t};n.ZTotTran=""+s(e),r=n}else{const e=[a,t].map((e=>[e,e.ZTotTran,Math.abs(e.InsCode-i.InsCode)])),[[n]]=e.sort(((e,t)=>e[2]-t[2])).sort(((e,t)=>t[1]-e[1])),o={...n},l=e.map((e=>+e[0].ZTotTran));o.ZTotTran=""+s(l),r=o}}l.set(e,r)}}if(M){const e=(e,t,s)=>t>0&&e.PriceYesterday!==s[t-1].PClosing,t=e=>"0"!==e.DEven,s=r.map(((e,t,s)=>t>0&&e.DEven<s[t-1].DEven?t:-1)).filter((e=>e>-1)).map((s=>{const n=+r[s-1].DEven,i=r.slice(s).filter((e=>e.DEven<n)),a=i.length,o=i.filter(e).length,l={count:a,adjs:o,trades:i.filter(t).length,fixable:a>0&&0===o},c=+r[s].DEven,p=r.slice(0,s).filter((e=>e.DEven<=c)),u=p.length,m=p.filter(e).length;return{atIndex:s,trimForw:l,trimBack:{count:u,adjs:m,trades:p.filter(t).length,fixable:u>0&&0===m}}}));o.hasOverlap=!0,o.statsAtEachOverlap=s}const c=[...l.values()];c.sort(((e,t)=>e.DEven-t.DEven));const p=c.map((e=>t.map((t=>e[t])).join(","))).join("\n");Y[a]=p}else{const e=i.map((e=>A[e])).filter((e=>e)).join("\n");Y[a]=e}M&&s.push(o)}e=void 0,M&&(r.debug={mergeSets:s})}const{getAdjustInfo:k,getAdjustInfoOnly:x}=s,F=k||x,z=e=>{const{InsCode:t,Symbol:s,SymbolOriginal:r}=e;let i,a,o;if(r){if(f)return E;i=A[t],a=new Set([t])}else{const e=y.has(s);i=e?Y[t]:A[t],a=new Set(e?y.get(s).map((e=>e.code)):[t])}if(i){if(i=i.split("\n").map((e=>new l(e))),S>0||F){const e=new Map(U.filter((e=>a.has(e.InsCode))).map((e=>[e.DEven,e]))),t=function(e,t,s,r,i){const a=t,o=t.length,l=r||i,c=[],p={events:[],validGPLRatio:void 0};let u={prices:i?void 0:a,info:l?p:void 0};if((1===e||2===e||l)&&o>1){let t=new n("0.0"),r=new n("1.0");if(c.push(a[o-1]),1===e||l)for(let e=o-2;e>=0;e-=1){const[s,r]=[a[e],a[e+1]];n(s.PClosing).eq(r.PriceYesterday)||s.InsCode!==r.InsCode||(t=t.plus(1))}const m=t.div(o).lt("0.08");if(p.validGPLRatio=m,1===e&&m||2===e||l){for(let t=o-2;t>=0;t-=1){const[o,u]=[a[t],a[t+1]],d=!n(o.PClosing).eq(u.PriceYesterday)&&o.InsCode===u.InsCode,f=s.get(u.DEven);if(l&&d&&(m||f)){const e={},t=o.PClosing,s=u.PriceYesterday;let r=o.DEven;if(f){const{NumberOfShareOld:t,NumberOfShareNew:s}=f,r=n(s).sub(t).div(t);e.type="capital increase",e.increasePct=r.toString(),e.oldShares=""+t,e.newShares=""+s}else{const r=n(t).sub(s);e.type="dividend",e.dividend=r.toString()}e.priceBeforeEvent=t,e.priceAfterEvent=s,e.date=r,p.events.push(e)}if(i)continue;if(1===e&&d)r=r.times(u.PriceYesterday).div(o.PClosing);else if(2===e&&d&&f){const e=f.NumberOfShareOld,t=f.NumberOfShareNew;r=r.times(e).div(t)}let h=r.times(o.PClosing).toDecimalPlaces(2).toFixed(2),g=r.times(o.PDrCotVal).toDecimalPlaces(2).toFixed(2),y=r.times(o.PriceMin).toDecimalPlaces(0).toString(),v=r.times(o.PriceMax).toDecimalPlaces(0).toString(),I=r.times(o.PriceYesterday).toDecimalPlaces(0).toString(),D=r.times(o.PriceFirst).toDecimalPlaces(2).toFixed(2);const w={InsCode:o.InsCode,DEven:o.DEven,PClosing:h,PDrCotVal:g,ZTotTran:o.ZTotTran,QTotTran5J:o.QTotTran5J,QTotCap:o.QTotCap,PriceMin:y,PriceMax:v,PriceYesterday:I,PriceFirst:D};c.push(w)}c.reverse(),u={prices:i?void 0:c,info:l?p:void 0}}}return u}(S,i,e,k,x);S>0&&(i=t.prices||[]),F&&(o=t.info)}return P||(i=i.filter((e=>+e.ZTotTran>0))),i=i.filter((e=>+e.DEven>+_)),{prices:i,adjustInfo:o}}};if(O){const{csvHeaders:e,csvDelimiter:t}=s,a=e?T.map((e=>e.header)).join()+"\n":"";r.data=m.map((e=>{if(!e)return;const s={csv:a,adjustInfo:void 0},r=z(e);if(!r)return s;if(r===E)return r;const{prices:l,adjustInfo:c}=r;return x?{adjustInfo:c}:(c&&(s.adjustInfo=c),s.csv+=l.map((s=>T.map((t=>j(t.name,e,s))).join(t))).join("\n"),i&&i(o=+n(o).plus(L)),s)}))}else{const e=new Set(["CompanyCode","LatinName","Symbol","Name"]);r.data=m.map((t=>{if(!t)return;const s=Object.fromEntries(T.map((e=>[e.header,[]]))),r=z(t);if(!r)return s;if(r===E)return r;const{prices:a,adjustInfo:l}=r;if(x)return{adjustInfo:l};l&&(s.adjustInfo=l);for(const n of a)for(const{header:r,name:i}of T){const a=j(i,t,n);s[r].push(e.has(i)?a:parseFloat(a))}return i&&i(o=+n(o).plus(L)),s}))}return i&&o!==a&&i(o=+a),r},getInstruments:async function(e=!0,t=!0,s="InsCode"){-1===Object.keys(new m([...Array(18).keys()].join(","))).indexOf(s)&&(s="InsCode");const n=i.getItem("tse.lastInstrumentUpdate"),r=await R();if(r&&!n)throw r;return h(e,t,s)},get API_URL(){return a},set API_URL(e){if("string"!=typeof e)return;let t;try{new URL(e)}catch(e){throw t=!0,e}t||(a=e)},get UPDATE_INTERVAL(){return D},set UPDATE_INTERVAL(e){I(e)&&(D=e)},get PRICES_UPDATE_CHUNK(){return w},set PRICES_UPDATE_CHUNK(e){Number.isInteger(e)&&e>0&&e<60&&(w=e)},get PRICES_UPDATE_CHUNK_DELAY(){return C},set PRICES_UPDATE_CHUNK_DELAY(e){I(e)&&(C=e)},get PRICES_UPDATE_RETRY_COUNT(){return T},set PRICES_UPDATE_RETRY_COUNT(e){I(e)&&(T=e)},get PRICES_UPDATE_RETRY_DELAY(){return S},set PRICES_UPDATE_RETRY_DELAY(e){I(e)&&(S=e)},get columnList(){return[...Array(15)].map(((e,t)=>({name:c[t],fname:p[t]})))},getIntraday:async function(e=[],t={}){if(!e.length)return;const s={...F,...t},r={data:[],error:void 0};let{onprogress:a,progressTotal:o}=s;"function"!=typeof a&&(a=void 0),"number"!=typeof o&&(o=F.progressTotal);let l=0;o=n(o);const c=await R();if(a&&a(l=+n(l).plus(o.mul(.01))),c){const{title:e,detail:t}=c;return r.error={code:1,title:e,detail:t},a&&a(+o),r}const p=h(!0,void 0,"Symbol"),u=e.map((e=>p[e])),m=e.filter(((e,t)=>!u[t]));if(a&&a(l=+n(l).plus(o.mul(.01))),m.length)return r.error={code:2,title:"Incorrect Symbol",symbols:m},a&&a(+o),r;const d=new Set(u.map((e=>e&&e.InsCode)));let f=await i.getItemAsync("tse.inscode_devens");f=f?f.split("\n").map((e=>e.split(";"))).map((([e,t])=>[e,t.split(",").map((e=>+e))])):[];const g=new Set(f.map((e=>e[0]))),v=[...new Set(f.map((([,e])=>e[e.length-1])))],I=+s.endDate,D=I||+y(new Date),{cache:w}=s;if(!f.length||[...d].some((e=>!g.has(e)))||v.some((e=>e<D))){const e=await N(u,w,{pf:a,pn:l,ptot:o.mul(.1)}),{succs:t,fails:s,error:n}=e;if(({pn:l}=e),n){const{title:e,detail:t}=n;return r.error={code:1,title:e,detail:t},a&&a(+o),r}if(s.length){const e=Object.fromEntries(u.map((e=>[e.InsCode,e.Symbol])));r.error={code:3,title:"Incomplete Price Update",fails:s.map((t=>e[t])),succs:t.map((t=>e[t]))},u.forEach(((e,t,n)=>s.includes(e.InsCode)?n[t]=void 0:0))}if(f=Object.keys(A).map((e=>{const t=A[e];if(!t)return;return[e,t.split("\n").filter((e=>+e.split(",",5)[4]>0)).map((e=>+e.split(",",2)[1]))]})).filter((e=>e)),w){const e=f.map((([e,t])=>[e,t.join(",")].join(";"))).join("\n");await i.setItemAsync("tse.inscode_devens",e)}}f=Object.fromEntries(f),a&&a(l=+n(l).plus(o.mul(.01)));let C=+s.startDate,T=I?e=>e>=C&&e<=I:e=>e>=C,S=[...d].map((e=>{if(!e)return[];let t=f[e];return t?[e,t.filter(T)]:[e,[]]})),{reUpdateNoTrades:E,updateOnly:b}=s;V=await i.itd.getItems(d,!b||E);let P=S.map((([e,t])=>{if(!e||!t.length)return;if(!V[e])return[e,t];let s=E?t.filter((t=>{let s=V[e][t];if(!s)return!0;let[,,n]=q(s).split("\n\n");return!n})):t.filter((t=>!V[e][t]));return s.length?[e,s]:void 0})).filter((e=>e));a&&a(l=+n(l).plus(o.mul(.01)));let{chunkDelay:j,chunkMaxWait:_,retryCount:O,retryDelay:U,servers:L}=s;if(Array.isArray(L)&&!L.some((e=>!Number.isInteger(e)||e<0))||(L=F.servers),P.length>0){let{succs:e,fails:t}=await $(P,{shouldCache:w,chunkDelay:j,chunkMaxWait:_,retryCount:O,retryDelay:U,servers:L},{pf:a,pn:l,ptot:o.mul(.85)});if(t.length){let s=Object.fromEntries(u.map((e=>[e.InsCode,e.Symbol]))),n=(e,[t,n])=>(!e[s[t]]&&(e[s[t]]=[]),e[s[t]].push(n),e);r.error={code:4,title:"Incomplete Intraday Update",fails:t.reduce(n,{}),succs:e.reduce(n,{})}}}if(a&&a(l=+o.mul(.99)),!b){let{gzip:e}=s;r.data=S.map((([t,s])=>{let n=V[t];if(n)return e?s.map((e=>[e,n[e]])):s.map((e=>[e,n[e]&&"string"!=typeof n[e]?q(n[e]):n[e]]))}))}return a&&a(+o),r},getIntradayInstruments:async function(e=!0,t=!0,s="InsCode"){return-1===Object.keys(new d([...Array(11).keys()].join(","))).indexOf(s)&&(s="InsCode"),h(e,t,s,!0)},get INTRADAY_URL(){return U},set INTRADAY_URL(e){if("function"!=typeof e)return;let t;try{new URL(e())}catch(e){throw t=!0,e}t||(U=e)},get INTRADAY_UPDATE_CHUNK_DELAY(){return L},set INTRADAY_UPDATE_CHUNK_DELAY(e){I(e)&&(L=e)},get INTRADAY_UPDATE_CHUNK_MAX_WAIT(){return Y},set INTRADAY_UPDATE_CHUNK_MAX_WAIT(e){I(e)&&(Y=e)},get INTRADAY_UPDATE_RETRY_COUNT(){return M},set INTRADAY_UPDATE_RETRY_COUNT(e){I(e)&&(M=e)},get INTRADAY_UPDATE_RETRY_DELAY(){return k},set INTRADAY_UPDATE_RETRY_DELAY(e){I(e)&&(k=e)},get INTRADAY_UPDATE_SERVERS(){return x},set INTRADAY_UPDATE_SERVERS(e){Array.isArray(e)&&!e.some((e=>!Number.isInteger(e)))&&(x=e)},itdGroupCols:[["price",["time","last","close","open","high","low","count","volume","value","discarded"]],["order",["time","row","askcount","askvol","askprice","bidprice","bidvol","bidcount"]],["trade",["time","count","volume","price","discarded"]],["client",["pbvol","pbcount","pbval","pbprice","pbvolpot","psvol","pscount","psval","psprice","psvolpot","lbvol","lbcount","lbval","lbprice","lbvolpot","lsvol","lscount","lsval","lsprice","lsvolpot","lpchg"]],["misc",["basevol","flow","daymin","daymax","state"]],["shareholder",["shares","sharespot","change","companycode","companyname"]]]};e?(Object.defineProperty(G,"CACHE_DIR",{get:()=>i.CACHE_DIR,set:e=>i.CACHE_DIR=e}),module.exports=G):t&&(window.tse=G)}();