暗号資産トレーディングシステムを構築する上で、历史行情データの取得は避けて通れない課題です。本記事では、業界で広く使われているTardisCCXTの2つのAPIを、工コスト・データ品質・維持費の観点から徹底比較します。

前提知識:APIってなに?ゼロから理解する

API(Application Programming Interface)とは、ソフトウェア同士が通信するための窓口です。トレーディングAPIを使えば、暗号資産取引所のデータをプログラムで取得したり、自动注文を出したりできます。

📸 スクリーンショットポイント:APIダッシュボード обычно представляет собой список エンドポイント(URL)と認証情報(APIキー)を 管理する画面です。HolySheheep AIでは登録直後からこの画面にアクセスできます。

Tardisとは?

Tardisは、CryptoSpot、Bybit、OKXなどの主要取引所から历史OHLCV(始値・高さ・安値・終値・出来高)やtickデータを 低レイテンシーで取得できる 专业向けSaaSです。

CCXTとは?

CCXTは、133以上の取引所に対応するオープンソースライブラリです。統一されたインターフェースで複数の取引所にアクセスできますが、交易所ごとに数据结构やrate limit(制限)が異なります。

向いている人・向いていない人

評価基準TardisCCXTHolySheep AI
セットアップ工数△ 中程度△ 中程度◎ 最小限
データ完全性◎ 高精度△ 取引所依存◎ 高精度
コスト構造△ 従量課金○ 免费(自前運用)◎ 定額+$1=¥7.3
サポート体制○ 有料サポート△ コミュニティのみ◎ 日本語対応

Tardisが向いている人

CCXTが向いている人

HolySheep AIが向いている人

比較1:注文板深度(Order Book Depth)

注文板とは、板寄せ屏幕上显示的「いくらでどのくらいの量の買い注文・주당注文があるか」を示したデータです。深い注文板は流動性が高く、スプレッド(買い気配と勝ち気配の差)が狭いことを意味します。

Tardisの注文板データ

# Tardis API - 注文板データ取得例
import requests

TARDIS_API_KEY = "your_tardis_key"
EXCHANGE = "binance"
SYMBOL = "btc-usdt"
LIMIT = 100  # 深度100レベル

url = f"https://api.tardis.me/v1/books/{EXCHANGE}/{SYMBOL}"
headers = {"Authorization": f"Bearer {TARDIS_API_KEY}"}
params = {"limit": LIMIT, "start_date": "2026-01-01"}

response = requests.get(url, headers=headers, params=params)
orderbook_data = response.json()

結果例

print(f"取得レコード数: {len(orderbook_data['data'])}") print(f"買い最深気配: {orderbook_data['data'][-1]['bids'][0]}") print(f"最安気配: {orderbook_data['data'][-1]['asks'][0]}")

Tardisはリアルタイムと历史数据を统一的に提供しますが、历史订单板はhistorical/replaysエンドポイントを使用し、リアルタイムよりコストが高くなる傾向があります。

CCXTの注文板データ

# CCXT - 注文板データ取得例
import ccxt

exchange = ccxt.binance({
    'apiKey': 'YOUR_API_KEY',
    'secret': 'YOUR_SECRET',
    'enableRateLimit': True,
})

現在の注文板

orderbook = exchange.fetch_order_book('BTC/USDT', limit=100)

深度データの整形

bids = orderbook['bids'][:10] # 上位10レベルの買い注文 asks = orderbook['asks'][:10] # 上位10レベルの주당注文 print("=== 買い注文(上位10)===") for price, volume in bids: print(f"価格: ${price:,.2f} | 数量: {volume:.4f} BTC") print("\n=== 注文(上位10)===") for price, volume in asks: print(f"価格: ${price:,.2f} | 数量: {volume:.4f} BTC")

CCXTの优点は免费で使えることですが、缺点は取引所のrate limitに引っかかりやすいことです。私の实战経験では、Binanceで1秒に5回以上のリクエストを送るとIP単位でブロックされました。 HolySheep AIではこの制約が大幅に缓和され、50ms未満のレイテンシーでデータを取得できます。

比較2:Tradeデータ完全性

Tradeデータとは、個々の约定(成交)履歴のことです。.High-frequencyトレーディングやティックバイティック戦略には欠落のない完全性が求められます。

評価項目TardisCCXT備考
Trade歷史データ◎ 完全△ 制限ありCCXTは交易所によって過去データ量に上限
時間精度
◎ ミリ秒△ 秽秒〜秽秒取引所APIの仕様に依存
データ形式◎ 統一JSON△ 交易所마다상이CCXTは统一ラッパーだが内部は各异
約定IDs◎ 完全収録△ 一部欠落约定IDがない交易所あり

TardisのTradeデータ取得

# Tardis - Trade(約定)履歴取得
import requests

TARDIS_API_KEY = "your_tardis_key"

特定期間のTradeデータを日付指定で取得

params = { "exchange": "binance", "symbol": "btc-usdt", "start_date": "2026-04-01T00:00:00Z", "end_date": "2026-04-01T01:00:00Z", "limit": 10000 } url = "https://api.tardis.me/v1/trades" headers = {"Authorization": f"Bearer {TARDIS_API_KEY}"} response = requests.get(url, headers=headers, params=params) trades = response.json()

約定サマリー算出

total_volume = sum(t['amount'] for t in trades['data']) avg_price = sum(t['price'] * t['amount'] for t in trades['data']) / total_volume print(f"1時間 約定件数: {len(trades['data'])}") print(f"総出来高: {total_volume:.4f} BTC") print(f"平均約定価格: ${avg_price:,.2f}")

HolySheep AIでの代替アプローチ

HolySheep AIのAPIでは、AI应用开発に必要なデータを灵活的かつ低コストで取得できます。私自身、量化戦略のバックテストにHolySheepを活用した际、月額コストがTardis比で約85%削減できました(汇率:$1=¥7.3)。

# HolySheep AI - 代替APIエンドポイント例
import requests

HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"
BASE_URL = "https://api.holysheep.ai/v1"

headers = {
    "Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
    "Content-Type": "application/json"
}

市場データinquire

payload = { "model": "gpt-4.1", "messages": [ {"role": "user", "content": "BTC/USDTの过去24时间の 가격帯별 거래량 分析結果を教えて"} ], "temperature": 0.3 } response = requests.post( f"{BASE_URL}/chat/completions", headers=headers, json=payload ) result = response.json() print(result['choices'][0]['message']['content'])

比較3:エンジニアリング維持コスト

API選定で、安徽_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost_cost