source.js 146 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573
  1. const sVERSION = '1.0.5',
  2. sCFGFV = '1.0.5',
  3. args = process.argv,
  4. fs = require('fs'),
  5. rle = require('readline'),
  6. dns = require('dns'),
  7. confFile = require('os').homedir() + '/.cfdomains_conf';
  8. const {
  9. Curl,
  10. CurlHttpVersion
  11. } = require('node-libcurl');
  12. const alnum = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
  13. const cur1 = new Curl();
  14. cur1.setOpt('SSL_VERIFYPEER', false);
  15. cur1.setOpt('HTTP_VERSION', CurlHttpVersion.V2PriorKnowledge);
  16. cur1.setOpt('FOLLOWLOCATION', true);
  17. cur1.setOpt('CONNECTTIMEOUT', 9);
  18. cur1.setOpt('TIMEOUT', 660);
  19. let junk, myConfig = {};
  20. function saveConf(k = 'cf', v = sCFGFV) {
  21. myConfig[k] = v;
  22. fs.writeFileSync(confFile, JSON.stringify(myConfig));
  23. }
  24. if (fs.existsSync(confFile)) {
  25. junk = fs.readFileSync(confFile);
  26. if (junk.indexOf('{') === 0) {
  27. junk = JSON.parse(junk);
  28. myConfig['cf'] = junk['cf'];
  29. myConfig['save'] = junk['save'] || './cfdomains_Data/';
  30. myConfig['proxy'] = junk['proxy'] || '';
  31. myConfig['dnsip'] = junk['dnsip'] || '';
  32. myConfig['helper'] = junk['helper'] || '';
  33. } else {
  34. try {
  35. fs.unlinkSync(confFile);
  36. } catch (e) {}
  37. }
  38. }
  39. function forceExit(m) {
  40. console.log('\x1b[31m%s\x1b[0m', m);
  41. process.exit();
  42. }
  43. function sayExit(m) {
  44. process.stdout.write(m);
  45. process.exit();
  46. }
  47. function is_domain(x) {
  48. return (/^([a-z0-9]{1})([a-z0-9.-]{0,254})\.(([a-z]{2,50})|xn--([a-z0-9-]{2,60}))$/.test(x) && !/\.onion$/.test(x)) ? true : false;
  49. }
  50. function get_realdomain(w) {
  51. let wa = w.split('.');
  52. let wa_l = wa.length;
  53. if (wa_l < 3 || (wa_l == 4 && /^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/.test(w))) {
  54. return w;
  55. }
  56. wa.reverse();
  57. switch (wa[0]) {
  58. case 'ac':
  59. if (['com', 'edu', 'gov', 'mil', 'net', 'org'].includes(wa[1])) {
  60. return wa[2] + '.' + wa[1] + '.' + wa[0];
  61. }
  62. break;
  63. case 'ad':
  64. if (['gov', 'nom'].includes(wa[1])) {
  65. return wa[2] + '.' + wa[1] + '.' + wa[0];
  66. }
  67. break;
  68. case 'ae':
  69. if (['ac', 'co', 'gov', 'mil', 'net', 'org', 'sch'].includes(wa[1])) {
  70. return wa[2] + '.' + wa[1] + '.' + wa[0];
  71. }
  72. break;
  73. case 'aero':
  74. if (['accident-investigation', 'accident-prevention', 'aerobatic', 'aeroclub', 'aerodrome', 'agents', 'air-surveillance', 'air-traffic-control', 'aircraft', 'airline', 'airport', 'airtraffic', 'ambulance', 'amusement', 'association', 'author', 'ballooning', 'broker', 'caa', 'cargo', 'catering', 'certification', 'championship', 'charter', 'civilaviation', 'club', 'conference', 'consultant', 'consulting', 'control', 'council', 'crew', 'design', 'dgca', 'educator', 'emergency', 'engine', 'engineer', 'entertainment', 'equipment', 'exchange', 'express', 'federation', 'flight', 'freight', 'fuel', 'gliding', 'government', 'groundhandling', 'group', 'hanggliding', 'homebuilt', 'insurance', 'journal', 'journalist', 'leasing', 'logistics', 'magazine', 'maintenance', 'media', 'microlight', 'modelling', 'navigation', 'parachuting', 'paragliding', 'passenger-association', 'pilot', 'press', 'production', 'recreation', 'repbody', 'res', 'research', 'rotorcraft', 'safety', 'scientist', 'services', 'show', 'skydiving', 'software', 'student', 'trader', 'trading', 'trainer', 'union', 'workinggroup', 'works'].includes(wa[1])) {
  75. return wa[2] + '.' + wa[1] + '.' + wa[0];
  76. }
  77. break;
  78. case 'af':
  79. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  80. return wa[2] + '.' + wa[1] + '.' + wa[0];
  81. }
  82. break;
  83. case 'ag':
  84. if (['co', 'com', 'edu', 'gov', 'net', 'nom', 'org'].includes(wa[1])) {
  85. return wa[2] + '.' + wa[1] + '.' + wa[0];
  86. }
  87. break;
  88. case 'ai':
  89. if (['com', 'gov', 'net', 'off', 'org'].includes(wa[1])) {
  90. return wa[2] + '.' + wa[1] + '.' + wa[0];
  91. }
  92. break;
  93. case 'al':
  94. if (['com', 'edu', 'gov', 'mil', 'net', 'org'].includes(wa[1])) {
  95. return wa[2] + '.' + wa[1] + '.' + wa[0];
  96. }
  97. break;
  98. case 'am':
  99. if (['co', 'com', 'commune', 'gov', 'net', 'org'].includes(wa[1])) {
  100. return wa[2] + '.' + wa[1] + '.' + wa[0];
  101. }
  102. break;
  103. case 'ao':
  104. if (['co', 'ed', 'gov', 'gv', 'it', 'og', 'pb'].includes(wa[1])) {
  105. return wa[2] + '.' + wa[1] + '.' + wa[0];
  106. }
  107. break;
  108. case 'ar':
  109. if (['bet', 'com', 'coop', 'edu', 'gob', 'gov', 'int', 'mil', 'musica', 'mutual', 'net', 'org', 'senasa', 'tur'].includes(wa[1])) {
  110. return wa[2] + '.' + wa[1] + '.' + wa[0];
  111. }
  112. break;
  113. case 'as':
  114. if (wa[1] == 'gov') {
  115. return wa[2] + '.' + wa[1] + '.' + wa[0];
  116. }
  117. break;
  118. case 'at':
  119. if (wa[1] == 'ac' && wa[3] != undefined) {
  120. if (wa[2] == 'sth') {
  121. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  122. }
  123. }
  124. if (['ac', 'co', 'gv', 'or', 'priv'].includes(wa[1])) {
  125. return wa[2] + '.' + wa[1] + '.' + wa[0];
  126. }
  127. break;
  128. case 'au':
  129. if (wa[1] == 'gov' && wa[3] != undefined) {
  130. if (['act', 'nsw', 'nt', 'qld', 'sa', 'tas', 'vic', 'wa'].includes(wa[2])) {
  131. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  132. }
  133. }
  134. if (wa[1] == 'edu' && wa[3] != undefined) {
  135. if (['act', 'catholic', 'eq', 'nsw', 'nt', 'qld', 'sa', 'tas', 'vic', 'wa'].includes(wa[2])) {
  136. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  137. }
  138. }
  139. if (['act', 'asn', 'com', 'conf', 'csiro', 'edu', 'gov', 'id', 'info', 'net', 'nsw', 'nt', 'org', 'oz', 'qld', 'sa', 'tas', 'vic', 'wa'].includes(wa[1])) {
  140. return wa[2] + '.' + wa[1] + '.' + wa[0];
  141. }
  142. break;
  143. case 'aw':
  144. if (['com', 'gov'].includes(wa[1])) {
  145. return wa[2] + '.' + wa[1] + '.' + wa[0];
  146. }
  147. break;
  148. case 'ax':
  149. if (wa[1] == 'gov') {
  150. return wa[2] + '.' + wa[1] + '.' + wa[0];
  151. }
  152. break;
  153. case 'az':
  154. if (['biz', 'com', 'edu', 'gov', 'info', 'int', 'mil', 'name', 'net', 'org', 'pp', 'pro'].includes(wa[1])) {
  155. return wa[2] + '.' + wa[1] + '.' + wa[0];
  156. }
  157. break;
  158. case 'ba':
  159. if (['co', 'com', 'edu', 'gov', 'mil', 'net', 'org', 'rs'].includes(wa[1])) {
  160. return wa[2] + '.' + wa[1] + '.' + wa[0];
  161. }
  162. break;
  163. case 'bb':
  164. if (['biz', 'co', 'com', 'edu', 'gov', 'info', 'net', 'org', 'store', 'tv'].includes(wa[1])) {
  165. return wa[2] + '.' + wa[1] + '.' + wa[0];
  166. }
  167. break;
  168. case 'bd':
  169. if (wa[1] == 'org' && wa[3] != undefined) {
  170. if (wa[2] == 'judiciary') {
  171. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  172. }
  173. }
  174. if (['ac', 'co', 'com', 'edu', 'gov', 'info', 'mil', 'net', 'org', 'sw', 'tv'].includes(wa[1])) {
  175. return wa[2] + '.' + wa[1] + '.' + wa[0];
  176. }
  177. break;
  178. case 'be':
  179. if (['ac', 'gov'].includes(wa[1])) {
  180. return wa[2] + '.' + wa[1] + '.' + wa[0];
  181. }
  182. break;
  183. case 'bf':
  184. if (wa[1] == 'gov') {
  185. return wa[2] + '.' + wa[1] + '.' + wa[0];
  186. }
  187. break;
  188. case 'bg':
  189. if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'gov', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'].includes(wa[1])) {
  190. return wa[2] + '.' + wa[1] + '.' + wa[0];
  191. }
  192. break;
  193. case 'bh':
  194. if (['biz', 'cc', 'com', 'edu', 'gov', 'info', 'net', 'org'].includes(wa[1])) {
  195. return wa[2] + '.' + wa[1] + '.' + wa[0];
  196. }
  197. break;
  198. case 'bi':
  199. if (['ac', 'co', 'com', 'edu', 'gouv', 'gov', 'info', 'int', 'mil', 'net', 'or', 'org'].includes(wa[1])) {
  200. return wa[2] + '.' + wa[1] + '.' + wa[0];
  201. }
  202. break;
  203. case 'bj':
  204. if (['asso', 'barreau', 'gouv'].includes(wa[1])) {
  205. return wa[2] + '.' + wa[1] + '.' + wa[0];
  206. }
  207. break;
  208. case 'bm':
  209. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  210. return wa[2] + '.' + wa[1] + '.' + wa[0];
  211. }
  212. break;
  213. case 'bn':
  214. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  215. return wa[2] + '.' + wa[1] + '.' + wa[0];
  216. }
  217. break;
  218. case 'bo':
  219. if (['academia', 'agro', 'arte', 'blog', 'bolivia', 'ciencia', 'com', 'cooperativa', 'democracia', 'deporte', 'ecologia', 'economia', 'edu', 'empresa', 'gob', 'gov', 'indigena', 'industria', 'info', 'int', 'medicina', 'mil', 'movimiento', 'musica', 'natural', 'net', 'nombre', 'noticias', 'org', 'patria', 'plurinacional', 'politica', 'profesional', 'pueblo', 'revista', 'salud', 'tecnologia', 'tksat', 'transporte', 'tv', 'web', 'wiki'].includes(wa[1])) {
  220. return wa[2] + '.' + wa[1] + '.' + wa[0];
  221. }
  222. break;
  223. case 'br':
  224. if (wa[1] == 'gov' && wa[3] != undefined) {
  225. if (['ac', 'al', 'am', 'ap', 'ba', 'ce', 'df', 'es', 'go', 'ma', 'mg', 'ms', 'mt', 'pa', 'pb', 'pe', 'pi', 'pr', 'rj', 'rn', 'ro', 'rr', 'rs', 'sc', 'se', 'sp', 'to'].includes(wa[2])) {
  226. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  227. }
  228. }
  229. if (['9guacu', 'abc', 'adm', 'adv', 'agr', 'aju', 'am', 'anani', 'aparecida', 'app', 'arq', 'art', 'ato', 'b', 'barueri', 'belem', 'bhz', 'bib', 'bio', 'blog', 'bmd', 'boavista', 'bsb', 'campinagrande', 'campinas', 'caxias', 'cim', 'cng', 'cnt', 'com', 'contagem', 'coop', 'coz', 'cri', 'cuiaba', 'curitiba', 'def', 'des', 'det', 'dev', 'ecn', 'eco', 'edu', 'emp', 'enf', 'eng', 'esp', 'etc', 'eti', 'far', 'feira', 'flog', 'floripa', 'fm', 'fnd', 'fortal', 'fot', 'foz', 'fst', 'g12', 'geo', 'ggf', 'goiania', 'gov', 'gru', 'imb', 'ind', 'inf', 'jab', 'jampa', 'jdf', 'joinville', 'jor', 'jus', 'leg', 'lel', 'log', 'londrina', 'macapa', 'maceio', 'manaus', 'maringa', 'mat', 'med', 'mil', 'morena', 'mp', 'mus', 'natal', 'net', 'niteroi', 'nom', 'not', 'ntr', 'odo', 'ong', 'org', 'osasco', 'palmas', 'poa', 'ppg', 'pro', 'psc', 'psi', 'pvh', 'qsl', 'radio', 'rec', 'recife', 'rep', 'ribeirao', 'rio', 'riobranco', 'riopreto', 'salvador', 'sampa', 'santamaria', 'santoandre', 'saobernardo', 'saogonca', 'seg', 'sjc', 'slg', 'slz', 'sorocaba', 'srv', 'taxi', 'tc', 'tec', 'teo', 'the', 'tmp', 'trd', 'tur', 'tv', 'udi', 'vet', 'vix', 'vlog', 'wiki', 'zlg'].includes(wa[1])) {
  230. return wa[2] + '.' + wa[1] + '.' + wa[0];
  231. }
  232. break;
  233. case 'bs':
  234. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  235. return wa[2] + '.' + wa[1] + '.' + wa[0];
  236. }
  237. break;
  238. case 'bt':
  239. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  240. return wa[2] + '.' + wa[1] + '.' + wa[0];
  241. }
  242. break;
  243. case 'bw':
  244. if (['ac', 'co', 'gov', 'net', 'org'].includes(wa[1])) {
  245. return wa[2] + '.' + wa[1] + '.' + wa[0];
  246. }
  247. break;
  248. case 'by':
  249. if (['com', 'gov', 'mil', 'of'].includes(wa[1])) {
  250. return wa[2] + '.' + wa[1] + '.' + wa[0];
  251. }
  252. break;
  253. case 'bz':
  254. if (['com', 'edu', 'gov', 'mil', 'net', 'nym', 'of', 'org', 'za'].includes(wa[1])) {
  255. return wa[2] + '.' + wa[1] + '.' + wa[0];
  256. }
  257. break;
  258. case 'ca':
  259. if (wa[1] == 'qc' && wa[3] != undefined) {
  260. if (wa[2] == 'gouv') {
  261. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  262. }
  263. }
  264. if (wa[1] == 'pe' && wa[3] != undefined) {
  265. if (wa[2] == 'gouv') {
  266. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  267. }
  268. }
  269. if (wa[1] == 'on' && wa[3] != undefined) {
  270. if (wa[2] == 'gouv') {
  271. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  272. }
  273. }
  274. if (['ab', 'bc', 'gc', 'gnb', 'mb', 'nb', 'nf', 'nl', 'ns', 'nt', 'nu', 'on', 'pe', 'qc', 'sk', 'yk'].includes(wa[1])) {
  275. return wa[2] + '.' + wa[1] + '.' + wa[0];
  276. }
  277. break;
  278. case 'cd':
  279. if (wa[1] == 'gov') {
  280. return wa[2] + '.' + wa[1] + '.' + wa[0];
  281. }
  282. break;
  283. case 'ch':
  284. if (wa[1] == 'admin') {
  285. return wa[2] + '.' + wa[1] + '.' + wa[0];
  286. }
  287. break;
  288. case 'ci':
  289. if (['ac', 'asso', 'co', 'com', 'ed', 'edu', 'go', 'gouv', 'int', 'md', 'net', 'or', 'org', 'presse', 'xn--aroport-bya'].includes(wa[1])) {
  290. return wa[2] + '.' + wa[1] + '.' + wa[0];
  291. }
  292. break;
  293. case 'ck':
  294. if (['biz', 'co', 'edu', 'gen', 'gov', 'info', 'net', 'org'].includes(wa[1])) {
  295. return wa[2] + '.' + wa[1] + '.' + wa[0];
  296. }
  297. break;
  298. case 'cl':
  299. if (['co', 'gob', 'gov', 'mil'].includes(wa[1])) {
  300. return wa[2] + '.' + wa[1] + '.' + wa[0];
  301. }
  302. break;
  303. case 'cm':
  304. if (['co', 'com', 'gov', 'net'].includes(wa[1])) {
  305. return wa[2] + '.' + wa[1] + '.' + wa[0];
  306. }
  307. break;
  308. case 'cn':
  309. if (['ac', 'ah', 'bj', 'com', 'cq', 'edu', 'fj', 'gd', 'gov', 'gs', 'gx', 'gz', 'ha', 'hb', 'he', 'hi', 'hk', 'hl', 'hn', 'jl', 'js', 'jx', 'ln', 'mil', 'mo', 'net', 'nm', 'nx', 'org', 'qh', 'sc', 'sd', 'sh', 'sn', 'sx', 'tj', 'tw', 'xj', 'xn--55qx5d', 'xn--io0a7i', 'xn--od0alg', 'xz', 'yn', 'zj'].includes(wa[1])) {
  310. return wa[2] + '.' + wa[1] + '.' + wa[0];
  311. }
  312. break;
  313. case 'co':
  314. if (['arts', 'com', 'edu', 'firm', 'gov', 'info', 'int', 'mil', 'net', 'nom', 'org', 'rec', 'web'].includes(wa[1])) {
  315. return wa[2] + '.' + wa[1] + '.' + wa[0];
  316. }
  317. break;
  318. case 'com':
  319. if (['africa', 'ar', 'br', 'cn', 'co', 'de', 'eu', 'gb', 'gr', 'hu', 'jpn', 'kr', 'mex', 'no', 'qc', 'ru', 'sa', 'se', 'uk', 'us', 'uy', 'za'].includes(wa[1])) {
  320. return wa[2] + '.' + wa[1] + '.' + wa[0];
  321. }
  322. break;
  323. case 'cr':
  324. if (['ac', 'co', 'ed', 'fi', 'go', 'or', 'sa'].includes(wa[1])) {
  325. return wa[2] + '.' + wa[1] + '.' + wa[0];
  326. }
  327. break;
  328. case 'cu':
  329. if (['com', 'edu', 'gov', 'inf', 'net', 'org'].includes(wa[1])) {
  330. return wa[2] + '.' + wa[1] + '.' + wa[0];
  331. }
  332. break;
  333. case 'cv':
  334. if (['com', 'edu', 'gov', 'int', 'net', 'nome', 'org', 'publ'].includes(wa[1])) {
  335. return wa[2] + '.' + wa[1] + '.' + wa[0];
  336. }
  337. break;
  338. case 'cw':
  339. if (['com', 'edu', 'net', 'org'].includes(wa[1])) {
  340. return wa[2] + '.' + wa[1] + '.' + wa[0];
  341. }
  342. break;
  343. case 'cx':
  344. if (wa[1] == 'gov') {
  345. return wa[2] + '.' + wa[1] + '.' + wa[0];
  346. }
  347. break;
  348. case 'cy':
  349. if (['ac', 'biz', 'com', 'ekloges', 'gov', 'ltd', 'mil', 'name', 'net', 'org', 'parliament', 'press', 'pro', 'tm'].includes(wa[1])) {
  350. return wa[2] + '.' + wa[1] + '.' + wa[0];
  351. }
  352. break;
  353. case 'cz':
  354. if (wa[1] == 'gov') {
  355. return wa[2] + '.' + wa[1] + '.' + wa[0];
  356. }
  357. break;
  358. case 'dm':
  359. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  360. return wa[2] + '.' + wa[1] + '.' + wa[0];
  361. }
  362. break;
  363. case 'do':
  364. if (['art', 'com', 'edu', 'gob', 'gov', 'mil', 'net', 'org', 'sld', 'web'].includes(wa[1])) {
  365. return wa[2] + '.' + wa[1] + '.' + wa[0];
  366. }
  367. break;
  368. case 'dz':
  369. if (['art', 'asso', 'com', 'edu', 'gov', 'net', 'org', 'pol', 'soc', 'tm'].includes(wa[1])) {
  370. return wa[2] + '.' + wa[1] + '.' + wa[0];
  371. }
  372. break;
  373. case 'ec':
  374. if (['com', 'edu', 'fin', 'gob', 'gov', 'info', 'k12', 'med', 'mil', 'net', 'org', 'pro'].includes(wa[1])) {
  375. return wa[2] + '.' + wa[1] + '.' + wa[0];
  376. }
  377. break;
  378. case 'ee':
  379. if (['aip', 'com', 'edu', 'fie', 'gov', 'lib', 'med', 'org', 'pri', 'riik'].includes(wa[1])) {
  380. return wa[2] + '.' + wa[1] + '.' + wa[0];
  381. }
  382. break;
  383. case 'eg':
  384. if (['com', 'edu', 'eun', 'gov', 'mil', 'name', 'net', 'org', 'sci'].includes(wa[1])) {
  385. return wa[2] + '.' + wa[1] + '.' + wa[0];
  386. }
  387. break;
  388. case 'es':
  389. if (['com', 'edu', 'gob', 'nom', 'org'].includes(wa[1])) {
  390. return wa[2] + '.' + wa[1] + '.' + wa[0];
  391. }
  392. break;
  393. case 'et':
  394. if (['biz', 'com', 'edu', 'gov', 'info', 'name', 'net', 'org'].includes(wa[1])) {
  395. return wa[2] + '.' + wa[1] + '.' + wa[0];
  396. }
  397. break;
  398. case 'fi':
  399. if (['aland', 'gov'].includes(wa[1])) {
  400. return wa[2] + '.' + wa[1] + '.' + wa[0];
  401. }
  402. break;
  403. case 'fj':
  404. if (['ac', 'biz', 'com', 'gov', 'info', 'mil', 'name', 'net', 'org', 'pro'].includes(wa[1])) {
  405. return wa[2] + '.' + wa[1] + '.' + wa[0];
  406. }
  407. break;
  408. case 'fk':
  409. if (['ac', 'co', 'gov', 'net', 'nom', 'org'].includes(wa[1])) {
  410. return wa[2] + '.' + wa[1] + '.' + wa[0];
  411. }
  412. break;
  413. case 'fm':
  414. if (['com', 'edu', 'net', 'org'].includes(wa[1])) {
  415. return wa[2] + '.' + wa[1] + '.' + wa[0];
  416. }
  417. break;
  418. case 'fr':
  419. if (['abr', 'abruzzo', 'aeroport', 'ag', 'agrigento', 'al', 'alessandria', 'alto-adige', 'altoadige', 'an', 'ancona', 'andria-barletta-trani', 'andria-trani-barletta', 'andriabarlettatrani', 'andriatranibarletta', 'ao', 'aosta', 'aosta-valley', 'aostavalley', 'aoste', 'ap', 'aq', 'aquila', 'ar', 'arezzo', 'ascoli-piceno', 'ascolipiceno', 'assedic', 'asso', 'asti', 'at', 'av', 'avellino', 'avocat', 'avoues', 'ba', 'balsan', 'balsan-sudtirol', 'balsan-suedtirol', 'bari', 'barletta-trani-andria', 'barlettatraniandria', 'bas', 'basilicata', 'belluno', 'benevento', 'bergamo', 'bg', 'bi', 'biella', 'bl', 'bn', 'bo', 'bologna', 'bolzano', 'bolzano-altoadige', 'bozen', 'bozen-sudtirol', 'bozen-suedtirol', 'br', 'brescia', 'brindisi', 'bs', 'bt', 'bulsan', 'bulsan-sudtirol', 'bulsan-suedtirol', 'bz', 'ca', 'cagliari', 'cal', 'calabria', 'caltanissetta', 'cam', 'campania', 'campidano-medio', 'campidanomedio', 'campobasso', 'carbonia-iglesias', 'carboniaiglesias', 'carrara-massa', 'carraramassa', 'caserta', 'catania', 'catanzaro', 'cb', 'cci', 'ce', 'cesena-forli', 'cesenaforli', 'ch', 'chambagri', 'chieti', 'chirurgiens-dentistes', 'ci', 'cl', 'cn', 'co', 'com', 'como', 'cosenza', 'cr', 'cremona', 'crotone', 'cs', 'ct', 'cuneo', 'cz', 'dell-ogliastra', 'dellogliastra', 'edu', 'emilia-romagna', 'emiliaromagna', 'emr', 'en', 'enna', 'experts-comptables', 'fc', 'fe', 'fermo', 'ferrara', 'fg', 'fi', 'firenze', 'florence', 'fm', 'foggia', 'forli-cesena', 'forlicesena', 'fr', 'friuli-v-giulia', 'friuli-ve-giulia', 'friuli-vegiulia', 'friuli-venezia-giulia', 'friuli-veneziagiulia', 'friuli-vgiulia', 'friuliv-giulia', 'friulive-giulia', 'friulivegiulia', 'friulivenezia-giulia', 'friuliveneziagiulia', 'friulivgiulia', 'frosinone', 'fvg', 'ge', 'genoa', 'genova', 'geometre-expert', 'go', 'gorizia', 'gouv', 'gov', 'gr', 'greta', 'grosseto', 'huissier-justice', 'iglesias-carbonia', 'iglesiascarbonia', 'im', 'imperia', 'is', 'isernia', 'kr', 'la-spezia', 'laquila', 'laspezia', 'latina', 'laz', 'lazio', 'lc', 'le', 'lecce', 'lecco', 'li', 'lig', 'liguria', 'livorno', 'lo', 'lodi', 'lom', 'lombardia', 'lombardy', 'lt', 'lu', 'lucania', 'lucca', 'macerata', 'mantova', 'mar', 'marche', 'massa-carrara', 'massacarrara', 'matera', 'mb', 'mc', 'me', 'medecin', 'medio-campidano', 'mediocampidano', 'messina', 'mi', 'milan', 'milano', 'mn', 'mo', 'modena', 'mol', 'molise', 'monza', 'monza-brianza', 'monza-e-della-brianza', 'monzabrianza', 'monzaebrianza', 'monzaedellabrianza', 'ms', 'mt', 'na', 'naples', 'napoli', 'no', 'nom', 'notaires', 'novara', 'nu', 'nuoro', 'og', 'ogliastra', 'olbia-tempio', 'olbiatempio', 'or', 'oristano', 'ot', 'pa', 'padova', 'padua', 'palermo', 'parma', 'pavia', 'pc', 'pd', 'pe', 'perugia', 'pesaro-urbino', 'pesarourbino', 'pescara', 'pg', 'pharmacien', 'pi', 'piacenza', 'piedmont', 'piemonte', 'pisa', 'pistoia', 'pmn', 'pn', 'po', 'pordenone', 'port', 'potenza', 'pr', 'prato', 'prd', 'presse', 'pt', 'pu', 'pug', 'puglia', 'pv', 'pz', 'ra', 'ragusa', 'ravenna', 'rc', 're', 'reggio-calabria', 'reggio-emilia', 'reggiocalabria', 'reggioemilia', 'rg', 'ri', 'rieti', 'rimini', 'rm', 'rn', 'ro', 'roma', 'rome', 'rovigo', 'sa', 'salerno', 'sar', 'sardegna', 'sardinia', 'sassari', 'savona', 'si', 'sic', 'sicilia', 'sicily', 'siena', 'siracusa', 'so', 'sondrio', 'sp', 'sr', 'ss', 'suedtirol', 'sv', 'ta', 'taa', 'taranto', 'te', 'tempio-olbia', 'tempioolbia', 'teramo', 'terni', 'tm', 'tn', 'to', 'torino', 'tos', 'toscana', 'tp', 'tr', 'trani-andria-barletta', 'trani-barletta-andria', 'traniandriabarletta', 'tranibarlettaandria', 'trapani', 'trentin-sud-tirol', 'trentin-sudtirol', 'trentin-sued-tirol', 'trentin-suedtirol', 'trentino', 'trentino-a-adige', 'trentino-aadige', 'trentino-alto-adige', 'trentino-altoadige', 'trentino-s-tirol', 'trentino-stirol', 'trentino-sud-tirol', 'trentino-sudtirol', 'trentino-sued-tirol', 'trentino-suedtirol', 'trentinoa-adige', 'trentinoaadige', 'trentinoalto-adige', 'trentinoaltoadige', 'trentinos-tirol', 'trentinostirol', 'trentinosud-tirol', 'trentinosudtirol', 'trentinosued-tirol', 'trentinosuedtirol', 'trentinsud-tirol', 'trentinsudtirol', 'trentinsued-tirol', 'trentinsuedtirol', 'trento', 'treviso', 'trieste', 'ts', 'turin', 'tuscany', 'tv', 'ud', 'udine', 'umb', 'umbria', 'urbino-pesaro', 'urbinopesaro', 'va', 'val-d-aosta', 'val-daosta', 'vald-aosta', 'valdaosta', 'valle-aosta', 'valle-d-aosta', 'valle-daosta', 'valleaosta', 'valled-aosta', 'valledaosta', 'vallee-aoste', 'vallee-d-aoste', 'valleeaoste', 'valleedaoste', 'vao', 'varese', 'vb', 'vc', 'vda', 've', 'ven', 'veneto', 'venezia', 'venice', 'verbania', 'vercelli', 'verona', 'veterinaire', 'vi', 'vibo-valentia', 'vibovalentia', 'vicenza', 'viterbo', 'vr', 'vs', 'vt', 'vv', 'xn--balsan-sdtirol-nsb', 'xn--bozen-sdtirol-2ob', 'xn--bulsan-sdtirol-nsb', 'xn--cesena-forl-mcb', 'xn--cesenaforl-i8a', 'xn--forl-cesena-fcb', 'xn--forlcesena-c8a', 'xn--sdtirol-n2a', 'xn--trentin-sd-tirol-rzb', 'xn--trentin-sdtirol-7vb', 'xn--trentino-sd-tirol-c3b', 'xn--trentino-sdtirol-szb', 'xn--trentinosd-tirol-rzb', 'xn--trentinosdtirol-7vb', 'xn--trentinsd-tirol-6vb', 'xn--trentinsdtirol-nsb', 'xn--valle-aoste-ebb', 'xn--valle-d-aoste-ehb', 'xn--valleaoste-e7a', 'xn--valledaoste-ebb'].includes(wa[1])) {
  420. return wa[2] + '.' + wa[1] + '.' + wa[0];
  421. }
  422. break;
  423. case 'gd':
  424. if (['edu', 'gov'].includes(wa[1])) {
  425. return wa[2] + '.' + wa[1] + '.' + wa[0];
  426. }
  427. break;
  428. case 'ge':
  429. if (['com', 'edu', 'gov', 'mil', 'net', 'org', 'pvt'].includes(wa[1])) {
  430. return wa[2] + '.' + wa[1] + '.' + wa[0];
  431. }
  432. break;
  433. case 'gg':
  434. if (['co', 'gov', 'net', 'org'].includes(wa[1])) {
  435. return wa[2] + '.' + wa[1] + '.' + wa[0];
  436. }
  437. break;
  438. case 'gh':
  439. if (['com', 'edu', 'gov', 'mil', 'org'].includes(wa[1])) {
  440. return wa[2] + '.' + wa[1] + '.' + wa[0];
  441. }
  442. break;
  443. case 'gi':
  444. if (['com', 'edu', 'gov', 'ltd', 'mod', 'org'].includes(wa[1])) {
  445. return wa[2] + '.' + wa[1] + '.' + wa[0];
  446. }
  447. break;
  448. case 'gl':
  449. if (['co', 'com', 'edu', 'net', 'org'].includes(wa[1])) {
  450. return wa[2] + '.' + wa[1] + '.' + wa[0];
  451. }
  452. break;
  453. case 'gn':
  454. if (['ac', 'com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  455. return wa[2] + '.' + wa[1] + '.' + wa[0];
  456. }
  457. break;
  458. case 'gov':
  459. if (['al', 'alabama', 'alaska', 'americansamoa', 'ar', 'arizona', 'arkansas', 'as', 'az', 'ca', 'co', 'colorado', 'ct', 'dc', 'de', 'delaware', 'ehawaii', 'fl', 'florida', 'ga', 'georgia', 'guam', 'hawaii', 'ia', 'idaho', 'il', 'illinois', 'in', 'indiana', 'iowa', 'kansas', 'kentucky', 'ks', 'ky', 'la', 'louisiana', 'ma', 'maine', 'maryland', 'mass', 'massachusetts', 'md', 'mi', 'michigan', 'minnesota', 'mississippi', 'missouri', 'mn', 'mo', 'montana', 'ms', 'mt', 'nc', 'nd', 'ne', 'nebraska', 'nevada', 'newjersey', 'newmexico', 'nh', 'nj', 'northcarolina', 'northdakota', 'nv', 'ny', 'ohio', 'ok', 'oklahoma', 'oregon', 'pa', 'pennsylvania', 'pr', 'rhodeisland', 'ri', 'sc', 'sd', 'tennessee', 'texas', 'tn', 'utah', 'vermont', 'vi', 'virginia', 'vt', 'wa', 'washington', 'wi', 'wisconsin', 'wv', 'wy', 'wyoming'].includes(wa[1])) {
  460. return wa[2] + '.' + wa[1] + '.' + wa[0];
  461. }
  462. break;
  463. case 'gp':
  464. if (['asso', 'com', 'edu', 'mobi', 'net', 'org'].includes(wa[1])) {
  465. return wa[2] + '.' + wa[1] + '.' + wa[0];
  466. }
  467. break;
  468. case 'gr':
  469. if (['co', 'com', 'edu', 'gov', 'mil', 'mod', 'net', 'org', 'sch'].includes(wa[1])) {
  470. return wa[2] + '.' + wa[1] + '.' + wa[0];
  471. }
  472. break;
  473. case 'gt':
  474. if (['com', 'edu', 'gob', 'ind', 'mil', 'net', 'org'].includes(wa[1])) {
  475. return wa[2] + '.' + wa[1] + '.' + wa[0];
  476. }
  477. break;
  478. case 'gu':
  479. if (['com', 'edu', 'gov', 'guam', 'info', 'net', 'org', 'web'].includes(wa[1])) {
  480. return wa[2] + '.' + wa[1] + '.' + wa[0];
  481. }
  482. break;
  483. case 'gy':
  484. if (['co', 'com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  485. return wa[2] + '.' + wa[1] + '.' + wa[0];
  486. }
  487. break;
  488. case 'hk':
  489. if (['com', 'edu', 'gov', 'idv', 'net', 'org', 'xn--55qx5d', 'xn--ciqpn', 'xn--gmq050i', 'xn--gmqw5a', 'xn--io0a7i', 'xn--lcvr32d', 'xn--mk0axi', 'xn--mxtq1m', 'xn--od0alg', 'xn--od0aq3b', 'xn--tn0ag', 'xn--uc0atv', 'xn--uc0ay4a', 'xn--wcvs22d', 'xn--zf0avx'].includes(wa[1])) {
  490. return wa[2] + '.' + wa[1] + '.' + wa[0];
  491. }
  492. break;
  493. case 'hn':
  494. if (['com', 'edu', 'gob', 'mil', 'net', 'org'].includes(wa[1])) {
  495. return wa[2] + '.' + wa[1] + '.' + wa[0];
  496. }
  497. break;
  498. case 'hr':
  499. if (['com', 'from', 'gov', 'iz', 'name'].includes(wa[1])) {
  500. return wa[2] + '.' + wa[1] + '.' + wa[0];
  501. }
  502. break;
  503. case 'ht':
  504. if (['adult', 'art', 'asso', 'com', 'coop', 'edu', 'firm', 'gouv', 'info', 'med', 'net', 'org', 'perso', 'pol', 'pro', 'rel', 'shop'].includes(wa[1])) {
  505. return wa[2] + '.' + wa[1] + '.' + wa[0];
  506. }
  507. break;
  508. case 'hu':
  509. if (['2000', 'agrar', 'bolt', 'casino', 'city', 'co', 'edu', 'erotica', 'erotika', 'film', 'forum', 'games', 'gov', 'hotel', 'info', 'ingatlan', 'jogasz', 'konyvelo', 'lakas', 'media', 'mobi', 'net', 'news', 'org', 'priv', 'reklam', 'sex', 'shop', 'sport', 'suli', 'szex', 'tm', 'tozsde', 'utazas', 'video'].includes(wa[1])) {
  510. return wa[2] + '.' + wa[1] + '.' + wa[0];
  511. }
  512. break;
  513. case 'id':
  514. if (['ac', 'biz', 'co', 'desa', 'go', 'mil', 'my', 'net', 'or', 'ponpes', 'sch', 'web'].includes(wa[1])) {
  515. return wa[2] + '.' + wa[1] + '.' + wa[0];
  516. }
  517. break;
  518. case 'ie':
  519. if (wa[1] == 'gov') {
  520. return wa[2] + '.' + wa[1] + '.' + wa[0];
  521. }
  522. break;
  523. case 'il':
  524. if (['ac', 'co', 'gov', 'idf', 'k12', 'muni', 'net', 'org'].includes(wa[1])) {
  525. return wa[2] + '.' + wa[1] + '.' + wa[0];
  526. }
  527. break;
  528. case 'im':
  529. if (wa[1] == 'co' && wa[3] != undefined) {
  530. if (['ltd', 'plc'].includes(wa[2])) {
  531. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  532. }
  533. }
  534. if (['ac', 'co', 'com', 'gov', 'net', 'org', 'ro', 'tt', 'tv'].includes(wa[1])) {
  535. return wa[2] + '.' + wa[1] + '.' + wa[0];
  536. }
  537. break;
  538. case 'in':
  539. if (['5g', '6g', 'ac', 'ai', 'am', 'bihar', 'biz', 'business', 'ca', 'cn', 'co', 'com', 'coop', 'cs', 'delhi', 'dr', 'edu', 'er', 'ernet', 'firm', 'gen', 'gov', 'gujarat', 'ind', 'info', 'int', 'internet', 'io', 'me', 'mil', 'net', 'nic', 'org', 'pg', 'post', 'pro', 'res', 'travel', 'tv', 'uk', 'up', 'us'].includes(wa[1])) {
  540. return wa[2] + '.' + wa[1] + '.' + wa[0];
  541. }
  542. break;
  543. case 'int':
  544. if (wa[1] == 'eu') {
  545. return wa[2] + '.' + wa[1] + '.' + wa[0];
  546. }
  547. break;
  548. case 'io':
  549. if (wa[1] == 'com') {
  550. return wa[2] + '.' + wa[1] + '.' + wa[0];
  551. }
  552. break;
  553. case 'iq':
  554. if (['com', 'edu', 'gov', 'mil', 'net', 'org'].includes(wa[1])) {
  555. return wa[2] + '.' + wa[1] + '.' + wa[0];
  556. }
  557. break;
  558. case 'ir':
  559. if (['ac', 'co', 'gov', 'id', 'net', 'org', 'sch', 'xn--mgba3a4f16a', 'xn--mgba3a4fra'].includes(wa[1])) {
  560. return wa[2] + '.' + wa[1] + '.' + wa[0];
  561. }
  562. break;
  563. case 'is':
  564. if (['com', 'edu', 'gov', 'int', 'net', 'org'].includes(wa[1])) {
  565. return wa[2] + '.' + wa[1] + '.' + wa[0];
  566. }
  567. break;
  568. case 'it':
  569. if (['abr', 'abruzzo', 'ag', 'agrigento', 'al', 'alessandria', 'alto-adige', 'altoadige', 'an', 'ancona', 'andria-barletta-trani', 'andria-trani-barletta', 'andriabarlettatrani', 'andriatranibarletta', 'ao', 'aosta', 'aosta-valley', 'aostavalley', 'aoste', 'ap', 'aq', 'aquila', 'ar', 'arezzo', 'ascoli-piceno', 'ascolipiceno', 'asti', 'at', 'av', 'avellino', 'ba', 'balsan', 'balsan-sudtirol', 'balsan-suedtirol', 'bari', 'barletta-trani-andria', 'barlettatraniandria', 'bas', 'basilicata', 'belluno', 'benevento', 'bergamo', 'bg', 'bi', 'biella', 'bl', 'bn', 'bo', 'bologna', 'bolzano', 'bolzano-altoadige', 'bozen', 'bozen-sudtirol', 'bozen-suedtirol', 'br', 'brescia', 'brindisi', 'bs', 'bt', 'bulsan', 'bulsan-sudtirol', 'bulsan-suedtirol', 'bz', 'ca', 'cagliari', 'cal', 'calabria', 'caltanissetta', 'cam', 'campania', 'campidano-medio', 'campidanomedio', 'campobasso', 'carbonia-iglesias', 'carboniaiglesias', 'carrara-massa', 'carraramassa', 'caserta', 'catania', 'catanzaro', 'cb', 'ce', 'cesena-forli', 'cesenaforli', 'ch', 'chieti', 'ci', 'cl', 'cn', 'co', 'como', 'cosenza', 'cr', 'cremona', 'crotone', 'cs', 'ct', 'cuneo', 'cz', 'dell-ogliastra', 'dellogliastra', 'edu', 'emilia-romagna', 'emiliaromagna', 'emr', 'en', 'enna', 'fc', 'fe', 'fermo', 'ferrara', 'fg', 'fi', 'firenze', 'florence', 'fm', 'foggia', 'forli-cesena', 'forlicesena', 'fr', 'friuli-v-giulia', 'friuli-ve-giulia', 'friuli-vegiulia', 'friuli-venezia-giulia', 'friuli-veneziagiulia', 'friuli-vgiulia', 'friuliv-giulia', 'friulive-giulia', 'friulivegiulia', 'friulivenezia-giulia', 'friuliveneziagiulia', 'friulivgiulia', 'frosinone', 'fvg', 'ge', 'genoa', 'genova', 'go', 'gorizia', 'gov', 'gr', 'grosseto', 'iglesias-carbonia', 'iglesiascarbonia', 'im', 'imperia', 'is', 'isernia', 'kr', 'la-spezia', 'laquila', 'laspezia', 'latina', 'laz', 'lazio', 'lc', 'le', 'lecce', 'lecco', 'li', 'lig', 'liguria', 'livorno', 'lo', 'lodi', 'lom', 'lombardia', 'lombardy', 'lt', 'lu', 'lucania', 'lucca', 'macerata', 'mantova', 'mar', 'marche', 'massa-carrara', 'massacarrara', 'matera', 'mb', 'mc', 'me', 'medio-campidano', 'mediocampidano', 'messina', 'mi', 'milan', 'milano', 'mn', 'mo', 'modena', 'mol', 'molise', 'monza', 'monza-brianza', 'monza-e-della-brianza', 'monzabrianza', 'monzaebrianza', 'monzaedellabrianza', 'ms', 'mt', 'na', 'naples', 'napoli', 'no', 'novara', 'nu', 'nuoro', 'og', 'ogliastra', 'olbia-tempio', 'olbiatempio', 'or', 'oristano', 'ot', 'pa', 'padova', 'padua', 'palermo', 'parma', 'pavia', 'pc', 'pd', 'pe', 'perugia', 'pesaro-urbino', 'pesarourbino', 'pescara', 'pg', 'pi', 'piacenza', 'piedmont', 'piemonte', 'pisa', 'pistoia', 'pmn', 'pn', 'po', 'pordenone', 'potenza', 'pr', 'prato', 'pt', 'pu', 'pug', 'puglia', 'pv', 'pz', 'ra', 'ragusa', 'ravenna', 'rc', 're', 'reggio-calabria', 'reggio-emilia', 'reggiocalabria', 'reggioemilia', 'rg', 'ri', 'rieti', 'rimini', 'rm', 'rn', 'ro', 'roma', 'rome', 'rovigo', 'sa', 'salerno', 'sar', 'sardegna', 'sardinia', 'sassari', 'savona', 'si', 'sic', 'sicilia', 'sicily', 'siena', 'siracusa', 'so', 'sondrio', 'sp', 'sr', 'ss', 'suedtirol', 'sv', 'ta', 'taa', 'taranto', 'te', 'tempio-olbia', 'tempioolbia', 'teramo', 'terni', 'tn', 'to', 'torino', 'tos', 'toscana', 'tp', 'tr', 'trani-andria-barletta', 'trani-barletta-andria', 'traniandriabarletta', 'tranibarlettaandria', 'trapani', 'trentin-sud-tirol', 'trentin-sudtirol', 'trentin-sued-tirol', 'trentin-suedtirol', 'trentino', 'trentino-a-adige', 'trentino-aadige', 'trentino-alto-adige', 'trentino-altoadige', 'trentino-s-tirol', 'trentino-stirol', 'trentino-sud-tirol', 'trentino-sudtirol', 'trentino-sued-tirol', 'trentino-suedtirol', 'trentinoa-adige', 'trentinoaadige', 'trentinoalto-adige', 'trentinoaltoadige', 'trentinos-tirol', 'trentinostirol', 'trentinosud-tirol', 'trentinosudtirol', 'trentinosued-tirol', 'trentinosuedtirol', 'trentinsud-tirol', 'trentinsudtirol', 'trentinsued-tirol', 'trentinsuedtirol', 'trento', 'treviso', 'trieste', 'ts', 'turin', 'tuscany', 'tv', 'ud', 'udine', 'umb', 'umbria', 'urbino-pesaro', 'urbinopesaro', 'va', 'val-d-aosta', 'val-daosta', 'vald-aosta', 'valdaosta', 'valle-aosta', 'valle-d-aosta', 'valle-daosta', 'valleaosta', 'valled-aosta', 'valledaosta', 'vallee-aoste', 'vallee-d-aoste', 'valleeaoste', 'valleedaoste', 'vao', 'varese', 'vb', 'vc', 'vda', 've', 'ven', 'veneto', 'venezia', 'venice', 'verbania', 'vercelli', 'verona', 'vi', 'vibo-valentia', 'vibovalentia', 'vicenza', 'viterbo', 'vr', 'vs', 'vt', 'vv', 'xn--balsan-sdtirol-nsb', 'xn--bozen-sdtirol-2ob', 'xn--bulsan-sdtirol-nsb', 'xn--cesena-forl-mcb', 'xn--cesenaforl-i8a', 'xn--forl-cesena-fcb', 'xn--forlcesena-c8a', 'xn--sdtirol-n2a', 'xn--trentin-sd-tirol-rzb', 'xn--trentin-sdtirol-7vb', 'xn--trentino-sd-tirol-c3b', 'xn--trentino-sdtirol-szb', 'xn--trentinosd-tirol-rzb', 'xn--trentinosdtirol-7vb', 'xn--trentinsd-tirol-6vb', 'xn--trentinsdtirol-nsb', 'xn--valle-aoste-ebb', 'xn--valle-d-aoste-ehb', 'xn--valleaoste-e7a', 'xn--valledaoste-ebb'].includes(wa[1])) {
  570. return wa[2] + '.' + wa[1] + '.' + wa[0];
  571. }
  572. break;
  573. case 'je':
  574. if (['co', 'gov', 'net', 'org', 'sch'].includes(wa[1])) {
  575. return wa[2] + '.' + wa[1] + '.' + wa[0];
  576. }
  577. break;
  578. case 'jm':
  579. if (['com', 'edu', 'gov', 'mil', 'net', 'org'].includes(wa[1])) {
  580. return wa[2] + '.' + wa[1] + '.' + wa[0];
  581. }
  582. break;
  583. case 'jo':
  584. if (['com', 'edu', 'gov', 'mil', 'name', 'net', 'org', 'sch'].includes(wa[1])) {
  585. return wa[2] + '.' + wa[1] + '.' + wa[0];
  586. }
  587. break;
  588. case 'jp':
  589. if (wa[1] == 'yamanashi' && wa[3] != undefined) {
  590. if (['chuo', 'doshi', 'fuefuki', 'fujikawa', 'fujikawaguchiko', 'fujiyoshida', 'hayakawa', 'hokuto', 'ichikawamisato', 'kai', 'kofu', 'koshu', 'kosuge', 'minami-alps', 'minobu', 'nakamichi', 'nanbu', 'narusawa', 'nirasaki', 'nishikatsura', 'oshino', 'otsuki', 'showa', 'tabayama', 'tsuru', 'uenohara', 'yamanakako', 'yamanashi'].includes(wa[2])) {
  591. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  592. }
  593. }
  594. if (wa[1] == 'yamaguchi' && wa[3] != undefined) {
  595. if (['abu', 'hagi', 'hikari', 'hofu', 'iwakuni', 'kudamatsu', 'mitou', 'nagato', 'oshima', 'shimonoseki', 'shunan', 'tabuse', 'tokuyama', 'toyota', 'ube', 'yuu'].includes(wa[2])) {
  596. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  597. }
  598. }
  599. if (wa[1] == 'yamagata' && wa[3] != undefined) {
  600. if (['asahi', 'funagata', 'higashine', 'iide', 'kahoku', 'kaminoyama', 'kaneyama', 'kawanishi', 'mamurogawa', 'mikawa', 'murayama', 'nagai', 'nakayama', 'nanyo', 'nishikawa', 'obanazawa', 'oe', 'oguni', 'ohkura', 'oishida', 'sagae', 'sakata', 'sakegawa', 'shinjo', 'shirataka', 'shonai', 'takahata', 'tendo', 'tozawa', 'tsuruoka', 'yamagata', 'yamanobe', 'yonezawa', 'yuza'].includes(wa[2])) {
  601. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  602. }
  603. }
  604. if (wa[1] == 'wakayama' && wa[3] != undefined) {
  605. if (['arida', 'aridagawa', 'gobo', 'hashimoto', 'hidaka', 'hirogawa', 'inami', 'iwade', 'kainan', 'kamitonda', 'katsuragi', 'kimino', 'kinokawa', 'kitayama', 'koya', 'koza', 'kozagawa', 'kudoyama', 'kushimoto', 'mihama', 'misato', 'nachikatsuura', 'shingu', 'shirahama', 'taiji', 'tanabe', 'wakayama', 'yuasa', 'yura'].includes(wa[2])) {
  606. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  607. }
  608. }
  609. if (wa[1] == 'toyama' && wa[3] != undefined) {
  610. if (['asahi', 'fuchu', 'fukumitsu', 'funahashi', 'himi', 'imizu', 'inami', 'johana', 'kamiichi', 'kurobe', 'nakaniikawa', 'namerikawa', 'nanto', 'nyuzen', 'oyabe', 'taira', 'takaoka', 'tateyama', 'toga', 'tonami', 'toyama', 'unazuki', 'uozu', 'yamada'].includes(wa[2])) {
  611. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  612. }
  613. }
  614. if (wa[1] == 'tottori' && wa[3] != undefined) {
  615. if (['chizu', 'hino', 'kawahara', 'koge', 'kotoura', 'misasa', 'nanbu', 'nichinan', 'sakaiminato', 'tottori', 'wakasa', 'yazu', 'yonago'].includes(wa[2])) {
  616. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  617. }
  618. }
  619. if (wa[1] == 'tokyo' && wa[3] != undefined) {
  620. if (['adachi', 'akiruno', 'akishima', 'aogashima', 'arakawa', 'bunkyo', 'chiyoda', 'chofu', 'chuo', 'edogawa', 'fuchu', 'fussa', 'hachijo', 'hachioji', 'hamura', 'higashikurume', 'higashimurayama', 'higashiyamato', 'hino', 'hinode', 'hinohara', 'inagi', 'itabashi', 'katsushika', 'kita', 'kiyose', 'kodaira', 'koganei', 'kokubunji', 'komae', 'koto', 'kouzushima', 'kunitachi', 'machida', 'meguro', 'minato', 'mitaka', 'mizuho', 'musashimurayama', 'musashino', 'nakano', 'nerima', 'ogasawara', 'okutama', 'ome', 'oshima', 'ota', 'setagaya', 'shibuya', 'shinagawa', 'shinjuku', 'suginami', 'sumida', 'tachikawa', 'taito', 'tama', 'toshima'].includes(wa[2])) {
  621. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  622. }
  623. }
  624. if (wa[1] == 'tokushima' && wa[3] != undefined) {
  625. if (['aizumi', 'anan', 'ichiba', 'itano', 'kainan', 'komatsushima', 'matsushige', 'mima', 'minami', 'miyoshi', 'mugi', 'nakagawa', 'naruto', 'sanagochi', 'shishikui', 'tokushima', 'wajiki'].includes(wa[2])) {
  626. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  627. }
  628. }
  629. if (wa[1] == 'tochigi' && wa[3] != undefined) {
  630. if (['ashikaga', 'bato', 'haga', 'ichikai', 'iwafune', 'kaminokawa', 'kanuma', 'karasuyama', 'kuroiso', 'mashiko', 'mibu', 'moka', 'motegi', 'nasu', 'nasushiobara', 'nikko', 'nishikata', 'nogi', 'ohira', 'ohtawara', 'oyama', 'sakura', 'sano', 'shimotsuke', 'shioya', 'takanezawa', 'tochigi', 'tsuga', 'ujiie', 'utsunomiya', 'yaita'].includes(wa[2])) {
  631. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  632. }
  633. }
  634. if (wa[1] == 'shizuoka' && wa[3] != undefined) {
  635. if (['arai', 'atami', 'fuji', 'fujieda', 'fujikawa', 'fujinomiya', 'fukuroi', 'gotemba', 'haibara', 'hamamatsu', 'higashiizu', 'ito', 'iwata', 'izu', 'izunokuni', 'kakegawa', 'kannami', 'kawanehon', 'kawazu', 'kikugawa', 'kosai', 'makinohara', 'matsuzaki', 'minamiizu', 'mishima', 'morimachi', 'nishiizu', 'numazu', 'omaezaki', 'shimada', 'shimizu', 'shimoda', 'shizuoka', 'susono', 'yaizu', 'yoshida'].includes(wa[2])) {
  636. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  637. }
  638. }
  639. if (wa[1] == 'shimane' && wa[3] != undefined) {
  640. if (['akagi', 'ama', 'gotsu', 'hamada', 'higashiizumo', 'hikawa', 'hikimi', 'izumo', 'kakinoki', 'masuda', 'matsue', 'misato', 'nishinoshima', 'ohda', 'okinoshima', 'okuizumo', 'shimane', 'tamayu', 'tsuwano', 'unnan', 'yakumo', 'yasugi', 'yatsuka'].includes(wa[2])) {
  641. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  642. }
  643. }
  644. if (wa[1] == 'shiga' && wa[3] != undefined) {
  645. if (['aisho', 'gamo', 'higashiomi', 'hikone', 'koka', 'konan', 'kosei', 'koto', 'kusatsu', 'maibara', 'moriyama', 'nagahama', 'nishiazai', 'notogawa', 'omihachiman', 'otsu', 'ritto', 'ryuoh', 'takashima', 'takatsuki', 'torahime', 'toyosato', 'yasu'].includes(wa[2])) {
  646. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  647. }
  648. }
  649. if (wa[1] == 'saitama' && wa[3] != undefined) {
  650. if (['arakawa', 'asaka', 'chichibu', 'fujimi', 'fujimino', 'fukaya', 'hanno', 'hanyu', 'hasuda', 'hatogaya', 'hatoyama', 'hidaka', 'higashichichibu', 'higashimatsuyama', 'honjo', 'ina', 'iruma', 'iwatsuki', 'kamiizumi', 'kamikawa', 'kamisato', 'kasukabe', 'kawagoe', 'kawaguchi', 'kawajima', 'kazo', 'kitamoto', 'koshigaya', 'kounosu', 'kuki', 'kumagaya', 'matsubushi', 'minano', 'misato', 'miyashiro', 'miyoshi', 'moroyama', 'nagatoro', 'namegawa', 'niiza', 'ogano', 'ogawa', 'ogose', 'okegawa', 'omiya', 'otaki', 'ranzan', 'ryokami', 'saitama', 'sakado', 'satte', 'sayama', 'shiki', 'shiraoka', 'soka', 'sugito', 'toda', 'tokigawa', 'tokorozawa', 'tsurugashima', 'urawa', 'warabi', 'yashio', 'yokoze', 'yono', 'yorii', 'yoshida', 'yoshikawa', 'yoshimi'].includes(wa[2])) {
  651. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  652. }
  653. }
  654. if (wa[1] == 'saga' && wa[3] != undefined) {
  655. if (['ariake', 'arita', 'fukudomi', 'genkai', 'hamatama', 'hizen', 'imari', 'kamimine', 'kanzaki', 'karatsu', 'kashima', 'kitagata', 'kitahata', 'kiyama', 'kouhoku', 'kyuragi', 'nishiarita', 'ogi', 'omachi', 'ouchi', 'saga', 'shiroishi', 'taku', 'tara', 'tosu', 'yoshinogari'].includes(wa[2])) {
  656. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  657. }
  658. }
  659. if (wa[1] == 'osaka' && wa[3] != undefined) {
  660. if (['abeno', 'chihayaakasaka', 'chuo', 'daito', 'fujiidera', 'habikino', 'hannan', 'higashiosaka', 'higashisumiyoshi', 'higashiyodogawa', 'hirakata', 'ibaraki', 'ikeda', 'izumi', 'izumiotsu', 'izumisano', 'kadoma', 'kaizuka', 'kanan', 'kashiwara', 'katano', 'kawachinagano', 'kishiwada', 'kita', 'kumatori', 'matsubara', 'minato', 'minoh', 'misaki', 'moriguchi', 'neyagawa', 'nishi', 'nose', 'osakasayama', 'sakai', 'sayama', 'sennan', 'settsu', 'shijonawate', 'shimamoto', 'suita', 'tadaoka', 'taishi', 'tajiri', 'takaishi', 'takatsuki', 'tondabayashi', 'toyonaka', 'toyono', 'yao'].includes(wa[2])) {
  661. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  662. }
  663. }
  664. if (wa[1] == 'okinawa' && wa[3] != undefined) {
  665. if (['aguni', 'ginowan', 'ginoza', 'gushikami', 'haebaru', 'higashi', 'hirara', 'iheya', 'ishigaki', 'ishikawa', 'itoman', 'izena', 'kadena', 'kin', 'kitadaito', 'kitanakagusuku', 'kumejima', 'kunigami', 'minamidaito', 'motobu', 'nago', 'naha', 'nakagusuku', 'nakijin', 'nanjo', 'nishihara', 'ogimi', 'okinawa', 'onna', 'shimoji', 'taketomi', 'tarama', 'tokashiki', 'tomigusuku', 'tonaki', 'urasoe', 'uruma', 'yaese', 'yomitan', 'yonabaru', 'yonaguni', 'zamami'].includes(wa[2])) {
  666. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  667. }
  668. }
  669. if (wa[1] == 'okayama' && wa[3] != undefined) {
  670. if (['akaiwa', 'asakuchi', 'bizen', 'hayashima', 'ibara', 'kagamino', 'kasaoka', 'kibichuo', 'kumenan', 'kurashiki', 'maniwa', 'misaki', 'nagi', 'niimi', 'nishiawakura', 'okayama', 'satosho', 'setouchi', 'shinjo', 'shoo', 'soja', 'takahashi', 'tamano', 'tsuyama', 'wake', 'yakage'].includes(wa[2])) {
  671. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  672. }
  673. }
  674. if (wa[1] == 'oita' && wa[3] != undefined) {
  675. if (['beppu', 'bungoono', 'bungotakada', 'hasama', 'hiji', 'himeshima', 'hita', 'kamitsue', 'kokonoe', 'kuju', 'kunisaki', 'kusu', 'oita', 'saiki', 'taketa', 'tsukumi', 'usa', 'usuki', 'yufu'].includes(wa[2])) {
  676. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  677. }
  678. }
  679. if (wa[1] == 'niigata' && wa[3] != undefined) {
  680. if (['aga', 'agano', 'gosen', 'itoigawa', 'izumozaki', 'joetsu', 'kamo', 'kariwa', 'kashiwazaki', 'minamiuonuma', 'mitsuke', 'muika', 'murakami', 'myoko', 'nagaoka', 'niigata', 'ojiya', 'omi', 'sado', 'sanjo', 'seiro', 'seirou', 'sekikawa', 'shibata', 'tagami', 'tainai', 'tochio', 'tokamachi', 'tsubame', 'tsunan', 'uonuma', 'yahiko', 'yoita', 'yuzawa'].includes(wa[2])) {
  681. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  682. }
  683. }
  684. if (wa[1] == 'nara' && wa[3] != undefined) {
  685. if (['ando', 'gose', 'heguri', 'higashiyoshino', 'ikaruga', 'ikoma', 'kamikitayama', 'kanmaki', 'kashiba', 'kashihara', 'katsuragi', 'kawai', 'kawakami', 'kawanishi', 'koryo', 'kurotaki', 'mitsue', 'miyake', 'nara', 'nosegawa', 'oji', 'ouda', 'oyodo', 'sakurai', 'sango', 'shimoichi', 'shimokitayama', 'shinjo', 'soni', 'takatori', 'tawaramoto', 'tenkawa', 'tenri', 'uda', 'yamatokoriyama', 'yamatotakada', 'yamazoe', 'yoshino'].includes(wa[2])) {
  686. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  687. }
  688. }
  689. if (wa[1] == 'nagasaki' && wa[3] != undefined) {
  690. if (['chijiwa', 'futsu', 'goto', 'hasami', 'hirado', 'iki', 'isahaya', 'kawatana', 'kuchinotsu', 'matsuura', 'nagasaki', 'obama', 'omura', 'oseto', 'saikai', 'sasebo', 'seihi', 'shimabara', 'shinkamigoto', 'togitsu', 'tsushima', 'unzen'].includes(wa[2])) {
  691. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  692. }
  693. }
  694. if (wa[1] == 'nagano' && wa[3] != undefined) {
  695. if (['achi', 'agematsu', 'anan', 'aoki', 'asahi', 'azumino', 'chikuhoku', 'chikuma', 'chino', 'fujimi', 'hakuba', 'hara', 'hiraya', 'iida', 'iijima', 'iiyama', 'iizuna', 'ikeda', 'ikusaka', 'ina', 'karuizawa', 'kawakami', 'kiso', 'kisofukushima', 'kitaaiki', 'komagane', 'komoro', 'matsukawa', 'matsumoto', 'miasa', 'minamiaiki', 'minamimaki', 'minamiminowa', 'minowa', 'miyada', 'miyota', 'mochizuki', 'nagano', 'nagawa', 'nagiso', 'nakagawa', 'nakano', 'nozawaonsen', 'obuse', 'ogawa', 'okaya', 'omachi', 'omi', 'ookuwa', 'ooshika', 'otaki', 'otari', 'sakae', 'sakaki', 'saku', 'sakuho', 'shimosuwa', 'shinanomachi', 'shiojiri', 'suwa', 'suzaka', 'takagi', 'takamori', 'takayama', 'tateshina', 'tatsuno', 'togakushi', 'togura', 'tomi', 'ueda', 'wada', 'yamagata', 'yamanouchi', 'yasaka', 'yasuoka'].includes(wa[2])) {
  696. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  697. }
  698. }
  699. if (wa[1] == 'miyazaki' && wa[3] != undefined) {
  700. if (['aya', 'ebino', 'gokase', 'hyuga', 'kadogawa', 'kawaminami', 'kijo', 'kitagawa', 'kitakata', 'kitaura', 'kobayashi', 'kunitomi', 'kushima', 'mimata', 'miyakonojo', 'miyazaki', 'morotsuka', 'nichinan', 'nishimera', 'nobeoka', 'saito', 'shiiba', 'shintomi', 'takaharu', 'takanabe', 'takazaki', 'tsuno'].includes(wa[2])) {
  701. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  702. }
  703. }
  704. if (wa[1] == 'miyagi' && wa[3] != undefined) {
  705. if (['furukawa', 'higashimatsushima', 'ishinomaki', 'iwanuma', 'kakuda', 'kami', 'kawasaki', 'marumori', 'matsushima', 'minamisanriku', 'misato', 'murata', 'natori', 'ogawara', 'ohira', 'onagawa', 'osaki', 'rifu', 'semine', 'shibata', 'shichikashuku', 'shikama', 'shiogama', 'shiroishi', 'tagajo', 'taiwa', 'tome', 'tomiya', 'wakuya', 'watari', 'yamamoto', 'zao'].includes(wa[2])) {
  706. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  707. }
  708. }
  709. if (wa[1] == 'mie' && wa[3] != undefined) {
  710. if (['asahi', 'inabe', 'ise', 'kameyama', 'kawagoe', 'kiho', 'kisosaki', 'kiwa', 'komono', 'kumano', 'kuwana', 'matsusaka', 'meiwa', 'mihama', 'minamiise', 'misugi', 'miyama', 'nabari', 'shima', 'suzuka', 'tado', 'taiki', 'taki', 'tamaki', 'toba', 'tsu', 'udono', 'ureshino', 'watarai', 'yokkaichi'].includes(wa[2])) {
  711. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  712. }
  713. }
  714. if (wa[1] == 'kyoto' && wa[3] != undefined) {
  715. if (['ayabe', 'fukuchiyama', 'higashiyama', 'ide', 'ine', 'joyo', 'kameoka', 'kamo', 'kita', 'kizu', 'kumiyama', 'kyotamba', 'kyotanabe', 'kyotango', 'maizuru', 'minami', 'minamiyamashiro', 'miyazu', 'muko', 'nagaokakyo', 'nakagyo', 'nantan', 'oyamazaki', 'sakyo', 'seika', 'tanabe', 'uji', 'ujitawara', 'wazuka', 'yamashina', 'yawata'].includes(wa[2])) {
  716. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  717. }
  718. }
  719. if (wa[1] == 'kumamoto' && wa[3] != undefined) {
  720. if (['amakusa', 'arao', 'aso', 'choyo', 'gyokuto', 'kamiamakusa', 'kikuchi', 'kumamoto', 'mashiki', 'mifune', 'minamata', 'minamioguni', 'nagasu', 'nishihara', 'oguni', 'ozu', 'sumoto', 'takamori', 'uki', 'uto', 'yamaga', 'yamato', 'yatsushiro'].includes(wa[2])) {
  721. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  722. }
  723. }
  724. if (wa[1] == 'kochi' && wa[3] != undefined) {
  725. if (['aki', 'geisei', 'hidaka', 'higashitsuno', 'ino', 'kagami', 'kami', 'kitagawa', 'kochi', 'mihara', 'motoyama', 'muroto', 'nahari', 'nakamura', 'nankoku', 'nishitosa', 'niyodogawa', 'ochi', 'okawa', 'otoyo', 'otsuki', 'sakawa', 'sukumo', 'susaki', 'tosa', 'tosashimizu', 'toyo', 'tsuno', 'umaji', 'yasuda', 'yusuhara'].includes(wa[2])) {
  726. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  727. }
  728. }
  729. if (wa[1] == 'kanagawa' && wa[3] != undefined) {
  730. if (['aikawa', 'atsugi', 'ayase', 'chigasaki', 'ebina', 'fujisawa', 'hadano', 'hakone', 'hiratsuka', 'isehara', 'kaisei', 'kamakura', 'kiyokawa', 'matsuda', 'minamiashigara', 'miura', 'nakai', 'ninomiya', 'odawara', 'oi', 'oiso', 'sagamihara', 'samukawa', 'tsukui', 'yamakita', 'yamato', 'yokosuka', 'yugawara', 'zama', 'zushi'].includes(wa[2])) {
  731. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  732. }
  733. }
  734. if (wa[1] == 'kagoshima' && wa[3] != undefined) {
  735. if (['akune', 'amami', 'hioki', 'isa', 'isen', 'izumi', 'kagoshima', 'kanoya', 'kawanabe', 'kinko', 'kouyama', 'makurazaki', 'matsumoto', 'minamitane', 'nakatane', 'nishinoomote', 'satsumasendai', 'soo', 'tarumizu', 'yusui'].includes(wa[2])) {
  736. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  737. }
  738. }
  739. if (wa[1] == 'kagawa' && wa[3] != undefined) {
  740. if (['ayagawa', 'higashikagawa', 'kanonji', 'kotohira', 'manno', 'marugame', 'mitoyo', 'naoshima', 'sanuki', 'tadotsu', 'takamatsu', 'tonosho', 'uchinomi', 'utazu', 'zentsuji'].includes(wa[2])) {
  741. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  742. }
  743. }
  744. if (wa[1] == 'iwate' && wa[3] != undefined) {
  745. if (['fudai', 'fujisawa', 'hanamaki', 'hiraizumi', 'hirono', 'ichinohe', 'ichinoseki', 'iwaizumi', 'iwate', 'joboji', 'kamaishi', 'kanegasaki', 'karumai', 'kawai', 'kitakami', 'kuji', 'kunohe', 'kuzumaki', 'miyako', 'mizusawa', 'morioka', 'ninohe', 'noda', 'ofunato', 'oshu', 'otsuchi', 'rikuzentakata', 'shiwa', 'shizukuishi', 'sumita', 'tanohata', 'tono', 'yahaba', 'yamada'].includes(wa[2])) {
  746. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  747. }
  748. }
  749. if (wa[1] == 'ishikawa' && wa[3] != undefined) {
  750. if (['anamizu', 'hakui', 'hakusan', 'kaga', 'kahoku', 'kanazawa', 'kawakita', 'komatsu', 'nakanoto', 'nanao', 'nomi', 'nonoichi', 'noto', 'shika', 'suzu', 'tsubata', 'tsurugi', 'uchinada', 'wajima'].includes(wa[2])) {
  751. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  752. }
  753. }
  754. if (wa[1] == 'ibaraki' && wa[3] != undefined) {
  755. if (['ami', 'asahi', 'bando', 'chikusei', 'daigo', 'fujishiro', 'hitachi', 'hitachinaka', 'hitachiomiya', 'hitachiota', 'ibaraki', 'ina', 'inashiki', 'itako', 'iwama', 'joso', 'kamisu', 'kasama', 'kashima', 'kasumigaura', 'koga', 'miho', 'mito', 'moriya', 'naka', 'namegata', 'oarai', 'ogawa', 'omitama', 'ryugasaki', 'sakai', 'sakuragawa', 'shimodate', 'shimotsuma', 'shirosato', 'sowa', 'suifu', 'takahagi', 'tamatsukuri', 'tokai', 'tomobe', 'tone', 'toride', 'tsuchiura', 'tsukuba', 'uchihara', 'ushiku', 'yachiyo', 'yamagata', 'yawara', 'yuki'].includes(wa[2])) {
  756. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  757. }
  758. }
  759. if (wa[1] == 'hyogo' && wa[3] != undefined) {
  760. if (['aioi', 'akashi', 'ako', 'amagasaki', 'aogaki', 'asago', 'ashiya', 'awaji', 'fukusaki', 'goshiki', 'harima', 'himeji', 'ichikawa', 'inagawa', 'itami', 'kakogawa', 'kamigori', 'kamikawa', 'kasai', 'kasuga', 'kawanishi', 'miki', 'minamiawaji', 'nishinomiya', 'nishiwaki', 'ono', 'sanda', 'sannan', 'sasayama', 'sayo', 'shingu', 'shinonsen', 'shiso', 'sumoto', 'taishi', 'taka', 'takarazuka', 'takasago', 'takino', 'tamba', 'tatsuno', 'toyooka', 'yabu', 'yashiro', 'yoka', 'yokawa'].includes(wa[2])) {
  761. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  762. }
  763. }
  764. if (wa[1] == 'hokkaido' && wa[3] != undefined) {
  765. if (['abashiri', 'abira', 'aibetsu', 'akabira', 'akkeshi', 'asahikawa', 'ashibetsu', 'ashoro', 'assabu', 'atsuma', 'bibai', 'biei', 'bifuka', 'bihoro', 'biratori', 'chippubetsu', 'chitose', 'date', 'ebetsu', 'embetsu', 'eniwa', 'erimo', 'esan', 'esashi', 'fukagawa', 'fukushima', 'furano', 'furubira', 'haboro', 'hakodate', 'hamatonbetsu', 'hidaka', 'higashikagura', 'higashikawa', 'hiroo', 'hokuryu', 'hokuto', 'honbetsu', 'horokanai', 'horonobe', 'ikeda', 'imakane', 'ishikari', 'iwamizawa', 'iwanai', 'kamifurano', 'kamikawa', 'kamishihoro', 'kamisunagawa', 'kamoenai', 'kayabe', 'kembuchi', 'kikonai', 'kimobetsu', 'kitahiroshima', 'kitami', 'kiyosato', 'koshimizu', 'kunneppu', 'kuriyama', 'kuromatsunai', 'kushiro', 'kutchan', 'kyowa', 'mashike', 'matsumae', 'mikasa', 'minamifurano', 'mombetsu', 'moseushi', 'mukawa', 'muroran', 'naie', 'nakagawa', 'nakasatsunai', 'nakatombetsu', 'nanae', 'nanporo', 'nayoro', 'nemuro', 'niikappu', 'niki', 'nishiokoppe', 'noboribetsu', 'numata', 'obihiro', 'obira', 'oketo', 'okoppe', 'otaru', 'otobe', 'otofuke', 'otoineppu', 'oumu', 'ozora', 'pippu', 'rankoshi', 'rebun', 'rikubetsu', 'rishiri', 'rishirifuji', 'saroma', 'sarufutsu', 'shakotan', 'shari', 'shibecha', 'shibetsu', 'shikabe', 'shikaoi', 'shimamaki', 'shimizu', 'shimokawa', 'shinshinotsu', 'shintoku', 'shiranuka', 'shiraoi', 'shiriuchi', 'sobetsu', 'sunagawa', 'taiki', 'takasu', 'takikawa', 'takinoue', 'teshikaga', 'tobetsu', 'tohma', 'tomakomai', 'tomari', 'toya', 'toyako', 'toyotomi', 'toyoura', 'tsubetsu', 'tsukigata', 'urakawa', 'urausu', 'uryu', 'utashinai', 'wakkanai', 'wassamu', 'yakumo', 'yoichi'].includes(wa[2])) {
  766. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  767. }
  768. }
  769. if (wa[1] == 'hiroshima' && wa[3] != undefined) {
  770. if (['asaminami', 'daiwa', 'etajima', 'fuchu', 'fukuyama', 'hatsukaichi', 'higashihiroshima', 'hongo', 'jinsekikogen', 'kaita', 'kui', 'kumano', 'kure', 'mihara', 'miyoshi', 'naka', 'onomichi', 'osakikamijima', 'otake', 'saka', 'sera', 'seranishi', 'shinichi', 'shobara', 'takehara'].includes(wa[2])) {
  771. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  772. }
  773. }
  774. if (wa[1] == 'gunma' && wa[3] != undefined) {
  775. if (['annaka', 'chiyoda', 'fujioka', 'higashiagatsuma', 'isesaki', 'itakura', 'kanna', 'kanra', 'katashina', 'kawaba', 'kiryu', 'kusatsu', 'maebashi', 'meiwa', 'midori', 'minakami', 'naganohara', 'nakanojo', 'nanmoku', 'numata', 'oizumi', 'ora', 'ota', 'shibukawa', 'shimonita', 'shinto', 'showa', 'takasaki', 'takayama', 'tamamura', 'tatebayashi', 'tomioka', 'tsukiyono', 'tsumagoi', 'ueno', 'yoshioka'].includes(wa[2])) {
  776. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  777. }
  778. }
  779. if (wa[1] == 'gifu' && wa[3] != undefined) {
  780. if (['anpachi', 'ena', 'gifu', 'ginan', 'godo', 'gujo', 'hashima', 'hichiso', 'hida', 'higashishirakawa', 'ibigawa', 'ikeda', 'kakamigahara', 'kani', 'kasahara', 'kasamatsu', 'kawaue', 'kitagata', 'mino', 'minokamo', 'mitake', 'mizunami', 'motosu', 'nakatsugawa', 'ogaki', 'sakahogi', 'seki', 'sekigahara', 'shirakawa', 'tajimi', 'takayama', 'tarui', 'toki', 'tomika', 'wanouchi', 'yamagata', 'yaotsu', 'yoro'].includes(wa[2])) {
  781. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  782. }
  783. }
  784. if (wa[1] == 'fukushima' && wa[3] != undefined) {
  785. if (['aizubange', 'aizumisato', 'aizuwakamatsu', 'asakawa', 'bandai', 'date', 'fukushima', 'furudono', 'futaba', 'hanawa', 'higashi', 'hirata', 'hirono', 'iitate', 'inawashiro', 'ishikawa', 'iwaki', 'izumizaki', 'kagamiishi', 'kaneyama', 'kawamata', 'kitakata', 'kitashiobara', 'koori', 'koriyama', 'kunimi', 'miharu', 'mishima', 'namie', 'nango', 'nishiaizu', 'nishigo', 'okuma', 'omotego', 'ono', 'otama', 'samegawa', 'shimogo', 'shirakawa', 'showa', 'soma', 'sukagawa', 'taishin', 'tamakawa', 'tanagura', 'tenei', 'yabuki', 'yamato', 'yamatsuri', 'yanaizu', 'yugawa'].includes(wa[2])) {
  786. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  787. }
  788. }
  789. if (wa[1] == 'fukuoka' && wa[3] != undefined) {
  790. if (['ashiya', 'buzen', 'chikugo', 'chikuho', 'chikujo', 'chikushino', 'chikuzen', 'chuo', 'dazaifu', 'fukuchi', 'hakata', 'higashi', 'hirokawa', 'hisayama', 'iizuka', 'inatsuki', 'kaho', 'kasuga', 'kasuya', 'kawara', 'keisen', 'koga', 'kurate', 'kurogi', 'kurume', 'minami', 'miyako', 'miyama', 'miyawaka', 'mizumaki', 'munakata', 'nakagawa', 'nakama', 'nishi', 'nogata', 'ogori', 'okagaki', 'okawa', 'oki', 'omuta', 'onga', 'onojo', 'oto', 'saigawa', 'sasaguri', 'shingu', 'shinyoshitomi', 'shonai', 'soeda', 'sue', 'tachiarai', 'tagawa', 'takata', 'toho', 'toyotsu', 'tsuiki', 'ukiha', 'umi', 'usui', 'yamada', 'yame', 'yanagawa', 'yukuhashi'].includes(wa[2])) {
  791. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  792. }
  793. }
  794. if (wa[1] == 'fukui' && wa[3] != undefined) {
  795. if (['echizen', 'eiheiji', 'fukui', 'ikeda', 'katsuyama', 'mihama', 'minamiechizen', 'obama', 'ohi', 'ono', 'sabae', 'sakai', 'takahama', 'tsuruga', 'wakasa'].includes(wa[2])) {
  796. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  797. }
  798. }
  799. if (wa[1] == 'ehime' && wa[3] != undefined) {
  800. if (['ainan', 'honai', 'ikata', 'imabari', 'iyo', 'kamijima', 'kihoku', 'kumakogen', 'masaki', 'matsuno', 'matsuyama', 'namikata', 'niihama', 'ozu', 'saijo', 'seiyo', 'shikokuchuo', 'tobe', 'toon', 'uchiko', 'uwajima', 'yawatahama'].includes(wa[2])) {
  801. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  802. }
  803. }
  804. if (wa[1] == 'chiba' && wa[3] != undefined) {
  805. if (['abiko', 'asahi', 'chonan', 'chosei', 'choshi', 'chuo', 'funabashi', 'futtsu', 'hanamigawa', 'ichihara', 'ichikawa', 'ichinomiya', 'inzai', 'isumi', 'kamagaya', 'kamogawa', 'kashiwa', 'katori', 'katsuura', 'kimitsu', 'kisarazu', 'kozaki', 'kujukuri', 'kyonan', 'matsudo', 'midori', 'mihama', 'minamiboso', 'mobara', 'mutsuzawa', 'nagara', 'nagareyama', 'narashino', 'narita', 'noda', 'oamishirasato', 'omigawa', 'onjuku', 'otaki', 'sakae', 'sakura', 'shimofusa', 'shirako', 'shiroi', 'shisui', 'sodegaura', 'sosa', 'tako', 'tateyama', 'togane', 'tohnosho', 'tomisato', 'urayasu', 'yachimata', 'yachiyo', 'yokaichiba', 'yokoshibahikari', 'yotsukaido'].includes(wa[2])) {
  806. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  807. }
  808. }
  809. if (wa[1] == 'aomori' && wa[3] != undefined) {
  810. if (['aomori', 'gonohe', 'hachinohe', 'hashikami', 'hiranai', 'hirosaki', 'itayanagi', 'kuroishi', 'misawa', 'mutsu', 'nakadomari', 'noheji', 'oirase', 'owani', 'rokunohe', 'sannohe', 'shichinohe', 'shingo', 'takko', 'towada', 'tsugaru', 'tsuruta'].includes(wa[2])) {
  811. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  812. }
  813. }
  814. if (wa[1] == 'akita' && wa[3] != undefined) {
  815. if (['akita', 'daisen', 'fujisato', 'gojome', 'hachirogata', 'happou', 'higashinaruse', 'honjo', 'honjyo', 'ikawa', 'kamikoani', 'kamioka', 'katagami', 'kazuno', 'kitaakita', 'kosaka', 'kyowa', 'misato', 'mitane', 'moriyoshi', 'nikaho', 'noshiro', 'odate', 'oga', 'ogata', 'semboku', 'yokote', 'yurihonjo'].includes(wa[2])) {
  816. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  817. }
  818. }
  819. if (wa[1] == 'aichi' && wa[3] != undefined) {
  820. if (['aisai', 'ama', 'anjo', 'asuke', 'chiryu', 'chita', 'fuso', 'gamagori', 'handa', 'hazu', 'hekinan', 'higashiura', 'ichinomiya', 'inazawa', 'inuyama', 'isshiki', 'iwakura', 'kanie', 'kariya', 'kasugai', 'kira', 'kiyosu', 'komaki', 'konan', 'kota', 'mihama', 'miyoshi', 'nishio', 'nisshin', 'obu', 'oguchi', 'oharu', 'okazaki', 'owariasahi', 'seto', 'shikatsu', 'shinshiro', 'shitara', 'tahara', 'takahama', 'tobishima', 'toei', 'togo', 'tokai', 'tokoname', 'toyoake', 'toyohashi', 'toyokawa', 'toyone', 'toyota', 'tsushima', 'yatomi'].includes(wa[2])) {
  821. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  822. }
  823. }
  824. if (['ac', 'ad', 'aichi', 'akita', 'aomori', 'chiba', 'co', 'ed', 'ehime', 'fukui', 'fukuoka', 'fukushima', 'gifu', 'go', 'gr', 'gunma', 'hiroshima', 'hokkaido', 'hyogo', 'ibaraki', 'ishikawa', 'iwate', 'kagawa', 'kagoshima', 'kanagawa', 'kawasaki', 'kitakyushu', 'kobe', 'kochi', 'kumamoto', 'kyoto', 'lg', 'mie', 'miyagi', 'miyazaki', 'nagano', 'nagasaki', 'nagoya', 'nara', 'ne', 'niigata', 'oita', 'okayama', 'okinawa', 'or', 'osaka', 'saga', 'saitama', 'sapporo', 'sendai', 'shiga', 'shimane', 'shizuoka', 'tochigi', 'tokushima', 'tokyo', 'tottori', 'toyama', 'wakayama', 'xn--0trq7p7nn', 'xn--1ctwo', 'xn--1lqs03n', 'xn--1lqs71d', 'xn--2m4a15e', 'xn--32vp30h', 'xn--4it168d', 'xn--4it797k', 'xn--4pvxs', 'xn--5js045d', 'xn--5rtp49c', 'xn--5rtq34k', 'xn--6btw5a', 'xn--6orx2r', 'xn--7t0a264c', 'xn--8ltr62k', 'xn--8pvr4u', 'xn--c3s14m', 'xn--d5qv7z876c', 'xn--djrs72d6uy', 'xn--djty4k', 'xn--efvn9s', 'xn--ehqz56n', 'xn--elqq16h', 'xn--f6qx53a', 'xn--k7yn95e', 'xn--kbrq7o', 'xn--klt787d', 'xn--kltp7d', 'xn--kltx9a', 'xn--klty5x', 'xn--mkru45i', 'xn--nit225k', 'xn--ntso0iqx3a', 'xn--ntsq17g', 'xn--pssu33l', 'xn--qqqt11m', 'xn--rht27z', 'xn--rht3d', 'xn--rht61e', 'xn--rny31h', 'xn--tor131o', 'xn--uist22h', 'xn--uisz3g', 'xn--uuwu58a', 'xn--vgu402c', 'xn--zbx025d', 'yamagata', 'yamaguchi', 'yamanashi', 'yokohama'].includes(wa[1])) {
  825. return wa[2] + '.' + wa[1] + '.' + wa[0];
  826. }
  827. break;
  828. case 'ke':
  829. if (['ac', 'co', 'go', 'info', 'me', 'mobi', 'ne', 'or', 'sc'].includes(wa[1])) {
  830. return wa[2] + '.' + wa[1] + '.' + wa[0];
  831. }
  832. break;
  833. case 'kg':
  834. if (['com', 'edu', 'gov', 'mil', 'net', 'org'].includes(wa[1])) {
  835. return wa[2] + '.' + wa[1] + '.' + wa[0];
  836. }
  837. break;
  838. case 'kh':
  839. if (['com', 'edu', 'gov', 'mil', 'net', 'org', 'per'].includes(wa[1])) {
  840. return wa[2] + '.' + wa[1] + '.' + wa[0];
  841. }
  842. break;
  843. case 'ki':
  844. if (['biz', 'com', 'edu', 'gov', 'info', 'net', 'org'].includes(wa[1])) {
  845. return wa[2] + '.' + wa[1] + '.' + wa[0];
  846. }
  847. break;
  848. case 'km':
  849. if (['ass', 'asso', 'com', 'coop', 'edu', 'gouv', 'gov', 'medecin', 'mil', 'nom', 'notaires', 'org', 'pharmaciens', 'prd', 'presse', 'tm', 'veterinaire'].includes(wa[1])) {
  850. return wa[2] + '.' + wa[1] + '.' + wa[0];
  851. }
  852. break;
  853. case 'kn':
  854. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  855. return wa[2] + '.' + wa[1] + '.' + wa[0];
  856. }
  857. break;
  858. case 'kp':
  859. if (['aca', 'com', 'edu', 'gov', 'law', 'net', 'org', 'rep', 'sca', 'tra'].includes(wa[1])) {
  860. return wa[2] + '.' + wa[1] + '.' + wa[0];
  861. }
  862. break;
  863. case 'kr':
  864. if (['ac', 'busan', 'cheju', 'chonbuk', 'chonnam', 'chungbuk', 'chungnam', 'co', 'daegu', 'daejeon', 'es', 'gangwon', 'go', 'gwangju', 'gyeongbuk', 'gyeonggi', 'gyeongnam', 'hs', 'incheon', 'inchon', 'jeju', 'jeonbuk', 'jeonnam', 'kangwon', 'kg', 'kwangju', 'kyongbuk', 'kyonggi', 'kyongnam', 'mil', 'ms', 'ne', 'nm', 'or', 'pe', 'pusan', 're', 'sc', 'seoul', 'taegu', 'taejon', 'ulsan', 'xn--bj0bj06e'].includes(wa[1])) {
  865. return wa[2] + '.' + wa[1] + '.' + wa[0];
  866. }
  867. break;
  868. case 'krd':
  869. if (wa[1] == 'gov') {
  870. return wa[2] + '.' + wa[1] + '.' + wa[0];
  871. }
  872. break;
  873. case 'kw':
  874. if (['com', 'edu', 'emb', 'gov', 'ind', 'net', 'org'].includes(wa[1])) {
  875. return wa[2] + '.' + wa[1] + '.' + wa[0];
  876. }
  877. break;
  878. case 'ky':
  879. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  880. return wa[2] + '.' + wa[1] + '.' + wa[0];
  881. }
  882. break;
  883. case 'kz':
  884. if (['com', 'edu', 'gov', 'mil', 'net', 'org'].includes(wa[1])) {
  885. return wa[2] + '.' + wa[1] + '.' + wa[0];
  886. }
  887. break;
  888. case 'la':
  889. if (['com', 'edu', 'gov', 'info', 'int', 'net', 'org', 'per'].includes(wa[1])) {
  890. return wa[2] + '.' + wa[1] + '.' + wa[0];
  891. }
  892. break;
  893. case 'lb':
  894. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  895. return wa[2] + '.' + wa[1] + '.' + wa[0];
  896. }
  897. break;
  898. case 'lc':
  899. if (['co', 'com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  900. return wa[2] + '.' + wa[1] + '.' + wa[0];
  901. }
  902. break;
  903. case 'lk':
  904. if (['ac', 'assn', 'com', 'edu', 'gov', 'grp', 'hotel', 'int', 'ltd', 'net', 'ngo', 'org', 'sch', 'soc', 'web'].includes(wa[1])) {
  905. return wa[2] + '.' + wa[1] + '.' + wa[0];
  906. }
  907. break;
  908. case 'lr':
  909. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  910. return wa[2] + '.' + wa[1] + '.' + wa[0];
  911. }
  912. break;
  913. case 'ls':
  914. if (['ac', 'biz', 'co', 'edu', 'gov', 'info', 'net', 'nul', 'org', 'parliament', 'quadrant', 'sc'].includes(wa[1])) {
  915. return wa[2] + '.' + wa[1] + '.' + wa[0];
  916. }
  917. break;
  918. case 'lt':
  919. if (wa[1] == 'gov') {
  920. return wa[2] + '.' + wa[1] + '.' + wa[0];
  921. }
  922. break;
  923. case 'lv':
  924. if (['asn', 'com', 'conf', 'edu', 'gov', 'id', 'mil', 'net', 'org'].includes(wa[1])) {
  925. return wa[2] + '.' + wa[1] + '.' + wa[0];
  926. }
  927. break;
  928. case 'ly':
  929. if (['com', 'edu', 'gov', 'id', 'med', 'net', 'org', 'plc', 'sch'].includes(wa[1])) {
  930. return wa[2] + '.' + wa[1] + '.' + wa[0];
  931. }
  932. break;
  933. case 'ma':
  934. if (['ac', 'co', 'gov', 'net', 'org', 'press'].includes(wa[1])) {
  935. return wa[2] + '.' + wa[1] + '.' + wa[0];
  936. }
  937. break;
  938. case 'mc':
  939. if (['asso', 'tm'].includes(wa[1])) {
  940. return wa[2] + '.' + wa[1] + '.' + wa[0];
  941. }
  942. break;
  943. case 'me':
  944. if (['ac', 'co', 'edu', 'gov', 'its', 'net', 'org', 'priv'].includes(wa[1])) {
  945. return wa[2] + '.' + wa[1] + '.' + wa[0];
  946. }
  947. break;
  948. case 'mg':
  949. if (['co', 'com', 'edu', 'gov', 'mil', 'nom', 'org', 'prd', 'tm'].includes(wa[1])) {
  950. return wa[2] + '.' + wa[1] + '.' + wa[0];
  951. }
  952. break;
  953. case 'mk':
  954. if (['com', 'edu', 'gov', 'inf', 'name', 'net', 'org'].includes(wa[1])) {
  955. return wa[2] + '.' + wa[1] + '.' + wa[0];
  956. }
  957. break;
  958. case 'ml':
  959. if (['com', 'edu', 'gouv', 'gov', 'net', 'org', 'presse'].includes(wa[1])) {
  960. return wa[2] + '.' + wa[1] + '.' + wa[0];
  961. }
  962. break;
  963. case 'mm':
  964. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  965. return wa[2] + '.' + wa[1] + '.' + wa[0];
  966. }
  967. break;
  968. case 'mn':
  969. if (['edu', 'gov', 'org'].includes(wa[1])) {
  970. return wa[2] + '.' + wa[1] + '.' + wa[0];
  971. }
  972. break;
  973. case 'mo':
  974. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  975. return wa[2] + '.' + wa[1] + '.' + wa[0];
  976. }
  977. break;
  978. case 'mr':
  979. if (wa[1] == 'gov') {
  980. return wa[2] + '.' + wa[1] + '.' + wa[0];
  981. }
  982. break;
  983. case 'ms':
  984. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  985. return wa[2] + '.' + wa[1] + '.' + wa[0];
  986. }
  987. break;
  988. case 'mt':
  989. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  990. return wa[2] + '.' + wa[1] + '.' + wa[0];
  991. }
  992. break;
  993. case 'mu':
  994. if (['ac', 'co', 'com', 'gov', 'net', 'or', 'org'].includes(wa[1])) {
  995. return wa[2] + '.' + wa[1] + '.' + wa[0];
  996. }
  997. break;
  998. case 'museum':
  999. if (['academy', 'agriculture', 'air', 'airguard', 'alabama', 'alaska', 'amber', 'ambulance', 'american', 'americana', 'americanantiques', 'americanart', 'amsterdam', 'and', 'annefrank', 'anthro', 'anthropology', 'antiques', 'aquarium', 'arboretum', 'archaeological', 'archaeology', 'architecture', 'art', 'artanddesign', 'artcenter', 'artdeco', 'arteducation', 'artgallery', 'arts', 'artsandcrafts', 'asmatart', 'assassination', 'assisi', 'association', 'astronomy', 'atlanta', 'austin', 'australia', 'automotive', 'aviation', 'axis', 'badajoz', 'baghdad', 'bahn', 'bale', 'baltimore', 'barcelona', 'baseball', 'basel', 'baths', 'bauern', 'beauxarts', 'beeldengeluid', 'bellevue', 'bergbau', 'berkeley', 'berlin', 'bern', 'bible', 'bilbao', 'bill', 'birdart', 'birthplace', 'bonn', 'boston', 'botanical', 'botanicalgarden', 'botanicgarden', 'botany', 'brandywinevalley', 'brasil', 'bristol', 'british', 'britishcolumbia', 'broadcast', 'brunel', 'brussel', 'brussels', 'bruxelles', 'building', 'burghof', 'bus', 'bushey', 'cadaques', 'california', 'cambridge', 'can', 'canada', 'capebreton', 'carrier', 'cartoonart', 'casadelamoneda', 'castle', 'castres', 'celtic', 'center', 'chattanooga', 'cheltenham', 'chesapeakebay', 'chicago', 'children', 'childrens', 'childrensgarden', 'chiropractic', 'chocolate', 'christiansburg', 'cincinnati', 'cinema', 'circus', 'civilisation', 'civilization', 'civilwar', 'clinton', 'clock', 'coal', 'coastaldefence', 'cody', 'coldwar', 'collection', 'colonialwilliamsburg', 'coloradoplateau', 'columbia', 'columbus', 'communication', 'communications', 'community', 'computer', 'computerhistory', 'contemporary', 'contemporaryart', 'convent', 'copenhagen', 'corporation', 'corvette', 'costume', 'countryestate', 'county', 'crafts', 'cranbrook', 'creation', 'cultural', 'culturalcenter', 'culture', 'cyber', 'cymru', 'dali', 'dallas', 'database', 'ddr', 'decorativearts', 'delaware', 'delmenhorst', 'denmark', 'depot', 'design', 'detroit', 'dinosaur', 'discovery', 'dolls', 'donostia', 'durham', 'eastafrica', 'eastcoast', 'education', 'educational', 'egyptian', 'eisenbahn', 'elburg', 'elvendrell', 'embroidery', 'encyclopedic', 'england', 'entomology', 'environment', 'environmentalconservation', 'epilepsy', 'essex', 'estate', 'ethnology', 'exeter', 'exhibition', 'family', 'farm', 'farmequipment', 'farmers', 'farmstead', 'field', 'figueres', 'filatelia', 'film', 'fineart', 'finearts', 'finland', 'flanders', 'florida', 'force', 'fortmissoula', 'fortworth', 'foundation', 'francaise', 'frankfurt', 'franziskaner', 'freemasonry', 'freiburg', 'fribourg', 'frog', 'fundacio', 'furniture', 'gallery', 'garden', 'gateway', 'geelvinck', 'gemological', 'geology', 'georgia', 'giessen', 'glas', 'glass', 'gorge', 'grandrapids', 'graz', 'guernsey', 'halloffame', 'hamburg', 'handson', 'harvestcelebration', 'hawaii', 'health', 'heimatunduhren', 'hellas', 'helsinki', 'hembygdsforbund', 'heritage', 'histoire', 'historical', 'historicalsociety', 'historichouses', 'historisch', 'historisches', 'history', 'historyofscience', 'horology', 'house', 'humanities', 'illustration', 'imageandsound', 'indian', 'indiana', 'indianapolis', 'indianmarket', 'intelligence', 'interactive', 'iraq', 'iron', 'isleofman', 'jamison', 'jefferson', 'jerusalem', 'jewelry', 'jewish', 'jewishart', 'jfk', 'journalism', 'judaica', 'judygarland', 'juedisches', 'juif', 'karate', 'karikatur', 'kids', 'koebenhavn', 'koeln', 'kunst', 'kunstsammlung', 'kunstunddesign', 'labor', 'labour', 'lajolla', 'lancashire', 'landes', 'lans', 'larsson', 'lewismiller', 'lincoln', 'linz', 'living', 'livinghistory', 'localhistory', 'london', 'losangeles', 'louvre', 'loyalist', 'lucerne', 'luxembourg', 'luzern', 'mad', 'madrid', 'mallorca', 'manchester', 'mansion', 'mansions', 'manx', 'marburg', 'maritime', 'maritimo', 'maryland', 'marylhurst', 'media', 'medical', 'medizinhistorisches', 'meeres', 'memorial', 'mesaverde', 'michigan', 'midatlantic', 'military', 'mill', 'miners', 'mining', 'minnesota', 'missile', 'missoula', 'modern', 'moma', 'money', 'monmouth', 'monticello', 'montreal', 'moscow', 'motorcycle', 'muenchen', 'muenster', 'mulhouse', 'muncie', 'museet', 'museumcenter', 'museumvereniging', 'music', 'national', 'nationalfirearms', 'nationalheritage', 'nativeamerican', 'naturalhistory', 'naturalhistorymuseum', 'naturalsciences', 'nature', 'naturhistorisches', 'natuurwetenschappen', 'naumburg', 'naval', 'nebraska', 'neues', 'newhampshire', 'newjersey', 'newmexico', 'newport', 'newspaper', 'newyork', 'niepce', 'norfolk', 'north', 'nrw', 'nuernberg', 'nuremberg', 'nyc', 'nyny', 'oceanographic', 'oceanographique', 'omaha', 'online', 'ontario', 'openair', 'oregon', 'oregontrail', 'otago', 'oxford', 'pacific', 'paderborn', 'palace', 'paleo', 'palmsprings', 'panama', 'paris', 'pasadena', 'pharmacy', 'philadelphia', 'philadelphiaarea', 'philately', 'phoenix', 'photography', 'pilots', 'pittsburgh', 'planetarium', 'plantation', 'plants', 'plaza', 'portal', 'portland', 'portlligat', 'posts-and-telecommunications', 'preservation', 'presidio', 'press', 'project', 'public', 'pubol', 'quebec', 'railroad', 'railway', 'research', 'resistance', 'riodejaneiro', 'rochester', 'rockart', 'roma', 'russia', 'saintlouis', 'salem', 'salvadordali', 'salzburg', 'sandiego', 'sanfrancisco', 'santabarbara', 'santacruz', 'santafe', 'saskatchewan', 'satx', 'savannahga', 'schlesisches', 'schoenbrunn', 'schokoladen', 'school', 'schweiz', 'science', 'science-fiction', 'scienceandhistory', 'scienceandindustry', 'sciencecenter', 'sciencecenters', 'sciencehistory', 'sciences', 'sciencesnaturelles', 'scotland', 'seaport', 'settlement', 'settlers', 'shell', 'sherbrooke', 'sibenik', 'silk', 'ski', 'skole', 'society', 'sologne', 'soundandvision', 'southcarolina', 'southwest', 'space', 'spy', 'square', 'stadt', 'stalbans', 'starnberg', 'state', 'stateofdelaware', 'station', 'steam', 'steiermark', 'stjohn', 'stockholm', 'stpetersburg', 'stuttgart', 'suisse', 'surgeonshall', 'surrey', 'svizzera', 'sweden', 'sydney', 'tank', 'tcm', 'technology', 'telekommunikation', 'television', 'texas', 'textile', 'theater', 'time', 'timekeeping', 'topology', 'torino', 'touch', 'town', 'transport', 'tree', 'trolley', 'trust', 'trustee', 'uhren', 'ulm', 'undersea', 'university', 'usa', 'usantiques', 'usarts', 'uscountryestate', 'usculture', 'usdecorativearts', 'usgarden', 'ushistory', 'ushuaia', 'uslivinghistory', 'utah', 'uvic', 'valley', 'vantaa', 'versailles', 'viking', 'village', 'virginia', 'virtual', 'virtuel', 'vlaanderen', 'volkenkunde', 'wales', 'wallonie', 'war', 'washingtondc', 'watch-and-clock', 'watchandclock', 'western', 'westfalen', 'whaling', 'wildlife', 'williamsburg', 'windmill', 'workshop', 'xn--9dbhblg6di', 'xn--comunicaes-v6a2o', 'xn--correios-e-telecomunicaes-ghc29a', 'xn--h1aegh', 'xn--lns-qla', 'york', 'yorkshire', 'yosemite', 'youth', 'zoological', 'zoology'].includes(wa[1])) {
  1000. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1001. }
  1002. break;
  1003. case 'mv':
  1004. if (['aero', 'biz', 'com', 'coop', 'edu', 'gov', 'info', 'int', 'mil', 'museum', 'name', 'net', 'org', 'pro'].includes(wa[1])) {
  1005. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1006. }
  1007. break;
  1008. case 'mw':
  1009. if (['ac', 'biz', 'co', 'com', 'coop', 'edu', 'gov', 'int', 'museum', 'net', 'org'].includes(wa[1])) {
  1010. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1011. }
  1012. break;
  1013. case 'mx':
  1014. if (['com', 'edu', 'gob', 'net', 'ngo', 'org'].includes(wa[1])) {
  1015. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1016. }
  1017. break;
  1018. case 'my':
  1019. if (['biz', 'com', 'edu', 'gov', 'mil', 'name', 'net', 'org'].includes(wa[1])) {
  1020. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1021. }
  1022. break;
  1023. case 'mz':
  1024. if (['ac', 'adv', 'co', 'edu', 'gov', 'mil', 'net', 'org'].includes(wa[1])) {
  1025. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1026. }
  1027. break;
  1028. case 'na':
  1029. if (['ca', 'cc', 'co', 'com', 'dr', 'in', 'info', 'mobi', 'mx', 'name', 'or', 'org', 'pro', 'school', 'tv', 'us', 'ws'].includes(wa[1])) {
  1030. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1031. }
  1032. break;
  1033. case 'nc':
  1034. if (['asso', 'gouv', 'nom'].includes(wa[1])) {
  1035. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1036. }
  1037. break;
  1038. case 'net':
  1039. if (['gb', 'hu', 'in', 'jp', 'ru', 'se', 'uk', 'za'].includes(wa[1])) {
  1040. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1041. }
  1042. break;
  1043. case 'nf':
  1044. if (['arts', 'com', 'firm', 'info', 'net', 'other', 'per', 'rec', 'store', 'web'].includes(wa[1])) {
  1045. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1046. }
  1047. break;
  1048. case 'ng':
  1049. if (['com', 'edu', 'gov', 'i', 'mil', 'mobi', 'name', 'net', 'org', 'sch'].includes(wa[1])) {
  1050. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1051. }
  1052. break;
  1053. case 'ni':
  1054. if (['ac', 'biz', 'co', 'com', 'edu', 'gob', 'in', 'info', 'int', 'mil', 'net', 'nom', 'org', 'web'].includes(wa[1])) {
  1055. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1056. }
  1057. break;
  1058. case 'nl':
  1059. if (wa[1] == 'bv') {
  1060. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1061. }
  1062. break;
  1063. case 'no':
  1064. if (wa[1] == 'xn--stfold-9xa' && wa[3] != undefined) {
  1065. if (wa[2] == 'xn--vler-qoa') {
  1066. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1067. }
  1068. }
  1069. if (wa[1] == 'xn--mre-og-romsdal-qqb' && wa[3] != undefined) {
  1070. if (['sande', 'xn--hery-ira'].includes(wa[2])) {
  1071. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1072. }
  1073. }
  1074. if (wa[1] == 'vf' && wa[3] != undefined) {
  1075. if (wa[2] == 'gs') {
  1076. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1077. }
  1078. }
  1079. if (wa[1] == 'vestfold' && wa[3] != undefined) {
  1080. if (wa[2] == 'sande') {
  1081. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1082. }
  1083. }
  1084. if (wa[1] == 'va' && wa[3] != undefined) {
  1085. if (wa[2] == 'gs') {
  1086. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1087. }
  1088. }
  1089. if (wa[1] == 'tr' && wa[3] != undefined) {
  1090. if (wa[2] == 'gs') {
  1091. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1092. }
  1093. }
  1094. if (wa[1] == 'tm' && wa[3] != undefined) {
  1095. if (wa[2] == 'gs') {
  1096. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1097. }
  1098. }
  1099. if (wa[1] == 'telemark' && wa[3] != undefined) {
  1100. if (['bo', 'xn--b-5ga'].includes(wa[2])) {
  1101. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1102. }
  1103. }
  1104. if (wa[1] == 'svalbard' && wa[3] != undefined) {
  1105. if (wa[2] == 'gs') {
  1106. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1107. }
  1108. }
  1109. if (wa[1] == 'st' && wa[3] != undefined) {
  1110. if (wa[2] == 'gs') {
  1111. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1112. }
  1113. }
  1114. if (wa[1] == 'sf' && wa[3] != undefined) {
  1115. if (wa[2] == 'gs') {
  1116. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1117. }
  1118. }
  1119. if (wa[1] == 'rl' && wa[3] != undefined) {
  1120. if (wa[2] == 'gs') {
  1121. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1122. }
  1123. }
  1124. if (wa[1] == 'ostfold' && wa[3] != undefined) {
  1125. if (wa[2] == 'valer') {
  1126. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1127. }
  1128. }
  1129. if (wa[1] == 'oslo' && wa[3] != undefined) {
  1130. if (wa[2] == 'gs') {
  1131. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1132. }
  1133. }
  1134. if (wa[1] == 'ol' && wa[3] != undefined) {
  1135. if (wa[2] == 'gs') {
  1136. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1137. }
  1138. }
  1139. if (wa[1] == 'of' && wa[3] != undefined) {
  1140. if (wa[2] == 'gs') {
  1141. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1142. }
  1143. }
  1144. if (wa[1] == 'nt' && wa[3] != undefined) {
  1145. if (wa[2] == 'gs') {
  1146. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1147. }
  1148. }
  1149. if (wa[1] == 'nordland' && wa[3] != undefined) {
  1150. if (['bo', 'heroy', 'xn--b-5ga', 'xn--hery-ira'].includes(wa[2])) {
  1151. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1152. }
  1153. }
  1154. if (wa[1] == 'nl' && wa[3] != undefined) {
  1155. if (wa[2] == 'gs') {
  1156. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1157. }
  1158. }
  1159. if (wa[1] == 'mr' && wa[3] != undefined) {
  1160. if (wa[2] == 'gs') {
  1161. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1162. }
  1163. }
  1164. if (wa[1] == 'more-og-romsdal' && wa[3] != undefined) {
  1165. if (['heroy', 'sande'].includes(wa[2])) {
  1166. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1167. }
  1168. }
  1169. if (wa[1] == 'jan-mayen' && wa[3] != undefined) {
  1170. if (wa[2] == 'gs') {
  1171. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1172. }
  1173. }
  1174. if (wa[1] == 'hordaland' && wa[3] != undefined) {
  1175. if (wa[2] == 'os') {
  1176. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1177. }
  1178. }
  1179. if (wa[1] == 'hm' && wa[3] != undefined) {
  1180. if (wa[2] == 'gs') {
  1181. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1182. }
  1183. }
  1184. if (wa[1] == 'hl' && wa[3] != undefined) {
  1185. if (wa[2] == 'gs') {
  1186. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1187. }
  1188. }
  1189. if (wa[1] == 'hedmark' && wa[3] != undefined) {
  1190. if (['os', 'valer', 'xn--vler-qoa'].includes(wa[2])) {
  1191. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1192. }
  1193. }
  1194. if (wa[1] == 'fm' && wa[3] != undefined) {
  1195. if (wa[2] == 'gs') {
  1196. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1197. }
  1198. }
  1199. if (wa[1] == 'buskerud' && wa[3] != undefined) {
  1200. if (wa[2] == 'nes') {
  1201. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1202. }
  1203. }
  1204. if (wa[1] == 'bu' && wa[3] != undefined) {
  1205. if (wa[2] == 'gs') {
  1206. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1207. }
  1208. }
  1209. if (wa[1] == 'akershus' && wa[3] != undefined) {
  1210. if (wa[2] == 'nes') {
  1211. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1212. }
  1213. }
  1214. if (wa[1] == 'ah' && wa[3] != undefined) {
  1215. if (wa[2] == 'gs') {
  1216. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1217. }
  1218. }
  1219. if (wa[1] == 'aa' && wa[3] != undefined) {
  1220. if (wa[2] == 'gs') {
  1221. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1222. }
  1223. }
  1224. if (['aa', 'aarborte', 'aejrie', 'afjord', 'agdenes', 'ah', 'aknoluokta', 'akrehamn', 'al', 'alaheadju', 'alesund', 'algard', 'alstahaug', 'alta', 'alvdal', 'amli', 'amot', 'andasuolo', 'andebu', 'andoy', 'ardal', 'aremark', 'arendal', 'arna', 'aseral', 'asker', 'askim', 'askoy', 'askvoll', 'asnes', 'audnedaln', 'aukra', 'aure', 'aurland', 'aurskog-holand', 'austevoll', 'austrheim', 'averoy', 'badaddja', 'bahcavuotna', 'bahccavuotna', 'baidar', 'bajddar', 'balat', 'balestrand', 'ballangen', 'balsfjord', 'bamble', 'bardu', 'barum', 'batsfjord', 'bearalvahki', 'beardu', 'beiarn', 'berg', 'bergen', 'berlevag', 'bievat', 'bindal', 'birkenes', 'bjarkoy', 'bjerkreim', 'bjugn', 'bodo', 'bokn', 'bomlo', 'bremanger', 'bronnoy', 'bronnoysund', 'brumunddal', 'bryne', 'bu', 'budejju', 'bygland', 'bykle', 'cahcesuolo', 'davvenjarga', 'davvesiida', 'deatnu', 'dep', 'dielddanuorri', 'divtasvuodna', 'divttasvuotna', 'donna', 'dovre', 'drammen', 'drangedal', 'drobak', 'dyroy', 'egersund', 'eid', 'eidfjord', 'eidsberg', 'eidskog', 'eidsvoll', 'eigersund', 'elverum', 'enebakk', 'engerdal', 'etne', 'etnedal', 'evenassi', 'evenes', 'evje-og-hornnes', 'farsund', 'fauske', 'fedje', 'fet', 'fetsund', 'fhs', 'finnoy', 'fitjar', 'fjaler', 'fjell', 'fla', 'flakstad', 'flatanger', 'flekkefjord', 'flesberg', 'flora', 'floro', 'fm', 'folkebibl', 'folldal', 'forde', 'forsand', 'fosnes', 'frana', 'fredrikstad', 'frei', 'frogn', 'froland', 'frosta', 'froya', 'fuoisku', 'fuossko', 'fusa', 'fylkesbibl', 'fyresdal', 'gaivuotna', 'galsa', 'gamvik', 'gangaviika', 'gaular', 'gausdal', 'giehtavuoatna', 'gildeskal', 'giske', 'gjemnes', 'gjerdrum', 'gjerstad', 'gjesdal', 'gjovik', 'gloppen', 'gol', 'gran', 'grane', 'granvin', 'gratangen', 'grimstad', 'grong', 'grue', 'gulen', 'guovdageaidnu', 'ha', 'habmer', 'hadsel', 'hagebostad', 'halden', 'halsa', 'hamar', 'hamaroy', 'hammarfeasta', 'hammerfest', 'hapmir', 'haram', 'hareid', 'harstad', 'hasvik', 'hattfjelldal', 'haugesund', 'hemne', 'hemnes', 'hemsedal', 'herad', 'hitra', 'hjartdal', 'hjelmeland', 'hl', 'hm', 'hobol', 'hof', 'hokksund', 'hol', 'hole', 'holmestrand', 'holtalen', 'honefoss', 'hornindal', 'horten', 'hoyanger', 'hoylandet', 'hurdal', 'hurum', 'hvaler', 'hyllestad', 'ibestad', 'idrett', 'inderoy', 'iveland', 'ivgu', 'jan-mayen', 'jessheim', 'jevnaker', 'jolster', 'jondal', 'jorpeland', 'kafjord', 'karasjohka', 'karasjok', 'karlsoy', 'karmoy', 'kautokeino', 'kirkenes', 'klabu', 'klepp', 'kommune', 'kongsberg', 'kongsvinger', 'kopervik', 'kraanghke', 'kragero', 'kristiansand', 'kristiansund', 'krodsherad', 'krokstadelva', 'kvafjord', 'kvalsund', 'kvam', 'kvanangen', 'kvinesdal', 'kvinnherad', 'kviteseid', 'kvitsoy', 'laakesvuemie', 'lahppi', 'langevag', 'lardal', 'larvik', 'lavagis', 'lavangen', 'leangaviika', 'lebesby', 'leikanger', 'leirfjord', 'leirvik', 'leka', 'leksvik', 'lenvik', 'lerdal', 'lesja', 'levanger', 'lier', 'lierne', 'lillehammer', 'lillesand', 'lindas', 'lindesnes', 'loabat', 'lodingen', 'lom', 'loppa', 'lorenskog', 'loten', 'lund', 'lunner', 'luroy', 'luster', 'lyngdal', 'lyngen', 'malatvuopmi', 'malselv', 'malvik', 'mandal', 'marker', 'marnardal', 'masfjorden', 'masoy', 'matta-varjjat', 'meland', 'meldal', 'melhus', 'meloy', 'meraker', 'midsund', 'midtre-gauldal', 'mil', 'mjondalen', 'mo-i-rana', 'moareke', 'modalen', 'modum', 'molde', 'mosjoen', 'moskenes', 'moss', 'mosvik', 'mr', 'muosat', 'museum', 'naamesjevuemie', 'namdalseid', 'namsos', 'namsskogan', 'nannestad', 'naroy', 'narviika', 'narvik', 'naustdal', 'navuotna', 'nedre-eiker', 'nesna', 'nesodden', 'nesoddtangen', 'nesseby', 'nesset', 'nissedal', 'nittedal', 'nl', 'nord-aurdal', 'nord-fron', 'nord-odal', 'norddal', 'nordkapp', 'nordre-land', 'nordreisa', 'nore-og-uvdal', 'notodden', 'notteroy', 'nt', 'odda', 'of', 'oksnes', 'ol', 'omasvuotna', 'oppdal', 'oppegard', 'orkanger', 'orkdal', 'orland', 'orskog', 'orsta', 'osen', 'oslo', 'osoyro', 'osteroy', 'ostre-toten', 'overhalla', 'ovre-eiker', 'oyer', 'oygarden', 'oystre-slidre', 'porsanger', 'porsangu', 'porsgrunn', 'priv', 'rade', 'radoy', 'rahkkeravju', 'raholt', 'raisa', 'rakkestad', 'ralingen', 'rana', 'randaberg', 'rauma', 'rendalen', 'rennebu', 'rennesoy', 'rindal', 'ringebu', 'ringerike', 'ringsaker', 'risor', 'rissa', 'rl', 'roan', 'rodoy', 'rollag', 'romsa', 'romskog', 'roros', 'rost', 'royken', 'royrvik', 'ruovat', 'rygge', 'salangen', 'salat', 'saltdal', 'samnanger', 'sandefjord', 'sandnes', 'sandnessjoen', 'sandoy', 'sarpsborg', 'sauda', 'sauherad', 'sel', 'selbu', 'selje', 'seljord', 'sf', 'siellak', 'sigdal', 'siljan', 'sirdal', 'skanit', 'skanland', 'skaun', 'skedsmo', 'skedsmokorset', 'ski', 'skien', 'skierva', 'skiptvet', 'skjak', 'skjervoy', 'skodje', 'slattum', 'smola', 'snaase', 'snasa', 'snillfjord', 'snoasa', 'sogndal', 'sogne', 'sokndal', 'sola', 'solund', 'somna', 'sondre-land', 'songdalen', 'sor-aurdal', 'sor-fron', 'sor-odal', 'sor-varanger', 'sorfold', 'sorreisa', 'sortland', 'sorum', 'spjelkavik', 'spydeberg', 'st', 'stange', 'stat', 'stathelle', 'stavanger', 'stavern', 'steigen', 'steinkjer', 'stjordal', 'stjordalshalsen', 'stokke', 'stor-elvdal', 'stord', 'stordal', 'storfjord', 'strand', 'stranda', 'stryn', 'sula', 'suldal', 'sund', 'sunndal', 'surnadal', 'svalbard', 'sveio', 'svelvik', 'sykkylven', 'tana', 'tananger', 'time', 'tingvoll', 'tinn', 'tjeldsund', 'tjome', 'tm', 'tokke', 'tolga', 'tonsberg', 'torsken', 'tr', 'trana', 'tranby', 'tranoy', 'troandin', 'trogstad', 'tromsa', 'tromso', 'trondheim', 'trysil', 'tvedestrand', 'tydal', 'tynset', 'tysfjord', 'tysnes', 'tysvar', 'uenorge', 'ullensaker', 'ullensvang', 'ulvik', 'unjarga', 'utsira', 'va', 'vaapste', 'vadso', 'vaga', 'vagan', 'vagsoy', 'vaksdal', 'valle', 'vang', 'vanylven', 'vardo', 'varggat', 'varoy', 'vefsn', 'vega', 'vegarshei', 'vennesla', 'verdal', 'verran', 'vestby', 'vestnes', 'vestre-slidre', 'vestre-toten', 'vestvagoy', 'vevelstad', 'vf', 'vgs', 'vik', 'vikna', 'vindafjord', 'voagat', 'volda', 'voss', 'vossevangen', 'xn--andy-ira', 'xn--asky-ira', 'xn--aurskog-hland-jnb', 'xn--avery-yua', 'xn--bdddj-mrabd', 'xn--bearalvhki-y4a', 'xn--berlevg-jxa', 'xn--bhcavuotna-s4a', 'xn--bhccavuotna-k7a', 'xn--bidr-5nac', 'xn--bievt-0qa', 'xn--bjarky-fya', 'xn--bjddar-pta', 'xn--blt-elab', 'xn--bmlo-gra', 'xn--bod-2na', 'xn--brnny-wuac', 'xn--brnnysund-m8ac', 'xn--brum-voa', 'xn--btsfjord-9za', 'xn--davvenjrga-y4a', 'xn--dnna-gra', 'xn--drbak-wua', 'xn--dyry-ira', 'xn--eveni-0qa01ga', 'xn--finny-yua', 'xn--fjord-lra', 'xn--fl-zia', 'xn--flor-jra', 'xn--frde-gra', 'xn--frna-woa', 'xn--frya-hra', 'xn--ggaviika-8ya47h', 'xn--gildeskl-g0a', 'xn--givuotna-8ya', 'xn--gjvik-wua', 'xn--gls-elac', 'xn--h-2fa', 'xn--hbmer-xqa', 'xn--hcesuolo-7ya35b', 'xn--hgebostad-g3a', 'xn--hmmrfeasta-s4ac', 'xn--hnefoss-q1a', 'xn--hobl-ira', 'xn--holtlen-hxa', 'xn--hpmir-xqa', 'xn--hyanger-q1a', 'xn--hylandet-54a', 'xn--indery-fya', 'xn--jlster-bya', 'xn--jrpeland-54a', 'xn--karmy-yua', 'xn--kfjord-iua', 'xn--klbu-woa', 'xn--koluokta-7ya57h', 'xn--krager-gya', 'xn--kranghke-b0a', 'xn--krdsherad-m8a', 'xn--krehamn-dxa', 'xn--krjohka-hwab49j', 'xn--ksnes-uua', 'xn--kvfjord-nxa', 'xn--kvitsy-fya', 'xn--kvnangen-k0a', 'xn--l-1fa', 'xn--laheadju-7ya', 'xn--langevg-jxa', 'xn--ldingen-q1a', 'xn--leagaviika-52b', 'xn--lesund-hua', 'xn--lgrd-poac', 'xn--lhppi-xqa', 'xn--linds-pra', 'xn--loabt-0qa', 'xn--lrdal-sra', 'xn--lrenskog-54a', 'xn--lt-liac', 'xn--lten-gra', 'xn--lury-ira', 'xn--mely-ira', 'xn--merker-kua', 'xn--mjndalen-64a', 'xn--mlatvuopmi-s4a', 'xn--mli-tla', 'xn--mlselv-iua', 'xn--moreke-jua', 'xn--mosjen-eya', 'xn--mot-tla', 'xn--msy-ula0h', 'xn--mtta-vrjjat-k7af', 'xn--muost-0qa', 'xn--nmesjevuemie-tcba', 'xn--nry-yla5g', 'xn--nttery-byae', 'xn--nvuotna-hwa', 'xn--oppegrd-ixa', 'xn--ostery-fya', 'xn--osyro-wua', 'xn--porsgu-sta26f', 'xn--rady-ira', 'xn--rdal-poa', 'xn--rde-ula', 'xn--rdy-0nab', 'xn--rennesy-v1a', 'xn--rhkkervju-01af', 'xn--rholt-mra', 'xn--risa-5na', 'xn--risr-ira', 'xn--rland-uua', 'xn--rlingen-mxa', 'xn--rmskog-bya', 'xn--rros-gra', 'xn--rskog-uua', 'xn--rst-0na', 'xn--rsta-fra', 'xn--ryken-vua', 'xn--ryrvik-bya', 'xn--s-1fa', 'xn--sandnessjen-ogb', 'xn--sandy-yua', 'xn--seral-lra', 'xn--sgne-gra', 'xn--skierv-uta', 'xn--skjervy-v1a', 'xn--skjk-soa', 'xn--sknit-yqa', 'xn--sknland-fxa', 'xn--slat-5na', 'xn--slt-elab', 'xn--smla-hra', 'xn--smna-gra', 'xn--snase-nra', 'xn--sndre-land-0cb', 'xn--snes-poa', 'xn--snsa-roa', 'xn--sr-aurdal-l8a', 'xn--sr-fron-q1a', 'xn--sr-odal-q1a', 'xn--sr-varanger-ggb', 'xn--srfold-bya', 'xn--srreisa-q1a', 'xn--srum-gra', 'xn--stjrdal-s1a', 'xn--stjrdalshalsen-sqb', 'xn--stre-toten-zcb', 'xn--tjme-hra', 'xn--tnsberg-q1a', 'xn--trany-yua', 'xn--trgstad-r1a', 'xn--trna-woa', 'xn--troms-zua', 'xn--tysvr-vra', 'xn--unjrga-rta', 'xn--vads-jra', 'xn--vard-jra', 'xn--vegrshei-c0a', 'xn--vestvgy-ixa6o', 'xn--vg-yiab', 'xn--vgan-qoa', 'xn--vgsy-qoa0j', 'xn--vre-eiker-k8a', 'xn--vrggt-xqad', 'xn--vry-yla5g', 'xn--yer-zna', 'xn--ygarden-p1a', 'xn--ystre-slidre-ujb'].includes(wa[1])) {
  1225. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1226. }
  1227. break;
  1228. case 'np':
  1229. if (['aero', 'asia', 'biz', 'com', 'coop', 'edu', 'gov', 'info', 'jobs', 'mil', 'mobi', 'museum', 'name', 'net', 'org', 'pro', 'services', 'travel'].includes(wa[1])) {
  1230. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1231. }
  1232. break;
  1233. case 'nr':
  1234. if (['biz', 'com', 'edu', 'gov', 'info', 'net', 'org'].includes(wa[1])) {
  1235. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1236. }
  1237. break;
  1238. case 'nz':
  1239. if (['ac', 'archie', 'co', 'cri', 'geek', 'gen', 'govt', 'health', 'iwi', 'kiwi', 'maori', 'mil', 'net', 'org', 'parliament', 'school', 'xn--mori-qsa'].includes(wa[1])) {
  1240. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1241. }
  1242. break;
  1243. case 'om':
  1244. if (['co', 'com', 'edu', 'gov', 'med', 'museum', 'net', 'org', 'pro'].includes(wa[1])) {
  1245. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1246. }
  1247. break;
  1248. case 'org':
  1249. if (wa[1] == 'eu' && wa[3] != undefined) {
  1250. if (['al', 'asso', 'at', 'au', 'be', 'bg', 'ca', 'cd', 'ch', 'cn', 'cy', 'cz', 'de', 'dk', 'edu', 'ee', 'es', 'fi', 'fr', 'gr', 'hr', 'hu', 'ie', 'il', 'in', 'int', 'is', 'it', 'jp', 'kr', 'lt', 'lu', 'lv', 'me', 'mk', 'mt', 'my', 'net', 'ng', 'nl', 'no', 'nz', 'pl', 'pt', 'ro', 'ru', 'se', 'si', 'sk', 'tr', 'uk', 'us'].includes(wa[2])) {
  1251. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1252. }
  1253. }
  1254. if (['ae', 'eu', 'hk', 'jpn', 'js', 'us', 'za'].includes(wa[1])) {
  1255. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1256. }
  1257. break;
  1258. case 'pa':
  1259. if (['abo', 'ac', 'com', 'edu', 'gob', 'ing', 'med', 'net', 'nom', 'org', 'sld'].includes(wa[1])) {
  1260. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1261. }
  1262. break;
  1263. case 'pe':
  1264. if (['com', 'edu', 'gob', 'mil', 'net', 'nom', 'org', 'sld'].includes(wa[1])) {
  1265. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1266. }
  1267. break;
  1268. case 'pf':
  1269. if (['com', 'edu', 'org'].includes(wa[1])) {
  1270. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1271. }
  1272. break;
  1273. case 'pg':
  1274. if (['ac', 'com', 'gov', 'mil', 'net', 'org'].includes(wa[1])) {
  1275. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1276. }
  1277. break;
  1278. case 'ph':
  1279. if (['com', 'edu', 'gov', 'i', 'mil', 'net', 'ngo', 'org'].includes(wa[1])) {
  1280. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1281. }
  1282. break;
  1283. case 'pk':
  1284. if (['biz', 'com', 'edu', 'fam', 'gob', 'gok', 'gon', 'gop', 'gos', 'gov', 'info', 'net', 'org', 'web'].includes(wa[1])) {
  1285. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1286. }
  1287. break;
  1288. case 'pl':
  1289. if (wa[1] == 'gov' && wa[3] != undefined) {
  1290. if (['ap', 'griw', 'ic', 'is', 'kmpsp', 'konsulat', 'kppsp', 'kwp', 'kwpsp', 'mup', 'mw', 'oirm', 'oum', 'pa', 'pinb', 'piw', 'po', 'psp', 'psse', 'pup', 'rzgw', 'sa', 'sdn', 'sko', 'so', 'sr', 'starostwo', 'ug', 'ugim', 'um', 'umig', 'upow', 'uppo', 'us', 'uw', 'uzs', 'wif', 'wiih', 'winb', 'wios', 'witd', 'wiw', 'wsa', 'wskr', 'wuoz', 'wzmiuw', 'zp'].includes(wa[2])) {
  1291. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1292. }
  1293. }
  1294. if (['agro', 'aid', 'art', 'atm', 'augustow', 'auto', 'babia-gora', 'bedzin', 'beskidy', 'bialowieza', 'bialystok', 'bielawa', 'bieszczady', 'biz', 'boleslawiec', 'bydgoszcz', 'bytom', 'cieszyn', 'com', 'czeladz', 'czest', 'dlugoleka', 'edu', 'elblag', 'elk', 'gda', 'gdansk', 'glogow', 'gmina', 'gniezno', 'gorlice', 'gov', 'grajewo', 'gsm', 'ilawa', 'info', 'jaworzno', 'jelenia-gora', 'jgora', 'kalisz', 'karpacz', 'kartuzy', 'kaszuby', 'katowice', 'kazimierz-dolny', 'kepno', 'ketrzyn', 'klodzko', 'kobierzyce', 'kolobrzeg', 'konin', 'konskowola', 'krakow', 'kutno', 'lapy', 'lebork', 'legnica', 'lezajsk', 'limanowa', 'lodz', 'lomza', 'lowicz', 'lubin', 'lublin', 'lukow', 'mail', 'malbork', 'malopolska', 'mazowsze', 'mazury', 'media', 'miasta', 'mielec', 'mielno', 'mil', 'mragowo', 'naklo', 'net', 'ngo', 'nieruchomosci', 'nom', 'nowaruda', 'nysa', 'olawa', 'olecko', 'olkusz', 'olsztyn', 'opoczno', 'opole', 'org', 'ostroda', 'ostroleka', 'ostrowiec', 'ostrowwlkp', 'pc', 'pila', 'pisz', 'podhale', 'podlasie', 'polkowice', 'pomorskie', 'pomorze', 'powiat', 'poznan', 'priv', 'prochowice', 'pruszkow', 'przeworsk', 'pulawy', 'radom', 'rawa-maz', 'realestate', 'rel', 'rybnik', 'rzeszow', 'sanok', 'sejny', 'sex', 'shop', 'sklep', 'skoczow', 'slask', 'slupsk', 'sos', 'sosnowiec', 'stalowa-wola', 'starachowice', 'stargard', 'suwalki', 'swidnica', 'swiebodzin', 'swinoujscie', 'szczecin', 'szczytno', 'szkola', 'targi', 'tarnobrzeg', 'tgory', 'tm', 'torun', 'tourism', 'travel', 'turek', 'turystyka', 'tychy', 'ustka', 'walbrzych', 'warmia', 'warszawa', 'waw', 'wegrow', 'wielun', 'wlocl', 'wloclawek', 'wodzislaw', 'wolomin', 'wroc', 'wroclaw', 'zachpomor', 'zagan', 'zarow', 'zgora', 'zgorzelec'].includes(wa[1])) {
  1295. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1296. }
  1297. break;
  1298. case 'pn':
  1299. if (['co', 'edu', 'eu', 'gov', 'government', 'in', 'me', 'net', 'org'].includes(wa[1])) {
  1300. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1301. }
  1302. break;
  1303. case 'pr':
  1304. if (['ac', 'biz', 'com', 'edu', 'est', 'gov', 'info', 'isla', 'name', 'net', 'org', 'pro', 'prof'].includes(wa[1])) {
  1305. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1306. }
  1307. break;
  1308. case 'pro':
  1309. if (['aaa', 'aca', 'acct', 'avocat', 'bar', 'cpa', 'eng', 'jur', 'law', 'med', 'recht'].includes(wa[1])) {
  1310. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1311. }
  1312. break;
  1313. case 'ps':
  1314. if (['com', 'edu', 'gov', 'net', 'org', 'plo', 'sec'].includes(wa[1])) {
  1315. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1316. }
  1317. break;
  1318. case 'pt':
  1319. if (['com', 'edu', 'gov', 'int', 'net', 'nome', 'org', 'publ'].includes(wa[1])) {
  1320. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1321. }
  1322. break;
  1323. case 'pw':
  1324. if (['belau', 'co', 'ed', 'go', 'ne', 'or'].includes(wa[1])) {
  1325. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1326. }
  1327. break;
  1328. case 'py':
  1329. if (['com', 'coop', 'edu', 'gov', 'mil', 'net', 'org', 'una'].includes(wa[1])) {
  1330. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1331. }
  1332. break;
  1333. case 'qa':
  1334. if (['com', 'edu', 'gov', 'mil', 'name', 'net', 'org', 'sch'].includes(wa[1])) {
  1335. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1336. }
  1337. break;
  1338. case 're':
  1339. if (['asso', 'com', 'nom'].includes(wa[1])) {
  1340. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1341. }
  1342. break;
  1343. case 'ro':
  1344. if (['arts', 'com', 'firm', 'gov', 'info', 'nom', 'nt', 'org', 'rec', 'store', 'tm', 'www'].includes(wa[1])) {
  1345. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1346. }
  1347. break;
  1348. case 'rs':
  1349. if (['ac', 'co', 'edu', 'gov', 'in', 'org'].includes(wa[1])) {
  1350. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1351. }
  1352. break;
  1353. case 'ru':
  1354. if (['ac', 'adygeya', 'altai', 'amur', 'amursk', 'arkhangelsk', 'astrakhan', 'baikal', 'bashkiria', 'belgorod', 'bir', 'bryansk', 'buryatia', 'cap', 'cbg', 'chel', 'chelyabinsk', 'chita', 'chukotka', 'cmw', 'com', 'dagestan', 'e-burg', 'edu', 'fareast', 'gov', 'grozny', 'int', 'irkutsk', 'ivanovo', 'izhevsk', 'jamal', 'jar', 'joshkar-ola', 'k-uralsk', 'kalmykia', 'kaluga', 'kamchatka', 'karelia', 'kazan', 'kchr', 'kemerovo', 'khabarovsk', 'khakassia', 'khv', 'kirov', 'kms', 'koenig', 'komi', 'kostroma', 'krasnoyarsk', 'kuban', 'kurgan', 'kursk', 'kustanai', 'kuzbass', 'lipetsk', 'magadan', 'magnitka', 'mari', 'mari-el', 'marine', 'mil', 'mordovia', 'mos', 'mosreg', 'msk', 'murmansk', 'mytis', 'nakhodka', 'nalchik', 'net', 'nkz', 'nnov', 'norilsk', 'nov', 'novosibirsk', 'nsk', 'omsk', 'orenburg', 'org', 'oryol', 'oskol', 'palana', 'penza', 'perm', 'pp', 'pskov', 'ptz', 'pyatigorsk', 'rnd', 'rubtsovsk', 'ryazan', 'sakhalin', 'samara', 'saratov', 'simbirsk', 'smolensk', 'snz', 'spb', 'stavropol', 'stv', 'surgut', 'syzran', 'tambov', 'tatarstan', 'test', 'tlt', 'tom', 'tomsk', 'tsaritsyn', 'tsk', 'tula', 'tuva', 'tver', 'tyumen', 'udm', 'udmurtia', 'ulan-ude', 'vdonsk', 'vladikavkaz', 'vladimir', 'vladivostok', 'volgograd', 'vologda', 'voronezh', 'vrn', 'vyatka', 'yakutia', 'yamal', 'yaroslavl', 'yekaterinburg', 'yuzhno-sakhalinsk', 'zgrad'].includes(wa[1])) {
  1355. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1356. }
  1357. break;
  1358. case 'rw':
  1359. if (['ac', 'co', 'com', 'coop', 'edu', 'gouv', 'gov', 'int', 'mil', 'net', 'org'].includes(wa[1])) {
  1360. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1361. }
  1362. break;
  1363. case 'sa':
  1364. if (['com', 'edu', 'gov', 'med', 'net', 'org', 'pub', 'sch'].includes(wa[1])) {
  1365. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1366. }
  1367. break;
  1368. case 'sb':
  1369. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  1370. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1371. }
  1372. break;
  1373. case 'sc':
  1374. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  1375. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1376. }
  1377. break;
  1378. case 'scot':
  1379. if (wa[1] == 'gov') {
  1380. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1381. }
  1382. break;
  1383. case 'sd':
  1384. if (['com', 'edu', 'gov', 'info', 'med', 'net', 'org', 'tv'].includes(wa[1])) {
  1385. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1386. }
  1387. break;
  1388. case 'se':
  1389. if (['a', 'ac', 'b', 'bd', 'brand', 'c', 'd', 'e', 'f', 'fh', 'fhsk', 'fhv', 'g', 'gov', 'h', 'i', 'k', 'komforb', 'kommunalforbund', 'komvux', 'l', 'lanbib', 'm', 'n', 'naturbruksgymn', 'o', 'org', 'p', 'parti', 'pp', 'press', 'r', 's', 't', 'tm', 'u', 'w', 'x', 'y', 'z'].includes(wa[1])) {
  1390. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1391. }
  1392. break;
  1393. case 'sg':
  1394. if (['com', 'edu', 'gov', 'idn', 'net', 'org', 'per'].includes(wa[1])) {
  1395. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1396. }
  1397. break;
  1398. case 'sh':
  1399. if (['com', 'gov', 'mil', 'net', 'org'].includes(wa[1])) {
  1400. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1401. }
  1402. break;
  1403. case 'si':
  1404. if (wa[1] == 'gov') {
  1405. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1406. }
  1407. break;
  1408. case 'sk':
  1409. if (wa[1] == 'gov') {
  1410. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1411. }
  1412. break;
  1413. case 'sl':
  1414. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  1415. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1416. }
  1417. break;
  1418. case 'sn':
  1419. if (['art', 'com', 'edu', 'gouv', 'org', 'perso', 'univ'].includes(wa[1])) {
  1420. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1421. }
  1422. break;
  1423. case 'so':
  1424. if (['com', 'edu', 'gm', 'gov', 'hs', 'jl', 'me', 'net', 'org', 'pl', 'sch', 'sw'].includes(wa[1])) {
  1425. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1426. }
  1427. break;
  1428. case 'ss':
  1429. if (['biz', 'com', 'edu', 'gov', 'me', 'net', 'org', 'sch'].includes(wa[1])) {
  1430. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1431. }
  1432. break;
  1433. case 'st':
  1434. if (['co', 'com', 'consulado', 'edu', 'embaixada', 'gov', 'mil', 'net', 'org', 'principe', 'saotome', 'store'].includes(wa[1])) {
  1435. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1436. }
  1437. break;
  1438. case 'sv':
  1439. if (['com', 'edu', 'gob', 'gov', 'org', 'red'].includes(wa[1])) {
  1440. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1441. }
  1442. break;
  1443. case 'sx':
  1444. if (wa[1] == 'gov') {
  1445. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1446. }
  1447. break;
  1448. case 'sy':
  1449. if (['com', 'edu', 'gov', 'mil', 'net', 'org'].includes(wa[1])) {
  1450. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1451. }
  1452. break;
  1453. case 'sz':
  1454. if (['ac', 'co', 'gov', 'org'].includes(wa[1])) {
  1455. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1456. }
  1457. break;
  1458. case 'th':
  1459. if (['ac', 'co', 'go', 'in', 'mi', 'net', 'or'].includes(wa[1])) {
  1460. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1461. }
  1462. break;
  1463. case 'tj':
  1464. if (['ac', 'aero', 'biz', 'co', 'com', 'coop', 'dyn', 'edu', 'go', 'gov', 'info', 'int', 'mil', 'museum', 'my', 'name', 'net', 'nic', 'org', 'per', 'pro', 'test', 'web'].includes(wa[1])) {
  1465. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1466. }
  1467. break;
  1468. case 'tl':
  1469. if (wa[1] == 'gov') {
  1470. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1471. }
  1472. break;
  1473. case 'tm':
  1474. if (['co', 'com', 'edu', 'gov', 'mil', 'net', 'nom', 'org'].includes(wa[1])) {
  1475. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1476. }
  1477. break;
  1478. case 'tn':
  1479. if (['agrinet', 'com', 'defense', 'edunet', 'ens', 'fin', 'gov', 'ind', 'info', 'intl', 'mincom', 'nat', 'net', 'org', 'perso', 'rnrt', 'rns', 'rnu', 'tourism', 'turen'].includes(wa[1])) {
  1480. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1481. }
  1482. break;
  1483. case 'to':
  1484. if (['com', 'edu', 'gov', 'mil', 'net', 'org'].includes(wa[1])) {
  1485. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1486. }
  1487. break;
  1488. case 'tr':
  1489. if (wa[1] == 'nc' && wa[3] != undefined) {
  1490. if (wa[2] == 'gov') {
  1491. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1492. }
  1493. }
  1494. if (['av', 'bbs', 'bel', 'biz', 'com', 'dr', 'edu', 'gen', 'gov', 'info', 'k12', 'kep', 'mil', 'name', 'nc', 'net', 'nom', 'org', 'pol', 'tel', 'tsk', 'tv', 'web'].includes(wa[1])) {
  1495. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1496. }
  1497. break;
  1498. case 'tt':
  1499. if (['aero', 'biz', 'co', 'com', 'coop', 'edu', 'gov', 'info', 'int', 'jobs', 'mobi', 'museum', 'name', 'net', 'org', 'pro', 'travel'].includes(wa[1])) {
  1500. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1501. }
  1502. break;
  1503. case 'tw':
  1504. if (['club', 'com', 'ebiz', 'edu', 'game', 'gov', 'idv', 'mil', 'net', 'org', 'xn--czrw28b', 'xn--uc0atv', 'xn--zf0ao64a'].includes(wa[1])) {
  1505. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1506. }
  1507. break;
  1508. case 'tz':
  1509. if (['ac', 'co', 'go', 'hotel', 'info', 'me', 'mil', 'mobi', 'ne', 'or', 'sc', 'tv'].includes(wa[1])) {
  1510. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1511. }
  1512. break;
  1513. case 'ua':
  1514. if (['at', 'cherkassy', 'cherkasy', 'chernigov', 'chernihiv', 'chernivtsi', 'chernovtsy', 'ck', 'cn', 'co', 'com', 'cr', 'crimea', 'cv', 'dn', 'dnepropetrovsk', 'dnipropetrovsk', 'dominic', 'donetsk', 'dp', 'edu', 'gov', 'if', 'in', 'ivano-frankivsk', 'kh', 'kharkiv', 'kharkov', 'kherson', 'khmelnitskiy', 'khmelnytskyi', 'kiev', 'kirovograd', 'km', 'kr', 'krym', 'ks', 'kv', 'kyiv', 'lg', 'lt', 'lugansk', 'lutsk', 'lv', 'lviv', 'mk', 'mykolaiv', 'net', 'nikolaev', 'od', 'odesa', 'odessa', 'org', 'pl', 'poltava', 'pp', 'rivne', 'rovno', 'rv', 'sb', 'sebastopol', 'sevastopol', 'sm', 'sumy', 'te', 'ternopil', 'uz', 'uzhgorod', 'vinnica', 'vinnytsia', 'vn', 'volyn', 'yalta', 'zaporizhzhe', 'zaporizhzhia', 'zhitomir', 'zhytomyr', 'zp', 'zt'].includes(wa[1])) {
  1515. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1516. }
  1517. break;
  1518. case 'ug':
  1519. if (['ac', 'co', 'com', 'go', 'ne', 'or', 'org', 'sc'].includes(wa[1])) {
  1520. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1521. }
  1522. break;
  1523. case 'uk':
  1524. if (['ac', 'bl', 'british-library', 'co', 'gov', 'govt', 'jcpc', 'jet', 'judiciary', 'lea', 'ltd', 'me', 'mil', 'mod', 'net', 'nhs', 'nic', 'nls', 'org', 'orgn', 'parliament', 'plc', 'police', 'rct', 'royal', 'sch', 'supremecourt'].includes(wa[1])) {
  1525. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1526. }
  1527. break;
  1528. case 'us':
  1529. if (wa[1] == 'wy' && wa[3] != undefined) {
  1530. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1531. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1532. }
  1533. }
  1534. if (wa[1] == 'wv' && wa[3] != undefined) {
  1535. if (wa[2] == 'cc') {
  1536. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1537. }
  1538. }
  1539. if (wa[1] == 'wi' && wa[3] != undefined) {
  1540. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1541. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1542. }
  1543. }
  1544. if (wa[1] == 'wa' && wa[3] != undefined) {
  1545. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1546. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1547. }
  1548. }
  1549. if (wa[1] == 'vt' && wa[3] != undefined) {
  1550. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1551. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1552. }
  1553. }
  1554. if (wa[1] == 'vi' && wa[3] != undefined) {
  1555. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1556. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1557. }
  1558. }
  1559. if (wa[1] == 'va' && wa[3] != undefined) {
  1560. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1561. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1562. }
  1563. }
  1564. if (wa[1] == 'ut' && wa[3] != undefined) {
  1565. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1566. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1567. }
  1568. }
  1569. if (wa[1] == 'tx' && wa[3] != undefined) {
  1570. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1571. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1572. }
  1573. }
  1574. if (wa[1] == 'tn' && wa[3] != undefined) {
  1575. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1576. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1577. }
  1578. }
  1579. if (wa[1] == 'sd' && wa[3] != undefined) {
  1580. if (['cc', 'lib'].includes(wa[2])) {
  1581. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1582. }
  1583. }
  1584. if (wa[1] == 'sc' && wa[3] != undefined) {
  1585. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1586. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1587. }
  1588. }
  1589. if (wa[1] == 'ri' && wa[3] != undefined) {
  1590. if (['cc', 'lib'].includes(wa[2])) {
  1591. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1592. }
  1593. }
  1594. if (wa[1] == 'pr' && wa[3] != undefined) {
  1595. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1596. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1597. }
  1598. }
  1599. if (wa[1] == 'pa' && wa[3] != undefined) {
  1600. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1601. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1602. }
  1603. }
  1604. if (wa[1] == 'or' && wa[3] != undefined) {
  1605. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1606. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1607. }
  1608. }
  1609. if (wa[1] == 'ok' && wa[3] != undefined) {
  1610. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1611. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1612. }
  1613. }
  1614. if (wa[1] == 'oh' && wa[3] != undefined) {
  1615. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1616. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1617. }
  1618. }
  1619. if (wa[1] == 'ny' && wa[3] != undefined) {
  1620. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1621. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1622. }
  1623. }
  1624. if (wa[1] == 'nv' && wa[3] != undefined) {
  1625. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1626. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1627. }
  1628. }
  1629. if (wa[1] == 'nm' && wa[3] != undefined) {
  1630. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1631. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1632. }
  1633. }
  1634. if (wa[1] == 'nj' && wa[3] != undefined) {
  1635. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1636. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1637. }
  1638. }
  1639. if (wa[1] == 'nh' && wa[3] != undefined) {
  1640. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1641. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1642. }
  1643. }
  1644. if (wa[1] == 'ne' && wa[3] != undefined) {
  1645. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1646. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1647. }
  1648. }
  1649. if (wa[1] == 'nd' && wa[3] != undefined) {
  1650. if (['cc', 'lib'].includes(wa[2])) {
  1651. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1652. }
  1653. }
  1654. if (wa[1] == 'nc' && wa[3] != undefined) {
  1655. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1656. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1657. }
  1658. }
  1659. if (wa[1] == 'mt' && wa[3] != undefined) {
  1660. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1661. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1662. }
  1663. }
  1664. if (wa[1] == 'ms' && wa[3] != undefined) {
  1665. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1666. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1667. }
  1668. }
  1669. if (wa[1] == 'mo' && wa[3] != undefined) {
  1670. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1671. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1672. }
  1673. }
  1674. if (wa[1] == 'mn' && wa[3] != undefined) {
  1675. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1676. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1677. }
  1678. }
  1679. if (wa[1] == 'mi' && wa[3] != undefined) {
  1680. if (['ann-arbor', 'cc', 'cog', 'dst', 'eaton', 'gen', 'k12', 'lib', 'mus', 'tec', 'washtenaw'].includes(wa[2])) {
  1681. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1682. }
  1683. }
  1684. if (wa[1] == 'me' && wa[3] != undefined) {
  1685. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1686. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1687. }
  1688. }
  1689. if (wa[1] == 'md' && wa[3] != undefined) {
  1690. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1691. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1692. }
  1693. }
  1694. if (wa[1] == 'ma' && wa[3] != undefined) {
  1695. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1696. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1697. }
  1698. }
  1699. if (wa[1] == 'la' && wa[3] != undefined) {
  1700. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1701. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1702. }
  1703. }
  1704. if (wa[1] == 'ky' && wa[3] != undefined) {
  1705. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1706. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1707. }
  1708. }
  1709. if (wa[1] == 'ks' && wa[3] != undefined) {
  1710. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1711. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1712. }
  1713. }
  1714. if (wa[1] == 'in' && wa[3] != undefined) {
  1715. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1716. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1717. }
  1718. }
  1719. if (wa[1] == 'il' && wa[3] != undefined) {
  1720. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1721. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1722. }
  1723. }
  1724. if (wa[1] == 'id' && wa[3] != undefined) {
  1725. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1726. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1727. }
  1728. }
  1729. if (wa[1] == 'ia' && wa[3] != undefined) {
  1730. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1731. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1732. }
  1733. }
  1734. if (wa[1] == 'hi' && wa[3] != undefined) {
  1735. if (['cc', 'lib'].includes(wa[2])) {
  1736. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1737. }
  1738. }
  1739. if (wa[1] == 'gu' && wa[3] != undefined) {
  1740. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1741. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1742. }
  1743. }
  1744. if (wa[1] == 'ga' && wa[3] != undefined) {
  1745. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1746. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1747. }
  1748. }
  1749. if (wa[1] == 'fl' && wa[3] != undefined) {
  1750. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1751. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1752. }
  1753. }
  1754. if (wa[1] == 'de' && wa[3] != undefined) {
  1755. if (['cc', 'k12'].includes(wa[2])) {
  1756. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1757. }
  1758. }
  1759. if (wa[1] == 'dc' && wa[3] != undefined) {
  1760. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1761. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1762. }
  1763. }
  1764. if (wa[1] == 'ct' && wa[3] != undefined) {
  1765. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1766. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1767. }
  1768. }
  1769. if (wa[1] == 'co' && wa[3] != undefined) {
  1770. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1771. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1772. }
  1773. }
  1774. if (wa[1] == 'ca' && wa[3] != undefined) {
  1775. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1776. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1777. }
  1778. }
  1779. if (wa[1] == 'az' && wa[3] != undefined) {
  1780. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1781. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1782. }
  1783. }
  1784. if (wa[1] == 'as' && wa[3] != undefined) {
  1785. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1786. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1787. }
  1788. }
  1789. if (wa[1] == 'ar' && wa[3] != undefined) {
  1790. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1791. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1792. }
  1793. }
  1794. if (wa[1] == 'al' && wa[3] != undefined) {
  1795. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1796. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1797. }
  1798. }
  1799. if (wa[1] == 'ak' && wa[3] != undefined) {
  1800. if (['cc', 'k12', 'lib'].includes(wa[2])) {
  1801. return wa[3] + '.' + wa[2] + '.' + wa[1] + '.' + wa[0];
  1802. }
  1803. }
  1804. if (['aa', 'ae', 'ak', 'al', 'ap', 'ar', 'as', 'az', 'ca', 'cm', 'co', 'ct', 'cz', 'dc', 'de', 'dni', 'fed', 'fl', 'fm', 'ga', 'gu', 'hi', 'ia', 'id', 'il', 'in', 'isa', 'kids', 'ks', 'ky', 'la', 'ma', 'md', 'me', 'mh', 'mi', 'mn', 'mo', 'mp', 'ms', 'mt', 'nb', 'nc', 'nd', 'ne', 'nh', 'nj', 'nm', 'nsn', 'nv', 'ny', 'oh', 'ok', 'or', 'pa', 'pi', 'pr', 'pw', 'ri', 'sc', 'sd', 'tn', 'tt', 'tx', 'ut', 'va', 'vi', 'vt', 'wa', 'wi', 'wv', 'wy'].includes(wa[1])) {
  1805. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1806. }
  1807. break;
  1808. case 'uy':
  1809. if (['com', 'edu', 'gub', 'mil', 'net', 'org'].includes(wa[1])) {
  1810. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1811. }
  1812. break;
  1813. case 'uz':
  1814. if (['co', 'com', 'net', 'org'].includes(wa[1])) {
  1815. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1816. }
  1817. break;
  1818. case 'vc':
  1819. if (['com', 'edu', 'gov', 'mil', 'net', 'org'].includes(wa[1])) {
  1820. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1821. }
  1822. break;
  1823. case 've':
  1824. if (['arts', 'bib', 'co', 'com', 'e12', 'edu', 'firm', 'gob', 'gov', 'info', 'int', 'mil', 'net', 'nom', 'org', 'radio', 'rar', 'rec', 'store', 'tec', 'web'].includes(wa[1])) {
  1825. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1826. }
  1827. break;
  1828. case 'vi':
  1829. if (['co', 'com', 'k12', 'net', 'org'].includes(wa[1])) {
  1830. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1831. }
  1832. break;
  1833. case 'vn':
  1834. if (['ac', 'biz', 'com', 'edu', 'gov', 'health', 'info', 'int', 'mil', 'name', 'net', 'org', 'pro'].includes(wa[1])) {
  1835. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1836. }
  1837. break;
  1838. case 'vu':
  1839. if (['com', 'edu', 'net', 'org'].includes(wa[1])) {
  1840. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1841. }
  1842. break;
  1843. case 'wales':
  1844. if (wa[1] == 'gov') {
  1845. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1846. }
  1847. break;
  1848. case 'ws':
  1849. if (['com', 'edu', 'gov', 'net', 'org'].includes(wa[1])) {
  1850. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1851. }
  1852. break;
  1853. case 'xn--4dbrk0ce':
  1854. if (['xn--4dbgdty6c', 'xn--5dbhl8d', 'xn--8dbq2a', 'xn--hebda8b'].includes(wa[1])) {
  1855. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1856. }
  1857. break;
  1858. case 'xn--90a3ac':
  1859. if (['xn--80au', 'xn--90azh', 'xn--c1avg', 'xn--d1at', 'xn--o1ac', 'xn--o1ach'].includes(wa[1])) {
  1860. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1861. }
  1862. break;
  1863. case 'xn--j6w193g':
  1864. if (['xn--55qx5d', 'xn--gmqw5a', 'xn--mxtq1m', 'xn--od0alg', 'xn--uc0atv', 'xn--wcvs22d'].includes(wa[1])) {
  1865. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1866. }
  1867. break;
  1868. case 'xn--o3cw4h':
  1869. if (['xn--12c1fe0br', 'xn--12cfi8ixb8l', 'xn--12co0c3b4eva', 'xn--h3cuzk1di', 'xn--m3ch0j3a', 'xn--o3cyx2a'].includes(wa[1])) {
  1870. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1871. }
  1872. break;
  1873. case 'ye':
  1874. if (['co', 'com', 'edu', 'gov', 'ltd', 'me', 'mil', 'net', 'org', 'plc'].includes(wa[1])) {
  1875. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1876. }
  1877. break;
  1878. case 'za':
  1879. if (['ac', 'agric', 'alt', 'bourse', 'city', 'co', 'cybernet', 'db', 'edu', 'gov', 'grondar', 'iaccess', 'imt', 'inca', 'landesign', 'law', 'mil', 'net', 'ngo', 'nic', 'nis', 'nom', 'olivetti', 'org', 'pix', 'school', 'tm', 'web'].includes(wa[1])) {
  1880. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1881. }
  1882. break;
  1883. case 'zm':
  1884. if (['ac', 'biz', 'co', 'com', 'edu', 'gov', 'info', 'mil', 'net', 'org', 'sch'].includes(wa[1])) {
  1885. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1886. }
  1887. break;
  1888. case 'zw':
  1889. if (['ac', 'co', 'gov', 'mil', 'org'].includes(wa[1])) {
  1890. return wa[2] + '.' + wa[1] + '.' + wa[0];
  1891. }
  1892. break;
  1893. }
  1894. return wa[1] + '.' + wa[0];
  1895. }
  1896. function chgLDR() {
  1897. let rl = rle.createInterface(process.stdin, process.stdout);
  1898. console.log('Current save directory: ' + myConfig['save']);
  1899. console.log('Leave it empty to use default location.');
  1900. rl.question('List save directory: ', (l) => {
  1901. rl.close();
  1902. if (l.length > 1 && l !== 'empty') {
  1903. if (l.indexOf('/', l.length - 1) !== -1) {
  1904. if (fs.existsSync(l) && fs.lstatSync(l).isDirectory()) {
  1905. saveConf('save', l);
  1906. } else {
  1907. forceExit('Directory not found');
  1908. }
  1909. } else {
  1910. forceExit('Directory is not ended with /');
  1911. }
  1912. } else {
  1913. saveConf('save', '');
  1914. }
  1915. process.exit();
  1916. });
  1917. }
  1918. function chgPROXY() {
  1919. let rl = rle.createInterface(process.stdin, process.stdout);
  1920. console.log('Current SOCKS Proxy: ' + myConfig['proxy']);
  1921. console.log('Set none to use direct connection.');
  1922. rl.question('Input SOCKS Proxy [IP:Port]: ', (l) => {
  1923. rl.close();
  1924. if (/^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\:([0-9]{1,5})$/.test(l)) {
  1925. saveConf('proxy', l);
  1926. } else {
  1927. saveConf('proxy', '');
  1928. }
  1929. process.exit();
  1930. });
  1931. }
  1932. function chgDNSIP() {
  1933. let rl = rle.createInterface(process.stdin, process.stdout);
  1934. console.log('Current DNS Server: ' + myConfig['dnsip']);
  1935. console.log('Set none to use system default DNS server.');
  1936. rl.question('Input DNS Server [IP or IP:Port]: ', (l) => {
  1937. rl.close();
  1938. if (/^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})(|\:([0-9]{1,5}))$/.test(l)) {
  1939. saveConf('dnsip', l);
  1940. } else {
  1941. saveConf('dnsip', '');
  1942. }
  1943. process.exit();
  1944. });
  1945. }
  1946. function dlCFJson(i) {
  1947. return new Promise((okay, nope) => {
  1948. const curl = cur1.dupHandle(false);
  1949. curl.setOpt('URL', 'https://0xacab.org/dCF/cloudflare_domains/-/raw/master/JSON/cloudflare_' + i + '.json');
  1950. curl.setOpt('USERAGENT', 'Mozilla/5.0 (Windows NT 10.0; rv:102.0) Gecko/20100101 Firefox/102.0');
  1951. if (myConfig['proxy'] != '') {
  1952. curl.setOpt('HTTPPROXYTUNNEL', 1);
  1953. curl.setOpt('PROXY', 'socks5h://' + myConfig['proxy'] + '/');
  1954. }
  1955. curl.on('error', (er, ec) => {
  1956. curl.close();
  1957. console.log('\x1b[31m%s\x1b[0m', er);
  1958. forceExit('Connection Error while downloading list ' + i);
  1959. });
  1960. curl.on('end', (sc, b) => {
  1961. curl.close();
  1962. if (sc != 200) {
  1963. forceExit('Server error ' + r.statusCode);
  1964. }
  1965. try {
  1966. JSON.parse(b)
  1967. } catch (e1) {
  1968. forceExit('Bad Data Error while downloading list ' + i);
  1969. }
  1970. fs.writeFileSync(myConfig['save'] + i, b);
  1971. okay();
  1972. });
  1973. curl.perform();
  1974. });
  1975. }
  1976. function shuffle(array) {
  1977. let currentIndex = array.length,
  1978. randomIndex;
  1979. while (currentIndex != 0) {
  1980. randomIndex = Math.floor(Math.random() * currentIndex);
  1981. currentIndex--;
  1982. [array[currentIndex], array[randomIndex]] = [
  1983. array[randomIndex], array[currentIndex]
  1984. ];
  1985. }
  1986. return array;
  1987. }
  1988. async function do_dlFiles() {
  1989. if (!fs.existsSync(myConfig['save'])) {
  1990. fs.mkdirSync(myConfig['save']);
  1991. }
  1992. if (!fs.existsSync(myConfig['save'])) {
  1993. forceExit('Directory not found!');
  1994. }
  1995. console.log('Starting Download');
  1996. let w, names = alnum.slice();
  1997. let aonly = args[3];
  1998. if (aonly && aonly.length > 0) {
  1999. let names1 = [];
  2000. for (x of aonly.split(',')) {
  2001. if (names.indexOf(x) > -1) {
  2002. names1.push(x);
  2003. }
  2004. }
  2005. if (names1.length > 0) {
  2006. names = names1;
  2007. } else {
  2008. forceExit('invalid input');
  2009. }
  2010. }
  2011. shuffle(names);
  2012. for (x of names) {
  2013. console.log('Downloading ' + x);
  2014. w = await dlCFJson(x);
  2015. }
  2016. for (x of names) {
  2017. console.log(' Testing ' + x);
  2018. if (!fs.existsSync(myConfig['save'] + x)) {
  2019. forceExit('File not found');
  2020. }
  2021. let data = fs.readFileSync(myConfig['save'] + x, {
  2022. encoding: 'utf8'
  2023. });
  2024. try {
  2025. JSON.parse(data)
  2026. } catch (e) {
  2027. forceExit('Bad data found');
  2028. }
  2029. console.log(' OK');
  2030. }
  2031. console.log('All done!');
  2032. process.exit();
  2033. }
  2034. function asking(qs) {
  2035. return new Promise((okay, nope) => {
  2036. const curl = cur1.dupHandle(false);
  2037. curl.setOpt('URL', 'https://karma.crimeflare.eu.org/api/cfdomains/');
  2038. curl.setOpt('USERAGENT', 'CfDomains');
  2039. if (myConfig['proxy'] != '') {
  2040. curl.setOpt('HTTPPROXYTUNNEL', 1);
  2041. curl.setOpt('PROXY', 'socks5h://' + myConfig['proxy'] + '/');
  2042. }
  2043. curl.setOpt(Curl.option.POST, true);
  2044. curl.setOpt(Curl.option.POSTFIELDS, qs);
  2045. curl.on('error', (er, ec) => {
  2046. curl.close();
  2047. okay('');
  2048. });
  2049. curl.on('end', (sc, b) => {
  2050. curl.close();
  2051. if (sc != 404) {
  2052. okay('');
  2053. }
  2054. try {
  2055. JSON.parse(b)
  2056. } catch (e1) {
  2057. okay('');
  2058. }
  2059. okay(b);
  2060. });
  2061. curl.perform();
  2062. });
  2063. }
  2064. function do_lookupOffline(fqdn) {
  2065. let dom = get_realdomain(fqdn);
  2066. if (!is_domain(dom)) {
  2067. sayExit('n');
  2068. }
  2069. if (!fs.existsSync(myConfig['save'] + dom[0])) {
  2070. sayExit('e');
  2071. }
  2072. let data = fs.readFileSync(myConfig['save'] + dom[0], {
  2073. encoding: 'utf8'
  2074. });
  2075. data = JSON.parse(data);
  2076. if (data[dom]) {
  2077. sayExit('y');
  2078. } else {
  2079. sayExit('n');
  2080. }
  2081. }
  2082. async function do_lookupOnline(fqdn) {
  2083. let dom = get_realdomain(fqdn);
  2084. if (!is_domain(dom)) {
  2085. sayExit('n');
  2086. }
  2087. let w = await asking('f=' + fqdn);
  2088. if (w == '[true,true]') {
  2089. sayExit('y');
  2090. } else if (w == '[true,false]') {
  2091. sayExit('n');
  2092. } else {
  2093. sayExit('e');
  2094. }
  2095. }
  2096. function dnsquery(t, q) {
  2097. return new Promise((okay, nope) => {
  2098. if (t == 'NS') {
  2099. dns.resolveNs(q, (err, addresses) => {
  2100. if (err) {
  2101. okay([false, 'You are offline or this is not clean connection.']);
  2102. } else if (addresses.length == 0) {
  2103. okay([true, 'This is not clean connection.']);
  2104. } else {
  2105. okay([true, 'OK']);
  2106. }
  2107. });
  2108. }
  2109. if (t == 'A') {
  2110. dns.resolve4(q, (err, addresses) => {
  2111. if (err) {
  2112. okay([false, 'You are offline or this is not clean connection.']);
  2113. } else if (addresses.length == 0) {
  2114. okay([true, 'This is not clean connection.']);
  2115. } else {
  2116. okay([true, 'OK']);
  2117. }
  2118. });
  2119. }
  2120. });
  2121. }
  2122. function echot(s) {
  2123. let t = new Date();
  2124. console.log('[' + t.getHours() + ':' + t.getMinutes() + ':' + t.getSeconds() + '] ' + s);
  2125. }
  2126. function sleep(ms) {
  2127. return new Promise((resolve) => {
  2128. setTimeout(resolve, ms);
  2129. });
  2130. }
  2131. async function do_warrior() {
  2132. if (myConfig['helper'].length != 64) {
  2133. let rl = rle.createInterface(process.stdin, process.stdout);
  2134. console.log("\n /// #Karma Privacy Policy ///\n");
  2135. console.log(' 1. We do not log your IP address.');
  2136. console.log(' 2. We receive only domain name you analyzed.');
  2137. console.log(' 3. Your WarriorID is random. We use it only to prevent abuse.');
  2138. console.log(' 4. Your WarriorID will be deleted from our server after 7 days of inactivity.');
  2139. console.log();
  2140. console.log(" Please type 'hunting' if you wish to continue.\n");
  2141. rl.question(' Let\'s go ', (l) => {
  2142. rl.close();
  2143. if (l.indexOf('hunting') == 0) {
  2144. const cto = require('crypto');
  2145. saveConf('helper', cto.randomBytes(32).toString('hex'));
  2146. console.log();
  2147. sayExit(" You are ready to use cfdomains --warrior!\n");
  2148. }
  2149. process.exit();
  2150. });
  2151. } else {
  2152. console.log('======================');
  2153. console.log('Press CTRL+C to stop.');
  2154. console.log("======================\n");
  2155. echot('Your ID is ' + myConfig['helper']);
  2156. echot('Starting Warrior');
  2157. if (myConfig['dnsip'] != '') {
  2158. dns.setServers([myConfig['dnsip']]);
  2159. }
  2160. junk = await dnsquery('NS', 'google.com');
  2161. if (junk[1] != 'OK') {
  2162. forceExit(junk[1]);
  2163. }
  2164. junk = await dnsquery('A', 'www.google.com');
  2165. if (junk[1] != 'OK') {
  2166. forceExit(junk[1]);
  2167. }
  2168. echot('Connecting...');
  2169. junk = await asking('do=init&hv=' + myConfig['helper']);
  2170. if (junk.indexOf('[') !== 0) {
  2171. forceExit('Unable to connect.');
  2172. }
  2173. junk = JSON.parse(junk);
  2174. if (!junk[0]) {
  2175. forceExit('Unable to connect.');
  2176. }
  2177. echot(junk[1]);
  2178. let doubt = 0;
  2179. while (true) {
  2180. await sleep(500);
  2181. echot(':: Getting');
  2182. junk = await asking('do=get&hv=' + myConfig['helper']);
  2183. if (junk.indexOf('[') !== 0) {
  2184. echot('Unable to connect. Will try again...');
  2185. await sleep(7000);
  2186. continue;
  2187. }
  2188. junk = JSON.parse(junk);
  2189. if (!junk[0]) {
  2190. forceExit(junk[1]);
  2191. }
  2192. if (junk[1].length < 5) {
  2193. if (junk[1][0] == 'wait!') {
  2194. echot('Waiting for my turn.');
  2195. await sleep(180000);
  2196. }
  2197. continue;
  2198. }
  2199. echot('received ' + junk[1].length);
  2200. echot(':: Analysing');
  2201. let mbd = [],
  2202. j1all = 0;
  2203. for (let bdomain of junk[1]) {
  2204. if (/\.crimeflare$/.test(bdomain)) {
  2205. continue;
  2206. }
  2207. j1all++;
  2208. junk = await dnsquery('NS', bdomain);
  2209. if (junk[1] == 'OK') {
  2210. continue;
  2211. }
  2212. await sleep(100);
  2213. junk = await dnsquery('A', bdomain);
  2214. if (junk[1] == 'OK') {
  2215. continue;
  2216. }
  2217. await sleep(100);
  2218. mbd.push(bdomain);
  2219. }
  2220. if (mbd.length < 1) {
  2221. continue;
  2222. }
  2223. if (mbd.length >= j1all) {
  2224. doubt++;
  2225. } else {
  2226. doubt = 0;
  2227. }
  2228. if (doubt >= 2) {
  2229. junk = await dnsquery('A', 'www.google.com');
  2230. if (junk[1] == 'OK') {
  2231. doubt = -1;
  2232. } else {
  2233. forceExit('This is not clean connection!');
  2234. }
  2235. }
  2236. echot('suspected ' + mbd.length);
  2237. echot(':: Reporting');
  2238. junk = await asking('do=rb&hv=' + myConfig['helper'] + '&ds=' + mbd.join(','));
  2239. if (junk.indexOf('[') !== 0) {
  2240. echot('Unable to connect. Will try again...');
  2241. await sleep(7000);
  2242. continue;
  2243. }
  2244. junk = JSON.parse(junk);
  2245. if (!junk[0]) {
  2246. forceExit(junk[1]);
  2247. }
  2248. }
  2249. }
  2250. }
  2251. async function do_reportUs(yn, fqdn) {
  2252. let dom = get_realdomain(fqdn);
  2253. if (!is_domain(dom)) {
  2254. forceExit('Not domain');
  2255. }
  2256. if (!fs.existsSync(myConfig['save'] + dom[0])) {
  2257. forceExit('List not found');
  2258. }
  2259. let data = fs.readFileSync(myConfig['save'] + dom[0], {
  2260. encoding: 'utf8'
  2261. });
  2262. data = JSON.parse(data);
  2263. if (data[dom]) {
  2264. if (yn == 'y') {
  2265. forceExit('[Local file] Already exist, no need to report.');
  2266. }
  2267. } else {
  2268. if (yn == 'n') {
  2269. forceExit('[Local file] Already not listed, no need to report.');
  2270. }
  2271. }
  2272. console.log('Reporting ' + dom);
  2273. let w = await asking('ana=' + yn + '&f=' + fqdn);
  2274. if (yn == 'y') {
  2275. if (w == '[true,true]') {
  2276. console.log('\x1b[32mResponse\x1b[0m: \x1b[33mNo\x1b[0m, It is already known.');
  2277. } else if (w == '[true,false]') {
  2278. console.log('\x1b[32mResponse\x1b[0m: \x1b[35mRequest received\x1b[0m. It is not listed at this moment.');
  2279. } else {
  2280. forceExit('Bad Response Error!');
  2281. }
  2282. } else {
  2283. if (w == '[true,false]') {
  2284. console.log('\x1b[32mResponse\x1b[0m: \x1b[33mNo\x1b[0m, It is not listed.');
  2285. } else if (w == '[true,true]') {
  2286. console.log('\x1b[32mResponse\x1b[0m: \x1b[35mRequest received\x1b[0m. It is listed at this moment.');
  2287. } else {
  2288. forceExit('Bad Response Error!');
  2289. }
  2290. }
  2291. process.exit();
  2292. }
  2293. async function do_catAtMe(file, expt, online) {
  2294. if (!fs.existsSync(file) || expt == '' || args.length != 5) {
  2295. forceExit('File not found');
  2296. }
  2297. let data = fs.readFileSync(file, {
  2298. encoding: 'utf8'
  2299. });
  2300. data = [...new Set(data.replace(/(?:\r\n|\r|\n)/g, "\n").split("\n"))].filter(v => v != '');
  2301. if (data.length < 1) {
  2302. forceExit('File is empty');
  2303. }
  2304. console.log('Scanning ' + data.length);
  2305. let myCSV = ['Listed,Input'],
  2306. ALU = {
  2307. 'archive.org': 'n'
  2308. },
  2309. FYIcf = 0,
  2310. FYIok = 0;
  2311. for (let line of data) {
  2312. line = line.replaceAll('"', '');
  2313. console.log(' scan = ' + line);
  2314. let dom, fqdn = line.toLowerCase();
  2315. if (/^http(|s):\/\/([0-9a-z]{1})/.test(fqdn)) {
  2316. fqdn = fqdn.split('://')[1].split('/')[0].split(':')[0];
  2317. }
  2318. if (fqdn.length < 4) {
  2319. console.log(' Bad line: ' + line);
  2320. continue;
  2321. }
  2322. dom = get_realdomain(fqdn);
  2323. if (!is_domain(dom)) {
  2324. console.log(' Bad line: ' + line);
  2325. continue;
  2326. }
  2327. if (ALU[dom]) {
  2328. if (ALU[dom] == 'y') {
  2329. FYIcf++;
  2330. } else {
  2331. FYIok++;
  2332. }
  2333. myCSV.push(ALU[dom] + ',"' + line + '"');
  2334. continue;
  2335. }
  2336. if (online) {
  2337. let data = await asking('f=' + fqdn);
  2338. if (data == '[true,true]') {
  2339. myCSV.push('y,"' + line + '"');
  2340. ALU[dom] = 'y';
  2341. FYIcf++;
  2342. } else if (data == '[true,false]') {
  2343. myCSV.push('n,"' + line + '"');
  2344. ALU[dom] = 'n';
  2345. FYIok++;
  2346. } else {
  2347. myCSV.push('e,"' + line + '"');
  2348. FYIok++;
  2349. }
  2350. } else {
  2351. if (!fs.existsSync(myConfig['save'] + dom[0])) {
  2352. myCSV.push('e,"' + line + '"');
  2353. FYIok++;
  2354. } else {
  2355. let data = fs.readFileSync(myConfig['save'] + dom[0], {
  2356. encoding: 'utf8'
  2357. });
  2358. data = JSON.parse(data);
  2359. if (data[dom]) {
  2360. myCSV.push('y,"' + line + '"');
  2361. ALU[dom] = 'y';
  2362. FYIcf++;
  2363. } else {
  2364. myCSV.push('n,"' + line + '"');
  2365. ALU[dom] = 'n';
  2366. FYIok++;
  2367. }
  2368. }
  2369. }
  2370. }
  2371. ALU = null;
  2372. fs.writeFileSync(expt, myCSV.join("\n"));
  2373. console.log('Cloudflare:' + FYIcf + ', Passed:' + FYIok);
  2374. sayExit('Saved to: ' + expt);
  2375. }
  2376. async function do_cleanAtMe(file, expt, online) {
  2377. if (!fs.existsSync(file) || expt == '' || args.length != 5) {
  2378. forceExit('File not found');
  2379. }
  2380. let data = fs.readFileSync(file, {
  2381. encoding: 'utf8'
  2382. });
  2383. data = data.replace(/(?:\r\n|\r|\n)/g, "\n").split("\n");
  2384. if (data.length < 1) {
  2385. forceExit('File is empty');
  2386. }
  2387. console.log('Scanning ' + data.length);
  2388. let myDOC = [],
  2389. myDOCi = 1;
  2390. ALU = {
  2391. 'archive.org': 'n'
  2392. }, FYIcf = 0, FYIok = 0;
  2393. for (let line of data) {
  2394. console.log(' scan L' + myDOCi);
  2395. myDOCi++;
  2396. line = line
  2397. .replaceAll(' ', "\n@__0__@\n")
  2398. .replaceAll('(', "\n@__1__@\n")
  2399. .replaceAll(')', "\n@__2__@\n")
  2400. .replaceAll(',', "\n@__3__@\n")
  2401. .replaceAll('"', "\n@__4__@\n")
  2402. .replaceAll("'", "\n@__5__@\n")
  2403. .replaceAll('|', "\n@__6__@\n")
  2404. .replaceAll('>', "\n@__7__@\n")
  2405. .replaceAll('<', "\n@__8__@\n");
  2406. let lineY = [];
  2407. for (let lineX of line.split("\n")) {
  2408. let dom, fqdn = '';
  2409. if (/^http(|s):\/\/([0-9a-z]{1})/.test(lineX)) {
  2410. fqdn = lineX.split('://')[1].split('/')[0].split(':')[0];
  2411. if (fqdn.length >= 4) {
  2412. dom = get_realdomain(fqdn);
  2413. if (is_domain(dom)) {
  2414. if (ALU[dom]) {
  2415. if (ALU[dom] == 'y') {
  2416. lineX = 'https://web.archive.org/web/' + lineX;
  2417. FYIcf++;
  2418. } else {
  2419. FYIok++;
  2420. }
  2421. } else {
  2422. if (online) {
  2423. let data = await asking('f=' + fqdn);
  2424. if (data == '[true,true]') {
  2425. lineX = 'https://web.archive.org/web/' + lineX;
  2426. ALU[dom] = 'y';
  2427. FYIcf++;
  2428. } else {
  2429. ALU[dom] = 'n';
  2430. FYIok++;
  2431. }
  2432. } else {
  2433. if (!fs.existsSync(myConfig['save'] + dom[0])) {
  2434. ALU[dom] = 'n';
  2435. FYIok++;
  2436. } else {
  2437. let data = fs.readFileSync(myConfig['save'] + dom[0], {
  2438. encoding: 'utf8'
  2439. });
  2440. data = JSON.parse(data);
  2441. if (data[dom]) {
  2442. lineX = 'https://web.archive.org/web/' + lineX;
  2443. ALU[dom] = 'y';
  2444. FYIcf++;
  2445. } else {
  2446. ALU[dom] = 'n';
  2447. FYIok++;
  2448. }
  2449. }
  2450. }
  2451. }
  2452. }
  2453. }
  2454. }
  2455. lineY.push(lineX);
  2456. }
  2457. line = lineY.join('')
  2458. .replaceAll("@__0__@", ' ')
  2459. .replaceAll("@__1__@", '(')
  2460. .replaceAll("@__2__@", ')')
  2461. .replaceAll("@__3__@", ',')
  2462. .replaceAll("@__4__@", '"')
  2463. .replaceAll("@__5__@", "'")
  2464. .replaceAll("@__6__@", '|')
  2465. .replaceAll("@__7__@", '>')
  2466. .replaceAll("@__8__@", '<');
  2467. myDOC.push(line);
  2468. }
  2469. ALU = null;
  2470. fs.writeFileSync(expt, myDOC.join("\n"));
  2471. console.log('Cloudflare(Replaced):' + FYIcf + ', Passed:' + FYIok);
  2472. sayExit('Saved to: ' + expt);
  2473. }
  2474. if (myConfig['cf'] != sCFGFV) {
  2475. let rl = rle.createInterface(process.stdin, process.stdout);
  2476. console.log("\n /// CrimeFlare Welcome You! ///\n");
  2477. console.log(' Thank you for downloading cfdomains.');
  2478. console.log(" Please type 'resist' if you wish to continue.\n");
  2479. rl.question(' Cloudflare, the thing we must ', (l) => {
  2480. rl.close();
  2481. if (l.indexOf('resist') == 0) {
  2482. myConfig['cf'] = sCFGFV;
  2483. myConfig['save'] = './cfdomains_Data/';
  2484. myConfig['proxy'] = '';
  2485. myConfig['helper'] = '';
  2486. saveConf();
  2487. console.log();
  2488. sayExit(" You are ready to use cfdomains!\n");
  2489. }
  2490. process.exit();
  2491. });
  2492. } else if (args.length <= 2) {
  2493. console.log("\n \x1b[33mCfDomains\x1b[0m v" + sVERSION + "-FREE\n");
  2494. console.log('\x1b[36mUsage:\x1b[0m');
  2495. console.log(' cfdomains [| --online ]\x1b[43mwww.example.com\x1b[0m');
  2496. console.log(' cfdomains --dir');
  2497. console.log(' cfdomains --proxy');
  2498. console.log(' cfdomains --dnsip');
  2499. console.log(' cfdomains --dl[| 0,1,...,a,b,...z]');
  2500. console.log(' cfdomains [--report|--delist] \x1b[43mwww.example.com\x1b[0m');
  2501. console.log(' cfdomains [--categorise[|online]|--categorize[|online]] \x1b[43minput.txt\x1b[0m \x1b[43mexport.csv\x1b[0m');
  2502. console.log(' cfdomains --cleanlink[|online] \x1b[43mstory.html\x1b[0m \x1b[43mstory_publish.html\x1b[0m');
  2503. console.log(' cfdomains --warrior');
  2504. console.log('');
  2505. console.log('\x1b[36mDetails:\x1b[0m');
  2506. console.log(' cfdomains \x1b[43m(Base Domain or FQDN)\x1b[0m');
  2507. console.log(' return "\x1b[32my\x1b[0m", "\x1b[32mn\x1b[0m", or "\x1b[32me\x1b[0m"');
  2508. console.log(' \x1b[32my\x1b[0m: Domain is on the list');
  2509. console.log(' \x1b[32mn\x1b[0m: Domain is not listed');
  2510. console.log(" \x1b[32me\x1b[0m: List data not found (fix it by running --dl)\n");
  2511. console.log(' cfdomains --online \x1b[43m(Base Domain or FQDN)\x1b[0m');
  2512. console.log(' return "\x1b[32my\x1b[0m", "\x1b[32mn\x1b[0m", or "\x1b[32me\x1b[0m"');
  2513. console.log(' \x1b[32my\x1b[0m: Domain is on the list');
  2514. console.log(' \x1b[32mn\x1b[0m: Domain is not listed');
  2515. console.log(" \x1b[32me\x1b[0m: Internet Connection Error\n");
  2516. console.log(' cfdomains --dir');
  2517. console.log(' Change list directory');
  2518. console.log(' \x1b[4mCurrent directory\x1b[0m: ' + myConfig['save'] + "\n");
  2519. console.log(' cfdomains --proxy');
  2520. console.log(' Set or Unset SOCKS proxy');
  2521. console.log(' \x1b[4mCurrent SOCKS proxy\x1b[0m: ' + myConfig['proxy'] + "\n");
  2522. console.log(' cfdomains --dnsip');
  2523. console.log(' Set or Unset DNS Server');
  2524. console.log(' \x1b[4mCurrent DNS Server\x1b[0m: ' + (myConfig['dnsip'] == '' ? 'System Defined' : myConfig['dnsip']) + "\n");
  2525. console.log(' cfdomains --dl');
  2526. console.log(' cfdomains --dl \x1b[43ma,b,c\x1b[0m');
  2527. console.log(' \x1b[32mdl\x1b[0m: Download list files from deCloudflare git');
  2528. console.log(" \x1b[32ma,b,c\x1b[0m: Download only these files (comma-separated)\n");
  2529. console.log(' cfdomains --report|delist \x1b[43mwww.example.com\x1b[0m');
  2530. console.log(' Submit domain to #Karma for automated analysis');
  2531. console.log(' \x1b[4mOnly the domain will be submitted\x1b[0m. We NEVER record anything else.');
  2532. console.log(' \x1b[32mreport\x1b[0m: Report not-yet-listed domain (New Cloudflare)');
  2533. console.log(" \x1b[32mdelist\x1b[0m: Report currently-listed domain (Left Cloudflare)\n");
  2534. console.log(' cfdomains --categorise[|online]|categorize[|online] \x1b[43m(List file; URL or FQDNs)\x1b[0m \x1b[43m(Output file)\x1b[0m');
  2535. console.log(' Export Listed/NotListed status in CSV format');
  2536. console.log(' With online: Use Online API / Without: Use Offline files');
  2537. console.log(" e.g. cfdomains --categoriseonline dirtyUrls.txt /tmp/washing.csv\n");
  2538. console.log(' cfdomains --cleanlink[|online] \x1b[43m(Document; Text, HTML, Markdown)\x1b[0m \x1b[43m(Output file)\x1b[0m');
  2539. console.log(' Replace infected links in document');
  2540. console.log(' With online: Use Online API / Without: Use Offline files');
  2541. console.log(" e.g. cfdomains --cleanlinkonline sunny.md /tmp/sunnyCleaned.md\n");
  2542. console.log(' cfdomains --warrior');
  2543. console.log(' Run this to help with the #Karma domain verification efforts.');
  2544. console.log(" This will download some domain from #Karma and report changes.\n");
  2545. console.log();
  2546. process.exit();
  2547. } else if (args[2] === '--dir') {
  2548. chgLDR();
  2549. } else if (args[2] === '--proxy') {
  2550. chgPROXY();
  2551. } else if (args[2] === '--dnsip') {
  2552. chgDNSIP();
  2553. } else if (args[2] === '--dl') {
  2554. do_dlFiles();
  2555. } else if (args[2] === '--report') {
  2556. do_reportUs('y', args[3]);
  2557. } else if (args[2] === '--delist') {
  2558. do_reportUs('n', args[3]);
  2559. } else if (args[2] === '--warrior') {
  2560. do_warrior();
  2561. } else if (args[2] == '--categorise' || args[2] == '--categorize') {
  2562. do_catAtMe(args[3], args[4], false);
  2563. } else if (args[2] == '--categoriseonline' || args[2] == '--categorizeonline') {
  2564. do_catAtMe(args[3], args[4], true);
  2565. } else if (args[2] == '--cleanlink') {
  2566. do_cleanAtMe(args[3], args[4], false);
  2567. } else if (args[2] == '--cleanlinkonline') {
  2568. do_cleanAtMe(args[3], args[4], true);
  2569. } else if (args[2] == '--online') {
  2570. do_lookupOnline(args[3]);
  2571. } else {
  2572. do_lookupOffline(args[2]);
  2573. }