--- /dev/null
+AAABAAAAoAAAAgAAAKAAAAMAAACgAAAEAAAAoAAABQAAAKAAAAYAAACgAAAHAAAAoAAACAAAAKAA
+AAkAAACgAAAKAAAAoAAACwAAAKAAAAwAAACgAAANAAAAoAAADgAAAKAAAA8AAACgAAAQAAAAoAAA
+EQAAAKAAABIAAACgAAATAAAAoAAAFAAAAKAAABUAAACgAAAWAAAAoAAAFwAAAKAAABgAAACgAAAZ
+AAAAoAAAGgAAAKAAABsAAACgAAAcAAAAoAAAHQAAAKAAAB4AAACgAAAfAAAAoAAAIAAAAKAAACEA
+AACgAAAiAAAAoAAAIwAAAKAAACQAAACgAAAlAAAAoAAAJgAAAKAAACcAAACgAAAoAAAAoAAAKQAA
+AKAAACoAAACgAAArAAAAoAAALAAAAKAAAC0AAACgAAAuAAAAoAAALwAAAKAAADAAAACgAAAxAAAA
+oAAAMgAAAKAAADMAAACgAAA0AAAAoAAANQAAAKAAADYAAACgAAA3AAAAoAAAOAAAAKAAADkAAACg
+AAA6AAAAoAAAOwAAAKAAADwAAACgAAA9AAAAoAAAPgAAAKAAAD8AAACgAABAAAAAoAAAQQAAAKAA
+AEIAAACgAABDAAAAoAAARAAAAKAAAEUAAACgAABGAAAAoAAARwAAAKAAAEgAAACgAABJAAAAoAAA
+SgAAAKAAAEsAAACgAABMAAAAoAAATQAAAKAAAE4AAACgAABPAAAAoAAAUAAAAKAAAFEAAACgAABS
+AAAAoAAAUwAAAKAAAFQAAACgAABVAAAAoAAAVgAAAKAAAFcAAACgAABYAAAAoAAAWQAAAKAAAFoA
+AACgAABbAAAAoAAAXAAAAKAAAF0AAACgAABeAAAAoAAAXwAAAKAAAGAAAACgAABhAAAAoAAAYgAA
+AIEAAGMAAACgAABkAAAAoAAAZQAAAKAAAGYAAACgAABnAAAAoAAAoAAAAGgAAGkAAACgAABqAAAA
+oAAAawAAAKAAAGwAAACgAABtAAAAoAAAbgAAAKAAAG8AAAB4AACgAAAAcAAAcQAAAKAAAHIAAACg
+AABzAAAAoAAAdAAAAKAAAHUAAACgAAB2AAAAoAAAdwAAAKAAAKAAAACwAAB5AAAAoAAAegAAAKAA
+AHsAAACgAAB8AAAAoAAAfQAAAKAAAH4AAACgAAB/AAAAoAAAoAAAAIAAAKAAAAFsAACgAAAAggAA
+oAAAAIMAAKAAAACEAACgAAAAhQAAoAAAAIYAAKAAAACHAACIAAAAoAAAiQAAAKAAAIoAAACgAACL
+AAAAoAAAjAAAAKAAAI0AAACgAACOAAAAoAAAjwAAAKAAAJAAAACgAACRAAAAoAAAkgAAAKAAAJMA
+AACgAACUAAAAoAAAlQAAAKAAAJYAAACgAACXAAAAoAAAmAAAAKAAAJkAAACgAACaAAAAoAAAmwAA
+AKAAAJwAAACgAACdAAAAoAAAngAAAJ8AAKAAAAHmAAIwAAACbwAAAAAAAAAAAAAAAAAAAADkRGNp
+dHniSmdlb25hbWVfaWTDINUmRW5hbWVz4UJlbkhSZXNlYXJjaEljb250aW5lbnTjRGNvZGVCT0Mg
+B8Nfci8gFuFCZW5HT2NlYW5pYUdjb3VudHJ54yAHwx+zEEhpc29fY29kZUJBVSAW4UJlbklBdXN0
+cmFsaWFIbG9jYXRpb27jT2FjY3VyYWN5X3JhZGl1c6EBSGxhdGl0dWRlaD/wAAAAAAAASWxvbmdp
+dHVkZWg/8AAAAAAAAOQgAeIgB8NYkRIgFuFCZW5ITXVraWx0ZW8gKeMgNEJOQSAHw19yLSAW4UJl
+bk1Ob3J0aCBBbWVyaWNhIFDjIAfDX2XhIF9CVVMgFuFCZW5NVW5pdGVkIFN0YXRlcyB74yCFoQEg
+l2hAR/TdLxqfviCpaMBek3gDRtxd4yAB4iAHwQEgFuFCZW5CQzEgUOMgB8EBIF9CTzEgFuFCZW5D
+TyAxTHN1YmRpdmlzaW9ucwEE4yAHwQEgX0JMMSAW4UJlbkNMIDHjIAHiIAfBAiAW4UJlbkJDMiBQ
+4yAHwQIgX0JPMSAW4UJlbkNPIDIhXQEE4yAHwQIgX0JMMiAW4UJlbkNMIDLjIAHiIAfBAyAW4UJl
+bkJDMyBQ4yAHwQMgX0JPMSAW4UJlbkNPIDMhXQEE4yAHwQMgX0JMMyAW4UJlbkNMIDOrze9NYXhN
+aW5kLmNvbelbYmluYXJ5X2Zvcm1hdF9tYWpvcl92ZXJzaW9uoQJbYmluYXJ5X2Zvcm1hdF9taW5v
+cl92ZXJzaW9uoEtidWlsZF9lcG9jaAQCWk1MMk1kYXRhYmFzZV90eXBlTEdlb0NpdHktTGl0ZUtk
+ZXNjcmlwdGlvbuFCZW5TTW9jayBnZW9pcCBkYXRhYmFzZUppcF92ZXJzaW9uoQZJbGFuZ3VhZ2Vz
+AQRCZW5Kbm9kZV9jb3VudMGgS3JlY29yZF9zaXploRw=
--- /dev/null
+use MaxMind::DB::Writer::Tree;
+
+my %types = (
+ city => 'map',
+ names => 'map',
+ en => 'utf8_string',
+ geoname_id => 'uint32',
+ location => 'map',
+ latitude => 'double',
+ longitude => 'double',
+ accuracy_radius => 'uint16',
+ continent => 'map',
+ country => 'map',
+ code => 'utf8_string',
+ iso_code => 'utf8_string',
+ subdivisions => ['array', 'map'],
+);
+
+my $tree = MaxMind::DB::Writer::Tree->new(
+ ip_version => 6,
+ record_size => 28,
+ database_type => 'GeoCity-Lite',
+ languages => ['en'],
+ description => { en => 'Mock geoip database' },
+ map_key_type_callback => sub { $types{ $_[0] } },
+ remove_reserved_networks => 0,
+);
+
+$tree->insert_network(
+ '1.1.1.0/24',
+ {
+ 'city' => { "geoname_id" => 2151718, "names" => { "en" => "Research" } },
+ 'continent' => { "code" => "OC", "geoname_id" => 6255151, "names" => { "en" => "Oceania" } },
+ 'country' => { "geoname_id" => 2077456, "iso_code" => "AU", "names" => { "en" => "Australia" } },
+ 'location' => { "latitude" => 1.0, "longitude" => 1.0, accuracy_radius => 1 },
+ }
+);
+
+$tree->insert_network(
+ '1.2.3.0/24',
+ {
+ 'city' => { "geoname_id" => 5804306, "names" => { "en" => "Mukilteo" } },
+ 'continent' => { "code" => "NA", "geoname_id" => 6255149, "names" => { "en" => "North America" } },
+ 'country' => { "geoname_id" => 6252001, "iso_code" => "US", "names" => { "en" => "United States" } },
+ 'location' => { "latitude" => 47.913000, "longitude" => -122.304200, accuracy_radius => 1 },
+ }
+);
+
+$tree->insert_network(
+ '127.0.0.1/32',
+ {
+ 'country' => { "geoname_id" => 1, "iso_code" => "O1", "names" => { "en" => "O 1" } },
+ 'city' => { "geoname_id" => 1, "names" => { "en" => "C1" } },
+ 'subdivisions' => [{ "geoname_id" => 1, "iso_code" => "L1", "names" => { "en" => "L 1" } }],
+ }
+);
+
+$tree->insert_network(
+ '127.0.0.2/32',
+ {
+ 'country' => { "geoname_id" => 2, "iso_code" => "O1", "names" => { "en" => "O 2" } },
+ 'subdivisions' => [{ "geoname_id" => 2, "iso_code" => "L2", "names" => { "en" => "L 2" } }],
+ 'city' => { "geoname_id" => 2, "names" => { "en" => "C2" } },
+ }
+);
+
+$tree->insert_network(
+ '127.0.0.3/32',
+ {
+ 'country' => { "geoname_id" => 3, "iso_code" => "O1", "names" => { "en" => "O 3" } },
+ 'subdivisions' => [{ "geoname_id" => 3, "iso_code" => "L3", "names" => { "en" => "L 3" } }],
+ 'city' => { "geoname_id" => 3, "names" => { "en" => "C3" } },
+ }
+);
+
+open my $fh, '>:raw', 'GeoLiteCity.mmdb';
+$tree->write_tree($fh);