UNPKG

metaapi.cloud-sdk

Version:

SDK for MetaApi, a professional cloud forex API which includes MetaTrader REST API and MetaTrader websocket API. Supports both MetaTrader 5 (MT5) and MetaTrader 4 (MT4). CopyFactory copy trading API included. (https://metaapi.cloud)

163 lines (162 loc) 19.3 kB
'use strict'; function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _async_to_generator(fn) { return function() { var self = this, args = arguments; return new Promise(function(resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } function _define_property(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } import MetaApiClient from '../metaApi.client'; import LoggerManager from '../../logger'; import { NotFoundError } from '../errorHandler'; let ClientApiClient = class ClientApiClient extends MetaApiClient { /** * Type hashing ignored field lists * @typedef {Object} TypeHashingIgnoredFieldLists * @property {String[]} specification specification ignored fields * @property {String[]} position position ignored fields * @property {String[]} order order ignored fields */ /** * Hashing ignored field lists * @typedef {Object} HashingIgnoredFieldLists * @property {TypeHashingIgnoredFieldLists} g1 g1 hashing ignored field lists * @property {TypeHashingIgnoredFieldLists} g2 g2 hashing ignored field lists */ /** * Refreshes hashing ignored field lists * @param {String} region account region * @returns {Promise} promise resolving when the hashing field lists are updated. */ refreshIgnoredFieldLists(region) { var _this = this; return _async_to_generator(function*() { if (_this._ignoredFieldListsCaches[region] && _this._ignoredFieldListsCaches[region].requestPromise) { yield _this._ignoredFieldListsCaches[region].requestPromise; } else if (_this._ignoredFieldListsCaches[region] && Date.now() - _this._ignoredFieldListsCaches[region].lastUpdated < _this._updateInterval) { return; } else { if (!_this._ignoredFieldListsCaches[region]) { _this._ignoredFieldListsCaches[region] = { lastUpdated: 0, data: null, requestPromise: null, updateJob: setInterval(()=>_this._refreshIgnoredFieldListsJob(region), 60000) }; } let resolve, reject; _this._ignoredFieldListsCaches[region].requestPromise = new Promise((res, rej)=>{ resolve = res, reject = rej; }); let isCacheUpdated = false; while(!isCacheUpdated){ try { const host = yield _this._domainClient.getUrl(_this._host, region); const opts = { url: `${host}/hashing-ignored-field-lists`, method: 'GET', json: true, headers: { 'auth-token': _this._token } }; const response = yield _this._httpClient.request(opts, 'getHashingIgnoredFieldLists'); _this._ignoredFieldListsCaches[region] = { lastUpdated: Date.now(), data: response, requestPromise: null }; _this._ignoredFieldListsFreshestCache = response; resolve(response); isCacheUpdated = true; _this._ignoredFieldListsCaches[region].retryIntervalInSeconds = _this._retryIntervalInSeconds; } catch (err) { _this._logger.error('Failed to update hashing ignored field list', err); _this._ignoredFieldListsCaches[region].retryIntervalInSeconds = Math.min(_this._ignoredFieldListsCaches[region].retryIntervalInSeconds * 2, 300); yield new Promise((res)=>setTimeout(res, _this._ignoredFieldListsCaches[region].retryIntervalInSeconds * 1000)); } } } })(); } /** * Retrieves hashing ignored field lists * @param {String} region account region * @returns {HashingIgnoredFieldLists} promise resolving with hashing ignored field lists */ getHashingIgnoredFieldLists(region) { if (region === 'combined') { if (this._ignoredFieldListsFreshestCache) { return this._ignoredFieldListsFreshestCache; } else { throw new NotFoundError('Ignored field lists not found'); } } if (this._ignoredFieldListsCaches[region] && this._ignoredFieldListsCaches[region].data) { return this._ignoredFieldListsCaches[region].data; } else { throw new NotFoundError(`Ignored field lists for region ${region} not found`); } } _refreshIgnoredFieldListsJob(region) { var _this = this; return _async_to_generator(function*() { if (!_this._ignoredFieldListsCaches[region].requestPromise && Date.now() - _this._ignoredFieldListsCaches[region].lastUpdated > _this._updateInterval) { yield _this.refreshIgnoredFieldLists(region); } })(); } /** * Constructs client API client instance * @param {HttpClient} httpClient HTTP client * @param {DomainClient} domainClient domain client */ constructor(httpClient, domainClient){ super(httpClient, domainClient); _define_property(this, "_retryIntervalInSeconds", void 0); _define_property(this, "_updateInterval", void 0); _define_property(this, "_ignoredFieldListsCaches", void 0); _define_property(this, "_ignoredFieldListsFreshestCache", void 0); _define_property(this, "_logger", void 0); this._host = 'https://mt-client-api-v1'; this._retryIntervalInSeconds = 1; this._updateInterval = 60 * 60 * 1000; this._ignoredFieldListsCaches = {}; this._ignoredFieldListsFreshestCache = null; this._logger = LoggerManager.getLogger('ClientApiClient'); } }; /** * metaapi.cloud client API client (see https://metaapi.cloud/docs/client/) */ export { ClientApiClient as default }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBNZXRhQXBpQ2xpZW50IGZyb20gJy4uL21ldGFBcGkuY2xpZW50JztcbmltcG9ydCBMb2dnZXJNYW5hZ2VyLCB7TG9nZ2VyfSBmcm9tICcuLi8uLi9sb2dnZXInO1xuaW1wb3J0IHtOb3RGb3VuZEVycm9yfSBmcm9tICcuLi9lcnJvckhhbmRsZXInO1xuaW1wb3J0IEh0dHBDbGllbnQgZnJvbSAnLi4vaHR0cENsaWVudCc7XG5pbXBvcnQgRG9tYWluQ2xpZW50IGZyb20gJy4uL2RvbWFpbi5jbGllbnQnO1xuXG4vKipcbiAqIG1ldGFhcGkuY2xvdWQgY2xpZW50IEFQSSBjbGllbnQgKHNlZSBodHRwczovL21ldGFhcGkuY2xvdWQvZG9jcy9jbGllbnQvKVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGllbnRBcGlDbGllbnQgZXh0ZW5kcyBNZXRhQXBpQ2xpZW50IHtcbiAgXG4gIHByaXZhdGUgX3JldHJ5SW50ZXJ2YWxJblNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBfdXBkYXRlSW50ZXJ2YWw6IG51bWJlcjtcbiAgcHJpdmF0ZSBfaWdub3JlZEZpZWxkTGlzdHNDYWNoZXM6IHt9O1xuICBwcml2YXRlIF9pZ25vcmVkRmllbGRMaXN0c0ZyZXNoZXN0Q2FjaGU6IG51bGw7XG4gIHByaXZhdGUgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGNsaWVudCBBUEkgY2xpZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7SHR0cENsaWVudH0gaHR0cENsaWVudCBIVFRQIGNsaWVudFxuICAgKiBAcGFyYW0ge0RvbWFpbkNsaWVudH0gZG9tYWluQ2xpZW50IGRvbWFpbiBjbGllbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIGRvbWFpbkNsaWVudDogRG9tYWluQ2xpZW50KSB7XG4gICAgc3VwZXIoaHR0cENsaWVudCwgZG9tYWluQ2xpZW50KTtcbiAgICB0aGlzLl9ob3N0ID0gJ2h0dHBzOi8vbXQtY2xpZW50LWFwaS12MSc7XG4gICAgdGhpcy5fcmV0cnlJbnRlcnZhbEluU2Vjb25kcyA9IDE7XG4gICAgdGhpcy5fdXBkYXRlSW50ZXJ2YWwgPSA2MCAqIDYwICogMTAwMDtcbiAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlcyA9IHt9O1xuICAgIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzRnJlc2hlc3RDYWNoZSA9IG51bGw7XG4gICAgdGhpcy5fbG9nZ2VyID0gTG9nZ2VyTWFuYWdlci5nZXRMb2dnZXIoJ0NsaWVudEFwaUNsaWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFR5cGVIYXNoaW5nSWdub3JlZEZpZWxkTGlzdHNcbiAgICogQHByb3BlcnR5IHtTdHJpbmdbXX0gc3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uIGlnbm9yZWQgZmllbGRzXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IHBvc2l0aW9uIHBvc2l0aW9uIGlnbm9yZWQgZmllbGRzXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IG9yZGVyIG9yZGVyIGlnbm9yZWQgZmllbGRzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBIYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICogQHR5cGVkZWYge09iamVjdH0gSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzXG4gICAqIEBwcm9wZXJ0eSB7VHlwZUhhc2hpbmdJZ25vcmVkRmllbGRMaXN0c30gZzEgZzEgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqIEBwcm9wZXJ0eSB7VHlwZUhhc2hpbmdJZ25vcmVkRmllbGRMaXN0c30gZzIgZzIgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZWZyZXNoZXMgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByZWdpb24gYWNjb3VudCByZWdpb25cbiAgICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgcmVzb2x2aW5nIHdoZW4gdGhlIGhhc2hpbmcgZmllbGQgbGlzdHMgYXJlIHVwZGF0ZWQuXG4gICAqL1xuICBhc3luYyByZWZyZXNoSWdub3JlZEZpZWxkTGlzdHMocmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmKHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gJiYgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXF1ZXN0UHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXF1ZXN0UHJvbWlzZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gJiYgXG4gICAgICBEYXRlLm5vdygpIC0gdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5sYXN0VXBkYXRlZCA8IHRoaXMuX3VwZGF0ZUludGVydmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKCF0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dKSB7XG4gICAgICAgIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gPSB7XG4gICAgICAgICAgbGFzdFVwZGF0ZWQ6IDAsXG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICByZXF1ZXN0UHJvbWlzZTogbnVsbCxcbiAgICAgICAgICB1cGRhdGVKb2I6IHNldEludGVydmFsKCgpID0+IHRoaXMuX3JlZnJlc2hJZ25vcmVkRmllbGRMaXN0c0pvYihyZWdpb24pLCA2MDAwMClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGxldCByZXNvbHZlLCByZWplY3Q7XG4gICAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dLnJlcXVlc3RQcm9taXNlID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICAgIHJlc29sdmUgPSByZXMsIHJlamVjdCA9IHJlajtcbiAgICAgIH0pO1xuICAgICAgbGV0IGlzQ2FjaGVVcGRhdGVkID0gZmFsc2U7XG4gICAgICB3aGlsZSghaXNDYWNoZVVwZGF0ZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBob3N0ID0gYXdhaXQgdGhpcy5fZG9tYWluQ2xpZW50LmdldFVybCh0aGlzLl9ob3N0LCByZWdpb24pO1xuICAgICAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgICAgICB1cmw6IGAke2hvc3R9L2hhc2hpbmctaWdub3JlZC1maWVsZC1saXN0c2AsXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAganNvbjogdHJ1ZSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ2F1dGgtdG9rZW4nOiB0aGlzLl90b2tlblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9odHRwQ2xpZW50LnJlcXVlc3Qob3B0cywgJ2dldEhhc2hpbmdJZ25vcmVkRmllbGRMaXN0cycpO1xuICAgICAgICAgIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gPSB7IGxhc3RVcGRhdGVkOiBEYXRlLm5vdygpLCBkYXRhOiByZXNwb25zZSwgcmVxdWVzdFByb21pc2U6IG51bGwgfTtcbiAgICAgICAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0ZyZXNoZXN0Q2FjaGUgPSByZXNwb25zZTtcbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICBpc0NhY2hlVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXRyeUludGVydmFsSW5TZWNvbmRzID0gdGhpcy5fcmV0cnlJbnRlcnZhbEluU2Vjb25kcztcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gdXBkYXRlIGhhc2hpbmcgaWdub3JlZCBmaWVsZCBsaXN0JywgZXJyKTtcbiAgICAgICAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dLnJldHJ5SW50ZXJ2YWxJblNlY29uZHMgPVxuICAgICAgICAgICAgTWF0aC5taW4odGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXRyeUludGVydmFsSW5TZWNvbmRzICogMiwgMzAwKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIFxuICAgICAgICAgICAgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXRyeUludGVydmFsSW5TZWNvbmRzICogMTAwMCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHJlZ2lvbiBhY2NvdW50IHJlZ2lvblxuICAgKiBAcmV0dXJucyB7SGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzfSBwcm9taXNlIHJlc29sdmluZyB3aXRoIGhhc2hpbmcgaWdub3JlZCBmaWVsZCBsaXN0c1xuICAgKi9cbiAgZ2V0SGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzKHJlZ2lvbjogc3RyaW5nKTogSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzIHtcbiAgICBpZihyZWdpb24gPT09ICdjb21iaW5lZCcpIHtcbiAgICAgIGlmICh0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0ZyZXNoZXN0Q2FjaGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzRnJlc2hlc3RDYWNoZTtcbiAgICAgIH0gZWxzZXsgXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdJZ25vcmVkIGZpZWxkIGxpc3RzIG5vdCBmb3VuZCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZih0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dICYmIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0uZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0uZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYElnbm9yZWQgZmllbGQgbGlzdHMgZm9yIHJlZ2lvbiAke3JlZ2lvbn0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3JlZnJlc2hJZ25vcmVkRmllbGRMaXN0c0pvYihyZWdpb24pIHtcbiAgICBpZighdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXF1ZXN0UHJvbWlzZSAmJiBcbiAgICAgIERhdGUubm93KCkgLSB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dLmxhc3RVcGRhdGVkID4gdGhpcy5fdXBkYXRlSW50ZXJ2YWwpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaElnbm9yZWRGaWVsZExpc3RzKHJlZ2lvbik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVHlwZSBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAqL1xuZXhwb3J0IGRlY2xhcmUgdHlwZSBUeXBlSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzID0ge1xuXG4gIC8qKlxuICAgKiBzcGVjaWZpY2F0aW9ucyBpZ25vcmVkIGZpZWxkc1xuICAgKi9cbiAgc3BlY2lmaWNhdGlvbjogc3RyaW5nW10sXG5cbiAgLyoqXG4gICAqIHBvc2l0aW9uIGlnbm9yZWQgZmllbGRzXG4gICAqL1xuICBwb3NpdGlvbjogc3RyaW5nW10sXG5cbiAgLyoqXG4gICAqIG9yZGVyIGlnbm9yZWQgZmllbGRzXG4gICAqL1xuICBvcmRlcjogc3RyaW5nW10sXG59XG5cbi8qKlxuICogSGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gKi9cbmV4cG9ydCBkZWNsYXJlIHR5cGUgSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzID0ge1xuXG4gIC8qKlxuICAgKiBnMSBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICovXG4gIGcxOiBUeXBlSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzLFxuXG4gIC8qKlxuICAgKiBnMiBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICovXG4gIGcyOiBUeXBlSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzLFxufVxuIl0sIm5hbWVzIjpbIk1ldGFBcGlDbGllbnQiLCJMb2dnZXJNYW5hZ2VyIiwiTm90Rm91bmRFcnJvciIsIkNsaWVudEFwaUNsaWVudCIsInJlZnJlc2hJZ25vcmVkRmllbGRMaXN0cyIsInJlZ2lvbiIsIl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlcyIsInJlcXVlc3RQcm9taXNlIiwiRGF0ZSIsIm5vdyIsImxhc3RVcGRhdGVkIiwiX3VwZGF0ZUludGVydmFsIiwiZGF0YSIsInVwZGF0ZUpvYiIsInNldEludGVydmFsIiwiX3JlZnJlc2hJZ25vcmVkRmllbGRMaXN0c0pvYiIsInJlc29sdmUiLCJyZWplY3QiLCJQcm9taXNlIiwicmVzIiwicmVqIiwiaXNDYWNoZVVwZGF0ZWQiLCJob3N0IiwiX2RvbWFpbkNsaWVudCIsImdldFVybCIsIl9ob3N0Iiwib3B0cyIsInVybCIsIm1ldGhvZCIsImpzb24iLCJoZWFkZXJzIiwiX3Rva2VuIiwicmVzcG9uc2UiLCJfaHR0cENsaWVudCIsInJlcXVlc3QiLCJfaWdub3JlZEZpZWxkTGlzdHNGcmVzaGVzdENhY2hlIiwicmV0cnlJbnRlcnZhbEluU2Vjb25kcyIsIl9yZXRyeUludGVydmFsSW5TZWNvbmRzIiwiZXJyIiwiX2xvZ2dlciIsImVycm9yIiwiTWF0aCIsIm1pbiIsInNldFRpbWVvdXQiLCJnZXRIYXNoaW5nSWdub3JlZEZpZWxkTGlzdHMiLCJjb25zdHJ1Y3RvciIsImh0dHBDbGllbnQiLCJkb21haW5DbGllbnQiLCJnZXRMb2dnZXIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsT0FBT0EsbUJBQW1CLG9CQUFvQjtBQUM5QyxPQUFPQyxtQkFBNkIsZUFBZTtBQUNuRCxTQUFRQyxhQUFhLFFBQU8sa0JBQWtCO0FBTy9CLElBQUEsQUFBTUMsa0JBQU4sTUFBTUEsd0JBQXdCSDtJQXVCM0M7Ozs7OztHQU1DLEdBRUQ7Ozs7O0dBS0MsR0FFRDs7OztHQUlDLEdBQ0QsQUFBTUkseUJBQXlCQyxNQUFjOztlQUE3QyxvQkFBQTtZQUNFLElBQUcsTUFBS0Msd0JBQXdCLENBQUNELE9BQU8sSUFBSSxNQUFLQyx3QkFBd0IsQ0FBQ0QsT0FBTyxDQUFDRSxjQUFjLEVBQUU7Z0JBQ2hHLE1BQU0sTUFBS0Qsd0JBQXdCLENBQUNELE9BQU8sQ0FBQ0UsY0FBYztZQUM1RCxPQUFPLElBQUksTUFBS0Qsd0JBQXdCLENBQUNELE9BQU8sSUFDOUNHLEtBQUtDLEdBQUcsS0FBSyxNQUFLSCx3QkFBd0IsQ0FBQ0QsT0FBTyxDQUFDSyxXQUFXLEdBQUcsTUFBS0MsZUFBZSxFQUFFO2dCQUN2RjtZQUNGLE9BQU87Z0JBQ0wsSUFBRyxDQUFDLE1BQUtMLHdCQUF3QixDQUFDRCxPQUFPLEVBQUU7b0JBQ3pDLE1BQUtDLHdCQUF3QixDQUFDRCxPQUFPLEdBQUc7d0JBQ3RDSyxhQUFhO3dCQUNiRSxNQUFNO3dCQUNOTCxnQkFBZ0I7d0JBQ2hCTSxXQUFXQyxZQUFZLElBQU0sTUFBS0MsNEJBQTRCLENBQUNWLFNBQVM7b0JBQzFFO2dCQUNGO2dCQUNBLElBQUlXLFNBQVNDO2dCQUNiLE1BQUtYLHdCQUF3QixDQUFDRCxPQUFPLENBQUNFLGNBQWMsR0FB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