diff --git a/.github/workflows/auto-update.yml b/.github/workflows/auto-update.yml
index 0ebb08eb..9edce2ac 100644
--- a/.github/workflows/auto-update.yml
+++ b/.github/workflows/auto-update.yml
@@ -126,7 +126,7 @@ jobs:
- name: Install Dependencies
run: npm install
- name: Update README.md
- run: node scripts/update-readme.js
+ run: npx ts-node scripts/update-readme.ts
- name: Commit Changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
diff --git a/.readme/template.md b/.readme/template.md
index 55832811..6d17ee55 100644
--- a/.readme/template.md
+++ b/.readme/template.md
@@ -13,7 +13,17 @@ To load a program guide, all you need to do is copy the link to one or more of t
-#include "./.readme/_table.md"
+#include "./.readme/_countries.md"
+
+### US States
+
+
+#include "./.readme/_us-states.md"
+
+### Provinces of Canada
+
+
+#include "./.readme/_ca-provinces.md"
diff --git a/package-lock.json b/package-lock.json
index 3fd36fcb..9282575f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22,10 +22,30 @@
"parse-duration": "^1.0.0",
"srcset": "^4.0.0",
"tabletojson": "^2.0.7",
+ "ts-node": "^10.3.0",
"wildcard-match": "^5.1.2",
"xml-js": "^1.6.11"
}
},
+ "node_modules/@cspotcode/source-map-consumer": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
+ "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
+ "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
+ "dependencies": {
+ "@cspotcode/source-map-consumer": "0.8.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/@sindresorhus/is": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz",
@@ -48,6 +68,26 @@
"node": ">=10"
}
},
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
+ "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg=="
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
+ "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw=="
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
+ "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg=="
+ },
+ "node_modules/@tsconfig/node16": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
+ "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA=="
+ },
"node_modules/@types/cacheable-request": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
@@ -91,9 +131,9 @@
"integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q=="
},
"node_modules/acorn": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz",
- "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==",
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
+ "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==",
"bin": {
"acorn": "bin/acorn"
},
@@ -140,6 +180,11 @@
"uri-js": "^4.2.2"
}
},
+ "node_modules/arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
+ },
"node_modules/asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
@@ -341,6 +386,11 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
+ },
"node_modules/css-select": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz",
@@ -468,6 +518,14 @@
"node": ">=0.4.0"
}
},
+ "node_modules/diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
"node_modules/dom-serializer": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
@@ -1053,6 +1111,11 @@
"node": ">=8"
}
},
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
+ },
"node_modules/markdown-include": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/markdown-include/-/markdown-include-0.4.3.tgz",
@@ -1484,6 +1547,54 @@
"node": ">=8"
}
},
+ "node_modules/ts-node": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.3.0.tgz",
+ "integrity": "sha512-RYIy3i8IgpFH45AX4fQHExrT8BxDeKTdC83QFJkNzkvt8uFB6QJ8XMyhynYiKMLxt9a7yuXaDBZNOYS3XjDcYw==",
+ "dependencies": {
+ "@cspotcode/source-map-support": "0.7.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "yn": "3.1.1"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
+ "typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ts-node/node_modules/acorn-walk": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
@@ -1516,6 +1627,19 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/typescript": {
+ "version": "4.4.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
+ "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
"node_modules/universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
@@ -1652,9 +1776,30 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+ },
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "engines": {
+ "node": ">=6"
+ }
}
},
"dependencies": {
+ "@cspotcode/source-map-consumer": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
+ "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg=="
+ },
+ "@cspotcode/source-map-support": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
+ "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
+ "requires": {
+ "@cspotcode/source-map-consumer": "0.8.0"
+ }
+ },
"@sindresorhus/is": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz",
@@ -1668,6 +1813,26 @@
"defer-to-connect": "^2.0.0"
}
},
+ "@tsconfig/node10": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
+ "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg=="
+ },
+ "@tsconfig/node12": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
+ "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw=="
+ },
+ "@tsconfig/node14": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
+ "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg=="
+ },
+ "@tsconfig/node16": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
+ "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA=="
+ },
"@types/cacheable-request": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
@@ -1711,9 +1876,9 @@
"integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q=="
},
"acorn": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz",
- "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA=="
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
+ "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q=="
},
"acorn-globals": {
"version": "6.0.0",
@@ -1747,6 +1912,11 @@
"uri-js": "^4.2.2"
}
},
+ "arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
+ },
"asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
@@ -1915,6 +2085,11 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
+ "create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
+ },
"css-select": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz",
@@ -2010,6 +2185,11 @@
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
+ "diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="
+ },
"dom-serializer": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
@@ -2450,6 +2630,11 @@
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
},
+ "make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
+ },
"markdown-include": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/markdown-include/-/markdown-include-0.4.3.tgz",
@@ -2782,6 +2967,32 @@
"punycode": "^2.1.1"
}
},
+ "ts-node": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.3.0.tgz",
+ "integrity": "sha512-RYIy3i8IgpFH45AX4fQHExrT8BxDeKTdC83QFJkNzkvt8uFB6QJ8XMyhynYiKMLxt9a7yuXaDBZNOYS3XjDcYw==",
+ "requires": {
+ "@cspotcode/source-map-support": "0.7.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "yn": "3.1.1"
+ },
+ "dependencies": {
+ "acorn-walk": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA=="
+ }
+ }
+ },
"tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
@@ -2808,6 +3019,12 @@
"prelude-ls": "~1.1.2"
}
},
+ "typescript": {
+ "version": "4.4.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
+ "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
+ "peer": true
+ },
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
@@ -2917,6 +3134,11 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+ },
+ "yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="
}
}
}
diff --git a/package.json b/package.json
index a59fc2d4..c4bda594 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
"parse-duration": "^1.0.0",
"srcset": "^4.0.0",
"tabletojson": "^2.0.7",
+ "ts-node": "^10.3.0",
"wildcard-match": "^5.1.2",
"xml-js": "^1.6.11"
}
diff --git a/scripts/countries.json b/scripts/countries.json
index 308b8a24..ce67c9df 100644
--- a/scripts/countries.json
+++ b/scripts/countries.json
@@ -1,1087 +1,1379 @@
-[
- {
+{
+ "af": {
"flag": "๐ฆ๐ซ",
"name": "Afghanistan",
"code": "af"
},
- {
+ "al": {
"flag": "๐ฆ๐ฑ",
"name": "Albania",
"code": "al"
},
- {
+ "dz": {
"flag": "๐ฉ๐ฟ",
"name": "Algeria",
"code": "dz"
},
- {
+ "as": {
"flag": "๐ฆ๐ธ",
"name": "American Samoa",
"code": "as"
},
- {
+ "ad": {
"flag": "๐ฆ๐ฉ",
"name": "Andorra",
"code": "ad"
},
- {
+ "ao": {
"flag": "๐ฆ๐ด",
"name": "Angola",
"code": "ao"
},
- {
+ "ag": {
"flag": "๐ฆ๐ฌ",
"name": "Antigua & Barbuda",
"code": "ag"
},
- {
+ "ar": {
"flag": "๐ฆ๐ท",
"name": "Argentina",
"code": "ar"
},
- {
+ "am": {
"flag": "๐ฆ๐ฒ",
"name": "Armenia",
"code": "am"
},
- {
+ "aw": {
"flag": "๐ฆ๐ผ",
"name": "Aruba",
"code": "aw"
},
- {
+ "au": {
"flag": "๐ฆ๐บ",
"name": "Australia",
"code": "au"
},
- {
+ "at": {
"flag": "๐ฆ๐น",
"name": "Austria",
"code": "at"
},
- {
+ "az": {
"flag": "๐ฆ๐ฟ",
"name": "Azerbaijan",
"code": "az"
},
- {
+ "bs": {
"flag": "๐ง๐ธ",
"name": "Bahamas",
"code": "bs"
},
- {
+ "bh": {
"flag": "๐ง๐ญ",
"name": "Bahrain",
"code": "bh"
},
- {
+ "bd": {
"flag": "๐ง๐ฉ",
"name": "Bangladesh",
"code": "bd"
},
- {
+ "bb": {
"flag": "๐ง๐ง",
"name": "Barbados",
"code": "bb"
},
- {
+ "by": {
"flag": "๐ง๐พ",
"name": "Belarus",
"code": "by"
},
- {
+ "be": {
"flag": "๐ง๐ช",
"name": "Belgium",
"code": "be"
},
- {
+ "bj": {
"flag": "๐ง๐ฏ",
"name": "Benin",
"code": "bj"
},
- {
+ "bt": {
"flag": "๐ง๐น",
"name": "Bhutan",
"code": "bt"
},
- {
+ "bo": {
"flag": "๐ง๐ด",
"name": "Bolivia",
"code": "bo"
},
- {
+ "ba": {
"flag": "๐ง๐ฆ",
"name": "Bosnia",
"code": "ba"
},
- {
+ "bw": {
"flag": "๐ง๐ผ",
"name": "Botswana",
"code": "bw"
},
- {
+ "br": {
"flag": "๐ง๐ท",
"name": "Brazil",
"code": "br"
},
- {
+ "bn": {
"flag": "๐ง๐ณ",
"name": "Brunei",
"code": "bn"
},
- {
+ "bg": {
"flag": "๐ง๐ฌ",
"name": "Bulgaria",
"code": "bg"
},
- {
+ "bf": {
"flag": "๐ง๐ซ",
"name": "Burkina Faso",
"code": "bf"
},
- {
+ "bi": {
"flag": "๐ง๐ฎ",
"name": "Burundi",
"code": "bi"
},
- {
+ "kh": {
"flag": "๐ฐ๐ญ",
"name": "Cambodia",
"code": "kh"
},
- {
+ "cm": {
"flag": "๐จ๐ฒ",
"name": "Cameroon",
"code": "cm"
},
- {
+ "ca": {
"flag": "๐จ๐ฆ",
"name": "Canada",
- "code": "ca"
+ "code": "ca",
+ "states": {
+ "ab": {
+ "name": "Alberta",
+ "code": "ab"
+ },
+ "bc": {
+ "name": "British Columbia",
+ "code": "bc"
+ },
+ "mb": {
+ "name": "Manitoba",
+ "code": "mb"
+ },
+ "nb": {
+ "name": "New Brunswick",
+ "code": "nb"
+ },
+ "nl": {
+ "name": "Newfoundland and Labrador",
+ "code": "nl"
+ },
+ "nt": {
+ "name": "Northwest Territories",
+ "code": "nt"
+ },
+ "ns": {
+ "name": "Nova Scotia",
+ "code": "ns"
+ },
+ "nu": {
+ "name": "Nunavut",
+ "code": "nu"
+ },
+ "on": {
+ "name": "Ontario",
+ "code": "on"
+ },
+ "pe": {
+ "name": "Prince Edward Island",
+ "code": "pe"
+ },
+ "qc": {
+ "name": "Quebec",
+ "code": "qc"
+ },
+ "sk": {
+ "name": "Saskatchewan",
+ "code": "sk"
+ },
+ "yt": {
+ "name": "Yukon Territory",
+ "code": "yt"
+ }
+ }
},
- {
+ "cv": {
"flag": "๐จ๐ป",
"name": "Cape Verde",
"code": "cv"
},
- {
+ "cf": {
"flag": "๐จ๐ซ",
"name": "Central African Republic",
"code": "cf"
},
- {
+ "td": {
"flag": "๐น๐ฉ",
"name": "Chad",
"code": "td"
},
- {
+ "cl": {
"flag": "๐จ๐ฑ",
"name": "Chile",
"code": "cl"
},
- {
+ "cn": {
"flag": "๐จ๐ณ",
"name": "China",
"code": "cn"
},
- {
+ "co": {
"flag": "๐จ๐ด",
"name": "Colombia",
"code": "co"
},
- {
+ "km": {
"flag": "๐ฐ๐ฒ",
"name": "Comoros",
"code": "km"
},
- {
+ "cg": {
"flag": "๐จ๐ฌ",
"name": "Congo - Brazzaville",
"code": "cg"
},
- {
+ "cd": {
"flag": "๐จ๐ฉ",
"name": "Congo - Kinshasa",
"code": "cd"
},
- {
+ "ck": {
"flag": "๐จ๐ฐ",
"name": "Cook Islands",
"code": "ck"
},
- {
+ "cr": {
"flag": "๐จ๐ท",
"name": "Costa Rica",
"code": "cr"
},
- {
+ "hr": {
"flag": "๐ญ๐ท",
"name": "Croatia",
"code": "hr"
},
- {
+ "cu": {
"flag": "๐จ๐บ",
"name": "Cuba",
"code": "cu"
},
- {
+ "cw": {
"flag": "๐จ๐ผ",
"name": "Curaรงao",
"code": "cw"
},
- {
+ "cy": {
"flag": "๐จ๐พ",
"name": "Cyprus",
"code": "cy"
},
- {
+ "cz": {
"flag": "๐จ๐ฟ",
"name": "Czechia",
"code": "cz"
},
- {
+ "ci": {
"flag": "๐จ๐ฎ",
"name": "Cรดte dโIvoire",
"code": "ci"
},
- {
+ "dk": {
"flag": "๐ฉ๐ฐ",
"name": "Denmark",
"code": "dk"
},
- {
+ "dj": {
"flag": "๐ฉ๐ฏ",
"name": "Djibouti",
"code": "dj"
},
- {
+ "do": {
"flag": "๐ฉ๐ด",
"name": "Dominican Republic",
"code": "do"
},
- {
+ "ec": {
"flag": "๐ช๐จ",
"name": "Ecuador",
"code": "ec"
},
- {
+ "eg": {
"flag": "๐ช๐ฌ",
"name": "Egypt",
"code": "eg"
},
- {
+ "sv": {
"flag": "๐ธ๐ป",
"name": "El Salvador",
"code": "sv"
},
- {
+ "gq": {
"flag": "๐ฌ๐ถ",
"name": "Equatorial Guinea",
"code": "gq"
},
- {
+ "er": {
"flag": "๐ช๐ท",
"name": "Eritrea",
"code": "er"
},
- {
+ "ee": {
"flag": "๐ช๐ช",
"name": "Estonia",
"code": "ee"
},
- {
+ "sz": {
"flag": "๐ธ๐ฟ",
"name": "Eswatini",
"code": "sz"
},
- {
+ "et": {
"flag": "๐ช๐น",
"name": "Ethiopia",
"code": "et"
},
- {
+ "fo": {
"flag": "๐ซ๐ด",
"name": "Faroe Islands",
"code": "fo"
},
- {
+ "fj": {
"flag": "๐ซ๐ฏ",
"name": "Fiji",
"code": "fj"
},
- {
+ "fi": {
"flag": "๐ซ๐ฎ",
"name": "Finland",
"code": "fi"
},
- {
+ "fr": {
"flag": "๐ซ๐ท",
"name": "France",
"code": "fr"
},
- {
+ "gf": {
"flag": "๐ฌ๐ซ",
"name": "French Guiana",
"code": "gf"
},
- {
+ "pf": {
"flag": "๐ต๐ซ",
"name": "French Polynesia",
"code": "pf"
},
- {
+ "tf": {
"flag": "๐น๐ซ",
"name": "French Southern Territories",
"code": "tf"
},
- {
+ "ga": {
"flag": "๐ฌ๐ฆ",
"name": "Gabon",
"code": "ga"
},
- {
+ "gm": {
"flag": "๐ฌ๐ฒ",
"name": "Gambia",
"code": "gm"
},
- {
+ "ge": {
"flag": "๐ฌ๐ช",
"name": "Georgia",
"code": "ge"
},
- {
+ "de": {
"flag": "๐ฉ๐ช",
"name": "Germany",
"code": "de"
},
- {
+ "gh": {
"flag": "๐ฌ๐ญ",
"name": "Ghana",
"code": "gh"
},
- {
+ "gr": {
"flag": "๐ฌ๐ท",
"name": "Greece",
"code": "gr"
},
- {
+ "gp": {
"flag": "๐ฌ๐ต",
"name": "Guadeloupe",
"code": "gp"
},
- {
+ "gu": {
"flag": "๐ฌ๐บ",
"name": "Guam",
"code": "gu"
},
- {
+ "gt": {
"flag": "๐ฌ๐น",
"name": "Guatemala",
"code": "gt"
},
- {
+ "gn": {
"flag": "๐ฌ๐ณ",
"name": "Guinea",
"code": "gn"
},
- {
+ "gw": {
"flag": "๐ฌ๐ผ",
"name": "Guinea-Bissau",
"code": "gw"
},
- {
+ "ht": {
"flag": "๐ญ๐น",
"name": "Haiti",
"code": "ht"
},
- {
+ "hn": {
"flag": "๐ญ๐ณ",
"name": "Honduras",
"code": "hn"
},
- {
+ "hk": {
"flag": "๐ญ๐ฐ",
"name": "Hong Kong",
"code": "hk"
},
- {
+ "hu": {
"flag": "๐ญ๐บ",
"name": "Hungary",
"code": "hu"
},
- {
+ "is": {
"flag": "๐ฎ๐ธ",
"name": "Iceland",
"code": "is"
},
- {
+ "in": {
"flag": "๐ฎ๐ณ",
"name": "India",
"code": "in"
},
- {
+ "id": {
"flag": "๐ฎ๐ฉ",
"name": "Indonesia",
"code": "id"
},
- {
+ "ir": {
"flag": "๐ฎ๐ท",
"name": "Iran",
"code": "ir"
},
- {
+ "iq": {
"flag": "๐ฎ๐ถ",
"name": "Iraq",
"code": "iq"
},
- {
+ "ie": {
"flag": "๐ฎ๐ช",
"name": "Ireland",
"code": "ie"
},
- {
+ "il": {
"flag": "๐ฎ๐ฑ",
"name": "Israel",
"code": "il"
},
- {
+ "it": {
"flag": "๐ฎ๐น",
"name": "Italy",
"code": "it"
},
- {
+ "jm": {
"flag": "๐ฏ๐ฒ",
"name": "Jamaica",
"code": "jm"
},
- {
+ "jp": {
"flag": "๐ฏ๐ต",
"name": "Japan",
"code": "jp"
},
- {
+ "jo": {
"flag": "๐ฏ๐ด",
"name": "Jordan",
"code": "jo"
},
- {
+ "kz": {
"flag": "๐ฐ๐ฟ",
"name": "Kazakhstan",
"code": "kz"
},
- {
+ "ke": {
"flag": "๐ฐ๐ช",
"name": "Kenya",
"code": "ke"
},
- {
+ "ki": {
"flag": "๐ฐ๐ฎ",
"name": "Kiribati",
"code": "ki"
},
- {
+ "xk": {
"flag": "๐ฝ๐ฐ",
"name": "Kosovo",
"code": "xk"
},
- {
+ "kw": {
"flag": "๐ฐ๐ผ",
"name": "Kuwait",
"code": "kw"
},
- {
+ "kg": {
"flag": "๐ฐ๐ฌ",
"name": "Kyrgyzstan",
"code": "kg"
},
- {
+ "la": {
"flag": "๐ฑ๐ฆ",
"name": "Laos",
"code": "la"
},
- {
+ "lv": {
"flag": "๐ฑ๐ป",
"name": "Latvia",
"code": "lv"
},
- {
+ "lb": {
"flag": "๐ฑ๐ง",
"name": "Lebanon",
"code": "lb"
},
- {
+ "ls": {
"flag": "๐ฑ๐ธ",
"name": "Lesotho",
"code": "ls"
},
- {
+ "lr": {
"flag": "๐ฑ๐ท",
"name": "Liberia",
"code": "lr"
},
- {
+ "ly": {
"flag": "๐ฑ๐พ",
"name": "Libya",
"code": "ly"
},
- {
+ "li": {
"flag": "๐ฑ๐ฎ",
"name": "Liechtenstein",
"code": "li"
},
- {
+ "lt": {
"flag": "๐ฑ๐น",
"name": "Lithuania",
"code": "lt"
},
- {
+ "lu": {
"flag": "๐ฑ๐บ",
"name": "Luxembourg",
"code": "lu"
},
- {
+ "mo": {
"flag": "๐ฒ๐ด",
"name": "Macao",
"code": "mo"
},
- {
+ "mg": {
"flag": "๐ฒ๐ฌ",
"name": "Madagascar",
"code": "mg"
},
- {
+ "mw": {
"flag": "๐ฒ๐ผ",
"name": "Malawi",
"code": "mw"
},
- {
+ "my": {
"flag": "๐ฒ๐พ",
"name": "Malaysia",
"code": "my"
},
- {
+ "mv": {
"flag": "๐ฒ๐ป",
"name": "Maldives",
"code": "mv"
},
- {
+ "ml": {
"flag": "๐ฒ๐ฑ",
"name": "Mali",
"code": "ml"
},
- {
+ "mt": {
"flag": "๐ฒ๐น",
"name": "Malta",
"code": "mt"
},
- {
+ "mh": {
"flag": "๐ฒ๐ญ",
"name": "Marshall Islands",
"code": "mh"
},
- {
+ "mq": {
"flag": "๐ฒ๐ถ",
"name": "Martinique",
"code": "mq"
},
- {
+ "mr": {
"flag": "๐ฒ๐ท",
"name": "Mauritania",
"code": "mr"
},
- {
+ "mu": {
"flag": "๐ฒ๐บ",
"name": "Mauritius",
"code": "mu"
},
- {
+ "yt": {
"flag": "๐พ๐น",
"name": "Mayotte",
"code": "yt"
},
- {
+ "mx": {
"flag": "๐ฒ๐ฝ",
"name": "Mexico",
"code": "mx"
},
- {
+ "fm": {
"flag": "๐ซ๐ฒ",
"name": "Micronesia",
"code": "fm"
},
- {
+ "md": {
"flag": "๐ฒ๐ฉ",
"name": "Moldova",
"code": "md"
},
- {
+ "mc": {
"flag": "๐ฒ๐จ",
"name": "Monaco",
"code": "mc"
},
- {
+ "mn": {
"flag": "๐ฒ๐ณ",
"name": "Mongolia",
"code": "mn"
},
- {
+ "me": {
"flag": "๐ฒ๐ช",
"name": "Montenegro",
"code": "me"
},
- {
+ "ma": {
"flag": "๐ฒ๐ฆ",
"name": "Morocco",
"code": "ma"
},
- {
+ "mz": {
"flag": "๐ฒ๐ฟ",
"name": "Mozambique",
"code": "mz"
},
- {
+ "mm": {
"flag": "๐ฒ๐ฒ",
"name": "Myanmar",
"code": "mm"
},
- {
+ "na": {
"flag": "๐ณ๐ฆ",
"name": "Namibia",
"code": "na"
},
- {
+ "nr": {
"flag": "๐ณ๐ท",
"name": "Nauru",
"code": "nr"
},
- {
+ "np": {
"flag": "๐ณ๐ต",
"name": "Nepal",
"code": "np"
},
- {
+ "nl": {
"flag": "๐ณ๐ฑ",
"name": "Netherlands",
"code": "nl"
},
- {
+ "nc": {
"flag": "๐ณ๐จ",
"name": "New Caledonia",
"code": "nc"
},
- {
+ "nz": {
"flag": "๐ณ๐ฟ",
"name": "New Zealand",
"code": "nz"
},
- {
+ "ni": {
"flag": "๐ณ๐ฎ",
"name": "Nicaragua",
"code": "ni"
},
- {
+ "ne": {
"flag": "๐ณ๐ช",
"name": "Niger",
"code": "ne"
},
- {
+ "ng": {
"flag": "๐ณ๐ฌ",
"name": "Nigeria",
"code": "ng"
},
- {
+ "nu": {
"flag": "๐ณ๐บ",
"name": "Niue",
"code": "nu"
},
- {
+ "nf": {
"flag": "๐ณ๐ซ",
"name": "Norfolk Island",
"code": "nf"
},
- {
+ "kp": {
"flag": "๐ฐ๐ต",
"name": "North Korea",
"code": "kp"
},
- {
+ "mk": {
"flag": "๐ฒ๐ฐ",
"name": "North Macedonia",
"code": "mk"
},
- {
+ "mp": {
"flag": "๐ฒ๐ต",
"name": "Northern Mariana Islands",
"code": "mp"
},
- {
+ "no": {
"flag": "๐ณ๐ด",
"name": "Norway",
"code": "no"
},
- {
+ "om": {
"flag": "๐ด๐ฒ",
"name": "Oman",
"code": "om"
},
- {
+ "pk": {
"flag": "๐ต๐ฐ",
"name": "Pakistan",
"code": "pk"
},
- {
+ "pw": {
"flag": "๐ต๐ผ",
"name": "Palau",
"code": "pw"
},
- {
+ "ps": {
"flag": "๐ต๐ธ",
"name": "Palestine",
"code": "ps"
},
- {
+ "pa": {
"flag": "๐ต๐ฆ",
"name": "Panama",
"code": "pa"
},
- {
+ "pg": {
"flag": "๐ต๐ฌ",
"name": "Papua New Guinea",
"code": "pg"
},
- {
+ "py": {
"flag": "๐ต๐พ",
"name": "Paraguay",
"code": "py"
},
- {
+ "pe": {
"flag": "๐ต๐ช",
"name": "Peru",
"code": "pe"
},
- {
+ "ph": {
"flag": "๐ต๐ญ",
"name": "Philippines",
"code": "ph"
},
- {
+ "pn": {
"flag": "๐ต๐ณ",
"name": "Pitcairn Islands",
"code": "pn"
},
- {
+ "pl": {
"flag": "๐ต๐ฑ",
"name": "Poland",
"code": "pl"
},
- {
+ "pt": {
"flag": "๐ต๐น",
"name": "Portugal",
"code": "pt"
},
- {
+ "pr": {
"flag": "๐ต๐ท",
"name": "Puerto Rico",
"code": "pr"
},
- {
+ "qa": {
"flag": "๐ถ๐ฆ",
"name": "Qatar",
"code": "qa"
},
- {
+ "ro": {
"flag": "๐ท๐ด",
"name": "Romania",
"code": "ro"
},
- {
+ "ru": {
"flag": "๐ท๐บ",
"name": "Russia",
"code": "ru"
},
- {
+ "rw": {
"flag": "๐ท๐ผ",
"name": "Rwanda",
"code": "rw"
},
- {
+ "re": {
"flag": "๐ท๐ช",
"name": "Rรฉunion",
"code": "re"
},
- {
+ "ws": {
"flag": "๐ผ๐ธ",
"name": "Samoa",
"code": "ws"
},
- {
+ "sm": {
"flag": "๐ธ๐ฒ",
"name": "San Marino",
"code": "sm"
},
- {
+ "sa": {
"flag": "๐ธ๐ฆ",
"name": "Saudi Arabia",
"code": "sa"
},
- {
+ "sn": {
"flag": "๐ธ๐ณ",
"name": "Senegal",
"code": "sn"
},
- {
+ "rs": {
"flag": "๐ท๐ธ",
"name": "Serbia",
"code": "rs"
},
- {
+ "sc": {
"flag": "๐ธ๐จ",
"name": "Seychelles",
"code": "sc"
},
- {
+ "sl": {
"flag": "๐ธ๐ฑ",
"name": "Sierra Leone",
"code": "sl"
},
- {
+ "sg": {
"flag": "๐ธ๐ฌ",
"name": "Singapore",
"code": "sg"
},
- {
+ "sk": {
"flag": "๐ธ๐ฐ",
"name": "Slovakia",
"code": "sk"
},
- {
+ "si": {
"flag": "๐ธ๐ฎ",
"name": "Slovenia",
"code": "si"
},
- {
+ "sb": {
"flag": "๐ธ๐ง",
"name": "Solomon Islands",
"code": "sb"
},
- {
+ "so": {
"flag": "๐ธ๐ด",
"name": "Somalia",
"code": "so"
},
- {
+ "za": {
"flag": "๐ฟ๐ฆ",
"name": "South Africa",
"code": "za"
},
- {
+ "kr": {
"flag": "๐ฐ๐ท",
"name": "South Korea",
"code": "kr"
},
- {
+ "ss": {
"flag": "๐ธ๐ธ",
"name": "South Sudan",
"code": "ss"
},
- {
+ "es": {
"flag": "๐ช๐ธ",
"name": "Spain",
"code": "es"
},
- {
+ "lk": {
"flag": "๐ฑ๐ฐ",
"name": "Sri Lanka",
"code": "lk"
},
- {
+ "bl": {
"flag": "๐ง๐ฑ",
"name": "St. Barthรฉlemy",
"code": "bl"
},
- {
+ "sh": {
"flag": "๐ธ๐ญ",
"name": "St. Helena",
"code": "sh"
},
- {
+ "mf": {
"flag": "๐ฒ๐ซ",
"name": "St. Martin",
"code": "mf"
},
- {
+ "sd": {
"flag": "๐ธ๐ฉ",
"name": "Sudan",
"code": "sd"
},
- {
+ "se": {
"flag": "๐ธ๐ช",
"name": "Sweden",
"code": "se"
},
- {
+ "ch": {
"flag": "๐จ๐ญ",
"name": "Switzerland",
"code": "ch"
},
- {
+ "sy": {
"flag": "๐ธ๐พ",
"name": "Syria",
"code": "sy"
},
- {
+ "st": {
"flag": "๐ธ๐น",
"name": "Sรฃo Tomรฉ & Prรญncipe",
"code": "st"
},
- {
+ "tw": {
"flag": "๐น๐ผ",
"name": "Taiwan",
"code": "tw"
},
- {
+ "tj": {
"flag": "๐น๐ฏ",
"name": "Tajikistan",
"code": "tj"
},
- {
+ "tz": {
"flag": "๐น๐ฟ",
"name": "Tanzania",
"code": "tz"
},
- {
+ "th": {
"flag": "๐น๐ญ",
"name": "Thailand",
"code": "th"
},
- {
+ "tl": {
"flag": "๐น๐ฑ",
"name": "Timor-Leste",
"code": "tl"
},
- {
+ "tg": {
"flag": "๐น๐ฌ",
"name": "Togo",
"code": "tg"
},
- {
+ "tk": {
"flag": "๐น๐ฐ",
"name": "Tokelau",
"code": "tk"
},
- {
+ "to": {
"flag": "๐น๐ด",
"name": "Tonga",
"code": "to"
},
- {
+ "tt": {
"flag": "๐น๐น",
"name": "Trinidad & Tobago",
"code": "tt"
},
- {
+ "tn": {
"flag": "๐น๐ณ",
"name": "Tunisia",
"code": "tn"
},
- {
+ "tr": {
"flag": "๐น๐ท",
"name": "Turkey",
"code": "tr"
},
- {
+ "tm": {
"flag": "๐น๐ฒ",
"name": "Turkmenistan",
"code": "tm"
},
- {
+ "tv": {
"flag": "๐น๐ป",
"name": "Tuvalu",
"code": "tv"
},
- {
+ "vi": {
"flag": "๐ป๐ฎ",
"name": "U.S. Virgin Islands",
"code": "vi"
},
- {
+ "ug": {
"flag": "๐บ๐ฌ",
"name": "Uganda",
"code": "ug"
},
- {
+ "ua": {
"flag": "๐บ๐ฆ",
"name": "Ukraine",
"code": "ua"
},
- {
+ "ae": {
"flag": "๐ฆ๐ช",
"name": "United Arab Emirates",
"code": "ae"
},
- {
+ "uk": {
"flag": "๐ฌ๐ง",
"name": "United Kingdom",
"code": "uk"
},
- {
+ "us": {
"flag": "๐บ๐ธ",
"name": "United States",
- "code": "us"
+ "code": "us",
+ "states": {
+ "al": {
+ "name": "Alabama",
+ "code": "al"
+ },
+ "ak": {
+ "name": "Alaska",
+ "code": "ak"
+ },
+ "as": {
+ "name": "American Samoa",
+ "code": "as"
+ },
+ "az": {
+ "name": "Arizona",
+ "code": "az"
+ },
+ "ar": {
+ "name": "Arkansas",
+ "code": "ar"
+ },
+ "ca": {
+ "name": "California",
+ "code": "ca"
+ },
+ "co": {
+ "name": "Colorado",
+ "code": "co"
+ },
+ "ct": {
+ "name": "Connecticut",
+ "code": "ct"
+ },
+ "de": {
+ "name": "Delaware",
+ "code": "de"
+ },
+ "dc": {
+ "name": "District Of Columbia",
+ "code": "dc"
+ },
+ "fm": {
+ "name": "Federated States Of Micronesia",
+ "code": "fm"
+ },
+ "fl": {
+ "name": "Florida",
+ "code": "fl"
+ },
+ "ga": {
+ "name": "Georgia",
+ "code": "ga"
+ },
+ "gu": {
+ "name": "Guam",
+ "code": "gu"
+ },
+ "hi": {
+ "name": "Hawaii",
+ "code": "hi"
+ },
+ "id": {
+ "name": "Idaho",
+ "code": "id"
+ },
+ "il": {
+ "name": "Illinois",
+ "code": "il"
+ },
+ "in": {
+ "name": "Indiana",
+ "code": "in"
+ },
+ "ia": {
+ "name": "Iowa",
+ "code": "ia"
+ },
+ "ks": {
+ "name": "Kansas",
+ "code": "ks"
+ },
+ "ky": {
+ "name": "Kentucky",
+ "code": "ky"
+ },
+ "la": {
+ "name": "Louisiana",
+ "code": "la"
+ },
+ "me": {
+ "name": "Maine",
+ "code": "me"
+ },
+ "mh": {
+ "name": "Marshall Islands",
+ "code": "mh"
+ },
+ "md": {
+ "name": "Maryland",
+ "code": "md"
+ },
+ "ma": {
+ "name": "Massachusetts",
+ "code": "ma"
+ },
+ "mi": {
+ "name": "Michigan",
+ "code": "mi"
+ },
+ "mn": {
+ "name": "Minnesota",
+ "code": "mn"
+ },
+ "ms": {
+ "name": "Mississippi",
+ "code": "ms"
+ },
+ "mo": {
+ "name": "Missouri",
+ "code": "mo"
+ },
+ "mt": {
+ "name": "Montana",
+ "code": "mt"
+ },
+ "ne": {
+ "name": "Nebraska",
+ "code": "ne"
+ },
+ "nv": {
+ "name": "Nevada",
+ "code": "nv"
+ },
+ "nh": {
+ "name": "New Hampshire",
+ "code": "nh"
+ },
+ "nj": {
+ "name": "New Jersey",
+ "code": "nj"
+ },
+ "nm": {
+ "name": "New Mexico",
+ "code": "nm"
+ },
+ "ny": {
+ "name": "New York",
+ "code": "ny"
+ },
+ "nc": {
+ "name": "North Carolina",
+ "code": "nc"
+ },
+ "nd": {
+ "name": "North Dakota",
+ "code": "nd"
+ },
+ "mp": {
+ "name": "Northern Mariana Islands",
+ "code": "mp"
+ },
+ "oh": {
+ "name": "Ohio",
+ "code": "oh"
+ },
+ "ok": {
+ "name": "Oklahoma",
+ "code": "ok"
+ },
+ "or": {
+ "name": "Oregon",
+ "code": "or"
+ },
+ "pw": {
+ "name": "Palau",
+ "code": "pw"
+ },
+ "pa": {
+ "name": "Pennsylvania",
+ "code": "pa"
+ },
+ "pr": {
+ "name": "Puerto Rico",
+ "code": "pr"
+ },
+ "ri": {
+ "name": "Rhode Island",
+ "code": "ri"
+ },
+ "sc": {
+ "name": "South Carolina",
+ "code": "sc"
+ },
+ "sd": {
+ "name": "South Dakota",
+ "code": "sd"
+ },
+ "tn": {
+ "name": "Tennessee",
+ "code": "tn"
+ },
+ "tx": {
+ "name": "Texas",
+ "code": "tx"
+ },
+ "ut": {
+ "name": "Utah",
+ "code": "ut"
+ },
+ "vt": {
+ "name": "Vermont",
+ "code": "vt"
+ },
+ "vi": {
+ "name": "Virgin Islands",
+ "code": "vi"
+ },
+ "va": {
+ "name": "Virginia",
+ "code": "va"
+ },
+ "wa": {
+ "name": "Washington",
+ "code": "wa"
+ },
+ "wv": {
+ "name": "West Virginia",
+ "code": "wv"
+ },
+ "wi": {
+ "name": "Wisconsin",
+ "code": "wi"
+ },
+ "wy": {
+ "name": "Wyoming",
+ "code": "wy"
+ }
+ }
},
- {
+ "uy": {
"flag": "๐บ๐พ",
"name": "Uruguay",
"code": "uy"
},
- {
+ "uz": {
"flag": "๐บ๐ฟ",
"name": "Uzbekistan",
"code": "uz"
},
- {
+ "vu": {
"flag": "๐ป๐บ",
"name": "Vanuatu",
"code": "vu"
},
- {
+ "va": {
"flag": "๐ป๐ฆ",
"name": "Vatican City",
"code": "va"
},
- {
+ "ve": {
"flag": "๐ป๐ช",
"name": "Venezuela",
"code": "ve"
},
- {
+ "vn": {
"flag": "๐ป๐ณ",
"name": "Vietnam",
"code": "vn"
},
- {
+ "wf": {
"flag": "๐ผ๐ซ",
"name": "Wallis & Futuna",
"code": "wf"
},
- {
+ "eh": {
"flag": "๐ช๐ญ",
"name": "Western Sahara",
"code": "eh"
},
- {
+ "ye": {
"flag": "๐พ๐ช",
"name": "Yemen",
"code": "ye"
},
- {
+ "zm": {
"flag": "๐ฟ๐ฒ",
"name": "Zambia",
"code": "zm"
},
- {
+ "zw": {
"flag": "๐ฟ๐ผ",
"name": "Zimbabwe",
"code": "zw"
}
-]
+}
diff --git a/scripts/update-codes.js b/scripts/update-codes.js
index a64ee066..0da5dc54 100644
--- a/scripts/update-codes.js
+++ b/scripts/update-codes.js
@@ -36,9 +36,11 @@ async function main() {
file.write('.gh-pages/codes.json', JSON.stringify(sorted))
const _items = {}
- countries.forEach(country => {
+ Object.values(countries).forEach(country => {
_items[country.code] = {
- ...country,
+ flag: country.flag,
+ name: country.name,
+ code: country.code,
expanded: false,
channels: []
}
diff --git a/scripts/update-readme.js b/scripts/update-readme.js
deleted file mode 100644
index 1cf1f9cf..00000000
--- a/scripts/update-readme.js
+++ /dev/null
@@ -1,81 +0,0 @@
-const parser = require('epg-parser')
-const markdownInclude = require('markdown-include')
-const countries = require('./countries.json')
-const file = require('./file')
-
-async function main() {
- console.log('Starting...')
- file
- .list('.gh-pages/guides/**/*.xml')
- .then(files => {
- let data = []
- files.forEach(filename => {
- const countryCode = filename.match(/\.gh\-pages\/guides\/(.*)\/.*/i)[1]
- const country = countries.find(c => c.code === countryCode)
- if (!country) return
- const epg = file.read(filename)
- const parsed = parser.parse(epg)
- let emptyGuides = 0
- parsed.channels.forEach(channel => {
- const showCount = parsed.programs.filter(p => p.channel === channel.id).length
- if (showCount === 0) emptyGuides++
- })
- data.push({
- countryFlag: country.flag,
- countryName: country.name,
- guideUrl: filename.replace('.gh-pages', 'https://iptv-org.github.io/epg'),
- channelCount: parsed.channels.length,
- emptyGuides
- })
- })
-
- data = data.sort((a, b) => {
- var countryNameA = a.countryName.toLowerCase()
- var countryNameB = b.countryName.toLowerCase()
- if (countryNameA < countryNameB) return -1
- if (countryNameA > countryNameB) return 1
- return b.channelCount - a.channelCount
- })
-
- console.log('Generating table...')
- const table = generateTable(data, ['Country', 'Channels', 'EPG', 'Status'])
- file.write('.readme/_table.md', table)
- console.log('Updating README.md...')
- markdownInclude.compileFiles('.readme/config.json')
- })
- .finally(() => {
- console.log('Finish')
- })
-}
-
-function generateTable(data, header) {
- let output = '
\n'
-
- output += '\t\n\t\t'
- for (let column of header) {
- output += `${column} | `
- }
- output += '
\n\t\n'
-
- output += '\t\n'
- for (let item of data) {
- const size = data.filter(i => i.countryName === item.countryName).length
- let root = output.indexOf(item.countryName) === -1
- const rowspan = root && size > 1 ? ` rowspan="${size}"` : ''
- const name = item.countryName
- let status = '๐ข'
- if (item.emptyGuides === item.channelCount) status = '๐ด'
- else if (item.emptyGuides > 0) status = '๐ก'
- const cell1 = root
- ? `${item.countryFlag} ${name} | `
- : ''
- output += `\t\t${cell1}${item.channelCount} | ${item.guideUrl} | ${status} |
\n`
- }
- output += '\t\n'
-
- output += '
'
-
- return output
-}
-
-main()
diff --git a/scripts/update-readme.ts b/scripts/update-readme.ts
new file mode 100644
index 00000000..52726fde
--- /dev/null
+++ b/scripts/update-readme.ts
@@ -0,0 +1,161 @@
+const parser = require('epg-parser')
+const markdownInclude = require('markdown-include')
+const countries = require('./countries.json')
+const file = require('./file')
+
+type EPG = {
+ channels: Channel[]
+ programs: Program[]
+}
+
+type Country = {
+ flag: string
+ name: string
+ code: string
+ states?: State[]
+}
+
+type State = {
+ name: string
+ code: string
+}
+
+type Channel = {
+ id: string
+}
+
+type Program = {
+ channel: string
+}
+
+type Guide = {
+ name?: string
+ flag: string
+ url: string
+ channelCount: number
+ emptyGuides: number
+}
+
+async function main() {
+ console.log('Starting...')
+ file
+ .list('.gh-pages/guides/**/*.xml')
+ .then((files: string[]) => {
+ const guidesByCountry: Guide[] = []
+ const guidesByUSState: Guide[] = []
+ const guidesByCanadaProvince: Guide[] = []
+ files.forEach((filename: string) => {
+ console.log(`Loading '${filename}'...`)
+ const matches: string[] = filename.match(/\.gh\-pages\/guides\/(.*)\/.*/i) || []
+ const code: string | undefined = matches[1]
+ if (code === undefined) return
+
+ const xml = file.read(filename)
+ let epg: EPG = parser.parse(xml)
+ let emptyGuides = 0
+ epg.channels.forEach((channel: Channel) => {
+ const showCount = epg.programs.filter(
+ (program: Program) => program.channel === channel.id
+ ).length
+ if (showCount === 0) emptyGuides++
+ })
+
+ const guide: Guide = {
+ flag: '',
+ url: filename.replace('.gh-pages', 'https://iptv-org.github.io/epg'),
+ channelCount: epg.channels.length,
+ emptyGuides
+ }
+
+ if (!code.includes('-')) {
+ const country: Country | undefined = countries[code]
+ if (!country) return
+ guide.flag = country.flag
+ guide.name = country.name
+ guidesByCountry.push(guide)
+ } else if (code.startsWith('us-')) {
+ const [_, stateCode] = code.split('-')
+ const state: State | undefined = countries['us']
+ ? countries['us'].states[stateCode]
+ : undefined
+ if (!state) return
+ guide.name = state.name
+ guidesByUSState.push(guide)
+ } else if (code.startsWith('ca-')) {
+ const [_, provinceCode] = code.split('-')
+ const province: State | undefined = countries['ca']
+ ? countries['ca'].states[provinceCode]
+ : undefined
+ if (!province) return
+ guide.name = province.name
+ guidesByCanadaProvince.push(guide)
+ }
+ })
+
+ console.log('Generating country table...')
+ const countryTable = generateTable(guidesByCountry, ['Country', 'Channels', 'EPG', 'Status'])
+ file.write('.readme/_countries.md', countryTable)
+
+ console.log('Generating US states table...')
+ const usStatesTable = generateTable(guidesByUSState, ['State', 'Channels', 'EPG', 'Status'])
+ file.write('.readme/_us-states.md', usStatesTable)
+
+ console.log('Generating Canada provinces table...')
+ const caProvincesTable = generateTable(guidesByCanadaProvince, [
+ 'Province',
+ 'Channels',
+ 'EPG',
+ 'Status'
+ ])
+ file.write('.readme/_ca-provinces.md', caProvincesTable)
+
+ console.log('Updating README.md...')
+ markdownInclude.compileFiles('.readme/config.json')
+ })
+ .finally(() => {
+ console.log('Finish')
+ })
+}
+
+function generateTable(guides: Guide[], header: string[]) {
+ guides = sortGuides(guides)
+
+ let output = '\n'
+
+ output += '\t\n\t\t'
+ for (let column of header) {
+ output += `${column} | `
+ }
+ output += '
\n\t\n'
+
+ output += '\t\n'
+ for (let guide of guides) {
+ const size = guides.filter((g: Guide) => g.name === guide.name).length
+ if (!guide.name) continue
+ let root = output.indexOf(guide.name) === -1
+ const rowspan = root && size > 1 ? ` rowspan="${size}"` : ''
+ const name = `${guide.flag} ${guide.name}`
+ let status = '๐ข'
+ if (guide.emptyGuides === guide.channelCount) status = '๐ด'
+ else if (guide.emptyGuides > 0) status = '๐ก'
+ const cell1 = root ? `${name} | ` : ''
+ output += `\t\t${cell1}${guide.channelCount} | ${guide.url} | ${status} |
\n`
+ }
+ output += '\t\n'
+
+ output += '
'
+
+ return output
+}
+
+function sortGuides(guides: Guide[]): Guide[] {
+ return guides.sort((a, b) => {
+ var nameA = a.name ? a.name.toLowerCase() : ''
+ var nameB = b.name ? b.name.toLowerCase() : ''
+ if (nameA < nameB) return -1
+ if (nameA > nameB) return 1
+ return b.channelCount - a.channelCount
+ })
+}
+
+main()