PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/statics/dist/src

Просмотр файла: map.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CoinMap = void 0;
const errors_1 = require("./errors");
const account_1 = require("./account");
class CoinMap {
    constructor() {
        this._map = new Map();
        this._coinByIds = new Map();
        // Holds key equivalences used during an asset name migration
        this._coinByAliases = new Map();
        // map of coin by address -> the key is the family:contractAddress
        // the family is the where the coin is e.g l1 chains like eth, bsc etc. or l2 like arbeth, celo etc.
        this._coinByContractAddress = new Map();
        // map of coin by NFT collection ID -> the key is the (t)family:nftCollectionID
        this._coinByNftCollectionID = new Map();
        // Do not instantiate
    }
    static fromCoins(coins) {
        const coinMap = new CoinMap();
        coins.forEach((coin) => {
            coinMap.addCoin(coin);
        });
        return coinMap;
    }
    addCoin(coin) {
        if (this._map.has(coin.name)) {
            throw new errors_1.DuplicateCoinDefinitionError(coin.name);
        }
        if (this._coinByIds.has(coin.id)) {
            throw new errors_1.DuplicateCoinIdDefinitionError(coin.id);
        }
        const alias = coin.alias;
        if (alias && this._coinByAliases.has(alias)) {
            throw new errors_1.DuplicateCoinDefinitionError(alias);
        }
        this._map.set(coin.name, coin);
        this._coinByIds.set(coin.id, coin);
        if (alias) {
            this._coinByAliases.set(coin.alias, coin);
        }
        if (coin.isToken) {
            if (coin instanceof account_1.ContractAddressDefinedToken) {
                this._coinByContractAddress.set(`${coin.family}:${coin.contractAddress}`, coin);
            }
            else if (coin instanceof account_1.NFTCollectionIdDefinedToken) {
                this._coinByNftCollectionID.set(`${coin.prefix}${coin.family}:${coin.nftCollectionId}`, coin);
            }
        }
    }
    /**
     * Replace a Base coin object completely from the CoinMap using its ID.
     * @param {string} key key to search the old coin object
     * @param {Readonly<BaseCoin>} coin new coin object
     */
    replace(coin) {
        if (this.has(coin.id)) {
            const oldCoin = this.get(coin.id);
            this._map.delete(oldCoin.name);
            this._coinByIds.delete(oldCoin.id);
            if (oldCoin.alias) {
                this._coinByAliases.delete(oldCoin.alias);
            }
            if (oldCoin.isToken) {
                if (oldCoin instanceof account_1.ContractAddressDefinedToken) {
                    this._coinByContractAddress.delete(`${oldCoin.family}:${oldCoin.contractAddress}`);
                }
                else if (oldCoin instanceof account_1.NFTCollectionIdDefinedToken) {
                    this._coinByNftCollectionID.delete(`${oldCoin.prefix}${oldCoin.family}:${oldCoin.nftCollectionId}`);
                }
            }
        }
        this.addCoin(coin);
    }
    static coinNameFromChainId(chainId) {
        const ethLikeCoinFromChainId = {
            1: 'eth',
            42: 'teth',
            5: 'gteth',
            560048: 'hteth',
            10001: 'ethw',
            80002: 'tpolygon',
            137: 'polygon',
            56: 'bsc',
            97: 'tbsc',
            42161: 'arbeth',
            421614: 'tarbeth',
            10: 'opeth',
            11155420: 'topeth',
            1116: 'coredao',
            1114: 'tcoredao',
            248: 'oas',
            9372: 'toas',
            14: 'flr',
            114: 'tflr',
            19: 'sgb',
            16: 'tsgb',
            1111: 'wemix',
            1112: 'twemix',
            50: 'xdc',
            51: 'txdc',
            80094: 'bera',
            80000: 'tbera',
            42220: 'celo',
            44787: 'tcelo',
            2222: 'kava',
            2221: 'tkava',
            43114: 'avax',
            43113: 'tavax',
            100: 'gno',
            130: 'uni',
            324: 'zketh',
            8453: 'baseeth',
            10143: 'tmon',
            480: 'world',
            4801: 'tworld',
            50312: 'tstt',
            1868: 'soneium',
            1946: 'tsoneium',
            33111: 'apechain',
            33139: 'tapechain',
        };
        return ethLikeCoinFromChainId[chainId];
    }
    /**
     * Override `get` to throw if a coin is missing, instead of returning undefined.
     * It will honor key equivalences in case given key is missing.
     * @param {string} key
     * @return {BaseCoin}
     */
    get(key) {
        const coin = this._map.get(key) ||
            this._coinByIds.get(key) ||
            this._coinByAliases.get(key) ||
            this._coinByContractAddress.get(key) ||
            this._coinByNftCollectionID.get(key);
        if (coin) {
            return coin;
        }
        throw new errors_1.CoinNotDefinedError(key);
    }
    has(key) {
        return (this._map.has(key) ||
            this._coinByIds.has(key) ||
            this._coinByAliases.has(key) ||
            this._coinByContractAddress.has(key) ||
            this._coinByNftCollectionID.has(key));
    }
    map(mapper) {
        const mapResult = [];
        this._map.forEach((value, key) => {
            mapResult.push(mapper(value, key));
        });
        return mapResult;
    }
    reduce(reducer, initialValue) {
        let acc = initialValue;
        this._map.forEach((value, key) => {
            acc = reducer(acc, value, key);
        });
        return acc;
    }
    filter(predicate) {
        const filterResult = [];
        this._map.forEach((value, key) => {
            if (predicate(value, key)) {
                filterResult.push(value);
            }
        });
        return CoinMap.fromCoins(filterResult);
    }
    forEach(callback) {
        this._map.forEach(callback);
    }
    [Symbol.iterator]() {
        return this._map[Symbol.iterator]();
    }
}
exports.CoinMap = CoinMap;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxQ0FBNkc7QUFDN0csdUNBQXFGO0FBRXJGLE1BQWEsT0FBTztJQVdsQjtRQVZpQixTQUFJLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7UUFDN0MsZUFBVSxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO1FBQ3BFLDZEQUE2RDtRQUM1QyxtQkFBYyxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO1FBQ3hFLGtFQUFrRTtRQUNsRSxvR0FBb0c7UUFDbkYsMkJBQXNCLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7UUFDaEYsK0VBQStFO1FBQzlELDJCQUFzQixHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO1FBRzlFLHFCQUFxQjtJQUN2QixDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUEyQjtRQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzlCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNyQixPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxJQUF3QjtRQUNyQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxxQ0FBNEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLHVDQUE4QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMs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QUFHLEdBQUcsWUFBWSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQy9CLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxTQUFrRTtRQUM5RSxNQUFNLFlBQVksR0FBeUIsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQy9CLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxQixZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU0sT0FBTyxDQUFDLFFBQThEO1FBQzNFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0lBQ3RDLENBQUM7Q0FDRjtBQTVMRCwwQkE0TEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBEdXBsaWNhdGVDb2luRGVmaW5pdGlvbkVycm9yLCBDb2luTm90RGVmaW5lZEVycm9yLCBEdXBsaWNhdGVDb2luSWREZWZpbml0aW9uRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4sIE5GVENvbGxlY3Rpb25JZERlZmluZWRUb2tlbiB9IGZyb20gJy4vYWNjb3VudCc7XG5cbmV4cG9ydCBjbGFzcyBDb2luTWFwIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfbWFwID0gbmV3IE1hcDxzdHJpbmcsIFJlYWRvbmx5PEJhc2VDb2luPj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY29pbkJ5SWRzID0gbmV3IE1hcDxzdHJpbmcsIFJlYWRvbmx5PEJhc2VDb2luPj4oKTtcbiAgLy8gSG9sZHMga2V5IGVxdWl2YWxlbmNlcyB1c2VkIGR1cmluZyBhbiBhc3NldCBuYW1lIG1pZ3JhdGlvblxuICBwcml2YXRlIHJlYWRvbmx5IF9jb2luQnlBbGlhc2VzID0gbmV3IE1hcDxzdHJpbmcsIFJlYWRvbmx5PEJhc2VDb2luPj4oKTtcbiAgLy8gbWFwIG9mIGNvaW4gYnkgYWRkcmVzcyAtPiB0aGUga2V5IGlzIHRoZSBmYW1pbHk6Y29udHJhY3RBZGRyZXNzXG4gIC8vIHRoZSBmYW1pbHkgaXMgdGhlIHdoZXJlIHRoZSBjb2luIGlzIGUuZyBsMSBjaGFpbnMgbGlrZSBldGgsIGJzYyBldGMuIG9yIGwyIGxpa2UgYXJiZXRoLCBjZWxvIGV0Yy5cbiAgcHJpdmF0ZSByZWFkb25seSBfY29pbkJ5Q29udHJhY3RBZGRyZXNzID0gbmV3IE1hcDxzdHJpbmcsIFJlYWRvbmx5PEJhc2VDb2luPj4oKTtcbiAgLy8gbWFwIG9mIGNvaW4gYnkgTkZUIGNvbGxlY3Rpb24gSUQgLT4gdGhlIGtleSBpcyB0aGUgKHQpZmFtaWx5Om5mdENvbGxlY3Rpb25JRFxuICBwcml2YXRlIHJlYWRvbmx5IF9jb2luQnlOZnRDb2xsZWN0aW9uSUQgPSBuZXcgTWFwPHN0cmluZywgUmVhZG9ubHk8QmFzZUNvaW4+PigpO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRG8gbm90IGluc3RhbnRpYXRlXG4gIH1cblxuICBzdGF0aWMgZnJvbUNvaW5zKGNvaW5zOiBSZWFkb25seTxCYXNlQ29pbj5bXSk6IENvaW5NYXAge1xuICAgIGNvbnN0IGNvaW5NYXAgPSBuZXcgQ29pbk1hcCgpO1xuICAgIGNvaW5zLmZvckVhY2goKGNvaW4pID0+IHtcbiAgICAgIGNvaW5NYXAuYWRkQ29pbihjb2luKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29pbk1hcDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRDb2luKGNvaW46IFJlYWRvbmx5PEJhc2VDb2luPik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9tYXAuaGFzKGNvaW4ubmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBEdXBsaWNhdGVDb2luRGVmaW5pdGlvbkVycm9yKGNvaW4ubmFtZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb2luQnlJZHMuaGFzKGNvaW4uaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRHVwbGljYXRlQ29pbklkRGVmaW5pdGlvbkVycm9yKGNvaW4uaWQpO1xuICAgIH1cbiAgICBjb25zdCBhbGlhcyA9IGNvaW4uYWxpYXM7XG4gICAgaWYgKGFsaWFzICYmIHRoaXMuX2NvaW5CeUFsaWFzZXMuaGFzKGFsaWFzKSkge1xuICAgICAgdGhyb3cgbmV3IER1cGxpY2F0ZUNvaW5EZWZpbml0aW9uRXJyb3IoYWxpYXMpO1xuICAgIH1cbiAgICB0aGlzLl9tYXAuc2V0KGNvaW4ubmFtZSwgY29pbik7XG4gICAgdGhpcy5fY29pbkJ5SWRzLnNldChjb2luLmlkLCBjb2luKTtcbiAgICBpZiAoYWxpYXMpIHtcbiAgICAgIHRoaXMuX2NvaW5CeUFsaWFzZXMuc2V0KGNvaW4uYWxpYXMsIGNvaW4pO1xuICAgIH1cblxuICAgIGlmIChjb2luLmlzVG9rZW4pIHtcbiAgICAgIGlmIChjb2luIGluc3RhbmNlb2YgQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuKSB7XG4gICAgICAgIHRoaXMuX2NvaW5CeUNvbnRyYWN0QWRkcmVzcy5zZXQoYCR7Y29pbi5mYW1pbHl9OiR7Y29pbi5jb250cmFjdEFkZHJlc3N9YCwgY29pbik7XG4gICAgICB9IGVsc2UgaWYgKGNvaW4gaW5zdGFuY2VvZiBORlRDb2xsZWN0aW9uSWREZWZpbmVkVG9rZW4pIHtcbiAgICAgICAgdGhpcy5fY29pbkJ5TmZ0Q29sbGVjdGlvbklELnNldChgJHtjb2luLnByZWZpeH0ke2NvaW4uZmFtaWx5fToke2NvaW4ubmZ0Q29sbGVjdGlvbklkfWAsIGNvaW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIGEgQmFzZSBjb2luIG9iamVjdCBjb21wbGV0ZWx5IGZyb20gdGhlIENvaW5NYXAgdXNpbmcgaXRzIElELlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IGtleSB0byBzZWFyY2ggdGhlIG9sZCBjb2luIG9iamVjdFxuICAgKiBAcGFyYW0ge1JlYWRvbmx5PEJhc2VDb2luPn0gY29pbiBuZXcgY29pbiBvYmplY3RcbiAgICovXG4gIHB1YmxpYyByZXBsYWNlKGNvaW46IFJlYWRvbmx5PEJhc2VDb2luPik6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhcyhjb2luLmlkKSkge1xuICAgICAgY29uc3Qgb2xkQ29pbiA9IHRoaXMuZ2V0KGNvaW4uaWQpO1xuICAgICAgdGhpcy5fbWFwLmRlbGV0ZShvbGRDb2luLm5hbWUpO1xuICAgICAgdGhpcy5fY29pbkJ5SWRzLmRlbGV0ZShvbGRDb2luLmlkKTtcbiAgICAgIGlmIChvbGRDb2luLmFsaWFzKSB7XG4gICAgICAgIHRoaXMuX2NvaW5CeUFsaWFzZXMuZGVsZXRlKG9sZENvaW4uYWxpYXMpO1xuICAgICAgfVxuICAgICAgaWYgKG9sZENvaW4uaXNUb2tlbikge1xuICAgICAgICBpZiAob2xkQ29pbiBpbnN0YW5jZW9mIENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbikge1xuICAgICAgICAgIHRoaXMuX2NvaW5CeUNvbnRyYWN0QWRkcmVzcy5kZWxldGUoYCR7b2xkQ29pbi5mYW1pbHl9OiR7b2xkQ29pbi5jb250cmFjdEFkZHJlc3N9YCk7XG4gICAgICAgIH0gZWxzZSBpZiAob2xkQ29pbiBpbnN0YW5jZW9mIE5GVENvbGxlY3Rpb25JZERlZmluZWRUb2tlbikge1xuICAgICAgICAgIHRoaXMuX2NvaW5CeU5mdENvbGxlY3Rpb25JRC5kZWxldGUoYCR7b2xkQ29pbi5wcmVmaXh9JHtvbGRDb2luLmZhbWlseX06JHtvbGRDb2luLm5mdENvbGxlY3Rpb25JZH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFkZENvaW4oY29pbik7XG4gIH1cblxuICBzdGF0aWMgY29pbk5hbWVGcm9tQ2hhaW5JZChjaGFpbklkOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGV0aExpa2VDb2luRnJvbUNoYWluSWQ6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gICAgICAxOiAnZXRoJyxcbiAgICAgIDQyOiAndGV0aCcsXG4gICAgICA1OiAnZ3RldGgnLFxuICAgICAgNTYwMDQ4OiAnaHRldGgnLFxuICAgICAgMTAwMDE6ICdldGh3JyxcbiAgICAgIDgwMDAyOiAndHBvbHlnb24nLFxuICAgICAgMTM3OiAncG9seWdvbicsXG4gICAgICA1NjogJ2JzYycsXG4gICAgICA5NzogJ3Ric2MnLFxuICAgICAgNDIxNjE6ICdhcmJldGgnLFxuICAgICAgNDIxNjE0OiAndGFyYmV0aCcsXG4gICAgICAxMDogJ29wZXRoJyxcbiAgICAgIDExMTU1NDIwOiAndG9wZXRoJyxcbiAgICAgIDExMTY6ICdjb3JlZGFvJyxcbiAgICAgIDExMTQ6ICd0Y29yZWRhbycsXG4gICAgICAyNDg6ICdvYXMnLFxuICAgICAgOTM3MjogJ3RvYXMnLFxuICAgICAgMTQ6ICdmbHInLFxuICAgICAgMTE0OiAndGZscicsXG4gICAgICAxOTogJ3NnYicsXG4gICAgICAxNjogJ3RzZ2InLFxuICAgICAgMTExMTogJ3dlbWl4JyxcbiAgICAgIDExMTI6ICd0d2VtaXgnLFxuICAgICAgNTA6ICd4ZGMnLFxuICAgICAgNTE6ICd0eGRjJyxcbiAgICAgIDgwMDk0OiAnYmVyYScsXG4gICAgICA4MDAwMDogJ3RiZXJhJyxcbiAgICAgIDQyMjIwOiAnY2VsbycsXG4gICAgICA0NDc4NzogJ3RjZWxvJyxcbiAgICAgIDIyMjI6ICdrYXZhJyxcbiAgICAgIDIyMjE6ICd0a2F2YScsXG4gICAgICA0MzExNDogJ2F2YXgnLFxuICAgICAgNDMxMTM6ICd0YXZheCcsXG4gICAgICAxMDA6ICdnbm8nLFxuICAgICAgMTMwOiAndW5pJyxcbiAgICAgIDMyNDogJ3prZXRoJyxcbiAgICAgIDg0NTM6ICdiYXNlZXRoJyxcbiAgICAgIDEwMTQzOiAndG1vbicsXG4gICAgICA0ODA6ICd3b3JsZCcsXG4gICAgICA0ODAxOiAndHdvcmxkJyxcbiAgICAgIDUwMzEyOiAndHN0dCcsXG4gICAgICAxODY4OiAnc29uZWl1bScsXG4gICAgICAxOTQ2OiAndHNvbmVpdW0nLFxuICAgICAgMzMxMTE6ICdhcGVjaGFpbicsXG4gICAgICAzMzEzOTogJ3RhcGVjaGFpbicsXG4gICAgfTtcbiAgICByZXR1cm4gZXRoTGlrZUNvaW5Gcm9tQ2hhaW5JZFtjaGFpbklkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBgZ2V0YCB0byB0aHJvdyBpZiBhIGNvaW4gaXMgbWlzc2luZywgaW5zdGVhZCBvZiByZXR1cm5pbmcgdW5kZWZpbmVkLlxuICAgKiBJdCB3aWxsIGhvbm9yIGtleSBlcXVpdmFsZW5jZXMgaW4gY2FzZSBnaXZlbiBrZXkgaXMgbWlzc2luZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJuIHtCYXNlQ29pbn1cbiAgICovXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBSZWFkb25seTxCYXNlQ29pbj4ge1xuICAgIGNvbnN0IGNvaW4gPVxuICAgICAgdGhpcy5fbWFwLmdldChrZXkpIHx8XG4gICAgICB0aGlzLl9jb2luQnlJZHMuZ2V0KGtleSkgfHxcbiAgICAgIHRoaXMuX2NvaW5CeUFsaWFzZXMuZ2V0KGtleSkgfHxcbiAgICAgIHRoaXMuX2NvaW5CeUNvbnRyYWN0QWRkcmVzcy5nZXQoa2V5KSB8fFxuICAgICAgdGhpcy5fY29pbkJ5TmZ0Q29sbGVjdGlvbklELmdldChrZXkpO1xuXG4gICAgaWYgKGNvaW4pIHtcbiAgICAgIHJldHVybiBjb2luO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBDb2luTm90RGVmaW5lZEVycm9yKGtleSk7XG4gIH1cblxuICBwdWJsaWMgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX21hcC5oYXMoa2V5KSB8fFxuICAgICAgdGhpcy5fY29pbkJ5SWRzLmhhcyhrZXkpIHx8XG4gICAgICB0aGlzLl9jb2luQnlBbGlhc2VzLmhhcyhrZXkpIHx8XG4gICAgICB0aGlzLl9jb2luQnlDb250cmFjdEFkZHJlc3MuaGFzKGtleSkgfHxcbiAgICAgIHRoaXMuX2NvaW5CeU5mdENvbGxlY3Rpb25JRC5oYXMoa2V5KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbWFwPFQ+KG1hcHBlcjogKGNvaW46IFJlYWRvbmx5PEJhc2VDb2luPiwgY29pbk5hbWU6IHN0cmluZykgPT4gVCk6IFRbXSB7XG4gICAgY29uc3QgbWFwUmVzdWx0OiBUW10gPSBbXTtcbiAgICB0aGlzLl9tYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgbWFwUmVzdWx0LnB1c2gobWFwcGVyKHZhbHVlLCBrZXkpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWFwUmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHJlZHVjZTxUPihyZWR1Y2VyOiAoYWNjOiBULCBjb2luOiBSZWFkb25seTxCYXNlQ29pbj4sIGNvaW5OYW1lOiBzdHJpbmcpID0+IFQsIGluaXRpYWxWYWx1ZTogVCk6IFQge1xuICAgIGxldCBhY2MgPSBpbml0aWFsVmFsdWU7XG4gICAgdGhpcy5fbWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGFjYyA9IHJlZHVjZXIoYWNjLCB2YWx1ZSwga2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWNjO1xuICB9XG5cbiAgcHVibGljIGZpbHRlcihwcmVkaWNhdGU6IChjb2luOiBSZWFkb25seTxCYXNlQ29pbj4sIGNvaW5OYW1lOiBzdHJpbmcpID0+IGJvb2xlYW4pOiBDb2luTWFwIHtcbiAgICBjb25zdCBmaWx0ZXJSZXN1bHQ6IFJlYWRvbmx5PEJhc2VDb2luPltdID0gW107XG4gICAgdGhpcy5fbWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGtleSkpIHtcbiAgICAgICAgZmlsdGVyUmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDb2luTWFwLmZyb21Db2lucyhmaWx0ZXJSZXN1bHQpO1xuICB9XG5cbiAgcHVibGljIGZvckVhY2goY2FsbGJhY2s6IChjb2luOiBSZWFkb25seTxCYXNlQ29pbj4sIGNvaW5OYW1lOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9tYXAuZm9yRWFjaChjYWxsYmFjayk7XG4gIH1cblxuICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBSZWFkb25seTxCYXNlQ29pbj5dPiB7XG4gICAgcmV0dXJuIHRoaXMuX21hcFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIH1cbn1cbiJdfQ==

Выполнить команду


Для локальной разработки. Не используйте в интернете!