diff --git a/docs/Document-clean.kml b/docs/Document-clean.kml new file mode 120000 index 00000000..e39077a5 --- /dev/null +++ b/docs/Document-clean.kml @@ -0,0 +1 @@ +../tests/ogc_conformance/data/kml/Document-clean.kml \ No newline at end of file diff --git a/docs/co2-per-capita-2020.jpg b/docs/co2-per-capita-2020.jpg new file mode 100644 index 00000000..087ea548 Binary files /dev/null and b/docs/co2-per-capita-2020.jpg differ diff --git a/docs/conf.py b/docs/conf.py index a55a3d99..c9908182 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -32,7 +32,9 @@ "sphinx.ext.autodoc", "sphinx.ext.doctest", "sphinx.ext.napoleon", + "sphinx.ext.autosummary", ] +autosummary_generate = True # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] diff --git a/docs/Configuration.rst b/docs/configuration.rst similarity index 100% rename from docs/Configuration.rst rename to docs/configuration.rst diff --git a/docs/create_kml_files.rst b/docs/create_kml_files.rst new file mode 100644 index 00000000..2e24903a --- /dev/null +++ b/docs/create_kml_files.rst @@ -0,0 +1,230 @@ +Creating KML files +================== + +Read a shapefile and build a 3D KML visualization. +-------------------------------------------------- + +This example shows how to read a shapefile and build a 3D KML visualization from it. + +You will need to install `pyshp `_ (``pip install pyshp``). + +For this example we will use the +`Data on CO2 and Greenhouse Gas Emissions `_ by +Our World in Data, and the Small scale data (1:110m) shapefile from +`Natural Earth `_. + +First we import the necessary modules: + +.. code-block:: python + + import csv + import pathlib + import random + + import shapefile + from pygeoif.factories import force_3d + from pygeoif.factories import shape + + import fastkml + import fastkml.containers + import fastkml.features + import fastkml.styles + from fastkml.enums import AltitudeMode + from fastkml.geometry import create_kml_geometry + + +Read the shapefile: + +.. code-block:: python + + shp = shapefile.Reader("ne_110m_admin_0_countries.shp") + +Read the CSV file and store the CO2 data for 2020: + +.. code-block:: python + + co2_csv = pathlib.Path("owid-co2-data.csv") + co2_data = {} + with co2_csv.open() as csvfile: + reader = csv.DictReader(csvfile) + for row in reader: + if row["year"] == "2020": + co2_data[row["iso_code"]] = ( + float(row["co2_per_capita"]) if row["co2_per_capita"] else 0 + ) + + +We prepare the styles and placemarks for the KML file, using random colors for each +country and the CO2 emissions as the height of the geometry. The shapefile offers +a handy ``__geo_interface__`` attribute that we can use to iterate over the features, +just like we would with a ``GeoJSON`` object, and extract the necessary information: + +.. code-block:: python + + placemarks = [] + for feature in shp.__geo_interface__["features"]: + iso3_code = feature["properties"]["ADM0_A3"] + geometry = shape(feature["geometry"]) + co2_emission = co2_data.get(iso3_code, 0) + geometry = force_3d(geometry, co2_emission * 100_000) + kml_geometry = create_kml_geometry( + geometry, + extrude=True, + altitude_mode=AltitudeMode.relative_to_ground, + ) + color = random.randint(0, 0xFFFFFF) + style = fastkml.styles.Style( + id=iso3_code, + styles=[ + fastkml.styles.LineStyle(color=f"33{color:06X}", width=2), + fastkml.styles.PolyStyle( + color=f"88{color:06X}", + fill=True, + outline=True, + ), + ], + ) + placemark = fastkml.features.Placemark( + name=feature["properties"]["NAME"], + description=feature["properties"]["FORMAL_EN"], + kml_geometry=kml_geometry, + styles=[style], + ) + placemarks.append(placemark) + + +Finally, we create the KML object and write it to a file: + +.. code-block:: python + + document = fastkml.containers.Document(features=placemarks, styles=styles) + kml = fastkml.KML(features=[document]) + + outfile = pathlib.Path("co2_per_capita_2020.kml") + with outfile.open("w") as f: + f.write(kml.to_string(prettyprint=True, precision=6)) + +The resulting KML file can be opened in Google Earth or any other KML viewer. + +.. image:: co2-per-capita-2020.jpg + :alt: CO2 emissions per capita in 2020 + :align: center + :width: 800px + + +Build an animated over time KML visualization +---------------------------------------------- + +This example shows how to build an animated KML visualization over time. +We will use the same data as in the previous example, but this time we will +create a KML file that shows the CO2 emissions accumulating from 1995 to 2022. + +First we import the necessary modules: + +.. code-block:: python + + import csv + import pathlib + import random + import datetime + import shapefile + from pygeoif.factories import force_3d + from pygeoif.factories import shape + + import fastkml + import fastkml.containers + import fastkml.features + import fastkml.styles + import fastkml.times + from fastkml.enums import AltitudeMode, DateTimeResolution + from fastkml.geometry import create_kml_geometry + +Read the shapefile, the CSV file and store the CO2 data for each year: + +.. code-block:: python + + shp = shapefile.Reader("ne_110m_admin_0_countries.shp") + co2_csv = pathlib.Path("owid-co2-data.csv") + co2_pa = {str(i): {} for i in range(1995, 2023)} + with co2_csv.open() as csvfile: + reader = csv.DictReader(csvfile) + for row in reader: + if row["year"] >= "1995": + co2_pa[row["year"]][row["iso_code"]] = ( + float(row["co2_per_capita"]) if row["co2_per_capita"] else 0 + ) + + + +This time we will create a folder for each country, and a placemark for each year, +with the CO2 emissions per capita as the height of the geometry. +We will also create a style for each country, which we store at the document level to +prevent creating duplicate styles. +Each placemark will have a time-span that covers the whole year: + +.. code-block:: python + + styles = [] + folders = [] + for feature in shp.__geo_interface__["features"]: + iso3_code = feature["properties"]["ADM0_A3"] + geometry = shape(feature["geometry"]) + color = random.randint(0, 0xFFFFFF) + styles.append( + fastkml.styles.Style( + id=iso3_code, + styles=[ + fastkml.styles.LineStyle(color=f"33{color:06X}", width=2), + fastkml.styles.PolyStyle( + color=f"88{color:06X}", + fill=True, + outline=True, + ), + ], + ), + ) + style_url = fastkml.styles.StyleUrl(url=f"#{iso3_code}") + folder = fastkml.containers.Folder(name=feature["properties"]["NAME"]) + co2_growth = 0 + for year in range(1995, 2023): + co2_year = co2_pa[str(year)].get(iso3_code, 0) + co2_growth += co2_year + + kml_geometry = create_kml_geometry( + force_3d(geometry, co2_growth * 5_000), + extrude=True, + altitude_mode=AltitudeMode.relative_to_ground, + ) + timespan = fastkml.times.TimeSpan( + begin=fastkml.times.KmlDateTime( + datetime.date(year, 1, 1), resolution=DateTimeResolution.year_month + ), + end=fastkml.times.KmlDateTime( + datetime.date(year, 12, 31), resolution=DateTimeResolution.year_month + ), + ) + placemark = fastkml.features.Placemark( + name=f"{feature['properties']['NAME']} - {year}", + description=feature["properties"]["FORMAL_EN"], + kml_geometry=kml_geometry, + style_url=style_url, + times=timespan, + ) + folder.features.append(placemark) + folders.append(folder) + +Finally, we create the KML object and write it to a file: + +.. code-block:: python + + document = fastkml.containers.Document(features=folders, styles=styles) + kml = fastkml.KML(features=[document]) + + outfile = pathlib.Path("co2_growth_1995_2022.kml") + with outfile.open("w") as f: + f.write(kml.to_string(prettyprint=True, precision=3)) + + +You can open the resulting KML file in Google Earth Desktop and use the time slider to +see the CO2 emissions per capita grow over time, Google Earth Web does not support +time animations. diff --git a/docs/fastkml.rst b/docs/fastkml.rst index 7cc89984..f8350ed4 100644 --- a/docs/fastkml.rst +++ b/docs/fastkml.rst @@ -1,13 +1,7 @@ fastkml package =============== -Module contents ---------------- - .. automodule:: fastkml - :members: - :undoc-members: - :no-index: Submodules @@ -45,6 +39,14 @@ fastkml.config module :undoc-members: :show-inheritance: +fastkml.containers module +------------------------- + +.. automodule:: fastkml.containers + :members: + :undoc-members: + :show-inheritance: + fastkml.data module ------------------- @@ -69,6 +71,14 @@ fastkml.exceptions module :undoc-members: :show-inheritance: +fastkml.features module +----------------------- + +.. automodule:: fastkml.features + :members: + :undoc-members: + :show-inheritance: + fastkml.geometry module ----------------------- @@ -100,7 +110,22 @@ fastkml.kml module :members: :undoc-members: :show-inheritance: - :no-index: StyleUrl + +fastkml.kml\_base module +------------------------ + +.. automodule:: fastkml.kml_base + :members: + :undoc-members: + :show-inheritance: + +fastkml.links module +-------------------- + +.. automodule:: fastkml.links + :members: + :undoc-members: + :show-inheritance: fastkml.mixins module --------------------- @@ -110,6 +135,22 @@ fastkml.mixins module :undoc-members: :show-inheritance: +fastkml.overlays module +----------------------- + +.. automodule:: fastkml.overlays + :members: + :undoc-members: + :show-inheritance: + +fastkml.registry module +----------------------- + +.. automodule:: fastkml.registry + :members: + :undoc-members: + :show-inheritance: + fastkml.styles module --------------------- @@ -134,6 +175,14 @@ fastkml.types module :undoc-members: :show-inheritance: +fastkml.utils module +-------------------- + +.. automodule:: fastkml.utils + :members: + :undoc-members: + :show-inheritance: + fastkml.views module -------------------- diff --git a/docs/index.rst b/docs/index.rst index f9c92016..7113443e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,17 +1,8 @@ Welcome to FastKML's documentation! =================================== -``fastkml`` is a library to read, write and manipulate KML files. It aims to keep -it simple and fast (using lxml_ if available). "Fast" refers to the time you -spend to write and read KML files, as well as the time you spend to get -acquainted with the library or to create KML objects. It provides a subset of KML -and is aimed at documents that can be read from multiple clients such as -openlayers and google maps rather than to give you all functionality that KML -on google earth provides. - -For more details about the KML Specification, check out the `KML Reference -`_ on the Google -developers site. +.. include:: ../README.rst + :start-after: inclusion-marker-do-not-remove Rationale --------- @@ -26,18 +17,15 @@ requirements, namely: * It is fully tested and actively maintained. * Geometries are handled in the ``__geo_interface__`` standard. * Minimal dependencies, pure Python. -* If available, lxml_ will be used to increase its speed. +* If available, ``lxml`` will be used to increase its speed. .. toctree:: :maxdepth: 2 quickstart - installing - usage_guide - reference_guide + create_kml_files + working_with_kml + configuration modules contributing - -.. _lxml: https://pypi.python.org/pypi/lxml -.. _tox: https://pypi.python.org/pypi/tox -.. _kml_reference: https://developers.google.com/kml/documentation/kmlreference + HISTORY diff --git a/docs/installing.rst b/docs/installing.rst deleted file mode 100644 index f0738c8d..00000000 --- a/docs/installing.rst +++ /dev/null @@ -1,24 +0,0 @@ -Installation -============ - -fastkml works with CPython and Pypy version 3.7+ and is -continually tested for these version. -Jython and IronPython are not tested but *should* work. - -.. image:: https://api.travis-ci.org/cleder/fastkml.png - :target: https://travis-ci.org/cleder/fastkml - -fastkml works on Unix/Linux, OS X, and Windows. - -Install it with ``pip install fastkml``. - -If you use fastkml extensively or need to process big KML files, consider -installing lxml_ as it speeds up processing. - -You can install all requirements for working with fastkml by using pip_ from -the base of the source tree:: - - pip install -r requirements.txt - -.. _lxml: https://pypi.python.org/pypi/lxml -.. _pip: https://pypi.python.org/pypi/pip diff --git a/docs/modules.rst b/docs/modules.rst index 8af3d880..545261fa 100644 --- a/docs/modules.rst +++ b/docs/modules.rst @@ -1,5 +1,6 @@ -fastkml -======= +=============== +Reference Guide +=============== .. toctree:: :maxdepth: 4 diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 2a906d11..34b2355e 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -1,11 +1,208 @@ Quickstart ========== +This quickstart guide will show you how to create a simple KML file from scratch and how +to read a KML file from a string. The example demonstrates organizing geographic data using +nested folders and placemarks - common structures used to group and display locations in +Google Earth and other KML viewers. -:: +Build a KML from Scratch +------------------------ - $ pip install fastkml +Example how to build a simple KML file from the Python interpreter. + +First we import the necessary modules: + +.. code-block:: pycon - # Start working with the library - $ python >>> from fastkml import kml + >>> from pygeoif.geometry import Polygon + +Create a KML object and set the namespace: + +.. code-block:: pycon + >>> k = kml.KML() + >>> ns = "{http://www.opengis.net/kml/2.2}" + +Create a KML Document and add it to the KML root object: + +.. code-block:: pycon + + >>> d = kml.Document(ns=ns, id="docid", name="doc name", description="doc description") + >>> k.append(d) + +Create a KML Folder and add it to the Document: + +.. code-block:: pycon + + >>> f = kml.Folder(ns=ns, id="fid", name="f name", description="f description") + >>> d.append(f) + +Create a KML Folder and nest it in the first Folder: + +.. code-block:: pycon + + >>> nf = kml.Folder( + ... ns=ns, id="nested-fid", name="nested f name", description="nested f description" + ... ) + >>> f.append(nf) + +Create a second KML Folder within the Document: + +.. code-block:: pycon + + >>> f2 = kml.Folder(ns=ns, id="id2", name="name2", description="description2") + >>> d.append(f2) + +Create a KML Placemark with a simple polygon geometry and add it to the second Folder: + +.. code-block:: pycon + + >>> polygon = Polygon([(0, 0, 0), (1, 1, 0), (1, 0, 1)]) + >>> p = kml.Placemark( + ... ns=ns, id="id", name="name", description="description", geometry=polygon + ... ) + >>> f2.append(p) + +Finally, print out the KML object as a string: + +.. code-block:: pycon + + >>> print(k.to_string(prettyprint=True, precision=6)) + + + doc name + doc description + + f name + f description + + nested f name + nested f description + + + + name2 + description2 + + name + description + + + + 0.000000,0.000000,0.000000 1.000000,1.000000,0.000000 1.000000,0.000000,1.000000 0.000000,0.000000,0.000000 + + + + + + + + + + + +Read a KML File/String +---------------------- + +You can create a KML object by reading a KML file from a string + +.. code-block:: pycon + + >>> doc = """ + ... + ... Document.kml + ... 1 + ... + ... + ... Document Feature 1 + ... #exampleStyleDocument + ... + ... -122.371,37.816,0 + ... + ... + ... + ... Document Feature 2 + ... #exampleStyleDocument + ... + ... -122.370,37.817,0 + ... + ... + ... + ... """ + +Read in the KML string + +.. code-block:: pycon + + >>> k = kml.KML.from_string(doc) + +Next we perform some simple sanity checks, such as checking the number of features. + +.. code-block:: pycon + + # This corresponds to the single ``Document`` + >>> len(k.features) + 1 + +Check the number of Placemarks in the Document: + +.. code-block:: pycon + + # (The two Placemarks of the Document) + >>> k.features[0].features # doctest: +ELLIPSIS + [fastkml.features.Placemark... + >>> len(k.features[0].features) + 2 + +Check the Placemarks in the Document: + +.. code-block:: pycon + + # Check specifics of the first Placemark in the Document + >>> k.features[0].features[0] # doctest: +ELLIPSIS + fastkml.features.Placemark(... + >>> k.features[0].features[0].description + >>> k.features[0].features[0].name + 'Document Feature 1' + + # Check specifics of the second Placemark in the Document + >>> k.features[0].features[1].name + 'Document Feature 2' + >>> k.features[0].features[1].name = "ANOTHER NAME" + +Finally, print out the KML object as a string: + +.. code-block:: pycon + + >>> print(k.to_string(prettyprint=True, precision=6)) + + + Document.kml + 1 + + + Document Feature 1 + #exampleStyleDocument + + -122.371000,37.816000,0.000000 + + + + ANOTHER NAME + #exampleStyleDocument + + -122.370000,37.817000,0.000000 + + + + + diff --git a/docs/reference_guide.rst b/docs/reference_guide.rst deleted file mode 100644 index d5915e59..00000000 --- a/docs/reference_guide.rst +++ /dev/null @@ -1,45 +0,0 @@ -=============== -Reference Guide -=============== - -Atom -==== - -.. automodule:: fastkml.atom - :members: - -Base -==== - -.. automodule:: fastkml.base - :members: - -Config -====== - -.. automodule:: fastkml.config - :members: - -Geometry -======== - -.. automodule:: fastkml.geometry - :members: - -GX -== - -.. automodule:: fastkml.gx - :members: - -KML -=== - -.. automodule:: fastkml.kml - :members: - -Styles -====== - -.. automodule:: fastkml.styles - :members: diff --git a/docs/usage_guide.rst b/docs/usage_guide.rst deleted file mode 100644 index 1f76b2af..00000000 --- a/docs/usage_guide.rst +++ /dev/null @@ -1,174 +0,0 @@ -Usage Guide -=========== - -You can find more examples in the included ``tests/`` directory. - -Build a KML from Scratch ------------------------- - -Example how to build a simple KML file from the Python interpreter. - -.. code-block:: pycon - - # Import the library - >>> from fastkml import kml - >>> from pygeoif.geometry import Polygon - - # Create the root KML object - >>> k = kml.KML() - >>> ns = "{http://www.opengis.net/kml/2.2}" - - # Create a KML Document and add it to the KML root object - >>> d = kml.Document(ns=ns, id="docid", name="doc name", description="doc description") - >>> k.append(d) - - # Create a KML Folder and add it to the Document - >>> f = kml.Folder(ns=ns, id="fid", name="f name", description="f description") - >>> d.append(f) - - # Create a KML Folder and nest it in the first Folder - >>> nf = kml.Folder( - ... ns=ns, id="nested-fid", name="nested f name", description="nested f description" - ... ) - >>> f.append(nf) - - # Create a second KML Folder within the Document - >>> f2 = kml.Folder(ns=ns, id="id2", name="name2", description="description2") - >>> d.append(f2) - - # Create a Placemark with a simple polygon geometry and add it to the - # second folder of the Document - >>> polygon = Polygon([(0, 0, 0), (1, 1, 0), (1, 0, 1)]) - >>> p = kml.Placemark( - ... ns=ns, id="id", name="name", description="description", geometry=polygon - ... ) - >>> f2.append(p) - - # Print out the KML Object as a string - >>> print(k.to_string(prettyprint=True, precision=6)) - - - doc name - doc description - - f name - f description - - nested f name - nested f description - - - - name2 - description2 - - name - description - - - - 0.000000,0.000000,0.000000 1.000000,1.000000,0.000000 1.000000,0.000000,1.000000 0.000000,0.000000,0.000000 - - - - - - - - - - - -Read a KML File/String ----------------------- - -You can create a KML object by reading a KML file as a string - -.. code-block:: pycon - - # Start by importing the kml module - >>> from fastkml import kml - - # Setup the string which contains the KML file we want to read - >>> doc = """ - ... - ... Document.kml - ... 1 - ... - ... - ... Document Feature 1 - ... #exampleStyleDocument - ... - ... -122.371,37.816,0 - ... - ... - ... - ... Document Feature 2 - ... #exampleStyleDocument - ... - ... -122.370,37.817,0 - ... - ... - ... - ... """ - - # Read in the KML string - >>> k = kml.KML.from_string(doc) - - # Next we perform some simple sanity checks - - # Check that the number of features is correct - # This corresponds to the single ``Document`` - >>> len(k.features) - 1 - - # (The two Placemarks of the Document) - >>> k.features[0].features # doctest: +ELLIPSIS - [fastkml.features.Placemark... - >>> len(k.features[0].features) - 2 - - # Check specifics of the first Placemark in the Document - >>> k.features[0].features[0] # doctest: +ELLIPSIS - fastkml.features.Placemark(... - >>> k.features[0].features[0].description - >>> k.features[0].features[0].name - 'Document Feature 1' - - # Check specifics of the second Placemark in the Document - >>> k.features[0].features[1].name - 'Document Feature 2' - >>> k.features[0].features[1].name = "ANOTHER NAME" - - # Verify that we can print back out the KML object as a string - >>> print(k.to_string(prettyprint=True, precision=6)) - - - Document.kml - 1 - - - Document Feature 1 - #exampleStyleDocument - - -122.371000,37.816000,0.000000 - - - - ANOTHER NAME - #exampleStyleDocument - - -122.370000,37.817000,0.000000 - - - - - diff --git a/docs/working_with_kml.rst b/docs/working_with_kml.rst new file mode 100644 index 00000000..a05d2ccc --- /dev/null +++ b/docs/working_with_kml.rst @@ -0,0 +1,56 @@ +Working with KML Files +====================== + +Import the necessary modules: + +.. code-block:: pycon + + >>> from fastkml.utils import find_all + >>> from fastkml import KML + >>> from fastkml import Placemark, Point + + +Open a KML file: + +.. code-block:: pycon + + >>> k = KML.parse("docs/Document-clean.kml") + +Extract all placemarks and print their geometries. +The function ``find_all`` recursively searches a KML document for elements of a specific +type and returns an iterator of all matching elements found in the document tree. + +.. code-block:: pycon + + >>> placemarks = list(find_all(k, of_type=Placemark)) + >>> for p in placemarks: + ... print(p.geometry) # doctest: +ELLIPSIS + ... + POINT Z (-123.93563168 49.16716103 5.0) + POLYGON Z ((-123.940449937288 49.16927524669021 17.0, ... + >>> pts = list(find_all(k, of_type=Point)) + >>> for point in pts: + ... print(point.geometry) + ... + POINT Z (-123.93563168 49.16716103 5.0) + POINT Z (-123.1097 49.2774 0.0) + POINT Z (-123.028369 49.26107900000001 0.0) + POINT Z (-123.3215766 49.2760338 0.0) + POINT Z (-123.2643704 49.3301853 0.0) + POINT Z (-123.2477084 49.2890857 0.0) + + + +``find_all`` can also search for arbitrary elements by their attributes, by passing the +attribute name and value as keyword arguments: + + +.. code-block:: pycon + + >>> al = list(find_all(k, name="Vancouver Film Studios")) + >>> al[0].name + 'Vancouver Film Studios' + >>> al[0].get_tag_name() + 'Placemark' + >>> list(find_all(k, href="http://www.vancouverfilmstudios.com/")) # doctest: +ELLIPSIS + [fastkml.atom.Link(ns=... diff --git a/examples/CreateKml.py b/examples/CreateKml.py deleted file mode 100644 index 6906825b..00000000 --- a/examples/CreateKml.py +++ /dev/null @@ -1,78 +0,0 @@ -# Import the library -from pygeoif.geometry import Polygon - -from fastkml import kml - -# Create the root KML object -k = kml.KML() -ns = "{http://www.opengis.net/kml/2.2}" - -# Create a KML Document and add it to the KML root object -d = kml.Document(ns, "docid", "doc name", "doc description") -k.append(d) - -# Create a KML Folder and add it to the Document -f = kml.Folder(ns, "fid", "f name", "f description") -d.append(f) - -# Create a KML Folder and nest it in the first Folder -nf = kml.Folder(ns, "nested-fid", "nested f name", "nested f description") -f.append(nf) - -# Create a second KML Folder within the Document -f2 = kml.Folder(ns, "id2", "name2", "description2") -d.append(f2) - -# Create a Placemark with a simple polygon geometry and add it to the -# second folder of the Document -p = kml.Placemark(ns, "id", "name", "description") -p.geometry = Polygon([(0, 0, 0), (1, 1, 0), (1, 0, 1)]) -f2.append(p) - -# Print out the KML Object as a string -print(k.to_string(prettyprint=True)) - -expected = """ - - doc name - doc description - 1 - 0 - - f name - f description - 1 - 0 - - nested f name - nested f description - 1 - 0 - - - - name2 - description2 - 1 - 0 - - name - description - 1 - 0 - - - - - 0.000000,0.000000,0.000000 - 1.000000,1.000000,0.000000 - 1.000000,0.000000,1.000000 - 0.000000,0.000000,0.000000 - - - - - - - -""" diff --git a/examples/README.md b/examples/README.md index f29c96c8..1ed57fa9 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,3 +1,13 @@ -Simply run `UsageExamples.py` to see some ways to use `fastkml` library (which should already be [installed](https://github.com/heltonbiker/fastkml#install)). +# Usage Examples for FastKML -File `KML_Samples.kml` was found in [Google Developers](https://developers.google.com/kml/documentation/KML_Samples.kml) site. +The `KML_Samples.kml` file was found in [Google Developers](https://developers.google.com/kml/documentation/KML_Samples.kml) site. + + +The data for the `shp2kml` examples was obtained from +[Data on CO2 and Greenhouse Gas Emissions by Our World in Data](https://github.com/owid/co2-data) +and the shapefile (Small scale data, 1:110m) from +[Natural Earth](https://www.naturalearthdata.com/). +The data provided in this directory is only a small subset of that data just enough +to create the KML. + +![CO2 Emissions Per Capita](co2_per_capita.jpg) diff --git a/examples/co2_per_capita.jpg b/examples/co2_per_capita.jpg new file mode 100644 index 00000000..429f3ad9 Binary files /dev/null and b/examples/co2_per_capita.jpg differ diff --git a/examples/ne_110m_admin_0_countries.README.html b/examples/ne_110m_admin_0_countries.README.html new file mode 100644 index 00000000..3ddf0d42 --- /dev/null +++ b/examples/ne_110m_admin_0_countries.README.html @@ -0,0 +1,547 @@ + + + + + + +Natural Earth » Blog Archive » Admin 0 – Countries - Free vector and raster map data at 1:10m, 1:50m, and 1:110m scales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + +
+

Admin 0 – Countries

+ +
+
+
countries_thumb
+
There are 258 countries in the world. Greenland as separate from Denmark. Most users will want this file instead of sovereign states, though some users will want map units instead when needing to distinguish overseas regions of France.
+
+

Natural Earth shows de facto boundaries by default according to who controls the territory, versus de jure.

+ + +

+
+
+
+

countries_banner

+

About

+

Countries distinguish between metropolitan (homeland) and independent and semi-independent portions of sovereign states. If you want to see the dependent overseas regions broken out (like in ISO codes, see France for example), use map units instead.

+

Each country is coded with a world region that roughly follows the United Nations setup.

+

Includes some thematic data from the United Nations, U.S. Central Intelligence Agency, and elsewhere.

+

Disclaimer

+

Natural Earth Vector draws boundaries of countries according to defacto status. We show who actually controls the situation on the ground. Please feel free to mashup our disputed areas (link) theme to match your particular political outlook.

+

Known Problems

+

None.

+

Version History

+ + +

The master changelog is available on Github »

+
+ + + + +
+ +
+ + + + + +
+ + + + + + +
+
    +
  1. +
    + + + + +

    […] earlier. It’s the result of a conversion of a polygon shapefile of country boundaries (from Natural Earth, a fantastic, public domain, physical/cultural spatial data source) to a raster data […]

    + + +
    +
  2. +
  3. +
    + + + + +

    […] Le mappe sono scaricate da https://www.naturalearthdata.com […]

    + + +
    +
  4. +
  5. +
    + + + + +

    […] Le mappe sono scaricate da https://www.naturalearthdata.com […]

    + + +
    +
  6. +
+
+
+ + + + + + + + +
+ + +
+ +
+ + + + + + + + + + diff --git a/examples/ne_110m_admin_0_countries.cpg b/examples/ne_110m_admin_0_countries.cpg new file mode 100644 index 00000000..7edc66b0 --- /dev/null +++ b/examples/ne_110m_admin_0_countries.cpg @@ -0,0 +1 @@ +UTF-8 diff --git a/examples/ne_110m_admin_0_countries.dbf b/examples/ne_110m_admin_0_countries.dbf new file mode 100755 index 00000000..e0acd066 Binary files /dev/null and b/examples/ne_110m_admin_0_countries.dbf differ diff --git a/examples/ne_110m_admin_0_countries.prj b/examples/ne_110m_admin_0_countries.prj new file mode 100755 index 00000000..40dd8c6c --- /dev/null +++ b/examples/ne_110m_admin_0_countries.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.017453292519943295]] diff --git a/examples/ne_110m_admin_0_countries.shp b/examples/ne_110m_admin_0_countries.shp new file mode 100755 index 00000000..9318e45c Binary files /dev/null and b/examples/ne_110m_admin_0_countries.shp differ diff --git a/examples/ne_110m_admin_0_countries.shx b/examples/ne_110m_admin_0_countries.shx new file mode 100755 index 00000000..c3728e0d Binary files /dev/null and b/examples/ne_110m_admin_0_countries.shx differ diff --git a/examples/owid-co2-data.csv b/examples/owid-co2-data.csv new file mode 100644 index 00000000..f6f5e1a3 --- /dev/null +++ b/examples/owid-co2-data.csv @@ -0,0 +1,6133 @@ +year,iso_code,co2_per_capita +1995,AFG,0.086 +1995,,4.096 +1995,ALB,0.636 +1995,DZA,3.398 +1995,AND,6.752 +1995,AGO,0.907 +1995,AIA,6.091 +1995,ATA,0 +1995,ATG,3.963 +1995,ARG,3.584 +1995,ARM,1.012 +1995,ABW,9.175 +1995,AUS,16.945 +1995,AUT,8.059 +1995,AZE,4.222 +1995,BHS,6.14 +1995,BHR,24.184 +1995,BGD,0.179 +1995,BRB,4.891 +1995,BLR,5.822 +1995,BEL,12.475 +1995,BLZ,1.854 +1995,BEN,0.158 +1995,BMU,8.931 +1995,BTN,0.472 +1995,BOL,1.15 +1995,BES,4.706 +1995,BIH,0.907 +1995,BWA,1.972 +1995,BRA,1.643 +1995,VGB,4.97 +1995,BRN,19.476 +1995,BGR,6.831 +1995,BFA,0.06 +1995,BDI,0.04 +1995,KHM,0.142 +1995,CMR,0.407 +1995,CAN,16.792 +1995,CPV,0.481 +1995,CALF,0.064 +1995,TCD,0.062 +1995,CHL,2.883 +1995,CHN,2.76 +1995,CXR,0 +1995,COL,1.652 +1995,COM,0.159 +1995,COG,1.176 +1995,COK,2.682 +1995,CRI,1.344 +1995,CIV,0.435 +1995,HRV,3.498 +1995,CUB,2.09 +1995,CUW,30.84 +1995,CYP,6.797 +1995,CZE,12.764 +1995,COD,0.072 +1995,DNK,11.777 +1995,DJI,0.495 +1995,DMA,1.164 +1995,DOM,1.92 +1995,TLS,0.0 +1995,ECU,2.032 +1995,EGY,1.543 +1995,SLV,0.87 +1995,GNQ,2.188 +1995,ERI,0.381 +1995,EST,12.432 +1995,SWZ,1.114 +1995,ETH,0.044 +1995,FRO,13.041 +1995,FJI,0.93 +1995,FIN,11.378 +1995,FRA,6.73 +1995,PYF,2.042 +1995,GAB,4.653 +1995,GMB,0.174 +1995,GEO,0.47 +1995,DEU,11.586 +1995,GHA,0.265 +1995,GRC,8.106 +1995,GRL,9.575 +1995,GRD,1.443 +1995,GTM,0.683 +1995,GIN,0.156 +1995,GNB,0.164 +1995,GUY,2.086 +1995,HTI,0.115 +1995,HND,0.66 +1995,HKG,5.008 +1995,HUN,5.965 +1995,ISL,9.225 +1995,IND,0.789 +1995,IDN,1.122 +1995,IRN,4.429 +1995,IRQ,3.804 +1995,IRL,10.016 +1995,ISR,9.102 +1995,ITA,7.901 +1995,JAM,3.656 +1995,JPN,9.878 +1995,JOR,2.963 +1995,KAZ,10.24 +1995,KEN,0.281 +1995,KIR,0.36 +1995,KWT,33.909 +1995,KGZ,0.981 +1995,LAO,0.136 +1995,LVA,3.554 +1995,LBN,3.095 +1995,ALSO,0.883 +1995,LBR,0.194 +1995,LBY,11.535 +1995,LIE,6.606 +1995,LTU,4.018 +1995,LUX,22.461 +1995,MAC,3.104 +1995,MDG,0.086 +1995,MWI,0.09 +1995,MYS,5.504 +1995,MDV,0.965 +1995,MLI,0.06 +1995,MLT,6.422 +1995,MHL,1.734 +1995,MRT,0.426 +1995,MUS,1.576 +1995,MEX,3.681 +1995,FSM,1.627 +1995,MDA,2.557 +1995,MCO,0 +1995,MNG,3.363 +1995,MNE,2.1 +1995,MSR,3.942 +1995,MAR,1.081 +1995,MOZ,0.073 +1995,MMR,0.161 +1995,NAME,1.009 +1995,NRU,10.28 +1995,NPL,0.104 +1995,NLD,11.213 +1995,NCL,10.33 +1995,NZL,7.622 +1995,NIC,0.583 +1995,NER,0.057 +1995,NGA,0.78 +1995,NIU,3.102 +1995,PRK,3.399 +1995,MKD,3.995 +1995,NOR,8.822 +1995,OMN,8.623 +1995,PAK,0.628 +1995,PLW,11.481 +1995,PSE,0.36 +1995,PAN,1.345 +1995,PNG,0.446 +1995,PRY,0.855 +1995,PER,1.028 +1995,PHL,0.866 +1995,POL,9.443 +1995,PRT,5.419 +1995,QAT,64.326 +1995,ROU,5.579 +1995,RUS,10.903 +1995,RWA,0.08 +1995,SHN,1.726 +1995,KNA,3.012 +1995,LCA,1.804 +1995,SPM,10.812 +1995,VCT,1.123 +1995,WSM,0.649 +1995,SMR,0 +1995,STP,0.358 +1995,SAU,14.195 +1995,SEN,0.397 +1995,SRB,4.903 +1995,SYC,2.647 +1995,SLE,0.052 +1995,SGP,11.441 +1995,SXM,16.265 +1995,SVK,8.251 +1995,SVN,7.711 +1995,SLB,0.508 +1995,SOME,0.081 +1995,ZAF,8.223 +1995,KOR,8.452 +1995,SSD,0.067 +1995,ESP,6.682 +1995,LKA,0.32 +1995,SDN,0.17 +1995,SURE,4.742 +1995,SWE,6.794 +1995,CHE,6.167 +1995,SYR,3.22 +1995,TWN,7.871 +1995,TJK,0.413 +1995,TZA,0.08 +1995,THA,2.586 +1995,TGO,0.274 +1995,TON,0.953 +1995,TO,11.265 +1995,TUN,1.751 +1995,TUR,3.058 +1995,TKM,8.179 +1995,TCA,4.603 +1995,TUV,0.381 +1995,UGA,0.045 +1995,UKR,7.639 +1995,ARE,29.771 +1995,GBR,9.773 +1995,USA,20.422 +1995,URY,1.42 +1995,UZB,4.551 +1995,VUT,0.387 +1995,VAT,0 +1995,VEN,5.642 +1995,VNM,0.408 +1995,WLF,1.29 +1995,YEM,0.687 +1995,ZMB,0.247 +1995,ZWE,1.367 +1996,AFG,0.08 +1996,,4.163 +1996,ALB,0.617 +1996,DZA,3.451 +1996,AND,7.081 +1996,AGO,1.06 +1996,AIA,6.301 +1996,ATA,0 +1996,ATG,4.146 +1996,ARG,3.705 +1996,ARM,0.758 +1996,ABW,9.133 +1996,AUS,17.128 +1996,AUT,8.468 +1996,AZE,3.93 +1996,BHS,5.948 +1996,BHR,25.315 +1996,BGD,0.179 +1996,BRB,5.095 +1996,BLR,5.915 +1996,BEL,12.79 +1996,BLZ,1.467 +1996,BEN,0.191 +1996,BMU,8.815 +1996,BTN,0.555 +1996,BOL,1.254 +1996,BES,4.355 +1996,BIH,1.085 +1996,BWA,1.741 +1996,BRA,1.742 +1996,VGB,5.452 +1996,BRN,19.198 +1996,BGR,6.958 +1996,BFA,0.066 +1996,BDI,0.041 +1996,KHM,0.146 +1996,CMR,0.44 +1996,CAN,17.172 +1996,CPV,0.513 +1996,CALF,0.063 +1996,TCD,0.062 +1996,CHL,3.3 +1996,CHN,2.857 +1996,CXR,0 +1996,COL,1.636 +1996,COM,0.163 +1996,COG,1.433 +1996,COK,2.878 +1996,CRI,1.282 +1996,CIV,0.508 +1996,HRV,3.645 +1996,CUB,2.128 +1996,CUW,29.169 +1996,CYP,7.058 +1996,CZE,13.114 +1996,COD,0.079 +1996,DNK,14.25 +1996,DJI,0.477 +1996,DMA,1.059 +1996,DOM,2.057 +1996,TLS,0.0 +1996,ECU,2.149 +1996,EGY,1.494 +1996,SLV,0.761 +1996,GNQ,2.327 +1996,ERI,0.397 +1996,EST,13.273 +1996,SWZ,0.809 +1996,ETH,0.047 +1996,FRO,13.606 +1996,FJI,0.995 +1996,FIN,12.495 +1996,FRA,6.992 +1996,PYF,1.994 +1996,GAB,5.115 +1996,GMB,0.172 +1996,GEO,0.851 +1996,DEU,11.804 +1996,GHA,0.272 +1996,GRC,8.248 +1996,GRL,10.663 +1996,GRD,1.468 +1996,GTM,0.618 +1996,GIN,0.161 +1996,GNB,0.18 +1996,GUY,2.193 +1996,HTI,0.131 +1996,HND,0.648 +1996,HKG,4.564 +1996,HUN,6.127 +1996,ISL,9.377 +1996,IND,0.838 +1996,IDN,1.257 +1996,IRN,4.463 +1996,IRQ,3.453 +1996,IRL,10.389 +1996,ISR,9.254 +1996,ITA,7.797 +1996,JAM,3.825 +1996,JPN,9.955 +1996,JOR,3.0 +1996,KAZ,9.57 +1996,KEN,0.336 +1996,KIR,0.354 +1996,KWT,30.31 +1996,KGZ,1.211 +1996,LAO,0.149 +1996,LVA,3.635 +1996,LBN,3.161 +1996,ALSO,0.888 +1996,LBR,0.194 +1996,LBY,11.193 +1996,LIE,6.567 +1996,LTU,4.229 +1996,LUX,22.283 +1996,MAC,3.48 +1996,MDG,0.087 +1996,MWI,0.089 +1996,MYS,5.347 +1996,MDV,1.097 +1996,MLI,0.064 +1996,MLT,6.577 +1996,MHL,1.706 +1996,MRT,0.437 +1996,MUS,1.662 +1996,MEX,3.732 +1996,FSM,1.653 +1996,MDA,2.638 +1996,MCO,0 +1996,MNG,3.367 +1996,MNE,2.453 +1996,MSR,4.736 +1996,MAR,1.094 +1996,MOZ,0.068 +1996,MMR,0.166 +1996,NAME,1.044 +1996,NRU,9.893 +1996,NPL,0.103 +1996,NLD,11.732 +1996,NCL,10.7 +1996,NZL,7.86 +1996,NIC,0.592 +1996,NER,0.063 +1996,NGA,0.882 +1996,NIU,3.155 +1996,PRK,2.931 +1996,MKD,4.722 +1996,NOR,9.477 +1996,OMN,8.194 +1996,PAK,0.682 +1996,PLW,11.141 +1996,PSE,0.379 +1996,PAN,1.604 +1996,PNG,0.458 +1996,PRY,0.789 +1996,PER,0.992 +1996,PHL,0.864 +1996,POL,9.825 +1996,PRT,5.131 +1996,QAT,65.039 +1996,ROU,5.761 +1996,RUS,10.705 +1996,RWA,0.069 +1996,SHN,1.741 +1996,KNA,3.059 +1996,LCA,1.904 +1996,SPM,10.817 +1996,VCT,1.154 +1996,WSM,0.705 +1996,SMR,0 +1996,STP,0.352 +1996,SAU,13.566 +1996,SEN,0.414 +1996,SRB,5.733 +1996,SYC,3.103 +1996,SLE,0.053 +1996,SGP,13.147 +1996,SXM,15.305 +1996,SVK,8.216 +1996,SVN,8.037 +1996,SLB,0.512 +1996,SOME,0.077 +1996,ZAF,8.144 +1996,KOR,9.22 +1996,SSD,0.068 +1996,ESP,6.338 +1996,LKA,0.38 +1996,SDN,0.171 +1996,SURE,4.692 +1996,SWE,7.214 +1996,CHE,6.238 +1996,SYR,3.204 +1996,TWN,8.18 +1996,TJK,0.468 +1996,TZA,0.081 +1996,THA,2.883 +1996,TGO,0.285 +1996,TON,0.768 +1996,TO,14.053 +1996,TUN,1.762 +1996,TUR,3.311 +1996,TKM,7.36 +1996,TCA,4.398 +1996,TUV,0.38 +1996,UGA,0.048 +1996,UKR,6.95 +1996,ARE,29.312 +1996,GBR,10.103 +1996,USA,20.867 +1996,URY,1.675 +1996,UZB,4.61 +1996,VUT,0.482 +1996,VAT,0 +1996,VEN,5.239 +1996,VNM,0.473 +1996,WLF,1.536 +1996,YEM,0.68 +1996,ZMB,0.206 +1996,ZWE,1.334 +1997,AFG,0.073 +1997,,4.13 +1997,ALB,0.474 +1997,DZA,2.998 +1997,AND,7.192 +1997,AGO,1.068 +1997,AIA,6.136 +1997,ATA,0 +1997,ATG,4.372 +1997,ARG,3.812 +1997,ARM,0.994 +1997,ABW,9.264 +1997,AUS,17.4 +1997,AUT,8.445 +1997,AZE,3.73 +1997,BHS,5.186 +1997,BHR,26.49 +1997,BGD,0.189 +1997,BRB,5.852 +1997,BLR,5.921 +1997,BEL,12.21 +1997,BLZ,1.789 +1997,BEN,0.192 +1997,BMU,8.697 +1997,BTN,0.713 +1997,BOL,1.44 +1997,BES,4.508 +1997,BIH,2.067 +1997,BWA,1.729 +1997,BRA,1.821 +1997,VGB,5.513 +1997,BRN,19.434 +1997,BGR,6.709 +1997,BFA,0.074 +1997,BDI,0.042 +1997,KHM,0.136 +1997,CMR,0.386 +1997,CAN,17.488 +1997,CPV,0.527 +1997,CALF,0.063 +1997,TCD,0.061 +1997,CHL,3.777 +1997,CHN,2.84 +1997,CXR,0 +1997,COL,1.75 +1997,COM,0.167 +1997,COG,1.68 +1997,COK,2.914 +1997,CRI,1.315 +1997,CIV,0.47 +1997,HRV,3.939 +1997,CUB,2.256 +1997,CUW,30.898 +1997,CYP,7.018 +1997,CZE,12.739 +1997,COD,0.069 +1997,DNK,12.4 +1997,DJI,0.499 +1997,DMA,1.167 +1997,DOM,2.118 +1997,TLS,0.0 +1997,ECU,1.621 +1997,EGY,1.667 +1997,SLV,0.927 +1997,GNQ,3.261 +1997,ERI,0.353 +1997,EST,13.143 +1997,SWZ,1.154 +1997,ETH,0.049 +1997,FRO,13.251 +1997,FJI,0.95 +1997,FIN,12.198 +1997,FRA,6.838 +1997,PYF,2.054 +1997,GAB,4.685 +1997,GMB,0.17 +1997,GEO,0.954 +1997,DEU,11.438 +1997,GHA,0.302 +1997,GRC,8.625 +1997,GRL,11.015 +1997,GRD,1.597 +1997,GTM,0.688 +1997,GIN,0.164 +1997,GNB,0.173 +1997,GUY,2.392 +1997,HTI,0.17 +1997,HND,0.653 +1997,HKG,4.735 +1997,HUN,5.999 +1997,ISL,9.653 +1997,IND,0.856 +1997,IDN,1.368 +1997,IRN,4.279 +1997,IRQ,3.411 +1997,IRL,10.66 +1997,ISR,9.553 +1997,ITA,7.895 +1997,JAM,3.941 +1997,JPN,9.873 +1997,JOR,2.973 +1997,KAZ,9.255 +1997,KEN,0.289 +1997,KIR,0.348 +1997,KWT,32.144 +1997,KGZ,1.174 +1997,LAO,0.154 +1997,LVA,3.474 +1997,LBN,3.676 +1997,ALSO,0.897 +1997,LBR,0.187 +1997,LBY,10.562 +1997,LIE,6.868 +1997,LTU,4.104 +1997,LUX,20.468 +1997,MAC,3.613 +1997,MDG,0.104 +1997,MWI,0.087 +1997,MYS,5.63 +1997,MDV,1.226 +1997,MLI,0.07 +1997,MLT,6.574 +1997,MHL,1.679 +1997,MRT,0.434 +1997,MUS,1.686 +1997,MEX,3.892 +1997,FSM,1.747 +1997,MDA,1.662 +1997,MCO,0 +1997,MNG,3.197 +1997,MNE,2.635 +1997,MSR,4.65 +1997,MAR,1.094 +1997,MOZ,0.071 +1997,MMR,0.169 +1997,NAME,1.045 +1997,NRU,9.878 +1997,NPL,0.114 +1997,NLD,11.215 +1997,NCL,8.72 +1997,NZL,8.284 +1997,NIC,0.636 +1997,NER,0.061 +1997,NGA,0.842 +1997,NIU,3.211 +1997,PRK,2.79 +1997,MKD,4.214 +1997,NOR,9.449 +1997,OMN,8.04 +1997,PAK,0.664 +1997,PLW,10.798 +1997,PSE,0.304 +1997,PAN,1.637 +1997,PNG,0.527 +1997,PRY,0.857 +1997,PER,1.094 +1997,PHL,0.964 +1997,POL,9.564 +1997,PRT,5.392 +1997,QAT,76.612 +1997,ROU,5.301 +1997,RUS,10.019 +1997,RWA,0.063 +1997,SHN,1.758 +1997,KNA,3.271 +1997,LCA,1.909 +1997,SPM,7.425 +1997,VCT,1.154 +1997,WSM,0.698 +1997,SMR,0 +1997,STP,0.346 +1997,SAU,11.118 +1997,SEN,0.352 +1997,SRB,6.16 +1997,SYC,3.59 +1997,SLE,0.047 +1997,SGP,15.087 +1997,SXM,16.13 +1997,SVK,8.218 +1997,SVN,8.296 +1997,SLB,0.517 +1997,SOME,0.069 +1997,ZAF,8.507 +1997,KOR,9.681 +1997,SSD,0.08 +1997,ESP,6.616 +1997,LKA,0.408 +1997,SDN,0.205 +1997,SURE,4.647 +1997,SWE,6.629 +1997,CHE,6.072 +1997,SYR,3.261 +1997,TWN,8.755 +1997,TJK,0.351 +1997,TZA,0.089 +1997,THA,2.971 +1997,TGO,0.191 +1997,TON,0.983 +1997,TO,14.346 +1997,TUN,1.801 +1997,TUR,3.461 +1997,TKM,7.149 +1997,TCA,5.095 +1997,TUV,0.38 +1997,UGA,0.049 +1997,UKR,6.787 +1997,ARE,26.554 +1997,GBR,9.66 +1997,USA,20.882 +1997,URY,1.699 +1997,UZB,4.566 +1997,VUT,0.492 +1997,VAT,0 +1997,VEN,5.629 +1997,VNM,0.598 +1997,WLF,1.525 +1997,YEM,0.711 +1997,ZMB,0.258 +1997,ZWE,1.224 +1998,AFG,0.069 +1998,,4.064 +1998,ALB,0.543 +1998,DZA,3.56 +1998,AND,7.53 +1998,AGO,1.075 +1998,AIA,6.318 +1998,ATA,0 +1998,ATG,4.442 +1998,ARG,3.836 +1998,ARM,1.055 +1998,ABW,9.555 +1998,AUS,17.963 +1998,AUT,8.39 +1998,AZE,3.953 +1998,BHS,6.308 +1998,BHR,27.311 +1998,BGD,0.187 +1998,BRB,5.963 +1998,BLR,5.8 +1998,BEL,12.781 +1998,BLZ,1.645 +1998,BEN,0.169 +1998,BMU,8.582 +1998,BTN,0.686 +1998,BOL,1.358 +1998,BES,0.246 +1998,BIH,2.564 +1998,BWA,2.018 +1998,BRA,1.855 +1998,VGB,5.371 +1998,BRN,17.477 +1998,BGR,6.45 +1998,BFA,0.077 +1998,BDI,0.041 +1998,KHM,0.168 +1998,CMR,0.375 +1998,CAN,17.591 +1998,CPV,0.549 +1998,CALF,0.062 +1998,TCD,0.06 +1998,CHL,3.818 +1998,CHN,2.699 +1998,CXR,0 +1998,COL,1.734 +1998,COM,0.178 +1998,COG,1.317 +1998,COK,2.787 +1998,CRI,1.37 +1998,CIV,0.426 +1998,HRV,4.08 +1998,CUB,2.202 +1998,CUW,1.728 +1998,CYP,7.208 +1998,CZE,12.238 +1998,COD,0.06 +1998,DNK,11.557 +1998,DJI,0.554 +1998,DMA,1.116 +1998,DOM,2.148 +1998,TLS,0.071 +1998,ECU,1.893 +1998,EGY,1.827 +1998,SLV,0.974 +1998,GNQ,3.656 +1998,ERI,0.252 +1998,EST,12.005 +1998,SWZ,1.156 +1998,ETH,0.05 +1998,FRO,13.876 +1998,FJI,0.913 +1998,FIN,11.517 +1998,FRA,7.127 +1998,PYF,2.006 +1998,GAB,5.334 +1998,GMB,0.178 +1998,GEO,1.093 +1998,DEU,11.327 +1998,GHA,0.298 +1998,GRC,9.015 +1998,GRL,10.637 +1998,GRD,1.656 +1998,GTM,0.772 +1998,GIN,0.171 +1998,GNB,0.145 +1998,GUY,2.416 +1998,HTI,0.153 +1998,HND,0.763 +1998,HKG,5.946 +1998,HUN,5.975 +1998,ISL,9.62 +1998,IND,0.857 +1998,IDN,1.176 +1998,IRN,4.783 +1998,IRQ,3.507 +1998,IRL,11.066 +1998,ISR,9.543 +1998,ITA,8.108 +1998,JAM,3.762 +1998,JPN,9.535 +1998,JOR,2.942 +1998,KAZ,9.324 +1998,KEN,0.342 +1998,KIR,0.342 +1998,KWT,29.025 +1998,KGZ,1.227 +1998,LAO,0.156 +1998,LVA,3.374 +1998,LBN,3.897 +1998,ALSO,0.908 +1998,LBR,0.179 +1998,LBY,10.37 +1998,LIE,7.117 +1998,LTU,4.364 +1998,LUX,18.092 +1998,MAC,3.718 +1998,MDG,0.106 +1998,MWI,0.084 +1998,MYS,5.033 +1998,MDV,1.097 +1998,MLI,0.088 +1998,MLT,6.433 +1998,MHL,1.722 +1998,MRT,0.419 +1998,MUS,1.815 +1998,MEX,4.024 +1998,FSM,1.809 +1998,MDA,1.48 +1998,MCO,0 +1998,MNG,3.169 +1998,MNE,2.773 +1998,MSR,4.555 +1998,MAR,1.111 +1998,MOZ,0.066 +1998,MMR,0.181 +1998,NAME,1.047 +1998,NRU,9.512 +1998,NPL,0.094 +1998,NLD,11.209 +1998,NCL,8.507 +1998,NZL,7.837 +1998,NIC,0.682 +1998,NER,0.064 +1998,NGA,0.741 +1998,NIU,3.286 +1998,PRK,2.552 +1998,MKD,4.793 +1998,NOR,9.436 +1998,OMN,8.091 +1998,PAK,0.665 +1998,PLW,10.486 +1998,PSE,0.495 +1998,PAN,2.045 +1998,PNG,0.687 +1998,PRY,0.89 +1998,PER,1.087 +1998,PHL,0.916 +1998,POL,8.835 +1998,PRT,5.813 +1998,QAT,63.49 +1998,ROU,4.732 +1998,RUS,9.922 +1998,RWA,0.061 +1998,SHN,1.778 +1998,KNA,3.394 +1998,LCA,2.079 +1998,SPM,8.635 +1998,VCT,1.412 +1998,WSM,0.792 +1998,SMR,0 +1998,STP,0.341 +1998,SAU,10.412 +1998,SEN,0.36 +1998,SRB,6.497 +1998,SYC,3.726 +1998,SLE,0.049 +1998,SGP,12.263 +1998,SXM,0.897 +1998,SVK,8.16 +1998,SVN,8.067 +1998,SLB,0.53 +1998,SOME,0.063 +1998,ZAF,8.228 +1998,KOR,8.174 +1998,SSD,0.068 +1998,ESP,6.803 +1998,LKA,0.417 +1998,SDN,0.174 +1998,SURE,4.558 +1998,SWE,6.66 +1998,CHE,6.276 +1998,SYR,3.429 +1998,TWN,9.135 +1998,TJK,0.406 +1998,TZA,0.076 +1998,THA,2.587 +1998,TGO,0.273 +1998,TON,0.868 +1998,TO,15.05 +1998,TUN,1.838 +1998,TUR,3.408 +1998,TKM,7.547 +1998,TCA,5.093 +1998,TUV,1.138 +1998,UGA,0.054 +1998,UKR,6.61 +1998,ARE,27.423 +1998,GBR,9.729 +1998,USA,20.785 +1998,URY,1.728 +1998,UZB,4.987 +1998,VUT,0.46 +1998,VAT,0 +1998,VEN,7.248 +1998,VNM,0.621 +1998,WLF,1.515 +1998,YEM,0.729 +1998,ZMB,0.243 +1998,ZWE,1.224 +1999,AFG,0.057 +1999,,4.093 +1999,ALB,0.931 +1999,DZA,3.014 +1999,AND,7.811 +1999,AGO,1.088 +1999,AIA,6.138 +1999,ATA,0 +1999,ATG,4.665 +1999,ARG,4.029 +1999,ARM,0.948 +1999,ABW,9.321 +1999,AUS,18.295 +1999,AUT,8.218 +1999,AZE,3.558 +1999,BHS,6.349 +1999,BHR,26.461 +1999,BGD,0.198 +1999,BRB,6.259 +1999,BLR,5.623 +1999,BEL,12.195 +1999,BLZ,1.496 +1999,BEN,0.215 +1999,BMU,8.409 +1999,BTN,0.676 +1999,BOL,1.296 +1999,BES,1.823 +1999,BIH,2.488 +1999,BWA,1.867 +1999,BRA,1.886 +1999,VGB,5.792 +1999,BRN,18.278 +1999,BGR,5.675 +1999,BFA,0.079 +1999,BDI,0.041 +1999,KHM,0.159 +1999,CMR,0.355 +1999,CAN,17.911 +1999,CPV,0.644 +1999,CALF,0.063 +1999,TCD,0.06 +1999,CHL,4.046 +1999,CHN,2.834 +1999,CXR,0 +1999,COL,1.438 +1999,COM,0.181 +1999,COG,1.298 +1999,COK,3.105 +1999,CRI,1.394 +1999,CIV,0.373 +1999,HRV,4.348 +1999,CUB,2.21 +1999,CUW,13.128 +1999,CYP,7.362 +1999,CZE,11.384 +1999,COD,0.047 +1999,DNK,11.025 +1999,DJI,0.535 +1999,DMA,1.173 +1999,DOM,2.119 +1999,TLS,0.177 +1999,ECU,1.771 +1999,EGY,1.834 +1999,SLV,0.943 +1999,GNQ,3.834 +1999,ERI,0.261 +1999,EST,11.356 +1999,SWZ,1.216 +1999,ETH,0.048 +1999,FRO,13.933 +1999,FJI,0.919 +1999,FIN,11.396 +1999,FRA,7.067 +1999,PYF,2.182 +1999,GAB,4.847 +1999,GMB,0.197 +1999,GEO,0.981 +1999,DEU,10.979 +1999,GHA,0.293 +1999,GRC,8.908 +1999,GRL,10.599 +1999,GRD,1.818 +1999,GTM,0.768 +1999,GIN,0.175 +1999,GNB,0.161 +1999,GUY,2.417 +1999,HTI,0.155 +1999,HND,0.726 +1999,HKG,6.406 +1999,HUN,6.042 +1999,ISL,10.234 +1999,IND,0.913 +1999,IDN,1.384 +1999,IRN,5.769 +1999,IRQ,3.444 +1999,IRL,11.409 +1999,ISR,9.135 +1999,ITA,8.19 +1999,JAM,3.836 +1999,JPN,9.806 +1999,JOR,2.882 +1999,KAZ,7.817 +1999,KEN,0.336 +1999,KIR,0.336 +1999,KWT,29.284 +1999,KGZ,0.952 +1999,LAO,0.158 +1999,LVA,3.181 +1999,LBN,3.866 +1999,ALSO,0.915 +1999,LBR,0.135 +1999,LBY,9.937 +1999,LIE,6.942 +1999,LTU,3.701 +1999,LUX,18.907 +1999,MAC,3.565 +1999,MDG,0.112 +1999,MWI,0.081 +1999,MYS,4.649 +1999,MDV,1.515 +1999,MLI,0.089 +1999,MLT,6.497 +1999,MHL,1.633 +1999,MRT,0.418 +1999,MUS,2.012 +1999,MEX,4.01 +1999,FSM,1.708 +1999,MDA,1.088 +1999,MCO,0 +1999,MNG,3.083 +1999,MNE,1.912 +1999,MSR,6.328 +1999,MAR,1.135 +1999,MOZ,0.067 +1999,MMR,0.198 +1999,NAME,0.935 +1999,NRU,8.803 +1999,NPL,0.132 +1999,NLD,10.805 +1999,NCL,9.467 +1999,NZL,8.208 +1999,NIC,0.712 +1999,NER,0.061 +1999,NGA,0.71 +1999,NIU,3.382 +1999,PRK,2.764 +1999,MKD,4.34 +1999,NOR,9.545 +1999,OMN,9.507 +1999,PAK,0.664 +1999,PLW,10.198 +1999,PSE,0.449 +1999,PAN,1.91 +1999,PNG,0.48 +1999,PRY,0.871 +1999,PER,1.126 +1999,PHL,0.894 +1999,POL,8.585 +1999,PRT,6.531 +1999,QAT,59.102 +1999,ROU,4.039 +1999,RUS,10.141 +1999,RWA,0.063 +1999,SHN,1.798 +1999,KNA,3.594 +1999,LCA,2.13 +1999,SPM,8.698 +1999,VCT,1.446 +1999,WSM,0.744 +1999,SMR,0 +1999,STP,0.336 +1999,SAU,11.018 +1999,SEN,0.38 +1999,SRB,4.496 +1999,SYC,3.857 +1999,SLE,0.039 +1999,SGP,12.404 +1999,SXM,6.774 +1999,SVK,8.008 +1999,SVN,7.76 +1999,SLB,0.516 +1999,SOME,0.058 +1999,ZAF,8.086 +1999,KOR,8.824 +1999,SSD,0.072 +1999,ESP,7.352 +1999,LKA,0.456 +1999,SDN,0.185 +1999,SURE,4.512 +1999,SWE,6.326 +1999,CHE,6.222 +1999,SYR,3.468 +1999,TWN,9.421 +1999,TJK,0.407 +1999,TZA,0.073 +1999,THA,2.678 +1999,TGO,0.38 +1999,TON,1.078 +1999,TO,17.026 +1999,TUN,1.904 +1999,TUR,3.291 +1999,TKM,8.842 +1999,TCA,5.494 +1999,TUV,1.138 +1999,UGA,0.054 +1999,UKR,6.054 +1999,ARE,24.96 +1999,GBR,9.579 +1999,USA,20.789 +1999,URY,2.038 +1999,UZB,5.023 +1999,VUT,0.469 +1999,VAT,0 +1999,VEN,5.969 +1999,VNM,0.621 +1999,WLF,1.755 +1999,YEM,0.811 +1999,ZMB,0.185 +1999,ZWE,1.342 +2000,AFG,0.054 +2000,,4.147 +2000,ALB,0.951 +2000,DZA,2.775 +2000,AND,7.925 +2000,AGO,0.976 +2000,AIA,6.95 +2000,ATA,0 +2000,ATG,4.734 +2000,ARG,3.851 +2000,ARM,1.102 +2000,ABW,26.683 +2000,AUS,18.404 +2000,AUT,8.261 +2000,AZE,3.634 +2000,BHS,6.234 +2000,BHR,27.035 +2000,BGD,0.205 +2000,BRB,6.608 +2000,BLR,5.353 +2000,BEL,12.346 +2000,BLZ,1.646 +2000,BEN,0.21 +2000,BMU,8.415 +2000,BTN,0.676 +2000,BOL,0.982 +2000,BES,4.783 +2000,BIH,3.279 +2000,BWA,2.187 +2000,BRA,1.934 +2000,VGB,5.826 +2000,BRN,15.957 +2000,BGR,5.608 +2000,BFA,0.087 +2000,BDI,0.043 +2000,KHM,0.163 +2000,CMR,0.37 +2000,CAN,18.482 +2000,CPV,0.648 +2000,CALF,0.062 +2000,TCD,0.059 +2000,CHL,3.811 +2000,CHN,2.887 +2000,CXR,0 +2000,COL,1.443 +2000,COM,0.191 +2000,COG,1.367 +2000,COK,3.222 +2000,CRI,1.356 +2000,CIV,0.395 +2000,HRV,4.322 +2000,CUB,2.321 +2000,CUW,35.283 +2000,CYP,7.492 +2000,CZE,12.432 +2000,COD,0.035 +2000,DNK,10.169 +2000,DJI,0.494 +2000,DMA,1.501 +2000,DOM,2.224 +2000,TLS,0.25 +2000,ECU,1.657 +2000,EGY,2.015 +2000,SLV,0.952 +2000,GNQ,3.941 +2000,ERI,0.253 +2000,EST,11.083 +2000,SWZ,1.173 +2000,ETH,0.052 +2000,FRO,15.078 +2000,FJI,0.979 +2000,FIN,11.014 +2000,FRA,6.929 +2000,PYF,2.438 +2000,GAB,4.814 +2000,GMB,0.191 +2000,GEO,1.055 +2000,DEU,11.023 +2000,GHA,0.27 +2000,GRC,9.329 +2000,GRL,11.881 +2000,GRD,1.773 +2000,GTM,0.832 +2000,GIN,0.179 +2000,GNB,0.119 +2000,GUY,2.302 +2000,HTI,0.195 +2000,HND,0.756 +2000,HKG,5.984 +2000,HUN,5.735 +2000,ISL,10.421 +2000,IND,0.923 +2000,IDN,1.314 +2000,IRN,5.558 +2000,IRQ,3.381 +2000,IRL,12.006 +2000,ISR,9.73 +2000,ITA,8.26 +2000,JAM,3.948 +2000,JPN,9.966 +2000,JOR,3.006 +2000,KAZ,9.41 +2000,KEN,0.337 +2000,KIR,0.412 +2000,KWT,28.368 +2000,KGZ,0.927 +2000,LAO,0.177 +2000,LVA,2.96 +2000,LBN,3.58 +2000,ALSO,0.926 +2000,LBR,0.138 +2000,LBY,10.328 +2000,LIE,6.561 +2000,LTU,3.29 +2000,LUX,19.979 +2000,MAC,3.775 +2000,MDG,0.12 +2000,MWI,0.076 +2000,MYS,5.355 +2000,MDV,1.595 +2000,MLI,0.095 +2000,MLT,6.183 +2000,MHL,1.824 +2000,MRT,0.413 +2000,MUS,2.212 +2000,MEX,4.002 +2000,FSM,1.607 +2000,MDA,0.84 +2000,MCO,0 +2000,MNG,3.032 +2000,MNE,2.401 +2000,MSR,4.965 +2000,MAR,1.163 +2000,MOZ,0.074 +2000,MMR,0.224 +2000,NAME,0.882 +2000,NRU,8.103 +2000,NPL,0.124 +2000,NLD,10.819 +2000,NCL,10.022 +2000,NZL,8.364 +2000,NIC,0.726 +2000,NER,0.059 +2000,NGA,0.788 +2000,NIU,3.496 +2000,PRK,2.96 +2000,MKD,4.155 +2000,NOR,9.376 +2000,OMN,10.191 +2000,PAK,0.673 +2000,PLW,10.577 +2000,PSE,0.529 +2000,PAN,1.908 +2000,PNG,0.533 +2000,PRY,0.704 +2000,PER,1.076 +2000,PHL,0.928 +2000,POL,8.245 +2000,PRT,6.37 +2000,QAT,62.411 +2000,ROU,4.258 +2000,RUS,10.073 +2000,RWA,0.064 +2000,SHN,1.817 +2000,KNA,3.785 +2000,LCA,2.182 +2000,SPM,8.724 +2000,VCT,1.288 +2000,WSM,0.777 +2000,SMR,0 +2000,STP,0.331 +2000,SAU,14.031 +2000,SEN,0.402 +2000,SRB,5.665 +2000,SYC,3.935 +2000,SLE,0.059 +2000,SGP,11.939 +2000,SXM,18.108 +2000,SVK,7.651 +2000,SVN,7.586 +2000,SLB,0.52 +2000,SOME,0.055 +2000,ZAF,8.081 +2000,KOR,9.404 +2000,SSD,0.075 +2000,ESP,7.611 +2000,LKA,0.54 +2000,SDN,0.201 +2000,SURE,4.577 +2000,SWE,6.192 +2000,CHE,6.073 +2000,SYR,3.322 +2000,TWN,10.223 +2000,TJK,0.356 +2000,TZA,0.075 +2000,THA,2.654 +2000,TGO,0.266 +2000,TON,0.928 +2000,TO,18.29 +2000,TUN,1.977 +2000,TUR,3.586 +2000,TKM,8.615 +2000,TCA,5.856 +2000,TUV,0.758 +2000,UGA,0.057 +2000,UKR,5.844 +2000,ARE,34.138 +2000,GBR,9.669 +2000,USA,21.282 +2000,URY,1.6 +2000,UZB,4.954 +2000,VUT,0.458 +2000,VAT,0 +2000,VEN,5.847 +2000,VNM,0.683 +2000,WLF,1.739 +2000,YEM,0.844 +2000,ZMB,0.18 +2000,ZWE,1.168 +2001,AFG,0.054 +2001,,4.121 +2001,ALB,1.021 +2001,DZA,2.783 +2001,AND,7.723 +2001,AGO,0.939 +2001,AIA,7.414 +2001,ATA,0 +2001,ATG,4.855 +2001,ARG,3.586 +2001,ARM,1.128 +2001,ABW,26.54 +2001,AUS,18.588 +2001,AUT,8.728 +2001,AZE,3.431 +2001,BHS,5.902 +2001,BHR,21.054 +2001,BGD,0.236 +2001,BRB,6.225 +2001,BLR,5.294 +2001,BEL,12.228 +2001,BLZ,1.802 +2001,BEN,0.234 +2001,BMU,8.54 +2001,BTN,0.637 +2001,BOL,1.0 +2001,BES,4.775 +2001,BIH,3.162 +2001,BWA,2.184 +2001,BRA,1.942 +2001,VGB,6.023 +2001,BRN,15.23 +2001,BGR,6.089 +2001,BFA,0.081 +2001,BDI,0.032 +2001,KHM,0.182 +2001,CMR,0.359 +2001,CAN,18.035 +2001,CPV,0.747 +2001,CALF,0.064 +2001,TCD,0.059 +2001,CHL,3.409 +2001,CHN,2.93 +2001,CXR,0 +2001,COL,1.427 +2001,COM,0.194 +2001,COG,1.284 +2001,COK,3.109 +2001,CRI,1.398 +2001,CIV,0.444 +2001,HRV,4.611 +2001,CUB,2.264 +2001,CUW,36.13 +2001,CYP,7.233 +2001,CZE,12.428 +2001,COD,0.033 +2001,DNK,10.427 +2001,DJI,0.479 +2001,DMA,1.612 +2001,DOM,2.208 +2001,TLS,0.133 +2001,ECU,1.822 +2001,EGY,1.752 +2001,SLV,0.978 +2001,GNQ,4.302 +2001,ERI,0.254 +2001,EST,11.442 +2001,SWZ,1.052 +2001,ETH,0.062 +2001,FRO,16.471 +2001,FJI,1.239 +2001,FIN,12.05 +2001,FRA,6.965 +2001,PYF,2.844 +2001,GAB,4.959 +2001,GMB,0.203 +2001,GEO,0.899 +2001,DEU,11.228 +2001,GHA,0.296 +2001,GRC,9.516 +2001,GRL,10.964 +2001,GRD,1.799 +2001,GTM,0.852 +2001,GIN,0.185 +2001,GNB,0.119 +2001,GUY,2.295 +2001,HTI,0.173 +2001,HND,0.828 +2001,HKG,5.558 +2001,HUN,5.906 +2001,ISL,10.045 +2001,IND,0.918 +2001,IDN,1.46 +2001,IRN,5.792 +2001,IRQ,3.789 +2001,IRL,12.433 +2001,ISR,10.103 +2001,ITA,8.256 +2001,JAM,4.028 +2001,JPN,9.831 +2001,JOR,3.023 +2001,KAZ,9.081 +2001,KEN,0.292 +2001,KIR,0.405 +2001,KWT,29.649 +2001,KGZ,0.774 +2001,LAO,0.193 +2001,LVA,3.178 +2001,LBN,3.738 +2001,ALSO,0.938 +2001,LBR,0.14 +2001,LBY,10.067 +2001,LIE,6.427 +2001,LTU,3.537 +2001,LUX,20.862 +2001,MAC,3.838 +2001,MDG,0.104 +2001,MWI,0.067 +2001,MYS,5.56 +2001,MDV,1.607 +2001,MLI,0.1 +2001,MLT,6.805 +2001,MHL,1.885 +2001,MRT,0.425 +2001,MUS,2.335 +2001,MEX,4.102 +2001,FSM,1.473 +2001,MDA,0.901 +2001,MCO,0 +2001,MNG,3.156 +2001,MNE,2.634 +2001,MSR,5.426 +2001,MAR,1.272 +2001,MOZ,0.085 +2001,MMR,0.192 +2001,NAME,1.084 +2001,NRU,7.762 +2001,NPL,0.13 +2001,NLD,11.084 +2001,NCL,8.304 +2001,NZL,8.839 +2001,NIC,0.755 +2001,NER,0.054 +2001,NGA,0.794 +2001,NIU,3.596 +2001,PRK,3.048 +2001,MKD,4.036 +2001,NOR,9.636 +2001,OMN,9.435 +2001,PAK,0.662 +2001,PLW,10.889 +2001,PSE,0.417 +2001,PAN,2.271 +2001,PNG,0.585 +2001,PRY,0.709 +2001,PER,0.941 +2001,PHL,0.883 +2001,POL,8.109 +2001,PRT,6.282 +2001,QAT,67.494 +2001,ROU,4.541 +2001,RUS,10.364 +2001,RWA,0.064 +2001,SHN,1.841 +2001,KNA,3.822 +2001,LCA,2.236 +2001,SPM,8.747 +2001,VCT,1.58 +2001,WSM,0.829 +2001,SMR,0 +2001,STP,0.351 +2001,SAU,13.706 +2001,SEN,0.428 +2001,SRB,6.227 +2001,SYC,4.238 +2001,SLE,0.076 +2001,SGP,11.938 +2001,SXM,18.493 +2001,SVK,8.04 +2001,SVN,8.223 +2001,SLB,0.532 +2001,SOME,0.055 +2001,ZAF,7.868 +2001,KOR,9.681 +2001,SSD,0.083 +2001,ESP,7.611 +2001,LKA,0.546 +2001,SDN,0.223 +2001,SURE,4.848 +2001,SWE,6.276 +2001,CHE,6.24 +2001,SYR,3.046 +2001,TWN,10.289 +2001,TJK,0.357 +2001,TZA,0.086 +2001,THA,2.706 +2001,TGO,0.225 +2001,TON,0.852 +2001,TO,19.989 +2001,TUN,2.044 +2001,TUR,3.282 +2001,TKM,7.343 +2001,TCA,5.795 +2001,TUV,1.14 +2001,UGA,0.057 +2001,UKR,6.277 +2001,ARE,29.361 +2001,GBR,9.781 +2001,USA,20.695 +2001,URY,1.524 +2001,UZB,4.999 +2001,VUT,0.465 +2001,VAT,0 +2001,VEN,5.246 +2001,VNM,0.764 +2001,WLF,1.725 +2001,YEM,0.892 +2001,ZMB,0.185 +2001,ZWE,1.05 +2002,AFG,0.064 +2002,,4.158 +2002,ALB,1.2 +2002,DZA,2.868 +2002,AND,7.497 +2002,AGO,0.918 +2002,AIA,7.275 +2002,ATA,0 +2002,ATG,5.267 +2002,ARG,3.285 +2002,ARM,0.991 +2002,ABW,26.543 +2002,AUS,18.615 +2002,AUT,8.909 +2002,AZE,3.413 +2002,BHS,6.099 +2002,BHR,21.205 +2002,BGD,0.238 +2002,BRB,6.221 +2002,BLR,5.312 +2002,BEL,12.251 +2002,BLZ,1.689 +2002,BEN,0.284 +2002,BMU,8.96 +2002,BTN,0.673 +2002,BOL,1.169 +2002,BES,4.442 +2002,BIH,3.376 +2002,BWA,2.215 +2002,BRA,1.927 +2002,VGB,6.706 +2002,BRN,13.44 +2002,BGR,5.781 +2002,BFA,0.079 +2002,BDI,0.032 +2002,KHM,0.176 +2002,CMR,0.336 +2002,CAN,18.018 +2002,CPV,0.805 +2002,CALF,0.062 +2002,TCD,0.06 +2002,CHL,3.494 +2002,CHN,3.203 +2002,CXR,0 +2002,COL,1.382 +2002,COM,0.19 +2002,COG,0.817 +2002,COK,2.678 +2002,CRI,1.515 +2002,CIV,0.421 +2002,HRV,4.882 +2002,CUB,2.285 +2002,CUW,34.647 +2002,CYP,7.299 +2002,CZE,12.109 +2002,COD,0.034 +2002,DNK,10.329 +2002,DJI,0.506 +2002,DMA,1.502 +2002,DOM,2.382 +2002,TLS,0.288 +2002,ECU,1.899 +2002,EGY,1.736 +2002,SLV,1.01 +2002,GNQ,3.662 +2002,ERI,0.236 +2002,EST,11.144 +2002,SWZ,1.029 +2002,ETH,0.062 +2002,FRO,15.489 +2002,FJI,1.035 +2002,FIN,12.506 +2002,FRA,6.845 +2002,PYF,2.8 +2002,GAB,4.659 +2002,GMB,0.195 +2002,GEO,0.824 +2002,DEU,11.036 +2002,GHA,0.312 +2002,GRC,9.462 +2002,GRL,10.251 +2002,GRD,1.896 +2002,GTM,0.872 +2002,GIN,0.189 +2002,GNB,0.12 +2002,GUY,2.255 +2002,HTI,0.206 +2002,HND,0.847 +2002,HKG,5.765 +2002,HUN,5.822 +2002,ISL,10.398 +2002,IND,0.93 +2002,IDN,1.401 +2002,IRN,5.843 +2002,IRQ,3.677 +2002,IRL,11.833 +2002,ISR,9.329 +2002,ITA,8.37 +2002,JAM,3.867 +2002,JPN,10.045 +2002,JOR,3.113 +2002,KAZ,10.27 +2002,KEN,0.241 +2002,KIR,0.397 +2002,KWT,29.299 +2002,KGZ,0.978 +2002,LAO,0.208 +2002,LVA,3.233 +2002,LBN,3.653 +2002,ALSO,0.954 +2002,LBR,0.141 +2002,LBY,9.717 +2002,LIE,6.525 +2002,LTU,3.603 +2002,LUX,22.382 +2002,MAC,3.373 +2002,MDG,0.072 +2002,MWI,0.073 +2002,MYS,5.469 +2002,MDV,2.031 +2002,MLI,0.101 +2002,MLT,6.788 +2002,MHL,2.016 +2002,MRT,0.443 +2002,MUS,2.337 +2002,MEX,4.068 +2002,FSM,1.341 +2002,MDA,0.977 +2002,MCO,0 +2002,MNG,3.286 +2002,MNE,2.791 +2002,MSR,10.294 +2002,MAR,1.273 +2002,MOZ,0.082 +2002,MMR,0.201 +2002,NAME,0.947 +2002,NRU,7.416 +2002,NPL,0.102 +2002,NLD,10.99 +2002,NCL,10.383 +2002,NZL,8.748 +2002,NIC,0.759 +2002,NER,0.055 +2002,NGA,0.694 +2002,NIU,3.682 +2002,PRK,2.904 +2002,MKD,3.794 +2002,NOR,9.376 +2002,OMN,11.167 +2002,PAK,0.692 +2002,PLW,10.692 +2002,PSE,0.349 +2002,PAN,1.865 +2002,PNG,0.622 +2002,PRY,0.73 +2002,PER,0.931 +2002,PHL,0.864 +2002,POL,7.921 +2002,PRT,6.669 +2002,QAT,63.19 +2002,ROU,4.586 +2002,RUS,10.35 +2002,RWA,0.062 +2002,SHN,1.871 +2002,KNA,4.274 +2002,LCA,2.219 +2002,SPM,9.359 +2002,VCT,1.647 +2002,WSM,0.864 +2002,SMR,0 +2002,STP,0.391 +2002,SAU,14.674 +2002,SEN,0.436 +2002,SRB,6.608 +2002,SYC,4.222 +2002,SLE,0.098 +2002,SGP,11.275 +2002,SXM,17.727 +2002,SVK,7.81 +2002,SVN,8.35 +2002,SLB,0.545 +2002,SOME,0.059 +2002,ZAF,7.48 +2002,KOR,10.06 +2002,SSD,0.101 +2002,ESP,8.003 +2002,LKA,0.573 +2002,SDN,0.276 +2002,SURE,3.147 +2002,SWE,6.351 +2002,CHE,5.973 +2002,SYR,2.351 +2002,TWN,10.562 +2002,TJK,0.287 +2002,TZA,0.096 +2002,THA,2.875 +2002,TGO,0.25 +2002,TON,0.988 +2002,TO,21.324 +2002,TUN,2.049 +2002,TUR,3.352 +2002,TKM,6.412 +2002,TCA,7.285 +2002,TUV,1.141 +2002,UGA,0.057 +2002,UKR,6.168 +2002,ARE,23.296 +2002,GBR,9.439 +2002,USA,20.622 +2002,URY,1.378 +2002,UZB,5.183 +2002,VUT,0.417 +2002,VAT,0 +2002,VEN,6.48 +2002,VNM,0.862 +2002,WLF,1.708 +2002,YEM,0.843 +2002,ZMB,0.187 +2002,ZWE,0.993 +2003,AFG,0.069 +2003,,4.324 +2003,ALB,1.391 +2003,DZA,2.95 +2003,AND,7.236 +2003,AGO,0.965 +2003,AIA,7.477 +2003,ATA,0 +2003,ATG,5.489 +2003,ARG,3.501 +2003,ARM,1.12 +2003,ABW,27.624 +2003,AUS,18.754 +2003,AUT,9.532 +2003,AZE,3.603 +2003,BHS,6.116 +2003,BHR,21.547 +2003,BGD,0.245 +2003,BRB,6.353 +2003,BLR,5.473 +2003,BEL,12.329 +2003,BLZ,1.638 +2003,BEN,0.313 +2003,BMU,8.971 +2003,BTN,0.593 +2003,BOL,1.211 +2003,BES,4.263 +2003,BIH,3.432 +2003,BWA,2.094 +2003,BRA,1.887 +2003,VGB,6.661 +2003,BRN,15.811 +2003,BGR,6.375 +2003,BFA,0.082 +2003,BDI,0.023 +2003,KHM,0.186 +2003,CMR,0.349 +2003,CAN,18.388 +2003,CPV,0.862 +2003,CALF,0.056 +2003,TCD,0.096 +2003,CHL,3.474 +2003,CHN,3.756 +2003,CXR,0 +2003,COL,1.397 +2003,COM,0.238 +2003,COG,0.951 +2003,COK,3.154 +2003,CRI,1.572 +2003,CIV,0.293 +2003,HRV,5.203 +2003,CUB,2.316 +2003,CUW,34.252 +2003,CYP,7.557 +2003,CZE,12.448 +2003,COD,0.039 +2003,DNK,11.238 +2003,DJI,0.523 +2003,DMA,1.713 +2003,DOM,2.393 +2003,TLS,0.268 +2003,ECU,2.035 +2003,EGY,1.974 +2003,SLV,1.068 +2003,GNQ,3.968 +2003,ERI,0.268 +2003,EST,12.595 +2003,SWZ,0.948 +2003,ETH,0.067 +2003,FRO,15.455 +2003,FJI,1.208 +2003,FIN,13.937 +2003,FRA,6.906 +2003,PYF,2.965 +2003,GAB,4.894 +2003,GMB,0.189 +2003,GEO,0.929 +2003,DEU,11.062 +2003,GHA,0.313 +2003,GRC,9.817 +2003,GRL,11.442 +2003,GRD,1.988 +2003,GTM,0.831 +2003,GIN,0.194 +2003,GNB,0.148 +2003,GUY,2.442 +2003,HTI,0.193 +2003,HND,0.928 +2003,HKG,6.274 +2003,HUN,6.114 +2003,ISL,10.303 +2003,IND,0.948 +2003,IDN,1.521 +2003,IRN,5.99 +2003,IRQ,3.741 +2003,IRL,11.54 +2003,ISR,9.638 +2003,ITA,8.637 +2003,JAM,4.024 +2003,JPN,10.096 +2003,JOR,3.147 +2003,KAZ,11.407 +2003,KEN,0.198 +2003,KIR,0.427 +2003,KWT,29.663 +2003,KGZ,1.059 +2003,LAO,0.215 +2003,LVA,3.368 +2003,LBN,4.113 +2003,ALSO,0.969 +2003,LBR,0.151 +2003,LBY,10.009 +2003,LIE,6.741 +2003,LTU,3.649 +2003,LUX,23.158 +2003,MAC,3.311 +2003,MDG,0.095 +2003,MWI,0.076 +2003,MYS,6.2 +2003,MDV,1.701 +2003,MLI,0.101 +2003,MLT,7.276 +2003,MHL,1.949 +2003,MRT,0.447 +2003,MUS,2.463 +2003,MEX,4.258 +2003,FSM,1.442 +2003,MDA,1.076 +2003,MCO,0 +2003,MNG,3.152 +2003,MNE,2.988 +2003,MSR,7.876 +2003,MAR,1.233 +2003,MOZ,0.097 +2003,MMR,0.213 +2003,NAME,0.983 +2003,NRU,6.363 +2003,NPL,0.109 +2003,NLD,11.155 +2003,NCL,11.613 +2003,NZL,9.015 +2003,NIC,0.814 +2003,NER,0.058 +2003,NGA,0.752 +2003,NIU,1.877 +2003,PRK,2.949 +2003,MKD,4.118 +2003,NOR,9.616 +2003,OMN,14.129 +2003,PAK,0.704 +2003,PLW,10.677 +2003,PSE,0.378 +2003,PAN,1.914 +2003,PNG,0.666 +2003,PRY,0.753 +2003,PER,0.893 +2003,PHL,0.847 +2003,POL,8.258 +2003,PRT,6.154 +2003,QAT,62.141 +2003,ROU,4.833 +2003,RUS,10.604 +2003,RWA,0.059 +2003,SHN,1.905 +2003,KNA,4.259 +2003,LCA,2.314 +2003,SPM,10.001 +2003,VCT,1.749 +2003,WSM,0.84 +2003,SMR,0 +2003,STP,0.429 +2003,SAU,14.427 +2003,SEN,0.472 +2003,SRB,7.077 +2003,SYC,4.075 +2003,SLE,0.1 +2003,SGP,11.697 +2003,SXM,17.567 +2003,SVK,7.871 +2003,SVN,8.179 +2003,SLB,0.556 +2003,SOME,0.057 +2003,ZAF,8.407 +2003,KOR,10.206 +2003,SSD,0.108 +2003,ESP,7.964 +2003,LKA,0.567 +2003,SDN,0.301 +2003,SURE,3.052 +2003,SWE,6.393 +2003,CHE,6.09 +2003,SYR,3.122 +2003,TWN,10.987 +2003,TJK,0.31 +2003,TZA,0.099 +2003,THA,2.95 +2003,TGO,0.333 +2003,TON,1.123 +2003,TO,23.931 +2003,TUN,2.074 +2003,TUR,3.541 +2003,TKM,8.524 +2003,TCA,7.239 +2003,TUV,1.134 +2003,UGA,0.057 +2003,UKR,6.454 +2003,ARE,27.913 +2003,GBR,9.583 +2003,USA,20.646 +2003,URY,1.368 +2003,UZB,5.03 +2003,VUT,0.407 +2003,VAT,0 +2003,VEN,5.983 +2003,VNM,0.948 +2003,WLF,1.703 +2003,YEM,0.915 +2003,ZMB,0.191 +2003,ZWE,0.879 +2004,AFG,0.053 +2004,,4.42 +2004,ALB,1.364 +2004,DZA,2.821 +2004,AND,7.285 +2004,AGO,0.906 +2004,AIA,8.58 +2004,ATA,0 +2004,ATG,5.708 +2004,ARG,4.053 +2004,ARM,1.204 +2004,ABW,27.963 +2004,AUS,19.216 +2004,AUT,9.509 +2004,AZE,3.77 +2004,BHS,5.97 +2004,BHR,21.457 +2004,BGD,0.259 +2004,BRB,6.406 +2004,BLR,5.826 +2004,BEL,12.315 +2004,BLZ,1.441 +2004,BEN,0.329 +2004,BMU,9.283 +2004,BTN,0.474 +2004,BOL,1.197 +2004,BES,4.288 +2004,BIH,3.732 +2004,BWA,2.095 +2004,BRA,1.957 +2004,VGB,6.767 +2004,BRN,15.648 +2004,BGR,6.297 +2004,BFA,0.082 +2004,BDI,0.028 +2004,KHM,0.188 +2004,CMR,0.339 +2004,CAN,18.165 +2004,CPV,0.873 +2004,CALF,0.053 +2004,TCD,0.094 +2004,CHL,3.698 +2004,CHN,4.023 +2004,CXR,0 +2004,COL,1.312 +2004,COM,0.252 +2004,COG,1.002 +2004,COK,3.631 +2004,CRI,1.609 +2004,CIV,0.398 +2004,HRV,5.15 +2004,CUB,2.247 +2004,CUW,35.449 +2004,CYP,7.646 +2004,CZE,12.503 +2004,COD,0.037 +2004,DNK,10.174 +2004,DJI,0.497 +2004,DMA,2.083 +2004,DOM,1.917 +2004,TLS,0.525 +2004,ECU,2.162 +2004,EGY,1.968 +2004,SLV,1.036 +2004,GNQ,7.427 +2004,ERI,0.278 +2004,EST,12.718 +2004,SWZ,0.939 +2004,ETH,0.069 +2004,FRO,15.569 +2004,FJI,1.547 +2004,FIN,13.186 +2004,FRA,6.882 +2004,PYF,2.88 +2004,GAB,4.507 +2004,GMB,0.198 +2004,GEO,1.071 +2004,DEU,10.898 +2004,GHA,0.294 +2004,GRC,9.85 +2004,GRL,11.241 +2004,GRD,1.873 +2004,GTM,0.87 +2004,GIN,0.197 +2004,GNB,0.15 +2004,GUY,2.534 +2004,HTI,0.184 +2004,HND,0.974 +2004,HKG,6.011 +2004,HUN,5.969 +2004,ISL,10.637 +2004,IND,0.99 +2004,IDN,1.518 +2004,IRN,6.338 +2004,IRQ,4.049 +2004,IRL,11.45 +2004,ISR,8.896 +2004,ITA,8.67 +2004,JAM,3.969 +2004,JPN,10.047 +2004,JOR,3.375 +2004,KAZ,12.006 +2004,KEN,0.218 +2004,KIR,0.419 +2004,KWT,30.476 +2004,KGZ,1.131 +2004,LAO,0.222 +2004,LVA,3.416 +2004,LBN,3.762 +2004,ALSO,0.998 +2004,LBR,0.175 +2004,LBY,9.996 +2004,LIE,6.683 +2004,LTU,3.873 +2004,LUX,25.823 +2004,MAC,3.606 +2004,MDG,0.099 +2004,MWI,0.073 +2004,MYS,6.698 +2004,MDV,2.207 +2004,MLI,0.11 +2004,MLT,6.969 +2004,MHL,2.153 +2004,MRT,0.47 +2004,MUS,2.47 +2004,MEX,4.221 +2004,FSM,1.282 +2004,MDA,1.14 +2004,MCO,0 +2004,MNG,3.35 +2004,MNE,3.227 +2004,MSR,10.173 +2004,MAR,1.406 +2004,MOZ,0.095 +2004,MMR,0.265 +2004,NAME,1.016 +2004,NRU,6.368 +2004,NPL,0.099 +2004,NLD,11.224 +2004,NCL,10.538 +2004,NZL,8.78 +2004,NIC,0.813 +2004,NER,0.059 +2004,NGA,0.693 +2004,NIU,1.914 +2004,PRK,2.995 +2004,MKD,3.963 +2004,NOR,9.633 +2004,OMN,11.756 +2004,PAK,0.76 +2004,PLW,10.848 +2004,PSE,0.634 +2004,PAN,1.761 +2004,PNG,0.746 +2004,PRY,0.75 +2004,PER,1.016 +2004,PHL,0.861 +2004,POL,8.389 +2004,PRT,6.409 +2004,QAT,60.827 +2004,ROU,4.851 +2004,RUS,10.696 +2004,RWA,0.059 +2004,SHN,1.941 +2004,KNA,4.56 +2004,LCA,2.454 +2004,SPM,9.477 +2004,VCT,1.952 +2004,WSM,0.877 +2004,SMR,0 +2004,STP,0.465 +2004,SAU,16.948 +2004,SEN,0.49 +2004,SRB,7.651 +2004,SYC,4.367 +2004,SLE,0.094 +2004,SGP,10.973 +2004,SXM,18.248 +2004,SVK,7.961 +2004,SVN,8.366 +2004,SLB,0.582 +2004,SOME,0.055 +2004,ZAF,9.253 +2004,KOR,10.296 +2004,SSD,0.13 +2004,ESP,8.217 +2004,LKA,0.623 +2004,SDN,0.376 +2004,SURE,3.047 +2004,SWE,6.277 +2004,CHE,6.128 +2004,SYR,2.836 +2004,TWN,11.359 +2004,TJK,0.376 +2004,TZA,0.11 +2004,THA,3.175 +2004,TGO,0.313 +2004,TON,1.046 +2004,TO,24.032 +2004,TUN,2.147 +2004,TUR,3.611 +2004,TKM,10.24 +2004,TCA,7.041 +2004,TUV,1.12 +2004,UGA,0.059 +2004,UKR,6.572 +2004,ARE,27.972 +2004,GBR,9.558 +2004,USA,20.795 +2004,URY,1.679 +2004,UZB,4.921 +2004,VUT,0.276 +2004,VAT,0 +2004,VEN,5.444 +2004,VNM,1.081 +2004,WLF,1.724 +2004,YEM,0.964 +2004,ZMB,0.188 +2004,ZWE,0.775 +2005,AFG,0.077 +2005,,4.512 +2005,ALB,1.405 +2005,DZA,3.368 +2005,AND,7.205 +2005,AGO,0.791 +2005,AIA,9.048 +2005,ATA,0 +2005,ATG,6.009 +2005,ARG,4.126 +2005,ARM,1.436 +2005,ABW,28.771 +2005,AUS,19.146 +2005,AUT,9.614 +2005,AZE,3.95 +2005,BHS,5.478 +2005,BHR,21.957 +2005,BGD,0.267 +2005,BRB,6.54 +2005,BLR,5.97 +2005,BEL,11.945 +2005,BLZ,1.503 +2005,BEN,0.306 +2005,BMU,9.25 +2005,BTN,0.597 +2005,BOL,1.313 +2005,BES,4.08 +2005,BIH,3.919 +2005,BWA,2.162 +2005,BRA,1.951 +2005,VGB,7.01 +2005,BRN,14.803 +2005,BGR,6.474 +2005,BFA,0.081 +2005,BDI,0.021 +2005,KHM,0.209 +2005,CMR,0.314 +2005,CAN,17.841 +2005,CPV,0.907 +2005,CALF,0.051 +2005,TCD,0.093 +2005,CHL,3.779 +2005,CHN,4.508 +2005,CXR,0 +2005,COL,1.425 +2005,COM,0.241 +2005,COG,1.185 +2005,COK,4.107 +2005,CRI,1.558 +2005,CIV,0.399 +2005,HRV,5.269 +2005,CUB,2.331 +2005,CUW,34.614 +2005,CYP,7.673 +2005,CZE,12.227 +2005,COD,0.04 +2005,DNK,9.48 +2005,DJI,0.498 +2005,DMA,2.187 +2005,DOM,1.958 +2005,TLS,0.331 +2005,ECU,2.221 +2005,EGY,2.127 +2005,SLV,1.043 +2005,GNQ,7.179 +2005,ERI,0.272 +2005,EST,12.621 +2005,SWZ,0.947 +2005,ETH,0.064 +2005,FRO,14.94 +2005,FJI,1.237 +2005,FIN,10.874 +2005,FRA,6.877 +2005,PYF,3.055 +2005,GAB,4.267 +2005,GMB,0.194 +2005,GEO,1.266 +2005,DEU,10.657 +2005,GHA,0.272 +2005,GRC,10.248 +2005,GRL,11.309 +2005,GRD,1.96 +2005,GTM,0.922 +2005,GIN,0.2 +2005,GNB,0.154 +2005,GUY,2.132 +2005,HTI,0.189 +2005,HND,0.904 +2005,HKG,6.304 +2005,HUN,5.996 +2005,ISL,10.027 +2005,IND,1.027 +2005,IDN,1.519 +2005,IRN,6.583 +2005,IRQ,3.973 +2005,IRL,11.685 +2005,ISR,8.419 +2005,ITA,8.631 +2005,JAM,3.891 +2005,JPN,10.095 +2005,JOR,3.599 +2005,KAZ,12.777 +2005,KEN,0.239 +2005,KIR,0.485 +2005,KWT,33.294 +2005,KGZ,1.063 +2005,LAO,0.228 +2005,LVA,3.498 +2005,LBN,3.586 +2005,ALSO,1.017 +2005,LBR,0.199 +2005,LBY,10.392 +2005,LIE,6.613 +2005,LTU,4.109 +2005,LUX,25.985 +2005,MAC,3.742 +2005,MDG,0.093 +2005,MWI,0.067 +2005,MYS,6.556 +2005,MDV,1.957 +2005,MLI,0.11 +2005,MLT,6.476 +2005,MHL,2.09 +2005,MRT,0.477 +2005,MUS,2.618 +2005,MEX,4.397 +2005,FSM,1.057 +2005,MDA,1.234 +2005,MCO,0 +2005,MNG,3.327 +2005,MNE,2.766 +2005,MSR,8.544 +2005,MAR,1.468 +2005,MOZ,0.088 +2005,MMR,0.242 +2005,NAME,1.178 +2005,NRU,6.026 +2005,NPL,0.114 +2005,NLD,10.937 +2005,NCL,11.603 +2005,NZL,9.055 +2005,NIC,0.783 +2005,NER,0.05 +2005,NGA,0.722 +2005,NIU,1.948 +2005,PRK,3.112 +2005,MKD,4.135 +2005,NOR,9.357 +2005,OMN,12.562 +2005,PAK,0.772 +2005,PLW,11.073 +2005,PSE,0.774 +2005,PAN,2.109 +2005,PNG,0.766 +2005,PRY,0.69 +2005,PER,1.077 +2005,PHL,0.85 +2005,POL,8.367 +2005,PRT,6.617 +2005,QAT,56.027 +2005,ROU,4.828 +2005,RUS,10.866 +2005,RWA,0.057 +2005,SHN,1.978 +2005,KNA,4.232 +2005,LCA,2.348 +2005,SPM,10.153 +2005,VCT,1.962 +2005,WSM,0.893 +2005,SMR,0 +2005,STP,0.476 +2005,SAU,16.512 +2005,SEN,0.505 +2005,SRB,6.594 +2005,SYC,4.436 +2005,SLE,0.075 +2005,SGP,9.572 +2005,SXM,17.908 +2005,SVK,7.961 +2005,SVN,8.446 +2005,SLB,0.585 +2005,SOME,0.054 +2005,ZAF,8.491 +2005,KOR,10.413 +2005,SSD,0.119 +2005,ESP,8.432 +2005,LKA,0.607 +2005,SDN,0.356 +2005,SURE,3.077 +2005,SWE,5.952 +2005,CHE,6.163 +2005,SYR,2.731 +2005,TWN,11.689 +2005,TJK,0.352 +2005,TZA,0.136 +2005,THA,3.256 +2005,TGO,0.301 +2005,TON,1.075 +2005,TO,27.922 +2005,TUN,2.171 +2005,TUR,3.855 +2005,TKM,9.81 +2005,TCA,7.932 +2005,TUV,1.107 +2005,UGA,0.072 +2005,UKR,6.683 +2005,ARE,26.723 +2005,GBR,9.445 +2005,USA,20.658 +2005,URY,1.726 +2005,UZB,4.576 +2005,VUT,0.269 +2005,VAT,0 +2005,VEN,5.561 +2005,VNM,1.153 +2005,WLF,2.011 +2005,YEM,1.016 +2005,ZMB,0.194 +2005,ZWE,0.875 +2006,AFG,0.085 +2006,,4.608 +2006,ALB,1.302 +2006,DZA,3.167 +2006,AND,6.804 +2006,AGO,0.85 +2006,AIA,9.793 +2006,ATA,0 +2006,ATG,6.385 +2006,ARG,4.413 +2006,ARM,1.454 +2006,ABW,28.394 +2006,AUS,19.174 +2006,AUT,9.291 +2006,AZE,3.939 +2006,BHS,5.257 +2006,BHR,20.001 +2006,BGD,0.292 +2006,BRB,6.564 +2006,BLR,6.253 +2006,BEL,11.705 +2006,BLZ,1.535 +2006,BEN,0.399 +2006,BMU,10.337 +2006,BTN,0.584 +2006,BOL,1.292 +2006,BES,4.086 +2006,BIH,4.284 +2006,BWA,2.143 +2006,BRA,1.954 +2006,VGB,7.375 +2006,BRN,19.162 +2006,BGR,6.675 +2006,BFA,0.095 +2006,BDI,0.024 +2006,KHM,0.222 +2006,CMR,0.309 +2006,CAN,17.478 +2006,CPV,0.991 +2006,CALF,0.053 +2006,TCD,0.093 +2006,CHL,3.921 +2006,CHN,4.946 +2006,CXR,0 +2006,COL,1.457 +2006,COM,0.273 +2006,COG,1.255 +2006,COK,4.332 +2006,CRI,1.6 +2006,CIV,0.355 +2006,HRV,5.33 +2006,CUB,2.382 +2006,CUW,35.497 +2006,CYP,7.755 +2006,CZE,12.281 +2006,COD,0.04 +2006,DNK,10.902 +2006,DJI,0.489 +2006,DMA,2.078 +2006,DOM,2.059 +2006,TLS,0.318 +2006,ECU,2.119 +2006,EGY,2.222 +2006,SLV,1.113 +2006,GNQ,6.827 +2006,ERI,0.191 +2006,EST,12.211 +2006,SWZ,0.942 +2006,ETH,0.067 +2006,FRO,14.023 +2006,FJI,1.362 +2006,FIN,12.983 +2006,FRA,6.67 +2006,PYF,2.985 +2006,GAB,3.689 +2006,GMB,0.203 +2006,GEO,1.549 +2006,DEU,10.81 +2006,GHA,0.369 +2006,GRC,10.122 +2006,GRL,11.663 +2006,GRD,2.079 +2006,GTM,0.908 +2006,GIN,0.203 +2006,GNB,0.153 +2006,GUY,1.991 +2006,HTI,0.189 +2006,HND,0.994 +2006,HKG,6.022 +2006,HUN,5.937 +2006,ISL,10.378 +2006,IND,1.102 +2006,IDN,1.495 +2006,IRN,6.96 +2006,IRQ,3.41 +2006,IRL,11.241 +2006,ISR,9.097 +2006,ITA,8.505 +2006,JAM,4.304 +2006,JPN,9.907 +2006,JOR,3.379 +2006,KAZ,13.94 +2006,KEN,0.259 +2006,KIR,0.476 +2006,KWT,32.177 +2006,KGZ,1.041 +2006,LAO,0.296 +2006,LVA,3.771 +2006,LBN,3.134 +2006,ALSO,1.031 +2006,LBR,0.195 +2006,LBY,9.332 +2006,LIE,6.62 +2006,LTU,4.272 +2006,LUX,25.214 +2006,MAC,3.227 +2006,MDG,0.087 +2006,MWI,0.065 +2006,MYS,6.419 +2006,MDV,2.366 +2006,MLI,0.113 +2006,MLT,6.487 +2006,MHL,2.23 +2006,MRT,0.503 +2006,MUS,2.868 +2006,MEX,4.442 +2006,FSM,1.03 +2006,MDA,1.276 +2006,MCO,0 +2006,MNG,3.596 +2006,MNE,3.261 +2006,MSR,8.474 +2006,MAR,1.5 +2006,MOZ,0.092 +2006,MMR,0.266 +2006,NAME,1.177 +2006,NRU,4.261 +2006,NPL,0.093 +2006,NLD,10.596 +2006,NCL,11.018 +2006,NZL,8.931 +2006,NIC,0.799 +2006,NER,0.047 +2006,NGA,0.623 +2006,NIU,1.973 +2006,PRK,3.143 +2006,MKD,4.157 +2006,NOR,9.406 +2006,OMN,15.686 +2006,PAK,0.806 +2006,PLW,11.564 +2006,PSE,0.624 +2006,PAN,2.234 +2006,PNG,0.753 +2006,PRY,0.706 +2006,PER,0.994 +2006,PHL,0.757 +2006,POL,8.731 +2006,PRT,6.15 +2006,QAT,58.745 +2006,ROU,4.988 +2006,RUS,11.323 +2006,RWA,0.055 +2006,SHN,2.018 +2006,KNA,4.297 +2006,LCA,2.465 +2006,SPM,10.803 +2006,VCT,1.94 +2006,WSM,0.909 +2006,SMR,0 +2006,STP,0.508 +2006,SAU,17.3 +2006,SEN,0.393 +2006,SRB,7.805 +2006,SYC,4.416 +2006,SLE,0.1 +2006,SGP,9.43 +2006,SXM,18.479 +2006,SVK,7.916 +2006,SVN,8.531 +2006,SLB,0.587 +2006,SOME,0.052 +2006,ZAF,9.027 +2006,KOR,10.478 +2006,SSD,0.124 +2006,ESP,8.096 +2006,LKA,0.593 +2006,SDN,0.38 +2006,SURE,3.33 +2006,SWE,5.902 +2006,CHE,6.069 +2006,SYR,2.762 +2006,TWN,12.073 +2006,TJK,0.376 +2006,TZA,0.145 +2006,THA,3.254 +2006,TGO,0.255 +2006,TON,1.208 +2006,TO,31.031 +2006,TUN,2.191 +2006,TUR,4.057 +2006,TKM,9.992 +2006,TCA,8.595 +2006,TUV,1.093 +2006,UGA,0.083 +2006,UKR,7.148 +2006,ARE,24.843 +2006,GBR,9.339 +2006,USA,20.192 +2006,URY,1.986 +2006,UZB,4.639 +2006,VUT,0.214 +2006,VAT,0 +2006,VEN,5.741 +2006,VNM,1.187 +2006,WLF,2.052 +2006,YEM,1.083 +2006,ZMB,0.186 +2006,ZWE,0.841 +2007,AFG,0.108 +2007,,4.683 +2007,ALB,1.327 +2007,DZA,3.234 +2007,AND,6.889 +2007,AGO,0.841 +2007,AIA,9.93 +2007,ATA,0 +2007,ATG,6.521 +2007,ARG,4.351 +2007,ARM,1.698 +2007,ABW,29.146 +2007,AUS,19.187 +2007,AUT,8.936 +2007,AZE,3.383 +2007,BHS,5.235 +2007,BHR,25.728 +2007,BGD,0.296 +2007,BRB,6.639 +2007,BLR,6.128 +2007,BEL,11.307 +2007,BLZ,1.603 +2007,BEN,0.455 +2007,BMU,11.54 +2007,BTN,0.577 +2007,BOL,1.307 +2007,BES,4.423 +2007,BIH,4.36 +2007,BWA,2.15 +2007,BRA,2.047 +2007,VGB,7.411 +2007,BRN,21.324 +2007,BGR,7.214 +2007,BFA,0.108 +2007,BDI,0.025 +2007,KHM,0.253 +2007,CMR,0.406 +2007,CAN,18.068 +2007,CPV,1.002 +2007,CALF,0.053 +2007,TCD,0.102 +2007,CHL,4.272 +2007,CHN,5.285 +2007,CXR,0 +2007,COL,1.397 +2007,COM,0.172 +2007,COG,1.077 +2007,COK,4.246 +2007,CRI,1.793 +2007,CIV,0.336 +2007,HRV,5.643 +2007,CUB,2.325 +2007,CUW,39.314 +2007,CYP,7.919 +2007,CZE,12.419 +2007,COD,0.044 +2007,DNK,9.984 +2007,DJI,0.534 +2007,DMA,2.503 +2007,DOM,2.126 +2007,TLS,0.283 +2007,ECU,2.405 +2007,EGY,2.296 +2007,SLV,1.133 +2007,GNQ,6.033 +2007,ERI,0.193 +2007,EST,14.876 +2007,SWZ,0.96 +2007,ETH,0.071 +2007,FRO,14.237 +2007,FJI,1.28 +2007,FIN,12.623 +2007,FRA,6.46 +2007,PYF,2.924 +2007,GAB,3.251 +2007,GMB,0.197 +2007,GEO,1.628 +2007,DEU,10.473 +2007,GHA,0.379 +2007,GRC,10.327 +2007,GRL,11.525 +2007,GRD,2.131 +2007,GTM,0.887 +2007,GIN,0.206 +2007,GNB,0.159 +2007,GUY,2.354 +2007,HTI,0.188 +2007,HND,1.037 +2007,HKG,6.223 +2007,HUN,5.839 +2007,ISL,11.207 +2007,IND,1.17 +2007,IDN,1.651 +2007,IRN,6.949 +2007,IRQ,2.131 +2007,IRL,10.933 +2007,ISR,9.033 +2007,ITA,8.347 +2007,JAM,3.979 +2007,JPN,10.178 +2007,JOR,3.311 +2007,KAZ,14.166 +2007,KEN,0.258 +2007,KIR,0.467 +2007,KWT,30.78 +2007,KGZ,1.232 +2007,LAO,0.304 +2007,LVA,3.97 +2007,LBN,2.858 +2007,ALSO,1.046 +2007,LBR,0.172 +2007,LBY,8.462 +2007,LIE,5.708 +2007,LTU,4.729 +2007,LUX,23.562 +2007,MAC,2.645 +2007,MDG,0.087 +2007,MWI,0.068 +2007,MYS,6.476 +2007,MDV,2.4 +2007,MLI,0.127 +2007,MLT,6.628 +2007,MHL,2.304 +2007,MRT,0.557 +2007,MUS,2.901 +2007,MEX,4.374 +2007,FSM,1.204 +2007,MDA,1.284 +2007,MCO,0 +2007,MNG,4.589 +2007,MNE,3.253 +2007,MSR,8.409 +2007,MAR,1.566 +2007,MOZ,0.103 +2007,MMR,0.265 +2007,NAME,1.126 +2007,NRU,4.273 +2007,NPL,0.096 +2007,NLD,10.539 +2007,NCL,11.736 +2007,NZL,8.625 +2007,NIC,0.812 +2007,NER,0.048 +2007,NGA,0.553 +2007,NIU,1.985 +2007,PRK,2.606 +2007,MKD,4.326 +2007,NOR,9.68 +2007,OMN,17.296 +2007,PAK,0.854 +2007,PLW,13.043 +2007,PSE,0.625 +2007,PAN,2.142 +2007,PNG,0.951 +2007,PRY,0.723 +2007,PER,1.199 +2007,PHL,0.79 +2007,POL,8.72 +2007,PRT,5.902 +2007,QAT,48.204 +2007,ROU,5.255 +2007,RUS,11.346 +2007,RWA,0.057 +2007,SHN,2.059 +2007,KNA,4.596 +2007,LCA,2.537 +2007,SPM,10.83 +2007,VCT,2.116 +2007,WSM,0.942 +2007,SMR,0 +2007,STP,0.496 +2007,SAU,14.928 +2007,SEN,0.42 +2007,SRB,7.676 +2007,SYC,4.562 +2007,SLE,0.082 +2007,SGP,6.601 +2007,SXM,20.594 +2007,SVK,7.618 +2007,SVN,8.572 +2007,SLB,0.595 +2007,SOME,0.055 +2007,ZAF,9.302 +2007,KOR,10.819 +2007,SSD,0.139 +2007,ESP,8.12 +2007,LKA,0.605 +2007,SDN,0.434 +2007,SURE,3.327 +2007,SWE,5.783 +2007,CHE,5.75 +2007,SYR,3.22 +2007,TWN,12.196 +2007,TJK,0.449 +2007,TZA,0.137 +2007,THA,3.353 +2007,TGO,0.251 +2007,TON,1.065 +2007,TO,32.915 +2007,TUN,2.324 +2007,TUR,4.452 +2007,TKM,9.788 +2007,TCA,9.616 +2007,TUV,1.081 +2007,UGA,0.091 +2007,UKR,7.273 +2007,ARE,22.669 +2007,GBR,9.134 +2007,USA,20.249 +2007,URY,1.787 +2007,UZB,4.534 +2007,VUT,0.433 +2007,VAT,0 +2007,VEN,5.594 +2007,VNM,1.197 +2007,WLF,2.096 +2007,YEM,1.041 +2007,ZMB,0.185 +2007,ZWE,0.79 +2008,AFG,0.161 +2008,,4.704 +2008,ALB,1.49 +2008,DZA,3.213 +2008,AND,7.08 +2008,AGO,0.864 +2008,AIA,9.768 +2008,ATA,0 +2008,ATG,6.468 +2008,ARG,4.649 +2008,ARM,1.869 +2008,ABW,27.104 +2008,AUS,19.026 +2008,AUT,8.832 +2008,AZE,3.671 +2008,BHS,5.282 +2008,BHR,26.731 +2008,BGD,0.312 +2008,BRB,7.634 +2008,BLR,6.42 +2008,BEL,11.203 +2008,BLZ,1.426 +2008,BEN,0.44 +2008,BMU,10.249 +2008,BTN,0.612 +2008,BOL,1.312 +2008,BES,4.096 +2008,BIH,5.061 +2008,BWA,2.243 +2008,BRA,2.142 +2008,VGB,7.429 +2008,BRN,23.833 +2008,BGR,7.039 +2008,BFA,0.114 +2008,BDI,0.025 +2008,KHM,0.277 +2008,CMR,0.39 +2008,CAN,17.364 +2008,CPV,0.919 +2008,CALF,0.037 +2008,TCD,0.079 +2008,CHL,4.234 +2008,CHN,5.64 +2008,CXR,0 +2008,COL,1.528 +2008,COM,0.175 +2008,COG,1.044 +2008,COK,4.099 +2008,CRI,1.775 +2008,CIV,0.332 +2008,HRV,5.37 +2008,CUB,2.493 +2008,CUW,37.212 +2008,CYP,7.978 +2008,CZE,11.847 +2008,COD,0.043 +2008,DNK,9.315 +2008,DJI,0.564 +2008,DMA,2.45 +2008,DOM,2.135 +2008,TLS,0.273 +2008,ECU,2.091 +2008,EGY,2.358 +2008,SLV,1.055 +2008,GNQ,5.972 +2008,ERI,0.136 +2008,EST,13.33 +2008,SWZ,0.938 +2008,ETH,0.076 +2008,FRO,13.011 +2008,FJI,0.943 +2008,FIN,11.033 +2008,FRA,6.309 +2008,PYF,2.978 +2008,GAB,3.362 +2008,GMB,0.199 +2008,GEO,1.368 +2008,DEU,10.501 +2008,GHA,0.342 +2008,GRC,10.031 +2008,GRL,11.968 +2008,GRD,2.247 +2008,GTM,0.779 +2008,GIN,0.204 +2008,GNB,0.153 +2008,GUY,2.264 +2008,HTI,0.184 +2008,HND,1.053 +2008,HKG,6.069 +2008,HUN,5.719 +2008,ISL,12.0 +2008,IND,1.234 +2008,IDN,1.537 +2008,IRN,7.127 +2008,IRQ,3.215 +2008,IRL,10.638 +2008,ISR,9.609 +2008,ITA,8.089 +2008,JAM,3.976 +2008,JPN,9.619 +2008,JOR,3.124 +2008,KAZ,14.005 +2008,KEN,0.261 +2008,KIR,0.458 +2008,KWT,31.793 +2008,KGZ,1.399 +2008,LAO,0.347 +2008,LVA,3.813 +2008,LBN,3.564 +2008,ALSO,1.065 +2008,LBR,0.14 +2008,LBY,8.59 +2008,LIE,6.197 +2008,LTU,4.627 +2008,LUX,22.864 +2008,MAC,2.14 +2008,MDG,0.087 +2008,MWI,0.072 +2008,MYS,6.971 +2008,MDV,2.501 +2008,MLI,0.134 +2008,MLT,6.508 +2008,MHL,2.382 +2008,MRT,0.567 +2008,MUS,2.953 +2008,MEX,4.313 +2008,FSM,1.011 +2008,MDA,1.361 +2008,MCO,0 +2008,MNG,4.525 +2008,MNE,4.125 +2008,MSR,9.849 +2008,MAR,1.624 +2008,MOZ,0.1 +2008,MMR,0.201 +2008,NAME,1.326 +2008,NRU,4.282 +2008,NPL,0.125 +2008,NLD,10.675 +2008,NCL,11.253 +2008,NZL,8.804 +2008,NIC,0.768 +2008,NER,0.051 +2008,NGA,0.573 +2008,NIU,3.968 +2008,PRK,2.874 +2008,MKD,4.284 +2008,NOR,9.368 +2008,OMN,17.797 +2008,PAK,0.828 +2008,PLW,10.731 +2008,PSE,0.539 +2008,PAN,2.098 +2008,PNG,0.777 +2008,PRY,0.758 +2008,PER,1.225 +2008,PHL,0.847 +2008,POL,8.555 +2008,PRT,5.673 +2008,QAT,42.676 +2008,ROU,5.238 +2008,RUS,11.546 +2008,RWA,0.054 +2008,SHN,2.081 +2008,KNA,4.582 +2008,LCA,2.521 +2008,SPM,10.838 +2008,VCT,1.993 +2008,WSM,0.841 +2008,SMR,0 +2008,STP,0.484 +2008,SAU,16.049 +2008,SEN,0.399 +2008,SRB,6.705 +2008,SYC,4.618 +2008,SLE,0.083 +2008,SGP,9.653 +2008,SXM,19.614 +2008,SVK,7.686 +2008,SVN,8.986 +2008,SLB,0.596 +2008,SOME,0.053 +2008,ZAF,9.793 +2008,KOR,11.005 +2008,SSD,0.14 +2008,ESP,7.307 +2008,LKA,0.591 +2008,SDN,0.441 +2008,SURE,3.618 +2008,SWE,5.511 +2008,CHE,5.853 +2008,SYR,3.155 +2008,TWN,11.592 +2008,TJK,0.395 +2008,TZA,0.138 +2008,THA,3.331 +2008,TGO,0.245 +2008,TON,1.131 +2008,TO,31.924 +2008,TUN,2.391 +2008,TUR,4.355 +2008,TKM,11.654 +2008,TCA,9.61 +2008,TUV,1.068 +2008,UGA,0.091 +2008,UKR,7.077 +2008,ARE,21.99 +2008,GBR,8.826 +2008,USA,19.35 +2008,URY,2.458 +2008,UZB,4.63 +2008,VUT,0.407 +2008,VAT,0 +2008,VEN,5.567 +2008,VNM,1.335 +2008,WLF,1.606 +2008,YEM,1.046 +2008,ZMB,0.199 +2008,ZWE,0.615 +2009,AFG,0.233 +2009,,4.565 +2009,ALB,1.504 +2009,DZA,3.377 +2009,AND,6.993 +2009,AGO,0.918 +2009,AIA,9.605 +2009,ATA,0 +2009,ATG,6.587 +2009,ARG,4.378 +2009,ARM,1.472 +2009,ABW,26.477 +2009,AUS,18.812 +2009,AUT,8.069 +2009,AZE,3.191 +2009,BHS,5.853 +2009,BHR,23.823 +2009,BGD,0.335 +2009,BRB,7.305 +2009,BLR,6.208 +2009,BEL,9.977 +2009,BLZ,1.644 +2009,BEN,0.461 +2009,BMU,7.516 +2009,BTN,0.559 +2009,BOL,1.347 +2009,BES,4.039 +2009,BIH,5.296 +2009,BWA,1.882 +2009,BRA,2.004 +2009,VGB,7.174 +2009,BRN,19.842 +2009,BGR,5.994 +2009,BFA,0.117 +2009,BDI,0.019 +2009,KHM,0.322 +2009,CMR,0.443 +2009,CAN,16.198 +2009,CPV,1.009 +2009,CALF,0.035 +2009,TCD,0.106 +2009,CHL,3.918 +2009,CHN,5.893 +2009,CXR,0 +2009,COL,1.635 +2009,COM,0.211 +2009,COG,1.161 +2009,COK,3.959 +2009,CRI,1.698 +2009,CIV,0.274 +2009,HRV,4.976 +2009,CUB,2.517 +2009,CUW,37.489 +2009,CYP,7.624 +2009,CZE,11.035 +2009,COD,0.038 +2009,DNK,8.84 +2009,DJI,0.492 +2009,DMA,2.716 +2009,DOM,2.05 +2009,TLS,0.302 +2009,ECU,2.279 +2009,EGY,2.415 +2009,SLV,1.036 +2009,GNQ,4.696 +2009,ERI,0.161 +2009,EST,10.803 +2009,SWZ,0.967 +2009,ETH,0.074 +2009,FRO,11.872 +2009,FJI,0.823 +2009,FIN,10.472 +2009,FRA,5.974 +2009,PYF,2.972 +2009,GAB,3.208 +2009,GMB,0.199 +2009,GEO,1.592 +2009,DEU,9.701 +2009,GHA,0.275 +2009,GRC,9.436 +2009,GRL,10.494 +2009,GRD,2.232 +2009,GTM,0.802 +2009,GIN,0.211 +2009,GNB,0.154 +2009,GUY,2.541 +2009,HTI,0.194 +2009,HND,0.97 +2009,HKG,5.861 +2009,HUN,5.15 +2009,ISL,11.703 +2009,IND,1.318 +2009,IDN,1.655 +2009,IRN,7.22 +2009,IRQ,3.461 +2009,IRL,9.374 +2009,ISR,8.87 +2009,ITA,7.135 +2009,JAM,2.914 +2009,JPN,9.078 +2009,JOR,3.147 +2009,KAZ,13.69 +2009,KEN,0.306 +2009,KIR,0.449 +2009,KWT,31.735 +2009,KGZ,1.239 +2009,LAO,0.428 +2009,LVA,3.507 +2009,LBN,4.233 +2009,ALSO,1.103 +2009,LBR,0.121 +2009,LBY,8.396 +2009,LIE,5.753 +2009,LTU,4.034 +2009,LUX,21.351 +2009,MAC,3.482 +2009,MDG,0.081 +2009,MWI,0.071 +2009,MYS,6.809 +2009,MDV,2.53 +2009,MLI,0.126 +2009,MLT,6.08 +2009,MHL,2.46 +2009,MRT,0.606 +2009,MUS,2.897 +2009,MEX,4.146 +2009,FSM,1.359 +2009,MDA,1.211 +2009,MCO,0 +2009,MNG,4.885 +2009,MNE,2.664 +2009,MSR,8.98 +2009,MAR,1.587 +2009,MOZ,0.109 +2009,MMR,0.208 +2009,NAME,1.336 +2009,NRU,3.93 +2009,NPL,0.153 +2009,NLD,10.301 +2009,NCL,11.813 +2009,NZL,8.046 +2009,NIC,0.77 +2009,NER,0.059 +2009,NGA,0.493 +2009,NIU,1.99 +2009,PRK,2.175 +2009,MKD,3.941 +2009,NOR,8.921 +2009,OMN,16.405 +2009,PAK,0.817 +2009,PLW,10.497 +2009,PSE,0.536 +2009,PAN,2.377 +2009,PNG,0.715 +2009,PRY,0.795 +2009,PER,1.362 +2009,PHL,0.824 +2009,POL,8.197 +2009,PRT,5.395 +2009,QAT,40.411 +2009,ROU,4.323 +2009,RUS,10.792 +2009,RWA,0.056 +2009,SHN,2.072 +2009,KNA,4.724 +2009,LCA,2.505 +2009,SPM,10.853 +2009,VCT,2.535 +2009,WSM,0.872 +2009,SMR,0 +2009,STP,0.514 +2009,SAU,16.613 +2009,SEN,0.431 +2009,SRB,5.97 +2009,SYC,4.829 +2009,SLE,0.08 +2009,SGP,9.031 +2009,SXM,19.881 +2009,SVK,6.982 +2009,SVN,7.922 +2009,SLB,0.604 +2009,SOME,0.051 +2009,ZAF,9.392 +2009,KOR,11.069 +2009,SSD,0.14 +2009,ESP,6.395 +2009,LKA,0.632 +2009,SDN,0.448 +2009,SURE,3.687 +2009,SWE,5.079 +2009,CHE,5.628 +2009,SYR,2.885 +2009,TWN,10.957 +2009,TJK,0.327 +2009,TZA,0.131 +2009,THA,3.374 +2009,TGO,0.428 +2009,TON,1.231 +2009,TO,31.717 +2009,TUN,2.357 +2009,TUR,4.381 +2009,TKM,10.126 +2009,TCA,9.608 +2009,TUV,1.054 +2009,UGA,0.095 +2009,UKR,6.053 +2009,ARE,21.021 +2009,GBR,7.938 +2009,USA,17.765 +2009,URY,2.376 +2009,UZB,3.878 +2009,VUT,0.504 +2009,VAT,0 +2009,VEN,5.36 +2009,VNM,1.44 +2009,WLF,2.185 +2009,YEM,1.114 +2009,ZMB,0.221 +2009,ZWE,0.651 +2010,AFG,0.297 +2010,,4.768 +2010,ALB,1.642 +2010,DZA,3.301 +2010,AND,7.221 +2010,AGO,0.984 +2010,AIA,9.999 +2010,ATA,0 +2010,ATG,6.412 +2010,ARG,4.522 +2010,ARM,1.443 +2010,ABW,24.973 +2010,AUS,18.416 +2010,AUT,8.612 +2010,AZE,2.982 +2010,BHS,5.968 +2010,BHR,23.957 +2010,BGD,0.364 +2010,BRB,6.716 +2010,BLR,6.417 +2010,BEL,10.535 +2010,BLZ,1.672 +2010,BEN,0.495 +2010,BMU,9.583 +2010,BTN,0.691 +2010,BOL,1.44 +2010,BES,2.684 +2010,BIH,5.548 +2010,BWA,2.169 +2010,BRA,2.242 +2010,VGB,7.706 +2010,BRN,20.243 +2010,BGR,6.297 +2010,BFA,0.126 +2010,BDI,0.033 +2010,KHM,0.354 +2010,CMR,0.422 +2010,CAN,16.372 +2010,CPV,1.069 +2010,CALF,0.036 +2010,TCD,0.104 +2010,CHL,4.196 +2010,CHN,6.394 +2010,CXR,0 +2010,COL,1.702 +2010,COM,0.246 +2010,COG,1.239 +2010,COK,4.251 +2010,CRI,1.621 +2010,CIV,0.295 +2010,HRV,4.811 +2010,CUB,3.029 +2010,CUW,25.439 +2010,CYP,7.171 +2010,CZE,11.227 +2010,COD,0.041 +2010,DNK,8.862 +2010,DJI,0.562 +2010,DMA,2.504 +2010,DOM,2.102 +2010,TLS,0.288 +2010,ECU,2.42 +2010,EGY,2.334 +2010,SLV,1.033 +2010,GNQ,5.849 +2010,ERI,0.158 +2010,EST,14.251 +2010,SWZ,0.906 +2010,ETH,0.071 +2010,FRO,13.012 +2010,FJI,1.206 +2010,FIN,11.948 +2010,FRA,6.03 +2010,PYF,3.254 +2010,GAB,3.411 +2010,GMB,0.219 +2010,GEO,1.618 +2010,DEU,10.22 +2010,GHA,0.35 +2010,GRC,8.823 +2010,GRL,12.052 +2010,GRD,2.281 +2010,GTM,0.763 +2010,GIN,0.242 +2010,GNB,0.152 +2010,GUY,2.523 +2010,HTI,0.217 +2010,HND,0.946 +2010,HKG,5.617 +2010,HUN,5.216 +2010,ISL,11.395 +2010,IND,1.352 +2010,IDN,1.827 +2010,IRN,7.336 +2010,IRQ,3.631 +2010,IRL,9.237 +2010,ISR,9.318 +2010,ITA,7.297 +2010,JAM,2.808 +2010,JPN,9.482 +2010,JOR,2.974 +2010,KAZ,14.963 +2010,KEN,0.293 +2010,KIR,0.543 +2010,KWT,30.873 +2010,KGZ,1.159 +2010,LAO,0.475 +2010,LVA,4.071 +2010,LBN,4.003 +2010,ALSO,1.125 +2010,LBR,0.188 +2010,LBY,9.409 +2010,LIE,5.309 +2010,LTU,4.397 +2010,LUX,22.083 +2010,MAC,2.216 +2010,MDG,0.086 +2010,MWI,0.066 +2010,MYS,6.942 +2010,MDV,2.584 +2010,MLI,0.134 +2010,MLT,6.216 +2010,MHL,2.537 +2010,MRT,0.612 +2010,MUS,3.049 +2010,MEX,4.057 +2010,FSM,0.953 +2010,MDA,1.313 +2010,MCO,0 +2010,MNG,5.096 +2010,MNE,3.838 +2010,MSR,11.819 +2010,MAR,1.675 +2010,MOZ,0.114 +2010,MMR,0.266 +2010,NAME,1.353 +2010,NRU,4.285 +2010,NPL,0.178 +2010,NLD,10.974 +2010,NCL,13.991 +2010,NZL,8.009 +2010,NIC,0.763 +2010,NER,0.07 +2010,NGA,0.692 +2010,NIU,1.993 +2010,PRK,2.029 +2010,MKD,3.909 +2010,NOR,9.33 +2010,OMN,17.748 +2010,PAK,0.791 +2010,PLW,11.251 +2010,PSE,0.509 +2010,PAN,2.504 +2010,PNG,0.622 +2010,PRY,0.871 +2010,PER,1.454 +2010,PHL,0.878 +2010,POL,8.659 +2010,PRT,4.999 +2010,QAT,42.849 +2010,ROU,4.234 +2010,RUS,11.399 +2010,RWA,0.056 +2010,SHN,2.059 +2010,KNA,4.635 +2010,LCA,2.851 +2010,SPM,10.856 +2010,VCT,2.011 +2010,WSM,0.941 +2010,SMR,0 +2010,STP,0.563 +2010,SAU,17.836 +2010,SEN,0.548 +2010,SRB,5.97 +2010,SYC,4.797 +2010,SLE,0.084 +2010,SGP,8.337 +2010,SXM,13.581 +2010,SVK,7.117 +2010,SVN,8.001 +2010,SLB,0.61 +2010,SOME,0.051 +2010,ZAF,8.941 +2010,KOR,12.176 +2010,SSD,0.135 +2010,ESP,6.075 +2010,LKA,0.631 +2010,SDN,0.445 +2010,SURE,4.34 +2010,SWE,5.662 +2010,CHE,5.758 +2010,SYR,2.763 +2010,TWN,11.703 +2010,TJK,0.333 +2010,TZA,0.153 +2010,THA,3.53 +2010,TGO,0.395 +2010,TON,1.092 +2010,TO,33.406 +2010,TUN,2.583 +2010,TUR,4.32 +2010,TKM,11.235 +2010,TCA,9.483 +2010,TUV,1.04 +2010,UGA,0.11 +2010,UKR,6.444 +2010,ARE,21.793 +2010,GBR,8.157 +2010,USA,18.252 +2010,URY,1.879 +2010,UZB,3.763 +2010,VUT,0.493 +2010,VAT,0 +2010,VEN,6.593 +2010,VNM,1.597 +2010,WLF,2.226 +2010,YEM,1.039 +2010,ZMB,0.226 +2010,ZWE,0.682 +2011,AFG,0.405 +2011,,4.869 +2011,ALB,1.832 +2011,DZA,3.423 +2011,AND,6.956 +2011,AGO,0.964 +2011,AIA,9.322 +2011,ATA,0 +2011,ATG,6.293 +2011,ARG,4.568 +2011,ARM,1.696 +2011,ABW,24.667 +2011,AUS,18.082 +2011,AUT,8.331 +2011,AZE,3.228 +2011,BHS,5.594 +2011,BHR,23.486 +2011,BGD,0.377 +2011,BRB,7.047 +2011,BLR,6.316 +2011,BEL,9.59 +2011,BLZ,1.679 +2011,BEN,0.461 +2011,BMU,6.976 +2011,BTN,1.026 +2011,BOL,1.534 +2011,BES,3.318 +2011,BIH,6.348 +2011,BWA,1.888 +2011,BRA,2.334 +2011,VGB,7.594 +2011,BRN,23.798 +2011,BGR,7.043 +2011,BFA,0.128 +2011,BDI,0.036 +2011,KHM,0.362 +2011,CMR,0.396 +2011,CAN,16.468 +2011,CPV,1.167 +2011,CALF,0.039 +2011,TCD,0.103 +2011,CHL,4.546 +2011,CHN,7.024 +2011,CXR,0 +2011,COL,1.682 +2011,COM,0.213 +2011,COG,1.101 +2011,COK,4.53 +2011,CRI,1.562 +2011,CIV,0.303 +2011,HRV,4.745 +2011,CUB,2.605 +2011,CUW,31.993 +2011,CYP,6.801 +2011,CZE,10.975 +2011,COD,0.044 +2011,DNK,7.933 +2011,DJI,0.505 +2011,DMA,2.238 +2011,DOM,2.153 +2011,TLS,0.39 +2011,ECU,2.511 +2011,EGY,2.432 +2011,SLV,1.059 +2011,GNQ,5.325 +2011,ERI,0.18 +2011,EST,14.28 +2011,SWZ,0.912 +2011,ETH,0.081 +2011,FRO,11.731 +2011,FJI,1.099 +2011,FIN,10.512 +2011,FRA,5.641 +2011,PYF,3.108 +2011,GAB,3.288 +2011,GMB,0.222 +2011,GEO,2.042 +2011,DEU,9.919 +2011,GHA,0.394 +2011,GRC,8.588 +2011,GRL,12.894 +2011,GRD,2.2 +2011,GTM,0.758 +2011,GIN,0.246 +2011,GNB,0.15 +2011,GUY,2.634 +2011,HTI,0.228 +2011,HND,1.028 +2011,HKG,6.014 +2011,HUN,5.049 +2011,ISL,10.976 +2011,IND,1.403 +2011,IDN,2.026 +2011,IRN,7.418 +2011,IRQ,3.797 +2011,IRL,8.374 +2011,ISR,9.195 +2011,ITA,7.076 +2011,JAM,3.006 +2011,JPN,9.879 +2011,JOR,2.988 +2011,KAZ,14.171 +2011,KEN,0.315 +2011,KIR,0.5 +2011,KWT,27.965 +2011,KGZ,1.372 +2011,LAO,0.494 +2011,LVA,3.761 +2011,LBN,4.017 +2011,ALSO,1.503 +2011,LBR,0.203 +2011,LBY,9.027 +2011,LIE,4.882 +2011,LTU,4.504 +2011,LUX,21.425 +2011,MAC,2.265 +2011,MDG,0.106 +2011,MWI,0.07 +2011,MYS,6.971 +2011,MDV,2.632 +2011,MLI,0.142 +2011,MLT,6.1 +2011,MHL,2.627 +2011,MRT,0.633 +2011,MUS,3.045 +2011,MEX,4.235 +2011,FSM,1.087 +2011,MDA,1.375 +2011,MCO,0 +2011,MNG,7.787 +2011,MNE,3.81 +2011,MSR,7.344 +2011,MAR,1.668 +2011,MOZ,0.131 +2011,MMR,0.304 +2011,NAME,1.305 +2011,NRU,3.912 +2011,NPL,0.191 +2011,NLD,10.126 +2011,NCL,13.873 +2011,NZL,7.821 +2011,NIC,0.809 +2011,NER,0.076 +2011,NGA,0.758 +2011,NIU,3.998 +2011,PRK,1.46 +2011,MKD,4.214 +2011,NOR,9.033 +2011,OMN,17.769 +2011,PAK,0.779 +2011,PLW,11.839 +2011,PSE,0.549 +2011,PAN,2.698 +2011,PNG,0.679 +2011,PRY,0.89 +2011,PER,1.431 +2011,PHL,0.871 +2011,POL,8.638 +2011,PRT,4.897 +2011,QAT,45.169 +2011,ROU,4.59 +2011,RUS,11.76 +2011,RWA,0.061 +2011,SHN,2.044 +2011,KNA,4.849 +2011,LCA,2.831 +2011,SPM,10.872 +2011,VCT,1.988 +2011,WSM,0.97 +2011,SMR,0 +2011,STP,0.532 +2011,SAU,16.68 +2011,SEN,0.607 +2011,SRB,6.424 +2011,SYC,4.334 +2011,SLE,0.107 +2011,SGP,6.441 +2011,SXM,17.181 +2011,SVK,7.031 +2011,SVN,7.92 +2011,SLB,0.622 +2011,SOME,0.05 +2011,ZAF,8.884 +2011,KOR,12.679 +2011,SSD,0.125 +2011,ESP,6.073 +2011,LKA,0.714 +2011,SDN,0.426 +2011,SURE,4.99 +2011,SWE,5.198 +2011,CHE,5.18 +2011,SYR,2.588 +2011,TWN,11.938 +2011,TJK,0.301 +2011,TZA,0.162 +2011,THA,3.564 +2011,TGO,0.371 +2011,TON,0.953 +2011,TO,33.146 +2011,TUN,2.396 +2011,TUR,4.612 +2011,TKM,12.154 +2011,TCA,9.148 +2011,TUV,1.025 +2011,UGA,0.115 +2011,UKR,6.775 +2011,ARE,23.04 +2011,GBR,7.422 +2011,USA,17.67 +2011,URY,2.276 +2011,UZB,4.018 +2011,VUT,0.539 +2011,VAT,0 +2011,VEN,5.788 +2011,VNM,1.727 +2011,WLF,1.984 +2011,YEM,0.884 +2011,ZMB,0.236 +2011,ZWE,0.796 +2012,AFG,0.329 +2012,,4.878 +2012,ALB,1.677 +2012,DZA,3.641 +2012,AND,6.86 +2012,AGO,1.03 +2012,AIA,8.97 +2012,ATA,0 +2012,ATG,6.351 +2012,ARG,4.56 +2012,ARM,1.972 +2012,ABW,13.203 +2012,AUS,17.888 +2012,AUT,7.982 +2012,AZE,3.455 +2012,BHS,5.37 +2012,BHR,22.139 +2012,BGD,0.399 +2012,BRB,6.529 +2012,BLR,6.452 +2012,BEL,9.283 +2012,BLZ,1.337 +2012,BEN,0.44 +2012,BMU,5.763 +2012,BTN,1.158 +2012,BOL,1.659 +2012,BES,3.925 +2012,BIH,6.024 +2012,BWA,2.334 +2012,BRA,2.492 +2012,VGB,7.472 +2012,BRN,23.362 +2012,BGR,6.449 +2012,BFA,0.153 +2012,BDI,0.036 +2012,KHM,0.377 +2012,CMR,0.362 +2012,CAN,16.309 +2012,CPV,0.94 +2012,CALF,0.04 +2012,TCD,0.137 +2012,CHL,4.591 +2012,CHN,7.156 +2012,CXR,0 +2012,COL,1.753 +2012,COM,0.225 +2012,COG,1.065 +2012,COK,4.674 +2012,CRI,1.533 +2012,CIV,0.388 +2012,HRV,4.405 +2012,CUB,2.638 +2012,CUW,38.347 +2012,CYP,6.28 +2012,CZE,10.589 +2012,COD,0.039 +2012,DNK,7.117 +2012,DJI,0.511 +2012,DMA,2.393 +2012,DOM,2.119 +2012,TLS,0.52 +2012,ECU,2.416 +2012,EGY,2.343 +2012,SLV,1.05 +2012,GNQ,5.781 +2012,ERI,0.187 +2012,EST,13.436 +2012,SWZ,1.052 +2012,ETH,0.086 +2012,FRO,12.186 +2012,FJI,1.063 +2012,FIN,9.447 +2012,FRA,5.651 +2012,PYF,3.056 +2012,GAB,3.065 +2012,GMB,0.217 +2012,GEO,2.17 +2012,DEU,9.968 +2012,GHA,0.471 +2012,GRC,8.336 +2012,GRL,10.313 +2012,GRD,2.339 +2012,GTM,0.765 +2012,GIN,0.224 +2012,GNB,0.149 +2012,GUY,2.635 +2012,HTI,0.224 +2012,HND,1.048 +2012,HKG,5.908 +2012,HUN,4.719 +2012,ISL,10.908 +2012,IND,1.511 +2012,IDN,2.062 +2012,IRN,7.609 +2012,IRQ,3.94 +2012,IRL,8.375 +2012,ISR,9.85 +2012,ITA,6.716 +2012,JAM,2.867 +2012,JPN,10.214 +2012,JOR,3.302 +2012,KAZ,14.404 +2012,KEN,0.286 +2012,KIR,0.46 +2012,KWT,29.978 +2012,KGZ,1.791 +2012,LAO,0.522 +2012,LVA,3.662 +2012,LBN,4.313 +2012,ALSO,1.505 +2012,LBR,0.222 +2012,LBY,9.417 +2012,LIE,5.074 +2012,LTU,4.588 +2012,LUX,20.49 +2012,MAC,1.943 +2012,MDG,0.119 +2012,MWI,0.068 +2012,MYS,7.181 +2012,MDV,2.865 +2012,MLI,0.148 +2012,MLT,6.32 +2012,MHL,2.596 +2012,MRT,0.673 +2012,MUS,3.076 +2012,MEX,4.333 +2012,FSM,1.151 +2012,MDA,1.359 +2012,MCO,0 +2012,MNG,12.534 +2012,MNE,3.496 +2012,MSR,8.062 +2012,MAR,1.708 +2012,MOZ,0.125 +2012,MMR,0.235 +2012,NAME,1.548 +2012,NRU,4.202 +2012,NPL,0.2 +2012,NLD,9.859 +2012,NCL,13.658 +2012,NZL,8.15 +2012,NIC,0.754 +2012,NER,0.103 +2012,NGA,0.641 +2012,NIU,3.998 +2012,PRK,1.509 +2012,MKD,4.042 +2012,NOR,8.812 +2012,OMN,17.738 +2012,PAK,0.766 +2012,PLW,12.435 +2012,PSE,0.526 +2012,PAN,2.601 +2012,PNG,0.631 +2012,PRY,0.873 +2012,PER,1.53 +2012,PHL,0.904 +2012,POL,8.439 +2012,PRT,4.742 +2012,QAT,48.97 +2012,ROU,4.525 +2012,RUS,11.845 +2012,RWA,0.066 +2012,SHN,2.032 +2012,KNA,4.604 +2012,LCA,2.836 +2012,SPM,10.905 +2012,VCT,2.135 +2012,WSM,0.943 +2012,SMR,0 +2012,STP,0.579 +2012,SAU,18.391 +2012,SEN,0.556 +2012,SRB,5.762 +2012,SYC,4.459 +2012,SLE,0.123 +2012,SGP,9.423 +2012,SXM,19.796 +2012,SVK,6.639 +2012,SVN,7.616 +2012,SLB,0.613 +2012,SOME,0.049 +2012,ZAF,8.636 +2012,KOR,12.651 +2012,SSD,0.124 +2012,ESP,5.947 +2012,LKA,0.752 +2012,SDN,0.433 +2012,SURE,4.465 +2012,SWE,4.888 +2012,CHE,5.284 +2012,SYR,2.028 +2012,TWN,11.739 +2012,TJK,0.369 +2012,TZA,0.184 +2012,THA,3.794 +2012,TGO,0.32 +2012,TON,0.988 +2012,TO,32.282 +2012,TUN,2.547 +2012,TUR,4.731 +2012,TKM,12.263 +2012,TCA,8.788 +2012,TUV,1.011 +2012,UGA,0.106 +2012,UKR,6.704 +2012,ARE,23.935 +2012,GBR,7.64 +2012,USA,16.877 +2012,URY,2.549 +2012,UZB,4.029 +2012,VUT,0.456 +2012,VAT,0 +2012,VEN,5.963 +2012,VNM,1.616 +2012,WLF,2.02 +2012,YEM,0.776 +2012,ZMB,0.283 +2012,ZWE,0.848 +2013,AFG,0.293 +2013,,4.859 +2013,ALB,1.831 +2013,DZA,3.705 +2013,AND,6.673 +2013,AGO,0.983 +2013,AIA,8.541 +2013,ATA,0 +2013,ATG,6.292 +2013,ARG,4.471 +2013,ARM,1.908 +2013,ABW,8.368 +2013,AUS,17.276 +2013,AUT,7.993 +2013,AZE,3.49 +2013,BHS,5.263 +2013,BHR,24.695 +2013,BGD,0.401 +2013,BRB,6.581 +2013,BLR,6.617 +2013,BEL,9.251 +2013,BLZ,1.276 +2013,BEN,0.443 +2013,BMU,8.421 +2013,BTN,1.26 +2013,BOL,1.654 +2013,BES,3.826 +2013,BIH,6.026 +2013,BWA,2.554 +2013,BRA,2.639 +2013,VGB,7.409 +2013,BRN,18.523 +2013,BGR,5.731 +2013,BFA,0.162 +2013,BDI,0.035 +2013,KHM,0.376 +2013,CMR,0.363 +2013,CAN,16.243 +2013,CPV,0.916 +2013,CALF,0.024 +2013,TCD,0.157 +2013,CHL,4.668 +2013,CHN,7.235 +2013,CXR,0 +2013,COL,1.905 +2013,COM,0.262 +2013,COG,1.22 +2013,COK,4.697 +2013,CRI,1.593 +2013,CIV,0.431 +2013,HRV,4.278 +2013,CUB,2.484 +2013,CUW,35.681 +2013,CYP,5.641 +2013,CZE,10.151 +2013,COD,0.053 +2013,DNK,7.424 +2013,DJI,0.573 +2013,DMA,2.289 +2013,DOM,2.094 +2013,TLS,0.533 +2013,ECU,2.522 +2013,EGY,2.264 +2013,SLV,0.985 +2013,GNQ,6.589 +2013,ERI,0.173 +2013,EST,14.917 +2013,SWZ,1.252 +2013,ETH,0.101 +2013,FRO,13.387 +2013,FJI,1.211 +2013,FIN,9.508 +2013,FRA,5.66 +2013,PYF,3.053 +2013,GAB,3.116 +2013,GMB,0.2 +2013,GEO,2.116 +2013,DEU,10.208 +2013,GHA,0.458 +2013,GRC,7.487 +2013,GRL,10.032 +2013,GRD,2.6 +2013,GTM,0.831 +2013,GIN,0.191 +2013,GNB,0.145 +2013,GUY,2.549 +2013,HTI,0.264 +2013,HND,1.045 +2013,HKG,6.072 +2013,HUN,4.413 +2013,ISL,10.771 +2013,IND,1.545 +2013,IDN,1.931 +2013,IRN,7.621 +2013,IRQ,3.975 +2013,IRL,8.124 +2013,ISR,8.166 +2013,ITA,6.139 +2013,JAM,3.062 +2013,JPN,10.301 +2013,JOR,3.095 +2013,KAZ,14.711 +2013,KEN,0.3 +2013,KIR,0.453 +2013,KWT,22.96 +2013,KGZ,1.702 +2013,LAO,0.646 +2013,LVA,3.628 +2013,LBN,3.903 +2013,ALSO,1.125 +2013,LBR,0.197 +2013,LBY,7.261 +2013,LIE,5.227 +2013,LTU,4.344 +2013,LUX,19.038 +2013,MAC,1.667 +2013,MDG,0.136 +2013,MWI,0.072 +2013,MYS,8.02 +2013,MDV,2.725 +2013,MLI,0.161 +2013,MLT,5.438 +2013,MHL,2.71 +2013,MRT,0.579 +2013,MUS,3.151 +2013,MEX,4.224 +2013,FSM,1.248 +2013,MDA,1.434 +2013,MCO,0 +2013,MNG,15.281 +2013,MNE,3.393 +2013,MSR,9.46 +2013,MAR,1.675 +2013,MOZ,0.142 +2013,MMR,0.251 +2013,NAME,1.165 +2013,NRU,4.444 +2013,NPL,0.227 +2013,NLD,9.775 +2013,NCL,14.364 +2013,NZL,7.918 +2013,NIC,0.753 +2013,NER,0.111 +2013,NGA,0.666 +2013,NIU,3.97 +2013,PRK,1.08 +2013,MKD,3.563 +2013,NOR,8.762 +2013,OMN,17.096 +2013,PAK,0.738 +2013,PLW,12.741 +2013,PSE,0.569 +2013,PAN,2.751 +2013,PNG,0.658 +2013,PRY,0.861 +2013,PER,1.432 +2013,PHL,0.963 +2013,POL,8.338 +2013,PRT,4.597 +2013,QAT,40.682 +2013,ROU,3.955 +2013,RUS,11.395 +2013,RWA,0.07 +2013,SHN,2.018 +2013,KNA,4.677 +2013,LCA,2.801 +2013,SPM,10.943 +2013,VCT,2.046 +2013,WSM,0.971 +2013,SMR,0 +2013,STP,0.567 +2013,SAU,17.297 +2013,SEN,0.578 +2013,SRB,5.89 +2013,SYC,4.28 +2013,SLE,0.15 +2013,SGP,10.023 +2013,SXM,18.941 +2013,SVK,6.569 +2013,SVN,7.3 +2013,SLB,0.642 +2013,SOME,0.049 +2013,ZAF,8.513 +2013,KOR,12.667 +2013,SSD,0.13 +2013,ESP,5.406 +2013,LKA,0.687 +2013,SDN,0.473 +2013,SURE,5.581 +2013,SWE,4.685 +2013,CHE,5.339 +2013,SYR,1.584 +2013,TWN,11.739 +2013,TJK,0.357 +2013,TZA,0.197 +2013,THA,3.791 +2013,TGO,0.231 +2013,TON,1.06 +2013,TO,31.806 +2013,TUN,2.507 +2013,TUR,4.536 +2013,TKM,11.572 +2013,TCA,8.501 +2013,TUV,1.005 +2013,UGA,0.106 +2013,UKR,6.566 +2013,ARE,24.376 +2013,GBR,7.428 +2013,USA,17.159 +2013,URY,2.216 +2013,UZB,3.747 +2013,VUT,0.417 +2013,VAT,0 +2013,VEN,6.65 +2013,VNM,1.678 +2013,WLF,1.759 +2013,YEM,1.007 +2013,ZMB,0.29 +2013,ZWE,0.861 +2014,AFG,0.28 +2014,,4.833 +2014,ALB,2.08 +2014,DZA,3.903 +2014,AND,6.444 +2014,AGO,0.913 +2014,AIA,8.549 +2014,ATA,0 +2014,ATG,6.363 +2014,ARG,4.399 +2014,ARM,1.939 +2014,ABW,8.417 +2014,AUS,16.747 +2014,AUT,7.509 +2014,AZE,3.526 +2014,BHS,5.489 +2014,BHR,23.567 +2014,BGD,0.423 +2014,BRB,6.09 +2014,BLR,6.566 +2014,BEL,8.681 +2014,BLZ,1.331 +2014,BEN,0.452 +2014,BMU,10.58 +2014,BTN,1.396 +2014,BOL,1.822 +2014,BES,3.729 +2014,BIH,5.408 +2014,BWA,3.031 +2014,BRA,2.742 +2014,VGB,7.454 +2014,BRN,21.194 +2014,BGR,6.126 +2014,BFA,0.16 +2014,BDI,0.033 +2014,KHM,0.449 +2014,CMR,0.393 +2014,CAN,15.997 +2014,CPV,0.892 +2014,CALF,0.026 +2014,TCD,0.159 +2014,CHL,4.387 +2014,CHN,7.218 +2014,CXR,0 +2014,COL,2.106 +2014,COM,0.226 +2014,COG,1.106 +2014,COK,4.518 +2014,CRI,1.599 +2014,CIV,0.431 +2014,HRV,4.127 +2014,CUB,2.436 +2014,CUW,40.448 +2014,CYP,5.906 +2014,CZE,9.913 +2014,COD,0.067 +2014,DNK,6.649 +2014,DJI,0.393 +2014,DMA,2.376 +2014,DOM,2.12 +2014,TLS,0.527 +2014,ECU,2.74 +2014,EGY,2.374 +2014,SLV,0.991 +2014,GNQ,5.924 +2014,ERI,0.171 +2014,EST,14.323 +2014,SWZ,0.683 +2014,ETH,0.12 +2014,FRO,12.316 +2014,FJI,1.367 +2014,FIN,8.719 +2014,FRA,5.143 +2014,PYF,2.932 +2014,GAB,3.238 +2014,GMB,0.231 +2014,GEO,2.368 +2014,DEU,9.709 +2014,GHA,0.47 +2014,GRC,7.239 +2014,GRL,9.337 +2014,GRD,1.987 +2014,GTM,0.88 +2014,GIN,0.191 +2014,GNB,0.149 +2014,GUY,2.625 +2014,HTI,0.26 +2014,HND,1.039 +2014,HKG,6.188 +2014,HUN,4.438 +2014,ISL,10.52 +2014,IND,1.643 +2014,IDN,1.904 +2014,IRN,7.912 +2014,IRQ,3.729 +2014,IRL,7.973 +2014,ISR,7.666 +2014,ITA,5.804 +2014,JAM,2.764 +2014,JPN,9.916 +2014,JOR,2.991 +2014,KAZ,15.591 +2014,KEN,0.317 +2014,KIR,0.51 +2014,KWT,20.104 +2014,KGZ,1.761 +2014,LAO,0.665 +2014,LVA,3.567 +2014,LBN,3.824 +2014,ALSO,1.18 +2014,LBR,0.182 +2014,LBY,9.938 +2014,LIE,4.344 +2014,LTU,4.292 +2014,LUX,17.666 +2014,MAC,2.141 +2014,MDG,0.13 +2014,MWI,0.063 +2014,MYS,8.006 +2014,MDV,3.156 +2014,MLI,0.179 +2014,MLT,5.296 +2014,MHL,2.833 +2014,MRT,0.668 +2014,MUS,3.255 +2014,MEX,4.077 +2014,FSM,1.243 +2014,MDA,1.426 +2014,MCO,0 +2014,MNG,10.206 +2014,MNE,3.321 +2014,MSR,9.386 +2014,MAR,1.669 +2014,MOZ,0.312 +2014,MMR,0.31 +2014,NAME,1.64 +2014,NRU,4.678 +2014,NPL,0.276 +2014,NLD,9.288 +2014,NCL,17.838 +2014,NZL,7.85 +2014,NIC,0.764 +2014,NER,0.116 +2014,NGA,0.686 +2014,NIU,5.916 +2014,PRK,1.216 +2014,MKD,3.422 +2014,NOR,8.75 +2014,OMN,16.436 +2014,PAK,0.752 +2014,PLW,12.336 +2014,PSE,0.648 +2014,PAN,2.791 +2014,PNG,0.787 +2014,PRY,0.896 +2014,PER,1.627 +2014,PHL,1.002 +2014,POL,8.024 +2014,PRT,4.601 +2014,QAT,41.174 +2014,ROU,3.957 +2014,RUS,11.366 +2014,RWA,0.073 +2014,SHN,2.006 +2014,KNA,4.828 +2014,LCA,2.767 +2014,SPM,10.968 +2014,VCT,2.364 +2014,WSM,0.999 +2014,SMR,0 +2014,STP,0.649 +2014,SAU,19.076 +2014,SEN,0.624 +2014,SRB,4.932 +2014,SYC,4.673 +2014,SLE,0.158 +2014,SGP,9.355 +2014,SXM,18.543 +2014,SVK,6.211 +2014,SVN,6.536 +2014,SLB,0.552 +2014,SOME,0.047 +2014,ZAF,8.622 +2014,KOR,12.448 +2014,SSD,0.136 +2014,ESP,5.47 +2014,LKA,0.82 +2014,SDN,0.474 +2014,SURE,5.618 +2014,SWE,4.46 +2014,CHE,4.791 +2014,SYR,1.542 +2014,TWN,11.799 +2014,TJK,0.552 +2014,TZA,0.181 +2014,THA,3.895 +2014,TGO,0.212 +2014,TON,1.065 +2014,TO,32.324 +2014,TUN,2.598 +2014,TUR,4.66 +2014,TKM,11.089 +2014,TCA,8.79 +2014,TUV,1.006 +2014,UGA,0.113 +2014,UKR,5.707 +2014,ARE,23.765 +2014,GBR,6.774 +2014,USA,17.168 +2014,URY,1.971 +2014,UZB,3.527 +2014,VUT,0.584 +2014,VAT,0 +2014,VEN,5.828 +2014,VNM,1.993 +2014,WLF,1.782 +2014,YEM,0.954 +2014,ZMB,0.31 +2014,ZWE,0.862 +2015,AFG,0.29 +2015,,4.775 +2015,ALB,1.635 +2015,DZA,4.048 +2015,AND,6.484 +2015,AGO,0.925 +2015,AIA,9.567 +2015,ATA,0 +2015,ATG,6.476 +2015,ARG,4.433 +2015,ARM,1.9 +2015,ABW,8.609 +2015,AUS,16.85 +2015,AUT,7.679 +2015,AZE,3.516 +2015,BHS,5.719 +2015,BHR,23.83 +2015,BGD,0.464 +2015,BRB,6.064 +2015,BLR,6.061 +2015,BEL,8.992 +2015,BLZ,1.782 +2015,BEN,0.487 +2015,BMU,8.527 +2015,BTN,1.421 +2015,BOL,1.793 +2015,BES,4.107 +2015,BIH,5.238 +2015,BWA,2.352 +2015,BRA,2.58 +2015,VGB,7.728 +2015,BRN,16.451 +2015,BGR,6.584 +2015,BFA,0.198 +2015,BDI,0.033 +2015,KHM,0.543 +2015,CMR,0.428 +2015,CAN,15.971 +2015,CPV,0.889 +2015,CALF,0.037 +2015,TCD,0.166 +2015,CHL,4.576 +2015,CHN,7.08 +2015,CXR,0 +2015,COL,2.054 +2015,COM,0.246 +2015,COG,1.112 +2015,COK,4.549 +2015,CRI,1.513 +2015,CIV,0.405 +2015,HRV,4.189 +2015,CUB,2.599 +2015,CUW,43.211 +2015,CYP,5.872 +2015,CZE,9.979 +2015,COD,0.042 +2015,DNK,6.184 +2015,DJI,0.429 +2015,DMA,2.511 +2015,DOM,2.258 +2015,TLS,0.489 +2015,ECU,2.549 +2015,EGY,2.297 +2015,SLV,1.07 +2015,GNQ,5.222 +2015,ERI,0.166 +2015,EST,12.037 +2015,SWZ,0.766 +2015,ETH,0.124 +2015,FRO,12.451 +2015,FJI,1.439 +2015,FIN,8.064 +2015,FRA,5.194 +2015,PYF,2.901 +2015,GAB,3.192 +2015,GMB,0.259 +2015,GEO,2.587 +2015,DEU,9.724 +2015,GHA,0.505 +2015,GRC,6.933 +2015,GRL,9.402 +2015,GRD,2.186 +2015,GTM,0.997 +2015,GIN,0.211 +2015,GNB,0.156 +2015,GUY,2.653 +2015,HTI,0.252 +2015,HND,1.113 +2015,HKG,5.73 +2015,HUN,4.746 +2015,ISL,10.704 +2015,IND,1.689 +2015,IDN,2.081 +2015,IRN,7.722 +2015,IRQ,3.76 +2015,IRL,8.298 +2015,ISR,7.86 +2015,ITA,6.009 +2015,JAM,2.862 +2015,JPN,9.612 +2015,JOR,2.691 +2015,KAZ,15.624 +2015,KEN,0.363 +2015,KIR,0.471 +2015,KWT,23.962 +2015,KGZ,1.735 +2015,LAO,1.36 +2015,LVA,3.646 +2015,LBN,4.022 +2015,ALSO,1.058 +2015,LBR,0.101 +2015,LBY,8.81 +2015,LIE,4.275 +2015,LTU,4.405 +2015,LUX,16.422 +2015,MAC,2.876 +2015,MDG,0.13 +2015,MWI,0.064 +2015,MYS,7.58 +2015,MDV,2.936 +2015,MLI,0.181 +2015,MLT,3.647 +2015,MHL,2.891 +2015,MRT,0.761 +2015,MUS,3.256 +2015,MEX,3.991 +2015,FSM,1.305 +2015,MDA,1.459 +2015,MCO,0 +2015,MNG,7.853 +2015,MNE,3.531 +2015,MSR,10.813 +2015,MAR,1.687 +2015,MOZ,0.251 +2015,MMR,0.425 +2015,NAME,1.687 +2015,NRU,4.904 +2015,NPL,0.25 +2015,NLD,9.612 +2015,NCL,17.23 +2015,NZL,7.801 +2015,NIC,0.862 +2015,NER,0.11 +2015,NGA,0.594 +2015,NIU,3.917 +2015,PRK,0.975 +2015,MKD,3.205 +2015,NOR,8.765 +2015,OMN,16.073 +2015,PAK,0.789 +2015,PLW,11.513 +2015,PSE,0.67 +2015,PAN,2.726 +2015,PNG,0.765 +2015,PRY,0.979 +2015,PER,1.603 +2015,PHL,1.091 +2015,POL,8.111 +2015,PRT,5.036 +2015,QAT,37.768 +2015,ROU,3.92 +2015,RUS,11.327 +2015,RWA,0.083 +2015,SHN,1.991 +2015,KNA,4.904 +2015,LCA,2.733 +2015,SPM,10.99 +2015,VCT,2.202 +2015,WSM,1.116 +2015,SMR,0 +2015,STP,0.674 +2015,SAU,20.728 +2015,SEN,0.686 +2015,SRB,5.821 +2015,SYC,5.02 +2015,SLE,0.148 +2015,SGP,10.96 +2015,SXM,18.489 +2015,SVK,6.355 +2015,SVN,6.558 +2015,SLB,0.478 +2015,SOME,0.046 +2015,ZAF,7.986 +2015,KOR,12.436 +2015,SSD,0.171 +2015,ESP,5.832 +2015,LKA,0.923 +2015,SDN,0.555 +2015,SURE,4.715 +2015,SWE,4.408 +2015,CHE,4.676 +2015,SYR,1.489 +2015,TWN,11.733 +2015,TJK,0.622 +2015,TZA,0.185 +2015,THA,3.942 +2015,TGO,0.249 +2015,TON,1.105 +2015,TO,31.201 +2015,TUN,2.718 +2015,TUR,4.833 +2015,TKM,11.155 +2015,TCA,8.52 +2015,TUV,1.009 +2015,UGA,0.121 +2015,UKR,4.975 +2015,ARE,25.31 +2015,GBR,6.477 +2015,USA,16.563 +2015,URY,1.981 +2015,UZB,3.35 +2015,VUT,0.49 +2015,VAT,0 +2015,VEN,5.433 +2015,VNM,2.337 +2015,WLF,1.801 +2015,YEM,0.494 +2015,ZMB,0.312 +2015,ZWE,0.866 +2016,AFG,0.262 +2016,,4.72 +2016,ALB,1.608 +2016,DZA,3.929 +2016,AND,6.463 +2016,AGO,0.823 +2016,AIA,9.381 +2016,ATA,0 +2016,ATG,6.594 +2016,ARG,4.349 +2016,ARM,1.816 +2016,ABW,8.419 +2016,AUS,16.956 +2016,AUT,7.695 +2016,AZE,3.481 +2016,BHS,5.579 +2016,BHR,22.388 +2016,BGD,0.477 +2016,BRB,6.078 +2016,BLR,5.988 +2016,BEL,8.803 +2016,BLZ,1.706 +2016,BEN,0.577 +2016,BMU,9.815 +2016,BTN,1.682 +2016,BOL,1.886 +2016,BES,4.312 +2016,BIH,6.243 +2016,BWA,2.699 +2016,BRA,2.382 +2016,VGB,7.756 +2016,BRN,17.918 +2016,BGR,6.257 +2016,BFA,0.203 +2016,BDI,0.039 +2016,KHM,0.699 +2016,CMR,0.42 +2016,CAN,15.443 +2016,CPV,0.886 +2016,CALF,0.04 +2016,TCD,0.163 +2016,CHL,4.659 +2016,CHN,6.966 +2016,CXR,0 +2016,COL,2.093 +2016,COM,0.29 +2016,COG,1.105 +2016,COK,4.17 +2016,CRI,1.589 +2016,CIV,0.495 +2016,HRV,4.287 +2016,CUB,2.484 +2016,CUW,36.264 +2016,CYP,6.156 +2016,CZE,10.133 +2016,COD,0.031 +2016,DNK,6.469 +2016,DJI,0.371 +2016,DMA,2.457 +2016,DOM,2.341 +2016,TLS,0.525 +2016,ECU,2.394 +2016,EGY,2.399 +2016,SLV,1.055 +2016,GNQ,5.403 +2016,ERI,0.166 +2016,EST,13.29 +2016,SWZ,0.924 +2016,ETH,0.137 +2016,FRO,12.726 +2016,FJI,1.372 +2016,FIN,8.598 +2016,FRA,5.22 +2016,PYF,2.958 +2016,GAB,3.126 +2016,GMB,0.255 +2016,GEO,2.67 +2016,DEU,9.738 +2016,GHA,0.471 +2016,GRC,6.638 +2016,GRL,9.413 +2016,GRD,2.229 +2016,GTM,1.039 +2016,GIN,0.23 +2016,GNB,0.166 +2016,GUY,3.128 +2016,HTI,0.278 +2016,HND,1.028 +2016,HKG,5.832 +2016,HUN,4.807 +2016,ISL,10.413 +2016,IND,1.759 +2016,IDN,2.063 +2016,IRN,7.608 +2016,IRQ,4.106 +2016,IRL,8.561 +2016,ISR,7.496 +2016,ITA,5.968 +2016,JAM,2.913 +2016,JPN,9.469 +2016,JOR,2.479 +2016,KAZ,15.361 +2016,KEN,0.379 +2016,KIR,0.464 +2016,KWT,26.957 +2016,KGZ,1.599 +2016,LAO,2.388 +2016,LVA,3.654 +2016,LBN,4.225 +2016,ALSO,1.032 +2016,LBR,0.106 +2016,LBY,8.222 +2016,LIE,3.982 +2016,LTU,4.473 +2016,LUX,15.589 +2016,MAC,2.841 +2016,MDG,0.128 +2016,MWI,0.069 +2016,MYS,7.512 +2016,MDV,3.162 +2016,MLI,0.226 +2016,MLT,2.9 +2016,MHL,2.955 +2016,MRT,0.648 +2016,MUS,3.358 +2016,MEX,3.948 +2016,FSM,1.3 +2016,MDA,1.52 +2016,MCO,0 +2016,MNG,8.46 +2016,MNE,3.182 +2016,MSR,5.738 +2016,MAR,1.665 +2016,MOZ,0.309 +2016,MMR,0.407 +2016,NAME,1.744 +2016,NRU,4.475 +2016,NPL,0.362 +2016,NLD,9.617 +2016,NCL,19.319 +2016,NZL,7.316 +2016,NIC,0.846 +2016,NER,0.103 +2016,NGA,0.62 +2016,NIU,3.892 +2016,PRK,1.086 +2016,MKD,3.153 +2016,NOR,8.532 +2016,OMN,14.947 +2016,PAK,0.917 +2016,PLW,11.912 +2016,PSE,0.704 +2016,PAN,2.593 +2016,PNG,0.791 +2016,PRY,1.148 +2016,PER,1.694 +2016,PHL,1.161 +2016,POL,8.397 +2016,PRT,4.874 +2016,QAT,33.672 +2016,ROU,3.875 +2016,RUS,11.267 +2016,RWA,0.088 +2016,SHN,2.649 +2016,KNA,4.981 +2016,LCA,2.7 +2016,SPM,11.01 +2016,VCT,2.282 +2016,WSM,1.159 +2016,SMR,0 +2016,STP,0.734 +2016,SAU,20.871 +2016,SEN,0.679 +2016,SRB,6.011 +2016,SYC,5.504 +2016,SLE,0.152 +2016,SGP,7.054 +2016,SXM,17.981 +2016,SVK,6.428 +2016,SVN,6.918 +2016,SLB,0.461 +2016,SOME,0.045 +2016,ZAF,8.099 +2016,KOR,12.433 +2016,SSD,0.154 +2016,ESP,5.587 +2016,LKA,1.073 +2016,SDN,0.509 +2016,SURE,5.023 +2016,SWE,4.362 +2016,CHE,4.679 +2016,SYR,1.42 +2016,TWN,11.856 +2016,TJK,0.652 +2016,TZA,0.188 +2016,THA,4.023 +2016,TGO,0.302 +2016,TON,1.178 +2016,TO,27.15 +2016,TUN,2.618 +2016,TUR,5.011 +2016,TKM,10.982 +2016,TCA,8.617 +2016,TUV,1.011 +2016,UGA,0.124 +2016,UKR,5.218 +2016,ARE,25.194 +2016,GBR,6.084 +2016,USA,16.054 +2016,URY,1.91 +2016,UZB,3.502 +2016,VUT,0.53 +2016,VAT,0 +2016,VEN,4.957 +2016,VNM,2.397 +2016,WLF,2.122 +2016,YEM,0.342 +2016,ZMB,0.35 +2016,ZWE,0.729 +2017,AFG,0.277 +2017,,4.74 +2017,ALB,1.838 +2017,DZA,4.013 +2017,AND,6.301 +2017,AGO,0.749 +2017,AIA,8.527 +2017,ATA,0 +2017,ATG,6.634 +2017,ARG,4.242 +2017,ARM,1.943 +2017,ABW,8.443 +2017,AUS,16.822 +2017,AUT,7.912 +2017,AZE,3.436 +2017,BHS,6.29 +2017,BHR,22.539 +2017,BGD,0.499 +2017,BRB,5.89 +2017,BLR,6.117 +2017,BEL,8.701 +2017,BLZ,1.643 +2017,BEN,0.587 +2017,BMU,10.015 +2017,BTN,1.774 +2017,BOL,1.939 +2017,BES,4.206 +2017,BIH,6.441 +2017,BWA,2.947 +2017,BRA,2.384 +2017,VGB,5.968 +2017,BRN,21.635 +2017,BGR,6.604 +2017,BFA,0.228 +2017,BDI,0.046 +2017,KHM,0.788 +2017,CMR,0.393 +2017,CAN,15.502 +2017,CPV,0.901 +2017,CALF,0.043 +2017,TCD,0.155 +2017,CHL,4.581 +2017,CHN,7.099 +2017,CXR,0 +2017,COL,1.908 +2017,COM,0.351 +2017,COG,1.064 +2017,COK,4.628 +2017,CRI,1.608 +2017,CIV,0.483 +2017,HRV,4.471 +2017,CUB,2.201 +2017,CUW,28.942 +2017,CYP,6.209 +2017,CZE,10.234 +2017,COD,0.037 +2017,DNK,6.042 +2017,DJI,0.377 +2017,DMA,2.185 +2017,DOM,2.256 +2017,TLS,0.555 +2017,ECU,2.346 +2017,EGY,2.555 +2017,SLV,0.953 +2017,GNQ,5.42 +2017,ERI,0.164 +2017,EST,14.222 +2017,SWZ,0.856 +2017,ETH,0.144 +2017,FRO,14.07 +2017,FJI,1.482 +2017,FIN,8.107 +2017,FRA,5.252 +2017,PYF,2.914 +2017,GAB,2.747 +2017,GMB,0.249 +2017,GEO,2.697 +2017,DEU,9.513 +2017,GHA,0.412 +2017,GRC,7.0 +2017,GRL,9.72 +2017,GRD,2.303 +2017,GTM,1.045 +2017,GIN,0.265 +2017,GNB,0.162 +2017,GUY,3.049 +2017,HTI,0.289 +2017,HND,1.063 +2017,HKG,5.687 +2017,HUN,5.065 +2017,ISL,10.512 +2017,IND,1.792 +2017,IDN,2.106 +2017,IRN,8.111 +2017,IRQ,4.466 +2017,IRL,8.189 +2017,ISR,7.081 +2017,ITA,5.89 +2017,JAM,2.777 +2017,JPN,9.37 +2017,JOR,2.527 +2017,KAZ,16.024 +2017,KEN,0.362 +2017,KIR,0.548 +2017,KWT,25.046 +2017,KGZ,1.529 +2017,LAO,2.813 +2017,LVA,3.691 +2017,LBN,4.554 +2017,ALSO,1.158 +2017,LBR,0.186 +2017,LBY,8.378 +2017,LIE,4.108 +2017,LTU,4.574 +2017,LUX,15.543 +2017,MAC,3.018 +2017,MDG,0.157 +2017,MWI,0.069 +2017,MYS,7.634 +2017,MDV,3.203 +2017,MLI,0.241 +2017,MLT,3.193 +2017,MHL,3.105 +2017,MRT,0.822 +2017,MUS,3.503 +2017,MEX,3.79 +2017,FSM,1.294 +2017,MDA,1.641 +2017,MCO,0 +2017,MNG,11.026 +2017,MNE,3.325 +2017,MSR,6.206 +2017,MAR,1.72 +2017,MOZ,0.242 +2017,MMR,0.452 +2017,NAME,1.783 +2017,NRU,4.694 +2017,NPL,0.441 +2017,NLD,9.426 +2017,NCL,19.636 +2017,NZL,7.519 +2017,NIC,0.843 +2017,NER,0.103 +2017,NGA,0.583 +2017,NIU,3.875 +2017,PRK,2.028 +2017,MKD,3.386 +2017,NOR,8.369 +2017,OMN,15.243 +2017,PAK,0.999 +2017,PLW,12.106 +2017,PSE,0.695 +2017,PAN,2.74 +2017,PNG,0.731 +2017,PRY,1.248 +2017,PER,1.736 +2017,PHL,1.266 +2017,POL,8.74 +2017,PRT,5.346 +2017,QAT,36.917 +2017,ROU,4.043 +2017,RUS,11.455 +2017,RWA,0.094 +2017,SHN,1.991 +2017,KNA,5.058 +2017,LCA,2.771 +2017,SPM,11.029 +2017,VCT,2.048 +2017,WSM,1.182 +2017,SMR,0 +2017,STP,0.669 +2017,SAU,19.912 +2017,SEN,0.71 +2017,SRB,6.099 +2017,SYC,5.649 +2017,SLE,0.142 +2017,SGP,6.942 +2017,SXM,16.877 +2017,SVK,6.639 +2017,SVN,6.966 +2017,SLB,0.444 +2017,SOME,0.043 +2017,ZAF,7.757 +2017,KOR,12.707 +2017,SSD,0.136 +2017,ESP,5.873 +2017,LKA,1.064 +2017,SDN,0.504 +2017,SURE,4.13 +2017,SWE,4.221 +2017,CHE,4.517 +2017,SYR,1.498 +2017,TWN,12.054 +2017,TJK,0.768 +2017,TZA,0.2 +2017,THA,3.997 +2017,TGO,0.254 +2017,TON,1.286 +2017,TO,27.267 +2017,TUN,2.648 +2017,TUR,5.249 +2017,TKM,10.783 +2017,TCA,8.823 +2017,TUV,1.013 +2017,UGA,0.134 +2017,UKR,4.995 +2017,ARE,23.432 +2017,GBR,5.863 +2017,USA,15.804 +2017,URY,1.801 +2017,UZB,3.41 +2017,VUT,0.492 +2017,VAT,0 +2017,VEN,4.523 +2017,VNM,2.442 +2017,WLF,2.144 +2017,YEM,0.323 +2017,ZMB,0.396 +2017,ZWE,0.63 +2018,AFG,0.295 +2018,,4.785 +2018,ALB,1.701 +2018,DZA,4.085 +2018,AND,6.592 +2018,AGO,0.685 +2018,AIA,8.677 +2018,ATA,0 +2018,ATG,6.717 +2018,ARG,4.066 +2018,ARM,2.054 +2018,ABW,8.228 +2018,AUS,16.628 +2018,AUT,7.53 +2018,AZE,3.406 +2018,BHS,6.026 +2018,BHR,21.943 +2018,BGD,0.504 +2018,BRB,5.919 +2018,BLR,6.411 +2018,BEL,8.732 +2018,BLZ,1.582 +2018,BEN,0.623 +2018,BMU,10.947 +2018,BTN,1.939 +2018,BOL,1.939 +2018,BES,3.958 +2018,BIH,6.492 +2018,BWA,3.061 +2018,BRA,2.274 +2018,VGB,5.31 +2018,BRN,21.517 +2018,BGR,6.109 +2018,BFA,0.246 +2018,BDI,0.056 +2018,KHM,0.869 +2018,CMR,0.385 +2018,CAN,15.582 +2018,CPV,0.943 +2018,CALF,0.043 +2018,TCD,0.153 +2018,CHL,4.515 +2018,CHN,7.307 +2018,CXR,0 +2018,COL,1.768 +2018,COM,0.378 +2018,COG,1.203 +2018,COK,4.666 +2018,CRI,1.59 +2018,CIV,0.406 +2018,HRV,4.26 +2018,CUB,2.042 +2018,CUW,23.345 +2018,CYP,6.007 +2018,CZE,10.096 +2018,COD,0.039 +2018,DNK,6.002 +2018,DJI,0.411 +2018,DMA,2.276 +2018,DOM,2.392 +2018,TLS,0.489 +2018,ECU,2.258 +2018,EGY,2.351 +2018,SLV,0.998 +2018,GNQ,4.0 +2018,ERI,0.181 +2018,EST,13.527 +2018,SWZ,0.89 +2018,ETH,0.144 +2018,FRO,14.231 +2018,FJI,1.534 +2018,FIN,8.291 +2018,FRA,5.011 +2018,PYF,2.942 +2018,GAB,2.497 +2018,GMB,0.265 +2018,GEO,2.667 +2018,DEU,9.105 +2018,GHA,0.492 +2018,GRC,6.751 +2018,GRL,9.734 +2018,GRD,2.526 +2018,GTM,1.098 +2018,GIN,0.252 +2018,GNB,0.162 +2018,GUY,3.186 +2018,HTI,0.31 +2018,HND,1.007 +2018,HKG,5.694 +2018,HUN,5.067 +2018,ISL,10.395 +2018,IND,1.894 +2018,IDN,2.225 +2018,IRN,8.295 +2018,IRQ,4.527 +2018,IRL,8.07 +2018,ISR,7.093 +2018,ITA,5.842 +2018,JAM,2.876 +2018,JPN,9.043 +2018,JOR,2.404 +2018,KAZ,16.57 +2018,KEN,0.377 +2018,KIR,0.539 +2018,KWT,24.448 +2018,KGZ,1.795 +2018,LAO,2.893 +2018,LVA,4.062 +2018,LBN,4.396 +2018,ALSO,1.079 +2018,LBR,0.086 +2018,LBY,8.339 +2018,LIE,3.742 +2018,LTU,4.671 +2018,LUX,15.749 +2018,MAC,1.908 +2018,MDG,0.141 +2018,MWI,0.094 +2018,MYS,8.093 +2018,MDV,3.553 +2018,MLI,0.246 +2018,MLT,3.146 +2018,MHL,3.185 +2018,MRT,0.858 +2018,MUS,3.442 +2018,MEX,3.792 +2018,FSM,1.288 +2018,MDA,1.733 +2018,MCO,0 +2018,MNG,14.322 +2018,MNE,3.801 +2018,MSR,6.691 +2018,MAR,1.734 +2018,MOZ,0.238 +2018,MMR,0.646 +2018,NAME,1.727 +2018,NRU,4.6 +2018,NPL,0.519 +2018,NLD,9.148 +2018,NCL,20.756 +2018,NZL,7.379 +2018,NIC,0.791 +2018,NER,0.08 +2018,NGA,0.532 +2018,NIU,5.764 +2018,PRK,1.858 +2018,MKD,3.157 +2018,NOR,8.359 +2018,OMN,14.374 +2018,PAK,0.933 +2018,PLW,11.881 +2018,PSE,0.616 +2018,PAN,2.582 +2018,PNG,0.815 +2018,PRY,1.304 +2018,PER,1.734 +2018,PHL,1.303 +2018,POL,8.725 +2018,PRT,4.993 +2018,QAT,34.504 +2018,ROU,4.094 +2018,RUS,11.757 +2018,RWA,0.103 +2018,SHN,2.001 +2018,KNA,5.137 +2018,LCA,2.863 +2018,SPM,9.821 +2018,VCT,2.297 +2018,WSM,1.136 +2018,SMR,0 +2018,STP,0.659 +2018,SAU,19.615 +2018,SEN,0.727 +2018,SRB,5.962 +2018,SYC,5.827 +2018,SLE,0.131 +2018,SGP,8.605 +2018,SXM,16.297 +2018,SVK,6.629 +2018,SVN,6.895 +2018,SLB,0.439 +2018,SOME,0.041 +2018,ZAF,7.591 +2018,KOR,12.968 +2018,SSD,0.167 +2018,ESP,5.74 +2018,LKA,0.931 +2018,SDN,0.518 +2018,SURE,3.519 +2018,SWE,4.137 +2018,CHE,4.33 +2018,SYR,1.677 +2018,TWN,11.945 +2018,TJK,0.883 +2018,TZA,0.204 +2018,THA,4.054 +2018,TGO,0.269 +2018,TON,1.289 +2018,TO,26.801 +2018,TUN,2.609 +2018,TUR,5.097 +2018,TKM,10.513 +2018,TCA,8.737 +2018,TUV,1.01 +2018,UGA,0.133 +2018,UKR,5.212 +2018,ARE,22.897 +2018,GBR,5.716 +2018,USA,16.191 +2018,URY,1.917 +2018,UZB,3.152 +2018,VUT,0.604 +2018,VAT,0 +2018,VEN,3.377 +2018,VNM,2.715 +2018,WLF,2.166 +2018,YEM,0.376 +2018,ZMB,0.416 +2018,ZWE,0.712 +2019,AFG,0.293 +2019,,4.77 +2019,ALB,1.68 +2019,DZA,4.182 +2019,AND,6.334 +2019,AGO,0.594 +2019,AIA,9.512 +2019,ATA,0 +2019,ATG,6.96 +2019,ARG,3.989 +2019,ARM,2.228 +2019,ABW,8.363 +2019,AUS,16.398 +2019,AUT,7.653 +2019,AZE,3.688 +2019,BHS,6.068 +2019,BHR,25.153 +2019,BGD,0.609 +2019,BRB,5.948 +2019,BLR,6.419 +2019,BEL,8.642 +2019,BLZ,1.817 +2019,BEN,0.579 +2019,BMU,9.299 +2019,BTN,1.901 +2019,BOL,1.919 +2019,BES,4.294 +2019,BIH,6.192 +2019,BWA,2.713 +2019,BRA,2.236 +2019,VGB,5.383 +2019,BRN,24.501 +2019,BGR,5.988 +2019,BFA,0.263 +2019,BDI,0.058 +2019,KHM,1.124 +2019,CMR,0.372 +2019,CAN,15.42 +2019,CPV,0.972 +2019,CALF,0.044 +2019,TCD,0.143 +2019,CHL,4.831 +2019,CHN,7.54 +2019,CXR,0 +2019,COL,1.883 +2019,COM,0.394 +2019,COG,1.309 +2019,COK,4.919 +2019,CRI,1.514 +2019,CIV,0.403 +2019,HRV,4.324 +2019,CUB,1.999 +2019,CUW,11.611 +2019,CYP,5.975 +2019,CZE,9.588 +2019,COD,0.04 +2019,DNK,5.34 +2019,DJI,0.418 +2019,DMA,2.41 +2019,DOM,2.608 +2019,TLS,0.527 +2019,ECU,2.31 +2019,EGY,2.425 +2019,SLV,1.202 +2019,GNQ,2.986 +2019,ERI,0.185 +2019,EST,9.287 +2019,SWZ,0.959 +2019,ETH,0.146 +2019,FRO,14.314 +2019,FJI,1.533 +2019,FIN,7.689 +2019,FRA,4.898 +2019,PYF,2.922 +2019,GAB,2.419 +2019,GMB,0.283 +2019,GEO,2.887 +2019,DEU,8.509 +2019,GHA,0.521 +2019,GRC,6.219 +2019,GRL,9.926 +2019,GRD,2.687 +2019,GTM,1.14 +2019,GIN,0.304 +2019,GNB,0.164 +2019,GUY,3.45 +2019,HTI,0.277 +2019,HND,1.127 +2019,HKG,5.59 +2019,HUN,5.046 +2019,ISL,9.864 +2019,IND,1.889 +2019,IDN,2.414 +2019,IRN,8.025 +2019,IRQ,4.562 +2019,IRL,7.624 +2019,ISR,6.815 +2019,ITA,5.699 +2019,JAM,2.78 +2019,JPN,8.781 +2019,JOR,2.311 +2019,KAZ,14.679 +2019,KEN,0.389 +2019,KIR,0.531 +2019,KWT,24.519 +2019,KGZ,1.431 +2019,LAO,2.709 +2019,LVA,3.992 +2019,LBN,4.438 +2019,ALSO,1.073 +2019,LBR,0.205 +2019,LBY,10.736 +2019,LIE,3.871 +2019,LTU,4.801 +2019,LUX,15.758 +2019,MAC,1.827 +2019,MDG,0.155 +2019,MWI,0.087 +2019,MYS,8.154 +2019,MDV,3.871 +2019,MLI,0.284 +2019,MLT,3.274 +2019,MHL,3.275 +2019,MRT,0.861 +2019,MUS,3.488 +2019,MEX,3.744 +2019,FSM,1.316 +2019,MDA,1.767 +2019,MCO,0 +2019,MNG,14.619 +2019,MNE,3.929 +2019,MSR,4.855 +2019,MAR,1.894 +2019,MOZ,0.234 +2019,MMR,0.634 +2019,NAME,1.68 +2019,NRU,4.521 +2019,NPL,0.471 +2019,NLD,8.783 +2019,NCL,19.879 +2019,NZL,7.437 +2019,NIC,0.784 +2019,NER,0.107 +2019,NGA,0.626 +2019,NIU,3.771 +2019,PRK,2.049 +2019,MKD,3.617 +2019,NOR,8.001 +2019,OMN,12.867 +2019,PAK,0.923 +2019,PLW,12.255 +2019,PSE,0.665 +2019,PAN,3.161 +2019,PNG,0.819 +2019,PRY,1.246 +2019,PER,1.778 +2019,PHL,1.306 +2019,POL,8.253 +2019,PRT,4.616 +2019,QAT,35.985 +2019,ROU,3.938 +2019,RUS,11.699 +2019,RWA,0.107 +2019,SHN,2.679 +2019,KNA,5.296 +2019,LCA,2.811 +2019,SPM,11.081 +2019,VCT,2.165 +2019,WSM,1.279 +2019,SMR,0 +2019,STP,0.666 +2019,SAU,19.737 +2019,SEN,0.795 +2019,SRB,5.983 +2019,SYC,5.686 +2019,SLE,0.125 +2019,SGP,5.758 +2019,SXM,16.019 +2019,SVK,6.193 +2019,SVN,6.645 +2019,SLB,0.434 +2019,SOME,0.04 +2019,ZAF,8.013 +2019,KOR,12.472 +2019,SSD,0.17 +2019,ESP,5.318 +2019,LKA,0.981 +2019,SDN,0.504 +2019,SURE,4.391 +2019,SWE,3.994 +2019,CHE,4.283 +2019,SYR,1.427 +2019,TWN,11.521 +2019,TJK,0.949 +2019,TZA,0.23 +2019,THA,3.953 +2019,TGO,0.293 +2019,TON,1.536 +2019,TO,26.832 +2019,TUN,2.519 +2019,TUR,4.824 +2019,TKM,10.607 +2019,TCA,8.415 +2019,TUV,1.001 +2019,UGA,0.133 +2019,UKR,5.02 +2019,ARE,23.835 +2019,GBR,5.462 +2019,USA,15.74 +2019,URY,1.893 +2019,UZB,3.288 +2019,VUT,0.542 +2019,VAT,0 +2019,VEN,3.024 +2019,VNM,3.569 +2019,WLF,2.186 +2019,YEM,0.375 +2019,ZMB,0.422 +2019,ZWE,0.637 +2020,AFG,0.305 +2020,,4.465 +2020,ALB,1.751 +2020,DZA,3.91 +2020,AND,4.808 +2020,AGO,0.502 +2020,AIA,9.153 +2020,ATA,0 +2020,ATG,6.682 +2020,ARG,3.705 +2020,ARM,2.423 +2020,ABW,8.353 +2020,AUS,15.453 +2020,AUT,6.974 +2020,AZE,3.515 +2020,BHS,5.372 +2020,BHR,25.311 +2020,BGD,0.559 +2020,BRB,4.394 +2020,BLR,6.13 +2020,BEL,7.88 +2020,BLZ,1.553 +2020,BEN,0.613 +2020,BMU,7.151 +2020,BTN,1.191 +2020,BOL,1.535 +2020,BES,4.339 +2020,BIH,6.278 +2020,BWA,2.18 +2020,BRA,2.085 +2020,VGB,5.212 +2020,BRN,25.132 +2020,BGR,5.235 +2020,BFA,0.241 +2020,BDI,0.06 +2020,KHM,1.161 +2020,CMR,0.366 +2020,CAN,13.8 +2020,CPV,0.887 +2020,CALF,0.045 +2020,TCD,0.137 +2020,CHL,4.154 +2020,CHN,7.659 +2020,CXR,0 +2020,COL,1.762 +2020,COM,0.473 +2020,COG,1.296 +2020,COK,3.868 +2020,CRI,1.32 +2020,CIV,0.411 +2020,HRV,4.118 +2020,CUB,1.883 +2020,CUW,9.542 +2020,CYP,5.584 +2020,CZE,8.707 +2020,COD,0.04 +2020,DNK,4.858 +2020,DJI,0.351 +2020,DMA,2.188 +2020,DOM,2.137 +2020,TLS,0.497 +2020,ECU,1.871 +2020,EGY,2.118 +2020,SLV,1.048 +2020,GNQ,3.462 +2020,ERI,0.18 +2020,EST,6.949 +2020,SWZ,0.925 +2020,ETH,0.152 +2020,FRO,14.463 +2020,FJI,1.131 +2020,FIN,6.824 +2020,FRA,4.366 +2020,PYF,2.803 +2020,GAB,2.586 +2020,GMB,0.272 +2020,GEO,2.808 +2020,DEU,7.767 +2020,GHA,0.596 +2020,GRC,5.291 +2020,GRL,9.584 +2020,GRD,2.341 +2020,GTM,0.999 +2020,GIN,0.341 +2020,GNB,0.147 +2020,GUY,3.999 +2020,HTI,0.222 +2020,HND,0.941 +2020,HKG,4.466 +2020,HUN,4.855 +2020,ISL,9.108 +2020,IND,1.734 +2020,IDN,2.229 +2020,IRN,7.779 +2020,IRQ,3.756 +2020,IRL,7.101 +2020,ISR,6.36 +2020,ITA,5.097 +2020,JAM,2.291 +2020,JPN,8.302 +2020,JOR,1.933 +2020,KAZ,13.461 +2020,KEN,0.423 +2020,KIR,0.521 +2020,KWT,22.409 +2020,KGZ,1.299 +2020,LAO,2.688 +2020,LVA,3.69 +2020,LBN,3.934 +2020,ALSO,0.964 +2020,LBR,0.151 +2020,LBY,7.074 +2020,LIE,3.66 +2020,LTU,4.8 +2020,LUX,12.798 +2020,MAC,1.528 +2020,MDG,0.14 +2020,MWI,0.097 +2020,MYS,8.11 +2020,MDV,3.205 +2020,MLI,0.302 +2020,MLT,3.099 +2020,MHL,3.374 +2020,MRT,0.915 +2020,MUS,2.933 +2020,MEX,3.51 +2020,FSM,1.307 +2020,MDA,1.699 +2020,MCO,0 +2020,MNG,11.255 +2020,MNE,3.827 +2020,MSR,4.857 +2020,MAR,1.76 +2020,MOZ,0.205 +2020,MMR,0.648 +2020,NAME,1.479 +2020,NRU,4.157 +2020,NPL,0.508 +2020,NLD,7.84 +2020,NCL,17.839 +2020,NZL,6.765 +2020,NIC,0.703 +2020,NER,0.116 +2020,NGA,0.594 +2020,NIU,3.733 +2020,PRK,1.926 +2020,MKD,3.294 +2020,NOR,7.664 +2020,OMN,14.401 +2020,PAK,0.883 +2020,PLW,11.807 +2020,PSE,0.663 +2020,PAN,2.404 +2020,PNG,0.792 +2020,PRY,1.113 +2020,PER,1.41 +2020,PHL,1.184 +2020,POL,7.87 +2020,PRT,4.049 +2020,QAT,37.133 +2020,ROU,3.808 +2020,RUS,11.214 +2020,RWA,0.104 +2020,SHN,3.363 +2020,KNA,4.843 +2020,LCA,2.698 +2020,SPM,10.504 +2020,VCT,2.346 +2020,WSM,1.125 +2020,SMR,0 +2020,STP,0.637 +2020,SAU,16.967 +2020,SEN,0.658 +2020,SRB,6.139 +2020,SYC,5.763 +2020,SLE,0.125 +2020,SGP,9.275 +2020,SXM,14.946 +2020,SVK,5.699 +2020,SVN,6.07 +2020,SLB,0.419 +2020,SOME,0.036 +2020,ZAF,7.395 +2020,KOR,11.527 +2020,SSD,0.16 +2020,ESP,4.51 +2020,LKA,0.95 +2020,SDN,0.462 +2020,SURE,4.807 +2020,SWE,3.538 +2020,CHE,3.963 +2020,SYR,1.267 +2020,TWN,11.409 +2020,TJK,0.974 +2020,TZA,0.23 +2020,THA,3.803 +2020,TGO,0.282 +2020,TON,1.74 +2020,TO,23.074 +2020,TUN,2.343 +2020,TUR,4.908 +2020,TKM,10.831 +2020,TCA,8.106 +2020,TUV,0.991 +2020,UGA,0.125 +2020,UKR,4.71 +2020,ARE,23.34 +2020,GBR,4.865 +2020,USA,14.034 +2020,URY,1.889 +2020,UZB,3.27 +2020,VUT,0.647 +2020,VAT,0 +2020,VEN,2.175 +2020,VNM,3.759 +2020,WLF,2.196 +2020,YEM,0.337 +2020,ZMB,0.43 +2020,ZWE,0.501 +2021,AFG,0.306 +2021,,4.655 +2021,ALB,1.718 +2021,DZA,4.08 +2021,AND,4.592 +2021,AGO,0.507 +2021,AIA,8.727 +2021,ATA,0 +2021,ATG,6.4 +2021,ARG,4.191 +2021,ARM,2.531 +2021,ABW,8.053 +2021,AUS,14.915 +2021,AUT,7.399 +2021,AZE,3.717 +2021,BHS,5.15 +2021,BHR,26.053 +2021,BGD,0.583 +2021,BRB,4.361 +2021,BLR,6.362 +2021,BEL,8.239 +2021,BLZ,1.755 +2021,BEN,0.64 +2021,BMU,6.873 +2021,BTN,1.366 +2021,BOL,1.799 +2021,BES,4.095 +2021,BIH,6.095 +2021,BWA,2.371 +2021,BRA,2.32 +2021,VGB,4.988 +2021,BRN,25.376 +2021,BGR,6.14 +2021,BFA,0.266 +2021,BDI,0.064 +2021,KHM,1.213 +2021,CMR,0.379 +2021,CAN,14.079 +2021,CPV,0.951 +2021,CALF,0.046 +2021,TCD,0.144 +2021,CHL,4.568 +2021,CHN,7.95 +2021,CXR,0 +2021,COL,1.859 +2021,COM,0.505 +2021,COG,1.243 +2021,COK,4.042 +2021,CRI,1.485 +2021,CIV,0.427 +2021,HRV,4.288 +2021,CUB,1.86 +2021,CUW,9.145 +2021,CYP,5.65 +2021,CZE,9.197 +2021,COD,0.041 +2021,DNK,5.058 +2021,DJI,0.411 +2021,DMA,2.096 +2021,DOM,2.139 +2021,TLS,0.502 +2021,ECU,2.232 +2021,EGY,2.26 +2021,SLV,1.186 +2021,GNQ,3.444 +2021,ERI,0.193 +2021,EST,7.842 +2021,SWZ,0.949 +2021,ETH,0.157 +2021,FRO,13.924 +2021,FJI,1.174 +2021,FIN,6.855 +2021,FRA,4.754 +2021,PYF,2.905 +2021,GAB,2.512 +2021,GMB,0.287 +2021,GEO,2.942 +2021,DEU,8.138 +2021,GHA,0.639 +2021,GRC,5.51 +2021,GRL,10.072 +2021,GRD,2.647 +2021,GTM,1.118 +2021,GIN,0.36 +2021,GNB,0.156 +2021,GUY,4.43 +2021,HTI,0.212 +2021,HND,1.054 +2021,HKG,4.373 +2021,HUN,5.002 +2021,ISL,9.478 +2021,IND,1.9 +2021,IDN,2.25 +2021,IRN,7.826 +2021,IRQ,3.873 +2021,IRL,7.53 +2021,ISR,6.163 +2021,ITA,5.693 +2021,JAM,2.337 +2021,JPN,8.523 +2021,JOR,2.033 +2021,KAZ,13.291 +2021,KEN,0.461 +2021,KIR,0.534 +2021,KWT,24.301 +2021,KGZ,1.445 +2021,LAO,3.147 +2021,LVA,3.864 +2021,LBN,4.197 +2021,ALSO,1.087 +2021,LBR,0.167 +2021,LBY,9.491 +2021,LIE,3.735 +2021,LTU,4.963 +2021,LUX,13.185 +2021,MAC,1.557 +2021,MDG,0.148 +2021,MWI,0.104 +2021,MYS,8.306 +2021,MDV,3.299 +2021,MLI,0.316 +2021,MLT,3.05 +2021,MHL,3.635 +2021,MRT,0.965 +2021,MUS,3.149 +2021,MEX,3.7 +2021,FSM,1.352 +2021,MDA,1.828 +2021,MCO,0 +2021,MNG,11.427 +2021,MNE,3.671 +2021,MSR,4.773 +2021,MAR,1.959 +2021,MOZ,0.224 +2021,MMR,0.662 +2021,NAME,1.475 +2021,NRU,4.271 +2021,NPL,0.52 +2021,NLD,7.994 +2021,NCL,15.763 +2021,NZL,6.69 +2021,NIC,0.786 +2021,NER,0.12 +2021,NGA,0.614 +2021,NIU,3.908 +2021,PRK,1.977 +2021,MKD,3.656 +2021,NOR,7.594 +2021,OMN,15.677 +2021,PAK,0.966 +2021,PLW,12.285 +2021,PSE,0.668 +2021,PAN,2.691 +2021,PNG,0.799 +2021,PRY,1.382 +2021,PER,1.675 +2021,PHL,1.254 +2021,POL,8.643 +2021,PRT,3.881 +2021,QAT,39.884 +2021,ROU,3.994 +2021,RUS,11.798 +2021,RWA,0.115 +2021,SHN,3.252 +2021,KNA,4.67 +2021,LCA,2.594 +2021,SPM,10.165 +2021,VCT,2.267 +2021,WSM,1.153 +2021,SMR,0 +2021,STP,0.653 +2021,SAU,17.564 +2021,SEN,0.684 +2021,SRB,6.017 +2021,SYC,6.223 +2021,SLE,0.132 +2021,SGP,9.397 +2021,SXM,14.264 +2021,SVK,6.455 +2021,SVN,6.162 +2021,SLB,0.427 +2021,SOME,0.038 +2021,ZAF,7.166 +2021,KOR,11.886 +2021,SSD,0.172 +2021,ESP,4.849 +2021,LKA,0.924 +2021,SDN,0.486 +2021,SURE,6.008 +2021,SWE,3.681 +2021,CHE,4.118 +2021,SYR,1.276 +2021,TWN,12.205 +2021,TJK,1.024 +2021,TZA,0.242 +2021,THA,3.732 +2021,TGO,0.296 +2021,TON,1.803 +2021,TO,23.29 +2021,TUN,2.874 +2021,TUR,5.34 +2021,TKM,11.034 +2021,TCA,7.665 +2021,TUV,1.021 +2021,UGA,0.132 +2021,UKR,4.828 +2021,ARE,25.333 +2021,GBR,5.164 +2021,USA,14.932 +2021,URY,2.365 +2021,UZB,3.415 +2021,VUT,0.659 +2021,VAT,0 +2021,VEN,2.539 +2021,VNM,3.617 +2021,WLF,2.296 +2021,YEM,0.351 +2021,ZMB,0.445 +2021,ZWE,0.525 +2022,AFG,0.295 +2022,,4.658 +2022,ALB,1.743 +2022,DZA,3.927 +2022,AND,4.617 +2022,AGO,0.452 +2022,AIA,8.753 +2022,ATA,0 +2022,ATG,6.422 +2022,ARG,4.238 +2022,ARM,2.305 +2022,ABW,8.133 +2022,AUS,14.985 +2022,AUT,6.878 +2022,AZE,3.675 +2022,BHS,5.171 +2022,BHR,25.672 +2022,BGD,0.596 +2022,BRB,4.377 +2022,BLR,6.167 +2022,BEL,7.688 +2022,BLZ,1.789 +2022,BEN,0.631 +2022,BMU,6.937 +2022,BTN,1.349 +2022,BOL,1.758 +2022,BES,4.083 +2022,BIH,6.103 +2022,BWA,2.839 +2022,BRA,2.245 +2022,VGB,5.004 +2022,BRN,23.95 +2022,BGR,6.804 +2022,BFA,0.263 +2022,BDI,0.062 +2022,KHM,1.19 +2022,CMR,0.343 +2022,CAN,14.249 +2022,CPV,0.959 +2022,CALF,0.041 +2022,TCD,0.134 +2022,CHL,4.304 +2022,CHN,7.993 +2022,CXR,0 +2022,COL,1.922 +2022,COM,0.493 +2022,COG,1.245 +2022,COK,3.995 +2022,CRI,1.523 +2022,CIV,0.417 +2022,HRV,4.349 +2022,CUB,1.866 +2022,CUW,9.189 +2022,CYP,5.617 +2022,CZE,9.336 +2022,COD,0.036 +2022,DNK,4.94 +2022,DJI,0.404 +2022,DMA,2.106 +2022,DOM,2.105 +2022,TLS,0.499 +2022,ECU,2.312 +2022,EGY,2.333 +2022,SLV,1.217 +2022,GNQ,3.031 +2022,ERI,0.189 +2022,EST,7.776 +2022,SWZ,1.053 +2022,ETH,0.155 +2022,FRO,14.085 +2022,FJI,1.155 +2022,FIN,6.527 +2022,FRA,4.604 +2022,PYF,2.851 +2022,GAB,2.388 +2022,GMB,0.285 +2022,GEO,2.963 +2022,DEU,7.984 +2022,GHA,0.622 +2022,GRC,5.745 +2022,GRL,10.474 +2022,GRD,2.713 +2022,GTM,1.076 +2022,GIN,0.357 +2022,GNB,0.155 +2022,GUY,4.374 +2022,HTI,0.211 +2022,HND,1.07 +2022,HKG,4.082 +2022,HUN,4.45 +2022,ISL,9.5 +2022,IND,1.997 +2022,IDN,2.646 +2022,IRN,7.799 +2022,IRQ,4.025 +2022,IRL,7.721 +2022,ISR,6.209 +2022,ITA,5.727 +2022,JAM,2.295 +2022,JPN,8.502 +2022,JOR,2.03 +2022,KAZ,13.98 +2022,KEN,0.46 +2022,KIR,0.518 +2022,KWT,25.578 +2022,KGZ,1.425 +2022,LAO,3.08 +2022,LVA,3.562 +2022,LBN,4.354 +2022,ALSO,1.359 +2022,LBR,0.165 +2022,LBY,9.242 +2022,LIE,3.81 +2022,LTU,4.606 +2022,LUX,11.618 +2022,MAC,1.513 +2022,MDG,0.149 +2022,MWI,0.103 +2022,MYS,8.577 +2022,MDV,3.248 +2022,MLI,0.312 +2022,MLT,3.104 +2022,MHL,3.635 +2022,MRT,0.957 +2022,MUS,3.27 +2022,MEX,4.015 +2022,FSM,1.324 +2022,MDA,1.657 +2022,MCO,0 +2022,MNG,11.151 +2022,MNE,3.656 +2022,MSR,4.845 +2022,MAR,1.826 +2022,MOZ,0.243 +2022,MMR,0.645 +2022,NAME,1.54 +2022,NRU,4.17 +2022,NPL,0.507 +2022,NLD,7.137 +2022,NCL,17.641 +2022,NZL,6.212 +2022,NIC,0.799 +2022,NER,0.117 +2022,NGA,0.589 +2022,NIU,3.873 +2022,PRK,1.951 +2022,MKD,3.625 +2022,NOR,7.509 +2022,OMN,15.73 +2022,PAK,0.849 +2022,PLW,12.124 +2022,PSE,0.666 +2022,PAN,2.699 +2022,PNG,0.771 +2022,PRY,1.33 +2022,PER,1.789 +2022,PHL,1.301 +2022,POL,8.107 +2022,PRT,4.051 +2022,QAT,37.601 +2022,ROU,3.74 +2022,RUS,11.417 +2022,RWA,0.112 +2022,SHN,3.299 +2022,KNA,4.708 +2022,LCA,2.615 +2022,SPM,10.293 +2022,VCT,2.296 +2022,WSM,1.122 +2022,SMR,0 +2022,STP,0.582 +2022,SAU,18.197 +2022,SEN,0.674 +2022,SRB,6.025 +2022,SYC,6.15 +2022,SLE,0.131 +2022,SGP,8.912 +2022,SXM,14.352 +2022,SVK,6.052 +2022,SVN,5.998 +2022,SLB,0.412 +2022,SOME,0.037 +2022,ZAF,6.746 +2022,KOR,11.599 +2022,SSD,0.168 +2022,ESP,5.164 +2022,LKA,0.794 +2022,SDN,0.47 +2022,SURE,5.803 +2022,SWE,3.607 +2022,CHE,4.048 +2022,SYR,1.249 +2022,TWN,11.631 +2022,TJK,1.006 +2022,TZA,0.238 +2022,THA,3.776 +2022,TGO,0.291 +2022,TON,1.769 +2022,TO,22.424 +2022,TUN,2.879 +2022,TUR,5.105 +2022,TKM,11.034 +2022,TCA,7.637 +2022,TUV,1.0 +2022,UGA,0.127 +2022,UKR,3.558 +2022,ARE,25.833 +2022,GBR,4.72 +2022,USA,14.95 +2022,URY,2.306 +2022,UZB,3.483 +2022,VUT,0.636 +2022,VAT,0 +2022,VEN,2.717 +2022,VNM,3.5 +2022,WLF,2.282 +2022,YEM,0.337 +2022,ZMB,0.446 +2022,ZWE,0.543 diff --git a/examples/ReadKml.py b/examples/read_kml.py similarity index 100% rename from examples/ReadKml.py rename to examples/read_kml.py diff --git a/examples/shp2kml.py b/examples/shp2kml.py new file mode 100644 index 00000000..e26edeb1 --- /dev/null +++ b/examples/shp2kml.py @@ -0,0 +1,77 @@ +import csv +import pathlib +import random + +import shapefile +from pygeoif.factories import force_3d +from pygeoif.factories import shape + +import fastkml +import fastkml.containers +import fastkml.features +import fastkml.styles +from fastkml.enums import AltitudeMode +from fastkml.enums import ColorMode +from fastkml.geometry import create_kml_geometry + +shp = shapefile.Reader("world-administrative-boundaries.shp") + +co2_csv = pathlib.Path("owid-co2-data.csv") + +co2_data = {} + +with co2_csv.open() as csvfile: + reader = csv.DictReader(csvfile) + for row in reader: + if row["year"] == "2020": + co2_data[row["iso_code"]] = ( + float(row["co2_per_capita"]) if row["co2_per_capita"] else 0 + ) + +continents = { + "Antarctica": fastkml.containers.Folder(name="Antarctica"), + "Europe": fastkml.containers.Folder(name="Europe"), + "Oceania": fastkml.containers.Folder(name="Oceania"), + "Africa": fastkml.containers.Folder(name="Africa"), + "Americas": fastkml.containers.Folder(name="Americas"), + "Asia": fastkml.containers.Folder(name="Asia"), +} + +for feature in shp.__geo_interface__["features"]: + geometry = shape(feature["geometry"]) + co2_emission = co2_data.get(feature["properties"]["iso3"], 0) + geometry = force_3d(geometry, co2_emission * 100_000) + kml_geometry = create_kml_geometry( + geometry, + extrude=True, + altitude_mode=AltitudeMode.relative_to_ground, + ) + color = random.randint(0, 0xFFFFFF) + style = fastkml.styles.Style( + id=feature["properties"]["iso3"], + styles=[ + fastkml.styles.LineStyle(color=f"55{color:06X}", width=2), + fastkml.styles.PolyStyle( + color_mode=ColorMode.random, + color=f"88{color:06X}", + fill=True, + outline=True, + ), + ], + ) + + style_url = fastkml.styles.StyleUrl(url=f"#{feature['properties']['iso3']}") + placemark = fastkml.features.Placemark( + name=feature["properties"]["name"], + description=feature["properties"]["status"], + kml_geometry=kml_geometry, + styles=[style], + ) + continents[feature["properties"]["continent"]].features.append(placemark) + +document = fastkml.containers.Document(features=continents.values()) +kml = fastkml.KML(features=[document]) + +outfile = pathlib.Path("co2_per_capita_2020.kml") +with outfile.open("w") as f: + f.write(kml.to_string(prettyprint=True, precision=3)) diff --git a/examples/shp2kml_timed.py b/examples/shp2kml_timed.py new file mode 100644 index 00000000..d70e4a89 --- /dev/null +++ b/examples/shp2kml_timed.py @@ -0,0 +1,97 @@ +import csv +import datetime +import pathlib +import random + +import shapefile +from pygeoif.factories import force_3d +from pygeoif.factories import shape + +import fastkml +import fastkml.containers +import fastkml.features +import fastkml.styles +import fastkml.times +from fastkml.enums import AltitudeMode +from fastkml.enums import DateTimeResolution +from fastkml.geometry import create_kml_geometry + +shp = shapefile.Reader("ne_110m_admin_0_countries.shp") + +co2_csv = pathlib.Path("owid-co2-data.csv") + +co2_pa = {str(i): {} for i in range(1995, 2023)} + +with co2_csv.open() as csvfile: + reader = csv.DictReader(csvfile) + for row in reader: + if row["year"] >= "1995": + co2_pa[row["year"]][row["iso_code"]] = ( + float(row["co2_per_capita"]) if row["co2_per_capita"] else 0 + ) + +styles = [] +folders = [] +for feature in shp.__geo_interface__["features"]: + iso3_code = feature["properties"]["ADM0_A3"] + geometry = shape(feature["geometry"]) + color = random.randint(0, 0xFFFFFF) + styles.append( + fastkml.styles.Style( + id=iso3_code, + styles=[ + fastkml.styles.LineStyle(color=f"33{color:06X}", width=2), + fastkml.styles.PolyStyle( + color=f"88{color:06X}", + fill=True, + outline=True, + ), + ], + ), + ) + style_url = fastkml.styles.StyleUrl(url=f"#{iso3_code}") + folder = fastkml.containers.Folder(name=feature["properties"]["NAME"]) + co2_growth = 0 + for year in range(1995, 2023): + co2_year = co2_pa[str(year)].get(iso3_code, 0) + co2_growth += co2_year + + kml_geometry = create_kml_geometry( + force_3d(geometry, co2_growth * 5_000), + extrude=True, + altitude_mode=AltitudeMode.relative_to_ground, + ) + timespan = fastkml.times.TimeSpan( + begin=fastkml.times.KmlDateTime( + datetime.date(year, 1, 1), + resolution=DateTimeResolution.year_month, + ), + end=fastkml.times.KmlDateTime( + datetime.date(year, 12, 31), + resolution=DateTimeResolution.year_month, + ), + ) + placemark = fastkml.features.Placemark( + name=f"{feature['properties']['NAME']} - {year}", + description=feature["properties"]["FORMAL_EN"], + kml_geometry=kml_geometry, + style_url=style_url, + times=timespan, + ) + folder.features.append(placemark) + folders.append(folder) + +document = fastkml.containers.Document(features=folders, styles=styles) +kml = fastkml.KML(features=[document]) + +outfile = pathlib.Path("co2_growth_1995_2022.kml") +with outfile.open("w") as f: + f.write(kml.to_string(prettyprint=True, precision=3)) + +csv_outfile = pathlib.Path("co2_per_capita_2020.csv") +with csv_outfile.open("w") as f: + writer = csv.writer(f) + writer.writerow(["year", "iso_code", "co2_per_capita"]) + for year, co2_data in co2_pa.items(): + for iso_code, co2_per_capita in co2_data.items(): + writer.writerow([year, iso_code, co2_per_capita]) diff --git a/examples/UsageExamples.py b/examples/simple_example.py similarity index 92% rename from examples/UsageExamples.py rename to examples/simple_example.py index d0eb4ed8..d91c1216 100755 --- a/examples/UsageExamples.py +++ b/examples/simple_example.py @@ -9,7 +9,7 @@ def print_child_features(element, depth=0): if not getattr(element, "features", None): return for feature in element.features: - print(" " * depth + feature.name) + print(" " * depth, feature.name) print_child_features(feature, depth + 1) diff --git a/fastkml/__init__.py b/fastkml/__init__.py index a6ca8b7e..d0cb773f 100644 --- a/fastkml/__init__.py +++ b/fastkml/__init__.py @@ -25,9 +25,9 @@ functionality that KML on google earth provides. """ from fastkml.about import __version__ # noqa: F401 -from fastkml.atom import Author -from fastkml.atom import Contributor -from fastkml.atom import Link +from fastkml.atom import Author as AtomAuthor +from fastkml.atom import Contributor as AtomContributor +from fastkml.atom import Link as AtomLink from fastkml.containers import Document from fastkml.containers import Folder from fastkml.data import Data @@ -35,7 +35,14 @@ from fastkml.data import Schema from fastkml.data import SchemaData from fastkml.features import Placemark +from fastkml.geometry import LinearRing +from fastkml.geometry import LineString +from fastkml.geometry import MultiGeometry +from fastkml.geometry import Point +from fastkml.geometry import Polygon from fastkml.kml import KML +from fastkml.links import Icon +from fastkml.links import Link from fastkml.overlays import GroundOverlay from fastkml.overlays import PhotoOverlay from fastkml.styles import BalloonStyle @@ -72,9 +79,16 @@ "PolyStyle", "LabelStyle", "BalloonStyle", + "AtomLink", + "Icon", "Link", - "Author", - "Contributor", + "Point", + "LineString", + "LinearRing", + "Polygon", + "MultiGeometry", + "AtomAuthor", + "AtomContributor", "Camera", "LookAt", ] diff --git a/fastkml/containers.py b/fastkml/containers.py index bf1fa398..95dee533 100644 --- a/fastkml/containers.py +++ b/fastkml/containers.py @@ -44,6 +44,7 @@ from fastkml.styles import StyleUrl from fastkml.times import TimeSpan from fastkml.times import TimeStamp +from fastkml.utils import find_all from fastkml.views import Camera from fastkml.views import LookAt from fastkml.views import Region @@ -306,7 +307,14 @@ def get_style_by_url(self, style_url: str) -> Optional[Union[Style, StyleMap]]: """ id_ = urlparse.urlparse(style_url).fragment - return next((style for style in self.styles if style.id == id_), None) + return next( + find_all( # type: ignore[arg-type] + self, + of_type=(Style, StyleMap), + id=id_, + ), + None, + ) registry.register( diff --git a/fastkml/features.py b/fastkml/features.py index f001da73..d2b24c0a 100644 --- a/fastkml/features.py +++ b/fastkml/features.py @@ -631,7 +631,7 @@ def __init__( msg = "You can only specify one of kml_geometry or geometry" raise ValueError(msg) if geometry: - kml_geometry = create_kml_geometry( # type: ignore[assignment] + kml_geometry = create_kml_geometry( geometry=geometry, ns=ns, name_spaces=name_spaces, diff --git a/fastkml/geometry.py b/fastkml/geometry.py index bd2cab87..d29ce285 100644 --- a/fastkml/geometry.py +++ b/fastkml/geometry.py @@ -32,9 +32,11 @@ from typing import Final from typing import Iterable from typing import List +from typing import NoReturn from typing import Optional from typing import Sequence from typing import Tuple +from typing import Type from typing import Union from typing import cast @@ -1300,68 +1302,6 @@ def create_multigeometry( return geo.GeometryCollection(geometries) -def create_kml_geometry( - geometry: Union[GeoType, GeoCollectionType], - *, - ns: Optional[str] = None, - name_spaces: Optional[Dict[str, str]] = None, - id: Optional[str] = None, - target_id: Optional[str] = None, - extrude: Optional[bool] = None, - tessellate: Optional[bool] = None, - altitude_mode: Optional[AltitudeMode] = None, -) -> _Geometry: - """ - Create a KML geometry from a geometry object. - - Args: - ---- - geometry: Geometry object. - ns: Namespace of the object - name_spaces: Name spaces of the object - id: Id of the object - target_id: Target id of the object - extrude: Specifies whether to connect the feature to the ground with a line. - tessellate: Specifies whether to allow the LineString to follow the terrain. - altitude_mode: Specifies how altitude components in the - element are interpreted. - - Returns: - ------- - KML geometry object. - - """ - _map_to_kml = { - geo.Point: Point, - geo.Polygon: Polygon, - geo.LinearRing: LinearRing, - geo.LineString: LineString, - geo.MultiPoint: MultiGeometry, - geo.MultiLineString: MultiGeometry, - geo.MultiPolygon: MultiGeometry, - geo.GeometryCollection: MultiGeometry, - } - geom = shape(geometry) - for geometry_class, kml_class in _map_to_kml.items(): - if isinstance(geom, geometry_class): - return cast( - _Geometry, - kml_class( - ns=ns, - name_spaces=name_spaces, - id=id, - target_id=target_id, - extrude=extrude, - tessellate=tessellate, - altitude_mode=altitude_mode, - geometry=geom, - ), - ) - # this should be unreachable, but mypy doesn't know that - msg = f"Unsupported geometry type {type(geometry)}" # pragma: no cover - raise KMLWriteError(msg) # pragma: no cover - - class MultiGeometry(_BaseObject): """A container for zero or more geometry primitives.""" @@ -1489,3 +1429,84 @@ def geometry(self) -> Optional[MultiGeometryType]: set_element=xml_subelement_list, ), ) + + +KMLGeometryType = Union[Point, LineString, Polygon, LinearRing, MultiGeometry] + + +def _unknown_geometry_type(geometry: Union[GeoType, GeoCollectionType]) -> NoReturn: + """ + Raise an error for an unknown geometry type. + + Args: + ---- + geometry: The geometry object. + + Raises: + ------ + KMLWriteError: If the geometry type is unknown. + + """ + msg = f"Unsupported geometry type {type(geometry)}" # pragma: no cover + raise KMLWriteError(msg) # pragma: no cover + + +def create_kml_geometry( + geometry: Union[GeoType, GeoCollectionType], + *, + ns: Optional[str] = None, + name_spaces: Optional[Dict[str, str]] = None, + id: Optional[str] = None, + target_id: Optional[str] = None, + extrude: Optional[bool] = None, + tessellate: Optional[bool] = None, + altitude_mode: Optional[AltitudeMode] = None, +) -> KMLGeometryType: + """ + Create a KML geometry from a geometry object. + + Args: + ---- + geometry: Geometry object. + ns: Namespace of the object + name_spaces: Name spaces of the object + id: Id of the object + target_id: Target id of the object + extrude: Specifies whether to connect the feature to the ground with a line. + tessellate: Specifies whether to allow the LineString to follow the terrain. + altitude_mode: Specifies how altitude components in the + element are interpreted. + + Returns: + ------- + KML geometry object. + + """ + _map_to_kml: Dict[ + Union[Type[GeoType], Type[GeoCollectionType]], + Type[KMLGeometryType], + ] = { + geo.Point: Point, + geo.Polygon: Polygon, + geo.LinearRing: LinearRing, + geo.LineString: LineString, + geo.MultiPoint: MultiGeometry, + geo.MultiLineString: MultiGeometry, + geo.MultiPolygon: MultiGeometry, + geo.GeometryCollection: MultiGeometry, + } + geom = shape(geometry) + for geometry_class, kml_class in _map_to_kml.items(): + if isinstance(geom, geometry_class): + return kml_class( + ns=ns, + name_spaces=name_spaces, + id=id, + target_id=target_id, + extrude=extrude, + tessellate=tessellate, + altitude_mode=altitude_mode, + geometry=geom, # type: ignore[arg-type] + ) + + _unknown_geometry_type(geometry) diff --git a/fastkml/utils.py b/fastkml/utils.py new file mode 100644 index 00000000..79b0cf18 --- /dev/null +++ b/fastkml/utils.py @@ -0,0 +1,64 @@ +"""Fastkml utility functions.""" + +from typing import Any +from typing import Generator +from typing import Optional +from typing import Tuple +from typing import Type +from typing import Union + +__all__ = ["find_all", "has_attribute_values"] + + +def has_attribute_values(obj: object, **kwargs: Any) -> bool: + """ + Check if an object has all of the given attribute values. + + Args: + obj: The object to check. + **kwargs: Attributes of the object to match. + + Returns: + True if the object has the given attribute values, False otherwise. + + """ + try: + return all(getattr(obj, key) == value for key, value in kwargs.items()) + except AttributeError: + return False + + +def find_all( + obj: object, + *, + of_type: Optional[Union[Type[object], Tuple[Type[object], ...]]] = None, + **kwargs: Any, +) -> Generator[object, None, None]: + """ + Find all instances of a given type in a given object. + + Args: + obj: The object to search. + of_type: The type(s) to search for or None for any type. + **kwargs: Attributes of the object to match. + + Returns: + An iterable of all instances of the given type in the given object. + + """ + if (of_type is None or isinstance(obj, of_type)) and has_attribute_values( + obj, + **kwargs, + ): + yield obj + try: + attrs = (attr for attr in obj.__dict__ if not attr.startswith("_")) + except AttributeError: + return + for attr_name in attrs: + attr = getattr(obj, attr_name) + try: + for item in attr: + yield from find_all(item, of_type=of_type, **kwargs) + except TypeError: + yield from find_all(attr, of_type=of_type, **kwargs) diff --git a/pyproject.toml b/pyproject.toml index ae941c9d..0807e9b5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -52,6 +52,7 @@ dev = [ ] docs = [ "Sphinx", + "pyshp", "sphinx-autodoc-typehints", "sphinx-rtd-theme", ] @@ -203,6 +204,7 @@ select = [ "D401", "ICN001", "INP001", + "S311", "T201", ] "fastkml/helpers.py" = [ diff --git a/tests/containers_test.py b/tests/containers_test.py index 61017d50..c7890253 100644 --- a/tests/containers_test.py +++ b/tests/containers_test.py @@ -110,6 +110,51 @@ def test_document_container_get_style_url_id(self) -> None: ) assert document.get_style_by_url(style_url="#style-0") == style + def test_get_style_by_url(self) -> None: + doc = """ + + Document.kml + 1 + + + + normal + #normalState + + + highlight + #highlightState + + + + + """ + k = kml.KML.from_string(doc) + assert len(k.features) == 1 + document = k.features[0] + + style0 = document.get_style_by_url( + "http://localhost:8080/somepath#exampleStyleDocument", + ) + style1 = document.get_style_by_url("somepath#linestyleExample") + style2 = document.get_style_by_url("#styleMapExample") + + assert isinstance(style0.styles[0], styles.LabelStyle) + assert style0.id == "exampleStyleDocument" + assert isinstance(style1.styles[0], styles.LineStyle) + assert style1.id == "linestyleExample" + assert isinstance(style2, styles.StyleMap) + assert style2.id == "styleMapExample" + class TestLxml(Lxml, TestStdLibrary): """Test with lxml.""" diff --git a/tests/oldunit_test.py b/tests/oldunit_test.py new file mode 100644 index 00000000..28cf5e77 --- /dev/null +++ b/tests/oldunit_test.py @@ -0,0 +1,1100 @@ +# Copyright (C) 2012 -2022 Christian Ledermann +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +import xml.etree.ElementTree + +from pygeoif.geometry import MultiPoint +from pygeoif.geometry import Polygon + +from fastkml import atom +from fastkml import config +from fastkml import features +from fastkml import kml +from fastkml import kml_base +from fastkml import styles +from fastkml.enums import ColorMode +from fastkml.enums import DisplayMode + + +class TestBaseClasses: + """ + BaseClasses must raise a NotImplementedError on etree_element. + """ + + def setup_method(self) -> None: + """Always test with the same parser.""" + config.set_etree_implementation(xml.etree.ElementTree) + config.set_default_namespaces() + + def test_base_object(self) -> None: + bo = kml_base._BaseObject(id="id0") + assert bo.id == "id0" + assert bo.ns == config.KMLNS + assert bo.target_id == "" + bo.target_id = "target" + assert bo.target_id == "target" + bo.ns = "" + bo.id = None + assert bo.id is None + assert not bo.ns + + +class TestBuildKml: + """Build a simple KML File.""" + + def setup_method(self) -> None: + """Always test with the same parser.""" + config.set_etree_implementation(xml.etree.ElementTree) + config.set_default_namespaces() + + def test_folder(self) -> None: + """KML file with folders.""" + ns = "{http://www.opengis.net/kml/2.2}" + k = kml.KML(ns=ns) + f = kml.Folder(ns=ns, id="id", name="name", description="description") + nf = kml.Folder( + ns=ns, + id="nested-id", + name="nested-name", + description="nested-description", + ) + f.append(nf) + k.append(f) + f2 = kml.Folder(ns, id="id2", name="name2", description="description2") + k.append(f2) + assert len(k.features) == 2 + assert len(k.features[0].features) == 1 + s = k.to_string() + k2 = kml.KML.from_string(s, ns=ns) + assert s == k2.to_string() + + def test_placemark(self) -> None: + ns = "{http://www.opengis.net/kml/2.2}" + k = kml.KML(ns=ns) + p = kml.Placemark(ns, id="id", name="name", description="description") + # XXX p.geometry = Point(0.0, 0.0, 0.0) + p2 = kml.Placemark(ns, id="id2", name="name2", description="description2") + # XXX p2.geometry = LineString([(0, 0, 0), (1, 1, 1)]) + k.append(p) + k.append(p2) + assert len(k.features) == 2 + k2 = kml.KML.from_string(k.to_string(prettyprint=True), ns=ns) + assert k.to_string() == k2.to_string() + + def test_document(self) -> None: + ns = "{http://www.opengis.net/kml/2.2}" + k = kml.KML(ns=ns) + d = kml.Document(ns, id="docid", name="doc name", description="doc description") + f = kml.Folder(ns, id="fid", name="f name", description="f description") + k.append(d) + d.append(f) + nf = kml.Folder( + ns, + id="nested-fid", + name="nested f name", + description="nested f description", + ) + f.append(nf) + f2 = kml.Folder(ns, id="id2", name="name2", description="description2") + d.append(f2) + p = kml.Placemark(ns, id="id", name="name", description="description") + # XXX p.geometry = Polygon([(0, 0, 0), (1, 1, 0), (1, 0, 1)]) + p2 = kml.Placemark(ns, id="id2", name="name2", description="description2") + # p2 does not have a geometry! + f2.append(p) + nf.append(p2) + assert len(k.features) == 1 + assert len(k.features[0].features) == 2 + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_author(self) -> None: + d = kml.Document() + d.atom_author = atom.Author( + ns="{http://www.w3.org/2005/Atom}", + name="Christian Ledermann", + ) + assert "Christian Ledermann" in str(d.to_string()) + a = atom.Author( + ns="{http://www.w3.org/2005/Atom}", + name="Nobody", + uri="http://localhost", + email="cl@donotreply.com", + ) + d.atom_author = a + assert "Christian Ledermann" not in str(d.to_string()) + assert "Nobody" in str(d.to_string()) + assert "http://localhost" in str(d.to_string()) + assert "cl@donotreply.com" in str(d.to_string()) + d2 = kml.Document.from_string(d.to_string()) + assert d.to_string() == d2.to_string() + + def test_link(self) -> None: + d = kml.Document() + d.atom_link = atom.Link(ns=config.ATOMNS, href="http://localhost") + assert "http://localhost" in str(d.to_string()) + d.atom_link = atom.Link(ns=config.ATOMNS, href="#here") + assert "#here" in str(d.to_string()) + d2 = kml.Document.from_string(d.to_string()) + assert d.to_string() == d2.to_string() + + def test_address(self) -> None: + address = "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA" + d = kml.Document() + d.address = address + assert address in str(d.to_string()) + assert "address>" in str(d.to_string()) + + def test_phone_number(self) -> None: + phone = "+1 234 567 8901" + d = kml.Document() + d.phone_number = phone + assert phone in str(d.to_string()) + assert "phoneNumber>" in str(d.to_string()) + + +class TestKmlFromString: + def test_document(self) -> None: + doc = """ + + Document.kml + 1 + + + Document Feature 1 + #exampleStyleDocument + + -122.371,37.816,0 + + + + Document Feature 2 + #exampleStyleDocument + + -122.370,37.817,0 + + + + """ + + k = kml.KML.from_string(doc) + assert len(k.features) == 1 + assert len(k.features[0].features) == 2 + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_folders(self) -> None: + doc = """ + + Folder.kml + 1 + + A folder is a container that can hold multiple other objects + + + Folder object 1 (Placemark) + + -122.377588,37.830266,0 + + + + Folder object 2 (Polygon) + + + + + -122.377830,37.830445,0 + -122.377576,37.830631,0 + -122.377840,37.830642,0 + -122.377830,37.830445,0 + + + + + + + Folder object 3 (Path) + + 1 + + -122.378009,37.830128,0 -122.377885,37.830379,0 + + + + + """ + + k = kml.KML.from_string(doc) + assert len(k.features) == 1 + assert len(k.features[0].features) == 3 + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_placemark(self) -> None: + doc = """ + + Simple placemark + Attached to the ground. Intelligently places itself + at the height of the underlying terrain. + + -122.0822035425683,37.42228990140251,0 + + + """ + + k = kml.KML.from_string(doc) + assert len(k.features) == 1 + assert k.features[0].name == "Simple placemark" + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_polygon(self) -> None: + doc = """ + + + South Africa + + + + + 31.521,-29.257,0 + 31.326,-29.402,0 + 30.902,-29.91,0 + 30.623,-30.424,0 + 30.056,-31.14,0 + 28.926,-32.172,0 + 28.22,-32.772,0 + 27.465,-33.227,0 + 26.419,-33.615,0 + 25.91,-33.667,0 + 25.781,-33.945,0 + 25.173,-33.797,0 + 24.678,-33.987,0 + 23.594,-33.794,0 + 22.988,-33.916,0 + 22.574,-33.864,0 + 21.543,-34.259,0 + 20.689,-34.417,0 + 20.071,-34.795,0 + 19.616,-34.819,0 + 19.193,-34.463,0 + 18.855,-34.444,0 + 18.425,-33.998,0 + 18.377,-34.137,0 + 18.244,-33.868,0 + 18.25,-33.281,0 + 17.925,-32.611,0 + 18.248,-32.429,0 + 18.222,-31.662,0 + 17.567,-30.726,0 + 17.064,-29.879,0 + 17.063,-29.876,0 + 16.345,-28.577,0 + 16.824,-28.082,0 + 17.219,-28.356,0 + 17.387,-28.784,0 + 17.836,-28.856,0 + 18.465,-29.045,0 + 19.002,-28.972,0 + 19.895,-28.461,0 + 19.896,-24.768,0 + 20.166,-24.918,0 + 20.759,-25.868,0 + 20.666,-26.477,0 + 20.89,-26.829,0 + 21.606,-26.727,0 + 22.106,-26.28,0 + 22.58,-25.979,0 + 22.824,-25.5,0 + 23.312,-25.269,0 + 23.734,-25.39,0 + 24.211,-25.67,0 + 25.025,-25.72,0 + 25.665,-25.487,0 + 25.766,-25.175,0 + 25.942,-24.696,0 + 26.486,-24.616,0 + 26.786,-24.241,0 + 27.119,-23.574,0 + 28.017,-22.828,0 + 29.432,-22.091,0 + 29.839,-22.102,0 + 30.323,-22.272,0 + 30.66,-22.152,0 + 31.191,-22.252,0 + 31.67,-23.659,0 + 31.931,-24.369,0 + 31.752,-25.484,0 + 31.838,-25.843,0 + 31.333,-25.66,0 + 31.044,-25.731,0 + 30.95,-26.023,0 + 30.677,-26.398,0 + 30.686,-26.744,0 + 31.283,-27.286,0 + 31.868,-27.178,0 + 32.072,-26.734,0 + 32.83,-26.742,0 + 32.58,-27.47,0 + 32.462,-28.301,0 + 32.203,-28.752,0 + 31.521,-29.257,0 + + + + + + + 28.978,-28.956,0 + 28.542,-28.648,0 + 28.074,-28.851,0 + 27.533,-29.243,0 + 26.999,-29.876,0 + 27.749,-30.645,0 + 28.107,-30.546,0 + 28.291,-30.226,0 + 28.848,-30.07,0 + 29.018,-29.744,0 + 29.325,-29.257,0 + 28.978,-28.956,0 + + + + + + """ + + k = kml.KML.from_string(doc) + assert len(k.features) == 1 + assert isinstance(k.features[0].geometry, Polygon) + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_multipoints(self) -> None: + doc = """ + + MultiPoint + #stylesel_9 + + + 16,-35,0.0 + + + 16,-33,0.0 + + + 16,-31,0.0 + + + 16,-29,0.0 + + + 16,-27,0.0 + + + 16,-25,0.0 + + + 16,-23,0.0 + + + 16,-21,0.0 + + + 18,-35,0.0 + + + 18,-33,0.0 + + + 18,-31,0.0 + + + 18,-29,0.0 + + + """ + + k = kml.KML.from_string(doc) + assert len(k.features) == 1 + assert isinstance(k.features[0].geometry, MultiPoint) + assert len(list(k.features[0].geometry.geoms)) == 12 + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_atom(self) -> None: + pass + + def test_snippet(self) -> None: + doc = """ + + Short Desc + """ + + k = kml.KML.from_string(doc) + assert k.features[0].snippet.text == "Short Desc" + assert k.features[0].snippet.max_lines == 2 + k.features[0].snippet = features.Snippet( + text="Another Snippet", + max_lines=3, + ) + assert 'maxLines="3"' in k.to_string() + k.features[0].snippet = features.Snippet(text="Another Snippet") + assert "maxLines" not in k.to_string() + assert "Another Snippet" in k.to_string() + k.features[0].snippet = features.Snippet(text="Different Snippet") + assert "maxLines" not in k.to_string() + assert "Different Snippet" in k.to_string() + k.features[0].snippet = features.Snippet(text="", max_lines=4) + assert "Snippet" not in k.to_string() + + def test_address(self) -> None: + doc = kml.Document.from_string( + """ + + pm-name + pm-description + 1 + 1600 Amphitheatre Parkway,... + + """, + ) + + doc2 = kml.Document.from_string(doc.to_string()) + assert doc.to_string() == doc2.to_string() + + def test_phone_number(self) -> None: + doc = kml.Document.from_string( + """ + + pm-name + pm-description + 1 + +1 234 567 8901 + + """, + ) + + doc2 = kml.Document.from_string(doc.to_string()) + assert doc.to_string() == doc2.to_string() + + def test_groundoverlay(self) -> None: + doc = kml.KML.from_string( + """ + + + Ground Overlays + Examples of ground overlays + + Large-scale overlay on terrain + Overlay shows Mount Etna erupting + on July 13th, 2001. + + http://developers.google.com/kml/etna.jpg + + + 37.91904192681665 + 37.46543388598137 + 15.35832653742206 + 14.60128369746704 + -0.1556640799496235 + + + + + """, + ) + + doc2 = kml.KML.from_string(doc.to_string()) + assert doc.to_string() == doc2.to_string() + + +class TestStyle: + def test_styleurl(self) -> None: + f = kml.Document() + s = styles.StyleUrl(config.KMLNS, url="#otherstyle") + f.style_url = s + f2 = kml.Document.from_string(f.to_string()) + assert f.to_string() == f2.to_string() + assert isinstance(f2.style_url, styles.StyleUrl) + assert f2.style_url.url == "#otherstyle" + + def test_style(self) -> None: + lstyle = styles.LineStyle(color="red", width=2.0) + style = styles.Style(styles=[lstyle]) + f = kml.Document(styles=[style]) + f2 = kml.Document.from_string(f.to_string(prettyprint=True)) + assert f.to_string() == f2.to_string() + + def test_polystyle_fill(self) -> None: + styles.PolyStyle() + + def test_polystyle_outline(self) -> None: + styles.PolyStyle() + + +class TestStyleUsage: + def test_create_document_style(self) -> None: + style = styles.Style( + styles=[ + styles.PolyStyle( + color="7f000000", + fill=True, + outline=True, + ), + ], + ) + + doc = kml.Document(styles=[style]) + + doc2 = kml.Document() + doc2.styles.append(style) + + expected = """ + + + + + 7f000000 + 1 + 1 + + + + """ + + doc3 = kml.Document.from_string(expected) + + assert doc.to_string() == doc2.to_string() + assert doc2.to_string() == doc3.to_string() + assert doc.to_string() == doc3.to_string() + + def test_create_placemark_style(self) -> None: + style = styles.Style( + styles=[ + styles.PolyStyle( + color="7f000000", + fill=True, + outline=True, + ), + ], + ) + + place = kml.Placemark(styles=[style]) + + place2 = kml.Placemark() + place2.styles.append(style) + + expected = """ + + + + 7f000000 + 1 + 1 + + + + """ + + place3 = kml.Placemark.from_string(expected) + assert place.to_string() == place2.to_string() + assert place2.to_string() == place3.to_string() + assert place.to_string() == place3.to_string() + + +class TestStyleFromString: + def test_styleurl(self) -> None: + doc = """ + + Document.kml + 1 + #default + + """ + + k = kml.KML.from_string(doc) + assert len(k.features) == 1 + assert k.features[0].style_url.url == "#default" + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_balloonstyle(self) -> None: + doc = """ + + Document.kml + + + """ + + k = kml.KML.from_string(doc) + features = k.features + assert len(features) == 1 + style = features[0].styles[0] + assert isinstance(style, styles.Style) + style_1 = style.styles[0] + assert isinstance(style_1, styles.BalloonStyle) + assert style_1.bg_color == "ffffffbb" + assert style_1.text_color == "ff000000" + assert style_1.display_mode == DisplayMode.default + assert style_1.text + assert "$[geDirections]" in style_1.text + assert "$[description]" in style_1.text + k2 = kml.KML.from_string(k.to_string()) + assert k2.to_string() == k.to_string() + + def test_balloonstyle_old_color(self) -> None: + doc = """ + + Document.kml + + + """ + + k = kml.KML.from_string(doc) + assert len(k.features) == 1 + assert isinstance(k.features[0].styles[0], styles.Style) + style = k.features[0].styles[0].styles[0] + assert isinstance(style, styles.BalloonStyle) + assert style.bg_color is None + assert not style + k2 = kml.KML.from_string(k.to_string()) + assert k2.to_string() == k.to_string() + + def test_labelstyle(self) -> None: + doc = """ + + Document.kml + 1 + + + """ + + k = kml.KML.from_string(doc) + assert len(k.features) == 1 + assert isinstance(k.features[0].styles[0], styles.Style) + style = k.features[0].styles[0].styles[0] + assert isinstance(style, styles.LabelStyle) + assert style.color == "ff0000cc" + assert style.color_mode is None + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_iconstyle(self) -> None: + doc = """ + + + + """ + + k = kml.KML.from_string(doc) + assert len(k.features) == 1 + assert isinstance(k.features[0].styles[0], styles.Style) + style = k.features[0].styles[0].styles[0] + assert isinstance(style, styles.IconStyle) + assert style.color == "ff00ff00" + assert style.scale == 1.1 + assert style.color_mode == ColorMode.random + assert style.heading == 0.0 + assert style.icon.href == "http://maps.google.com/icon21.png" + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_linestyle(self) -> None: + doc = """ + + LineStyle.kml + 1 + + + """ + + k = kml.KML.from_string(doc) + assert len(k.features) == 1 + assert isinstance(k.features[0].styles[0], styles.Style) + style = k.features[0].styles[0].styles[0] + assert isinstance(style, styles.LineStyle) + assert style.color == "7f0000ff" + assert style.width == 4 + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_polystyle(self) -> None: + doc = """ + + PolygonStyle.kml + 1 + + + """ + + # XXX fill and outline + k = kml.KML.from_string(doc) + assert len(k.features) == 1 + assert isinstance(k.features[0].styles[0], styles.Style) + style = k.features[0].styles[0].styles[0] + assert isinstance(style, styles.PolyStyle) + assert style.color == "ff0000cc" + assert style.color_mode == ColorMode.random + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_polystyle_boolean_fill(self) -> None: + doc = """ + + PolygonStyle.kml + 1 + + + """ + + k = kml.KML.from_string(doc, strict=False) + style = k.features[0].styles[0].styles[0] + assert isinstance(style, styles.PolyStyle) + assert style.fill == 0 + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_polystyle_boolean_outline(self) -> None: + doc = """ + + PolygonStyle.kml + 1 + + + """ + + k = kml.KML.from_string(doc, strict=False) + style = k.features[0].styles[0].styles[0] + assert isinstance(style, styles.PolyStyle) + assert style.outline == 0 + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_polystyle_float_fill(self) -> None: + doc = """ + + PolygonStyle.kml + 1 + + + """ + + k = kml.KML.from_string(doc, strict=False) + style = k.features[0].styles[0].styles[0] + assert isinstance(style, styles.PolyStyle) + assert style.fill == 0 + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_polystyle_float_outline(self) -> None: + doc = """ + + PolygonStyle.kml + 1 + + + """ + + k = kml.KML.from_string(doc, strict=False) + style = k.features[0].styles[0].styles[0] + assert isinstance(style, styles.PolyStyle) + assert style.outline == 0 + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_styles(self) -> None: + doc = """ + + + + + + """ + + k = kml.KML.from_string(doc) + assert len(k.features) == 1 + assert isinstance(k.features[0].styles[0], styles.Style) + style = k.features[0].styles[0].styles + assert len(style) == 4 + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_stylemapurl(self) -> None: + doc = """ + + + + normal + #normalState + + + highlight + #highlightState + + + + """ + + k = kml.KML.from_string(doc) + features = k.features + assert len(features) == 1 + feature_styles = features[0].styles + assert isinstance( + feature_styles[0], + styles.StyleMap, + ) + sm = feature_styles[0] + + assert isinstance(sm.normal, styles.StyleUrl) + assert sm.normal.url == "#normalState" + assert isinstance(sm.highlight, styles.StyleUrl) + assert sm.highlight.url == "#highlightState" + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + def test_stylemapstyles(self) -> None: + doc = """ + + + + normal + + + + highlight + + + + + """ + + k = kml.KML.from_string(doc) + assert len(k.features) == 1 + assert isinstance( + k.features[0].styles[0], + styles.StyleMap, + ) + sm = k.features[0].styles[0] + assert isinstance(sm.normal, styles.Style) + assert len(sm.normal.styles) == 1 + assert isinstance(sm.normal.styles[0], styles.LabelStyle) + assert isinstance(sm.highlight, styles.Style) + assert isinstance(sm.highlight, styles.Style) + assert len(sm.highlight.styles) == 2 + assert isinstance(sm.highlight.styles[0], styles.LineStyle) + assert isinstance(sm.highlight.styles[1], styles.PolyStyle) + k2 = kml.KML.from_string(k.to_string()) + assert k.to_string() == k2.to_string() + + +def test_nested_multigeometry() -> None: + doc = """ + + + + + + -122.366278,37.818844,0 -122.365248,37.819267,0 + -122.365640,37.819875,0 -122.366278,37.818844,0 + + + + + + -122.365,37.819,0 + + + + + -122.365278,37.819000,0 -122.365248,37.819267,0 + + + + + + + -122.365248,37.819267,0 -122.365640,37.819875,0 + -122.366278,37.818844,0 -122.365248,37.819267,0 + + + + + + + + """ + + k = kml.KML.from_string(doc) + placemark = k.features[0].features[0] + + first_multigeometry = placemark.geometry + assert len(list(first_multigeometry.geoms)) == 3 + + second_multigeometry = next( + g for g in first_multigeometry.geoms if g.geom_type == "GeometryCollection" + ) + assert len(list(second_multigeometry.geoms)) == 2 + + +class TestGetGeometry: + def test_nested_multigeometry(self) -> None: + doc = """ + + + + + + -122.366278,37.818844,0 -122.365248,37.819267,0 + -122.365640,37.819875,0 -122.366278,37.818844,0 + + + + + + -122.365,37.819,0 + + + + + -122.365278,37.819000,0 -122.365248,37.819267,0 + + + + + + + -122.365248,37.819267,0 -122.365640,37.819875,0 + -122.366278,37.818844,0 -122.365248,37.819267,0 + + + + + + + + """ + + k = kml.KML.from_string(doc) + placemark = k.features[0].features[0] + + first_multigeometry = placemark.geometry + assert len(list(first_multigeometry.geoms)) == 3 + + second_multigeometry = next( + g for g in first_multigeometry.geoms if g.geom_type == "GeometryCollection" + ) + assert len(list(second_multigeometry.geoms)) == 2 diff --git a/tests/utils_test.py b/tests/utils_test.py new file mode 100644 index 00000000..b62bbc39 --- /dev/null +++ b/tests/utils_test.py @@ -0,0 +1,180 @@ +# Copyright (C) 2021 - 2023 Christian Ledermann +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +"""Test the utils module.""" +from fastkml import Schema +from fastkml import SchemaData +from fastkml import kml +from fastkml.utils import find_all +from tests.base import Lxml +from tests.base import StdLibrary + + +class TestFindAll(StdLibrary): + """Test the find_all function.""" + + def test_find_all(self) -> None: + + class A: + def __init__(self, x: int) -> None: + self.x = x + + class B: + def __init__(self, y: int) -> None: + self.y = y + + class C: + def __init__(self, z: int) -> None: + self.z = z + + class D: + def __init__(self, a: A, b: B, c: C) -> None: + self.a = a + self.b = b + self.c = c + + a1 = A(1) + a2 = A(2) + b1 = B(1) + b2 = B(2) + c1 = C(1) + c2 = C(2) + d1 = D(a1, b1, c1) + d2 = D(a2, b2, c2) + + result = list(find_all(d1, of_type=A)) + assert result == [a1] + + result = list(find_all(d1, of_type=B)) + assert result == [b1] + + result = list(find_all(d1, of_type=C)) + assert result == [c1] + + result = list(find_all(d1, of_type=D)) + assert result == [d1] + + result = list(find_all(d1, of_type=A, x=1)) + assert result == [a1] + + result = list(find_all(d1, of_type=A, x=2)) + assert not result + + result = list(find_all(d2, of_type=A, x=2)) + assert result == [a2] + + def test_find_all_empty(self) -> None: + result = list(find_all(None, of_type=None)) + assert result == [None] + + def test_find_all_no_type(self) -> None: + class A: + def __init__(self, x: int) -> None: + self.x = x + + a1 = A(1) + + result = list(find_all(a1, of_type=None)) + assert result == [a1, 1] + + def test_find_all_no_type_attr_x(self) -> None: + class A: + def __init__(self, x: int) -> None: + self.x = x + + a1 = A(1) + + result = list(find_all(a1, x=1)) + assert result == [a1] + + def test_find_schema_by_url(self) -> None: + doc = ( + '' + "" + "ExtendedData+SchemaData" + "1" + "" + '" + '' + '' + '' + "Trail Head Name]]>" + "" + '' + "The length in miles]]>" + "" + '' + "change in altitude]]>" + "" + "" + "" + "" + "Easy trail" + "#trailhead-balloon-template" + "" + '' + 'Pi in the sky' + '3.14159' + '10' + "" + "" + "" + "-122.000,37.002" + "" + "" + "" + "Difficult trail" + "#trailhead-balloon-template" + "" + '' + 'Mount Everest' + '347.45' + '10000' + "" + "" + "" + "-121.998,37.0078" + "" + "" + "" + "" + ) + k = kml.KML.from_string(doc, strict=False) + + schema = list(find_all(k, of_type=Schema, id="TrailHeadTypeId")) + schema_data = list(find_all(k, of_type=SchemaData)) + assert len(schema) == 1 + assert schema[0].id == "TrailHeadTypeId" # type: ignore[attr-defined] + assert len(schema_data) == 2 + for data in schema_data: + assert isinstance(data, SchemaData) + assert data.schema_url == "#TrailHeadTypeId" + + +class TestFindAllLxml(Lxml): + """Run the tests using lxml."""