scope ipToCountry2020. sS #dataSnippetID = #1400400; static Lock #lock = lock(); static File #dataDir() { ret javaxCachesDir("ipToCountry2020"); } sS ipToCountry2020(S ip) null on exception { ret ipToCountry2020(ipToInt(ip)); } sS ipToCountry2020(long ipNum) null on exception { { lock lock; if (directoryEmpty(dataDir())) unzipSnippet(dataSnippetID, dataDir()); } S line = pairB(binarySearchForLineInTextFile(newFile(dataDir(), "IP2LOCATION-LITE-DB1.CSV"), s -> { long a = parseFirstLong(s), b = parseSecondLong(s); ifdef ipToCountry2020_debug printVars_str("ipToCountry2020: ", +a, +b, +ipNum); endifdef ret ipNum > b ? 1 : ipNum < a ? -1 : 0; })); ret get(tok_splitAtComma_unquote(line), 2); }