borsajs 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.en.md +209 -0
- package/README.md +57 -0
- package/dist/cache.d.ts +24 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +40 -0
- package/dist/cache.js.map +1 -0
- package/dist/crypto.d.ts +17 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +25 -0
- package/dist/crypto.js.map +1 -0
- package/dist/exceptions.d.ts +34 -0
- package/dist/exceptions.d.ts.map +1 -0
- package/dist/exceptions.js +70 -0
- package/dist/exceptions.js.map +1 -0
- package/dist/fund.d.ts +28 -0
- package/dist/fund.d.ts.map +1 -0
- package/dist/fund.js +29 -0
- package/dist/fund.js.map +1 -0
- package/dist/fx.d.ts +16 -0
- package/dist/fx.d.ts.map +1 -0
- package/dist/fx.js +22 -0
- package/dist/fx.js.map +1 -0
- package/dist/index-class.d.ts +21 -0
- package/dist/index-class.d.ts.map +1 -0
- package/dist/index-class.js +31 -0
- package/dist/index-class.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/inflation.d.ts +12 -0
- package/dist/inflation.d.ts.map +1 -0
- package/dist/inflation.js +28 -0
- package/dist/inflation.js.map +1 -0
- package/dist/market.d.ts +7 -0
- package/dist/market.d.ts.map +1 -0
- package/dist/market.js +7 -0
- package/dist/market.js.map +1 -0
- package/dist/multi.d.ts +26 -0
- package/dist/multi.d.ts.map +1 -0
- package/dist/multi.js +46 -0
- package/dist/multi.js.map +1 -0
- package/dist/providers/base.d.ts +24 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +28 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/btcturk.d.ts +43 -0
- package/dist/providers/btcturk.d.ts.map +1 -0
- package/dist/providers/btcturk.js +94 -0
- package/dist/providers/btcturk.js.map +1 -0
- package/dist/providers/dovizcom.d.ts +42 -0
- package/dist/providers/dovizcom.d.ts.map +1 -0
- package/dist/providers/dovizcom.js +105 -0
- package/dist/providers/dovizcom.js.map +1 -0
- package/dist/providers/index.d.ts +20 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +12 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/kap.d.ts +37 -0
- package/dist/providers/kap.d.ts.map +1 -0
- package/dist/providers/kap.js +110 -0
- package/dist/providers/kap.js.map +1 -0
- package/dist/providers/paratic.d.ts +41 -0
- package/dist/providers/paratic.d.ts.map +1 -0
- package/dist/providers/paratic.js +85 -0
- package/dist/providers/paratic.js.map +1 -0
- package/dist/providers/tcmb.d.ts +49 -0
- package/dist/providers/tcmb.d.ts.map +1 -0
- package/dist/providers/tcmb.js +99 -0
- package/dist/providers/tcmb.js.map +1 -0
- package/dist/providers/tefas.d.ts +51 -0
- package/dist/providers/tefas.d.ts.map +1 -0
- package/dist/providers/tefas.js +89 -0
- package/dist/providers/tefas.js.map +1 -0
- package/dist/providers/viop.d.ts +35 -0
- package/dist/providers/viop.d.ts.map +1 -0
- package/dist/providers/viop.js +140 -0
- package/dist/providers/viop.js.map +1 -0
- package/dist/ticker.d.ts +18 -0
- package/dist/ticker.d.ts.map +1 -0
- package/dist/ticker.js +23 -0
- package/dist/ticker.js.map +1 -0
- package/dist/viop.d.ts +19 -0
- package/dist/viop.d.ts.map +1 -0
- package/dist/viop.js +31 -0
- package/dist/viop.js.map +1 -0
- package/package.json +52 -0
- package/src/cache.ts +42 -0
- package/src/crypto.ts +30 -0
- package/src/exceptions.ts +77 -0
- package/src/fund.ts +37 -0
- package/src/fx.ts +26 -0
- package/src/index-class.ts +39 -0
- package/src/index.ts +38 -0
- package/src/inflation.ts +31 -0
- package/src/market.ts +7 -0
- package/src/multi.ts +46 -0
- package/src/providers/base.ts +35 -0
- package/src/providers/btcturk.ts +100 -0
- package/src/providers/dovizcom.ts +98 -0
- package/src/providers/kap.ts +98 -0
- package/src/providers/paratic.ts +95 -0
- package/src/providers/tcmb.ts +96 -0
- package/src/providers/tefas.ts +85 -0
- package/src/ticker.ts +30 -0
- package/src/viop.ts +35 -0
- package/test/demo.ts +99 -0
- package/tsconfig.json +34 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { BaseProvider, ProviderOptions } from './base.js';
|
|
2
|
+
export interface InflationLatest {
|
|
3
|
+
date: string;
|
|
4
|
+
yearMonth: string;
|
|
5
|
+
yearlyInflation: number;
|
|
6
|
+
monthlyInflation: number;
|
|
7
|
+
type: string;
|
|
8
|
+
}
|
|
9
|
+
export interface InflationData {
|
|
10
|
+
date: Date;
|
|
11
|
+
yearMonth: string;
|
|
12
|
+
yearlyInflation: number;
|
|
13
|
+
monthlyInflation: number;
|
|
14
|
+
}
|
|
15
|
+
export interface InflationCalculation {
|
|
16
|
+
startDate: string;
|
|
17
|
+
endDate: string;
|
|
18
|
+
initialValue: number;
|
|
19
|
+
finalValue: number;
|
|
20
|
+
totalYears: number;
|
|
21
|
+
totalMonths: number;
|
|
22
|
+
totalChange: number;
|
|
23
|
+
avgYearlyInflation: number;
|
|
24
|
+
startCpi: number;
|
|
25
|
+
endCpi: number;
|
|
26
|
+
}
|
|
27
|
+
export interface InflationDataOptions {
|
|
28
|
+
start?: string;
|
|
29
|
+
end?: string;
|
|
30
|
+
limit?: number;
|
|
31
|
+
}
|
|
32
|
+
export declare class TcmbProvider extends BaseProvider {
|
|
33
|
+
private static readonly BASE_URL;
|
|
34
|
+
private static readonly CALC_API_URL;
|
|
35
|
+
private static readonly INFLATION_PATHS;
|
|
36
|
+
constructor(options?: ProviderOptions);
|
|
37
|
+
getLatest(inflationType?: string): Promise<InflationLatest>;
|
|
38
|
+
getData(inflationType: string, options?: InflationDataOptions): Promise<InflationData[]>;
|
|
39
|
+
calculateInflation(options: {
|
|
40
|
+
startYear: number;
|
|
41
|
+
startMonth: number;
|
|
42
|
+
endYear: number;
|
|
43
|
+
endMonth: number;
|
|
44
|
+
basketValue: number;
|
|
45
|
+
}): Promise<InflationCalculation>;
|
|
46
|
+
private parseInflationTable;
|
|
47
|
+
}
|
|
48
|
+
export declare function getTcmbProvider(): TcmbProvider;
|
|
49
|
+
//# sourceMappingURL=tcmb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcmb.d.ts","sourceRoot":"","sources":["../../src/providers/tcmb.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI1D,MAAM,WAAW,eAAe;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AACtI,MAAM,WAAW,aAAa;IAAG,IAAI,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;CAAE;AACpH,MAAM,WAAW,oBAAoB;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;CAAE;AACnP,MAAM,WAAW,oBAAoB;IAAG,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CAAE;AAIvF,qBAAa,YAAa,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAC7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAwD;IAC5F,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA+M;gBAE1O,OAAO,CAAC,EAAE,eAAe;IAE/B,SAAS,CAAC,aAAa,GAAE,MAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAOnE,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAuB5F,kBAAkB,CAAC,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgBpK,OAAO,CAAC,mBAAmB;CAwB9B;AAGD,wBAAgB,eAAe,IAAI,YAAY,CAAmE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TCMB provider for Turkish inflation data.
|
|
3
|
+
*/
|
|
4
|
+
import * as cheerio from 'cheerio';
|
|
5
|
+
import { BaseProvider } from './base.js';
|
|
6
|
+
import { TTL } from '../cache.js';
|
|
7
|
+
import { APIError, DataNotAvailableError } from '../exceptions.js';
|
|
8
|
+
export class TcmbProvider extends BaseProvider {
|
|
9
|
+
static BASE_URL = 'https://www.tcmb.gov.tr';
|
|
10
|
+
static CALC_API_URL = 'https://appg.tcmb.gov.tr/KIMENFH/enflasyon/hesapla';
|
|
11
|
+
static INFLATION_PATHS = { tufe: '/wps/wcm/connect/tr/tcmb+tr/main+menu/istatistikler/enflasyon+verileri', ufe: '/wps/wcm/connect/TR/TCMB+TR/Main+Menu/Istatistikler/Enflasyon+Verileri/Uretici+Fiyatlari' };
|
|
12
|
+
constructor(options) { super(options); }
|
|
13
|
+
async getLatest(inflationType = 'tufe') {
|
|
14
|
+
const data = await this.getData(inflationType, { limit: 1 });
|
|
15
|
+
if (data.length === 0)
|
|
16
|
+
throw new DataNotAvailableError('No inflation data available');
|
|
17
|
+
const latest = data[0];
|
|
18
|
+
return { date: latest.date.toISOString().split('T')[0], yearMonth: latest.yearMonth, yearlyInflation: latest.yearlyInflation, monthlyInflation: latest.monthlyInflation, type: inflationType.toUpperCase() };
|
|
19
|
+
}
|
|
20
|
+
async getData(inflationType, options = {}) {
|
|
21
|
+
const { start, end, limit } = options;
|
|
22
|
+
const type = inflationType.toLowerCase();
|
|
23
|
+
if (!TcmbProvider.INFLATION_PATHS[type])
|
|
24
|
+
throw new Error(`Invalid type: ${type}. Use 'tufe' or 'ufe'`);
|
|
25
|
+
const cacheKey = `tcmb:data:${type}`;
|
|
26
|
+
let cached = this.cacheGet(cacheKey);
|
|
27
|
+
if (!cached) {
|
|
28
|
+
try {
|
|
29
|
+
const response = await this.get(TcmbProvider.BASE_URL + TcmbProvider.INFLATION_PATHS[type], { responseType: 'text', headers: { 'Accept': 'text/html', 'Accept-Language': 'tr-TR,tr;q=0.9' } });
|
|
30
|
+
cached = this.parseInflationTable(response.data);
|
|
31
|
+
this.cacheSet(cacheKey, cached, TTL.FX_RATES);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
throw new APIError(`Failed to fetch inflation data: ${error}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (!cached?.length)
|
|
38
|
+
throw new DataNotAvailableError(`No data available for ${type}`);
|
|
39
|
+
let result = [...cached];
|
|
40
|
+
if (start)
|
|
41
|
+
result = result.filter(d => d.date >= new Date(start));
|
|
42
|
+
if (end)
|
|
43
|
+
result = result.filter(d => d.date <= new Date(end));
|
|
44
|
+
if (limit && limit > 0)
|
|
45
|
+
result = result.slice(0, limit);
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
async calculateInflation(options) {
|
|
49
|
+
const { startYear, startMonth, endYear, endMonth, basketValue } = options;
|
|
50
|
+
const cacheKey = `tcmb:calc:${startYear}-${startMonth}:${endYear}-${endMonth}:${basketValue}`;
|
|
51
|
+
const cached = this.cacheGet(cacheKey);
|
|
52
|
+
if (cached)
|
|
53
|
+
return cached;
|
|
54
|
+
try {
|
|
55
|
+
const response = await this.post(TcmbProvider.CALC_API_URL, { baslangicYil: String(startYear), baslangicAy: String(startMonth), bitisYil: String(endYear), bitisAy: String(endMonth), malSepeti: String(basketValue) }, { headers: { 'Accept': '*/*', 'Content-Type': 'application/json', 'Origin': 'https://herkesicin.tcmb.gov.tr', 'Referer': 'https://herkesicin.tcmb.gov.tr/' } });
|
|
56
|
+
const data = response.data;
|
|
57
|
+
const parseFloat = (v) => { const c = String(v || '').replace(/,/g, ''); const n = Number.parseFloat(c); return isNaN(n) ? 0 : n; };
|
|
58
|
+
const result = { startDate: `${startYear}-${String(startMonth).padStart(2, '0')}`, endDate: `${endYear}-${String(endMonth).padStart(2, '0')}`, initialValue: basketValue, finalValue: parseFloat(data?.yeniSepetDeger ?? ''), totalYears: data?.toplamYil ?? 0, totalMonths: data?.toplamAy ?? 0, totalChange: parseFloat(data?.toplamDegisim ?? ''), avgYearlyInflation: parseFloat(data?.ortalamaYillikEnflasyon ?? ''), startCpi: parseFloat(data?.ilkYilTufe ?? ''), endCpi: parseFloat(data?.sonYilTufe ?? '') };
|
|
59
|
+
this.cacheSet(cacheKey, result, TTL.INFLATION_DATA);
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
throw new APIError(`Failed to calculate inflation: ${error}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
parseInflationTable(html) {
|
|
67
|
+
const $ = cheerio.load(html);
|
|
68
|
+
const inflationData = [];
|
|
69
|
+
const tables = $('table').toArray();
|
|
70
|
+
for (const table of tables) {
|
|
71
|
+
const headerText = $(table).find('tr').first().text().toLowerCase();
|
|
72
|
+
if (!headerText.includes('tüfe') && !headerText.includes('üfe') && !headerText.includes('enflasyon') && !headerText.includes('yıllık'))
|
|
73
|
+
continue;
|
|
74
|
+
$(table).find('tr').slice(1).each((_, row) => {
|
|
75
|
+
const cells = $(row).find('td, th').map((_, c) => $(c).text().trim()).get();
|
|
76
|
+
if (cells.length < 3 || !cells[0])
|
|
77
|
+
return;
|
|
78
|
+
const [dateStr, yearlyStr, monthlyStr] = cells.length >= 5 ? [cells[0], cells[2], cells[4] || ''] : [cells[0], cells[1], cells[2]];
|
|
79
|
+
const match = dateStr.replace(/[.,]/g, '').match(/(\d{1,2})-(\d{4})/);
|
|
80
|
+
if (!match)
|
|
81
|
+
return;
|
|
82
|
+
const [, month, year] = match;
|
|
83
|
+
const date = new Date(parseInt(year), parseInt(month) - 1, 1);
|
|
84
|
+
const yearly = parseFloat(yearlyStr.replace('%', '').replace(',', '.').replace(/[^\d.-]/g, ''));
|
|
85
|
+
const monthly = parseFloat(monthlyStr.replace('%', '').replace(',', '.').replace(/[^\d.-]/g, '')) || 0;
|
|
86
|
+
if (!isNaN(yearly))
|
|
87
|
+
inflationData.push({ date, yearMonth: dateStr, yearlyInflation: yearly, monthlyInflation: monthly });
|
|
88
|
+
});
|
|
89
|
+
if (inflationData.length > 0)
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
inflationData.sort((a, b) => b.date.getTime() - a.date.getTime());
|
|
93
|
+
return inflationData;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
let provider = null;
|
|
97
|
+
export function getTcmbProvider() { if (!provider)
|
|
98
|
+
provider = new TcmbProvider(); return provider; }
|
|
99
|
+
//# sourceMappingURL=tcmb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcmb.js","sourceRoot":"","sources":["../../src/providers/tcmb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { BaseProvider, ProviderOptions } from './base.js';
|
|
2
|
+
export interface FundInfo {
|
|
3
|
+
fundCode: string;
|
|
4
|
+
name: string;
|
|
5
|
+
date: string;
|
|
6
|
+
price: number;
|
|
7
|
+
fundSize: number;
|
|
8
|
+
investorCount: number;
|
|
9
|
+
founder?: string;
|
|
10
|
+
manager?: string;
|
|
11
|
+
fundType?: string;
|
|
12
|
+
category?: string;
|
|
13
|
+
riskValue?: number;
|
|
14
|
+
dailyReturn?: number;
|
|
15
|
+
return1m?: number;
|
|
16
|
+
return3m?: number;
|
|
17
|
+
return6m?: number;
|
|
18
|
+
returnYtd?: number;
|
|
19
|
+
return1y?: number;
|
|
20
|
+
return3y?: number;
|
|
21
|
+
return5y?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface FundHistoryData {
|
|
24
|
+
date: Date;
|
|
25
|
+
price: number;
|
|
26
|
+
fundSize: number;
|
|
27
|
+
investors: number;
|
|
28
|
+
}
|
|
29
|
+
export interface HistoryOptions {
|
|
30
|
+
period?: string;
|
|
31
|
+
start?: Date;
|
|
32
|
+
end?: Date;
|
|
33
|
+
}
|
|
34
|
+
export interface SearchResult {
|
|
35
|
+
fundCode: string;
|
|
36
|
+
name: string;
|
|
37
|
+
fundType?: string;
|
|
38
|
+
return1y?: number;
|
|
39
|
+
}
|
|
40
|
+
export declare class TefasProvider extends BaseProvider {
|
|
41
|
+
private static readonly BASE_URL;
|
|
42
|
+
private static readonly PERIOD_DAYS;
|
|
43
|
+
private unsafeClient;
|
|
44
|
+
constructor(options?: ProviderOptions);
|
|
45
|
+
private formatDate;
|
|
46
|
+
getFundDetail(fundCode: string): Promise<FundInfo>;
|
|
47
|
+
getHistory(fundCode: string, options?: HistoryOptions): Promise<FundHistoryData[]>;
|
|
48
|
+
search(query: string, limit?: number): Promise<SearchResult[]>;
|
|
49
|
+
}
|
|
50
|
+
export declare function getTefasProvider(): TefasProvider;
|
|
51
|
+
//# sourceMappingURL=tefas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tefas.d.ts","sourceRoot":"","sources":["../../src/providers/tefas.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI1D,MAAM,WAAW,QAAQ;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAAE;AAC7X,MAAM,WAAW,eAAe;IAAG,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;CAAE;AACpG,MAAM,WAAW,cAAc;IAAG,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CAAE;AAC9E,MAAM,WAAW,YAAY;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAAE;AAMvG,qBAAa,aAAc,SAAQ,YAAY;IAC3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IACrE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAA6F;IAChI,OAAO,CAAC,YAAY,CAAgB;gBAExB,OAAO,CAAC,EAAE,eAAe;IAKrC,OAAO,CAAC,UAAU;IAEZ,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiBlD,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAqBtF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAa3E;AAGD,wBAAgB,gBAAgB,IAAI,aAAa,CAAoE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TEFAS provider for mutual fund data.
|
|
3
|
+
*/
|
|
4
|
+
import axios from 'axios';
|
|
5
|
+
import https from 'https';
|
|
6
|
+
import { BaseProvider } from './base.js';
|
|
7
|
+
import { TTL } from '../cache.js';
|
|
8
|
+
import { APIError, DataNotAvailableError } from '../exceptions.js';
|
|
9
|
+
export class TefasProvider extends BaseProvider {
|
|
10
|
+
static BASE_URL = 'https://www.tefas.gov.tr/api/DB';
|
|
11
|
+
static PERIOD_DAYS = { '1d': 1, '5d': 5, '1mo': 30, '3mo': 90, '6mo': 180, '1y': 365 };
|
|
12
|
+
unsafeClient;
|
|
13
|
+
constructor(options) {
|
|
14
|
+
super(options);
|
|
15
|
+
this.unsafeClient = axios.create({ timeout: 30000, httpsAgent: new https.Agent({ rejectUnauthorized: false }), headers: { 'User-Agent': 'Mozilla/5.0' } });
|
|
16
|
+
}
|
|
17
|
+
formatDate(date) { return `${String(date.getDate()).padStart(2, '0')}.${String(date.getMonth() + 1).padStart(2, '0')}.${date.getFullYear()}`; }
|
|
18
|
+
async getFundDetail(fundCode) {
|
|
19
|
+
fundCode = fundCode.toUpperCase();
|
|
20
|
+
const cacheKey = `tefas:detail:${fundCode}`;
|
|
21
|
+
const cached = this.cacheGet(cacheKey);
|
|
22
|
+
if (cached)
|
|
23
|
+
return cached;
|
|
24
|
+
try {
|
|
25
|
+
const response = await this.unsafeClient.post(`${TefasProvider.BASE_URL}/GetAllFundAnalyzeData`, new URLSearchParams({ dil: 'TR', fonkod: fundCode }).toString(), { headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' } });
|
|
26
|
+
const data = response.data;
|
|
27
|
+
if (!data?.fundInfo?.length)
|
|
28
|
+
throw new DataNotAvailableError(`No data for fund: ${fundCode}`);
|
|
29
|
+
const fi = data.fundInfo[0];
|
|
30
|
+
const fr = data.fundReturn?.[0] ?? {};
|
|
31
|
+
const result = { fundCode, name: fi.FONUNVAN ?? '', date: fi.TARIH ?? '', price: Number(fi.SONFIYAT) || 0, fundSize: Number(fi.PORTBUYUKLUK) || 0, investorCount: Number(fi.YATIRIMCISAYI) || 0, founder: fi.KURUCU, manager: fi.YONETICI, fundType: fi.FONTUR, category: fi.FONKATEGORI, riskValue: fi.RISKDEGERI, dailyReturn: fi.GUNLUKGETIRI, return1m: fr.GETIRI1A, return3m: fr.GETIRI3A, return6m: fr.GETIRI6A, returnYtd: fr.GETIRIYB, return1y: fr.GETIRI1Y, return3y: fr.GETIRI3Y, return5y: fr.GETIRI5Y };
|
|
32
|
+
this.cacheSet(cacheKey, result, TTL.FUND_DATA);
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (error instanceof DataNotAvailableError)
|
|
37
|
+
throw error;
|
|
38
|
+
throw new APIError(`Failed to fetch fund detail for ${fundCode}: ${error}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async getHistory(fundCode, options = {}) {
|
|
42
|
+
fundCode = fundCode.toUpperCase();
|
|
43
|
+
const { period = '1mo', start, end } = options;
|
|
44
|
+
const endDt = end ?? new Date();
|
|
45
|
+
const startDt = start ?? new Date(endDt.getTime() - (TefasProvider.PERIOD_DAYS[period] ?? 30) * 24 * 60 * 60 * 1000);
|
|
46
|
+
const cacheKey = `tefas:history:${fundCode}:${startDt.toISOString()}:${endDt.toISOString()}`;
|
|
47
|
+
const cached = this.cacheGet(cacheKey);
|
|
48
|
+
if (cached)
|
|
49
|
+
return cached;
|
|
50
|
+
try {
|
|
51
|
+
const formData = new URLSearchParams({ fontip: 'YAT', sfontur: '', fonkod: fundCode, fongrup: '', bastarih: this.formatDate(startDt), bittarih: this.formatDate(endDt), fonturkod: '', fonunvantip: '', kurucukod: '' });
|
|
52
|
+
const response = await this.unsafeClient.post(`${TefasProvider.BASE_URL}/BindHistoryInfo`, formData.toString(), { headers: { 'Accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Origin': 'https://www.tefas.gov.tr', 'X-Requested-With': 'XMLHttpRequest' } });
|
|
53
|
+
const data = response.data?.data;
|
|
54
|
+
if (!data?.length)
|
|
55
|
+
throw new DataNotAvailableError(`No history for fund: ${fundCode}`);
|
|
56
|
+
const records = data.filter(i => i.TARIH && i.TARIH > 0).map(i => ({ date: new Date(i.TARIH), price: Number(i.FIYAT) || 0, fundSize: Number(i.PORTFOYBUYUKLUK) || 0, investors: Number(i.KISISAYISI) || 0 }));
|
|
57
|
+
records.sort((a, b) => a.date.getTime() - b.date.getTime());
|
|
58
|
+
this.cacheSet(cacheKey, records, TTL.FUND_DATA);
|
|
59
|
+
return records;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error instanceof DataNotAvailableError)
|
|
63
|
+
throw error;
|
|
64
|
+
throw new APIError(`Failed to fetch history for ${fundCode}: ${error}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async search(query, limit = 20) {
|
|
68
|
+
const cacheKey = `tefas:search:${query}:${limit}`;
|
|
69
|
+
const cached = this.cacheGet(cacheKey);
|
|
70
|
+
if (cached)
|
|
71
|
+
return cached;
|
|
72
|
+
try {
|
|
73
|
+
const formData = new URLSearchParams({ calismatipi: '2', fontip: 'YAT', sfontur: 'Tümü', kurucukod: '', fongrup: '', bastarih: 'Başlangıç', bittarih: 'Bitiş', fonturkod: '', fonunvantip: '', strperiod: '1,1,1,1,1,1,1', islemdurum: '1' });
|
|
74
|
+
const response = await this.unsafeClient.post(`${TefasProvider.BASE_URL}/BindComparisonFundReturns`, formData.toString(), { headers: { 'Accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'X-Requested-With': 'XMLHttpRequest' } });
|
|
75
|
+
const allFunds = response.data?.data ?? [];
|
|
76
|
+
const queryLower = query.toLowerCase();
|
|
77
|
+
const matching = allFunds.filter(f => (f.FONKODU ?? '').toLowerCase().includes(queryLower) || (f.FONUNVAN ?? '').toLowerCase().includes(queryLower)).slice(0, limit).map(f => ({ fundCode: f.FONKODU ?? '', name: f.FONUNVAN ?? '', fundType: f.FONTURACIKLAMA, return1y: f.GETIRI1Y }));
|
|
78
|
+
this.cacheSet(cacheKey, matching, TTL.FUND_DATA);
|
|
79
|
+
return matching;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
let provider = null;
|
|
87
|
+
export function getTefasProvider() { if (!provider)
|
|
88
|
+
provider = new TefasProvider(); return provider; }
|
|
89
|
+
//# sourceMappingURL=tefas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tefas.js","sourceRoot":"","sources":["../../src/providers/tefas.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAmB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAWnE,MAAM,OAAO,aAAc,SAAQ,YAAY;IACnC,MAAM,CAAU,QAAQ,GAAG,iCAAiC,CAAC;IAC7D,MAAM,CAAU,WAAW,GAA2B,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACxH,YAAY,CAAgB;IAEpC,YAAY,OAAyB;QACjC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;IAC/J,CAAC;IAEO,UAAU,CAAC,IAAU,IAAY,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IAErK,KAAK,CAAC,aAAa,CAAC,QAAgB;QAChC,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,gBAAgB,QAAQ,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAW,QAAQ,CAAC,CAAC;QACjD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAkB,GAAG,aAAa,CAAC,QAAQ,wBAAwB,EAAE,IAAI,eAAe,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kDAAkD,EAAE,EAAE,CAAC,CAAC;YACxQ,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM;gBAAE,MAAM,IAAI,qBAAqB,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;YAC9F,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnE,MAAM,MAAM,GAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC/f,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/C,OAAO,MAAM,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,IAAI,KAAK,YAAY,qBAAqB;gBAAE,MAAM,KAAK,CAAC;YAAC,MAAM,IAAI,QAAQ,CAAC,mCAAmC,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;QAAC,CAAC;IAC7J,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,UAA0B,EAAE;QAC3D,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;QAC/C,MAAM,KAAK,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACrH,MAAM,QAAQ,GAAG,iBAAiB,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7F,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAoB,QAAQ,CAAC,CAAC;QAC1D,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;YACzN,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAqB,GAAG,aAAa,CAAC,QAAQ,kBAAkB,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,kDAAkD,EAAE,QAAQ,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;YACnU,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;YACjC,IAAI,CAAC,IAAI,EAAE,MAAM;gBAAE,MAAM,IAAI,qBAAqB,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YACvF,MAAM,OAAO,GAAsB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAM,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAClO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YAChD,OAAO,OAAO,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,IAAI,KAAK,YAAY,qBAAqB;gBAAE,MAAM,KAAK,CAAC;YAAC,MAAM,IAAI,QAAQ,CAAC,+BAA+B,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;QAAC,CAAC;IACzJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,QAAgB,EAAE;QAC1C,MAAM,QAAQ,GAAG,gBAAgB,KAAK,IAAI,KAAK,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAiB,QAAQ,CAAC,CAAC;QACvD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAC1B,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9O,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAwB,GAAG,aAAa,CAAC,QAAQ,4BAA4B,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,kDAAkD,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;YAC1S,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;YAAC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YACnF,MAAM,QAAQ,GAAmB,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACzS,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YACjD,OAAO,QAAQ,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,EAAE,CAAC;QAAC,CAAC;IAC1B,CAAC;;AAGL,IAAI,QAAQ,GAAyB,IAAI,CAAC;AAC1C,MAAM,UAAU,gBAAgB,KAAoB,IAAI,CAAC,QAAQ;IAAE,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VİOP provider for Turkish derivatives market data.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseProvider, ProviderOptions } from './base.js';
|
|
5
|
+
export interface ContractData {
|
|
6
|
+
code: string;
|
|
7
|
+
contract: string;
|
|
8
|
+
price: number;
|
|
9
|
+
change: number;
|
|
10
|
+
volumeTl: number;
|
|
11
|
+
volumeQty: number;
|
|
12
|
+
category: string;
|
|
13
|
+
}
|
|
14
|
+
export type ContractCategory = 'all' | 'stock' | 'index' | 'currency' | 'commodity';
|
|
15
|
+
/**
|
|
16
|
+
* Provider for VİOP (derivatives market) data from İş Yatırım.
|
|
17
|
+
*/
|
|
18
|
+
export declare class ViopProvider extends BaseProvider {
|
|
19
|
+
private static readonly BASE_URL;
|
|
20
|
+
constructor(options?: ProviderOptions);
|
|
21
|
+
/**
|
|
22
|
+
* Get futures contracts.
|
|
23
|
+
*/
|
|
24
|
+
getFutures(category?: ContractCategory): Promise<ContractData[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Get options contracts.
|
|
27
|
+
*/
|
|
28
|
+
getOptions(category?: 'all' | 'stock' | 'index'): Promise<ContractData[]>;
|
|
29
|
+
private parseNumber;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get singleton provider instance.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getViopProvider(): ViopProvider;
|
|
35
|
+
//# sourceMappingURL=viop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viop.d.ts","sourceRoot":"","sources":["../../src/providers/viop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI1D,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;AAEpF;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuE;gBAE3F,OAAO,CAAC,EAAE,eAAe;IAIrC;;OAEG;IACG,UAAU,CAAC,QAAQ,GAAE,gBAAwB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA0D7E;;OAEG;IACG,UAAU,CAAC,QAAQ,GAAE,KAAK,GAAG,OAAO,GAAG,OAAe,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAsDtF,OAAO,CAAC,WAAW;CAQtB;AAKD;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VİOP provider for Turkish derivatives market data.
|
|
3
|
+
*/
|
|
4
|
+
import * as cheerio from 'cheerio';
|
|
5
|
+
import { BaseProvider } from './base.js';
|
|
6
|
+
import { TTL } from '../cache.js';
|
|
7
|
+
import { APIError } from '../exceptions.js';
|
|
8
|
+
/**
|
|
9
|
+
* Provider for VİOP (derivatives market) data from İş Yatırım.
|
|
10
|
+
*/
|
|
11
|
+
export class ViopProvider extends BaseProvider {
|
|
12
|
+
static BASE_URL = 'https://www.isyatirim.com.tr/tr-tr/analiz/Sayfalar/viop-akis.aspx';
|
|
13
|
+
constructor(options) {
|
|
14
|
+
super(options);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get futures contracts.
|
|
18
|
+
*/
|
|
19
|
+
async getFutures(category = 'all') {
|
|
20
|
+
const cacheKey = `viop:futures:${category}`;
|
|
21
|
+
const cached = this.cacheGet(cacheKey);
|
|
22
|
+
if (cached) {
|
|
23
|
+
return cached;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const response = await this.get(ViopProvider.BASE_URL, {
|
|
27
|
+
responseType: 'text',
|
|
28
|
+
});
|
|
29
|
+
const html = response.data;
|
|
30
|
+
const $ = cheerio.load(html);
|
|
31
|
+
const contracts = [];
|
|
32
|
+
// Parse futures table
|
|
33
|
+
$('table.dataTable tbody tr').each((_, row) => {
|
|
34
|
+
const cells = $(row).find('td');
|
|
35
|
+
if (cells.length < 6)
|
|
36
|
+
return;
|
|
37
|
+
const code = $(cells[0]).text().trim();
|
|
38
|
+
const contract = $(cells[1]).text().trim();
|
|
39
|
+
// Determine category from code
|
|
40
|
+
let contractCategory = 'stock';
|
|
41
|
+
if (code.includes('XU') || code.includes('XLBNK')) {
|
|
42
|
+
contractCategory = 'index';
|
|
43
|
+
}
|
|
44
|
+
else if (code.includes('USD') || code.includes('EUR')) {
|
|
45
|
+
contractCategory = 'currency';
|
|
46
|
+
}
|
|
47
|
+
else if (code.includes('GAU') || code.includes('XAU')) {
|
|
48
|
+
contractCategory = 'commodity';
|
|
49
|
+
}
|
|
50
|
+
// Filter by category
|
|
51
|
+
if (category !== 'all' && contractCategory !== category) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
contracts.push({
|
|
55
|
+
code,
|
|
56
|
+
contract,
|
|
57
|
+
price: this.parseNumber($(cells[2]).text()),
|
|
58
|
+
change: this.parseNumber($(cells[3]).text()),
|
|
59
|
+
volumeTl: this.parseNumber($(cells[4]).text()),
|
|
60
|
+
volumeQty: this.parseNumber($(cells[5]).text()),
|
|
61
|
+
category: contractCategory,
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
this.cacheSet(cacheKey, contracts, TTL.VIOP);
|
|
65
|
+
return contracts;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw new APIError(`Failed to fetch futures: ${error}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get options contracts.
|
|
73
|
+
*/
|
|
74
|
+
async getOptions(category = 'all') {
|
|
75
|
+
const cacheKey = `viop:options:${category}`;
|
|
76
|
+
const cached = this.cacheGet(cacheKey);
|
|
77
|
+
if (cached) {
|
|
78
|
+
return cached;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const response = await this.get(ViopProvider.BASE_URL, {
|
|
82
|
+
responseType: 'text',
|
|
83
|
+
});
|
|
84
|
+
const html = response.data;
|
|
85
|
+
const $ = cheerio.load(html);
|
|
86
|
+
const contracts = [];
|
|
87
|
+
// Parse options table (similar structure)
|
|
88
|
+
$('table.optionsTable tbody tr').each((_, row) => {
|
|
89
|
+
const cells = $(row).find('td');
|
|
90
|
+
if (cells.length < 6)
|
|
91
|
+
return;
|
|
92
|
+
const code = $(cells[0]).text().trim();
|
|
93
|
+
const contract = $(cells[1]).text().trim();
|
|
94
|
+
// Determine category from code
|
|
95
|
+
let contractCategory = 'stock';
|
|
96
|
+
if (code.includes('XU') || code.includes('XLBNK')) {
|
|
97
|
+
contractCategory = 'index';
|
|
98
|
+
}
|
|
99
|
+
// Filter by category
|
|
100
|
+
if (category !== 'all' && contractCategory !== category) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
contracts.push({
|
|
104
|
+
code,
|
|
105
|
+
contract,
|
|
106
|
+
price: this.parseNumber($(cells[2]).text()),
|
|
107
|
+
change: this.parseNumber($(cells[3]).text()),
|
|
108
|
+
volumeTl: this.parseNumber($(cells[4]).text()),
|
|
109
|
+
volumeQty: this.parseNumber($(cells[5]).text()),
|
|
110
|
+
category: contractCategory,
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
this.cacheSet(cacheKey, contracts, TTL.VIOP);
|
|
114
|
+
return contracts;
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
throw new APIError(`Failed to fetch options: ${error}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
parseNumber(text) {
|
|
121
|
+
// Remove thousands separator and convert decimal separator
|
|
122
|
+
const cleaned = text
|
|
123
|
+
.replace(/\./g, '')
|
|
124
|
+
.replace(',', '.')
|
|
125
|
+
.replace(/[^\d.-]/g, '');
|
|
126
|
+
return parseFloat(cleaned) || 0;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Singleton instance
|
|
130
|
+
let provider = null;
|
|
131
|
+
/**
|
|
132
|
+
* Get singleton provider instance.
|
|
133
|
+
*/
|
|
134
|
+
export function getViopProvider() {
|
|
135
|
+
if (!provider) {
|
|
136
|
+
provider = new ViopProvider();
|
|
137
|
+
}
|
|
138
|
+
return provider;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=viop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viop.js","sourceRoot":"","sources":["../../src/providers/viop.ts"],"names":[],"mappings":"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"}
|
package/dist/ticker.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ticker class for stock data.
|
|
3
|
+
*/
|
|
4
|
+
import { QuoteData, OHLCVData, HistoryOptions } from './providers/paratic.js';
|
|
5
|
+
export interface TickerInfo extends QuoteData {
|
|
6
|
+
type: 'stock';
|
|
7
|
+
}
|
|
8
|
+
export declare class Ticker {
|
|
9
|
+
private readonly _symbol;
|
|
10
|
+
private _infoCache;
|
|
11
|
+
constructor(symbol: string);
|
|
12
|
+
get symbol(): string;
|
|
13
|
+
getInfo(): Promise<TickerInfo>;
|
|
14
|
+
getFastInfo(): Promise<TickerInfo>;
|
|
15
|
+
getHistory(options?: HistoryOptions): Promise<OHLCVData[]>;
|
|
16
|
+
toString(): string;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=ticker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticker.d.ts","sourceRoot":"","sources":["../src/ticker.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAsB,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAElG,MAAM,WAAW,UAAW,SAAQ,SAAS;IAAG,IAAI,EAAE,OAAO,CAAC;CAAE;AAEhE,qBAAa,MAAM;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,UAAU,CAA2B;gBAEjC,MAAM,EAAE,MAAM;IAC1B,IAAI,MAAM,IAAI,MAAM,CAAyB;IAEvC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IAQ9B,WAAW,IAAI,OAAO,CAAC,UAAU,CAAC;IAElC,UAAU,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAIpE,QAAQ,IAAI,MAAM;CACrB"}
|
package/dist/ticker.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ticker class for stock data.
|
|
3
|
+
*/
|
|
4
|
+
import { getParaticProvider } from './providers/paratic.js';
|
|
5
|
+
export class Ticker {
|
|
6
|
+
_symbol;
|
|
7
|
+
_infoCache = null;
|
|
8
|
+
constructor(symbol) { this._symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', ''); }
|
|
9
|
+
get symbol() { return this._symbol; }
|
|
10
|
+
async getInfo() {
|
|
11
|
+
if (!this._infoCache) {
|
|
12
|
+
const quote = await getParaticProvider().getQuote(this._symbol);
|
|
13
|
+
this._infoCache = { ...quote, type: 'stock' };
|
|
14
|
+
}
|
|
15
|
+
return this._infoCache;
|
|
16
|
+
}
|
|
17
|
+
async getFastInfo() { return this.getInfo(); }
|
|
18
|
+
async getHistory(options = {}) {
|
|
19
|
+
return getParaticProvider().getHistory(this._symbol, options);
|
|
20
|
+
}
|
|
21
|
+
toString() { return `Ticker('${this._symbol}')`; }
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=ticker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticker.js","sourceRoot":"","sources":["../src/ticker.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,kBAAkB,EAAwC,MAAM,wBAAwB,CAAC;AAIlG,MAAM,OAAO,MAAM;IACE,OAAO,CAAS;IACzB,UAAU,GAAsB,IAAI,CAAC;IAE7C,YAAY,MAAc,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACzG,IAAI,MAAM,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAE7C,KAAK,CAAC,OAAO;QACT,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChE,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,WAAW,KAA0B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAEnE,KAAK,CAAC,UAAU,CAAC,UAA0B,EAAE;QACzC,OAAO,kBAAkB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,QAAQ,KAAa,OAAO,WAAW,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;CAC7D"}
|
package/dist/viop.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VIOP class for Turkish derivatives market data.
|
|
3
|
+
*/
|
|
4
|
+
import { ContractData } from './providers/kap.js';
|
|
5
|
+
export declare class VIOP {
|
|
6
|
+
private _futuresCache;
|
|
7
|
+
private _optionsCache;
|
|
8
|
+
getFutures(): Promise<ContractData[]>;
|
|
9
|
+
getStockFutures(): Promise<ContractData[]>;
|
|
10
|
+
getIndexFutures(): Promise<ContractData[]>;
|
|
11
|
+
getCurrencyFutures(): Promise<ContractData[]>;
|
|
12
|
+
getCommodityFutures(): Promise<ContractData[]>;
|
|
13
|
+
getOptions(): Promise<ContractData[]>;
|
|
14
|
+
getStockOptions(): Promise<ContractData[]>;
|
|
15
|
+
getIndexOptions(): Promise<ContractData[]>;
|
|
16
|
+
getBySymbol(symbol: string): Promise<ContractData[]>;
|
|
17
|
+
toString(): string;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=viop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viop.d.ts","sourceRoot":"","sources":["../src/viop.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAmB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEnE,qBAAa,IAAI;IACb,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,aAAa,CAA+B;IAE9C,UAAU,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAKrC,eAAe,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAC1C,eAAe,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAC1C,kBAAkB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAC7C,mBAAmB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAE9C,UAAU,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAKrC,eAAe,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAC1C,eAAe,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAE1C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAM1D,QAAQ,IAAI,MAAM;CACrB"}
|
package/dist/viop.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VIOP class for Turkish derivatives market data.
|
|
3
|
+
*/
|
|
4
|
+
import { getViopProvider } from './providers/kap.js';
|
|
5
|
+
export class VIOP {
|
|
6
|
+
_futuresCache = null;
|
|
7
|
+
_optionsCache = null;
|
|
8
|
+
async getFutures() {
|
|
9
|
+
if (!this._futuresCache)
|
|
10
|
+
this._futuresCache = await getViopProvider().getFutures('all');
|
|
11
|
+
return this._futuresCache;
|
|
12
|
+
}
|
|
13
|
+
async getStockFutures() { return getViopProvider().getFutures('stock'); }
|
|
14
|
+
async getIndexFutures() { return getViopProvider().getFutures('index'); }
|
|
15
|
+
async getCurrencyFutures() { return getViopProvider().getFutures('currency'); }
|
|
16
|
+
async getCommodityFutures() { return getViopProvider().getFutures('commodity'); }
|
|
17
|
+
async getOptions() {
|
|
18
|
+
if (!this._optionsCache)
|
|
19
|
+
this._optionsCache = await getViopProvider().getOptions('all');
|
|
20
|
+
return this._optionsCache;
|
|
21
|
+
}
|
|
22
|
+
async getStockOptions() { return getViopProvider().getOptions('stock'); }
|
|
23
|
+
async getIndexOptions() { return getViopProvider().getOptions('index'); }
|
|
24
|
+
async getBySymbol(symbol) {
|
|
25
|
+
symbol = symbol.toUpperCase();
|
|
26
|
+
const [futures, options] = await Promise.all([this.getFutures(), this.getOptions()]);
|
|
27
|
+
return [...futures, ...options].filter(i => i.contract.toUpperCase().includes(symbol) || i.code.toUpperCase().includes(symbol));
|
|
28
|
+
}
|
|
29
|
+
toString() { return 'VIOP()'; }
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=viop.js.map
|
package/dist/viop.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viop.js","sourceRoot":"","sources":["../src/viop.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,eAAe,EAAgB,MAAM,oBAAoB,CAAC;AAEnE,MAAM,OAAO,IAAI;IACL,aAAa,GAA0B,IAAI,CAAC;IAC5C,aAAa,GAA0B,IAAI,CAAC;IAEpD,KAAK,CAAC,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,aAAa,GAAG,MAAM,eAAe,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACxF,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,eAAe,KAA8B,OAAO,eAAe,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClG,KAAK,CAAC,eAAe,KAA8B,OAAO,eAAe,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClG,KAAK,CAAC,kBAAkB,KAA8B,OAAO,eAAe,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACxG,KAAK,CAAC,mBAAmB,KAA8B,OAAO,eAAe,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAE1G,KAAK,CAAC,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,aAAa,GAAG,MAAM,eAAe,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACxF,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,eAAe,KAA8B,OAAO,eAAe,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClG,KAAK,CAAC,eAAe,KAA8B,OAAO,eAAe,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAElG,KAAK,CAAC,WAAW,CAAC,MAAc;QAC5B,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACpI,CAAC;IAED,QAAQ,KAAa,OAAO,QAAQ,CAAC,CAAC,CAAC;CAC1C"}
|