UNPKG

@bhayward93/web3modal-angular

Version:

Web3Modal implementation for Angular

165 lines 25.1 kB
import * as env from 'detect-browser'; import { CHAIN_DATA_LIST } from '../constants'; import { providers, injected } from '../providers'; export function checkInjectedProviders() { const result = { injectedAvailable: !!window.ethereum || !!window.web3, }; if (result.injectedAvailable) { let fallbackProvider = true; Object.values(injected).forEach(provider => { const isAvailable = verifyInjectedProvider(provider.check); if (isAvailable) { result[provider.check] = true; fallbackProvider = false; } }); const browser = env.detect(); if (browser && browser.name === 'opera') { result[injected.OPERA.check] = true; fallbackProvider = false; } if (fallbackProvider) { result[injected.FALLBACK.check] = true; } } return result; } export function verifyInjectedProvider(check) { return window.ethereum ? window.ethereum[check] || (window.web3 && window.web3.currentProvider) ? window.web3 ? window.web3.currentProvider[check] : true : false : window.web3 && window.web3.currentProvider ? window.web3.currentProvider[check] : false; } export function getInjectedProvider() { let result = null; const injectedProviders = checkInjectedProviders(); if (injectedProviders.injectedAvailable) { delete injectedProviders.injectedAvailable; const checks = Object.keys(injectedProviders); result = getProviderInfoFromChecksArray(checks); } return result; } export function getInjectedProviderName() { const injectedProvider = getInjectedProvider(); return injectedProvider ? injectedProvider.name : null; } export function getProviderInfo(provider) { if (!provider) return providers.FALLBACK; const checks = Object.values(providers) .filter(x => provider[x.check]) .map(x => x.check); return getProviderInfoFromChecksArray(checks); } export function getProviderInfoFromChecksArray(checks) { const check = filterProviderChecks(checks); return filterProviders('check', check); } export function getProviderInfoByName(name) { return filterProviders('name', name); } export function getProviderInfoById(id) { return filterProviders('id', id); } export function getProviderInfoByCheck(check) { return filterProviders('check', check); } export function isMobile() { let mobile = false; function hasTouchEvent() { try { document.createEvent('TouchEvent'); return true; } catch (e) { return false; } } function hasMobileUserAgent() { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(navigator.userAgent.substr(0, 4))) { return true; } else if (hasTouchEvent()) { return true; } return false; } mobile = hasMobileUserAgent(); return mobile; } export function getProviderDescription(providerInfo) { if (providerInfo.description) { return providerInfo.description; } let description = ''; switch (providerInfo.type) { case 'injected': description = `Connect to your ${providerInfo.name} Wallet`; break; case 'web': description = `Connect with your ${providerInfo.name} account`; break; case 'qrcode': description = `Scan with ${providerInfo.name} to connect`; break; case 'hardware': description = `Connect to your ${providerInfo.name} Hardware Wallet`; break; default: break; } return description; } export function filterMatches(array, condition, fallback) { let result = fallback; const matches = array.filter(condition); if (!!matches && matches.length) { result = matches[0]; } return result; } export function filterProviders(param, value) { if (!value) return providers.FALLBACK; const match = filterMatches(Object.values(providers), x => x[param] === value, providers.FALLBACK); return match || providers.FALLBACK; } export function filterProviderChecks(checks) { if (!!checks && checks.length) { if (checks.length > 1) { if (checks[0] === injected.METAMASK.check || checks[0] === injected.CIPHER.check) { return checks[1]; } } return checks[0]; } return providers.FALLBACK.check; } export function getChainId(network) { const chains = Object.values(CHAIN_DATA_LIST); const match = filterMatches(chains, x => x.network === network, undefined); if (!match) { throw new Error(`No chainId found match ${network}`); } return match.chainId; } export function findMatchingRequiredOptions(requiredOptions, providedOptions) { const matches = requiredOptions.filter(requiredOption => { if (typeof requiredOption === 'string') { return requiredOption in providedOptions; } const matches = findMatchingRequiredOptions(requiredOption, providedOptions); return matches && matches.length; }); return matches; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93ZWIzbW9kYWwvc3JjL2xpYi93ZWIzbW9kYWwtdHMvc3JjL2hlbHBlcnMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBU25ELE1BQU0sVUFBVSxzQkFBc0I7SUFDcEMsTUFBTSxNQUFNLEdBQUc7UUFDYixpQkFBaUIsRUFBRSxDQUFDLENBQUUsTUFBYyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUUsTUFBYyxDQUFDLElBQUk7S0FDeEUsQ0FBQztJQUNGLElBQUksTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0IsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDNUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDekMsTUFBTSxXQUFXLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNELElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUM5QixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRTdCLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFD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TyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZW52IGZyb20gJ2RldGVjdC1icm93c2VyJztcblxuaW1wb3J0IHsgQ0hBSU5fREFUQV9MSVNUIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IHByb3ZpZGVycywgaW5qZWN0ZWQgfSBmcm9tICcuLi9wcm92aWRlcnMnO1xuaW1wb3J0IHtcbiAgSVByb3ZpZGVySW5mbyxcbiAgSUluamVjdGVkUHJvdmlkZXJzTWFwLFxuICBDaGFpbkRhdGEsXG4gIFRoZW1lQ29sb3JzLFxuICBSZXF1aXJlZE9wdGlvbixcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0luamVjdGVkUHJvdmlkZXJzKCk6IElJbmplY3RlZFByb3ZpZGVyc01hcCB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBpbmplY3RlZEF2YWlsYWJsZTogISEod2luZG93IGFzIGFueSkuZXRoZXJldW0gfHwgISEod2luZG93IGFzIGFueSkud2ViMyxcbiAgfTtcbiAgaWYgKHJlc3VsdC5pbmplY3RlZEF2YWlsYWJsZSkge1xuICAgIGxldCBmYWxsYmFja1Byb3ZpZGVyID0gdHJ1ZTtcbiAgICBPYmplY3QudmFsdWVzKGluamVjdGVkKS5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICAgIGNvbnN0IGlzQXZhaWxhYmxlID0gdmVyaWZ5SW5qZWN0ZWRQcm92aWRlcihwcm92aWRlci5jaGVjayk7XG4gICAgICBpZiAoaXNBdmFpbGFibGUpIHtcbiAgICAgICAgcmVzdWx0W3Byb3ZpZGVyLmNoZWNrXSA9IHRydWU7XG4gICAgICAgIGZhbGxiYWNrUHJvdmlkZXIgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGJyb3dzZXIgPSBlbnYuZGV0ZWN0KCk7XG5cbiAgICBpZiAoYnJvd3NlciAmJiBicm93c2VyLm5hbWUgPT09ICdvcGVyYScpIHtcbiAgICAgIHJlc3VsdFtpbmplY3RlZC5PUEVSQS5jaGVja10gPSB0cnVlO1xuICAgICAgZmFsbGJhY2tQcm92aWRlciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChmYWxsYmFja1Byb3ZpZGVyKSB7XG4gICAgICByZXN1bHRbaW5qZWN0ZWQuRkFMTEJBQ0suY2hlY2tdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5SW5qZWN0ZWRQcm92aWRlcihjaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAod2luZG93IGFzIGFueSkuZXRoZXJldW1cbiAgICA/ICh3aW5kb3cgYXMgYW55KS5ldGhlcmV1bVtjaGVja10gfHwgKCh3aW5kb3cgYXMgYW55KS53ZWIzICYmICh3aW5kb3cgYXMgYW55KS53ZWIzLmN1cnJlbnRQcm92aWRlcilcbiAgICAgID8gKHdpbmRvdyBhcyBhbnkpLndlYjNcbiAgICAgICAgPyAod2luZG93IGFzIGFueSkud2ViMy5jdXJyZW50UHJvdmlkZXJbY2hlY2tdXG4gICAgICAgIDogdHJ1ZVxuICAgICAgOiBmYWxzZVxuICAgIDogKHdpbmRvdyBhcyBhbnkpLndlYjMgJiYgKHdpbmRvdyBhcyBhbnkpLndlYjMuY3VycmVudFByb3ZpZGVyXG4gICAgPyAod2luZG93IGFzIGFueSkud2ViMy5jdXJyZW50UHJvdmlkZXJbY2hlY2tdXG4gICAgOiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluamVjdGVkUHJvdmlkZXIoKTogSVByb3ZpZGVySW5mbyB8IG51bGwge1xuICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICBjb25zdCBpbmplY3RlZFByb3ZpZGVycyA9IGNoZWNrSW5qZWN0ZWRQcm92aWRlcnMoKTtcblxuICBpZiAoaW5qZWN0ZWRQcm92aWRlcnMuaW5qZWN0ZWRBdmFpbGFibGUpIHtcbiAgICBkZWxldGUgaW5qZWN0ZWRQcm92aWRlcnMuaW5qZWN0ZWRBdmFpbGFibGU7XG4gICAgY29uc3QgY2hlY2tzID0gT2JqZWN0LmtleXMoaW5qZWN0ZWRQcm92aWRlcnMpO1xuICAgIHJlc3VsdCA9IGdldFByb3ZpZGVySW5mb0Zyb21DaGVja3NBcnJheShjaGVja3MpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbmplY3RlZFByb3ZpZGVyTmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgaW5qZWN0ZWRQcm92aWRlciA9IGdldEluamVjdGVkUHJvdmlkZXIoKTtcbiAgcmV0dXJuIGluamVjdGVkUHJvdmlkZXIgPyBpbmplY3RlZFByb3ZpZGVyLm5hbWUgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvdmlkZXJJbmZvKHByb3ZpZGVyOiBhbnkpOiBJUHJvdmlkZXJJbmZvIHtcbiAgaWYgKCFwcm92aWRlcikgcmV0dXJuIHByb3ZpZGVycy5GQUxMQkFDSztcbiAgY29uc3QgY2hlY2tzID0gT2JqZWN0LnZhbHVlcyhwcm92aWRlcnMpXG4gICAgLmZpbHRlcih4ID0+IHByb3ZpZGVyW3guY2hlY2tdKVxuICAgIC5tYXAoeCA9PiB4LmNoZWNrKTtcbiAgcmV0dXJuIGdldFByb3ZpZGVySW5mb0Zyb21DaGVja3NBcnJheShjaGVja3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvdmlkZXJJbmZvRnJvbUNoZWNrc0FycmF5KFxuICBjaGVja3M6IHN0cmluZ1tdXG4pOiBJUHJvdmlkZXJJbmZvIHtcbiAgY29uc3QgY2hlY2sgPSBmaWx0ZXJQcm92aWRlckNoZWNrcyhjaGVja3MpO1xuICByZXR1cm4gZmlsdGVyUHJvdmlkZXJzKCdjaGVjaycsIGNoZWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3ZpZGVySW5mb0J5TmFtZShuYW1lOiBzdHJpbmcgfCBudWxsKTogSVByb3ZpZGVySW5mbyB7XG4gIHJldHVybiBmaWx0ZXJQcm92aWRlcnMoJ25hbWUnLCBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3ZpZGVySW5mb0J5SWQoaWQ6IHN0cmluZyB8IG51bGwpOiBJUHJvdmlkZXJJbmZvIHtcbiAgcmV0dXJuIGZpbHRlclByb3ZpZGVycygnaWQnLCBpZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm92aWRlckluZm9CeUNoZWNrKGNoZWNrOiBzdHJpbmcgfCBudWxsKTogSVByb3ZpZGVySW5mbyB7XG4gIHJldHVybiBmaWx0ZXJQcm92aWRlcnMoJ2NoZWNrJywgY2hlY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNb2JpbGUoKTogYm9vbGVhbiB7XG4gIGxldCBtb2JpbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBmdW5jdGlvbiBoYXNUb3VjaEV2ZW50KCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBkb2N1bWVudC5jcmVhdGVFdmVudCgnVG91Y2hFdmVudCcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc01vYmlsZVVzZXJBZ2VudCgpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXBhZHxpcmlzfGtpbmRsZXxBbmRyb2lkfFNpbGt8bGdlIHxtYWVtb3xtaWRwfG1tcHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyAoY2V8cGhvbmUpfHhkYXx4aWluby9pLnRlc3QoXG4gICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnRcbiAgICAgICkgfHxcbiAgICAgIC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3LShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtLXxjZWxsfGNodG18Y2xkY3xjbWQtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8LWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseSgtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmLTV8Zy1tb3xnbygud3xvZCl8Z3IoYWR8dW4pfGhhaWV8aGNpdHxoZC0obXxwfHQpfGhlaS18aGkocHR8dGEpfGhwKCBpfGlwKXxocy1jfGh0KGMoLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGktKDIwfGdvfG1hKXxpMjMwfGlhYyggfC18XFwvKXxpYnJvfGlkZWF8aWcwMXxpa29tfGltMWt8aW5ub3xpcGFxfGlyaXN8amEodHx2KWF8amJyb3xqZW11fGppZ3N8a2RkaXxrZWppfGtndCggfFxcLyl8a2xvbnxrcHQgfGt3Yy18a3lvKGN8ayl8bGUobm98eGkpfGxnKCBnfFxcLyhrfGx8dSl8NTB8NTR8LVthLXddKXxsaWJ3fGx5bnh8bTEtd3xtM2dhfG01MFxcL3xtYSh0ZXx1aXx4byl8bWMoMDF8MjF8Y2EpfG0tY3J8bWUocmN8cmkpfG1pKG84fG9hfHRzKXxtbWVmfG1vKDAxfDAyfGJpfGRlfGRvfHQoLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pLXxvbnx0Znx3Znx3Z3x3dCl8bm9rKDZ8aSl8bnpwaHxvMmltfG9wKHRpfHd2KXxvcmFufG93ZzF8cDgwMHxwYW4oYXxkfHQpfHBkeGd8cGcoMTN8LShbMS04XXxjKSl8cGhpbHxwaXJlfHBsKGF5fHVjKXxwbi0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHQtZ3xxYS1hfHFjKDA3fDEyfDIxfDMyfDYwfC1bMi03XXxpLSl8cXRla3xyMzgwfHI2MDB8cmFrc3xyaW05fHJvKHZlfHpvKXxzNTVcXC98c2EoZ2V8bWF8bW18bXN8bnl8dmEpfHNjKDAxfGgtfG9vfHAtKXxzZGtcXC98c2UoYygtfDB8MSl8NDd8bWN8bmR8cmkpfHNnaC18c2hhcnxzaWUoLXxtKXxzay0wfHNsKDQ1fGlkKXxzbShhbHxhcnxiM3xpdHx0NSl8c28oZnR8bnkpfHNwKDAxfGgtfHYtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsLXx0ZGctfHRlbChpfG0pfHRpbS18dC1tb3x0byhwbHxzaCl8dHMoNzB8LXxtM3xtNSl8dHgtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118LXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhcy18eW91cnx6ZXRvfHp0ZS0vaS50ZXN0KFxuICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50LnN1YnN0cigwLCA0KVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChoYXNUb3VjaEV2ZW50KCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBtb2JpbGUgPSBoYXNNb2JpbGVVc2VyQWdlbnQoKTtcblxuICByZXR1cm4gbW9iaWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvdmlkZXJEZXNjcmlwdGlvbihcbiAgcHJvdmlkZXJJbmZvOiBQYXJ0aWFsPElQcm92aWRlckluZm8+XG4pOiBzdHJpbmcge1xuICBpZiAocHJvdmlkZXJJbmZvLmRlc2NyaXB0aW9uKSB7XG4gICAgcmV0dXJuIHByb3ZpZGVySW5mby5kZXNjcmlwdGlvbjtcbiAgfVxuICBsZXQgZGVzY3JpcHRpb24gPSAnJztcbiAgc3dpdGNoIChwcm92aWRlckluZm8udHlwZSkge1xuICAgIGNhc2UgJ2luamVjdGVkJzpcbiAgICAgIGRlc2NyaXB0aW9uID0gYENvbm5lY3QgdG8geW91ciAke3Byb3ZpZGVySW5mby5uYW1lfSBXYWxsZXRgO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnd2ViJzpcbiAgICAgIGRlc2NyaXB0aW9uID0gYENvbm5lY3Qgd2l0aCB5b3VyICR7cHJvdmlkZXJJbmZvLm5hbWV9IGFjY291bnRgO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncXJjb2RlJzpcbiAgICAgIGRlc2NyaXB0aW9uID0gYFNjYW4gd2l0aCAke3Byb3ZpZGVySW5mby5uYW1lfSB0byBjb25uZWN0YDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2hhcmR3YXJlJzpcbiAgICAgIGRlc2NyaXB0aW9uID0gYENvbm5lY3QgdG8geW91ciAke3Byb3ZpZGVySW5mby5uYW1lfSBIYXJkd2FyZSBXYWxsZXRgO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBkZXNjcmlwdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlck1hdGNoZXM8VD4oXG4gIGFycmF5OiBUW10sXG4gIGNvbmRpdGlvbjogKHg6IFQpID0+IGJvb2xlYW4sXG4gIGZhbGxiYWNrOiBUIHwgdW5kZWZpbmVkXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgbGV0IHJlc3VsdCA9IGZhbGxiYWNrO1xuICBjb25zdCBtYXRjaGVzID0gYXJyYXkuZmlsdGVyKGNvbmRpdGlvbik7XG5cbiAgaWYgKCEhbWF0Y2hlcyAmJiBtYXRjaGVzLmxlbmd0aCkge1xuICAgIHJlc3VsdCA9IG1hdGNoZXNbMF07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyUHJvdmlkZXJzKFxuICBwYXJhbTogc3RyaW5nLFxuICB2YWx1ZTogc3RyaW5nIHwgbnVsbFxuKTogSVByb3ZpZGVySW5mbyB7XG4gIGlmICghdmFsdWUpIHJldHVybiBwcm92aWRlcnMuRkFMTEJBQ0s7XG4gIGNvbnN0IG1hdGNoID0gZmlsdGVyTWF0Y2hlczxJUHJvdmlkZXJJbmZvPihcbiAgICBPYmplY3QudmFsdWVzKHByb3ZpZGVycyksXG4gICAgeCA9PiB4W3BhcmFtXSA9PT0gdmFsdWUsXG4gICAgcHJvdmlkZXJzLkZBTExCQUNLXG4gICk7XG4gIHJldHVybiBtYXRjaCB8fCBwcm92aWRlcnMuRkFMTEJBQ0s7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJQcm92aWRlckNoZWNrcyhjaGVja3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKCEhY2hlY2tzICYmIGNoZWNrcy5sZW5ndGgpIHtcbiAgICBpZiAoY2hlY2tzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY2hlY2tzWzBdID09PSBpbmplY3RlZC5NRVRBTUFTSy5jaGVjayB8fFxuICAgICAgICBjaGVja3NbMF0gPT09IGluamVjdGVkLkNJUEhFUi5jaGVja1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBjaGVja3NbMV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGVja3NbMF07XG4gIH1cbiAgcmV0dXJuIHByb3ZpZGVycy5GQUxMQkFDSy5jaGVjaztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENoYWluSWQobmV0d29yazogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgY2hhaW5zOiBDaGFpbkRhdGFbXSA9IE9iamVjdC52YWx1ZXMoQ0hBSU5fREFUQV9MSVNUKTtcbiAgY29uc3QgbWF0Y2ggPSBmaWx0ZXJNYXRjaGVzPENoYWluRGF0YT4oXG4gICAgY2hhaW5zLFxuICAgIHggPT4geC5uZXR3b3JrID09PSBuZXR3b3JrLFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBjaGFpbklkIGZvdW5kIG1hdGNoICR7bmV0d29ya31gKTtcbiAgfVxuICByZXR1cm4gbWF0Y2guY2hhaW5JZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRNYXRjaGluZ1JlcXVpcmVkT3B0aW9ucyhcbiAgcmVxdWlyZWRPcHRpb25zOiBSZXF1aXJlZE9wdGlvbltdLFxuICBwcm92aWRlZE9wdGlvbnM6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbik6IFJlcXVpcmVkT3B0aW9uW10ge1xuICBjb25zdCBtYXRjaGVzID0gcmVxdWlyZWRPcHRpb25zLmZpbHRlcihyZXF1aXJlZE9wdGlvbiA9PiB7XG4gICAgaWYgKHR5cGVvZiByZXF1aXJlZE9wdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiByZXF1aXJlZE9wdGlvbiBpbiBwcm92aWRlZE9wdGlvbnM7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZXMgPSBmaW5kTWF0Y2hpbmdSZXF1aXJlZE9wdGlvbnMoXG4gICAgICByZXF1aXJlZE9wdGlvbixcbiAgICAgIHByb3ZpZGVkT3B0aW9uc1xuICAgICk7XG4gICAgcmV0dXJuIG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGg7XG4gIH0pO1xuICByZXR1cm4gbWF0Y2hlcztcbn1cbiJdfQ==