Plugin Directory

Changeset 2834688


Ignore:
Timestamp:
12/15/2022 09:16:02 PM (3 years ago)
Author:
rmanaf
Message:

1.4.0

Location:
heimdall/trunk
Files:
28 added
23 deleted
10 edited

Legend:

Unmodified
Added
Removed
  • heimdall/trunk/LICENSE

    r2340542 r2834688  
    1 MIT License
    2 
    3 Copyright (c) 2018 Arman Afzal <rman.afzal@gmail.com>
    4 
    5 Permission is hereby granted, free of charge, to any person obtaining a copy
    6 of this software and associated documentation files (the "Software"), to deal
    7 in the Software without restriction, including without limitation the rights
    8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    9 copies of the Software, and to permit persons to whom the Software is
    10 furnished to do so, subject to the following conditions:
    11 
    12 The above copyright notice and this permission notice shall be included in all
    13 copies or substantial portions of the Software.
    14 
    15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    21 SOFTWARE.
    22 
     1Copyright (c) 2018-2023 WP Heimdall <info@wp-heimdall.com>
    232
    243Third-Party Licenses :
    254
     5 - tagEditor :
     6    The MIT License
    267
    27 tagEditor :
    28 
    29 The MIT License
    30 
    31 
    32 Chart.js :
    33 
    34 The MIT License
     8 - Chart.js :
     9    The MIT License
  • heimdall/trunk/addons/most-used-keywords/assets/js/muk-scripts.js

    r2340542 r2834688  
    1 ;(($) => {
     1;(($ , dt) => {
    22    "use strict";
     3
    34    $(document).ready(() => {
    45
    56        var $muk =  $('#most-used-keywords')
    67       
    7         if(heimdall['keywords'].length > 0)
     8        if(dt['keywords'].length > 0)
    89        {
    910            $muk.empty();
    1011        }
    1112
    12         heimdall['keywords'].forEach((e,i)=>{
     13        dt['keywords'].forEach((e,i)=>{
    1314
    1415            var $meta = $('<li>')
     
    2223    })
    2324   
    24 })(jQuery);
     25})(jQuery , HeimdallData);
  • heimdall/trunk/addons/most-used-keywords/most-used-keywords.php

    r2340542 r2834688  
    11<?php
    22
    3 /**
    4  * MIT License <https://github.com/Rmanaf/wp-heimdall/blob/master/LICENSE>
    5  * Copyright (c) 2018 Arman Afzal <rman.afzal@gmail.com>
    6  */
     3namespace Heimdall\Addons;
    74
    8 if (!class_exists('WP_HeimdallAddon_MostUsedKeywords')) {
    9    
    10     class WP_HeimdallAddon_MostUsedKeywords
     5use DateInterval;
     6use DateTime;
     7use Heimdall\Addon;
     8use Heimdall\Dashboard;
     9use Heimdall\Database as db;
     10use Heimdall\Helpers as hp;
     11
     12class MostUsedKeywords extends Addon
     13{
     14
     15    static function setup()
    1116    {
     17        add_action('pre_get_posts', [__CLASS__, "pre_get_posts"]);
     18        add_action("admin_enqueue_scripts", [__CLASS__, "admin_enqueue_scripts"]);
     19        add_action("heimdall__widget_before-content", [__CLASS__, "dashboard_widget"], 10);
    1220
    13         // addon slug
    14         private static $slug = "most-used-keywords";
    15        
    16 
    17         /**
    18          * @since 1.3.1
    19          */
    20         static function init()
    21         {
    22            
    23             $class = get_called_class();
    24 
    25             add_action("admin_enqueue_scripts", "$class::admin_enqueue_scripts");
    26 
    27             add_action("heimdall--dashboard-statistic-widget" , "$class::dashboard_statistic_widget" , 10);
    28 
    29             add_filter("heimdall--localize-script", "$class::get_kewords_data", 10, 1);
    30 
    31         }
    32 
    33         /**
    34          * @since 1.0.0
    35          */
    36         static function admin_enqueue_scripts()
    37         {
    38 
    39             $screen = get_current_screen();
    40 
    41             if(current_user_can( 'administrator' ) && $screen->id  == 'dashboard' )
    42             {
    43                 wp_enqueue_style("muk-styles", WP_Heimdall_Plugin::addon_url(self::$slug ,  '/assets/css/muk-styles.css'), [], WP_Heimdall_Plugin::$version, "all");
    44            
    45                 wp_enqueue_script("muk-script", WP_Heimdall_Plugin::addon_url(self::$slug ,  '/assets/js/muk-scripts.js'), ["jquery"], WP_Heimdall_Plugin::$version , true);
    46             }
    47 
    48         }
    49 
    50         /**
    51          * @since 1.0.0
    52          */
    53         static function dashboard_statistic_widget()
    54         {
    55             ?>
    56             <h3><?php esc_html_e("The Most Searched Terms of the Past 7 Days:" , "heimdall"); ?></h3>
    57             <ul id="most-used-keywords" class="keywords">
    58                 <li><?php esc_html_e("No terms found." , "heimdall"); ?></li>
    59             </ul>
    60             <?php
    61         }
     21        add_filter("heimdall__core_localize-script", [__CLASS__, "get_kewords_data"], 10, 1);
     22    }
    6223
    6324
    64         /**
    65          * @since 1.0.0
    66          */
    67         static function get_kewords_data($data)
    68         {
     25    static function admin_enqueue_scripts()
     26    {
     27        $screen = get_current_screen();
    6928
    70             global $wpdb;
     29        if (current_user_can('administrator') && $screen->id  == 'dashboard') {
     30            wp_enqueue_style("muk-styles",  self::get_url('/assets/css/muk-styles.css'),  [],  HEIMDALL_VER, "all");
     31            wp_enqueue_script("muk-script", self::get_url('/assets/js/muk-scripts.js'), ["jquery"],  HEIMDALL_VER, true);
     32        }
     33    }
    7134
    72             // get GMT
    73             $cdate = current_time( 'mysql' , 1 );
     35    /**
     36     * @since 1.0.0
     37     */
     38    static function dashboard_widget()
     39    {
     40        $template = '<h3>%1$s</h3><ul id="most-used-keywords" class="keywords"><li>%2$s</li></ul>';
     41        $title = esc_html__("The Most Searched Terms of the Past 7 Days:", "heimdall");
     42        $content = esc_html__("No terms found.", "heimdall");
    7443
    75             $start = new DateTime($cdate);
    76             $start->sub(new DateInterval('P6D'));
    77 
    78             // today
    79             $end = new DateTime($cdate);
    80 
    81             $dt = $wpdb->get_results(self::get_most_used_keywords_query($start , $end), ARRAY_A);
    82 
    83             $data['keywords'] = $dt;
    84 
    85             return $data;
    86 
    87         }
     44        printf($template, $title, $content);
     45    }
    8846
    8947
    90         /**
    91          * @since 1.0.0
    92          */
    93         static function get_most_used_keywords_query($start , $end)
    94         {
    95             // convert dates to mysql format
    96             $start = $start->format('Y-m-d H:i:s');
    97             $end   = $end->format('Y-m-d H:i:s');
     48    /**
     49     * @since 1.0.0
     50     */
     51    static function get_kewords_data($data)
     52    {
     53        global $wpdb;
    9854
    99             $blog_id = get_current_blog_id();
     55        // get GMT
     56        $cdate = current_time('mysql', 1);
    10057
    101             $table_name = WP_Heimdall_Database::$table_name;
     58        $start = new DateTime($cdate);
     59        $start->sub(new DateInterval('P6D'));
    10260
    103             return "SELECT COUNT(*) count, meta
     61        // today
     62        $end = new DateTime($cdate);
     63
     64        $dt = $wpdb->get_results(self::get_most_used_keywords_query($start, $end), ARRAY_A);
     65
     66        $data['keywords'] = $dt;
     67
     68        return $data;
     69    }
     70
     71
     72    /**
     73     * @since 1.0.0
     74     */
     75    static function get_most_used_keywords_query($start, $end)
     76    {
     77        // convert dates to mysql format
     78        $start = $start->format('Y-m-d H:i:s');
     79        $end   = $end->format('Y-m-d H:i:s');
     80
     81        $blog_id = get_current_blog_id();
     82
     83        $table_name = db::get_table();
     84
     85        return "SELECT COUNT(*) count, meta
    10486                    FROM $table_name
    10587                    WHERE `type`='4' AND `blog`='$blog_id' AND `meta` IS NOT NULL AND (`time` BETWEEN '$start' AND '$end')
    10688                    GROUP BY meta
    10789                    ORDER BY count DESC
    108                     LIMIT 20" ;
     90                    LIMIT 20";
     91    }
    10992
     93
     94    static function pre_get_posts($query)
     95    {
     96
     97        if (is_admin() || is_customize_preview()) {
     98            return;
    11099        }
    111100
     101        if ($query->is_search() && $query->is_main_query()) {
     102
     103            $keyword = get_search_query();
     104
     105            // ignore whitespace and empty values
     106            if (empty(trim($keyword))) {
     107                return;
     108            }
     109
     110            $is_mobile = hp::is_mobile_device();
     111
     112            db::insert_once(
     113                hp::get_ip_address(),
     114                null,
     115                4,
     116                'pre_get_posts',
     117                hp::get_url(false),
     118                $_SERVER['HTTP_USER_AGENT'] ?: null,
     119                is_null($is_mobile) ? 0 : ($is_mobile ? 2 : 1),
     120                hp::get_os(),
     121                hp::get_browser(),
     122                $keyword
     123            );
     124        }
    112125    }
    113 
    114126}
  • heimdall/trunk/addons/today/assets/js/today-admin.js

    r2571934 r2834688  
    1 ; (($) => {
     1; (($, hm, dt) => {
    22    "use strict";
    33
     4    const _storageKey = "todayAdmin";
     5
    46    $(document).ready(() => {
    5         $.post(heimdall['ajaxurl'], {
     7
     8        const cache = hm.readFromLocalStorage( _storageKey );
     9        const data = cache?.data;
     10
     11        if (data) {
     12            createChart(data);
     13            return;
     14        }
     15
     16        $.post(dt['ajaxurl'], {
    617            'action': 'heimdall_today_report',
    7             '_wpnonce': heimdall['ajaxnonce']
     18            '_wpnonce': dt['ajaxnonce']
    819        }, (res) => {
    9             var ctx = $("#statisticsTodayChart")[0];
    10 
    11             $("#statisticsTodayChart").parents('.busy').removeClass('busy');
    1220
    1321            var now_hour = parseInt(res.data['today_now_hour']);
     
    3947                data: zarray,
    4048                pointRadius: 0,
    41                 lineTension: 0
     49                lineTension: 0,
     50                fill: false,
     51                cubicInterpolationMode: 'monotone',
     52                tension: 0.4
    4253            }, {
    4354                label: 'Unique Visitors',
     
    4758                data: yarray,
    4859                pointRadius: 0,
    49                 lineTension: 0
     60                lineTension: 0,
     61                fill: false,
     62                cubicInterpolationMode: 'monotone',
     63                tension: 0.4
    5064            }, {
    5165                label: 'Home Page',
     
    5569                data: parray,
    5670                pointRadius: 0,
    57                 lineTension: 0
     71                lineTension: 0,
     72                fill: false,
     73                cubicInterpolationMode: 'monotone',
     74                tension: 0.4
    5875            }];
    5976
    60             if (heimdall['is_multisite'] == '1') {
     77            if (dt['is_multisite'] == '1') {
    6178                dtset.push({
    6279                    label: 'This Blog',
     
    6683                    data: warray,
    6784                    pointRadius: 0,
    68                     lineTension: 0
     85                    lineTension: 0,
     86                    fill: false,
     87                    cubicInterpolationMode: 'monotone',
     88                    tension: 0.4
    6989                });
    7090            }
    7191
    72             new Chart(ctx, {
    73                 type: 'line',
    74                 data: {
    75                     labels: Array.apply(null, { length: 24 }).map(Number.call, Number),
    76                     datasets: dtset
     92            hm.updateLocalStorage( _storageKey ,  dtset , 5 * 60 * 1000 );
     93
     94            createChart(dtset);
     95
     96        });
     97
     98    });
     99
     100    function createChart(dtset) {
     101
     102        const ctx = $("#statisticsTodayChart");
     103
     104        ctx.parents('.busy').removeClass('busy');
     105
     106        new Chart(ctx[0], {
     107            type: 'line',
     108            data: {
     109                labels: Array.apply(null, { length: 24 }).map(Number.call, Number).map(v => _nttr(v) + " - " + _nttr(v+1)),
     110                datasets: dtset
     111            },
     112            options: {
     113                responsive: true,
     114                maintainAspectRatio: false,
     115                layout: {
     116                    padding: {
     117                        left: 5,
     118                        top: 20,
     119                        right: 5
     120                    }
    77121                },
    78                 options: {
    79                     tooltips: {
    80                         mode: 'index',
    81                         intersect: false,
    82                         cornerRadius: 4,
    83                         footerFontColor: '#ccc',
    84                         footerFontStyle: 'normal'
     122                interaction: {
     123                    intersect: false,
     124                    position: 'average',
     125                    titleAlign: 'center',
     126                    usePointStyle: true,
     127                    mode: 'index',
     128                    axis: 'x'
     129                },
     130                plugins: {
     131                    legend: {
     132                        display: true,
     133                        position: 'bottom'
     134                    }
     135                },
     136                scales: {
     137                    x: {
     138                        ticks: {
     139                            callback: _nttr
     140                        }
    85141                    },
    86                     responsive: true,
    87                     maintainAspectRatio: false,
    88                     scales: {
    89                         yAxes: [{
    90                             ticks: {
    91                                 beginAtZero: true,
    92                                 callback: function (value) { if (value % 1 === 0) { return value; } }
    93                             }
    94                         }]
     142                    y: {
     143                        beginAtZero: true
    95144                    }
    96145                }
    97             });
     146            }
    98147        });
    99     });
     148    }
    100149
     150    function _nttr(v){
     151        return (v < 10 ? '0' + v : v) + ":00";
     152     }
    101153
    102 })(jQuery);
     154})(jQuery, Heimdall, HeimdallData);
  • heimdall/trunk/addons/today/today.php

    r2571934 r2834688  
    11<?php
    22
    3 /**
    4  * MIT License <https://github.com/Rmanaf/wp-heimdall/blob/master/LICENSE>
    5  * Copyright (c) 2018 Arman Afzal <rman.afzal@gmail.com>
    6  */
    7  
    8 if (!class_exists('WP_HeimdallAddon_Today')) {
    9    
    10    
    11     class WP_HeimdallAddon_Today
     3namespace Heimdall\Addons;
     4
     5use DateInterval;
     6use DateTime;
     7use Heimdall\Addon;
     8use Heimdall\Dashboard;
     9use Heimdall\Database;
     10use Heimdall\Options;
     11
     12class Today extends Addon
     13{
     14
     15    static function setup()
     16    {
     17        add_action("admin_enqueue_scripts", [__CLASS__, "admin_enqueue_scripts"]);
     18        add_action("wp_ajax_heimdall_today_report", [__CLASS__, "get_today_report_data"]);
     19
     20        add_filter("heimdall__widget_tabs", [__CLASS__, "widget_tabs"]);
     21        add_filter("heimdall__widget_content", [__CLASS__, "widget_content"]);
     22    }
     23
     24    static function widget_tabs($tabs_html)
     25    {
     26        return $tabs_html . Dashboard::create_widget_tab(
     27            self::get_slug(),
     28            esc_html__("Today", "heimdall"),
     29            'chart-line'
     30        );
     31    }
     32
     33
     34    static function widget_content($tabs_html)
     35    {
     36        $template = '<div class="chart-container-today" style="%1$s">%2$s</div>';
     37        $style = 'position: relative; width:100%; height:300px;';
     38        $canvas = '<canvas id="statisticsTodayChart"></canvas>';
     39        return $tabs_html . Dashboard::create_widget_tab_content(self::get_slug(),  sprintf($template, $style, $canvas));
     40    }
     41
     42
     43    static function admin_enqueue_scripts()
     44    {
     45        $screen = get_current_screen();
     46
     47        if (current_user_can('administrator') && $screen->id  == 'dashboard') {
     48            self::enqueue_script("today-report", '/assets/js/today-admin.js', true, ['jquery', 'heimdall']);
     49        }
     50    }
     51
     52
     53
     54    static function get_today_report_data()
    1255    {
    1356
    14          // addon slug
    15         private static $slug = "today";
     57        global $wpdb;
    1658
     59        check_ajax_referer("heimdall-nonce");
    1760
    18         /**
    19          * @since 1.3.1
    20          */
    21         static function init(){
    22            
    23             $class = get_called_class();
     61        $data = [];
    2462
    25             add_action("admin_enqueue_scripts", "$class::admin_enqueue_scripts");
     63        // get GMT
     64        $cdate = current_time('mysql', 1);
    2665
    27             // add_action("heimdall--dashboard-statistic-widget" , "$class::dashboard_statistic_widget" , 20);
     66        // start from 6 days ago
     67        $start = new DateTime($cdate);
     68        $start->sub(new DateInterval('PT24H'));
    2869
    29             add_action("heimdall--dashboard-statistic-widget-tabs", "$class::dashboard_statistic_widget_tabs", 10);
     70        // today
     71        $end = new DateTime($cdate);
    3072
    31             add_action("heimdall--dashboard-statistic-widget-tab-content", "$class::dashboard_statistic_widget_tab_content", 10);
     73        $data['today'] = $wpdb->get_results(self::get_chart_query($start, $end), ARRAY_A);
    3274
    33             //add_filter("heimdall--localize-script", "$class::get_today_report_data" , 10, 1);
     75        $data['today_now_hour'] = (new DateTime($cdate))->format('H');
    3476
    35             add_action("wp_ajax_heimdall_today_report" , "$class::get_today_report_data");
    36            
    37         }
     77        wp_send_json_success($data);
     78    }
    3879
    39         /**
    40          * @since 1.3.1
    41          */
    42         static function dashboard_statistic_widget(){
    43         }
     80    /**
     81     * @since 1.0.0
     82     */
     83    static function get_chart_query($start, $end)
     84    {
    4485
     86        // convert dates to mysql format
     87        $start = $start->format('Y-m-d H:i:s');
     88        $end   = $end->format('Y-m-d H:i:s');
    4589
    46         /**
    47          * @since 1.3.1
    48          */
    49         static function dashboard_statistic_widget_tabs(){
    50             WP_Heimdall_Dashboard::create_admin_widget_tab(esc_html__( "Today", "heimdall") , "today");
    51         }
     90        $blog_id = get_current_blog_id();
    5291
     92        $extra_field = is_multisite() ? ", SUM(case when blog='$blog_id' then 1 else 0 end) w" : "";
    5393
    54         /**
    55          * @since 1.3.1
    56          */
    57         static function dashboard_statistic_widget_tab_content(){
     94        $table_name = Database::get_table();
    5895
    59             ob_start();
     96        $hook = Options::get_statistic_hook();
    6097
    61             ?>
    62             <div class="chart-container-today" style="position: relative; width:100%; height:300px;">
    63                 <canvas id="statisticsTodayChart"></canvas>
    64             </div>
    65             <?php
    66 
    67             WP_Heimdall_Dashboard::create_admin_widget_tab_content("today" , ob_get_clean() );
    68 
    69         }
    70 
    71 
    72         /**
    73          * @since 1.3.1
    74          */
    75         static function admin_enqueue_scripts(){
    76 
    77             $screen = get_current_screen();
    78 
    79             if(current_user_can( 'administrator' ) && $screen->id  == 'dashboard' )
    80             {
    81 
    82                 wp_enqueue_script("today-report", WP_Heimdall_Plugin::addon_url(self::$slug ,  '/assets/js/today-admin.js'), ['jquery'], WP_Heimdall_Plugin::$version, true);
    83 
    84             }
    85 
    86         }
    87 
    88 
    89         /**
    90          * @since 1.3.1
    91          */
    92         static function get_today_report_data(){
    93 
    94             global $wpdb;
    95 
    96             check_ajax_referer("heimdall-nonce");
    97 
    98             $data = [];
    99 
    100             // get GMT
    101             $cdate = current_time( 'mysql' , 1 );
    102 
    103             // start from 6 days ago
    104             $start = new DateTime($cdate);
    105             $start->sub(new DateInterval('PT24H'));
    106 
    107             // today
    108             $end = new DateTime($cdate);
    109 
    110             $data['today'] = $wpdb->get_results(self::get_chart_query($start , $end), ARRAY_A );
    111 
    112             $data['today_now_hour'] = (new DateTime($cdate))->format('H');
    113 
    114             wp_send_json_success( $data );
    115 
    116         }
    117 
    118         /**
    119          * @since 1.0.0
    120          */
    121         static function get_chart_query($start , $end)
    122         {
    123 
    124             // convert dates to mysql format
    125             $start = $start->format('Y-m-d H:i:s');
    126             $end   = $end->format('Y-m-d H:i:s');
    127 
    128             $blog_id = get_current_blog_id();
    129            
    130             $extra_field = is_multisite() ? ", SUM(case when blog='$blog_id' then 1 else 0 end) w" : "";
    131            
    132             $table_name = WP_Heimdall_Database::$table_name;
    133 
    134             return "SELECT HOUR(time) x,
     98        return "SELECT HOUR(time) x,
    13599                COUNT(DISTINCT ip) y,
    136100                COUNT(*) z,
     
    140104                WHERE (time BETWEEN '$start' AND '$end')
    141105                AND type != '4'
     106                AND hook = '$hook'
    142107                GROUP BY x";
    143 
    144         }
    145 
    146108    }
    147 
    148109}
  • heimdall/trunk/addons/weekly-report/weekly-report.php

    r2571934 r2834688  
    11<?php
    22
    3 /**
    4  * MIT License <https://github.com/Rmanaf/wp-heimdall/blob/master/LICENSE>
    5  * Copyright (c) 2018 Arman Afzal <rman.afzal@gmail.com>
    6  */
    7  
    8 if (!class_exists('WP_HeimdallAddon_WeeklyReport')) {
    9    
    10     class WP_HeimdallAddon_WeeklyReport
    11     {
    12        
    13         // addon slug
    14         private static $slug = "weekly-report";
     3namespace Heimdall\Addons;
     4
     5use DateInterval;
     6use DateTime;
     7use Heimdall\Addon;
     8use Heimdall\Dashboard;
     9use Heimdall\Database;
     10
     11class WeeklyReport extends Addon
     12{
    1513
    1614
    17         /**
    18          * @since 1.3.1
    19          */
    20         static function init()
    21         {
     15    static function setup()
     16    {
     17        add_action("admin_enqueue_scripts", [__CLASS__, "admin_enqueue_scripts"]);
     18        add_action("wp_ajax_heimdall_weekly_report", [__CLASS__, "get_weekly_report_data"]);
    2219
    23             $class = get_called_class();
    24 
    25             add_action("admin_enqueue_scripts", "$class::admin_enqueue_scripts");
    26 
    27             // add_action("heimdall--dashboard-statistic-widget" , "$class::dashboard_statistic_widget" , 10);
    28 
    29             add_action("heimdall--dashboard-statistic-widget-tabs", "$class::dashboard_statistic_widget_tabs", 10);
    30 
    31             add_action("heimdall--dashboard-statistic-widget-tab-content", "$class::dashboard_statistic_widget_tab_content", 10);
    32 
    33             //add_filter("heimdall--localize-script", "$class::get_weekly_report_data" , 10, 1);
    34 
    35             add_action("wp_ajax_heimdall_weekly_report" , "$class::get_weekly_report_data");
    36 
    37         }
    38 
    39         /**
    40          * @since 1.0.0
    41          */
    42         static function admin_enqueue_scripts()
    43         {
    44            
    45             $screen = get_current_screen();
    46 
    47             if(current_user_can( 'administrator' ) && $screen->id  == 'dashboard' )
    48             {
    49 
    50                 wp_enqueue_script("weekly-report", WP_Heimdall_Plugin::addon_url(self::$slug ,  '/assets/js/statistics-admin.js'), ['jquery'], WP_Heimdall_Plugin::$version, true);
    51 
    52             }
    53 
    54         }
    55 
    56        
    57         /**
    58          * @since 1.0.0
    59          */
    60         static function dashboard_statistic_widget()
    61         {
    62         }
     20        add_filter("heimdall__widget_tabs", [__CLASS__, "widget_tabs"]);
     21        add_filter("heimdall__widget_content", [__CLASS__, "widget_content"]);
     22    }
    6323
    6424
     25    static function admin_enqueue_scripts()
     26    {
     27        $screen = get_current_screen();
    6528
    66         /**
    67          * @since 1.3.1
    68          */
    69         static function dashboard_statistic_widget_tabs(){
    70 
    71             WP_Heimdall_Dashboard::create_admin_widget_tab(esc_html__( "Visits (7 days)", "heimdall" )   , "views");
    72 
     29        if (current_user_can('administrator') && $screen->id  == 'dashboard') {
     30            self::enqueue_script("weekly-report", '/assets/js/statistic-admin.js', true, ['jquery', 'heimdall']);
    7331        }
    74 
    75         /**
    76          * @since 1.3.1
    77          */
    78         static function dashboard_statistic_widget_tab_content(){
    79 
    80             ob_start();
    81 
    82             ?>
    83             <div class="chart-container" style="position: relative; width:100%; height:300px;">
    84                 <canvas id="statisticsChart"></canvas>
    85             </div>
    86             <?php
    87 
    88             WP_Heimdall_Dashboard::create_admin_widget_tab_content("views" , ob_get_clean() );
    89 
    90         }
     32    }
    9133
    9234
    93         /**
    94          * @since 1.0.0
    95          */
    96         static function get_weekly_report_data()
    97         {
     35    static function widget_tabs($tabs_html)
     36    {
     37        return $tabs_html . Dashboard::create_widget_tab(
     38            self::get_slug(),
     39            esc_html__("Visits (7 days)", "heimdall"),
     40            'calendar'
     41        );
     42    }
    9843
    99             global $wpdb;
     44    static function widget_content($tabs_html)
     45    {
     46        $template = '<div class="chart-container" style="%1$s">%2$s</div>';
     47        $style = 'position: relative; width:100%; height:300px;';
     48        $canvas = '<canvas id="statisticChart"></canvas>';
    10049
    101             check_ajax_referer("heimdall-nonce");
     50        return $tabs_html . Dashboard::create_widget_tab_content(
     51            self::get_slug(),
     52            sprintf($template, $style, $canvas)
     53        );
     54    }
    10255
    103             // get GMT
    104             $cdate = current_time( 'mysql' , 1 );
     56    static function get_weekly_report_data()
     57    {
    10558
    106             // start from 6 days ago
    107             $start = new DateTime($cdate);
    108             $start->sub(new DateInterval('P6D'));
     59        global $wpdb;
    10960
    110             // today
    111             $end = new DateTime($cdate);
     61        check_ajax_referer("heimdall-nonce");
    11262
    113             $data = $wpdb->get_results(self::get_chart_query($start , $end), ARRAY_A );
     63        // get GMT
     64        $cdate = current_time('mysql', 1);
    11465
    115             wp_send_json_success( $data );
     66        // start from 6 days ago
     67        $start = new DateTime($cdate);
     68        $start->sub(new DateInterval('P6D'));
    11669
    117         }
     70        // today
     71        $end = new DateTime($cdate);
    11872
    119         /**
    120          * @since 1.0.0
    121          */
    122         static function get_chart_query($start , $end)
    123         {
     73        $data = $wpdb->get_results(self::get_chart_query($start, $end), ARRAY_A);
    12474
    125             // convert dates to mysql format
    126             $start = $start->format('Y-m-d H:i:s');
    127             $end   = $end->format('Y-m-d H:i:s');
     75        wp_send_json_success($data);
     76    }
    12877
    129             $blog_id = get_current_blog_id();
    130             
    131             $extra_field = is_multisite() ? ", SUM(case when blog='$blog_id' then 1 else 0 end) w" : "";
    132            
    133             $table_name = WP_Heimdall_Database::$table_name;
     78    /**
     79     * @since 1.0.0
     80     */
     81    static function get_chart_query($start, $end)
     82    {
    13483
    135             return "SELECT WEEKDAY(time) x,
     84        // convert dates to mysql format
     85        $start = $start->format('Y-m-d H:i:s');
     86        $end   = $end->format('Y-m-d H:i:s');
     87
     88        $blog_id = get_current_blog_id();
     89
     90        $extra_field = is_multisite() ? ", SUM(case when blog='$blog_id' then 1 else 0 end) w" : "";
     91
     92        $table_name = Database::get_table();
     93
     94        return "SELECT WEEKDAY(time) x,
    13695                COUNT(DISTINCT ip) y,
    13796                COUNT(*) z,
     
    142101                AND type != '4'
    143102                GROUP BY x";
    144 
    145         }
    146 
    147 
    148103    }
    149 
    150104}
  • heimdall/trunk/addons/world-map/assets/countries.json

    r2340542 r2834688  
    1 [
    2     {
    3         "timezones": [
    4             "America/Aruba"
    5         ],
    6         "latlng": [
    7             12.5,
    8             -69.96666666
    9         ],
    10         "name": "Aruba",
    11         "code": "AW",
    12         "capital": "Oranjestad"
    13     },
    14     {
    15         "timezones": [
    16             "Asia/Kabul"
    17         ],
    18         "latlng": [
    19             33,
    20             65
    21         ],
    22         "name": "Afghanistan",
    23         "code": "AF",
    24         "capital": "Kabul"
    25     },
    26     {
    27         "timezones": [
    28             "Africa/Luanda"
    29         ],
    30         "latlng": [
    31             -12.5,
    32             18.5
    33         ],
    34         "name": "Angola",
    35         "code": "AO",
    36         "capital": "Luanda"
    37     },
    38     {
    39         "timezones": [
    40             "America/Anguilla"
    41         ],
    42         "latlng": [
    43             18.25,
    44             -63.16666666
    45         ],
    46         "name": "Anguilla",
    47         "code": "AI",
    48         "capital": "The Valley"
    49     },
    50     {
    51         "timezones": [
    52             "Europe/Mariehamn"
    53         ],
    54         "latlng": [
    55             60.116667,
    56             19.9
    57         ],
    58         "name": "\u00c5land Islands",
    59         "code": "AX",
    60         "capital": "Mariehamn"
    61     },
    62     {
    63         "timezones": [
    64             "Europe/Tirane"
    65         ],
    66         "latlng": [
    67             41,
    68             20
    69         ],
    70         "name": "Albania",
    71         "code": "AL",
    72         "capital": "Tirana"
    73     },
    74     {
    75         "timezones": [
    76             "Europe/Andorra"
    77         ],
    78         "latlng": [
    79             42.5,
    80             1.5
    81         ],
    82         "name": "Andorra",
    83         "code": "AD",
    84         "capital": "Andorra la Vella"
    85     },
    86     {
    87         "timezones": [
    88             "Asia/Dubai"
    89         ],
    90         "latlng": [
    91             24,
    92             54
    93         ],
    94         "name": "United Arab Emirates",
    95         "code": "AE",
    96         "capital": "Abu Dhabi"
    97     },
    98     {
    99         "timezones": [
    100             "America/Argentina/Buenos_Aires",
    101             "America/Argentina/Cordoba",
    102             "America/Argentina/Salta",
    103             "America/Argentina/Jujuy",
    104             "America/Argentina/Tucuman",
    105             "America/Argentina/Catamarca",
    106             "America/Argentina/La_Rioja",
    107             "America/Argentina/San_Juan",
    108             "America/Argentina/Mendoza",
    109             "America/Argentina/San_Luis",
    110             "America/Argentina/Rio_Gallegos",
    111             "America/Argentina/Ushuaia"
    112         ],
    113         "latlng": [
    114             -34,
    115             -64
    116         ],
    117         "name": "Argentina",
    118         "code": "AR",
    119         "capital": "Buenos Aires"
    120     },
    121     {
    122         "timezones": [
    123             "Asia/Yerevan"
    124         ],
    125         "latlng": [
    126             40,
    127             45
    128         ],
    129         "name": "Armenia",
    130         "code": "AM",
    131         "capital": "Yerevan"
    132     },
    133     {
    134         "timezones": [
    135             "Pacific/Pago_Pago"
    136         ],
    137         "latlng": [
    138             -14.33333333,
    139             -170
    140         ],
    141         "name": "American Samoa",
    142         "code": "AS",
    143         "capital": "Pago Pago"
    144     },
    145     {
    146         "timezones": [
    147             "Antarctica/McMurdo",
    148             "Antarctica/Casey",
    149             "Antarctica/Davis",
    150             "Antarctica/DumontDUrville",
    151             "Antarctica/Mawson",
    152             "Antarctica/Palmer",
    153             "Antarctica/Rothera",
    154             "Antarctica/Syowa",
    155             "Antarctica/Troll",
    156             "Antarctica/Vostok"
    157         ],
    158         "latlng": [
    159             -90,
    160             0
    161         ],
    162         "name": "Antarctica",
    163         "code": "AQ",
    164         "capital": null
    165     },
    166     {
    167         "timezones": [
    168             "Indian/Kerguelen"
    169         ],
    170         "latlng": [
    171             -49.25,
    172             69.167
    173         ],
    174         "name": "French Southern and Antarctic Lands",
    175         "code": "TF",
    176         "capital": "Port-aux-Fran\u00e7ais"
    177     },
    178     {
    179         "timezones": [
    180             "America/Antigua"
    181         ],
    182         "latlng": [
    183             17.05,
    184             -61.8
    185         ],
    186         "name": "Antigua and Barbuda",
    187         "code": "AG",
    188         "capital": "Saint John's"
    189     },
    190     {
    191         "timezones": [
    192             "Australia/Lord_Howe",
    193             "Antarctica/Macquarie",
    194             "Australia/Hobart",
    195             "Australia/Currie",
    196             "Australia/Melbourne",
    197             "Australia/Sydney",
    198             "Australia/Broken_Hill",
    199             "Australia/Brisbane",
    200             "Australia/Lindeman",
    201             "Australia/Adelaide",
    202             "Australia/Darwin",
    203             "Australia/Perth",
    204             "Australia/Eucla"
    205         ],
    206         "latlng": [
    207             -27,
    208             133
    209         ],
    210         "name": "Australia",
    211         "code": "AU",
    212         "capital": "Canberra"
    213     },
    214     {
    215         "timezones": [
    216             "Europe/Vienna"
    217         ],
    218         "latlng": [
    219             47.33333333,
    220             13.33333333
    221         ],
    222         "name": "Austria",
    223         "code": "AT",
    224         "capital": "Vienna"
    225     },
    226     {
    227         "timezones": [
    228             "Asia/Baku"
    229         ],
    230         "latlng": [
    231             40.5,
    232             47.5
    233         ],
    234         "name": "Azerbaijan",
    235         "code": "AZ",
    236         "capital": "Baku"
    237     },
    238     {
    239         "timezones": [
    240             "Africa/Bujumbura"
    241         ],
    242         "latlng": [
    243             -3.5,
    244             30
    245         ],
    246         "name": "Burundi",
    247         "code": "BI",
    248         "capital": "Bujumbura"
    249     },
    250     {
    251         "timezones": [
    252             "Europe/Brussels"
    253         ],
    254         "latlng": [
    255             50.83333333,
    256             4
    257         ],
    258         "name": "Belgium",
    259         "code": "BE",
    260         "capital": "Brussels"
    261     },
    262     {
    263         "timezones": [
    264             "Africa/Porto-Novo"
    265         ],
    266         "latlng": [
    267             9.5,
    268             2.25
    269         ],
    270         "name": "Benin",
    271         "code": "BJ",
    272         "capital": "Porto-Novo"
    273     },
    274     {
    275         "timezones": [
    276             "Africa/Ouagadougou"
    277         ],
    278         "latlng": [
    279             13,
    280             -2
    281         ],
    282         "name": "Burkina Faso",
    283         "code": "BF",
    284         "capital": "Ouagadougou"
    285     },
    286     {
    287         "timezones": [
    288             "Asia/Dhaka"
    289         ],
    290         "latlng": [
    291             24,
    292             90
    293         ],
    294         "name": "Bangladesh",
    295         "code": "BD",
    296         "capital": "Dhaka"
    297     },
    298     {
    299         "timezones": [
    300             "Europe/Sofia"
    301         ],
    302         "latlng": [
    303             43,
    304             25
    305         ],
    306         "name": "Bulgaria",
    307         "code": "BG",
    308         "capital": "Sofia"
    309     },
    310     {
    311         "timezones": [
    312             "Asia/Bahrain"
    313         ],
    314         "latlng": [
    315             26,
    316             50.55
    317         ],
    318         "name": "Bahrain",
    319         "code": "BH",
    320         "capital": "Manama"
    321     },
    322     {
    323         "timezones": [
    324             "America/Nassau"
    325         ],
    326         "latlng": [
    327             24.25,
    328             -76
    329         ],
    330         "name": "Bahamas",
    331         "code": "BS",
    332         "capital": "Nassau"
    333     },
    334     {
    335         "timezones": [
    336             "Europe/Sarajevo"
    337         ],
    338         "latlng": [
    339             44,
    340             18
    341         ],
    342         "name": "Bosnia and Herzegovina",
    343         "code": "BA",
    344         "capital": "Sarajevo"
    345     },
    346     {
    347         "timezones": [
    348             "America/St_Barthelemy"
    349         ],
    350         "latlng": [
    351             18.5,
    352             -63.41666666
    353         ],
    354         "name": "Saint Barth\u00e9lemy",
    355         "code": "BL",
    356         "capital": "Gustavia"
    357     },
    358     {
    359         "timezones": [
    360             "Europe/Minsk"
    361         ],
    362         "latlng": [
    363             53,
    364             28
    365         ],
    366         "name": "Belarus",
    367         "code": "BY",
    368         "capital": "Minsk"
    369     },
    370     {
    371         "timezones": [
    372             "America/Belize"
    373         ],
    374         "latlng": [
    375             17.25,
    376             -88.75
    377         ],
    378         "name": "Belize",
    379         "code": "BZ",
    380         "capital": "Belmopan"
    381     },
    382     {
    383         "timezones": [
    384             "Atlantic/Bermuda"
    385         ],
    386         "latlng": [
    387             32.33333333,
    388             -64.75
    389         ],
    390         "name": "Bermuda",
    391         "code": "BM",
    392         "capital": "Hamilton"
    393     },
    394     {
    395         "timezones": [
    396             "America/La_Paz"
    397         ],
    398         "latlng": [
    399             -17,
    400             -65
    401         ],
    402         "name": "Bolivia",
    403         "code": "BO",
    404         "capital": "Sucre"
    405     },
    406     {
    407         "timezones": [
    408             "America/Noronha",
    409             "America/Belem",
    410             "America/Fortaleza",
    411             "America/Recife",
    412             "America/Araguaina",
    413             "America/Maceio",
    414             "America/Bahia",
    415             "America/Sao_Paulo",
    416             "America/Campo_Grande",
    417             "America/Cuiaba",
    418             "America/Santarem",
    419             "America/Porto_Velho",
    420             "America/Boa_Vista",
    421             "America/Manaus",
    422             "America/Eirunepe",
    423             "America/Rio_Branco"
    424         ],
    425         "latlng": [
    426             -10,
    427             -55
    428         ],
    429         "name": "Brazil",
    430         "code": "BR",
    431         "capital": "Bras\u00edlia"
    432     },
    433     {
    434         "timezones": [
    435             "America/Barbados"
    436         ],
    437         "latlng": [
    438             13.16666666,
    439             -59.53333333
    440         ],
    441         "name": "Barbados",
    442         "code": "BB",
    443         "capital": "Bridgetown"
    444     },
    445     {
    446         "timezones": [
    447             "Asia/Brunei"
    448         ],
    449         "latlng": [
    450             4.5,
    451             114.66666666
    452         ],
    453         "name": "Brunei",
    454         "code": "BN",
    455         "capital": "Bandar Seri Begawan"
    456     },
    457     {
    458         "timezones": [
    459             "Asia/Thimphu"
    460         ],
    461         "latlng": [
    462             27.5,
    463             90.5
    464         ],
    465         "name": "Bhutan",
    466         "code": "BT",
    467         "capital": "Thimphu"
    468     },
    469     {
    470         "timezones": [
    471             "Europe/Oslo"
    472         ],
    473         "latlng": [
    474             -54.43333333,
    475             3.4
    476         ],
    477         "name": "Bouvet Island",
    478         "code": "BV",
    479         "capital": null
    480     },
    481     {
    482         "timezones": [
    483             "Africa/Gaborone"
    484         ],
    485         "latlng": [
    486             -22,
    487             24
    488         ],
    489         "name": "Botswana",
    490         "code": "BW",
    491         "capital": "Gaborone"
    492     },
    493     {
    494         "timezones": [
    495             "Africa/Bangui"
    496         ],
    497         "latlng": [
    498             7,
    499             21
    500         ],
    501         "name": "Central African Republic",
    502         "code": "CF",
    503         "capital": "Bangui"
    504     },
    505     {
    506         "timezones": [
    507             "America/St_Johns",
    508             "America/Halifax",
    509             "America/Glace_Bay",
    510             "America/Moncton",
    511             "America/Goose_Bay",
    512             "America/Blanc-Sablon",
    513             "America/Toronto",
    514             "America/Nipigon",
    515             "America/Thunder_Bay",
    516             "America/Iqaluit",
    517             "America/Pangnirtung",
    518             "America/Atikokan",
    519             "America/Winnipeg",
    520             "America/Rainy_River",
    521             "America/Resolute",
    522             "America/Rankin_Inlet",
    523             "America/Regina",
    524             "America/Swift_Current",
    525             "America/Edmonton",
    526             "America/Cambridge_Bay",
    527             "America/Yellowknife",
    528             "America/Inuvik",
    529             "America/Creston",
    530             "America/Dawson_Creek",
    531             "America/Fort_Nelson",
    532             "America/Vancouver",
    533             "America/Whitehorse",
    534             "America/Dawson"
    535         ],
    536         "latlng": [
    537             60,
    538             -95
    539         ],
    540         "name": "Canada",
    541         "code": "CA",
    542         "capital": "Ottawa"
    543     },
    544     {
    545         "timezones": [
    546             "Indian/Cocos"
    547         ],
    548         "latlng": [
    549             -12.5,
    550             96.83333333
    551         ],
    552         "name": "Cocos (Keeling) Islands",
    553         "code": "CC",
    554         "capital": "West Island"
    555     },
    556     {
    557         "timezones": [
    558             "Europe/Zurich"
    559         ],
    560         "latlng": [
    561             47,
    562             8
    563         ],
    564         "name": "Switzerland",
    565         "code": "CH",
    566         "capital": "Bern"
    567     },
    568     {
    569         "timezones": [
    570             "America/Santiago",
    571             "Pacific/Easter"
    572         ],
    573         "latlng": [
    574             -30,
    575             -71
    576         ],
    577         "name": "Chile",
    578         "code": "CL",
    579         "capital": "Santiago"
    580     },
    581     {
    582         "timezones": [
    583             "Asia/Shanghai",
    584             "Asia/Urumqi"
    585         ],
    586         "latlng": [
    587             35,
    588             105
    589         ],
    590         "name": "China",
    591         "code": "CN",
    592         "capital": "Beijing"
    593     },
    594     {
    595         "timezones": [
    596             "Africa/Abidjan"
    597         ],
    598         "latlng": [
    599             8,
    600             -5
    601         ],
    602         "name": "Ivory Coast",
    603         "code": "CI",
    604         "capital": "Yamoussoukro"
    605     },
    606     {
    607         "timezones": [
    608             "Africa/Douala"
    609         ],
    610         "latlng": [
    611             6,
    612             12
    613         ],
    614         "name": "Cameroon",
    615         "code": "CM",
    616         "capital": "Yaound\u00e9"
    617     },
    618     {
    619         "timezones": [
    620             "Africa/Kinshasa",
    621             "Africa/Lubumbashi"
    622         ],
    623         "latlng": [
    624             0,
    625             25
    626         ],
    627         "name": "DR Congo",
    628         "code": "CD",
    629         "capital": "Kinshasa"
    630     },
    631     {
    632         "timezones": [
    633             "Africa/Brazzaville"
    634         ],
    635         "latlng": [
    636             -1,
    637             15
    638         ],
    639         "name": "Republic of the Congo",
    640         "code": "CG",
    641         "capital": "Brazzaville"
    642     },
    643     {
    644         "timezones": [
    645             "Pacific/Rarotonga"
    646         ],
    647         "latlng": [
    648             -21.23333333,
    649             -159.76666666
    650         ],
    651         "name": "Cook Islands",
    652         "code": "CK",
    653         "capital": "Avarua"
    654     },
    655     {
    656         "timezones": [
    657             "America/Bogota"
    658         ],
    659         "latlng": [
    660             4,
    661             -72
    662         ],
    663         "name": "Colombia",
    664         "code": "CO",
    665         "capital": "Bogot\u00e1"
    666     },
    667     {
    668         "timezones": [
    669             "Indian/Comoro"
    670         ],
    671         "latlng": [
    672             -12.16666666,
    673             44.25
    674         ],
    675         "name": "Comoros",
    676         "code": "KM",
    677         "capital": "Moroni"
    678     },
    679     {
    680         "timezones": [
    681             "Atlantic/Cape_Verde"
    682         ],
    683         "latlng": [
    684             16,
    685             -24
    686         ],
    687         "name": "Cape Verde",
    688         "code": "CV",
    689         "capital": "Praia"
    690     },
    691     {
    692         "timezones": [
    693             "America/Costa_Rica"
    694         ],
    695         "latlng": [
    696             10,
    697             -84
    698         ],
    699         "name": "Costa Rica",
    700         "code": "CR",
    701         "capital": "San Jos\u00e9"
    702     },
    703     {
    704         "timezones": [
    705             "America/Havana"
    706         ],
    707         "latlng": [
    708             21.5,
    709             -80
    710         ],
    711         "name": "Cuba",
    712         "code": "CU",
    713         "capital": "Havana"
    714     },
    715     {
    716         "timezones": [
    717             "America/Curacao"
    718         ],
    719         "latlng": [
    720             12.116667,
    721             -68.933333
    722         ],
    723         "name": "Cura\u00e7ao",
    724         "code": "CW",
    725         "capital": "Willemstad"
    726     },
    727     {
    728         "timezones": [
    729             "Indian/Christmas"
    730         ],
    731         "latlng": [
    732             -10.5,
    733             105.66666666
    734         ],
    735         "name": "Christmas Island",
    736         "code": "CX",
    737         "capital": "Flying Fish Cove"
    738     },
    739     {
    740         "timezones": [
    741             "America/Cayman"
    742         ],
    743         "latlng": [
    744             19.5,
    745             -80.5
    746         ],
    747         "name": "Cayman Islands",
    748         "code": "KY",
    749         "capital": "George Town"
    750     },
    751     {
    752         "timezones": [
    753             "Asia/Nicosia"
    754         ],
    755         "latlng": [
    756             35,
    757             33
    758         ],
    759         "name": "Cyprus",
    760         "code": "CY",
    761         "capital": "Nicosia"
    762     },
    763     {
    764         "timezones": [
    765             "Europe/Prague"
    766         ],
    767         "latlng": [
    768             49.75,
    769             15.5
    770         ],
    771         "name": "Czech Republic",
    772         "code": "CZ",
    773         "capital": "Prague"
    774     },
    775     {
    776         "timezones": [
    777             "Europe/Berlin",
    778             "Europe/Busingen"
    779         ],
    780         "latlng": [
    781             51,
    782             9
    783         ],
    784         "name": "Germany",
    785         "code": "DE",
    786         "capital": "Berlin"
    787     },
    788     {
    789         "timezones": [
    790             "Africa/Djibouti"
    791         ],
    792         "latlng": [
    793             11.5,
    794             43
    795         ],
    796         "name": "Djibouti",
    797         "code": "DJ",
    798         "capital": "Djibouti"
    799     },
    800     {
    801         "timezones": [
    802             "America/Dominica"
    803         ],
    804         "latlng": [
    805             15.41666666,
    806             -61.33333333
    807         ],
    808         "name": "Dominica",
    809         "code": "DM",
    810         "capital": "Roseau"
    811     },
    812     {
    813         "timezones": [
    814             "Europe/Copenhagen"
    815         ],
    816         "latlng": [
    817             56,
    818             10
    819         ],
    820         "name": "Denmark",
    821         "code": "DK",
    822         "capital": "Copenhagen"
    823     },
    824     {
    825         "timezones": [
    826             "America/Santo_Domingo"
    827         ],
    828         "latlng": [
    829             19,
    830             -70.66666666
    831         ],
    832         "name": "Dominican Republic",
    833         "code": "DO",
    834         "capital": "Santo Domingo"
    835     },
    836     {
    837         "timezones": [
    838             "Africa/Algiers"
    839         ],
    840         "latlng": [
    841             28,
    842             3
    843         ],
    844         "name": "Algeria",
    845         "code": "DZ",
    846         "capital": "Algiers"
    847     },
    848     {
    849         "timezones": [
    850             "America/Guayaquil",
    851             "Pacific/Galapagos"
    852         ],
    853         "latlng": [
    854             -2,
    855             -77.5
    856         ],
    857         "name": "Ecuador",
    858         "code": "EC",
    859         "capital": "Quito"
    860     },
    861     {
    862         "timezones": [
    863             "Africa/Cairo"
    864         ],
    865         "latlng": [
    866             27,
    867             30
    868         ],
    869         "name": "Egypt",
    870         "code": "EG",
    871         "capital": "Cairo"
    872     },
    873     {
    874         "timezones": [
    875             "Africa/Asmara"
    876         ],
    877         "latlng": [
    878             15,
    879             39
    880         ],
    881         "name": "Eritrea",
    882         "code": "ER",
    883         "capital": "Asmara"
    884     },
    885     {
    886         "timezones": [
    887             "Africa/El_Aaiun"
    888         ],
    889         "latlng": [
    890             24.5,
    891             -13
    892         ],
    893         "name": "Western Sahara",
    894         "code": "EH",
    895         "capital": "El Aai\u00fan"
    896     },
    897     {
    898         "timezones": [
    899             "Europe/Madrid",
    900             "Africa/Ceuta",
    901             "Atlantic/Canary"
    902         ],
    903         "latlng": [
    904             40,
    905             -4
    906         ],
    907         "name": "Spain",
    908         "code": "ES",
    909         "capital": "Madrid"
    910     },
    911     {
    912         "timezones": [
    913             "Europe/Tallinn"
    914         ],
    915         "latlng": [
    916             59,
    917             26
    918         ],
    919         "name": "Estonia",
    920         "code": "EE",
    921         "capital": "Tallinn"
    922     },
    923     {
    924         "timezones": [
    925             "Africa/Addis_Ababa"
    926         ],
    927         "latlng": [
    928             8,
    929             38
    930         ],
    931         "name": "Ethiopia",
    932         "code": "ET",
    933         "capital": "Addis Ababa"
    934     },
    935     {
    936         "timezones": [
    937             "Europe/Helsinki"
    938         ],
    939         "latlng": [
    940             64,
    941             26
    942         ],
    943         "name": "Finland",
    944         "code": "FI",
    945         "capital": "Helsinki"
    946     },
    947     {
    948         "timezones": [
    949             "Pacific/Fiji"
    950         ],
    951         "latlng": [
    952             -18,
    953             175
    954         ],
    955         "name": "Fiji",
    956         "code": "FJ",
    957         "capital": "Suva"
    958     },
    959     {
    960         "timezones": [
    961             "Atlantic/Stanley"
    962         ],
    963         "latlng": [
    964             -51.75,
    965             -59
    966         ],
    967         "name": "Falkland Islands",
    968         "code": "FK",
    969         "capital": "Stanley"
    970     },
    971     {
    972         "timezones": [
    973             "Europe/Paris"
    974         ],
    975         "latlng": [
    976             46,
    977             2
    978         ],
    979         "name": "France",
    980         "code": "FR",
    981         "capital": "Paris"
    982     },
    983     {
    984         "timezones": [
    985             "Atlantic/Faroe"
    986         ],
    987         "latlng": [
    988             62,
    989             -7
    990         ],
    991         "name": "Faroe Islands",
    992         "code": "FO",
    993         "capital": "T\u00f3rshavn"
    994     },
    995     {
    996         "timezones": [
    997             "Pacific/Chuuk",
    998             "Pacific/Pohnpei",
    999             "Pacific/Kosrae"
    1000         ],
    1001         "latlng": [
    1002             6.91666666,
    1003             158.25
    1004         ],
    1005         "name": "Micronesia",
    1006         "code": "FM",
    1007         "capital": "Palikir"
    1008     },
    1009     {
    1010         "timezones": [
    1011             "Africa/Libreville"
    1012         ],
    1013         "latlng": [
    1014             -1,
    1015             11.75
    1016         ],
    1017         "name": "Gabon",
    1018         "code": "GA",
    1019         "capital": "Libreville"
    1020     },
    1021     {
    1022         "timezones": [
    1023             "Europe/London"
    1024         ],
    1025         "latlng": [
    1026             54,
    1027             -2
    1028         ],
    1029         "name": "United Kingdom",
    1030         "code": "GB",
    1031         "capital": "London"
    1032     },
    1033     {
    1034         "timezones": [
    1035             "Asia/Tbilisi"
    1036         ],
    1037         "latlng": [
    1038             42,
    1039             43.5
    1040         ],
    1041         "name": "Georgia",
    1042         "code": "GE",
    1043         "capital": "Tbilisi"
    1044     },
    1045     {
    1046         "timezones": [
    1047             "Europe/Guernsey"
    1048         ],
    1049         "latlng": [
    1050             49.46666666,
    1051             -2.58333333
    1052         ],
    1053         "name": "Guernsey",
    1054         "code": "GG",
    1055         "capital": "St. Peter Port"
    1056     },
    1057     {
    1058         "timezones": [
    1059             "Africa/Accra"
    1060         ],
    1061         "latlng": [
    1062             8,
    1063             -2
    1064         ],
    1065         "name": "Ghana",
    1066         "code": "GH",
    1067         "capital": "Accra"
    1068     },
    1069     {
    1070         "timezones": [
    1071             "Europe/Gibraltar"
    1072         ],
    1073         "latlng": [
    1074             36.13333333,
    1075             -5.35
    1076         ],
    1077         "name": "Gibraltar",
    1078         "code": "GI",
    1079         "capital": "Gibraltar"
    1080     },
    1081     {
    1082         "timezones": [
    1083             "Africa/Conakry"
    1084         ],
    1085         "latlng": [
    1086             11,
    1087             -10
    1088         ],
    1089         "name": "Guinea",
    1090         "code": "GN",
    1091         "capital": "Conakry"
    1092     },
    1093     {
    1094         "timezones": [
    1095             "America/Guadeloupe"
    1096         ],
    1097         "latlng": [
    1098             16.25,
    1099             -61.583333
    1100         ],
    1101         "name": "Guadeloupe",
    1102         "code": "GP",
    1103         "capital": "Basse-Terre"
    1104     },
    1105     {
    1106         "timezones": [
    1107             "Africa/Banjul"
    1108         ],
    1109         "latlng": [
    1110             13.46666666,
    1111             -16.56666666
    1112         ],
    1113         "name": "Gambia",
    1114         "code": "GM",
    1115         "capital": "Banjul"
    1116     },
    1117     {
    1118         "timezones": [
    1119             "Africa/Bissau"
    1120         ],
    1121         "latlng": [
    1122             12,
    1123             -15
    1124         ],
    1125         "name": "Guinea-Bissau",
    1126         "code": "GW",
    1127         "capital": "Bissau"
    1128     },
    1129     {
    1130         "timezones": [
    1131             "Africa/Malabo"
    1132         ],
    1133         "latlng": [
    1134             2,
    1135             10
    1136         ],
    1137         "name": "Equatorial Guinea",
    1138         "code": "GQ",
    1139         "capital": "Malabo"
    1140     },
    1141     {
    1142         "timezones": [
    1143             "Europe/Athens"
    1144         ],
    1145         "latlng": [
    1146             39,
    1147             22
    1148         ],
    1149         "name": "Greece",
    1150         "code": "GR",
    1151         "capital": "Athens"
    1152     },
    1153     {
    1154         "timezones": [
    1155             "America/Grenada"
    1156         ],
    1157         "latlng": [
    1158             12.11666666,
    1159             -61.66666666
    1160         ],
    1161         "name": "Grenada",
    1162         "code": "GD",
    1163         "capital": "St. George's"
    1164     },
    1165     {
    1166         "timezones": [
    1167             "America/Godthab",
    1168             "America/Danmarkshavn",
    1169             "America/Scoresbysund",
    1170             "America/Thule"
    1171         ],
    1172         "latlng": [
    1173             72,
    1174             -40
    1175         ],
    1176         "name": "Greenland",
    1177         "code": "GL",
    1178         "capital": "Nuuk"
    1179     },
    1180     {
    1181         "timezones": [
    1182             "America/Guatemala"
    1183         ],
    1184         "latlng": [
    1185             15.5,
    1186             -90.25
    1187         ],
    1188         "name": "Guatemala",
    1189         "code": "GT",
    1190         "capital": "Guatemala City"
    1191     },
    1192     {
    1193         "timezones": [
    1194             "America/Cayenne"
    1195         ],
    1196         "latlng": [
    1197             4,
    1198             -53
    1199         ],
    1200         "name": "French Guiana",
    1201         "code": "GF",
    1202         "capital": "Cayenne"
    1203     },
    1204     {
    1205         "timezones": [
    1206             "Pacific/Guam"
    1207         ],
    1208         "latlng": [
    1209             13.46666666,
    1210             144.78333333
    1211         ],
    1212         "name": "Guam",
    1213         "code": "GU",
    1214         "capital": "Hag\u00e5t\u00f1a"
    1215     },
    1216     {
    1217         "timezones": [
    1218             "America/Guyana"
    1219         ],
    1220         "latlng": [
    1221             5,
    1222             -59
    1223         ],
    1224         "name": "Guyana",
    1225         "code": "GY",
    1226         "capital": "Georgetown"
    1227     },
    1228     {
    1229         "timezones": [
    1230             "Asia/Hong_Kong"
    1231         ],
    1232         "latlng": [
    1233             22.267,
    1234             114.188
    1235         ],
    1236         "name": "Hong Kong",
    1237         "code": "HK",
    1238         "capital": "City of Victoria"
    1239     },
    1240     {
    1241         "timezones": [
    1242             "America/Tegucigalpa"
    1243         ],
    1244         "latlng": [
    1245             15,
    1246             -86.5
    1247         ],
    1248         "name": "Honduras",
    1249         "code": "HN",
    1250         "capital": "Tegucigalpa"
    1251     },
    1252     {
    1253         "timezones": [
    1254             "Europe/Zagreb"
    1255         ],
    1256         "latlng": [
    1257             45.16666666,
    1258             15.5
    1259         ],
    1260         "name": "Croatia",
    1261         "code": "HR",
    1262         "capital": "Zagreb"
    1263     },
    1264     {
    1265         "timezones": [
    1266             "America/Port-au-Prince"
    1267         ],
    1268         "latlng": [
    1269             19,
    1270             -72.41666666
    1271         ],
    1272         "name": "Haiti",
    1273         "code": "HT",
    1274         "capital": "Port-au-Prince"
    1275     },
    1276     {
    1277         "timezones": [
    1278             "Europe/Budapest"
    1279         ],
    1280         "latlng": [
    1281             47,
    1282             20
    1283         ],
    1284         "name": "Hungary",
    1285         "code": "HU",
    1286         "capital": "Budapest"
    1287     },
    1288     {
    1289         "timezones": [
    1290             "Asia/Jakarta",
    1291             "Asia/Pontianak",
    1292             "Asia/Makassar",
    1293             "Asia/Jayapura"
    1294         ],
    1295         "latlng": [
    1296             -5,
    1297             120
    1298         ],
    1299         "name": "Indonesia",
    1300         "code": "ID",
    1301         "capital": "Jakarta"
    1302     },
    1303     {
    1304         "timezones": [
    1305             "Europe/Isle_of_Man"
    1306         ],
    1307         "latlng": [
    1308             54.25,
    1309             -4.5
    1310         ],
    1311         "name": "Isle of Man",
    1312         "code": "IM",
    1313         "capital": "Douglas"
    1314     },
    1315     {
    1316         "timezones": [
    1317             "Asia/Kolkata"
    1318         ],
    1319         "latlng": [
    1320             20,
    1321             77
    1322         ],
    1323         "name": "India",
    1324         "code": "IN",
    1325         "capital": "New Delhi"
    1326     },
    1327     {
    1328         "timezones": [
    1329             "Indian/Chagos"
    1330         ],
    1331         "latlng": [
    1332             -6,
    1333             71.5
    1334         ],
    1335         "name": "British Indian Ocean Territory",
    1336         "code": "IO",
    1337         "capital": "Diego Garcia"
    1338     },
    1339     {
    1340         "timezones": [
    1341             "Europe/Dublin"
    1342         ],
    1343         "latlng": [
    1344             53,
    1345             -8
    1346         ],
    1347         "name": "Ireland",
    1348         "code": "IE",
    1349         "capital": "Dublin"
    1350     },
    1351     {
    1352         "timezones": [
    1353             "Asia/Tehran"
    1354         ],
    1355         "latlng": [
    1356             32,
    1357             53
    1358         ],
    1359         "name": "Iran",
    1360         "code": "IR",
    1361         "capital": "Tehran"
    1362     },
    1363     {
    1364         "timezones": [
    1365             "Asia/Baghdad"
    1366         ],
    1367         "latlng": [
    1368             33,
    1369             44
    1370         ],
    1371         "name": "Iraq",
    1372         "code": "IQ",
    1373         "capital": "Baghdad"
    1374     },
    1375     {
    1376         "timezones": [
    1377             "Atlantic/Reykjavik"
    1378         ],
    1379         "latlng": [
    1380             65,
    1381             -18
    1382         ],
    1383         "name": "Iceland",
    1384         "code": "IS",
    1385         "capital": "Reykjavik"
    1386     },
    1387     {
    1388         "timezones": [
    1389             "Asia/Jerusalem"
    1390         ],
    1391         "latlng": [
    1392             31.47,
    1393             35.13
    1394         ],
    1395         "name": "Israel",
    1396         "code": "IL",
    1397         "capital": "Jerusalem"
    1398     },
    1399     {
    1400         "timezones": [
    1401             "Europe/Rome"
    1402         ],
    1403         "latlng": [
    1404             42.83333333,
    1405             12.83333333
    1406         ],
    1407         "name": "Italy",
    1408         "code": "IT",
    1409         "capital": "Rome"
    1410     },
    1411     {
    1412         "timezones": [
    1413             "America/Jamaica"
    1414         ],
    1415         "latlng": [
    1416             18.25,
    1417             -77.5
    1418         ],
    1419         "name": "Jamaica",
    1420         "code": "JM",
    1421         "capital": "Kingston"
    1422     },
    1423     {
    1424         "timezones": [
    1425             "Europe/Jersey"
    1426         ],
    1427         "latlng": [
    1428             49.25,
    1429             -2.16666666
    1430         ],
    1431         "name": "Jersey",
    1432         "code": "JE",
    1433         "capital": "Saint Helier"
    1434     },
    1435     {
    1436         "timezones": [
    1437             "Asia/Amman"
    1438         ],
    1439         "latlng": [
    1440             31,
    1441             36
    1442         ],
    1443         "name": "Jordan",
    1444         "code": "JO",
    1445         "capital": "Amman"
    1446     },
    1447     {
    1448         "timezones": [
    1449             "Asia/Tokyo"
    1450         ],
    1451         "latlng": [
    1452             36,
    1453             138
    1454         ],
    1455         "name": "Japan",
    1456         "code": "JP",
    1457         "capital": "Tokyo"
    1458     },
    1459     {
    1460         "timezones": [
    1461             "Asia/Almaty",
    1462             "Asia/Qyzylorda",
    1463             "Asia/Aqtobe",
    1464             "Asia/Aqtau",
    1465             "Asia/Oral"
    1466         ],
    1467         "latlng": [
    1468             48,
    1469             68
    1470         ],
    1471         "name": "Kazakhstan",
    1472         "code": "KZ",
    1473         "capital": "Astana"
    1474     },
    1475     {
    1476         "timezones": [
    1477             "Africa/Nairobi"
    1478         ],
    1479         "latlng": [
    1480             1,
    1481             38
    1482         ],
    1483         "name": "Kenya",
    1484         "code": "KE",
    1485         "capital": "Nairobi"
    1486     },
    1487     {
    1488         "timezones": [
    1489             "Asia/Bishkek"
    1490         ],
    1491         "latlng": [
    1492             41,
    1493             75
    1494         ],
    1495         "name": "Kyrgyzstan",
    1496         "code": "KG",
    1497         "capital": "Bishkek"
    1498     },
    1499     {
    1500         "timezones": [
    1501             "Asia/Phnom_Penh"
    1502         ],
    1503         "latlng": [
    1504             13,
    1505             105
    1506         ],
    1507         "name": "Cambodia",
    1508         "code": "KH",
    1509         "capital": "Phnom Penh"
    1510     },
    1511     {
    1512         "timezones": [
    1513             "Pacific/Tarawa",
    1514             "Pacific/Enderbury",
    1515             "Pacific/Kiritimati"
    1516         ],
    1517         "latlng": [
    1518             1.41666666,
    1519             173
    1520         ],
    1521         "name": "Kiribati",
    1522         "code": "KI",
    1523         "capital": "South Tarawa"
    1524     },
    1525     {
    1526         "timezones": [
    1527             "America/St_Kitts"
    1528         ],
    1529         "latlng": [
    1530             17.33333333,
    1531             -62.75
    1532         ],
    1533         "name": "Saint Kitts and Nevis",
    1534         "code": "KN",
    1535         "capital": "Basseterre"
    1536     },
    1537     {
    1538         "timezones": [
    1539             "Asia/Seoul"
    1540         ],
    1541         "latlng": [
    1542             37,
    1543             127.5
    1544         ],
    1545         "name": "South Korea",
    1546         "code": "KR",
    1547         "capital": "Seoul"
    1548     },
    1549     {
    1550         "timezones": ["Europe/Belgrade"],
    1551         "latlng": [
    1552             42.666667,
    1553             21.166667
    1554         ],
    1555         "name": "Kosovo",
    1556         "code": "XK",
    1557         "capital": "Pristina"
    1558     },
    1559     {
    1560         "timezones": [
    1561             "Asia/Kuwait"
    1562         ],
    1563         "latlng": [
    1564             29.5,
    1565             45.75
    1566         ],
    1567         "name": "Kuwait",
    1568         "code": "KW",
    1569         "capital": "Kuwait City"
    1570     },
    1571     {
    1572         "timezones": [
    1573             "Asia/Vientiane"
    1574         ],
    1575         "latlng": [
    1576             18,
    1577             105
    1578         ],
    1579         "name": "Laos",
    1580         "code": "LA",
    1581         "capital": "Vientiane"
    1582     },
    1583     {
    1584         "timezones": [
    1585             "Asia/Beirut"
    1586         ],
    1587         "latlng": [
    1588             33.83333333,
    1589             35.83333333
    1590         ],
    1591         "name": "Lebanon",
    1592         "code": "LB",
    1593         "capital": "Beirut"
    1594     },
    1595     {
    1596         "timezones": [
    1597             "Africa/Monrovia"
    1598         ],
    1599         "latlng": [
    1600             6.5,
    1601             -9.5
    1602         ],
    1603         "name": "Liberia",
    1604         "code": "LR",
    1605         "capital": "Monrovia"
    1606     },
    1607     {
    1608         "timezones": [
    1609             "Africa/Tripoli"
    1610         ],
    1611         "latlng": [
    1612             25,
    1613             17
    1614         ],
    1615         "name": "Libya",
    1616         "code": "LY",
    1617         "capital": "Tripoli"
    1618     },
    1619     {
    1620         "timezones": [
    1621             "America/St_Lucia"
    1622         ],
    1623         "latlng": [
    1624             13.88333333,
    1625             -60.96666666
    1626         ],
    1627         "name": "Saint Lucia",
    1628         "code": "LC",
    1629         "capital": "Castries"
    1630     },
    1631     {
    1632         "timezones": [
    1633             "Europe/Vaduz"
    1634         ],
    1635         "latlng": [
    1636             47.26666666,
    1637             9.53333333
    1638         ],
    1639         "name": "Liechtenstein",
    1640         "code": "LI",
    1641         "capital": "Vaduz"
    1642     },
    1643     {
    1644         "timezones": [
    1645             "Asia/Colombo"
    1646         ],
    1647         "latlng": [
    1648             7,
    1649             81
    1650         ],
    1651         "name": "Sri Lanka",
    1652         "code": "LK",
    1653         "capital": "Colombo"
    1654     },
    1655     {
    1656         "timezones": [
    1657             "Africa/Maseru"
    1658         ],
    1659         "latlng": [
    1660             -29.5,
    1661             28.5
    1662         ],
    1663         "name": "Lesotho",
    1664         "code": "LS",
    1665         "capital": "Maseru"
    1666     },
    1667     {
    1668         "timezones": [
    1669             "Europe/Vilnius"
    1670         ],
    1671         "latlng": [
    1672             56,
    1673             24
    1674         ],
    1675         "name": "Lithuania",
    1676         "code": "LT",
    1677         "capital": "Vilnius"
    1678     },
    1679     {
    1680         "timezones": [
    1681             "Europe/Luxembourg"
    1682         ],
    1683         "latlng": [
    1684             49.75,
    1685             6.16666666
    1686         ],
    1687         "name": "Luxembourg",
    1688         "code": "LU",
    1689         "capital": "Luxembourg"
    1690     },
    1691     {
    1692         "timezones": [
    1693             "Europe/Riga"
    1694         ],
    1695         "latlng": [
    1696             57,
    1697             25
    1698         ],
    1699         "name": "Latvia",
    1700         "code": "LV",
    1701         "capital": "Riga"
    1702     },
    1703     {
    1704         "timezones": [
    1705             "Asia/Macau"
    1706         ],
    1707         "latlng": [
    1708             22.16666666,
    1709             113.55
    1710         ],
    1711         "name": "Macau",
    1712         "code": "MO",
    1713         "capital": null
    1714     },
    1715     {
    1716         "timezones": [
    1717             "America/Marigot"
    1718         ],
    1719         "latlng": [
    1720             18.08333333,
    1721             -63.95
    1722         ],
    1723         "name": "Saint Martin",
    1724         "code": "MF",
    1725         "capital": "Marigot"
    1726     },
    1727     {
    1728         "timezones": [
    1729             "Africa/Casablanca"
    1730         ],
    1731         "latlng": [
    1732             32,
    1733             -5
    1734         ],
    1735         "name": "Morocco",
    1736         "code": "MA",
    1737         "capital": "Rabat"
    1738     },
    1739     {
    1740         "timezones": [
    1741             "Europe/Monaco"
    1742         ],
    1743         "latlng": [
    1744             43.73333333,
    1745             7.4
    1746         ],
    1747         "name": "Monaco",
    1748         "code": "MC",
    1749         "capital": "Monaco"
    1750     },
    1751     {
    1752         "timezones": [
    1753             "Europe/Chisinau"
    1754         ],
    1755         "latlng": [
    1756             47,
    1757             29
    1758         ],
    1759         "name": "Moldova",
    1760         "code": "MD",
    1761         "capital": "Chi\u0219in\u0103u"
    1762     },
    1763     {
    1764         "timezones": [
    1765             "Indian/Antananarivo"
    1766         ],
    1767         "latlng": [
    1768             -20,
    1769             47
    1770         ],
    1771         "name": "Madagascar",
    1772         "code": "MG",
    1773         "capital": "Antananarivo"
    1774     },
    1775     {
    1776         "timezones": [
    1777             "Indian/Maldives"
    1778         ],
    1779         "latlng": [
    1780             3.25,
    1781             73
    1782         ],
    1783         "name": "Maldives",
    1784         "code": "MV",
    1785         "capital": "Mal\u00e9"
    1786     },
    1787     {
    1788         "timezones": [
    1789             "America/Mexico_City",
    1790             "America/Cancun",
    1791             "America/Merida",
    1792             "America/Monterrey",
    1793             "America/Matamoros",
    1794             "America/Mazatlan",
    1795             "America/Chihuahua",
    1796             "America/Ojinaga",
    1797             "America/Hermosillo",
    1798             "America/Tijuana",
    1799             "America/Bahia_Banderas"
    1800         ],
    1801         "latlng": [
    1802             23,
    1803             -102
    1804         ],
    1805         "name": "Mexico",
    1806         "code": "MX",
    1807         "capital": "Mexico City"
    1808     },
    1809     {
    1810         "timezones": [
    1811             "Pacific/Majuro",
    1812             "Pacific/Kwajalein"
    1813         ],
    1814         "latlng": [
    1815             9,
    1816             168
    1817         ],
    1818         "name": "Marshall Islands",
    1819         "code": "MH",
    1820         "capital": "Majuro"
    1821     },
    1822     {
    1823         "timezones": [
    1824             "Europe/Skopje"
    1825         ],
    1826         "latlng": [
    1827             41.83333333,
    1828             22
    1829         ],
    1830         "name": "Macedonia",
    1831         "code": "MK",
    1832         "capital": "Skopje"
    1833     },
    1834     {
    1835         "timezones": [
    1836             "Africa/Bamako"
    1837         ],
    1838         "latlng": [
    1839             17,
    1840             -4
    1841         ],
    1842         "name": "Mali",
    1843         "code": "ML",
    1844         "capital": "Bamako"
    1845     },
    1846     {
    1847         "timezones": [
    1848             "Europe/Malta"
    1849         ],
    1850         "latlng": [
    1851             35.83333333,
    1852             14.58333333
    1853         ],
    1854         "name": "Malta",
    1855         "code": "MT",
    1856         "capital": "Valletta"
    1857     },
    1858     {
    1859         "timezones": [
    1860             "Asia/Rangoon"
    1861         ],
    1862         "latlng": [
    1863             22,
    1864             98
    1865         ],
    1866         "name": "Myanmar",
    1867         "code": "MM",
    1868         "capital": "Naypyidaw"
    1869     },
    1870     {
    1871         "timezones": [
    1872             "Europe/Podgorica"
    1873         ],
    1874         "latlng": [
    1875             42.5,
    1876             19.3
    1877         ],
    1878         "name": "Montenegro",
    1879         "code": "ME",
    1880         "capital": "Podgorica"
    1881     },
    1882     {
    1883         "timezones": [
    1884             "Asia/Ulaanbaatar",
    1885             "Asia/Hovd",
    1886             "Asia/Choibalsan"
    1887         ],
    1888         "latlng": [
    1889             46,
    1890             105
    1891         ],
    1892         "name": "Mongolia",
    1893         "code": "MN",
    1894         "capital": "Ulan Bator"
    1895     },
    1896     {
    1897         "timezones": [
    1898             "Pacific/Saipan"
    1899         ],
    1900         "latlng": [
    1901             15.2,
    1902             145.75
    1903         ],
    1904         "name": "Northern Mariana Islands",
    1905         "code": "MP",
    1906         "capital": "Saipan"
    1907     },
    1908     {
    1909         "timezones": [
    1910             "Africa/Maputo"
    1911         ],
    1912         "latlng": [
    1913             -18.25,
    1914             35
    1915         ],
    1916         "name": "Mozambique",
    1917         "code": "MZ",
    1918         "capital": "Maputo"
    1919     },
    1920     {
    1921         "timezones": [
    1922             "Africa/Nouakchott"
    1923         ],
    1924         "latlng": [
    1925             20,
    1926             -12
    1927         ],
    1928         "name": "Mauritania",
    1929         "code": "MR",
    1930         "capital": "Nouakchott"
    1931     },
    1932     {
    1933         "timezones": [
    1934             "America/Montserrat"
    1935         ],
    1936         "latlng": [
    1937             16.75,
    1938             -62.2
    1939         ],
    1940         "name": "Montserrat",
    1941         "code": "MS",
    1942         "capital": "Plymouth"
    1943     },
    1944     {
    1945         "timezones": [
    1946             "America/Martinique"
    1947         ],
    1948         "latlng": [
    1949             14.666667,
    1950             -61
    1951         ],
    1952         "name": "Martinique",
    1953         "code": "MQ",
    1954         "capital": "Fort-de-France"
    1955     },
    1956     {
    1957         "timezones": [
    1958             "Indian/Mauritius"
    1959         ],
    1960         "latlng": [
    1961             -20.28333333,
    1962             57.55
    1963         ],
    1964         "name": "Mauritius",
    1965         "code": "MU",
    1966         "capital": "Port Louis"
    1967     },
    1968     {
    1969         "timezones": [
    1970             "Africa/Blantyre"
    1971         ],
    1972         "latlng": [
    1973             -13.5,
    1974             34
    1975         ],
    1976         "name": "Malawi",
    1977         "code": "MW",
    1978         "capital": "Lilongwe"
    1979     },
    1980     {
    1981         "timezones": [
    1982             "Asia/Kuala_Lumpur",
    1983             "Asia/Kuching"
    1984         ],
    1985         "latlng": [
    1986             2.5,
    1987             112.5
    1988         ],
    1989         "name": "Malaysia",
    1990         "code": "MY",
    1991         "capital": "Kuala Lumpur"
    1992     },
    1993     {
    1994         "timezones": [
    1995             "Indian/Mayotte"
    1996         ],
    1997         "latlng": [
    1998             -12.83333333,
    1999             45.16666666
    2000         ],
    2001         "name": "Mayotte",
    2002         "code": "YT",
    2003         "capital": "Mamoudzou"
    2004     },
    2005     {
    2006         "timezones": [
    2007             "Africa/Windhoek"
    2008         ],
    2009         "latlng": [
    2010             -22,
    2011             17
    2012         ],
    2013         "name": "Namibia",
    2014         "code": "NA",
    2015         "capital": "Windhoek"
    2016     },
    2017     {
    2018         "timezones": [
    2019             "Pacific/Noumea"
    2020         ],
    2021         "latlng": [
    2022             -21.5,
    2023             165.5
    2024         ],
    2025         "name": "New Caledonia",
    2026         "code": "NC",
    2027         "capital": "Noum\u00e9a"
    2028     },
    2029     {
    2030         "timezones": [
    2031             "Africa/Niamey"
    2032         ],
    2033         "latlng": [
    2034             16,
    2035             8
    2036         ],
    2037         "name": "Niger",
    2038         "code": "NE",
    2039         "capital": "Niamey"
    2040     },
    2041     {
    2042         "timezones": [
    2043             "Pacific/Norfolk"
    2044         ],
    2045         "latlng": [
    2046             -29.03333333,
    2047             167.95
    2048         ],
    2049         "name": "Norfolk Island",
    2050         "code": "NF",
    2051         "capital": "Kingston"
    2052     },
    2053     {
    2054         "timezones": [
    2055             "Africa/Lagos"
    2056         ],
    2057         "latlng": [
    2058             10,
    2059             8
    2060         ],
    2061         "name": "Nigeria",
    2062         "code": "NG",
    2063         "capital": "Abuja"
    2064     },
    2065     {
    2066         "timezones": [
    2067             "America/Managua"
    2068         ],
    2069         "latlng": [
    2070             13,
    2071             -85
    2072         ],
    2073         "name": "Nicaragua",
    2074         "code": "NI",
    2075         "capital": "Managua"
    2076     },
    2077     {
    2078         "timezones": [
    2079             "Pacific/Niue"
    2080         ],
    2081         "latlng": [
    2082             -19.03333333,
    2083             -169.86666666
    2084         ],
    2085         "name": "Niue",
    2086         "code": "NU",
    2087         "capital": "Alofi"
    2088     },
    2089     {
    2090         "timezones": [
    2091             "Europe/Amsterdam"
    2092         ],
    2093         "latlng": [
    2094             52.5,
    2095             5.75
    2096         ],
    2097         "name": "Netherlands",
    2098         "code": "NL",
    2099         "capital": "Amsterdam"
    2100     },
    2101     {
    2102         "timezones": [
    2103             "Europe/Oslo"
    2104         ],
    2105         "latlng": [
    2106             62,
    2107             10
    2108         ],
    2109         "name": "Norway",
    2110         "code": "NO",
    2111         "capital": "Oslo"
    2112     },
    2113     {
    2114         "timezones": [
    2115             "Asia/Kathmandu"
    2116         ],
    2117         "latlng": [
    2118             28,
    2119             84
    2120         ],
    2121         "name": "Nepal",
    2122         "code": "NP",
    2123         "capital": "Kathmandu"
    2124     },
    2125     {
    2126         "timezones": [
    2127             "Pacific/Nauru"
    2128         ],
    2129         "latlng": [
    2130             -0.53333333,
    2131             166.91666666
    2132         ],
    2133         "name": "Nauru",
    2134         "code": "NR",
    2135         "capital": "Yaren"
    2136     },
    2137     {
    2138         "timezones": [
    2139             "Pacific/Auckland",
    2140             "Pacific/Chatham"
    2141         ],
    2142         "latlng": [
    2143             -41,
    2144             174
    2145         ],
    2146         "name": "New Zealand",
    2147         "code": "NZ",
    2148         "capital": "Wellington"
    2149     },
    2150     {
    2151         "timezones": [
    2152             "Asia/Muscat"
    2153         ],
    2154         "latlng": [
    2155             21,
    2156             57
    2157         ],
    2158         "name": "Oman",
    2159         "code": "OM",
    2160         "capital": "Muscat"
    2161     },
    2162     {
    2163         "timezones": [
    2164             "Asia/Karachi"
    2165         ],
    2166         "latlng": [
    2167             30,
    2168             70
    2169         ],
    2170         "name": "Pakistan",
    2171         "code": "PK",
    2172         "capital": "Islamabad"
    2173     },
    2174     {
    2175         "timezones": [
    2176             "America/Panama"
    2177         ],
    2178         "latlng": [
    2179             9,
    2180             -80
    2181         ],
    2182         "name": "Panama",
    2183         "code": "PA",
    2184         "capital": "Panama City"
    2185     },
    2186     {
    2187         "timezones": [
    2188             "Pacific/Pitcairn"
    2189         ],
    2190         "latlng": [
    2191             -25.06666666,
    2192             -130.1
    2193         ],
    2194         "name": "Pitcairn Islands",
    2195         "code": "PN",
    2196         "capital": "Adamstown"
    2197     },
    2198     {
    2199         "timezones": [
    2200             "America/Lima"
    2201         ],
    2202         "latlng": [
    2203             -10,
    2204             -76
    2205         ],
    2206         "name": "Peru",
    2207         "code": "PE",
    2208         "capital": "Lima"
    2209     },
    2210     {
    2211         "timezones": [
    2212             "Asia/Manila"
    2213         ],
    2214         "latlng": [
    2215             13,
    2216             122
    2217         ],
    2218         "name": "Philippines",
    2219         "code": "PH",
    2220         "capital": "Manila"
    2221     },
    2222     {
    2223         "timezones": [
    2224             "Pacific/Palau"
    2225         ],
    2226         "latlng": [
    2227             7.5,
    2228             134.5
    2229         ],
    2230         "name": "Palau",
    2231         "code": "PW",
    2232         "capital": "Ngerulmud"
    2233     },
    2234     {
    2235         "timezones": [
    2236             "Pacific/Port_Moresby",
    2237             "Pacific/Bougainville"
    2238         ],
    2239         "latlng": [
    2240             -6,
    2241             147
    2242         ],
    2243         "name": "Papua New Guinea",
    2244         "code": "PG",
    2245         "capital": "Port Moresby"
    2246     },
    2247     {
    2248         "timezones": [
    2249             "Europe/Warsaw"
    2250         ],
    2251         "latlng": [
    2252             52,
    2253             20
    2254         ],
    2255         "name": "Poland",
    2256         "code": "PL",
    2257         "capital": "Warsaw"
    2258     },
    2259     {
    2260         "timezones": [
    2261             "America/Puerto_Rico"
    2262         ],
    2263         "latlng": [
    2264             18.25,
    2265             -66.5
    2266         ],
    2267         "name": "Puerto Rico",
    2268         "code": "PR",
    2269         "capital": "San Juan"
    2270     },
    2271     {
    2272         "timezones": [
    2273             "Asia/Pyongyang"
    2274         ],
    2275         "latlng": [
    2276             40,
    2277             127
    2278         ],
    2279         "name": "North Korea",
    2280         "code": "KP",
    2281         "capital": "Pyongyang"
    2282     },
    2283     {
    2284         "timezones": [
    2285             "Europe/Lisbon",
    2286             "Atlantic/Madeira",
    2287             "Atlantic/Azores"
    2288         ],
    2289         "latlng": [
    2290             39.5,
    2291             -8
    2292         ],
    2293         "name": "Portugal",
    2294         "code": "PT",
    2295         "capital": "Lisbon"
    2296     },
    2297     {
    2298         "timezones": [
    2299             "America/Asuncion"
    2300         ],
    2301         "latlng": [
    2302             -23,
    2303             -58
    2304         ],
    2305         "name": "Paraguay",
    2306         "code": "PY",
    2307         "capital": "Asunci\u00f3n"
    2308     },
    2309     {
    2310         "timezones": [
    2311             "Asia/Gaza",
    2312             "Asia/Hebron"
    2313         ],
    2314         "latlng": [
    2315             31.9,
    2316             35.2
    2317         ],
    2318         "name": "Palestine",
    2319         "code": "PS",
    2320         "capital": "Ramallah"
    2321     },
    2322     {
    2323         "timezones": [
    2324             "Pacific/Tahiti",
    2325             "Pacific/Marquesas",
    2326             "Pacific/Gambier"
    2327         ],
    2328         "latlng": [
    2329             -15,
    2330             -140
    2331         ],
    2332         "name": "French Polynesia",
    2333         "code": "PF",
    2334         "capital": "Papeet\u0113"
    2335     },
    2336     {
    2337         "timezones": [
    2338             "Asia/Qatar"
    2339         ],
    2340         "latlng": [
    2341             25.5,
    2342             51.25
    2343         ],
    2344         "name": "Qatar",
    2345         "code": "QA",
    2346         "capital": "Doha"
    2347     },
    2348     {
    2349         "timezones": [
    2350             "Indian/Reunion"
    2351         ],
    2352         "latlng": [
    2353             -21.15,
    2354             55.5
    2355         ],
    2356         "name": "R\u00e9union",
    2357         "code": "RE",
    2358         "capital": "Saint-Denis"
    2359     },
    2360     {
    2361         "timezones": [
    2362             "Europe/Bucharest"
    2363         ],
    2364         "latlng": [
    2365             46,
    2366             25
    2367         ],
    2368         "name": "Romania",
    2369         "code": "RO",
    2370         "capital": "Bucharest"
    2371     },
    2372     {
    2373         "timezones": [
    2374             "Europe/Kaliningrad",
    2375             "Europe/Moscow",
    2376             "Europe/Simferopol",
    2377             "Europe/Volgograd",
    2378             "Europe/Kirov",
    2379             "Europe/Astrakhan",
    2380             "Europe/Samara",
    2381             "Europe/Ulyanovsk",
    2382             "Asia/Yekaterinburg",
    2383             "Asia/Omsk",
    2384             "Asia/Novosibirsk",
    2385             "Asia/Barnaul",
    2386             "Asia/Tomsk",
    2387             "Asia/Novokuznetsk",
    2388             "Asia/Krasnoyarsk",
    2389             "Asia/Irkutsk",
    2390             "Asia/Chita",
    2391             "Asia/Yakutsk",
    2392             "Asia/Khandyga",
    2393             "Asia/Vladivostok",
    2394             "Asia/Ust-Nera",
    2395             "Asia/Magadan",
    2396             "Asia/Sakhalin",
    2397             "Asia/Srednekolymsk",
    2398             "Asia/Kamchatka",
    2399             "Asia/Anadyr"
    2400         ],
    2401         "latlng": [
    2402             60,
    2403             100
    2404         ],
    2405         "name": "Russia",
    2406         "code": "RU",
    2407         "capital": "Moscow"
    2408     },
    2409     {
    2410         "timezones": [
    2411             "Africa/Kigali"
    2412         ],
    2413         "latlng": [
    2414             -2,
    2415             30
    2416         ],
    2417         "name": "Rwanda",
    2418         "code": "RW",
    2419         "capital": "Kigali"
    2420     },
    2421     {
    2422         "timezones": [
    2423             "Asia/Riyadh"
    2424         ],
    2425         "latlng": [
    2426             25,
    2427             45
    2428         ],
    2429         "name": "Saudi Arabia",
    2430         "code": "SA",
    2431         "capital": "Riyadh"
    2432     },
    2433     {
    2434         "timezones": [
    2435             "Africa/Khartoum"
    2436         ],
    2437         "latlng": [
    2438             15,
    2439             30
    2440         ],
    2441         "name": "Sudan",
    2442         "code": "SD",
    2443         "capital": "Khartoum"
    2444     },
    2445     {
    2446         "timezones": [
    2447             "Africa/Dakar"
    2448         ],
    2449         "latlng": [
    2450             14,
    2451             -14
    2452         ],
    2453         "name": "Senegal",
    2454         "code": "SN",
    2455         "capital": "Dakar"
    2456     },
    2457     {
    2458         "timezones": [
    2459             "Asia/Singapore"
    2460         ],
    2461         "latlng": [
    2462             1.36666666,
    2463             103.8
    2464         ],
    2465         "name": "Singapore",
    2466         "code": "SG",
    2467         "capital": "Singapore"
    2468     },
    2469     {
    2470         "timezones": [
    2471             "Atlantic/South_Georgia"
    2472         ],
    2473         "latlng": [
    2474             -54.5,
    2475             -37
    2476         ],
    2477         "name": "South Georgia",
    2478         "code": "GS",
    2479         "capital": "King Edward Point"
    2480     },
    2481     {
    2482         "timezones": [
    2483             "Arctic/Longyearbyen"
    2484         ],
    2485         "latlng": [
    2486             78,
    2487             20
    2488         ],
    2489         "name": "Svalbard and Jan Mayen",
    2490         "code": "SJ",
    2491         "capital": "Longyearbyen"
    2492     },
    2493     {
    2494         "timezones": [
    2495             "Pacific/Guadalcanal"
    2496         ],
    2497         "latlng": [
    2498             -8,
    2499             159
    2500         ],
    2501         "name": "Solomon Islands",
    2502         "code": "SB",
    2503         "capital": "Honiara"
    2504     },
    2505     {
    2506         "timezones": [
    2507             "Africa/Freetown"
    2508         ],
    2509         "latlng": [
    2510             8.5,
    2511             -11.5
    2512         ],
    2513         "name": "Sierra Leone",
    2514         "code": "SL",
    2515         "capital": "Freetown"
    2516     },
    2517     {
    2518         "timezones": [
    2519             "America/El_Salvador"
    2520         ],
    2521         "latlng": [
    2522             13.83333333,
    2523             -88.91666666
    2524         ],
    2525         "name": "El Salvador",
    2526         "code": "SV",
    2527         "capital": "San Salvador"
    2528     },
    2529     {
    2530         "timezones": [
    2531             "Europe/San_Marino"
    2532         ],
    2533         "latlng": [
    2534             43.76666666,
    2535             12.41666666
    2536         ],
    2537         "name": "San Marino",
    2538         "code": "SM",
    2539         "capital": "City of San Marino"
    2540     },
    2541     {
    2542         "timezones": [
    2543             "Africa/Mogadishu"
    2544         ],
    2545         "latlng": [
    2546             10,
    2547             49
    2548         ],
    2549         "name": "Somalia",
    2550         "code": "SO",
    2551         "capital": "Mogadishu"
    2552     },
    2553     {
    2554         "timezones": [
    2555             "America/Miquelon"
    2556         ],
    2557         "latlng": [
    2558             46.83333333,
    2559             -56.33333333
    2560         ],
    2561         "name": "Saint Pierre and Miquelon",
    2562         "code": "PM",
    2563         "capital": "Saint-Pierre"
    2564     },
    2565     {
    2566         "timezones": [
    2567             "Europe/Belgrade"
    2568         ],
    2569         "latlng": [
    2570             44,
    2571             21
    2572         ],
    2573         "name": "Serbia",
    2574         "code": "RS",
    2575         "capital": "Belgrade"
    2576     },
    2577     {
    2578         "timezones": [
    2579             "Africa/Juba"
    2580         ],
    2581         "latlng": [
    2582             7,
    2583             30
    2584         ],
    2585         "name": "South Sudan",
    2586         "code": "SS",
    2587         "capital": "Juba"
    2588     },
    2589     {
    2590         "timezones": [
    2591             "Africa/Sao_Tome"
    2592         ],
    2593         "latlng": [
    2594             1,
    2595             7
    2596         ],
    2597         "name": "S\u00e3o Tom\u00e9 and Pr\u00edncipe",
    2598         "code": "ST",
    2599         "capital": "S\u00e3o Tom\u00e9"
    2600     },
    2601     {
    2602         "timezones": [
    2603             "America/Paramaribo"
    2604         ],
    2605         "latlng": [
    2606             4,
    2607             -56
    2608         ],
    2609         "name": "Suriname",
    2610         "code": "SR",
    2611         "capital": "Paramaribo"
    2612     },
    2613     {
    2614         "timezones": [
    2615             "Europe/Bratislava"
    2616         ],
    2617         "latlng": [
    2618             48.66666666,
    2619             19.5
    2620         ],
    2621         "name": "Slovakia",
    2622         "code": "SK",
    2623         "capital": "Bratislava"
    2624     },
    2625     {
    2626         "timezones": [
    2627             "Europe/Ljubljana"
    2628         ],
    2629         "latlng": [
    2630             46.11666666,
    2631             14.81666666
    2632         ],
    2633         "name": "Slovenia",
    2634         "code": "SI",
    2635         "capital": "Ljubljana"
    2636     },
    2637     {
    2638         "timezones": [
    2639             "Europe/Stockholm"
    2640         ],
    2641         "latlng": [
    2642             62,
    2643             15
    2644         ],
    2645         "name": "Sweden",
    2646         "code": "SE",
    2647         "capital": "Stockholm"
    2648     },
    2649     {
    2650         "timezones": [
    2651             "Africa/Mbabane"
    2652         ],
    2653         "latlng": [
    2654             -26.5,
    2655             31.5
    2656         ],
    2657         "name": "Swaziland",
    2658         "code": "SZ",
    2659         "capital": "Lobamba"
    2660     },
    2661     {
    2662         "timezones": [
    2663             "America/Lower_Princes"
    2664         ],
    2665         "latlng": [
    2666             18.033333,
    2667             -63.05
    2668         ],
    2669         "name": "Sint Maarten",
    2670         "code": "SX",
    2671         "capital": "Philipsburg"
    2672     },
    2673     {
    2674         "timezones": [
    2675             "Indian/Mahe"
    2676         ],
    2677         "latlng": [
    2678             -4.58333333,
    2679             55.66666666
    2680         ],
    2681         "name": "Seychelles",
    2682         "code": "SC",
    2683         "capital": "Victoria"
    2684     },
    2685     {
    2686         "timezones": [
    2687             "Asia/Damascus"
    2688         ],
    2689         "latlng": [
    2690             35,
    2691             38
    2692         ],
    2693         "name": "Syria",
    2694         "code": "SY",
    2695         "capital": "Damascus"
    2696     },
    2697     {
    2698         "timezones": [
    2699             "America/Grand_Turk"
    2700         ],
    2701         "latlng": [
    2702             21.75,
    2703             -71.58333333
    2704         ],
    2705         "name": "Turks and Caicos Islands",
    2706         "code": "TC",
    2707         "capital": "Cockburn Town"
    2708     },
    2709     {
    2710         "timezones": [
    2711             "Africa/Ndjamena"
    2712         ],
    2713         "latlng": [
    2714             15,
    2715             19
    2716         ],
    2717         "name": "Chad",
    2718         "code": "TD",
    2719         "capital": "N'Djamena"
    2720     },
    2721     {
    2722         "timezones": [
    2723             "Africa/Lome"
    2724         ],
    2725         "latlng": [
    2726             8,
    2727             1.16666666
    2728         ],
    2729         "name": "Togo",
    2730         "code": "TG",
    2731         "capital": "Lom\u00e9"
    2732     },
    2733     {
    2734         "timezones": [
    2735             "Asia/Bangkok"
    2736         ],
    2737         "latlng": [
    2738             15,
    2739             100
    2740         ],
    2741         "name": "Thailand",
    2742         "code": "TH",
    2743         "capital": "Bangkok"
    2744     },
    2745     {
    2746         "timezones": [
    2747             "Asia/Dushanbe"
    2748         ],
    2749         "latlng": [
    2750             39,
    2751             71
    2752         ],
    2753         "name": "Tajikistan",
    2754         "code": "TJ",
    2755         "capital": "Dushanbe"
    2756     },
    2757     {
    2758         "timezones": [
    2759             "Pacific/Fakaofo"
    2760         ],
    2761         "latlng": [
    2762             -9,
    2763             -172
    2764         ],
    2765         "name": "Tokelau",
    2766         "code": "TK",
    2767         "capital": "Fakaofo"
    2768     },
    2769     {
    2770         "timezones": [
    2771             "Asia/Ashgabat"
    2772         ],
    2773         "latlng": [
    2774             40,
    2775             60
    2776         ],
    2777         "name": "Turkmenistan",
    2778         "code": "TM",
    2779         "capital": "Ashgabat"
    2780     },
    2781     {
    2782         "timezones": [
    2783             "Asia/Dili"
    2784         ],
    2785         "latlng": [
    2786             -8.83333333,
    2787             125.91666666
    2788         ],
    2789         "name": "Timor-Leste",
    2790         "code": "TL",
    2791         "capital": "Dili"
    2792     },
    2793     {
    2794         "timezones": [
    2795             "Pacific/Tongatapu"
    2796         ],
    2797         "latlng": [
    2798             -20,
    2799             -175
    2800         ],
    2801         "name": "Tonga",
    2802         "code": "TO",
    2803         "capital": "Nuku'alofa"
    2804     },
    2805     {
    2806         "timezones": [
    2807             "America/Port_of_Spain"
    2808         ],
    2809         "latlng": [
    2810             11,
    2811             -61
    2812         ],
    2813         "name": "Trinidad and Tobago",
    2814         "code": "TT",
    2815         "capital": "Port of Spain"
    2816     },
    2817     {
    2818         "timezones": [
    2819             "Africa/Tunis"
    2820         ],
    2821         "latlng": [
    2822             34,
    2823             9
    2824         ],
    2825         "name": "Tunisia",
    2826         "code": "TN",
    2827         "capital": "Tunis"
    2828     },
    2829     {
    2830         "timezones": [
    2831             "Europe/Istanbul"
    2832         ],
    2833         "latlng": [
    2834             39,
    2835             35
    2836         ],
    2837         "name": "Turkey",
    2838         "code": "TR",
    2839         "capital": "Ankara"
    2840     },
    2841     {
    2842         "timezones": [
    2843             "Pacific/Funafuti"
    2844         ],
    2845         "latlng": [
    2846             -8,
    2847             178
    2848         ],
    2849         "name": "Tuvalu",
    2850         "code": "TV",
    2851         "capital": "Funafuti"
    2852     },
    2853     {
    2854         "timezones": [
    2855             "Asia/Taipei"
    2856         ],
    2857         "latlng": [
    2858             23.5,
    2859             121
    2860         ],
    2861         "name": "Taiwan",
    2862         "code": "TW",
    2863         "capital": "Taipei"
    2864     },
    2865     {
    2866         "timezones": [
    2867             "Africa/Dar_es_Salaam"
    2868         ],
    2869         "latlng": [
    2870             -6,
    2871             35
    2872         ],
    2873         "name": "Tanzania",
    2874         "code": "TZ",
    2875         "capital": "Dodoma"
    2876     },
    2877     {
    2878         "timezones": [
    2879             "Africa/Kampala"
    2880         ],
    2881         "latlng": [
    2882             1,
    2883             32
    2884         ],
    2885         "name": "Uganda",
    2886         "code": "UG",
    2887         "capital": "Kampala"
    2888     },
    2889     {
    2890         "timezones": [
    2891             "Europe/Kiev",
    2892             "Europe/Uzhgorod",
    2893             "Europe/Zaporozhye"
    2894         ],
    2895         "latlng": [
    2896             49,
    2897             32
    2898         ],
    2899         "name": "Ukraine",
    2900         "code": "UA",
    2901         "capital": "Kiev"
    2902     },
    2903     {
    2904         "timezones": [
    2905             "Pacific/Johnston",
    2906             "Pacific/Midway",
    2907             "Pacific/Wake"
    2908         ],
    2909         "latlng": [
    2910             19.2911437,
    2911             166.618332
    2912         ],
    2913         "name": "United States Minor Outlying Islands",
    2914         "code": "UM",
    2915         "capital": null
    2916     },
    2917     {
    2918         "timezones": [
    2919             "America/Montevideo"
    2920         ],
    2921         "latlng": [
    2922             -33,
    2923             -56
    2924         ],
    2925         "name": "Uruguay",
    2926         "code": "UY",
    2927         "capital": "Montevideo"
    2928     },
    2929     {
    2930         "timezones": [
    2931             "America/New_York",
    2932             "America/Detroit",
    2933             "America/Kentucky/Louisville",
    2934             "America/Kentucky/Monticello",
    2935             "America/Indiana/Indianapolis",
    2936             "America/Indiana/Vincennes",
    2937             "America/Indiana/Winamac",
    2938             "America/Indiana/Marengo",
    2939             "America/Indiana/Petersburg",
    2940             "America/Indiana/Vevay",
    2941             "America/Chicago",
    2942             "America/Indiana/Tell_City",
    2943             "America/Indiana/Knox",
    2944             "America/Menominee",
    2945             "America/North_Dakota/Center",
    2946             "America/North_Dakota/New_Salem",
    2947             "America/North_Dakota/Beulah",
    2948             "America/Denver",
    2949             "America/Boise",
    2950             "America/Phoenix",
    2951             "America/Los_Angeles",
    2952             "America/Anchorage",
    2953             "America/Juneau",
    2954             "America/Sitka",
    2955             "America/Metlakatla",
    2956             "America/Yakutat",
    2957             "America/Nome",
    2958             "America/Adak",
    2959             "Pacific/Honolulu"
    2960         ],
    2961         "latlng": [
    2962             38,
    2963             -97
    2964         ],
    2965         "name": "United States",
    2966         "code": "US",
    2967         "capital": "Washington D.C."
    2968     },
    2969     {
    2970         "timezones": [
    2971             "Asia/Samarkand",
    2972             "Asia/Tashkent"
    2973         ],
    2974         "latlng": [
    2975             41,
    2976             64
    2977         ],
    2978         "name": "Uzbekistan",
    2979         "code": "UZ",
    2980         "capital": "Tashkent"
    2981     },
    2982     {
    2983         "timezones": [
    2984             "Europe/Vatican"
    2985         ],
    2986         "latlng": [
    2987             41.9,
    2988             12.45
    2989         ],
    2990         "name": "Vatican City",
    2991         "code": "VA",
    2992         "capital": "Vatican City"
    2993     },
    2994     {
    2995         "timezones": [
    2996             "America/St_Vincent"
    2997         ],
    2998         "latlng": [
    2999             13.25,
    3000             -61.2
    3001         ],
    3002         "name": "Saint Vincent and the Grenadines",
    3003         "code": "VC",
    3004         "capital": "Kingstown"
    3005     },
    3006     {
    3007         "timezones": [
    3008             "America/Caracas"
    3009         ],
    3010         "latlng": [
    3011             8,
    3012             -66
    3013         ],
    3014         "name": "Venezuela",
    3015         "code": "VE",
    3016         "capital": "Caracas"
    3017     },
    3018     {
    3019         "timezones": [
    3020             "America/Tortola"
    3021         ],
    3022         "latlng": [
    3023             18.431383,
    3024             -64.62305
    3025         ],
    3026         "name": "British Virgin Islands",
    3027         "code": "VG",
    3028         "capital": "Road Town"
    3029     },
    3030     {
    3031         "timezones": [
    3032             "America/St_Thomas"
    3033         ],
    3034         "latlng": [
    3035             18.35,
    3036             -64.933333
    3037         ],
    3038         "name": "United States Virgin Islands",
    3039         "code": "VI",
    3040         "capital": "Charlotte Amalie"
    3041     },
    3042     {
    3043         "timezones": [
    3044             "Asia/Ho_Chi_Minh"
    3045         ],
    3046         "latlng": [
    3047             16.16666666,
    3048             107.83333333
    3049         ],
    3050         "name": "Vietnam",
    3051         "code": "VN",
    3052         "capital": "Hanoi"
    3053     },
    3054     {
    3055         "timezones": [
    3056             "Pacific/Efate"
    3057         ],
    3058         "latlng": [
    3059             -16,
    3060             167
    3061         ],
    3062         "name": "Vanuatu",
    3063         "code": "VU",
    3064         "capital": "Port Vila"
    3065     },
    3066     {
    3067         "timezones": [
    3068             "Pacific/Wallis"
    3069         ],
    3070         "latlng": [
    3071             -13.3,
    3072             -176.2
    3073         ],
    3074         "name": "Wallis and Futuna",
    3075         "code": "WF",
    3076         "capital": "Mata-Utu"
    3077     },
    3078     {
    3079         "timezones": [
    3080             "Pacific/Apia"
    3081         ],
    3082         "latlng": [
    3083             -13.58333333,
    3084             -172.33333333
    3085         ],
    3086         "name": "Samoa",
    3087         "code": "WS",
    3088         "capital": "Apia"
    3089     },
    3090     {
    3091         "timezones": [
    3092             "Asia/Aden"
    3093         ],
    3094         "latlng": [
    3095             15,
    3096             48
    3097         ],
    3098         "name": "Yemen",
    3099         "code": "YE",
    3100         "capital": "Sana'a"
    3101     },
    3102     {
    3103         "timezones": [
    3104             "Africa/Johannesburg"
    3105         ],
    3106         "latlng": [
    3107             -29,
    3108             24
    3109         ],
    3110         "name": "South Africa",
    3111         "code": "ZA",
    3112         "capital": "Pretoria"
    3113     },
    3114     {
    3115         "timezones": [
    3116             "Africa/Lusaka"
    3117         ],
    3118         "latlng": [
    3119             -15,
    3120             30
    3121         ],
    3122         "name": "Zambia",
    3123         "code": "ZM",
    3124         "capital": "Lusaka"
    3125     },
    3126     {
    3127         "timezones": [
    3128             "Africa/Harare"
    3129         ],
    3130         "latlng": [
    3131             -20,
    3132             30
    3133         ],
    3134         "name": "Zimbabwe",
    3135         "code": "ZW",
    3136         "capital": "Harare"
    3137     }
    3138 ]
     1[{"timezones":["America/Aruba"],"latlng":[12.5,-69.96666666],"name":"Aruba","code":"AW","capital":"Oranjestad"},{"timezones":["Asia/Kabul"],"latlng":[33,65],"name":"Afghanistan","code":"AF","capital":"Kabul"},{"timezones":["Africa/Luanda"],"latlng":[-12.5,18.5],"name":"Angola","code":"AO","capital":"Luanda"},{"timezones":["America/Anguilla"],"latlng":[18.25,-63.16666666],"name":"Anguilla","code":"AI","capital":"The Valley"},{"timezones":["Europe/Mariehamn"],"latlng":[60.116667,19.9],"name":"\u00c5land Islands","code":"AX","capital":"Mariehamn"},{"timezones":["Europe/Tirane"],"latlng":[41,20],"name":"Albania","code":"AL","capital":"Tirana"},{"timezones":["Europe/Andorra"],"latlng":[42.5,1.5],"name":"Andorra","code":"AD","capital":"Andorra la Vella"},{"timezones":["Asia/Dubai"],"latlng":[24,54],"name":"United Arab Emirates","code":"AE","capital":"Abu Dhabi"},{"timezones":["America/Argentina/Buenos_Aires","America/Argentina/Cordoba","America/Argentina/Salta","America/Argentina/Jujuy","America/Argentina/Tucuman","America/Argentina/Catamarca","America/Argentina/La_Rioja","America/Argentina/San_Juan","America/Argentina/Mendoza","America/Argentina/San_Luis","America/Argentina/Rio_Gallegos","America/Argentina/Ushuaia"],"latlng":[-34,-64],"name":"Argentina","code":"AR","capital":"Buenos Aires"},{"timezones":["Asia/Yerevan"],"latlng":[40,45],"name":"Armenia","code":"AM","capital":"Yerevan"},{"timezones":["Pacific/Pago_Pago"],"latlng":[-14.33333333,-170],"name":"American Samoa","code":"AS","capital":"Pago Pago"},{"timezones":["Antarctica/McMurdo","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok"],"latlng":[-90,0],"name":"Antarctica","code":"AQ","capital":null},{"timezones":["Indian/Kerguelen"],"latlng":[-49.25,69.167],"name":"French Southern and Antarctic Lands","code":"TF","capital":"Port-aux-Fran\u00e7ais"},{"timezones":["America/Antigua"],"latlng":[17.05,-61.8],"name":"Antigua and Barbuda","code":"AG","capital":"Saint John's"},{"timezones":["Australia/Lord_Howe","Antarctica/Macquarie","Australia/Hobart","Australia/Currie","Australia/Melbourne","Australia/Sydney","Australia/Broken_Hill","Australia/Brisbane","Australia/Lindeman","Australia/Adelaide","Australia/Darwin","Australia/Perth","Australia/Eucla"],"latlng":[-27,133],"name":"Australia","code":"AU","capital":"Canberra"},{"timezones":["Europe/Vienna"],"latlng":[47.33333333,13.33333333],"name":"Austria","code":"AT","capital":"Vienna"},{"timezones":["Asia/Baku"],"latlng":[40.5,47.5],"name":"Azerbaijan","code":"AZ","capital":"Baku"},{"timezones":["Africa/Bujumbura"],"latlng":[-3.5,30],"name":"Burundi","code":"BI","capital":"Bujumbura"},{"timezones":["Europe/Brussels"],"latlng":[50.83333333,4],"name":"Belgium","code":"BE","capital":"Brussels"},{"timezones":["Africa/Porto-Novo"],"latlng":[9.5,2.25],"name":"Benin","code":"BJ","capital":"Porto-Novo"},{"timezones":["Africa/Ouagadougou"],"latlng":[13,-2],"name":"Burkina Faso","code":"BF","capital":"Ouagadougou"},{"timezones":["Asia/Dhaka"],"latlng":[24,90],"name":"Bangladesh","code":"BD","capital":"Dhaka"},{"timezones":["Europe/Sofia"],"latlng":[43,25],"name":"Bulgaria","code":"BG","capital":"Sofia"},{"timezones":["Asia/Bahrain"],"latlng":[26,50.55],"name":"Bahrain","code":"BH","capital":"Manama"},{"timezones":["America/Nassau"],"latlng":[24.25,-76],"name":"Bahamas","code":"BS","capital":"Nassau"},{"timezones":["Europe/Sarajevo"],"latlng":[44,18],"name":"Bosnia and Herzegovina","code":"BA","capital":"Sarajevo"},{"timezones":["America/St_Barthelemy"],"latlng":[18.5,-63.41666666],"name":"Saint Barth\u00e9lemy","code":"BL","capital":"Gustavia"},{"timezones":["Europe/Minsk"],"latlng":[53,28],"name":"Belarus","code":"BY","capital":"Minsk"},{"timezones":["America/Belize"],"latlng":[17.25,-88.75],"name":"Belize","code":"BZ","capital":"Belmopan"},{"timezones":["Atlantic/Bermuda"],"latlng":[32.33333333,-64.75],"name":"Bermuda","code":"BM","capital":"Hamilton"},{"timezones":["America/La_Paz"],"latlng":[-17,-65],"name":"Bolivia","code":"BO","capital":"Sucre"},{"timezones":["America/Noronha","America/Belem","America/Fortaleza","America/Recife","America/Araguaina","America/Maceio","America/Bahia","America/Sao_Paulo","America/Campo_Grande","America/Cuiaba","America/Santarem","America/Porto_Velho","America/Boa_Vista","America/Manaus","America/Eirunepe","America/Rio_Branco"],"latlng":[-10,-55],"name":"Brazil","code":"BR","capital":"Bras\u00edlia"},{"timezones":["America/Barbados"],"latlng":[13.16666666,-59.53333333],"name":"Barbados","code":"BB","capital":"Bridgetown"},{"timezones":["Asia/Brunei"],"latlng":[4.5,114.66666666],"name":"Brunei","code":"BN","capital":"Bandar Seri Begawan"},{"timezones":["Asia/Thimphu"],"latlng":[27.5,90.5],"name":"Bhutan","code":"BT","capital":"Thimphu"},{"timezones":["Europe/Oslo"],"latlng":[-54.43333333,3.4],"name":"Bouvet Island","code":"BV","capital":null},{"timezones":["Africa/Gaborone"],"latlng":[-22,24],"name":"Botswana","code":"BW","capital":"Gaborone"},{"timezones":["Africa/Bangui"],"latlng":[7,21],"name":"Central African Republic","code":"CF","capital":"Bangui"},{"timezones":["America/St_Johns","America/Halifax","America/Glace_Bay","America/Moncton","America/Goose_Bay","America/Blanc-Sablon","America/Toronto","America/Nipigon","America/Thunder_Bay","America/Iqaluit","America/Pangnirtung","America/Atikokan","America/Winnipeg","America/Rainy_River","America/Resolute","America/Rankin_Inlet","America/Regina","America/Swift_Current","America/Edmonton","America/Cambridge_Bay","America/Yellowknife","America/Inuvik","America/Creston","America/Dawson_Creek","America/Fort_Nelson","America/Vancouver","America/Whitehorse","America/Dawson"],"latlng":[60,-95],"name":"Canada","code":"CA","capital":"Ottawa"},{"timezones":["Indian/Cocos"],"latlng":[-12.5,96.83333333],"name":"Cocos (Keeling) Islands","code":"CC","capital":"West Island"},{"timezones":["Europe/Zurich"],"latlng":[47,8],"name":"Switzerland","code":"CH","capital":"Bern"},{"timezones":["America/Santiago","Pacific/Easter"],"latlng":[-30,-71],"name":"Chile","code":"CL","capital":"Santiago"},{"timezones":["Asia/Shanghai","Asia/Urumqi"],"latlng":[35,105],"name":"China","code":"CN","capital":"Beijing"},{"timezones":["Africa/Abidjan"],"latlng":[8,-5],"name":"Ivory Coast","code":"CI","capital":"Yamoussoukro"},{"timezones":["Africa/Douala"],"latlng":[6,12],"name":"Cameroon","code":"CM","capital":"Yaound\u00e9"},{"timezones":["Africa/Kinshasa","Africa/Lubumbashi"],"latlng":[0,25],"name":"DR Congo","code":"CD","capital":"Kinshasa"},{"timezones":["Africa/Brazzaville"],"latlng":[-1,15],"name":"Republic of the Congo","code":"CG","capital":"Brazzaville"},{"timezones":["Pacific/Rarotonga"],"latlng":[-21.23333333,-159.76666666],"name":"Cook Islands","code":"CK","capital":"Avarua"},{"timezones":["America/Bogota"],"latlng":[4,-72],"name":"Colombia","code":"CO","capital":"Bogot\u00e1"},{"timezones":["Indian/Comoro"],"latlng":[-12.16666666,44.25],"name":"Comoros","code":"KM","capital":"Moroni"},{"timezones":["Atlantic/Cape_Verde"],"latlng":[16,-24],"name":"Cape Verde","code":"CV","capital":"Praia"},{"timezones":["America/Costa_Rica"],"latlng":[10,-84],"name":"Costa Rica","code":"CR","capital":"San Jos\u00e9"},{"timezones":["America/Havana"],"latlng":[21.5,-80],"name":"Cuba","code":"CU","capital":"Havana"},{"timezones":["America/Curacao"],"latlng":[12.116667,-68.933333],"name":"Cura\u00e7ao","code":"CW","capital":"Willemstad"},{"timezones":["Indian/Christmas"],"latlng":[-10.5,105.66666666],"name":"Christmas Island","code":"CX","capital":"Flying Fish Cove"},{"timezones":["America/Cayman"],"latlng":[19.5,-80.5],"name":"Cayman Islands","code":"KY","capital":"George Town"},{"timezones":["Asia/Nicosia"],"latlng":[35,33],"name":"Cyprus","code":"CY","capital":"Nicosia"},{"timezones":["Europe/Prague"],"latlng":[49.75,15.5],"name":"Czech Republic","code":"CZ","capital":"Prague"},{"timezones":["Europe/Berlin","Europe/Busingen"],"latlng":[51,9],"name":"Germany","code":"DE","capital":"Berlin"},{"timezones":["Africa/Djibouti"],"latlng":[11.5,43],"name":"Djibouti","code":"DJ","capital":"Djibouti"},{"timezones":["America/Dominica"],"latlng":[15.41666666,-61.33333333],"name":"Dominica","code":"DM","capital":"Roseau"},{"timezones":["Europe/Copenhagen"],"latlng":[56,10],"name":"Denmark","code":"DK","capital":"Copenhagen"},{"timezones":["America/Santo_Domingo"],"latlng":[19,-70.66666666],"name":"Dominican Republic","code":"DO","capital":"Santo Domingo"},{"timezones":["Africa/Algiers"],"latlng":[28,3],"name":"Algeria","code":"DZ","capital":"Algiers"},{"timezones":["America/Guayaquil","Pacific/Galapagos"],"latlng":[-2,-77.5],"name":"Ecuador","code":"EC","capital":"Quito"},{"timezones":["Africa/Cairo"],"latlng":[27,30],"name":"Egypt","code":"EG","capital":"Cairo"},{"timezones":["Africa/Asmara"],"latlng":[15,39],"name":"Eritrea","code":"ER","capital":"Asmara"},{"timezones":["Africa/El_Aaiun"],"latlng":[24.5,-13],"name":"Western Sahara","code":"EH","capital":"El Aai\u00fan"},{"timezones":["Europe/Madrid","Africa/Ceuta","Atlantic/Canary"],"latlng":[40,-4],"name":"Spain","code":"ES","capital":"Madrid"},{"timezones":["Europe/Tallinn"],"latlng":[59,26],"name":"Estonia","code":"EE","capital":"Tallinn"},{"timezones":["Africa/Addis_Ababa"],"latlng":[8,38],"name":"Ethiopia","code":"ET","capital":"Addis Ababa"},{"timezones":["Europe/Helsinki"],"latlng":[64,26],"name":"Finland","code":"FI","capital":"Helsinki"},{"timezones":["Pacific/Fiji"],"latlng":[-18,175],"name":"Fiji","code":"FJ","capital":"Suva"},{"timezones":["Atlantic/Stanley"],"latlng":[-51.75,-59],"name":"Falkland Islands","code":"FK","capital":"Stanley"},{"timezones":["Europe/Paris"],"latlng":[46,2],"name":"France","code":"FR","capital":"Paris"},{"timezones":["Atlantic/Faroe"],"latlng":[62,-7],"name":"Faroe Islands","code":"FO","capital":"T\u00f3rshavn"},{"timezones":["Pacific/Chuuk","Pacific/Pohnpei","Pacific/Kosrae"],"latlng":[6.91666666,158.25],"name":"Micronesia","code":"FM","capital":"Palikir"},{"timezones":["Africa/Libreville"],"latlng":[-1,11.75],"name":"Gabon","code":"GA","capital":"Libreville"},{"timezones":["Europe/London"],"latlng":[54,-2],"name":"United Kingdom","code":"GB","capital":"London"},{"timezones":["Asia/Tbilisi"],"latlng":[42,43.5],"name":"Georgia","code":"GE","capital":"Tbilisi"},{"timezones":["Europe/Guernsey"],"latlng":[49.46666666,-2.58333333],"name":"Guernsey","code":"GG","capital":"St. Peter Port"},{"timezones":["Africa/Accra"],"latlng":[8,-2],"name":"Ghana","code":"GH","capital":"Accra"},{"timezones":["Europe/Gibraltar"],"latlng":[36.13333333,-5.35],"name":"Gibraltar","code":"GI","capital":"Gibraltar"},{"timezones":["Africa/Conakry"],"latlng":[11,-10],"name":"Guinea","code":"GN","capital":"Conakry"},{"timezones":["America/Guadeloupe"],"latlng":[16.25,-61.583333],"name":"Guadeloupe","code":"GP","capital":"Basse-Terre"},{"timezones":["Africa/Banjul"],"latlng":[13.46666666,-16.56666666],"name":"Gambia","code":"GM","capital":"Banjul"},{"timezones":["Africa/Bissau"],"latlng":[12,-15],"name":"Guinea-Bissau","code":"GW","capital":"Bissau"},{"timezones":["Africa/Malabo"],"latlng":[2,10],"name":"Equatorial Guinea","code":"GQ","capital":"Malabo"},{"timezones":["Europe/Athens"],"latlng":[39,22],"name":"Greece","code":"GR","capital":"Athens"},{"timezones":["America/Grenada"],"latlng":[12.11666666,-61.66666666],"name":"Grenada","code":"GD","capital":"St. George's"},{"timezones":["America/Godthab","America/Danmarkshavn","America/Scoresbysund","America/Thule"],"latlng":[72,-40],"name":"Greenland","code":"GL","capital":"Nuuk"},{"timezones":["America/Guatemala"],"latlng":[15.5,-90.25],"name":"Guatemala","code":"GT","capital":"Guatemala City"},{"timezones":["America/Cayenne"],"latlng":[4,-53],"name":"French Guiana","code":"GF","capital":"Cayenne"},{"timezones":["Pacific/Guam"],"latlng":[13.46666666,144.78333333],"name":"Guam","code":"GU","capital":"Hag\u00e5t\u00f1a"},{"timezones":["America/Guyana"],"latlng":[5,-59],"name":"Guyana","code":"GY","capital":"Georgetown"},{"timezones":["Asia/Hong_Kong"],"latlng":[22.267,114.188],"name":"Hong Kong","code":"HK","capital":"City of Victoria"},{"timezones":["America/Tegucigalpa"],"latlng":[15,-86.5],"name":"Honduras","code":"HN","capital":"Tegucigalpa"},{"timezones":["Europe/Zagreb"],"latlng":[45.16666666,15.5],"name":"Croatia","code":"HR","capital":"Zagreb"},{"timezones":["America/Port-au-Prince"],"latlng":[19,-72.41666666],"name":"Haiti","code":"HT","capital":"Port-au-Prince"},{"timezones":["Europe/Budapest"],"latlng":[47,20],"name":"Hungary","code":"HU","capital":"Budapest"},{"timezones":["Asia/Jakarta","Asia/Pontianak","Asia/Makassar","Asia/Jayapura"],"latlng":[-5,120],"name":"Indonesia","code":"ID","capital":"Jakarta"},{"timezones":["Europe/Isle_of_Man"],"latlng":[54.25,-4.5],"name":"Isle of Man","code":"IM","capital":"Douglas"},{"timezones":["Asia/Kolkata"],"latlng":[20,77],"name":"India","code":"IN","capital":"New Delhi"},{"timezones":["Indian/Chagos"],"latlng":[-6,71.5],"name":"British Indian Ocean Territory","code":"IO","capital":"Diego Garcia"},{"timezones":["Europe/Dublin"],"latlng":[53,-8],"name":"Ireland","code":"IE","capital":"Dublin"},{"timezones":["Asia/Tehran"],"latlng":[32,53],"name":"Iran","code":"IR","capital":"Tehran"},{"timezones":["Asia/Baghdad"],"latlng":[33,44],"name":"Iraq","code":"IQ","capital":"Baghdad"},{"timezones":["Atlantic/Reykjavik"],"latlng":[65,-18],"name":"Iceland","code":"IS","capital":"Reykjavik"},{"timezones":["Asia/Jerusalem"],"latlng":[31.47,35.13],"name":"Israel","code":"IL","capital":"Jerusalem"},{"timezones":["Europe/Rome"],"latlng":[42.83333333,12.83333333],"name":"Italy","code":"IT","capital":"Rome"},{"timezones":["America/Jamaica"],"latlng":[18.25,-77.5],"name":"Jamaica","code":"JM","capital":"Kingston"},{"timezones":["Europe/Jersey"],"latlng":[49.25,-2.16666666],"name":"Jersey","code":"JE","capital":"Saint Helier"},{"timezones":["Asia/Amman"],"latlng":[31,36],"name":"Jordan","code":"JO","capital":"Amman"},{"timezones":["Asia/Tokyo"],"latlng":[36,138],"name":"Japan","code":"JP","capital":"Tokyo"},{"timezones":["Asia/Almaty","Asia/Qyzylorda","Asia/Aqtobe","Asia/Aqtau","Asia/Oral"],"latlng":[48,68],"name":"Kazakhstan","code":"KZ","capital":"Astana"},{"timezones":["Africa/Nairobi"],"latlng":[1,38],"name":"Kenya","code":"KE","capital":"Nairobi"},{"timezones":["Asia/Bishkek"],"latlng":[41,75],"name":"Kyrgyzstan","code":"KG","capital":"Bishkek"},{"timezones":["Asia/Phnom_Penh"],"latlng":[13,105],"name":"Cambodia","code":"KH","capital":"Phnom Penh"},{"timezones":["Pacific/Tarawa","Pacific/Enderbury","Pacific/Kiritimati"],"latlng":[1.41666666,173],"name":"Kiribati","code":"KI","capital":"South Tarawa"},{"timezones":["America/St_Kitts"],"latlng":[17.33333333,-62.75],"name":"Saint Kitts and Nevis","code":"KN","capital":"Basseterre"},{"timezones":["Asia/Seoul"],"latlng":[37,127.5],"name":"South Korea","code":"KR","capital":"Seoul"},{"timezones":["Europe/Belgrade"],"latlng":[42.666667,21.166667],"name":"Kosovo","code":"XK","capital":"Pristina"},{"timezones":["Asia/Kuwait"],"latlng":[29.5,45.75],"name":"Kuwait","code":"KW","capital":"Kuwait City"},{"timezones":["Asia/Vientiane"],"latlng":[18,105],"name":"Laos","code":"LA","capital":"Vientiane"},{"timezones":["Asia/Beirut"],"latlng":[33.83333333,35.83333333],"name":"Lebanon","code":"LB","capital":"Beirut"},{"timezones":["Africa/Monrovia"],"latlng":[6.5,-9.5],"name":"Liberia","code":"LR","capital":"Monrovia"},{"timezones":["Africa/Tripoli"],"latlng":[25,17],"name":"Libya","code":"LY","capital":"Tripoli"},{"timezones":["America/St_Lucia"],"latlng":[13.88333333,-60.96666666],"name":"Saint Lucia","code":"LC","capital":"Castries"},{"timezones":["Europe/Vaduz"],"latlng":[47.26666666,9.53333333],"name":"Liechtenstein","code":"LI","capital":"Vaduz"},{"timezones":["Asia/Colombo"],"latlng":[7,81],"name":"Sri Lanka","code":"LK","capital":"Colombo"},{"timezones":["Africa/Maseru"],"latlng":[-29.5,28.5],"name":"Lesotho","code":"LS","capital":"Maseru"},{"timezones":["Europe/Vilnius"],"latlng":[56,24],"name":"Lithuania","code":"LT","capital":"Vilnius"},{"timezones":["Europe/Luxembourg"],"latlng":[49.75,6.16666666],"name":"Luxembourg","code":"LU","capital":"Luxembourg"},{"timezones":["Europe/Riga"],"latlng":[57,25],"name":"Latvia","code":"LV","capital":"Riga"},{"timezones":["Asia/Macau"],"latlng":[22.16666666,113.55],"name":"Macau","code":"MO","capital":null},{"timezones":["America/Marigot"],"latlng":[18.08333333,-63.95],"name":"Saint Martin","code":"MF","capital":"Marigot"},{"timezones":["Africa/Casablanca"],"latlng":[32,-5],"name":"Morocco","code":"MA","capital":"Rabat"},{"timezones":["Europe/Monaco"],"latlng":[43.73333333,7.4],"name":"Monaco","code":"MC","capital":"Monaco"},{"timezones":["Europe/Chisinau"],"latlng":[47,29],"name":"Moldova","code":"MD","capital":"Chi\u0219in\u0103u"},{"timezones":["Indian/Antananarivo"],"latlng":[-20,47],"name":"Madagascar","code":"MG","capital":"Antananarivo"},{"timezones":["Indian/Maldives"],"latlng":[3.25,73],"name":"Maldives","code":"MV","capital":"Mal\u00e9"},{"timezones":["America/Mexico_City","America/Cancun","America/Merida","America/Monterrey","America/Matamoros","America/Mazatlan","America/Chihuahua","America/Ojinaga","America/Hermosillo","America/Tijuana","America/Bahia_Banderas"],"latlng":[23,-102],"name":"Mexico","code":"MX","capital":"Mexico City"},{"timezones":["Pacific/Majuro","Pacific/Kwajalein"],"latlng":[9,168],"name":"Marshall Islands","code":"MH","capital":"Majuro"},{"timezones":["Europe/Skopje"],"latlng":[41.83333333,22],"name":"Macedonia","code":"MK","capital":"Skopje"},{"timezones":["Africa/Bamako"],"latlng":[17,-4],"name":"Mali","code":"ML","capital":"Bamako"},{"timezones":["Europe/Malta"],"latlng":[35.83333333,14.58333333],"name":"Malta","code":"MT","capital":"Valletta"},{"timezones":["Asia/Rangoon"],"latlng":[22,98],"name":"Myanmar","code":"MM","capital":"Naypyidaw"},{"timezones":["Europe/Podgorica"],"latlng":[42.5,19.3],"name":"Montenegro","code":"ME","capital":"Podgorica"},{"timezones":["Asia/Ulaanbaatar","Asia/Hovd","Asia/Choibalsan"],"latlng":[46,105],"name":"Mongolia","code":"MN","capital":"Ulan Bator"},{"timezones":["Pacific/Saipan"],"latlng":[15.2,145.75],"name":"Northern Mariana Islands","code":"MP","capital":"Saipan"},{"timezones":["Africa/Maputo"],"latlng":[-18.25,35],"name":"Mozambique","code":"MZ","capital":"Maputo"},{"timezones":["Africa/Nouakchott"],"latlng":[20,-12],"name":"Mauritania","code":"MR","capital":"Nouakchott"},{"timezones":["America/Montserrat"],"latlng":[16.75,-62.2],"name":"Montserrat","code":"MS","capital":"Plymouth"},{"timezones":["America/Martinique"],"latlng":[14.666667,-61],"name":"Martinique","code":"MQ","capital":"Fort-de-France"},{"timezones":["Indian/Mauritius"],"latlng":[-20.28333333,57.55],"name":"Mauritius","code":"MU","capital":"Port Louis"},{"timezones":["Africa/Blantyre"],"latlng":[-13.5,34],"name":"Malawi","code":"MW","capital":"Lilongwe"},{"timezones":["Asia/Kuala_Lumpur","Asia/Kuching"],"latlng":[2.5,112.5],"name":"Malaysia","code":"MY","capital":"Kuala Lumpur"},{"timezones":["Indian/Mayotte"],"latlng":[-12.83333333,45.16666666],"name":"Mayotte","code":"YT","capital":"Mamoudzou"},{"timezones":["Africa/Windhoek"],"latlng":[-22,17],"name":"Namibia","code":"NA","capital":"Windhoek"},{"timezones":["Pacific/Noumea"],"latlng":[-21.5,165.5],"name":"New Caledonia","code":"NC","capital":"Noum\u00e9a"},{"timezones":["Africa/Niamey"],"latlng":[16,8],"name":"Niger","code":"NE","capital":"Niamey"},{"timezones":["Pacific/Norfolk"],"latlng":[-29.03333333,167.95],"name":"Norfolk Island","code":"NF","capital":"Kingston"},{"timezones":["Africa/Lagos"],"latlng":[10,8],"name":"Nigeria","code":"NG","capital":"Abuja"},{"timezones":["America/Managua"],"latlng":[13,-85],"name":"Nicaragua","code":"NI","capital":"Managua"},{"timezones":["Pacific/Niue"],"latlng":[-19.03333333,-169.86666666],"name":"Niue","code":"NU","capital":"Alofi"},{"timezones":["Europe/Amsterdam"],"latlng":[52.5,5.75],"name":"Netherlands","code":"NL","capital":"Amsterdam"},{"timezones":["Europe/Oslo"],"latlng":[62,10],"name":"Norway","code":"NO","capital":"Oslo"},{"timezones":["Asia/Kathmandu"],"latlng":[28,84],"name":"Nepal","code":"NP","capital":"Kathmandu"},{"timezones":["Pacific/Nauru"],"latlng":[-0.53333333,166.91666666],"name":"Nauru","code":"NR","capital":"Yaren"},{"timezones":["Pacific/Auckland","Pacific/Chatham"],"latlng":[-41,174],"name":"New Zealand","code":"NZ","capital":"Wellington"},{"timezones":["Asia/Muscat"],"latlng":[21,57],"name":"Oman","code":"OM","capital":"Muscat"},{"timezones":["Asia/Karachi"],"latlng":[30,70],"name":"Pakistan","code":"PK","capital":"Islamabad"},{"timezones":["America/Panama"],"latlng":[9,-80],"name":"Panama","code":"PA","capital":"Panama City"},{"timezones":["Pacific/Pitcairn"],"latlng":[-25.06666666,-130.1],"name":"Pitcairn Islands","code":"PN","capital":"Adamstown"},{"timezones":["America/Lima"],"latlng":[-10,-76],"name":"Peru","code":"PE","capital":"Lima"},{"timezones":["Asia/Manila"],"latlng":[13,122],"name":"Philippines","code":"PH","capital":"Manila"},{"timezones":["Pacific/Palau"],"latlng":[7.5,134.5],"name":"Palau","code":"PW","capital":"Ngerulmud"},{"timezones":["Pacific/Port_Moresby","Pacific/Bougainville"],"latlng":[-6,147],"name":"Papua New Guinea","code":"PG","capital":"Port Moresby"},{"timezones":["Europe/Warsaw"],"latlng":[52,20],"name":"Poland","code":"PL","capital":"Warsaw"},{"timezones":["America/Puerto_Rico"],"latlng":[18.25,-66.5],"name":"Puerto Rico","code":"PR","capital":"San Juan"},{"timezones":["Asia/Pyongyang"],"latlng":[40,127],"name":"North Korea","code":"KP","capital":"Pyongyang"},{"timezones":["Europe/Lisbon","Atlantic/Madeira","Atlantic/Azores"],"latlng":[39.5,-8],"name":"Portugal","code":"PT","capital":"Lisbon"},{"timezones":["America/Asuncion"],"latlng":[-23,-58],"name":"Paraguay","code":"PY","capital":"Asunci\u00f3n"},{"timezones":["Asia/Gaza","Asia/Hebron"],"latlng":[31.9,35.2],"name":"Palestine","code":"PS","capital":"Ramallah"},{"timezones":["Pacific/Tahiti","Pacific/Marquesas","Pacific/Gambier"],"latlng":[-15,-140],"name":"French Polynesia","code":"PF","capital":"Papeet\u0113"},{"timezones":["Asia/Qatar"],"latlng":[25.5,51.25],"name":"Qatar","code":"QA","capital":"Doha"},{"timezones":["Indian/Reunion"],"latlng":[-21.15,55.5],"name":"R\u00e9union","code":"RE","capital":"Saint-Denis"},{"timezones":["Europe/Bucharest"],"latlng":[46,25],"name":"Romania","code":"RO","capital":"Bucharest"},{"timezones":["Europe/Kaliningrad","Europe/Moscow","Europe/Simferopol","Europe/Volgograd","Europe/Kirov","Europe/Astrakhan","Europe/Samara","Europe/Ulyanovsk","Asia/Yekaterinburg","Asia/Omsk","Asia/Novosibirsk","Asia/Barnaul","Asia/Tomsk","Asia/Novokuznetsk","Asia/Krasnoyarsk","Asia/Irkutsk","Asia/Chita","Asia/Yakutsk","Asia/Khandyga","Asia/Vladivostok","Asia/Ust-Nera","Asia/Magadan","Asia/Sakhalin","Asia/Srednekolymsk","Asia/Kamchatka","Asia/Anadyr"],"latlng":[60,100],"name":"Russia","code":"RU","capital":"Moscow"},{"timezones":["Africa/Kigali"],"latlng":[-2,30],"name":"Rwanda","code":"RW","capital":"Kigali"},{"timezones":["Asia/Riyadh"],"latlng":[25,45],"name":"Saudi Arabia","code":"SA","capital":"Riyadh"},{"timezones":["Africa/Khartoum"],"latlng":[15,30],"name":"Sudan","code":"SD","capital":"Khartoum"},{"timezones":["Africa/Dakar"],"latlng":[14,-14],"name":"Senegal","code":"SN","capital":"Dakar"},{"timezones":["Asia/Singapore"],"latlng":[1.36666666,103.8],"name":"Singapore","code":"SG","capital":"Singapore"},{"timezones":["Atlantic/South_Georgia"],"latlng":[-54.5,-37],"name":"South Georgia","code":"GS","capital":"King Edward Point"},{"timezones":["Arctic/Longyearbyen"],"latlng":[78,20],"name":"Svalbard and Jan Mayen","code":"SJ","capital":"Longyearbyen"},{"timezones":["Pacific/Guadalcanal"],"latlng":[-8,159],"name":"Solomon Islands","code":"SB","capital":"Honiara"},{"timezones":["Africa/Freetown"],"latlng":[8.5,-11.5],"name":"Sierra Leone","code":"SL","capital":"Freetown"},{"timezones":["America/El_Salvador"],"latlng":[13.83333333,-88.91666666],"name":"El Salvador","code":"SV","capital":"San Salvador"},{"timezones":["Europe/San_Marino"],"latlng":[43.76666666,12.41666666],"name":"San Marino","code":"SM","capital":"City of San Marino"},{"timezones":["Africa/Mogadishu"],"latlng":[10,49],"name":"Somalia","code":"SO","capital":"Mogadishu"},{"timezones":["America/Miquelon"],"latlng":[46.83333333,-56.33333333],"name":"Saint Pierre and Miquelon","code":"PM","capital":"Saint-Pierre"},{"timezones":["Europe/Belgrade"],"latlng":[44,21],"name":"Serbia","code":"RS","capital":"Belgrade"},{"timezones":["Africa/Juba"],"latlng":[7,30],"name":"South Sudan","code":"SS","capital":"Juba"},{"timezones":["Africa/Sao_Tome"],"latlng":[1,7],"name":"S\u00e3o Tom\u00e9 and Pr\u00edncipe","code":"ST","capital":"S\u00e3o Tom\u00e9"},{"timezones":["America/Paramaribo"],"latlng":[4,-56],"name":"Suriname","code":"SR","capital":"Paramaribo"},{"timezones":["Europe/Bratislava"],"latlng":[48.66666666,19.5],"name":"Slovakia","code":"SK","capital":"Bratislava"},{"timezones":["Europe/Ljubljana"],"latlng":[46.11666666,14.81666666],"name":"Slovenia","code":"SI","capital":"Ljubljana"},{"timezones":["Europe/Stockholm"],"latlng":[62,15],"name":"Sweden","code":"SE","capital":"Stockholm"},{"timezones":["Africa/Mbabane"],"latlng":[-26.5,31.5],"name":"Swaziland","code":"SZ","capital":"Lobamba"},{"timezones":["America/Lower_Princes"],"latlng":[18.033333,-63.05],"name":"Sint Maarten","code":"SX","capital":"Philipsburg"},{"timezones":["Indian/Mahe"],"latlng":[-4.58333333,55.66666666],"name":"Seychelles","code":"SC","capital":"Victoria"},{"timezones":["Asia/Damascus"],"latlng":[35,38],"name":"Syria","code":"SY","capital":"Damascus"},{"timezones":["America/Grand_Turk"],"latlng":[21.75,-71.58333333],"name":"Turks and Caicos Islands","code":"TC","capital":"Cockburn Town"},{"timezones":["Africa/Ndjamena"],"latlng":[15,19],"name":"Chad","code":"TD","capital":"N'Djamena"},{"timezones":["Africa/Lome"],"latlng":[8,1.16666666],"name":"Togo","code":"TG","capital":"Lom\u00e9"},{"timezones":["Asia/Bangkok"],"latlng":[15,100],"name":"Thailand","code":"TH","capital":"Bangkok"},{"timezones":["Asia/Dushanbe"],"latlng":[39,71],"name":"Tajikistan","code":"TJ","capital":"Dushanbe"},{"timezones":["Pacific/Fakaofo"],"latlng":[-9,-172],"name":"Tokelau","code":"TK","capital":"Fakaofo"},{"timezones":["Asia/Ashgabat"],"latlng":[40,60],"name":"Turkmenistan","code":"TM","capital":"Ashgabat"},{"timezones":["Asia/Dili"],"latlng":[-8.83333333,125.91666666],"name":"Timor-Leste","code":"TL","capital":"Dili"},{"timezones":["Pacific/Tongatapu"],"latlng":[-20,-175],"name":"Tonga","code":"TO","capital":"Nuku'alofa"},{"timezones":["America/Port_of_Spain"],"latlng":[11,-61],"name":"Trinidad and Tobago","code":"TT","capital":"Port of Spain"},{"timezones":["Africa/Tunis"],"latlng":[34,9],"name":"Tunisia","code":"TN","capital":"Tunis"},{"timezones":["Europe/Istanbul"],"latlng":[39,35],"name":"Turkey","code":"TR","capital":"Ankara"},{"timezones":["Pacific/Funafuti"],"latlng":[-8,178],"name":"Tuvalu","code":"TV","capital":"Funafuti"},{"timezones":["Asia/Taipei"],"latlng":[23.5,121],"name":"Taiwan","code":"TW","capital":"Taipei"},{"timezones":["Africa/Dar_es_Salaam"],"latlng":[-6,35],"name":"Tanzania","code":"TZ","capital":"Dodoma"},{"timezones":["Africa/Kampala"],"latlng":[1,32],"name":"Uganda","code":"UG","capital":"Kampala"},{"timezones":["Europe/Kiev","Europe/Uzhgorod","Europe/Zaporozhye"],"latlng":[49,32],"name":"Ukraine","code":"UA","capital":"Kiev"},{"timezones":["Pacific/Johnston","Pacific/Midway","Pacific/Wake"],"latlng":[19.2911437,166.618332],"name":"United States Minor Outlying Islands","code":"UM","capital":null},{"timezones":["America/Montevideo"],"latlng":[-33,-56],"name":"Uruguay","code":"UY","capital":"Montevideo"},{"timezones":["America/New_York","America/Detroit","America/Kentucky/Louisville","America/Kentucky/Monticello","America/Indiana/Indianapolis","America/Indiana/Vincennes","America/Indiana/Winamac","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Vevay","America/Chicago","America/Indiana/Tell_City","America/Indiana/Knox","America/Menominee","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/North_Dakota/Beulah","America/Denver","America/Boise","America/Phoenix","America/Los_Angeles","America/Anchorage","America/Juneau","America/Sitka","America/Metlakatla","America/Yakutat","America/Nome","America/Adak","Pacific/Honolulu"],"latlng":[38,-97],"name":"United States","code":"US","capital":"Washington D.C."},{"timezones":["Asia/Samarkand","Asia/Tashkent"],"latlng":[41,64],"name":"Uzbekistan","code":"UZ","capital":"Tashkent"},{"timezones":["Europe/Vatican"],"latlng":[41.9,12.45],"name":"Vatican City","code":"VA","capital":"Vatican City"},{"timezones":["America/St_Vincent"],"latlng":[13.25,-61.2],"name":"Saint Vincent and the Grenadines","code":"VC","capital":"Kingstown"},{"timezones":["America/Caracas"],"latlng":[8,-66],"name":"Venezuela","code":"VE","capital":"Caracas"},{"timezones":["America/Tortola"],"latlng":[18.431383,-64.62305],"name":"British Virgin Islands","code":"VG","capital":"Road Town"},{"timezones":["America/St_Thomas"],"latlng":[18.35,-64.933333],"name":"United States Virgin Islands","code":"VI","capital":"Charlotte Amalie"},{"timezones":["Asia/Ho_Chi_Minh"],"latlng":[16.16666666,107.83333333],"name":"Vietnam","code":"VN","capital":"Hanoi"},{"timezones":["Pacific/Efate"],"latlng":[-16,167],"name":"Vanuatu","code":"VU","capital":"Port Vila"},{"timezones":["Pacific/Wallis"],"latlng":[-13.3,-176.2],"name":"Wallis and Futuna","code":"WF","capital":"Mata-Utu"},{"timezones":["Pacific/Apia"],"latlng":[-13.58333333,-172.33333333],"name":"Samoa","code":"WS","capital":"Apia"},{"timezones":["Asia/Aden"],"latlng":[15,48],"name":"Yemen","code":"YE","capital":"Sana'a"},{"timezones":["Africa/Johannesburg"],"latlng":[-29,24],"name":"South Africa","code":"ZA","capital":"Pretoria"},{"timezones":["Africa/Lusaka"],"latlng":[-15,30],"name":"Zambia","code":"ZM","capital":"Lusaka"},{"timezones":["Africa/Harare"],"latlng":[-20,30],"name":"Zimbabwe","code":"ZW","capital":"Harare"}]
  • heimdall/trunk/addons/world-map/world-map.php

    r2571934 r2834688  
    11<?php
    22
    3 /**
    4  * MIT License <https://github.com/Rmanaf/wp-heimdall/blob/master/LICENSE>
    5  * Copyright (c) 2018 Arman Afzal <rman.afzal@gmail.com>
    6  */
     3namespace Heimdall\Addons;
    74
    8 require_once __DIR__ . "/database.php";
     5use Heimdall\Addon;
     6use Heimdall\Dashboard;
     7use Heimdall\Database;
    98
    10 if (!class_exists('WP_HeimdallAddon_WorldMap')) {
     9class WorldMap extends Addon
     10{
    1111
    12     class WP_HeimdallAddon_WorldMap
    13     {
    14 
    15         // addon slug
    16         private static $slug = "world-map";
     12    private static $service = "http://geolocation-db.com/";
    1713
    1814
    19         private static $service = "http://geolocation-db.com/";
     15    /**
     16     * @since 1.3.1
     17     */
     18    static function setup()
     19    {
     20        self::load_libs(["world-map-database.php"]);
     21
     22        WorldMapDatabase::check_countries_table();
     23
     24        WorldMapDatabase::check_ip_table();
     25
     26        add_action("admin_enqueue_scripts", [__CLASS__, "admin_enqueue_scripts"]);
     27        add_action("wp_ajax_heimdall_world_map", [__CLASS__, "get_dashboard_world_map_data"]);
     28
     29        add_filter("heimdall__core_record-metadata-v2", [__CLASS__, "add_country_data"]);
     30        add_filter("heimdall__core_localize-script", [__CLASS__, "map_data_url"], 10, 1);
     31        add_filter("heimdall__widget_tabs", [__CLASS__, "widget_tabs"]);
     32        add_filter("heimdall__widget_content", [__CLASS__, "widget_content"]);
     33        add_filter("heimdall__com_handle-request" , [__CLASS__, "handle_com_request"]);
     34
     35        add_filter('heimdall__core_uninstall-options' , function($options){
     36            $options[] = 'world_map_ip_table_db_version';
     37            $options[] = 'world_map_countries_table_db_version';
     38            return $options;
     39        });
     40    }
    2041
    2142
    22         /**
    23          * @since 1.3.1
    24          */
    25         static function init()
    26         {
    27 
    28             $class = get_called_class();
    29 
    30             WP_HeimdallAddon_WorldMap_Database::check_countries_table();
    31 
    32             WP_HeimdallAddon_WorldMap_Database::check_ip_table();
    33 
    34             add_action("admin_enqueue_scripts", "$class::admin_enqueue_scripts");
    35 
    36             add_action("heimdall--dashboard-statistic-widget-tabs", "$class::dashboard_statistic_widget_tabs", 10);
    37 
    38             add_action("heimdall--dashboard-statistic-widget-tab-content", "$class::dashboard_statistic_widget_tab_content", 10);
    39 
    40             //add_filter("heimdall--localize-script", "$class::get_dashboard_world_map_data" , 10, 1);
    41            
    42             add_action("wp_ajax_heimdall_world_map" , "$class::get_dashboard_world_map_data");
    43 
    44             add_filter("heimdall--record-metadata", "$class::add_country_data");
    45 
    46         }
     43    static function map_data_url($data)
     44    {
     45        $data['worldMapDataURL'] = HEIMDALL_URL . '/addons/world-map/assets/countries-50m.json';
     46        return $data;
     47    }
    4748
    4849
    49         /**
    50          * @since 1.3.1
    51          */
    52         static function dashboard_statistic_widget()
    53         {
    54         }
    55        
    56 
    57         /**
    58          * @since 1.3.1
    59          */
    60         static function dashboard_statistic_widget_tabs() {
    61            
    62             WP_Heimdall_Dashboard::create_admin_widget_tab( esc_html__( "Countries", "heimdall" ) ,"countries");
    63 
    64         }
    65 
    66         /**
    67          * @since 1.3.1
    68          */
    69         static function dashboard_statistic_widget_tab_content($title){
    70 
    71             $image = WP_Heimdall_Plugin::addon_url(self::$slug, "assets/img/map.svg");
    72 
    73             ob_start();
    74 
    75             ?>
    76 
    77             <div id="statisticsWorldMapDataContainer" style="position: relative;">
    78                 <svg width="100%" height="400px"></svg>
    79                 <div class="tooltip"></div>
    80             </div>
    81 
    82             <?php
    83 
    84             WP_Heimdall_Dashboard::create_admin_widget_tab_content("countries" , ob_get_clean() );
    85         }
     50    static function widget_tabs($tabs_html)
     51    {
     52        return $tabs_html . Dashboard::create_widget_tab(
     53            self::get_slug(),
     54            esc_html__("Countries", "heimdall"),
     55            'admin-site-alt3'
     56        );
     57    }
    8658
    8759
    88         /**
    89          * @since 1.3.1
    90          */
    91         static function admin_enqueue_scripts(){
     60    static function widget_content($tabs_html)
     61    {
     62        return $tabs_html . Dashboard::create_widget_tab_content(
     63            self::get_slug(),
     64            '<canvas id="statisticsWorldMapDataContainer" ></canvas>'
     65        );
     66    }
    9267
    93             $screen = get_current_screen();
    9468
    95             if(current_user_can( 'administrator' ) && $screen->id  == 'dashboard' )
    96             {
    97 
    98                 wp_enqueue_style("world-map", WP_Heimdall_Plugin::addon_url(self::$slug ,  '/assets/css/world-map-admin.css'), [], WP_Heimdall_Plugin::$version, "all");
    99                
    100                 wp_enqueue_script("topojson", WP_Heimdall_Plugin::addon_url(self::$slug ,  '/assets/js/topojson.min.js'), ['d3'], WP_Heimdall_Plugin::$version, true);
    101                
    102                 wp_enqueue_script("world-map-2", WP_Heimdall_Plugin::addon_url(self::$slug ,  '/assets/js/world-map-admin.js'), ['d3' , 'topojson'], WP_Heimdall_Plugin::$version, true);
    103 
    104             }
    105 
     69    /**
     70     * @since 1.3.1
     71     */
     72    static function admin_enqueue_scripts()
     73    {
     74        $screen = get_current_screen();
     75        if (!current_user_can('update_core') || $screen->id  !== 'dashboard') {
     76            return;
    10677        }
     78        self::enqueue_script("hmd-chart-js-geo", '/assets/js/chartjs-geo.js', true, ['heimdall', 'hmd-chartjs']);
     79        self::enqueue_script("heimdall-map-widget", '/assets/js/map-widget.js', true, ['heimdall', 'hmd-chartjs', 'hmd-chart-js-geo']);
     80    }
    10781
    10882
    10983
    11084
    111         /**
    112          * @since 1.3.1
    113          */
    114         static function get_dashboard_world_map_data() {
     85    /**
     86     * @since 1.3.1
     87     */
     88    static function get_dashboard_world_map_data()
     89    {
     90        global $wpdb;
    11591
    116             global $wpdb;
     92        check_ajax_referer('heimdall-nonce');
    11793
    118             check_ajax_referer('heimdall-nonce');
     94        $data = [];
     95        $query = WorldMapDatabase::get_world_map_data_query();
    11996
    120             $data = [];
     97        $records = $wpdb->get_results($query, ARRAY_A);
     98        $records = array_map(function ($o) {
     99            return [
     100                "r" => intval($o['records']),
     101                "n" => $o['country_name'],
     102                "c" => $o['country_code']
     103            ];
     104        } , $records);
    121105
    122             $query = WP_HeimdallAddon_WorldMap_Database::get_world_map_data_query();
     106        $data["world_map_data"] = $records;
     107        $data["world_map_max"] = max(array_column($records , 'r'));
    123108
    124             $data["world_map_110m2"] = WP_Heimdall_Plugin::addon_url("world-map","assets/world-110m2.json");
     109        wp_send_json_success($data);
     110    }
     111
     112
     113
     114    static function handle_com_request($params){
     115
     116        $params = false;
     117
     118        if(empty($params['action']) || empty($params['data'])){
     119            return false;
     120        }
     121
     122        switch($params["action"]){
    125123           
    126             $data["world_country_names"] = WP_Heimdall_Plugin::addon_url("world-map","assets/world-country-names.csv");
     124        }
    127125
    128             $data["world_map_data"] = $wpdb->get_results($query , ARRAY_A);
     126    }
    129127
    130             $data["world_map_max"] = max(array_map(function($o){return $o["records"];}, $data["world_map_data"]));
    131128
    132             wp_send_json_success( $data );
     129    /**
     130     * @since 1.3.1
     131     */
     132    static function add_country_data($metav2)
     133    {
    133134
     135        if (isset($metav2["ip"])) {
     136            $ip = $metav2["ip"];
     137            $service = self::$service;
     138
     139            $ip_data = self::get_ip_data($ip);
     140
     141            if (empty($ip_data)) {
     142
     143                $response = wp_remote_get("$service/json/$ip");
     144
     145                if (is_wp_error($response)) {
     146                    return $metav2;
     147                }
     148
     149                $json = wp_remote_retrieve_body($response);
     150
     151                $data = json_decode($json, true);
     152
     153                WorldMapDatabase::insert_ip_data($ip, $data);
     154
     155                $metav2['country_code'] = $data["country_code"];
     156            } else {
     157
     158                $geo = json_decode($ip_data[0]['data'], true);
     159
     160                $metav2['country_code'] = $geo["country_code"];
     161            }
    134162        }
     163
     164        return $metav2;
     165    }
    135166
    136167
    137168
    138169
    139         /**
    140          * @since 1.3.1
    141          */
    142         static function add_country_data($metav2)
    143         {
     170    /**
     171     * @since 1.3.1
     172     */
     173    static function get_ip_data($ip)
     174    {
    144175
    145             if (isset($metav2["ip"])) {
    146                 $ip = $metav2["ip"];
    147                 $service = self::$service;
     176        global $wpdb;
    148177
    149                 $ip_data = self::get_ip_data($ip);
     178        $query = WorldMapDatabase::get_find_ip_query($ip);
    150179
    151                 if(empty($ip_data)){
     180        $data = $wpdb->get_results($query, ARRAY_A);
    152181
    153                     $response = wp_remote_get("$service/json/$ip");
    154 
    155                     if(is_wp_error( $response )){
    156                         return $metav2;
    157                     }
    158 
    159                     $json = wp_remote_retrieve_body($response);
    160 
    161                     $data = json_decode($json , true);
    162 
    163                     WP_HeimdallAddon_WorldMap_Database::insert_ip_data($ip , $data);
    164                    
    165                     $metav2['country_code'] = $data["country_code"];
    166 
    167                 } else {
    168 
    169                     $geo = json_decode($ip_data[0]['data'], true);
    170 
    171                     $metav2['country_code'] = $geo["country_code"];
    172 
    173                 }
    174             }
    175 
    176             return $metav2;
    177         }
     182        return $data;
     183    }
    178184
    179185
    180 
    181 
    182         /**
    183          * @since 1.3.1
    184          */
    185         static function get_ip_data($ip)
    186         {
    187            
    188             global $wpdb;
    189 
    190             $query = WP_HeimdallAddon_WorldMap_Database::get_find_ip_query($ip);
    191 
    192             $data = $wpdb->get_results($query , ARRAY_A);
    193 
    194             return $data;
    195 
    196         }
    197 
    198 
    199 
    200 
    201 
    202 
    203     }
    204186}
  • heimdall/trunk/heimdall.php

    r2571934 r2834688  
    11<?php
    2 
    32/**
     3 * Heimdall
     4 *
     5 * @package     Heimdall
     6 * @author      Rmanaf <me@rmanaf.com>
     7 * @copyright   2018-2023 WP Heimdall
     8 * @license     No License (No Permission)
     9 *
     10 * @wordpress-plugin
    411 * Plugin Name: Heimdall
    5  * Plugin URI: https://github.com/Rmanaf/wp-heimdall
     12 * Plugin URI: https://wp-heimdall.com
    613 * Description: This plugin is for tracking your client activities.
    7  * Version: 1.3.3
     14 * Version: 1.4.0
     15 * Network: true
     16 * Requires at least: 5.8
     17 * Requires PHP:      5.6
    818 * Author: Rmanaf
    9  * Author URI: https://profiles.wordpress.org/rmanaf/
    10  * License: MIT License
    11  * License URI: https://github.com/Rmanaf/wp-heimdall/blob/master/LICENSE
     19 * Author URI: https://rmanaf.com
     20 * License: No License (No Permission)
     21 * License URI: https://wp-heimdall.com/license
    1222 * Text Domain: heimdall
    1323 * Domain Path: /languages
    1424 */
    1525
     26use Heimdall\Communicator;
     27use Heimdall\Core;
     28use Heimdall\Dashboard;
     29use Heimdall\Database;
     30use Heimdall\LicenseManager;
     31use Heimdall\Options;
    1632
    17 defined('ABSPATH') or die;
     33defined( 'ABSPATH' ) || die;
    1834
    19 require_once __DIR__ . "/includes/commons.php";
    20 require_once __DIR__ . "/includes/database.php";
    21 require_once __DIR__ . "/includes/options.php";
    22 require_once __DIR__ . "/includes/dashboard.php";
     35define( 'HEIMDALL_FILE', __FILE__ );
     36define( 'HEIMDALL_DIR', plugin_dir_path( __FILE__ ) );
     37define( 'HEIMDALL_URL', plugin_dir_url( __FILE__ ) );
     38define( 'HEIMDALL_VER', '1.4.0' );
    2339
    24 if (!class_exists('WP_Heimdall_Plugin')) {
     40require_once __DIR__ . '/includes/class-database.php';
     41require_once __DIR__ . '/includes/class-addon.php';
     42require_once __DIR__ . '/includes/class-core.php';
     43require_once __DIR__ . '/includes/class-helpers.php';
     44require_once __DIR__ . '/includes/class-cryptor.php';
     45require_once __DIR__ . '/includes/class-options.php';
     46require_once __DIR__ . '/includes/class-dashboard.php';
     47require_once __DIR__ . '/includes/class-communicator.php';
     48require_once __DIR__ . '/includes/class-license-manager.php';
    2549
    26     class WP_Heimdall_Plugin
    27     {
    28 
    29         static $version = "1.3.3";
    30 
    31         private static $content_type = [
    32             'Undefined',
    33             'Home',
    34             'Page',
    35             'Post',
    36             'Category',
    37             'Tag',
    38             'Comment'
    39         ];
    40 
    41 
    42         static $hit_hooks = [];
    43 
    44 
    45         private static $addons = [
    46             "StatisticsShortcode",
    47             "MostUsedKeywords",
    48             "WeeklyReport",
    49             "Today",
    50             "WorldMap"
    51         ];
    52 
    53 
    54         /**
    55          * @since 1.3.1
    56          */
    57         static function init()
    58         {
    59 
    60             $class = get_called_class();
    61 
    62             self::$hit_hooks = explode(',',  get_option('wp_dcp_heimdall_active_hooks', ''));
    63 
    64 
    65 
    66             WP_Heimdall_Database::check_db();
    67 
    68             WP_Heimdall_Options::init();
    69 
    70             WP_Heimdall_Dashboard::init();
    71 
    72 
    73 
    74 
    75             add_action('admin_print_scripts', "$class::enqueue_admin_scripts");
    76 
    77 
    78             add_action("wp_enqueue_scripts",  "$class::enqueue_scripts");
    79 
    80 
    81             add_action('pre_get_posts', "$class::pre_get_posts");
    82 
    83 
    84             add_filter("the_content", "$class::filter_content");
    85 
    86             add_filter("the_excerpt", "$class::filter_excerpt");
    87 
    88             add_action('plugins_loaded',  "$class::load_plugin_textdomain");
    89 
    90 
    91 
    92             foreach (self::$hit_hooks as $h) {
    93 
    94                 add_action($h, function () use ($h) {
    95 
    96                     if (did_action($h) > 1) {
    97                         return;
    98                     }
    99 
    100                     self::record_activity();
    101                 });
    102             }
    103 
    104             self::activate_addons();
    105         }
    106 
    107 
    108         /**
    109          * @since 1.3.1
    110          */
    111         static function load_plugin_textdomain(){
    112             load_plugin_textdomain( "heimdall", FALSE, basename( dirname( __FILE__ ) ) . '/languages/' );
    113         }
    114 
    115 
    116         /**
    117          * @since 1.0.0
    118          */
    119         static function pre_get_posts($query)
    120         {
    121 
    122             if (is_admin()) {
    123                 return;
    124             }
    125 
    126             if (did_action("pre_get_posts") > 1) {
    127                 return;
    128             }
    129 
    130 
    131             if ($query->is_search() && $query->is_main_query()) {
    132 
    133                 $keyword = get_search_query();
    134 
    135                 // ignore whitespace and empty values
    136                 if (empty(trim($keyword))) {
    137                     return;
    138                 }
    139 
    140                 $ip = WP_Heimdall_Commons::get_ip_address();
    141 
    142                 if ($ip == null) {
    143                     $ip = 'unknown';
    144                 }
    145 
    146                 WP_Heimdall_Database::insert_once($ip, null,  4,   'pre_get_posts', $keyword);
    147             }
    148         }
    149 
    150 
    151         /**
    152          * @since 1.0.0
    153          */
    154         static function filter_excerpt($excerpt)
    155         {
    156 
    157             $option = '';
    158 
    159             if (is_single()) {
    160                 $option = 'wp_dcp_heimdall_post_position';
    161             }
    162 
    163             if (empty($option)) {
    164                 return $excerpt;
    165             }
    166 
    167             $pos = get_option($option, 0);
    168 
    169             $value =  apply_filters("heimdall--views-num",  "[statistics]");
    170 
    171             switch ($pos) {
    172                 case 3:
    173                     return $excerpt . $value;
    174                 case 4:
    175                     return $value . $excerpt;
    176                 default:
    177                     return $excerpt;
    178             }
    179         }
    180 
    181         /**
    182          * @since 1.0.0
    183          */
    184         static function filter_content($content)
    185         {
    186 
    187             $option = '';
    188 
    189             if (is_page()) {
    190                 $option = 'wp_dcp_heimdall_page_position';
    191             }
    192 
    193             if (is_single()) {
    194                 $option = 'wp_dcp_heimdall_post_position';
    195             }
    196 
    197             if (empty($option)) {
    198                 return $content;
    199             }
    200 
    201             $pos = get_option($option, 0);
    202 
    203             $value =  apply_filters("heimdall--views-num",  "[statistics]");
    204 
    205             switch ($pos) {
    206                 case 1:
    207                     return $content . $value;
    208                 case 2:
    209                     return $value . $content;
    210                 default:
    211                     return $content;
    212             }
    213         }
    214 
    215 
    216         /**
    217          * @since 1.0.0
    218          */
    219         static function enqueue_scripts()
    220         {
    221 
    222             $ver = self::$version;
    223 
    224             $data =  apply_filters("heimdall--client-script", [
    225                 'ajaxurl' => admin_url('admin-ajax.php'),
    226                 'ajaxnonce' => wp_create_nonce('heimdall-nonce')
    227             ]);
    228 
    229             wp_register_script("heimdall-client", "", []);
    230 
    231             wp_localize_script("heimdall-client", "heimdall",  $data);
    232 
    233             wp_enqueue_script("heimdall-client");
    234 
    235             wp_enqueue_script("heimdall-client-ajax", plugins_url('/assets/js/client-ajax.js', __FILE__), ["heimdall-client"], $ver, false);
    236         }
    237 
    238 
    239         /**
    240          * @since 1.0.0
    241          */
    242         static function enqueue_admin_scripts()
    243         {
    244 
    245             $ver = self::$version;
    246 
    247             $screen = get_current_screen();
    248 
    249             if (current_user_can('administrator') && $screen->id  == 'dashboard') {
    250 
    251                 // tabs
    252                 wp_enqueue_style("heimdall-tabs", plugins_url('/assets/css/tabs.css', __FILE__), [], $ver, "all");
    253 
    254                 wp_enqueue_script("heimdall-tabs", plugins_url('/assets/js/tabs.js', __FILE__), [], $ver, false);
    255 
    256 
    257                 // chart.js
    258                 wp_enqueue_script('dcp-chart-js-bundle', plugins_url('/assets/js/chart.bundle.min.js', __FILE__), [], $ver, false);
    259 
    260 
    261                 // d3.js
    262                 wp_enqueue_script('d3', plugins_url('/assets/js/d3.min.js', __FILE__), [], $ver, false);
    263 
    264 
    265 
    266 
    267                 wp_register_script('heimdall-admin', '', [], false);
    268 
    269                 wp_enqueue_script('heimdall-admin');
    270 
    271                 wp_localize_script('heimdall-admin', 'heimdall', apply_filters("heimdall--localize-script", [
    272                     'is_multisite' => is_multisite(),
    273                     'ajaxurl' => admin_url('admin-ajax.php'),
    274                     'ajaxnonce' => wp_create_nonce('heimdall-nonce')
    275                 ]));
    276             }
    277         }
    278 
    279 
    280         /**
    281          * @since 1.3.1
    282          */
    283         static function get_request_type_page()
    284         {
    285 
    286             global $post;
    287 
    288             $type = 0;
    289             $page = null;
    290 
    291              /**
    292              * type 0 is undefined
    293              * type 1 is homepage
    294              * type 2 is page
    295              * type 3 is post
    296              * type 4 is search
    297              * type 5 is 404
    298              */
    299             if (is_home() || is_front_page()) {
    300                 $type = 1;
    301             } else if (is_404()) {
    302                 $type = 5;
    303             } else if (is_page() && !is_front_page()) {
    304                 $page = $post->ID;
    305                 $type = 2;
    306             } else if (is_single()) {
    307                 $page = $post->ID;
    308                 $type = 3;
    309             }
    310 
    311             $type = apply_filters("heimdall--record-type", $type);
    312 
    313             return [
    314                 "page" => $page,
    315                 "type" => $type
    316             ];
    317         }
    318 
    319 
    320         /**
    321          * @since 1.0.0
    322          */
    323         static function record_activity($type = null, $pid = null)
    324         {
    325 
    326             global $wp;
    327 
    328             $type_post_dt = self::get_request_type_page();
    329 
    330             $ip = WP_Heimdall_Commons::get_ip_address();
    331 
    332             if ($ip == null) {
    333                 $ip = 'unknown';
    334             }
    335 
    336             $filter = current_filter();
    337 
    338             $url = add_query_arg($wp->query_vars, home_url($wp->request));
    339 
    340             $metav2 = [];
    341 
    342             if (!empty($ip) && $ip != "unknown") {
    343                 $metav2["ip"] = $ip;
    344             }
    345 
    346             $metav2["url"] = urlencode($url);
    347 
    348             $metav2 = apply_filters("heimdall--record-metadata", $metav2);
    349 
    350             $metav2 = json_encode($metav2, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    351 
    352             WP_Heimdall_Database::insert_once(
    353                 $ip,
    354                 is_null($pid) ?  $type_post_dt["page"] : $pid,
    355                 is_null($type) ? $type_post_dt["type"] : $type,
    356                 $filter,
    357                 $type_post_dt["type"] == 5 ? get_queried_object() : null,
    358                 $metav2
    359             );
    360 
    361         }
    362 
    363 
    364 
    365         /**
    366          * @since 1.0.0
    367          */
    368         static function activate_addons()
    369         {
    370 
    371             $addons_dir = __DIR__ . "/addons";
    372 
    373             foreach (glob("$addons_dir/*", GLOB_ONLYDIR) as $addon) {
    374 
    375                 $name = basename($addon);
    376 
    377                 $path = path_join($addon, "{$name}.php");
    378 
    379                 if (file_exists($path)) {
    380 
    381                     require_once $path;
    382                 }
    383             }
    384 
    385             foreach (self::$addons as $addon) {
    386                 $class = "WP_HeimdallAddon_" . $addon;
    387                 $class::init();
    388             }
    389         }
    390 
    391 
    392         /**
    393          * @since 1.0.0
    394          */
    395         static function addon_url($addon, $path)
    396         {
    397             $path = rtrim(ltrim($path, "/"), "/");
    398             return plugins_url("/addons/$addon/$path", __FILE__);
    399         }
    400     }
    401 }
    402 
    403 WP_Heimdall_Plugin::init();
     50Database::init();
     51Options::init();
     52Dashboard::init();
     53Core::init();
     54Communicator::init();
     55LicenseManager::init();
  • heimdall/trunk/readme.txt

    r2571934 r2834688  
    11=== Heimdall ===
    22Contributors: rmanaf
    3 Tags: statistics, stat, heimdall
    4 Requires at least: 4.5.0
    5 Tested up to: 5.8.0
    6 Stable tag: 1.3.3
    7 License: MIT License
    8 License URI: https://github.com/Rmanaf/wp-heimdall/blob/master/LICENSE
     3Tags: statistic, statistics, stat, heimdall
     4Requires at least: 5.8.0
     5Requires PHP: 5.6
     6Tested up to: 6.1.0
     7Stable tag: 1.4.0
     8License: No License (No Permission)
     9License URI: https://wp-heimdall.com/license
    910
    1011This plugin is for tracking your client activities.
     
    1213=== Description ===
    1314
    14 Once the plugin is activated, navigate to **Settings > General** in your WordPress Dashboard. On the **Heimdall** section, there you can find all the customization options.
     15Once the plugin is activated, navigate to **Settings > Heimdall** in your WordPress Dashboard. There you can find all the customization options.
Note: See TracChangeset for help on using the changeset viewer.